
# Neuron sõltuvad töövood

See näide vastab levinud agentpõhise süsteemi küsimusele:

> Kas üks töövoog saab otsustada, et teine töövoog jätkab alles pärast varasema töövoo lõppemist?

Jah. Oluline nüanss on see, et Queuety toetab seda juba valikutega `wait_for_workflow()` ja `wait_for_workflows()`.

See tähendab, et:

- töövoo `X` saab kohe käivitada
- `X` saab jääda olekusse `waiting_for_workflows`
- `X` jätkub alles siis, kui töövoog `Y` on lõppenud

## Näide: kõigepealt uurimine, seejärel kirjutamine

Kasutage üht tipptaseme töövoogu uurimismaterjalide koostamiseks ja teist lõpliku teksti mustandi kirjutamiseks.

### Uurimistöövoog

```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',
    ]);
```

### Kirjutamistöövoog

```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',
    ]);
```

Kirjutamistöövoo käivitumisel peatub see kohe olekus `waiting_for_workflows`, kuni uurimistöövoog on edukalt lõppenud.

## Neuron kirjutamisetapp

```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']` on saadaval, sest `wait_for_workflow()` kopeeris sõltuvustöövoo lõpetatud avaliku oleku praegusesse töövoogu võtme `research` alla.

## Millal kasutada seda ühe suure töövoo asemel

Eelistage eraldi tipptaseme töövooge, kui:

- etappidel on erinevad omanikud või käitustsüklid
- soovite neid eraldi kontrollida ja uuesti käivitada
- hilisema etapi saab käivitada juba enne varasema lõppemist

Eelistage üht töövoogu, kui:

- etapid on tihedalt seotud
- neil on ühine elutsükkel ja olekukomplekt

## Kuhu sobitub olekumasin

Kui see kirjutamisvoog kuulub pikemaajalisse toimetamisseanssi, laske [olekumasinal](https://queuety.inline0.dev/et/docs/state-machines) hallata välist elutsüklit ning kasutage neid töövooge piiritletud täitmisetappideks. Nii jäävad elutsükli olekud, nagu `awaiting_brief`, `researching`, `awaiting_review` ja `completed`, selgesõnaliseks, säilitades samal ajal iga etapi töövoo vastupidavuse.

## Üks oluline eristus

See muster tähendab järgmist:

- `X` on juba olemas, kuid ootab `Y`-i

See **ei** tähenda järgmist:

- `X` luuakse alles pärast `Y`-i lõpetamist

Kui soovite teist käitumist, pange ematöövoog ootama `Y`-i ning kutsuge alles seejärel `X` jaoks `start_workflows()` või `start_agents()`.

## Seotud dokumentatsioon

- [Töövoo sõltuvused](https://queuety.inline0.dev/et/docs/workflows/dependencies)
- [Asünkroonsed üleandmised](https://queuety.inline0.dev/et/docs/workflows/async-handoffs)
- [Agentide orkestreerimine](https://queuety.inline0.dev/et/docs/workflows/agent-orchestration)
- [Olekumasinad](https://queuety.inline0.dev/et/docs/state-machines)
