LobeChat 把多家模型、插件和知识库放在同一个界面里,配置项多,报错也容易被误判。大多数问题并不在模型本身,而是四层之一:Key 没生效、地址或模型名不对、额度或并发触顶、网络与浏览器跨域不通。先把错误归类,再逐层验证,比反复重装客户端有效。
本文按 401、404、429、连接失败展开,并补充流式输出、插件和知识库的专门问题。界面与环境变量名称会随版本变化,以你当前版本的官方文档为准;模型与价格以站内模型价格为准,价格可能调整。
说明:LobeChat、LobeHub 是其权利人的产品与商标,本文仅作技术排错说明,与相关厂商无隶属关系。
一、先记录证据,再判断类别
| 现象 | 常见状态码或提示 | 第一判断 | 先查什么 |
|---|---|---|---|
| 401 Unauthorized | invalid_api_key、空响应 |
Key 未被识别 | Key 完整性、所属地址、注入方式 |
| 404 / model not found | not_found_error、model_not_found |
路径或模型名不对 | Base URL、/v1、模型 ID |
| 429 Too Many Requests | rate_limit_error、insufficient_quota |
限流或额度不足 | 并发、用量、账单 |
| Failed to fetch | 无状态码、浏览器报错 | 请求没拿到响应 | DNS、代理、防火墙、CORS |
| 5xx | server_error、网关错误页 |
上游或网关故障 | 重试并记录请求 ID |
| 插件或知识库失败 | 工具调用错误、上传失败 | 能力或依赖缺失 | 函数调用、存储、Embedding |
排错前至少记下:发生时间、LobeChat 版本、部署方式(桌面端、网页版或 Docker)、HTTP 状态码、响应体和请求 ID。缺了这些信息,只能靠猜。
二、401:Key 没有被认出来
401 表示服务端拒绝这把 Key。高频原因包括:
- 复制时带入空格、换行或全角字符,看起来一样,实际不同;
- 界面配置和部署环境变量混用,实际请求用的不是你以为的那把 Key;
- Key 已删除、轮换,或所属项目被停用;
- 用 A 服务商的 Key 请求 B 服务商的地址;
- 请求被公司代理拦截,返回的是登录页 HTML,而不是 JSON。
先绕过客户端验证。用同一把 Key、同一个地址发一次最小请求:
export ZSQH_API_KEY="sk-你的密钥"
curl -sS "https://ai.zhongshangqihang.com/v1/chat/completions" \
-H "Authorization: Bearer $ZSQH_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"你的模型ID","messages":[{"role":"user","content":"只回复 OK"}]}' \
-w "\nHTTP %{http_code}\n"
返回 200 和 choices,说明 Key 与地址有效;仍然 401,问题在复制、权限或代理。Docker 部署还要确认变量真的进了容器:docker exec lobe-chat env | grep -i openai,容器名以 docker ps 为准。界面里保存的配置属于当前用户,换设备或清缓存后可能消失,团队共用应优先用环境变量。
三、404 与 model not found:地址和模型各查一遍
404 有两种:路径不存在,和模型不存在。前者看 URL,后者看模型 ID。
LobeChat 的代理地址字段,有的场景填域名即可,有的要带 /v1,取决于网关是否自己转发 /v1。判断标准不是照抄教程,而是看最终请求地址里 /v1 是否只出现一次。常见错误是主机已经以 /v1 结尾,路径又拼了一次,变成 /v1/v1/chat/completions。代理地址应指向 API 根路径,不是完整的 /chat/completions。
model not found 与路径无关。模型 ID 区分大小写、版本后缀和供应商前缀,必须从模型价格页或控制台复制。用 CUSTOM_MODELS 管理列表时,先用 -all,+一个确认可用的模型 做最小测试,跑通后再加其他模型;逗号用英文,不要带空格。模型已经出现在列表里,仍要确认它的类型和能力开关与真实情况一致,否则一调用就失败。
403 通常是认得出 Key,但不允许使用该模型或该功能,不要和 401 混在一起反复换 Key。
四、CORS、代理与 TLS:浏览器直连的坑
LobeChat 网页版在浏览器里发请求时,网关必须允许 LobeChat 所在域名的跨域请求。CORS 失败的典型表现是浏览器控制台出现 Access to fetch ... has been blocked by CORS policy,而用 curl 测试完全正常。处理方式有两种:让网关放行对应 Origin,或使用服务端转发,让请求不经过浏览器的跨域检查。
如果 LobeChat 部署在 Nginx、Caddy 或 Cloudflare 后面,代理层要能访问网关,且不要把 API 主机和 HTTP 代理混填。系统代理、VPN、容器里的 HTTP_PROXY、HTTPS_PROXY 可能叠加,只保留一层,并用 NO_PROXY 排除内网地址。
TLS 问题常表现为 UNABLE_TO_VERIFY_LEAF_SIGNATURE,多见于企业解密代理。正确做法是安装企业根证书;把 NODE_TLS_REJECT_UNAUTHORIZED 设为 0 只能临时定位,会降低安全性,不应留在生产环境。
插件服务同样要允许 LobeHub 的 Origin。自托管还要确认插件功能开关已打开,并且模型本身支持函数调用,否则插件会在执行阶段失败。
五、429:限流、并发与额度
429 有两种常见含义:请求太快,或者额度不足。前者常伴随 rate_limit_error,后者可能是 insufficient_quota,处理方向相反。
- 请求太快:降低并发,减少同时打开的会话和客户端;长上下文会放大 token 消耗。
- 额度不足:检查网关用量和账单,充值或更换 Key;单纯重试不会恢复。
- 响应头有
Retry-After时按它等待;没有时用指数退避加随机抖动,并设置重试上限。 - 团队共用一把 Key 时,多台设备、多个窗口共享并发额度。
- 不要在客户端连续点“检查”或连续重发,短时间内容易叠加请求。
如果只在长对话里出现 429,先压缩上下文或新建会话,再确认模型的上下文窗口。调低“最大上下文消息数”只能缓解上下文压力,不能替代用量与并发管理。
六、流式输出中断:回答到一半停了
LobeChat 默认流式返回。中途停止多半不是模型坏了,而是 SSE 被代理缓冲、连接空闲超时,或上游在生成途中断开。表现是前半段正常、后半段突然结束,或一直停在“正在输入”。
先在版本允许时关闭流式输出,用同一个问题对比。非流式能完整返回,问题就在 SSE 链路。反向代理要关闭响应缓冲并延长读超时,例如 Nginx 的 proxy_buffering off 和 proxy_read_timeout;Cloudflare 等 CDN 也可能缓冲事件流。推理模型在正文前长时间“思考”,看起来像卡住,先用非流式请求确认是否真的没有响应。
七、插件与知识库的专门报错
插件失败先分三层:模型是否支持函数调用,插件网关是否可达,插件服务是否允许跨域。自托管版本还要确认插件功能已启用。模型不支持工具调用时,界面可能仍能打开插件,但一到执行就报错。
知识库是另一套依赖。常见自托管方案需要 PostgreSQL 加 PGVector 存向量、S3 兼容存储放原文件,以及可用的 Embedding 模型。默认嵌入模型往往是 OpenAI 的某个型号,但你的网关不一定提供同款,需要单独配置一个可用的嵌入模型;自定义 Embedding 的变量名和取值格式以当前版本文档为准。
上传失败优先查存储桶地址、密钥、权限和跨域;检索失败优先查索引是否建好、Embedding 维度是否一致。换嵌入模型后,旧索引通常要重建。PDF、Word 等格式的解析还可能依赖额外的解析服务,纯文本能传、复杂格式失败,就要往这个方向查。
八、日志与取证
- 打开浏览器开发者工具的 Network 面板,找到失败请求,记录完整 URL、状态码、响应体和请求头;分享前删除 Key。
- 用
docker logs -f lobe-chat查看容器日志,重点找启动错误、迁移失败和连接超时。 - 用
docker exec lobe-chat env确认环境变量确实存在,注意变量名拼写和引号。 - 在容器内执行 curl 或
nslookup,判断是容器网络、DNS 还是外部网关的问题。 - 需要更详细日志时,用
DEBUG=lobe:*和LOG_LEVEL=debug启动,再跟踪日志输出。 - 提交问题时附上版本、部署方式、时间、状态码和请求 ID,只写“连不上”很难定位。
九、一套固定的排查顺序
- 用 curl 直连网关,确认 Key、主机和模型是否有效。
- curl 失败:查 DNS、代理、TLS、防火墙和网关状态。
- curl 成功但 LobeChat 失败:查 API 类型、
/v1是否重复、模型 ID、CORS 和客户端代理。 - 按状态码分流:401 查 Key,404 查路径与模型,429 查用量与并发,连接失败查网络与证书。
- 每次只改一个变量,改完立即复测并记录结果。
这套顺序的价值在于把客户端问题和服务端问题分开。多数所谓 LobeChat 报错,最后都能归到某一条配置或某一层网络。需要统一管理 Key、用量和模型入口,可以注册中商起航 AI 网关;可用模型与计费方式以模型价格页为准。
常见问题
LobeChat 报 Failed to fetch,是 Key 错了吗?
不一定。这个提示只说明浏览器没有拿到有效响应。先用 curl 测同一地址;curl 也失败,优先查 DNS、代理、防火墙和证书;curl 成功,再查 CORS、路径拼接和客户端代理。
为什么 curl 能通,LobeChat 里却报 401 或返回空白?
常见原因是界面里保存的 Key 与环境变量不一致、复制时带入了空格、代理地址少了或多了 /v1,以及浏览器跨域被拦截。逐项对比最终请求地址和请求头,不要只看界面显示。
CUSTOM_MODELS 加了模型,列表里还是不显示?
先确认变量名与当前版本一致,逗号是英文逗号且没有空格,容器是重建而不是只重启。可以先用 -all,+一个确认可用的模型 做最小测试,跑通后再加其他模型。
429 一直重试会恢复吗?
限流类 429 在退避并降低并发后可能恢复;额度不足类不会因为重试恢复,需要检查账单、用量或更换 Key。先看响应体里的错误类型,再决定是否重试。
知识库上传失败,和对话 API 是同一个问题吗?
通常不是。对话走的是聊天接口,知识库还依赖数据库、向量扩展、对象存储和 Embedding 模型。先确认这几项配置,再检查文件格式与解析服务。
相关阅读:
