{"repo":"NousResearch/hermes-agent","public_id":"741","display_label":"Tool calls emitted as text instead of executing","summary":"Multiple models (DeepSeek, MiniMax, Qwen, Anthropic, Hermes) emit tool calls as raw text or XML rather than structured function calls, causing them to leak into output or be dropped. Issues and fixes address parsing, fallback extraction, and stripping of these malformed tool call representations across gateways and the agent loop.","subsystem":"agent","counts":{"members":27,"open_issues":2,"open_issues_distinct":2,"open_prs":1,"closed_issues":10,"merged_prs":1,"attempt_prs":14},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":115798},"resolution":{"state":"partially_resolved","by":"pr-115798"},"freshness":{"state":"verified","last_verified_at":"2026-09-19T16:49:08+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.06507122507122505},"fix_edges":[{"issue_number":56920,"pr_number":115798,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":741,"title":"[Bug]: Model outputs tool calls as text instead of using native function calling","url":null,"state":"closed"},{"kind":"issue","number":8965,"title":"Tool calls rendered as raw XML instead of being executed (Ollama cloud models via proxy)","url":null,"state":"closed"},{"kind":"issue","number":12090,"title":"[Bug]: Minimax tool calls being sent to telegram instead of executing","url":null,"state":"open"},{"kind":"issue","number":13031,"title":"[Bug] Feishu gateway: model outputs tool calls as plain text, never executes -- CLI works fine","url":null,"state":"closed"},{"kind":"issue","number":15453,"title":"[Bug]: Tool calls not parsed correctly with DeepSeek-V4","url":null,"state":"closed"},{"kind":"issue","number":27834,"title":"[Bug]: MiniMax/DeepSeek V4 XML tool calls are rendered as text instead of executed in Web UI/gateway","url":null,"state":"closed"},{"kind":"issue","number":29115,"title":"Feature: Content-bound tool call extraction layer (fallback for models emitting tool calls as text/XML)","url":null,"state":"closed"},{"kind":"issue","number":35935,"title":"MiniMax provider: tool calls output as plain text instead of executing","url":null,"state":"closed"},{"kind":"issue","number":47472,"title":"[bug] anthropic_messages: tool calls emitted as text (not promoted to tool_use) are dropped, agent loop halts without executing the tool","url":null,"state":"closed"},{"kind":"issue","number":54283,"title":"deepseek.v3.2 leaks raw DSML tool call XML into Telegram output","url":null,"state":"open"},{"kind":"issue","number":56920,"title":"[Bug]: Codex OAuth can print shell JSON instead of executing tool calls","url":null,"state":"closed"},{"kind":"issue","number":59291,"title":"Tool-call-shaped JSON envelope leaks into Telegram output when a local model emits it as assistant text","url":null,"state":"closed"},{"kind":"pr","number":742,"title":"fix: recover tool calls output as text by Hermes models","url":null,"state":"closed","close_reason":{"category":"silent_close","implication":"active"},"merged":false},{"kind":"pr","number":13431,"title":"fix: recover inline Hermes tool calls","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#12112","number":12112}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":13446,"title":"fix: Feishu gateway tool calls not executing with DashScope/Qwen (#13031)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"756900723a64cb3cbd17bb720773daca9ebabcb1","number":0},{"kind":"pr","value":"#13031","number":13031}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":14601,"title":"fix: Step 3.5 Flash tool call fallback parser + orphan </think> strip…","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#741","number":741}],"category":"uncategorized","implication":"needs_llm"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":15473,"title":"fix: parse DeepSeek-V4 DSML tool calls from response content (#15453)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#7628","number":7628},{"kind":"pr","value":"#7588","number":7588}],"category":"uncategorized","implication":"needs_llm"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":47473,"title":"fix(anthropic): salvage text-embedded tool calls not promoted to tool_use","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#47472","number":47472}],"category":"uncategorized","implication":"needs_llm"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":47518,"title":"fix(anthropic): salvage text invoke tool calls","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#47473","number":47473},{"kind":"pr","value":"#47472","number":47472}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":47853,"title":"fix(anthropic): salvage tool calls from text blocks when tool_use blocks missing","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#47473","number":47473},{"kind":"pr","value":"#47472","number":47472},{"kind":"pr","value":"#47473","number":47473},{"kind":"pr","value":"#47518","number":47518}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":52322,"title":"fix(anthropic): salvage text-embedded antml tool calls not promoted to tool_use","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#47472","number":47472}],"category":"uncategorized","implication":"needs_llm"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":56958,"title":"[codex] Treat leaked Codex shell JSON as incomplete","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"cdac150ec3a6","number":0},{"kind":"pr","value":"#115798","number":115798},{"kind":"pr","value":"#56920","number":56920},{"kind":"pr","value":"#56958","number":56958}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":59309,"title":"fix(agent): recover leaked clarify JSON envelopes","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"36ac69e8b091","number":0},{"kind":"pr","value":"#59291","number":59291},{"kind":"pr","value":"#19253","number":19253}],"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":59601,"title":"fix(agent): strip hallucinated tool-call JSON from assistant content before delivery (#59291)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#59309","number":59309},{"kind":"pr","value":"#59309","number":59309},{"kind":"pr","value":"#59291","number":59291}],"category":"superseded_by_pr","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":59669,"title":"fix(gateway): strip tool-call-shaped JSON envelope from Telegram output (#59291)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"02fa999a0168","number":0},{"kind":"pr","value":"#59291","number":59291},{"kind":"pr","value":"#59309","number":59309},{"kind":"pr","value":"#59669","number":59669}],"category":"uncategorized","implication":"needs_llm"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":98764,"title":"fix(bedrock): stop deepseek.v3.2 leaking tool-call scaffolding into the text channel","url":null,"state":"open","close_reason":{"refs":[{"kind":"commit","value":"61c06ca3ce","number":0},{"kind":"commit","value":"7985ea4599","number":0},{"kind":"commit","value":"61c06ca3ce","number":0}],"category":"partial_fix","implication":"needs_llm"},"merged":false},{"kind":"pr","number":115798,"title":"fix(codex): leaked shell-JSON tool call continues the turn instead of ending it as a final answer (#56920, salvage #56958)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/codex_responses_adapter.py","tests/agent/test_codex_responses_adapter.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}