
# Darbplūsmas sazarojums

Queuety var sazarot darbojošos darbplūsmu pilnīgi neatkarīgā kopijā. Sazarotā darbplūsma sākas tajā pašā darbībā un ar tādu pašu stāvokli kā sākotnējā darbplūsma, bet pēc tam abas turpinās neatkarīgi. Izmaiņas vienā neietekmē otru.

## Darbplūsmas sazarojums

### PHP API

Izsauciet `Queuety::fork_workflow()`, norādot darbplūsmas ID. Tiek atgriezts jaunās darbplūsmas ID:

```php
use Queuety\Queuety;

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

### CLI

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

| Opcija | Apraksts |
|---|---|
| `<id>` | Atzarojamās darbplūsmas ID (obligāts) |

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

## Kā tas darbojas

Sazarojot darbplūsmu:

1. Sākotnējās darbplūsmas rinda tiek bloķēta un nolasīta
2. Tiek ievietota jauna darbplūsmas rinda ar tādu pašu stāvokli, darbību definīcijām un pašreizējo darbību
3. Jaunās darbplūsmas nosaukums ir `{original_name}_fork_{timestamp}`
4. Sazarotajai darbplūsmai rindā tiek ievietota pašreizējā darbība
5. Gan sākotnējā, gan sazarotajā darbplūsmā tiek reģistrēts `workflow_forked` žurnāla notikums
6. Sākotnējā darbplūsma turpina darboties kā parasti

Sazarotā darbplūsma ir pilnīgi neatkarīga. Tai ir savs darbplūsmas ID, savas stāvokļa kopijas un savi darbu rindas ieraksti. Pēc sazarojuma katra darbplūsma var brīvi attīstīties atšķirīgi.

## Lietojuma gadījumi

### Darbību apstrādātāju A/B testēšana

Sazarojiet darbplūsmu, lai pārbaudītu divas dažādas gaidāmās darbības implementācijas:

```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.)
```

### Analīze “kas būtu, ja”

Sazarojiet darbplūsmu lēmuma pieņemšanas punktā, lai izpētītu dažādus atzarus:

```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 );
```

Katrs sazarojums turpinās ar to pašu ievades stāvokli, taču to var mainīt, lai izvēlētos citu ceļu.

### Paralēli eksperimenti

Kad darbplūsma sasniedz punktu, kur vēlaties paralēli izmēģināt vairākas pieejas, sazarojiet to katrai pieejai un salīdziniet rezultātus, kad visi sazarojumi ir pabeigti.

## Sazarojumu uzskaite

Katras darbplūsmas žurnāla notikumā ir atsauce uz otru darbplūsmu:

- Sākotnējā darbplūsmā: `context.forked_workflow_id` norāda uz jauno darbplūsmu
- Sazarotajā darbplūsmā: `context.forked_from_workflow_id` norāda uz sākotnējo darbplūsmu

Vaicājiet žurnālus, lai atrastu visus darbplūsmas sazarojumus:

```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
    }
}
```

## Ierobežojumi

- Sazarotā darbplūsma nepārņem sākotnējās darbplūsmas notikumu žurnāla vēsturi. Tai ir jauns, tukšs notikumu žurnāls.
- Darbplūsmas izpildes attiecības netiek dublētas. Ja sākotnējai darbplūsmai bija izpildē esoša darbplūsmas izpilde, sazarotā darbplūsma tās kopiju nesaņem.
- Sazarojums ir pašreizējā stāvokļa momentuzņēmums. Sākotnējās darbplūsmas izpildē esošie darbi netiek dublēti.
