
# Neuron Afhængige workflows

Dette eksempel besvarer et almindeligt spørgsmål om agentbaserede systemer:

> Kan ét workflow beslutte, at et andet workflow først må fortsætte, når et tidligere workflow er afsluttet?

Ja. Den vigtige detalje er, at Queuety allerede understøtter dette med `wait_for_workflow()` og `wait_for_workflows()`.

Det betyder, at:

- workflow `X` kan afsendes nu
- `X` kan sættes på pause i `waiting_for_workflows`
- `X` først genoptages, når workflow `Y` er fuldført

## Eksempel: først research, derefter tekstforfatning

Brug ét workflow på øverste niveau til at udarbejde en researchpakke og et andet workflow på øverste niveau til at skrive den endelige tekst.

### Researchworkflow

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

### Skriveworkflow

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

Når skriveworkflowet starter, sættes det straks på pause i `waiting_for_workflows`, indtil researchworkflowet er fuldført.

## Skrive trinnet 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']` er tilgængelig, fordi `wait_for_workflow()` kopierede den fuldførte offentlige tilstand fra afhængighedsworkflowet til det aktuelle workflow under nøglen `research`.

## Hvornår dette bør bruges i stedet for ét stort workflow

Foretræk separate workflows på øverste niveau, når:

- trinnene har forskellige ejere eller driftslivscyklusser
- du vil kunne inspicere og prøve dem igen uafhængigt
- et senere trin skal kunne afsendes, før det tidligere trin er færdigt

Foretræk ét workflow, når:

- trinnene er tæt forbundne
- de deler én livscyklus og én tilstandsbeholder

## Hvor en tilstandsmaskine passer ind

Hvis dette skriveforløb hører til en længerevarende redaktionel session, så lad en [tilstandsmaskine](https://queuety.inline0.dev/da/docs/state-machines) styre den overordnede livscyklus, og brug disse workflows til de afgrænsede udførelsestrin. Så forbliver livscyklustilstande som `awaiting_brief`, `researching`, `awaiting_review` og `completed` tydelige, samtidig med at workflowets holdbarhed bevares i hver fase.

## En vigtig skelnen

Dette mønster betyder:

- `X` findes allerede, men venter på `Y`

Det betyder **ikke**:

- `X` oprettes først, når `Y` er færdigt

Hvis du ønsker den anden adfærd, skal et overordnet workflow vente på `Y` og først derefter kalde `start_workflows()` eller `start_agents()` for `X`.

## Relateret dokumentation

- [Afhængigheder mellem arbejdsgange](https://queuety.inline0.dev/da/docs/workflows/dependencies)
- [Asynkrone overdragelser](https://queuety.inline0.dev/da/docs/workflows/async-handoffs)
- [Agentorkestrering](https://queuety.inline0.dev/da/docs/workflows/agent-orchestration)
- [Tilstandsmaskiner](https://queuety.inline0.dev/da/docs/state-machines)
