
# Neuron Зависимые рабочие процессы

В этом примере рассматривается распространенный вопрос об агентах:

> Может ли один рабочий процесс решить, что другой должен продолжиться только после завершения предыдущего?

Да. Важный нюанс: Queuety уже поддерживает это с помощью `wait_for_workflow()` и `wait_for_workflows()`.

Это означает, что:

- рабочий процесс `X` можно запустить сейчас
- `X` может перейти в ожидание в `waiting_for_workflows`
- `X` возобновится только после завершения рабочего процесса `Y`

## Пример: сначала исследование, затем написание

Используйте один рабочий процесс верхнего уровня для подготовки исследовательских материалов, а второй — для создания итогового текста.

### Рабочий процесс исследования

```php
use Queuety\Enums\WaitMode;
use Queuety\Queuety;

$research_agent = Queuety::workflow('research_agent')
    ->then(ResearchTopicStep::class);

$research_id = Queuety::workflow('research_packet')
    ->then(PlanResearchTasksStep::class)
    ->start_agents('agent_tasks', $research_agent)
    ->wait_for_agents(mode: WaitMode::All, result_key: 'agent_results')
    ->then(SynthesizeResearchPacketStep::class)
    ->dispatch([
        'brief_id' => 42,
        'provider' => 'anthropic',
    ]);
```

### Рабочий процесс написания

```php
Queuety::workflow('write_brief')
    ->wait_for_workflow('research_workflow_id', 'research')
    ->then(WriteBriefWithNeuronStep::class)
    ->wait_for_decision(result_key: 'editor_review')
    ->then(PublishBriefStep::class)
    ->dispatch([
        'brief_id' => 42,
        'research_workflow_id' => $research_id,
        'provider' => 'openai',
    ]);
```

При запуске рабочий процесс написания сразу приостанавливается в `waiting_for_workflows` и ждет успешного завершения рабочего процесса исследования.

## Шаг написания Neuron

```php
namespace App\Workflow\Steps;

use App\Neuron\WriterAgent;
use NeuronAI\Chat\Messages\UserMessage;
use Queuety\Step;

final class WriteBriefWithNeuronStep implements Step
{
    public function handle(array $state): array
    {
        $agent = new WriterAgent(
            providerName: $state['provider'] ?? 'openai',
        );

        $message = $agent->chat(
            new UserMessage(sprintf(
                "Write the final brief for brief %d using this research packet:\n\n%s",
                $state['brief_id'],
                json_encode($state['research'], JSON_PRETTY_PRINT),
            ))
        )->getMessage();

        return [
            'draft_markdown' => $message->getContent(),
        ];
    }

    public function config(): array
    {
        return [];
    }
}
```

`$state['research']` доступен, потому что `wait_for_workflow()` скопировал завершенное публичное состояние из рабочего процесса-зависимости в текущий рабочий процесс под ключом `research`.

## Когда это лучше, чем один большой рабочий процесс

Выбирайте отдельные рабочие процессы верхнего уровня, когда:

- у этапов разные владельцы или операционные жизненные циклы
- вы хотите проверять и повторять их независимо друг от друга
- следующий этап нужно иметь возможность запустить, даже если предыдущий еще не завершен

Выбирайте один рабочий процесс, когда:

- этапы тесно связаны
- у них общий жизненный цикл и общее хранилище состояния

## Роль конечного автомата

Если этот процесс написания входит в долгоживущую редакционную сессию, поручите внешний жизненный цикл [конечному автомату](https://queuety.inline0.dev/ru/docs/state-machines), а эти рабочие процессы используйте для ограниченных этапов выполнения. Так состояния жизненного цикла, например `awaiting_brief`, `researching`, `awaiting_review` и `completed`, останутся явными, а рабочие процессы сохранят надежность на каждом этапе.

## Важное различие

Этот шаблон означает, что:

- `X` уже существует, но ждет `Y`

Это **не** означает, что:

- `X` создается только после завершения `Y`

Если вам нужно второе поведение, настройте родительский рабочий процесс так, чтобы он дождался `Y` и только потом вызвал `start_workflows()` или `start_agents()` для `X`.

## Связанная документация

- [Зависимости рабочего процесса](https://queuety.inline0.dev/ru/docs/workflows/dependencies)
- [Асинхронная передача управления](https://queuety.inline0.dev/ru/docs/workflows/async-handoffs)
- [Оркестрация агентов](https://queuety.inline0.dev/ru/docs/workflows/agent-orchestration)
- [Конечные автоматы](https://queuety.inline0.dev/ru/docs/state-machines)
