Files
DevFlow/docs/03-模块文档/df-nodes-节点集合-2026-06-12.md
T

7.5 KiB
Raw Blame History

df-nodes 节点集合

创建: 2026-06-10 | 最后更新: 2026-08-08


概述

df-nodes 提供 DevFlow 工作流引擎的内置节点。所有节点实现 df-workflow 的 Node trait (execute / schema / node_type),由 DAG Executor 按拓扑序驱动。

当前状态

10 个节点全部完整实现(execute() 非 stub,有真实逻辑 + 单测覆盖),另有 task_state_machine (状态机)与 task_workflow_templates(流程模板)两个支撑模块。

节点清单

节点 功能 阻塞 node_type 实现状态
AiNode 调用 LLM 完成文本生成/分析(非流式 complete) ai 完整
AiSelfReviewNode AI 对任务产出自审(复用 AiNode 调用链,verdict 闸门) ai_self_review 完整
ScriptNode Shell/脚本执行(白/黑名单安全策略) script 完整
HumanNode 人工审批/确认(单选/多选) human 完整
TaskAdvanceNode 任务状态推进链唯一 status 写入路径(状态机 + CAS) task_advance 完整
GitNode Git 操作(branch/checkout/commit/merge/push/status/log) git 完整
HTTPNode HTTP 请求(GET/POST/PUT/DELETE) http 完整
NotifyNode 通知(桌面日志 / webhook,尽力而为不阻断) notify 完整
SubflowNode 嵌套子工作流(返回子 DAG 快照,深度限制防递归) subflow 完整
DockerNode Docker 容器内执行命令(docker run --rm,环境检测+授权) docker 完整

节点详述

AiNodeai_node.rs

工作流中无人值守的 AI 步骤:从节点 config 读取 OpenAI 兼容 / Anthropic 协议 provider 配置与 prompt,经 df_ai::build_provider 工厂选协议,调一次 LLM complete()(非流式),输出文本供下游消费。

  • 参数解析parse_params(config, inputs)execute 解耦(便于单测)。prompt 取值优先级:上游 inputs["prompt"] > config.prompt,两者皆无则报错。
  • 必填base_url / api_key。空 api_key 早失败(避免空 key 吃 401 误报「Key 无效」)。
  • 协议protocol 默认 openai_compatanthropic 走 GLM 订阅 / Claude 官方。
  • model 兜底:留空时 default_model = "gpt-4o-mini",避免 provider 构造 panic。
  • 输出{ text, model, usage: {prompt_tokens, completion_tokens, total_tokens} }
  • 与 AI Chat 区别AiNode 由 DAG Executor 自动驱动(嵌入自动化链路),非交互对话。

AiSelfReviewNodeai_self_review_node.rs

AI 自审闭环节点:对 AiNode 产出的任务内容做二次 AI 审查,返回 verdict(通过/打回)闸门。 复用 AiNode 的 provider 调用链(ai_node_helpers),差异在 prompt 模板与 JSON 解析。

ScriptNodescript_node.rs

执行 Shell 脚本或自定义命令,复用 df_execute::shell::execute(跨平台:Windows cmd /C / Unix sh -c)。

  • 必填command
  • 可选timeout_secsworking_dir
  • 安全策略:命令名(首词)白/黑名单校验(运行时配置优先,回退环境变量 / 默认黑名单);危险关键词仅告警不阻止。
  • 失败语义:非零退出码视为执行失败(bail! 带 exit_code + stderr)。
  • 输出{ stdout, stderr, exit_code, duration_ms }

HumanNodehuman_node.rs

阻塞节点,订阅事件总线 → 发 HumanApprovalRequestselect! 轮询 HumanApprovalResponse / 超时 / 取消。

  • 执行顺序:先 subscribe()send(Request)(broadcast 不回放,反序会丢 Response 死等到超时);send 必须 await(否则 Future 不 poll、Request 不进 channel)。
  • 审批模式select_type 缺省 Single,非 "multiple" 一律按 Single 处理。
    • Single → 决策数必须 = 1
    • Multiple → 决策数必须 ≥ 1
    • options 空 → 允许自由文本(仅受数量约束);非空 → 每项必须 ∈ options
    • 兼容旧调用方:decisions 空但 decision 非空时按 [decision] 单值处理
  • 非法决策不立即 Errwarn 记录 + continue 续等下一条合法 Response(由超时兜底),避免一次手误杀死节点。
  • 超时:默认 3600s。
  • 取消:每 500ms tick 检查 node_status.is_cancelled
  • 输出{ decision(首项,向后兼容), decisions(数组), comment }

TaskAdvanceNodetask_advance_node.rs

任务推进链的唯一 status 写入路径(与 IPC/AI 工具/MCP 同源):读当前 TaskRecord → 状态机 can_transition 校验 → 原子写(下沉 SQL 防 TOCTOU),退回转换自动累加 review_rounds

GitNodegit_node.rs

通过 df_execute::shell::execute 调用本地 git CLIworking_dir 指定仓库路径。 支持 branch / checkout / commit / merge / push / status / log,输出按 action 提取结构化字段。

HTTPNodehttp_node.rs

使用 reqwest 发起 GET/POST/PUT/DELETE 请求。config 提供 method/url/headers/body/timeout_secs 输出 status_code + body + content_type

NotifyNodenotify_node.rs

桌面(当前为日志占位,后续接 tauri-plugin-notification/ webhook 通知。语义:尽力而为, 通知失败不阻断工作流(输出 success=false 但仍 Ok 返回)。

SubflowNodesubflow_node.rs

加载一个子 DAG 并在当前执行上下文中递归执行(复用通用流程,如「代码审查」作为子步骤)。 返回子 DAG 的 JSON 快照供 DagExecutor 消费展开,max_depth 限制嵌套深度防无限递归。

DockerNodedocker_node.rs

通过 docker run --rm 一次性容器执行命令,复用 df_execute::shell::execute 调用本地 docker CLI。 含环境检测(本机是否有 docker)与授权校验。

文件结构

crates/df-nodes/src/
├── lib.rs                 — 模块入口(声明各 pub mod
├── ai_node.rs             — AiNodeLLM 文本生成/分析)
├── ai_node_helpers.rs     — AiNode 纯逻辑(provider 解析/参数构造,非 Node
├── ai_self_review_node.rs — AiSelfReviewNodeAI 自审)
├── script_node.rs         — ScriptNodeShell 执行)
├── human_node.rs          — HumanNode(人工审批/确认,阻塞)
├── human_node_helpers.rs  — HumanNode 纯逻辑(拒绝语义判定,非 Node
├── task_advance_node.rs   — TaskAdvanceNode(任务状态推进链)
├── task_state_machine.rs  — 任务状态机(can_transition 等,非 Node
├── task_workflow_templates.rs — 流程模板(testing 等模板,非 Node
├── git_node.rs            — GitNodeGit 操作)
├── http_node.rs           — HttpNodeHTTP 请求)
├── notify_node.rs         — NotifyNode(通知)
├── subflow_node.rs        — SubflowNode(嵌套子工作流)
└── docker_node.rs         — DockerNode(容器内执行)

依赖关系

df-workflow (Node trait / DagDef)
  ← df-nodes
    ← df-ai (AiNode/AiSelfReviewNode: build_provider / LlmProvider)
    ← df-execute (ScriptNode/GitNode/DockerNode: shell::execute)
    ← df-storage (TaskAdvanceNode: TaskRepo::advance_status_atomic)
    ← df-core / df-types (HumanNode: events::WorkflowEvent / SelectType)

相关文档