
# Neuron Odvisni poteki dela

Ta primer odgovarja na pogosto vprašanje o agentih:

> Ali lahko en potek dela določi, da se drugi nadaljuje šele, ko se prvi konča?

Da. Pomembno je, da Queuety to že podpira z `wait_for_workflow()` in `wait_for_workflows()`.

To pomeni:

- potek dela `X` je mogoče zagnati takoj
- `X` lahko počaka v `waiting_for_workflows`
- `X` se nadaljuje šele, ko se potek dela `Y` konča

## Primer: najprej raziskava, nato pisanje

Z enim nadrejenim potekom dela pripravite paket gradiva, z drugim pa osnutek končnega besedila.

### Potek raziskave

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

### Potek pisanja

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

Ko se potek pisanja začne, se takoj ustavi v `waiting_for_workflows` in počaka, da se potek raziskave uspešno konča.

## Korak pisanja 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']` je na voljo, ker je `wait_for_workflow()` kopiral dokončano javno stanje iz odvisnega poteka dela v trenutni potek dela pod ključem `research`.

## Kdaj izbrati to možnost namesto enega ogromnega poteka dela

Ločene nadrejene poteke dela izberite, kadar:

- imajo faze različne lastnike ali operativne življenjske cikle
- jih želite pregledovati in ponavljati neodvisno
- želite poznejšo fazo zagnati, še preden se prejšnja konča

En potek dela izberite, kadar:

- so faze tesno povezane
- si delijo en življenjski cikel in eno zbirko stanja

## Vloga stroja stanj

Če je ta potek pisanja del dolgotrajnejše uredniške seje, naj zunanjemu življenjskemu ciklu upravlja [stroj stanj](https://queuety.inline0.dev/sl/docs/state-machines), te poteke dela pa uporabite za omejene faze izvajanja. Tako bodo stanja življenjskega cikla, kot so `awaiting_brief`, `researching`, `awaiting_review` in `completed`, izrecno določena, trajnost potekov dela pa bo ohranjena znotraj posamezne faze.

## Pomembna razlika

Ta vzorec pomeni:

- `X` obstaja že zdaj, vendar čaka na `Y`

To **ne** pomeni:

- `X` se ustvari šele, ko je `Y` končan

Če želite drugo vedenje, naj nadrejeni potek dela počaka na `Y` in šele nato pokliče `start_workflows()` ali `start_agents()` za `X`.

## Povezana dokumentacija

- [Odvisnosti potekov dela](https://queuety.inline0.dev/sl/docs/workflows/dependencies)
- [Asinhroni predaji](https://queuety.inline0.dev/sl/docs/workflows/async-handoffs)
- [Orkestracija agentov](https://queuety.inline0.dev/sl/docs/workflows/agent-orchestration)
- [Stroji stanj](https://queuety.inline0.dev/sl/docs/state-machines)
