{"repo":"NousResearch/hermes-agent","public_id":"18466","display_label":"reasoning_tokens extraction from completion_tokens_details","summary":"These issues and PRs concern a bug where reasoning_tokens is always reported as 0 in chat completions mode, because usage normalization reads from output_tokens_details instead of completion_tokens_details. Members address fixes and broader reasoning/thinking token exposure across the API.","subsystem":"agent","counts":{"members":3,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":1},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":57340,"merged_at":"2026-07-02T20:52:43+00:00"},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-07-02T20:52:43+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":18466,"pr_number":57340,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-07-02T20:52:43+00:00"}],"members":[{"kind":"issue","number":18466,"title":"[Bug]: reasoning_tokens always 0 for chat_completions mode — normalize_usage only extracts from output_tokens_details, missing completion_tokens_details","url":null,"state":"closed"},{"kind":"pr","number":18484,"title":"fix(usage): read reasoning_tokens from completion_tokens_details (chat completions)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"3a122ba4acaabec5768ceddb46da82e43c382d7c","number":0},{"kind":"pr","value":"#57340","number":57340}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":57340,"title":"fix(usage): capture reasoning_tokens from completion_tokens_details on chat_completions","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/usage_pricing.py"],"fix_hunks":[{"file":"agent/usage_pricing.py","hunks":["@@ -820,9 +820,22 @@ def normalize_usage(\n         input_tokens = [redacted:secret-assignment] prompt_total - cache_read_tokens - cache_write_tokens)\n \n     reasoning_tokens = 0\n+    # Responses API shape: output_tokens_details.reasoning_tokens.\n+    # Chat Completions shape (OpenAI, OpenRouter, DeepSeek, etc.):\n+    # completion_tokens_details.reasoning_tokens. Reading only the former\n+    # left reasoning_tokens=0 for every chat_completions reasoning model —\n+    # hidden thinking was invisible in session accounting even though it\n+    # dominates output spend on models like deepseek-v4-flash (measured:\n+    # single calls burning 21K reasoning tokens to emit 500 visible tokens).\n     output_details = getattr(response_usage, \"output_tokens_details\", None)\n     if output_details:\n         reasoning_tokens = [redacted:secret-assignment] \"reasoning_tokens\", 0))\n+    if not reasoning_tokens:\n+        completion_details = getattr(response_usage, \"completion_tokens_details\", None)\n+        if completion_details:\n+            reasoning_tokens = _to_int(\n+                getattr(completion_details, \"reasoning_tokens\", 0)\n+            )\n \n     return CanonicalUsage(\n         input_tokens=[redacted:secret-assignment]\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}