Skip to content

03 · 如何设计 Agent Platform 的系统架构? - System Design ​

所属知识库:Agent 全栈技术地图
所属领域:04 · Agent Platform
所属章节:04 · 如何开发、部署和维护 Agent Platform? - Engineering & Practice
文档类型:专题研究 / 系统架构 / 工程参考设计
版本:v1.3
更新日期:2026 年 11 月 1 日
核心问题:如何将 Agent Platform 的产品能力、控制面、工作流、Agent Runtime、数据和运维体系组织为边界清晰、状态可靠、安全可控、可演进的完整系统,并为 Studio 建立可实施的架构蓝图?

专题导读 ​

本篇属 Engineering & Practice。本篇承接 04/04/01 Platform Case Studies 与 04/04/02 Technology Selection,研究的是系统设计方法与可实施参考架构,而非某一个框架的使用教程。前文技术选型提出 Next.js、PostgreSQL、独立 Worker、对象存储及若干工作流/Agent Runtime 候选,本篇把它们放入统一系统边界,明确对象归属、状态转移、事务一致性、执行恢复、权限检查、接口契约和部署拓扑。

研究对象是同时支持 Agent 创建、运行、协作、审批、产物管理、API 集成与管理治理的 Agent Platform。本文以多 Agent 研究报告 Studio 为贯穿案例:选题 Agent → 审核 Agent → 深度调研 Agent → 分析 Agent → 人工确认 → 成果交付。本文不是对 Studio 现有代码的审计,任何具体技术实现均标记为建议或待验证。

证据分级:[规范/官方] 表示规范或官方文档中明确描述的机制;[架构推论] 表示基于需求和成熟工程原则提出的设计;[待验证] 表示需要通过 PoC、代码审计或压力测试确认。下文 SQL、JSON、API、指标与时序是参考契约,不宣称已在生产环境执行。

研究结论 ​

  1. 业务数据库是平台状态真相源,Agent Runtime 不是平台真相源。 Run、审批、产物、版本、租户、权限与审计应由平台拥有;Trace 负责诊断,不替代业务状态。[架构推论]
  2. 采用 Control Plane / Execution Plane / Data Plane / Observability Plane 分离的逻辑架构;初期可以部署为模块化单体 API + 独立 Worker,不必立即拆分微服务。[架构推论]
  3. 工作流编排器必须显式支持持久化检查点、等待、超时、取消、重试、恢复、版本固定;不能以长连接或内存变量承载长任务的唯一状态。[架构推论]
  4. 使用事务 Outbox + 至少一次投递 + 幂等消费衔接业务状态和异步队列;“Exactly once”不能被简单等同于外部工具副作用恰好执行一次。[架构推论]
  5. 将 Run 的执行成功、评估通过、人工审核通过、成果交付成功视为不同维度,避免错误的产品状态和自动发布。[架构推论]
  6. 权限、租户隔离、预算、凭证、数据保留和审计应贯穿所有入口与执行链路,而非后台管理的补丁。[架构推论]
  7. Studio 首期建议优先验证一条可恢复的研究任务完整闭环,再逐步引入复杂协作、分布式扩容与多租户。[待验证]

01 · 系统设计的目标与边界 ​

1.1 设计输入 ​

输入类别需要明确的事实或决策Studio 参考约束
用户与产品用户类型、关键旅程、权限边界作者、审核者、管理员、外部集成方
工作流阶段、依赖、返工、人工介入选题 - 审核 - 调研 - 分析 - 审批 - 交付
数据真相源、保留、删除、可追溯Run、AgentVersion、ArtifactVersion、Review
非功能需求可用性、延迟、并发、恢复目标需通过实际业务负载确定,不预设 SLA
安全租户隔离、密钥、工具授权工具调用必须受项目/租户授权约束
预算模型调用、队列、存储、日志成本每 Run 预算和组织级配额
团队人力、语言能力、运维能力候选为 Next.js + 独立 Worker

1.2 系统边界 ​

平台内部负责:身份与权限、Agent 定义与版本、Workflow 定义、Run 生命周期、调度策略、审批、产物元数据、审计、预算、集成 API。外部依赖包括模型供应商、搜索/检索服务、第三方工具、邮件/通知、对象存储和可观测性后端。任何外部依赖都应通过明确的适配器和错误模型接入。[架构推论]

1.3 质量属性与取舍 ​

质量属性设计目标常见冲突证明方式
正确性状态转移合法、结果关联准确开发速度状态机/契约测试
可恢复性Worker 崩溃后任务可继续执行开销故障注入
安全性最小权限与隔离操作便利越权/租户穿透测试
可观测性任务与工具调用可追踪隐私/成本Trace 与脱敏测试
可扩展性API 和 Worker 独立扩容系统复杂度负载测试
可演进性替换模型/运行时成本可控抽象层开销适配器替换 PoC
可运营性故障定位、回滚、备份初期投入演练与恢复测量

02 · 总体逻辑架构 ​

