{"repo":"NousResearch/hermes-agent","public_id":"70126","display_label":"Remove empty tool_calls key after deduplication","summary":"A bug where sanitize_api_messages leaves an empty tool_calls array after deduplication, breaking tool-calling sessions for certain models like Qwen. Fixes involve dropping the tool_calls key entirely when all entries are deduplicated.","subsystem":"agent","counts":{"members":5,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":3},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":90330},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-08-19T23:04:23+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.4},"fix_edges":[{"issue_number":69855,"pr_number":90330,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":70058,"pr_number":90330,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":70126,"pr_number":90330,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":74295,"pr_number":90330,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":80242,"pr_number":90330,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":89503,"pr_number":90330,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":70126,"title":"[Bug]: sanitize_api_messages dedup writes tool_calls: [], breaking Qwen-series tool-calling sessions on v0.18.2+","url":null,"state":"closed"},{"kind":"pr","number":70176,"title":"fix(agent): drop tool_calls key when all tool_calls are deduplicated (#70126)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#64345","number":64345}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":70181,"title":"fix(agent): drop tool_calls key when all tool_calls are deduplicated (#70126)","url":null,"state":"closed","close_reason":{"category":"silent_close","implication":"active"},"merged":false},{"kind":"pr","number":70182,"title":"fix(transports+agent): GLM reasoning_effort ultra + drop empty tool_calls key (#70058, #70126)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#90330","number":90330},{"kind":"pr","value":"#90330","number":90330}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":90330,"title":"fix: reasoning effort 'ultra' no longer 400s on non-Anthropic wires (#89503 class, salvage #89509)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/auxiliary_client.py","agent/transports/chat_completions.py","agent/transports/codex.py","plugins/model-providers/copilot/__init__.py","plugins/model-providers/custom/__init__.py","tests/agent/test_reasoning_effort_wire_translation.py","tests/agent/transports/test_reasoning_effort_sibling_sites.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}