FastGPT 对话测试报 404,先别急着怀疑 Key。问题通常出在 OPENAI_BASE_URL 的 /v1 拼了两层:FastGPT 把 /v1 发给 OneApi,OneApi 再转发给上游渠道时,如果渠道的 Base URL 也带了 /v1,上游就会看到 /v1/v1/chat/completions 这种路径,直接回一个 404。TaoToken 提供的是 OpenAI 兼容的 API 通道,官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册后创建 Key,把 OneApi 渠道的 Base URL 填成 https://taotoken.net/api 而不是 https://taotoken.net/api/v1,就能避开这个坑。
先说结论:FastGPT 和 OneApi 的链路里,/v1 只会出现一次,就是 FastGPT 指向 OneApi 的那一段。OneApi 再向 TaoToken 转发时,路径会按渠道自己的 Base URL 拼接,TaoToken 的接口 Base URL 固定为 https://taotoken.net/api,本身兼容 OpenAI 的 /chat/completions 路由,不需要再补一层 /v1。下面从报错现场开始,逐步拆解这条排障路径。
1. 先看报错:FastGPT 测试模型时是哪一段 404
1.1 错误现象:docker-compose 里带 /v1,测试直接 404
我当时在 OneApi 里已经配好了一个上游渠道,但 FastGPT 测试模型时仍然 404。部署环境是 WSL 里的 Ubuntu 22,OneApi 和 FastGPT 都在 Docker 中运行,共用一个外部网络 llm_net。FastGPT 的 docker-compose.yml 里,OPENAI_BASE_URL 按官方文档写成 OneApi 地址加 /v1:
services:
fastgpt:
image: ghcr.io/labring/fastgpt:latest
container_name: fastgpt
ports:
- "3002:3000"
networks:
- llm_net
environment:
DEFAULT_ROOT_PSW: "123456"
OPENAI_BASE_URL: "http://192.168.2.117:3001/v1"
CHAT_API_KEY: "oneapi-token"
MONGODB_URI: "mongodb://fastgpt:123456@mongo:27017/fastgpt?authSource=admin"
PG_URL: "postgresql://fastgpt:123456@pg:5432/fastgpt"
networks:
llm_net:
external: true
这段配置里,OPENAI_BASE_URL 指向 OneApi 所在机器的 3001 端口,末尾带 /v1。FastGPT 页面上选好模型、输入一句「你好」之后,几秒钟就返回 404,响应体里只有一个简单的 404 字符串,没有多余信息。
1.2 打开 OneApi 日志确认转发链路
既然 FastGPT 返回的是 404,而不是连接超时或 401,说明请求已经到达了某个服务。我到 OneApi 容器里翻日志:
docker logs oneapi --tail 100
日志显示,FastGPT 的请求确实打到了 OneApi,OneApi 也尝试转发给上游渠道,但上游渠道返回了 404。也就是说,问题不在 FastGPT 和 OneApi 之间,而在 OneApi 向上游转发的那一跳。为了确认,我又用 curl 直接请求了一次上游渠道的地址,发现拼出来的路径带了两个 /v1 层,路由根本对不上。
1.3 问题本质:/v1 被拼了两层
FastGPT 作为 OpenAI 兼容客户端,会把自己 OPENAI_BASE_URL 末尾的路径原样带上,再追加 /chat/completions。所以它发给 OneApi 的完整路径是 /v1/chat/completions。OneApi 收到后,把 /chat/completions 部分转发给上游渠道,拼法就是「渠道 Base URL + /chat/completions」。
如果 OneApi 渠道的 Base URL 也写了类似 https://xxx/v1 这样的地址,最终发到上游的就是 /v1/chat/completions 前面再加一层 /v1,变成了 /v1/v1/chat/completions。上游网关按自己的路由表匹配不到这个路径,于是返回 404。这种双 /v1 的冲突,在 Azure OpenAI 这类自带 /v1 路由的渠道上格外容易出现。TaoToken 之所以能避开,是因为它的 Base URL 是 https://taotoken.net/api,没有 /v1,OneApi 拼出来就是 /api/chat/completions,能直接命中。
2. 在 OneApi 里把 TaoToken 加成一个上游渠道
2.1 先到 TaoToken 官网创建 API Key
要解决路径冲突,最直接的办法是让 OneApi 的上游渠道提供一个不需要 /v1 的 OpenAI 兼容地址。打开 TaoToken,注册登录后进入控制台的 API Keys 页面,创建一把 Key。创建后复制保存,后面填进 OneApi 时统一用 YOUR_API_KEY 占位。
注意:这把 Key 和 OneApi 的「令牌」是两回事。OneApi 令牌是给 FastGPT 用的,在 OneApi 后台令牌页创建;YOUR_API_KEY 是给 OneApi 渠道用的,代表 TaoToken 账户的调用权限,两者不要混填。
2.2 新增 OneApi 渠道:类型选 OpenAI 兼容,Base URL 不带 /v1
登录 OneApi 后台,默认地址 http://localhost:3001,初始账号 root,密码 123456。进入「渠道」页面,点「新增渠道」,关键字段这样填:
| 字段 | 值 |
|---|---|
| 类型 | OpenAI 兼容 |
| 名称 | 随意,例如 TaoToken |
| Base URL | https://taotoken.net/api |
| 密钥 | YOUR_API_KEY |
| 模型 | 以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场的列表为准 |
保存后,在渠道列表点击「测试」。如果 Key 和地址没问题,OneApi 会返回测试成功。这一步验证的是 OneApi 到 TaoToken 的链路已经通了,接下来才轮到 FastGPT。
2.3 模型 ID 以 TaoToken 模型广场为准
OneApi 渠道里的「模型」不是随便命名的。FastGPT 的 config.json 里配了哪个模型名,OneApi 就要能匹配到对应的渠道。建议打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的模型广场页面,看当时列出了哪些模型 ID,照着填进 OneApi 渠道的模型列表,同时保持 FastGPT 的 config.json 里模型名一致。不要凭印象写一个模型 ID,TaoToken 支持的模型会随上游供应商调整,以模型广场当时列表为准最稳妥。
3. FastGPT 的 OPENAI_BASE_URL:什么时候带 /v1,什么时候别带
3.1 FastGPT 只认识 OneApi,OPENAI_BASE_URL 保留 /v1
FastGPT 不需要知道 TaoToken 的存在,它的所有模型请求都发给 OneApi。所以 FastGPT 的 OPENAI_BASE_URL 填的是 OneApi 地址,并且按官方部署文档保留 /v1。完整值是 http://OneApi所在机器IP:3001/v1。
这里容易绕晕:为什么 FastGPT 侧要带 /v1,OneApi 渠道里却不带?因为 /v1 只属于 FastGPT 到 OneApi 这一段路径。OneApi 到 TaoToken 这一段,路径由 OneApi 自动拼,拼完是 https://taotoken.net/api/chat/completions,TaoToken 的路由能直接命中,不需要中间再插一个 /v1。如果你反过来做,在 FastGPT 侧去掉 /v1、又在 OneApi 渠道里加 /v1,虽然偶尔也能通,但只是把冲突从一段挪到了另一段,并不彻底。
3.2 docker-compose.yml 正确示例与重启命令
确认 docker-compose.yml 里 OPENAI_BASE_URL 是 OneApi 地址带 /v1,CHAT_API_KEY 是 OneApi 令牌:
services:
fastgpt:
image: ghcr.io/labring/fastgpt:latest
container_name: fastgpt
ports:
- "3002:3000"
networks:
- llm_net
environment:
DEFAULT_ROOT_PSW: "123456"
OPENAI_BASE_URL: "http://192.168.2.117:3001/v1"
CHAT_API_KEY: "oneapi-token"
MONGODB_URI: "mongodb://fastgpt:123456@mongo:27017/fastgpt?authSource=admin"
PG_URL: "postgresql://fastgpt:123456@pg:5432/fastgpt"
networks:
llm_net:
external: true
如果之前为了排障手动去掉了 /v1,现在补回来,然后执行:
docker compose up -d
环境变量变更后,Docker 会重新创建 FastGPT 容器并读取新配置,不需要手动删容器。
3.3 config.json 的模型名和 OneApi 渠道对齐
FastGPT 的 config.json 里,模型名称要和 OneApi 渠道里配置的模型 ID 一致。例如 OneApi 的 TaoToken 渠道里配置了某个在线模型 ID,config.json 中对应的 name 字段就写同一个 ID。这一步在 OneApi 配置时对齐过,通常不用再动;但如果测试时提示「模型未找到」,优先检查这一处,而不是去改 Base URL。
4. 验证链路:FastGPT 对话、OneApi 日志、TaoToken 用量
4.1 在 FastGPT 里发一条测试消息
配置完成后,打开 FastGPT 界面(localhost:3002),新建一个对话,选择 config.json 里注册过的那个模型,发送一句「你好」。只要正常返回文本,链路就通了。如果仍然 404,不要急着改配置,先到 OneApi 容器里看日志,确认 404 是从 TaoToken 返回的,还是 OneApi 自身返回的。
4.2 OneApi 日志中确认 200
在终端执行:
docker logs oneapi --tail 20
正常情况下会看到类似 /v1/chat/completions 200 的记录。这说明 OneApi 把 FastGPT 的请求成功转发给了 TaoToken,并且拿到了响应。如果日志里是 404,检查 OneApi 渠道的 Base URL 是否误填成了 https://taotoken.net/api/v1;如果是 401,检查密钥是否复制完整、有没有混入 OneApi 令牌。
4.3 回 TaoToken 控制台核对 token 记录
链路通了之后,打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,登录控制台查看用量记录。FastGPT 刚才那轮对话应该会产生对应的 token 消耗。这一步不只是图个安心,也等于确认了你填的 Base URL 没有指错地方,请求确实经过了 TaoToken。
5. 排障对照:404、401、200 无内容各是什么原因
5.1 404:URL 多拼了一层 /v1
最常见的一种。FastGPT 侧和 OneApi 渠道侧只能有一边带 /v1:FastGPT 的 OPENAI_BASE_URL 带 /v1 时,OneApi 渠道的 Base URL 就是 https://taotoken.net/api;反过来,如果渠道填了带 /v1 的地址,FastGPT 侧就要去掉 /v1。但推荐前者,因为 FastGPT 官方部署文档约定 OPENAI_BASE_URL 带 /v1,改动面最小,也符合 FastGPT 自身的请求习惯。
5.2 401:OneApi 渠道密钥填成了 FastGPT 令牌
OneApi 渠道里的密钥必须是 TaoToken 控制台创建的 YOUR_API_KEY,而不是 FastGPT 的 CHAT_API_KEY。CHAT_API_KEY 是 OneApi 自己的令牌,FastGPT 拿它来访问 OneApi;OneApi 渠道里的密钥是 TaoToken 的 Key,OneApi 拿它来访问 TaoToken。另外注意复制 Key 时不要把前后空格带进去,YAML 和 OneApi 表单都不吃空格。
5.3 200 但空响应:模型 ID 与模型广场不一致
如果 OneApi 日志返回 200,但 FastGPT 页面一直转圈或返回空字符串,多半是模型 ID 不匹配。去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场核对当时的模型 ID,然后同步修改 OneApi 渠道模型列表和 FastGPT config.json。200 只代表请求被接受,不代表路由命中了模型,模型名必须两边完全一致。
6. 跑通之后去控制台对一下这次调用
6.1 用同一把 Key 验证模型对话
配置保存后,先在 TaoToken 模型对话 里用同一把 Key 发一条测试消息,确认模型 ID 和 Base URL 没填错。确认无误后,回到 FastGPT 的知识库问答界面,走一遍文档检索加模型生成,验证 OneApi 到 TaoToken 的通道在真实知识库场景下也稳定。
6.2 Coding Plan 与控制台入口
如果准备让 FastGPT 长期跑知识库问答,可以打开 Coding Plan 看套餐是否够用;Key 在 控制台 API Keys 创建,随时可以补。
一句话体会:/v1 要不要带,取决于你填的是哪一段地址。FastGPT 到 OneApi 这一段,按官方约定带 /v1;OneApi 到 TaoToken 这一段,Base URL 写 https://taotoken.net/api 就好。下次再看到 404,先数一下 URL 里是不是有两个 /v1。




被折叠的 条评论
为什么被折叠?



