انتقل إلى المحتوى

مخطط Neuron / المنفّذ

يستخدم هذا المثال Queuety للتنسيق وNeuron لتنفيذ الوكيل فعليًا.

النمط مباشر. تحدد خطوة المخطط في Queuety العمل المطلوب، وتحول start_agents() تلك المهام إلى مسارات عمل مستقلة على المستوى الأعلى، ويشغّل كل سير عمل تابع وكيل Neuron، ثم يجمع wait_for_agents() النتائج في سير العمل الرئيسي.

لماذا ينجح هذا التقسيم

يجيد Neuron تبديل المزوّدين مع تغييرات طفيفة في الأكواد، وتغليف المطالبة والأدوات والذاكرة لوكيل متخصص. ويجيد Queuety أوضاع التنفيذ الدائم لكل عنصر وعند الاكتمال، وإعادة المحاولة والاستئناف، إضافة إلى واجهات الفحص أو المراجعة البشرية المحيطة بالتشغيل.

الخطوة 1: أنشئ وكيل Neuron قابلًا لتبديل المزوّد

PHP
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.',
            ],
        );
    }
}

الميزة المفيدة هنا هي أن سير العمل يستطيع اختيار المزوّد وقت التشغيل بتمرير provider ضمن حالة سير العمل.

الخطوة 2: شغّل وكيل Neuron داخل خطوة Queuety

PHP
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 [];
    }
}

هذه هي نقطة التكامل الأساسية: يتولى Neuron استدعاء LLM، بينما يظل Queuety مسؤولًا عن حدود الخطوة وحالة سير العمل المحفوظة.

الخطوة 3: دع المخطط يبدأ تشغيل الوكلاء

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

إذا أعاد PlanResearchTasksStep ما يلي:

PHP
[
    'agent_tasks' => [
        ['topic' => 'pricing'],
        ['topic' => 'customer reviews'],
        ['topic' => 'recent launches'],
    ],
]

سينشئ Queuety سير عمل واحدًا على المستوى الأعلى لكل مهمة، وينتظر اكتمالها جميعًا، ثم يمرر حالة سير العمل التابع المكتملة ضمن $state['agent_results'].

لماذا لا نستدعي Neuron ضمن حلقة فحسب؟

يمكنك فعل ذلك، لكنك ستفقد مزايا التنسيق:

سيتعذر فحص كل تشغيل للوكيل على حدة، وقد يؤدي تعطل جزئي إلى إعادة تشغيل المجموعة بأكملها، ولن توجد نقطة اكتمال واضحة للمراحل اللاحقة.

يحافظ هذا النمط على بساطة أكواد الوكيل، مع إسناد التنسيق الدائم إلى Queuety.

إذا كان المخطط جزءًا من جلسة وكيل طويلة الأمد، فأبقِ نمط سير العمل هذا لطبقة التنفيذ، ودع آلة الحالات تتولى دورة الحياة الخارجية.