Zum Inhalt springen

Neuron-abhängige Workflows

Dieses Beispiel beantwortet eine häufige Frage zur Arbeit mit Agenten:

Kann ein Workflow festlegen, dass ein anderer erst fortfährt, nachdem ein früherer Workflow abgeschlossen ist?

Ja. Wichtig ist, dass Queuety dies bereits mit wait_for_workflow() und wait_for_workflows() unterstützt.

Das bedeutet:

  • X-Workflow kann jetzt gestartet werden
  • X kann in waiting_for_workflows warten
  • X wird erst fortgesetzt, wenn Y-Workflow abgeschlossen ist

Beispiel: zuerst recherchieren, dann schreiben

Verwende einen Workflow auf oberster Ebene, um ein Recherchepaket zu erstellen, und einen zweiten Workflow auf oberster Ebene, um den endgültigen Text zu verfassen.

Recherche-Workflow

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

Schreib-Workflow

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

Wenn der Schreib-Workflow startet, pausiert er sofort in waiting_for_workflows, bis der Recherche-Workflow erfolgreich abgeschlossen ist.

Der Neuron-Schreibschritt

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'] ist verfügbar, weil wait_for_workflow() den abgeschlossenen öffentlichen Zustand aus dem Abhängigkeits-Workflow unter dem Schlüssel research in den aktuellen Workflow kopiert hat.

Wann du das statt eines einzigen großen Workflows verwenden solltest

Bevorzuge separate Workflows auf oberster Ebene, wenn:

  • die Phasen unterschiedliche Verantwortliche oder Betriebszyklen haben
  • du sie unabhängig prüfen und erneut ausführen möchtest
  • eine spätere Phase gestartet werden können soll, bevor die frühere abgeschlossen ist

Bevorzuge einen einzelnen Workflow, wenn:

  • die Phasen eng miteinander verbunden sind
  • sie einen Betriebszyklus und einen gemeinsamen Zustandsdatensatz verwenden

Wo eine Zustandsmaschine passt

Wenn dieser Schreibablauf zu einer länger laufenden Redaktionssitzung gehört, lass eine Zustandsmaschine den äußeren Lebenszyklus steuern und verwende diese Workflows für klar abgegrenzte Ausführungsphasen. So bleiben Lebenszykluszustände wie awaiting_brief, researching, awaiting_review und completed explizit, während die Workflows in jeder Phase zuverlässig weiterlaufen.

Ein wichtiger Unterschied

Dieses Muster bedeutet:

  • X ist bereits vorhanden, wartet aber auf Y

Es bedeutet nicht:

  • X wird erst erstellt, wenn Y abgeschlossen ist

Wenn du das zweite Verhalten möchtest, lass einen übergeordneten Workflow auf Y warten und rufe erst danach start_workflows() oder start_agents() für X auf.