Home
Softono

Cto New Openai Proxy

Open source MIT Python
31
Stars
9
Forks
1
Issues
0
Watchers
3 months
Last Commit

 About Cto New Openai Proxy

cto.new free reverse proxy is a Go-based tool that exposes cto.new free chat models (GPT-5.4 and GLM-5.1) as OpenAI and Anthropic compatible APIs. It includes bulk account registration via Playwright scripts, an LRU-managed account pool with automatic JWT refresh through Clerk cookies, quota tracking with cooldown for exhausted accounts, and hot-reloading of account lists. A built-in web dashboard at port 9091 provides overview, account management, request logs, and usage statistics. The proxy supports streaming and non-streaming chat completions, Anthropic messages, and multimodal input. Important limitation: it does not support OpenAI function calling or Anthropic tool use because cto.new's upstream endpoint is a full coding agent with its own tool logic that cannot be overridden at the proxy layer. It is well suited for plain chat, code generation and explanation, translation, documentation, plan-mode discussions in editors like opencode or cline, and quick LLM output testing. It is not suitable for build

Platforms

Web Self-hosted

Languages

Python

Links

Need Help Installing Cto New Openai Proxy?

We provide expert installation service for this software. Our team will install, configure, and secure Cto New Openai Proxy on your server. plans start at just $30.

Cto New Openai Proxy

View on GitHub

cto.new Free API Proxy · cto.new 免费反代

Batch-register cto.new accounts and expose GPT-5.4 / GLM-5.1 as free OpenAI & Anthropic compatible APIs. 批量注册 cto.new 账号,把 GPT-5.4 / GLM-5.1 免费模型以 OpenAI /v1/chat/completions 和 Anthropic /v1/messages 兼容接口的形式暴露出来。

English · 中文


English

What it does

A Go reverse proxy that turns cto.new (Engine Labs) free chat models into standard OpenAI / Anthropic compatible APIs, with automatic account rotation from a bulk-registered pool.

  • Models: gpt-5.4 (3× quota), glm-5.1 (2× quota), plus aliases (gpt-4o, claude-sonnet-4.6, o1/o3 → all route to gpt_5_4)
  • Protocols: OpenAI chat completions (stream + non-stream), Anthropic messages (stream + non-stream), multimodal input
  • Account pool: LRU selection, auto JWT refresh via Clerk __client cookie, quota/dead marking with 6h cooldown, 30s hot-reload of accounts.jsonl
  • Dashboard: Web UI at http://127.0.0.1:9091 with tabs for Overview, Accounts, Request Logs, Usage
  • Bulk registration: Playwright / Selenium scripts to create accounts, plus a login-based cookie refresher for when __client expires

⚠️ Important: No agent / function calling support

This proxy does not support OpenAI function calling or Anthropic tool_use. Reason: cto.new's /engine-agent/chat endpoint is itself a full Engine Labs Coding Agent with its own sandbox and system prompt — we can't hijack tool-call protocol at the proxy layer. Even with OpenAI-standard tools field injection + aggressive prompt engineering, the upstream model still follows its own agent logic and won't emit structured tool_calls.

Good fit

  • Plain chat, code explanation / generation, documentation, translation
  • Plan mode in opencode / cline / continue.dev (read-only discussion, no file edits)
  • Quick LLM output quality testing

Poor fit

  • Build / Agent mode in opencode / cline (requires read_file / bash / edit_file tools)
  • Claude Code / Continue auto-coding tasks
  • Any pipeline depending on function calling

For tool calling, use providers that natively support it (official OpenAI / Anthropic / various relay APIs).

Quick start

# 1. Clone
git clone https://github.com/1837620622/cto-new-openai-proxy.git
cd cto-new-openai-proxy

# 2. Register accounts (Playwright, first-run shows browser)
pip3 install playwright requests
playwright install chromium
# ⚠️ Edit cto_register.py: set EMAIL_DOMAIN and TEMPMAIL_RECEIVER
#    to your own tempmail.plus subdomain, or export env vars:
#    export CTO_EMAIL_DOMAIN=yoursub.email
#    export [email protected]
python3 cto_register_pw.py --start 1 --count 5 --show

