
# Odvisnosti potekov dela

Čakanje na odvisnost poteka dela uporabite, kadar naj se vrhnji potek dela nadaljuje šele po zaključku drugih potekov dela. Tako usklajujete različne poteke dela, ne da bi vse prisilno združili v eno velikansko definicijo poteka dela.

Takšna čakanja se še posebej dobro dopolnjujejo s [asinhronimi predajami](https://queuety.inline0.dev/sl/docs/workflows/async-handoffs), pri katerih en potek dela najprej zažene neodvisne podrejene poteke dela in nato pozneje počaka nanje.

Za podrobnejše primere načrtovalnika in izvajalnika glejte [orkestracijo agentov](https://queuety.inline0.dev/sl/docs/workflows/agent-orchestration).

Queuety ponuja tri metode gradnika:

- `wait_for_workflow()` za en potek dela
- `wait_for_workflows()` za več potekov dela s semantiko `all`, `any` ali `quorum`
- `wait_for_workflow_group()`, kadar ID-ji potekov dela izvirajo iz predhodno zagnane skupine

## Čakanje na en potek dela

```php
$research_id = Queuety::workflow( 'research_run' )
    ->then( PlanResearchStep::class )
    ->for_each( 'tasks', ExecuteResearchTask::class, 'results' )
    ->dispatch( [ 'brief_id' => 42 ] );

$editorial_id = Queuety::workflow( 'editorial_run' )
    ->wait_for_workflow( $research_id, 'research' )
    ->then( DraftBriefStep::class )
    ->dispatch();
```

Ko se `research_run` zaključi, se `editorial_run` nadaljuje. Če je nastavljeno `result_key`, se stanje zaključene odvisnosti shrani pod tem ključem:

```php
$state['research']; // public state from the completed research workflow
```

Če ni nastavljenega `result_key`, se javno stanje odvisnega poteka dela združi z vrhnjim stanjem čakajočega poteka dela.

## Čakanje na več potekov dela

```php
use Queuety\Enums\WaitMode;

Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::All,
        'dependencies'
    )
    ->then( PublishPacketStep::class )
    ->dispatch();
```

- `WaitMode::All` nadaljuje samo, ko so zaključeni vsi navedeni poteki dela.
- `WaitMode::Any` nadaljuje, ko se zaključi prvi navedeni potek dela.
- `WaitMode::Quorum` nadaljuje, ko se uspešno zaključi zahtevano število potekov dela.

```php
Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::Quorum,
        'dependencies',
        quorum: 2,
    )
    ->then( PublishPacketStep::class )
    ->dispatch();
```

Z `result_key` se stanja zaključenih odvisnosti pri čakanju na več potekov dela shranijo pod ključi z ID-ji potekov dela:

```php
[
    '42' => [ 'summary' => '...' ],
    '43' => [ 'summary' => '...' ],
]
```

Če ni nastavljenega `result_key`, se stanje zaključenih odvisnosti združi z vrhnjim stanjem čakajočega poteka dela v vrstnem redu odvisnosti.

## Razreševanje ID-jev odvisnosti iz stanja poteka dela

Seznam odvisnosti lahko določite šele med izvajanjem, tako da iz javnega stanja preberete ID-je potekov dela:

```php
Queuety::workflow( 'agent_follow_up' )
    ->wait_for_workflow( 'parent_workflow_id', 'parent' )
    ->then( FinalizeAgentRunStep::class )
    ->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
```

Za več odvisnosti:

```php
Queuety::workflow( 'aggregator' )
    ->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
    ->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
```

## Čakanje na zagnano skupino potekov dela

Če je predhodni korak `start_workflows()` ali `start_agents()` shranil trajni ključ skupine, lahko počakate neposredno na to skupino, namesto da sami prenašate ID-je potekov dela prek javnega stanja.

```php
Queuety::workflow( 'brief_research' )
    ->then( PlanTopicsStep::class )
    ->start_agents( 'agent_tasks', $agent_run, group_key: 'researchers' )
    ->wait_for_agent_group( 'researchers', WaitMode::Quorum, 2, 'agent_results' )
    ->then( SynthesizeBriefStep::class )
    ->dispatch();
```

## Kaj se zgodi med čakanjem

Ko potek dela doseže enega od teh korakov, preide v stanje `waiting_for_workflows`. Med čakanjem nanj ni vezan noben delavec.

```php
$state = Queuety::workflow_status( $workflow_id );
echo $state->status->value; // 'waiting_for_workflows'
echo $state->wait_type;     // 'workflow'
print_r( $state->waiting_for ); // ['42', '43']
```

Če se odvisnost zaključi, preden je dosežen korak čakanja, se potek dela takoj nadaljuje.

## Semantika napak

Čakanja na odvisnosti potekov dela so usmerjena v uspeh:

- `wait_for_workflow()` in `WaitMode::All` spodletita, če katera koli zahtevana odvisnost spodleti ali je preklicana.
- `WaitMode::Any` spodleti samo, ko vse odvisnosti dosežejo končno stanje in se nobena ne zaključi uspešno.
- `WaitMode::Quorum` spodleti, ko preostali aktivni poteki dela ne morejo več doseči zahtevanega kvoruma.

Zato so čakanja na poteke dela uporabna v sistemih z načrtovalnikom in izvajalnikom, kjer lahko en potek dela poskrbi za delo, drugi pa počaka na rezultate `all` ali na prvo uspešno vejo, ki se zaključi.
