
# Διακλάδωση ροής εργασίας

Το Queuety μπορεί να δημιουργήσει ένα πλήρως ανεξάρτητο αντίγραφο μιας εκτελούμενης ροής εργασίας. Η διακλαδωμένη ροή εργασίας ξεκινά από το ίδιο βήμα και με την ίδια κατάσταση όπως η αρχική, αλλά από εκεί και πέρα οι δύο ροές εργασίας προχωρούν ανεξάρτητα. Οι αλλαγές στη μία δεν επηρεάζουν την άλλη.

## Διακλάδωση ροής εργασίας

### PHP API

Καλέστε το `Queuety::fork_workflow()` με το αναγνωριστικό της ροής εργασίας. Επιστρέφει το νέο αναγνωριστικό ροής εργασίας:

```php
use Queuety\Queuety;

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

### CLI

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

| Επιλογή | Περιγραφή |
|---|---|
| `<id>` | Αναγνωριστικό ροής εργασιών προς διακλάδωση (απαιτείται) |

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

## Πώς λειτουργεί

Όταν διακλαδώνετε μια ροή εργασίας:

1. Κλειδώνεται και διαβάζεται η αρχική εγγραφή της ροής εργασίας
2. Εισάγεται νέα εγγραφή ροής εργασίας με την ίδια κατάσταση, τους ίδιους ορισμούς βημάτων και το τρέχον βήμα
3. Το όνομα της νέας ροής εργασίας είναι `{original_name}_fork_{timestamp}`
4. Το τρέχον βήμα τίθεται στην ουρά για τη διακλαδωμένη ροή εργασίας
5. Καταγράφεται ένα συμβάν `workflow_forked` τόσο στην αρχική όσο και στη διακλαδωμένη ροή εργασίας
6. Η αρχική ροή εργασίας συνεχίζει να εκτελείται κανονικά

Η διακλαδωμένη ροή εργασίας είναι πλήρως ανεξάρτητη. Έχει το δικό της αναγνωριστικό, το δικό της αντίγραφο κατάστασης και τις δικές της εγγραφές στην ουρά εργασιών. Από το σημείο διακλάδωσης και μετά, κάθε ροή εργασίας μπορεί να ακολουθήσει διαφορετική πορεία.

## Περιπτώσεις χρήσης

### Δοκιμή χειριστών βημάτων A/B

Διακλαδώστε μια ροή εργασίας για να δοκιμάσετε δύο διαφορετικές υλοποιήσεις ενός επόμενου βήματος:

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

### Ανάλυση υποθετικών σεναρίων

Διακλαδώστε μια ροή εργασίας σε ένα σημείο απόφασης για να εξερευνήσετε διαφορετικές διαδρομές:

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

Κάθε διακλάδωση προχωρά με την ίδια αρχική κατάσταση, αλλά μπορεί να τροποποιηθεί ώστε να ακολουθήσει διαφορετική διαδρομή.

### Παράλληλος πειραματισμός

Όταν η ροή εργασίας φτάσει σε σημείο όπου θέλετε να δοκιμάσετε πολλές προσεγγίσεις παράλληλα, δημιουργήστε μια διακλάδωση για κάθε προσέγγιση και συγκρίνετε τα αποτελέσματα αφού ολοκληρωθούν όλες.

## Παρακολούθηση διακλαδώσεων

Το συμβάν καταγραφής σε κάθε ροή εργασίας περιλαμβάνει αναφορά στην άλλη:

- Στην αρχική: το `context.forked_workflow_id` δείχνει στη νέα ροή εργασίας
- Στη διακλάδωση: το `context.forked_from_workflow_id` δείχνει στην αρχική

Αναζητήστε στα αρχεία καταγραφής για να βρείτε όλες τις διακλαδώσεις μιας ροής εργασίας:

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

## Περιορισμοί

- Η διακλαδωμένη ροή εργασίας δεν κληρονομεί το ιστορικό αρχείου καταγραφής συμβάντων της αρχικής. Ξεκινά με κενό αρχείο καταγραφής συμβάντων.
- Οι σχέσεις εκτέλεσης ροών εργασίας δεν αντιγράφονται. Αν η αρχική ροή εργασίας είχε μια εκτελούμενη ένθετη ροή εργασίας, η διακλάδωση δεν λαμβάνει αντίγραφό της.
- Η διακλάδωση είναι στιγμιότυπο της τρέχουσας κατάστασης. Τυχόν εργασίες που εκτελούνται για την αρχική ροή εργασίας δεν αντιγράφονται.
