
# Darbo eigos šakojimas

Queuety gali išskaidyti vykdomą darbo eigą į visiškai nepriklausomą kopiją. Išskaidyta darbo eiga pradedama nuo to paties žingsnio ir su ta pačia būsena kaip pradinė, tačiau nuo tada abi darbo eigos vykdomos nepriklausomai. Vienos pakeitimai neveikia kitos.

## Darbo eigos šakojimas

### PHP API

Iškvieskite `Queuety::fork_workflow()` ir perduokite darbo eigos ID. Grąžinamas naujos darbo eigos ID:

```php
use Queuety\Queuety;

$forked_id = Queuety::fork_workflow( $workflow_id );
```

### CLI

```bash
wp queuety workflow fork <id>
```

| Parinktis | Aprašymas |
|---|---|
| `<id>` | Išsišakojamos darbo eigos ID (privalomas) |

```bash
wp queuety workflow fork 42
# Success: Workflow #42 forked. New workflow ID: 43.
```

## Kaip tai veikia

Išskaidžius darbo eigą:

1. Pradinės darbo eigos eilutė užrakinama ir nuskaitoma
2. Įterpiama nauja darbo eigos eilutė su ta pačia būsena, žingsnių apibrėžtimis ir dabartiniu žingsniu
3. Naujos darbo eigos pavadinimas yra `{original_name}_fork_{timestamp}`
4. Dabartinis žingsnis įtraukiamas į išskaidytos darbo eigos eilę
5. Abiejų darbo eigų žurnale įrašomas įvykis `workflow_forked`
6. Pradinė darbo eiga vykdoma toliau kaip įprasta

Išskaidyta darbo eiga yra visiškai nepriklausoma. Ji turi savo darbo eigos ID, atskirą būsenos kopiją ir atskirus užduočių eilės įrašus. Nuo išskaidymo momento abi darbo eigos gali laisvai skirtis.

## Naudojimo atvejai

### Žingsnių apdorojimo funkcijų A/B testavimas

Išskaidykite darbo eigą, kad išbandytumėte dvi skirtingas būsimo žingsnio realizacijas:

```php
// Original workflow will use the existing CallLLMHandler (GPT-4).
// Fork it to test with a different handler.
$forked_id = Queuety::fork_workflow( $workflow_id );

// Modify the forked workflow's state to use a different model.
// (Update the state via a custom step or direct DB update.)
```

### Analizė „kas, jeigu“

Išskaidykite darbo eigą sprendimo taške, kad išbandytumėte skirtingas šakas:

```php
// Workflow is at step 3, about to process data.
// Fork it so we can try two different processing strategies.
$fork_a = Queuety::fork_workflow( $workflow_id );
$fork_b = Queuety::fork_workflow( $workflow_id );
```

Kiekviena išskaidyta darbo eiga pradedama su ta pačia įvesties būsena, tačiau ją galima pakeisti, kad būtų pasirinkti skirtingi keliai.

### Lygiagretus eksperimentavimas

Kai darbo eiga pasiekia tašką, kuriame norite lygiagrečiai išbandyti kelis metodus, išskaidykite ją kiekvienam metodui ir palyginkite rezultatus, kai visos išskaidytos darbo eigos bus užbaigtos.

## Išskaidytų eigų stebėjimas

Kiekvienos darbo eigos žurnalo įraše yra nuoroda į kitą darbo eigą:

- Pradinėje darbo eigoje: `context.forked_workflow_id` nurodo naują darbo eigą
- Išskaidytoje darbo eigoje: `context.forked_from_workflow_id` nurodo pradinę darbo eigą

Ieškokite žurnaluose, kad rastumėte visas darbo eigos išskaidytas kopijas:

```php
$logs = Queuety::logger()->for_workflow( $workflow_id );

foreach ( $logs as $entry ) {
    if ( 'workflow_forked' === $entry['event'] ) {
        $context = json_decode( $entry['context'] ?? '{}', true );
        // $context['forked_workflow_id'] is the new workflow
    }
}
```

## Apribojimai

- Išskaidyta darbo eiga nepaveldi pradinės darbo eigos įvykių žurnalo istorijos. Jos įvykių žurnalas pradedamas tuščias.
- Darbo eigų vykdymo ryšiai nedubliuojami. Jei pradinė darbo eiga vykdė kitą darbo eigą, išskaidyta kopija jos negauna.
- Išskaidyta kopija yra dabartinės būsenos momentinė kopija. Pradinės darbo eigos tuo metu vykdomos užduotys nedubliuojamos.
