> For the complete documentation index, see [llms.txt](https://docs.neuron-ai.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.neuron-ai.dev/neuron-v3-zh/gong-zuo-liu/multi-step-workflow.md).

# 多步骤工作流

通过定义可由节点发出并触发其他节点的自定义事件，可以创建多个步骤。让我们定义一个简单的 3 步工作流。

### 自定义事件

我们定义两个自定义事件， `FirstEvent` 和 `SecondEvent`。这些类可以有任意名称和属性，但必须实现 `Event`:

{% tabs %}
{% tab title="Unix" %}

```bash
vendor/bin/neuron make:event App\\Neuron\\FirstEvent
```

{% endtab %}

{% tab title="Windows" %}

```powershell
.\vendor\bin\neuron make:event App\Neuron\FirstEvent
```

{% endtab %}
{% endtabs %}

```php
namespace App\Neuron;

class FirstEvent implements Event 
{
    public function __construct(protected string $firstMsg){}
}

class SecondEvent implements Event 
{
    public function __construct(protected string $secondMsg){}
}
```

### 定义工作流

现在我们来定义工作流本身。我们通过在每个节点上定义输入和输出类型来实现。下面是为了本演示而实现的最小节点代码。

<figure><img src="/files/2f4e79968185fdbbf4f3ed982545464b4bec9c59" alt=""><figcaption></figcaption></figure>

#### InitialNode

{% tabs %}
{% tab title="Unix" %}

```bash
vendor/bin/neuron make:node App\\Neuron\\InitialNode
```

{% endtab %}

{% tab title="Windows" %}

```powershell
.\vendor\bin\neuron make:node App\Neuron\InitialNode
```

{% endtab %}
{% endtabs %}

```php
namespace App\Neuron;

use NeuronAI\Workflow\Node;
use NeuronAI\Workflow\StartEvent;
use App\Neuron\FirstEvent;

class InitialNode extends Node
{
    /**
     * 获取 "StartEvent" 并返回 "FirstEvent"
     */
    public function __invoke(StartEvent $event, WorkflowState $state): FirstEvent
    {
        echo "\n- 处理 StartEvent";
        
        return new FirstEvent("InitialNode 完成");
    }
}
```

#### NodeOne

{% tabs %}
{% tab title="Unix" %}

```bash
vendor/bin/neuron make:node App\\Neuron\\NodeOne
```

{% endtab %}

{% tab title="Windows" %}

```powershell
.\vendor\bin\neuron make:node App\Neuron\NodeOne
```

{% endtab %}
{% endtabs %}

```php
class NodeOne extends Node
{
    /**
     * 以 "FirstEvent" 作为输入并返回 "SecondEvent"
     */
    public function __invoke(FirstEvent $event, WorkflowState $state): SecondEvent
    {
        echo "\n- ".$event->firstMsg;
        
        return new SecondEvent("NodeOne 完成");
    }
}
```

#### NodeTwo

{% tabs %}
{% tab title="Unix" %}

```bash
vendor/bin/neuron make:node App\\Neuron\\NodeTwo
```

{% endtab %}

{% tab title="Windows" %}

```powershell
.\vendor\bin\neuron make:node App\Neuron\NodeTwo
```

{% endtab %}
{% endtabs %}

```php
class NodeTwo extends Node
{
    /**
     * 以 "SecondEvent" 作为输入并返回 "StopEvent"
     */
    public function __invoke(SecondEvent $event, WorkflowState $state): StopEvent
    {
        echo "\n- ".$event->secondMsg;
        
        echo "\n- NodeTwo 完成";
        
        return new StopEvent();
    }
}
```

定义工作流并附加这些节点：

```php
use NeuronAI\Workflow\Workflow;

$handler = Workflow::make()
    ->addNodes([
        new InitialNode(),
        new NodeOne(),
        new NodeTwo(),
    ])
    ->init();

/*
 * 运行工作流
 */
$handler->run();
```

完整输出将是：

```
- 处理 StartEvent
- InitialNode 完成
- NodeOne 完成
- NodeTwo 完成
```

当然，如果只是从头到尾跑一遍，工作流仍然没太大意义！让我们来做一些分支和循环。

### 监控与调试

你使用 Neuron 构建的许多应用都会包含多个步骤，以及对 LLM 调用的多次执行。随着这些应用变得越来越复杂，能够检查你的智能体系统内部究竟发生了什么就变得至关重要。实现这一点的最佳方式是使用 [Inspector](https://inspector.dev/).

{% embed url="<https://docs.inspector.dev/guides/neuron-ai>" %}
