
OODER 是一个以 Workflow 为驱动的 AI 原生应用开发平台。它的核心是将 NLP 管道、AI Agent、人工审批、事件驱动等能力统一抽象为 流程定义 (ProcessDefinition),通过统一的 SkillFlowEngine 驱动执行,实现"一次编排、多处运行"。

原存在 5 套并行执行模型(NlpPipeline / ScenarioOrchestrator / SkillFlowNode / SkillFlowExecutionEngine / WorkflowEngine),已统一为 SkillFlowEngine 单入口:
LocalEngine
= 当前 SkillFlowExecutionEngine + WorkflowEngine 合并,在 studio 进程内运行 RemoteEngine
= BPM WorkflowEngine 代理(aiserver),通过 HTTP 调用远程执行 RecoveryEngine
= 从 ActivityInstance.checkpoint 恢复执行(冷启动),@PostConstruct 加载非终态实例
流程定义是 workflow 的静态蓝图,描述从输入到产出的有向 DAG 图:
属性 | 类型 | 说明 |
|---|---|---|
processDefId | String | 流程定义唯一ID e.g. "rad-scene", "bpm-scene" |
name | String | 流程名称 e.g. "RAD组件设计" |
version | int | 版本号 |
workMode | String | 工作模式:architect / business / work |
classification | String | 分类:architect / business / all |
roundType | String | 轮次类型:first (首轮) / multi (多轮) |
activities | List<ActivityDefinition> | 活动定义列表 |
transitions | List<Transition> | 迁移路线列表 |
swimLanes | List<SwimLaneDef> | 泳道定义(SG 分组) |
guardConfig | GuardConfig | 守卫配置(回退策略等) |
活动是流程中的最小执行单元,由 ActivityType 决定执行语义,子模式进一步细化:
属性 | 类型 | 说明 |
|---|---|---|
activityId | String | 活动唯一ID |
activityType | ActivityType | 活动类型:TASK / LLM_AGENT / HUMAN / AGENT_EVENT / SUBPROCESS / CALL_ACTIVITY / START / END |
taskMode | TaskMode | TASK 子模式:SKILLS / SCENE_GROUP / SERVICE / SCRIPT |
humanMode | HumanMode | HUMAN 子模式:CONFIRM / FORM / APPROVAL / DELEGATE |
llmMode | LlmMode | LLM_AGENT 子模式:SINGLE / HARNESS / PROGRESSIVE |
eventMergeMode | EventMergeMode | AGENT_EVENT 合并模式:JOIN_BACK / MERGE_JOIN / AUTO_ADVANCE |
sceneGroupId | String | 关联的场景组ID,taskMode=SCENE_GROUP 时必填 |
splitMode | SplitMode | 分支模式:SEQUENCE / XOR_SPLIT / AND_SPLIT / OR_SPLIT / EVENT_SPLIT |
joinMode | JoinMode | 汇聚模式:AND_JOIN / XOR_JOIN / OR_JOIN |
skillId | String | 绑定的 Skill ID(TASK 模式下) |
config | Map | 扩展配置(operations 列表、LLM 配置等) |
流程的一次运行实例,管理全生命周期状态:
状态 | 说明 |
|---|---|
PENDING | 待启动 |
RUNNING | 运行中 |
PAUSED | 暂停(等待 HUMAN 确认/事件触发) |
SUSPENDED | 挂起(HUMAN 收回/退回等待) |
COMPLETED | 正常完成 |
FAILED | 执行失败 |
CANCELLED | 人工取消 |
ARCHIVED | 已归档 |
状态 | 说明 |
|---|---|
PENDING | 待执行 |
RUNNING | 执行中 |
COMPLETED | 正常完成 |
FAILED | 执行失败 |
PAUSED | 暂停等待 |
SKIPPED | 已跳过 |
WITHDRAWN | 已收回(HUMAN 收回操作) |
RETURNED | 已退回(HUMAN 退回操作) |
EVENT_WAITING | 事件等待(AGENT_EVENT 专用) |
从原有 13+ 枚举值精简为 8 值(6 核心 + 2 边界),子模式进一步细分执行语义:
类型 | 类别 | 子模式 | 说明 |
|---|---|---|---|
START | 边界 | — | 流程起始节点,流程实例创建后自动进入 |
END | 边界 | — | 流程结束节点,到达后设置 ProcessInstance.COMPLETED |
TASK | 核心 | SKILLS / SCENE_GROUP / SERVICE / SCRIPT | 自主驱动任务。SKILLS 编排 Skill 执行;SCENE_GROUP 进入 SG 自驱动 |
LLM_AGENT | 核心 | SINGLE / HARNESS / PROGRESSIVE | LLM 交互节点。SINGLE 单次 FC-Loop;HARNESS 多轮+校验;PROGRESSIVE 渐进式自决策 |
HUMAN | 核心 | CONFIRM / FORM / APPROVAL / DELEGATE | 人工节点。一等公民,10 种操作,支持特送/收回/退回/委托 |
AGENT_EVENT | 核心 | eventMergeMode: JOIN_BACK / MERGE_JOIN / AUTO_ADVANCE | 事件钩子。自活节点,强制分支分裂,条件满足后合并回主流程 |
SUBPROCESS | 子流程 | — | 子流程嵌入。父流程可调度内部节点,子流程 HUMAN 阻断父流程 |
CALL_ACTIVITY | 子流程 | — | 流程跳转/外部流程调用,支持跨流程实例调用 |
旧类型 | 去向 |
|---|---|
LLM_CALL | → 合并到 LLM_AGENT(fromCode 保持兼容) |
HUMAN_AGENT | → 合并到 HUMAN + humanMode 区分 |
HUMAN_TASK | → 合并到 HUMAN + humanMode 区分 |
AGENT_TASK | → 合并到 TASK + taskMode 区分 |
GATEWAY | → 由 SplitMode/JoinMode + Transition 承载 |
LOOP | → 由 Transition.BACKWARD + maxRetry 承载 |
SERVICE | → 合并到 TASK (config.taskMode="service") |
SCRIPT | → 合并到 TASK (config.taskMode="script") |
SCHEDULED_TRIGGER | → 合并到 AGENT_EVENT (config.eventType="timer") |
scene-engine 使用 8 值 ActivityType,aiserver/BPM 平台使用 9 值实现枚举进行引擎分派:
ActivityType | → ActivityDefImpl | 引擎分派 |
|---|---|---|
TASK (SKILLS) | Tool | serviceEngine |
TASK (SCENE_GROUP) | Block | 阻塞服务(场景服务) |
TASK (SERVICE) | Service | agentEngine |
LLM_AGENT | Service | agentEngine |
HUMAN | No | rightEngine(权限控制) |
AGENT_EVENT | Event | eventEngine |
SUBPROCESS | SubFlow | 子流程 |
CALL_ACTIVITY | OutFlow | 外部流程 |
START / END | Process | 边界 |
SkillFlowEngine 是流程执行的统一入口,职责:
startExecution(processDefId, context)
→ 创建 ProcessInstance (PENDING)
→ 获取 START 活动的出边活动
→ 加入 activityQueue
→ 循环:
取出活动 → executeActivity(actDef)
→ 按 ActivityType 分派:
TASK → executeTaskActivity()
LLM_AGENT → executeLlmAgent()
HUMAN → executeHumanActivity()
AGENT_EVENT→ executeAgentEvent()
SUBPROCESS → executeCallActivityActivity()
CALL_ACTIVITY → executeCallActivityActivity()
→ RouteToEngine.resolveRoute()
→ 决定下一个活动
→ 更新 ProcessInstance 状态
→ 直到 END 或 PAUSED统一路由分派,根据 ActivityType 走不同路由策略:
路由方法 | 处理类型 | 说明 |
|---|---|---|
resolveTaskRoute() | TASK | 内部分 taskMode:SKILLS→skillId 绑定执行推进;SCENE_GROUP→进入 SG 自驱动 |
resolveLlmAgentRoute() | LLM_AGENT | 内部分 llmMode:SINGLE→单次 FC-Loop;HARNESS→多轮+校验;PROGRESSIVE→渐进式 |
resolveHumanRoute() | HUMAN | 先检查 HUMAN 一等公民操作(SPECIAL_SEND/WITHDRAWN/RETURNED/DELEGATE),再走默认路由 |
resolveAgentEventRoute() | AGENT_EVENT | 事件注册 → 主分支继续 → 事件分支等待 → 触发后汇总 |
resolveSceneGroupRoute() | TASK(SCENE_GROUP) | 检查当前 scene 完成状态,全部完成则推进到下一活动 |
路由结果枚举,决定引擎下一步行为:
RouteAction | 含义 | 引擎行为 |
|---|---|---|
AUTO_ADVANCE | 自动推进 | continueExecution() 继续循环 |
LLM_DISPATCH | LLM 调度 | 等待 LLM 通过 routeTo 指定下一步 |
HUMAN_CHOICE | 人工选择 | 等待用户选择路由 |
EVENT_WAIT | 事件等待 | 暂停分支等待事件触发 |
TASK_COMPLETE | 任务完成 | 标记完成 |
NO_MATCH | 无路由 | 触发 guard_escalation |
SPECIAL_SEND | 特送 | continueExecution() 跨步骤跳转 |
WITHDRAWN | 收回 | 仅终止当前分支不推进 |
RETURNED | 退回 | 有显式 target 时 continueExecution,否则 legacy routeToNext 处理 BACKWARD |
DELEGATED | 委托 | continueExecution() 路由到委托目标 |
完整的 18 个流程定义枚举,按分类和轮次类型组织:
枚举值 | 流程定义ID | 分类 | 轮次类型 | 说明 |
|---|---|---|---|---|
INTENT_DISPATCH | intent-dispatch | all | first | 意图分发流程 |
RAD_SCENE | rad-scene | architect | first | RAD 组件设计 |
BPM_SCENE | bpm-scene | architect,business | first | BPM 流程编排 |
DEEP_DESIGN_SCENE | deep-design-scene | architect | multi | 深度设计 |
PAGE_DEBUG_SCENE | page-debug-scene | architect,business | multi | Page 调试 |
PATENT_REVIEW_SCENE | patent-review-scene | business | first | 专利审查 |
KNOWLEDGE_INIT_SCENE | knowledge-init-scene | architect | first | 知识库初始化 |
DBFIRST_BUILD | dbfirst-build | architect | first | 数据库优先构建 |
VIEWFIRST_BUILD | viewfirst-build | architect | first | 视图优先构建 |
DESIGNERFIRST_BUILD | designerfirst-build | architect | first | 设计器优先构建 |
PERSISTENCE_LAYER_SUBFLOW | persistence-layer-subflow | architect | first | 持久层子流程 |
QUALITY_VALIDATION_SUBFLOW | quality-validation-subflow | all | multi | 质量校验子流程 |
ARCHITECT_PIPELINE | architect-pipeline | architect | first | 架构师流水线 |
BUSINESS_PIPELINE | business-pipeline | business | first | 业务流水线 |
UNDERSTAND_SUBFLOW | understand-subflow | all | first | 理解子流程 |
COMPONENT_GENERATE_SUBFLOW | component-generate-subflow | architect | first | 组件生成子流程 |
LLM_FALLBACK_SUBFLOW | llm-fallback-subflow | all | multi | LLM 回退子流程 |
INTEGRATE_SUBFLOW | integrate-subflow | architect | first | 集成子流程 |
BUSINESS_INTEGRATE_SUBFLOW | business-integrate-subflow | business | first | 业务集成子流程 |
维度 | 值域 | 说明 |
|---|---|---|
classification | architect / business / all | architect: 架构师流程,business: 业务人员流程,all: 通用 |
roundType | first / multi | first: 首轮执行,multi: 多轮迭代执行 |
操作 | 说明 | 是否需要DESIGNER定义 | 图标 |
|---|---|---|---|
SEND | 发送(正常推进) | 否 | ri-send-plane-line |
PAUSE | 暂停 | 否 | ri-pause-circle-line |
RESUME | 恢复 | 否 | ri-play-circle-line |
TERMINATE | 终止 | 否 | ri-stop-circle-line |
SPECIAL_SEND | 特送(跨步骤跳过中间节点) | 是 | ri-skip-forward-line |
WITHDRAW | 收回(已发送但未执行的活动收回) | 是 | ri-arrow-go-back-line |
RETURN | 退回(Transition.BACKWARD + maxRetry) | 是 | ri-close-circle-line |
DELEGATE_H2A | 委托给 Agent | 是 | ri-robot-line |
DELEGATE_H2H | 委托给他人 | 是 | ri-user-shared-line |
DELEGATE_H2T | 委托给 Task | 是 | ri-flashlight-line |
INTERVENE_EXCEPTION | 例外介入(守卫触发时) | 否 | ri-error-warning-line |
闭环链路:
HumanOperationEngine.getAvailableOperations()
→ SkillFlowEngine.executeHumanActivity()
→ 写入 _availableOperations_{actId}
→ SseEventPushListener SSE 推送
→ 前端 _renderHumanOperationBar 动态渲染RouteToEngine.resolveHumanRoute 必须在 _taskCompleted 检查前先调用 checkHumanOperationRoute:
优先级 | 操作 | context/status 标记 | 路由行为 |
|---|---|---|---|
1 | SPECIAL_SEND | _specialSendFrom + _routeToActivityId | 跨步骤 routeTo 目标,continueExecution |
2 | RETURNED | actInstance.status=RETURNED + _returnFrom + _returnToActivityId(可选) | 有 target 时 continueExecution,否则 legacy routeToNext 处理 BACKWARD |
3 | WITHDRAWN | actInstance.status=WITHDRAWN | 仅终止当前分支不推进 |
4 | DELEGATED | _delegatedFrom_{actId} + _delegateType_{actId} + _delegateConfig_{actId} | 路由到委托目标,continueExecution |
SceneGroup (SG) 是 Workflow 中的泳道 (SwimLane)概念。每个 SG 是独立封闭的自驱动单元,流程可通过注入上下文影响但不能调度 SG 内部节点。
SG-UNDERSTAND理解RouteAgent意图路由分发SG-UNDERSTANDSG-DESIGN设计MCPAgent调用外部设计工具SG-DESIGNSG-GENERATE生成MCPAgent调用代码生成服务SG-GENERATESG-QUALITY质量CoordinatorAgent多Agent协调校验SG-QUALITYSG-INTEGRATE集成RouteAgent模块间路由SG-INTEGRATE
维度 | SUBPROCESS(子流程) | SCENE-GROUP(场景组) |
|---|---|---|
调度权 | 父流程可调度子流程内部节点 | 父流程不可调度SG 内部节点 |
上下文 | 子流程共享父流程上下文 | SG 独立上下文,仅通过注入影响 |
HUMAN 行为 | 子流程 HUMAN阻断父流程 | SG 内 HUMAN不阻断,仅驱动场景 |
自管理 | 子流程由父流程驱动 | SG自驱动,独立管理快照/进度/任务调度 |
返回方式 | 子流程按节点返回 | SG 完整交付任务后整体返回 |
LLM 配置 | 从父流程继承 | 继承自 SG 配置或可选择从流程继承 |
引擎遇到 TASK(taskMode=SCENE_GROUP):
① 读取 sceneGroupId + sceneGroupContextInjection
② 获取/创建 SG 实例(SceneGroupManager)
③ 注入流程上下文 → SG.businessContext
④ 激活 SG(SceneGroup.activate())
⑤ 引擎将当前 ActivityInstance 设为 PAUSED(eventWait)
⑥ SG 自驱动执行(内部独立管理)
SG 执行期间:
- SG 独立管理快照/进度/任务调度
- SG 内 HUMAN 不阻断外部流程
- SG 内 LLM 配置继承自 SG
SG 完成后:
- 设置 SceneGroupOutput(taskStatus/taskSummary/artifacts)
- 通知引擎 → resumeActivity
- 写入 SG 产出物到 processInst.context
- 沿 Transition 推进到下一活动字段 | 类型 | 说明 |
|---|---|---|
taskStatus | String | "completed" | "failed" | "partial" |
taskSummary | String | 任务摘要文本 |
contextUpdates | Map<String,Object> | SG 上下文变更,合并到流程上下文 |
artifacts | List<ArtifactInfo> | 产出物列表(代码、文档、配置等) |
phaseDeliverables | Map<String,Object> | 阶段目标交付物(用于多轮迭代) |
auditLog | List<SceneGroupEvent> | 运行历程,用于审计和回溯 |
策略 | 说明 |
|---|---|
AUTO_HANDLE | SG 自动处理 HUMAN 节点(使用默认值/自动选择),不暂停 SG |
SCENE_DRIVE | HUMAN 操作仅作为场景驱动因素记录到 auditLog,不阻断 SG 执行 |
CRITICAL_PAUSE | 仅在关键决策点暂停 SG(SG 内部 PAUSED),不影响外部流程 |
阶段 | 说明 | SSE 推送 |
|---|---|---|
onRegistered | 事件订阅已注册到 AgentEventBridge | flow_event_register |
onMatched | 事件条件已匹配成功 | flow_event_matched |
onEvent | 事件正在处理中 | flow_step(phase=event) |
onComplete | 事件分支已完成,准备合并 | flow_step(phase=event_completed) |
模式 | 说明 |
|---|---|
JOIN_BACK | 事件完成后回到产生分裂的节点,重新执行该节点的后续路由 |
MERGE_JOIN | 事件完成后到指定的 AND_JOIN 节点汇聚,等待所有分支到达后继续 |
AUTO_ADVANCE | 事件完成后直接推进到当前节点的下一个活动,不等待也不回退 |
引擎遇到 AGENT_EVENT:
① 注册事件订阅(AgentEventBridge.registerSubscription)
② 查找非 AGENT_EVENT 出边(主分支继续)
③ 将主分支目标加入 activityQueue 继续执行
④ 创建 AGENT_EVENT 暂停分支(新 Token + 新 ActivityInstance)
⑤ 事件触发后 → AgentEventBridge.handleEventForSubscription()
→ 根据 eventMergeMode 决定汇聚方式:
JOIN_BACK → 回到分裂节点重新路由
MERGE_JOIN → 路由到 AND_JOIN 等待汇聚
AUTO_ADVANCE → 直接推进到下一活动
SseEventAssembler 将引擎内部事件统一组装为前端可消费的 SSE 事件格式:
事件名 | 触发时机 | 数据载荷 |
|---|---|---|
flow_step | 每个活动执行完成 | activityId, activityType, status, output, phase |
flow_route | 路由决策完成 | fromActivity, toActivity, routeAction, reason |
flow_artifact | 活动产生产出物 | activityId, artifactType, artifactData |
flow_complete | 流程整体完成 | processInstId, finalStatus, summary |
引擎内部事件ActivityEventSseEventAssembler事件组装SseEventPushListenerSSE 推送前端消费NlpChatInline
场景 | 进入方式 | SSE 事件序列 |
|---|---|---|
Designer 模式 | RadChatScene | connected → flow_start → flow_plan → flow_step(tool_call) → flow_artifact → flow_complete |
Build 模式 | IntentDispatchScene → RadChatScene | connected → flow_start(intent_dispatch) → flow_step → flow_route → switch_scene_flow → flow_start(rad) → flow_step → flow_complete |
Work 模式 | WorkChatScene / SkillFlowChatScene | connected → flow_start → skill_match → skill_orchestrate → skill_execution_plan → flow_step(tool_call) → flow_artifact → flow_complete |
组件 | 消费事件 | 渲染行为 |
|---|---|---|
SseChatInline | flow_step, token, thinking | 逐 token 渲染 LLM 输出 |
ToolCallPanel | tool_call, flow_artifact | 增量渲染工具调用卡片 |
FlowStatusBar | flow_start, flow_plan, flow_step, flow_complete | 显示流程进度条 |
HumanOperationBar | human_operation_bar, human_confirm | 动态渲染操作按钮 |
前端消费 tool_call 事件时,根据 toolName 分发到 30+ 处理器:
function dispatchToolCall(toolName, payload) {
switch (toolName) {
case 'createFile':
case 'editFile':
case 'deleteFile':
→ FileToolHandler
case 'readFile':
case 'searchFile':
→ ReadToolHandler
case 'runCommand':
case 'runScript':
→ ExecutionToolHandler
case 'webSearch':
case 'webFetch':
→ WebToolHandler
case 'askHuman':
case 'humanConfirm':
→ HumanToolHandler
default:
→ GenericToolHandler
}
}前端 FlowConstants.SSE_EVENT 与后端实际推送事件的完整对齐:
后端事件 | 前端常量 | 消费组件 |
|---|---|---|
connected | SSE_CONNECTED | SseChatInline |
error | SSE_ERROR | SseChatInline, FlowStatusBar |
token | SSE_TOKEN | SseChatInline |
thinking | SSE_THINKING | SseChatInline |
step | SSE_STEP | SseChatInline |
progress | SSE_PROGRESS | SseChatInline |
tool_call | SSE_TOOL_CALL | ToolCallPanel |
human_confirm | SSE_HUMAN_CONFIRM | HumanOperationBar |
flow_artifact | SSE_FLOW_ARTIFACT | ToolCallPanel |
flow_start | SSE_FLOW_START | FlowStatusBar |
flow_plan | SSE_FLOW_PLAN | FlowStatusBar |
flow_step | SSE_FLOW_STEP | FlowStatusBar, SseChatInline |
flow_route | SSE_FLOW_ROUTE | FlowStatusBar |
flow_complete | SSE_FLOW_COMPLETE | FlowStatusBar |
switch_scene_flow | SSE_SWITCH_SCENE | FlowStatusBar |
flow_event_register | SSE_EVENT_REGISTER | FlowStatusBar |
flow_event_matched | SSE_EVENT_MATCHED | FlowStatusBar |
skill_match | SSE_SKILL_MATCH | ToolCallPanel |
skill_orchestrate | SSE_SKILL_ORCHESTRATE | ToolCallPanel |
skill_execution_plan | SSE_SKILL_EXEC_PLAN | ToolCallPanel |
harness_log | SSE_HARNESS_LOG | ToolCallPanel |
scene_harness | SSE_SCENE_HARNESS | ToolCallPanel |
harness_end | SSE_HARNESS_END | ToolCallPanel |
human_operation_bar | SSE_HUMAN_OP_BAR | HumanOperationBar |
guard_escalation | SSE_GUARD_ESCALATION | HumanOperationBar, FlowStatusBar |
flow_status_update | SSE_FLOW_STATUS | FlowStatusBar |
ContextLayerManager 统一管理六层上下文,每层隔离、可组合:
层级 | 名称 | 内容 | 生命周期 |
|---|---|---|---|
L1 | SYSTEM | 系统提示词、全局配置、LLM 基础参数 | 应用启动 → 关闭 |
L2 | PROCESS | ProcessInstance 上下文,活动状态、路由决策记录 | 流程创建 → 结束 |
L3 | KNOWLEDGE | 知识库数据、VFS 文件内容、参考文档 | 流程创建 → 结束 |
L4 | HISTORY | 压缩后的历史记录、SkillExecutionSummary | 活动开始 → 结束 |
L5 | WORKING | 当前活动的工作数据、LLM 中间结果 | 活动执行期间 |
L6 | EPHEMERAL | 临时数据、FC-Loop 瞬态状态 | 单次 FC-Loop 调用 |
ContextLayerManager 是 6 层上下文的统一管理入口,职责:
ContextCompressor 使用 LLM-enhanced 压缩策略,保留核心信息:
SkillExecutionSummary 21 字段:包括 taskId, taskType, status, duration, tokenCount, inputSummary, outputSummary, keyDecisions, errorInfo, artifacts, routePath, llmModel, llmConfig, contextSize, compressionRatio, quality, retryCount, humanInterventions, subTaskSummary, metadata, rawLogPath
// 压缩流程:ContextCompressor.compress()
1. 收集 HISTORY 层原始数据
2. 按时间窗口分组(会话/活动级别)
3. LLM 压缩请求生成摘要
4. 提取 SkillExecutionSummary
5. 过滤掉低价值信息(保留结构、决策、异常)
6. 计算 compressionRatio 写入元数据Transition 是活动之间的有向边,组成流程的 DAG 结构:
属性 | 类型 | 说明 |
|---|---|---|
sourceId | String | 源活动 ID |
targetId | String | 目标活动 ID |
condition | Expression | 条件表达式(可选),满足条件才触发 |
priority | int | 优先级,值越小越优先(默认 0) |
transitionType | TransitionType | FORWARD 正向 / BACKWARD 回退 |
模式 | 说明 |
|---|---|
SEQUENCE | 顺序执行所有出边活动(默认模式) |
XOR_SPLIT | 排他分支,只执行第一个满足条件的出边 |
AND_SPLIT | 并行分支,所有出边同时执行 |
OR_SPLIT | 或分支,执行所有满足条件的出边 |
EVENT_SPLIT | 事件分支,AGENT_EVENT 专用,分裂出事件等待分支 |
模式 | 说明 |
|---|---|
AND_JOIN | 所有前驱活动到达后才触发当前活动(同步屏障) |
XOR_JOIN | 任一前驱活动到达即触发(排他汇聚) |
OR_JOIN | 部分前驱活动到达即触发(不完全同步) |
ActivityType | SplitMode 默认 | JoinMode 默认 | 路由策略 |
|---|---|---|---|
START | SEQUENCE | — | 无条件出边 |
END | — | XOR_JOIN | 流程结束 |
TASK | SEQUENCE / AND_SPLIT | AND_JOIN | resolveTaskRoute |
LLM_AGENT | XOR_SPLIT (LLM 决策) | XOR_JOIN | resolveLlmAgentRoute |
HUMAN | XOR_SPLIT (人工选择) | XOR_JOIN | resolveHumanRoute |
AGENT_EVENT | EVENT_SPLIT | eventMergeMode | resolveAgentEventRoute |
SUBPROCESS | SEQUENCE | AND_JOIN | 子流程完成后继续 |
CALL_ACTIVITY | SEQUENCE | AND_JOIN | 外部流程完成后继续 |
AND_JOIN 检查所有入边活动是否均已到达:
// joinChecker.checkAndJoin(actDef)
获取 actDef 所有前驱活动
检查 每个前驱活动的 ActivityInstance.status == COMPLETED
如果 全部 COMPLETED → 触发当前活动
否则 → 继续等待(不触发)属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
maxRetry | int | 3 | 单个活动最大重试次数 |
maxGlobalBackward | int | 5 | 全局最大回退次数 |
noMatchPolicy | NoMatchPolicy | DEFAULT | 无路由匹配时的处理策略 |
策略 | 说明 |
|---|---|
ESCALATE_HUMAN | 升级到 HUMAN,创建 INTERVENE_EXCEPTION 节点,等待人工干预 |
RETRY_LAST | 重试最后失败的活动 |
SKIP | 跳过当前活动,继续执行下一活动 |
DEFAULT | 按流程默认策略处理(通常为 ESCALATE_HUMAN) |
完整载荷结构:
{
"failedActivityId": "act_llm_001",
"interventionActivityId": "act_human_intervene",
"reasonCode": "NO_MATCH_ESCALATION",
"humanMode": "EXCEPTION_INTERVENTION",
"interventionRequired": true,
"guardPausedReason": "重试3次后仍无匹配路由",
"exceptionContext": { ... },
"availableOperations": ["SEND", "RETURN", "TERMINATE"]
}通过 NoMatchPolicy.fromCode(str) 进行映射,而非手动 switch:
NoMatchPolicy policy = NoMatchPolicy.fromCode(config.getNoMatchPolicy());
switch (policy) {
case ESCALATE_HUMAN:
// 创建 EXCEPTION_INTERVENTION 节点
break;
case RETRY_LAST:
// 重试最后活动
break;
case SKIP:
// 跳过
break;
default:
// 使用 DEFAULT 策略
}Studio(主应用)NlpChatInline 前端SkillFlowEngineHumanOperationEngineAiServer(远程)BPM WorkflowEngineRemote AgentRemote ProcessInstanceooder-test(测试)闭环测试框架NLP Harness场景验证HTTPSSE通信协议SSE: 前端 ←→ StudioHTTP: Studio ←→ AiServerSQLite / VFS: 本地持久化
通信路径 | 协议 | 数据格式 |
|---|---|---|
前端 ←→ Studio | SSE(Server-Sent Events) | JSON 事件流 |
Studio ←→ AiServer | HTTP REST | JSON |
Studio → SQLite | JDBC | 关系数据 |
Studio → VFS | 文件 I/O | .cls 文件 |
模块 | Maven 坐标 | 核心职责 |
|---|---|---|
ooder-common | net.ooder:ooder-common | 元数据定义、枚举体系、工具类、BPM 通用客户端 |
scene-engine | net.ooder:scene-engine | 流程引擎核心(SkillFlowEngine、RouteToEngine、HumanOperationEngine、AgentEventBridge、ContextLayerManager) |
ooder-pro | net.ooder:ooder-pro | 业务逻辑、Skill 编排、MCP Agent 管理 |
aiserver | net.ooder:aiserver | 远程 BPM 引擎代理、LLM 代理服务 |
ooder-test | net.ooder:ooder-test | NLP 闭环测试框架、Harness 验证 |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。