
# Neuron Зависими работни потоци

Този пример разглежда често срещан въпрос за агентните системи:

> Може ли един работен поток да реши, че друг трябва да продължи едва след като предишният приключи?

Да. Важното уточнение е, че Queuety вече поддържа това чрез `wait_for_workflow()` и `wait_for_workflows()`.

Това означава, че:

- работен поток `X` може да бъде стартиран сега
- `X` може да изчака в `waiting_for_workflows`
- `X` продължава едва когато работен поток `Y` завърши

## Пример: първо проучване, после писане

Използвайте един работен поток от най-горно ниво за създаване на пакет с проучване, а втори работен поток от най-горно ниво — за изготвяне на крайния текст.

### Работен поток за проучване

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

### Работен поток за писане

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

Когато работният поток за писане стартира, той веднага се поставя на пауза в `waiting_for_workflows`, докато работният поток за проучване не завърши успешно.

## Стъпката за писане 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']` е наличен, защото `wait_for_workflow()` е копирал завършеното публично състояние от зависимия работен поток в текущия поток под ключа `research`.

## Кога да използвате това вместо един огромен работен поток

Изберете отделни работни потоци от най-горно ниво, когато:

- етапите имат различни собственици или оперативни жизнени цикли
- искате да ги проверявате и изпълнявате повторно независимо
- по-късен етап трябва да може да бъде стартиран още преди завършването на предходния

Изберете един работен поток, когато:

- етапите са тясно свързани
- споделят един жизнен цикъл и един контейнер за състояние

## Ролята на машина на състоянията

Ако този процес на писане е част от по-дълготрайна редакционна сесия, оставете [машина на състоянията](https://queuety.inline0.dev/bg/docs/state-machines) да управлява външния жизнен цикъл и използвайте тези работни потоци за ограничените етапи на изпълнение. Така състоянията на жизнения цикъл като `awaiting_brief`, `researching`, `awaiting_review` и `completed` остават изрични, а работният поток запазва устойчивостта си във всяка фаза.

## Едно важно разграничение

Този модел означава, че:

- `X` съществува сега, но изчаква `Y`

Това **не** означава, че:

- `X` не се създава, докато `Y` не приключи

Ако искате второто поведение, накарайте родителски работен поток да изчака `Y` и едва след това да извика `start_workflows()` или `start_agents()` за `X`.

## Свързана документация

- [Зависимости на работен поток](https://queuety.inline0.dev/bg/docs/workflows/dependencies)
- [Асинхронно предаване](https://queuety.inline0.dev/bg/docs/workflows/async-handoffs)
- [Оркестрация на агенти](https://queuety.inline0.dev/bg/docs/workflows/agent-orchestration)
- [Машини на състоянията](https://queuety.inline0.dev/bg/docs/state-machines)
