
1. 为什么要在 OneAPI 和 FastGPT 之间加一层统一 Key如果你正在折腾本地知识库问答系统大概率会遇到这样一个局面ChatGLM3-6B 跑在 8000 端口m3e 嵌入模型跑在 6008 端口FastGPT 又要连一个对话模型和一个向量模型每个服务都有自己的地址和密钥。一旦模型换一个、端口改一下FastGPT 的 config.json 就得跟着动改完还要重启容器来回折腾特别费时间。OneAPI 在这里扮演的角色就是一个「模型接口路由器」。它把 ChatGLM3-6B、m3e、甚至后面你想加的别的模型全部收敛成一套 OpenAI 兼容的接口对外只暴露一个 Base URL 和一个 Key。FastGPT 那边只需要认这一个地址不用关心背后到底连了几个模型服务。而 TaoToken 的统一 Key 通道解决的是另一个层面的问题当你需要调用云端模型做补充、或者想把本地模型和云端模型放在同一个入口管理时不用再为每个厂商单独维护一套密钥和地址。这套组合适合谁适合手头有 GPU 机器、想在内网或本地跑 ChatGLM3-6B 做知识库问答、同时又希望接口管理清爽一点的开发者。你不需要把每个模型的 Key 散落在各个配置文件里OneAPI 帮你做聚合TaoToken 帮你做统一入口。下面我从零开始把整条链路拆成可复制的步骤。2. TaoToken 统一 Key 与 OneAPI 渠道对接前置准备在动手改配置之前先把两个东西准备好TaoToken 的 API Key以及 OneAPI 的渠道概念。TaoToken 的 API 地址是https://taotoken.net/api这个地址后面会作为 OneAPI 里一个渠道的 Base URL 填进去。你需要先去控制台创建一个 Key路径在https://taotoken.net/console/api-keys创建完复制出来格式通常是sk-开头的一串字符。OneAPI 这边的逻辑是这样的它自己有一个「渠道」列表每个渠道代表一个上游模型提供方。渠道里要填三样东西——Base URL、API Key、以及这个渠道支持哪些模型名称。FastGPT 请求 OneAPI 时OneAPI 根据请求里的 model 字段找到对应渠道把请求转发过去。所以你要做的就是把 TaoToken 当成一个渠道加进去再把本地的 ChatGLM3-6B 和 m3e 也各自加成渠道。这里有个容易踩的坑OneAPI 渠道里的「模型名称」必须和 FastGPT 的 config.json 里写的 model 值完全一致大小写都不能差。比如你在 OneAPI 渠道里填的是ChatGLM3-6BFastGPT 配置里也得是ChatGLM3-6B写成chatglm3-6b就会报模型不存在的错。我建议你先把要用的模型名称列一个清单后面配置时对着抄。另外TaoToken 的 Key 在 OneAPI 渠道里填的时候注意 Base URL 要带上/v1后缀也就是https://taotoken.net/api/v1。这个和 FastGPT 连 OneAPI 时填的地址规则是一样的OneAPI 对外也是 OpenAI 兼容接口所以 FastGPT 那边填http://你的OneAPI地址:3001/v1。如果你还没部署 OneAPI可以用 Docker 快速起一个docker pull justsong/one-api mkdir -p /usr/local/docker/oneapi docker run --name one-api -d --restart always \ -p 3001:3000 \ -e TZAsia/Shanghai \ -e TIKTOKEN_CACHE_DIR/data/cache \ -v /usr/local/docker/oneapi:/data \ justsong/one-api启动后访问http://你的IP:3001默认账号 root密码 123456第一次登录后马上改密码。然后进「渠道」页面点「添加渠道」类型选 OpenAIBase URL 填https://taotoken.net/api/v1Key 填你从 TaoToken 控制台复制的那个模型列表里把你需要的模型名填进去。保存后点「测试」如果返回绿色成功说明这条渠道通了。3. 可复制配置OneAPI 渠道 FastGPT config.json 完整片段这一节直接给你能粘贴的配置。先看 OneAPI 里添加 TaoToken 渠道时表单关键字段怎么填字段填写值渠道类型OpenAI渠道名称taotoken-unifiedBase URLhttps://taotoken.net/api/v1API Keysk-你的TaoTokenKey模型gpt-3.5-turbo-1106, gpt-4o-mini按需填保存后OneAPI 会生成一个自己的令牌这个令牌是给 FastGPT 用的。进「令牌」页面点「添加令牌」名称随便写额度设无限过期时间选永不过期创建后复制那串sk-开头的令牌这就是 FastGPT 要填的 CHAT_API_KEY。接下来是 FastGPT 的 docker-compose.yml 里跟 OneAPI 对接的环境变量。找到 fastgpt 服务的 environment 段改成这样environment: - DEFAULT_ROOT_PSW1234 - OPENAI_BASE_URLhttp://192.168.5.210:3001/v1 - CHAT_API_KEYsk-你的OneAPI令牌注意OPENAI_BASE_URL末尾的/v1不能少CHAT_API_KEY用的是 OneAPI 生成的令牌不是 TaoToken 的 Key也不是 ChatGLM3-6B 的 Key。改完执行docker-compose up -d让 FastGPT 重新读取环境变量。然后是 FastGPT 的 config.json这个文件在 fastgpt 挂载目录里。你要在里面定义两个模型一个对话模型指向 ChatGLM3-6B一个向量模型指向 m3e。找到llmModels数组复制一份 gpt-3.5-turbo 的配置改成{ model: ChatGLM3-6B, name: ChatGLM3-6B, maxContext: 8000, maxResponse: 2000, quoteMaxToken: 7000, maxTemperature: 1.2, charsPointsPrice: 0, censor: false, vision: false, datasetProcess: false, usedInClassify: true, usedInExtractFields: true, usedInToolCall: true, usedInQueryExtension: true, toolChoice: true, functionCall: false, defaultSystemChatPrompt: }再找到vectorModels数组加入 m3e 的配置{ model: m3e-large, name: m3e-large, charsPointsPrice: 0, defaultToken: 500, maxToken: 3000, weight: 1 }这里model的值ChatGLM3-6B和m3e-large必须和 OneAPI 渠道里填的模型名称一模一样。改完 config.json 后执行docker restart fastgpt重启容器。还有一个隐藏坑FastGPT 知识库默认会用一个叫gpt-3.5-turbo-1106的模型做文件处理。如果你没在 OneAPI 里配这个模型名上传文件时会报错。解决办法是在 OneAPI 的 TaoToken 渠道模型列表里加上gpt-3.5-turbo-1106或者单独建一个渠道指定这个模型名。这样 FastGPT 请求文件处理模型时OneAPI 能路由到 TaoToken 那边去。4. 验证请求curl 测 OneAPI 与 FastGPT 知识库问答端到端连通配置改完别急着开浏览器先用 curl 把每一层都测一遍出问题好定位。第一步测 OneAPI 到 TaoToken 这条链路在 OneAPI 所在机器上执行curl -X POST http://127.0.0.1:3001/v1/chat/completions \ -H Authorization: Bearer sk-你的OneAPI令牌 \ -H Content-Type: application/json \ -d { model: gpt-3.5-turbo-1106, messages: [{role: user, content: 你好}], stream: false }如果返回里有choices字段和正常回复内容说明 OneAPI 到 TaoToken 通了。如果返回 401检查 OneAPI 令牌是否正确如果返回模型不存在检查渠道里模型名有没有填对。第二步测 OneAPI 到本地 ChatGLM3-6B。先确认 ChatGLM3 的 api_server.py 已经跑起来监听 8000 端口。然后在 OneAPI 里加一个渠道Base URL 填http://127.0.0.1:8000/v1Key 随便填一个非空值ChatGLM3 的 api_server 默认不校验 Key模型名填ChatGLM3-6B。保存后同样用 curl 测curl -X POST http://127.0.0.1:3001/v1/chat/completions \ -H Authorization: Bearer sk-你的OneAPI令牌 \ -H Content-Type: application/json \ -d { model: ChatGLM3-6B, messages: [{role: user, content: 介绍一下你自己}], stream: false }能返回 ChatGLM3 的回复就说明本地模型链路通了。第三步测 FastGPT 的知识库问答接口。FastGPT 的对话接口需要先创建应用拿到 appId然后调/api/v1/chat/completions。一个简化的验证方式是直接在 FastGPT 页面里新建一个知识库应用上传一个 txt 文件等索引完成后问一个跟文件内容相关的问题。如果回答里引用了文件内容说明嵌入模型和对话模型都正常工作。你也可以用 curl 直接打 FastGPT 的接口curl -X POST http://127.0.0.1:3000/api/v1/chat/completions \ -H Authorization: Bearer fastgpt-你的应用Key \ -H Content-Type: application/json \ -d { chatId: test-001, stream: false, detail: false, messages: [{role: user, content: 知识库里讲了什么}] }这个请求会走 FastGPT 的完整链路FastGPT 用 m3e 把问题向量化去知识库检索相关片段再把片段和问题一起发给 ChatGLM3-6B 生成回答。如果返回内容里包含知识库里的信息端到端就通了。5. 本篇常见报错排查401、local proxy failed、reading choices、OAuth配置过程中最容易撞上的几个报错我按出现频率排一下。401 Unauthorized。这个通常出现在两个位置一是 OneAPI 调 TaoToken 时 Key 不对检查渠道里的 Key 是不是从https://taotoken.net/console/api-keys复制的完整字符串二是 FastGPT 调 OneAPI 时令牌不对检查 docker-compose.yml 里的CHAT_API_KEY是不是 OneAPI 生成的令牌而不是 TaoToken 的 Key。还有一种情况是 OneAPI 令牌额度用完了去令牌页面看一下剩余额度。local proxy failed。这个报错一般出现在 OneAPI 渠道测试时说明 OneAPI 所在容器访问不到你填的 Base URL。如果 Base URL 写的是127.0.0.1:8000但 OneAPI 跑在容器里容器内的 127.0.0.1 指向容器自己不是宿主机。解决办法是把 Base URL 改成宿主机的局域网 IP比如http://192.168.5.210:8000/v1或者用host.docker.internalLinux 下需要额外加--add-host参数。reading choices 相关报错。典型信息是Cannot read properties of undefined (reading choices)这表示 FastGPT 收到了一个不符合 OpenAI 格式的响应。常见原因是 OneAPI 转发时上游返回了错误信息但 FastGPT 按正常格式去解析。去 OneAPI 的「日志」页面看那条请求的实际响应体通常能看到上游返回的真实错误比如模型不存在、额度不足、或者上游超时。OAuth 相关报错。如果你在 OneAPI 里配了 OAuth 登录或者 FastGPT 那边开了 SSO可能会遇到OAuth callback error。这个跟模型链路无关是认证配置问题。检查回调地址是否和实际访问地址一致OneAPI 的SERVER_ADDRESS环境变量有没有设对。如果只是本地测试可以先关掉 OAuth用账号密码登录。还有一个不报错但很隐蔽的问题FastGPT 知识库上传文件后一直显示「训练中」不变成「就绪」。这通常是嵌入模型没配好。去 OneAPI 日志里看有没有对m3e-large的请求如果请求返回 404说明 OneAPI 里 m3e 渠道的模型名和 config.json 里的对不上。m3e 容器本身只提供/v1/embeddings接口不提供/v1/chat/completions所以在 OneAPI 里测试渠道时会显示 404这是正常的只要 embeddings 请求能通就行。6. 长期编码与 Agent 场景的 Key 管理建议这套链路跑通之后你可能会想把它用在更长期的场景里比如让 Cline、Claude Code 这类编码 Agent 也走同一个入口。这时候 Key 管理就值得花点心思。我的做法是在 OneAPI 里按用途建不同的令牌一个给 FastGPT 知识库用一个给编码 Agent 用一个给临时测试用。每个令牌设不同的额度上限这样即使某个令牌泄露影响范围也可控。如果你想让编码 Agent 也能调用 ChatGLM3-6B 或者 TaoToken 上的模型可以在 Agent 的配置里把 Base URL 指向 OneAPI 的地址Key 填对应的 OneAPI 令牌。这样 Agent 发出的请求会经过 OneAPI 路由你可以在 OneAPI 日志里看到所有调用记录方便排查问题。对于需要长期跑的 Agent 任务建议用 Coding Plan 这类按周期计费的方式比按量计费更可控。TaoToken 的接入文档在https://taotoken.net/doc里面有各个模型和接口的详细说明。如果你在配置 OneAPI 渠道时不确定某个模型的参数怎么填可以去文档里查一下对应的模型名称和推荐配置。模型对话功能可以在https://taotoken.net/chat直接体验用来快速验证 Key 是否有效。最后提醒一点OneAPI 的渠道测试按钮对嵌入模型会显示失败因为嵌入模型不响应 chat/completions 请求。判断嵌入模型是否配好不要看渠道测试结果直接去 FastGPT 上传一个文件看能不能正常索引。索引成功就说明嵌入链路没问题。这套配置我反复搭过几次每次卡住的地方都差不多把上面几个报错对照着查基本都能解决。