GitHub Copilot Anthropic Proxy
Resley 自建的 LLM 流量平台 — 把 GitHub Copilot 的 Claude 模型访问能力代理为本地 Anthropic 兼容 API 端点,对外向 OpenClaw / Claude Code 等消费方供 key。
项目信息
| 属性 | 值 |
|---|---|
| 仓库 | ~/projects/github-copilot-anthropic-proxy |
| 形态 | 纯 Node.js 单文件 + ESM lib/,无 package.json(暂) |
| 监听端口 | 4819(本地)/ 公开域名 api.eagle.openclaws.co.uk |
| 反代 | Caddy(HTTPS 终结) |
| 进程管理 | pm2 |
| 数据库 | better-sqlite3(proxy-logs.db) |
| 上线时间 | 2026-04-19 ±(截至 04-28 已跑 9 天) |
| 日处理量 | 累计 ~3.3 万请求(04-28 数据) |
| 现役下游 | stock-dashboard / OpenClaw agents 等 |
路由总览(截至 2026-04-28 23:00)
| 路径 | 用途 | 备注 |
|---|---|---|
GET / | User Dashboard(API key 登录入口) | 04-28 19:35 切换:原本是 admin |
GET /_admin | Admin Dashboard(Logto SSO) | 04-28 19:35 从 / 移到隐藏路径 |
GET /user | User dashboard 兼容路由 | 老链接保留 |
GET /callback | Logto OAuth 回调 | 仍走 admin HTML,回调后跳 /_admin |
POST /v1/messages | Anthropic 兼容(Claude Code 入口) | ANTHROPIC_BASE_URL 接入 |
POST /v1/chat/completions | OpenAI 兼容(OpenClaw / 通用接入) | provider=openai-completions |
GET /v1/models | 模型列表 | OpenAI 兼容 |
/api/keys /api/tokens | 多 Key / Token 管理 | keys-v2 |
/admin/* /user/* | 各自 dashboard 数据 API | |
/api/device-login/* | 设备登录流程 | |
GET /api/wx/config | 04-28 新增:公开 wx 网关配置(base + app name) | secret 不暴露 |
GET /api/wx/finalize | 04-28 新增:扫码回调,HMAC-SHA256 校验 + 5min 时间窗 + idempotent upsert wx_users | 302 → / 或 /?wx_pending=1 |
POST /user/bind-key | 04-28 新增:pending wx session 绑定一个 sk-proxy-… key | promote 同 cookie 不重新登录 |
架构演进时间线
2026-05-02 修 monthly_29 包月用户 5h 窗口过期不重置 bug
lib/quota-gate.mjs 的 windowRolloverIfNeeded 之前没 export,server.mjs 的 /user/plan 和 /user/me 路由拿到 row 后都没调它 → 包月用户 5 小时滚动窗口过期后 window_used 不归零,看上去配额永远耗着。改动:
lib/quota-gate.mjs给function windowRolloverIfNeeded加exportserver.mjsimport 增加windowRolloverIfNeeded;/user/plan(~L1721)和/user/me(~L1677)拿到row后,若row.plan_type === 'monthly_29'且未过期就调一次 — 函数就地改 row 并持久化,再返回前端- Dashboard 同步:滚动后
window_used立即反映新窗口
验证:rollover 持久化通过;commit 已 push。
2026-04-30 落地 wx 自动建 key + dashboard 接入(Hermes CLI 6 个 session)
承接 04-29 spec,Hermes CLI 端把当天派给 Claude Code 的活儿亲自落了 — 6 个 session、5 次 commit 级改动:
- 微信内置浏览器免扫码(
public/user-dashboard.js):登录区 init 检测MicroMessengerUA 命中且非 error 回跳时直接window.location = ${WX_GATEWAY_BASE}/wx/oauth/start?app=${WX_APP_NAME}透传ref;env 任一缺失静默 fallback 扫码 tab,不白屏 - finalize 简化(
server.mjs):移除recordWebhookNonce一次性消费 gate(与”重复扫码连原 key”冲突);wx_usersupsert 改 优先 unionid,openid 兜底(同一身份多公众号合并) - Dashboard 微信身份显示(
server.mjs /api/user/plan+public/user-dashboard.html/js):plan 接口按 openid 联表wx_users返nickname/avatarUrl;前端登录后顶部右侧渲染 32px 圆头像 + 昵称(无昵称回退 openid 短码) /user/me扩展 + header 头像统一:新增wx: {nickname, avatar_url, openid}字段(无绑定 →wx: null);#hdr-wx头像块随 me 数据加载;多 dashboard 共享同一 helper- dashboard 整理(commit -ish 04-30 15:41):删
dashboard.html顶部”模型 pill 列表”冗余区块(其他页面已有),public/dashboard.js两处modelStats渲染清空(保留 element 兜底,model filter 下拉仍正常用modelStats数据);public/dashboard.css加 header sticky / 防错位 + scrollbar 美化 - wx oauth 透传字段
ref→ext(04-30 21:45):user-dashboard.js:775URL 拼接改&ext=${encodeURIComponent(refCode)}(&_t=时间戳保留),server.mjs:395finalize 同时兼容sp.get("ext") || sp.get("ref")ext 优先;finalize 入口加日志[wx][finalize] openid=… ext=… ref=…— wx-gateway 那侧 query string 已统一用ext,proxy 这边对齐 /v1/models增强字段(04-30 21:53):原getModelRegistry({enabledOnly:true})直出,现按 OpenAI/Anthropic 通用结构补display_name/provider/protocol/created_at/context_window/max_output_tokens/max_input_tokens/input_modalities等。来源:models.raw_json解析 upstreamcapabilities+ 合并getAllPricing();缺字段合理 fallback / null
04-29 派 Claude Code 后台跑的”自动建 key + 营销 + 反薅”那批 spec,到 04-30 这批 CLI 改动里只覆盖了登录链路 + UI 接入部分,营销 banner / 邀请返利 / 反薅黑名单仍在 open loop。
Stage 4 完成(截至 2026-04-28 上午)
- 多 model + keys-v2(多 key 管理)
- Admin / User 双 dashboard
- pricing.json + 审计日志 + 配额
- 已脱离”单用户本地 proxy + 日志看板”形态
2026-04-28 README 重构(commit 1)
- 191 → 98 行,砍掉重复(功能概览 vs Dashboard 章节 / 数据存储字段表 / mock 接口)和过时(“扩展方向”已落地的 pm2 / 端口 env)
- 新增「路由速查」表覆盖所有
/v1/*/api/*/admin/*/user/*/api/device-login/* - 末尾添加 Claude Code + OpenClaw 接入示例(各 ≤15 行)
- 关键澄清:现有 OpenClaw provider(
~/.openclaw/agents/main/agent/models.json/auth-profiles.json)全部用baseUrl + apiKey + api: "openai-completions" + models[]格式,没有provider: "anthropic"范式 → 接入示例统一走 OpenAI 兼容协议(更准确)
2026-04-28 Dashboard Quick Start 卡片(commit 2)
public/dashboard.css加.qs-card / .qs-tabs / .qs-pre / .qs-copy,沿用现有--accent / --surface / --border变量dashboard.html(admin) +public/user-dashboard.html(user)顶部插同款「⚡ Quick Start · 接入指引」卡片- Tab 切换 Claude Code / OpenClaw,每段带 Copy 按钮(1.4s 反馈)
- base_url 写死
https://api.eagle.openclaws.co.uk,key 占位sk-你的key
2026-04-28 19:35 根路径切换(commit 5771dbf,未 push)
/和/index.html现在返回 user dashboard(API key 登录页)- admin 全套移到
/_admin/_admin//_admin/index.html /user/user/index.html兼容保留/callback仍走 admin HTML(Logto SPA client-side handle,无需改 Logto 控制台)- callback 成功后 redirect 与 signOut 改回
/_admin - README 路由速查与双 Dashboard 段落同步更新
事故插曲:第一轮 commit 误把两个 ~700MB 的 proxy-logs.db*.bad.* 文件加进去(rotated/损坏的 SQLite WAL 副本),git reset 重做最终只含 4 个源码文件。Open loop:.gitignore 加 proxy-logs.db*.bad.* 或干脆删掉,避免下次 git add -A 又被吞。
2026-04-29 07:54 微信扫码自动建 key + 营销 + 反薅(spec → 派 Claude Code 后台)
承接 04-28 微信扫码登录,砍掉 bind 屏:扫码 finalize 后直接为该 openid 自动建一个 sk-proxy-wx-… key 并落 api_keys_v2(重复扫码连原 key)。Resley 在 Discord 拍板后立即写 spec、派 Claude Code background(约 10-20 分钟),范围 = proxy 仓库 + wx-gateway 公众号侧文案。
决定要点(详见 decisions 04-29 段):
- 自动建 key — finalize 落库时按 unionid 去重(一人多公众号同身份),openid fallback;key 标记
source=wx_signup便于风控 - 30 万 token 赠送、永不重置 —
free_quota=300000,不写reset_at避免每月白嫖 - 营销 A + B + C 全要:
- A. 用完即升 banner(剩余 < 10% 展示”充值 ¥9.9 送 50 万 / ¥29 送 200 万”)
- B. 邀请返利(每邀请 1 个新 openid 注册,双方各 +5 万 token)
- C. 公众号侧”回复’更多额度‘“文案引导
- 反薅羊毛全开:同 IP 24h ≤ 3 个新 openid 注册(黑名单 + 风控 log);每 key 60 RPM;单 key 1h 烧完 30% 配额告警
- 跳过:unionid 去重最初纳入又被 Resley 取消(“那个可以不干”),只走 openid
派工后无后续聊天记录确认实际 commit / push 状态 → 见 Open loops。
2026-04-28 22:39 微信扫码登录(commit 7946dca,未 push)
接入统一网关 wx.mvp.restry.cn(详见 wx-gateway 接入 skill),让消费方扫微信二维码登录,首次微信登录的用户必须绑定一个已有 API key 才能进 dashboard。
后端改动:
- 顶部读
WX_GATEWAY_BASE/WX_GATEWAY_APP_NAME/WX_GATEWAY_SECRET,三者任缺则禁用微信登录但不崩(自动 graceful fallback 到 API key 登录) GET /api/wx/config— 公开配置端点,只暴露 base + app name,不暴露 secretGET /api/wx/finalize— timing-safe HMAC-SHA256 校验token|openid|unionid|ts、5 min 时间窗、幂等 upsertwx_users表;按是否绑定 API key 决定 302 到/或/?wx_pending=1,并下发user_sessioncookiePOST /user/bind-key— 绑定 pending wx session 与已有sk-proxy-…key,原地 promote 同一 cookie 为正常 session(无需重新登录)lib/auth.mjs—USER_SESSIONS改为{ keyHash, wxOpenid },新增getUserSessionContext/createWxPendingSession/promoteUserSessionlib/database.mjs— 新建wx_users表;api_keys_v2加wx_openid列(try/catch ALTER 兼容老库)
前端改动:
public/user-dashboard.html登录页改 Tab 切换:默认微信扫码,API Key fallback- 微信流:
POST {gateway}/wx/qr/{app}拿二维码 → SSE/wx/poll/{token}用es.onmessage(按 wx-gateway-integrate skill 强调,不用addEventListener("confirmed",...),二者行为不同) - expired / timeout / error 自动重拉
- 首次扫码用户进 bind 屏(独立屏幕),显示 openid 短码 + 昵称(如有)+ 输入框;绑定成功直接刷新进 dashboard
- 微信未配置时(gateway env 缺失)自动隐藏微信 tab,回退纯 API Key 登录
- URL 上
wx_pe...(pending 标志)触发 bind 屏
测试:写了 HMAC unit test(timing-safe + 时间窗)+ 用 WX_GATEWAY_SECRET 启 server 跑了 finalize 端到端 curl,全过;disabled fallback 测试也通过(302 → /?err=wx_disabled)。Single commit 不含任何明文 secret。
接入方式
Claude Code 消费方
export ANTHROPIC_BASE_URL=https://api.eagle.openclaws.co.uk
export ANTHROPIC_AUTH_TOKEN=sk-proxy-<your-key>
claudeOpenClaw 消费方
在 ~/.openclaw/agents/<name>/agent/models.json 添加 provider:
{
"provider": "copilot-proxy",
"api": "openai-completions",
"baseUrl": "https://api.eagle.openclaws.co.uk/v1",
"apiKey": "sk-proxy-<your-key>",
"models": ["claude-opus-4.6", "claude-sonnet-4"]
}走 OpenAI 兼容协议而不是 anthropic 协议 — 现有 OpenClaw provider 都是这个范式。
Open loops
- 两个 ~700MB 的
proxy-logs.db*.bad.*文件需要.gitignore或直接删 - 没有
package.json(“一键安装” 还得先写scripts/install.sh+ clone + node 检查 + pm2 起服务) commit 5771dbf与7946dca都未 push(按规则 push 需要 Daddy 批准)- 04-29 派的”自动建 key + 30 万送 + 营销 ABC + 反薅”中:登录/finalize/dashboard 已 04-30 落地(见时间线);营销 A 升级 banner / B 邀请返利 / C 公众号文案 + 反薅黑名单 / RPM 限制 / 烧配额告警仍未实现
- 04-28 系列改动改完未重启进程(pid 229096 仍跑老代码),等手动
pm2 restart - 长期方案:API key 登录的 session 设计 vs wx session 是否真的需要分屏?(当前 wx pending 用独立屏幕,未来可统一 UI)
相关页面
- multi-agent-architecture — 下游消费方之一
- trading-sim — 现役下游 stock-dashboard
- model-provider-config — OpenClaw 这边的 provider 选择
- decisions — 凭证不硬编码、API key 命名规范