Neuron seansi olekumasin
See muster on kasulik, kui loodav lahendus sarnaneb pigem seansi kui ühekordse käivitusega.
Queuety olekumasinad haldavad seansi elutsüklit, Queuety töövood teevad taustatööd, mille puhul on kasulikud korduskatsed, for-each-tsükli lõpetamisrežiimid ja tulemuste koondamine, ning Neuron haldab tegelikke agendikutseid ja vestlusmälu.
See jaotus sobib hästi klienditoe kaasabilistele, ettevõttesisestele uurimisassistentidele, toimetamisagentidele, mis võivad inimese ülevaatuseks peatuda, ning vestluslõimedele, mis liiguvad planeerimise, ootamise ja vastamise etappide vahel.
Elutsükli ülesehitus
Selles näites liigub üks klienditoe seanss läbi olekute awaiting_user, planning, waiting_on_research ja responding. Olekumasin hoiab elutsükli selgesõnalisena, samal ajal kui taustatöövoog kogub uurimismaterjale ja annab seansile töö valmimisest märku.
Olekumasin
use Queuety\Queuety;
$session_id = Queuety::machine( 'support_session' )
->version( 'support-session.v1' )
->state( 'awaiting_user' )
->on( 'user_message', 'planning' )
->state( 'planning' )
->action( DispatchResearchWorkflowAction::class )
->on( 'research_dispatched', 'waiting_on_research' )
->state( 'waiting_on_research' )
->on( 'research_completed', 'responding' )
->state( 'responding' )
->action( RespondWithNeuronAction::class )
->on( 'response_ready', 'awaiting_user' )
->dispatch( [
'thread_id' => 'support:customer-42',
] );
Kui kasutaja saadab sõnumi:
Queuety::machine_event(
$session_id,
'user_message',
[
'session_machine_id' => $session_id,
'message' => 'Can you compare our pricing to the main competitors?',
]
);
Masin liigub olekusse planning, lisab oma toimingu järjekorda ja käivitab uurimistöövoo.
Planeerimistoiming: käivitage töövoog
namespace App\StateMachines\Actions;
use Queuety\Contracts\StateAction;
use Queuety\Enums\WaitMode;
use Queuety\Queuety;
final class DispatchResearchWorkflowAction implements StateAction
{
public function handle( array $state, ?string $event = null, array $event_payload = [], array $payload = [] ): array|string
{
$message = trim( (string) ( $event_payload['message'] ?? '' ) );
$agent_workflow = Queuety::workflow( 'support_research_agent' )
->then( ResearchTopicStep::class );
$research_workflow = Queuety::workflow( 'support_research_packet' )
->then( PlanResearchTasksStep::class )
->start_agents( 'agent_tasks', $agent_workflow )
->wait_for_agents( mode: WaitMode::All, result_key: 'agent_results' )
->then( SynthesizeResearchPacketStep::class )
->then( NotifySessionResearchReadyStep::class );
$workflow_id = $research_workflow->dispatch( [
'machine_id' => $state['session_machine_id'],
'thread_id' => $state['thread_id'],
'customer_prompt' => $message,
] );
return [
'latest_user_message' => $message,
'research_workflow_id' => $workflow_id,
'_event' => 'research_dispatched',
];
}
}
See olekutoiming ei tee ise uurimistööd. See käivitab töövoo ja salvestab töövoo ID masina olekusse.
Töövoo etapp: andke masinale märku, kui uurimistöö on valmis
namespace App\Workflow\Steps;
use Queuety\Queuety;
use Queuety\Step;
final class NotifySessionResearchReadyStep implements Step
{
public function handle( array $state ): array
{
Queuety::machine_event(
$state['machine_id'],
'research_completed',
[
'research_packet' => $state['research_packet'],
]
);
return [];
}
public function config(): array
{
return [];
}
}
Töövoo lõppedes saadab see masinasse tagasi research_completed ja lisab sündmuse andmetesse sünteesitud materjalikogumi.
Vastamistoiming: kutsuge Neuron välja seansi mäluga
namespace App\StateMachines\Actions;
use App\Neuron\SupportAgent;
use NeuronAI\Chat\Messages\UserMessage;
use Queuety\Contracts\StateAction;
final class RespondWithNeuronAction implements StateAction
{
public function handle( array $state, ?string $event = null, array $event_payload = [], array $payload = [] ): array|string
{
// Queuety creates actions with `new RespondWithNeuronAction()`, so build dependencies here.
$pdo = new \PDO( $_ENV['NEURON_DB_DSN'], $_ENV['NEURON_DB_USER'], $_ENV['NEURON_DB_PASSWORD'] );
$agent = new SupportAgent(
threadId: $state['thread_id'],
pdo: $pdo,
);
$message = $agent->chat(
new UserMessage(
sprintf(
"Answer the user message '%s' using this research packet:\n\n%s",
$state['latest_user_message'],
json_encode( $state['research_packet'] ?? [], JSON_PRETTY_PRINT )
)
)
)->getMessage();
return [
'assistant_reply' => $message->getContent(),
'_event' => 'response_ready',
];
}
}
Pärast vastuse loomist liigub masin tagasi olekusse awaiting_user, lisades uuendatud vastuse avalikku olekusse. Seejärel saab sama seanss vastu võtta veel ühe user_message sündmuse ja jätkata.
Miks see on selgem lahendus kui üks suur töövoog
Põhitöö on endiselt töövoo kujul, sest uurimisosa vajab planeerimist, spetsialistide käitusi, tulemuste koondamist ja sünteesi. Pikaajaline klienditoe vestlus sobib olekumasina kujule, sest seanss peab jälgima, kas ootab kasutaja järgmist sõnumit, uurimistöö valmimist või vastuse saatmise luba.
See jaotus hoiab käitusaegse loogika arusaadavana ja seansimudeli selgesõnalisena.