مسارات عمل Neuron المعتمدة
يجيب هذا المثال عن سؤال شائع حول الوكلاء:
هل يمكن لسير عمل أن يقرر ألا يتابع سير عمل آخر إلا بعد اكتمال سير عمل سابق؟
نعم. والتفصيل المهم هو أن Queuety يدعم ذلك بالفعل باستخدام wait_for_workflow() وwait_for_workflows().
وهذا يعني:
- يمكن إرسال سير العمل
Xالآن - يمكن أن ينتظر
Xفيwaiting_for_workflows - لا يُستأنف
Xإلا عند اكتمال سير العملY
مثال: البحث أولًا، ثم الكتابة
استخدم سير عمل واحدًا على المستوى الأعلى لإعداد حزمة بحث، وسير عمل ثانٍ على المستوى الأعلى لصياغة النص النهائي.
سير عمل البحث
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',
]);
سير عمل الكتابة
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
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.
متى تستخدم هذا بدلًا من سير عمل واحد ضخم
فضّل سيرَي عمل منفصلين على المستوى الأعلى عندما:
- تكون للمراحل جهات مسؤولة أو دورات تشغيل مختلفة
- تريد فحص كل مرحلة وإعادة محاولتها بشكل مستقل
- ينبغي إتاحة إرسال مرحلة لاحقة حتى قبل اكتمال المرحلة السابقة
فضّل سير عمل واحدًا عندما:
- تكون المراحل مترابطة بإحكام
- تتشارك دورة حياة واحدة وحاوية حالة واحدة
موضع آلة الحالات
إذا كان مسار الكتابة هذا جزءًا من جلسة تحرير طويلة الأمد، فدع آلة الحالات تتولى دورة الحياة الخارجية، واستخدم سيرَي العمل هذين لمراحل التنفيذ محدودة النطاق. يضمن ذلك وضوح حالات دورة الحياة مثل awaiting_brief وresearching وawaiting_review وcompleted، مع الحفاظ على متانة سير العمل في كل مرحلة.
تمييز مهم
يعني هذا النمط ما يلي:
Xموجود الآن، لكنه ينتظرY
ولا يعني ما يلي:
- لن يتم إنشاء
Xإلا بعد انتهاءY
إذا كنت تريد السلوك الثاني، فاجعل سير عمل رئيسيًا ينتظر Y، ثم يستدعي start_workflows() أو start_agents() من أجل X.