Neuron Planista / wykonawca
Ten przykład wykorzystuje Queuety do orkiestracji, a Neuron do właściwego wykonywania zadań przez agenta.
Ten wzorzec jest prosty. Krok planisty Queuety określa, jakie zadania należy wykonać, start_agents() przekształca je w niezależne przepływy pracy najwyższego poziomu, każdy przepływ potomny uruchamia agenta Neuron, a wait_for_agents() zbiera wyniki i przekazuje je z powrotem do nadrzędnego przepływu pracy.
Dlaczego ten podział się sprawdza
Neuron ułatwia zmianę dostawcy przy minimalnych zmianach w kodzie oraz zamknięcie promptu, narzędzi i pamięci w wyspecjalizowanym agencie. Queuety dobrze obsługuje trwałe tryby for-each i zakończenia, ponowne próby, wznawianie oraz możliwość inspekcji lub weryfikacji przez człowieka w trakcie wykonania.
Krok 1: utwórz agenta Neuron z możliwością zmiany dostawcy
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.',
],
);
}
}
Przydatne jest to, że przepływ pracy może wybrać dostawcę w czasie działania, przekazując provider w stanie przepływu.
Krok 2: uruchom agenta Neuron w kroku 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 kluczowy punkt integracji: Neuron obsługuje wywołanie LLM, ale Queuety nadal zarządza granicą kroku i utrwalonym stanem przepływu pracy.
Krok 3: pozwól planistowi uruchamiać zadania agentów
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',
]);
Jeśli PlanResearchTasksStep zwróci:
[
'agent_tasks' => [
['topic' => 'pricing'],
['topic' => 'customer reviews'],
['topic' => 'recent launches'],
],
]
Queuety utworzy jeden przepływ pracy najwyższego poziomu dla każdego zadania, poczeka na ich ukończenie, a następnie przekaże ukończony stan przepływów potomnych pod kluczem $state['agent_results'].
Dlaczego nie wywołać po prostu Neuron w pętli?
Możesz tak zrobić, ale stracisz zalety orkiestracji:
Nie dałoby się osobno sprawdzać poszczególnych zadań agentów, awaria w trakcie mogłaby spowodować ponowne uruchomienie całej partii, a późniejsze etapy nie miałyby jasno określonego momentu zakończenia.
Ten wzorzec upraszcza kod agenta, a jednocześnie pozwala Queuety zarządzać trwałą orkiestracją.
Jeśli planista należy do dłuższej sesji agenta, użyj tego wzorca przepływu pracy w warstwie wykonania, a zewnętrzny cykl życia powierz maszynie stanów.