İçeriğe geç

Neuron Bağımlı İş Akışları

Bu örnek, aracılarla ilgili sık sorulan bir soruyu yanıtlar:

Bir iş akışı, önceki bir iş akışı tamamlanana kadar başka bir iş akışının devam etmemesine karar verebilir mi?

Evet. Önemli bir ayrıntı şu: Queuety bunu zaten wait_for_workflow() ve wait_for_workflows() ile destekliyor.

Bunun anlamı:

  • X iş akışı hemen gönderilebilir
  • X, waiting_for_workflows içinde bekleyebilir
  • X yalnızca Y iş akışı tamamlandığında devam eder

Örnek: önce araştırma, sonra yazım

Bir üst düzey iş akışını araştırma dosyası oluşturmak, ikinci bir üst düzey iş akışını da son metni taslak hâline getirmek için kullanın.

Araştırma iş akışı

PHP
use Queuety\Enums\WaitMode;
use Queuety\Queuety;

$research_agent = Queuety::workflow('research_agent')
    ->then(ResearchTopicStep::class);

$research_id = Queuety::workflow('research_packet')
    ->then(PlanResearchTasksStep::class)
    ->start_agents('agent_tasks', $research_agent)
    ->wait_for_agents(mode: WaitMode::All, result_key: 'agent_results')
    ->then(SynthesizeResearchPacketStep::class)
    ->dispatch([
        'brief_id' => 42,
        'provider' => 'anthropic',
    ]);

Yazım iş akışı

PHP
Queuety::workflow('write_brief')
    ->wait_for_workflow('research_workflow_id', 'research')
    ->then(WriteBriefWithNeuronStep::class)
    ->wait_for_decision(result_key: 'editor_review')
    ->then(PublishBriefStep::class)
    ->dispatch([
        'brief_id' => 42,
        'research_workflow_id' => $research_id,
        'provider' => 'openai',
    ]);

Yazım iş akışı başladığında, araştırma iş akışı başarıyla tamamlanana kadar hemen waiting_for_workflows içinde duraklar.

Neuron yazım adımı

PHP
namespace App\Workflow\Steps;

use App\Neuron\WriterAgent;
use NeuronAI\Chat\Messages\UserMessage;
use Queuety\Step;

final class WriteBriefWithNeuronStep implements Step
{
    public function handle(array $state): array
    {
        $agent = new WriterAgent(
            providerName: $state['provider'] ?? 'openai',
        );

        $message = $agent->chat(
            new UserMessage(sprintf(
                "Write the final brief for brief %d using this research packet:\n\n%s",
                $state['brief_id'],
                json_encode($state['research'], JSON_PRETTY_PRINT),
            ))
        )->getMessage();

        return [
            'draft_markdown' => $message->getContent(),
        ];
    }

    public function config(): array
    {
        return [];
    }
}

$state['research'] kullanılabilir; çünkü wait_for_workflow(), bağımlı iş akışından tamamlanmış genel durumu research anahtarı altında mevcut iş akışına kopyalamıştır.

Tek ve dev bir iş akışı yerine bunu ne zaman kullanmalı

Şu durumlarda ayrı üst düzey iş akışlarını tercih edin:

  • Aşamaların farklı sahipleri veya operasyonel yaşam döngüleri varsa
  • Bunları birbirinden bağımsız incelemek ve yeniden denemek istiyorsanız
  • Önceki aşama tamamlanmadan sonraki aşamanın gönderilebilmesi gerekiyorsa

Şu durumlarda tek bir iş akışını tercih edin:

  • Aşamalar sıkı biçimde birbirine bağlıysa
  • Tek bir yaşam döngüsünü ve tek bir durum kümesini paylaşıyorlarsa

Durum makinesi nerede devreye girer

Bu yazım akışı daha uzun ömürlü bir editoryal oturumun parçasıysa, dış yaşam döngüsünü durum makinesi yönetsin ve bu iş akışları sınırlı yürütme aşamalarını üstlensin. Böylece awaiting_brief, researching, awaiting_review ve completed gibi yaşam döngüsü durumları açıkça tanımlanırken her aşamadaki iş akışı kalıcılığı korunur.

Önemli bir ayrım

Bu kalıp şu anlama gelir:

  • X şimdi oluşturulur, ancak Y öğesini bekler

Şu anlama gelmez:

  • X, Y tamamlanana kadar oluşturulmaz

İkinci davranışı istiyorsanız, bir üst iş akışının Y öğesini beklemesini sağlayın ve ancak bundan sonra X için start_workflows() veya start_agents() çağrısını yapın.