对 GitHub Copilot API 进行逆向代理为一个与 OpenAI 和 Anthropic 兼容的服务

前言

本文演示如何将 GitHub Copilot API 通过一个反向工程代理转换为兼容 OpenAI Chat Completions 与 Anthropic Messages 的统一接口。完成部署后,您可以在 IDE 插件、OpenAI 兼容 SDK、Claude Code 等任意支持上述协议的工具中无缝调用 Copilot 模型。

快速概览

  • 适用场景:需要统一 AI 接口、复用 Copilot 模型能力的个人或团队。
  • 输出成果:一个监听 4141 端口的 HTTP 服务,兼容 OpenAI / Anthropic API 语义。
  • 核心依赖:Bun 运行时、GitHub Copilot 订阅、Linux 服务器、systemd 常驻。
  • 安全建议:放置在受控网络中,结合反向代理的 Basic Auth、IP 白名单或 HTTPS。

准备工作

准备项 说明
服务器环境 推荐 Ubuntu / Debian 云服务器,具备稳定网络(魔法或外网)与 1GB+ 内存。
GitHub Copilot 订阅 绑定的 GitHub 账号需具备 Copilot 权限(我是学生申请的 GitHub Pro),否则无法交换设备码。
域名(可选) 例如 copilot.yourdomain.com,配合反向代理暴露统一入口。
DNS & SSL(可选) 将域名解析到服务器并申请证书,保障公网访问的加密需求。
反向代理(可选) 准备 Nginx / Caddy,方便做限流、鉴权、日志审计。

克隆仓库与安装依赖

1. 克隆项目代码

建议在 ~/claude 目录中(自己创建)完成全部操作,便于后续维护:

1
2
3
mkdir -p ~/claude && cd ~/claude
git clone https://github.com/ericc-ch/copilot-api.git
cd copilot-api

2. 安装 Bun 并拉取依赖

若系统尚未安装 Bun,可使用官方一键脚本:

1
2
curl -fsSL https://bun.sh/install | bash
source ~/.bashrc

随后在项目目录执行:

1
bun install

终端会输出 Bun 版本、git hooks 配置及依赖清单,确认 455 packages installed(或类似字样)即代表安装完成。

提示:如服务器无法直接访问外网,可提前配置 HTTP(S) 代理或替换为离线镜像源。

首次启动与设备码登录

在项目根目录执行:

1
bun run ./src/main.ts start

首次运行会提示访问 https://github.com/login/device 并输入形如 071B-EF53 的设备码。浏览器授权完成后,终端会输出登录状态、模型清单与监听端口信息,并附带 Usage Viewer 入口:

1
2
3
4
5
6
ℹ Logged in as loveashui
ℹ Available models:
- gpt-4.1
- gpt-5.1-codex
...
➜ Listening on: http://localhost:4141/ (all interfaces)

提示:首次授权后凭据会写入 ~/.local/share/copilot-api。若需要更换账号,删除该目录即可重新登录。

此时服务处于前台运行,关闭终端会话后进程即终止。下一节将其改造成 systemd 常驻服务。

配置 systemd 实现常驻

systemd 能够在服务器重启后自动拉起进程,并在异常退出时自愈。建议按照以下步骤完成部署。

1. 完成一次认证

  • 交互式:执行 bun run ./src/main.ts auth,系统会将凭据写入 /root/.local/share/copilot-api
  • 非交互式:准备 GH_TOKEN 并在 systemd 服务中以环境变量方式注入,适合无头环境。

2. 创建 service 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
cat > /etc/systemd/system/copilot-api.service <<'EOF'
[Unit]
Description=Copilot API (OpenAI-compatible proxy for GitHub Copilot)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/claude/copilot-api

Environment=NODE_ENV=production
# 如使用非交互式认证,取消下一行注释并填入你的 GH_TOKEN
# Environment=GH_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# 如需走代理,可按需启用
# Environment=HTTP_PROXY=http://host:port
# Environment=HTTPS_PROXY=http://host:port
# Environment=NO_PROXY=localhost,127.0.0.1

# 关键:使用 Bun 的绝对路径,并带上 start 子命令
ExecStart=/root/.bun/bin/bun run ./src/main.ts start --port 4141 --verbose
Restart=always
RestartSec=3

# 基本加固(可选)
NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

3. 设置权限并验证语法

1
2
chmod 644 /etc/systemd/system/copilot-api.service
systemd-analyze verify /etc/systemd/system/copilot-api.service || echo "服务文件存在语法问题,请检查"

4. 重新加载并启动

1
2
3
systemctl daemon-reload
systemctl enable --now copilot-api
systemctl status copilot-api

systemctl status 会显示实时进程信息、内存占用及当前监听状态,便于确认服务是否成功拉起。

5. 跟踪实时日志

1
journalctl -u copilot-api -f

日志中同样会输出 Usage Viewer 链接与模型列表,可作为健康检查的参考指标。

排障建议:如 systemd-analyze verifysystemctl status 出现报错,优先检查 Bun 绝对路径、WorkingDirectory 是否准确,以及 GH_TOKEN 是否具备 Copilot 权限。

常见问题排查

  1. 端口占用:修改 service 中的 --port,并同步更新反向代理或安全组策略。
  2. 认证失效:删除 ~/.local/share/copilot-api 后重新执行 bun run ./src/main.ts auth;或刷新 GH_TOKEN
  3. 无法联网:为 systemd 服务注入 HTTP_PROXY / HTTPS_PROXY 环境变量或在服务器层面放行网络。
  4. 客户端 401/403:确认反向代理未剥离 Authorization 头,并保证请求路径与 OpenAI/Anthropic 规范一致。

结语与下一步

  • 通过上述步骤,Copilot Proxy 已以 OpenAI / Anthropic 兼容格式稳定运行,可直接在 SDK、IDE、应用后台中复用。
  • 建议在前端反向代理中增加 Basic Auth、IP 白名单,并启用 HTTPS,防止 Token 泄露。
  • 可结合官方 Usage Viewer https://ericc-ch.github.io/copilot-api?endpoint=http://localhost:4141/usage 观察实时用量。
  • 若计划暴露公网,请配套审计、限流与凭据信息脱敏策略,降低账号风险。