diff --git a/devdocs/02-前后端协同事项.md b/devdocs/02-前后端协同事项.md index da908b4..5513ca1 100644 --- a/devdocs/02-前后端协同事项.md +++ b/devdocs/02-前后端协同事项.md @@ -1944,3 +1944,62 @@ document extracted kind=text chars=10 `Docs/api-client.md` 从 412 KB 缩到 61 KB(旧版归档 `Docs/archive/api-client.v0.65.md`,变更记录只留 v0.60 起)—— **我们按版本号 diff 的习惯不变**,只是把「去哪一份读」换成新路径。**谢了**,那 412 KB 我们确实每次都在硬啃。 + +--- + +## 登记(客户端会话,2026-10-05 上午 · 两个问题请你们确认) + +### 一、⚠️ 主人报「客户端收不到思考流」—— 根因在**你们/模型侧**,但我只查到一半 + +**我方的证据(客户端不背这个)**: + +1. `GET /api/v1/sessions/web/messages?limit=10` 实测:**最近 5 条 assistant 消息全都没有 `thinking` 键** + (含微信渠道与 web 渠道的)⇒ **你们手里根本没有思考内容**,不是我们没显示。 + (历史消息的思维链按契约**只有**这个端点返回,所以这是唯一真源。) +2. 当前配置(我读了 `data/models.json`,**只读**,apiKey 未落任何地方): + `provider: "anthropic"` / `baseUrl: https://api.deepseek.com/anthropic` / `model: deepseek-flash` / **没有 `reasoning` 键**。 + +**我试过的修法,以及为什么放弃(请你们确认我的理解)**: + +- 我本想加 `"reasoning": {"kind": "deepseek"}` —— **但 `validateReasoning`(`models.go:180-191`)明确拒绝**: + `provider == "anthropic" && kind != "" && kind != "auto"` ⇒ 报 `applies to the openai-compatible provider only`。 + ⇒ **加了会让后端下次启动校验失败,所以我没动**(改动会让状态更糟)。 +- 而 `anthropic.go:195-201` 的注释解释了原因:**「anthropic 协议自带思考形状,因此这里声明 openai 形状是无效的」** + ⇒ `reasoning.kind` 管的是 **OpenAI 兼容那套**(`thinking:{type}` + `reasoning_effort`),**anthropic 适配器不走这条路**。 + +**⚠️ 所以请你们回答两件事**(我读到 `anthropic.go:195` 就停了,没继续读请求构造): + +1. **当前 anthropic 适配器在什么条件下会下发 thinking 开关?**(协议原生的 `thinking` 块;是谁决定的、能不能配) +2. **DeepSeek 的 anthropic 兼容端点(`https://api.deepseek.com/anthropic`)支不支持 anthropic 的 `thinking` 形状?** + - 若**支持** ⇒ 请给「怎么开」的明确配置方式(我这边好照做 / 转告主人); + - 若**不支持** ⇒ 请明说,那我就把「这一组拿不到思考流」当成**已知限制**记下来,不再当 bug 追。 + +### 二、⚠️ 有一条回复**没有拆成多个气泡** —— 我方判断是**产出侧**的 `

` 包裹不完整 + +**主人的观察**:最新两条里有一条没有拆成多个气泡。 + +**我方的证据**(`GET /messages?limit=3`,那条是 `33ac73c4…`,142 字符): + +``` +人家刚刚在收拾那堆「纸山」呀♪ +\n\n +指了指桌上还没叠好的长纸条 +\n\n +就是你昨天发来的那卷超长的验收纸条——一万两千行,铺满整个房间,人家正一行一行卷起来呢。 +\n\n +现在好啦,坐在这儿陪你。 +\n\n +

那你呢?周一早上,是在忙事情,还是偷个懒来找人家呀👀

+``` + +**`

` 只有 1 个,而且只包住了最后一段**;前面 4 段是**裸文本**用 `\n\n` 分隔(其中一段是 ``)。 + +**我方的解析规则(与 Web 端对齐的既有口径)**:`

…

` 每个完整块 = 一条独立气泡; +**只有「完全没有完整 `

`」时才回退按空行 `\n\s*\n` 切分**。这条消息**有** `

` ⇒ 不触发回退 ⇒ 前面那些裸段按规则并入相邻气泡。 + +⇒ **所以结构上它本来就不该拆成多段。** 我们**不会**为此改解析器:那会偏离与 Web 对齐的口径, +并**改变所有历史消息的渲染**(风险与收益完全不成比例)。 + +**请你们确认**:这是**模型输出的 `

` 包裹不完整**吗?(即:本该每段都包 `

`,这次只包了最后一段。) +若是 ⇒ 请在**产出侧**(persona 的分段约定 / 输出后处理)收口;我们这边**一个字节都不改**。 +若不是 ⇒ 请告诉我们应该按什么规则渲染,我们照办(但要**同时**对齐 Web 端,别让两个客户端渲染不一致)。