Neuron Stavový automat relácie
Tento vzor je užitočný, keď sa vytváraná funkcia správa skôr ako relácia než ako jednorazové spustenie.
Stavové automaty Queuety spravujú životný cyklus relácie, workflowy Queuety vykonávajú úlohy na pozadí, ktorým prospieva opakovanie pokusov, režimy dokončenia pri spracovaní každého prvku a agregácia, a Neuron zabezpečuje samotné volania agenta a konverzačnú pamäť.
Toto rozdelenie sa hodí pre podporných asistentov, interných výskumných asistentov, redakčných agentov, ktorí sa môžu pozastaviť kvôli ľudskej kontrole, aj četové vlákna prechádzajúce fázami plánovania, čakania a odpovede.
Priebeh životného cyklu
V tomto príklade jedna relácia podpory prechádza stavmi awaiting_user, planning, waiting_on_research a responding. Automat zachováva explicitný životný cyklus, zatiaľ čo workflow na pozadí zhromažďuje podklady a po dokončení vyšle relácii signál.
Stavový automat
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',
] );
Keď používateľ odošle správu:
Queuety::machine_event(
$session_id,
'user_message',
[
'session_machine_id' => $session_id,
'message' => 'Can you compare our pricing to the main competitors?',
]
);
Automat prejde do stavu planning, zaradí svoju akciu a spustí výskumný workflow.
Plánovacia akcia: odoslanie workflowu na vykonanie
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',
];
}
}
Táto akcia stavu sa nepokúša vykonať samotný výskum. Spustí workflow a zaznamená jeho ID do stavu automatu.
Krok workflowu: odoslanie signálu automatu po dokončení výskumu
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 [];
}
}
Po dokončení workflow odošle research_completed späť do automatu a priloží zostavené podklady ako obsah udalosti.
Akcia odpovede: zavolanie Neuron s pamäťou relácie
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',
];
}
}
Po vytvorení odpovede automat prejde späť do stavu awaiting_user s aktualizovanou odpoveďou vo verejnom stave. Tá istá relácia potom môže prijať ďalšiu udalosť user_message a pokračovať.
Prečo je to prehľadnejšie než jeden veľký workflow
Náročná práca sa stále vykonáva vo workflowe, pretože výskumná časť potrebuje plánovanie, špecializované behy, agregáciu a syntézu. Dlhšie trvajúca podporná konverzácia sa riadi stavovým automatom, pretože relácia musí sledovať, či čaká na ťah používateľa, na výsledky výskumu alebo môže odoslať odpoveď.
Toto rozdelenie udržiava behový kód prehľadný a model relácie explicitný.