秽土转生 free-gpt3.5-2api -> chat2api.
把 ChatGPT Web 侧能力转换为兼容 OpenAI 风格的 HTTP API。
POST /v1/chat/completions:兼容 Chat Completions,请求支持普通 JSON 与 stream。POST /v1/responses:兼容 Responses API 文本链路,请求支持普通 JSON 与 stream。GET /v1/accTokens:查看配置账号池可用数量。- 本地
sk-auth key:使用配置文件中的chatgpts账号池请求上游。 - 直传
at-access token:使用Authorization: Bearer at-<real_access_token>,跳过账号池,直接用at-后面的真实 access token 请求上游。
说明:当前版本不再做模型映射,model 会直接传给上游;请求中未传 model 时默认使用 auto。
服务读取 conf/app.<ENV>.yaml,ENV 默认为 dev,因此本地默认读取 conf/app.dev.yaml。
仓库提供了配置模板 conf/app.demo.yaml。本地运行时可以复制为 conf/app.dev.yaml;Docker Compose 运行时可以复制为 .chat2api/conf/app.dev.yaml,因为 compose 会把 .chat2api/conf 映射到容器内的 /app/conf。
当前版本的业务配置以 YAML 文件为准,环境变量只用于选择配置文件:
| 环境变量 | 默认值 | 作用 |
|---|---|---|
ENV |
dev |
决定读取哪个配置文件,例如 ENV=prod 会读取 conf/app.prod.yaml。 |
常见配置文件对应关系:
| 启动方式 | 读取文件 |
|---|---|
go run ./cmd |
conf/app.dev.yaml |
ENV=test go run ./cmd |
conf/app.test.yaml |
ENV=prod go run ./cmd |
conf/app.prod.yaml |
log_level: debug
log_path: logs
log_file: app.dev.log
bind: 127.0.0.1
port: 3040
auth:
access_tokens:
- sk-your-local-key
proxy: http://127.0.0.1:7890
chatgpt_base_url: https://chatgpt.com
chatgpts:
- id_token: optional_id_token
access_token: real_access_token
refresh_token: optional_refresh_token
account_id: optional_account_id
last_refresh: ""
email: optional_email
type: codex
expired: ""
proxy: ""关键规则:
auth.access_tokens保存裸 token,不要写Bearer;请求时仍使用标准的Authorization: Bearer <token>。- 如果
auth.access_tokens为空,服务启动时会随机生成一个sk-token,写回配置文件,并在日志中打印current auth: ...。 chatgpts是账号池配置,每个账号只有access_token是必要配置;proxy、id_token、refresh_token、email等字段都是可选字段。chatgpts[].access_token是账号池的真实上游 access token。通过本地sk-key 请求时会从这里选择账号。- 代理优先级为账号代理优先:
chatgpts[].proxy不为空时使用账号代理;为空时回退到全局proxy。 chatgpt_base_url为空时默认使用https://chatgpt.com。
本地运行:
go run ./cmd指定环境运行,例如读取 conf/app.prod.yaml:
ENV=prod go run ./cmdDocker Compose:
docker compose up -dVercel 运行时不会写入配置文件,也不会默认读取仓库里的 conf/app.dev.yaml,避免把本地代理或本地账号配置带到云端。请在 Vercel 环境变量中配置:
| 环境变量 | 作用 |
|---|---|
AUTH_TOKENS |
本地 API key,多个值用逗号、分号或换行分隔 |
CHATGPT_ACCESS_TOKENS |
上游 ChatGPT access token,多个值用逗号、分号或换行分隔 |
PROXY |
可选,全局代理 |
CHATGPT_BASE_URL |
可选,默认 https://chatgpt.com |
LOG_LEVEL |
可选,默认 debug |
VERCEL_CONFIG_FILE |
可选,显式指定要读取的 YAML 配置文件路径,例如 conf/app.prod.yaml |
默认 compose.yaml 将容器 3040 端口映射到宿主机 7846,并映射本地配置与日志目录:
volumes:
- .chat2api/conf:/app/conf
- .chat2api/logs:/app/logs容器内工作目录是 /app,因此默认会读取 /app/conf/app.dev.yaml,也就是宿主机的 .chat2api/conf/app.dev.yaml。如需让容器读取其他环境配置,可以在 compose.yaml 中增加 ENV:
environment:
- ENV=prod此时容器会读取宿主机映射进去的 .chat2api/conf/app.prod.yaml。
下面示例以本地开发配置 127.0.0.1:3040 为例。
curl http://127.0.0.1:3040/v1/accTokens \
-H 'Authorization: Bearer sk-your-local-key'返回中的 count 是账号池账号数量,canUseCount 是当前可用账号数量。
使用配置账号池:
curl http://127.0.0.1:3040/v1/chat/completions \
-H 'Authorization: Bearer sk-your-local-key' \
-H 'Content-Type: application/json' \
-d '{"model":"auto","messages":[{"role":"user","content":"ping"}]}'直传真实 access token,跳过账号池:
curl http://127.0.0.1:3040/v1/chat/completions \
-H 'Authorization: Bearer at-<real_access_token>' \
-H 'Content-Type: application/json' \
-d '{"model":"auto","messages":[{"role":"user","content":"ping"}]}'流式返回:
curl http://127.0.0.1:3040/v1/chat/completions \
-H 'Authorization: Bearer sk-your-local-key' \
-H 'Content-Type: application/json' \
-d '{"model":"auto","stream":true,"messages":[{"role":"user","content":"ping"}]}'普通文本请求:
curl http://127.0.0.1:3040/v1/responses \
-H 'Authorization: Bearer sk-your-local-key' \
-H 'Content-Type: application/json' \
-d '{"model":"auto","input":"ping"}'带 instructions:
curl http://127.0.0.1:3040/v1/responses \
-H 'Authorization: Bearer sk-your-local-key' \
-H 'Content-Type: application/json' \
-d '{"model":"auto","instructions":"用中文回答","input":"ping"}'流式返回:
curl http://127.0.0.1:3040/v1/responses \
-H 'Authorization: Bearer sk-your-local-key' \
-H 'Content-Type: application/json' \
-d '{"model":"auto","stream":true,"input":"ping"}'当前 Go 版本的 /v1/responses 仅实现文本链路;image_generation 工具会返回未实现错误。
401 Incorrect API key:检查请求头是否为Authorization: Bearer sk-your-local-key,以及配置里的auth.access_tokens是否保存裸 token。turnstile token is required或turnstile token failed:上游要求 Turnstile 校验,需确认账号 token、代理和上游访问环境是否可用。- 账号池不可用:检查
chatgpts[].access_token是否为空、是否过期,以及账号是否处于冷却时间。 - 代理不生效:先检查账号自己的
chatgpts[].proxy,它会优先于全局proxy。
- https://github.com/aurora-develop/aurora
- https://github.com/xqdoo00o/ChatGPT-to-API
- https://github.com/basketikun/chatgpt2api
- codex
- aurorax-neo
CDN acceleration and security protection for this project are sponsored by Tencent EdgeOne.
