
1. FastGPT 本地部署后模型接入的真实痛点FastGPT 本地跑起来之后真正让人头疼的往往不是容器起没起来而是模型怎么接、Key 怎么管。我自己在本地把 FastGPT 和 ChatGLM3 串起来的时候最开始就是被一堆 Base URL 和 API Key 搞晕的ChatGLM3 本地服务一个地址向量模型一个地址如果还想顺手接几个云端模型做对比那配置文件里就全是散落的 Key 和端口改一次错一次。这个场景其实很典型。FastGPT 作为一套知识库问答编排框架它本身不产出模型能力所有对话、向量化、问题补全都要靠外部模型服务。而 ChatGLM3 是清华开源的一套中英双语对话模型6B 版本在消费级显卡上就能跑很多人会选择把它部署在本地作为 FastGPT 的默认对话模型。问题就出在这里FastGPT 的config.json和docker-compose.yml里模型名称、Base URL、Key 是分开配置的ChatGLM3 本地服务通常暴露的是 OpenAI 兼容接口但路径、模型 ID 写法稍有出入就会报错。更麻烦的是多模型场景。你本地跑着 ChatGLM3可能还想接一个云端模型做效果对比或者用另一个模型做向量化。这时候如果每个模型都单独填一套 Key 和地址配置文件会变得非常难维护。我试过把 Key 写死在docker-compose.yml的环境变量里结果换一个环境就要重新改一遍非常不优雅。所以这篇内容的核心思路是用 TaoToken 作为统一的 API 通道把 ChatGLM3 本地服务和其它模型都收敛到同一个 Base URL 和同一套 Key 管理下FastGPT 只需要认一个地址。这样你本地联调的时候改模型只需要改config.json里的模型名不用再动环境变量。下面我会从环境准备、TaoToken 配置、FastGPT 配置文件修改、curl 验证、常见报错排查这几个环节完整走一遍可复现的流程。2. TaoToken 统一 Key 与 ChatGLM3 本地服务的衔接准备在动手改 FastGPT 配置之前先把 TaoToken 这一层准备好。TaoToken 的作用是提供一个统一的 API 入口你可以在它的控制台里创建 API Key然后把 ChatGLM3 本地服务作为一个自定义渠道接进去也可以同时接入其它模型。这样 FastGPT 侧只需要填 TaoToken 的 Base URL 和一把 Key模型切换在 TaoToken 后台完成。先访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录。登录后进入控制台找到 API Keys 管理页面创建一个新的 Key。这个 Key 就是后面 FastGPT 里要填的CHAT_API_KEY。创建的时候建议起一个能识别的名字比如fastgpt-local方便后面排查。创建完 Key 之后需要把 ChatGLM3 本地服务接入进来。假设你的 ChatGLM3 已经在本机跑起来了OpenAI 兼容接口暴露在http://127.0.0.1:8000/v1模型 ID 是chatglm3-6b。在 TaoToken 控制台里添加一个自定义渠道Base URL 填http://127.0.0.1:8000/v1模型名填chatglm3-6b。这里要注意如果你的 ChatGLM3 是用 FastChat 或者 vLLM 起的模型 ID 要和启动参数里的--model-name保持一致否则请求会返回模型不存在的错误。TaoToken 的 API 入口是 https://taotoken.net/api 这个地址后面会作为 FastGPT 的OPENAI_BASE_URL。注意 FastGPT 的 OpenAI 兼容接口通常需要带/v1后缀所以实际填的时候要写成https://taotoken.net/api/v1。这一点很容易踩坑我第一次配的时候只填了https://taotoken.net/api结果 FastGPT 请求一直 404后来加上/v1才通。另外如果你打算长期在本地做编码或者 Agent 类的联调可以顺手看一下 Coding Plan 的入口它适合需要频繁调用、长期跑任务的场景。模型对话的调试入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 你可以在里面先手动发一条消息确认 ChatGLM3 渠道是通的再去改 FastGPT 配置这样能把问题范围缩小。准备工作做完之后你手里应该有三样东西TaoToken 的 API Key、TaoToken 的 Base URL带/v1、以及 ChatGLM3 在 TaoToken 里的模型 ID。下面就可以开始改 FastGPT 的配置文件了。3. FastGPT 的 docker-compose.yml 与 config.json 可复制配置FastGPT 的模型接入配置分散在两个文件里docker-compose.yml负责环境变量层面的 Base URL 和 Keyconfig.json负责声明有哪些模型可用。两个文件要配合改只改一个会出问题。先看docker-compose.yml里 fastgpt 服务的 environment 部分。关键三项是OPENAI_BASE_URL、CHAT_API_KEY和DB_MAX_LINK。把OPENAI_BASE_URL指向 TaoToken 的 API 地址CHAT_API_KEY填你在 TaoToken 控制台创建的那把 Key。下面是我实测可用的片段你可以直接对照修改fastgpt: container_name: fastgpt-fastgpt image: ghcr.io/labring/fastgpt:latest ports: - 3000:3000 networks: - fastgpt depends_on: - mongo - pg restart: always environment: - DEFAULT_ROOT_PSW1234 - OPENAI_BASE_URLhttps://taotoken.net/api/v1 - CHAT_API_KEYsk-你的TaoTokenKey - DB_MAX_LINK5 - TOKEN_KEYany - ROOT_KEYroot_key - FILE_TOKEN_KEYfiletoken - MONGODB_URImongodb://username:passwordmongo:27017/fastgpt?authSourceadmin - PG_URLpostgresql://username:passwordpg:5432/postgres volumes: - ./config.json:/app/data/config.json这里有个细节OPENAI_BASE_URL一定要带/v1。FastGPT 内部用的是 OpenAI SDK 的调用方式SDK 会在 Base URL 后面拼/chat/completions如果你只写到https://taotoken.net/api最终请求路径会变成https://taotoken.net/api/chat/completions缺少/v1这一层TaoToken 侧匹配不到路由就会返回 404。这个坑我在本地复现过两次改成https://taotoken.net/api/v1之后请求就正常了。接下来改config.json。这个文件决定了 FastGPT 界面上能选哪些模型。你需要把ChatModels、QAModels、CQModels、ExtractModels、QGModels里的模型名改成 TaoToken 里配置的 ChatGLM3 模型 ID。下面是一份可复制的配置片段模型名统一用chatglm3-6b{ SystemParams: { pluginBaseUrl: , openapiPrefix: openapi, vectorMaxProcess: 15, qaMaxProcess: 15, pgIvfflatProbe: 10 }, ChatModels: [ { model: chatglm3-6b, name: ChatGLM3-6B, price: 0, maxToken: 4000, quoteMaxToken: 2000, maxTemperature: 1.2, censor: false, defaultSystemChatPrompt: } ], QAModels: [ { model: chatglm3-6b, name: ChatGLM3-6B, maxToken: 8000, price: 0 } ], CQModels: [ { model: chatglm3-6b, name: ChatGLM3-6B, maxToken: 8000, price: 0, functionCall: true, functionPrompt: } ], ExtractModels: [ { model: chatglm3-6b, name: ChatGLM3-6B, maxToken: 8000, price: 0, functionCall: true, functionPrompt: } ], QGModels: [ { model: chatglm3-6b, name: ChatGLM3-6B, maxToken: 4000, price: 0 } ], VectorModels: [ { model: m3e-base, name: m3e-base, price: 0.2, defaultToken: 700, maxToken: 3000 } ] }注意model字段必须和 TaoToken 里配置的模型 ID 完全一致大小写敏感。name字段是显示在 FastGPT 界面上的名字可以随便起。VectorModels如果你本地没有部署向量模型可以先用一个云端向量模型顶上或者把这块单独接到 TaoToken 的另一个渠道。改完这两个文件之后在docker-compose.yml同级目录执行docker-compose pull docker-compose up -d等容器起来之后访问http://你的服务器IP:3000用 root 和DEFAULT_ROOT_PSW登录进入模型配置页面应该能看到 ChatGLM3-6B 这个选项。4. curl 验证 TaoToken 对话接口连通性与 FastGPT 联调结果配置文件改完不代表链路就通了最好先用 curl 直接打 TaoToken 的接口确认 ChatGLM3 渠道本身是活的。这一步能把「TaoToken 侧问题」和「FastGPT 侧问题」分开排查效率高很多。打开终端执行下面这条命令。把sk-你的TaoTokenKey替换成你实际的 Keycurl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoTokenKey \ -H Content-Type: application/json \ -d { model: chatglm3-6b, messages: [ {role: user, content: 你好请用一句话介绍你自己} ], temperature: 0.7, max_tokens: 128 }如果链路正常你会收到类似下面的返回{ id: chatcmpl-xxxx, object: chat.completion, created: 1710000000, model: chatglm3-6b, choices: [ { index: 0, message: { role: assistant, content: 你好我是 ChatGLM3一个支持中英双语的对话语言模型。 }, finish_reason: stop } ], usage: { prompt_tokens: 12, completion_tokens: 20, total_tokens: 32 } }重点看choices[0].message.content有没有正常返回文本。如果返回的是空字符串或者finish_reason是length说明max_tokens设太小了调大一点再试。如果返回 401说明 Key 不对或者没带Bearer前缀。如果返回 404大概率是 Base URL 少了/v1。curl 通了之后回到 FastGPT 界面做一次实际问答。新建一个应用模型选 ChatGLM3-6B在对话框里输入「你好请介绍一下 FastGPT 的用途」。如果 FastGPT 能正常返回内容说明docker-compose.yml里的OPENAI_BASE_URL和CHAT_API_KEY都生效了。如果 FastGPT 报错但 curl 是通的那问题就在 FastGPT 的配置侧重点检查config.json里的模型名和docker-compose.yml里的环境变量有没有对应上。还有一个容易忽略的点FastGPT 容器内部访问 TaoToken 走的是外网如果你的服务器网络环境对https://taotoken.net的访问有限制也会导致请求失败。这种情况下 curl 在宿主机能通但容器里不通。可以在容器内执行一次 curl 验证docker exec -it fastgpt-fastgpt sh curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoTokenKey \ -H Content-Type: application/json \ -d {model:chatglm3-6b,messages:[{role:user,content:test}]}容器内也能返回正常结果才说明 FastGPT 的调用链路是完整的。5. 本地联调常见报错排查401、local proxy failed、reading choices本地把 FastGPT 和 ChatGLM3 串起来的过程中有几个报错出现频率特别高我按实际遇到的顺序整理一下排查思路。第一个是 401 Unauthorized。这个最直接就是 Key 的问题。可能的原因有三个Key 复制的时候多了空格或者换行CHAT_API_KEY前面忘了加sk-前缀或者 Key 在 TaoToken 控制台被删了或者过期了。排查方法很简单把docker-compose.yml里的 Key 复制出来直接用在 curl 命令里打一次如果 curl 也 401那就是 Key 本身的问题去控制台重新生成一把。第二个是local proxy failed或者类似的连接失败报错。这个通常出现在 FastGPT 容器尝试访问OPENAI_BASE_URL的时候。如果你填的是http://127.0.0.1:xxxx这种本地地址容器内部是访问不到宿主机的127.0.0.1的因为容器有自己的网络命名空间。解决办法是把地址改成宿主机的局域网 IP比如http://192.168.1.100:8000/v1或者用host.docker.internalLinux 下需要额外配置。如果你用的是 TaoToken 的https://taotoken.net/api/v1一般不会遇到这个问题除非服务器本身出不了外网。第三个是reading choices相关的报错完整信息可能是panic: runtime error: index out of range [0] with length 0或者reading choices。这个说明 FastGPT 收到了响应但响应体里没有choices字段或者choices是空数组。常见原因是 TaoToken 侧返回了错误信息但 HTTP 状态码是 200FastGPT 没做兼容处理就直接去读choices[0]了。这时候要去看 TaoToken 的调用日志确认请求有没有真正打到 ChatGLM3 服务上。如果 ChatGLM3 本地服务挂了TaoToken 可能会返回一个错误对象FastGPT 解析不了就报这个错。解决办法是先确保 ChatGLM3 本地服务是活的用 curl 直接打http://127.0.0.1:8000/v1/chat/completions确认能返回正常结果。还有一个和 OAuth 相关的报错通常出现在你用了某些需要 OAuth 认证的渠道时。如果你在 TaoToken 里接的是需要 OAuth 的模型服务要确保授权没有过期。不过 ChatGLM3 本地服务一般不需要 OAuth所以这个报错在本文场景下出现概率不高了解一下就行。排查的时候建议按「curl 打 TaoToken → curl 打 ChatGLM3 本地 → FastGPT 界面问答」这个顺序逐层验证每层都通了再往下走不要一上来就改 FastGPT 配置那样容易把问题搞混。6. 统一 Key 接入后的模型管理与后续扩展把 ChatGLM3 通过 TaoToken 接进 FastGPT 之后最大的好处是模型管理变得集中了。以前你要在 FastGPT 的docker-compose.yml里维护一堆环境变量现在只需要维护一个OPENAI_BASE_URL和一把CHAT_API_KEY。想换模型或者加模型去 TaoToken 控制台操作就行FastGPT 侧只需要在config.json里加一条模型声明。如果你后面想接更多模型做对比比如再加一个云端模型操作路径是一样的在 TaoToken 里添加渠道拿到模型 ID然后在config.json的ChatModels数组里追加一条。FastGPT 重启之后就能在界面上看到新模型。这样你本地就有一套统一的模型接入层不管是 ChatGLM3 还是别的模型都走同一个入口。API Key 的管理也更清晰。你可以在 TaoToken 控制台为不同的用途创建不同的 Key比如一个给 FastGPT 用一个给本地脚本调试用。哪个 Key 出问题了直接禁用或者重新生成不影响其它服务。控制台的 API Keys 页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 遇到配置问题可以先翻文档大部分常见问题都有说明。最后提醒一点FastGPT 的config.json修改之后需要重启容器才能生效直接改文件不重启是不行的。重启命令就是docker-compose restart fastgpt。如果你改了docker-compose.yml里的环境变量那需要docker-compose up -d重建容器。这两个操作的区别记一下能省不少排查时间。