
# Neuron Riippuvaiset työnkulut

Tässä esimerkissä käsitellään yleistä agenttijärjestelmiin liittyvää kysymystä:

> Voiko yksi työnkulku päättää, että toinen saa jatkaa vasta aiemman työnkulun valmistuttua?

Kyllä. Keskeinen huomio on, että Queuety tukee tätä jo valmiiksi `wait_for_workflow()`- ja `wait_for_workflows()`-toiminnoilla.

Tämä tarkoittaa, että:

- työnkulku `X` voidaan käynnistää nyt
- `X` voi jäädä odottamaan tilaan `waiting_for_workflows`
- `X` jatkuu vasta, kun työnkulku `Y` on valmis

## Esimerkki: ensin tutkimus, sitten kirjoittaminen

Käytä yhtä ylimmän tason työnkulkua tutkimuspaketin kokoamiseen ja toista lopullisen tekstin luonnosteluun.

### Tutkimuksen työnkulku

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

### Kirjoittamisen työnkulku

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

Kun kirjoittamisen työnkulku käynnistyy, se keskeytyy heti tilaan `waiting_for_workflows`, kunnes tutkimuksen työnkulku on suoritettu onnistuneesti.

## Neuron kirjoitusvaihe

```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 käytettävissä, koska `wait_for_workflow()` kopioi riippuvuustyönkulun valmiin julkisen tilan nykyiseen työnkulkuun avaimella `research`.

## Milloin tämä kannattaa valita yhden suuren työnkulun sijaan

Suosi erillisiä ylimmän tason työnkulkuja, kun:

- vaiheilla on eri omistajat tai operatiiviset elinkaaret
- haluat tarkastella ja yrittää niitä uudelleen itsenäisesti
- myöhempi vaihe voidaan käynnistää jo ennen aiemman valmistumista

Suosi yhtä työnkulkua, kun:

- vaiheet liittyvät tiiviisti toisiinsa
- niillä on yhteinen elinkaari ja tilakokonaisuus

## Tilakoneen rooli

Jos tämä kirjoitusprosessi kuuluu pitkäikäisempään toimitukselliseen istuntoon, anna [tilakoneen](https://queuety.inline0.dev/fi/docs/state-machines) hallita ulompaa elinkaarta ja käytä näitä työnkulkuja rajattuihin suoritusvaiheisiin. Näin elinkaaren tilat, kuten `awaiting_brief`, `researching`, `awaiting_review` ja `completed`, pysyvät selkeinä ja työnkulun kestävyys säilyy kussakin vaiheessa.

## Yksi tärkeä ero

Tämä toimintamalli tarkoittaa, että:

- `X` on jo olemassa, mutta odottaa kohdetta `Y`

Se **ei** tarkoita, että:

- `X` luodaan vasta, kun `Y` on valmis

Jos haluat jälkimmäisen toimintatavan, määritä ylätyönkulku odottamaan kohdetta `Y` ja kutsumaan vasta sen jälkeen kohdetta `start_workflows()` tai `start_agents()` kohteelle `X`.

## Aiheeseen liittyvät dokumentit

- [Työnkulkujen riippuvuudet](https://queuety.inline0.dev/fi/docs/workflows/dependencies)
- [Asynkroniset siirrot](https://queuety.inline0.dev/fi/docs/workflows/async-handoffs)
- [Agenttien orkestrointi](https://queuety.inline0.dev/fi/docs/workflows/agent-orchestration)
- [Tilakoneet](https://queuety.inline0.dev/fi/docs/state-machines)
