Pereiti prie turinio

Nuoseklios grandinės

Dažniausias darbo eigos šablonas – tiesinė žingsnių grandinė. Kiekvienas žingsnis vykdomas užbaigus ankstesnį, o sukaupta būsena perduodama toliau.

Metodas ->then()

Naudokite ->then(), kad į darbo eigą įtrauktumėte nuoseklius žingsnius:

PHP
use Queuety\Queuety;

Queuety::workflow( 'onboarding' )
    ->then( CreateAccountHandler::class )
    ->then( SendWelcomeEmailHandler::class )
    ->then( NotifyAdminHandler::class )
    ->dispatch( [ 'email' => 'user@example.com' ] );

Žingsniai vykdomi tokia tvarka, kokia buvo pridėti. Darbo eiga tęsiama tik sėkmingai užbaigus dabartinį žingsnį.

Step sąsaja

Darbo eigos žingsnių apdorojimo programos įgyvendina sąsają Queuety\Step:

PHP
use Queuety\Step;

class CreateAccountHandler implements Step {
    public function handle( array $state ): array {
        $user_id = wp_create_user( $state['email'], wp_generate_password() );
        return [ 'user_id' => $user_id ];
    }

    public function config(): array {
        return [
            'max_attempts' => 3,
        ];
    }
}

Pagrindiniai skirtumai nuo sąsajos Handler:

Handler (užduotys) Step (darbo eigos)
Metodo signatūra handle(array $payload): void handle(array $state): array
Įvestis Užduoties duomenų apkrova Sukaupta darbo eigos būsena
Išvestis Nieko (void) Duomenys, sujungiami su būsena

Būsenos srautas

Kiekvienas žingsnis gauna visą sukauptą būseną ir grąžina naujų rakto ir reikšmės porų masyvą. Grąžinti duomenys sujungiami su būsena ir perduodami tolesniems žingsniams:

PHP
class FetchUserHandler implements Step {
    public function handle( array $state ): array {
        // $state contains: ['user_id' => 42]
        $user = get_user_by( 'ID', $state['user_id'] );
        return [ 'user_name' => $user->display_name, 'user_email' => $user->user_email ];
    }

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

class GenerateReportHandler implements Step {
    public function handle( array $state ): array {
        // $state contains: ['user_id' => 42, 'user_name' => 'Alice', 'user_email' => 'alice@example.com']
        $report = build_report( $state['user_name'] );
        return [ 'report_url' => $report->url ];
    }

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

Žingsnio konfigūracija

Metodas config() palaiko šiuos raktus:

Raktas Tipas Numatytoji reikšmė Aprašymas
max_attempts int 3 Didžiausias šio žingsnio pakartotinių bandymų skaičius
backoff string exponential Pakartotinių bandymų laukimo strategija

LLM konvejerio pavyzdys

Dažnas naudojimo atvejis – LLM API iškvietimų grandinė su duomenų apdorojimu:

PHP
use Queuety\Step;

class BuildPromptHandler implements Step {
    public function handle( array $state ): array {
        $user = get_user_by( 'ID', $state['user_id'] );
        $posts = get_posts( [ 'author' => $user->ID, 'numberposts' => 10 ] );
        $context = implode( "\n", array_map( fn( $p ) => $p->post_content, $posts ) );

        return [
            'prompt' => "Summarize this author's recent work:\n\n{$context}",
        ];
    }

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

class CallOpenAIHandler implements Step {
    public function handle( array $state ): array {
        $response = wp_remote_post( 'https://api.openai.com/v1/chat/completions', [
            'timeout' => 120,
            'headers' => [
                'Authorization' => 'Bearer ' . OPENAI_API_KEY,
                'Content-Type'  => 'application/json',
            ],
            'body' => json_encode( [
                'model'    => 'gpt-4',
                'messages' => [ [ 'role' => 'user', 'content' => $state['prompt'] ] ],
            ] ),
        ] );

        $body = json_decode( wp_remote_retrieve_body( $response ), true );
        return [ 'summary' => $body['choices'][0]['message']['content'] ];
    }

    public function config(): array {
        return [ 'max_attempts' => 5 ];
    }
}

class SaveSummaryHandler implements Step {
    public function handle( array $state ): array {
        $post_id = wp_insert_post( [
            'post_title'   => "Summary for user #{$state['user_id']}",
            'post_content' => $state['summary'],
            'post_status'  => 'publish',
        ] );
        return [ 'summary_post_id' => $post_id ];
    }

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

Paleiskite konvejerį:

PHP
Queuety::workflow( 'summarize_author' )
    ->then( BuildPromptHandler::class )
    ->then( CallOpenAIHandler::class )
    ->then( SaveSummaryHandler::class )
    ->on_queue( 'llm' )
    ->max_attempts( 5 )
    ->dispatch( [ 'user_id' => 42 ] );

Jei OpenAI iškvietimas baigiasi laukimo laiko limitu, darbuotojas pakartoja tik tą žingsnį. 0 žingsnyje parengtas raginimas jau saugiai išsaugotas darbo eigos būsenoje.