
# Závislosti workflowov

Čakanie na závislosti workflowu použite vtedy, keď má jeden hlavný workflow pokračovať až po dokončení ostatných workflowov. Umožňuje koordináciu medzi workflowmi bez toho, aby ste všetko museli vložiť do jednej obrovskej definície workflowu.

Takéto čakanie sa výborne dopĺňa s [Asynchrónnym odovzdaním](https://queuety.inline0.dev/sk/docs/workflows/async-handoffs), pri ktorom jeden workflow najprv spustí nezávislé podriadené workflowy a počká na ne až neskôr.

Rozsiahlejšie príklady plánovača a vykonávača nájdete v časti [Orchestrácia agentov](https://queuety.inline0.dev/sk/docs/workflows/agent-orchestration).

Queuety poskytuje tri metódy tvorby:

- `wait_for_workflow()` pre jeden workflow
- `wait_for_workflows()` pre viacero workflowov so sémantikou `all`, `any` alebo `quorum`
- `wait_for_workflow_group()`, keď ID workflowov pochádzajú z predtým spustenej skupiny

## Čakanie na jeden workflow

```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();
```

Keď sa `research_run` dokončí, `editorial_run` pokračuje. Ak je nastavený `result_key`, stav dokončenej závislosti sa uloží pod týmto kľúčom:

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

Ak nie je zadaný `result_key`, verejný stav závislého workflowu sa zlúči s najvyššou úrovňou stavu čakajúceho workflowu.

## Čakanie na viacero workflowov

```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` pokračuje až po dokončení každého uvedeného workflowu.
- `WaitMode::Any` pokračuje po dokončení prvého uvedeného workflowu.
- `WaitMode::Quorum` pokračuje po úspešnom dokončení požadovaného počtu workflowov.

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

Pri použití `result_key` sa stav dokončených závislostí pri čakaní na viacero workflowov ukladá podľа ID workflowu:

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

Ak nie je zadaný `result_key`, stav dokončených závislostí sa zlúči s najvyššou úrovňou stavu čakajúceho workflowu v poradí závislostí.

## Získanie ID závislostí zo stavu workflowu

Zoznam závislostí môžete určiť až počas behu načítaním ID workflowov z verejného stavu:

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

Pri viacerých závislostiach:

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

## Čakanie na spustenú skupinu workflowov

Ak predchádzajúci krok `start_workflows()` alebo `start_agents()` uložil trvalý kľúč skupiny, môžete čakať priamo na túto skupinu namiesto toho, aby ste ID workflowov sami prenášali cez verejný stav.

```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();
```

## Čo sa deje počas čakania

Keď workflow dosiahne jeden z týchto krokov, prejde do stavu `waiting_for_workflows`. Počas čakania k nemu nezostáva priradený žiadny pracovník.

```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']
```

Ak sa závislý workflow dokončil ešte pred dosiahnutím kroku čakania, workflow pokračuje okamžite.

## Správanie pri zlyhaní

Čakanie na závislosti workflowov sa riadi úspešným dokončením:

- `wait_for_workflow()` a `WaitMode::All` zlyhajú, ak niektorá požadovaná závislosť zlyhá alebo sa zruší.
- `WaitMode::Any` zlyhá iba vtedy, keď všetky závislosti dosiahnu konečný stav a žiadna sa úspešne nedokončí.
- `WaitMode::Quorum` zlyhá, keď zostávajúce aktívne workflowy už nemôžu splniť požadované kvórum.

Vďaka tomu je čakanie na workflowy užitočné v systémoch s plánovačom a vykonávačom, kde jeden workflow môže naplánovať prácu a druhý môže čakať na výsledky `all` alebo na prvú úspešnú vetvu, ktorá sa dokončí.
