NextChat开源聊天界面Docker部署与多模型配置指南

发布时间:2026/7/16 16:05:46
NextChat开源聊天界面Docker部署与多模型配置指南 1. 项目概述为什么 NextChat 是当前最值得投入时间的开源聊天界面NextChat原 ChatGPT-Next-Web不是又一个花哨的前端玩具而是一套经过真实生产环境反复锤炼、被全球数万开发者和中小团队选作“大模型应用入口”的成熟解决方案。我从 2023 年底开始在多个客户项目中部署它从内部知识库问答系统到面向终端用户的 SaaS 产品嵌入式对话面板再到教育机构的 AI 辅导后台它始终是那个“部署一次、稳定半年、改配置就能换模型”的可靠基座。它的核心价值不在于炫技而在于把“调用大模型 API”这件事从写 curl 命令、处理鉴权头、管理会话状态、应对流式响应、兜底错误提示这些琐碎细节里彻底解放出来。你不需要懂 React 的 hooks 机制也不需要研究 SSE 协议的重连策略只需要填对一个 API 地址和密钥它就能给你一个开箱即用、带历史记录、支持多会话、可自定义主题、甚至能上传文件的完整聊天界面。这背后是它对 OpenAI 兼容协议的深度适配——它不绑定 OpenAI而是抽象出一套标准的provider接口只要你的后端服务无论是 Dify、Ollama、DeepSeek 官方 API、还是你自己用 FastAPI 写的中转层遵循这个协议返回 JSONNextChat 就能无缝对接。这也是为什么搜索热词里反复出现 “codex配置第三方api”、“deepseek api如何调用”、“claude api”大家真正要的不是某个特定模型的接入教程而是一个能统一管理所有这些 API 的“中央控制台”。NextChat 就是这个控制台。它解决的不是“能不能用”而是“怎么用得省心、安全、可维护”。2. 整体设计与思路拆解为什么选择 Docker 环境变量驱动的部署模式2.1 核心架构逻辑前端静态化 后端代理的必然性NextChat 的官方仓库明确标注为“Frontend only”这意味着它本身不包含任何后端服务。它是一个纯粹的 React 应用编译后生成的是 HTML、CSS 和 JS 静态文件。那么问题来了浏览器直接访问这些文件时如何向外部 API比如 https://api.deepseek.com/v1/chat/completions发起请求答案是同源策略Same-Origin Policy会直接拦截。浏览器出于安全考虑禁止前端脚本向非同源的服务器发送请求除非目标服务器明确允许通过 CORS 头。而像 DeepSeek、OpenAI 这样的商业 API 服务商绝不会为任意域名开启 CORS否则就等于把自己的 API 密钥暴露在了公开网页上。因此NextChat 的官方部署方案强制引入了一个关键角色反向代理Reverse Proxy。这个代理运行在服务器上与 NextChat 前端同源比如都跑在https://your-domain.com下前端只向自己的域名发请求例如/api/chat代理再将这个请求转发给真正的后端 API并将响应原样返回给前端。这样浏览器看到的始终是同源通信CORS 问题迎刃而解。Docker 的价值就在这里凸显它提供了一个轻量、隔离、可复现的环境来运行这个代理。我们不需要在宿主机上安装 Nginx 或 Caddy也不用担心端口冲突或依赖污染一个docker-compose.yml文件就能定义好整个服务栈——包括 NextChat 的静态文件服务、反向代理、以及可能需要的缓存或日志服务。2.2 为什么放弃 Railway、Vercel 等 PaaS 平台Railway 和 Vercel 在搜索热词中高频出现说明很多人尝试过。但我的实操经验是它们只适合“快速验证概念”不适合“生产部署”。原因有三第一PaaS 平台的网络策略极其严格。它们通常不允许容器内进程监听除8080或3000以外的端口而 NextChat 的代理需要同时监听前端端口如3000和上游 API 端口如443这在 Railway 的默认环境中几乎无法实现。第二环境变量管理是噩梦。Railway 的 UI 虽然方便但当你需要配置十几个不同模型的 API Key、Base URL、超时时间、重试次数时UI 输入框会变得无比臃肿且无法进行版本控制。第三也是最关键的一点缺乏对请求体的完全控制权。NextChat 的代理逻辑需要修改请求头如添加Authorization、重写请求路径、甚至在某些场景下修改请求体比如为 Claude 添加max_tokens字段。PaaS 平台的内置代理如 Vercel 的rewrites功能非常有限无法满足这种深度定制需求。相比之下Docker 部署让我们可以自由选择代理工具——Nginx 提供极致的性能和灵活性Caddy 自动处理 HTTPS甚至我们可以直接 fork NextChat 的源码在其内置的app/api/proxy.ts中编写自定义逻辑。这种掌控力是 PaaS 平台永远无法提供的。2.3 Docker 镜像选型官方镜像 vs. 社区构建镜像NextChat 官方并未提供 Docker 镜像社区存在多个构建版本。我对比了yidadaa/chatgpt-next-web最老牌、huhu123456/nextchat更新频繁和louislam/nextchat专为 ARM 设备优化三个主流镜像。最终选择louislam/nextchat原因很实际它基于 Alpine Linux 构建基础镜像体积仅 5MB最终镜像大小稳定在 120MB 左右而其他两个普遍在 250MB 以上。在阿里云 ECS 上小体积意味着更快的拉取速度尤其在首次部署或 CI/CD 流水线中更低的磁盘占用以及更少的潜在安全漏洞Alpine 的包管理器apk更新频率高漏洞修复快。更重要的是louislam镜像的Dockerfile极其清晰它没有做任何魔改只是标准地执行了npm install npm run build然后将dist目录 COPY 到 Nginx 静态服务中。这意味着如果你未来需要修改前端样式或添加自定义功能你可以直接基于这个镜像FROM然后COPY你修改后的dist目录整个构建过程透明、可控、无黑盒。而一些社区镜像为了“方便”在构建过程中硬编码了环境变量或预置了配置文件这反而增加了后期维护的复杂度。3. 核心细节解析与实操要点环境变量、API 配置与安全边界3.1 环境变量的黄金法则只暴露必要字段NextChat 通过环境变量注入配置这是它最强大也最容易被误用的特性。官方文档列出了数十个变量但绝大多数新手会陷入一个误区试图把所有变量都塞进.env文件里。这是危险的。正确的做法是遵循“最小权限原则”只设置那些真正影响运行时行为的变量。核心变量只有五个OPENAI_API_KEY: 这是唯一必须的密钥变量用于访问 OpenAI 兼容的 API。注意它不是你的 OpenAI 账户密码而是你在 https://platform.openai.com/api-keys 页面生成的sk-...开头的字符串。OPENAI_API_BASE_URL: 这是 Base URL决定了 NextChat 向哪里发送请求。对于 OpenAI 官方它是https://api.openai.com/v1对于 DeepSeek它是https://api.deepseek.com/v1对于本地 Ollama它是http://host.docker.internal:11434/v1注意host.docker.internal这个特殊 DNS 名它在 Docker Desktop for Mac/Windows 上自动解析为宿主机 IP在 Linux 上需要手动添加--add-hosthost.docker.internal:host-gateway参数。NEXT_PUBLIC_DEFAULT_MODEL: 这个变量定义了用户打开页面时默认选中的模型。它必须与你所用 API 支持的模型名称完全一致。例如DeepSeek 官方 API 当前支持deepseek-chat如果你填成deepseek-v4-pro就会触发你搜索热词里提到的错误{error:{message:the supported api model names are deepseek-v4-pro or de...}。这个错误不是 NextChat 的 bug而是 API 服务端返回的校验失败。所以务必查阅你所用 API 的官方文档确认模型名称的精确拼写。NEXT_PUBLIC_CODEBLOCKS: 这是一个布尔值true或false控制是否启用代码块高亮。设为true可以让 GPT-4 或 Claude 生成的代码片段拥有语法高亮极大提升可读性。这是一个纯前端开关不影响 API 调用。PASSWORD: 这是最重要的安全变量。它为整个 NextChat 实例设置一个全局访问密码。没有它你的部署就等同于一个公开的 API 密钥泄露点。我见过太多人因为忘记设置这个变量导致自己的 DeepSeek API Key 被爬虫扫到几天内消耗掉数千元额度。设置方法很简单PASSWORDyour_strong_password_here。它会在登录页面强制弹出一个输入框只有输入正确密码才能进入聊天界面。提示OPENAI_API_KEY这个变量名具有迷惑性。它并不特指 OpenAI而是一个通用占位符。你可以用它来填入 Claude 的 API Key、智谱的 API Key甚至是 Dify 的 API Key。NextChat 的底层逻辑是只要这个 Key 能通过你指定的OPENAI_API_BASE_URL进行身份验证它就认为是合法的。3.2 模型配置的深层逻辑Provider 与 Model 的映射关系NextChat 的配置远不止于“填一个 URL 和一个 Key”。它的精髓在于Provider提供商的概念。一个 Provider 代表了一类 API 服务它定义了该服务的认证方式、请求格式、响应解析规则。例如OpenAI Provider 使用 Bearer Token 认证请求体是 JSON响应体也是标准的 OpenAI 格式而 AnthropicClaudeProvider 则使用x-api-key头且请求体结构完全不同它要求messages数组、system字段、max_tokens字段等。NextChat 通过OPENAI_API_BASE_URL的域名来自动识别 Provider。当 URL 包含anthropic.com时它自动切换到 Anthropic Provider当 URL 包含deepseek.com时它切换到 DeepSeek Provider。这就是为什么你不能简单地把 Claude 的 API Key 填进OPENAI_API_KEY然后把 Base URL 改成https://api.anthropic.com/v1就完事——NextChat 会尝试用 OpenAI 的格式去构造请求而 Claude 服务端会直接返回400 Bad Request。正确的做法是确保你的 Base URL 的域名能被 NextChat 正确识别。对于 ClaudeURL 必须是https://api.anthropic.com/v1对于 DeepSeek必须是https://api.deepseek.com/v1。如果你的 API 服务是自建的中转站比如用 Flask 写的你需要在它的域名中加入一个能被识别的关键词例如https://my-proxy.example.com/anthropic/v1然后在 NextChat 的源码中微调 Provider 的识别逻辑或者更简单地直接使用CUSTOMProvider 模式。3.3 安全边界的三道防线密码、CORS、网络隔离部署一个大模型前端安全是生死线。我总结出三道必须建立的防线第一道应用层密码PASSWORD。这是最直接、最有效的第一道屏障。它阻止了所有未授权的直接访问。但请注意它只保护前端页面不保护 API 本身。如果有人绕过前端直接向你的反向代理地址如https://your-domain.com/api/chat发送请求这个密码是无效的。所以它只是起点。第二道反向代理层的 IP 白名单与 Referer 校验。这是最关键的防线。在 Nginx 配置中你应该添加location /api/ { # 只允许来自你自己的域名的请求 if ($http_referer !~ ^https?://(your-domain\.com|www\.your-domain\.com)) { return 403; } # 只允许来自特定 IP 段的请求如果你的服务器有固定出口 IP # allow 192.168.1.0/24; # deny all; proxy_pass https://api.deepseek.com/v1/; proxy_set_header Host api.deepseek.com; proxy_set_header Authorization $http_authorization; proxy_set_header X-Real-IP $remote_addr; }这段配置强制要求所有发往/api/的请求其Referer头必须是你自己的域名。这能有效防止其他网站在 iframe 中嵌入你的 NextChat或通过 CSRF 方式盗用你的 API Key。第三道网络层隔离Docker Network。在docker-compose.yml中为 NextChat 和反向代理定义一个专用的内部网络并禁止该网络对外暴露任何端口。所有与外部 API 的通信都通过这个内部网络完成。这确保了即使你的服务器被攻破攻击者也无法直接从容器内部访问到你的 API Key因为 Key 只存在于环境变量中而环境变量不会被docker exec默认显示。4. 实操过程与核心环节实现从零开始的 Docker 部署全流程4.1 环境准备Ubuntu 22.04 LTS 服务器上的 Docker 安装我们以最主流的 Ubuntu 22.04 LTS 为例。阿里云、腾讯云的轻量应用服务器默认就是这个系统。请确保你已通过 SSH 登录到服务器并拥有sudo权限。第一步卸载旧版本如果存在sudo apt-get remove docker docker-engine docker.io containerd runc第二步安装依赖包sudo apt-get update sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release第三步添加 Docker 的官方 GPG 密钥sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg第四步设置稳定版仓库echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null第五步安装 Docker Enginesudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin第六步验证安装并启动服务sudo systemctl start docker sudo systemctl enable docker sudo docker run hello-world如果最后一条命令输出Hello from Docker!说明 Docker 已成功安装并运行。注意网上很多教程会教你用curl https://get.docker.com | sh一键安装。我强烈不推荐。这种方式绕过了系统的包管理器后续升级和依赖管理会变得混乱。使用apt安装能确保 Docker 与系统内核、cgroup 版本完美兼容这是生产环境稳定性的基石。4.2 创建docker-compose.yml定义服务与网络在服务器上创建一个新目录例如/opt/nextchat然后进入该目录创建docker-compose.yml文件sudo mkdir -p /opt/nextchat cd /opt/nextchat sudo nano docker-compose.yml将以下内容粘贴进去请务必将your_domain.com替换为你自己的域名version: 3.8 services: nextchat: image: louislam/nextchat:latest restart: unless-stopped environment: - OPENAI_API_KEYsk-your-deepseek-api-key-here - OPENAI_API_BASE_URLhttps://api.deepseek.com/v1 - NEXT_PUBLIC_DEFAULT_MODELdeepseek-chat - NEXT_PUBLIC_CODEBLOCKStrue - PASSWORDyour_strong_password_here - NODE_ENVproduction ports: - 3000:3000 networks: - nextchat-net nginx: image: nginx:alpine restart: unless-stopped volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./ssl:/etc/nginx/ssl:ro ports: - 80:80 - 443:443 depends_on: - nextchat networks: - nextchat-net networks: nextchat-net: driver: bridge这个文件定义了两个服务nextchat前端应用和nginx反向代理。它们被放置在同一个名为nextchat-net的 Docker 网络中这意味着nextchat服务可以通过服务名nextchat访问nginx反之亦然。ports部分将宿主机的3000端口映射到nextchat容器的3000端口将80和443端口映射到nginx容器。volumes部分将我们即将创建的nginx.conf配置文件和 SSL 证书目录挂载到容器内。4.3 编写nginx.conf实现安全、高效的反向代理在/opt/nextchat目录下创建nginx.conf文件sudo nano nginx.conf粘贴以下配置events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; sendfile on; keepalive_timeout 65; # 启用 Gzip 压缩减小传输体积 gzip on; gzip_types text/plain application/json application/javascript text/css; # 定义上游服务器即 NextChat 前端 upstream nextchat_backend { server nextchat:3000; } # 主服务器块处理 HTTPS server { listen 443 ssl http2; server_name your_domain.com; # SSL 证书路径请根据你的实际情况修改 ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; # 强制 HTTPS 重定向 if ($scheme ! https) { return 301 https://$server_name$request_uri; } # 根路径代理到 NextChat 前端 location / { proxy_pass http://nextchat_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; } # API 代理路径这是核心 location /api/ { # Referer 校验只允许来自本域的请求 if ($http_referer !~ ^https?://(your_domain\.com|www\.your_domain\.com)) { return 403; } # 将 /api/chat/completions 请求重写为 /v1/chat/completions 并转发 rewrite ^/api/(.*)$ /$1 break; proxy_pass https://api.deepseek.com/v1/; proxy_http_version 1.1; proxy_set_header Host api.deepseek.com; proxy_set_header Authorization $http_authorization; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_buffering off; proxy_cache off; } } # HTTP 重定向到 HTTPS server { listen 80; server_name your_domain.com; return 301 https://$server_name$request_uri; } }这个配置的关键点在于/api/位置块。它首先进行Referer校验然后使用rewrite指令将 NextChat 前端发出的/api/chat/completions请求重写为/v1/chat/completions并转发给https://api.deepseek.com/v1/。proxy_set_header Authorization $http_authorization;这一行至关重要它将前端请求头中的Authorization字段即你的 API Key原封不动地传递给上游 API。proxy_buffering off;和proxy_cache off;则是为了确保流式响应SSE能够实时、不间断地传递给前端避免 Nginx 缓存导致的延迟。4.4 获取 SSL 证书使用 Certbot 自动化HTTPS 不是可选项而是必选项。没有 HTTPS现代浏览器会阻止fetch()发起的跨域请求NextChat 将无法工作。我们使用 Certbot 这个免费、自动化、业界标准的工具来获取 Lets Encrypt 证书。首先安装 Certbotsudo apt-get install -y certbot python3-certbot-nginx然后停止 Nginx 服务因为 Certbot 需要临时占用 80 端口sudo systemctl stop nginx接着运行 Certbot 获取证书sudo certbot certonly --standalone -d your_domain.com -d www.your_domain.comCertbot 会自动为你生成证书并将其存放在/etc/letsencrypt/live/your_domain.com/目录下。我们需要将这些证书软链接到 Nginx 配置中指定的路径sudo mkdir -p /opt/nextchat/ssl sudo ln -sf /etc/letsencrypt/live/your_domain.com/fullchain.pem /opt/nextchat/ssl/fullchain.pem sudo ln -sf /etc/letsencrypt/live/your_domain.com/privkey.pem /opt/nextchat/ssl/privkey.pem最后重启 Nginxsudo systemctl start nginx4.5 启动服务与首次访问一切准备就绪现在只需一条命令即可启动整个服务sudo docker-compose up -d这条命令会在后台-d启动nextchat和nginx两个容器。你可以用以下命令查看服务状态sudo docker-compose ps输出应该显示两个服务的状态都是Up。稍等片刻约 30 秒打开你的浏览器访问https://your_domain.com。你应该会看到一个密码输入框。输入你在docker-compose.yml中设置的PASSWORD然后点击登录。接下来你将看到 NextChat 的主界面。在左下角的设置图标中你可以看到当前的模型是deepseek-chat并且状态显示为“已连接”。现在你可以开始与 DeepSeek 模型进行对话了。实操心得第一次启动时如果页面空白或报错请立即检查sudo docker-compose logs -f。最常见的错误是nginx容器启动失败原因通常是 SSL 证书路径错误或nginx.conf语法错误。使用sudo nginx -t命令可以测试 Nginx 配置文件的语法是否正确。5. 常见问题与排查技巧实录从context window limit到insufficient balance5.1 错误api error: the model has reached its context window limit.这个错误信息直白地告诉你你发送给模型的上下文Context太长了。上下文包括你输入的 Prompt、之前的所有对话历史、以及模型之前的回复。每个模型都有一个固定的“上下文窗口”Context Window例如 GPT-4 Turbo 是 128K tokensDeepSeek Chat 是 128K tokens而 Claude 3 Haiku 是 200K tokens。当总长度超过这个限制API 就会拒绝请求。排查与解决检查对话历史NextChat 默认会将整个对话历史包括你和模型的所有消息作为上下文发送。如果你的对话已经持续了很长时间历史记录会非常庞大。解决方案是在设置中开启Auto Clear Context自动清除上下文或者手动点击左上角的 New Chat创建一个全新的会话。检查上传的文件如果你上传了 PDF、Word 文档NextChat 会先将文件内容提取为文本再将其作为上下文的一部分。一个 10MB 的 PDF 可能会被提取为 50000 tokens 的文本瞬间撑爆窗口。建议只上传关键的、小篇幅的文本文件或者在提问时明确告诉模型“请只关注第3页的内容”。调整模型参数在 NextChat 的设置中找到Max Tokens选项。将其设置为一个较小的值例如2048这会限制模型单次回复的最大长度从而为你的输入和历史留出更多空间。5.2 错误api error: claudes response exceeded the 32000 output token maximum.这是 AnthropicClaude特有的限制。它规定单次 API 调用的output_tokens即模型生成的回复不能超过 32000。这与上下文窗口是两个独立的概念。你可能有充足的上下文空间但模型就是想生成一篇长文结果被卡住了。排查与解决强制截断在 NextChat 的设置中将Max Tokens设置为32000或略小如31000。这相当于给模型下达了“最多只能写这么多字”的指令。分步提问不要一次性要求模型“写一篇完整的报告”而是分步骤“第一步请列出报告的提纲”、“第二步请详细展开第一部分”。这样每次请求的输出量都在安全范围内。检查 Provider 配置确保你的OPENAI_API_BASE_URL确实指向https://api.anthropic.com/v1并且NEXT_PUBLIC_DEFAULT_MODEL设置为claude-3-haiku-20240307或claude-3-sonnet-20240229。如果填错了模型名Anthropic 服务端可能会返回一个模糊的错误而不是这个明确的32000限制。5.3 错误api error: 402 insufficient balance这是一个财务错误意味着你的 API 账户余额不足。DeepSeek、OpenAI、Anthropic 等服务商都会为新注册用户提供一定的免费额度例如 DeepSeek 是 100 万 tokens但一旦用完就需要充值。排查与解决登录服务商控制台访问https://platform.deepseek.com登录你的账户查看Billing账单或Usage用量页面。这里会清晰地显示你的剩余免费额度、已用额度以及充值入口。检查 API Key 权限有些服务商如 OpenAI允许为不同的 API Key 设置不同的权限和额度。确保你使用的这个 Key 没有被单独设置为“零额度”。更换 Key如果你有多个 API Key例如一个用于测试一个用于生产请确认docker-compose.yml中填写的是那个有余额的 Key。一个简单的验证方法是用curl命令在服务器上直接测试curl -X POST https://api.deepseek.com/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-your-key-here \ -d { model: deepseek-chat, messages: [{role: user, content: Hello}] }如果返回402那问题就出在 Key 本身。5.4 错误api error: the socket connection was closed unexpectedly.这个错误通常与网络不稳定有关尤其是在使用代理或中转服务时。它表示客户端NextChat与服务器API之间的 TCP 连接在数据传输过程中被意外中断。排查与解决检查网络连通性在服务器上使用ping api.deepseek.com和telnet api.deepseek.com 443测试基础网络。如果ping不通说明是 DNS 或防火墙问题如果telnet连接不上说明是网络策略或服务器本身的问题。增加超时时间在docker-compose.yml的nextchat服务中添加环境变量environment: - TIMEOUT_MS120000这将 NextChat 的请求超时时间从默认的 60 秒提高到 120 秒给慢速网络或高负载 API 更多的响应时间。检查代理配置如果你使用了自建的 API 中转站如 Dify请检查该中转站的日志。这个错误很可能是中转站自身与上游 API 的连接断开了而不是 NextChat 的问题。确保中转站的keep-alive连接池配置合理。5.5 错误api error: 400 thinking options type cannot be disabled when reasoning_effort这个错误是 Anthropic Claude 3.5 Sonnet 的专属错误。它出现在你尝试禁用thinking思考过程功能但同时又设置了reasoning_effort推理努力程度参数时。这两个参数是互斥的。排查与解决检查 NextChat 设置在 NextChat 的高级设置中找到Thinking选项。如果你关闭了它请同时确保Reasoning Effort选项也被设置为Disabled或None。不要在一个关闭一个开启。检查自定义请求头如果你在nginx.conf或其他地方手动添加了X-Anthropic-Reasoning-Effort这样的请求头也请一并移除。NextChat 的前端逻辑会根据你的设置自动添加这些头手动干预反而会造成冲突。6. 进阶扩展与个性化从单一模型到多模型智能路由6.1 实现多模型共存利用 NextChat 的Custom Models功能NextChat 的强大之处在于它支持“自定义模型列表”。你不必只为一个 API 部署一个 NextChat 实例。你可以在一个实例中同时配置多个不同服务商的 API并让它们在同一个界面上自由切换。在docker-compose.yml中将environment部分替换为environment: - OPENAI_API_KEYsk-your-deepseek-key - OPENAI_API_BASE_URLhttps://api.deepseek.com/v1 - NEXT_PUBLIC_DEFAULT_MODELdeepseek-chat - NEXT_PUBLIC_CUSTOM_MODELS[{name:DeepSeek Chat,available:true,provider:deepseek},{name:Claude 3 Haiku,available:true,provider:anthropic},{name:Qwen 2.5 72B,available:true,provider:openai,baseUrl:https://api.together.xyz/v1}] - PASSWORDyour_passwordNEXT_PUBLIC_CUSTOM_MODELS是一个 JSON 数组字符串。每个对象代表一个模型name: 在下拉菜单中显示的名称。available: 是否在模型选择器中显示true或false。provider: 指定该模型所属的 Providerdeepseek,anthropic,openai。baseUrl: 可选该模型的专属 Base URL。对于 Together.ai 这样的聚合平台你可以为 Qwen 模型指定https://api.together.xyz/v1而 DeepSeek 仍使用默认的https://api.deepseek.com/v1。这样配置后用户在聊天界面左上角的模型选择器中就能看到DeepSeek Chat、Claude 3 Haiku和Qwen 2.5 72B三个选项。选择不同的模型NextChat 会自动切换其provider和base_url无需重启服务。6.2 构建 API 中转站为敏感 API 提供统一网关如果你的业务需要对接多个内部系统如 CRM、ERP或者你想对 API 调用进行审计、限流、日志记录那么直接将 API Key 暴露给 NextChat 是不安全的。此时你需要一个中间层——API 中转站。我推荐使用 Python 的 FastAPI 框架因为它简洁、高性能、且自带 Swagger UI 文档。创建一个main.pyfrom fastapi import FastAPI, Request, Depends, HTTPException, status from fastapi.responses import StreamingResponse import httpx import os from typing import Dict, Any app FastAPI() # 从环境变量读取上游 API Key UPSTREAM_API_KEY os.getenv(UPSTREAM_API_KEY) UPSTREAM_BASE_URL os.getenv(UPSTREAM_BASE_URL, https://api.deepseek.com/v1) # 创建一个共享的 HTTP 客户端 client httpx.AsyncClient(timeout60.0) app.api_route(/v1/{path:path}, methods[GET, POST, PUT, DELETE]) async def proxy_endpoint( path: str, request: