Węzeł, krawędź, stan — z czego składa się graf wykonania

przez Łukasz | wrz 2, 2026

Cztery elementy, z których trzeci sprawia najwięcej kłopotu, a czwarty jest pomijany najczęściej.

Odpowiedź „graf składa się z agentów” jest niepełna i prowadzi na manowce. Prowadzi do architektury, w której wszystko, co się dzieje, jest czyimś rozumowaniem — czyli do systemu droższego, wolniejszego i mniej przewidywalnego, niż musiał być.

Graf wykonania ma cztery elementy. Trzy z nich mają odpowiedniki w pętli, więc będą znajome. Czwarty w pętli nie istnieje i dlatego bywa dobudowywany na końcu, gdy jest już za późno.

Węzeł: co istnieje

Węzeł to miejsce, w którym coś się wykonuje. Nie musi być agentem i najczęściej nie powinien.

Agent. Prowadzi własną pętlę, sam decyduje o krokach. Drogi, wolny, niepowtarzalny w wyniku. Używasz go tam, gdzie potrzebny jest osąd.

Funkcja deterministyczna. Zwykły kod. Pobranie danych, przeliczenie, zapis, wysyłka. Tani, szybki, dający ten sam wynik za każdym razem. Większość węzłów w dobrze zaprojektowanym grafie to właśnie ten typ.

Router. Podejmuje jedną decyzję: dokąd dalej. Może być warunkiem w kodzie albo wywołaniem modelu z jednym pytaniem. Rozdzielenie routingu od pracy jest jedną z niewielu rzeczy, które warto zrobić od razu — bo wtedy widać w logu, dlaczego graf poszedł tą, a nie inną ścieżką.

Złączenie. Czeka na kilka wejść i scala je w jedno. Wygląda niewinnie, dopóki nie okaże się, że jedno z wejść nigdy nie przyjdzie.

Punkt zatwierdzenia. Zatrzymuje wykonanie i czeka na człowieka. Jedyny typ węzła, którego niezawodność spada z częstotliwością użycia — o tym jest osobny artykuł w tym torze.

Praktyczna zasada przy projektowaniu: jeśli węzeł da się zrobić funkcją, zrób go funkcją. Agent w miejscu, gdzie wystarczy if, to koszt bez korzyści i jedno miejsce mniej, w którym rozumiesz, co się stało.

Krawędź: co wolno po czym

Krawędź to nie strzałka na diagramie, tylko odpowiedź na pytanie, jakie przejścia są dozwolone i kto komu może przekazać pracę.

Dwie rzeczy warto tu rozdzielić, bo mieszają się notorycznie.

Krawędź dozwolona to część projektu: z węzła A można przejść do B albo do C, nigdzie indziej. To jest granica, którą ustalasz z góry — nawet w grafie, w którym droga powstaje w trakcie.

Krawędź wybrana to rozstrzygnięcie w czasie działania: tym razem poszliśmy do C. To jest to, co odróżnia graf wykonania od grafu przepływu — nie brak reguł, tylko to, że wybór spośród nich zapada w trakcie.

Konsekwencja, którą warto zapisać: graf agentowy nie znaczy „agent robi, co chce”. Znaczy, że wybiera spośród przejść, na które pozwoliłeś. Jeśli twój graf pozwala na wszystko z wszystkiego, nie zbudowałeś grafu — zbudowałeś jedną wielką pętlę z dodatkowymi kosztami.

Stan: co płynie po krawędziach

Tu zaczynają się kłopoty, bo w pętli stan był prosty: historia rosła, wszystko trafiało do kontekstu, model nie pamiętał niczego, a ciągłość utrzymywał kod.

W grafie stan ma trzy właściwości, których w pętli nie miał.

Jest współdzielony. Kilka węzłów czyta i zapisuje to samo. Powstaje pytanie, którego wcześniej nie było: co się dzieje, gdy dwa zapisy dotyczą tego samego pola.

Przeżywa węzeł. Węzeł się kończy, stan zostaje. To dobrze — na tym polega ciągłość między przebiegami. Ale znaczy też, że stan musi mieszkać poza procesem wykonawczym, czyli w bazie albo kolejce, a nie w pamięci.

Nie jest tym samym co kontekst. To jest rozróżnienie, które warto wbić na stałe. Stan grafu to prawda o zadaniu. Kontekst węzła to to, co dostał model przy konkretnym wywołaniu. Węzeł zwykle dostaje wycinek stanu, nie całość — i decyzja o tym, który wycinek, jest osobną decyzją projektową o dokładnie takich samych konsekwencjach kosztowych jak w pętli.

Praktycznie: jeśli każdy węzeł dostaje cały stan, płacisz kwadratowy rachunek pomnożony przez liczbę węzłów. To jest najczęstszy sposób, w jaki graf robi się nieprzyzwoicie drogi.

Granice uprawnień: czego nie wolno, niezależnie od decyzji

Czwarty element, w pętli nieobecny, bo pętla ma jeden zestaw uprawnień i nie ma czego rozdzielać.

W grafie każdy węzeł może mieć własne: inny model, innego dostawcę, inny katalog roboczy, inną politykę sieciową, inny zestaw narzędzi. I to nie jest funkcja, którą ktoś dobudował — przy architekturze, w której każdy węzeł jest osobnym procesem, heterogeniczność jest konsekwencją, nie dodatkiem.

Scenariusz, który to unaocznia: większość węzłów działa na modelu lokalnym, w kontenerze bez wyjścia do sieci, na plikach. Jeden ma dostęp do internetu i zapisuje wyniki do współdzielonego katalogu. Węzeł analizujący czyta ten katalog i nie ma jak niczego wysłać, bo jego kontener nie ma ścieżki na zewnątrz.

Kluczowe jest to, gdzie mieszka ograniczenie. Instrukcja w prompcie to życzenie — agent poproszony o dane, których nie ma, będzie ich szukał każdą dostępną drogą. Odcięty ruch wychodzący to fakt.

Ta sama zasada dotyczy budżetu. Sprawdzenie limitu przed uruchomieniem węzła jest granicą. Raport o przekroczeniu po fakcie jest sprawozdaniem.

Z jednym zastrzeżeniem, którego nie wolno pominąć: hamulec zewnętrzny jest wart tyle, ile zabezpieczenie panelu, który nim steruje. Opisywaliśmy na cyberflux.pl łańcuch wywołań dający nieuwierzytelnionemu atakującemu kontrolę nad instancją orkiestratora — a więc również nad wszystkimi budżetami, które w niej ustawiono.

Jak to sprawdzić u siebie

Weź proces, o którym myślisz, i wypisz go w czterech kolumnach, zanim cokolwiek zaimplementujesz. Kartka wystarczy.

Węzły — wypisz je i przy każdym dopisz typ. Policz, ile z nich to agenty. Jeśli więcej niż połowa, wróć i sprawdź, które dałoby się zamienić na funkcję.

Krawędzie — dla każdego węzła wypisz, dokąd wolno przejść. Jeśli przy którymś napiszesz „wszędzie”, masz tam problem projektowy, nie elastyczność.

Stan — wypisz pola, które przeżywają pojedynczy węzeł. Przy każdym zaznacz, kto zapisuje. Jeśli zapisujących jest więcej niż jeden, to jest miejsce na konflikt.

Granice — przy każdym węźle dopisz, czego mu nie wolno. Jeśli przy którymś nie umiesz nic wpisać, to znaczy, że wolno mu wszystko.

Ostatnia kolumna jest zwykle najbardziej pusta i zwykle najbardziej potrzebna.

Co dalej

Cztery elementy opisują graf statycznie. Zostaje pytanie, które w tym artykule pojawiło się przy krawędziach i zostało odłożone: kto właściwie rozstrzyga, którą krawędzią pójdzie wykonanie — i co się zmienia, gdy decyzja zapada z góry, a co, gdy w trakcie.

