Skip to content

  • Projects
  • Groups
  • Snippets
  • Help
  • This project
    • Loading...
  • Sign in / Register
P
pac
  • Overview
    • Overview
    • Details
    • Activity
    • Cycle Analytics
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Charts
  • Issues 0
    • Issues 0
    • List
    • Board
    • Labels
    • Milestones
  • Merge Requests 0
    • Merge Requests 0
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
    • Charts
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
  • Collapse sidebar
  • Activity
  • Graph
  • Charts
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • ai-tools
  • pac
  • Repository

Switch branch/tag
  • pac
  • apps
  • pac-service
  • src
  • modules
  • assistant
  • assistant-invocation.ts
Find file
HistoryPermalink
  • luoqi's avatar
    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 Aug 16, 2026
    ad264616
assistant-invocation.ts 4.88 KB

Download (4.88 KB)