StarryKira/copilot2api-go

GitHub: StarryKira/copilot2api-go

将 GitHub Copilot 转换为 OpenAI/Anthropic 兼容 API 的反向代理服务,支持多账号 Web 管理和负载均衡。

Stars: 8 | Forks: 2

# Copilot API Go [English](#english) | [中文](#中文) ## 英语 GitHub Copilot API 的逆向工程代理,使用 Go 重写。将 Copilot 暴露为 OpenAI 和 Anthropic 兼容的 API 服务,并提供用于管理和负载均衡的多账号 Web 控制台。 ### 功能特性 - **多账号管理**:用于添加、删除、启动和停止多个 GitHub Copilot 账号的 Web 控制台 - **Pool 模式负载均衡**:使用 Round-Robin 或 Priority 策略在账号间分发请求 - **OpenAI 兼容 API**:`/v1/chat/completions`、`/v1/models`、`/v1/embeddings` - **Anthropic 兼容 API**:`/v1/messages`、`/v1/messages/count_tokens` — 自动协议转换 - **模型 ID 映射**:Copilot 内部模型 ID 与标准显示 ID 之间的双向映射(例如 `claude-sonnet-4-20250514`) - **流式 SSE**:完整支持 OpenAI 和 Anthropic 格式的流式响应 - **GitHub OAuth Device Flow**:直接从 Web 控制台认证账号 - **管理员认证**:带会话管理的密码保护控制台 - **双语 Web UI**:支持英文和中文界面,自动检测 - **Docker Ready**:多阶段 Dockerfile,用于构建最小化的生产镜像 ### 快速开始 #### 从源代码 ``` # 构建 go build -o copilot-go . # 运行(从项目根目录,以便提供 web UI) ./copilot-go ``` #### Docker ``` # 构建镜像 docker build -t copilot-go . # 使用持久化数据运行 docker run -d \ -p 3000:3000 \ -p 4141:4141 \ -v copilot-data:/root/.local/share/copilot-api \ copilot-go ``` #### Docker Compose ``` services: copilot-go: build: . ports: - "3000:3000" - "4141:4141" volumes: - copilot-data:/root/.local/share/copilot-api restart: unless-stopped volumes: copilot-data: ``` ### 命令行选项 | 选项 | 默认值 | 描述 | |--------|---------|-------------| | `--web-port` | `3000` | Web 控制台端口 | | `--proxy-port` | `4141` | Proxy API 端口 | | `--verbose` | `false` | Enable verbose logging | | `--auto-start` | `true` | 启动时自动启动已启用的账号 | ### 使用方法 1. 打开 `http://localhost:3000` — 首次访问时创建管理员账号 2. 通过 OAuth device flow 添加 GitHub Copilot 账号 3. 启动账号实例 4. 使用账号的 API Key(或 Pool Key)调用代理 ### API 端点 #### OpenAI 兼容 | Endpoint | Method | 描述 | |----------|--------|-------------| | `/v1/chat/completions` | POST | Chat completions(支持 streaming) | | `/v1/models` | GET | 列出可用模型 | | `/v1/embeddings` | POST | 创建 embeddings | | `/chat/completions` | POST | 不带 `/v1` 前缀的别名 | | `/models` | GET | 不带 `/v1` 前缀的别名 | | `/embeddings` | POST | 不带 `/v1` 前缀的别名 | #### Anthropic 兼容 | Endpoint | Method | 描述 | |----------|--------|-------------| | `/v1/messages` | POST | Messages API(支持 streaming) | | `/v1/messages/count_tokens` | POST | Token 计数(估算) | #### 认证 所有代理端点都需要 Bearer token: ``` # 使用 Authorization header(OpenAI 风格) curl -H "Authorization: Bearer sk-your-api-key" ... # 使用 x-api-key header(Anthropic 风格) curl -H "x-api-key: sk-your-api-key" ... ``` ### 示例 #### OpenAI Chat Completions ``` curl http://localhost:4141/v1/chat/completions \ -H "Authorization: Bearer sk-your-api-key" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "messages": [{"role": "user", "content": "Hello!"}], "stream": true }' ``` #### Anthropic Messages ``` curl http://localhost:4141/v1/messages \ -H "x-api-key: sk-your-api-key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4", "max_tokens": 1024, "messages": [{"role": "user", "content": "Hello!"}] }' ``` #### Claude Code 集成 ``` ANTHROPIC_BASE_URL=http://localhost:4141 \ ANTHROPIC_API_KEY=sk-your-api-key \ claude ``` 或在你的项目中创建 `.claude/settings.json`: ``` { "env": { "ANTHROPIC_BASE_URL": "http://localhost:4141", "ANTHROPIC_AUTH_TOKEN": "sk-your-api-key", "ANTHROPIC_MODEL": "claude-sonnet-4", "ANTHROPIC_SMALL_FAST_MODEL": "gpt-4.1-mini" } } ``` ### Web Console API #### 公开端点 | Endpoint | Method | 描述 | |----------|--------|-------------| | `/api/config` | GET | 服务器配置(proxy port、setup status) | | `/api/auth/setup` | POST | 初始管理员设置 | | `/api/auth/login` | POST | 管理员登录 | #### 受保护端点(需要管理员会话 token) | Endpoint | Method | 描述 | |----------|--------|-------------| | `/api/auth/check` | GET | 验证会话 | | `/api/accounts` | GET | 列出所有账号及其状态 | | `/api/accounts/usage` | GET | 批量使用量查询 | | `/api/accounts/:id` | GET | 获取单个账号 | | `/api/accounts` | POST | 添加账号 | | `/api/accounts/:id` | PUT | 更新账号 | | `/api/accounts/:id` | DELETE | 删除账号 | | `/api/accounts/:id/regenerate-key` | POST | 重新生成 API key | | `/api/accounts/:id/start` | POST | 启动实例 | | `/api/accounts/:id/stop` | POST | 停止实例 | | `/api/accounts/:id/usage` | GET | 获取账号使用量 | | `/api/auth/device-code` | POST | 启动 GitHub OAuth flow | | `/api/auth/poll/:sessionId` | GET | 轮询 OAuth 状态 | | `/api/auth/complete` | POST | 完成 OAuth 并创建账号 | | `/api/pool` | GET | 获取 pool 配置 | | `/api/pool` | PUT | 更新 pool 配置 | | `/api/pool/regenerate-key` | POST | 重新生成 pool API key | | `/api/model-map` | GET | 获取模型 ID 映射 | | `/api/model-map` | PUT | 批量更新映射 | | `/api/model-map` | POST | 添加单个映射 | | `/api/model-map/:copilotId` | DELETE | 删除映射 | ### 模型 ID 映射 Copilot 返回非标准的模型 ID。映射功能允许你配置双向转换: - `/v1/models` 返回映射后的显示 ID - 传入的请求会将显示 ID 转换回 Copilot 内部 ID - 映射持久化存储到 `~/.local/share/copilot-api/model_map.json` - 可通过 Web Console 的“Model ID Mapping”面板进行配置 ### 项目结构 ``` copilot-go/ ├── main.go # Entry point, starts web console + proxy ├── config/config.go # Constants, State, header builders ├── store/ # JSON file persistence │ ├── paths.go # Data directory management │ ├── account.go # Account CRUD │ ├── admin.go # Admin auth + sessions │ └── model_map.go # Model ID mapping ├── auth/device_flow.go # GitHub OAuth device flow ├── copilot/vscode_version.go # VSCode version fetcher ├── anthropic/ # Anthropic ↔ OpenAI protocol translation │ ├── types.go # All type definitions │ ├── translate_request.go # Anthropic → OpenAI request │ ├── translate_response.go # OpenAI → Anthropic response │ ├── stream_translation.go # Streaming SSE event translation │ └── utils.go # Stop reason mapping ├── instance/ # Instance lifecycle │ ├── manager.go # Start/stop, token refresh │ ├── handler.go # Proxy request handlers │ └── load_balancer.go # Round-robin / priority selection ├── handler/ # HTTP routing │ ├── console_api.go # Web Console API + static files │ └── proxy.go # Proxy routes + auth middleware └── web/ # React frontend (Vite + TypeScript) ``` ### 数据存储 所有数据存储在 `~/.local/share/copilot-api/`: | 文件 | 内容 | |------|---------| | `accounts.json` | 账号列表 | | `pool-config.json` | Pool 模式设置 | | `admin.json` | 管理员密码哈希 | | `model_map.json` | 模型 ID 映射 | ### 致谢 基于 [ericc-ch/copilot-api](https://github.com/ericc-ch/copilot-api) (TypeScript/Bun),使用 Go 重写并增加了多账号控制台模式。 ### 许可证 MIT ## 中文 GitHub Copilot API 反向代理服务(Go 重写版),支持多账号 Web 管理、负载均衡,将 Copilot 转为 OpenAI/Anthropic 兼容接口。 ### 功能特性 - **多账号管理**:Web 控制台添加、删除、启停多个 GitHub Copilot 账号 - **Pool 模式负载均衡**:轮询或优先级策略分发请求 - **OpenAI 兼容接口**:`/v1/chat/completions`、`/v1/models`、`/v1/embeddings` - **Anthropic 兼容接口**:`/v1/messages`、`/v1/messages/count_tokens` — 自动协议转换 - **模型 ID 映射**:Copilot 内部 ID 与标准 ID 双向映射(如 `claude-sonnet-4-20250514`) - **流式 SSE**:完整支持 OpenAI 和 Anthropic 格式的流式响应 - **GitHub OAuth 设备流**:在 Web 控制台直接完成账号认证 - **管理员认证**:密码保护的控制台,支持会话管理 - **中英文界面**:自动检测浏览器语言,支持手动切换 - **Docker 支持**:多阶段构建,生产镜像体积小 ### 快速开始 #### 源码编译 ``` # 编译 go build -o copilot-go . # 运行(在项目根目录,以便加载 Web UI) ./copilot-go ``` #### Docker ``` # 构建镜像 docker build -t copilot-go . # 运行(持久化数据) docker run -d \ -p 3000:3000 \ -p 4141:4141 \ -v copilot-data:/root/.local/share/copilot-api \ copilot-go ``` #### Docker Compose ``` services: copilot-go: build: . ports: - "3000:3000" - "4141:4141" volumes: - copilot-data:/root/.local/share/copilot-api restart: unless-stopped volumes: copilot-data: ``` ### 命令行参数 | 参数 | 默认值 | 说明 | |------|--------|------| | `--web-port` | `3000` | Web 控制台端口 | | `--proxy-port` | `4141` | 代理 API 端口 | | `--verbose` | `false` | 详细日志 | | `--auto-start` | `true` | 启动时自动启动已启用的账号 | ### 使用方法 1. 访问 `http://localhost:3000`,首次使用创建管理员账号 2. 通过 GitHub OAuth 设备流添加 Copilot 账号 3. 启动账号实例 4. 使用账号 API Key 或 Pool Key 调用代理接口 ### API 端点 #### OpenAI 兼容 | 端点 | 方法 | 说明 | |------|------|------| | `/v1/chat/completions` | POST | 对话补全(支持流式) | | `/v1/models` | GET | 模型列表 | | `/v1/embeddings` | POST | 文本嵌入 | #### Anthropic 兼容 | 端点 | 方法 | 说明 | |------|------|------| | `/v1/messages` | POST | 消息 API(支持流式) | | `/v1/messages/count_tokens` | POST | Token 计数(估算) | #### 认证方式 所有代理端点需要 Bearer token: ``` # OpenAI 风格 curl -H "Authorization: Bearer sk-your-api-key" ... # Anthropic 风格 curl -H "x-api-key: sk-your-api-key" ... ``` ### 使用示例 #### OpenAI 对话补全 ``` curl http://localhost:4141/v1/chat/completions \ -H "Authorization: Bearer sk-your-api-key" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "messages": [{"role": "user", "content": "你好!"}], "stream": true }' ``` #### Anthropic 消息 ``` curl http://localhost:4141/v1/messages \ -H "x-api-key: sk-your-api-key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4", "max_tokens": 1024, "messages": [{"role": "user", "content": "你好!"}] }' ``` #### Claude Code 集成 ``` ANTHROPIC_BASE_URL=http://localhost:4141 \ ANTHROPIC_API_KEY=sk-your-api-key \ claude ``` 或在项目中创建 `.claude/settings.json`: ``` { "env": { "ANTHROPIC_BASE_URL": "http://localhost:4141", "ANTHROPIC_AUTH_TOKEN": "sk-your-api-key", "ANTHROPIC_MODEL": "claude-sonnet-4", "ANTHROPIC_SMALL_FAST_MODEL": "gpt-4.1-mini" } } ``` ### 模型 ID 映射 Copilot 返回的模型 ID 不规范,映射功能支持双向转换: - `/v1/models` 返回映射后的标准 ID - 请求时自动将标准 ID 转回 Copilot 内部 ID - 映射持久化到 `~/.local/share/copilot-api/model_map.json` - 通过 Web 控制台「模型 ID 映射」面板配置 ### 数据存储 所有数据存储在 `~/.local/share/copilot-api/`: | 文件 | 内容 | |------|------| | `accounts.json` | 账号列表 | | `pool-config.json` | Pool 模式配置 | | `admin.json` | 管理员密码哈希 | | `model_map.json` | 模型 ID 映射表 | ### 致谢 基于 [ericc-ch/copilot-api](https://github.com/ericc-ch/copilot-api)(TypeScript/Bun)重写为 Go,新增多账号控制台模式。 ### 许可证 MIT
标签:AI 编程助手, Anthropic API, API 兼容层, API 网关, Claude, Codex, CVE检测, DLL 劫持, DNS解析, Docker, EVTX分析, GitHub Copilot, Go 语言, LLM 代理, OAuth 认证, OpenAI API, SSE 流式传输, Web 控制台, 云资产清单, 代理服务, 代码补全, 协议转换, 多账户管理, 大语言模型, 安全防御评估, 开源项目, 接口适配, 日志审计, 请求拦截, 负载均衡, 逆向工程