## 问题描述 Heron 在监控通过本地 CLIproxy 转发的 LLM 流量时,请求是 **OpenAI Chat Completions 格式**(`model` + `messages`),但响应是 **Anthropic Messages 格式**(`type: "message"`、`content: [{type:"text",...}]`、`usage: {input_tokens, output_tokens}`),导致 token 用量无法正确解析。 Heron 把这条调用归类为 `openai-chat`,然后在响应中查找 `usage.prompt_tokens` / `usage.completion_tokens`(OpenAI 标准字段名),但 CLIproxy 返回的是 `usage.input_tokens` / `usage.output_tokens`(Anthropic 字段名),字段对不上,结果 `output_tokens` 显示为 `0`,`input_tokens` 也只是个粗略的估算值。 ## 复现步骤 1. 部署一个接受 OpenAI 格式请求、返回 Anthropic 格式响应的 CLIproxy 2. Heron 监听 loopback 接口,捕获发往该代理的流量 3. 用 OpenAI Chat Completions 格式发送请求:`{"model":"gpt-5.5","messages":[...]}` 4. 在 Heron UI 的 LLM Calls 页面查看 token 统计 ## 实际结果 ```json { "model": "gpt-5.5", "wire_api": "openai-chat", "status_code": 200, "input_tokens": 13, "output_tokens": 0, "tokens_estimated": false } ``` ## 期望结果 实际响应体中包含 `usage: {input_tokens: 309, output_tokens: 37}`,Heron 应该能正确提取这些 token 数值,或者提供针对混合格式代理的 fallback 解析器。 ## 原始数据 **请求(OpenAI 格式):** ```json {"model":"gpt-5.5","max_tokens":30,"messages":[{"role":"user","content":"回复一句话:我是谁?"}]} ``` **响应(Anthropic 格式):** ```json { "id": "resp_0455a65d...", "type": "message", "role": "assistant", "model": "gpt-5.5", "content": [ {"type":"thinking","thinking":"","signature":"..."}, {"type":"text","text":"你是在与我对话的人。"} ], "stop_reason": "end_turn", "stop_sequence": null, "usage": { "input_tokens": 309, "output_tokens": 37 } } ``` ## 环境信息 - Heron 版本:v0.4.0 - 代理:cli-proxy-api(本地代理,x-api-key 认证) - 抓包模式:live,loopback 接口 - 操作系统:Linux (WSL2)
Activity
github-actions commentedon Jun 3, 2026
🤖 Triage: do — scope: openai-chat fallback token parsing
Add fallback to Anthropic usage field names in openai-chat response parser when OpenAI fields absent. Contained to h-llm/src/wire_apis/openai/chat.rs.
Auto-labeled
agent:try. wiwi will pick this up shortly.fix(h-llm): address vivi review on usage fallback (docs + precedence …
CLIproxy 混合格式问题:OpenAI 请求 → Anthropic 响应,usage token 解析不到 (#107)
feat(test): deterministic fixture generator — real anthropic + clipro…
feat(test): synthesize the rest of the anthropic column (openclaw/her…
feat(test): synthesize the openai column (chat: opencode/openclaw/her…
feat(test): pcap regression corpus framework (scrub + manifest + gold…
feat(test): cliproxy mixed-format (#96) — precise OpenAI-shape + Anth…