
# Asünkroonsed üleandmised

Kasuta `start_workflows()`, kui töövoog peab leitud töö üle andma sõltumatutele tipptaseme töövoogudele, selle asemel et hoida kõike ühes käituses.

Kui modelleerid konkreetselt agendikäitusi, on `start_agents()` ja `wait_for_agents()` semantilised aliased agenditöödele sobivate vaikeväärtustega.

Suuremate terviknäidete kohta vaata teemat [Agentide orkestreerimine](https://queuety.inline0.dev/et/docs/workflows/agent-orchestration).

See sobib agendilaadseks orkestreerimiseks:

- planeerija töövoog leiab käitusajal ülesandeid
- igast ülesandest saab omaette püsiv töövoog
- ematöövoog talletab nende töövoogude ID-d olekus
- ematöövoog saab hiljem oodata `all`, `any`, `quorum` või nimega käivitatud rühma

## Meetod `->start_workflows()`

```php
use Queuety\Enums\WaitMode;
use Queuety\Queuety;

$agent_task = Queuety::workflow( 'agent_task' )
    ->then( ResearchTopicStep::class )
    ->then( SummarizeTopicStep::class );

Queuety::workflow( 'brief_research' )
    ->then( PlanTopicsStep::class )
    ->start_workflows(
        items_key: 'topics',
        workflow_builder: $agent_task,
        result_key: 'child_workflow_ids',
        group_key: 'researchers',
    )
    ->wait_for_workflow_group( 'researchers', WaitMode::All, result_key: 'child_results' )
    ->then( SynthesizeBriefStep::class )
    ->dispatch( [ 'brief_id' => 42 ] );
```

Selles näites:

1. `PlanTopicsStep` kirjutab teemakoormuste massiivi asukohta `$state['topics']`
2. `start_workflows()` käivitab iga teema jaoks ühe `agent_task` töövoo
3. Käivitatud töövoogude ID-d kirjutatakse asukohta `$state['child_workflow_ids']`
4. `wait_for_workflow_group()` peatub, kuni käivitatud rühm täidab valitud lõpetamistingimuse
5. `SynthesizeBriefStep` saab lõpetatud alamkäituste olekud võtme `$state['child_results']` all

## Alamkäituste koormused

Iga üksus kohas `items_key` saab ühe käivitatud töövoo algkoormuseks.

Kui üksus on massiiv, liidetakse selle avalikud võtmed alamkäituse koormusse:

```php
[
    [ 'topic' => 'pricing', 'source' => 'competitors' ],
    [ 'topic' => 'reviews', 'source' => 'customers' ],
]
```

Kui üksus on skalaar, salvestab Queuety selle võtme `payload_key` alla:

```php
->start_workflows(
    items_key: 'topic_names',
    workflow_builder: $agent_task,
    payload_key: 'topic',
)
```

## Emaoleku pärimine

Vaikimisi liidab `start_workflows()` iga alamkäituse koormusse ematöövoo avaliku oleku.

See tähendab, et ühine kontekst, näiteks `brief_id`, `account_id` või `campaign`, on igas käivitatud töövoos automaatselt saadaval.

Pärimisest jäetakse välja lähtekoht `items_key` ja `result_key`, et ükski alamkäitus ei saaks kogu ülesannete loendit ega lõplikku töövoogude ID-de massiivi.

Määra `inherit_state: false`, kui iga alamkäitus peaks saama ainult oma üksuse koormuse.

## Miks mitte `run_workflow()`?

`run_workflow()` loob ema- ja alamkäituse suhte, kus ematöövoog peatub selle sammu juures, kuni alamkäitus lõpeb.

`start_workflows()` on vabam lahendus:

- käivitatud töövood on sõltumatud tipptaseme töövood
- iga käivitatud töövoogu saab eraldi uurida, uuesti proovida või eksportida
- ematöövoog otsustab hiljem, kas ja kuidas neid oodata

Seetõttu sobib `start_workflows()` paremini asünkroonseks agendiülesannete üleandmiseks, samas kui `run_workflow()` sobib paremini pesastatud kompositsiooniks ühes orkestreerimispuus.

## Hilisem ootamine

`start_workflows()` on mõeldud kasutamiseks koos funktsiooniga [Töövoogude sõltuvused](https://queuety.inline0.dev/et/docs/workflows/dependencies):

```php
use Queuety\Enums\WaitMode;

Queuety::workflow( 'review_board' )
    ->start_workflows( 'review_tasks', $review_task_workflow, 'review_workflow_ids' )
    ->wait_for_workflows( 'review_workflow_ids', WaitMode::Any, 'winner' )
    ->then( FinalizeDecisionStep::class )
    ->dispatch( $payload );
```

- `WaitMode::All` kogub kõik lõpetatud alamkäituste olekud
- `WaitMode::Any` jätkub esimese eduka alamkäituse järel

Nii saad planeerija ja täitja orkestreerimise ilma täieliku käitusajal muudetava DAG-mootorita.

## Agenditööks sobivad aliased

`start_agents()` on `start_workflows()` alias, mille vaikeväärtused sobivad planeerija ja täitja töövoogudele:

- `result_key` vaikeväärtus on `agent_workflow_ids`
- `payload_key` vaikeväärtus on `agent_task`
- `name` vaikeväärtus on `start_agents`

`wait_for_agents()` on `wait_for_workflows()` alias, mille vaikeväärtused sobivad agenditulemuste kogumiseks:

- `workflows` vaikeväärtus on `agent_workflow_ids`
- `result_key` vaikeväärtus on `agent_results`
- `name` vaikeväärtus on `wait_for_agents`

`wait_for_agent_group()` on `wait_for_workflow_group()` alias, mille vaikeväärtused sobivad agentide partiidele.

```php
use Queuety\Enums\WaitMode;

$agent_run = Queuety::workflow( 'agent_run' )
    ->then( ResearchTopicStep::class )
    ->then( SummarizeTopicStep::class );

Queuety::workflow( 'brief_research' )
    ->then( PlanTopicsStep::class )
    ->start_agents( 'agent_tasks', $agent_run, group_key: 'researchers' )
    ->wait_for_agent_group( 'researchers', WaitMode::Quorum, 2 )
    ->then( SynthesizeBriefStep::class )
    ->dispatch( [ 'brief_id' => 42 ] );
```