To jest jedyna różnica, która naprawdę dzieli dwa podejścia do orkiestracji, i od niej zależy koszt, przewidywalność i sposób debugowania całości.

O tym jest artykuł czwarty: Kto rysuje krawędź — z góry czy w trakcie.


Stan na sierpień 2026. Podział na cztery elementy jest uogólnieniem z dokumentacji narzędzi orkiestrujących i z opracowań branżowych — poszczególne frameworki nazywają je różnie i nie wszystkie wyodrębniają granice uprawnień jako osobną warstwę.

Agent kończy, ale zadania nie wykonał

Agent kończy, ale zadania nie wykonał

Objawy Agent odpowiada: „Przygotowałem i wysłałem potwierdzenie do klienta." Potwierdzenie nie zostało wysłane. Albo: „Zaktualizowałem wszystkie rekordy" — zaktualizował trzy z dwunastu. Albo: „Nie znalazłem żadnych zamówień" — bo narzędzie zwróciło błąd, którego nikt...

Agent zrobił coś, o co nikt nie prosił

Agent zrobił coś, o co nikt nie prosił

Objawy Operacja, której nikt nie zlecił. Dane wysłane pod adres, którego nie ma w żadnej konfiguracji. Rekord zmieniony poza zakresem zadania. Odpowiedź, z której wynika, że agent dostał instrukcje od kogoś innego niż ty. Cecha wspólna: technicznie wszystko zadziałało...

Agent zrobił to samo dwa razy

Agent zrobił to samo dwa razy

Objawy Ten syndrom różni się od pozostałych jedną rzeczą: objaw widzi klient, nie ty. Trzy identyczne wiadomości w skrzynce. Dwa zamówienia zamiast jednego. Podwójne obciążenie. Duplikaty rekordów, które ktoś zauważa tydzień później. W twoim dzienniku wszystko wygląda...

Agent gubi wątek w długim zadaniu

Agent gubi wątek w długim zadaniu

Objawy Pierwsze kroki idą wzorowo. Po kilkunastu agent zaczyna się rozjeżdżać. Przestaje przestrzegać reguły z promptu systemowego, której trzymał się na początku. Zmienia format odpowiedzi w połowie zadania. Wraca do czegoś, co już ustalił, i ustala to inaczej....

Agent podaje dane, których nie ma

Agent podaje dane, których nie ma

Objawy Numer zamówienia w idealnym formacie, którego nie ma w bazie. Kwota, której w dokumencie nie ma. Nazwa pola API, które nigdy nie istniało. Cytat z regulaminu, brzmiący dokładnie jak reszta regulaminu i w nim nieobecny. Cecha wspólna wszystkich tych przypadków:...

Działał wczoraj, dziś nie działa

Działał wczoraj, dziś nie działa

Objawy Nic się nie wywala. Nie ma wyjątków, nie ma timeoutów, dziennik wygląda tak samo jak zawsze. Po prostu odpowiedzi są gorsze. Postacie, w jakich to się objawia: Jakość. Agent zaczyna pomijać kroki, które wcześniej wykonywał, albo odpowiada ogólniej. Format....

Agent wybiera złe narzędzie

Agent wybiera złe narzędzie

Objawy Agent odpowiada nie na to pytanie. Pobiera listę zamówień, gdy pytano o jedno konkretne. Odpowiada z pamięci, choć miał sprawdzić w bazie. Albo sięga po właściwe narzędzie i wpisuje w argumenty coś, czego nie da się użyć. Sygnał, który odróżnia ten syndrom od...

Agent kręci się w kółko

Agent kręci się w kółko

Objawy Agent wykonuje kolejne obroty pętli, nie zbliżając się do zakończenia zadania. W dzienniku widać jedną z trzech postaci. Powtórzenie. To samo narzędzie, te same argumenty, raz za razem — czasem dziesiątki razy pod rząd. Oscylacja. Agent wywołuje na przemian dwa...