mermaid
flowchart TB
  U[Web / External Client] --> EDGE[API Gateway / BFF]
  EDGE --> AUTH[Identity / Policy Enforcement]
  AUTH --> CTRL[Platform Control Plane]
  CTRL --> REG[Agent & Workflow Registry]
  CTRL --> RUN[Run Service / State Machine]
  CTRL --> REV[Review & Approval Service]
  CTRL --> ART[Artifact & Delivery Service]
  RUN --> DB[(PostgreSQL: Business State)]
  RUN --> OUT[(Transactional Outbox)]
  OUT --> DISPATCH[Dispatcher / Queue]
  DISPATCH --> W[Execution Workers]
  W --> ORCH[Workflow Orchestrator]
  ORCH --> AR[Agent Runtime]
  AR --> MODEL[Model Gateway]
  AR --> TOOLS[Tool / Integration Gateway]
  W --> OBJ[(Object Storage)]
  W --> DB
  CTRL --> DB
  W -. telemetry .-> OTEL[Telemetry Collector]
  CTRL -. telemetry .-> OTEL
  OTEL --> OBS[Traces / Metrics / Logs]
  MODEL --> EXT[External Model Providers]
  TOOLS --> SYS[External Systems]

2.1 四个逻辑平面 ​

Control Plane 管理定义、权限、策略、版本、Run 意图和操作审计;Execution Plane 负责队列、Worker、工作流、Agent Runtime、模型与工具调用;Data Plane 承载业务数据、文件对象、检索索引和缓存;Observability Plane 汇聚追踪、日志、指标、告警与成本分析。四平面是职责划分,初期不要求四套独立集群。[架构推论]

2.2 模块化单体与服务拆分 ​

初期把 Auth、Registry、Run、Review、Artifact、Admin 作为同一 API 进程中的独立业务模块,统一 PostgreSQL 事务边界;将耗时执行放入 Worker。只有当伸缩、故障隔离、组织边界或部署周期形成可量化压力时,再将某模块独立成服务。拆分前应先稳定模块 API、事件契约和数据所有权。[架构推论]

2.3 与 v1.3 技术层的对应 ​

技术层主要实现组件责任边界
P1 Control PlaneAPI、策略、Registry、Run 控制意图与授权
P2 Execution PlaneWorker、Runtime、执行隔离实际执行
P3 Agent RegistryAgentDefinition、AgentVersion不可变版本
P4 Development Services测试沙箱、配置校验开发验证
P5 Deployment & RuntimeDeployment、Worker Pool实例与环境
P6 Workflow Management状态机、检查点、队列协作与恢复
P7 Resource & IntegrationModel/Tool Gateway外部资源
P8 Platform API & SDKHTTP/SSE/Webhook/SDK开放接口
P9 Extensibility插件与扩展点可控扩展
P10 Platform Data & AssetsDB、对象存储、索引资产管理
P11 Multi-tenancytenant_id、策略、隔离组织边界
P12 Platform Governance配额、预算、审计治理执行

03 · 领域模型与聚合边界 ​

3.1 核心实体 ​

实体标识关键字段所有者
Tenanttenant_idname, status, policyIdentity/Governance
Workspaceworkspace_idtenant_id, membersWorkspace
AgentDefinitionagent_idworkspace_id, ownerRegistry
AgentVersionagent_version_idimmutable_spec, checksumRegistry
WorkflowDefinitionworkflow_idworkspace_idWorkflow
WorkflowVersionworkflow_version_idimmutable_graphWorkflow
Runrun_idworkflow_version_id, status, budgetRun Service
StepRunstep_run_idrun_id, node_key, statusOrchestrator
Attemptattempt_idstep_run_id, attempt_no, leaseWorker
Approvalapproval_idrun_id, step_run_id, decisionReview
Artifactartifact_idrun_id, kindArtifact
ArtifactVersionartifact_version_idchecksum, object_keyArtifact
Deliverydelivery_idartifact_version_ids, recipientDelivery
AuditEventaudit_idactor, action, targetGovernance

3.2 不可变与可变对象 ​

AgentVersion 和 WorkflowVersion 发布后不可原地修改;修改应创建新版本。Run 创建时固定所引用的 WorkflowVersion 及其 AgentVersion 解析结果,避免执行过程中配置漂移。ArtifactVersion 固定内容哈希与存储键;审批绑定特定版本。Run 状态、任务租约、预算剩余量、审批等待状态属于可变业务状态,须有并发控制。[架构推论]

3.3 关键不变量 ​

  1. 任一 Run 必须属于且仅属于一个 Tenant 和 Workspace;跨租户引用默认拒绝。
  2. 任一 StepRun 必须属于同一 Run 的固定 WorkflowVersion 中可识别的节点。
  3. 已终结 Run 不得重新变为 running;重新执行应创建新 Run 或显式的派生关系。
  4. 同一 StepRun 可以有多个 Attempt,但只有一个合法完成结果可提交。
  5. 审批决定必须关联审批请求、版本、操作者与时间。
  6. ArtifactVersion 一经确认不可覆盖;交付引用确定版本。
  7. 外部工具调用的授权范围不得超过发起用户和执行身份的有效交集。
  8. 审计事件应不可由普通业务角色修改或删除;保留策略独立控制。

04 · Run 与工作流状态机 ​

4.1 Run 状态建议 ​

mermaid
stateDiagram-v2
  [*] --> queued
  queued --> running
  running --> waiting_approval
  waiting_approval --> queued: approved / resumed
  waiting_approval --> cancelled: cancel
  running --> succeeded
  running --> failed
  running --> cancelling
  queued --> cancelled
  cancelling --> cancelled
  cancelling --> failed: cancellation error
  failed --> [*]
  succeeded --> [*]
  cancelled --> [*]

