把 Cline(https://cline.bot)的白嫖模型能力转成 OpenAI 兼容 API,部署在 Cloudflare Workers 上,免费、无服务器、无需本地运行。
逆向自 https://github.com/luawei1/cline2api
(Go 版代理),重写为纯 JS 的 Worker。
要调用 Cline 的 API,需要一个 refreshToken(相当于 Cline 账号的"长期钥匙",用它换每次请求用的 accessToken)。
本仓库提供 两个获取方式,任选其一:
脚本会启动 Cline 官方的 WorkOS 设备授权码流程,你在浏览器里登录一次即可,剩余全部自动:
# 1. 运行脚本,生成授权链接
python3 cline_oauth.py
# 2. 脚本会打印一个链接,类似:
# https://authkit.cline.bot/device?user_code=XXXX-XXXX
# 在浏览器打开,用 Google / GitHub / 邮箱登录授权
# 3. 授权完成后,脚本自动轮询并打印 refreshToken脚本内部做的(逆向自 auth.go):
POST api.workos.com/.../authorize/device→ 拿 device_code + 授权链接- 轮询
api.workos.com/.../authenticate→ 授权成功后拿 WorkOS access_tokenPOST api.cline.bot/api/v1/auth/register→ 用 WorkOS token 换 Cline 的 refreshToken
仓库自带 .github/workflows/get-token.yml 工作流,在手机上也能跑:你只需在手机浏览器点开 TG 推送的授权链接完成登录,脚本在云端自动轮询,拿到的 refreshToken 只私发到你的 Telegram,绝不进 Actions 日志。
第一步:配置 TG 变量(强制,不配不运行)
在仓库 Settings → Secrets and variables → Actions 里添加两个 secret:
TG_BOT_TOKEN:你的 Telegram Bot 的 tokenTG_CHAT_ID:接收消息的 chat_id(你自己的 id)
缺任一个,工作流都会直接报错退出,不进入授权流程。
第二步:手动触发
- 进入仓库 Actions 页 → 点击左侧 「获取 Cline refreshToken」
- 点右边 Run workflow → 可选手动填授权等待秒数(默认 300)→ 运行
- Telegram 会收到授权链接 + 设备码 → 用手机/电脑浏览器打开,Google/GitHub/邮箱 登录授权
- 授权成功 → TG 收到
refreshToken,直接复制填入 CF Worker 机密变量即可
安全说明:
- 🔒
refreshToken与账号邮箱都不会出现在 Actions 日志(::add-mask::双重打码 + 只推 TG) - 🔁 工作流运行完自动清理旧运行记录,只保留最新 1 条
- ⏱️ 授权链接推送 TG 失败会中止,宁可失败也不把 token 写进日志
- 下载原版 cline2api releases 的运行文件
- 运行
./cline-proxy --login,浏览器登录 Cline - 打开
~/.cline2api/.cline-accounts.json,找到refreshToken字段,复制它
⚠️ 关于一键部署:上方按钮可自动完成初始创建,但 Cloudflare 的 Git 集成偶尔会有构建环境问题, 且后续更新CLINE_REFRESH_TOKEN等机密变量时可能需要手动重新部署。 如果一键部署遇到不稳定的情况,仍然推荐使用下方的「复制代码粘贴部署」方式,最稳妥。
⚠️ 推荐方式:复制代码粘贴部署,不要用 Git 关联仓库部署。 实测 GitHub 关联 CF 部署(Git 集成)容易因入口文件/构建环境问题导致部署失败, 且改环境变量后不会自动生效。用下方「复制代码」方式最稳、最快。
- 一个 Cloudflare 账号(免费注册:dash.cloudflare.com)
- 上一步拿到的
CLINE_REFRESH_TOKEN
- 打开本仓库
worker.js,全选复制全部代码 - 登录 dash.cloudflare.com → Workers & Pages → 创建 → 创建 Worker
- 名字填
cline2api(可自定义)→ 部署 - 进入 Worker → 编辑代码 → 删除默认代码,粘贴刚才复制的
worker.js全部内容 → 部署(右上角) - 配置环境变量(重点
⚠️ ):- Worker → 设置 → 变量和机密 → 添加:
- 机密(Secret):
CLINE_REFRESH_TOKEN= 第一步拿到的 refreshToken(必填)- 支持多账号:一行一个 token,见下文「多账号」章节
- 机密(Secret):
API_KEY= 你的访问密钥,例如sk-cline-xxx(建议必填,可自定义)
- 机密(Secret):
⚠️ 保存后必须再点一次「部署」触发重新编译,变量才会生效!
- Worker → 设置 → 变量和机密 → 添加:
- 完成!你的 API Base URL 就是
https://cline2api.<你的子域>.workers.dev
💡 验证环境变量是否生效,访问诊断端点:
curl https://cline2api.<你的子域>.workers.dev/v1/health返回
authenticated: true即表示变量已生效,accounts显示已配置的账号数量,strategy显示当前账号调度策略。
| 变量名 | 类型 | 必填 | 说明 |
|---|---|---|---|
CLINE_REFRESH_TOKEN |
机密 Secret | ✅ | Cline 账号 refreshToken,一行一个,支持多账号 |
API_KEY |
机密 Secret | 建议 | 客户端访问密钥;不设则用默认 cline2api-default-key |
ACCOUNT_STRATEGY |
明文 Var | ❌ | 多账号调度策略:round-robin(默认)/ random / fill-first,详见「多账号」章节 |
变量名必须完全一致(全大写、无空格)。修改后务必保存并重新部署才会生效。
一个账号的免费额度/限流用完时,想切下一个号?不用改任何东西,在 CLINE_REFRESH_TOKEN 里一行填一个 token 即可:
第一个账号的refreshToken
第二个账号的refreshToken
第三个账号的refreshToken
调度策略(环境变量 ACCOUNT_STRATEGY,v1.1.9 新增):
| 策略 | 行为 | 适用场景 |
|---|---|---|
round-robin(默认) |
请求轮流使用各账号:1→2→3→1→… | 均匀分摊各账号的免费额度 |
random |
每次请求随机选号 | 多实例(isolate)并存时分布最均匀 |
fill-first |
黏住第一个健康账号,冷却/失败才切下一个 | 集中消耗第一个号,其余作备用 |
⚠️ v1.1.9 行为变更:v1.1.8 及之前虽然文档宣称 round-robin,但实际一直是 fill-first(所有请求都落在第一个账号,仅当它冷却时才切换)。v1.1.9 起轮询真正生效并成为 默认值;想保持旧行为,把ACCOUNT_STRATEGY设为fill-first即可。 注:round-robin 游标是实例内存变量,Workers 冷启动/多实例下为近似均匀,要求严格均匀可用random。
工作机制:
- 🔄 账号池调度:按
ACCOUNT_STRATEGY策略在账号间分摊请求(默认 round-robin 轮流用号) - ⚡ 额度用完/限流自动切号:某账号触发 429(
Daily free limit reached)或空响应, 解析上游冷却提示(如Try again in 2h 51m),按实际时长冷却该账号并切换到下一个,同一请求换号重试 - 🚫 失效自动跳过:刷新失败的账号会被跳过,不阻塞
- ✅ 独立缓存:每个账号各自的 accessToken 独立缓存,互不影响
- 🛡️ 全部冷却不空转:所有账号均冷却时直接返回上游响应,不盲目重试
- 单账号时完全兼容,原样工作
验证: 部署后访问 /v1/health,返回 accounts(账号数量)与 strategy(当前调度策略);
发若干次请求后到 Cline 官方后台查看 usage,应分布在多个账号上。
curl https://cline2api.<你的子域>.workers.dev/v1/models \
-H "Authorization: Bearer <你的API_KEY>"应返回模型列表。再发一次聊天:
curl https://cline2api.<你的子域>.workers.dev/v1/chat/completions \
-H "Authorization: Bearer <你的API_KEY>" \
-H "Content-Type: application/json" \
-d '{"model":"poolside/laguna-s-2.1:free","messages":[{"role":"user","content":"你好"}]}'同一份代码可以同时部署到 Cloudflare Workers 和 Vercel,互为备份:
worker.js→ Cloudflare Workers 入口api/index.js→ Vercel Edge Function 入口(逻辑与worker.js完全一致,仅入口/区域声明不同)vercel.json→ 路由重写,把/v1/*指到/api/index,不用改
💡 什么时候值得加一条 Vercel:CF Workers 域名对
User-Agent挑得凶(非浏览器 UA 直接1010), 而 Vercel 域名不挑 UA(curl / python / SDK 默认 UA 都能直连)。如果你的客户端不好自定义请求头, 用 Vercel 那条会更省事。
- 一个 Vercel 账号(Hobby 免费档即可:vercel.com/signup)
- 上一步拿到的
CLINE_REFRESH_TOKEN - 不需要改代码、不需要
package.json、不需要构建命令(Framework Preset 选Other即可)
# 1. 安装 CLI(已装可跳过)
npm i -g vercel
# 2. 登录
vercel login
# 3. 拉代码
git clone https://github.com/pingmike2/cline2api-workers.git
cd cline2api-workers
# 4. 首次关联项目(交互里选 Create new project,Framework Preset 选 Other)
vercel link
# 5. 配置环境变量(持久化到项目,多账号 refreshToken 一行一个)
vercel env add CLINE_REFRESH_TOKEN production
vercel env add API_KEY production
# 6. 部署到生产
vercel --prod部署完成后地址是 https://<项目名>.vercel.app。
⚠️ 两个容易踩的点:
- 环境变量要用
vercel env add写入项目;vercel --prod --env X=Y只对当次部署生效,不写进项目配置- 改过环境变量后必须重新
vercel --prod,运行时才会读到新值
- 打开 vercel.com/new → Import Git Repository → 选
pingmike2/cline2api-workers - Production Branch 选
main(本仓库只有 main 一条分支,CF 和 Vercel 两份代码都在里面) - Framework Preset 选
Other,Root Directory 保持.(⚠️ 不要填api)→ Build / Output 全部留空 - Environment Variables 添加:
CLINE_REFRESH_TOKEN= 你的 refreshToken(必填,一行一个支持多账号)API_KEY= 你的访问密钥(可选,不设则用默认cline2api-default-key)- 环境至少勾 Production(想在预览环境测可再勾 Preview)
- Deploy
之后 push 到 main 会自动部署;同样地,改了环境变量要在 Deployments 里点一次 Redeploy 才会生效。
# 健康检查(无需鉴权)
curl https://<项目名>.vercel.app/v1/health返回 {"ok":true,"version":"1.1.9","model":"cline-free/deepseek-v4.1-flash",...} 即成功。
# 聊天测试
curl https://<项目名>.vercel.app/v1/chat/completions \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{"model":"cline-free/deepseek-v4.1-flash","messages":[{"role":"user","content":"你好"}]}'- Deployment Protection 会挡住域名:默认开启时,
项目名-账号.vercel.app、项目名-<hash>-账号.vercel.app这类域名会被 Vercel SSO 拦截(返回 302 跳vercel.com/sso-api),只有生产别名项目名.vercel.app是公开可访问的。 如果三个域名全是 302,去 Settings → Deployment Protection 关掉 Vercel Authentication。 - 只跑美区:
api/index.js里写死了regions: ["iad1", "sfo1"](美国西部/东部)。 要换区域就改这一行;去掉regions则跟随 Vercel 默认调度。 - Hobby 免费档有商用限制,且无 SLA,适合自用/备用。
- Vercel 域名不挑 UA(实测 curl / python-urllib 直连 200),CF Workers 域名则必须带浏览器 UA,
否则
error code: 1010。两边都部署时,客户端可优先指向 Vercel 域名。
把该 Worker 当作 OpenAI 兼容 API 接入 AgentScope(QwenPaw / qwenpaw.agentscope.io) 时:
- 用
https://cline2api.<你的子域>.workers.dev/v1作为模型 Base URL / API Base。 - 不要用绑定的自定义域名(如
api.llm.xxx.com):AgentScope 平台对接时, 自定义域名可能因证书/路由/鉴权头处理问题导致调用失败或鉴权不过, 直接用 Workers 官方域名最稳。
- API Base / Base URL:
https://cline2api.<你的子域>.workers.dev/v1(部分平台要求不带/v1的填写为https://cline2api.<你的子域>.workers.dev,按平台提示试) - API Key:填你设置的
API_KEY值(如sk-cline-xxx) - Model:
deepseek/deepseek-v4-flash(默认)或poolside/laguna-s-2.1:free、zai/glm-5.2(付费,约 $0.0008/次)。depth/deepseek-v4-flash是deepseek/deepseek-v4-flash的拼写别名,同款免费,任意前缀均可。
若 AgentScope 平台走的标准 OpenAI SDK,直接指定上述 base_url + api_key 即可。 若测试报 401,请确认
API_KEY变量已在 CF 配置并重新部署过。
重要:Cline 的 Workers 网关对非浏览器 UA 的请求可能直接拦截返回
1010(浏览器 / 非 Cloudflare Workers 页面访问报错)。你在 AgentScope 里配完
Base URL / API Key / Model 后,如果一调用就报 1010 或连接失败,十有八九是
请求头里的 User-Agent 太"机器"(如 curl / python-httpx / 平台默认 SDK UA)被网关挡了。
解决办法:在**模型的「高级设置 / 自定义请求头」**里加一个浏览器 UA:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
AgentScope 平台具体操作:模型配置页 → 找到该模型的**高级设置 / 自定义 Headers(请求头)**区域, 新增一条请求头:
- 键(Key):
User-Agent - 值(Value):上面那串 Chrome 浏览器 UA
保存后重试即可,Workers 就会把它当成正规浏览器流量放行。
💡 记一下:任何平台接这个 Worker 报 1010,第一反应就是补这个浏览器 UA 请求头, 因为网关只按 UA 判是不是浏览器,跟你的 API Key 正不正确无关。加完 UA 还报 401 才去查 Key。
Base URL: https://cline2api.<你的子域>.workers.dev/v1 (或 https://<项目名>.vercel.app/v1)
API Key: <你设置的 API_KEY>
Model: cline-free/nemotron-3.5-super-vl (默认,免费)
兼容 OpenAI 客户端(/v1/chat/completions)和 Anthropic 客户端(/v1/messages,自动转换)。
完整支持 Claude Code(含工具调用:Write/Bash/Read 等多轮 agent 任务),配置:
export ANTHROPIC_BASE_URL="https://cline2api.<你的子域>.workers.dev"
export ANTHROPIC_AUTH_TOKEN="<你设置的 API_KEY>" # Claude Code 用这个头
export ANTHROPIC_API_KEY="$ANTHROPIC_AUTH_TOKEN"
# 模型用 GET /v1/models 里任一 cline-free/* 免费模型
claude -p "your task" --model cline-free/nemotron-3.5-super-vl提示:「doesn't recognize the model, assuming 200k context」是正常警告(模型名非 Anthropic 官方,CC 按 200k 窗口处理),可忽略。
| 模型 ID | 结果 |
|---|---|
cline-free/deepseek-v4.1-flash |
✅ 免费可用(默认;逆向自官方插件 recommended-models 免费通道,无需 credits) |
deepseek/deepseek-v4-flash |
✅ 免费可用(需完整 Cline 客户端头 + 强制 stream,已修复) |
depth/deepseek-v4-flash |
✅ 免费可用(deepseek/deepseek-v4-flash 的拼写别名,同款,前端任一前缀均可) |
poolside/laguna-s-2.1:free |
✅ 免费可用 |
zai/glm-5.2 |
✅ 可用(付费),走 Cline 系统凭证,约 $0.0008/次 |
z-ai/glm-5.3-flash |
✅ 免费可用(2026-09-19 修复,见下方 v1.1.8 说明) |
deepseek/deepseek-v4.1-flash |
❌ 402 insufficient_credits(付费档,余额不足;免费请用 cline-free/ 前缀) |
cline-free/glm-5.2 |
❌ 已下架(上游 404 model not found,2026-08-06 实测) |
cline-pass/* |
❌ 403,需付费 cline-pass 订阅 |
⚠️ 2026-09-19 更新(v1.1.8):剥离max_tokens,解锁更多免费模型 ⭐
- 根因:上游对免费模型的请求体只要带
max_tokens字段,一律返回 500{"error":"empty response content"}——与请求头无关(指纹头齐全也照炸), 是请求体字段触发。不带该字段即 200。- 修复:worker 构造上游 body 时不再注入
max_tokens(客户端传了也直接忽略)。 已知代价:上游按自己节奏生成,客户端无法靠max_tokens提前截断输出。- 收益:
z-ai/glm-5.3-flash(免费、带 reasoning)实测 200 可用; 其余:free后缀模型同理受益——只要上游模型列表里标注免费的,理论上都能通, 以GET /v1/models实际返回为准。GUI 的"测试模型"功能(固定发max_tokens:1) 之前必 500,现在也能正常测延迟了。
⚠️ 2026-09-16 更新:接入 DS V4.1 Flash 免费通道 ⭐
cline-free/前缀 = Cline 官方插件免费通道。官方插件(VS Code / JetBrains)通过GET https://api.cline.bot/api/v1/ai/cline/recommended-models拉取模型列表,返回体里的free数组就是免 credits 的模型,其中cline-free/deepseek-v4.1-flash为当前主力。- 关键区别:不带前缀的
deepseek/deepseek-v4.1-flash是付费档(余额不足直接 402insufficient_credits);只有cline-free/deepseek-v4.1-flash走官方免费额度。- worker 每次刷新模型列表时会同时拉取
recommended-models,把free数组合并进模型池, 官方日后调整免费模型可自动跟进,无需改代码。forceStream(非流式强制走上游 stream)已扩展到cline-free/与cline-pass/前缀。
⚠️ 2026-08-06 更新:
cline-free/glm-5.2上游已下架:该免费模型名在 Cline 上游返回 404model not found(非请求头问题, 与 deepseek 同款 Cline 指纹头仍返回 200)。同模型的付费通道zai/glm-5.2可用(约 $0.0008/次, 走 Cline 系统凭证),cline-pass/glm-5.2需订阅返回 403。- 若你的 AgentScope 里还配着
cline-free/glm-5.2,请改配deepseek/deepseek-v4-flash(免费)或zai/glm-5.2(付费)。
⚠️ 2026-08-05 修复记录:
- 403 "only available via Cline product surfaces":worker 请求头太精简,被官方识别为第三方调用。 修复:补齐完整 Cline 客户端指纹头(
User-Agent: Cline/3.0.47、HTTP-Referer、X-CLIENT-TYPE: cline-sdk、X-CLIENT-VERSION、X-PLATFORM等),deepseek/deepseek-v4-flash和cline-free/glm-5.2恢复可用。- 非流式 500 "empty response content":上游对免费通道(deepseek + cline-free)的非流式请求限流,但流式正常。 修复:客户端要非流式时,worker 强制上游走 stream,聚合 chunks 后返回非流式响应。
- 429 "Daily free limit reached":不是 bug,是账号每日免费额度用完(
Try again in Xh Xm)。 这是 Cline 官方对免费模型的日配额,等冷却结束自动恢复;多账号可缓解(CLINE_REFRESH_TOKEN多行填多个 token)。- 多账号 429 自动切号:429 限流时自动解析上游冷却时长(如
Try again in 2h 51m), 冷却该账号并切换到下一个可用账号重试同一请求;所有账号均冷却时直接返回上游响应,不空转。
.
├── worker.js # Cloudflare Workers 入口(CF 部署核心)
├── api/index.js # Vercel Edge Function 入口(Vercel 部署核心,与 worker.js 同源)
├── vercel.json # Vercel 路由重写:/v1/* → /api/index
├── wrangler.toml # CF 命令行部署配置(用复制代码方式可忽略)
├── cline_oauth.py # 获取 CLINE_REFRESH_TOKEN 的脚本 ⭐
├── .github/workflows/
│ └── get-token.yml # 手动运行的工作流:在 TG 上获取 refreshToken
├── README.md # 本文件
└── README-vercel.md # Vercel 版补充说明(历史文档,主体见本文件第三章)
⚠️ worker.js与api/index.js逻辑同源:改功能时两份都要同步改(否则 CF 与 Vercel 行为会不一致)。
Q: 谁能看到我的 refreshToken?
→ 只有你。它存在 CF Workers 的机密变量里(加密存储,代码里看不到、日志里不显示)。不要把 wrangler.toml 里的变量跟真实 refreshToken 混写,机密务必用 wrangler secret 或 Dashboard 的"机密"类型。
Q: refreshToken 会过期吗?
→ 会,但 Cline 的 refreshToken 有效期较长。如果将来请求返回 401/403 token 失效,重新跑 cline_oauth.py 拿新的即可。
Q: 免费额度够用吗?
→ cline-free/deepseek-v4.1-flash(默认)、deepseek/deepseek-v4-flash、poolside/laguna-s-2.1:free 和 z-ai/glm-5.3-flash 都是免费模型。
deepseek 有每日免费额度(用尽返回 429 "Daily free limit reached",数小时后恢复);
多账号可缓解(CLINE_REFRESH_TOKEN 多行填多个 token,额度用尽自动切号)。
zai/glm-5.2 为付费模型(约 $0.0008/次),走 Cline 系统凭证,无每日额度限制。
本项目基于 luawei1/cline2api(Go 版)逆向重写,遵循其原许可证:
MIT License © 2026 luawei1(原版)& pingmike2(Workers 版)· 详见 LICENSE
Workers 版改动部分同样以 MIT 协议开源。