ChatGPT2API 是一个面向自托管场景的 ChatGPT 官网能力封装服务,提供 OpenAI 兼容图片 API、在线创作台、账号池调度、图片库、日志治理、RBAC 权限管理和 Docker 部署能力。
WARNING
本项目涉及对 ChatGPT 官网文本生成、图片生成、图片编辑等接口的逆向研究,仅供个人学习、技术研究与非商业性技术交流使用。
CAUTION
公网部署时请务必添加外部访问控制,不要暴露敏感配置、账号 Token、数据库连接串或管理端入口。旧版本可能存在已知漏洞,请尽快升级到最新版本。
| 目标 | 入口 |
|---|---|
| 立即部署服务 | 快速部署 |
| 配置管理员、代理、并发、存储 | 配置说明 |
| 创建 API Token 并调用接口 | API 接入 |
| 查看生图参数、异步任务和错误码 | 生图接口文档 |
| 本地改代码和验证构建 | 本地开发 |
| 升级 Docker 镜像或 Release 二进制 | 升级与在线更新 |
| ChatGPT 官网生图协议研究 | 技术研究文档 / jshook 索引 |
/app/chatgpt2api。POST /v1/images/generations。POST /v1/images/edits。POST /v1/chat/completions。POST /v1/responses。POST /v1/messages。/api/creation-tasks。gpt-image-2、codex-gpt-image-2、auto 和多个 gpt-5* 文本/图片场景模型选项。git clone https://github.com/ZyphrZero/chatgpt2api.git
cd chatgpt2api
cp .env.example .env
编辑 .env。建议至少设置管理员密码:
CHATGPT2API_ADMIN_USERNAME=admin
CHATGPT2API_ADMIN_PASSWORD=change_me_please
如果不设置 CHATGPT2API_ADMIN_PASSWORD,服务首次启动会生成一次性管理员密码并输出到容器日志。
docker compose -f deploy/docker-compose.yml up -d
默认 Compose 配置:
zyphrzero/chatgpt2api:latest3000 -> 容器 80./data:/app/data./.env:/app/.envrestart: unless-stopped访问:
http://localhost:3000
查看日志(需要在仓库根目录执行):
docker compose -f deploy/docker-compose.yml logs -f app
查看自动生成的管理员密码(需要在仓库根目录执行):
docker compose -f deploy/docker-compose.yml logs app | grep "bootstrap admin password generated"
日志行格式:
bootstrap admin password generated: username=admin password=生成的密码
Windows PowerShell:
docker compose -f deploy/docker-compose.yml logs app | Select-String "bootstrap admin password generated"
默认容器名方式:
docker logs chatgpt2api 2>&1 | grep "bootstrap admin password generated"
如果提示 no configuration file provided: not found,说明当前命令没有指定 Compose 配置文件。先进入仓库根目录再执行 docker compose -f deploy/docker-compose.yml logs app,或直接使用上面的 docker logs chatgpt2api ... 命令。
如果查不到日志,先确认 .env 或容器环境里是否已经设置了固定密码:
grep -n "^CHATGPT2API_ADMIN_PASSWORD=" .env
docker inspect chatgpt2api --format '{{range .Config.Env}}{{println .}}{{end}}' | grep "^CHATGPT2API_ADMIN_PASSWORD="
如果已经设置了 CHATGPT2API_ADMIN_PASSWORD,服务会直接使用该值作为初始管理员密码,不会生成密码,也不会输出 bootstrap admin password generated 日志。自动生成的密码只会在首次创建管理员账号时输出一次;如果管理员账号已经存在,重新设置 .env 里的 CHATGPT2API_ADMIN_PASSWORD 不会覆盖现有管理员密码。容器日志被清理后,明文密码无法从已保存的 bcrypt 哈希中反查。
默认 SQLite 部署可按下面步骤重置本地登录账号数据。该操作会删除本地后台登录用户(包括管理员和普通本地用户),但不会删除账号池数据;执行前会先备份 data 目录。
cd /opt/chatgpt2api
# 编辑 .env,设置一个新的已知管理员密码:
# CHATGPT2API_ADMIN_PASSWORD=your_new_password
docker compose -f deploy/docker-compose.yml down
cp -a data "data.bak.$(date +%Y%m%d-%H%M%S)"
python3 - <<'PY'
import sqlite3
from pathlib import Path
db = Path("data/chatgpt2api.db")
if not db.exists():
raise SystemExit(f"{db} not found")
con = sqlite3.connect(db)
cur = con.execute("DELETE FROM json_documents WHERE name = ?", ("auth_users.json",))
con.commit()
print(f"removed auth_users.json rows: {cur.rowcount}")
con.close()
PY
docker compose -f deploy/docker-compose.yml up -d
发布镜像由 GitHub Actions 构建。如果你需要在自己的服务器上从当前源码构建镜像,使用受限 BuildKit 脚本:
sh deploy/docker-build-limited.sh up
该脚本会创建独立的 docker-container Buildx builder,并对构建容器设置 CPU / 内存上限。直接运行时会按服务器资源自动选择默认值:最多使用 2 核;内存充足时默认放开到 3-4 GB;低内存机器才会降低 Go 编译并行度,避免 compile: signal: killed 这类 OOM:
sh deploy/docker-build-limited.sh up
如果你想显式放开配额:
BUILD_CPUS=2 BUILD_MEMORY=4g BUILD_MEMORY_SWAP=4g BUILD_GOMAXPROCS=2 BUILD_GOMEMLIMIT=2GiB sh deploy/docker-build-limited.sh up
如果只想构建本地镜像、不重启容器:
sh deploy/docker-build-limited.sh build
脚本使用 deploy/Dockerfile 从源码构建本地镜像,默认镜像名为 chatgpt2api:local;up 模式会继续用 deploy/docker-compose.yml 启动该本地镜像。
Docker 部署的推荐升级方式:
docker compose -f deploy/docker-compose.yml pull
docker compose -f deploy/docker-compose.yml up -d
默认 Compose 使用 DockerHub 公共镜像,普通用户不需要配置 GitHub Release 源、GitHub Token,也不需要登录 GitHub。也可以按需将 deploy/docker-compose.yml 的 image 改为 GHCR:
image: ghcr.io/zyphrzero/chatgpt2api:latest
可用镜像:
zyphrzero/chatgpt2api:latest
ghcr.io/zyphrzero/chatgpt2api:latest
设置页的“版本更新”卡片会按部署方式选择更新来源:
docker compose -f deploy/docker-compose.yml pull && docker compose -f deploy/docker-compose.yml up -d。chatgpt2api 二进制。Release 二进制在线更新流程:
checksums.txt。chatgpt2api 二进制。.backup 以支持回滚。重要说明:
docker compose -f deploy/docker-compose.yml pull && docker compose -f deploy/docker-compose.yml up -d 更新镜像。BuildType=release 构建中开放。chatgpt2api 这一个运行文件。CHATGPT2API_UPDATE_PROXY_URL 配置代理;未设置时复用 CHATGPT2API_PROXY。amd64 / arm64 构建;Windows 和 macOS 不提供在线更新压缩包。源码部署请使用 Git 和本地构建流程:
git pull
bun install --cwd web --frozen-lockfile
bun --cwd web run build
go test ./...
go build -tags=embed -ldflags "-X chatgpt2api/internal/version.Version=1.0.0" -o chatgpt2api ./internal
运行时配置统一写入 .env。容器部署时,平台环境变量也可以覆盖 .env 中的同名变量。
| 变量 | 默认值 | 说明 |
|---|---|---|
CHATGPT2API_ADMIN_USERNAME | admin | 初始管理员用户名 |
CHATGPT2API_ADMIN_PASSWORD | 空 | 初始管理员密码;为空时首次启动自动生成一次性密码 |
CHATGPT2API_REGISTRATION_ENABLED | false | 是否开放登录页账号注册入口 |
CHATGPT2API_BASE_URL | 空 | 用于生成图片 URL 的外部访问地址 |
CHATGPT2API_PROXY | 空 | 全局代理,支持 http、https、socks5、socks5h |
CHATGPT2API_UPDATE_PROXY_URL | 空 | 检查更新访问 DockerHub / Release API 的代理;为空时复用全局代理 |
CHATGPT2API_REFRESH_ACCOUNT_INTERVAL_MINUTE | 5 | 限流账号检查间隔,单位分钟 |
CHATGPT2API_IMAGE_TASK_TIMEOUT_SECONDS | 300 | 图片任务超时时间,单位秒 |
CHATGPT2API_USER_DEFAULT_CONCURRENT_LIMIT | 0 | 普通用户默认创作并发额度;图片生成/编辑按请求张数计入,聊天任务按 1 个计入;0 表示不限制 |
CHATGPT2API_USER_DEFAULT_RPM_LIMIT | 0 | 普通用户默认创作任务 RPM 限制,0 表示不限制 |
CHATGPT2API_IMAGE_RETENTION_DAYS | 30 | 服务端缓存图片保留天数 |
CHATGPT2API_LOG_RETENTION_DAYS | 7 | 业务日志保留天数 |
CHATGPT2API_AUTO_REMOVE_INVALID_ACCOUNTS | true | 是否自动移除失效账号 |
CHATGPT2API_AUTO_REMOVE_RATE_LIMITED_ACCOUNTS | false | 是否自动移除限流账号 |
CHATGPT2API_LOG_LEVELS | 空 | 日志级别过滤,多个值用逗号分隔:debug,info,warning,error |
| 变量 | 默认值 | 说明 |
|---|---|---|
STORAGE_BACKEND | sqlite | 存储后端,可选 sqlite、postgres、mysql |
DATABASE_URL | 自动 | SQLite、PostgreSQL 或 MySQL 连接串 |
SQLite 示例:
STORAGE_BACKEND=sqlite
DATABASE_URL=sqlite:////app/data/chatgpt2api.db
PostgreSQL 示例:
STORAGE_BACKEND=postgres
DATABASE_URL=postgresql://user:password@host:5432/chatgpt2api
MySQL 示例:
STORAGE_BACKEND=mysql
DATABASE_URL=mysql://user:password@host:3306/chatgpt2api
新部署默认使用 SQLite,并自动创建 data/chatgpt2api.db。本地 JSON 文件存储后端已移除,STORAGE_BACKEND=json 不再支持。
Linuxdo OAuth 是可选能力。启用前需要在 Linuxdo Connect 后台创建应用,并配置后端 OAuth 回调地址。
CHATGPT2API_LINUXDO_ENABLED=true
CHATGPT2API_LINUXDO_CLIENT_ID=your-client-id
CHATGPT2API_LINUXDO_CLIENT_SECRET=your-client-secret
CHATGPT2API_LINUXDO_REDIRECT_URL=https://your-domain.com/auth/linuxdo/oauth/callback
CHATGPT2API_LINUXDO_FRONTEND_REDIRECT_URL=/auth/linuxdo/callback
注意:
/auth/linuxdo/oauth/callback。CHATGPT2API_LINUXDO_FRONTEND_REDIRECT_URL 是前端接收本地会话的路由,不要填到 Linuxdo Connect 应用后台。CHATGPT2API_LINUXDO_REDIRECT_URL,且已配置 CHATGPT2API_BASE_URL,后端会自动推导回调地址。bun install --cwd web --frozen-lockfile
bun --cwd web run build
go test ./...
go build -tags=embed -ldflags "-X chatgpt2api/internal/version.Version=0.0.0-dev" -o chatgpt2api ./internal
CHATGPT2API_ADMIN_PASSWORD=change_me_please ./chatgpt2api
后端默认监听:
http://127.0.0.1:8000
也可以通过 PORT 指定端口:
PORT=8000 ./chatgpt2api
cd web
bun install
bun run dev
前端开发服务器默认会通过 VITE_API_URL 访问后端。未设置时,开发模式默认使用:
http://127.0.0.1:8000
前端验证命令:
cd web
bun run lint
bun run build
项目使用 GitHub Actions + GoReleaser 发布。
.github/workflows/ci.yml 在 main push 和 pull request 上执行:
go test ./...bun install --frozen-lockfilebun run builddocker compose -f deploy/docker-compose.yml config推送 v* 标签会触发 .github/workflows/release.yml:
internal/web/dist artifact。internal/web/dist。-tags=embed 构建 Linux amd64 / arm64 二进制。checksums.txt。deploy/Dockerfile.release 构建多架构 Docker 镜像。发布命令示例:
git tag -a v1.0.0 -m "Release v1.0.0"
git push origin v1.0.0
Release 构建会注入:
chatgpt2api/internal/version.Versionchatgpt2api/internal/version.Commitchatgpt2api/internal/version.Datechatgpt2api/internal/version.BuildType=release默认发布到 DockerHub:
zyphrzero/chatgpt2api:<version>
zyphrzero/chatgpt2api:latest
zyphrzero/chatgpt2api:<major>.<minor>
同时发布到 GHCR:
ghcr.io/zyphrzero/chatgpt2api:<version>
ghcr.io/zyphrzero/chatgpt2api:latest
ghcr.io/zyphrzero/chatgpt2api:<major>.<minor>
所有受保护的 AI 接口都需要请求头:
Authorization: Bearer <session-or-api-token>
后台登录后可以在个人资料或用户管理中创建 API 令牌。
图片生成、图片编辑、异步创作任务、轮询、取消、输出格式、文本型结果和错误码的完整说明见 生图接口文档
| 方法 | 路径 | 说明 |
|---|---|---|
GET | /health | 健康检查 |
GET | /version | 当前版本 |
GET | /v1/models | 模型列表 |
POST | /v1/images/generations | OpenAI 兼容图片生成 |
POST | /v1/images/edits | OpenAI 兼容图片编辑 |
POST | /v1/chat/completions | 面向图片场景的 Chat Completions |
POST | /v1/responses | 面向图片工具调用场景的 Responses |
POST | /v1/messages | Anthropic Messages 风格入口 |
GET | /api/creation-tasks?ids=<id1,id2> | 查询异步创作任务 |
POST | /api/creation-tasks/image-generations | 提交图片生成任务 |
POST | /api/creation-tasks/image-edits | 提交图片编辑任务 |
POST | /api/creation-tasks/chat-completions | 提交文本/对话补全任务 |
POST | /api/creation-tasks/{id}/cancel | 取消任务 |
权限系统中,异步创作任务对应的 API 权限为 GET /api/creation-tasks 和 POST /api/creation-tasks,并按子路径生效。
curl http://localhost:3000/v1/models \
-H "Authorization: Bearer <session-or-api-token>"
curl http://localhost:3000/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <session-or-api-token>" \
-d '{
"model": "auto",
"prompt": "一只漂浮在太空里的猫",
"n": 1,
"response_format": "b64_json"
}'
字段说明:
| 字段 | 说明 |
|---|---|
model | 图片模型,支持 auto、gpt-image-2、codex-gpt-image-2 |
prompt | 图片生成提示词 |
n | 生成数量,当前限制为 1-4 |
response_format | 默认 b64_json |
gpt-image-2 和 auto 走 ChatGPT 官网图片工作台的纯协议链路:当前按官网 HAR 实抓对齐到底层 gpt-5-5 模型,请求 /backend-api/f/conversation 建立 SSE,并从 role=tool 且 async_task_type=image_gen 的上游消息里提取图片结果。部分会话/续图场景里官网还会补发 /backend-api/f/conversation/prepare 获取 conduit_token,但不是每次首发生成前都显式出现。codex-gpt-image-2 仍保留为独立的 Codex 图片协议模型,继续走 /backend-api/codex/responses 路线,用于和官网图片额度区分。Free 账号不会被本地预先拦截;如果账号没有对应图片工具权限,上游可能直接返回失败。
size 可以传 auto、比例值(如 1:1、16:9、9:16)、分辨率档位(1080p、2k、4k)或显式 WIDTHxHEIGHT。在纯协议工作台链路下,这些信息会作为上游提示词约束参与构图,不再转换为 Codex Responses 专用的工具尺寸字段。
curl http://localhost:3000/v1/images/edits \
-H "Authorization: Bearer <session-or-api-token>" \
-F "model=auto" \
-F "prompt=把这张图改成赛博朋克夜景风格" \
-F "n=1" \
-F "image=@./input.png"
字段说明:
| 字段 | 说明 |
|---|---|
model | 图片模型,支持 auto、gpt-image-2、codex-gpt-image-2 |
prompt | 图片编辑提示词 |
n | 生成数量,当前限制为 1-4 |
image | 参考图片,使用 multipart/form-data 上传 |
图片编辑同样按模型分流:gpt-image-2、auto 走官网图片工作台纯协议链路,codex-gpt-image-2 走独立的 Codex 图片协议链路。
该接口面向图片场景,不是完整通用聊天代理。
curl http://localhost:3000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <session-or-api-token>" \
-d '{
"model": "auto",
"messages": [
{
"role": "user",
"content": "生成一张雨夜东京街头的赛博朋克猫"
}
],
"modalities": ["image"],
"n": 1
}'
该接口面向图片生成工具调用场景,不是完整通用 Responses API 代理。
curl http://localhost:3000/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <session-or-api-token>" \
-d '{
"model": "gpt-5.5",
"input": "生成一张未来感城市天际线图片",
"tools": [
{
"type": "image_generation",
"model": "gpt-image-2"
}
],
"tool_choice": {
"type": "image_generation"
}
}'
以下截图均来自仓库的 assets/ 目录。
创作台
|
任务队列
|
图片库
|
提示词管理
|
号池管理
|
角色与权限
|
日志管理
|
注册管理
|
项目包含对 ChatGPT 官网生图链路的完整逆向分析,详见 jshook/ 目录:
| 文档 | 说明 |
|---|---|
| jshook 总索引 | 按任务、文档、脚本、响应样本组织的完整入口 |
| 生图链路技术分析 | 模型路由、Statsig 特性开关、画质控制、改图流程、内部代号等综合分析 |
| 上游 SSE 协议分析 | ChatGPT 官网 SSE 流式响应的格式与事件序列 |
| API 端点清单 | 完整的 API 端点列表与请求/响应结构 |
| 认证 API Schema | 实抓验证的认证生图 API Schema,含 Cloudflare 绕过方案 |
| 请求完成链路 | OV 函数调用链、Callsite ID、SSE 事件序列 |
| 内容类型枚举 | 前端 zo 枚举还原 |
| 函数名映射 | 混淆函数名 → 实际功能对照 |
| 内部代号词典 | 后端暗语/代号含义 |
Telegram 群组:ChatGPT2API
学 AI,上 L 站:LinuxDO
感谢所有为本项目做出贡献的开发者: