{"id":51169768,"url":"https://github.com/1837620622/cknb-transfer-api","last_synced_at":"2026-06-26T23:30:22.910Z","repository":{"id":366563587,"uuid":"1275857513","full_name":"1837620622/cknb-transfer-api","owner":"1837620622","description":"CKNB Transfer API - unlimited.surf 转 OpenAI/Anthropic 兼容中转，Key 池 + 代理池故障转移 + 身份白标 + 流式重试 | Node.js 服务器 + Cloudflare Worker 双部署","archived":false,"fork":false,"pushed_at":"2026-06-22T10:23:01.000Z","size":193,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-22T12:13:16.704Z","etag":null,"topics":["ai-gateway","anthropic","anthropic-api","api-gateway","api-proxy","claude","claude-api","claude-code","cloudflare-worker","llm","nodejs","openai","openai-api","proxy","reverse-proxy","unlimited-surf","white-label"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/1837620622.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-21T08:14:57.000Z","updated_at":"2026-06-22T10:23:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/1837620622/cknb-transfer-api","commit_stats":null,"previous_names":["1837620622/cknb-transfer-api"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/1837620622/cknb-transfer-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1837620622%2Fcknb-transfer-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1837620622%2Fcknb-transfer-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1837620622%2Fcknb-transfer-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1837620622%2Fcknb-transfer-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/1837620622","download_url":"https://codeload.github.com/1837620622/cknb-transfer-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1837620622%2Fcknb-transfer-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34835785,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-26T02:00:06.560Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-gateway","anthropic","anthropic-api","api-gateway","api-proxy","claude","claude-api","claude-code","cloudflare-worker","llm","nodejs","openai","openai-api","proxy","reverse-proxy","unlimited-surf","white-label"],"created_at":"2026-06-26T23:30:22.356Z","updated_at":"2026-06-26T23:30:22.891Z","avatar_url":"https://github.com/1837620622.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CKNB Transfer API\n\n\u003e 统一聚合 Claude、GPT、Gemini、DeepSeek V4 等顶级模型的通用中转服务，同时集成 **[Bad Theory Labs (BTL)](https://btl.uk)** 免费模型。提供 **OpenAI 兼容** 与 **Anthropic / Claude Code 兼容** 双协议接口，BTL 模型支持 Anthropic ↔ OpenAI 自动协议转换。自带 Key 池、代理池故障转移、指数退避重试、身份白标、流式重试，支持 **Node.js 服务器** 部署。默认模型 `gateway-claude-opus-4-8`（Claude Opus 4.8）。\n\n中文 | [English](#english)\n\n---\n\n## 目录\n\n- [功能特性](#功能特性)\n- [两种部署方式对比](#两种部署方式对比)\n- [方式一：Node.js 服务器部署（推荐）](#方式一nodejs-服务器部署推荐)\n- [方式二：Cloudflare Worker 部署](#方式二cloudflare-worker-部署)\n- [鉴权规则](#鉴权规则)\n- [接口一览](#接口一览)\n- [OpenAI 兼容接口](#openai-兼容接口)\n- [Anthropic / Claude Code 兼容接口](#anthropic--claude-code-兼容接口)\n- [可用模型](#可用模型)\n- [BTL 模型特殊说明](#btl-模型特殊说明)\n- [稳定性机制](#稳定性机制)\n- [身份白标](#身份白标)\n- [前端 Playground](#前端-playground)\n- [配置项参考](#配置项参考)\n- [English](#english)\n\n---\n\n## 功能特性\n\n- **OpenAI 兼容**：`/v1/chat/completions`、`/v1/responses`、`/v1/models`、`/v1/files`。\n- **Anthropic 兼容**：`/v1/messages`、`/v1/models`、`/anthropic/v1/messages`、`/anthropic/v1/models`。\n- **Claude 模型 `/v1/messages` 直接透传上游原生接口**，完整保留 tools（工具调用）、thinking（思维链）、真实 usage、流式结构。\n- **OpenAI `/v1/chat/completions` 带 tools 时自动转换到 Anthropic 协议**，返回标准 `tool_calls` 和 `finish_reason: tool_calls`。\n- **Key 池**：通过伪造 `X-Forwarded-For` 自动生成多个独立 key 并轮询，规避单 key 限速；key 失效（401/429/502）自动淘汰并立即用伪造 IP 生成新 key 补充，池子持续自更新（仅服务器版）。\n- **代理池故障转移**：直连上游失败时，自动通过 `proxy.scdn.io` 的免费公共代理 IP 重试（仅服务器版）。\n- **流式重试 + 指数退避**：首个有效内容前出错自动换 key / 换代理重试，最多 10 次，指数退避间隔（300ms→2s）+ 随机抖动，绕过上游偶发 502 / 429 / closed-without-text / WebSocket error。\n- **身份白标**：模型始终自称 `cknb-claude`，输出层自动过滤 `Claude` / `Anthropic` 等上游身份词汇。\n- **原始接口代理**：`/api/*` 直接转发到上游。\n- **BTL 免费模型集成**：集成 Bad Theory Labs 提供的 DeepSeek V4 Pro/Flash（**限时免费至 2026-06-28**）及 10 余个免费池模型，用量在模型列表中清晰标注到期时间和供应商标签。\n- **Anthropic ↔ OpenAI 协议自动转换**：请求 BTL 模型时，Anthropic 协议 `/v1/messages` 自动转换为 OpenAI 格式 → 调用 BTL → 再将响应还原为 Anthropic 流式格式，客户端无需感知差异。\n- **BTL 工具调用保护**：BTL 模型不支持 `tool_calls`，服务端自动剥离 tools 参数并注入回退提示，避免空响应。\n- **双供应商模型目录**：前端模型列表为每个模型展示 **厂商**（Anthropic/OpenAI/DeepSeek/xAI 等）+ **供应商**（unlimited.surf / Bad Theory Labs），支持按协议 / 供应商 / 免费模型筛选。\n- **到期倒计时显示**：限时免费模型显示 `到期倒计时：X 天 X 时 X 分`，到期自动转为不可用（红色），支持 `null` / `NaN` / `\"不定期\"` 等异常情况安全处理。\n- **Web Search / Merge AI / Files**：分别映射到上游 `/api/search`、`/api/merge`、`/api/attachments/extract`。\n- **前端 Playground**：`/app`，HTML / CSS / JS 三文件分离（`public/` 目录），浅色主题风格，支持模型选择、在线体验流式输出、思维链展示、工具调用展示、双供应商标签与到期倒计时。\n- **Agent Setup / Codex / MCP**：`/v1/setup`、`/v1/codex`、`/v1/mcp`。\n\n---\n\n## 两种部署方式对比\n\n| 特性 | Node.js 服务器版 | Cloudflare Worker 版 |\n|------|------------------|----------------------|\n| 入口文件 | `server.js` | `src/worker.js` |\n| 运行环境 | 自有服务器 / VPS | Cloudflare 边缘网络 |\n| Key 池（伪造 IP 轮询） | ✅ | ❌（边缘无法伪造 IP） |\n| 代理池故障转移 | ✅ | ❌（边缘无需此机制） |\n| 身份白标（输出层过滤） | ✅ | ❌（轻量版） |\n| 流式重试 | ✅ | ❌ |\n| BTL 免费模型（DeepSeek V4 等） | ✅ | ❌ |\n| tools / thinking 完整保留 | ✅ | ⚠️（压扁为文本走 `/api/chat`） |\n| 全球加速 | ❌ | ✅ |\n| 部署难度 | 中（需服务器） | 低（一条命令） |\n\n**选型建议**：\n- 需要完整 tools / thinking / 最高稳定性 → **服务器版**\n- 只需快速上线、全球加速、轻量调用 → **Worker 版**\n\n---\n\n## 方式一：Node.js 服务器部署（推荐）\n\n### 1. 安装\n\n```bash\n# 需要 Node.js \u003e= 20\ngit clone https://github.com/1837620622/cknb-transfer-api.git /opt/unlimited-transfer-api\ncd /opt/unlimited-transfer-api\nnpm install\ncp .env.example .env\n# 编辑 .env，填入 UNLIMITED_SURF_API_KEY 及可选 BTL_API_KEY\n```\n\n`.env` 关键变量：\n\n```text\nPORT=8788\nHOST=127.0.0.1\nUPSTREAM_BASE_URL=https://unlimited.surf\nUNLIMITED_SURF_API_KEY=ua_xxxxxxxxxxxxxxxx\nDEFAULT_MODEL=gateway-claude-opus-4-8\nDEFAULT_CLAUDE_MODEL=gateway-claude-opus-4-8\n# 可选：WORKER_API_KEY=your-custom-client-key\n\n# BTL (Bad Theory Labs) 免费模型配置\nBTL_API_KEY=gw_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\nBTL_BASE_URL=https://api.btl.uk\n```\n\n### 2. systemd 服务（开机自启 + 崩溃自动重启）\n\n```bash\ncp deploy/unlimited-transfer-api.service /etc/systemd/system/\nsystemctl daemon-reload\nsystemctl enable --now unlimited-transfer-api\n# 查看状态\nsystemctl status unlimited-transfer-api\n# 查看日志\ntail -f /var/log/unlimited-transfer-api.log\n```\n\n服务文件已配置 `Restart=always`，任何退出场景都会 5 秒后自动拉起，确保不间断运行。\n\n### 3. nginx 反代（SSE 友好）\n\n参考 `deploy/nginx.conf`，核心配置：\n\n```nginx\nlocation /ai/ {\n    proxy_pass http://127.0.0.1:8788/;\n    proxy_http_version 1.1;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header Connection '';\n    proxy_buffering off;\n    proxy_cache off;\n    proxy_read_timeout 600s;\n    chunked_transfer_encoding on;\n}\n```\n\n### 4. 验证\n\n```bash\ncurl http://your-server/ai/health\ncurl http://your-server/ai/v1/models\ncurl http://your-server/ai/v1/messages \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"gateway-claude-opus-4-8\",\"max_tokens\":100,\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}]}'\n```\n\n`/health` 返回的 JSON 包含 `btl`（BTL 连接状态）、`key_pool`（Key 池状态）、`proxy_pool`（代理池状态），可监控运行状况。\n\n---\n\n## 方式二：Cloudflare Worker 部署\n\n### 1. 本地 Wrangler 部署\n\n```bash\nnpm install\nnpx wrangler login\nnpx wrangler secret put UNLIMITED_SURF_API_KEY   # 填上游真实 key\nnpx wrangler secret put WORKER_API_KEY           # 可选：客户端访问密钥\nnpx wrangler deploy -c deploy/wrangler.toml\n```\n\n### 2. 通过 GitHub 自动部署\n\n1. 推送本项目到 GitHub 仓库。\n2. Cloudflare Dashboard → `Workers \u0026 Pages` → `Create` → `Connect to Git`。\n3. 选择仓库，配置：\n\n```text\nFramework preset: None\nBuild command: npm install\nDeploy command: npx wrangler deploy -c deploy/wrangler.toml\nRoot directory: /\nWrangler config: deploy/wrangler.toml\n```\n\n4. 在 Worker `Settings → Variables → Secrets` 添加：\n   - `UNLIMITED_SURF_API_KEY` = 你的上游 key\n   - `WORKER_API_KEY` = 你的客户端访问密钥（可选）\n\n### 3. 验证\n\n```bash\ncurl https://\u003cyour-worker\u003e.workers.dev/health\ncurl https://\u003cyour-worker\u003e.workers.dev/v1/models \\\n  -H \"Authorization: Bearer \u003cWORKER_API_KEY\u003e\"\n```\n\n\u003e **注意**：Worker 版是轻量版，不支持 Key 池、代理池故障转移、身份白标、BTL 免费模型；Claude 模型的 `/v1/messages` 会压扁为文本走 `/api/chat`，不保留 tools/thinking。如需完整能力请用服务器版。\n\n---\n\n## 鉴权规则\n\n```text\n设置了 WORKER_API_KEY:\n  客户端必须传 WORKER_API_KEY\n  服务使用 UNLIMITED_SURF_API_KEY 请求上游\n\n没有设置 WORKER_API_KEY:\n  客户端传任意 key 都可以\n  服务优先使用 UNLIMITED_SURF_API_KEY 请求上游\n  若也没有 UNLIMITED_SURF_API_KEY，则把客户端传入的 key 当作上游 key\n```\n\n---\n\n## 接口一览\n\n| 路径 | 方法 | 说明 |\n|------|------|------|\n| `/health` | GET | 健康检查 + BTL / Key 池 / 代理池状态 |\n| `/v1/chat/completions` | POST | OpenAI Chat（带 tools 自动转 Anthropic） |\n| `/v1/responses` | POST | OpenAI Responses |\n| `/v1/models` | GET | 模型列表（OpenAI 格式） |\n| `/v1/messages` | POST | Anthropic Messages（Claude 透传） |\n| `/anthropic/v1/messages` | POST | Anthropic 别名 |\n| `/v1/search` | POST | Web Search → 上游 `/api/search` |\n| `/v1/merge` | POST | Merge AI → 上游 `/api/merge` |\n| `/v1/files` | POST | 文件上传/提取 → 上游 `/api/attachments/extract` |\n| `/v1/key` `/v1/usage` | GET | 上游 key / 用量查询 |\n| `/v1/setup` `/v1/codex` `/v1/mcp` | GET | Agent / Codex / MCP 配置说明 |\n| `/api/*` | * | 原始上游代理 |\n| `/app` | GET | 前端 Playground |\n\n---\n\n## OpenAI 兼容接口\n\nBase URL：`http://your-server/v1` 或 `https://\u003cyour-worker\u003e.workers.dev/v1`\n\n```bash\ncurl http://your-server/v1/chat/completions \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"gateway-claude-opus-4-8\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}],\"stream\":true}'\n```\n\n带 tools（Claude 模型自动转换协议）：\n\n```bash\ncurl http://your-server/v1/chat/completions \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"gateway-claude-opus-4-8\",\"max_tokens\":1024,\n       \"messages\":[{\"role\":\"user\",\"content\":\"What is the weather in Paris?\"}],\n        \"tools\":[{\"type\":\"function\",\"function\":{\"name\":\"get_weather\",\"description\":\"Get weather\",\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}},\"required\":[\"city\"]}}}]}'\n```\n\n---\n\n## Anthropic / Claude Code 兼容接口\n\nBase URL：`http://your-server` 或 `https://\u003cyour-worker\u003e.workers.dev`\n\n```bash\n# Claude Code\nexport ANTHROPIC_BASE_URL=\"http://your-server\"\nexport ANTHROPIC_AUTH_TOKEN=\"any-key\"\nexport ANTHROPIC_MODEL=\"gateway-claude-opus-4-8\"\nclaude\n```\n\n思维链 + 工具调用：\n\n```bash\ncurl http://your-server/v1/messages \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"gateway-claude-opus-4-8\",\"max_tokens\":4096,\n       \"thinking\":{\"type\":\"enabled\",\"budget_tokens\":2048},\n       \"messages\":[{\"role\":\"user\",\"content\":\"What is 17*23?\"}]}'\n```\n\n---\n\n## 可用模型\n\n模型列表由两个上游动态聚合：**unlimited.surf**（付费模型）与 **Bad Theory Labs / BTL**（免费模型），前端按 **供应商** 标签区分，自动去重。默认模型 `gateway-claude-opus-4-8`（Claude Opus 4.8），双协议统一。\n\n### 限时免费模型（BTL）\n\n由 BTL 补贴，当前全免费（`$0`），到期后恢复计费：\n\n| 模型 | 到期时间 |\n|------|----------|\n| `deepseek-v4-pro` / `deepseek-v4-flash` | **2026-06-28**（BTL 官方 X 公告） |\n| `free`（20rpm 免费池路由）| 不定期 |\n| `auto`（按路由计费池）| 不定期 |\n| `laguna-m.1-20260312`、`laguna-xs.2-20260421`、`owl-alpha` | 不定期 |\n| `nemotron-3-nano-omni-30b-a3b-reasoning-20260428`、`nemotron-nano-12b-v2-vl`、`nemotron-nano-9b-v2` | 不定期 |\n| `lfm-2.5-1.2b-instruct-20260120`、`lfm-2.5-1.2b-thinking-20260120` | 不定期 |\n\n### 付费模型（unlimited.surf）\n\n完整列表可通过 `GET /v1/models` 获取。常见模型包括 `gateway-gpt-5` 系列、`gateway-claude-opus-4-8` / `gateway-claude-sonnet-4` 系列、`gateway-gemini-3-pro`、`gateway-grok-4`、`gateway-qwen-3-max` 等。DeepSeek V4 系列通过 BTL 路线以 `deepseek-v4-pro` / `deepseek-v4-flash` 免费使用，无需走 unlimited.surf 付费网关。\n\n---\n\n## BTL 模型特殊说明\n\n### 工具调用限制\n\nBTL 模型（含 DeepSeek V4 系列）**不支持 `tool_calls`**。服务端在检测到 BTL 请求包含 `tools` 参数时，自动剥离所有 tool 定义，并向系统提示中注入回退说明（`[BTL 提示：当前模型不支持工具调用，请直接用文字回复]`）。即使 BTL 返回 `finish_reason: \"tool_calls\"`，服务端也会降级为 `finish_reason: \"stop\"` 并过滤空 `tool_calls` 字段，客户端不会收到破损响应。\n\n### 协议兼容\n\nBTL 仅提供 OpenAI 兼容接口。当客户端以 Anthropic 协议请求 BTL 模型时，服务端自动完成协议转换：\n- **非流式**：Anthropic 请求体 → OpenAI 格式 → BTL → 转换回 Anthropic 响应格式\n- **流式**：OpenAI SSE 事件逐个转换为 Anthropic SSE 事件（`message_start` → `content_block_delta` → `content_block_stop` → `message_delta` → `message_stop`），客户端以标准 Anthropic SDK 接收。\n\n### 到期机制\n\n前端模型列表对每个 BTL 模型展示 `expires` 字段，到期前 7 天显示橙色警告，到期后显示红色「已到期」标签，Playground 下拉会自动禁用到期模型。\n\n---\n\n## 稳定性机制\n\n### Key 池（服务器版）\n\nunlimited.surf 的 key 按 IP 绑定且 unlimited。服务器通过伪造 `X-Forwarded-For` 自动生成多个独立 key 并轮询使用，规避单 IP / 单 key 限速。`UNLIMITED_SURF_API_KEY` 作为兜底。\n\n### 代理池故障转移（服务器版）\n\n集成 [proxy.scdn.io](https://proxy.scdn.io) 免费公共代理 IP 池。当 unlimited.surf 直连失败（5xx / 网络超时）时，自动轮询最多 5 个代理 IP 重试；4xx 业务错误不转移。代理池定期刷新，失败代理自动淘汰。\n\n### 流式重试 + 指数退避\n\n- 非流式 `/v1/messages` 内部用流式调上游并收集 SSE，绕过上游非流式端点的不稳定。\n- 首个有效内容块前出错自动换 key / 换代理重试（Anthropic 路径最多 10 次，Unlimited 路径最多 8 次）。\n- **指数退避**：重试间隔 300ms→600ms→1.2s→2s（上限）+ 随机抖动，避免连续冲击上游触发限速。\n- `closed-without-text`（空内容块）、`WebSocket error`、`429` 自动识别并重试；429 命中时立即淘汰当前 key。\n- 一旦开始输出内容即切换到实时转发模式，不再重试（保证流式连贯）。\n\n---\n\n## 身份白标\n\n服务器版内置身份白标机制，模型始终以 `cknb-claude` 身份对外：\n\n- **系统提示词注入**：自动注入白标角色设定，引导模型自称 `cknb-claude`。\n- **Assistant prefill**：对身份相关问题注入前缀补全，约束模型起手回答。\n- **输出层过滤**：对返回内容做文本替换，`Claude` → `cknb-claude`、`Anthropic` → `CKNB 团队`，确保不暴露上游身份（Opus 4.8 的 RLHF 诚实约束极强，system prompt + prefill 在流式下不可靠，输出层过滤是最可靠的兜底手段）。\n\n---\n\n## 前端 Playground\n\n访问 `/app`，前端采用 **HTML / CSS / JS 三文件分离** 结构，托管在 `public/` 目录：\n\n- `public/index.html`：页面结构\n- `public/app.css`：样式（浅色主题、绿色主色、胶囊按钮、卡片布局）\n- `public/app.js`：交互逻辑（模型加载、在线体验、流式输出）\n\n支持功能：\n\n- **模型列表**：实时从 `/v1/models` 加载，每个模型展示 **厂商**（Anthropic / OpenAI / DeepSeek / xAI / Google 等）+ **供应商**（unlimited.surf / Bad Theory Labs），双胶囊标签并排显示\n- **4 种筛选**：仅 Claude / 仅 OpenAI(Gateway) / 仅 BTL 免费 / 仅免费/限免，可多选，搜索框支持按 ID / 供应商 / 厂商 / 定价搜索\n- **到期倒计时**：限时免费模型显示到期时间，7 天内橙色警告，到期红色标为不可用；支持 `null` / `NaN` / `\"不定期\"` 多种有效期格式\n- **一键复制**：点击模型行任意位置复制模型 ID，URL 事件委托 + `execCommand('copy')` HTTP 兜底\n- **在线体验**：选模型、输入消息、流式输出回复，Playground 自动判断协议（Anthropic vs OpenAI），BTL 模型显示 `[BTL]` / `[网关]` 前缀标签\n- 思维链展示、工具调用展示\n\n部署时把 `public/` 目录与 `server.js` 放同级，服务端自动托管静态文件。\n\n---\n\n## 配置项参考\n\n### 服务器版（.env）\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `PORT` | `8787` | 监听端口（参考配置使用 8788） |\n| `HOST` | `0.0.0.0` | 监听地址 |\n| `UPSTREAM_BASE_URL` | `https://unlimited.surf` | unlimited.surf 上游地址 |\n| `UNLIMITED_SURF_API_KEY` | - | unlimited.surf API key（必填） |\n| `BTL_API_KEY` | - | BTL (Bad Theory Labs) API key（启用免费模型必填） |\n| `BTL_BASE_URL` | `https://api.btl.uk` | BTL 上游地址 |\n| `WORKER_API_KEY` | - | 客户端访问密钥（可选） |\n| `DEFAULT_MODEL` | `gateway-claude-opus-4-8` | 默认模型（双协议统一） |\n| `DEFAULT_CLAUDE_MODEL` | `gateway-claude-opus-4-8` | 默认 Claude 模型 |\n| `KEY_POOL_ENABLED` | `true` | 启用 Key 池 |\n| `KEY_POOL_SIZE` | `20` | Key 池大小 |\n| `KEY_POOL_REFILL_THRESHOLD` | `5` | 池中有效 key 低于此值时补充 |\n| `KEY_POOL_IP_BASE` | `198511000` | 伪造 IP 的基数（自增生成不同 IP） |\n| `PROXY_POOL_ENABLED` | `true` | 启用代理池故障转移 |\n| `PROXY_POOL_URL` | `https://proxy.scdn.io/api/get_proxy.php` | 代理池 API |\n| `PROXY_POOL_PROTOCOL` | `http` | 代理协议（http/https/socks4/socks5） |\n| `PROXY_POOL_FETCH_COUNT` | `20` | 每次拉取代理数 |\n| `PROXY_POOL_REFRESH_MS` | `300000` | 代理池刷新间隔 |\n| `PROXY_POOL_TIMEOUT_MS` | `8000` | 代理请求超时 |\n\n### Worker 版（deploy/wrangler.toml + Secrets）\n\n- `deploy/wrangler.toml` 的 `[vars]`：`UPSTREAM_BASE_URL`、`DEFAULT_MODEL`、`DEFAULT_CLAUDE_MODEL`\n- Secrets：`UNLIMITED_SURF_API_KEY`、`WORKER_API_KEY`（可选）\n\n---\n\n## English\n\nA universal transfer service that aggregates top-tier models (Claude, GPT, Gemini, DeepSeek V4, etc.) into OpenAI-compatible `/v1/*` routes and Anthropic/Claude Code-compatible `/v1/messages` routes. Integrates **[Bad Theory Labs (BTL)](https://btl.uk)** free models with automatic protocol conversion (Anthropic ↔ OpenAI). Built-in key pool, proxy failover, exponential-backoff retry, identity white-labeling, and streaming retry. Supports **Node.js server** deployment. Default model: `gateway-claude-opus-4-8`.\n\n### Features\n\n- OpenAI-compatible: `/v1/chat/completions`, `/v1/responses`, `/v1/models`, `/v1/files`.\n- Anthropic-compatible: `/v1/messages`, `/v1/models`, `/anthropic/v1/messages`, `/anthropic/v1/models`.\n- Claude `/v1/messages` passes through upstream natively, preserving tools, thinking, usage, and streaming.\n- OpenAI chat with tools auto-converts to Anthropic protocol.\n- Key pool: rotates multiple keys via spoofed `X-Forwarded-For` (server only).\n- Proxy failover: retries via free public proxies from `proxy.scdn.io` on upstream failure (server only).\n- Streaming retry with key/proxy rotation before first content.\n- Identity white-label: model always identifies as `cknb-claude`; output-layer filtering strips upstream identity.\n- **BTL free model integration**: DeepSeek V4 Pro/Flash (free until 2026-06-28) and 10+ free pool models from Bad Theory Labs with clear expiration labels.\n- **Anthropic ↔ OpenAI protocol conversion**: BTL models auto-convert between protocols; Anthropic `/v1/messages` requests are proxied to BTL's OpenAI endpoint and responses converted back.\n- **BTL tool call protection**: Server auto-strips `tools` from BTL requests to prevent empty `tool_calls` responses.\n- **Dual-vendor model catalog**: Each model shows **upstream vendor** + **supplier badge** (unlimited.surf / BTL) with expiration countdown and 4 filter modes.\n- Raw upstream proxy: `/api/*` forwards directly.\n- Web Search / Merge AI / Files mapped to upstream endpoints.\n- Playground at `/app`.\n\n### Server deployment\n\n```bash\ngit clone https://github.com/1837620622/cknb-transfer-api.git /opt/unlimited-transfer-api\ncd /opt/unlimited-transfer-api\nnpm install\ncp .env.example .env  # fill in UNLIMITED_SURF_API_KEY and optionally BTL_API_KEY\ncp deploy/unlimited-transfer-api.service /etc/systemd/system/\nsystemctl daemon-reload \u0026\u0026 systemctl enable --now unlimited-transfer-api\n```\n\nThe systemd unit uses `Restart=always` for uninterrupted operation.\n\n### Worker deployment\n\n```bash\nnpm install\nnpx wrangler secret put UNLIMITED_SURF_API_KEY\nnpx wrangler deploy -c deploy/wrangler.toml\n```\n\nNote: The Worker version is lightweight — no key pool, proxy failover, identity white-label, or **BTL free model integration**; Claude `/v1/messages` is flattened to text via `/api/chat` without tools/thinking. Use the server version for full capabilities.\n\n### Auth rules\n\n```text\nWORKER_API_KEY set:    clients must send it; server uses UNLIMITED_SURF_API_KEY upstream.\nWORKER_API_KEY unset:  clients may send any key; server prefers UNLIMITED_SURF_API_KEY.\n```\n\n### License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F1837620622%2Fcknb-transfer-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F1837620622%2Fcknb-transfer-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F1837620622%2Fcknb-transfer-api/lists"}