== Heicode integration (~41 endpoints across 5 modules) ==
- §2 ResourceBinding (5 endpoints) — resources.py / resource_grants.py
- §4 NewAPI metadata proxy (4 endpoints) — heicode_proxy.py + heicode_client.py
- §5 Agnet platform stub (12 endpoints, in-memory mock) — agnet_stub.py
- §6 Task orchestration (5 endpoints + 3 extension endpoints) — heicode_tasks.py
6.1-6.5: intent / list / get / answer / messages
6.6-6.8: execution / delivery / audit?tab=... (Slice 8/9/10)
- §7 SSE single channel + approvals (4 endpoints + 5 event types) —
heicode_events.py + event_bus.py
- §7.8.1 internal billing-provider PUT endpoint — auth.py (routes)
== Schema changes ==
- migrations/026 heicode_tasks (orchestration state)
- migrations/027 users.billing_provider (litellm | newapi switch)
- migrations/028 heicode_approvals (high-risk approval queue)
== Register transaction hardening (P0 + P1 + P2) ==
routes/auth.py register():
- Pre-existing P0: failed register returned IntegrityError str verbatim
(leaking SQL params + ~50 plaintext LiteLLM keys per attempt).
Now logs exc_info, returns {code: REGISTER_FAILED, message: ...}.
- Pre-existing P0: model dedupe — two ModelProvider rows with overlapping
supported_models (e.g. taiji/gpt-4o-mini in both taiji and azure providers)
collide on uq_tenant_model. seen_models set deduplicates within the loop.
- New P1: track created_litellm_keys; on any failure call delete_key() for
each — prevents remote orphan keys when DB rollback fires.
- New P1: replace verify_code with peek_verification_code at the start;
only call verify_code (which consumes) after commit succeeds. Failed
registrations no longer burn the user's one-shot code.
- New P2: narrow inner `except (LiteLLMClientError, Exception)` to just
LiteLLMClientError so SQLAlchemy errors bubble to the outer rollback
instead of being silently swallowed into a half-allocated 200 response.
- New P2: same narrowing on outer `except (AgentManagerError, Exception)`.
== Auth middleware ==
- app/auth.py: allow /api/auth/internal/billing-provider and
/api/auth/internal/approvals to bypass user JWT (service-token auth
via HEICODE_INTERNAL_SERVICE_TOKEN, validated in-route).
== Docs ==
- Heicode-接口契约文档.md v2.2 (41 endpoints + SSE schema + 6.6-6.8)
- Heicode-对接进度与待办.md (through §7.14 SSE + 7.8.2 delivery回执)
- Heicode-完整调用流程图.md (sequence + routing diagrams)
- Agent-Manager-Heicode对接需求文档.md
- HEICODE_API_INTEGRATION.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
16 KiB
Heicode 全栈完整调用流程图
版本: v1.0 生效日期: 2026-05-05 目标: 把 Heicode 整体架构里 5 个组件之间的真实调用关系画清楚,避免每次新功能上线时大家对边界理解不一致。
本文档是基于实际代码(heicode 仓库 + mcp-server 仓库)的核实结果,不是设计文档。
1. 5 个组件 + 各自定位
| 组件 | 物理形态 | 角色(按 Heicode 主线文档) | 对应代码 |
|---|---|---|---|
| cc-haha 桌面客户端 | Tauri 桌面应用 + Bun CLI | "Heicode 客户端"(用户编程入口) | heicode/cc-haha/ |
| heicode web/default | React + Rsbuild SPA | NewAPI 自带的管理 UI(普通用户进的那个) | heicode/heicode/web/default/ |
| heicode 后端 (Go) | Gin + GORM | NewAPI —— 模型网关 + 计费 + 用户/Token/Group | heicode/heicode/ |
| mcp-server | FastAPI (Python) | Manager —— 用户控制台 + 编排中枢 + 资源绑定 | services/mcp-server/ |
| agent-manager | (待实现 12 接口) | Agnet 平台 —— K8s 上跑子 Agent | 独立服务 |
2. 已上线的调用关系(已核实)
2.1 登录流程(已上线 + 实测通过)
┌─────────────────────────┐
│ heicode web/default │ ← 用户在浏览器打开 https://heicode.../
│ (React SPA) │
└──────────┬──────────────┘
│
│ 1. POST /api/auth/login {email, password, role:"user"}
│ 跨域调用,VITE_HEICODE_AUTH_BASE_URL=https://apimtaiji.azure-api.net/api/mcp
▼
┌──────────────────────────────────┐
│ mcp-server (Manager) │
│ https://apimtaiji.azure-api.net │
│ /api/mcp │
└──────────┬───────────────────────┘
│
│ 2. 200 → {token, refreshToken, user{id, email, name, role, channelId}}
▼
┌─────────────────────────┐
│ heicode web/default │
│ 存 access/refresh 到 │
│ localStorage │
└──────────┬──────────────┘
│
│ 3. POST /api/user/session/from-agnet {access_token, refresh_token}
│ 同源调用 heicode 后端
▼
┌──────────────────────────────────┐
│ heicode 后端 (Go / NewAPI) │
│ controller.HeicodeAgnetSession │
│ Login │
└──────────┬───────────────────────┘
│
│ 4. GET /api/auth/me (Bearer access_token)
│ 跨服务调用 mcp-server
▼
┌──────────────────────────────────┐
│ mcp-server │
│ (401 时 heicode 后端会 fallback │
│ 先调 /api/auth/refresh) │
└──────────┬───────────────────────┘
│
│ 5. 200 → {id, email, name, role, channelId, status}
▼
┌──────────────────────────────────┐
│ heicode 后端 │
│ - 按 email JIT 创建本地 user │
│ - channelId → User.Group │
│ - role 用本地白名单决定(不信任 │
│ mcp-server 的 role 字段) │
│ - 颁发 heicode session cookie │
└──────────┬───────────────────────┘
│
│ 6. 200 → {success, data{id, role, group, ...}}
│ + Set-Cookie: heicode_session=...
▼
┌─────────────────────────┐
│ heicode web/default │
│ 显示已登录 │
└─────────────────────────┘
关键事实:
- heicode 前端直接跨域调 mcp-server 的登录接口(4 个:login/me/refresh/logout)
- heicode 后端也调 mcp-server 的
/me和/refresh(用前端给的 token 验证) - mcp-server 是事实上的主认证源,heicode 不维护自己独立的密码体系
- heicode 后端不信任 mcp-server 的 role 字段(防止外部身份提升),高权限角色由本地
HEICODE_ROOT_EMAILS/HEICODE_ADMIN_EMAILS环境变量决定
2.2 cc-haha 桌面客户端是否调 mcp-server?
结论:当前不直接调(已通过 grep 核实)。
cc-haha (./bin/claude-haha) 是独立的 CLI + Tauri 桌面工具,主要功能是 AI 编程辅助。它通过本地 server (SERVER_PORT=3456 bun run src/server/index.ts) 工作,不直接对接 mcp-server。
后续如果 cc-haha 要接入 Heicode 主流程(用户绑定资源 → 部署子 Agent),它会通过 heicode 后端中转,与 web/default 前端走同样的登录路径。
2.3 heicode 后端 → mcp-server 的依赖
代码位置:controller/heicode_agnet_session.go
| heicode 调用 | mcp-server 端点 | 用途 | mcp-server 端能改吗? |
|---|---|---|---|
GET /api/auth/me |
✅ 已上线 | JIT 同步用户身份 | 字段形态不能改:id/email/name/role/channelId/status 都被 hardcode 解析 |
POST /api/auth/refresh |
✅ 已上线 | access token 401 时 fallback | 字段形态不能改:data.token/refreshToken |
2.4 heicode 前端 → mcp-server 的依赖
代码位置:web/default/src/features/auth/api.ts
| heicode 前端调用 | mcp-server 端点 | 用途 |
|---|---|---|
POST /api/auth/login |
✅ 已上线 | 用户登录 |
GET /api/auth/me |
✅ 已上线 | 启动时校验 + 周期刷新 |
POST /api/auth/refresh |
✅ 已上线 | access token 失效续期 |
POST /api/auth/logout |
✅ 已上线 | 登出(与 heicode 后端 logout 双调用) |
2.5 mcp-server → heicode 后端的依赖(当前 0 调用)
mcp-server 现在不调 heicode 后端。
Heicode 团队 2026-05-07 修订(C 方案——两平台并存且各自有 product-level 模型网关):
平台 组成 自家模型网关 服务对象 taijiagent mcp-server + agent-manager + LiteLLM LiteLLM(产品级,不是 mcp-server 进程内细节) 通过 mcp-server 直接部署 agent 的"原生 taijiagent 用户" Heicode Heicode 客户端(桌面)+ heicode web(浏览器)+ heicode 后端(NewAPI) NewAPI(产品级) Heicode 客户端实时交互式 chat 用户 两个平台共用 mcp-server 的账号体系,模型网关各自独立。
四条独立的模型调用路径(完整真实场景):
# 调用方 触发场景 走哪 1 Heicode 客户端(桌面)+ heicode web 前端 用户实时交互式 chat / 写代码 Heicode NewAPI 2 子 Agent Pod(Heicode 用户部署的) 在 AKS 跑任务时调模型, billing_context.provider="newapi"Heicode NewAPI(带 newapi_user_ref / newapi_group) 3 子 Agent Pod(原生 taijiagent 用户部署的) 在 AKS 跑任务时调模型, billing_context.provider默认或 ="litellm"taijiagent LiteLLM 4 mcp-server 进程内(embedding / 内部分类 / 系统功能) mcp-server 自己内部使用 LiteLLM 关键事实:
- LiteLLM 同时承担两种角色 —— ① taijiagent 用户的 agent 模型网关(产品级)+ ② mcp-server 自己的内部工具
- NewAPI 同时承担两种角色 —— ① Heicode 客户端用户的实时交互网关 + ② Heicode 部署的 agent 计费网关
- 子 Agent 走哪条网关由
billing_context.provider字段决定(mcp-server 在POST /api/agnet/deploymentspayload 里设置)- 两个网关互不替代,P4 不需要做迁移
P4 NewAPI 解耦的真实任务:mcp-server 在 Manager 控制台聚合费用展示时,对Heicode 用户那部分调用(路径 1 + 路径 2)从 NewAPI 拉元数据;对纯 taijiagent 用户那部分(路径 3)继续用自己的 LiteLLM 数据。聚合后展示给用户。属于只读元数据查询 + 前端聚合,不涉及网关迁移。
如果实施 P4 元数据查询,需要:
- mcp-server 新增
app/heicode_client.py出站客户端 - 调 heicode 后端的用户视角 API(
/api/user/self、/api/user/self/models、/api/log/self/stat等) - LiteLLM 保留,不替换
3. 待实现的调用关系(按 Heicode 主线 P5)
3.1 部署子 Agent 流程(设计中,agent-manager 待实现 12 接口)
┌─────────────────────────┐
│ heicode web/default 或 │
│ cc-haha 客户端 │ ← 用户点"部署"
└──────────┬──────────────┘
│
│ 1. (经 heicode 后端中转 或 直接) POST /api/resources / /api/resource-grants
│ 定义资源绑定与授权
▼
┌──────────────────────────────────┐
│ mcp-server (Manager) │
│ ✅ ResourceBinding/Grant 已上线 │
└──────────┬───────────────────────┘
│
│ 2. POST /api/agnet/deployments
│ {orchestration_plan, user_context, billing_context, agent_runtime, resource_grants}
│ ❌ 出站客户端待实现
▼
┌──────────────────────────────────┐
│ agent-manager (Agnet 平台) │
│ ❌ 12 个新接口全部待实现 │
└──────────┬───────────────────────┘
│
│ 3. 创建 K8s Deployment + ServiceAccount + ConfigMap
│ ConfigMap 含 AGENT.md / resource_context / permission_manifest
│ ❌ Pod 启动行为待改造
▼
┌──────────────────────────────────┐
│ 子 Agent Pod (在 AKS) │
│ ❌ 启动后通过 Workload Identity │
│ 向 Vault 拉短期凭据 │
└──────────┬───────────────────────┘
│
│ 4. (运行时) 调 Vault 拿 git token / cloud key
│ ❌ Vault 部署 + Workload Identity 配置待做
▼
┌──────────────────────────────────┐
│ Vault / OpenBao │
│ ❌ 基础设施待部署 │
└──────────────────────────────────┘
3.2 子 Agent 模型调用(已工作 + 待对齐)
子 Agent 在 Pod 里跑
│
│ POST /v1/chat/completions
│ Authorization: Bearer <heicode-token>
▼
heicode 后端 (NewAPI)
│
│ 路由到具体 provider
▼
OpenAI / Claude / Gemini / Azure / Bedrock / ...
注:子 Agent 拿到的 heicode token 由 mcp-server 在创建 Deployment 时通过 billing_context 传给 agent-manager,agent-manager 注入 Pod env。现在还没这个链路。
4. mcp-server 角色总结
mcp-server 在 Heicode 全栈里目前承担 3 件事:
| 角色 | 状态 | 接口 |
|---|---|---|
| 认证 IdP(heicode 前端 + 后端的统一身份源) | ✅ 已上线 | /api/auth/login /me /refresh /logout |
| 资源绑定与授权(用户绑定 Git/SK/云资源/项目文档;分配给子 Agent 角色) | ✅ 已上线 | /api/resources/* /api/resource-grants/* |
| Agnet 平台编排器(创建/查询/停止子 Agent 部署,转发给 agent-manager) | ❌ 待实现 | /api/agnet/*(12 个) |
mcp-server 不承担:
- ❌ 模型调用网关(heicode 后端 = NewAPI 干这事)
- ❌ AI 提供商接入(heicode 后端的 relay/channel 干这事)
- ❌ K8s 部署执行(agent-manager 干这事)
- ❌ 凭据托管(Vault 干这事,待部署)
5. 现有 mcp-server 业务(不归 Heicode,但要知道避坑)
mcp-server 还服务 taiji 业务:渠道后台、超管、用户中心、Agent 管理、PayPal 充值。这些不在 Heicode 范围,但代码共用。
| taiji 业务路由 | 状态 | 与 Heicode 的关系 |
|---|---|---|
/api/channel/* 渠道后台 |
在用 | 不归 Heicode,保持不动 |
/api/admin/* 超管 |
在用 | 同上 |
/api/user/* 用户中心 |
在用 | 同上 |
/api/agents/* Agent 管理 |
在用 | 同上 |
/api/auth/* 登录 |
在用 + Heicode 复用 | 被 Heicode 共用,字段形态绝不能改 |
/api/billing/* /api/paypal/* 计费 |
在用 | 不归 Heicode |
6. CORS 现状与改进
生产配置:mcp-server 的 cors_origins 在 ConfigMap taiji-config 里未设置,fallback 到 ["*"]。
潜在问题:
- mcp-server 设了
allow_credentials=True+allow_origins=["*"],浏览器规范上会拒绝带 cookie 的跨域请求 - 但 heicode 前端用
Authorization: Bearer传 token,不依赖 cookie,实际可用
改进建议(不阻塞当前对接):
- 把 heicode 前端的真实部署域名加到
CORS_ORIGINS,去掉* - 例如:
CORS_ORIGINS=["https://heicode.xinghanlab.com","https://heicode-staging.xinghanlab.com"] - 与 heicode 团队确认其前端实际部署域名后配置
7. 已知技术债(不阻塞当前对接)
| 项 | 说明 | 影响 |
|---|---|---|
| Channel 登录写审计日志 FK 错 | audit_logs.user_id FK 与 channel.id 不匹配 |
仅 channel 角色登录有 warning,user 角色无影响 |
cors_origins=["*"] + allow_credentials=True |
与浏览器规范冲突 | 当前无影响(heicode 用 Bearer),未来要硬化 |
| LiteLLM vs NewAPI(heicode 后端)双轨 | 模型调用走 LiteLLM,未对接 heicode | 取决于产品决策,可能要迁移 |
| 死路由清理(之前已删 11 个) | frontend_integration.py 仍有部分历史代码 |
不影响功能 |
8. 联调测试可执行步骤
步骤 1: 确认 mcp-server 4 个登录接口(已上线,无需操作)
# 用真实账号登录
curl -X POST https://apimtaiji.azure-api.net/api/mcp/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"55@55.com","password":"By@123456.","role":"user"}'
# 拿 token 调 /me
curl https://apimtaiji.azure-api.net/api/mcp/api/auth/me \
-H "Authorization: Bearer <access_token>"
步骤 2: heicode 前端联调(heicode 团队执行)
- 部署 heicode web/default,配置
VITE_HEICODE_AUTH_BASE_URL=https://apimtaiji.azure-api.net/api/mcp - 在登录页输入
55@55.com/By@123456. - 预期:成功登录,浏览器 localStorage 有
heicode_access_token+heicode_refresh_token - 预期:heicode 后端 session cookie 也已颁发(通过
from-agnet流程)
步骤 3: 资源绑定联调(heicode 团队执行)
- 用步骤 2 的 access token 调
POST /api/resources创建 git 绑定 - 调
POST /api/resource-grants把 binding 授给 backend role - 预期:所有调用 200,DB 里有对应记录
步骤 4: 子 Agent 部署联调(等 agent-manager 实现 12 接口后)
待 agent-manager 团队实现接口后再做。
9. 文档导航
| 文档 | 受众 | 内容 |
|---|---|---|
| 本文档 | 全员 | 整体调用关系、组件定位 |
Docs/Heicode-接口契约文档.md |
heicode 前后端开发 | 13 个 mcp-server 已上线接口的详细契约 |
Docs/Heicode-对接进度与待办.md |
PM / Lead | 进度盘点 + 待决策 |
Docs/Agent-Manager-Heicode对接需求文档.md |
agent-manager 团队 | 12 个新接口要求 + Pod 改造 + AKS 基础设施 |
Docs/Heicode-登录接口对接文档.md |
(旧版,已被超集化) | 登录单接口;建议转看接口契约文档 |
10. 修订记录
| 版本 | 日期 | 变更 |
|---|---|---|
| v1.0 | 2026-05-05 | 初版:基于代码核实结果绘制 |