
# Neuron Μηχανή καταστάσεων συνεδρίας

Αυτό το μοτίβο είναι χρήσιμο όταν αυτό που δημιουργείτε συμπεριφέρεται περισσότερο σαν συνεδρία παρά σαν μεμονωμένη εκτέλεση.

Οι μηχανές καταστάσεων Queuety διαχειρίζονται τον κύκλο ζωής της συνεδρίας, οι ροές εργασιών Queuety αναλαμβάνουν την εργασία στο παρασκήνιο που ωφελείται από επαναλήψεις, λειτουργίες ολοκλήρωσης για κάθε στοιχείο και συγκέντρωση αποτελεσμάτων, ενώ το Neuron διαχειρίζεται τις ίδιες τις κλήσεις agent και τη μνήμη συνομιλίας.

Αυτός ο διαχωρισμός ταιριάζει σε copilots υποστήριξης, εσωτερικούς βοηθούς έρευνας, agents σύνταξης που ενδέχεται να περιμένουν ανθρώπινο έλεγχο και νήματα συνομιλίας που εναλλάσσονται μεταξύ των φάσεων σχεδιασμού, αναμονής και απόκρισης.

## Μορφή κύκλου ζωής

Σε αυτό το παράδειγμα, μία συνεδρία υποστήριξης περνά από τις καταστάσεις `awaiting_user`, `planning`, `waiting_on_research` και `responding`. Η μηχανή διατηρεί σαφή αυτόν τον κύκλο ζωής, ενώ μια ροή εργασιών στο παρασκήνιο συγκεντρώνει την έρευνα και ειδοποιεί τη συνεδρία όταν ολοκληρωθεί.

## Η μηχανή καταστάσεων

```php
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',
    ] );
```

Όταν ένας χρήστης στέλνει ένα μήνυμα:

```php
Queuety::machine_event(
    $session_id,
    'user_message',
    [
        'session_machine_id' => $session_id,
        'message' => 'Can you compare our pricing to the main competitors?',
    ]
);
```

Η μηχανή μεταβαίνει στο `planning`, θέτει σε ουρά την ενέργειά της και ξεκινά τη ροή εργασιών έρευνας.

## Ενέργεια σχεδιασμού: αποστολή της ροής εργασιών

```php
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',
        ];
    }
}
```

Αυτή η ενέργεια κατάστασης δεν επιχειρεί να κάνει την έρευνα η ίδια. Αποστέλλει μια ροή εργασιών και καταγράφει το αναγνωριστικό της στην κατάσταση της μηχανής.

## Βήμα ροής εργασιών: ειδοποίηση της μηχανής όταν είναι έτοιμη η έρευνα

```php
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 [];
    }
}
```

Όταν ολοκληρωθεί η ροή εργασιών, στέλνει το `research_completed` πίσω στη μηχανή και περιλαμβάνει το συνοπτικό πακέτο ως ωφέλιμο φορτίο συμβάντος.

## Ενέργεια απόκρισης: κλήση του Neuron με τη μνήμη της συνεδρίας

```php
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',
        ];
    }
}
```

Μόλις δημιουργηθεί η απάντηση, η μηχανή επιστρέφει στο `awaiting_user` με την ενημερωμένη απάντηση στη δημόσια κατάσταση. Η ίδια συνεδρία μπορεί τότε να δεχτεί άλλο ένα συμβάν `user_message` και να συνεχίσει.

## Γιατί αυτό είναι πιο καθαρό από μία μεγάλη ροή εργασιών

Η απαιτητική εργασία εξακολουθεί να έχει μορφή ροής εργασιών, επειδή το σκέλος της έρευνας χρειάζεται σχεδιασμό, εξειδικευμένες εκτελέσεις, συγκέντρωση αποτελεσμάτων και σύνθεση. Η συνομιλία υποστήριξης μεγάλης διάρκειας έχει μορφή μηχανής καταστάσεων, επειδή η συνεδρία πρέπει να παρακολουθεί αν περιμένει σειρά από τον χρήστη, αν περιμένει την έρευνα ή αν μπορεί να δώσει απάντηση.

Αυτός ο διαχωρισμός διατηρεί ευανάγνωστο τον κώδικα εκτέλεσης και σαφές το μοντέλο συνεδρίας.

## Σχετική τεκμηρίωση

- [Μηχανές καταστάσεων](https://queuety.inline0.dev/el/docs/state-machines)
- [Συντονισμός agent](https://queuety.inline0.dev/el/docs/workflows/agent-orchestration)
- [Ασύγχρονες μεταβιβάσεις](https://queuety.inline0.dev/el/docs/workflows/async-handoffs)
- [Εξαρτήσεις ροών εργασιών](https://queuety.inline0.dev/el/docs/workflows/dependencies)