这是一种参考状态机;实际系统还可能需要 timed_out、expired、blocked 等状态。应统一定义合法转移、状态原因和时间戳,并保证 UI、API、数据库及事件流语义一致。等待人工审批不应占用一个长期挂起的 Worker 进程。[架构推论]

4.2 状态与结果分离 ​

维度典型状态含义
execution_statusqueued/running/succeeded/failed执行是否完成
evaluation_statuspending/passed/failed/not_evaluated质量门禁是否通过
review_statuspending/approved/rejected/not_required审核是否通过
delivery_statusnot_ready/ready/delivered/failed是否已交付

执行成功但审核失败时,不能在产品界面显示为“已完成交付”。对外 API 应返回这些独立字段。[架构推论]

4.3 节点状态与依赖 ​

每个节点有明确输入映射、输出契约、依赖、重试策略、超时、失败分支、审批门禁和补偿策略。动态生成节点时必须记录拓扑变更及其版本。条件分支应保存实际决策输入的安全摘要,保证复盘时能解释为何走某一路径;不得暴露模型内部私有推理。[架构推论]

05 · 异步执行、队列与事务一致性 ​

5.1 为什么需要 Outbox ​

如果 API 在数据库写入 Run 后、消息发布前崩溃,Run 可能永久停留 queued;如果先发消息再提交数据库,Worker 可能查不到 Run。建议在同一数据库事务内写入 Run 与 outbox_event,再由独立 Dispatcher 发布到队列。Dispatcher 可能重复发布,因此 Worker 必须幂等。[架构推论]

mermaid
sequenceDiagram
  participant C as Client
  participant A as Platform API
  participant D as PostgreSQL
  participant O as Outbox Dispatcher
  participant Q as Queue
  participant W as Worker
  C->>A: POST /runs (Idempotency-Key)
  A->>D: BEGIN; INSERT run + outbox; COMMIT
  A-->>C: 202 + run_id
  O->>D: Read pending outbox
  O->>Q: Publish run.requested
  Q->>W: Deliver (at least once)
  W->>D: Acquire lease / check state
  W->>W: Execute step
  W->>D: Commit step result + next outbox
  W-->>Q: Ack

5.2 消费幂等与租约 ​

Worker 领取任务时使用条件更新、版本号或数据库锁保证同一时刻只有一个有效租约。租约过期后允许其他 Worker 接管,但原 Worker 可能仍在运行,因此提交结果时还需核验 lease_token / fencing_token。去重键可以是 (run_id, step_run_id, attempt_no, event_type);事件 ID 不应替代业务级幂等键。[架构推论]

5.3 外部副作用的限制 ​

向邮件、支付、发布系统发送请求时,数据库事务无法与外部系统形成普通的单一原子事务。若对方支持幂等键,传入稳定键;否则设计先查询、人工确认、补偿或“可能已执行”的不确定状态。禁止宣传“任务重试绝不会重复产生副作用”,除非在具体工具契约下得到验证。[架构推论]

5.4 重试策略 ​

故障类型默认建议说明
网络瞬断/429指数退避+抖动遵守 Retry-After
模型上下文超限不盲目重试缩短上下文或调整任务
权限不足直接失败/等待授权重试无意义
审批拒绝业务返工分支不是基础设施故障
Worker 崩溃检查点恢复防止重复副作用
输出契约不符有界修复重试记录次数与成本
外部服务未知结果标记不确定并核对防止重复执行

06 · 工作流恢复、人工审批与返工 ​

6.1 检查点设计 ​

每个稳定检查点至少保存 run_id、workflow_version_id、当前可执行节点、已完成节点输出引用、等待条件、审批令牌引用、预算消耗、重试次数、版本号及更新时间。大型中间数据存对象存储,数据库只保留引用和校验摘要。检查点提交与下一任务派发应通过事务性事件衔接。[架构推论]

6.2 人工审批 ​

审批请求包括目标产物版本、待决定事项、可选操作、授权角色、截止时间与失效策略。审批 API 必须防止重复提交、过期提交、非授权提交及版本漂移。审批完成后写入不可变决策记录并发出恢复事件;不能仅依赖前端页面仍然打开。[架构推论]

6.3 审核返工 ​

Studio 的审核 Agent 对选题或研究报告给出 approved | revise | rejected 的结构化结果;revise 进入指定返工节点,携带审核意见与已冻结的上下文引用。设置最大返工次数、预算上限和人工接管条件,避免无限循环。返工应创建新的 StepRun/Attempt 或明确的迭代编号,保留历史结果,不覆盖前次版本。[架构推论]

6.4 工作流版本升级 ​

新 Run 使用新 WorkflowVersion;已有 Run 原则上继续旧版本。若必须迁移,需设计状态映射、数据结构转换、兼容性检查、回滚与审计,不应默认支持无损热迁移。[架构推论]

07 · Agent Runtime 与模型/工具网关 ​

7.1 Runtime Adapter ​

平台应通过稳定接口接入 LangGraph、Agents SDK 或自研运行时,至少定义 start_step、cancel_step、stream_events、get_usage、serialize_checkpoint(若支持)和 normalize_error。不是每个 SDK 都原生支持全部能力;不支持的能力必须由编排层补足或在选型中视为约束。[架构推论]

