# Heicode Sub Mode Runtime 接入说明 更新时间:2026-06-01 本文档描述当前仓库作为 **Sub Agile / 普通 sub 模式 Runtime** 时,对 Manager 暴露的接入契约。 这不是客户端主调用协议。 生产客户端主调用协议应由 `heicode-manager` 的 `/api/heicode/*` 定义并统一归口。 ## 1. 文档边界 当前仓库只负责: - `sub_agile` / 普通 sub 模式 Runtime - Manager 下发后已校验的执行计划 - Runtime 事实回传:状态、事件、产物、审批请求、诊断信息 当前仓库不负责: - 真正的 Swarm 产品模式 - 客户端主调用协议 - 客户端展示状态裁决 - 本地修改的最终可信版本管理 - 云部署目标选择与云密钥直连 命名约定: - `agent`:主命名,新的标准入口 - `agnet`:兼容命名,历史调用方继续可用 - `/api/swarms`:sub-mode compatibility API,不表示当前仓库实现独立 Swarm 系统 生产调用边界: ```text 客户端 -> Manager /api/heicode/sub-agile/* Manager -> agent_management /api/agent/sub-agile/* agent_management -> Manager /api/agent/callbacks/runtime-events 客户端 <- Manager display_status / workflow / artifacts / diagnostics ``` 结论: - 生产客户端不应直连本 Runtime - 本文档面向 Runtime 接入方、Manager 调用方、联调工程师 ## 2. 主路径与兼容路径 ### 2.1 主路径 ```text GET /api/agent/health POST /api/agent/sub-agile/deployments GET /api/agent/sub-agile/deployments GET /api/agent/sub-agile/deployments/{deployment_id} POST /api/agent/sub-agile/deployments/{deployment_id}/stop POST /api/agent/sub-agile/deployments/{deployment_id}/approvals/{approval_id} GET /api/agent/sub-agile/deployments/{deployment_id}/logs GET /api/agent/sub-agile/deployments/{deployment_id}/events GET /api/agent/sub-agile/deployments/{deployment_id}/metrics POST /api/agent/callbacks/runtime-events GET /api/agent/callbacks/runtime-events/schema ``` ### 2.2 兼容路径 ```text GET /api/agnet/health POST /api/agnet/deployments GET /api/agnet/deployments GET /api/agnet/deployments/{deployment_id} POST /api/agnet/deployments/{deployment_id}/stop POST /api/agnet/deployments/{deployment_id}/approvals/{approval_id} GET /api/agnet/deployments/{deployment_id}/logs GET /api/agnet/deployments/{deployment_id}/events GET /api/agnet/deployments/{deployment_id}/metrics POST /api/agnet/callbacks/swarm-events GET /api/agnet/callbacks/swarm-events/schema ``` ### 2.3 Legacy compatibility API ```text POST /api/swarms GET /api/swarms/{swarm_id} GET /api/swarms/{swarm_id}/status POST /api/swarms/{swarm_id}/stop GET /api/swarms/{swarm_id}/logs GET /api/swarms/{swarm_id}/events GET /api/swarms/{swarm_id}/metrics GET /api/swarms/{swarm_id}/artifacts/{artifact_id}/content POST /api/swarms/{swarm_id}/approvals/{approval_id} ``` ### 2.4 用户态产物 / 时间线查询 当前仓库仍保留以下内部 / 兼容查询面: ```text GET /api/agent/user/deployments/{deployment_id}/artifacts GET /api/agent/user/deployments/{deployment_id}/artifacts/{artifact_id}/content GET /api/agent/user/deployments/{deployment_id}/timeline GET /api/agent/user/deployments/{deployment_id}/sk-snapshots ``` 说明: - 这些路径更适合作为 Runtime / Manager 内部或兼容查询面 - 生产客户端不应直接消费这些路径 - 生产客户端应通过 Manager 的 `/api/heicode/*` 查询 artifacts / workflow / diagnostics ## 3. 状态语义与裁决边界 ### 3.1 Runtime 当前返回状态集合 当前 Runtime 对外统一投影: ```text accepted running waiting_approval completed failed stopped ``` ### 3.2 Runtime 状态不等于客户端展示状态 统一方案中应区分: ```text client_task_status cloud_deployment_status runtime_execution_status display_status ``` 当前 Runtime 返回的 `status` 更接近: ```text runtime_execution_status ``` 尤其需要注意: - Runtime `completed` 不等于用户最终看到的 `completed` - 最终 `display_status` 必须由 Manager 根据结构化产物事实裁决 Manager 可能额外裁决出: ```text queued runtime_syncing runtime_accepted waiting_input completed_without_deliverable needs_codegen offline_pending ``` 推荐裁决原则: ```text Runtime completed + has_deliverable=true + summary_only=false -> completed Runtime completed + summary_only=true -> completed_without_deliverable 或 needs_codegen Runtime completed + 无真实 artifact -> completed_without_deliverable 或 needs_codegen ``` ## 4. 推荐请求结构 建议 Manager 传入结构化 sub mode 计划,而不是裸自然语言。 示例: ```json { "orchestration_plan": { "intent_id": "task_demo_001", "template_hint": "fastapi-crud", "objective": "为任务管理系统生成 FastAPI CRUD 后端方案", "sub_mode": "agile", "user_context": { "user_id": "user_123", "binding_scope": "project_task_demo_001" }, "agile_context": { "stage": "planning", "checkpoint": "draft_created", "max_iterations": 1 }, "budget": { "max_cost_usd": 1, "max_tokens": 2000, "max_duration_sec": 600, "alert_threshold_pct": 80 }, "billing_context": { "provider": "newapi", "default_model_id": "gpt-5.4", "allowed_model_ids": ["gpt-5.4"], "stream": false }, "agents": [ { "role": "backend", "template": "a2a_litellm_agent", "model": "gpt-5.4", "capabilities": ["code", "api", "test"] } ] }, "callback": { "url": "https://your-manager.example.com/api/agent/callbacks/runtime-events" } } ``` 最低必填项: - `orchestration_plan` - `orchestration_plan.sub_mode` - `orchestration_plan.user_context.user_id` - `callback.url` ## 5. 模型来源与信任边界 生产环境中,Runtime 不应信任客户端直传的模型选择。 正确边界: ```text 客户端选择模型 Manager 校验模型、套餐、权限、预算、allowed_model_ids Manager 下发已校验 orchestration_plan Runtime 只消费 Manager 下发的 model / billing_context / allowed_model_ids ``` 约定: - Runtime 只信任 Manager 已校验的 `orchestration_plan` - Runtime 不应把客户端未校验的 `model` 视为最终可信配置 ## 6. 回调事件 主回调入口: ```text POST /api/agent/callbacks/runtime-events ``` 兼容回调入口: ```text POST /api/agnet/callbacks/swarm-events ``` 当前支持的关键事件: - `deployment.status_changed` - `phase.changed` - `timeline.updated` - `agent.started` - `agent.completed` - `agent.crashed` - `approval.requested` - `artifact.created` - `task.completed` - `task.failed` - `task.blocked` - `sk_tool.called` - `sk_tool.completed` - `sk_tool.failed` - `budget.alert` 最小消费建议: 1. `deployment.status_changed` 2. `phase.changed` 3. `artifact.created` 4. `approval.requested` ## 7. 产物语义 ### 7.1 当前真实 artifact 当前 Runtime 真实产物通常以: - `code_patch` - `document` 返回,并提供: - `artifact_id` - `summary` - `uri` - `metadata.download_path` ### 7.2 fallback artifact 当真实 agent 没有产出具体 artifact 时,Runtime 会生成 fallback artifact。 从本次升级开始,fallback artifact 必须稳定标记: ```json { "metadata": { "synthesized": true, "summary_only": true } } ``` 语义说明: - `synthesized=true`:说明该产物是 Runtime 合成的兼容性结果 - `summary_only=true`:说明该产物只适合展示失败 / 总结,不应直接作为代码类任务的有效交付依据 Manager 不应将 `summary_only=true` 的 artifact 作为代码任务 `completed` 的充分条件。 ### 7.3 project_folder artifact(结构性代码强制要求) 对于结构性代码交付,统一方案要求优先使用: ```text artifact_type = project_folder ``` 适用范围: - 前后端项目 - 多文件项目 - 可部署项目 - 包含 frontend/backend/docs/deploy 等目录的结构性代码任务 约束: - `code_patch` / `document` 仅适用于单文件、小型补丁或兼容任务 - 对于结构性代码任务,Runtime 不应长期只返回单一 `content` 正文作为主要交付形式 推荐形态: ```json { "artifact_id": "art_project_xxx", "artifact_type": "project_folder", "title": "Oracle Cloud Agency Site", "summary": "包含 frontend、backend、docs 和部署配置的完整项目。", "metadata": { "root_dir": "oracle-cloud-agency-site", "manifest_uri": "runtime://run_xxx/artifacts/art_project_xxx/manifest", "archive_uri": "runtime://run_xxx/artifacts/art_project_xxx/archive.zip", "content_hash": "sha256:project-tree-hash", "file_count": 42, "directory_count": 8 } } ``` 当前仓库现状说明: - 当前实现仍以 `single_file_content` 作为主要真实产物形态 - 结构性代码任务尚未默认落成 `project_folder` - 这属于当前实现缺口,不应被视为最终统一协议目标 接入方应按以下原则理解: - 当前 `content` 路径仍可用于兼容读取单文件/摘要类产物 - 未来结构性代码交付应升级为 `project_folder + manifest/archive/files` ### 7.4 project_folder 读取路径 对于 `project_folder` 类型 artifact,主读取路径应是: ```text manifest_uri archive_uri files/{path} ``` 推荐读取顺序: 1. 先读 `manifest_uri` 获取项目文件树和 revision 信息 2. 按需通过 `files/{path}` 读取单文件 3. 需要整体下载时通过 `archive_uri` `content` 接口定位: - `content` 仅作为 `code_patch` / `document` / `single_file_content` 的兼容读取方式 - `project_folder` 不应依赖单一 `content` 接口作为主读取方式 ## 8. 本地修改与 artifact revision(推荐扩展) 统一方案要求: - 用户本地修改项目文件夹,不等于云端产物自动更新 - 客户端必须显式上传 local edit - Manager 保存 `project artifact revision` - Runtime 后续执行必须以最新 accepted revision 为基线 当前仓库尚未把这套 revision 协议实现为正式 Runtime 接口,但建议保留以下扩展方向: ```text POST /api/agent/sub-agile/deployments/{deployment_id}/artifact-edits ``` 推荐事件形态: ```json { "event_type": "artifact.local_edit_received", "task_id": "task_xxx", "deployment_id": "dep_xxx", "runtime_deployment_id": "run_xxx", "artifact_id": "art_project_xxx", "project_revision": 2, "source": "client_local_edit", "manifest_uri": "manager://tasks/task_xxx/artifacts/art_project_xxx/revisions/2/manifest", "archive_uri": "manager://tasks/task_xxx/artifacts/art_project_xxx/revisions/2/archive", "content_hash": "sha256:new" } ``` 后续建议补齐的 revision 细节: - `base_project_revision` - `base_content_hash` - `ARTIFACT_REVISION_CONFLICT` - `artifact.local_edit_applied` - `artifact.local_edit_reviewed` - `artifact.local_edit_rejected` 推荐边界: - Manager 负责 revision / conflict 判定 - Runtime 通过 `manifest/archive/files` 读取指定 accepted revision ## 9. 云部署生命周期(推荐扩展) 统一方案中,云部署不应由客户端直传云密钥并直接驱动 Runtime。 正确边界: ```text 客户端只选择 target / environment / resource_binding_id Manager 负责校验、审批、凭证解析、预算和审计 Runtime 或 Deploy Worker 执行 provider adapter 部署结果通过 deployment_manifest artifact 和 deployment events 回传 ``` 当前 Runtime 文档仅做说明,不将云部署声明为本仓库已完整实现能力。 ## 10. 真实联调建议 ### 10.1 当前稳定范围 当前 Runtime 更稳定的任务类型: - 小型单文件函数生成 - 小型 React 组件生成 - 中小型实现摘要 / 代码骨架任务 - 经输出收缩后的中型真实编程任务 ### 10.2 当前高风险任务 高风险特征: - 一次性要求完整项目所有文件 - 单 agent 输出过长代码、长解释、长测试、长部署说明 - 多角色同时高负载、每个角色都要求大体量正文 真实现象: - 较大的任务可能在模型网关返回 `504 Gateway Time-out` ### 10.3 推荐拆分方式 建议把一个大任务拆成多个小任务: - 先生成数据模型与 API 列表 - 再生成 CRUD 路由骨架 - 再生成测试样例 - 前端组件与样式单独生成 - reviewer 单独作为收尾检查任务 ## 11. 模型网关配置要求 当前 runtime agent 需要一个真正返回模型 JSON 的 OpenAI 兼容基址。 当前线上有效配置是: ```text https://code.xinghanlab.com/v1 ``` 不是: ```text https://code.xinghanlab.com ``` 如果少了 `/v1`,subagent 实际打到的会是站点 HTML,而不是模型接口,结果会出现: - JSON 解析失败 - artifact 为空 - 或整体任务失败 建议至少确保以下配置正确: - `HEICODE_NEWAPI_BASE_URL=https://code.xinghanlab.com/v1` - `LITELLM_BASE_URL=https://code.xinghanlab.com/v1` ## 12. 最小验证流程 ### 12.1 服务与契约验证 ```bash curl http://127.0.0.1:8000/api/agent/health curl http://127.0.0.1:8000/api/agnet/health PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python3 -m pytest tests/test_sub_mode_runtime_contract.py -q ``` ### 12.2 真实 smoke 验证 建议至少跑一条小型真实编程任务,例如: - 生成 Python 工具函数 + pytest - 生成 React 小组件 + CSS 成功标准: 1. 创建响应返回 `accepted` 2. Runtime 最终状态到 `completed` 3. `artifacts` 非空 4. `artifacts/{artifact_id}/content` 返回可读正文,而不是 UUID、HTML 或空串 5. fallback artifact 必须带 `synthesized=true` / `summary_only=true` ## 13. 相关文件 主入口与兼容入口: - [api/agent/router.py](/Users/mac/Projects/agent-manager/tools/agent-manager/api/agent/router.py) - [api/agnet/router.py](/Users/mac/Projects/agent-manager/tools/agent-manager/api/agnet/router.py) - [api/swarm/router.py](/Users/mac/Projects/agent-manager/tools/agent-manager/api/swarm/router.py) 状态投影: - [api/status_projection.py](/Users/mac/Projects/agent-manager/tools/agent-manager/api/status_projection.py) K8s 部署与配置: - [k8s/agent-manager-deployment.yaml](/Users/mac/Projects/agent-manager/tools/agent-manager/k8s/agent-manager-deployment.yaml) - [k8s/agent-manager-configmap.yaml](/Users/mac/Projects/agent-manager/tools/agent-manager/k8s/agent-manager-configmap.yaml) - [k8s/README.md](/Users/mac/Projects/agent-manager/tools/agent-manager/k8s/README.md) --- 如果接入方只想记最关键的四件事,只需要记: 1. 生产客户端只调用 Manager 的 `/api/heicode/*` 2. Manager 调 Runtime 统一走 `/api/agent/sub-agile/*` 3. Runtime `completed` 只是 runtime_execution_status,不等于最终 display_status 4. `summary_only=true` 的 artifact 不能直接当代码类任务有效交付物