| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| admin | ||
| ai | ||
| assistant | ||
| auth | ||
| clinical-gap | ||
| clinical-signals | ||
| facts | ||
| mcp | ||
| patient | ||
| persona | ||
| plan | ||
| plan-aggregate | ||
| realtime-coach | ||
| sync | ||
| weixin-aibot |
■ 会话 id(`workflowRunId`) 上一版每轮各生成一个 run id,判断"哪几轮是一批"只能靠 `turnNo` 归 1 反推 —— 那是启发式,⚠ ️ 两位主管并发聊天时行是交错的,前端一旦裁剪历史 turnNo 还会错位。 ⇒ 前端在**messages 为空**(= 一段新对话的第一句)时现生成 uuid,此后每轮原样带上; 服务端落进 `workflow_run_id`,同一次对话各轮共用一个值。⚠ ️ 前端可改的入参:只用于归组,⛔ 不参与鉴权取数;非 uuid 一律丢弃(服务端另生成),⛔ 别让它成为写库的注入面(该列是 uuid 类型)。⭐ 这也正好落在产品设计上:没有"新建会话",会话跟着他此刻在做的那件事走 —— 离开工作台、组件重挂,messages 归空,下一句就是新的一段。 ■ outputText 只落了最后一步🔴 AI SDK 的 `OnFinishEvent` 继承的是**最后一步**的 `StepResult`,`ev.text` 只有末步那段。 模型在工具之间穿插说的话(「我先查一下」)全在前面的步里,只取 ev.text 就永远不进记录 —— 而排查"它当时到底说了什么"全靠这一列。⚠ ️ 线上实测那轮 5 次工具调用、6924 输出 token,落库只有 60 字 —— 那次凑巧没丢 (它把话都留到了最后一步),⛔ 别指望每次都这样。 ⇒ `joinStepTexts` 拼所有步,去重末步(它通常已在 steps 末项里)。 验证: · tsc(service + web)通过;jest 85 套 1330 例全过(新增 5);eslint 干净 · 真模型跑三轮:会话A 两轮共用 run=1cd20f63、会话B 独立 run=985bf1d3, 按 run 分组正好 2 个会话✅ ⚠ ️ 未做,留给产品定:界面 63 处写「时效」、0 处「时限」,而文档已改口径为「时限」。 提示词的铁律是「使用者的词汇表 = 他在界面上见过的那些」⇒ 现在**该改的是文档或界面**,⛔ 不能只把提示词单方面改成「时限」。
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| admin | Loading commit data... | |
| ai | Loading commit data... | |
| assistant | Loading commit data... | |
| auth | Loading commit data... | |
| clinical-gap | Loading commit data... | |
| clinical-signals | Loading commit data... | |
| facts | Loading commit data... | |
| mcp | Loading commit data... | |
| patient | Loading commit data... | |
| persona | Loading commit data... | |
| plan | Loading commit data... | |
| plan-aggregate | Loading commit data... | |
| realtime-coach | Loading commit data... | |
| sync | Loading commit data... | |
| weixin-aibot | Loading commit data... |