
# Neuron Planuoklis / vykdytojas

Šiame pavyzdyje orkestravimui naudojamas Queuety, o pačiam agento vykdymui – Neuron.

Šablonas paprastas. Queuety planuoklio žingsnis nustato, kokius darbus reikia atlikti, `start_agents()` paverčia tas užduotis nepriklausomomis aukščiausio lygio darbo eigomis, kiekvienoje antrinėje darbo eigoje vykdomas Neuron agentas, o `wait_for_agents()` apibendrina rezultatus ir grąžina juos į tėvinę darbo eigą.

## Kodėl toks funkcijų atskyrimas pasiteisina

Neuron leidžia keisti teikėjus atliekant minimalius kodo pakeitimus ir vienoje vietoje apjungia specializuoto agento užklausą, įrankius bei atmintį. Queuety tinka patikimam cikliniam vykdymui, užbaigimo režimams, pakartotiniams bandymams, vykdymo tęsimui ir vykdymo tikrinimo ar žmogaus peržiūros sąsajoms.

## 1 žingsnis: sukurkite agentą Neuron, kurio teikėją galima keisti

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

Naudinga tai, kad darbo eiga vykdymo metu gali pasirinkti teikėją, perduodama `provider` darbo eigos būsenoje.

## 2 žingsnis: paleiskite agentą Neuron Queuety žingsnyje

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

Tai pagrindinis integravimo taškas: Neuron apdoroja LLM iškvietimą, tačiau Queuety ir toliau valdo žingsnio ribas bei išsaugotą darbo eigos būseną.

## 3 žingsnis: leiskite planuokliui paleisti agentus

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

Jei `PlanResearchTasksStep` grąžina:

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

Queuety kiekvienai užduočiai sukurs atskirą aukščiausio lygio darbo eigą, lauks, kol visos bus baigtos, o tada perduos užbaigtų antrinių darbo eigų būsenas po raktu `$state['agent_results']`.

## Kodėl tiesiog nekviesti Neuron cikle?

Taip daryti galima, bet prarastumėte orkestravimo privalumus:

Kiekvieno agento vykdymo nebebūtų galima tikrinti atskirai, dalinė avarija greičiausiai priverstų paleisti visą paketą iš naujo, o vėlesniems etapams neliktų aiškaus užbaigimo momento.

Pagal šį šabloną agento kodas lieka paprastas, o patikimą orkestravimą valdo Queuety.

Jei planuoklis priklauso ilgiau veikiančiai agento sesijai, šį darbo eigos šabloną naudokite vykdymo lygmenyje, o išorinį gyvavimo ciklą patikėkite [būsenų mašinai](https://queuety.inline0.dev/lt/docs/state-machines).

## Susijusi dokumentacija

- [Asinchroniniai perdavimai](https://queuety.inline0.dev/lt/docs/workflows/async-handoffs)
- [Agentų orkestravimas](https://queuety.inline0.dev/lt/docs/workflows/agent-orchestration)
- [Būsenų mašinos](https://queuety.inline0.dev/lt/docs/state-machines)
