{"record":{"id":"e23fbfd66e9c1edc","repo":"langchain-ai/deepagents","slug":"agent-returned-approval-interrupts-without-resumab","errorCode":null,"errorMessage":"agent returned approval interrupts without resumable ids","messagePattern":"agent returned approval interrupts without resumable ids","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"libs/talon/deepagents_talon/runtime.py","lineNumber":464,"sourceCode":"            if interrupt_id is None:\n                logger.warning(\"Received tool approval interrupt without an id\")\n                continue\n            action_requests = _action_requests_from_interrupt(interrupt)\n            decision, reject_message, _resolution = await _approval_decision(\n                request,\n                interrupt_id,\n                action_requests,\n            )\n            payload[interrupt_id] = {\n                \"decisions\": _decision_payload(\n                    decision,\n                    count=max(len(action_requests), 1),\n                    reject_message=reject_message,\n                )\n            }\n        if not payload:\n            msg = \"agent returned approval interrupts without resumable ids\"\n            raise RuntimeError(msg)\n        return Command(resume=payload)\n\n    def _resolve_system_prompt(self) -> str | None:\n        if self.system_prompt is not None:\n            return self.system_prompt\n        if self.assistant_dir is None:\n            return None\n        path = self.assistant_dir / \"AGENTS.md\"\n        try:\n            if path.is_file():\n                return path.read_text(encoding=\"utf-8\")\n        except OSError:\n            logger.warning(\"Could not read Talon system prompt from %s\", path, exc_info=True)\n        return None\n\n    def _resolve_skills(self) -> list[str] | None:\n        if self.skills is not None:\n            return list(self.skills) or None","sourceCodeStart":446,"sourceCodeEnd":482,"githubUrl":"https://github.com/langchain-ai/deepagents/blob/a1af029e6e73cb17c36bff823d227747b28e91e1/libs/talon/deepagents_talon/runtime.py#L446-L482","documentation":"_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.","triggerScenarios":"_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.","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    reply = await runtime.invoke(request)\nexcept RuntimeError as exc:\n    if \"without resumable ids\" in str(exc):\n        log.error(\"malformed approval interrupts; restarting conversation state\")\n        reply = await start_fresh_conversation(request)\n    else:\n        raise","preventionTips":["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"],"tags":["interrupts","schema","human-in-the-loop"],"backgroundTag":"approval-interrupt-malformed","analyzedSha":"a1af029e6e73cb17c36bff823d227747b28e91e1","analyzedAt":"2026-08-29T11:43:24.718Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}