Siirry sisältöön

Neuron Riippuvaiset työnkulut

Tässä esimerkissä käsitellään yleistä agenttijärjestelmiin liittyvää kysymystä:

Voiko yksi työnkulku päättää, että toinen saa jatkaa vasta aiemman työnkulun valmistuttua?

Kyllä. Keskeinen huomio on, että Queuety tukee tätä jo valmiiksi wait_for_workflow()- ja wait_for_workflows()-toiminnoilla.

Tämä tarkoittaa, että:

  • työnkulku X voidaan käynnistää nyt
  • X voi jäädä odottamaan tilaan waiting_for_workflows
  • X jatkuu vasta, kun työnkulku Y on valmis

Esimerkki: ensin tutkimus, sitten kirjoittaminen

Käytä yhtä ylimmän tason työnkulkua tutkimuspaketin kokoamiseen ja toista lopullisen tekstin luonnosteluun.

Tutkimuksen työnkulku

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

Kirjoittamisen työnkulku

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

Kun kirjoittamisen työnkulku käynnistyy, se keskeytyy heti tilaan waiting_for_workflows, kunnes tutkimuksen työnkulku on suoritettu onnistuneesti.

Neuron kirjoitusvaihe

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'] on käytettävissä, koska wait_for_workflow() kopioi riippuvuustyönkulun valmiin julkisen tilan nykyiseen työnkulkuun avaimella research.

Milloin tämä kannattaa valita yhden suuren työnkulun sijaan

Suosi erillisiä ylimmän tason työnkulkuja, kun:

  • vaiheilla on eri omistajat tai operatiiviset elinkaaret
  • haluat tarkastella ja yrittää niitä uudelleen itsenäisesti
  • myöhempi vaihe voidaan käynnistää jo ennen aiemman valmistumista

Suosi yhtä työnkulkua, kun:

  • vaiheet liittyvät tiiviisti toisiinsa
  • niillä on yhteinen elinkaari ja tilakokonaisuus

Tilakoneen rooli

Jos tämä kirjoitusprosessi kuuluu pitkäikäisempään toimitukselliseen istuntoon, anna tilakoneen hallita ulompaa elinkaarta ja käytä näitä työnkulkuja rajattuihin suoritusvaiheisiin. Näin elinkaaren tilat, kuten awaiting_brief, researching, awaiting_review ja completed, pysyvät selkeinä ja työnkulun kestävyys säilyy kussakin vaiheessa.

Yksi tärkeä ero

Tämä toimintamalli tarkoittaa, että:

  • X on jo olemassa, mutta odottaa kohdetta Y

Se ei tarkoita, että:

  • X luodaan vasta, kun Y on valmis

Jos haluat jälkimmäisen toimintatavan, määritä ylätyönkulku odottamaan kohdetta Y ja kutsumaan vasta sen jälkeen kohdetta start_workflows() tai start_agents() kohteelle X.