简介
Sub2API 是一款开源、自托管的中转网关程序
核心使命:网页订阅账号(ChatGPT‑Plus、Claude Max/Team 订阅这类没有官方 API‑Key、只能浏览器网页登录) → 转换成标准 OpenAI 兼容接口 /v1/chat/completions,然后你可以自己生成 sk‑xxx 的密钥,供给 Hermes‑Agent、Cursor、各类 AI 客户端调用
工作原理:
- 你在后台添加账号:浏览器登录 ChatGPT/Claude 网页,完成 OAuth 授权,网关拿到
access_token+refresh_token - 网关自动用 refresh_token 刷新会话(自动续期令牌),不需要你浏览器一直开着网页
- Hermes‑Agent 向你的网关地址(
http://ip:port/v1)+ 你生成的自定义 ApiKey 发起请求 - Sub2API 把标准 OpenAI 格式请求,逆向转换成网页端的 HTTP 请求发给 OpenAI 服务器
- 将网页返回的数据,重新包装成标准 OpenAI JSON,返回下游程序
部署
1、直接使用docker-compose搞定,如下:
services:
sub2api:
image: weishaw/sub2api:latest
ports:
- "8080:8080"
environment:
- DATABASE_URL=postgres://postgres:Postgres1234@db:5432/sub2api?sslmode=disable
- REDIS_URL=redis://redis:6379
depends_on:
- db
- redis
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=Postgres1234
- POSTGRES_DB=sub2api
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
注意:只能使用8080端口,使用其他端口会导致启动报错,国内可能无法直接拉取镜像回来,可选择其他方法拉回来然后修改docker-compose.yml中指定镜像名字
2、启动后打开IP:8080,进入安装页面,连接postgresql,如图:

注意:主机位置就填写容器的CONTAINER ID,就是docker 启动后容器名对应的那个ID
然后连接redis,如图:

最后下一步填写管理员信息,最后提交后服务会重启,如果应用起不来就自己手动重启下
3、打开登录界面,输入刚才设置的管理员账号和密码最后登录

登录后页面长这个样子,如图:

示例
sub2api配置接入GROK
1、先注册GORK账号,实现可以正常网页登录
2、网络登录后在F12控制台的请求头的cookies里找到sso信息,从ey开始到第一个分号结束,如图:

在subapi账号管理页面,添加账号,选择GROK,下一步后把SSO的值粘贴进去,如图:

3、最后测试下,已经成功了,然后正常在sub2api申请apikey就行了,如图:

附加.
1、配置Nginx通过http代理到sub2api,如下:
server {
listen 80;
server_name sub2api.abrdns.com; # ← 换成你的域名
# 客户端请求体大小限制(上传文件/长对话用)
client_max_body_size 50m;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 支持(Sub2API 的 SSE 流式响应需要)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时设置(AI 回复可能很慢)
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_connect_timeout 10s;
}
}
2、配置https代理到sub2api,如下:
server {
listen 80;
server_name sub2api.abrdns.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name sub2api.abrdns.com;
ssl_certificate /etc/letsencrypt/live/sub2api.abrdns.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sub2api.abrdns.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
client_max_body_size 50m;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket / SSE
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_connect_timeout 10s;
}
}


