assistant-prompts.ts
27 KB
-
feat(助手): 每轮往 agent_invocations 落一行 —— 落「该调的工具调没调」,不落聊天记录 · ad264616
助手是这条生产线上唯一**一次都没留过痕**的一层:验收判据写着「该调的工具 调没调」,而线上没有任何地方记录模型实际调了什么,只能靠临时跑批。 表和写入器都是现成的(`agent_invocations` + `InvocationRecorderService`), 后台 `admin/ai-invocations` 也不写死 kind —— 落进去直接就能看。缺的只是接上。 ■ 只存当轮,
⛔ 不存上下文 助手的 messages 里带着 propose_assignment 返回的整张确认单(几百人 × 十几个字段)。第 N 轮把前 N-1 轮全带上 ⇒ **落库量按平方涨**。 实测口径:全量约 100 KB/行,只存当轮约 2.5 KB/行;按 1800 次/天算是 65 GB/年 vs 1.6 GB/年 ——⚠ ️ 而测试机盘常年 90%+、PG 卷已占 75 G。 ⇒ `slimInputSnapshot` 只取本轮用户原话 + 轮次 + 现场 id,⛔ 不含历史、⛔ 不含任何工具返回值。同 agent-architecture「摘要 + 指针」: 在源头就只给摘要,⛔ 不事后压缩(事后压缩要改历史,而改历史作废 KV 缓存)。 ■ systemPrompt 一律不落 主管那份 6.9 KB **每次一模一样**,逐行存等于把同一份东西抄一万遍。 改用 `ASSISTANT_PROMPT_VERSION` 做锚 ——🔴 改任意一层正文必须 bump,⚠ ️ 不 bump 这条审计链就断,而断了不会有任何报错。 ■ 工具留痕装在一处 在 tools 建好之后统一给**每个** execute 套计时包装(MCP 拉来的 + 本地那 7 个)。⛔ 不在各自 execute 里写:漏一个,那个工具就永远不出现在验收数据里。 落 output.toolCalls = [{name, ok, ms, args截200}],⛔ 不落工具返回值。 ■ 落库绝不影响对话 start/end 全程 try/catch 吞掉,只打日志;onFinish/onError 挂在 streamText 上。 主管正等着一版方案,⛔ 不该因为审计写不进去而看不到结果。 scope 缺失(内部入口)整条跳过 —— hostId/tenantId 是必填列。 ■ 顺带补两个既有缺口 1. 保留期清理任务(`InvocationRetentionService`,每天 04:00 沪)—— schema 注释里写了一年「N 天后清 inputSnapshot 仅保留元数据」,任务一直不存在。 清 inputSnapshot/prompt/systemPrompt/outputText 四样肥字段(占一行 95%+ 字节), 留 token/成本/延迟/status/judge/userFeedback;失败行留 3 倍时长;⛔ 不删行(成本与通过率曲线要长期可比,元数据行才 ~1 KB)。⚠ ️ 判据用 startedAt 不用 updatedAt —— 清理本身会刷新 updatedAt, 用它当闸门的话清过的行永远追不上,每天全表重清一遍。 2. 成本计算抽成共享纯函数 `ai/core/cost.ts` —— 它是**计价**逻辑, 抄第二份必然漂(2026-08-13 栽过:换 qwen 旗舰后成本被低报约四倍)。 本地验证(不只是单测): · tsc 通过;jest 85 套 1325 例全过(新增 27 例);eslint 干净 · 真 AppModule 起容器 → recorder 注入成功、retention 服务已注册 · 保留期在真库上跑通:60 天前成功行已清且元数据完好、2 天前未动、 失败行未动、第二次跑幂等、185 行真实数据零误伤 · **真模型跑通一轮**(deepseek-v4-flash): tokens 1720/158/1878 · cached 896 · ¥0.001169 · latency 23.9s · finishReason "stop" · inputSnapshot 82 B(⛔ 无历史)· systemPrompt 未落⚠ ️ 先用 MockLanguageModelV3 试过,usage 拿不到 —— 是 mock 喂不进去, 不是代码问题;真模型一次跑通。⚠ ️ 遗留:代码里 ASSIGNMENT_SCENE 仍写「时效」,产品口径已改「时限」,未统一。luoqi committed