Files
mini-openclaw/docs/聊天连接修复说明.md

4.1 KiB
Raw Permalink Blame History

原始聊天连接修复

2026-09-11,本地开发版已修复;未替换8002/3200的Docker稳定版,也未搬迁或删除旧会话。

已定位的原因

原始聊天的src/lib/api.ts固定使用8002,工作台使用RISK_AGENT_BACKEND_URL指向8003,导致两套后端混用。

对当前已配置模型服务发送最小连通性请求:默认参数返回HTTP200,但正文content为0字符、推理字段5字符;显式thinking.disabled后正文为5字符、推理为0字符。因此不能把推理字段直接作为答案展示,应使用该服务支持的正文输出模式。

前端原SSE解析器按网络数据块重置事件名,event和data分在两个块时会漏掉token事件;原后端允许空正文正常结束并保存空助手消息。

本地生效配置

backend/.env增加CHAT_THINKING_MODE=disabled,只用于原始聊天和聊天标题。该文件仍被Git忽略,凭据未提交。留空表示沿用上游默认,enabled表示显式启用;其他模型服务是否支持该参数必须另行验证。业务评审invoke_scoped仍使用调用方显式传入的模型,不受此选项修改。

原始聊天、会话、文件和轨迹请求使用同源/api/core/*代理。目标按CORE_BACKEND_URL、RISK_AGENT_BACKEND_URL、8002默认值依次选择;当前本地启动脚本使用8003。代理直接传递流,不缓存完整回答。由于原始聊天包含通用文件与工具能力,此新增代理仅允许本机Host,不作为对外业务入口。

已在本地重启8003加载配置。打开 http://127.0.0.1:3000/ 使用修复后的聊天;原Docker的3200界面未同步修复。旧Docker历史仍在原后端,不会自动出现在新后端的会话列表中。

错误与等待

  • 空正文、断流、超时和HTTP失败均显示明确提示;失败时保留已接收正文,不保存空助手消息。
  • 不用推理内容替代最终答案,不自动重试可能已执行工具的请求。
  • 模型单次请求超时60秒、无自动重试;业务聊天事件最长空闲75秒、总计180秒;前端额外有90秒事件空闲/180秒总等待保护。
  • 标题生成最多等待8秒,不影响已经成功完成的正文。
  • 事件解码支持跨任意字符分片、CRLF、多行data以及仅有最终正文的兼容返回。

验证

backend/test_chat_repair.py覆盖空响应、最终正文补发、工具分段、故障保留、超时取消和配置隔离,并调用scripts/test_chat_stream.cjs验证真实TypeScript解析器与代理。

scripts/probe_chat_model.py为手动最小诊断工具,使用既有配置只发送连通性文本,不发送项目、附件、历史或工具;输出仅为字段计数、HTTP状态和时间,不打印凭据或推理内容。使用时会产生真实模型调用,单元测试不执行它。

统一验证日志:test-evidence/20260911-154025-c57d291,103个后端测试、前端构建、两套Compose配置通过。浏览器验收结果另外保存在test-evidence/chat-repair/。

2026-09-14:生产容器兼容修复

生产模式下 Next.js 可用监听地址 0.0.0.0 构造 nextUrl,不能将 nextUrl.hostname 当成浏览器 Host 或认证依据。生产环境的通用聊天、文件与会话代理现在一律先通过既有 access/context 校验管理员身份,预览身份、普通业务角色及未认证请求均被拒绝;不会通过放宽 Host 限制绕过鉴权。

原始聊天客户端和 SSE 统一复用当前标签页 sessionStorage 中的 xingbang-access-token。先在 /data-access 的“访问身份”连接管理员令牌,再返回聊天首页即可;不改变现有账户或令牌。开发模式在未配置身份时仍仅接受本机 Host,并拒绝跨站请求。

同时补齐镜像启动脚本 CRLF 转换和 HTTP 页面请求 UUID 兼容。原有依赖版本未升级,已记录的依赖安全告警仍需后续单独处理;生产访问应使用受控网络或 HTTPS。

验证:test-evidence/20260914-114958-af1a102,108 项后端测试、前端构建及两套部署配置校验通过;云端容器实测及切换记录保存在 test-evidence/aliyun-switch-20260914。