feat(model): llm_usage.session_id 真正落库(补完 U1 缺口)
通道:新增 model/session_ctx.go 的 WithSessionID / SessionIDFrom(与 tool.WithTurnPersona
同族的 ctx 范式,避开 model 反向 import loop 的环),loop 在 Run 顶部播种;适配器
record(ctx,...) 接会话;usageSessionArg 空串映射为 NULL。
兼容:sink 未注入或会话未播种时行为逐字不变;既有 model 测试零断言改动即全绿。
文件:model/{session_ctx.go(新), usage.go, usage_store.go, openai.go, anthropic.go,
usage_session_test.go(新)} + loop/{run.go, usage_session_test.go(新)}。
变异三处:去 loop 打标 / 写侧不绑会话 / 适配器不读 ctx ⇒ 各自红行,还原复绿。
契约与日志字段集未动;读侧不按 session 过滤,面板汇总口径不变。
This commit is contained in:
1 parent
cb564fe981
commit
59a1ac4056
9 files changed
+359
-18
No files matched your search
@@ -61,6 +61,11 @@ func (l *Loop) Run(ctx context.Context, sessionID string, messages []model.Messa
|
||||
// 因此工具看到的就是本轮说话的角色,不会出现两个角色。
|
||||
ctx = tool.WithTurnPersona(ctx, l.personaFor(ctx))
|
||||
ctx = withLoopSession(ctx, sessionID)
|
||||
// 同一份会话标识再发布给**模型层**(model/session_ctx.go):适配器跑在循环
|
||||
// 之下、拿不到 loop 的 key,而每次模型调用的用量样本要按会话归档
|
||||
// (llm_usage.session_id —— 切片 U1 建了列与索引,却因为缺这一跳而恒为 NULL)。
|
||||
// 空会话 id 不挂载 ⇒ 落库写 NULL,与接线前逐字一致。
|
||||
ctx = model.WithSessionID(ctx, sessionID)
|
||||
|
||||
l.emitTurnBoundary(ctx, model.StreamKindTurnStart)
|
||||
defer l.emitTurnBoundary(ctx, model.StreamKindTurnEnd)
|
||||
|
||||
Reference in new issue
Block a user