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

141 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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_compat``anthropic` 走 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_secs``working_dir`
- **安全策略**:命令名(首词)白/黑名单校验(运行时配置优先,回退环境变量 / 默认黑名单);危险关键词仅告警不阻止。
- **失败语义**:非零退出码视为执行失败(`bail!` 带 exit_code + stderr)。
- **输出**`{ stdout, stderr, exit_code, duration_ms }`
### HumanNodehuman_node.rs
阻塞节点,订阅事件总线 → 发 `HumanApprovalRequest``select!` 轮询 `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]` 单值处理
- **非法决策不立即 Err**warn 记录 + 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 CLI`working_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)
```
## 相关文档
- [df-workflow 工作流引擎](./df-workflow-工作流引擎-2026-06-12.md)
- [df-ai AI 集成模块](./df-ai-AI集成模块-2026-06-12.md)