Skip to content

一次需求的完整生命周期 ​

从一句话到结构化交付,现在由 Run 串起来:需求受理 → 能力匹配 → 计划审批 → 执行 → 综合 → 交付。 Run 的生命周期、审批、事件流见 Run:从需求到交付的编排单元。


总览 ​

用户输入
  │
  ▼
① 需求受理 ─▶ ② 能力匹配 ─▶ ③ 计划与审批 ─▶ ④ 执行 ─▶ ⑤ 结果综合 ─▶ ⑥ 交付与留痕
  │              │              │              │              │              │
  ▼              ▼              ▼              ▼              ▼              ▼
SubTask[]      Agent[]        Plan + Approval NodeResult[]   Report         Trace
                                 │
                                 └── Run(状态 / 事件 / 审批 / 恢复)

主链路由 chat-execute 桥接,审批与托管走 Run API:

阶段端点做什么
准备POST /api/chat/prepare规则/agent loop 拆解、匹配、建图、生成计划并创建审批
审批/提交POST /api/runs/:id/approvals/:id → /commit用户批准 + 托管;0 元计划写 free commit
执行POST /api/chat/execute批次调度、工具级审批、事件流

① 需求受理 ​

模块:demand-translation

输入:用户最近几条消息(从 dialog 提取)

处理

  1. 关键词规则命中 → 直接采用(零 token,不调模型)
  2. 未命中 → AgentRuntime 只读工具循环: search_skills / match_agents / propose_plan / ask_user
  3. 循环不可用 → 单轮 LLM;仍失败 → 关键词兜底
  4. 信息不足 → ask_user 记录 Interaction,Run 进入 clarifying,等用户回复后继续同一 Run
  5. 输出结构化子任务:
json
[
  {
    "skillId": "ce-certification-review-v1",
    "subDomain": "ce_certification",
    "input": { "product": "智能手表", "market": "DE" },
    "confidence": 0.93
  },
  {
    "skillId": "vat-calculation-v1",
    "subDomain": "vat",
    "input": { "market": "DE", "price": 199 },
    "confidence": 0.88
  }
]

落库:translated_demands(MongoDB)

失败处理

  • 规则未命中且循环不可用 → 单轮 LLM;再失败 → 关键词兜底
  • 完全无法识别 → 返回空列表 + uncovered,由调用方明确拒答
  • 信息不足 → 追问(Interaction),不强行猜
  • 置信度低 → 前端展示确认步骤

② 能力匹配 ​

模块:agent-matching

输入:skillId + subDomain

处理

  1. 查询 status='active' 的 AgentProfile
  2. 四维打分:
维度权重规则
能力40%skillId 精确匹配 +45,subDomain 匹配 +35,基础 20
质量20%准确率 60% + 执行量 40%(上限 50 次)
价格20%≤$50 → 100;≤$100 → 85;≤$200 → 70;≤$500 → 50
速度20%SLA ≤2min → 100;≤5min → 80;≤10min → 60;≤30min → 50
  1. 按 totalScore 降序
  2. 同一 ownerId 只保留最高分
  3. 返回 top-3

输出

json
{
  "profile": { "agentId": "shenzhen-compliance", "skillIds": ["..."] },
  "scores": { "capability": 95, "quality": 88, "price": 70, "speed": 80 },
  "totalScore": 85.9,
  "reasons": ["skillId 精确匹配", "SLA 5 分钟"]
}

无匹配时:返回空数组,调用方创建"待匹配"占位节点,任务仍可创建但无法执行。


③ 计划与审批 ​

模块:run + workflow(兼容读)

处理

  1. 由拆解结果 + 选中 Agent 生成计划快照:tasks / agentIds / 总价 / 依赖 / planHash
  2. 创建计划级审批(RunApproval);Run planning → awaiting_plan_approval
  3. 用户批准后 commit:
    • 金额 > 0 → EscrowService.open + fund
    • 金额 = 0 → free commit,不建托管
  4. Run 进入 executing
  5. DAG 只作为执行计划 / 只读投影,不再由静态图驱动执行

计划示例

