MonkeyCode AI 平台的全方位逆向工程与反向代理实现
目标:将 MonkeyCode 平台内建的 AI 编码能力(覆盖 11 个模型提供商、3 种 LLM 接口协议)逆向分析 → 协议文档化 → 以 OpenAI 兼容 API(Chat Completions / Responses)暴露给 Codex 等第三方 AI 工具使用。
MonkeyCode (monkeycode-ai.com) 是一个 AI 编码平台,后端集成了 11 个模型提供商(OpenAI、Anthropic、DeepSeek、SiliconFlow 等),通过 Docker 容器化的 TaskFlow VM 运行 AI Agent,提供代码开发、审查、文档生成等功能。
本仓库的目标是:
- 逆向分析 MonkeyCode 平台的全套通信协议(认证、API、WebSocket 流、Agent-Client-Protocol)
- 协议文档化 — 将分析结果整理为结构化文档
- 实现反向代理 — 将 MonkeyCode 的能力以 OpenAI 标准 API 暴露出来,让 Codex 等工具可以直接使用
- Python 验证 — 编写验证脚本确认协议理解正确
MonkeyCode 本身是一个闭源 SaaS 平台,没有官方的 OpenAI 兼容 API。通过逆向工程,我们可以:
- 使用 MonkeyCode 集成的公开模型(如 qwen3.5-plus、kimi-k2.6 等)来驱动 Codex
- 理解其 Agent 通信协议(ACP)的设计模式
- 验证其认证体系的安全边界
┌─ Client ──────────────────────────────────────────────────┐
│ Codex / curl / OpenAI SDK │
│ GET /v1/models │
│ POST /v1/chat/completions {model, messages, stream} │
│ POST /v1/responses {model, input} (Codex 原生) │
└──────────────────────┬─────────────────────────────────────┘
│ HTTP / SSE (OpenAI 格式)
┌──────────────────────▼─────────────────────────────────────┐
│ Proxy Layer (OpenAI → MonkeyCode Bridge) │
│ │
│ TypeScript (proxy/src/) Python (mvp/) │
│ ┌─────────────────────────────┐ ┌─────────────────────┐ │
│ │ auth.ts 认证模块 │ │ client.py 统一客户端│ │
│ │ models.ts 模型管理 │ │ proxy_real.py 代理 │ │
│ │ task-runner.ts 任务+WS流 │ │ verify_full_flow.py │ │
│ │ api-routes.ts OpenAI路由 │ │ auth.py 认证 │ │
│ │ account-pool.ts 号池轮转 │ └─────────────────────┘ │
│ │ conversation-manager.ts │ │
│ └─────────────────────────────┘ │
│ │
│ ACP → OpenAI 事件映射引擎: │
│ agent_message_chunk → delta.content │
│ agent_thought_chunk → [Thinking] 前缀 + content │
│ tool_call → tool_calls / function_call │
│ usage_update → accumulate → task-ended 输出 │
└──────────────────────┬─────────────────────────────────────┘
│ MonkeyCode API + WebSocket
┌──────────────────────▼─────────────────────────────────────┐
│ MonkeyCode Backend (Go / Gin) │
│ │
│ POST /api/v1/users/tasks — 创建 AI 任务 │
│ GET /api/v1/users/status — 检查 Session 有效性 │
│ GET /api/v1/users/models — 获取可用模型列表 │
│ POST /api/v1/users/password-login — 密码登录 │
│ WS /api/v1/users/tasks/stream — ACP 事件流 │
│ WS /api/v1/users/tasks/control — 任务控制通道 │
│ WS /api/v1/users/hosts/vms/{id}/terminals — 终端通道 │
└──────────────────────┬─────────────────────────────────────┘
│ TaskFlow Orchestration
┌──────────────────────▼─────────────────────────────────────┐
│ VM Cluster (Docker Container, 内嵌 Agent) │
│ │
│ Agent(Codex/Claude/OpenCode) → LLM Client (Go) │
│ ├── openai_chat: POST {baseURL}/chat/completions │
│ ├── openai_responses: POST {baseURL}/responses │
│ └── anthropic: POST {baseURL}/v1/messages │
│ │
│ Agent 工具: bash 执行 / 文件读写 / git / MCP 协议 │
└──────────────────────┬─────────────────────────────────────┘
│
┌──────────────────┼──────────────────┐
▼ ▼ ▼
OpenAI Anthropic DeepSeek
SiliconFlow Moonshot Volcengine...
Browser/Codex → 创建任务 → 后端调度 VM → Agent 初始化
→ 连接 LLM Provider → Agent 开始工作
→ ACP 事件通过 WebSocket 推回 → Proxy 转换为 OpenAI SSE
→ 客户端收到标准 OpenAI 格式响应
| 模块 | 完成度 | 关键成果 |
|---|---|---|
| 认证协议 | 98% | 5 种登录方式:OAuth / 密码登录 / 团队登录 / Git OAuth / Admin Impersonate |
| LLM 通信协议 | 95% | 3 种接口类型(openai_chat / openai_responses / anthropic),11 个模型提供商 |
| WebSocket 协议 | 90% | 3 个独立通道(Stream / Control / Terminal),ACP 事件 7 种子类型 |
| API 端点映射 | 95% | 100 个 API 端点(89 个需认证 + 11 个公开) |
| VM 生命周期 | 85% | 7 种状态、2 种超时策略、VM 热复用 |
| 模型定价配额 | 90% | 3 级订阅(basic/pro/ultra),公开/私有/团队三级模型 |
| Conversation API | 40% | 6 个端点已知,完整 JSON Schema 待确认 |
| 号池管理 | 95% | 4 种状态(CREATED/ACTIVE/EXPIRED/INVALID),LRU+轮询+互斥锁 |
| 组件 | 语言 | 文件数 | 行数 | 状态 |
|---|---|---|---|---|
| 反向代理(完整实现) | TypeScript | 10 | ~2,920 | ✅ 已编译通过 |
| 统一代理客户端 | Python | 1 | 673 | ✅ 已完成 |
| OpenAI 兼容代理 | Python | 1 | 873 | ✅ 已完成 |
| 端到端验证脚本 | Python | 1 | 471 | ✅ 已完成 |
| 认证协议验证 | Python | 1 | 323 | ✅ 已增强 |
| OAuth 自动化登录 | Python | 2 | 544 | ✅ 已完成 |
| 模型管理验证 | Python | 1 | 90 | ✅ 已完成 |
| WebSocket 聊天验证 | Python | 1 | 134 | ✅ 已完成 |
| # | 项目 | 优先级 | 说明 |
|---|---|---|---|
| 1 | tool_call_update 精确字段 |
P0 | 协议文档标记为"-",需线上验证 |
| 2 | 自动审批 + 提问交互 | P0 | auto-approve 与 reply-question 是否冲突需实测 |
| 3 | Conversation API Schema | P1 | 已知 6 端点,请求/响应 JSON 格式待确认 |
| 4 | session_update 事件 |
P2 | 独立 WS 消息类型,非 ACP 事件 |
MonkeyCodeReverseEngineer/
│
├── proxy/ # TypeScript 反向代理(完整实现)
│ ├── .env.example # 环境变量模板
│ ├── src/
│ │ ├── server.ts # 主入口 + Express HTTP 服务器
│ │ ├── auth.ts # 认证模块(Cookie-based Session)
│ │ ├── account-pool.ts # 多账号号池轮转(HTTP 共享 + WS 独占)
│ │ ├── admin-login.ts # 百智云 OAuth 登录自动化
│ │ ├── models.ts # 模型列表获取与缓存
│ │ ├── task-runner.ts # 任务创建 + WebSocket 流式接收
│ │ ├── api-routes.ts # OpenAI 兼容 API 路由(完整实现)
│ │ ├── conversation-manager.ts # 多轮对话管理器
│ │ ├── types.ts # 完整类型定义
│ │ └── browser-headers.ts # 浏览器头欺骗(3 种域名)
│ ├── package.json
│ └── tsconfig.json
│
├── mvp/ # Python 协议验证与代理工具
│ ├── client.py # 🆕 统一客户端(认证 + 模型 + 任务 + WS)
│ ├── proxy_real.py # 🆕 真实 OpenAI 兼容代理
│ ├── verify_full_flow.py # 🆕 端到端链路验证脚本
│ ├── auth.py # ✨ 增强版认证模块
│ ├── models.py # 模型管理验证
│ ├── chat.py # WebSocket 聊天协议验证
│ ├── proxy.py # (旧) mock 版代理
│ ├── oauth_login.py # Playwright OAuth 自动化
│ ├── oauth_http.py # HTTP OAuth 授权(含 SCaptcha)
│ ├── config.py # 共享配置
│ ├── test_auth.py # 认证协议测试(14 用例)
│ ├── test_auth_interactive.py # 交互式认证测试
│ ├── test_protocol.py # 端到端协议验证
│ ├── requirements.txt
│ ├── run_mvp.sh # 运行脚本
│ └── README.md # MVP 使用文档
│
├── docs/ # 文档
│ ├── protocol/ # 逆向分析协议文档(核心产出)
│ │ ├── analysis-summary.md # 分析总结报告
│ │ ├── analysis-round-*.md # 逐轮分析报告(18 轮)
│ │ ├── auth-protocol-complete.md # 认证协议完整文档
│ │ ├── llm-protocol-complete.md # LLM 通信协议完整文档
│ │ ├── llm-integration.md # LLM 集成协议详解
│ │ ├── websocket-protocol.md # WebSocket 流式协议
│ │ ├── api-endpoints.md # 完整 API 端点映射(100 个)
│ │ ├── architecture.md # 系统架构分析
│ │ ├── authorization-matrix.md # 授权层级与访问控制矩阵
│ │ ├── account-pool-protocol.md # 账号号池协议
│ │ ├── taskflow-vm-analysis.md # TaskFlow VM 生命周期分析
│ │ ├── multi-turn-design.md # 多轮对话设计
│ │ ├── asar-analysis.md # Electron ASAR 逆向分析
│ │ ├── auth-automation-analysis.md # 认证自动化分析
│ │ ├── auth-pool-gap-analysis.md # 认证号池差距分析
│ │ ├── auth-unresolved-verification.md # 认证待验证问题
│ │ └── model-pricing-quota.md # 模型定价与配额分析
│ └── superpowers/ # 超能力 / 功能扩展文档
│
├── analysis/ # 逆向分析素材
│ └── asar-content/ # Electron ASAR 解包内容
│ ├── electron/ # Electron 主进程代码
│ └── renderer/ # 前端渲染层代码(React)
│
├── .gitignore
└── README.md # 本文件
| 文档 | 内容 | 完成度 |
|---|---|---|
| 分析总结报告 | 项目全貌、关键发现、修复列表 | ✅ 完整 |
| 分析轮次 01 | 全面状态评估与差距分析 | ✅ 完整 |
| 分析轮次 02 | P0 深度分析 | ✅ 完整 |
| 分析轮次 03 | 代码修复实施 | ✅ 完整 |
| 分析轮次 04 | 多轮对话设计 | ✅ 完整 |
| 分析轮次 05 | Phase 1 实施 | ✅ 完整 |
| 分析轮次 06 | 代码审查 | ✅ 完整 |
| 分析轮次 07 | 测试脚本 | ✅ 完整 |
| 分析轮次 08 ~ 18 | 持续深入分析 | ✅ 完整 |
| 文档 | 内容 | 完成度 |
|---|---|---|
| 认证协议完整文档 | 5 种登录方式、Session 存储、Redis 结构、Cookie 属性 | 98% |
| 授权层级与访问控制矩阵 | 角色体系、5 种中间件、API 访问权限 | 95% |
| 认证号池差距分析 | 多账号轮转策略、状态管理、锁机制 | 95% |
| 认证自动化分析 | SCaptcha 绕过、OAuth 自动化全流程 | 90% |
| 认证待验证问题 | 线上实测发现的 5 个偏差及源码验证 | 100% |
| 文档 | 内容 | 完成度 |
|---|---|---|
| LLM 协议完整分析 | 3 种接口类型、模型管理 API、健康检查、Public API Key 机制 | 95% |
| LLM 集成协议详解 | Client 架构、接口类型自动检测、11 个提供商配置 | 98% |
| 模型定价与配额 | 3 级订阅(basic/pro/ultra)、模型访问逻辑 | 90% |
| 文档 | 内容 | 完成度 |
|---|---|---|
| WebSocket 流式协议 | 3 个独立 WS 通道、ACP 事件 7 种子类型、消息格式 | 90% |
| 任务协议分析 | 任务创建格式、TaskStreamMessage 结构 | 95% |
| 文档 | 内容 | 完成度 |
|---|---|---|
| TaskFlow VM 分析 | VM 7 种状态、生命周期管理、资源配额 | 85% |
| 多轮对话设计 | Conversation API、attach 模式、历史回放 | 90% |
| 完整 API 端点映射 | 100 个 API 端点(含认证要求) | 95% |
| 文档 | 内容 | 完成度 |
|---|---|---|
| 百智云安全测试报告 | SCaptcha 漏洞发现、安全评估 | 已报告 |
- 一个 已注册 MonkeyCode 的账号
- Node.js 18+(TypeScript 代理)
- Python 3.8+(Python 验证工具)
cd proxy
cp .env.example .env
# 编辑 .env 填入 MONKEYCODE_SESSION_COOKIE 和 MONKEYCODE_IMAGE_ID
npm install
npm run dev方式 A:浏览器提取(推荐,1 分钟)
- 浏览器打开 monkeycode-ai.com 并登录
- 按
F12→Application→Cookies→ 找到monkeycode_ai_session - 复制 Cookie 值
- 设置到代理:
export MONKEYCODE_SESSION_COOKIE="你复制的session值"方式 B:密码登录
export MONKEYCODE_USERNAME="your-email@example.com"
export MONKEYCODE_PASSWORD="your-password"
⚠️ 密码登录需要captcha_token(go-cap 验证码),建议优先使用方式 A。
- 浏览器登录 MonkeyCode 并打开 DevTools → Network
- 创建一个任务(输入提示词后点击运行)
- 在 Network 中找到
POST /api/v1/users/tasks请求 - 复制请求体中的
image_id字段值
export MONKEYCODE_IMAGE_ID="你获取的image_id"# 模型列表
curl http://localhost:9090/v1/models | jq
# Chat Completions
curl -X POST http://localhost:9090/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "monkeycode/OpenAI/gpt-4o", "messages": [{"role": "user", "content": "你好"}]}'
# 流式 Chat Completions
curl -X POST http://localhost:9090/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "monkeycode/OpenAI/gpt-4o", "messages": [{"role": "user", "content": "你好"}], "stream": true}'
# Responses API(Codex 原生)
curl -X POST http://localhost:9090/v1/responses \
-H "Content-Type: application/json" \
-d '{"model": "monkeycode/OpenAI/gpt-4o", "input": "你好"}'mvp/ 目录提供了一套完整的 Python 实现,用于协议验证和完整链路测试。
mvp/
├── client.py # 统一客户端(673 行)
├── proxy_real.py # 真实代理(873 行)
├── verify_full_flow.py # 端到端验证(471 行)
├── auth.py # 认证模块(323 行)
├── models.py # 模型管理
├── chat.py # WebSocket 聊天
├── oauth_login.py # Playwright OAuth
├── oauth_http.py # HTTP OAuth
├── test_auth.py # 14 个测试用例
├── test_protocol.py # 协议验证
├── README.md # Python 工具使用说明
└── run_mvp.sh # 启动脚本
cd mvp
export MONKEYCODE_SESSION_COOKIE="xxx"
export MONKEYCODE_IMAGE_ID="xxx"
python proxy_real.py
# 监听 http://0.0.0.0:9091python verify_full_flow.py # 全流程验证(需要 IMAGE_ID)
python verify_full_flow.py --skip-task # 仅认证+模型| 方式 | 难度 | 有效性 | 验证码 | 适用场景 |
|---|---|---|---|---|
| Session Cookie | ⭐ 简单 | 最长 30天 | ❌ 不需要 | ✅ 推荐,自动化首选 |
| 密码登录 | ⭐⭐ 中等 | 30天(刷新) | ✅ go-cap | 批量账号 |
| OAuth 百智云 | ⭐⭐⭐ 复杂 | 30天 | ✅ SCaptcha | 手机号登录 |
| 团队密码登录 | ⭐⭐ 中等 | 30天 | ✅ go-cap | 团队管理 |
export OPENAI_API_KEY="any-value-works"
export OPENAI_BASE_URL="http://localhost:9090/v1"
codexfrom openai import OpenAI
client = OpenAI(
base_url="http://localhost:9090/v1",
api_key="any", # MonkeyCode 使用 Cookie 认证,API Key 不校验
)
response = client.chat.completions.create(
model="monkeycode/OpenAI/gpt-4o",
messages=[{"role": "user", "content": "Hello"}],
stream=True,
)
for chunk in response:
print(chunk.choices[0].delta.content or "", end="")| 端点 | 方法 | 流式支持 | 说明 |
|---|---|---|---|
/v1/models |
GET | — | 模型列表 |
/v1/chat/completions |
POST | ✅ SSE | Chat Completions |
/v1/responses |
POST | ✅ SSE | Responses API(Codex 原生) |
/health |
GET | — | 健康检查 |
在请求中添加 conversation_id 扩展字段即可实现多轮对话复用:
{
"model": "monkeycode/OpenAI/gpt-4o",
"messages": [{"role": "user", "content": "继续上一步"}],
"conversation_id": "prev-task-id"
}- 仅供本地开发测试使用 — 所有 API 端点无外部认证保护
- 密码明文传输 — MonkeyCode 后端使用 bcrypt 验证,传输层由 HTTPS 保护
- Session Cookie 管理 — Session 30 天硬限制,无法刷新,到期需重新登录
- SCaptcha 服务不可用 —
admin-login.ts因证书问题临时关闭了 TLS 验证 - 账号池安全 — 密码明文存储在内存/配置文件中,生产环境需加密存储
| 限制 | 影响 | 解决方案 |
|---|---|---|
| SCaptcha 余额不足 | 密码登录 / OAuth 自动化不可用 | 使用浏览器提取的 Session Cookie |
| Session 30 天过期 | 需定期重新获取 Session | 设置定时任务重新登录 |
| IMAGE_ID 必须(任务创建) | 任务创建失败 | 从浏览器 DevTools 获取 |
| 单用户 WS 独占锁 | 账号池 WS 锁可能泄漏 | 健康检查自动释放(已修复) |
| conversation API schema 未知 | 多轮对话仅部分支持 | 使用 mode=new + 手动传 conversation_id |
欢迎 Issue 和 PR!
- 如有新的协议发现,请在
docs/protocol/下创建分析报告 - TypeScript 代理代码在
proxy/src/中 - Python 验证脚本在
mvp/中
MIT License
Built with ❤️ for research and educational purposes.