Skip to main content

workflow-guide

创建、编辑、校验、运行或排查 DeterminFlow 工作流时必须先加载此技能;也适用于任务填参、节点审批、变量传递、网关、执行方案、子流程与工作区覆盖。涉及 Agent 定义、Prompt 模板或 Script Library 的专项设计时,继续加载对应 Core Skill。

来源信息

仓库
alikon-art/DeterminFlow
最近来源活动
2026年8月18日 14:47
检测到的 SKILL.md 语言
中文
星标
875
分支
131

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

文件资源管理器
2 个文件

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
workflow-guide
description
创建、编辑、校验、运行或排查 DeterminFlow 工作流时必须先加载此技能;也适用于任务填参、节点审批、变量传递、网关、执行方案、子流程与工作区覆盖。涉及 Agent 定义、Prompt 模板或 Script Library 的专项设计时,继续加载对应 Core Skill。
metadata
{"display_name":"workflow-guide","version":"3.5.0","author":"system","category":"workflow","priority":50,"workflow_only":false}
# Workflow 操作指南 ## 先确定操作层级 DeterminFlow 有两个工作流对象: - `definition.json` 是可复用的工作流模板。 - Task 是创建时冻结模板快照的运行实例;之后修改模板不会影响已有 Task。 版本化 Core Skill 位于 `src/core/defaults/skills/`,运行实例由启动时同步到 `data/skills/`。工作流业务数据始终位于 `data/workflows/{workflow_id}/`。 ## 操作前检查 1. 先用 `list_workflows` 与 `get_workflow` 读取现状,不根据名称猜结构。 2. Agent 节点先用 `list_agent_types` 确认 `agent_type` 仍存在;详细定义规则见 `agent-definition-guide`。 3. Script Library 节点先核对脚本身份、类型与分组;详细规则见 `script-library-guide`。 4. 每个节点和网关都提供唯一 ID、可读 `label` 与 `position`。并行分支错开 x 坐标, 主链按 y 坐标递增。 5. 修改前确认目标是模板、已有 Task,还是新 Task;不要把三者混为一谈。 ## 首选操作面 工作流模板优先通过 Web 或 Workflow API 管理,因为 API 会在保存前校验: | 操作 | API | |---|---| | 列出/读取 | `GET /api/workflows`、`GET /api/workflows/{id}` | | 创建/更新 | `POST /api/workflows`、`PUT /api/workflows/{id}` | | 仅校验 | `POST /api/workflows/validate` | | 删除 | `DELETE /api/workflows/{id}` | | 创建 Task | `POST /api/workflows/{id}/tasks` | | 启动 Task | `POST /api/workflows/{id}/tasks/{task_id}/start` | | 停止 Task | `POST /api/workflows/{id}/tasks/{task_id}/stop` | 主会话中已有工具覆盖读取与 Task 生命周期:`list_workflows`、`get_workflow`、 `create_and_attach_task`、`set_workflow_variable`、`start_workflow_task`、 `get_task_status`、`get_task_result`、`read_task_artifact`、`get_node_messages`、`list_tasks`、 `approve_node`、`retry_node`、`skip_node`、`stop_task`。 Main 可以同时管理多个后台 Task。`main_session_id` 是所有权事实来源;会话上的 `workflow_id/task_id` 只是最近任务的兼容默认值。除发现类工具外,所有任务修改、启动、 审批、恢复和结果查询都应显式携带完整 TaskRef:`workflow_id + task_id`。只提供其中一个 会失败,其他 Main 的任务也不可操作。 Main 所有权与逐节点审批是两个独立契约。`create_and_attach_task` 的可选参数 `main_takeover` 默认 `false`:Main 可以持续跟踪任务,但 Agent 节点完成后正常自动流转。 只有显式设为 `true` 时,每个 Agent 节点的产出才进入 Main 审批;工作流中显式定义的 Approval 节点不受该参数影响。 HTTP 创建 Task 时可用 `node_model_overrides` 为指定 Agent 节点选择 Core 已配置的 Provider 与预定义模型,并用 `node_model_params_overrides` 叠加本次 Task 的临时 Agent `model_params`: ```json { "node_model_overrides": { "writer": "provider_id:model_name" }, "node_model_params_overrides": { "writer": { "temperature": 0.4, "reasoning_effort": "high" } } } ``` 节点 ID 必须存在且 `node_type=agent`,模型引用必须出现在 Core 当前模型列表中。选择结果会 写入 Task 的定义快照和运行身份守卫,因此重试与恢复继续使用同一模型;Workflow 模板不会 被修改。Core 只校验参数覆盖的外层结构,不校验参数名、类型或取值;调用方负责语义校验, Provider Adapter 继续按现有声明认领支持的字段。该接口不接收 API Key、Base URL、 Provider 类型或回退模型。 `get_task_status` 和 `get_task_result` 支持事件驱动等待: - `wait_for=none`:立即返回,是兼容默认值。 - `wait_for=change`:已持久化 Task 快照变化或超时后返回。 - `wait_for=terminal_or_attention`:Task 完成、失败、停止、取消,或进入 审批/未启动等需要 Main 介入的状态时返回。 - `timeout_seconds` 是最长等待时间;`null` 表示不设截止时间,但当前调用仍可取消。 等待结果通过 `wait_outcome` 区分 `changed`、`terminal`、 `attention_required` 与 `timeout`,并返回 `terminal`、`attention_required` 和 `elapsed_seconds`。状态事件只负责唤醒,工具会重新读取持久化 Task 快照。 对结果导向的等待优先直接使用 `get_task_result`,避免终态后再调用一次结果工具。 只有 API 不可用且任务明确要求直接维护资源时,才编辑 `data/workflows/{workflow_id}/definition.json`。直接编辑后必须运行: ```bash python data/skills/workflow-guide/scripts/validate_definition.py data/workflows/{workflow_id}/definition.json ``` 可用目录或 `--all` 代替单个文件。退出码 `0` 表示通过(可含 warning),`1` 表示存在 必须修复的 error。 ## 定义结构 工作流目录由模板、内联脚本和引擎生成的运行记录组成: ```text data/workflows/{workflow_id}/ ├── definition.json ├── script/ ├── tasks/ └── runs/ ``` 定义的核心字段是 `workflow_id`、`name`、`version`、`nodes`、`edges`、`gateways`、 `variables` 和 `execution_schemes`。普通节点不能有多条出边;分支必须使用网关。 ### 节点类型 | `node_type` | 用途 | 关键字段 | |---|---|---| | `agent` | 创建 LLM 子会话 | `agent_type`、`first_message`、`output_variable`、`auto_flow` | | `script` | 确定性 subprocess | `node_params.script_source/script_type/script_name/script_argv` | | `approval` | 人工审批标记 | 通用节点字段 | | `subprocess` | 调用另一个工作流 | `sub_workflow_id`、`sub_scheme_id`、`sub_workflow_params` | Agent 节点的常用输出控制: - `output_variable` 把最后回复写入运行时变量池。 - `save_output_to_file` 与 `output_file_path` 把最后回复保存到共享 workspace;两者可同时用。 - `require_non_empty_output=true` 要求最后一条 LLM 回复去除首尾空白后非空。 - `retry_empty_output_in_session=true` 只能与 `require_non_empty_output=true` 同时使用: 最新回复为空时在原子会话追加一次固定追问,并用无工具 Graph 防止重复副作用;追问消耗 重新计入节点 token。追问后仍为空才进入 `auto_retry_count` 节点重试。 - `json_output_field` 与 `json_output_field_min_chars` 必须同时配置;前者支持 `body`、`data.chapters.0.body` 形式的字段路径,目标必须是字符串,字数必须严格大于阈值。 校验发生在变量赋值和文件写入前;失败统一进入节点的 `auto_retry_count` 策略。 - `auto_flow=true` 让 LLM 输出结束即成功,通常配合 `enable_complete_node_task=false`。 - `enable_reject_upstream` 与 `max_reject_count` 允许下游有限次打回上游。 - `auto_retry_count`、`auto_retry_interval_seconds`、`fail_auto_skip` 是失败策略;必须显式评估 重复副作用后再启用。 所有最终输出消费者只读取最新一条 assistant 消息。最新消息为空时不得向前寻找旧正文; 未启用非空门禁时节点可完成但不写输出变量,文件输出仍因无正文而失败。 终态 Task 的 Workflow Agent 节点会话可在消息抽屉或会话页继续对话。首次续聊会按当前 AgentDefinition 重建通用 Agent Graph,保留原 system prompt、上下文、模型与 workspace, 但不提供 `complete_node_task` 或 `reject_upstream`。续聊只更新会话历史,不改变原 Task 的 节点结果;每轮结束严格保存并重新冷却。运行中 Task 的节点会话不可升级。 Script 节点新定义使用 `script_argv` 字符串数组,不使用兼容字段 `script_args`。脚本节点 的详细目录、输出协议和身份冻结规则见 `script-library-guide`。 ## 变量与共享 workspace 输入变量支持 `text`、`textarea`、`select`、`file`、`list`、`dict`。变量 key 不得以 `_` 开头;该前缀保留给系统变量。 常用引用形式: - `{{key}}` - `{{list_var[0]}}` 或 `{{list_var[index_var]}}` - `{{dict_var.key}}` `list` 与 `dict` 的值必须是合法 JSON,不能使用 Python 单引号表示。运行时变量可来自: - Task 创建或 `set_workflow_variable` 填入的输入值; - Agent 节点 `output_variable`; - Script stdout 中的 `<WF_VAR>key:value</WF_VAR>`; - 声明为 `source_type: output` 的节点产出变量。 同一个 Task 内的 Agent 和 Script 节点共享 workspace。通过 Chat Main 创建时,默认 `workspace_mode=task_isolated`,路径位于 `data/workspaces/_main/{session_id}/tasks/{task_id}/`;需要多个 Task 共享资料时,显式使用 `named_shared` 与安全的 `workspace_ref`。`legacy_shared` 保留 `data/workspaces/{workflow_id}/` 兼容行为。相对文件路径均基于实际 workspace,系统通过 以下变量暴露运行上下文: | 系统变量 | 含义 | |---|---| | `_system.workspace_path` | 实际共享 workspace | | `_system.workflow_id` | 工作流 ID | | `_system.task_id` | Task ID | | `_system.task_name` | Task 名称 | | `_system.current_time` | 每节点重新计算的 ISO 时间 | | `_system.operator` | 当前执行人标识 | ## 网关与执行方案 | `gateway_type` | 约束 | |---|---| | `parallel` | 至少两条出边,必须有对应 `converge` | | `converge` | 至少两条入边,恰好一条出边 | | `condition` | 至少两条出边,非默认边有表达式,至少一条默认边 | | `loop` | 恰好两条出边:循环体与默认退出边;不支持嵌套循环 | 条件表达式支持 `==`、`!=`、`>=`、`<=`、`>`、`<` 与 `contains`。Loop 常用表达式是 `for item in items`、`for key, value in config`、`for i in range(5)`。 执行方案只保存 `selected_node_ids`。创建 Task 时,`selected_node_ids` 优先于 `scheme_id`, `disabled_node_ids` 仅用于兼容旧调用。子流程通过 `sub_scheme_id` 选择目标工作流方案。 ## Task 安全顺序 ```text create_and_attach_task(按需显式 main_takeover=true,默认只跟踪) -> 保存返回的 workflow_id + task_id -> set_workflow_variable(显式 TaskRef,必要时重复) -> start_workflow_task(显式 TaskRef,后台执行) -> get_task_status(必要时 wait_for=change) -> approve_node / retry_node / skip_node(显式 TaskRef + 最新 attempt_count) -> get_task_result(可 wait_for=terminal_or_attention) -> 必要时 read_task_artifact 或 stop_task ``` 启动前检查所有 `required` 输入和 file 路径。运行中不要修改 definition 并期待当前 Task 变化;需要新定义时创建新 Task。一个 Main 可继续创建其他 Task,旧 Task 不会被解绑或 停止。Agent 节点可能产生审批请求,审批消息会提供完整 TaskRef 与 `attempt_count`;调用 控制工具时原样携带,过期操作会返回 `node_control_stale`。拒绝时提供可执行反馈。 ## 验收清单 - 模板 API 校验通过,或直接编辑后校验脚本返回 0。 - START 到 END 完整可达,无孤立节点、悬空边或重复 ID。 - 节点位置可读,变量均已定义或明确由上游产出。 - Agent 类型、Prompt 模板和 Script Library 身份真实存在。 - 新建 Task 使用了最新模板快照,启动后状态与节点摘要可查询。 - 同一 Main 的多个 Task 可独立寻址,默认工作空间互不污染,其他 Main 不能越权控制。 - 终态 Task 可通过 `get_task_result` 返回节点摘要、公开输出和受控产物描述符。 - 失败策略不会把有外部副作用的节点静默重复执行。 ## 常见故障定位 - 节点重叠:检查 `position`。 - `{{key}}` 保留原样:检查 Task 参数、上游输出和 key 拼写。 - definition 更新未生效:当前 Task 使用旧快照,重新创建 Task。 - Main 所属任务在每个 Agent 后等待:检查 Task 的 `main_takeover` 是否被显式启用;默认值应为 `false`,显式 Approval 节点除外。 - file 变量为空或失败:检查实际 workspace、路径和 `required`。 - Loop 失败:检查 JSON 值、两条出边、默认退出边与循环表达式。 - 并行保存失败:检查 parallel/converge 配对和嵌套限制。 - Prompt section 变量未渲染:加载 `prompt-template-guide` 检查系统变量或 `template_variables` 声明。
在 GitHub 查看