
# Neuron Zależne przepływy pracy

Ten przykład odpowiada na często zadawane pytanie dotyczące agentów:

> Czy jeden przepływ pracy może zdecydować, że inny będzie kontynuowany dopiero po zakończeniu wcześniejszego?

Tak. Ważne jest to, że Queuety już obsługuje taką możliwość za pomocą `wait_for_workflow()` i `wait_for_workflows()`.

Oznacza to, że:

- przepływ pracy `X` można uruchomić od razu
- `X` może zaczekać w `waiting_for_workflows`
- `X` wznawia działanie dopiero po zakończeniu przepływu pracy `Y`

## Przykład: najpierw badanie, potem pisanie

Użyj jednego przepływu pracy najwyższego poziomu do przygotowania pakietu materiałów z badań, a drugiego do opracowania tekstu końcowego.

### Przepływ pracy badawczy

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

### Przepływ pracy związany z pisaniem

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

Po uruchomieniu przepływ pracy związany z pisaniem natychmiast zatrzymuje się w `waiting_for_workflows` i czeka na pomyślne zakończenie przepływu badawczego.

## Krok pisania 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']` jest dostępne, ponieważ `wait_for_workflow()` skopiowało ukończony stan publiczny zależnego przepływu pracy do bieżącego przepływu pod kluczem `research`.

## Kiedy wybrać to rozwiązanie zamiast jednego ogromnego przepływu pracy

Wybierz osobne przepływy pracy najwyższego poziomu, gdy:

- etapy mają różnych właścicieli lub odrębne cykle operacyjne
- chcesz sprawdzać je i ponawiać niezależnie
- późniejszy etap powinien móc zostać uruchomiony, zanim zakończy się wcześniejszy

Wybierz jeden przepływ pracy, gdy:

- etapy są ściśle powiązane
- korzystają ze wspólnego cyklu życia i jednego zestawu stanu

## Rola maszyny stanów

Jeśli ten proces pisania jest częścią dłuższej sesji redakcyjnej, powierz zewnętrzny cykl życia maszynie [stanów](https://queuety.inline0.dev/pl/docs/state-machines), a opisane przepływy pracy wykorzystaj do ograniczonych etapów wykonania. Dzięki temu stany cyklu życia, takie jak `awaiting_brief`, `researching`, `awaiting_review` i `completed`, pozostaną jawne, a trwałość przepływu pracy będzie zachowana w każdej fazie.

## Ważne rozróżnienie

Ten wzorzec oznacza, że:

- `X` istnieje już teraz, ale czeka na `Y`

Nie oznacza to, że:

- `X` zostanie utworzony dopiero po zakończeniu `Y`

Jeśli chcesz uzyskać ten drugi efekt, spraw, by nadrzędny przepływ pracy czekał na `Y`, a dopiero potem wywołał `start_workflows()` lub `start_agents()` dla `X`.

## Powiązana dokumentacja

- [Zależności przepływu pracy](https://queuety.inline0.dev/pl/docs/workflows/dependencies)
- [Przekazania asynchroniczne](https://queuety.inline0.dev/pl/docs/workflows/async-handoffs)
- [Orkiestracja agentów](https://queuety.inline0.dev/pl/docs/workflows/agent-orchestration)
- [Maszyny stanów](https://queuety.inline0.dev/pl/docs/state-machines)
