Skip to content

Codex 模型被识别为 unknown #2

Description

@Pika-Yalei

问题描述

Juejin Usage 采集 Codex 用量时,首次扫描可以正确识别模型,但后续增量同步产生的 Token 用量会被归类为:

Codex · unknown

Codex 原始会话文件中实际记录了正确模型,因此不是 Codex 没有提供模型信息。

环境

  • 系统:macOS
  • Juejin Usage Desktop:0.1.1
  • Codex Desktop
  • @juejin-opensource/jusage-core@0.1.3 中也能复现对应解析问题

复现步骤

  1. 打开 Juejin Usage,使其开始定时同步。
  2. 在 Codex 中选择一个明确的模型,例如 gpt-5.6-sol
  3. 创建一个包含多次工具调用的较长任务。
  4. 等待 Juejin Usage 至少执行两次增量同步。
  5. 打开 Juejin Usage 的模型用量分布。

实际结果

同一个 Codex 会话的用量被拆分成:

Codex · gpt-5.6-sol
Codex · unknown

其中大量后续 Token 被统计到了 unknown

期望结果

同一个 Codex 会话没有切换模型时,后续追加的 Token 用量都应继续归类到 gpt-5.6-sol,不应出现 unknown

原始数据验证

对应 Codex rollout 文件包含正确模型:

{
  "type": "turn_context",
  "payload": {
    "model": "gpt-5.6-sol"
  }
}

实际检查的一个会话中:

  • turn_context 模型:gpt-5.6-sol
  • token_count 事件数量:15
  • 携带 info.modeltoken_count 数量:0
  • Juejin Usage 对应游标中同时出现:
    • gpt-5.6-sol
    • unknown

这说明模型信息存在于 turn_context,但后续 token_count 事件本身不再重复携带模型。

原因分析

parseCodexIncremental 会从上一次保存的文件 offset 继续读取,但每轮解析都会重新初始化:

let turnContextModel = 'unknown';

当前文件游标保存了 offset 和 Token 总量等信息,却没有保存最近一次识别到的模型。

下一轮同步如果直接从新增的 token_count 开始,就无法再读取位于 offset 之前的 turn_context。由于 token_count.info.model 为空,最终模型回退为 unknown

建议修复

在 Codex 文件游标中保存最近一次有效模型,并在增量扫描时恢复:

let turnContextModel =
  sameInode && !truncated
    ? (prev?.lastModel ?? 'unknown')
    : 'unknown';

保存游标时增加:

codexCursor.files[filePath] = {
  inode,
  offset: st.size,
  tokenCountSeen,
  prevTotal: prevTotalSave,
  lastModel: turnContextModel,
  meta,
};

如果 info.model 存在,也应同步更新当前模型:

const infoModel = readModel(info.model);

if (infoModel) {
  turnContextModel = infoModel;
}

建议回归测试

  1. 第一次写入并解析:
session_meta
turn_context(model = gpt-5.6-sol)
token_count(不包含 info.model)
  1. 在同一文件末尾只追加:
token_count(不包含 info.model)
  1. 使用第一次解析生成的 cursor 再次调用 parseCodexIncremental
  2. 断言第二次产生的 bucket 模型仍然是 gpt-5.6-sol
  3. 断言不会产生 unknown bucket。

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions