
# Neuron Planlayıcı / Yürütücü

Bu örnekte orkestrasyon için Queuety, gerçek aracı yürütmesi için Neuron kullanılır.

Kalıp basittir. Queuety planlayıcı adımı yapılacak işe karar verir, `start_agents()` bu görevleri bağımsız üst düzey iş akışlarına dönüştürür, her alt iş akışı bir Neuron aracısı çalıştırır ve `wait_for_agents()` sonuçları toplayıp ana iş akışına aktarır.

## Bu ayrım neden işe yarıyor

Neuron sağlayıcıları en az kod değişikliğiyle değiştirme ve uzman bir aracı için istemi, araçları ve belleği kapsülleme konusunda iyidir. Queuety ise kalıcı her öğe için işlemler ve tamamlanma kipleri, yeniden denemeler, devam edebilme ve çalıştırma çevresindeki inceleme veya insan değerlendirmesi arayüzleri konusunda iyidir.

## 1. adım: sağlayıcısı değiştirilebilen bir Neuron aracısı oluşturun

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

Buradaki yararlı nokta, iş akışının çalışma zamanında iş akışı durumundaki `provider` değerini aktararak sağlayıcıyı seçebilmesidir.

## 2. adım: Queuety adımı içinde Neuron aracısını çalıştırın

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

Bu, temel tümleştirme noktasıdır: LLM çağrısını Neuron yönetir, ancak adım sınırı ve kalıcı iş akışı durumu yine Queuety tarafından yönetilir.

## 3. adım: planlayıcının aracı çalıştırmalarını başlatmasını sağlayın

```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` şunu döndürürse:

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

Queuety her görev için bir üst düzey iş akışı oluşturur, hepsi tamamlanana kadar bekler ve ardından bitmiş alt iş akışı durumunu `$state['agent_results']` altında aktarır.

## Neden Neuron öğesini bir döngüde çağırmamalı?

Bunu yapabilirsiniz, ancak orkestrasyonun avantajlarını kaybedersiniz:

Her aracı çalıştırması ayrı ayrı incelenemez hâle gelir, kısmi bir çökme büyük olasılıkla tüm grubu yeniden başlatır ve sonraki aşamalar için temiz bir tamamlanma noktası olmaz.

Bu kalıp aracı kodunu basit tutarken kalıcı orkestrasyonu Queuety öğesine bırakır.

Planlayıcı daha uzun ömürlü bir aracı oturumunun parçasıysa, bu iş akışı kalıbını yürütme katmanı için kullanın; dış yaşam döngüsünü ise bir [durum makinesi](https://queuety.inline0.dev/tr/docs/state-machines) yönetsin.

## İlgili belgeler

- [Eşzamansız Devirler](https://queuety.inline0.dev/tr/docs/workflows/async-handoffs)
- [Aracı Orkestrasyonu](https://queuety.inline0.dev/tr/docs/workflows/agent-orchestration)
- [Durum Makineleri](https://queuety.inline0.dev/tr/docs/state-machines)
