feat: wire swarm stop to runtime + add events SSE stream (#45/#46)
契约已冻结(agent_swarm#14 runtime-contract v1 / #15 event-schema v1),HM 侧据此 落地两项原本 deferred 的能力,叠在读侧适配(PR #59)之上: - stop(#45):HeicodeStopSwarm 真实调用运行时冻结路径 POST /api/agent/swarm/deployments/{deployment_id}/stop,复用 agent_runtime_client 的配置/URL/信封解析;Bearer SWARM_RUNTIME_SERVICE_TOKEN + X-Idempotency-Key 幂等。 仅 SWARM_RUNTIME_ENABLED=true 且配齐 base_url+token 时发起,否则 POLICY_REJECTED, 绝不伪造 accepted;终态不抢写,由 swarm.stopped 回调写回。 - events SSE(#46 读侧):GET /api/heicode/swarms/:id/events/stream?after=,与 events?after 同源(HM 持久化回调事件,按 user_id 收口 + payload 脱敏),命中终态 (swarm.completed/failed/stopped)/客户端断开/超时(30min)收流。不调运行时。 - docs:刷新 heicode-swarm-deferred.md(登记冻结契约、读侧/stop/SSE 已落地、唯一剩余 计费缺口 #60)与 heicode-desktop-client-api.md §5.2(SSE + stop 端点)。 影响面:Client(新增 SSE 端点 + stop 行为变化)、agent_swarm(按冻结契约调用其 stop)。 不涉及 Manager↔AM、密钥、计费扣费逻辑(计费缺口 #60 仍阻塞于 agent_swarm#16)。 测试:callSwarmRuntimeStop(httptest 校验路径/鉴权/幂等头/信封解析/错误路径/runtime id 回退)+ swarmEventIsTerminal;go build ./... 与 controller 测试全绿。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -313,17 +313,18 @@ signature = base64( ed25519_sign( device_priv, sha256(canonical) ) )
|
||||
|
||||
---
|
||||
|
||||
## 5.2 Swarm 运行查询 🟡(#45 Phase1 · 只读预览)
|
||||
## 5.2 Swarm 运行查询 🟢(#45/#46 · 契约 v1 已冻结)
|
||||
|
||||
多 Agent 蜂群运行(`agent_swarm` / HeiCode Swarm)的**只读查询**。数据全部来自 HM 已持久化的运行时回调(Swarm → HM 带签名回调),**无需实时调 Swarm**,故不受 `agent_swarm#2` 契约冻结阻塞。
|
||||
多 Agent 蜂群运行(`agent_swarm` / HeiCode Swarm)的查询。读类接口数据全部来自 HM 已持久化的运行时回调(Swarm → HM 带签名回调),**无需实时调 Swarm**;契约已冻结为 `runtime-contract v1`/`event-schema v1`(`agent_swarm#14`/`#15`)。
|
||||
|
||||
| 方法 | 路径 | 说明 | 状态 |
|
||||
|---|---|---|---|
|
||||
| GET | `/api/heicode/swarms` | 列出我的 swarm 运行 | 🟢 本地数据 |
|
||||
| GET | `/api/heicode/swarms/:id` | 单个运行状态(:id = deployment_id / swarm_id / correlation_id 任一) | 🟢 |
|
||||
| GET | `/api/heicode/swarms/:id/events?after=&limit=` | 事件增量拉取(`after`=上次返回的 `next_after`,oldest-first) | 🟢 |
|
||||
| GET | `/api/heicode/swarms/:id/events/stream?after=` | **事件 SSE 实时流**(与 events 同源;进入即回放 `after` 之后历史) | 🟢 |
|
||||
| GET | `/api/heicode/swarms/:id/artifacts` | 从已存事件派生的产物 | 🟢(派生) |
|
||||
| POST | `/api/heicode/swarms/:id/stop` | 停止运行(**写**) | 🟡 待 `agent_swarm#2` 冻结 + `SWARM_RUNTIME_ENABLED=true` |
|
||||
| POST | `/api/heicode/swarms/:id/stop` | 停止运行(**写**,真实调运行时) | 🟢(开关:`SWARM_RUNTIME_ENABLED=true` + base_url + service token;否则 `POLICY_REJECTED`) |
|
||||
|
||||
```json
|
||||
// GET /api/heicode/swarms/:id
|
||||
@@ -350,6 +351,8 @@ signature = base64( ed25519_sign( device_priv, sha256(canonical) ) )
|
||||
- **事件**:`sequence` = agent_swarm event-schema v1 的 **per-swarm 严格递增序号**(每 swarm 从 1、无空洞),客户端用它去重/排序;`id`/`next_after` 是 HM 不透明分页游标(单调,兼容 `sequence` 尚未全量上线)。事件 `payload` **已脱敏**(递归剔除 `secret_ref`/`credential_ref`/`signing_secret_ref`/credentials/大字段 + `RedactText` 兜底)。查询按**当前用户**作用域。
|
||||
- **新增事件类型**(已注册):`swarm.completed/failed/stopped`、`approval.approved/rejected`、`handoff.created`(event-schema v1)。
|
||||
- **artifact**:从 `artifact.created` 派生扁平 `{uri,checksum,task_id,size_bytes?,created_at}`(**无 secret_ref**;size 未知则省略,不伪造)。
|
||||
- **SSE 实时流**(`/events/stream`):`text/event-stream`,帧 `event: message` 的 `data` 即单条事件视图(同 `events` 的 item);命中终态(`swarm.completed/failed/stopped`)发 `event: done`(`{next_after,reason}`)后收流,客户端断开或超时(30min)亦收流。与轮询 `events?after` 等价,二选一;断线后用最后的 `next_after` 重新订阅即可续传。
|
||||
- **stop**:`SWARM_RUNTIME_ENABLED=true` 且配齐 base_url + service token 时真实调用运行时(`X-Idempotency-Key` 幂等),返回 `{accepted:true,runtime_status,...}`;**终态不在响应里**——由运行时异步回推 `swarm.stopped` 事件,客户端经 `events`/`stream` 收最终态。未启用则 `POLICY_REJECTED`(不伪造受理)。
|
||||
- `stop`(写):仍 gated,待 stop 真实接入 PR(复用运行时客户端 + `SWARM_RUNTIME_SERVICE_TOKEN`,契约 §3 已冻结)落地。
|
||||
|
||||
---
|
||||
|
||||
@@ -13,7 +13,12 @@
|
||||
- **HM(Heicode Manager)当前不实现 swarm runtime。** HM 的职责边界是:模型网关(`/v1/*`)+ 资源/权限/计费/审计 + **模板 Agent 部署编排**(经 AM 启动常驻 agent、客户端直连)。多 agent 蜂群编排**不在 HM 端**。
|
||||
- **旧的「HM 内部 sub/蜂群任务编排」模型已作废。** 那套(sub 任务、display_status、HM 侧蜂群 runtime 对接草案)随产品转向「模板 Agent + 客户端直连」一并下线,相关代码删除清单见 [`heicode-hm-legacy-teardown.md`](./heicode-hm-legacy-teardown.md),当前模型见 [`heicode-hm-template-agent-model.md`](./heicode-hm-template-agent-model.md)。
|
||||
- **新版蜂群能力在 `agent_swarm`(HeiCode Swarm)仓,不在本仓。** 当前模型:主控 Agent(Master Agent,`orchestrator/master_agent.py`)把需求**分解**为子任务 → **派发**给不同领域的专家 Agent **并行执行** → 重叠领域**协作/移交** → 主控**评审/重做**循环(受 `MAX_REVIEW_CYCLES` 约束)→ **汇总交付**;Orchestrator(FastAPI) + Redis 权威状态 + WebSocket Agent 协议 + Prometheus 指标。旧文档描述的「HM 主导编排蜂群 / 仅 `/tasks`」已作废。HM 侧最多提供资源/计费/鉴权支撑面,runtime 与编排由 Swarm 承载。
|
||||
- **该仓尚未作为 Heicode 主链路正式 Runtime Backend 接入。** 按 `agent_swarm` README 与 `agent_swarm#2`:编排器已可运行(仓内),但 Manager↔Runtime 生命周期契约、HMAC 签名回调 envelope、稳定 `deployment_id`/`workflow_id`/`trace_id`、统一 usage/审计接入等仍为 🟡 待接入,需各 Team 评审冻结后联调。
|
||||
- **契约已冻结为 v1(2026-06-10)。** Swarm 侧已冻结 `runtime-contract v1`(`agent_swarm#14`:stop = `POST /api/agent/swarm/deployments/{deployment_id}/stop` + `Bearer SWARM_RUNTIME_SERVICE_TOKEN` + `X-Idempotency-Key`,受理后异步回推 `swarm.stopped`;`deployment_id↔swarm_id↔manager_deployment_id` 三映射;状态 §4.1 `blocked→degraded`)与 `event-schema v1`(`agent_swarm#15`:per-swarm 严格递增 `sequence`;新增 6 类事件;`secret_ref`/`credential_ref`/`signing_secret_ref` 按设计以 `azkv://` 引用透传)。
|
||||
- **HM 侧已据冻结契约落地读侧 + stop + SSE(不再 deferred 的部分):**
|
||||
- **只读查询(#45 / PR #59)🟢**:list/status/`events?after`/artifacts 全部基于 HM 已持久化的回调事件(`agent_callback.go` → `AgentCallbackEvent`),按 `user_id` 收口、payload 递归脱敏(剔除 secret_ref/凭据/大字段 + `RedactText` 兜底),**无需调用 Swarm 运行时**。`controller/agent_swarm_query.go`。
|
||||
- **stop(#45)🟢(受开关约束)**:真实调用运行时冻结路径,复用 `agent_runtime_client` 的配置/URL/信封解析;`SWARM_RUNTIME_ENABLED=true` 且配齐 `SWARM_RUNTIME_BASE_URL` + `SWARM_RUNTIME_SERVICE_TOKEN` 时才发起,否则 `POLICY_REJECTED`,**绝不伪造 accepted**。终态不抢写,由 `swarm.stopped` 回调写回。
|
||||
- **事件 SSE 实时流(#46 读侧)🟢**:`GET /api/heicode/swarms/:id/events/stream?after=`,与 `events?after` 同源(HM 持久化事件),命中终态(`swarm.completed/failed/stopped`)/客户端断开/超时结束,**不依赖运行时**。
|
||||
- **仍 deferred / 阻塞的部分:** ① **per-user 计费令牌注入(#60)**——swarm create 目前未像模板 Agent 那样现签隐藏 `sk-` 注入运行时(`OPENAI_API_KEY`+`OPENAI_API_BASE=HM/v1`),是 HM 唯一计费缺口,**阻塞于 Swarm 对 `agent_swarm#16` 注入口径 A/B 的确认**;② 事件 **append 写入 / 主动拉取**仍走回调被动落库,未做 HM→Swarm 主动拉取(无对应需求)。
|
||||
|
||||
---
|
||||
|
||||
@@ -22,10 +27,10 @@
|
||||
| 项 | 归属仓 / 负责人 | 说明 |
|
||||
|---|---|---|
|
||||
| Swarm runtime / 多 agent 编排 | **`agent_swarm`**(产品名 HeiCode Swarm,@Songhaoz666) | 执行面、Master-Agent 编排、回调、Swarm Runtime |
|
||||
| Manager ↔ Swarm 契约 | Swarm 侧**已起草正式契约** `agent_swarm/docs/integration/runtime-contract.md`(沿用 `heicode-am-contract` 的鉴权/回调/env/路径覆盖约定),**待 Manager Runtime Team 评审冻结**;冻结后在本目录 `docs/integration/` 另立 HM 侧对接契约 | Swarm 已实现生命周期接口 create/status/tasks/logs/events/metrics/workflow/diagnostics/stop/approvals(均带 `deployment_id`,三组路径别名 `/api/swarms`、`/api/agent/swarm/deployments`、`/api/agnet/deployments`);契约冻结与主链路接入跟踪在 **`agent_swarm#2`**(`#1` 执行面缺口已关闭) |
|
||||
| Manager ↔ Swarm 契约 | Swarm 侧契约**已冻结为 v1**:`runtime-contract v1`(`agent_swarm#14`)+ `event-schema v1`(`agent_swarm#15`),见 `agent_swarm/docs/integration/`;HM 侧据此对接,本文为 HM 侧锚点 | Swarm 已实现生命周期接口 create/status/tasks/logs/events/metrics/workflow/diagnostics/stop/approvals(均带 `deployment_id`,三组路径别名 `/api/swarms`、`/api/agent/swarm/deployments`、`/api/agnet/deployments`);HM 接入跟踪在 #45/#46/#60 与 PR #59 |
|
||||
| Agent 运行时(单 agent,已落地) | **`agent_management`(AM)**(@azgy) | 模板 Agent 启动/状态/停止/删除,契约见 [`heicode-am-contract.md`](./heicode-am-contract.md) |
|
||||
|
||||
> **HM 侧后续若要支撑蜂群**:不恢复旧文档,按 Swarm 的 `runtime-contract.md` 冻结版在 `docs/integration/` 新立 HM 对接契约;本文作为「蜂群在 HM 侧当前为 deferred」的唯一锚点。HM 侧对接前置依赖见 issue #45(Phase1 只读查询,阻塞于 `agent_swarm#2` 契约冻结)/ #46(Phase2 SSE)。
|
||||
> **HM 侧对接状态(2026-06-10)**:契约已按 `runtime-contract v1`/`event-schema v1` 冻结(`agent_swarm#14`/`#15`)。HM 已落地 #45(只读查询 + stop,PR #59 + 本批)与 #46 读侧(events SSE);剩余阻塞仅 #60(per-user 计费令牌注入,待 `agent_swarm#16` A/B 确认)。本文仍是「蜂群在 HM 侧」的唯一锚点——不恢复旧文档。
|
||||
|
||||
---
|
||||
|
||||
@@ -56,4 +61,4 @@
|
||||
|
||||
## 4. 给后续开发者的一句话
|
||||
|
||||
要找「蜂群在 HM 侧怎么对接」——**当前答案是「HM 不实现 swarm runtime;Swarm 侧已起草 `agent_swarm/docs/integration/runtime-contract.md`,待 Manager Runtime Team 评审冻结(`agent_swarm#2`)后,HM 再据冻结版做只读查询接入(#45/#46)」**;旧设计(HM 主导编排 / 仅 `/tasks` / `HeiCode-Swarm` 仓名)已废,别从 git 历史里捞旧文档当依据,按本文与 `agent_swarm` 仓的最新结论走。
|
||||
要找「蜂群在 HM 侧怎么对接」——**当前答案是「HM 不实现 swarm runtime;但契约已冻结(`runtime-contract v1`/`event-schema v1`),HM 已据冻结版落地只读查询 + stop + 事件 SSE(#45/#46/PR #59),代码在 `controller/agent_swarm_query.go`;唯一剩余计费缺口是 per-user `sk-` 注入(#60),阻塞于 `agent_swarm#16`」**;旧设计(HM 主导编排 / 仅 `/tasks` / `HeiCode-Swarm` 仓名)已废,别从 git 历史里捞旧文档当依据,按本文与 `agent_swarm` 仓的最新结论走。
|
||||
|
||||
Reference in New Issue
Block a user