
# Neuron Afhankelijke workflows

Dit voorbeeld behandelt een veelgestelde vraag over agents:

> Kan één workflow bepalen dat een andere workflow pas verder mag gaan nadat een eerdere workflow is voltooid?

Ja. De belangrijke nuance is dat Queuety dit al ondersteunt met `wait_for_workflow()` en `wait_for_workflows()`.

Dat betekent:

- workflow `X` kan nu worden gestart
- `X` kan wachten in `waiting_for_workflows`
- `X` wordt pas hervat wanneer workflow `Y` is voltooid

## Voorbeeld: eerst onderzoek, dan schrijven

Gebruik één workflow op het hoogste niveau om een onderzoeksdossier samen te stellen en een tweede workflow op het hoogste niveau om de definitieve tekst op te stellen.

### Onderzoeksworkflow

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

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

$research_id = Queuety::workflow('research_packet')
    ->then(PlanResearchTasksStep::class)
    ->start_agents('agent_tasks', $research_agent)
    ->wait_for_agents(mode: WaitMode::All, result_key: 'agent_results')
    ->then(SynthesizeResearchPacketStep::class)
    ->dispatch([
        'brief_id' => 42,
        'provider' => 'anthropic',
    ]);
```

### Schrijfworkflow

```php
Queuety::workflow('write_brief')
    ->wait_for_workflow('research_workflow_id', 'research')
    ->then(WriteBriefWithNeuronStep::class)
    ->wait_for_decision(result_key: 'editor_review')
    ->then(PublishBriefStep::class)
    ->dispatch([
        'brief_id' => 42,
        'research_workflow_id' => $research_id,
        'provider' => 'openai',
    ]);
```

Wanneer de schrijfworkflow start, wordt deze onmiddellijk gepauzeerd in `waiting_for_workflows` totdat de onderzoeksworkflow succesvol is voltooid.

## De schrijfstap Neuron

```php
namespace App\Workflow\Steps;

use App\Neuron\WriterAgent;
use NeuronAI\Chat\Messages\UserMessage;
use Queuety\Step;

final class WriteBriefWithNeuronStep implements Step
{
    public function handle(array $state): array
    {
        $agent = new WriterAgent(
            providerName: $state['provider'] ?? 'openai',
        );

        $message = $agent->chat(
            new UserMessage(sprintf(
                "Write the final brief for brief %d using this research packet:\n\n%s",
                $state['brief_id'],
                json_encode($state['research'], JSON_PRETTY_PRINT),
            ))
        )->getMessage();

        return [
            'draft_markdown' => $message->getContent(),
        ];
    }

    public function config(): array
    {
        return [];
    }
}
```

`$state['research']` is beschikbaar omdat `wait_for_workflow()` de voltooide openbare status van de afhankelijkheidsworkflow naar de huidige workflow heeft gekopieerd onder de sleutel `research`.

## Wanneer u dit gebruikt in plaats van één grote workflow

Kies voor afzonderlijke workflows op het hoogste niveau wanneer:

- de fasen verschillende eigenaren of operationele levenscycli hebben
- u ze onafhankelijk wilt inspecteren en opnieuw uitvoeren
- een latere fase al kan worden gestart voordat de eerdere fase is afgerond

Kies voor één workflow wanneer:

- de fasen nauw met elkaar verweven zijn
- ze één levenscyclus en één statusobject delen

## De rol van een toestandsmachine

Als deze schrijfworkflow deel uitmaakt van een langer durende redactiesessie, laat dan een [toestandsmachine](https://queuety.inline0.dev/nl/docs/state-machines) de levenscyclus aansturen en gebruik deze workflows voor uitvoeringsfasen met een afgebakende duur. Zo blijven levenscyclusstatussen zoals `awaiting_brief`, `researching`, `awaiting_review` en `completed` expliciet, terwijl de duurzaamheid van workflows binnen elke fase behouden blijft.

## Eén belangrijk onderscheid

Dit patroon betekent:

- `X` bestaat nu, maar wacht op `Y`

Het betekent **niet**:

- `X` wordt pas aangemaakt wanneer `Y` is afgerond

Als u het tweede gedrag wilt, laat dan een bovenliggende workflow wachten op `Y` en roep pas daarna `start_workflows()` of `start_agents()` aan voor `X`.

## Gerelateerde documentatie

- [Workflowafhankelijkheden](https://queuety.inline0.dev/nl/docs/workflows/dependencies)
- [Asynchrone overdrachten](https://queuety.inline0.dev/nl/docs/workflows/async-handoffs)
- [Agentorkestratie](https://queuety.inline0.dev/nl/docs/workflows/agent-orchestration)
- [Toestandsmachines](https://queuety.inline0.dev/nl/docs/state-machines)
