
# Závislosti workflow

Čekání na závislá workflow použijte, pokud má jedno workflow nejvyšší úrovně pokračovat až po dokončení ostatních workflow. Získáte tak koordinaci mezi workflow, aniž byste museli vše sloučit do jediné rozsáhlé definice.

Tato čekání se obzvlášť dobře kombinují s [Asynchronním předáním](https://queuety.inline0.dev/cs/docs/workflows/async-handoffs), kdy jedno workflow nejprve spustí nezávislá podřízená workflow a později na ně čeká.

Podrobnější příklady plánování a vykonávání najdete v části [Orchestrace agentů](https://queuety.inline0.dev/cs/docs/workflows/agent-orchestration).

Queuety nabízí tři metody builderu:

- `wait_for_workflow()` pro jedno workflow
- `wait_for_workflows()` pro několik workflow se sémantikou `all`, `any` nebo `quorum`
- `wait_for_workflow_group()`, pokud ID workflow pocházejí z dříve spuštěné skupiny

## Čekání na jedno 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();
```

Po dokončení `research_run` bude `editorial_run` pokračovat. Pokud je nastaveno `result_key`, stav dokončeného závislého workflow se uloží pod tento klíč:

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

Pokud není zadáno `result_key`, veřejný stav závislého workflow se sloučí do stavu čekajícího workflow na nejvyšší úrovni.

## Čekání na několik workflow

```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í všech uvedených workflow.
- `WaitMode::Any` pokračuje po dokončení prvního uvedeného workflow.
- `WaitMode::Quorum` pokračuje po úspěšném dokončení požadovaného počtu workflow.

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

Při použití `result_key` ukládají čekání na více workflow stav dokončených závislostí pod klíčem tvořeným ID workflow:

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

Bez `result_key` se stav dokončených závislostí sloučí do nejvyšší úrovně stavu čekajícího workflow v pořadí závislostí.

## Načtení ID závislostí ze stavu workflow

Seznam závislostí můžete sestavit až za běhu načtením ID workflow z veřejného stavu:

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

Pro několik závislostí:

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

## Čekání na spuštěnou skupinu workflow

Pokud předchozí krok `start_workflows()` nebo `start_agents()` uložil trvalý klíč skupiny, můžete čekat přímo na tuto skupinu místo toho, abyste ID workflow předávali přes veřejný 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();
```

## Co se děje během čekání

Když workflow dosáhne jednoho z těchto kroků, přejde do stavu `waiting_for_workflows`. Během čekání u něj nezůstává žádný worker.

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

Pokud závislost skončila ještě před dosažením čekacího kroku, workflow okamžitě pokračuje.

## Chování při selhání

Čekání na závislosti workflow se řídí úspěchem:

- `wait_for_workflow()` a `WaitMode::All` selžou, pokud kterákoli povinná závislost selže nebo je zrušena.
- `WaitMode::Any` selže pouze tehdy, když všechny závislosti dosáhnou konečného stavu a žádná nebyla úspěšně dokončena.
- `WaitMode::Quorum` selže, když zbývající aktivní workflow už nemohou splnit požadované kvórum.

Díky tomu se čekání na workflow hodí pro systémy plánovače a vykonavatele, kde jedno workflow může rozdělovat práci a jiné čekat na výsledky `all` nebo na dokončení první úspěšné větve.
