Fusion Runtime
定位
Fusion Runtime 是平台里的正式运行时,不是聊天编排器的别名,也不是只存在于 Studio 里的配置页面。
当前仓库里的 Fusion 已经收敛到一个明确模型:
- live draft 保存在
agents - live public access policy 保存在
agents.public_access_mode - publish 会把当前 draft 物化为一个 immutable
agent_version - publish 会同时把
public_access_mode物化进 immutableagent_version fusion_runs始终绑定agent_version_id- run / input / output / governance context 会被持久化,作为审计与排障依据
agent_api_keys以 hash-only 形式持久化 Fusion public credential inventory- capability binding,而不是聊天会话状态,是 Fusion 的主要执行入口
如果用当前实现来描述,Fusion 更接近“Agent 持有 draft 与 snapshot 的受控任务运行时”。
与 Agent、Orchestrator 的关系
Agent 仍然是统一控制面实体
Fusion 没有替代 Agent。
当前实现里:
Agent承载 live Fusion runtime draftAgentVersion承载 immutable Fusion runtime snapshotFusionRun记录一次真实执行published_agent_version_id指向当前默认运行时快照
也就是说,Agent 负责被管理,Fusion Runtime 负责被执行,而 AgentVersion 是两者之间的 immutable 边界。
Orchestrator 不是 Fusion 的上位概念
当前代码对 orchestrator 的定义仍然是:
- 它是
chat运行时内部的二级选择 agent_type才是更粗粒度的顶层运行时分流
因此:
chatruntime 继续按orchestrator_key细分fusionruntime 不依赖 chat orchestrator registry 才能成立POST /agents/{agent_id}/fusion-runs仍支持 JSONinput_item_list与 multipart form-data;上传文件时,表单字段名直接对应 input slot key
当前核心模型
flowchart LR
Agent[Agent<br/>live Fusion draft]
Ver[AgentVersion<br/>immutable Fusion snapshot]
Run[Fusion Run<br/>one execution]
Gov[Governance Context<br/>persisted snapshot]
Agent -->|publish| Ver
Agent -->|default pointer| Ver
Ver -->|1:N| Run
Agent -->|inherit defaults| Gov
Gov -->|persisted on run| Run
关键结论:
- Fusion Runtime 的主执行单位是
run - 默认执行目标不是 live draft,而是 published
agent_version - run 会持久化治理快照,避免后续 Agent 挂载变化污染历史解释
当前执行链路
flowchart LR
Load[load agent snapshot] --> ValidateContract[validate snapshot contract]
ValidateContract --> ValidateInputs[validate run inputs]
ValidateInputs --> PersistInputs[persist validated inputs]
PersistInputs --> ResolveBindings[resolve capability bindings]
ResolveBindings --> PrepareArtifacts[prepare file artifacts]
PrepareArtifacts --> Retrieve[retrieve context]
Retrieve --> Prompt[build prompt]
Prompt --> Plan[plan tool usage]
Plan --> Tools[invoke tools]
Tools --> Model[invoke model]
Model --> Normalize[normalize outputs]
Normalize --> ValidateOutputs[validate outputs]
ValidateOutputs --> PersistOutputs[persist outputs]
PersistOutputs --> Finalize[finalize run]
这些阶段当前都有对应实现,不是设计占位:
ai_service/fusion/infrastructure/runtime/graph.pyai_service/fusion/infrastructure/runtime/nodes.pyai_service/fusion/infrastructure/runtime/runner.pyai_service/fusion/domain/validation.pyai_service/fusion/infrastructure/runtime/output_mapper.pyai_service/fusion/infrastructure/runtime/prompt_builder.py
对于 structured_json 输出,当前 runtime 会按以下优先级尝试:
- LangChain
with_structured_output(),前提是当前 model handle 暴露该能力,且 output contract 是纯structured_json合约 - provider-native
response_format={"type":"json_object"},前提是当前 provider 被标记为支持 - prompt-only structured JSON 路径,再由
output_mapper + validator做最终收敛与校验
如果某一步不可用或失败,runtime 不会中断该 run,而是把原因写入 governance_context.warnings,然后继续走后备路径。
当前能力绑定
Fusion runtime 不直接假设“只靠一个模型说话”,而是先把 snapshot 里的 binding 解析为可执行能力。
当前至少包括:
modelragmcpstorageimage_generation
对应代码位于:
ai_service/fusion/infrastructure/adapters/model_binding.pyai_service/fusion/infrastructure/adapters/rag_binding.pyai_service/fusion/infrastructure/adapters/mcp_binding.pyai_service/fusion/infrastructure/adapters/storage_binding.pyai_service/fusion/infrastructure/adapters/image_generation_binding.py
当前继承行为
如果 Fusion snapshot 中的 binding 没有显式指定 agent_id,runtime 会默认落到当前 run 的 owning agent_id 上,而不是推断另一套外部主体。
典型行为包括:
rag.agent_id未显式指定时,默认继承当前 Agentmcp.agent_id未显式指定时,默认继承当前 Agent- snapshot 显式指定时,以 snapshot 配置为准
所以 Fusion 不是脱离主平台的孤立沙盒,而是一个可继承平台治理上下文的运行时。
当前持久化与 API 面
Fusion 当前的核心持久化对象包括:
agents上的 live Fusion draft 字段agents.public_access_modeagent_versions上的 immutable Fusion snapshot 字段agent_versions.public_access_modeagent_api_keysfusion_runsfusion_run_inputsfusion_run_outputs
当前主控制面 API 包括:
PATCH /agents/{agent_id}保存 live Fusion draftGET /agents/{agent_id}/versionsPOST /agents/{agent_id}/publishPOST /agents/{agent_id}/rollback
当前运行时 API 包括:
POST /agents/{agent_id}/fusion-runsGET /agents/{agent_id}/fusion-runsGET /agents/{agent_id}/fusion-runs/{run_id}GET /public/agents/{agent_id}/fusion-runtimePOST /public/agents/{agent_id}/fusion-runsGET /public/agents/{agent_id}/fusion-runsGET /public/agents/{agent_id}/fusion-runs/{run_id}
当前公开访问策略包括:
public_access_mode=admin_only:Fusion 只允许受保护控制面访问public_access_mode=public_anonymous:匿名可访问/public/agents/{agent_id}/fusion-runtime与/fusion-runs*public_access_mode=public_api_key:必须携带x-agent-api-key才能访问 public Fusion route- public Fusion metadata 始终来自
published_agent_version_id指向的 immutable snapshot,而不是 live draft - public Fusion 的 list/get/download 只暴露绑定到当前
published_agent_version_id的 run,不公开历史 snapshot run - public API key 只在创建成功响应里回传一次明文;服务端后续只保存 hash、prefix 和元数据
这说明 Fusion 已经是平台 API 与存储模型中的一等运行时对象,但它的 draft 与 snapshot 边界已经并入通用 Agent 体系。
当前边界
Fusion Runtime 适合回答这类问题:
- 需要显式输入 / 输出契约吗
- 需要把 live draft 与 published snapshot 分层吗
- 需要把一次执行完整持久化吗
- 需要把模型、RAG、MCP、文件处理组合为一个受控 run 吗
它不等同于:
- 长期多轮聊天 session runtime
- chat orchestrator 的一个皮肤
- 单纯的 Studio 配置页面
对命名修复的启发
如果从当前实现反推命名,最稳妥的结论是:
chat、etl、document_extraction、fusion实际承担的是顶层运行时分流orchestrator_key只是chatruntime 内部的细分选择
因此后续如果要修复概念漂移,更合理的方向是把 agent_type 逐步收敛为更接近运行时语义的名字,例如:
runtime_kindagent_runtime_type
但在真正改代码之前,文档需要先统一表达:Fusion 是正式 runtime,而 AgentVersion 才是它的 immutable snapshot 边界。