给 Bot 和自建网关之间加一个 30 行的适配层
问题
把 Bot 从第三方中转切到自建网关时撞上一个协议不兼容:
- Bot 的请求体硬编码
stream: false,并且按res.json()解析响应。 - 网关无视
stream字段,无条件返回text/event-stream分片。
直接对接的结果:JSON.parse 在第一个 data: 处炸掉,Bot 回不了话。
方案选择
改 Bot 源码支持 SSE 要动核心请求路径,还要处理工具调用分片聚合、reasoning 字段和错误体,侵入性太大。所以加了一个独立组件:
Bot (stream:false, 期望 JSON) → 127.0.0.1:8788 适配层:改 stream:true 转发 → 127.0.0.1:8790 网关(SSE) ← 适配层把 delta.content 逐段拼成完整 chat.completion JSON适配层是一个约百行的 Python 脚本(aiohttp),做四件事:
- 收
POST /v1/chat/completions。 - 把
stream改成true转发给网关。 - 逐行读 SSE,累加
choices[0].delta.content与delta.tool_calls。 - 拼成标准非流式响应返回。
systemd 托管,Restart=always。切换后 Bot 只改了配置里的 baseUrl 和 apiKey,源码一行没动。
经验
独立小适配层比改核心代码便宜,而且随时可回滚——把配置指回去就完事。这种「夹一层」的思路在这台小内存机器上特别好用:组件各自简单,出问题互不影响。