json
{
  "nodes": [
    { "id": "n1", "agentId": "platform-demand-translation", "type": "agent" },
    { "id": "n2", "agentId": "shenzhen-compliance", "skillId": "ce-...", "type": "agent" },
    { "id": "n3", "agentId": "nl-tax", "skillId": "vat-...", "type": "agent" },
    { "id": "n4", "agentId": "platform-result-synthesis", "type": "agent" }
  ],
  "connections": [
    { "from": "n1", "to": "n2" },
    { "from": "n1", "to": "n3" },
    { "from": "n2", "to": "n4" },
    { "from": "n3", "to": "n4" }
  ]
}

节点集合来自计划;执行顺序由运行时的 ready 批次决定,不再由一次性拓扑排序固定。 计划审批卡展示总价、agent 与 planHash;批准 + commit 后才会执行。


④ 执行 ​

模块:task(TaskAgentLoopService + TaskExecutionService)

入口:POST /api/chat/execute(commit 成功后)

处理

  1. 每轮选择 ready step(依赖已 completed),同一批真并发
  2. 派发前做工具级审批检查:单笔超过阈值 → Run awaiting_tool_approval,step waiting
  3. 节点执行:
    • 内部门面 Agent → AgentRuntime
    • 外部 Agent → A2AClientService.executeTask()
      • 失败 → 降级 AgentGatewayService.pushTask()
    • 内置节点 → 平台代码直接执行
  4. step / batch / decision 写 L0(自动带 runId),Run SSE 投影到对话页
  5. 工具审批通过后 POST /api/task/:id/resume 继续

节点状态

pending → waiting → running → completed
                          └→ failed(可重试)
                          └→ blocked(前置失败)

外部 Agent 的两种沟通方式

方式协议适用
A2AHTTP POST /message:send + 轮询推荐,新接入
GatewaySocket.IO兼容旧 Agent;A2A 失败时降级

超时与重试

  • A2A:按 Skill 的 runtime.timeout_seconds
  • Gateway:pushTaskAsync 超时后标记 expired
  • 离线任务:写入 offline_tasks,Agent 上线后自动推送,最多重试 3 次

⑤ 结果综合 ​

模块:reporter / 内部 Agent platform-result-synthesis

处理

  1. 收集所有终止节点的输出
  2. LLM 综合为统一报告
  3. 结构化输出:
json
{
  "summary": "该产品进入德国市场需要完成 4 项合规工作…",
  "risks": [
    { "item": "缺少 WEEE 注册号", "severity": "high", "basis": "ElektroG §6" }
  ],
  "missingDocuments": ["技术文件", "符合性声明"],
  "nextActions": ["提交 WEEE 注册", "补充德语标签"]
}

校验:输出需符合 Report Skill 的 output_schema;不符合则标记失败,不进入交付。


⑥ 交付与留痕 ​

这是信任层开始介入的节点:

Task 完成
  ├─ Delivery 创建(fulfillment)
  │    └─ 需求方验收 → Acceptance
  │         ├─ accepted → Escrow 进入可结算
  │         └─ rejected → Dispute → Resolution → Settle
  │
  └─ StateEvent 写入(state)
       ├─ actor: agent:{agentId}
       ├─ causedByEventId: 上游事件
       └─ 路径: /tasks/{taskId}/...

留痕内容

  • 谁接的单
  • 每个节点的输入输出
  • 谁交付、何时交付
  • 谁验收、验收结论
  • 谁裁定、依据什么条款
  • 钱怎么分

getTrace(taskId) 只读状态层即可重建完整叙事,不依赖业务表。


失败路径 ​

阶段失败表现处理
需求受理循环/LLM 不可用规则兜底任务不创建 / 明确拒答
需求受理信息不足Run clarifying追问;用户回复后继续同一 Run
匹配无可用 AgentunmatchedTopics不建空 workflow,明确提示
计划审批用户拒绝 / 过期Run cancelled / expired已 held 托管退款
commit未批准 / planHash 不一致 / 金额不足400重新审批或修正计划
执行单笔费用超阈值Run awaiting_tool_approval审批通过后 resume
执行Agent 超时step failed可重试
执行A2A 不可达自动降级 Gateway记录降级
综合输出不符合 Schemastep failed不进入交付
验收需求方拒绝Dispute进入争议流程
结算事由无条款409不猜比例,转人工

下一步 ​

Released under the MIT License.