
# Asinchroninis perdavimas

Naudokite `start_workflows()`, kai darbo eiga turi perduoti aptiktą darbą nepriklausomoms aukščiausio lygio darbo eigoms, o ne laikyti viską viename vykdyme.

Jei aiškiai modeliuojate agentų vykdymus, `start_agents()` ir `wait_for_agents()` yra semantiniai sinonimai su agentams pritaikytomis numatytosiomis reikšmėmis.

Išsamesnių pavyzdžių nuo pradžios iki pabaigos ieškokite puslapyje [Agentų orkestravimas](https://queuety.inline0.dev/lt/docs/workflows/agent-orchestration).

Tai naudinga agentų tipo orkestravimui:

- planuotojo darbo eiga vykdymo metu aptinka užduotis
- kiekviena užduotis tampa atskira patvaria darbo eiga
- pirminė eiga išsaugo šių darbo eigų ID būsenoje
- vėliau pirminė eiga gali laukti `all`, `any`, `quorum` arba įvardytos pradėtos grupės

## Metodas `->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 ] );
```

Šiame pavyzdyje:

1. `PlanTopicsStep` įrašo temų duomenų rinkinių masyvą į `$state['topics']`
2. `start_workflows()` kiekvienai temai paleidžia po vieną `agent_task` darbo eigą
3. Pradėtų darbo eigų ID įrašomi į `$state['child_workflow_ids']`
4. `wait_for_workflow_group()` pristabdo vykdymą, kol pradėta grupė įvykdo pasirinktą užbaigimo sąlygą
5. `SynthesizeBriefStep` gauna užbaigtas antrines būsenas, pateiktas per `$state['child_results']`

## Antriniai duomenų rinkiniai

Kiekvienas `items_key` elementas tampa pradine vienos paleistos darbo eigos duomenų apkrova.

Jei elementas yra masyvas, jo viešieji raktai sujungiami su antrinės darbo eigos duomenų apkrova:

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

Jei elementas yra skaliaras, Queuety išsaugo jį per `payload_key`:

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

## Pirminės būsenos paveldėjimas

Pagal numatytąsias nuostatas `start_workflows()` sujungia pirminės darbo eigos viešąją būseną su kiekvienos antrinės darbo eigos duomenų apkrova.

Tai reiškia, kad bendras kontekstas, pavyzdžiui, `brief_id`, `account_id` arba `campaign`, automatiškai pasiekiamas kiekvienoje pradėtoje darbo eigoje.

Šaltinis `items_key` ir `result_key` neįtraukiami į paveldėjimą, kad kiekviena antrinė eiga negautų viso užduočių sąrašo ar galutinio darbo eigų ID masyvo.

Nustatykite `inherit_state: false`, kai kiekviena antrinė eiga turi gauti tik savo elemento duomenų apkrovą.

## Kodėl ne `run_workflow()`?

`run_workflow()` sukuria pirminės ir antrinės eigos ryšį, kuriame pirminė eiga sustoja ties tuo žingsniu, kol baigiama antrinė eiga.

`start_workflows()` suteikia daugiau laisvės:

- pradėtos darbo eigos yra nepriklausomos aukščiausio lygio darbo eigos
- kiekvieną pradėtą darbo eigą galima atskirai apžiūrėti, pakartoti arba eksportuoti
- pirminė eiga vėliau nusprendžia, ar ir kaip jų laukti

Todėl `start_workflows()` geriau tinka asinchroniniam agentų užduočių perdavimui, o `run_workflow()` labiau tinka įdėtinei kompozicijai viename orkestravimo medyje.

## Laukimas vėliau

`start_workflows()` skirtas naudoti kartu su [Darbo eigos priklausomybėmis](https://queuety.inline0.dev/lt/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` surenka visas užbaigtas antrines būsenas
- `WaitMode::Any` tęsiamas užbaigus pirmą sėkmingą antrinę darbo eigą

Taip galima orkestruoti planuotoją ir vykdytoją be visaverčio vykdymo metu redaguojamo DAG variklio.

## Agentams pritaikyti sinonimai

`start_agents()` yra `start_workflows()` sinonimas su planuotojo / vykdytojo srautams pritaikytomis numatytosiomis reikšmėmis:

- `result_key` numatytoji reikšmė yra `agent_workflow_ids`
- `payload_key` numatytoji reikšmė yra `agent_task`
- `name` numatytoji reikšmė yra `start_agents`

`wait_for_agents()` yra `wait_for_workflows()` sinonimas su agentų rezultatams rinkti pritaikytomis numatytosiomis reikšmėmis:

- `workflows` numatytoji reikšmė yra `agent_workflow_ids`
- `result_key` numatytoji reikšmė yra `agent_results`
- `name` numatytoji reikšmė yra `wait_for_agents`

`wait_for_agent_group()` yra `wait_for_workflow_group()` sinonimas su agentų paketams pritaikytomis numatytosiomis reikšmėmis.

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