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 NoneView on GitHub (pinned to a1af029e6e)
Solutions
- Upgrade langgraph/langchain deep-agents packages so interrupt payload formats match what the runtime parses
- Inspect the raw interrupts (`_interrupts_from_state(state)`) and confirm each has the expected action-request id fields
- 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
- Keep langgraph/deep-agents versions in sync with the runtime's expected interrupt schema
- Avoid custom interrupts that lack action-request ids
- Clear stale checkpoints after upgrades that change interrupt formats
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
- agent hit tool approval interrupt limit
- -32600
- Could not parse embedded resource block. Block expected eith
- {question_type} question {question_text!r} must not define '
- Human decision count does not match Manual pending calls
AI-assisted analysis of langchain-ai/deepagents@a1af029e6e (2026-08-29).
Data as JSON: /api/errors/e23fbfd66e9c1edc.
Report an issue: GitHub.