Lewati ke konten

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 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.