# 3. Build & run the Go proxy
cd go-proxy-cto
go build -o cto-proxy .
cd ..
CTO_BASE_DIR="$(pwd)" ./go-proxy-cto/cto-proxy
# Dashboard → http://127.0.0.1:9091

Usage examples

OpenAI compatible

curl -N http://127.0.0.1:9091/v1/chat/completions \
  -H 'Authorization: Bearer xs2-cto-secret' \
  -H 'Content-Type: application/json' \
  -d '{"model":"gpt-5.4","stream":true,"messages":[{"role":"user","content":"hi"}]}'

Anthropic compatible

curl -N http://127.0.0.1:9091/v1/messages \
  -H 'x-api-key: xs2-cto-secret' -H 'anthropic-version: 2023-06-01' \
  -H 'Content-Type: application/json' \
  -d '{"model":"glm-5.1","stream":true,"max_tokens":1024,"messages":[{"role":"user","content":"hi"}]}'

Change the API key via PROXY_API_KEY env var. Default listen address 127.0.0.1:9091 is set in go-proxy-cto/config.go.

Admin endpoints

Path Description
GET / Dashboard UI
GET /status Pool stats JSON
GET /v1/models Supported model list
GET /admin/accounts Full account state (requires API key)
GET /admin/logs?n=100 Recent request logs
GET /admin/log-stats 24h aggregated stats
POST /admin/reload Hot-reload accounts.jsonl

Limitations

  • Turnstile friction: the /sign-up page uses Cloudflare invisible Turnstile; same-IP bulk registration will be throttled (401). Use cto_login_refresh.py to recover via /sign-in (no Turnstile).
  • Quota: each free account gets ~300 requests/day. With a 7-account pool that's ≈700/day for gpt-5.4 (×3 multiplier) or ≈1050/day for glm-5.1 (×2).
  • No native tool use (see warning above).
  • Message size: upstream caps at ~32 KB body. The proxy truncates prompts > 20 KB to keep system prompt + most recent turns.

Tech stack

  • Go 1.21+ with Gin, gorilla/websocket, zap
  • Python 3.10+ with Playwright, Selenium, SeleniumBase UC mode, requests
  • Clerk authentication (__client cookie → session JWT via POST /v1/client/sessions/{sid}/tokens)
  • Engine Labs upstream: POST /projects/create-hostedPOST /engine-agent/offersPOST /engine-agent/chat → WebSocket stream

See TECH.md for protocol details, field-by-field reverse engineering notes, and debugging stories.

License

MIT. Use at your own risk. Respect cto.new's ToS.


中文

cto.newGPT-5.4GLM-5.1 免费模型,批量注册拿账号后,以 Go 反代形式暴露成 OpenAI /v1/chat/completionsAnthropic /v1/messages 兼容接口。

✅ 已跑通端到端流式 + 非流式 + 图像识别。账号池自动 JWT 刷新、配额标记、热加载。 ⚠️ Clerk 注册页有 Cloudflare invisible Turnstile —— 同 IP 短时间多次自动化会触发风控(401),需冷却或换 IP,详见 TECH.md。

⚠️ 重要声明:Agent / 工具调用能力

本反代不具备 Agent 工具调用能力(不支持 function calling / tool use)。

原因:cto.new 的 /engine-agent/chat 端点本身就是完整的 Engine Labs Coding Agent,它有自己的 system prompt 和沙箱环境,我们无法在反代层面接管工具调用协议。即使传入 OpenAI 标准 tools 参数并在 prompt 中注入强指令,上游模型仍会按它自己的 agent 逻辑响应,而不会输出结构化的 tool_calls

适用场景

  • 纯对话、代码解释、代码生成、文档写作、翻译
  • 在 opencode / cline / continue.dev 中做 Plan 模式(只读讨论,不改文件)
  • 快速测试 LLM 输出质量

不适用场景

  • opencode / cline 的 Build/Agent 模式(需要 read_file/bash/edit_file 等工具)
  • Claude Code / Continue 的自动编程任务
  • 任何依赖 function calling 的 pipeline

