
# 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/uk/docs/state-machines) керувати загальним життєвим циклом, а ці робочі процеси використовуйте для обмежених за тривалістю етапів виконання. Так стани життєвого циклу, як-от `awaiting_brief`, `researching`, `awaiting_review` і `completed`, залишатимуться явними, а надійність робочого процесу збережеться в кожній фазі.

## Важлива відмінність

Цей шаблон означає, що:

- `X` уже існує, але очікує на `Y`

Це **не** означає, що:

- `X` створюється лише після завершення `Y`

Якщо вам потрібна друга поведінка, нехай батьківський робочий процес дочекається `Y` і лише тоді викличе `start_workflows()` або `start_agents()` для `X`.

## Пов’язана документація

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