
# Aszinkron átadások

Akkor használja a(z) `start_workflows()` megoldást, ha egy munkafolyamatnak a felfedezett munkát önálló, legfelső szintű munkafolyamatoknak kell átadnia ahelyett, hogy mindent egyetlen futáson belül tartana.

Ha kifejezetten ügynökfutásokat modellez, a(z) `start_agents()` és `wait_for_agents()` szemantikai szinonimák, ügynökökre szabott alapértékekkel.

Nagyobb, elejétől végéig tartó példákért lásd az [Ügynökök összehangolása](https://queuety.inline0.dev/hu/docs/workflows/agent-orchestration) oldalt.

Ez az ügynökökre szabott összehangolásnál hasznos:

- egy tervező-munkafolyamat futás közben feladatokat fedez fel
- minden feladatból saját, tartós munkafolyamat lesz
- a szülő ezeknek a munkafolyamat-azonosítóit tárolja az állapotban
- a szülő később megvárhatja a(z) `all`, `any`, `quorum` értéket vagy egy elnevezett, elindított csoportot

## A(z) `->start_workflows()` metódus

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

A példában:

1. A(z) `PlanTopicsStep` témák adattartalmának tömbjét írja a(z) `$state['topics']` helyre
2. A(z) `start_workflows()` témánként elindít egy `agent_task` munkafolyamatot
3. Az elindított munkafolyamatok azonosítói a(z) `$state['child_workflow_ids']` helyre kerülnek
4. A(z) `wait_for_workflow_group()` szüneteltet, amíg az elindított csoport nem teljesíti a választott befejezési feltételt
5. A(z) `SynthesizeBriefStep` a befejezett gyermekállapotokat a(z) `$state['child_results']` alatt kapja meg

## Gyermek-adattartalmak

A(z) `items_key` minden eleme egy elindított munkafolyamat kezdeti adattartalmává válik.

Ha az elem tömb, a nyilvános kulcsai egyesülnek a gyermek adattartalmával:

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

Ha az elem skalár, a(z) Queuety a(z) `payload_key` alatt tárolja:

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

## A szülő állapotának öröklése

Alapértelmezés szerint a(z) `start_workflows()` minden gyermek adattartalmába egyesíti a szülő munkafolyamat nyilvános állapotát.

Ez azt jelenti, hogy az olyan megosztott kontextusok, mint a(z) `brief_id`, `account_id` vagy `campaign`, automatikusan elérhetők minden elindított munkafolyamatban.

A(z) `items_key` forrás és a(z) `result_key` kimarad az öröklésből, így egyik gyermek sem kapja meg a teljes feladatlistát vagy a végső munkafolyamat-azonosítók tömbjét.

Állítsa be a(z) `inherit_state: false` értéket, ha azt szeretné, hogy minden gyermek csak a saját elemének adattartalmát kapja meg.

## Miért ne a(z) `run_workflow()` megoldást?

A(z) `run_workflow()` szülő-gyermek kapcsolatot hoz létre, amelyben a szülő ennél a lépésnél várakozik a gyermek befejezéséig.

A(z) `start_workflows()` lazább kapcsolatot hoz létre:

- az elindított munkafolyamatok önálló, legfelső szintű munkafolyamatok
- mindegyik külön megvizsgálható, újrapróbálható vagy exportálható
- a szülő később dönti el, hogy vár-e rájuk, és hogyan

Ezért a(z) `start_workflows()` jobban illik az ügynökfeladatok aszinkron átadásához, míg a(z) `run_workflow()` jobb választás a munkafolyamat-fán belüli beágyazott összeállításhoz.

## Későbbi várakozás

A(z) `start_workflows()` a [Munkafolyamat-függőségek](https://queuety.inline0.dev/hu/docs/workflows/dependencies) megoldással együtt használható:

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

- A(z) `WaitMode::All` összegyűjti az összes befejezett gyermekállapotot
- A(z) `WaitMode::Any` az első sikeres gyermek-munkafolyamat befejezésekor folytatódik

Így tervező/végrehajtó összehangolást valósíthat meg teljes, futás közben szerkeszthető DAG-motor nélkül.

## Ügynökbarát aliasok

A(z) `start_agents()` a(z) `start_workflows()` egyik aliasa, tervező/végrehajtó folyamatokra hangolt alapértékekkel:

- A(z) `result_key` alapértelmezése: `agent_workflow_ids`
- A(z) `payload_key` alapértelmezése: `agent_task`
- A(z) `name` alapértelmezése: `start_agents`

A(z) `wait_for_agents()` a(z) `wait_for_workflows()` egyik aliasa, az ügynökeredmények összegyűjtésére hangolt alapértékekkel:

- A(z) `workflows` alapértelmezése: `agent_workflow_ids`
- A(z) `result_key` alapértelmezése: `agent_results`
- A(z) `name` alapértelmezése: `wait_for_agents`

A(z) `wait_for_agent_group()` a(z) `wait_for_workflow_group()` egyik aliasa, ügynökfeladat-kötegekhez hangolt alapértékekkel.

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