7.2 Model Gateway ​

模型网关负责供应商凭证、模型映射、路由策略、请求超时、速率限制、重试、Token/成本计量和审计摘要。质量要求高的步骤应固定模型配置或记录实际模型标识。供应商返回的 usage 与最终账单可能不一致,应区分估算、供应商报告和结算数据。[架构推论]

7.3 Tool Gateway ​

工具声明应包含名称、版本、输入/输出 Schema、权限范围、网络目标、超时、幂等能力、风险等级与审计要求。敏感工具默认需要独立授权;高风险写操作可引入人工确认。对于搜索网页、读取文件和外部文档,必须将返回内容视为不可信输入,防范提示注入与越权指令。[架构推论]

7.4 沙箱与隔离 ​

不可信代码执行与任意工具脚本应放在受限容器/沙箱,限制网络出口、文件系统、CPU、内存、执行时长与凭证可见范围。简单多租户数据库行过滤不能替代执行环境隔离;具体隔离等级取决于风险评估。[架构推论]

08 · 数据架构与一致性边界 ​

8.1 存储职责 ​

存储推荐承载不宜承载
PostgreSQL身份、定义、Run、审批、元数据、审计索引、Outbox大型二进制文件
Object Storage报告、附件、原始资料、导出包、检查点大对象高频事务锁
Redis(可选)缓存、短时速率计数、队列实现依赖唯一业务真相源
Vector/FTS Index资料检索、语义索引审批/权限权威记录
Telemetry BackendTrace、Metrics、Logs唯一 Run 状态真相源

8.2 一致性原则 ​

业务关键操作(Run 创建、审批决定、ArtifactVersion 登记、交付冻结)应尽量在单个事务边界内完成。跨服务采用事件驱动最终一致性,明确“已提交/待同步/同步失败”状态。读取 UI 可以使用物化视图,但应显示数据新鲜度,不能让缓存状态覆盖权威状态。[架构推论]

8.3 产物一致性 ​

上传产物时先写临时对象,再计算校验和、完成病毒/格式检查、登记 ArtifactVersion;若数据库事务失败,应清理孤儿对象。下载时校验租户与版本权限,使用短期受控 URL。审核与交付必须绑定不可变版本及校验摘要。[架构推论]

09 · API、事件与契约设计 ​

9.1 API 设计原则 ​

API 以资源为中心:/agents、/agent-versions、/workflows、/runs、/approvals、/artifacts、/deliveries。异步创建 Run 返回 202 Accepted 和可查询的 run_id;请求幂等由客户端提供稳定键。所有资源查询必须执行租户/工作空间权限校验,不能只依赖前端隐藏入口。[架构推论]

http
POST /v1/workflows/wf_123/runs
Authorization: Bearer <token>
Idempotency-Key: research-request-20261101-001
Content-Type: application/json

{"input":{"topic":"非遗数字化创新"},"budget":{"max_usd":8},"workspace_id":"ws_01"}
json
{
  "run_id": "run_01",
  "workflow_version_id": "wfv_12",
  "execution_status": "queued",
  "evaluation_status": "pending",
  "review_status": "not_required",
  "delivery_status": "not_ready",
  "links": {"self": "/v1/runs/run_01", "events": "/v1/runs/run_01/events"}
}

9.2 事件 Envelope ​

json
{
  "event_id": "evt_01",
  "event_type": "step.completed",
  "schema_version": "1.0",
  "tenant_id": "tenant_01",
  "workspace_id": "ws_01",
  "run_id": "run_01",
  "step_run_id": "step_04",
  "attempt_id": "attempt_02",
  "occurred_at": "2026-11-01T08:00:00Z",
  "correlation_id": "corr_01",
  "payload": {"artifact_version_id": "av_07"}
}

该示例是平台自定义事件契约,不是声称 CloudEvents 强制要求这些字段。若采用 CloudEvents,应按其标准 envelope 映射业务字段到扩展属性或 data。[规范/官方 + 架构推论]

9.3 SSE 与 Webhook ​

SSE 面向在线前端实时查看进度;断线重连需支持事件游标或从权威状态重建。Webhook 面向外部系统,要求签名、时间戳、重放防护、重试、死信和订阅权限。两者都是状态通知渠道,不是状态权威存储。[架构推论]

9.4 错误契约 ​

统一返回 code、message、request_id、retryable 和必要的 details。典型错误包括 RUN_STATE_CONFLICT、APPROVAL_EXPIRED、TENANT_ACCESS_DENIED、BUDGET_EXCEEDED、ARTIFACT_VERSION_MISMATCH。不向用户泄露供应商密钥、内部路径或跨租户对象存在性。[架构推论]

10 · 权限、多租户与安全架构 ​

10.1 身份链 ​

区分登录用户身份、平台服务身份、Worker 执行身份和外部工具凭证。Run 创建时保存发起主体、所属租户、工作空间、授权上下文和策略版本;Worker 执行时再次检查仍然有效的关键权限。不能将用户的全权限访问令牌原样长期存入队列。[架构推论]

10.2 租户隔离 ​

数据库查询始终携带租户上下文;可以在适用场景下叠加 PostgreSQL Row-Level Security,但不能只依赖 ORM 开发习惯。对象存储路径与签名 URL、队列任务、缓存键、Trace 属性和日志也必须包含隔离边界。对外错误信息避免泄露其他租户对象的存在。[架构推论]

