
# Neuron Tervező / végrehajtó

Ez a példa a Queuety rendszert használja vezénylésre, a Neuron rendszert pedig a tényleges ügynökvégrehajtásra.

A minta egyszerű. Egy Queuety tervezőlépés eldönti, milyen munkát kell elvégezni, a `start_agents()` ezeket a feladatokat független felső szintű munkafolyamatokká alakítja, mindegyik alárendelt munkafolyamat egy Neuron ügynököt futtat, a `wait_for_agents()` pedig összesíti az eredményeket a szülő munkafolyamatban.

## Miért működik jól ez a felosztás

A Neuron kevés kódmódosítással képes szolgáltatót váltani, és egy helyre fogja össze a specialista ügynök utasítását, eszközeit és memóriáját. A Queuety jól kezeli a tartós for-each ciklusokat és befejezési módokat, az újrapróbálkozásokat, a folytathatóságot, valamint a futás vizsgálatát vagy emberi felülvizsgálatát segítő felületeket.

## 1. lépés: hozz létre szolgáltatóváltásra képes Neuron ügynököt

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

Ennek az a hasznos tulajdonsága, hogy a munkafolyamat futás közben választhat szolgáltatót, ha a `provider` értéket átadod a munkafolyamat állapotában.

## 2. lépés: futtasd a Neuron ügynököt egy Queuety lépésben

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

Ez a kulcsfontosságú integrációs pont: a Neuron kezeli az LLM-hívást, de a Queuety továbbra is a lépéshatárért és a mentett munkafolyamat-állapotért felel.

## 3. lépés: a tervező indítsa el az ügynökfuttatásokat

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

Ha a `PlanResearchTasksStep` ezt adja vissza:

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

A Queuety feladatonként létrehoz egy felső szintű munkafolyamatot, megvárja, amíg mind befejeződik, majd a kész gyermek-munkafolyamat állapotát a `$state['agent_results']` alatt adja át.

## Miért ne egyszerűen egy ciklusban hívjuk meg a Neuron-t?

Megtehetnéd, de elveszítenéd a vezénylés előnyeit:

Az egyes ügynökfuttatások külön-külön többé nem lennének vizsgálhatók, egy részleges összeomlás valószínűleg az egész köteg újraindítását eredményezné, és nem lenne egyértelmű befejezési pont a későbbi szakaszok számára.

Ez a minta egyszerűen tartja az ügynökkódot, miközben a tartós vezénylést a Queuety kezeli.

Ha a tervező egy hosszabb életű ügynökmenethez tartozik, tartsd meg ezt a munkafolyamat-mintát a végrehajtási rétegben, és bízd a külső életciklust egy [állapotgépre](https://queuety.inline0.dev/hu/docs/state-machines).

## Kapcsolódó dokumentáció

- [Aszinkron átadások](https://queuety.inline0.dev/hu/docs/workflows/async-handoffs)
- [Ügynökök vezénylése](https://queuety.inline0.dev/hu/docs/workflows/agent-orchestration)
- [Állapotgépek](https://queuety.inline0.dev/hu/docs/state-machines)
