
# Neuron Bellek + İnceleme Durum Makinesi

Bu kalıp, bir aracının tekrarlanan insan inceleme turları boyunca konuşma bağlamını koruması gerektiğinde kullanışlıdır; ancak genel yaşam döngüsü yine de Queuety tarafından yönetilmelidir.

İnceleme durum makinesini Queuety, taslak oluşturma dizisindeki aracı belleğini ise Neuron yönetir.

## Neuron belleği burada neden yararlı

Bir incelemeci taslağı reddedip değişiklik istediğinde, aracının bir sonraki çağrısında tüm bağlamı baştan oluşturması gerekmez.

Neuron'nin `SQLChatHistory` özelliği buna çok uygundur; çünkü aracı aynı konuşma dizisi içinde çalışmaya devam ederken Queuety incelemeci kararlarını ve düzenleme turlarını yönlendirir.

## Neuron aracısı ve SQL destekli geçmiş

```php
namespace App\Neuron;

use NeuronAI\Agent\Agent;
use NeuronAI\Chat\History\ChatHistoryInterface;
use NeuronAI\Chat\History\SQLChatHistory;
use NeuronAI\Providers\AIProviderInterface;
use NeuronAI\Providers\Anthropic\Anthropic;
use NeuronAI\SystemPrompt;

final class EditorAgent extends Agent
{
    public function __construct(
        private readonly string $threadId,
        private readonly \PDO $pdo,
    ) {}

    protected function provider(): AIProviderInterface
    {
        return new Anthropic(
            key: $_ENV['ANTHROPIC_API_KEY'],
            model: $_ENV['ANTHROPIC_MODEL'],
        );
    }

    protected function chatHistory(): ChatHistoryInterface
    {
        return new SQLChatHistory(
            thread_id: $this->threadId,
            pdo: $this->pdo,
            table: 'neuron_chat_history',
            contextWindow: 50000,
        );
    }

    public function instructions(): string
    {
        return (string) new SystemPrompt(
            background: [
                'You are an editorial agent for long-form product briefs.',
                'Apply reviewer notes without losing the original intent.',
            ],
        );
    }
}
```

## Bir kez taslak hazırlayın, aynı bellek dizisiyle gözden geçirin

```php
namespace App\StateMachines\Actions;

use App\Neuron\EditorAgent;
use NeuronAI\Chat\Messages\UserMessage;
use Queuety\Contracts\StateAction;

final class DraftBriefAction implements StateAction
{
    public function handle(array $state, ?string $event = null, array $event_payload = [], array $payload = []): array|string
    {
        // Queuety creates actions with `new DraftBriefAction()`, so build dependencies here.
        $pdo = new \PDO($_ENV['NEURON_DB_DSN'], $_ENV['NEURON_DB_USER'], $_ENV['NEURON_DB_PASSWORD']);

        $threadId = $state['neuron_thread_id'] ?? sprintf(
            'brief:%d:editor',
            $state['brief_id'],
        );

        $prompt = "Write the first draft for brief {$state['brief_id']}.";

        if ('reject' === $event) {
            $prompt = sprintf(
                'Revise the draft using these review notes: %s',
                $event_payload['reason'] ?? 'Tighten the draft and address reviewer concerns.',
            );
        }

        $agent = new EditorAgent($threadId, $pdo);
        $message = $agent->chat(
            new UserMessage($prompt)
        )->getMessage();

        return [
            'neuron_thread_id' => $threadId,
            'draft_markdown' => $message->getContent(),
            'review_round' => (int) ($state['review_round'] ?? 0) + 1,
            '_event' => 'draft_ready',
        ];
    }
}
```

## Queuety durum makinesi

```php
use Queuety\Enums\StateMachineStatus;
use Queuety\Queuety;

$machine_id = Queuety::machine('brief_review_session')
    ->version('brief-review-session.v1')
    ->state('drafting')
    ->action(DraftBriefAction::class)
    ->on('draft_ready', 'awaiting_review')
    ->state('awaiting_review')
    ->on('approve', 'completed')
    ->on('reject', 'drafting')
    ->state('completed', StateMachineStatus::Completed)
    ->dispatch([
        'brief_id' => 42,
    ]);

// Later, once the draft action has finished and the machine waits in `awaiting_review`:
Queuety::machine_event(
    $machine_id,
    'reject',
    [ 'reason' => 'Tighten the introduction and add pricing context.' ]
);

Queuety::machine_event(
    $machine_id,
    'approve',
    [ 'reviewer' => 'editor@example.com' ]
);
```

İlk geçiş `drafting` durumuna girer, kuyruğa alınan işlemi yürütür ve `awaiting_review` durumuna geçer.

İncelemeci taslağı reddederse makine yeniden `drafting` durumuna geçer. `reject` olay yükü `DraftBriefAction` içine aktarıldığından, sonraki taslak incelemecinin notlarını kullanabilir ve özgün Neuron dizi geçmişini kaybetmez.

## Bu neden iş akışını yinelemekten daha temiz

Bu sorun yaşam döngüsüyle ilgilidir. Taslak insan incelemesini bekler, incelemeci taslağı onaylayabilir veya reddedebilir, ret oturumu yeniden taslak hazırlama aşamasına döndürür ve onay oturumu tamamlar. Bu yapı, geriye dönen bağlantısı olan doğrusal bir iş akışından çok bir durum makinesine doğrudan karşılık gelir.

İş akışı durumu; inceleme turu sayısı, yapı kimlikleri, iş akışı kimlikleri ve yönlendirme kararları gibi orkestrasyon bilgileri için hâlâ çok uygundur. Neuron belleği ise önceki istemler, yinelemeli düzenlemeler ve taslak dizisinin parçası olarak kalması gereken model yanıtları gibi konuşma bağlamı için daha uygundur.

Her iki sistemi kullanmak, her birine en iyi yaptığı işi verir.

## Bunun yerine iş akışı olarak ne zaman tutmalı

İnceleme yolu sınırlı ve yürütme odaklıysa, örneğin şu durumlarda iş akışını tercih edin:

Bir taslak oluşturun, tek bir onay bekleyin ve yayımlayın.

Oturum aynı durumlara birkaç kez dönebilir ve yaşam döngüsünü dış olaylar yönlendiriyorsa durum makinesini tercih edin.

## İlgili belgeler

- [Durum Makineleri](https://queuety.inline0.dev/tr/docs/state-machines)
- [İş Akışı Sinyalleri](https://queuety.inline0.dev/tr/docs/workflows/signals)
- [Aracı Orkestrasyonu](https://queuety.inline0.dev/tr/docs/workflows/agent-orchestration)
