langchain-ai/deepagents · error · RuntimeError

agent returned approval interrupts without resumable ids

Error message

agent returned approval interrupts without resumable ids

What it means

_build_approval_resume converts pending approval interrupts into a resumable Command payload. If the interrupts extracted from the state contain no resumable action-request ids, the runtime cannot construct a resume and raises this RuntimeError, indicating malformed or unexpected interrupt data from the graph.

Source

Thrown at libs/talon/deepagents_talon/runtime.py:464

            if interrupt_id is None:
                logger.warning("Received tool approval interrupt without an id")
                continue
            action_requests = _action_requests_from_interrupt(interrupt)
            decision, reject_message, _resolution = await _approval_decision(
                request,
                interrupt_id,
                action_requests,
            )
            payload[interrupt_id] = {
                "decisions": _decision_payload(
                    decision,
                    count=max(len(action_requests), 1),
                    reject_message=reject_message,
                )
            }
        if not payload:
            msg = "agent returned approval interrupts without resumable ids"
            raise RuntimeError(msg)
        return Command(resume=payload)

    def _resolve_system_prompt(self) -> str | None:
        if self.system_prompt is not None:
            return self.system_prompt
        if self.assistant_dir is None:
            return None
        path = self.assistant_dir / "AGENTS.md"
        try:
            if path.is_file():
                return path.read_text(encoding="utf-8")
        except OSError:
            logger.warning("Could not read Talon system prompt from %s", path, exc_info=True)
        return None

    def _resolve_skills(self) -> list[str] | None:
        if self.skills is not None:
            return list(self.skills) or None

View on GitHub (pinned to a1af029e6e)

Solutions

  1. Upgrade langgraph/langchain deep-agents packages so interrupt payload formats match what the runtime parses
  2. Inspect the raw interrupts (`_interrupts_from_state(state)`) and confirm each has the expected action-request id fields
  3. Clear/rebuild the conversation or checkpoint so the stale malformed interrupt state is discarded
Defensive patterns

Strategy: try-catch

Try / catch

try:
    reply = await runtime.invoke(request)
except RuntimeError as exc:
    if "without resumable ids" in str(exc):
        log.error("malformed approval interrupts; restarting conversation state")
        reply = await start_fresh_conversation(request)
    else:
        raise

Prevention

When it happens

Trigger: _invoke_until_unblocked obtained interrupts via _interrupts_from_state, but parsing their action requests yielded an empty payload — e.g. interrupt objects with unexpected structure, missing ids, or an unsupported interrupt type.

Common situations: Version mismatch between the interrupt format emitted by langgraph/deep-agents and what the runtime parses; custom tools raising interrupts that don't carry action requests; interrupted state restored from an old checkpoint with a different schema.

Related errors


AI-assisted analysis of langchain-ai/deepagents@a1af029e6e (2026-08-29). Data as JSON: /api/errors/e23fbfd66e9c1edc. Report an issue: GitHub.