10.3 密钥与敏感数据 ​

凭证使用专门的 Secret Manager 或受控加密存储,提供轮换与撤销;日志和 Trace 默认脱敏,Prompt、文档、用户上传内容不应无限期全文记录。建立数据分类、保留期限、删除策略、导出审批和访问审计。[架构推论]

10.4 Prompt Injection 与工具风险 ​

来自网页、检索结果、附件和其他 Agent 的内容都可能包含恶意指令。模型输出不得直接变成高权限操作的授权依据;工具网关执行白名单、Schema 验证、权限检查和必要的人审。敏感外发、批量删除、付费操作须有独立业务策略。[架构推论]

11 · 可观测性、评估与成本治理 ​

11.1 三类事实 ​

业务事件回答“Run 的合法状态是什么”;Telemetry 回答“系统执行时发生了什么”;Evaluation 回答“输出质量是否达到标准”。三者通过 run_id、step_run_id、attempt_id、trace_id 关联,但不能混为一谈。[架构推论]

11.2 核心指标 ​

指标建议定义风险提示
Run 完成率succeeded Run / 终结 Run不等于合格交付率
合格交付率满足评估和审核的交付 / 应交付任务需定义分母与时间窗
端到端耗时完成时间-创建时间区分审批等待
队列等待首次开始执行-入队时间需报告 P50/P95/P99
重试率发生额外 Attempt 的 StepRun 占比区分业务返工
工具失败率失败工具调用 / 有效工具调用供应商与工具分类
单份合格报告成本相关总成本 / 合格报告数不能只统计 Token
审批积压超过目标等待时长的 Approval 数需要明确责任人

11.3 Trace 与成本 ​

采用 OpenTelemetry 传播上下文和收集遥测;生成式 AI 语义约定随规范版本演进,应在具体实现时固定版本并验证字段。成本账本区分模型估算、供应商 usage、基础设施分摊与最终账单;每次调用归因到 Run、AgentVersion、Workspace 与 Tenant。[规范/官方 + 架构推论]

11.4 告警与 SLO ​

优先监测无法恢复的 Run、队列堆积、审批超时、异常成本增长、外部供应商错误、存储失败和租户隔离异常。告警需去重、分级、归属、抑制与升级;SLO 目标应根据实际使用者期望和历史数据确定,本文不虚构目标值。[架构推论]

12 · 部署拓扑与容量规划 ​

12.1 MVP 拓扑 ​

mermaid
flowchart LR
  B[Browser] --> WEB[Next.js Web + API]
  WEB --> PG[(Managed PostgreSQL)]
  WEB --> Q[Queue / Dispatcher]
  Q --> WK[Worker Pool]
  WK --> PG
  WK --> OS[(Object Storage)]
  WK --> M[Model & Tool Providers]
  WEB -. logs .-> MON[Monitoring]
  WK -. traces .-> MON

Web/API 与 Worker 应独立部署,以便短请求与长任务分别伸缩。生产部署需要考虑网络出口、秘密管理、备份、监控与运行环境隔离。单实例数据库可作为初期选择,但必须明确备份、恢复和容量风险。[架构推论]

12.2 扩容触发条件 ​

症状首先检查可能的扩容动作
API 延迟升高DB 查询、连接池、缓存命中API 水平扩容/查询优化
Run 排队过久Worker 并发、模型限流Worker 扩容/分队列
数据库锁冲突事务范围、热点行缩短事务/分区/读模型
外部模型 429配额、供应商限制限流、退避、模型路由
Trace 成本过高采样、基数、保留分级采样与保留策略
大量审批等待人员流程、通知机制批量审批/超时升级

12.3 容量估算 ​

在设计阶段记录 每日 Run 数 × 平均 Step 数 × 每 Step 平均调用数 的量级估算;对 Token、对象存储、Trace、数据库写入、峰值并发分别建模。由于实际数据未知,不能据此宣称某技术栈可支持固定 QPS 或固定用户规模。[待验证]

13 · 参考数据库设计 ​

以下是用于讨论聚合关系的 PostgreSQL 示意 DDL,并非完整生产迁移脚本。实际实现需补充外键、索引、RLS、分区、审计保留和迁移策略。

sql
CREATE TABLE agent_versions (
  id UUID PRIMARY KEY,
  tenant_id UUID NOT NULL,
  agent_id UUID NOT NULL,
  version TEXT NOT NULL,
  spec JSONB NOT NULL,
  checksum TEXT NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  UNIQUE (agent_id, version)
);

CREATE TABLE workflow_versions (
  id UUID PRIMARY KEY,
  tenant_id UUID NOT NULL,
  workflow_id UUID NOT NULL,
  version TEXT NOT NULL,
  graph JSONB NOT NULL,
  checksum TEXT NOT NULL,
  UNIQUE (workflow_id, version)
);

