session_start and task_classified telemetry fire once per user turn, not once per session
还没有人认领这个 Issue。
评估
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 新手友好度
- 72/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 冷清
- 技术栈
- typescript
调研方向
从 packages/opencode/src/session/prompt.ts 中 364 和 498 行附近的 loop() 开始,然后检查 939 行附近的 telemetry 块,以及 session 作用域的状态或之前的 assistant 消息如何可用。使用三条消息重现该问题并检查 telemetry。完成的标准是每个 session 都从开场轮次发出一个 session_start 和一个 task_classified,同时 1088 行有意按每次 loop 记录的 trace 保持不变。
由索引模型根据 Issue 内容生成。
描述
Summary
session_start and task_classified are emitted once per user turn, not once per session. Session counts in telemetry are therefore inflated by roughly the average number of turns per session, and task_classified re-classifies intent on every turn instead of once from the opening message.
Detail
Both events are emitted from a if (step === 1) block in packages/opencode/src/session/prompt.ts:939:
session_start—packages/opencode/src/session/prompt.ts:953task_classified—packages/opencode/src/session/prompt.ts:1004
step is not session-scoped. It is declared inside loop():
let step = 0—packages/opencode/src/session/prompt.ts:364step++—packages/opencode/src/session/prompt.ts:498
and loop() is invoked once per prompt, i.e. once per user turn. So step === 1 means "first model step of this turn", and the block runs again for every subsequent message in the same session.
Impact
session_startovercounts sessions. A session with N user turns emits Nsession_startevents, all carrying the samesession_id.- Any funnel or retention metric built on
session_startcounts is proportionally wrong. De-duplicating bysession_idat query time recovers the true count, so historical data is salvageable, but no current dashboard is doing that unless it was written with this in mind. task_classifiedreports the intent of whatever the user most recently typed, not the task the session was opened for. Itsconfidencedistribution is also skewed by short follow-up messages ("thanks", "yes", "try again") being classified as tasks.- Cost: an extra pair of tracked events per turn, plus the
classifyTaskIntentregex sweep over up to 2000 characters per turn.
Reproduction
Start a session, send three messages, and inspect the emitted telemetry (or set a breakpoint on the step === 1 block). Three session_start events are emitted with identical session_id.
Suggested fix
Gate both events on something session-scoped rather than on step. Options, roughly in order of preference:
- Check whether the session already has prior assistant messages before emitting — a session that has already produced output is not starting.
- Keep a per-session "already emitted" claim in the telemetry module, similar to how other once-per-session state is tracked.
- Emit at session creation instead of in the prompt loop, which is where the event name says it belongs.
Note that packages/opencode/src/session/prompt.ts:1088 also uses if (step === 1), but that one is intentionally per-loop() (it traces the system prompt once per loop invocation, and the comment there says so). Only the telemetry block at line 939 is affected.
- 主要语言
- TypeScript
- 星标
- 813
- 派生
- 134
- 平均合并
- 2 天 2 小时
- 30 天内合并 PR
- 67
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
AltimateAI/altimate-code 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 70/100
AltimateAI/altimate-code#1359 ·
-
难度 2/5 1-3 小时 新手友好度 84/100
AltimateAI/altimate-code#1323 ·
-
难度 2/5 1-3 小时 新手友好度 86/100
AltimateAI/altimate-code#1288 ·
-
难度 1/5 1 小时以内 新手友好度 92/100
AltimateAI/altimate-code#1285 ·
-
privacy: Altimate Base consent dialog no longer discloses persistent per-installation identifier 未关闭
难度 1/5 1 小时以内 新手友好度 88/100
AltimateAI/altimate-code#1284 ·
查看 AltimateAI/altimate-code 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 84/100
receptron/mulmoterminal#2264 ·
-
documentation
难度 2/5 1-3 小时 新手友好度 78/100
components-web-app/docs#96 ·
-
enhancement
难度 2/5 1-3 小时 新手友好度 78/100
-
难度 2/5 1-3 小时 新手友好度 68/100
simonsobs/tileviewer#114 ·
-
难度 2/5 1-3 小时 新手友好度 75/100