如果需要工具调用能力,请使用支持原生 function calling 的供应商(官方 OpenAI / Anthropic / 各类中转 API)。

目录结构

cto.new注册反代/
├── README.md                    本文件
├── TECH.md                      详细技术文档(协议、字段、调试、Turnstile 风控)
├── accounts.jsonl               账号池(每行一个 JSON 账号)
├── cto_register.py              Selenium 批量注册机(已保留)
├── cto_register_pw.py           ⭐ Playwright 批量注册机(推荐,反检测更好)
├── cto_login_refresh.py         ⭐ Cookie 失效时自动登录刷 __client(不经 Turnstile)
└── go-proxy-cto/                Go 反代
    ├── main.go                  入口 + 路由
    ├── config.go                端点常量 + 模型映射
    ├── account.go               账号结构
    ├── pool.go                  账号池 / 热加载 / 配额标记
    ├── clerk.go                 Clerk JWT 自动刷新
    ├── engine.go                api.enginelabs.ai REST 客户端
    ├── ws_engine.go             WebSocket 流式接入
    ├── stream.go                统一发消息 + 流转换入口
    ├── handler_openai.go        /v1/chat/completions
    ├── handler_anthropic.go     /v1/messages
    ├── homepage.go              简易 Dashboard
    ├── cto-proxy                ⭐ 已编译的 mac/arm64 二进制(14 MB)
    └── go.mod

核心工作流

[Playwright 注册] ──→ accounts.jsonl ──→ [Go 反代启动]
                                          ├─ Clerk JWT 自动刷新(__client cookie)
                                          ├─ POST /engine-agent/chat
                                          ├─ WebSocket 收 token 流
                                          └─ 转成 OpenAI / Anthropic SSE

[Cookie 失效] ──→ cto_login_refresh.py ──→ [登录抓新 __client]
                 (走 /sign-in,无 Turnstile)

一、批量注册

1.1 依赖

# Playwright 版(推荐)
pip3 install playwright requests
playwright install chromium

# Selenium 版(备用,Clerk Turnstile 对 Selenium 识别更严)
pip3 install selenium requests

1.2 邮箱与验证码

脚本支持多种邮箱模式:

  • tempmail.plus:使用 {序号}@<your-subdomain>.email 格式,所有邮件投递到你的 <your-subdomain>@mailto.plus 收件。使用前请修改 cto_register.pyEMAIL_DOMAINTEMPMAIL_RECEIVER 常量或用环境变量覆盖。
  • gptmail(新版 SeleniumBase 脚本):随机递增邮箱,无需配置。

Clerk 的验证码在邮件主题里:XXXXXX is your verification code,脚本会正则提取 6 位数字。

提示:mail.tm 等一次性邮箱被 Clerk 标为 disposable 直接拒绝。实测 tempmail.plus + 自定义子前缀的格式 未被拦截。

1.3 运行(Playwright 版,推荐)

# 进入项目根目录(下面以仓库根目录为工作目录)
cd cto.new注册反代

# 显示浏览器便于观察 Turnstile 行为(首次强烈推荐)
python3 cto_register_pw.py --start 2 --count 1 --show

# 批量注册 5 个(headless)
python3 cto_register_pw.py --start 2 --count 5

# 每次注册之间留 4-9 秒随机间隔(已内置)

1.4 运行(Selenium 版,备用)

# 默认非 headless(更稳),加 --headless 才切 headless
python3 cto_register.py --start 2 --count 1
python3 cto_register.py --start 2 --count 5 --headless

1.5 Turnstile 风控 & 应对

