Neuron Načrtovalnik / izvajalnik
V tem primeru se Queuety uporablja za orkestracijo, Neuron pa za dejansko izvajanje agenta.
Vzorec je preprost. Korak načrtovanja Queuety določi, katera opravila je treba izvesti, start_agents() ta opravila spremeni v neodvisne nadrejene poteke dela, vsak podrejeni potek dela zažene agenta Neuron, wait_for_agents() pa zbere rezultate in jih vrne v nadrejeni potek dela.
Zakaj ta razdelitev deluje dobro
Neuron omogoča preprosto menjavo ponudnikov z minimalnimi spremembami kode ter združevanje pozivov, orodij in pomnilnika specializiranega agenta. Queuety pa je primeren za trajno izvajanje za vsak element, načine dokončanja, ponovne poskuse, nadaljevanje izvajanja ter pregled ali človeški pregled izvajanja.
1. korak: ustvarite agenta Neuron z zamenljivim ponudnikom
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.',
],
);
}
}
Uporabno je to, da lahko potek dela ponudnika izbere med izvajanjem tako, da v stanje poteka dela posreduje provider.
2. korak: zaženite agenta Neuron znotraj koraka Queuety
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 [];
}
}
To je ključna integracijska točka: Neuron izvede klic LLM, Queuety pa še vedno upravlja mejo koraka in shranjeno stanje poteka dela.
3. korak: omogočite načrtovalniku zagon agentov
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',
]);
Če PlanResearchTasksStep vrne:
[
'agent_tasks' => [
['topic' => 'pricing'],
['topic' => 'customer reviews'],
['topic' => 'recent launches'],
],
]
Queuety bo za vsako opravilo ustvaril en nadrejeni potek dela, počakal, da se vsi končajo, nato pa posredoval dokončano stanje podrejenih potekov dela pod ključem $state['agent_results'].
Zakaj preprosto ne bi poklicali Neuron v zanki?
To bi lahko storili, vendar bi izgubili prednosti orkestracije:
Izvajanja posameznih agentov ne bi bilo več mogoče pregledovati, delna sesutja bi verjetno znova zagnala celoten sklop, poznejše faze pa ne bi imele jasnega trenutka dokončanja.
Ta vzorec ohranja preprosto kodo agenta, Queuety pa upravlja trajno orkestracijo.
Če je načrtovalnik del dolgotrajnejše seje agenta, ta vzorec poteka dela uporabite za plast izvajanja, zunanji življenjski cikel pa prepustite stroju stanj.