Přejít k obsahu

Neuron Závislé pracovní postupy

Tento příklad odpovídá na častou otázku týkající se agentů:

Může jeden pracovní postup rozhodnout, že jiný bude pokračovat až po dokončení předchozího?

Ano. Důležité je, že Queuety tuto možnost již nabízí pomocí wait_for_workflow() a wait_for_workflows().

To znamená:

  • pracovní postup X lze spustit hned
  • X může čekat ve stavu waiting_for_workflows
  • X pokračuje až po dokončení pracovního postupu Y

Příklad: nejprve výzkum, potom psaní

Pomocí jednoho pracovního postupu nejvyšší úrovně vytvořte podklady z výzkumu a druhým napište finální text.

Výzkumný pracovní postup

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

Pracovní postup pro psaní

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

Po spuštění pracovní postup pro psaní ihned přejde do stavu waiting_for_workflows a čeká, dokud výzkumný pracovní postup úspěšně neskončí.

Krok psaní Neuron

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'] je k dispozici, protože wait_for_workflow() zkopíroval dokončený veřejný stav z pracovního postupu závislosti do aktuálního pracovního postupu pod klíčem research.

Kdy použít toto řešení místo jednoho velkého pracovního postupu

Samostatné pracovní postupy nejvyšší úrovně jsou vhodnější, když:

  • jednotlivé fáze mají různé vlastníky nebo provozní životní cykly
  • chcete je kontrolovat a opakovat nezávisle
  • pozdější fázi má být možné spustit ještě před dokončením předchozí

Jeden pracovní postup je vhodnější, když:

  • jsou jednotlivé fáze úzce provázané
  • sdílejí jeden životní cyklus a jednu sadu stavových dat

Kde se uplatní stavový automat

Pokud tento proces psaní patří k déle trvající redakční relaci, svěřte vnější životní cyklus stavovému automatu a pro jednotlivé fáze s omezeným rozsahem použijte tyto pracovní postupy. Stavy životního cyklu, například awaiting_brief, researching, awaiting_review a completed, tak zůstanou explicitní a každá fáze si zachová trvalost pracovního postupu.

Důležitý rozdíl

Tento vzor znamená:

  • X existuje už nyní, ale čeká na Y

Neznamená to, že:

  • X vznikne až po dokončení Y

Chcete-li dosáhnout druhého chování, nechte nadřazený pracovní postup čekat na Y a teprve potom zavolat start_workflows() nebo start_agents() pro X.