Neuron Σχεδιαστής / Εκτελεστής
Αυτό το παράδειγμα χρησιμοποιεί το Queuety για τον συντονισμό και το Neuron για την ίδια την εκτέλεση του agent.
Το μοτίβο είναι απλό. Ένα βήμα σχεδιασμού του Queuety αποφασίζει ποιες εργασίες υπάρχουν, το start_agents() τις μετατρέπει σε ανεξάρτητες ροές εργασιών ανώτατου επιπέδου, κάθε θυγατρική ροή εργασιών εκτελεί έναν agent Neuron και το wait_for_agents() συγκεντρώνει τα αποτελέσματα πίσω στη γονική ροή εργασιών.
Γιατί λειτουργεί καλά αυτός ο διαχωρισμός
Το Neuron διευκολύνει την αλλαγή παρόχων με ελάχιστες αλλαγές κώδικα και την ενσωμάτωση της προτροπής, των εργαλείων και της μνήμης ενός εξειδικευμένου agent. Το Queuety διευκολύνει τις ανθεκτικές λειτουργίες εκτέλεσης για κάθε στοιχείο και ολοκλήρωσης, τις επαναλήψεις, τη συνέχιση και τις δυνατότητες επιθεώρησης ή ανθρώπινου ελέγχου γύρω από την εκτέλεση.
Βήμα 1: δημιουργία agent Neuron με δυνατότητα αλλαγής παρόχου
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.',
],
);
}
}
Το χρήσιμο εδώ είναι ότι η ροή εργασιών μπορεί να επιλέξει πάροχο κατά την εκτέλεση, περνώντας το provider στην κατάσταση της ροής εργασιών.
Βήμα 2: εκτέλεση του agent Neuron σε ένα βήμα του 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 [];
}
}
Αυτό είναι το βασικό σημείο ενσωμάτωσης: το Neuron διαχειρίζεται την κλήση LLM, αλλά το Queuety εξακολουθεί να διαχειρίζεται τα όρια του βήματος και την αποθηκευμένη κατάσταση της ροής εργασιών.
Βήμα 3: αφήστε τον σχεδιαστή να ξεκινήσει εκτελέσεις agent
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',
]);
Αν το PlanResearchTasksStep επιστρέψει:
[
'agent_tasks' => [
['topic' => 'pricing'],
['topic' => 'customer reviews'],
['topic' => 'recent launches'],
],
]
Το Queuety δημιουργεί μία ροή εργασιών ανώτατου επιπέδου για κάθε εργασία, περιμένει να ολοκληρωθούν όλες και, στη συνέχεια, μεταβιβάζει την κατάσταση των ολοκληρωμένων θυγατρικών ροών εργασιών με το κλειδί $state['agent_results'].
Γιατί να μην καλέσετε απλώς το Neuron σε έναν βρόχο;
Μπορείτε να το κάνετε, αλλά θα χάσετε τα πλεονεκτήματα του συντονισμού:
Κάθε εκτέλεση agent δεν θα μπορεί πλέον να επιθεωρηθεί ξεχωριστά, μια μερική κατάρρευση πιθανότατα θα επανεκκινούσε ολόκληρη τη δέσμη και δεν θα υπήρχε σαφές σημείο ολοκλήρωσης για τα επόμενα στάδια.
Αυτό το μοτίβο διατηρεί απλό τον κώδικα του agent, αφήνοντας παράλληλα το Queuety να διαχειρίζεται τον ανθεκτικό συντονισμό.
Αν ο σχεδιαστής ανήκει σε μια συνεδρία agent μεγάλης διάρκειας, διατηρήστε αυτό το μοτίβο ροής εργασιών για το επίπεδο εκτέλεσης και αφήστε μια μηχανή καταστάσεων να διαχειρίζεται τον εξωτερικό κύκλο ζωής.