
# Neuron Workflow Bergantung

Contoh ini menjawab pertanyaan umum tentang agen:

> Bisakah satu workflow memutuskan bahwa workflow lain hanya boleh melanjutkan setelah workflow sebelumnya selesai?

Bisa. Nuansa pentingnya, Queuety sudah mendukung hal ini dengan `wait_for_workflow()` dan `wait_for_workflows()`.

Artinya:

- workflow `X` dapat dikirim sekarang
- `X` dapat menunggu di `waiting_for_workflows`
- `X` hanya dilanjutkan kembali setelah workflow `Y` selesai

## Contoh: riset terlebih dahulu, penulisan berikutnya

Gunakan satu workflow tingkat atas untuk menyusun paket riset, dan workflow tingkat atas kedua untuk membuat draf akhir.

### Workflow riset

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

### Workflow penulisan

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

Saat workflow penulisan dimulai, workflow tersebut langsung dijeda di `waiting_for_workflows` hingga workflow riset berhasil diselesaikan.

## Langkah penulisan 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']` tersedia karena `wait_for_workflow()` menyalin status publik yang telah selesai dari workflow dependensi ke workflow saat ini di bawah kunci `research`.

## Kapan memilih ini daripada satu workflow besar

Pilih workflow tingkat atas terpisah jika:

- tahap-tahapnya memiliki pemilik atau siklus operasional yang berbeda
- Anda ingin memeriksa dan mencoba ulang tiap tahap secara terpisah
- tahap berikutnya perlu dapat dikirim sebelum tahap sebelumnya selesai

Pilih satu workflow jika:

- tahap-tahapnya saling terkait erat
- tahap-tahapnya berbagi satu siklus hidup dan satu wadah status

## Peran mesin status

Jika alur penulisan ini merupakan bagian dari sesi editorial yang berumur panjang, biarkan [mesin status](https://queuety.inline0.dev/id/docs/state-machines) mengelola siklus hidup di lapisan luar dan gunakan workflow ini untuk tahap eksekusi yang terbatas. Dengan begitu, status siklus hidup seperti `awaiting_brief`, `researching`, `awaiting_review`, dan `completed` tetap eksplisit, sementara ketahanan workflow di setiap fase tetap terjaga.

## Satu perbedaan penting

Pola ini berarti:

- `X` sekarang sudah ada, tetapi menunggu `Y`

Ini **tidak** berarti:

- `X` baru dibuat setelah `Y` selesai

Jika Anda menginginkan perilaku kedua, buat workflow induk menunggu `Y`, lalu panggil `start_workflows()` atau `start_agents()` untuk `X`.

## Dokumentasi terkait

- [Dependensi Workflow](https://queuety.inline0.dev/id/docs/workflows/dependencies)
- [Serah Terima Asinkron](https://queuety.inline0.dev/id/docs/workflows/async-handoffs)
- [Orkestrasi Agen](https://queuety.inline0.dev/id/docs/workflows/agent-orchestration)
- [Mesin Status](https://queuety.inline0.dev/id/docs/state-machines)
