Files
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
107 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "ccwq/infocard-pub", "files": {"docs/20260611-backdoor.html": {"6886890ed841f3a63b4a3d6f74e0bc6ee967abe9": {"t": 1785747367.6649392, "n": 23891, "h": "c7e699f6346c3278", "c": "<!doctype html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Backdoor · Claude Code Proxy</title>\n <style>\n :root{\n --canvas:#f7f2e8; --paper:#fffdf8; --ink:#0c1220; --line:#111111;\n --purple:#6e3fd6; --green:#2e9b4b; --blue:#2e6be6; --orange:#f59e0b; --yellow:#f5d46b;\n --soft-purple:#f2ecff; --soft-green:#eefbf1; --soft-blue:#eef4ff; --soft-orange:#fff4e6;\n --shadow:8px 8px 0 rgba(17,17,17,.12);\n }\n *{box-sizing:border-box;margin:0;padding:0}\n html,body{margin:0;overflow-x:hidden}\n body{\n color:var(--ink);line-height:1.58;font-family:Inter,system-ui,-apple-system,\"PingFang SC\",\"Microsoft YaHei\",\"Segoe UI\",Arial,sans-serif;\n background:\n linear-gradient(rgba(17,17,17,.04) 1px, transparent 1px) 0 0/100% 42px,\n linear-gradient(90deg, rgba(17,17,17,.04) 1px, transparent 1px) 0 0/42px 100%,\n radial-gradient(circle at 10% 8%, rgba(110,63,214,.06) 0 11%, transparent 12%),\n radial-gradient(circle at 86% 10%, rgba(46,155,75,.05) 0 10%, transparent 11%),\n linear-gradient(180deg,#faf4e9 0,#f7f2e8 100%);\n }\n img{display:block;max-width:100%}\n a{color:inherit;text-decoration:none}\n code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}\n .page{width:min(1180px, calc(100% - 20px));margin:0 auto;padding:18px 0 88px}\n\n .hero{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(0,1.12fr) minmax(0,.82fr);gap:14px;border:3px solid var(--line);background:var(--paper);overflow:hidden;box-shadow:var(--shadow)}\n .hero-bar{grid-column:1/-1;height:14px;background:#111;border-bottom:3px solid var(--line);position:relative}\n .hero-bar::before{content:\"\";position:absolute;inset:0 auto 0 0;width:180px;background:var(--purple)}\n .hero-bar::after{content:\"\";position:absolute;inset:0 0 0 auto;width:150px;background:var(--blue)}\n .hero-copy{padding:16px;border-right:3px solid var(--line);display:grid;gap:10px;align-content:start}\n .kicker{display:inline-flex;align-items:center;gap:8px;width:fit-content;border:2px solid var(--line);background:#fff;padding:5px 9px;font-size:11px;font-weight:900;letter-spacing:.18em;text-transform:uppercase}\n .kicker::before{content:\"■\";color:var(--purple);font-size:10px}\n h1.demo-title{margin:0;max-width:820px;font-size:clamp(24px,3.7vw,44px);line-height:.98;letter-spacing:-.05em}\n .subtitle{color:#4d5567;font-size:12.5px;line-height:1.55}\n .badge-row{display:flex;flex-wrap:wrap;gap:6px}\n .badge{display:inline-flex;align-items:center;min-height:28px;padding:5px 9px;border:2px solid var(--line);background:#fff;font-size:11.6px;font-weight:850}\n .badge.purple{background:var(--purple);color:#fff}\n .badge.blue{background:var(--blue);color:#fff}\n .badge.green{background:var(--green);color:#fff}\n .badge.orange{background:var(--orange);color:#111}\n .badge.dark{background:#111;color:#fff}\n .badge.ink{background:#111;color:#fff;font-size:11px;min-height:24px;padding:4px 8px}\n .alert{border:2px solid var(--line);background:#111;color:#fff;padding:10px 12px;display:grid;gap:8px;box-shadow:var(--shadow)}\n .alert strong{display:block;font-size:13.5px;line-height:1.35}\n .alert p{margin:0;font-size:12.5px;line-height:1.62;color:#f0ebe0}\n .mini-row{display:flex;flex-wrap:wrap;gap:6px}\n .mini-tag{display:inline-flex;align-items:center;border:1.5px solid #fff;padding:4px 8px;font-size:11px;font-weight:850;line-height:1;background:#111;color:#fff}\n\n .architecture-column{background:#fff;display:grid;grid-template-rows:auto 1fr}\n .panel-top{padding:14px;border-bottom:3px solid var(--line);background:linear-gradient(135deg,#0f1320 0%,#151a2b 100%);color:#fff}\n .panel-top .eyebrow{display:inline-flex;align-items:center;border:1.5px solid #fff;padding:3px 8px;font-size:10.8px;font-weight:900;letter-spacing:.16em;text-transform:uppercase}\n .panel-top h3{margin:10px 0 6px;font-size:20px;line-height:1.08;letter-spacing:-.04em}\n .panel-top p{margin:0;color:#ece8dc;font-size:13px;line-height:1.64}\n .panel-body{padding:14px;display:grid;gap:10px;background:#f7f6f2}\n .quote{border-left:4px solid var(--blue);padding:10px 12px;background:var(--soft-blue);font-weight:750;line-height:1.58}\n .cost-compare{display:grid;gap:8px}\n .cost-row{border:2px solid var(--line);background:#fff;padding:10px 12px;display:grid;gap:3px;box-shadow:4px 4px 0 rgba(17,17,17,.08)}\n .cost-row .l{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:#5d6472;font-weight:900}\n .cost-row .v{font-size:22px;font-weight:950;line-height:1.1;letter-spacing:-.04em}\n .cost-row .v.purple{color:var(--purple)}\n .cost-row .v.green{color:var(--green)}\n .cost-row .v.orange{color:var(--orange)}\n .cost-row .note{font-size:13px;line-height:1.5;color:#222}\n\n .summary-rail{background:#111;color:#fff;display:grid;grid-template-rows:auto 1fr;overflow:hidden}\n .summary-head{padding:14px;border-bottom:3px solid #0c0c0c;background:linear-gradient(180deg,#141414,#111)}\n .summary-head h3{font-size:20px;line-height:1.08;letter-spacing:-.04em;margin:0 0 6px}\n .summary-head p{margin:0;color:#e8e0d3;font-size:12.8px;line-height:1.6}\n .summary-body{padding:14px;display:grid;gap:10px;background:#151515}\n .summary-card{border:1.5px solid rgba(255,255,255,.14);background:#1a1a1a;padding:12px;display:grid;gap:6px}\n .summary-card .t{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase;color:#d7d7d7}\n .summary-card .t::before{content:\"■\"}\n .summary-card p{margin:0;color:#ece8dc;font-size:12.6px;line-height:1.62}\n .summary-card.purple .t::before{color:var(--purple)}\n .summary-card.green .t::before{color:var(--green)}\n .summary-card.blue .t::before{color:var(--blue)}\n .summary-card.orange .t::before{color:var(--orange)}\n .github{border:2px solid #fff;background:#fff;color:#111;padding:12px;display:grid;gap:8px}\n .github .small{font-size:10.8px;font-weight:900;letter-spacing:.16em;text-transform:uppercase;color:#666}\n .github .num{font-size:30px;line-height:1;font-weight:950;letter-spacing:-.04em;color:var(--purple)}\n\n .section{margin-top:30px;border-top:3px solid var(--line);padding-top:14px}\n .section-head{display:grid;grid-template-columns:96px 1fr;gap:14px;align-items:start;margin-bottom:12px}\n .section-no{display:grid;place-items:center;width:96px;height:96px;border:3px solid var(--line);background:var(--purple);color:#fff;font-size:34px;font-weight:950;line-height:1;box-shadow:var(--shadow)}\n .section-no.b{background:var(--blue)}\n .section-no.g{background:var(--green)}\n .section-no.o{background:var(--orange);color:#111}\n .section-meta{display:grid;gap:7px;padding-top:4px}\n .section-meta .label{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--purple);font-weight:900}\n .section-meta .label.b{color:var(--blue)}\n .section-meta .label.g{color:var(--green)}\n .section-meta .label.o{color:var(--orange)}\n .section-meta h2{margin:0;font-size:clamp(22px,3.7vw,38px);line-height:1.02;letter-spacing:-.05em}\n .section-meta p{margin:0;color:#5d6472;font-size:14px;line-height:1.62;max-width:980px}\n\n .grid-2,.grid-3,.grid-4{display:grid;gap:12px}\n .grid-2{grid-template-columns:repeat(2,minmax(0,1fr))}\n .grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}\n .grid-4{grid-template-columns:repeat(4,minmax(0,1fr))}\n .card,.mini{border:2px solid var(--line);background:#fff;min-width:0;box-shadow:var(--shadow)}\n .card,.mini{padding:14px}\n .card{display:grid;gap:10px}\n .card h3,.mini h4{margin:0;letter-spacing:-.02em}\n .card h3{font-size:17px;line-height:1.16}\n .card p,.mini p{margin:0;font-size:14px;color:#222;line-height:1.66}\n .card ul,.mini ul{margin:0;padding-left:0;list-style-position:inside}\n .card li,.mini li{margin:4px 0;font-size:14px;color:#222;line-height:1.66}\n .tagrow{display:flex;flex-wrap:wrap;gap:6px}\n .tag{display:inline-flex;align-items:center;gap:6px;border:2px solid var(--line);padding:4px 8px;background:#fff;font-size:11.6px;font-weight:850;line-height:1}\n .tag.purple{background:var(--soft-purple);border-color:var(--purple);color:var(--purple)}\n .tag.green{background:var(--soft-green);border-color:var(--green);color:var(--green)}\n .tag.blue{background:var(--soft-blue);border-color:var(--blue);color:var(--blue)}\n .tag.orange{background:var(--soft-orange);border-color:var(--orange);color:#8c5200}\n .tag.dark{background:#111;color:#fff}\n\n .matrix{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}\n .matrix .mini{display:grid;gap:8px}\n .mini h4{font-size:15px;line-height:1.2}\n .mini .lead{font-size:13px;color:#5d6472;font-weight:850;letter-spacing:.04em;text-transform:uppercase}\n .mini .quote-line{border-left:4px solid var(--purple);padding-left:10px;font-weight:900;line-height:1.58}\n\n .flow-v{display:grid;gap:8px}\n .flow-item{border:2px solid var(--line);background:#fff;padding:10px 12px;display:grid;gap:3px;position:relative;box-shadow:4px 4px 0 rgba(17,17,17,.08)}\n .flow-item::after{content:\"↓\";position:absolute;left:14px;bottom:-17px;color:var(--blue);font-size:15px;font-weight:900}\n .flow-item:last-child::after{display:none}\n .flow-item .t{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:#5d6472;font-weight:900}\n .flow-item .c{font-size:14px;line-height:1.55;font-weight:900}\n .flow-item.purple .c{color:var(--purple)}\n .flow-item.green .c{color:var(--green)}\n .flow-item.blue .c{color:var(--blue)}\n .flow-item.orange .c{color:var(--orange)}\n\n .quote-block{border-left:4px solid var(--blue);padding:12px 14px;background:var(--soft-blue);font-size:14px;line-height:1.72;box-shadow:var(--shadow)}\n .spec-table{width:100%;border-collapse:collapse;font-size:13px;line-height:1.6}\n .spec-table th,.spec-table td{border:2px solid var(--line);padding:8px 10px;text-align:left;background:#fff}\n .spec-table th{background:#111;color:#fff;font-weight:850;font-size:11.6px;letter-spacing:.08em;text-transform:uppercase}\n .spec-table .yes{color:var(--green);font-weight:900}\n .spec-table .no{color:#aaa}\n .rule{height:3px;background:#111;margin:8px 0 0}\n .source-note{margin-top:18px;text-align:center;color:#5d6472;font-size:12.5px;line-height:1.62}\n\n @media (max-width:1080px){\n .hero{grid-template-columns:1fr}\n .hero-copy{border-right:0;border-bottom:3px solid var(--line)}\n .summary-rail{border-top:3px solid #0c0c0c}\n .grid-4,.matrix{grid-template-columns:repeat(2,minmax(0,1fr))}\n }\n @media (max-width:720px){\n .page{width:min(100% - 16px,1180px);padding:10px 0 60px}\n .hero{display:flex;flex-direction:column}\n .hero-copy{padding:16px;border-right:0;border-top:3px solid var(--line)}\n .grid-4,.grid-3,.grid-2,.matrix{grid-template-columns:1fr}\n .section-head{grid-template-columns:1fr;gap:10px}\n .section-no{width:72px;height:72px;font-size:28px}\n .card,.mini,.alert{padding-left:12px;padding-right:12px}\n .spec-table{font-size:12px}\n .spec-table th,.spec-table td{padding:5px 6px}\n }\n </style>\n</head>\n<body>\n <main class=\"page\">\n\n <header class=\"hero\">\n <div class=\"hero-bar\"></div>\n <div class=\"hero-copy\">\n <div class=\"kicker\">BACKDOOR · CLAUDE CODE PROXY</div>\n <h1 class=\"demo-title\">Run Claude Code Against Any AI Provider</h1>\n <p class=\"subtitle\">Backdoor 是一个轻量级代理,拦截 Claude Code 的 Anthropic API 调用,路由到任何 OpenAI 兼容的提供商。DeepSeek、Groq、Ollama、OpenRouter — 你选。同一 UI、同一工具、同一 agentic loop,零锁定。</p>\n <div class=\"badge-row\">\n <span class=\"badge purple\">DeepSeek</span>\n <span class=\"badge green\">Groq</span>\n <span class=\"badge blue\">Ollama</span>\n <span class=\"badge orange\">OpenRouter</span>\n </div>\n <div class=\"badge-row\">\n <span class=\"badge dark\">NVIDIA NIM</span>\n <span class=\"badge ink\">LM Studio</span>\n <span class=\"badge ink\">200+ Models</span>\n <span class=\"badge ink\">Telegram Control</span>\n </div>\n <div class=\"alert\">\n <strong>最好的编码 agent,搭配你选的模型</strong>\n <p>Claude Code 是目前最好的 coding agent — 工具调用、agentic 循环、代码库导航能力无可匹敌。Backdoor 解除了它和 Anthropic API 的硬绑定,让你用任何模型、任何价格跑同一个 ui。</p>\n <div class=\"mini-row\">\n <span class=\"mini-tag\">Zero Lock-in</span>\n <span class=\"mini-tag\">99.95% Cheaper</span>\n <span class=\"mini-tag\">&lt;600 LOC</span>\n </div>\n </div>\n </div>\n\n <section class=\"architecture-column\">\n <div class=\"panel-top\">\n <div class=\"eyebrow\">COST COMPARISON</div>\n <h3>500M Tokens · Same Workload</h3>\n <p>Backdoor 实测数据:同一 task 负载跑过 500M tokens,两种后端的费用差距。</p>\n </div>\n <div class=\"panel-body\">\n <div class=\"cost-compare\">\n <div class=\"cost-row\">\n <div class=\"l\">Claude Opus 4.7</div>\n <div class=\"v purple\">$9,834</div>\n <div class=\"note\">~$19.67 / 1M tokens</div>\n </div>\n <div class=\"cost-row\">\n <div class=\"l\">DeepSeek V3 Flash</div>\n <div class=\"v green\">$5.34</div>\n <div class=\"note\">~$0.01 / 1M tokens — <strong>99.95% cheaper</strong></div>\n </div>\n </div>\n <div class=\"quote\">$9,834 vs $5.34 — 近 2,000x 成本差距。个人开发者从\"肉疼\"变\"忽略不计\",团队从小没预算变随便跑。</div>\n <div class=\"cost-row\" style=\"border-color:var(--purple)\">\n <div class=\"l\">NVIDIA NIM / Groq 免费层</div>\n <div class=\"v green\">$0</div>\n <div class=\"note\">月数千次请求免费 — 零成本上手。</div>\n </div>\n </div>\n </section>\n\n <aside class=\"summary-rail\">\n <div class=\"summary-head\">\n <h3>为什么选择 Backdoor</h3>\n <p>Claude Code 的 harness 是免费的。背后跑什么模型,由你决定。</p>\n </div>\n <div class=\"summary-body\">\n <article class=\"summary-card purple\">\n <div class=\"t\">完全免费层</div>\n <p>NVIDIA NIM 和 Groq 都有免费层,月数千次请求。开箱即用,零成本启动。</p>\n </article>\n <article class=\"summary-card green\">\n <div class=\"t\">成本降低 95%+</div>\n <p>DeepSeek 比 Claude API 便宜约 95%。从\"一杯咖啡\"变成\"忽略不计\"。</p>\n </article>\n <article class=\"summary-card blue\">\n <div class=\"t\">完全本地私密</div>\n <p>指向本地 Ollama 实例,数据永远不会离开你的机器。无 API、无日志、无传输。</p>\n </article>\n <article class=\"summary-card orange\">\n <div class=\"t\">200+ 模型,一把钥匙</div>\n <p>通过 OpenRouter 接入 Gemini、Grok、Qwen 等所有主流模型,单一 API key。</p>\n </article>\n <div class=\"github\">\n <div class=\"small\">GitHub / Backdoor</div>\n <div class=\"num\">288</div>\n <div style=\"font-size:12.4px;line-height:1.55\">stars · 30 forks · MIT · Python · 3 commands to set up</div>\n </div>\n </div>\n </aside>\n </header>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no\">01</div>\n <div class=\"section-meta\">\n <div class=\"label\">THE PROBLEM & THE FIX</div>\n <h2>锁定的代价与解耦的方案</h2>\n <p>Claude Code 硬绑定到 Anthropic API。你付 Anthropic 的价格、用 Anthropic 的模型、受 Anthropic 的规则约束。Backdoor 在中间做了一层透明的协议转换。</p>\n </div>\n </div>\n <div class=\"grid-3\">\n <article class=\"card\">\n <div class=\"tagrow\"><span class=\"tag purple\">Before</span><span class=\"tag dark\">Lock-in</span></div>\n <h3>锁定状态</h3>\n <p>Claude Code → Anthropic API → $$$。最高质量的 coding agent 只有一种后端选择。</p>\n <ul>\n <li>单一 API 定价无竞争</li>\n <li>模型更新节奏随 Anthropic</li>\n <li>高成本限制使用规模</li>\n </ul>\n </article>\n <article class=\"card\" style=\"border-color:var(--green)\">\n <div class=\"tagrow\"><span class=\"tag green\">After</span><span class=\"tag dark\">Freedom</span></div>\n <h3>解耦方案</h3>\n <p>Claude Code → Backdoor → 任意 OpenAI 兼容提供商。零改动、零配置切换。</p>\n <ul>\n <li>一行 .env 切换提供商</li>\n <li>支持 DeepSeek/Groq/NVIDIA/Ollama</li>\n <li>代码 &lt; 600 行,完全透明</li>\n </ul>\n </article>\n <article class=\"card\">\n <div class=\"tagrow\"><span class=\"tag orange\">核心洞察</span><span class=\"tag dark\">Why</span></div>\n <h3>Agent Harness > 模型</h3>\n <p>Claude Code 真正强大的是它的工具调用系统和 agentic loop。模型是可更换的。</p>\n <ul>\n <li>最好的 harness + 最便宜的模型 = 最优解</li>\n <li>不否定 Anthropic,而是让更多人能用上</li>\n <li>MIT 开源,任何人都能参与改进</li>\n </ul>\n </article>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no b\">02</div>\n <div class=\"section-meta\">\n <div class=\"label b\">PROVIDER MATRIX</div>\n <h2>支持的提供商一览</h2>\n <p>修改 .env 中三行配置即可切换后端。覆盖免费层、本地部署和商业 API 三种场景。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <table class=\"spec-table\">\n <thead>\n <tr><th>提供商</th><th>免费层</th><th>速度</th><th>最适合</th></tr>\n </thead>\n <tbody>\n <tr><td><strong>DeepSeek</strong></td><td class=\"no\">—</td><td>快</td><td>极致性价比</td></tr>\n <tr><td><strong>Groq</strong></td><td class=\"yes\">✅</td><td>最快</td><td>即时响应场景</td></tr>\n <tr><td><strong>NVIDIA NIM</strong></td><td class=\"yes\">✅</td><td>快</td><td>免费 Llama 3.3 70B</td></tr>\n <tr><td><strong>OpenRouter</strong></td><td class=\"no\">—</td><td>因模型而异</td><td>一把钥匙通所有</td></tr>\n <tr><td><strong>Ollama</strong></td><td class=\"yes\">✅ (本地)</td><td>看硬件</td><td>完全私有部署</td></tr>\n <tr><td><strong>LM Studio</strong></td><td class=\"yes\">✅ (本地)</td><td>看硬件</td><td>便捷本地模型管理</td></tr>\n </tbody>\n </table>\n <div style=\"display:grid;gap:8px;align-content:start\">\n <div class=\"quote-block\">一行切换:改 <code>PROVIDER_BASE_URL</code>、<code>PROVIDER_API_KEY</code>、<code>PROVIDER_MODEL</code> 三个环境变量。除 Ollama 外所有提供商共用同一套配置模板。</div>\n <div class=\"card\">\n <div class=\"tagrow\"><span class=\"tag dark\">.env</span><span class=\"tag purple\">Configuration</span></div>\n <h3>示例:切换到 DeepSeek</h3>\n <pre style=\"font-size:12px;line-height:1.5;background:#f5f2eb;padding:10px;border:1px solid var(--line);overflow-x:auto\">PROVIDER_BASE_URL=https://api.deepseek.com/v1\nPROVIDER_API_KEY=sk-...\nPROVIDER_MODEL=deepseek-chat</pre>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no g\">03</div>\n <div class=\"section-meta\">\n <div class=\"label g\">QUICK SETUP</div>\n <h2>60 秒上手引导</h2>\n <p>三条命令、一个交互式向导,从头到位零手动配置。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <div class=\"card\" style=\"background:var(--soft-blue)\">\n <div class=\"tagrow\"><span class=\"tag blue\">One-liner</span><span class=\"tag dark\">Step 1–3</span></div>\n <h3>三行命令开始</h3>\n <pre style=\"font-size:12px;line-height:1.5;background:#fff;padding:10px;border:1px solid var(--line);overflow-x:auto\">git clone https://github.com/ajsai47/backdoor\ncd backdoor\n./backdoor # 一步步向导</pre>\n <p><strong>向导会做什么:</strong>动画开场 → 选择提供商 → 输入 API key → 写入配置 → 启动 Claude Code。想手动配置?复制 <code>.env.example</code> → 填写 → 运行 <code>./run.sh</code>。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-orange)\">\n <div class=\"tagrow\"><span class=\"tag orange\">Telegram</span><span class=\"tag dark\">Mobile</span></div>\n <h3>Bonus:手机控制 Claude Code</h3>\n <p>设置 <code>TELEGRAM_BOT_TOKEN</code> 和 <code>TELEGRAM_ALLOWED_USER_ID</code> 环境变量,即可从 Telegram 发送 prompt 并在聊天中接收 Claude Code 输出。</p>\n <p style=\"color:#8c5200;font-weight:850;font-size:13px\">一个从手机上触发编码任务、在移动端获取编码结果的完整闭环。</p>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no o\">04</div>\n <div class=\"section-meta\">\n <div class=\"label o\">ARCHITECTURE</div>\n <h2>工作原理:代理层的协议桥接</h2>\n <p>Claude Code 认为自己在和 Anthropic API 通信。实际上 Backdoor 在本地做了实时协议翻译。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <div class=\"flow-v\">\n <div class=\"flow-item purple\"><div class=\"t\">Step 1</div><div class=\"c\">Claude Code 发送请求到 localhost:8082</div></div>\n <div class=\"flow-item green\"><div class=\"t\">Step 2</div><div class=\"c\">Backdoor 接收请求,从 Messages API 格式翻译为 OpenAI chat completions</div></div>\n <div class=\"flow-item blue\"><div class=\"t\">Step 3</div><div class=\"c\">转发到选择的提供商(DeepSeek/Groq/Ollama/...)</div></div>\n <div class=\"flow-item orange\"><div class=\"t\">Step 4</div><div class=\"c\">流式回传:结果实时翻译回 Anthropic SSE 格式。工具调用、delta、token 计数全部透明。</div></div>\n </div>\n <div>\n <div class=\"card\">\n <div class=\"tagrow\"><span class=\"tag dark\">Housekeeping</span><span class=\"tag purple\">Short-circuit</span></div>\n <h3>内部请求本地短路</h3>\n <p>Claude Code 的部分内部请求(quota 探测、标题生成等)被 Backdoor 识别并在本地拦截,不消耗你的提供商配额。免费层用户特别受益于此。</p>\n </div>\n <div class=\"card\" style=\"margin-top:12px\">\n <div class=\"tagrow\"><span class=\"tag blue\">Troubleshooting</span><span class=\"tag orange\">Common</span></div>\n <h3>常见问题速查</h3>\n <ul>\n <li><strong>Proxy failed to start</strong> — 端口 8082 被占用,改 <code>PORT=8083</code></li>\n <li><strong>Model not found / 404</strong> — PROVIDER_MODEL 名称不正确(例:DeepSeek 用 <code>deepseek-chat</code>)</li>\n <li><strong>响应慢</strong> — 切换到 Groq,最快推理 + 免费层</li>\n <li><strong>查看日志</strong> — 检查 <code>proxy.log</code>;为空则直接运行 <code>uv run uvicorn server:app</code></li>\n </ul>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no\">05</div>\n <div class=\"section-meta\">\n <div class=\"label\">OPEN SOURCE & COMMUNITY</div>\n <h2>MIT 开源,零附随条件</h2>\n <p>代码简洁、可读、可 fork。如果明天一个新 AI 提供商上线,当天就能用上。</p>\n </div>\n </div>\n <div class=\"grid-3\">\n <div class=\"card\" style=\"background:var(--soft-purple)\">\n <div class=\"tagrow\"><span class=\"tag purple\">代码量</span><span class=\"tag dark\">&lt;600 lines</span></div>\n <h3>可审计的简洁代码</h3>\n <p>读得懂的 600 行 Python。没有黑盒、没有隐藏端点、没有遥测。你可以逐行审计它做了什么。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-green)\">\n <div class=\"tagrow\"><span class=\"tag green\">许可</span><span class=\"tag dark\">MIT</span></div>\n <h3>真正的开放</h3>\n <p>MIT 许可。Fork it、改它、用它构建你的产品。没有限制,没有 Strings attached。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-orange)\">\n <div class=\"tagrow\"><span class=\"tag orange\">未来就绪</span><span class=\"tag dark\">New Provider</span></div>\n <h3>当天接入新提供商</h3>\n <p>新 AI 提供商发布当天就能用。不用等 PR merge,直接改 <code>PROVIDER_BASE_URL</code> 就行。</p>\n </div>\n </div>\n <div class=\"quote-block\" style=\"margin-top:14px;background:var(--soft-purple);border-color:var(--purple)\">\n <strong>Claude Code is the best coding agent ever built. The model underneath is optional.</strong> — Backdoor 的核心理念。Harness 免费、模型按需选择。学生、个人开发者、预算受限地区的用户,都应该用上最好的编码工具。\n </div>\n </section>\n\n <div class=\"rule\"></div>\n <p class=\"source-note\">ajsai47/backdoor · MIT License · Python · 3 commands · Any provider · <a href=\"https://github.com/ajsai47/backdoor\">github.com/ajsai47/backdoor</a></p>\n </main>\n</body>\n</html>"}, "b73be24d470c568c16db3c0a9fa3c5453f833764": {"t": 1785772851.8767753, "n": 23891, "h": "c7e699f6346c3278", "c": "<!doctype html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Backdoor · Claude Code Proxy</title>\n <style>\n :root{\n --canvas:#f7f2e8; --paper:#fffdf8; --ink:#0c1220; --line:#111111;\n --purple:#6e3fd6; --green:#2e9b4b; --blue:#2e6be6; --orange:#f59e0b; --yellow:#f5d46b;\n --soft-purple:#f2ecff; --soft-green:#eefbf1; --soft-blue:#eef4ff; --soft-orange:#fff4e6;\n --shadow:8px 8px 0 rgba(17,17,17,.12);\n }\n *{box-sizing:border-box;margin:0;padding:0}\n html,body{margin:0;overflow-x:hidden}\n body{\n color:var(--ink);line-height:1.58;font-family:Inter,system-ui,-apple-system,\"PingFang SC\",\"Microsoft YaHei\",\"Segoe UI\",Arial,sans-serif;\n background:\n linear-gradient(rgba(17,17,17,.04) 1px, transparent 1px) 0 0/100% 42px,\n linear-gradient(90deg, rgba(17,17,17,.04) 1px, transparent 1px) 0 0/42px 100%,\n radial-gradient(circle at 10% 8%, rgba(110,63,214,.06) 0 11%, transparent 12%),\n radial-gradient(circle at 86% 10%, rgba(46,155,75,.05) 0 10%, transparent 11%),\n linear-gradient(180deg,#faf4e9 0,#f7f2e8 100%);\n }\n img{display:block;max-width:100%}\n a{color:inherit;text-decoration:none}\n code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}\n .page{width:min(1180px, calc(100% - 20px));margin:0 auto;padding:18px 0 88px}\n\n .hero{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(0,1.12fr) minmax(0,.82fr);gap:14px;border:3px solid var(--line);background:var(--paper);overflow:hidden;box-shadow:var(--shadow)}\n .hero-bar{grid-column:1/-1;height:14px;background:#111;border-bottom:3px solid var(--line);position:relative}\n .hero-bar::before{content:\"\";position:absolute;inset:0 auto 0 0;width:180px;background:var(--purple)}\n .hero-bar::after{content:\"\";position:absolute;inset:0 0 0 auto;width:150px;background:var(--blue)}\n .hero-copy{padding:16px;border-right:3px solid var(--line);display:grid;gap:10px;align-content:start}\n .kicker{display:inline-flex;align-items:center;gap:8px;width:fit-content;border:2px solid var(--line);background:#fff;padding:5px 9px;font-size:11px;font-weight:900;letter-spacing:.18em;text-transform:uppercase}\n .kicker::before{content:\"■\";color:var(--purple);font-size:10px}\n h1.demo-title{margin:0;max-width:820px;font-size:clamp(24px,3.7vw,44px);line-height:.98;letter-spacing:-.05em}\n .subtitle{color:#4d5567;font-size:12.5px;line-height:1.55}\n .badge-row{display:flex;flex-wrap:wrap;gap:6px}\n .badge{display:inline-flex;align-items:center;min-height:28px;padding:5px 9px;border:2px solid var(--line);background:#fff;font-size:11.6px;font-weight:850}\n .badge.purple{background:var(--purple);color:#fff}\n .badge.blue{background:var(--blue);color:#fff}\n .badge.green{background:var(--green);color:#fff}\n .badge.orange{background:var(--orange);color:#111}\n .badge.dark{background:#111;color:#fff}\n .badge.ink{background:#111;color:#fff;font-size:11px;min-height:24px;padding:4px 8px}\n .alert{border:2px solid var(--line);background:#111;color:#fff;padding:10px 12px;display:grid;gap:8px;box-shadow:var(--shadow)}\n .alert strong{display:block;font-size:13.5px;line-height:1.35}\n .alert p{margin:0;font-size:12.5px;line-height:1.62;color:#f0ebe0}\n .mini-row{display:flex;flex-wrap:wrap;gap:6px}\n .mini-tag{display:inline-flex;align-items:center;border:1.5px solid #fff;padding:4px 8px;font-size:11px;font-weight:850;line-height:1;background:#111;color:#fff}\n\n .architecture-column{background:#fff;display:grid;grid-template-rows:auto 1fr}\n .panel-top{padding:14px;border-bottom:3px solid var(--line);background:linear-gradient(135deg,#0f1320 0%,#151a2b 100%);color:#fff}\n .panel-top .eyebrow{display:inline-flex;align-items:center;border:1.5px solid #fff;padding:3px 8px;font-size:10.8px;font-weight:900;letter-spacing:.16em;text-transform:uppercase}\n .panel-top h3{margin:10px 0 6px;font-size:20px;line-height:1.08;letter-spacing:-.04em}\n .panel-top p{margin:0;color:#ece8dc;font-size:13px;line-height:1.64}\n .panel-body{padding:14px;display:grid;gap:10px;background:#f7f6f2}\n .quote{border-left:4px solid var(--blue);padding:10px 12px;background:var(--soft-blue);font-weight:750;line-height:1.58}\n .cost-compare{display:grid;gap:8px}\n .cost-row{border:2px solid var(--line);background:#fff;padding:10px 12px;display:grid;gap:3px;box-shadow:4px 4px 0 rgba(17,17,17,.08)}\n .cost-row .l{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:#5d6472;font-weight:900}\n .cost-row .v{font-size:22px;font-weight:950;line-height:1.1;letter-spacing:-.04em}\n .cost-row .v.purple{color:var(--purple)}\n .cost-row .v.green{color:var(--green)}\n .cost-row .v.orange{color:var(--orange)}\n .cost-row .note{font-size:13px;line-height:1.5;color:#222}\n\n .summary-rail{background:#111;color:#fff;display:grid;grid-template-rows:auto 1fr;overflow:hidden}\n .summary-head{padding:14px;border-bottom:3px solid #0c0c0c;background:linear-gradient(180deg,#141414,#111)}\n .summary-head h3{font-size:20px;line-height:1.08;letter-spacing:-.04em;margin:0 0 6px}\n .summary-head p{margin:0;color:#e8e0d3;font-size:12.8px;line-height:1.6}\n .summary-body{padding:14px;display:grid;gap:10px;background:#151515}\n .summary-card{border:1.5px solid rgba(255,255,255,.14);background:#1a1a1a;padding:12px;display:grid;gap:6px}\n .summary-card .t{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase;color:#d7d7d7}\n .summary-card .t::before{content:\"■\"}\n .summary-card p{margin:0;color:#ece8dc;font-size:12.6px;line-height:1.62}\n .summary-card.purple .t::before{color:var(--purple)}\n .summary-card.green .t::before{color:var(--green)}\n .summary-card.blue .t::before{color:var(--blue)}\n .summary-card.orange .t::before{color:var(--orange)}\n .github{border:2px solid #fff;background:#fff;color:#111;padding:12px;display:grid;gap:8px}\n .github .small{font-size:10.8px;font-weight:900;letter-spacing:.16em;text-transform:uppercase;color:#666}\n .github .num{font-size:30px;line-height:1;font-weight:950;letter-spacing:-.04em;color:var(--purple)}\n\n .section{margin-top:30px;border-top:3px solid var(--line);padding-top:14px}\n .section-head{display:grid;grid-template-columns:96px 1fr;gap:14px;align-items:start;margin-bottom:12px}\n .section-no{display:grid;place-items:center;width:96px;height:96px;border:3px solid var(--line);background:var(--purple);color:#fff;font-size:34px;font-weight:950;line-height:1;box-shadow:var(--shadow)}\n .section-no.b{background:var(--blue)}\n .section-no.g{background:var(--green)}\n .section-no.o{background:var(--orange);color:#111}\n .section-meta{display:grid;gap:7px;padding-top:4px}\n .section-meta .label{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--purple);font-weight:900}\n .section-meta .label.b{color:var(--blue)}\n .section-meta .label.g{color:var(--green)}\n .section-meta .label.o{color:var(--orange)}\n .section-meta h2{margin:0;font-size:clamp(22px,3.7vw,38px);line-height:1.02;letter-spacing:-.05em}\n .section-meta p{margin:0;color:#5d6472;font-size:14px;line-height:1.62;max-width:980px}\n\n .grid-2,.grid-3,.grid-4{display:grid;gap:12px}\n .grid-2{grid-template-columns:repeat(2,minmax(0,1fr))}\n .grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}\n .grid-4{grid-template-columns:repeat(4,minmax(0,1fr))}\n .card,.mini{border:2px solid var(--line);background:#fff;min-width:0;box-shadow:var(--shadow)}\n .card,.mini{padding:14px}\n .card{display:grid;gap:10px}\n .card h3,.mini h4{margin:0;letter-spacing:-.02em}\n .card h3{font-size:17px;line-height:1.16}\n .card p,.mini p{margin:0;font-size:14px;color:#222;line-height:1.66}\n .card ul,.mini ul{margin:0;padding-left:0;list-style-position:inside}\n .card li,.mini li{margin:4px 0;font-size:14px;color:#222;line-height:1.66}\n .tagrow{display:flex;flex-wrap:wrap;gap:6px}\n .tag{display:inline-flex;align-items:center;gap:6px;border:2px solid var(--line);padding:4px 8px;background:#fff;font-size:11.6px;font-weight:850;line-height:1}\n .tag.purple{background:var(--soft-purple);border-color:var(--purple);color:var(--purple)}\n .tag.green{background:var(--soft-green);border-color:var(--green);color:var(--green)}\n .tag.blue{background:var(--soft-blue);border-color:var(--blue);color:var(--blue)}\n .tag.orange{background:var(--soft-orange);border-color:var(--orange);color:#8c5200}\n .tag.dark{background:#111;color:#fff}\n\n .matrix{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}\n .matrix .mini{display:grid;gap:8px}\n .mini h4{font-size:15px;line-height:1.2}\n .mini .lead{font-size:13px;color:#5d6472;font-weight:850;letter-spacing:.04em;text-transform:uppercase}\n .mini .quote-line{border-left:4px solid var(--purple);padding-left:10px;font-weight:900;line-height:1.58}\n\n .flow-v{display:grid;gap:8px}\n .flow-item{border:2px solid var(--line);background:#fff;padding:10px 12px;display:grid;gap:3px;position:relative;box-shadow:4px 4px 0 rgba(17,17,17,.08)}\n .flow-item::after{content:\"↓\";position:absolute;left:14px;bottom:-17px;color:var(--blue);font-size:15px;font-weight:900}\n .flow-item:last-child::after{display:none}\n .flow-item .t{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:#5d6472;font-weight:900}\n .flow-item .c{font-size:14px;line-height:1.55;font-weight:900}\n .flow-item.purple .c{color:var(--purple)}\n .flow-item.green .c{color:var(--green)}\n .flow-item.blue .c{color:var(--blue)}\n .flow-item.orange .c{color:var(--orange)}\n\n .quote-block{border-left:4px solid var(--blue);padding:12px 14px;background:var(--soft-blue);font-size:14px;line-height:1.72;box-shadow:var(--shadow)}\n .spec-table{width:100%;border-collapse:collapse;font-size:13px;line-height:1.6}\n .spec-table th,.spec-table td{border:2px solid var(--line);padding:8px 10px;text-align:left;background:#fff}\n .spec-table th{background:#111;color:#fff;font-weight:850;font-size:11.6px;letter-spacing:.08em;text-transform:uppercase}\n .spec-table .yes{color:var(--green);font-weight:900}\n .spec-table .no{color:#aaa}\n .rule{height:3px;background:#111;margin:8px 0 0}\n .source-note{margin-top:18px;text-align:center;color:#5d6472;font-size:12.5px;line-height:1.62}\n\n @media (max-width:1080px){\n .hero{grid-template-columns:1fr}\n .hero-copy{border-right:0;border-bottom:3px solid var(--line)}\n .summary-rail{border-top:3px solid #0c0c0c}\n .grid-4,.matrix{grid-template-columns:repeat(2,minmax(0,1fr))}\n }\n @media (max-width:720px){\n .page{width:min(100% - 16px,1180px);padding:10px 0 60px}\n .hero{display:flex;flex-direction:column}\n .hero-copy{padding:16px;border-right:0;border-top:3px solid var(--line)}\n .grid-4,.grid-3,.grid-2,.matrix{grid-template-columns:1fr}\n .section-head{grid-template-columns:1fr;gap:10px}\n .section-no{width:72px;height:72px;font-size:28px}\n .card,.mini,.alert{padding-left:12px;padding-right:12px}\n .spec-table{font-size:12px}\n .spec-table th,.spec-table td{padding:5px 6px}\n }\n </style>\n</head>\n<body>\n <main class=\"page\">\n\n <header class=\"hero\">\n <div class=\"hero-bar\"></div>\n <div class=\"hero-copy\">\n <div class=\"kicker\">BACKDOOR · CLAUDE CODE PROXY</div>\n <h1 class=\"demo-title\">Run Claude Code Against Any AI Provider</h1>\n <p class=\"subtitle\">Backdoor 是一个轻量级代理,拦截 Claude Code 的 Anthropic API 调用,路由到任何 OpenAI 兼容的提供商。DeepSeek、Groq、Ollama、OpenRouter — 你选。同一 UI、同一工具、同一 agentic loop,零锁定。</p>\n <div class=\"badge-row\">\n <span class=\"badge purple\">DeepSeek</span>\n <span class=\"badge green\">Groq</span>\n <span class=\"badge blue\">Ollama</span>\n <span class=\"badge orange\">OpenRouter</span>\n </div>\n <div class=\"badge-row\">\n <span class=\"badge dark\">NVIDIA NIM</span>\n <span class=\"badge ink\">LM Studio</span>\n <span class=\"badge ink\">200+ Models</span>\n <span class=\"badge ink\">Telegram Control</span>\n </div>\n <div class=\"alert\">\n <strong>最好的编码 agent,搭配你选的模型</strong>\n <p>Claude Code 是目前最好的 coding agent — 工具调用、agentic 循环、代码库导航能力无可匹敌。Backdoor 解除了它和 Anthropic API 的硬绑定,让你用任何模型、任何价格跑同一个 ui。</p>\n <div class=\"mini-row\">\n <span class=\"mini-tag\">Zero Lock-in</span>\n <span class=\"mini-tag\">99.95% Cheaper</span>\n <span class=\"mini-tag\">&lt;600 LOC</span>\n </div>\n </div>\n </div>\n\n <section class=\"architecture-column\">\n <div class=\"panel-top\">\n <div class=\"eyebrow\">COST COMPARISON</div>\n <h3>500M Tokens · Same Workload</h3>\n <p>Backdoor 实测数据:同一 task 负载跑过 500M tokens,两种后端的费用差距。</p>\n </div>\n <div class=\"panel-body\">\n <div class=\"cost-compare\">\n <div class=\"cost-row\">\n <div class=\"l\">Claude Opus 4.7</div>\n <div class=\"v purple\">$9,834</div>\n <div class=\"note\">~$19.67 / 1M tokens</div>\n </div>\n <div class=\"cost-row\">\n <div class=\"l\">DeepSeek V3 Flash</div>\n <div class=\"v green\">$5.34</div>\n <div class=\"note\">~$0.01 / 1M tokens — <strong>99.95% cheaper</strong></div>\n </div>\n </div>\n <div class=\"quote\">$9,834 vs $5.34 — 近 2,000x 成本差距。个人开发者从\"肉疼\"变\"忽略不计\",团队从小没预算变随便跑。</div>\n <div class=\"cost-row\" style=\"border-color:var(--purple)\">\n <div class=\"l\">NVIDIA NIM / Groq 免费层</div>\n <div class=\"v green\">$0</div>\n <div class=\"note\">月数千次请求免费 — 零成本上手。</div>\n </div>\n </div>\n </section>\n\n <aside class=\"summary-rail\">\n <div class=\"summary-head\">\n <h3>为什么选择 Backdoor</h3>\n <p>Claude Code 的 harness 是免费的。背后跑什么模型,由你决定。</p>\n </div>\n <div class=\"summary-body\">\n <article class=\"summary-card purple\">\n <div class=\"t\">完全免费层</div>\n <p>NVIDIA NIM 和 Groq 都有免费层,月数千次请求。开箱即用,零成本启动。</p>\n </article>\n <article class=\"summary-card green\">\n <div class=\"t\">成本降低 95%+</div>\n <p>DeepSeek 比 Claude API 便宜约 95%。从\"一杯咖啡\"变成\"忽略不计\"。</p>\n </article>\n <article class=\"summary-card blue\">\n <div class=\"t\">完全本地私密</div>\n <p>指向本地 Ollama 实例,数据永远不会离开你的机器。无 API、无日志、无传输。</p>\n </article>\n <article class=\"summary-card orange\">\n <div class=\"t\">200+ 模型,一把钥匙</div>\n <p>通过 OpenRouter 接入 Gemini、Grok、Qwen 等所有主流模型,单一 API key。</p>\n </article>\n <div class=\"github\">\n <div class=\"small\">GitHub / Backdoor</div>\n <div class=\"num\">288</div>\n <div style=\"font-size:12.4px;line-height:1.55\">stars · 30 forks · MIT · Python · 3 commands to set up</div>\n </div>\n </div>\n </aside>\n </header>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no\">01</div>\n <div class=\"section-meta\">\n <div class=\"label\">THE PROBLEM & THE FIX</div>\n <h2>锁定的代价与解耦的方案</h2>\n <p>Claude Code 硬绑定到 Anthropic API。你付 Anthropic 的价格、用 Anthropic 的模型、受 Anthropic 的规则约束。Backdoor 在中间做了一层透明的协议转换。</p>\n </div>\n </div>\n <div class=\"grid-3\">\n <article class=\"card\">\n <div class=\"tagrow\"><span class=\"tag purple\">Before</span><span class=\"tag dark\">Lock-in</span></div>\n <h3>锁定状态</h3>\n <p>Claude Code → Anthropic API → $$$。最高质量的 coding agent 只有一种后端选择。</p>\n <ul>\n <li>单一 API 定价无竞争</li>\n <li>模型更新节奏随 Anthropic</li>\n <li>高成本限制使用规模</li>\n </ul>\n </article>\n <article class=\"card\" style=\"border-color:var(--green)\">\n <div class=\"tagrow\"><span class=\"tag green\">After</span><span class=\"tag dark\">Freedom</span></div>\n <h3>解耦方案</h3>\n <p>Claude Code → Backdoor → 任意 OpenAI 兼容提供商。零改动、零配置切换。</p>\n <ul>\n <li>一行 .env 切换提供商</li>\n <li>支持 DeepSeek/Groq/NVIDIA/Ollama</li>\n <li>代码 &lt; 600 行,完全透明</li>\n </ul>\n </article>\n <article class=\"card\">\n <div class=\"tagrow\"><span class=\"tag orange\">核心洞察</span><span class=\"tag dark\">Why</span></div>\n <h3>Agent Harness > 模型</h3>\n <p>Claude Code 真正强大的是它的工具调用系统和 agentic loop。模型是可更换的。</p>\n <ul>\n <li>最好的 harness + 最便宜的模型 = 最优解</li>\n <li>不否定 Anthropic,而是让更多人能用上</li>\n <li>MIT 开源,任何人都能参与改进</li>\n </ul>\n </article>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no b\">02</div>\n <div class=\"section-meta\">\n <div class=\"label b\">PROVIDER MATRIX</div>\n <h2>支持的提供商一览</h2>\n <p>修改 .env 中三行配置即可切换后端。覆盖免费层、本地部署和商业 API 三种场景。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <table class=\"spec-table\">\n <thead>\n <tr><th>提供商</th><th>免费层</th><th>速度</th><th>最适合</th></tr>\n </thead>\n <tbody>\n <tr><td><strong>DeepSeek</strong></td><td class=\"no\">—</td><td>快</td><td>极致性价比</td></tr>\n <tr><td><strong>Groq</strong></td><td class=\"yes\">✅</td><td>最快</td><td>即时响应场景</td></tr>\n <tr><td><strong>NVIDIA NIM</strong></td><td class=\"yes\">✅</td><td>快</td><td>免费 Llama 3.3 70B</td></tr>\n <tr><td><strong>OpenRouter</strong></td><td class=\"no\">—</td><td>因模型而异</td><td>一把钥匙通所有</td></tr>\n <tr><td><strong>Ollama</strong></td><td class=\"yes\">✅ (本地)</td><td>看硬件</td><td>完全私有部署</td></tr>\n <tr><td><strong>LM Studio</strong></td><td class=\"yes\">✅ (本地)</td><td>看硬件</td><td>便捷本地模型管理</td></tr>\n </tbody>\n </table>\n <div style=\"display:grid;gap:8px;align-content:start\">\n <div class=\"quote-block\">一行切换:改 <code>PROVIDER_BASE_URL</code>、<code>PROVIDER_API_KEY</code>、<code>PROVIDER_MODEL</code> 三个环境变量。除 Ollama 外所有提供商共用同一套配置模板。</div>\n <div class=\"card\">\n <div class=\"tagrow\"><span class=\"tag dark\">.env</span><span class=\"tag purple\">Configuration</span></div>\n <h3>示例:切换到 DeepSeek</h3>\n <pre style=\"font-size:12px;line-height:1.5;background:#f5f2eb;padding:10px;border:1px solid var(--line);overflow-x:auto\">PROVIDER_BASE_URL=https://api.deepseek.com/v1\nPROVIDER_API_KEY=sk-...\nPROVIDER_MODEL=deepseek-chat</pre>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no g\">03</div>\n <div class=\"section-meta\">\n <div class=\"label g\">QUICK SETUP</div>\n <h2>60 秒上手引导</h2>\n <p>三条命令、一个交互式向导,从头到位零手动配置。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <div class=\"card\" style=\"background:var(--soft-blue)\">\n <div class=\"tagrow\"><span class=\"tag blue\">One-liner</span><span class=\"tag dark\">Step 1–3</span></div>\n <h3>三行命令开始</h3>\n <pre style=\"font-size:12px;line-height:1.5;background:#fff;padding:10px;border:1px solid var(--line);overflow-x:auto\">git clone https://github.com/ajsai47/backdoor\ncd backdoor\n./backdoor # 一步步向导</pre>\n <p><strong>向导会做什么:</strong>动画开场 → 选择提供商 → 输入 API key → 写入配置 → 启动 Claude Code。想手动配置?复制 <code>.env.example</code> → 填写 → 运行 <code>./run.sh</code>。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-orange)\">\n <div class=\"tagrow\"><span class=\"tag orange\">Telegram</span><span class=\"tag dark\">Mobile</span></div>\n <h3>Bonus:手机控制 Claude Code</h3>\n <p>设置 <code>TELEGRAM_BOT_TOKEN</code> 和 <code>TELEGRAM_ALLOWED_USER_ID</code> 环境变量,即可从 Telegram 发送 prompt 并在聊天中接收 Claude Code 输出。</p>\n <p style=\"color:#8c5200;font-weight:850;font-size:13px\">一个从手机上触发编码任务、在移动端获取编码结果的完整闭环。</p>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no o\">04</div>\n <div class=\"section-meta\">\n <div class=\"label o\">ARCHITECTURE</div>\n <h2>工作原理:代理层的协议桥接</h2>\n <p>Claude Code 认为自己在和 Anthropic API 通信。实际上 Backdoor 在本地做了实时协议翻译。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <div class=\"flow-v\">\n <div class=\"flow-item purple\"><div class=\"t\">Step 1</div><div class=\"c\">Claude Code 发送请求到 localhost:8082</div></div>\n <div class=\"flow-item green\"><div class=\"t\">Step 2</div><div class=\"c\">Backdoor 接收请求,从 Messages API 格式翻译为 OpenAI chat completions</div></div>\n <div class=\"flow-item blue\"><div class=\"t\">Step 3</div><div class=\"c\">转发到选择的提供商(DeepSeek/Groq/Ollama/...)</div></div>\n <div class=\"flow-item orange\"><div class=\"t\">Step 4</div><div class=\"c\">流式回传:结果实时翻译回 Anthropic SSE 格式。工具调用、delta、token 计数全部透明。</div></div>\n </div>\n <div>\n <div class=\"card\">\n <div class=\"tagrow\"><span class=\"tag dark\">Housekeeping</span><span class=\"tag purple\">Short-circuit</span></div>\n <h3>内部请求本地短路</h3>\n <p>Claude Code 的部分内部请求(quota 探测、标题生成等)被 Backdoor 识别并在本地拦截,不消耗你的提供商配额。免费层用户特别受益于此。</p>\n </div>\n <div class=\"card\" style=\"margin-top:12px\">\n <div class=\"tagrow\"><span class=\"tag blue\">Troubleshooting</span><span class=\"tag orange\">Common</span></div>\n <h3>常见问题速查</h3>\n <ul>\n <li><strong>Proxy failed to start</strong> — 端口 8082 被占用,改 <code>PORT=8083</code></li>\n <li><strong>Model not found / 404</strong> — PROVIDER_MODEL 名称不正确(例:DeepSeek 用 <code>deepseek-chat</code>)</li>\n <li><strong>响应慢</strong> — 切换到 Groq,最快推理 + 免费层</li>\n <li><strong>查看日志</strong> — 检查 <code>proxy.log</code>;为空则直接运行 <code>uv run uvicorn server:app</code></li>\n </ul>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no\">05</div>\n <div class=\"section-meta\">\n <div class=\"label\">OPEN SOURCE & COMMUNITY</div>\n <h2>MIT 开源,零附随条件</h2>\n <p>代码简洁、可读、可 fork。如果明天一个新 AI 提供商上线,当天就能用上。</p>\n </div>\n </div>\n <div class=\"grid-3\">\n <div class=\"card\" style=\"background:var(--soft-purple)\">\n <div class=\"tagrow\"><span class=\"tag purple\">代码量</span><span class=\"tag dark\">&lt;600 lines</span></div>\n <h3>可审计的简洁代码</h3>\n <p>读得懂的 600 行 Python。没有黑盒、没有隐藏端点、没有遥测。你可以逐行审计它做了什么。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-green)\">\n <div class=\"tagrow\"><span class=\"tag green\">许可</span><span class=\"tag dark\">MIT</span></div>\n <h3>真正的开放</h3>\n <p>MIT 许可。Fork it、改它、用它构建你的产品。没有限制,没有 Strings attached。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-orange)\">\n <div class=\"tagrow\"><span class=\"tag orange\">未来就绪</span><span class=\"tag dark\">New Provider</span></div>\n <h3>当天接入新提供商</h3>\n <p>新 AI 提供商发布当天就能用。不用等 PR merge,直接改 <code>PROVIDER_BASE_URL</code> 就行。</p>\n </div>\n </div>\n <div class=\"quote-block\" style=\"margin-top:14px;background:var(--soft-purple);border-color:var(--purple)\">\n <strong>Claude Code is the best coding agent ever built. The model underneath is optional.</strong> — Backdoor 的核心理念。Harness 免费、模型按需选择。学生、个人开发者、预算受限地区的用户,都应该用上最好的编码工具。\n </div>\n </section>\n\n <div class=\"rule\"></div>\n <p class=\"source-note\">ajsai47/backdoor · MIT License · Python · 3 commands · Any provider · <a href=\"https://github.com/ajsai47/backdoor\">github.com/ajsai47/backdoor</a></p>\n </main>\n</body>\n</html>"}, "796595564792d611f3c9bda6b7bdb73a556020ec": {"t": 1786068154.9117942, "n": 23891, "h": "c7e699f6346c3278", "c": "<!doctype html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Backdoor · Claude Code Proxy</title>\n <style>\n :root{\n --canvas:#f7f2e8; --paper:#fffdf8; --ink:#0c1220; --line:#111111;\n --purple:#6e3fd6; --green:#2e9b4b; --blue:#2e6be6; --orange:#f59e0b; --yellow:#f5d46b;\n --soft-purple:#f2ecff; --soft-green:#eefbf1; --soft-blue:#eef4ff; --soft-orange:#fff4e6;\n --shadow:8px 8px 0 rgba(17,17,17,.12);\n }\n *{box-sizing:border-box;margin:0;padding:0}\n html,body{margin:0;overflow-x:hidden}\n body{\n color:var(--ink);line-height:1.58;font-family:Inter,system-ui,-apple-system,\"PingFang SC\",\"Microsoft YaHei\",\"Segoe UI\",Arial,sans-serif;\n background:\n linear-gradient(rgba(17,17,17,.04) 1px, transparent 1px) 0 0/100% 42px,\n linear-gradient(90deg, rgba(17,17,17,.04) 1px, transparent 1px) 0 0/42px 100%,\n radial-gradient(circle at 10% 8%, rgba(110,63,214,.06) 0 11%, transparent 12%),\n radial-gradient(circle at 86% 10%, rgba(46,155,75,.05) 0 10%, transparent 11%),\n linear-gradient(180deg,#faf4e9 0,#f7f2e8 100%);\n }\n img{display:block;max-width:100%}\n a{color:inherit;text-decoration:none}\n code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}\n .page{width:min(1180px, calc(100% - 20px));margin:0 auto;padding:18px 0 88px}\n\n .hero{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(0,1.12fr) minmax(0,.82fr);gap:14px;border:3px solid var(--line);background:var(--paper);overflow:hidden;box-shadow:var(--shadow)}\n .hero-bar{grid-column:1/-1;height:14px;background:#111;border-bottom:3px solid var(--line);position:relative}\n .hero-bar::before{content:\"\";position:absolute;inset:0 auto 0 0;width:180px;background:var(--purple)}\n .hero-bar::after{content:\"\";position:absolute;inset:0 0 0 auto;width:150px;background:var(--blue)}\n .hero-copy{padding:16px;border-right:3px solid var(--line);display:grid;gap:10px;align-content:start}\n .kicker{display:inline-flex;align-items:center;gap:8px;width:fit-content;border:2px solid var(--line);background:#fff;padding:5px 9px;font-size:11px;font-weight:900;letter-spacing:.18em;text-transform:uppercase}\n .kicker::before{content:\"■\";color:var(--purple);font-size:10px}\n h1.demo-title{margin:0;max-width:820px;font-size:clamp(24px,3.7vw,44px);line-height:.98;letter-spacing:-.05em}\n .subtitle{color:#4d5567;font-size:12.5px;line-height:1.55}\n .badge-row{display:flex;flex-wrap:wrap;gap:6px}\n .badge{display:inline-flex;align-items:center;min-height:28px;padding:5px 9px;border:2px solid var(--line);background:#fff;font-size:11.6px;font-weight:850}\n .badge.purple{background:var(--purple);color:#fff}\n .badge.blue{background:var(--blue);color:#fff}\n .badge.green{background:var(--green);color:#fff}\n .badge.orange{background:var(--orange);color:#111}\n .badge.dark{background:#111;color:#fff}\n .badge.ink{background:#111;color:#fff;font-size:11px;min-height:24px;padding:4px 8px}\n .alert{border:2px solid var(--line);background:#111;color:#fff;padding:10px 12px;display:grid;gap:8px;box-shadow:var(--shadow)}\n .alert strong{display:block;font-size:13.5px;line-height:1.35}\n .alert p{margin:0;font-size:12.5px;line-height:1.62;color:#f0ebe0}\n .mini-row{display:flex;flex-wrap:wrap;gap:6px}\n .mini-tag{display:inline-flex;align-items:center;border:1.5px solid #fff;padding:4px 8px;font-size:11px;font-weight:850;line-height:1;background:#111;color:#fff}\n\n .architecture-column{background:#fff;display:grid;grid-template-rows:auto 1fr}\n .panel-top{padding:14px;border-bottom:3px solid var(--line);background:linear-gradient(135deg,#0f1320 0%,#151a2b 100%);color:#fff}\n .panel-top .eyebrow{display:inline-flex;align-items:center;border:1.5px solid #fff;padding:3px 8px;font-size:10.8px;font-weight:900;letter-spacing:.16em;text-transform:uppercase}\n .panel-top h3{margin:10px 0 6px;font-size:20px;line-height:1.08;letter-spacing:-.04em}\n .panel-top p{margin:0;color:#ece8dc;font-size:13px;line-height:1.64}\n .panel-body{padding:14px;display:grid;gap:10px;background:#f7f6f2}\n .quote{border-left:4px solid var(--blue);padding:10px 12px;background:var(--soft-blue);font-weight:750;line-height:1.58}\n .cost-compare{display:grid;gap:8px}\n .cost-row{border:2px solid var(--line);background:#fff;padding:10px 12px;display:grid;gap:3px;box-shadow:4px 4px 0 rgba(17,17,17,.08)}\n .cost-row .l{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:#5d6472;font-weight:900}\n .cost-row .v{font-size:22px;font-weight:950;line-height:1.1;letter-spacing:-.04em}\n .cost-row .v.purple{color:var(--purple)}\n .cost-row .v.green{color:var(--green)}\n .cost-row .v.orange{color:var(--orange)}\n .cost-row .note{font-size:13px;line-height:1.5;color:#222}\n\n .summary-rail{background:#111;color:#fff;display:grid;grid-template-rows:auto 1fr;overflow:hidden}\n .summary-head{padding:14px;border-bottom:3px solid #0c0c0c;background:linear-gradient(180deg,#141414,#111)}\n .summary-head h3{font-size:20px;line-height:1.08;letter-spacing:-.04em;margin:0 0 6px}\n .summary-head p{margin:0;color:#e8e0d3;font-size:12.8px;line-height:1.6}\n .summary-body{padding:14px;display:grid;gap:10px;background:#151515}\n .summary-card{border:1.5px solid rgba(255,255,255,.14);background:#1a1a1a;padding:12px;display:grid;gap:6px}\n .summary-card .t{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase;color:#d7d7d7}\n .summary-card .t::before{content:\"■\"}\n .summary-card p{margin:0;color:#ece8dc;font-size:12.6px;line-height:1.62}\n .summary-card.purple .t::before{color:var(--purple)}\n .summary-card.green .t::before{color:var(--green)}\n .summary-card.blue .t::before{color:var(--blue)}\n .summary-card.orange .t::before{color:var(--orange)}\n .github{border:2px solid #fff;background:#fff;color:#111;padding:12px;display:grid;gap:8px}\n .github .small{font-size:10.8px;font-weight:900;letter-spacing:.16em;text-transform:uppercase;color:#666}\n .github .num{font-size:30px;line-height:1;font-weight:950;letter-spacing:-.04em;color:var(--purple)}\n\n .section{margin-top:30px;border-top:3px solid var(--line);padding-top:14px}\n .section-head{display:grid;grid-template-columns:96px 1fr;gap:14px;align-items:start;margin-bottom:12px}\n .section-no{display:grid;place-items:center;width:96px;height:96px;border:3px solid var(--line);background:var(--purple);color:#fff;font-size:34px;font-weight:950;line-height:1;box-shadow:var(--shadow)}\n .section-no.b{background:var(--blue)}\n .section-no.g{background:var(--green)}\n .section-no.o{background:var(--orange);color:#111}\n .section-meta{display:grid;gap:7px;padding-top:4px}\n .section-meta .label{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--purple);font-weight:900}\n .section-meta .label.b{color:var(--blue)}\n .section-meta .label.g{color:var(--green)}\n .section-meta .label.o{color:var(--orange)}\n .section-meta h2{margin:0;font-size:clamp(22px,3.7vw,38px);line-height:1.02;letter-spacing:-.05em}\n .section-meta p{margin:0;color:#5d6472;font-size:14px;line-height:1.62;max-width:980px}\n\n .grid-2,.grid-3,.grid-4{display:grid;gap:12px}\n .grid-2{grid-template-columns:repeat(2,minmax(0,1fr))}\n .grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}\n .grid-4{grid-template-columns:repeat(4,minmax(0,1fr))}\n .card,.mini{border:2px solid var(--line);background:#fff;min-width:0;box-shadow:var(--shadow)}\n .card,.mini{padding:14px}\n .card{display:grid;gap:10px}\n .card h3,.mini h4{margin:0;letter-spacing:-.02em}\n .card h3{font-size:17px;line-height:1.16}\n .card p,.mini p{margin:0;font-size:14px;color:#222;line-height:1.66}\n .card ul,.mini ul{margin:0;padding-left:0;list-style-position:inside}\n .card li,.mini li{margin:4px 0;font-size:14px;color:#222;line-height:1.66}\n .tagrow{display:flex;flex-wrap:wrap;gap:6px}\n .tag{display:inline-flex;align-items:center;gap:6px;border:2px solid var(--line);padding:4px 8px;background:#fff;font-size:11.6px;font-weight:850;line-height:1}\n .tag.purple{background:var(--soft-purple);border-color:var(--purple);color:var(--purple)}\n .tag.green{background:var(--soft-green);border-color:var(--green);color:var(--green)}\n .tag.blue{background:var(--soft-blue);border-color:var(--blue);color:var(--blue)}\n .tag.orange{background:var(--soft-orange);border-color:var(--orange);color:#8c5200}\n .tag.dark{background:#111;color:#fff}\n\n .matrix{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}\n .matrix .mini{display:grid;gap:8px}\n .mini h4{font-size:15px;line-height:1.2}\n .mini .lead{font-size:13px;color:#5d6472;font-weight:850;letter-spacing:.04em;text-transform:uppercase}\n .mini .quote-line{border-left:4px solid var(--purple);padding-left:10px;font-weight:900;line-height:1.58}\n\n .flow-v{display:grid;gap:8px}\n .flow-item{border:2px solid var(--line);background:#fff;padding:10px 12px;display:grid;gap:3px;position:relative;box-shadow:4px 4px 0 rgba(17,17,17,.08)}\n .flow-item::after{content:\"↓\";position:absolute;left:14px;bottom:-17px;color:var(--blue);font-size:15px;font-weight:900}\n .flow-item:last-child::after{display:none}\n .flow-item .t{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:#5d6472;font-weight:900}\n .flow-item .c{font-size:14px;line-height:1.55;font-weight:900}\n .flow-item.purple .c{color:var(--purple)}\n .flow-item.green .c{color:var(--green)}\n .flow-item.blue .c{color:var(--blue)}\n .flow-item.orange .c{color:var(--orange)}\n\n .quote-block{border-left:4px solid var(--blue);padding:12px 14px;background:var(--soft-blue);font-size:14px;line-height:1.72;box-shadow:var(--shadow)}\n .spec-table{width:100%;border-collapse:collapse;font-size:13px;line-height:1.6}\n .spec-table th,.spec-table td{border:2px solid var(--line);padding:8px 10px;text-align:left;background:#fff}\n .spec-table th{background:#111;color:#fff;font-weight:850;font-size:11.6px;letter-spacing:.08em;text-transform:uppercase}\n .spec-table .yes{color:var(--green);font-weight:900}\n .spec-table .no{color:#aaa}\n .rule{height:3px;background:#111;margin:8px 0 0}\n .source-note{margin-top:18px;text-align:center;color:#5d6472;font-size:12.5px;line-height:1.62}\n\n @media (max-width:1080px){\n .hero{grid-template-columns:1fr}\n .hero-copy{border-right:0;border-bottom:3px solid var(--line)}\n .summary-rail{border-top:3px solid #0c0c0c}\n .grid-4,.matrix{grid-template-columns:repeat(2,minmax(0,1fr))}\n }\n @media (max-width:720px){\n .page{width:min(100% - 16px,1180px);padding:10px 0 60px}\n .hero{display:flex;flex-direction:column}\n .hero-copy{padding:16px;border-right:0;border-top:3px solid var(--line)}\n .grid-4,.grid-3,.grid-2,.matrix{grid-template-columns:1fr}\n .section-head{grid-template-columns:1fr;gap:10px}\n .section-no{width:72px;height:72px;font-size:28px}\n .card,.mini,.alert{padding-left:12px;padding-right:12px}\n .spec-table{font-size:12px}\n .spec-table th,.spec-table td{padding:5px 6px}\n }\n </style>\n</head>\n<body>\n <main class=\"page\">\n\n <header class=\"hero\">\n <div class=\"hero-bar\"></div>\n <div class=\"hero-copy\">\n <div class=\"kicker\">BACKDOOR · CLAUDE CODE PROXY</div>\n <h1 class=\"demo-title\">Run Claude Code Against Any AI Provider</h1>\n <p class=\"subtitle\">Backdoor 是一个轻量级代理,拦截 Claude Code 的 Anthropic API 调用,路由到任何 OpenAI 兼容的提供商。DeepSeek、Groq、Ollama、OpenRouter — 你选。同一 UI、同一工具、同一 agentic loop,零锁定。</p>\n <div class=\"badge-row\">\n <span class=\"badge purple\">DeepSeek</span>\n <span class=\"badge green\">Groq</span>\n <span class=\"badge blue\">Ollama</span>\n <span class=\"badge orange\">OpenRouter</span>\n </div>\n <div class=\"badge-row\">\n <span class=\"badge dark\">NVIDIA NIM</span>\n <span class=\"badge ink\">LM Studio</span>\n <span class=\"badge ink\">200+ Models</span>\n <span class=\"badge ink\">Telegram Control</span>\n </div>\n <div class=\"alert\">\n <strong>最好的编码 agent,搭配你选的模型</strong>\n <p>Claude Code 是目前最好的 coding agent — 工具调用、agentic 循环、代码库导航能力无可匹敌。Backdoor 解除了它和 Anthropic API 的硬绑定,让你用任何模型、任何价格跑同一个 ui。</p>\n <div class=\"mini-row\">\n <span class=\"mini-tag\">Zero Lock-in</span>\n <span class=\"mini-tag\">99.95% Cheaper</span>\n <span class=\"mini-tag\">&lt;600 LOC</span>\n </div>\n </div>\n </div>\n\n <section class=\"architecture-column\">\n <div class=\"panel-top\">\n <div class=\"eyebrow\">COST COMPARISON</div>\n <h3>500M Tokens · Same Workload</h3>\n <p>Backdoor 实测数据:同一 task 负载跑过 500M tokens,两种后端的费用差距。</p>\n </div>\n <div class=\"panel-body\">\n <div class=\"cost-compare\">\n <div class=\"cost-row\">\n <div class=\"l\">Claude Opus 4.7</div>\n <div class=\"v purple\">$9,834</div>\n <div class=\"note\">~$19.67 / 1M tokens</div>\n </div>\n <div class=\"cost-row\">\n <div class=\"l\">DeepSeek V3 Flash</div>\n <div class=\"v green\">$5.34</div>\n <div class=\"note\">~$0.01 / 1M tokens — <strong>99.95% cheaper</strong></div>\n </div>\n </div>\n <div class=\"quote\">$9,834 vs $5.34 — 近 2,000x 成本差距。个人开发者从\"肉疼\"变\"忽略不计\",团队从小没预算变随便跑。</div>\n <div class=\"cost-row\" style=\"border-color:var(--purple)\">\n <div class=\"l\">NVIDIA NIM / Groq 免费层</div>\n <div class=\"v green\">$0</div>\n <div class=\"note\">月数千次请求免费 — 零成本上手。</div>\n </div>\n </div>\n </section>\n\n <aside class=\"summary-rail\">\n <div class=\"summary-head\">\n <h3>为什么选择 Backdoor</h3>\n <p>Claude Code 的 harness 是免费的。背后跑什么模型,由你决定。</p>\n </div>\n <div class=\"summary-body\">\n <article class=\"summary-card purple\">\n <div class=\"t\">完全免费层</div>\n <p>NVIDIA NIM 和 Groq 都有免费层,月数千次请求。开箱即用,零成本启动。</p>\n </article>\n <article class=\"summary-card green\">\n <div class=\"t\">成本降低 95%+</div>\n <p>DeepSeek 比 Claude API 便宜约 95%。从\"一杯咖啡\"变成\"忽略不计\"。</p>\n </article>\n <article class=\"summary-card blue\">\n <div class=\"t\">完全本地私密</div>\n <p>指向本地 Ollama 实例,数据永远不会离开你的机器。无 API、无日志、无传输。</p>\n </article>\n <article class=\"summary-card orange\">\n <div class=\"t\">200+ 模型,一把钥匙</div>\n <p>通过 OpenRouter 接入 Gemini、Grok、Qwen 等所有主流模型,单一 API key。</p>\n </article>\n <div class=\"github\">\n <div class=\"small\">GitHub / Backdoor</div>\n <div class=\"num\">288</div>\n <div style=\"font-size:12.4px;line-height:1.55\">stars · 30 forks · MIT · Python · 3 commands to set up</div>\n </div>\n </div>\n </aside>\n </header>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no\">01</div>\n <div class=\"section-meta\">\n <div class=\"label\">THE PROBLEM & THE FIX</div>\n <h2>锁定的代价与解耦的方案</h2>\n <p>Claude Code 硬绑定到 Anthropic API。你付 Anthropic 的价格、用 Anthropic 的模型、受 Anthropic 的规则约束。Backdoor 在中间做了一层透明的协议转换。</p>\n </div>\n </div>\n <div class=\"grid-3\">\n <article class=\"card\">\n <div class=\"tagrow\"><span class=\"tag purple\">Before</span><span class=\"tag dark\">Lock-in</span></div>\n <h3>锁定状态</h3>\n <p>Claude Code → Anthropic API → $$$。最高质量的 coding agent 只有一种后端选择。</p>\n <ul>\n <li>单一 API 定价无竞争</li>\n <li>模型更新节奏随 Anthropic</li>\n <li>高成本限制使用规模</li>\n </ul>\n </article>\n <article class=\"card\" style=\"border-color:var(--green)\">\n <div class=\"tagrow\"><span class=\"tag green\">After</span><span class=\"tag dark\">Freedom</span></div>\n <h3>解耦方案</h3>\n <p>Claude Code → Backdoor → 任意 OpenAI 兼容提供商。零改动、零配置切换。</p>\n <ul>\n <li>一行 .env 切换提供商</li>\n <li>支持 DeepSeek/Groq/NVIDIA/Ollama</li>\n <li>代码 &lt; 600 行,完全透明</li>\n </ul>\n </article>\n <article class=\"card\">\n <div class=\"tagrow\"><span class=\"tag orange\">核心洞察</span><span class=\"tag dark\">Why</span></div>\n <h3>Agent Harness > 模型</h3>\n <p>Claude Code 真正强大的是它的工具调用系统和 agentic loop。模型是可更换的。</p>\n <ul>\n <li>最好的 harness + 最便宜的模型 = 最优解</li>\n <li>不否定 Anthropic,而是让更多人能用上</li>\n <li>MIT 开源,任何人都能参与改进</li>\n </ul>\n </article>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no b\">02</div>\n <div class=\"section-meta\">\n <div class=\"label b\">PROVIDER MATRIX</div>\n <h2>支持的提供商一览</h2>\n <p>修改 .env 中三行配置即可切换后端。覆盖免费层、本地部署和商业 API 三种场景。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <table class=\"spec-table\">\n <thead>\n <tr><th>提供商</th><th>免费层</th><th>速度</th><th>最适合</th></tr>\n </thead>\n <tbody>\n <tr><td><strong>DeepSeek</strong></td><td class=\"no\">—</td><td>快</td><td>极致性价比</td></tr>\n <tr><td><strong>Groq</strong></td><td class=\"yes\">✅</td><td>最快</td><td>即时响应场景</td></tr>\n <tr><td><strong>NVIDIA NIM</strong></td><td class=\"yes\">✅</td><td>快</td><td>免费 Llama 3.3 70B</td></tr>\n <tr><td><strong>OpenRouter</strong></td><td class=\"no\">—</td><td>因模型而异</td><td>一把钥匙通所有</td></tr>\n <tr><td><strong>Ollama</strong></td><td class=\"yes\">✅ (本地)</td><td>看硬件</td><td>完全私有部署</td></tr>\n <tr><td><strong>LM Studio</strong></td><td class=\"yes\">✅ (本地)</td><td>看硬件</td><td>便捷本地模型管理</td></tr>\n </tbody>\n </table>\n <div style=\"display:grid;gap:8px;align-content:start\">\n <div class=\"quote-block\">一行切换:改 <code>PROVIDER_BASE_URL</code>、<code>PROVIDER_API_KEY</code>、<code>PROVIDER_MODEL</code> 三个环境变量。除 Ollama 外所有提供商共用同一套配置模板。</div>\n <div class=\"card\">\n <div class=\"tagrow\"><span class=\"tag dark\">.env</span><span class=\"tag purple\">Configuration</span></div>\n <h3>示例:切换到 DeepSeek</h3>\n <pre style=\"font-size:12px;line-height:1.5;background:#f5f2eb;padding:10px;border:1px solid var(--line);overflow-x:auto\">PROVIDER_BASE_URL=https://api.deepseek.com/v1\nPROVIDER_API_KEY=sk-...\nPROVIDER_MODEL=deepseek-chat</pre>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no g\">03</div>\n <div class=\"section-meta\">\n <div class=\"label g\">QUICK SETUP</div>\n <h2>60 秒上手引导</h2>\n <p>三条命令、一个交互式向导,从头到位零手动配置。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <div class=\"card\" style=\"background:var(--soft-blue)\">\n <div class=\"tagrow\"><span class=\"tag blue\">One-liner</span><span class=\"tag dark\">Step 1–3</span></div>\n <h3>三行命令开始</h3>\n <pre style=\"font-size:12px;line-height:1.5;background:#fff;padding:10px;border:1px solid var(--line);overflow-x:auto\">git clone https://github.com/ajsai47/backdoor\ncd backdoor\n./backdoor # 一步步向导</pre>\n <p><strong>向导会做什么:</strong>动画开场 → 选择提供商 → 输入 API key → 写入配置 → 启动 Claude Code。想手动配置?复制 <code>.env.example</code> → 填写 → 运行 <code>./run.sh</code>。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-orange)\">\n <div class=\"tagrow\"><span class=\"tag orange\">Telegram</span><span class=\"tag dark\">Mobile</span></div>\n <h3>Bonus:手机控制 Claude Code</h3>\n <p>设置 <code>TELEGRAM_BOT_TOKEN</code> 和 <code>TELEGRAM_ALLOWED_USER_ID</code> 环境变量,即可从 Telegram 发送 prompt 并在聊天中接收 Claude Code 输出。</p>\n <p style=\"color:#8c5200;font-weight:850;font-size:13px\">一个从手机上触发编码任务、在移动端获取编码结果的完整闭环。</p>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no o\">04</div>\n <div class=\"section-meta\">\n <div class=\"label o\">ARCHITECTURE</div>\n <h2>工作原理:代理层的协议桥接</h2>\n <p>Claude Code 认为自己在和 Anthropic API 通信。实际上 Backdoor 在本地做了实时协议翻译。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <div class=\"flow-v\">\n <div class=\"flow-item purple\"><div class=\"t\">Step 1</div><div class=\"c\">Claude Code 发送请求到 localhost:8082</div></div>\n <div class=\"flow-item green\"><div class=\"t\">Step 2</div><div class=\"c\">Backdoor 接收请求,从 Messages API 格式翻译为 OpenAI chat completions</div></div>\n <div class=\"flow-item blue\"><div class=\"t\">Step 3</div><div class=\"c\">转发到选择的提供商(DeepSeek/Groq/Ollama/...)</div></div>\n <div class=\"flow-item orange\"><div class=\"t\">Step 4</div><div class=\"c\">流式回传:结果实时翻译回 Anthropic SSE 格式。工具调用、delta、token 计数全部透明。</div></div>\n </div>\n <div>\n <div class=\"card\">\n <div class=\"tagrow\"><span class=\"tag dark\">Housekeeping</span><span class=\"tag purple\">Short-circuit</span></div>\n <h3>内部请求本地短路</h3>\n <p>Claude Code 的部分内部请求(quota 探测、标题生成等)被 Backdoor 识别并在本地拦截,不消耗你的提供商配额。免费层用户特别受益于此。</p>\n </div>\n <div class=\"card\" style=\"margin-top:12px\">\n <div class=\"tagrow\"><span class=\"tag blue\">Troubleshooting</span><span class=\"tag orange\">Common</span></div>\n <h3>常见问题速查</h3>\n <ul>\n <li><strong>Proxy failed to start</strong> — 端口 8082 被占用,改 <code>PORT=8083</code></li>\n <li><strong>Model not found / 404</strong> — PROVIDER_MODEL 名称不正确(例:DeepSeek 用 <code>deepseek-chat</code>)</li>\n <li><strong>响应慢</strong> — 切换到 Groq,最快推理 + 免费层</li>\n <li><strong>查看日志</strong> — 检查 <code>proxy.log</code>;为空则直接运行 <code>uv run uvicorn server:app</code></li>\n </ul>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no\">05</div>\n <div class=\"section-meta\">\n <div class=\"label\">OPEN SOURCE & COMMUNITY</div>\n <h2>MIT 开源,零附随条件</h2>\n <p>代码简洁、可读、可 fork。如果明天一个新 AI 提供商上线,当天就能用上。</p>\n </div>\n </div>\n <div class=\"grid-3\">\n <div class=\"card\" style=\"background:var(--soft-purple)\">\n <div class=\"tagrow\"><span class=\"tag purple\">代码量</span><span class=\"tag dark\">&lt;600 lines</span></div>\n <h3>可审计的简洁代码</h3>\n <p>读得懂的 600 行 Python。没有黑盒、没有隐藏端点、没有遥测。你可以逐行审计它做了什么。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-green)\">\n <div class=\"tagrow\"><span class=\"tag green\">许可</span><span class=\"tag dark\">MIT</span></div>\n <h3>真正的开放</h3>\n <p>MIT 许可。Fork it、改它、用它构建你的产品。没有限制,没有 Strings attached。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-orange)\">\n <div class=\"tagrow\"><span class=\"tag orange\">未来就绪</span><span class=\"tag dark\">New Provider</span></div>\n <h3>当天接入新提供商</h3>\n <p>新 AI 提供商发布当天就能用。不用等 PR merge,直接改 <code>PROVIDER_BASE_URL</code> 就行。</p>\n </div>\n </div>\n <div class=\"quote-block\" style=\"margin-top:14px;background:var(--soft-purple);border-color:var(--purple)\">\n <strong>Claude Code is the best coding agent ever built. The model underneath is optional.</strong> — Backdoor 的核心理念。Harness 免费、模型按需选择。学生、个人开发者、预算受限地区的用户,都应该用上最好的编码工具。\n </div>\n </section>\n\n <div class=\"rule\"></div>\n <p class=\"source-note\">ajsai47/backdoor · MIT License · Python · 3 commands · Any provider · <a href=\"https://github.com/ajsai47/backdoor\">github.com/ajsai47/backdoor</a></p>\n </main>\n</body>\n</html>"}, "3bd3e853268bc01b16e3e4be8f8fdafc135aa9e1": {"t": 1786068605.9774292, "n": 23891, "h": "c7e699f6346c3278", "c": "<!doctype html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Backdoor · Claude Code Proxy</title>\n <style>\n :root{\n --canvas:#f7f2e8; --paper:#fffdf8; --ink:#0c1220; --line:#111111;\n --purple:#6e3fd6; --green:#2e9b4b; --blue:#2e6be6; --orange:#f59e0b; --yellow:#f5d46b;\n --soft-purple:#f2ecff; --soft-green:#eefbf1; --soft-blue:#eef4ff; --soft-orange:#fff4e6;\n --shadow:8px 8px 0 rgba(17,17,17,.12);\n }\n *{box-sizing:border-box;margin:0;padding:0}\n html,body{margin:0;overflow-x:hidden}\n body{\n color:var(--ink);line-height:1.58;font-family:Inter,system-ui,-apple-system,\"PingFang SC\",\"Microsoft YaHei\",\"Segoe UI\",Arial,sans-serif;\n background:\n linear-gradient(rgba(17,17,17,.04) 1px, transparent 1px) 0 0/100% 42px,\n linear-gradient(90deg, rgba(17,17,17,.04) 1px, transparent 1px) 0 0/42px 100%,\n radial-gradient(circle at 10% 8%, rgba(110,63,214,.06) 0 11%, transparent 12%),\n radial-gradient(circle at 86% 10%, rgba(46,155,75,.05) 0 10%, transparent 11%),\n linear-gradient(180deg,#faf4e9 0,#f7f2e8 100%);\n }\n img{display:block;max-width:100%}\n a{color:inherit;text-decoration:none}\n code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}\n .page{width:min(1180px, calc(100% - 20px));margin:0 auto;padding:18px 0 88px}\n\n .hero{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(0,1.12fr) minmax(0,.82fr);gap:14px;border:3px solid var(--line);background:var(--paper);overflow:hidden;box-shadow:var(--shadow)}\n .hero-bar{grid-column:1/-1;height:14px;background:#111;border-bottom:3px solid var(--line);position:relative}\n .hero-bar::before{content:\"\";position:absolute;inset:0 auto 0 0;width:180px;background:var(--purple)}\n .hero-bar::after{content:\"\";position:absolute;inset:0 0 0 auto;width:150px;background:var(--blue)}\n .hero-copy{padding:16px;border-right:3px solid var(--line);display:grid;gap:10px;align-content:start}\n .kicker{display:inline-flex;align-items:center;gap:8px;width:fit-content;border:2px solid var(--line);background:#fff;padding:5px 9px;font-size:11px;font-weight:900;letter-spacing:.18em;text-transform:uppercase}\n .kicker::before{content:\"■\";color:var(--purple);font-size:10px}\n h1.demo-title{margin:0;max-width:820px;font-size:clamp(24px,3.7vw,44px);line-height:.98;letter-spacing:-.05em}\n .subtitle{color:#4d5567;font-size:12.5px;line-height:1.55}\n .badge-row{display:flex;flex-wrap:wrap;gap:6px}\n .badge{display:inline-flex;align-items:center;min-height:28px;padding:5px 9px;border:2px solid var(--line);background:#fff;font-size:11.6px;font-weight:850}\n .badge.purple{background:var(--purple);color:#fff}\n .badge.blue{background:var(--blue);color:#fff}\n .badge.green{background:var(--green);color:#fff}\n .badge.orange{background:var(--orange);color:#111}\n .badge.dark{background:#111;color:#fff}\n .badge.ink{background:#111;color:#fff;font-size:11px;min-height:24px;padding:4px 8px}\n .alert{border:2px solid var(--line);background:#111;color:#fff;padding:10px 12px;display:grid;gap:8px;box-shadow:var(--shadow)}\n .alert strong{display:block;font-size:13.5px;line-height:1.35}\n .alert p{margin:0;font-size:12.5px;line-height:1.62;color:#f0ebe0}\n .mini-row{display:flex;flex-wrap:wrap;gap:6px}\n .mini-tag{display:inline-flex;align-items:center;border:1.5px solid #fff;padding:4px 8px;font-size:11px;font-weight:850;line-height:1;background:#111;color:#fff}\n\n .architecture-column{background:#fff;display:grid;grid-template-rows:auto 1fr}\n .panel-top{padding:14px;border-bottom:3px solid var(--line);background:linear-gradient(135deg,#0f1320 0%,#151a2b 100%);color:#fff}\n .panel-top .eyebrow{display:inline-flex;align-items:center;border:1.5px solid #fff;padding:3px 8px;font-size:10.8px;font-weight:900;letter-spacing:.16em;text-transform:uppercase}\n .panel-top h3{margin:10px 0 6px;font-size:20px;line-height:1.08;letter-spacing:-.04em}\n .panel-top p{margin:0;color:#ece8dc;font-size:13px;line-height:1.64}\n .panel-body{padding:14px;display:grid;gap:10px;background:#f7f6f2}\n .quote{border-left:4px solid var(--blue);padding:10px 12px;background:var(--soft-blue);font-weight:750;line-height:1.58}\n .cost-compare{display:grid;gap:8px}\n .cost-row{border:2px solid var(--line);background:#fff;padding:10px 12px;display:grid;gap:3px;box-shadow:4px 4px 0 rgba(17,17,17,.08)}\n .cost-row .l{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:#5d6472;font-weight:900}\n .cost-row .v{font-size:22px;font-weight:950;line-height:1.1;letter-spacing:-.04em}\n .cost-row .v.purple{color:var(--purple)}\n .cost-row .v.green{color:var(--green)}\n .cost-row .v.orange{color:var(--orange)}\n .cost-row .note{font-size:13px;line-height:1.5;color:#222}\n\n .summary-rail{background:#111;color:#fff;display:grid;grid-template-rows:auto 1fr;overflow:hidden}\n .summary-head{padding:14px;border-bottom:3px solid #0c0c0c;background:linear-gradient(180deg,#141414,#111)}\n .summary-head h3{font-size:20px;line-height:1.08;letter-spacing:-.04em;margin:0 0 6px}\n .summary-head p{margin:0;color:#e8e0d3;font-size:12.8px;line-height:1.6}\n .summary-body{padding:14px;display:grid;gap:10px;background:#151515}\n .summary-card{border:1.5px solid rgba(255,255,255,.14);background:#1a1a1a;padding:12px;display:grid;gap:6px}\n .summary-card .t{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase;color:#d7d7d7}\n .summary-card .t::before{content:\"■\"}\n .summary-card p{margin:0;color:#ece8dc;font-size:12.6px;line-height:1.62}\n .summary-card.purple .t::before{color:var(--purple)}\n .summary-card.green .t::before{color:var(--green)}\n .summary-card.blue .t::before{color:var(--blue)}\n .summary-card.orange .t::before{color:var(--orange)}\n .github{border:2px solid #fff;background:#fff;color:#111;padding:12px;display:grid;gap:8px}\n .github .small{font-size:10.8px;font-weight:900;letter-spacing:.16em;text-transform:uppercase;color:#666}\n .github .num{font-size:30px;line-height:1;font-weight:950;letter-spacing:-.04em;color:var(--purple)}\n\n .section{margin-top:30px;border-top:3px solid var(--line);padding-top:14px}\n .section-head{display:grid;grid-template-columns:96px 1fr;gap:14px;align-items:start;margin-bottom:12px}\n .section-no{display:grid;place-items:center;width:96px;height:96px;border:3px solid var(--line);background:var(--purple);color:#fff;font-size:34px;font-weight:950;line-height:1;box-shadow:var(--shadow)}\n .section-no.b{background:var(--blue)}\n .section-no.g{background:var(--green)}\n .section-no.o{background:var(--orange);color:#111}\n .section-meta{display:grid;gap:7px;padding-top:4px}\n .section-meta .label{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--purple);font-weight:900}\n .section-meta .label.b{color:var(--blue)}\n .section-meta .label.g{color:var(--green)}\n .section-meta .label.o{color:var(--orange)}\n .section-meta h2{margin:0;font-size:clamp(22px,3.7vw,38px);line-height:1.02;letter-spacing:-.05em}\n .section-meta p{margin:0;color:#5d6472;font-size:14px;line-height:1.62;max-width:980px}\n\n .grid-2,.grid-3,.grid-4{display:grid;gap:12px}\n .grid-2{grid-template-columns:repeat(2,minmax(0,1fr))}\n .grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}\n .grid-4{grid-template-columns:repeat(4,minmax(0,1fr))}\n .card,.mini{border:2px solid var(--line);background:#fff;min-width:0;box-shadow:var(--shadow)}\n .card,.mini{padding:14px}\n .card{display:grid;gap:10px}\n .card h3,.mini h4{margin:0;letter-spacing:-.02em}\n .card h3{font-size:17px;line-height:1.16}\n .card p,.mini p{margin:0;font-size:14px;color:#222;line-height:1.66}\n .card ul,.mini ul{margin:0;padding-left:0;list-style-position:inside}\n .card li,.mini li{margin:4px 0;font-size:14px;color:#222;line-height:1.66}\n .tagrow{display:flex;flex-wrap:wrap;gap:6px}\n .tag{display:inline-flex;align-items:center;gap:6px;border:2px solid var(--line);padding:4px 8px;background:#fff;font-size:11.6px;font-weight:850;line-height:1}\n .tag.purple{background:var(--soft-purple);border-color:var(--purple);color:var(--purple)}\n .tag.green{background:var(--soft-green);border-color:var(--green);color:var(--green)}\n .tag.blue{background:var(--soft-blue);border-color:var(--blue);color:var(--blue)}\n .tag.orange{background:var(--soft-orange);border-color:var(--orange);color:#8c5200}\n .tag.dark{background:#111;color:#fff}\n\n .matrix{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}\n .matrix .mini{display:grid;gap:8px}\n .mini h4{font-size:15px;line-height:1.2}\n .mini .lead{font-size:13px;color:#5d6472;font-weight:850;letter-spacing:.04em;text-transform:uppercase}\n .mini .quote-line{border-left:4px solid var(--purple);padding-left:10px;font-weight:900;line-height:1.58}\n\n .flow-v{display:grid;gap:8px}\n .flow-item{border:2px solid var(--line);background:#fff;padding:10px 12px;display:grid;gap:3px;position:relative;box-shadow:4px 4px 0 rgba(17,17,17,.08)}\n .flow-item::after{content:\"↓\";position:absolute;left:14px;bottom:-17px;color:var(--blue);font-size:15px;font-weight:900}\n .flow-item:last-child::after{display:none}\n .flow-item .t{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:#5d6472;font-weight:900}\n .flow-item .c{font-size:14px;line-height:1.55;font-weight:900}\n .flow-item.purple .c{color:var(--purple)}\n .flow-item.green .c{color:var(--green)}\n .flow-item.blue .c{color:var(--blue)}\n .flow-item.orange .c{color:var(--orange)}\n\n .quote-block{border-left:4px solid var(--blue);padding:12px 14px;background:var(--soft-blue);font-size:14px;line-height:1.72;box-shadow:var(--shadow)}\n .spec-table{width:100%;border-collapse:collapse;font-size:13px;line-height:1.6}\n .spec-table th,.spec-table td{border:2px solid var(--line);padding:8px 10px;text-align:left;background:#fff}\n .spec-table th{background:#111;color:#fff;font-weight:850;font-size:11.6px;letter-spacing:.08em;text-transform:uppercase}\n .spec-table .yes{color:var(--green);font-weight:900}\n .spec-table .no{color:#aaa}\n .rule{height:3px;background:#111;margin:8px 0 0}\n .source-note{margin-top:18px;text-align:center;color:#5d6472;font-size:12.5px;line-height:1.62}\n\n @media (max-width:1080px){\n .hero{grid-template-columns:1fr}\n .hero-copy{border-right:0;border-bottom:3px solid var(--line)}\n .summary-rail{border-top:3px solid #0c0c0c}\n .grid-4,.matrix{grid-template-columns:repeat(2,minmax(0,1fr))}\n }\n @media (max-width:720px){\n .page{width:min(100% - 16px,1180px);padding:10px 0 60px}\n .hero{display:flex;flex-direction:column}\n .hero-copy{padding:16px;border-right:0;border-top:3px solid var(--line)}\n .grid-4,.grid-3,.grid-2,.matrix{grid-template-columns:1fr}\n .section-head{grid-template-columns:1fr;gap:10px}\n .section-no{width:72px;height:72px;font-size:28px}\n .card,.mini,.alert{padding-left:12px;padding-right:12px}\n .spec-table{font-size:12px}\n .spec-table th,.spec-table td{padding:5px 6px}\n }\n </style>\n</head>\n<body>\n <main class=\"page\">\n\n <header class=\"hero\">\n <div class=\"hero-bar\"></div>\n <div class=\"hero-copy\">\n <div class=\"kicker\">BACKDOOR · CLAUDE CODE PROXY</div>\n <h1 class=\"demo-title\">Run Claude Code Against Any AI Provider</h1>\n <p class=\"subtitle\">Backdoor 是一个轻量级代理,拦截 Claude Code 的 Anthropic API 调用,路由到任何 OpenAI 兼容的提供商。DeepSeek、Groq、Ollama、OpenRouter — 你选。同一 UI、同一工具、同一 agentic loop,零锁定。</p>\n <div class=\"badge-row\">\n <span class=\"badge purple\">DeepSeek</span>\n <span class=\"badge green\">Groq</span>\n <span class=\"badge blue\">Ollama</span>\n <span class=\"badge orange\">OpenRouter</span>\n </div>\n <div class=\"badge-row\">\n <span class=\"badge dark\">NVIDIA NIM</span>\n <span class=\"badge ink\">LM Studio</span>\n <span class=\"badge ink\">200+ Models</span>\n <span class=\"badge ink\">Telegram Control</span>\n </div>\n <div class=\"alert\">\n <strong>最好的编码 agent,搭配你选的模型</strong>\n <p>Claude Code 是目前最好的 coding agent — 工具调用、agentic 循环、代码库导航能力无可匹敌。Backdoor 解除了它和 Anthropic API 的硬绑定,让你用任何模型、任何价格跑同一个 ui。</p>\n <div class=\"mini-row\">\n <span class=\"mini-tag\">Zero Lock-in</span>\n <span class=\"mini-tag\">99.95% Cheaper</span>\n <span class=\"mini-tag\">&lt;600 LOC</span>\n </div>\n </div>\n </div>\n\n <section class=\"architecture-column\">\n <div class=\"panel-top\">\n <div class=\"eyebrow\">COST COMPARISON</div>\n <h3>500M Tokens · Same Workload</h3>\n <p>Backdoor 实测数据:同一 task 负载跑过 500M tokens,两种后端的费用差距。</p>\n </div>\n <div class=\"panel-body\">\n <div class=\"cost-compare\">\n <div class=\"cost-row\">\n <div class=\"l\">Claude Opus 4.7</div>\n <div class=\"v purple\">$9,834</div>\n <div class=\"note\">~$19.67 / 1M tokens</div>\n </div>\n <div class=\"cost-row\">\n <div class=\"l\">DeepSeek V3 Flash</div>\n <div class=\"v green\">$5.34</div>\n <div class=\"note\">~$0.01 / 1M tokens — <strong>99.95% cheaper</strong></div>\n </div>\n </div>\n <div class=\"quote\">$9,834 vs $5.34 — 近 2,000x 成本差距。个人开发者从\"肉疼\"变\"忽略不计\",团队从小没预算变随便跑。</div>\n <div class=\"cost-row\" style=\"border-color:var(--purple)\">\n <div class=\"l\">NVIDIA NIM / Groq 免费层</div>\n <div class=\"v green\">$0</div>\n <div class=\"note\">月数千次请求免费 — 零成本上手。</div>\n </div>\n </div>\n </section>\n\n <aside class=\"summary-rail\">\n <div class=\"summary-head\">\n <h3>为什么选择 Backdoor</h3>\n <p>Claude Code 的 harness 是免费的。背后跑什么模型,由你决定。</p>\n </div>\n <div class=\"summary-body\">\n <article class=\"summary-card purple\">\n <div class=\"t\">完全免费层</div>\n <p>NVIDIA NIM 和 Groq 都有免费层,月数千次请求。开箱即用,零成本启动。</p>\n </article>\n <article class=\"summary-card green\">\n <div class=\"t\">成本降低 95%+</div>\n <p>DeepSeek 比 Claude API 便宜约 95%。从\"一杯咖啡\"变成\"忽略不计\"。</p>\n </article>\n <article class=\"summary-card blue\">\n <div class=\"t\">完全本地私密</div>\n <p>指向本地 Ollama 实例,数据永远不会离开你的机器。无 API、无日志、无传输。</p>\n </article>\n <article class=\"summary-card orange\">\n <div class=\"t\">200+ 模型,一把钥匙</div>\n <p>通过 OpenRouter 接入 Gemini、Grok、Qwen 等所有主流模型,单一 API key。</p>\n </article>\n <div class=\"github\">\n <div class=\"small\">GitHub / Backdoor</div>\n <div class=\"num\">288</div>\n <div style=\"font-size:12.4px;line-height:1.55\">stars · 30 forks · MIT · Python · 3 commands to set up</div>\n </div>\n </div>\n </aside>\n </header>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no\">01</div>\n <div class=\"section-meta\">\n <div class=\"label\">THE PROBLEM & THE FIX</div>\n <h2>锁定的代价与解耦的方案</h2>\n <p>Claude Code 硬绑定到 Anthropic API。你付 Anthropic 的价格、用 Anthropic 的模型、受 Anthropic 的规则约束。Backdoor 在中间做了一层透明的协议转换。</p>\n </div>\n </div>\n <div class=\"grid-3\">\n <article class=\"card\">\n <div class=\"tagrow\"><span class=\"tag purple\">Before</span><span class=\"tag dark\">Lock-in</span></div>\n <h3>锁定状态</h3>\n <p>Claude Code → Anthropic API → $$$。最高质量的 coding agent 只有一种后端选择。</p>\n <ul>\n <li>单一 API 定价无竞争</li>\n <li>模型更新节奏随 Anthropic</li>\n <li>高成本限制使用规模</li>\n </ul>\n </article>\n <article class=\"card\" style=\"border-color:var(--green)\">\n <div class=\"tagrow\"><span class=\"tag green\">After</span><span class=\"tag dark\">Freedom</span></div>\n <h3>解耦方案</h3>\n <p>Claude Code → Backdoor → 任意 OpenAI 兼容提供商。零改动、零配置切换。</p>\n <ul>\n <li>一行 .env 切换提供商</li>\n <li>支持 DeepSeek/Groq/NVIDIA/Ollama</li>\n <li>代码 &lt; 600 行,完全透明</li>\n </ul>\n </article>\n <article class=\"card\">\n <div class=\"tagrow\"><span class=\"tag orange\">核心洞察</span><span class=\"tag dark\">Why</span></div>\n <h3>Agent Harness > 模型</h3>\n <p>Claude Code 真正强大的是它的工具调用系统和 agentic loop。模型是可更换的。</p>\n <ul>\n <li>最好的 harness + 最便宜的模型 = 最优解</li>\n <li>不否定 Anthropic,而是让更多人能用上</li>\n <li>MIT 开源,任何人都能参与改进</li>\n </ul>\n </article>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no b\">02</div>\n <div class=\"section-meta\">\n <div class=\"label b\">PROVIDER MATRIX</div>\n <h2>支持的提供商一览</h2>\n <p>修改 .env 中三行配置即可切换后端。覆盖免费层、本地部署和商业 API 三种场景。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <table class=\"spec-table\">\n <thead>\n <tr><th>提供商</th><th>免费层</th><th>速度</th><th>最适合</th></tr>\n </thead>\n <tbody>\n <tr><td><strong>DeepSeek</strong></td><td class=\"no\">—</td><td>快</td><td>极致性价比</td></tr>\n <tr><td><strong>Groq</strong></td><td class=\"yes\">✅</td><td>最快</td><td>即时响应场景</td></tr>\n <tr><td><strong>NVIDIA NIM</strong></td><td class=\"yes\">✅</td><td>快</td><td>免费 Llama 3.3 70B</td></tr>\n <tr><td><strong>OpenRouter</strong></td><td class=\"no\">—</td><td>因模型而异</td><td>一把钥匙通所有</td></tr>\n <tr><td><strong>Ollama</strong></td><td class=\"yes\">✅ (本地)</td><td>看硬件</td><td>完全私有部署</td></tr>\n <tr><td><strong>LM Studio</strong></td><td class=\"yes\">✅ (本地)</td><td>看硬件</td><td>便捷本地模型管理</td></tr>\n </tbody>\n </table>\n <div style=\"display:grid;gap:8px;align-content:start\">\n <div class=\"quote-block\">一行切换:改 <code>PROVIDER_BASE_URL</code>、<code>PROVIDER_API_KEY</code>、<code>PROVIDER_MODEL</code> 三个环境变量。除 Ollama 外所有提供商共用同一套配置模板。</div>\n <div class=\"card\">\n <div class=\"tagrow\"><span class=\"tag dark\">.env</span><span class=\"tag purple\">Configuration</span></div>\n <h3>示例:切换到 DeepSeek</h3>\n <pre style=\"font-size:12px;line-height:1.5;background:#f5f2eb;padding:10px;border:1px solid var(--line);overflow-x:auto\">PROVIDER_BASE_URL=https://api.deepseek.com/v1\nPROVIDER_API_KEY=sk-...\nPROVIDER_MODEL=deepseek-chat</pre>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no g\">03</div>\n <div class=\"section-meta\">\n <div class=\"label g\">QUICK SETUP</div>\n <h2>60 秒上手引导</h2>\n <p>三条命令、一个交互式向导,从头到位零手动配置。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <div class=\"card\" style=\"background:var(--soft-blue)\">\n <div class=\"tagrow\"><span class=\"tag blue\">One-liner</span><span class=\"tag dark\">Step 1–3</span></div>\n <h3>三行命令开始</h3>\n <pre style=\"font-size:12px;line-height:1.5;background:#fff;padding:10px;border:1px solid var(--line);overflow-x:auto\">git clone https://github.com/ajsai47/backdoor\ncd backdoor\n./backdoor # 一步步向导</pre>\n <p><strong>向导会做什么:</strong>动画开场 → 选择提供商 → 输入 API key → 写入配置 → 启动 Claude Code。想手动配置?复制 <code>.env.example</code> → 填写 → 运行 <code>./run.sh</code>。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-orange)\">\n <div class=\"tagrow\"><span class=\"tag orange\">Telegram</span><span class=\"tag dark\">Mobile</span></div>\n <h3>Bonus:手机控制 Claude Code</h3>\n <p>设置 <code>TELEGRAM_BOT_TOKEN</code> 和 <code>TELEGRAM_ALLOWED_USER_ID</code> 环境变量,即可从 Telegram 发送 prompt 并在聊天中接收 Claude Code 输出。</p>\n <p style=\"color:#8c5200;font-weight:850;font-size:13px\">一个从手机上触发编码任务、在移动端获取编码结果的完整闭环。</p>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no o\">04</div>\n <div class=\"section-meta\">\n <div class=\"label o\">ARCHITECTURE</div>\n <h2>工作原理:代理层的协议桥接</h2>\n <p>Claude Code 认为自己在和 Anthropic API 通信。实际上 Backdoor 在本地做了实时协议翻译。</p>\n </div>\n </div>\n <div class=\"grid-2\">\n <div class=\"flow-v\">\n <div class=\"flow-item purple\"><div class=\"t\">Step 1</div><div class=\"c\">Claude Code 发送请求到 localhost:8082</div></div>\n <div class=\"flow-item green\"><div class=\"t\">Step 2</div><div class=\"c\">Backdoor 接收请求,从 Messages API 格式翻译为 OpenAI chat completions</div></div>\n <div class=\"flow-item blue\"><div class=\"t\">Step 3</div><div class=\"c\">转发到选择的提供商(DeepSeek/Groq/Ollama/...)</div></div>\n <div class=\"flow-item orange\"><div class=\"t\">Step 4</div><div class=\"c\">流式回传:结果实时翻译回 Anthropic SSE 格式。工具调用、delta、token 计数全部透明。</div></div>\n </div>\n <div>\n <div class=\"card\">\n <div class=\"tagrow\"><span class=\"tag dark\">Housekeeping</span><span class=\"tag purple\">Short-circuit</span></div>\n <h3>内部请求本地短路</h3>\n <p>Claude Code 的部分内部请求(quota 探测、标题生成等)被 Backdoor 识别并在本地拦截,不消耗你的提供商配额。免费层用户特别受益于此。</p>\n </div>\n <div class=\"card\" style=\"margin-top:12px\">\n <div class=\"tagrow\"><span class=\"tag blue\">Troubleshooting</span><span class=\"tag orange\">Common</span></div>\n <h3>常见问题速查</h3>\n <ul>\n <li><strong>Proxy failed to start</strong> — 端口 8082 被占用,改 <code>PORT=8083</code></li>\n <li><strong>Model not found / 404</strong> — PROVIDER_MODEL 名称不正确(例:DeepSeek 用 <code>deepseek-chat</code>)</li>\n <li><strong>响应慢</strong> — 切换到 Groq,最快推理 + 免费层</li>\n <li><strong>查看日志</strong> — 检查 <code>proxy.log</code>;为空则直接运行 <code>uv run uvicorn server:app</code></li>\n </ul>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"section\">\n <div class=\"section-head\">\n <div class=\"section-no\">05</div>\n <div class=\"section-meta\">\n <div class=\"label\">OPEN SOURCE & COMMUNITY</div>\n <h2>MIT 开源,零附随条件</h2>\n <p>代码简洁、可读、可 fork。如果明天一个新 AI 提供商上线,当天就能用上。</p>\n </div>\n </div>\n <div class=\"grid-3\">\n <div class=\"card\" style=\"background:var(--soft-purple)\">\n <div class=\"tagrow\"><span class=\"tag purple\">代码量</span><span class=\"tag dark\">&lt;600 lines</span></div>\n <h3>可审计的简洁代码</h3>\n <p>读得懂的 600 行 Python。没有黑盒、没有隐藏端点、没有遥测。你可以逐行审计它做了什么。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-green)\">\n <div class=\"tagrow\"><span class=\"tag green\">许可</span><span class=\"tag dark\">MIT</span></div>\n <h3>真正的开放</h3>\n <p>MIT 许可。Fork it、改它、用它构建你的产品。没有限制,没有 Strings attached。</p>\n </div>\n <div class=\"card\" style=\"background:var(--soft-orange)\">\n <div class=\"tagrow\"><span class=\"tag orange\">未来就绪</span><span class=\"tag dark\">New Provider</span></div>\n <h3>当天接入新提供商</h3>\n <p>新 AI 提供商发布当天就能用。不用等 PR merge,直接改 <code>PROVIDER_BASE_URL</code> 就行。</p>\n </div>\n </div>\n <div class=\"quote-block\" style=\"margin-top:14px;background:var(--soft-purple);border-color:var(--purple)\">\n <strong>Claude Code is the best coding agent ever built. The model underneath is optional.</strong> — Backdoor 的核心理念。Harness 免费、模型按需选择。学生、个人开发者、预算受限地区的用户,都应该用上最好的编码工具。\n </div>\n </section>\n\n <div class=\"rule\"></div>\n <p class=\"source-note\">ajsai47/backdoor · MIT License · Python · 3 commands · Any provider · <a href=\"https://github.com/ajsai47/backdoor\">github.com/ajsai47/backdoor</a></p>\n </main>\n</body>\n</html>"}}}}