
# مسارات عمل Neuron المعتمدة

يجيب هذا المثال عن سؤال شائع حول الوكلاء:

> هل يمكن لسير عمل أن يقرر ألا يتابع سير عمل آخر إلا بعد اكتمال سير عمل سابق؟

نعم. والتفصيل المهم هو أن Queuety يدعم ذلك بالفعل باستخدام `wait_for_workflow()` و`wait_for_workflows()`.

وهذا يعني:

- يمكن إرسال سير العمل `X` الآن
- يمكن أن ينتظر `X` في `waiting_for_workflows`
- لا يُستأنف `X` إلا عند اكتمال سير العمل `Y`

## مثال: البحث أولًا، ثم الكتابة

استخدم سير عمل واحدًا على المستوى الأعلى لإعداد حزمة بحث، وسير عمل ثانٍ على المستوى الأعلى لصياغة النص النهائي.

### سير عمل البحث

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

### سير عمل الكتابة

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

عند بدء سير عمل الكتابة، يتوقف فورًا في `waiting_for_workflows` إلى أن يكتمل سير عمل البحث بنجاح.

## خطوة الكتابة في 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']` لأن `wait_for_workflow()` نسخ الحالة العامة المكتملة من سير العمل التابع إلى سير العمل الحالي ضمن المفتاح `research`.

## متى تستخدم هذا بدلًا من سير عمل واحد ضخم

فضّل سيرَي عمل منفصلين على المستوى الأعلى عندما:

- تكون للمراحل جهات مسؤولة أو دورات تشغيل مختلفة
- تريد فحص كل مرحلة وإعادة محاولتها بشكل مستقل
- ينبغي إتاحة إرسال مرحلة لاحقة حتى قبل اكتمال المرحلة السابقة

فضّل سير عمل واحدًا عندما:

- تكون المراحل مترابطة بإحكام
- تتشارك دورة حياة واحدة وحاوية حالة واحدة

## موضع آلة الحالات

إذا كان مسار الكتابة هذا جزءًا من جلسة تحرير طويلة الأمد، فدع [آلة الحالات](https://queuety.inline0.dev/ar/docs/state-machines) تتولى دورة الحياة الخارجية، واستخدم سيرَي العمل هذين لمراحل التنفيذ محدودة النطاق. يضمن ذلك وضوح حالات دورة الحياة مثل `awaiting_brief` و`researching` و`awaiting_review` و`completed`، مع الحفاظ على متانة سير العمل في كل مرحلة.

## تمييز مهم

يعني هذا النمط ما يلي:

- `X` موجود الآن، لكنه ينتظر `Y`

ولا يعني ما يلي:

- لن يتم إنشاء `X` إلا بعد انتهاء `Y`

إذا كنت تريد السلوك الثاني، فاجعل سير عمل رئيسيًا ينتظر `Y`، ثم يستدعي `start_workflows()` أو `start_agents()` من أجل `X`.

## مستندات ذات صلة

- [اعتماديات سير العمل](https://queuety.inline0.dev/ar/docs/workflows/dependencies)
- [التسليمات غير المتزامنة](https://queuety.inline0.dev/ar/docs/workflows/async-handoffs)
- [تنسيق الوكلاء](https://queuety.inline0.dev/ar/docs/workflows/agent-orchestration)
- [آلات الحالات](https://queuety.inline0.dev/ar/docs/state-machines)
