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 /_adminAdmin Dashboard(Logto SSO)04-28 19:35 从 / 移到隐藏路径
GET /userUser dashboard 兼容路由老链接保留
GET /callbackLogto OAuth 回调仍走 admin HTML,回调后跳 /_admin
POST /v1/messagesAnthropic 兼容(Claude Code 入口)ANTHROPIC_BASE_URL 接入
POST /v1/chat/completionsOpenAI 兼容(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/config04-28 新增:公开 wx 网关配置(base + app name)secret 不暴露
GET /api/wx/finalize04-28 新增:扫码回调,HMAC-SHA256 校验 + 5min 时间窗 + idempotent upsert wx_users302 → //?wx_pending=1
POST /user/bind-key04-28 新增:pending wx session 绑定一个 sk-proxy-… keypromote 同 cookie 不重新登录

架构演进时间线

2026-05-02 修 monthly_29 包月用户 5h 窗口过期不重置 bug

lib/quota-gate.mjswindowRolloverIfNeeded 之前没 export,server.mjs/user/plan/user/me 路由拿到 row 后都没调它 → 包月用户 5 小时滚动窗口过期后 window_used 不归零,看上去配额永远耗着。改动:

  • lib/quota-gate.mjsfunction windowRolloverIfNeededexport
  • server.mjs import 增加 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 检测 MicroMessenger UA 命中且非 error 回跳时直接 window.location = ${WX_GATEWAY_BASE}/wx/oauth/start?app=${WX_APP_NAME} 透传 ref;env 任一缺失静默 fallback 扫码 tab,不白屏
  • finalize 简化server.mjs):移除 recordWebhookNonce 一次性消费 gate(与”重复扫码连原 key”冲突);wx_users upsert 改 优先 unionid,openid 兜底(同一身份多公众号合并)
  • Dashboard 微信身份显示server.mjs /api/user/plan + public/user-dashboard.html/js):plan 接口按 openid 联表 wx_usersnickname / 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 透传字段 refext(04-30 21:45):user-dashboard.js:775 URL 拼接改 &ext=${encodeURIComponent(refCode)}&_t= 时间戳保留),server.mjs:395 finalize 同时兼容 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 解析 upstream capabilities + 合并 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.gitignoreproxy-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,不暴露 secret
  • GET /api/wx/finalizetiming-safe HMAC-SHA256 校验 token|openid|unionid|ts、5 min 时间窗、幂等 upsert wx_users 表;按是否绑定 API key 决定 302 到 //?wx_pending=1,并下发 user_session cookie
  • POST /user/bind-key — 绑定 pending wx session 与已有 sk-proxy-… key,原地 promote 同一 cookie 为正常 session(无需重新登录
  • lib/auth.mjsUSER_SESSIONS 改为 { keyHash, wxOpenid },新增 getUserSessionContext / createWxPendingSession / promoteUserSession
  • lib/database.mjs — 新建 wx_users 表;api_keys_v2wx_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>
claude

OpenClaw 消费方

~/.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 5771dbf7946dca未 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)

相关页面