CREATE TABLE runs (
  id UUID PRIMARY KEY,
  tenant_id UUID NOT NULL,
  workspace_id UUID NOT NULL,
  workflow_version_id UUID NOT NULL REFERENCES workflow_versions(id),
  execution_status TEXT NOT NULL,
  evaluation_status TEXT NOT NULL DEFAULT 'pending',
  review_status TEXT NOT NULL DEFAULT 'not_required',
  delivery_status TEXT NOT NULL DEFAULT 'not_ready',
  state_version BIGINT NOT NULL DEFAULT 0,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE step_runs (
  id UUID PRIMARY KEY,
  tenant_id UUID NOT NULL,
  run_id UUID NOT NULL REFERENCES runs(id),
  node_key TEXT NOT NULL,
  iteration_no INT NOT NULL DEFAULT 0,
  status TEXT NOT NULL,
  lease_token UUID,
  lease_expires_at TIMESTAMPTZ,
  UNIQUE (run_id, node_key, iteration_no)
);

CREATE TABLE outbox_events (
  id UUID PRIMARY KEY,
  tenant_id UUID NOT NULL,
  aggregate_id UUID NOT NULL,
  event_type TEXT NOT NULL,
  payload JSONB NOT NULL,
  published_at TIMESTAMPTZ,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX idx_runs_tenant_status ON runs (tenant_id, execution_status, created_at DESC);
CREATE INDEX idx_outbox_pending ON outbox_events (created_at) WHERE published_at IS NULL;

约束提醒:UNIQUE (run_id, node_key, iteration_no) 只适用于每次迭代同名节点唯一的工作流模型;并行分支或动态节点需要增加 branch_id / invocation_id。tenant_id 跨表一致性需要复合外键、RLS 或应用层校验共同保障;示意 DDL 未实现这些安全约束。[架构推论]

14 · Studio 端到端案例 ​

14.1 业务场景 ​

用户在 Studio 新建“非遗数字化创新研究”项目,选择研究模板和 Agent 团队,提交研究任务。系统依次完成选题、自动审核、深度调研、分析、人工审批与成果导出;若审核失败,返回指定节点返工。所有阶段保留运行事件、Agent 版本、输入资料、产物版本和成本记录。[架构推论]

14.2 执行时序 ​

mermaid
sequenceDiagram
  participant U as User
  participant P as Platform API
  participant D as Database
  participant W as Workflow Worker
  participant A as Agent Runtime
  participant H as Human Reviewer
  participant S as Artifact Storage
  U->>P: Create research run
  P->>D: Persist Run + Outbox
  P-->>U: run_id
  W->>D: Claim task
  W->>A: Topic Agent (pinned version)
  A-->>W: Candidate topics
  W->>S: Save ArtifactVersion
  W->>A: Review Agent
  A-->>W: revise / approved
  alt revise
    W->>D: Record feedback + new iteration
    W->>A: Topic Agent revision
  else approved
    W->>A: Research + Analysis
    A-->>W: Draft report
    W->>S: Save draft version
    W->>D: Create Approval + wait
    H->>P: Approve specific version
    P->>D: Decision + Resume Outbox
    W->>S: Export delivery package
    W->>D: Mark delivery result
  end
  U->>P: Get run + artifacts
  P-->>U: Status / links / audit summary

14.3 五个关键失败场景 ​

场景风险设计响应
选题 Agent 调用超时重试导致重复费用有界重试、usage 记录
审核持续拒绝无限循环最大迭代次数、预算门禁
人工审批期间服务重启审批状态丢失数据库持久化等待条件
报告导出中 Worker 崩溃重复导出/孤儿文件幂等导出任务、对象清理
交付后 Agent 版本升级历史无法复现Run 固定版本与配置快照

14.4 建议的用户界面 ​

Studio 左侧显示 Workflow 节点状态,中间显示 Agent 协作事件与人工审批,右侧显示产物和版本;顶部展示 Run 状态、耗时、预算和风险提示。产品界面应允许从某次审核意见定位对应的 ArtifactVersion 和 StepRun。原始 Trace 进入开发者诊断视图,不直接暴露敏感工具入参或模型私有推理。[架构推论]

15 · 设计决策与 ADR ​

15.1 建议记录的 ADR ​

ADR决策问题候选与验证
ADR-001模块化单体还是微服务部署/团队成本对比
ADR-002PostgreSQL 是否作为 Run 真相源事务与恢复测试
ADR-003Workflow EngineLangGraph / Temporal / 轻量状态机 PoC
ADR-004Agent RuntimePython/TypeScript SDK 对照
ADR-005队列与 Outbox故障注入和重复投递
ADR-006Artifact 存储与版本一致性与恢复测试
ADR-007多租户隔离越权与数据穿透测试
ADR-008监控与成本Trace 完整性、预算归因

15.2 ADR 模板 ​

markdown
# ADR-XXX · 决策标题
状态:Proposed / Accepted / Superseded
背景与约束:
候选方案:
评估标准:
实验与证据:
决定及理由:
被拒绝方案:
已知风险:
迁移与退出策略:
复审触发条件:

16 · 分阶段工程落地路线 ​

阶段交付重点退出标准
S0 · 基线代码审计、领域模型、ADR、环境现状可复现、约束明确
S1 · 单 RunAgentVersion、Run、Worker、Artifact崩溃后恢复且状态一致
S2 · 多节点Workflow、审核返工、人工审批跨重启审批与返工正确
S3 · 可运营权限、审计、监控、预算、备份关键故障演练通过
S4 · 平台化多工作空间、API/SDK、版本治理跨项目复用与隔离通过
S5 · 扩展性能优化、插件、组织治理有实测瓶颈与收益证据

阶段顺序允许根据现有代码和业务优先级调整;不应把上述表格当成 Studio 已完成进度。[待验证]

17 · 故障模式与恢复策略 ​

故障模式观测信号恢复机制验证方法
API 在提交后超时客户端未知结果幂等键查询已有 Run重复请求
Outbox Dispatcher 宕机待发布事件积压重启后继续扫描故障注入
消息重复投递相同业务键重复出现消费幂等与租约重放消息
Worker 执行中被杀心跳消失/租约过期接管与检查点恢复kill -9 演练
模型供应商不可用错误率上升退避/熔断/可选路由模拟 5xx
工具副作用结果不明超时但外部可能成功对账/人工确认超时注入
数据库连接耗尽连接池报警限流、池配置、降载并发测试
对象存储写入失败导出任务失败有界重试/孤儿清理故障注入
审批链接过期审批 API 拒绝重新签发受控链接过期测试
租户访问穿透异常跨租户请求服务端策略拒绝安全测试
Token 成本异常预算告警停止新调用/人工确认预算模拟
部署版本不兼容Worker 无法反序列化版本固定/滚动回退兼容性测试

18 · 工程验收与测试矩阵 ​

下表是待执行的参考测试,不是测试报告。验收时应记录环境、提交版本、输入、预期、实际结果、日志与责任人。

ID测试场景预期结果
T01创建 Run返回唯一 run_id 与可查询状态
T02请求幂等重复 Idempotency-Key 不创建第二 Run
T03跨租户创建拒绝非法 workspace_id
T04版本固定运行时保持原 AgentVersion
T05工作流版本固定新发布不改变已启动 Run
T06合法状态转移按状态机成功迁移
T07非法状态转移返回冲突且不改数据
T08并发状态更新版本冲突得到明确反馈
T09Outbox 原子性Run 与待发布事件同时提交
T10Dispatcher 崩溃恢复后事件仍可投递
T11重复队列消息仅一个有效业务结果
T12Worker 租约超时任务可被接管
T13旧 Worker 回写fencing token 拒绝陈旧提交
T14Worker 强制终止检查点恢复
T15步骤超时进入定义的重试/失败分支
T16429 限流遵守退避与 Retry-After
T17权限失败不进行无意义自动重试
T18工具未知结果标记不确定并阻止盲目重试
T19工具幂等键支持的外部工具不重复执行
T20审核返工迭代号与意见完整保存
T21返工上限达到上限后进入人工接管
T22人工审批暂停Worker 不长期占用
T23审批跨重启恢复审批等待与执行
T24重复审批只有一次有效决策
T25越权审批拒绝并审计
T26过期审批拒绝并提示更新
T27产物不可变旧版本哈希与内容不变
T28审核版本绑定新版本不继承旧审核
T29导出重复执行不产生重复交付记录
T30对象存储失败记录失败并清理孤儿对象
T31SSE 断线重连补齐事件或重建权威状态
T32Webhook 重放签名/时间窗/去重有效
T33预算耗尽阻止后续计费调用
T34模型 usage 缺失标记估算不伪装实账
T35Trace 关联run_id 与 trace_id 可关联
T36敏感日志脱敏不暴露凭证和受限内容
T37跨租户产物下载拒绝并不泄露对象存在
T38队列积压告警达到条件后触发告警
T39数据库备份恢复恢复后状态与产物引用一致
T40Schema 向前兼容旧 Worker 按策略运行或拒绝
T41部署回滚API/Worker 兼容恢复
T42高并发 Run无丢失/重复终结状态
T43取消执行取消请求与实际结果可区分
T44外部副作用取消明确已执行副作用不可自动撤销
T45质量门禁执行成功但评估失败不交付
T46交付追溯从交付定位 Run/版本/审核
T47审计完整性高风险管理操作有可追溯记录
T48恢复演练记录 RTO/RPO 实测值而非预设
T49数据删除满足保留策略且无跨租户影响
T50供应商故障故障范围隔离并有用户提示

19 · 常见设计误区与修正 ​

误区后果修正
把 Agent SDK 当成完整平台缺少权限、版本、审批、审计独立 Control Plane
只用内存保存工作流重启丢失执行状态持久化检查点
把队列当真相源业务状态不可查询或回放数据库权威状态 + Outbox
假设消息只投递一次重复执行、重复计费幂等、租约、fencing
所有失败统一重试权限错误、预算爆炸分类错误与重试策略
审批绑定“最新版”审核结论漂移绑定 ArtifactVersion
把执行成功视为质量通过低质报告自动交付独立评估与审核状态
全量记录 Prompt/文档隐私与存储风险脱敏、最小化、保留策略
一开始全面微服务化开发与运维复杂度高模块化单体渐进拆分
先定框架再写需求架构被工具牵引从质量属性与 PoC 出发
只做 happy path Demo无法处理崩溃和返工故障注入与恢复验收
把 Trace 当作业务审计状态不完整、保留不一致独立审计事件

20 · 研究局限与后续问题 ​

本文没有获得 Studio 当前仓库、部署配置、实际负载、预算、人员分工和用户使用数据,因此不能证明某一候选方案最优。尤其需要验证:① LangGraph/Temporal/轻量状态机在同一审核返工流程上的恢复成本;② TypeScript 与 Python Worker 的实际维护成本;③ 供应商工具的幂等与超时行为;④ 数据库租户隔离;⑤ Trace 与产物的存储成本;⑥ 备份恢复时间。架构应随真实证据更新 ADR,而不是将本文参考图直接当作生产部署说明。[待验证]

跨章节契约修订说明(v1.3-r1,2026-11-01) ​

本节是第五轮审核后的规范对齐补充,不代表前文所有局部示例已经被自动改写为统一 schema,也不代表完成工程测试。统一契约详见 04-Agent-Platform-Canonical-Contracts-v1.3-r1.md;当本文的参考状态、字段或接口示例与统一契约不一致时,应以统一契约作为后续实现候选基线,并在真正部署前完成迁移与验证。

统一核心状态: [平台设计决策] canonical execution_status 为 queued/running/waiting/paused/cancelling/succeeded/failed/cancelled/timed_out;waiting_approval 等产品状态由 status_reason 映射,cancel_requested 归入 desired_action。本文先前的简化状态图是架构示意,不是冻结后的数据库枚举。状态转换须以 status_version 原子更新;终态不可原地恢复。

统一业务对象与接口: Run 固定 AgentVersion/WorkflowVersion;Attempt 追加不可覆盖;审核绑定 ArtifactVersion;交付固定不可变 Manifest。POST /runs 的 202 仅表示受理,幂等键作用域、摘要、TTL 和冲突处理属于平台自定义契约。

可靠执行: [架构推论/待测试] Outbox 至少一次投递、消费去重、租约 fencing 只约束平台内部提交,不能保证外部工具 exactly-once。业务状态事件独立于 OpenTelemetry 遥测;上线前需进行故障注入、API 契约和数据迁移测试。

附录 A:参考文献与原始资料 ​

以下以官方规范、项目文档和工程实践资料为主。链接用于核验概念和具体机制;不代表本文示例架构已由这些项目联合验证。技术文档可能更新,正式开发时应核对版本。

  1. PostgreSQL Documentation, Transactions. www.postgresql.org/docs/current/tutorial-transactions.html
  2. PostgreSQL Documentation, Explicit Locking. www.postgresql.org/docs/current/explicit-locking.html
  3. PostgreSQL Documentation, Row Security Policies. www.postgresql.org/docs/current/ddl-rowsecurity.html
  4. PostgreSQL Documentation, JSON Types. www.postgresql.org/docs/current/datatype-json.html
  5. OpenTelemetry, Documentation. opentelemetry.io/docs
  6. OpenTelemetry, Context Propagation. opentelemetry.io/docs/concepts/context-propagation
  7. OpenTelemetry, Semantic Conventions for Generative AI. opentelemetry.io/docs/specs/semconv/gen-ai
  8. W3C, Trace Context. www.w3.org/TR/trace-context
  9. CloudEvents, Specification. github.com/cloudevents/spec
  10. CNCF, Cloud Native Glossary: Idempotent. glossary.cncf.io/idempotent
  11. AWS Prescriptive Guidance, Transactional Outbox Pattern. docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html
  12. AWS Prescriptive Guidance, Saga Orchestration Pattern. docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/saga-orchestration.html
  13. Temporal, Documentation. docs.temporal.io
  14. LangGraph, Documentation. docs.langchain.com/oss/python/langgraph/overview
  15. OpenAI, Agents SDK Documentation. openai.github.io/openai-agents-python
  16. OWASP, Top 10 for LLM Applications. genai.owasp.org/llm-top-10
  17. NIST, AI Risk Management Framework. www.nist.gov/itl/ai-risk-management-framework
  18. Google, Site Reliability Engineering Book. sre.google/sre-book/table-of-contents
  19. Google, The Site Reliability Workbook. sre.google/workbook/table-of-contents
  20. OpenAPI Initiative, Specification. spec.openapis.org/oas/latest.html
  21. IETF, HTTP Semantics (RFC 9110). www.rfc-editor.org/rfc/rfc9110
  22. Redis, Documentation. redis.io/docs/latest
  23. Prometheus, Documentation. prometheus.io/docs/introduction/overview
  24. Kubernetes, Documentation. kubernetes.io/docs/home

附录 B:研究证据、验证声明与适用边界 ​

规范支持的事实:PostgreSQL 提供事务、锁与 RLS 机制;OpenTelemetry 提供分布式追踪/指标/日志相关规范与实现生态;W3C Trace Context 规定跨服务 Trace 上下文传播;CloudEvents 定义事件封装格式;HTTP 与 OpenAPI 提供 API 语义和描述基础。具体细节以所采用版本的官方规范为准。

架构推论:模块化单体 + Worker、数据库权威状态、Outbox、版本固定、独立审批、可追溯产物、租户策略及逐步扩容,是针对 Studio 目标场景形成的建议,不属于任何单一标准强制的系统架构。

尚未验证:本文未读取 Studio 源代码,未实际部署候选框架,未运行 T01 - T50 测试,未完成压力、成本、灾备、安全或可用性基准。示例 JSON/SQL/Mermaid 为参考设计,不应不经校验直接用于生产。引用材料并不构成对特定平台商业条款、当前版本兼容性或性能的保证。

后续衔接:下一篇为 04/04/04 · 如何分阶段开发 Agent Platform? - Development Roadmap,应将本文模块边界、不变量、风险和测试矩阵转化为可执行的里程碑、依赖、交付物及验收标准。