Neuron Plānotājs / izpildītājs
Šajā piemērā Queuety tiek izmantots orķestrēšanai, bet Neuron — faktiskai aģenta izpildei.
Šī pieeja ir vienkārša. Queuety plānotāja darbība nosaka, kādi uzdevumi jāveic, start_agents() pārvērš tos atsevišķās augstākā līmeņa darbplūsmās, katrā pakārtotajā darbplūsmā darbojas Neuron aģents, un wait_for_agents() apkopo rezultātus vecākdarbplūsmā.
Kāpēc šāds sadalījums darbojas labi
Neuron ļauj mainīt pakalpojumu sniedzējus, veicot minimālas izmaiņas kodā, un ietver specializēta aģenta uzvedni, rīkus un atmiņu. Queuety nodrošina noturīgus režīmus “katram elementam” un pabeigšanai, atkārtotus mēģinājumus, atsākšanu, kā arī izpildes pārbaudi vai cilvēka pārskatīšanu.
1. darbība: izveidojiet aģentu Neuron, kam var mainīt pakalpojumu sniedzēju
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.',
],
);
}
}
Šeit noder tas, ka darbplūsma izpildes laikā var izvēlēties pakalpojumu sniedzēju, nododot provider darbplūsmas stāvoklī.
2. darbība: palaidiet aģentu Neuron darbībā 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 [];
}
}
Šis ir galvenais integrācijas punkts: Neuron apstrādā LLM izsaukumu, bet Queuety joprojām pārvalda darbības robežu un saglabāto darbplūsmas stāvokli.
3. darbība: ļaujiet plānotājam sākt aģentu izpildi
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',
]);
Ja PlanResearchTasksStep atgriež:
[
'agent_tasks' => [
['topic' => 'pricing'],
['topic' => 'customer reviews'],
['topic' => 'recent launches'],
],
]
Queuety izveidos augstākā līmeņa darbplūsmu katram uzdevumam, gaidīs, līdz visas būs pabeigtas, un pēc tam nodos pabeigto pakārtoto darbplūsmu stāvokli laukā $state['agent_results'].
Kāpēc vienkārši neizsaukt Neuron ciklā?
To var darīt, taču tā zaudēsiet orķestrēšanas priekšrocības:
Katras aģenta izpildes gaitu vairs nevarēs pārbaudīt atsevišķi, daļēja avārija, visticamāk, liks restartēt visu uzdevumu kopu, un vēlākajiem posmiem nebūs skaidra pabeigšanas punkta.
Šī pieeja saglabā aģenta kodu vienkāršu, vienlaikus ļaujot Queuety pārvaldīt noturīgu orķestrēšanu.
Ja plānotājs ir daļa no ilgstošas aģenta sesijas, izmantojiet šo darbplūsmas pieeju izpildes slānim un ļaujiet stāvokļu mašīnai pārvaldīt ārējo dzīves ciklu.