NextChat(GitHub 上的 ChatGPT-Next-Web)接小鱼API,就三个动作:接口地址填 https://xyuapi.top/v1,API Key 填后台生成的 sk- 令牌,模型下拉里选一个模型名。自部署的走环境变量,直接开网页版的走左下角设置面板,两条路填的是同一批值,能踩的坑也差不多。
NextChat 是一个开源聊天客户端,有网页版、桌面端和 Docker 镜像,上游镜像名是 yidadaa/chatgpt-next-web。它能对接好几种接口格式,接小鱼API 时选 OpenAI 兼容 这一套。小鱼API 是 AI API 接入平台(聚合平台),品牌站是 xyuai.cc。接口主地址 https://xyuapi.top/v1,备用地址 https://xyuai.cc/v1,备用这条同时带 /v1beta/ 路径,支持 Gemini 原生格式。
不管走哪条路,要填的就三个值:接口地址 https://xyuapi.top/v1、API Key(sk- 开头)、模型名(手填,一字不差)。这三个值对上就能聊天,剩下的都是细节。
地址写完整:https://xyuapi.top/v1。带 https://,带 /v1,末尾不要斜杠。少任何一段都连不上:只写 xyuapi.top 客户端会把请求拼到当前站点上,写成 https://xyuai.cc 拼出来的是品牌站网页地址,不是接口地址。
Key 是平台后台生成的令牌,sk- 开头,一长串。粘贴之前把前后的空格和换行删掉,相当一部分 401 就是这么来的。令牌一般在后台只完整显示一次,丢了就在后台重新生成一个,别指望从客户端里翻出来。
NextChat 的模型下拉滚到底有一项叫「自定义模型名」,点它,把 claude-sonnet-4-5-thinking 这样的字符串原样填进去。大小写、连字符、数字都要对,写成 claude-sonnet-4.5-thinking 或者 claude-sonnet-45-thinking 都会报 model not found。模型清单在下面的价格表里,直接复制。
配置完别急着聊长内容,先发一条短消息试。「你好」两三个字就行,几秒内正常回复说明地址、Key、模型名三项都对上了。名字里带 thinking 的模型会先思考再答,首字可能等十几秒,这是正常的,不代表没连上。
curl https://xyuapi.top/v1/chat/completions \
-H "Authorization: Bearer sk-你的令牌" \
-H "Content-Type: application/json" \
-d '{"model":"gemini-2.5-pro","messages":[{"role":"user","content":"你好"}],"stream":false}'
命令行能返回一段 JSON,就说明 Key 和地址本身没问题,剩下的排查都往客户端配置上找。
docker run -d --name nextchat -p 3000:3000 \
-e BASE_URL=https://xyuapi.top/v1 \
-e OPENAI_API_KEY=sk-你的令牌 \
-e CUSTOM_MODELS=+claude-sonnet-4-5-thinking,+gemini-2.5-pro \
-e DEFAULT_MODEL=claude-sonnet-4-5-thinking \
-e CODE=你的访问密码 \
-e HIDE_USER_API_KEY=1 \
yidadaa/chatgpt-next-web
跑完浏览器打开 http://localhost:3000 就是聊天界面。-p 3000:3000 是端口映射,前面那个数字是宿主机端口,想换端口改前面那个,冒号后面的 3000 别动,那是容器里服务监听的端口。
| 环境变量 | 填什么 | 作用 |
|---|---|---|
BASE_URL | https://xyuapi.top/v1 | 接口地址,必须带 https:// 和 /v1 |
OPENAI_API_KEY | sk-你的令牌 | 平台后台生成的令牌 |
CUSTOM_MODELS | +模型名 逗号分隔 | 控制下拉里显示哪些模型 |
DEFAULT_MODEL | claude-sonnet-4-5-thinking | 新会话默认用哪个模型 |
CODE | 自定义密码 | 访问密码,不设就是空 |
HIDE_USER_API_KEY | 1 | 设成 1 后用户看不到 Key 输入框 |
Vercel 导入这个仓库之后,在项目设置的 Environment Variables 页面按同样的变量名一条条加:BASE_URL、OPENAI_API_KEY、CUSTOM_MODELS、CODE。Zeabur 同理,在环境变量面板里加。变量名一字不能差,写成 BASE_URLS 或者 OPENAI_KEY 都不认,加完要重新部署一次才生效。
docker run 后面的 -e 只在容器创建那一刻生效。改完必须删掉旧容器重新跑:docker rm -f nextchat,再执行上面那条 run 命令。用 docker compose 的就改 compose 文件里的 environment 段,然后 docker compose up -d --force-recreate。改完不重建,等于没改。
打开站点,左下角一排小图标,靠右那个齿轮就是设置。点开之后侧栏顶部是模型选择,往下是「自定义接口」区域,再下面是提示词、超时、导出导入这些高级项。手机浏览器上这块面板会变成全屏。
勾上「自定义接口」的开关,会展开两个输入框:
https://xyuapi.top/v1sk- 开头的令牌填完关掉面板,发一条消息试。这里填的值只存在当前浏览器的 localStorage 里,换设备、换浏览器、清浏览器数据都要重填一遍。
这是卡人最多的地方。站点如果用环境变量配好了,而你又在这个设置面板里手填过一遍,浏览器里那份值优先生效。表现就是:你改了服务器上的环境变量、重建了容器,打开浏览器还是连不上——因为浏览器里存着旧地址和旧 Key。排查办法是把面板里的自定义接口开关关掉,或者把面板里的值改成和新环境变量一致。
模型下拉滚到底有一项「自定义模型名」,点它手动输入。站点如果配了 CUSTOM_MODELS,下拉里会直接列出这些模型名,点一下就能切;没配就只有一个自定义项,每次新建会话都得重新手填一遍模型名,比较烦。
语法就三个符号,多个之间用英文逗号分隔:
+模型名 追加:在默认列表后面加一个模型-模型名 隐藏:把默认列表里的某个模型去掉模型名=显示名 改名:下拉里显示的文案换成新的,实际发出去的模型名不变写成 -all,+gemini-2.5-pro 就是清空默认列表、只留一个。符号写错(比如用了中文逗号)整行可能被直接忽略,表现是下拉里一个模型都不出。
CUSTOM_MODELS=+gemini-2.5-pro,+deepseek-v3.2-thinking,+grok-4.1,+claude-sonnet-4-5-thinking,+claude-opus-4-5-thinking,-gpt-4o
这一行的效果是:下拉里多出五个模型,同时把默认列表里的 gpt-4o 藏掉,避免有人点错模型名报错。想改成中文显示,就把其中几项写成 claude-sonnet-4-5-thinking=写代码,下拉里出现的是「写代码」,发出去的还是真名。
| 模型名(手填,一字不差) | 按次计费 | 适合的活 |
|---|---|---|
gemini-2.5-pro | 0.031 元/次 | 长文档阅读、日常问答,量大管饱 |
deepseek-v3.2-thinking | 0.049 元/次 | 带思考链的推理,数学和逻辑题 |
grok-4.1 | 0.05 元/次 | 时效性话题、中文写作 |
claude-sonnet-4-5-thinking | 0.09 元/次 | 写代码、长文改写,综合表现均衡 |
claude-opus-4-5-thinking | 0.12 元/次 | 复杂重构、难缠的 bug,慢但稳 |
价格按请求次数算,不按 token 算,所以同一次会话里上下文翻倍也不会翻倍扣费。这也是用 NextChat 聊长对话比按量计费省心的原因。
CODE 是访问密码。不设这个变量时它是空的,谁打开站点都能直接聊,公网部署等于让别人用你的额度。设了之后打开站点要先输密码,验证过才进聊天界面。HIDE_USER_API_KEY=1 是另一个方向的控制:开了之后用户看不到 Key 输入框,只能用你配好的那一份,适合内部统一发放的实例。反过来想让每个人填自己的 Key,就别设这个变量。
xyuapi.top:缺协议头,请求发不到接口上,表现是转圈然后失败https://xyuai.cc:那是品牌站网页地址,不是接口地址,缺 /v1,通常返回 404 或者直接报地址格式错误https://xyuapi.top/v1/:拼接后会变成 //v1/chat/completions,部分反代直接给 404下拉里手填的模型名对不上,常见三种:大小写写错、自己加了不存在的后缀(-latest、-pro-max 这种)、把两个模型名拼到一起。400 一般是请求体格式问题,在 NextChat 里偶尔出现在模型名那栏填了中文显示名的情况——下拉里显示的文案和实际发出去的模型名是两件事,改名之后要确认发出去的是真名。
401 基本都是 Key 的问题:没填、sk- 前缀丢了、粘贴时带了空格、或者把别家平台的 Key 填了进去。403 更常见于访问密码没输对,或者实例设了 HIDE_USER_API_KEY 而你还在手动传 Key,两边冲突。
客户端如果走了系统代理,请求会先送到代理服务器,再回头访问接口地址,很多代理并不放行这个域名,表现就是一直转圈然后超时。建议把客户端的网络设置改成「不使用代理」,走直连。浏览器同理,顺手看一下系统的代理开关和浏览器插件有没有接管流量。
思考模型(名字里带 thinking 的那几个)会先想再答,首字出来之前可能静默几十秒。NextChat 默认请求超时偏短,长思考会被判成超时然后断流,界面显示「请求失败」,其实请求还在跑。到设置里把「超时时间」改成 300 秒以上,同时确认流式输出是开着的。
| 现象 | 大概率原因 | 怎么改 |
|---|---|---|
| 一直转圈不出字 | 走了系统代理 | 改成不使用代理,走直连 |
model not found | 模型名拼错 | 从上面的价格表复制模型名 |
| 401 未授权 | Key 错或带空格 | 重新从平台后台复制度令牌 |
| 403 | 访问密码没输对 | 用 CODE 里的密码重开页面 |
| 404 | 地址缺 /v1 | 补成 https://xyuapi.top/v1 |
| 改了环境变量没反应 | 面板里的值覆盖了 | 关掉自定义接口并清掉旧值 |
| 几十秒后报失败 | 请求超时太短 | 超时改到 300 秒以上 |
NextChat 的聊天记录默认存在浏览器本地存储里,不在服务器上。换电脑、换浏览器、清理浏览数据,记录就没了。同一台机器换个浏览器也会看不到之前的会话,这不是丢了,是那份数据本来就不在那个浏览器里。给团队部署的时候要提前说清楚这一点,不然总有人来问会话去哪了。
设置面板底部有导出和导入。导出的文件里包含全部会话、配置和设置项。换设备之前先导出一次,新设备上导入同一个文件,会话和配置一起过来。养成一个习惯:每次改完接口配置就导出一次,文件丢自己网盘里,比事后重配省事得多。
升级镜像:docker pull yidadaa/chatgpt-next-web,然后删掉旧容器重新 run,聊天记录存在浏览器里,重建容器不影响。多用户场景建议给每个人单独开一个实例,而不是所有人共用一个——共用一个实例时 Key 是共用的,额度也算在一起,谁用得多看不出来。给团队用的话,每个实例配各自的 CODE 和 CUSTOM_MODELS。
按一天聊三十次算:全用 gemini-2.5-pro 是 0.93 元,全用 claude-sonnet-4-5-thinking 是 2.7 元,全用 claude-opus-4-5-thinking 是 3.6 元。实际用起来通常是混着来的:日常问答挂 gemini-2.5-pro,写代码和长文挂 claude-sonnet-4-5-thinking,真卡住了再切到 claude-opus-4-5-thinking。这么混着用,一个人一天两三块钱,比订阅制的盲盒感心里有数得多。
https:// 和 /v1,末尾没有斜杠sk- 开头,前后没有空格CUSTOM_MODELS 里的模型名和价格表逐字对上DEFAULT_MODEL 用的是 CUSTOM_MODELS 里确实存在的模型CODE,不是空密码按这份清单走一遍,NextChat 接小鱼API 基本一次就能通,剩下遇到的报错都能在上面的对照表里找到原因。