背景
Turn summary 卡片(Slack/Feishu/WebChat)的数据质量取决于各 Worker 是否产出完整 stats 事件。codexcli worker 当前存在系统性数据缺失,是三个非-claude worker 中 gap 最严重的(6 项)。
完整 gap 分析与修复方案见 spec:docs/specs/Worker-Turn-Summary-Parity-Spec.md §3。
Gap 清单
| 字段 |
状态 |
根因 |
context_fill / context_window / context_pct |
❌ 恒 0 |
Gap-C1:commands.go:22-31 get_context_usage 返回 {"raw": string(resp)},MapContextUsageResponse 无法识别(期望 camelCase 顶层键)→ bridge_forward.go:913 判断 TotalTokens<=0 跳过 merge |
total_input_tok |
⚠️ 偏低 |
Gap-C2:mapper.go:trackedUsageStats 缺 cache_creation_input_tokens;且用 last(per-turn 增量)非 total(累计),与 SessionAccumulator "cumulative totals" 假设(session_stats.go:99)相悖 |
model_name |
⚠️ 常空 |
Gap-C3:mapper.go:657-665 仅监听 model/rerouted(重路由才触发),正常对话不产出 |
cost |
❌ 缺失 |
Gap-C4:trackedUsageStats 不产出 cost 字段 |
修复方案
| ID |
改点 |
位置 |
优先级 |
| C1 |
解析 thread/read 响应,提取 totalTokens/maxTokens/model 返回 camelCase(参考 OCS commands.go:157-168) |
codexcli/commands.go:22-31 |
P0 |
| C2a |
优先用 thread/tokenUsage/updated 的 total(累计)字段 |
codexcli/mapper.go:trackedUsageStats |
P1 |
| C3 |
从 tokenUsage 或 session 元数据提取当前 model(不只靠 rerouted) |
codexcli/mapper.go |
P1 |
| C2b |
补 cache_creation_input_tokens(受协议限制需确认) |
同上 |
P2 |
| C4 |
cost 产出(受协议限制需确认) |
同上 |
P2 |
待实现时确认
- codex
thread/read 响应是否暴露 context 用量与 maxTokens?对照 Codex-AppServer-Worker-Spec.md。
thread/tokenUsage/updated 的 total vs last 语义,是否含 cost。
验收
- 真实 codex 对话后 turn summary 卡片:context 占比、model、cost 非空。
codexcli/commands_test.go + mapper_test.go 覆盖新字段。
- claudecode worker turn summary 回归不破(
turn_summary_test.go 全绿)。
- 协议限制字段在 spec 与代码注释明确标注,不静默归零。
背景
Turn summary 卡片(Slack/Feishu/WebChat)的数据质量取决于各 Worker 是否产出完整 stats 事件。codexcli worker 当前存在系统性数据缺失,是三个非-claude worker 中 gap 最严重的(6 项)。
完整 gap 分析与修复方案见 spec:
docs/specs/Worker-Turn-Summary-Parity-Spec.md§3。Gap 清单
context_fill/context_window/context_pctcommands.go:22-31get_context_usage返回{"raw": string(resp)},MapContextUsageResponse无法识别(期望 camelCase 顶层键)→bridge_forward.go:913判断TotalTokens<=0跳过 mergetotal_input_tokmapper.go:trackedUsageStats缺cache_creation_input_tokens;且用last(per-turn 增量)非total(累计),与 SessionAccumulator "cumulative totals" 假设(session_stats.go:99)相悖model_namemapper.go:657-665仅监听model/rerouted(重路由才触发),正常对话不产出costtrackedUsageStats不产出 cost 字段修复方案
thread/read响应,提取 totalTokens/maxTokens/model 返回 camelCase(参考 OCScommands.go:157-168)codexcli/commands.go:22-31thread/tokenUsage/updated的total(累计)字段codexcli/mapper.go:trackedUsageStatscodexcli/mapper.gocache_creation_input_tokens(受协议限制需确认)待实现时确认
thread/read响应是否暴露 context 用量与 maxTokens?对照Codex-AppServer-Worker-Spec.md。thread/tokenUsage/updated的totalvslast语义,是否含 cost。验收
codexcli/commands_test.go+mapper_test.go覆盖新字段。turn_summary_test.go全绿)。