问题描述
Juejin Usage 采集 Codex 用量时,首次扫描可以正确识别模型,但后续增量同步产生的 Token 用量会被归类为:
Codex 原始会话文件中实际记录了正确模型,因此不是 Codex 没有提供模型信息。
环境
- 系统:macOS
- Juejin Usage Desktop:0.1.1
- Codex Desktop
@juejin-opensource/jusage-core@0.1.3 中也能复现对应解析问题
复现步骤
- 打开 Juejin Usage,使其开始定时同步。
- 在 Codex 中选择一个明确的模型,例如
gpt-5.6-sol。
- 创建一个包含多次工具调用的较长任务。
- 等待 Juejin Usage 至少执行两次增量同步。
- 打开 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.model 的 token_count 数量:0
- Juejin Usage 对应游标中同时出现:
这说明模型信息存在于 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;
}
建议回归测试
- 第一次写入并解析:
session_meta
turn_context(model = gpt-5.6-sol)
token_count(不包含 info.model)
- 在同一文件末尾只追加:
token_count(不包含 info.model)
- 使用第一次解析生成的 cursor 再次调用
parseCodexIncremental。
- 断言第二次产生的 bucket 模型仍然是
gpt-5.6-sol。
- 断言不会产生
unknown bucket。
问题描述
Juejin Usage 采集 Codex 用量时,首次扫描可以正确识别模型,但后续增量同步产生的 Token 用量会被归类为:
Codex 原始会话文件中实际记录了正确模型,因此不是 Codex 没有提供模型信息。
环境
@juejin-opensource/jusage-core@0.1.3中也能复现对应解析问题复现步骤
gpt-5.6-sol。实际结果
同一个 Codex 会话的用量被拆分成:
其中大量后续 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-soltoken_count事件数量:15info.model的token_count数量:0gpt-5.6-solunknown这说明模型信息存在于
turn_context,但后续token_count事件本身不再重复携带模型。原因分析
parseCodexIncremental会从上一次保存的文件 offset 继续读取,但每轮解析都会重新初始化:当前文件游标保存了 offset 和 Token 总量等信息,却没有保存最近一次识别到的模型。
下一轮同步如果直接从新增的
token_count开始,就无法再读取位于 offset 之前的turn_context。由于token_count.info.model为空,最终模型回退为unknown。建议修复
在 Codex 文件游标中保存最近一次有效模型,并在增量扫描时恢复:
保存游标时增加:
如果
info.model存在,也应同步更新当前模型:建议回归测试
parseCodexIncremental。gpt-5.6-sol。unknownbucket。