
日志
前言
在24年初博主第一次尝试部署了ChatGPTNextWeb这个项目,当时DeepSeek的网页端以及app还未发布,而博主对AI的需求又很大。恰好当时还可以白嫖的gpt免费的5刀api额度,这个项目可以使用vercel的方案部署,无需梯子使用~
DeepSeek问世后,其性能堪比ChatGPT。其实这个项目现在确实有点过时了,日常的AI使用需求完全可使用DeepSeek足矣(但是为什么问几句就卡了)。很快啊,恰好又赶上前段时间GPT5发布,其性能很能打,所以现在又跑回来重新部署这个项目,这样两个AI直接来回切换,DeepSeek卡了就换GPT使用。
关于AI模型的评测对比,点击传送
准备
- 注册好的vercel账号
- 注册好的github账号
- 准备好openai api key
- 部署好openlist或其他支持webdav功能的平台,用于云端存储(可选)
- 域名(可选,使用vercel部署理论上甚至不需要服务器和域名)
部署
fork项目
根据官方文档,第一步需要fork该项目到本地仓库,项目地址:ChatGPTNextWeb
vercel部署
第二步使用vercel部署你刚刚fork到本地的项目,这一步参考官方教程:NextChat/docs/vercel-cn.md
开启自动更新
完成vercel部署后,需要在github开启自动更新,这样会自动拉取最新的代码,让你fork的项目与上游代码同步。具体自动更新操作步骤见官方连接:NextChat/README_CN.md
步骤大致如下:
由于 Github 的限制,需要手动去你 fork 后的项目的 Actions 页面启用 Workflows,并启用 Upstream Sync Action,启用之后即可开启每小时定时自动更新。
开启云端同步(可选)
配置到这里,已经可以基本使用大部分功能了,如果需要配置云端同步的话,需要部署好openlist或其他支持webdav功能的平台。
这里我以openlist为例,关于openlist的部署很简单,这里直接给出compose文件:
services:
openlist:
image: 'openlistteam/openlist:latest'
container_name: openlist
user: '0:0'
volumes:
- '/root/opt/openlist:/opt/openlist/data' #自定义挂在路径,建议修改
ports:
- '127.0.0.1:50001:5244' #自定义端口映射,自行修改
environment:
- UMASK=022
restart: unless-stopped
继续配置云端同步功能,进入openlist后台用户页面,确保用户最少开启webdav读取,webdav管理,创建目录或上传这三个选项,如图:

然后,挂载一个网盘或者本地存储,具体过程见openlist文档:快速开始 - OpenList 文档
openlist的根目录不能用作webdav来使用,这一级目录没有改写的权限,只能用来挂载存储。
所以这里必须要提前挂载一个网盘或者本地存储,并将这个存储的目录,也就是一级目录作为ChatGPT-nextweb的webdav云端存储。
另外提一嘴,ChatGPT-nextweb的云端存方法是,在你的webdav路径下,创建一个名为chatgpt-next-web的文件夹来存储聊天记录。但是难绷的一点是,他的存储逻辑仅是简单拉取云端存储内容做同步。这样就会出现,你删除聊天记录后,点击同步,聊天记录又回来了的情况...
填写你的webdav信息到ChatGPT-nextweb的设置页面:

这里webdav的地址格式为https://your openlist domain/dav/你的网盘路径,用户名密码与openlist相同。
还需要到vercel部署页面,添加环境变量WHITE_WEBDAV_ENDPOINTS,赋值为上述webdav地址,这样nextweb才能识别到你的webdav地址。
完成后,可以点击检测可用性,出现√,说明可用,这样就完成了云端存储的配置。
补充
到目前,已经可以基本正常使用了。但是,测试发现,不能使用GPT-5,GPT-5-mini等模型,因为这两个模型需要认证组织才能使用流式传输。而目前这个项目对这两个模型默认是走流式传输,所以导致这两个模型不可用。
下面给出解决方案
思路大致是,将这两个模型修改为走非流式传输,其余模型走流式传输,我使用ai实现了,具体方法入下:
打开fork到本地仓库的文件openai.ts,路径为app/client/platforms,打开后,修改其中几个部分。直接下载替换即可,点击下载,提取码dq9m
其中主要修改了这几个部分:
...const isGpt5 = options.config.model.startsWith("gpt-5");之后
//仅对 gpt-5 / gpt-5-mini 禁用流式;不波及 gpt-5-nano
const needNoStream = /^gpt-5($|-mini\b)/.test(options.config.model);
...
... else if (isO1OrO3)之后
//强制 gpt-5 / gpt-5-mini 走非流式:删除 stream 字段
if (needNoStream) {
delete (requestPayload as any).stream;
}
...
...
//const shouldStream = !isDalle3 && !!options.config.stream;修改为
const shouldStream = !isDalle3 && !!options.config.stream && !needNoStream;
...
在使用过程中最好不要切换模型,否则会出bug,请一开始设定好模型使用。