# 信风 TradeWind · 工作流

信风是多 Agent 协作工作流引擎。通过可视化画布编排节点和有向边,构建结构化的上下游 Agent 协作。

![信风 工作流](/screenshots/信风工作流.png)

## 核心概念

### 节点类型

| 节点 | 说明 |
|------|------|
| **Entry** | 入口节点,定义工作流输入内容 |
| **Agent** | 工作 Agent,执行 ReAct 循环完成任务 |
| **Meeting** | 会议室,多个 Agent 圆桌讨论 + 会长纪要 |
| **暂停点 Human Gate** | 人工审查节点:流程执行到此暂停等待你放行;可将信封打回上游重做(rework) |
| **Output** | 输出节点,收集上游结果并汇总输出 |
| **Note** | 编译期静态注入,追加到下游 Agent 的 system prompt |

### 边 Edge

边连接节点,定义数据流向。Agent 节点处理完后将结果传递给下游。

### 信封 Handoff

Agent 完成任务后向下游节点发送「信封」,包含完整消息历史。下游 Agent 以此作为上下文继续工作。

## 画布操作

### 添加节点

- **工具箱** —— 左侧面板拖入或点击添加节点
- **右键菜单** —— 画布空白处右键添加

### 连接节点

从节点底部的 Handle 拖出连线到目标节点顶部 Handle。

### 配置节点

选中节点后,右侧弹出配置面板:

- **Agent 节点** —— 选择 Agent、填写备注、节点显示名称
- **Meeting 节点** —— 配置议题、会长(Agent 实体)、参与者(画布上已有的 Agent 节点)
- **Entry 节点** —— 可填入初始信封内容,跟随流传进入下游节点
- **Note 节点** —— 填写后注入 Agent 节点作为引导;不可连接会议室节点;可以完全独立(不连接任意节点)充当工作流额外备注

### 右键菜单

- 节点右键:编辑 / 克隆 / 删除
- 连线右键:提示是否删除连线(用于显式删除已有连线)

## 保存与加载

1. **工作流列表** —— 左侧面板管理所有工作流
2. 点击保存 → 写入 `data/tradewind/workflows/{id}/graph.json`
3. 工作流格式为 WorkflowGraph(nodes + edges)
4. 示例工作流随仓库分发

## 运行工作流

1. 顶部工具栏点击 **▶ 运行**
2. 启动前自动校验:
   - **Entry 节点必须存在**
   - **Output 节点必须存在且只能有一个**(防止工作流意外中止)
   - 无环(DAG 检测)
   - 所有边合法
3. 运行后画布节点显示实时状态:
   - 蓝色闪烁 = 节点正在执行
   - 琥珀色 = 信封在当前节点流转

## 停止工作流

- 运行中按钮切换为 ■ 停止
- 停止会中断所有进行中的 LLM 调用和工具执行

## Agent 节点详情

### 执行模式

Agent 进入 ReAct 循环:

1. 接收上游信封(Handoff 消息)
2. 调用 LLM → 解析 `<action>` 或 `<answer>`
3. 执行工具 → 观察 `<result>`
4. 循环直到输出 `<answer>` 或达到轮次上限

### 流式会话

- 运行中点击 Agent 节点下方按钮可查看实时对话
- 会话保留到下一次工作流启动

### Sub-Agent 派发

Agent 节点内 Agent 可类似季风般调用 `delegate` 派发子 Agent 执行子任务。每个子 Agent 独立 ReAct 循环,结果汇总到母 Agent。

## Meeting 节点详情

### 会议面板

- 点击 Meeting 节点的会标按钮打开面板
- 左侧:公共会议消息流 + 输入框 + 结束按钮
- 右侧:会长私聊频道
- 工具调用折叠展示

### 联络 Agent 节点

会议中的参与者可通过 `contact` 工具联络工作流中其他正在运行的 Agent 节点:

- 用于将讨论结论同步给执行者,或向执行者索取最新进展
- 联络过程在会议面板中以工具调用卡片形式展示
- 对方 Agent 节点会完整处理消息(可使用工具),返回结论
- 被联络的 Agent 节点面板中也能看到完整处理过程

### 流式输出

- 参与者发言逐字推送
- 会长纪要流式生成

## 数据目录

```
data/tradewind/
├── workflows/          ← 工作流定义
│   └── {id}/
│       ├── graph.json  ← 节点和边
│       └── meta.json   ← 名称、时间
└── runs/               ← 运行记录
    └── {wfId}/
        └── {execId}/
            ├── events.jsonl
            ├── nodes/
            │   └── {nodeId}/
            │       └── messages.json
            └── output.json
```
