Preskoči na vsebino

Neuron Odvisni poteki dela

Ta primer odgovarja na pogosto vprašanje o agentih:

Ali lahko en potek dela določi, da se drugi nadaljuje šele, ko se prvi konča?

Da. Pomembno je, da Queuety to že podpira z wait_for_workflow() in wait_for_workflows().

To pomeni:

  • potek dela X je mogoče zagnati takoj
  • X lahko počaka v waiting_for_workflows
  • X se nadaljuje šele, ko se potek dela Y konča

Primer: najprej raziskava, nato pisanje

Z enim nadrejenim potekom dela pripravite paket gradiva, z drugim pa osnutek končnega besedila.

Potek raziskave

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

Potek pisanja

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

Ko se potek pisanja začne, se takoj ustavi v waiting_for_workflows in počaka, da se potek raziskave uspešno konča.

Korak pisanja 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 na voljo, ker je wait_for_workflow() kopiral dokončano javno stanje iz odvisnega poteka dela v trenutni potek dela pod ključem research.

Kdaj izbrati to možnost namesto enega ogromnega poteka dela

Ločene nadrejene poteke dela izberite, kadar:

  • imajo faze različne lastnike ali operativne življenjske cikle
  • jih želite pregledovati in ponavljati neodvisno
  • želite poznejšo fazo zagnati, še preden se prejšnja konča

En potek dela izberite, kadar:

  • so faze tesno povezane
  • si delijo en življenjski cikel in eno zbirko stanja

Vloga stroja stanj

Če je ta potek pisanja del dolgotrajnejše uredniške seje, naj zunanjemu življenjskemu ciklu upravlja stroj stanj, te poteke dela pa uporabite za omejene faze izvajanja. Tako bodo stanja življenjskega cikla, kot so awaiting_brief, researching, awaiting_review in completed, izrecno določena, trajnost potekov dela pa bo ohranjena znotraj posamezne faze.

Pomembna razlika

Ta vzorec pomeni:

  • X obstaja že zdaj, vendar čaka na Y

To ne pomeni:

  • X se ustvari šele, ko je Y končan

Če želite drugo vedenje, naj nadrejeni potek dela počaka na Y in šele nato pokliče start_workflows() ali start_agents() za X.