Clerk 用 Cloudflare invisible Turnstile 防 bot,同 IP 短时间多次自动化会被拉黑(表现:点 Continue 后 /v1/client/sign_ups 根本不发出,console 里一堆 challenges.cloudflare.com … 401)。

  • 检测curl -s -w '%{http_code}\n' https://accounts.cto.new/sign-up 回 200 只说明页面能加载,不代表 Turnstile 通。
  • 冷却:通常 30 分钟 – 数小时,关闭并过一阵再试
  • 换 IP:设 Chrome 代理(Playwright launch(proxy={...})--proxy-server=
  • 人工介入--show 模式打开浏览器,出现挑战时用户自己点一下(但 invisible 没 UI,故此路难行)
  • Fallback:若已有账号能登录但 cookie 过期,用 cto_login_refresh.py 走 /sign-in(登录页没有 Turnstile,几乎 100% 成功)

1.6 注册成功后立即写入

每成功一个立即 append 到 accounts.jsonl,Go 反代每 30 秒自动热加载。脚本对注册成功后的 cookie 做一次 verify_refresh() 自检(实际调 Clerk refresh 换 JWT),过不了就不落盘,避免"看着成功其实没用"的坏账号。

1.7 accounts.jsonl 完整字段

每个账号对象包含:

字段 生成 用途
email 注册输入 {idx}@<your-domain>
password 脚本随机 cto_login_refresh.py 登录时用
clerk_user_id window.Clerk.user.id Clerk 用户 ID(user_xxx
clerk_session_id window.Clerk.session.id JWT 刷新 URL 的一部分
clerk_org_id session.lastActiveOrganizationId Clerk 组织 ID(org_xxx
clerk_client_cookie CDP Network.getAllCookies ⭐ HTTP-only __client,刷新 JWT 的唯一凭据(1 年有效)
clerk_session_cookie 同上 启动时的 60s JWT(冗余,反代会用 __client 重刷)
clerk_client_uat 同上 Clerk client 创建时间戳(辅助刷新)
engine_user_id /current-user 响应 Engine Labs 用户 UUID
engine_team_id /current-user 响应 WebSocket token 里用
engine_api_key /current-user 响应 Engine API Key(保留给未来用)
default_workspace_id /workspaces 列表 备用(反代每次自建 workspace)
registered_at 脚本写入 ISO8601 时间戳
ws_token_suffix 拼接 {clerk_user_id}:{clerk_org_id},WebSocket ?token= 的内容

注册脚本的自检流程确保 clerk_client_cookie + clerk_session_id 能实际刷 JWT 后才落盘。

二、Go 反代

2.1 编译

cd go-proxy-cto
go build -o cto-proxy .

2.2 运行

# 以 accounts.jsonl 所在目录为 baseDir 启动
cd cto.new注册反代
./go-proxy-cto/cto-proxy
# 或者后台运行
CTO_BASE_DIR="$(pwd)" nohup ./go-proxy-cto/cto-proxy > /tmp/cto-proxy.log 2>&1 &
disown

2.2.1 自定义 API Key

默认外部访问需要 Authorization: Bearer xs2-cto-secret(只是个约定值,不是真密码)。通过环境变量自定义:

export PROXY_API_KEY="your-own-secret"
./go-proxy-cto/cto-proxy

听地址默认 127.0.0.1:9091,可改 config.go 中的 ListenAddr

访问 http://127.0.0.1:9091/ 打开 Dashboard,http://127.0.0.1:9091/status 看 JSON 统计。

2.3 调用示例

OpenAI 兼容

curl -N http://127.0.0.1:9091/v1/chat/completions \
  -H 'Authorization: Bearer any' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-5.4",
    "stream": true,
    "messages": [{"role": "user", "content": "hi"}]
  }'

Anthropic 兼容

curl -N http://127.0.0.1:9091/v1/messages \
  -H 'x-api-key: any' \
  -H 'anthropic-version: 2023-06-01' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "glm-5.1",
    "stream": true,
    "max_tokens": 1024,
    "messages": [{"role": "user", "content": "hi"}]
  }'

任意 Authorization 头都能通过(保留字段,未来做多租户时用),反代从 accounts.jsonl 里选一个可用账号来完成真正调用

2.4 支持的模型

通过 /v1/models 可获取完整列表。核心映射:

请求名 → engineKey 实际模型 图像 每次计费 免费
gpt-5.4 gpt_5_4 GPT 5.4 ×3
glm-5.1 glm_5_1 GLM 5.1 ×2
gpt-4o / gpt-4 / o1 / claude-sonnet-4.6 / … gpt_5_4 GPT 5.4(别名) ×3

每个 Free 账号每日 300 / 每周 900 配额(按 usageMultiplier 扣)。

2.5 管理端点

路径 说明
GET /status 账号池统计
GET /v1/models 支持的模型列表
GET /admin/accounts 所有账号的状态(email, in_use, exhausted, dead, success, errors)
POST /admin/reload 手动热加载 accounts.jsonl

三、号池分发

反代启动时:

  1. 读取 accounts.jsonl → 构造 Account 列表
  2. 预热:所有账号并行刷新 JWT(POST /v1/client/sessions/{sid}/tokens + __client cookie)
  3. 每 30 秒扫一次 accounts.jsonl 热加载新注册的账号

请求到达时:

  1. LRU 取一个 IsAvailable() 的账号(非 in_use / 非 exhausted / 非 dead)
  2. 确保其 JWT 剩余 > 50 秒,否则刷新
  3. /projects/create-hosted/engine-agent/offers/engine-agent/chat → WebSocket 收流
  4. 结束后归还,若返回文本里有配额关键词(limit/quota/exceeded/…)→ 标 exhausted(6h 冷却)
  5. 若 Clerk 401 → 标 dead(当前轮次不再使用)

当所有账号 exhausted/dead 时,反代返回:

{"error": "No available accounts (all exhausted or dead)"}

→ 此时跑 cto_register_pw.py --start N --count M 补充账号;若只是 cookie 过期,用 cto_login_refresh.py 更快。

四、Cookie 刷新器(Turnstile 救命稻草)

反代跑久了(或重启多次)会让 __client cookie 轮换失效,体现为 Clerk refresh 返回 401。此时:

# 刷所有账号(有效的跳过,失效的重新登录)
python3 cto_login_refresh.py

# 只刷某一个
python3 cto_login_refresh.py --email [email protected] --show

关键:登录页 /sign-in 没有 Turnstile(只注册页有),所以这个脚本在 IP 被风控时依然能用。全程:

  1. 打开 sign-in 页
  2. 填 email / password(从 accounts.jsonl)
  3. 提交 → 等跳转回 cto.new/
  4. context.new_cdp_session(page).send("Network.getAllCookies") 抓所有 cookie
  5. 提取 __client / __session / __client_uat / clerk_session_id
  6. verify_refresh() 自检能刷 JWT
  7. 覆盖 accounts.jsonl 对应行

五、已验证(最新实测)

测试 结果
OpenAI /v1/chat/completions 非流式 GPT-5.4 {"content":"42"} 正确返回
OpenAI /v1/chat/completions 流式 GPT-5.4 ✅ 6 个 delta chunk(1/ /2/ /3)+ [DONE]
Anthropic /v1/messages 流式 GLM-5.1 ✅ 完整 SSE:message_start → content_block_delta × N → message_stop,回复 Hi! 👋
Clerk JWT 自动刷新(__client cookie) POST /v1/client/sessions/{sid}/tokensstatus=200, jwt_len=889
Cookie 过期自动恢复 cto_login_refresh.py 登录后 1.4s 表单出现,回抓 JWT 刷新成功
图像识别(GPT-5.4 多模态) ✅ 浏览器实测:"Red circle, CTO-TEST" 正确识别
WebSocket token 级流式 ✅ 接收 type:update 帧,chat.content 拼接正常

六、局限与 TODO

  • Turnstile 风控:同 IP 短时间多次自动化注册必被拦。建议配代理(launch(proxy={server: "socks5://..."}) 或 ssh tunnel)或按小时分批。
  • 图像上传待集成到 /v1/chat/completions:协议已抓 POST /images/presign → S3 PUT → imageUrls 数组,Go 侧保留了 connectAndStream(..., imageURLs) 参数位但 handler 里未接入。
  • Anthropic tools / 多轮 tool_use 未实现(cto.new 的 agent 用的 tool 协议和 Anthropic 不兼容;要实现需改 handler_anthropic.go 做三阶段回放)。
  • 配额统计 目前只能靠响应文本关键词(limit/quota/exceeded)标 exhausted;真正精确数字需要周期调 /billing,未做。

详细协议、字段、Turnstile 诊断过程和每个踩坑见 TECH.md