
# Razvejanje delovnega toka

Queuety lahko delujoči delovni tok razveji v povsem neodvisno kopijo. Razvejani delovni tok se začne pri istem koraku in z enakim stanjem kot izvirnik, nato pa oba delovna toka napredujeta neodvisno. Spremembe enega ne vplivajo na drugega.

## Razvejanje delovnega toka

### PHP API

Pokličite `Queuety::fork_workflow()` z ID-jem delovnega toka. Vrne ID novega delovnega toka:

```php
use Queuety\Queuety;

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

### CLI

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

| Možnost | Opis |
|---|---|
| `<id>` | ID poteka dela za razcep (obvezno) |

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

## Kako deluje

Pri razvejanju delovnega toka:

1. Zapis izvirnega delovnega toka se zaklene in prebere
2. Vstavi se nov zapis delovnega toka z enakim stanjem, definicijami korakov in trenutnim korakom
3. Ime novega delovnega toka je `{original_name}_fork_{timestamp}`
4. Trenutni korak se uvrsti v čakalno vrsto za razvejani delovni tok
5. Na izvirnem in razvejanem delovnem toku se zabeleži dogodek `workflow_forked` v dnevniku
6. Izvirni delovni tok nadaljuje običajno obdelavo

Razvejani delovni tok je povsem neodvisen. Ima svoj ID delovnega toka, svojo kopijo stanja in svoje vnose v čakalni vrsti opravil. Od točke razvejitve naprej se lahko vsak delovni tok prosto razvija po svoje.

## Primeri uporabe

### Testiranje obdelovalnikov korakov A/B

Razvejte delovni tok, da preizkusite dve različni izvedbi prihajajočega koraka:

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

### Analiza scenarijev »kaj če«

Razvejte delovni tok na odločitveni točki in raziščite različne veje:

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

Vsaka razvejitev se nadaljuje z enakim vhodnim stanjem, vendar jo je mogoče prilagoditi za uporabo druge poti.

### Vzporedno eksperimentiranje

Ko delovni tok doseže točko, na kateri želite vzporedno preizkusiti več pristopov, ga razvejte za vsak pristop in primerjajte rezultate, ko se vse razvejitve zaključijo.

## Sledenje razvejitvam

Dogodek v dnevniku vsakega delovnega toka vsebuje sklic na drugega:

- Pri izvirniku: `context.forked_workflow_id` kaže na novi delovni tok
- Pri razvejanem delovnem toku: `context.forked_from_workflow_id` kaže na izvirnik

V dnevnikih poiščite vse razvejitve delovnega toka:

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

## Omejitve

- Razvejani delovni tok ne podeduje zgodovine dnevnika dogodkov izvirnika. Začne se s praznim dnevnikom dogodkov.
- Povezave med izvajanji delovnih tokov se ne podvojijo. Če je izvirnik imel izvajanje povezanega delovnega toka, ga razvejani delovni tok ne dobi.
- Razvejitev je posnetek trenutnega stanja. Opravila izvirnega delovnega toka, ki se že izvajajo, se ne podvojijo.
