AI中转流式输出兼容全客户端配置教程
为什么你的AI中转需要流式输出 + 全客户端兼容
很多人在自建AI中转(把OpenAI API通过国内服务器转发)后,发现网页聊天卡顿、手机App等不到回复,或者客户端直接报错。
根本原因往往是中转层没开启流式输出,或者响应头兼容性不到位。
流式输出让AI回复一个字就传一个字,体验更实时;
全客户端兼容则保证不同终端(网页、iOS/Android App、API调用)都能正常接收。
本文从零搭建一套可直接用的Nginx反代中转,同时解决流式传输、跨域和客户端适配问题。
前置准备:域名、服务器与反向代理基础
- 一台Linux服务器(CentOS 7+或Ubuntu 20+),已安装Nginx(可用宝塔面板一键安装,也可手动编译)。
- 一个已解析到服务器IP的域名(示例用
api.yourdomain.com),之后客户端会用这个地址请求AI。 - 拿到上游API地址(比如
https://api.openai.com)和你的API Key。 - 确保服务器能访问外网(否则无法转发OpenAI)。
如果你用的是宝塔面板,进入「网站」→「添加站点」输入域名并创建。
下面所有Nginx配置都可以在宝塔的配置文件中直接修改。
核心配置:让Nginx支持Streaming并适配全客户端
1. 关闭代理缓冲,打开流式输出
编辑站点的Nginx配置文件,在 location / 块内添加:
proxy_buffering off;
proxy_cache off;
chunked_transfer_encoding on;
proxy_set_header Connection '';
解释:proxy_buffering off 让Nginx不缓存上游响应,数据一来就发给客户端;chunked_transfer_encoding on 支持分块传输,流式数据必须靠它;
清空 Connection 头防止复用连接导致流式中断。
2. 添加必要的跨域与内容类型头
proxy_set_header Host api.openai.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 允许所有来源跨域
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'Content-Type, Authorization';
# 流式输出必须的内容类型(仅对chat/completions生效,可按需调整)
if ($request_uri ~* "/v1/chat/completions") {
add_header Content-Type 'text/event-stream; charset=utf-8' always;
}
注意:Content-Type只在流式端点下强制设为text/event-stream,非流式请求(如图像生成)不受影响。
3. 完整的location配置示例
location / {
proxy_pass https://api.openai.com;
proxy_buffering off;
proxy_cache off;
chunked_transfer_encoding on;
proxy_set_header Connection '';
proxy_set_header Host api.openai.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'Content-Type, Authorization';
if ($request_uri ~* "/v1/chat/completions") {
add_header Content-Type 'text/event-stream; charset=utf-8' always;
}
}
保存配置后,重载Nginx:nginx -s reload(宝塔面板里点「重载配置」按钮也可)。
踩坑现场:最常遇到的3个问题
问题1:客户端一直转圈,没有流式效果
- 原因:
proxy_buffering没有关,或者chunked_transfer_encoding未开启。检查Nginx配置文件,用curl -N --header "Content-Type: application/json" --data '{"stream": true, "messages": [{"role":"user","content":"hi"}]} ' https://你的域名/v1/chat/completions -H "Authorization: Bearer 你的key"测试,如果响应一次性返回而非逐个data块,说明缓冲未关。
问题2:手机App或第三方客户端(如LobeChat)报CORS错误
- 原因:缺少跨域头。确保
add_header Access-Control-Allow-Origin *;出现在location块内,并且位于proxy_pass之前或之后(只要同一作用域)。另外对OPTIONS预检请求也要放行,可以单独处理:
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'Content-Type, Authorization';
add_header Content-Length 0;
add_header Content-Type text/plain;
return 204;
}
问题3:非AI的普通API请求(如图像生成)被强制改为text/event-stream
- 解决方法:用
if ($request_uri ~* "/v1/chat/completions")精准限定,只对聊天补全接口添加该头。其它请求保持默认的application/json。
验证效果:一场真实的“流式”对话
打开任意支持自定义API地址的AI客户端(推荐使用NextChat或LobeChat),将接口地址改为 https://你的域名/v1,API Key填上你的Key,发送一条消息。
观察回复:文字应该逐字或逐块显示,没有卡顿几秒后才弹出全部内容。
也可以用命令行测试流式输出:
curl -N --request POST \
--url https://你的域名/v1/chat/completions \
--header "Authorization: Bearer 你的key" \
--header "Content-Type: application/json" \
--data '{"model": "gpt-3.5-turbo", "stream": true, "messages": [{"role": "user", "content": "你好"}]}'
你会看到类似这样的逐行输出:
data: {"id":"...","object":"chat.completion.chunk","choices":[{"delta":{"content":"你"}}]}
data: {"id":"...","object":"chat.completion.chunk","choices":[{"delta":{"content":"好"}}]}
最后一行是 data: [DONE]。
如果整个输出一次性刷完,请回头检查 proxy_buffering。
写在最后
AI中转流式输出兼容全客户端的本质就三步:关闭缓冲、启用分块、加对响应头。
按照本文的Nginx配置,绝大多数主流客户端(OpenAI官方、NextChat、LobeChat、ChatBox、Pandora等)都能流畅使用。
少数特殊客户端(如某些微信机器人)可能需要额外调整 Connection 或 Cache-Control,但基本原理一致。
如果你在配置中遇到其他报错,先回看避坑部分,排查缓存和跨域问题基本都能解决。