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
@@ -195,7 +195,9 @@ func TestUsageWriter_PersistsBatchAndReaderSummarizes(t *testing.T) {
|
||||
if rows := usageRowCount(t, conn); rows != int64(len(samples)) {
|
||||
t.Fatalf("落库行数 = %d, want %d(日志:%s)", rows, len(samples), buf.String())
|
||||
}
|
||||
// session_id 当前恒为 NULL(模型层无会话概念):列在、但序列化面已说明。
|
||||
// 这里直接喂写入器、样本里**没有**会话 ⇒ session_id 落 NULL:无归属的调用
|
||||
// (管理面板试连、未接循环的后台流程)与「属于某会话」在列里必须可区分,
|
||||
// 所以「没有」写 NULL 而不是空串(打标链见 usage_session_test.go)。
|
||||
var nullSessions int64
|
||||
if err := conn.QueryRowContext(ctx,
|
||||
`SELECT COUNT(*) FROM llm_usage WHERE session_id IS NULL`).Scan(&nullSessions); err != nil {
|
||||
|
||||
Reference in new issue
Block a user