Neuron Planner / Executor
Contoh ini menggunakan Queuety untuk orkestrasi dan Neuron untuk eksekusi agen itu sendiri.
Polanya sederhana. Langkah planner Queuety menentukan pekerjaan yang perlu dilakukan, start_agents() mengubah tugas-tugas itu menjadi workflow tingkat atas yang independen, setiap workflow anak menjalankan agen Neuron, lalu wait_for_agents() menggabungkan hasilnya kembali ke workflow induk.
Mengapa pembagian ini berjalan baik
Neuron unggul dalam mengganti provider dengan perubahan kode minimal serta mengemas prompt, alat, dan memori untuk agen spesialis. Queuety unggul dalam mode for-each dan penyelesaian yang tangguh, percobaan ulang, kemampuan melanjutkan, serta antarmuka pemeriksaan atau tinjauan manusia di sekitar proses.
Langkah 1: buat agen Neuron yang providernya dapat diganti
namespace App\Neuron;
use NeuronAI\Agent\Agent;
use NeuronAI\Providers\AIProviderInterface;
use NeuronAI\Providers\Anthropic\Anthropic;
use NeuronAI\Providers\Gemini\Gemini;
use NeuronAI\Providers\OpenAI\Responses\OpenAIResponses;
use NeuronAI\SystemPrompt;
final class ResearchAgent extends Agent
{
public function __construct(
private readonly string $providerName = 'openai',
) {}
protected function provider(): AIProviderInterface
{
return match ($this->providerName) {
'anthropic' => new Anthropic(
key: $_ENV['ANTHROPIC_API_KEY'],
model: $_ENV['ANTHROPIC_MODEL'],
),
'gemini' => new Gemini(
key: $_ENV['GEMINI_API_KEY'],
model: $_ENV['GEMINI_MODEL'],
),
default => new OpenAIResponses(
key: $_ENV['OPENAI_API_KEY'],
model: $_ENV['OPENAI_MODEL'],
),
};
}
public function instructions(): string
{
return (string) new SystemPrompt(
background: [
'You are a research agent.',
'Return concise, source-aware summaries for the assigned topic.',
],
);
}
}
Bagian yang berguna di sini adalah workflow dapat memilih provider saat runtime dengan meneruskan provider dalam status workflow.
Langkah 2: jalankan agen Neuron dalam langkah Queuety
namespace App\Workflow\Steps;
use App\Neuron\ResearchAgent;
use NeuronAI\Chat\Messages\UserMessage;
use Queuety\Step;
final class ResearchTopicStep implements Step
{
public function handle(array $state): array
{
$agent = new ResearchAgent(
providerName: $state['provider'] ?? 'openai',
);
$message = $agent->chat(
new UserMessage(sprintf(
"Research the topic '%s' for brief %d. Return a compact bullet summary.",
$state['topic'],
$state['brief_id'],
))
)->getMessage();
return [
'summary' => $message->getContent(),
];
}
public function config(): array
{
return [];
}
}
Ini adalah titik integrasi utama: Neuron menangani pemanggilan LLM, tetapi Queuety tetap mengelola batas langkah dan status alur kerja yang tersimpan.
Langkah 3: biarkan planner memulai eksekusi agent
use Queuety\Enums\WaitMode;
use Queuety\Queuety;
$agent_workflow = Queuety::workflow('research_agent_run')
->then(ResearchTopicStep::class);
Queuety::workflow('brief_research')
->version('brief-research.v1')
->then(PlanResearchTasksStep::class) // writes $state['agent_tasks']
->start_agents('agent_tasks', $agent_workflow)
->wait_for_agents(mode: WaitMode::All, result_key: 'agent_results')
->then(SynthesizeBriefStep::class)
->dispatch([
'brief_id' => 42,
'provider' => 'anthropic',
]);
Jika PlanResearchTasksStep mengembalikan:
[
'agent_tasks' => [
['topic' => 'pricing'],
['topic' => 'customer reviews'],
['topic' => 'recent launches'],
],
]
Queuety akan membuat satu alur kerja tingkat atas untuk setiap tugas, menunggu hingga semuanya selesai, lalu meneruskan status alur kerja anak yang telah selesai di bawah $state['agent_results'].
Mengapa tidak memanggil Neuron dalam loop saja?
Anda bisa melakukannya, tetapi Anda akan kehilangan keunggulan orkestrasi:
Setiap eksekusi agent tidak lagi dapat diperiksa secara terpisah, kegagalan sebagian kemungkinan akan memulai ulang seluruh batch, dan tidak akan ada titik penyelesaian yang jelas untuk tahap berikutnya.
Pola ini menjaga kode agent tetap sederhana sekaligus membiarkan Queuety mengelola orkestrasi yang tahan lama.
Jika planner berada dalam sesi agent yang berjalan lebih lama, pertahankan pola alur kerja ini untuk lapisan eksekusi dan biarkan state machine mengelola siklus hidup bagian luarnya.