
# Neuron Εξαρτημένες ροές εργασιών

Αυτό το παράδειγμα απαντά σε ένα συνηθισμένο ερώτημα σχετικά με agent:

> Μπορεί μια ροή εργασιών να αποφασίσει ότι μια άλλη θα συνεχίσει μόνο αφού ολοκληρωθεί μια προηγούμενη;

Ναι. Η σημαντική λεπτομέρεια είναι ότι το Queuety το υποστηρίζει ήδη με τα `wait_for_workflow()` και `wait_for_workflows()`.

Αυτό σημαίνει ότι:

- Η ροή εργασιών `X` μπορεί να αποσταλεί τώρα
- Η `X` μπορεί να περιμένει στο `waiting_for_workflows`
- Η `X` συνεχίζει μόνο όταν ολοκληρωθεί η ροή εργασιών `Y`

## Παράδειγμα: πρώτα έρευνα, μετά σύνταξη

Χρησιμοποιήστε μία ροή εργασιών ανώτατου επιπέδου για να δημιουργήσετε ένα πακέτο έρευνας και μια δεύτερη για να συντάξετε το τελικό κείμενο.

### Ροή εργασιών έρευνας

```php
use Queuety\Enums\WaitMode;
use Queuety\Queuety;

$research_agent = Queuety::workflow('research_agent')
    ->then(ResearchTopicStep::class);

$research_id = Queuety::workflow('research_packet')
    ->then(PlanResearchTasksStep::class)
    ->start_agents('agent_tasks', $research_agent)
    ->wait_for_agents(mode: WaitMode::All, result_key: 'agent_results')
    ->then(SynthesizeResearchPacketStep::class)
    ->dispatch([
        'brief_id' => 42,
        'provider' => 'anthropic',
    ]);
```

### Ροή εργασιών σύνταξης

```php
Queuety::workflow('write_brief')
    ->wait_for_workflow('research_workflow_id', 'research')
    ->then(WriteBriefWithNeuronStep::class)
    ->wait_for_decision(result_key: 'editor_review')
    ->then(PublishBriefStep::class)
    ->dispatch([
        'brief_id' => 42,
        'research_workflow_id' => $research_id,
        'provider' => 'openai',
    ]);
```

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

## Το βήμα σύνταξης Neuron

```php
namespace App\Workflow\Steps;

use App\Neuron\WriterAgent;
use NeuronAI\Chat\Messages\UserMessage;
use Queuety\Step;

final class WriteBriefWithNeuronStep implements Step
{
    public function handle(array $state): array
    {
        $agent = new WriterAgent(
            providerName: $state['provider'] ?? 'openai',
        );

        $message = $agent->chat(
            new UserMessage(sprintf(
                "Write the final brief for brief %d using this research packet:\n\n%s",
                $state['brief_id'],
                json_encode($state['research'], JSON_PRETTY_PRINT),
            ))
        )->getMessage();

        return [
            'draft_markdown' => $message->getContent(),
        ];
    }

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

Το `$state['research']` είναι διαθέσιμο επειδή το `wait_for_workflow()` αντέγραψε την ολοκληρωμένη δημόσια κατάσταση από την εξαρτώμενη ροή εργασιών στην τρέχουσα ροή εργασιών, με το κλειδί `research`.

## Πότε να το χρησιμοποιήσετε αντί για μία τεράστια ροή εργασιών

Προτιμήστε ξεχωριστές ροές εργασιών ανώτατου επιπέδου όταν:

- τα στάδια έχουν διαφορετικούς υπευθύνους ή λειτουργικούς κύκλους ζωής
- θέλετε να τα επιθεωρείτε και να επαναλαμβάνετε την εκτέλεσή τους ανεξάρτητα
- ένα μεταγενέστερο στάδιο πρέπει να μπορεί να αποσταλεί πριν ολοκληρωθεί το προηγούμενο

Προτιμήστε μία ροή εργασιών όταν:

- τα στάδια συνδέονται στενά
- μοιράζονται έναν κύκλο ζωής και ένα σύνολο κατάστασης

## Ο ρόλος μιας μηχανής καταστάσεων

Αν αυτή η ροή σύνταξης ανήκει σε μια συνεδρία σύνταξης μεγάλης διάρκειας, αφήστε μια [μηχανή καταστάσεων](https://queuety.inline0.dev/el/docs/state-machines) να διαχειρίζεται τον εξωτερικό κύκλο ζωής και χρησιμοποιήστε αυτές τις ροές εργασιών για τα στάδια εκτέλεσης με σαφή όρια. Έτσι, καταστάσεις κύκλου ζωής όπως οι `awaiting_brief`, `researching`, `awaiting_review` και `completed` παραμένουν σαφείς, διατηρώντας παράλληλα την ανθεκτικότητα των ροών εργασιών σε κάθε φάση.

## Μια σημαντική διάκριση

Αυτό το μοτίβο σημαίνει ότι:

- Το `X` υπάρχει ήδη, αλλά περιμένει το `Y`

Δεν σημαίνει ότι:

- Το `X` δημιουργείται μόνο αφού ολοκληρωθεί το `Y`

Αν θέλετε τη δεύτερη συμπεριφορά, βάλτε μια γονική ροή εργασιών να περιμένει το `Y` και μόνο τότε να καλεί το `start_workflows()` ή το `start_agents()` για το `X`.

## Σχετική τεκμηρίωση

- [Εξαρτήσεις ροών εργασιών](https://queuety.inline0.dev/el/docs/workflows/dependencies)
- [Ασύγχρονες μεταβιβάσεις](https://queuety.inline0.dev/el/docs/workflows/async-handoffs)
- [Συντονισμός agent](https://queuety.inline0.dev/el/docs/workflows/agent-orchestration)
- [Μηχανές καταστάσεων](https://queuety.inline0.dev/el/docs/state-machines)
