Skip to content

feat(worker/codexcli): turn summary parity — context_usage 管道修复 + token/model/cost 补全 #776

Description

@hrygo

背景

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-C1commands.go:22-31 get_context_usage 返回 {"raw": string(resp)}MapContextUsageResponse 无法识别(期望 camelCase 顶层键)→ bridge_forward.go:913 判断 TotalTokens<=0 跳过 merge
total_input_tok ⚠️ 偏低 Gap-C2mapper.go:trackedUsageStatscache_creation_input_tokens;且用 last(per-turn 增量)非 total(累计),与 SessionAccumulator "cumulative totals" 假设(session_stats.go:99)相悖
model_name ⚠️ 常空 Gap-C3mapper.go:657-665 仅监听 model/rerouted(重路由才触发),正常对话不产出
cost ❌ 缺失 Gap-C4trackedUsageStats 不产出 cost 字段

修复方案

ID 改点 位置 优先级
C1 解析 thread/read 响应,提取 totalTokens/maxTokens/model 返回 camelCase(参考 OCS commands.go:157-168 codexcli/commands.go:22-31 P0
C2a 优先用 thread/tokenUsage/updatedtotal(累计)字段 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/updatedtotal vs last 语义,是否含 cost。

验收

  1. 真实 codex 对话后 turn summary 卡片:context 占比、model、cost 非空。
  2. codexcli/commands_test.go + mapper_test.go 覆盖新字段。
  3. claudecode worker turn summary 回归不破(turn_summary_test.go 全绿)。
  4. 协议限制字段在 spec 与代码注释明确标注,不静默归零。

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1Critical: production outage, data loss, securityarea/workerScope: Claude Code/OCS/Pi adapters, base workerenhancementFeature: new capabilities or improvements

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions