Przejdź do głównej zawartości

Przepływy wieloagentowe w Codex: równoległe tory, subagenci i zadania w chmurze

Przepływ wieloagentowy w Codex dzieli zadanie na tory bez wspólnych plików, uruchamia po jednym agencie Codex na tor we własnym worktree Git lub kontenerze w chmurze i scala tory według zależności, gdy każdy przejdzie własną bramkę. Równoległe tory opłacają się tylko wtedy, gdy wspólne kontrakty trafiają do kodu jako pierwsze, a każdy tor jest weryfikowany osobno.

Twój epik ma pięć podzadań: migrację, API, zmianę w serwisie, stronę ustawień i testy end-to-end. Możesz uruchomić pięć sesji Codex naraz, ale przy ostatniej próbie dwie z nich przepisały ten sam plik barrel, trzecia wymyśliła własny kształt odpowiedzi, a ty spędziłeś popołudnie na rozplątywaniu merge’y. Ta strona jest dla programisty, który uruchamia agentów, i dla tech leada, który decyduje, ilu agentów działa naraz i co znaczy „gotowe” dla każdego z nich.

  • Regułę, co idzie równolegle, co pierwsze, a co musi zostać sekwencyjne.
  • Cztery prompty do skopiowania: dekompozycja, fundament, wykonawca toru i rozwiązywanie konfliktu między torami.
  • Skrypt, który uruchamia po jednym agencie codex exec na worktree Git, oraz bramkę toru, która odrzuca pracę spoza toru, zanim ją przeczytasz.
  • Ustawienia config.toml, które ograniczają współbieżność i koszt subagentów.
  • Kolejność scalania i test integracyjny, które dowodzą, że połączony wynik działa.

Polecenia i klucze konfiguracji na tej stronie sprawdzono 2026-09-26 w codex 0.157.1 (--help i kod źródłowy rust-v0.157.1).

Który tryb Codex obsługuje jaki rodzaj pracy równoległej?

Dział zatytułowany „Który tryb Codex obsługuje jaki rodzaj pracy równoległej?”

Codex daje cztery sposoby uruchamiania agentów obok siebie. Różnią się tym, co izolują, a izolacja decyduje o tym, co może bezpiecznie działać równolegle.

TrybJak uruchomićIzolacjaDo czego
Subagenci w jednej sesjiPoproś o nich w prompcie; przełączaj przez /subagentsJedna sesja; współbieżność ustawiasz w [agents] w config.tomlPraca głównie odczytowa: eksploracja kodu, przegląd jednego diffu z kilku stron
Zarządzane sesje w worktreecodex --worktree albo /worktree w trakcie sesjiNowy zarządzany worktree Git na sesjęTory interaktywne, które chcesz obserwować i korygować
Skryptowy codex execgit worktree add, potem codex exec -C <katalog>Worktree i gałąź, które nazywasz samPowtarzalne rozproszenie pracy ze skryptu, z zachowanymi logami
Zadania w chmurzecodex cloud exec --env ENV_IDKontener w chmurze na zadanie; do czterech prób każdeDługie tory, ciężkie buildy i best-of-N na trudnym torze

Aplikacja desktopowa Codex (codex app, macOS i Windows) realizuje ten sam wzorzec worktree, z jednym wątkiem na tor. Neowin podał (źródło wtórne, 2026-07-09), że działa ona teraz jako tryb Codex w aplikacji desktopowej ChatGPT. Konfigurację i sprzątanie worktree w każdym trybie opisuje strona izolowane zadania Codex w worktree Git.

Kiedy uruchamiać agentów Codex równolegle, a kiedy po kolei?

Dział zatytułowany „Kiedy uruchamiać agentów Codex równolegle, a kiedy po kolei?”

Zrównoleglaj fragment pracy tylko wtedy, gdy spełnia wszystkie trzy warunki:

  • Ma własne pliki. Żaden inny tor nie tworzy ani nie edytuje tych samych ścieżek.
  • Nie zależy od niczego, co inny tor wciąż pisze. Jego dane wejściowe są już na gałęzi bazowej.
  • Da się go zweryfikować w izolacji. Ma własne testy, a type check i lint przechodzą na jego gałęzi bez pozostałych torów.

Wszystko inne wykonuj sekwencyjnie: migracje bazy danych, wspólne typy i interfejsy, rejestrację tras i schematów w plikach barrel oraz każdy krok, przed którym musisz podjąć decyzję, zanim ruszy następny.

Większość zestawów funkcji ma ten sam kształt. Cienki fundament (migracja, wspólne interfejsy, linie rejestracji) blokuje całą resztę, potem trzy do pięciu torów działa równolegle, a na końcu raz, po wszystkich scaleniach, odbywa się faza integracji. Konflikty prawie zawsze biorą się z pominięcia fundamentu: dwóch agentów dopisuje „jedną linijkę” do src/routes/index.ts albo każdy wymyśla własny EventPayload.

Przykład to funkcja preferencji powiadomień: użytkownik wybiera e-mail, SMS lub push dla każdego typu powiadomienia. Te same kroki działają dla kwartalnej listy niezależnych funkcji; wydłuża się tylko lista torów.

  1. Rozłóż pracę i zapisz plan do pliku. Uruchom poniższy prompt planistyczny w zwykłej sesji Codex na gałęzi bazowej. Przeglądaj plan, nie kod: tabela własności plików i kontrakty decydują o powodzeniu pracy równoległej. Zacommituj docs/plan/notification-prefs.md, bo każdy prompt toru się do niego odwołuje.

  2. Najpierw zbuduj fundament, w jednej sesji. Uruchom prompt fundamentu w jednej sesji na gałęzi funkcji, na przykład feature/notification-prefs. Gdy testy przejdą, zacommituj wynik. Każdy tor startuje teraz z gałęzi, która ma już tabelę, wspólne typy i linie rejestracji, więc żaden tor nie musi dotykać wspólnego pliku.

  3. Uruchom po jednym agencie na tor. Dla dwóch lub trzech torów, które chcesz obserwować, otwórz terminal na tor, uruchom codex --worktree z gałęzi funkcji i wklej prompt toru. Przy większej liczbie torów albo przebiegu, który chcesz powtarzać, użyj skryptu z następnej sekcji.

  4. Obserwuj i koryguj, nie wchodząc w każdą rozmowę. codex agents (lub /agents w sesji) otwiera centrum dowodzenia agentami, w którym wyszukasz, otworzysz, przemianujesz i zatrzymasz sesje. Nazwij tam każdą sesję tak jak jej tor. Aby skorygować tor bez przełączania się do niego, dodaj wiadomość do kolejki po nazwie sesji: codex queue --thread prefs-api --message "Use the NotificationPreference type from src/types/notifications.ts; do not define a new one." Gdy jeden tor musi znać decyzję innego, oznacz to zadanie przez @ w prompcie zamiast wklejać jego wynik. Przed uruchomieniem kolejnej partii sprawdź /usage.

  5. Sprawdzaj każdy tor osobno. Uruchom bramkę toru (poniżej) na każdej gałęzi, gdy tylko tor się skończy. Zarządzana sesja codex --worktree zostawia zmiany niezacommitowane w worktree nazwanym przez Codex, więc najpierw zacommituj tam pracę toru, a ścieżkę tego worktree (z git worktree list) podaj bramce jako czwarty argument. Tor, który nie przejdzie bramki, wraca do swojego agenta razem z jej wynikiem; jego diffu jeszcze nie czytasz.

  6. Scalaj w kolejności zależności, potem uruchom integrację. Najpierw scal tor z najmniejszą liczbą punktów styku, a tor testów end-to-end na końcu. Po ostatnim scaleniu uruchom raz cały zestaw testów na gałęzi funkcji. Dopiero wtedy otwórz pull request i poproś w nim o @codex review, obok recenzentów z zespołu.

Skrypt tworzy po jednym worktree i gałęzi na tor z bieżącej gałęzi, instaluje zależności poza sandboksem, uruchamia równolegle po jednym nieinteraktywnym agencie na tor i commituje wynik każdego toru, żeby bramka miała czystą gałąź do sprawdzenia. Uruchom go z katalogu głównego repozytorium, na gałęzi z commitem fundamentu, z jednym plikiem promptu na tor w prompts/. Skrypt zatrzyma się, jeśli gałąź albo worktree toru już istnieje, więc przed ponownym uruchomieniem usuń poprzednie (wiersz „Stare worktree się mnożą” w sekcji Gdy równolegli agenci Codex zawodzą); to porzuca niescaloną pracę torów.

#!/usr/bin/env bash
# fan-out.sh: one codex exec agent per lane, each in its own worktree
set -euo pipefail
BASE=$(git rev-parse --abbrev-ref HEAD)
RUNS="$PWD/.codex-runs"
mkdir -p "$RUNS"
pids=(); lanes=()
for lane in api service ui; do
wt="../wt-prefs-$lane"
git worktree add -b "feat/prefs-$lane" "$wt" "$BASE"
(cd "$wt" && npm ci --silent) # installs need the network the sandbox withholds
codex exec -C "$wt" \
-c default_permissions=":workspace" \
--json -o "$RUNS/$lane.md" \
"$(cat "prompts/prefs-$lane.md")" < /dev/null > "$RUNS/$lane.jsonl" &
pids+=("$!"); lanes+=("$lane")
done
failed=0
for i in "${!pids[@]}"; do
wait "${pids[$i]}" || { echo "FAIL ${lanes[$i]}: codex exec exited non-zero"; failed=1; }
done
[ "$failed" -eq 0 ] || exit 1
for lane in api service ui; do
git -C "../wt-prefs-$lane" add -A
git -C "../wt-prefs-$lane" commit -m "prefs: $lane lane (codex exec)" || echo "$lane: nothing to commit"
done

Trzy decyzje w skrypcie są celowe. -c default_permissions=":workspace" wybiera wbudowany profil uprawnień workspace, który OpenAI przedkłada nad starszą flagę --sandbox; profile są w wersji beta (Codex CLI 0.138.0 i nowsze), więc w skryptach przypnij wersję CLI. npm ci instaluje z lockfile’a, więc pięć torów nie rozwiąże pięciu różnych drzew zależności. Commituje skrypt, a nie agent, więc wynik nie zależy od tego, czy sandbox agenta może pisać do wspólnego katalogu .git repozytorium. .codex-runs/ przechowuje końcową wiadomość i log zdarzeń JSONL każdego toru; dodaj go do .gitignore. Dwa zabezpieczenia nie dopuszczają nieudanego toru do commita: skrypt czeka na identyfikator procesu każdego toru i przerywa pracę, jeśli którykolwiek codex exec zakończył się błędem (gołe wait zwraca 0 niezależnie od wyniku), a < /dev/null jest potrzebne, bo codex exec dokleja do promptu dane z potoku stdin, więc skrypt uruchomiony w CI albo przez bash < plik przekazałby każdemu agentowi przypadkowe wejście.

Prompty torów serwisu i UI pisz tak samo: nazwa toru, jego pliki do edycji, kontrakt, który importuje, i definicja ukończenia z poleceniami. Prompt toru bez „edytuj tylko” zaprasza agenta do poprawiania wszystkiego, co zauważy po drodze, a stąd biorą się konflikty między torami.

Jak udowodnić poprawność toru bez czytania każdego diffu?

Dział zatytułowany „Jak udowodnić poprawność toru bez czytania każdego diffu?”

Zanim cokolwiek przeczytasz, niech tor przejdzie automatyczne kontrole, w tej kolejności. Każda warstwa jest tańsza od następnej, więc tor trafia do człowieka dopiero po przejściu tanich kontroli.

WarstwaCo wyłapujeJak
Granica toruAgent edytował pliki spoza torugit diff --name-only względem dozwolonych ścieżek toru
Testy toru i kontrole statyczneZepsute zachowanie wewnątrz toruWłasne testy toru, type check i lint na jego gałęzi
Agent recenzentDryf kontraktu, brakujące testy, błędy logikiPrzebieg codex exec z profilem uprawnień :read-only, z planem jako kryterium
Testy kontraktowe na stykuTory, które przechodzą osobno, ale się nie zgadzająTesty importujące wspólne typy z obu stron, napisane w fundamencie
Przebieg integracyjnyInterakcje: wspólny stan testów, porty, kolejnośćCały zestaw testów raz, po ostatnim scaleniu
Akceptacja człowiekaZły plan, zły kontrakt, ryzykowne plikiZatwierdzasz plan i kontrakty przed startem, a diffy czytasz tylko w plikach, które plan oznacza jako ryzykowne (autoryzacja, płatności, migracje)

Bramka toru automatyzuje pierwsze trzy warstwy. Uruchom ją z katalogu głównego repozytorium raz dla każdego ukończonego toru:

#!/usr/bin/env bash
# lane-gate.sh LANE ALLOWED_PATHS_REGEX [BASE] [WORKTREE]
# example: ./lane-gate.sh api '^(src/routes/notifications/|src/services/notifications/api|tests/.*notification)'
set -euo pipefail
lane="$1"; allowed="$2"; base="${3:-feature/notification-prefs}"; wt="${4:-../wt-prefs-$lane}"
runs="$PWD/.codex-runs"
cd "$wt"
test -z "$(git status --porcelain)" || { echo "FAIL $lane: uncommitted changes"; exit 1; }
stray=$(git diff --name-only "$base"...HEAD | grep -v -E "$allowed" || true)
if [ -n "$stray" ]; then echo "FAIL $lane: files outside the lane:"; echo "$stray"; exit 1; fi
npm run typecheck
npm run lint
npm test
codex exec -c default_permissions=":read-only" -o "$runs/$lane-review.md" \
"Review git diff $base...HEAD against docs/plan/notification-prefs.md. Report only correctness bugs, contract drift from src/types/notifications.ts, and behaviour without a test. Give file and line for each finding. If there are none, reply with exactly NO FINDINGS on its own line." < /dev/null
[ "$(tr -d '[:space:]' < "$runs/$lane-review.md")" = 'NOFINDINGS' ] || { echo "FAIL $lane: review findings in $runs/$lane-review.md"; exit 1; }
echo "PASS $lane"

Krok recenzji to zwykły przebieg codex exec, a nie codex exec review, bo codex exec review --base odrzuca własny prompt: --base i własny prompt wzajemnie się wykluczają (sprawdzone w codex 0.157.1), więc nie da się podać planu jako kryterium. Jeśli wolisz codex exec review --base "$base", uruchom je bez promptu, a kryteria wpisz do wytycznych przeglądu w AGENTS.md. Bramka nie przechodzi, jeśli plik recenzji zawiera cokolwiek poza NO FINDINGS (nie licząc białych znaków), więc recenzja, która wymienia uwagi i dopisuje też tę linię, i tak zostaje odrzucona; wtedy przeczytaj uwagi i odeślij je agentowi toru albo sam odrzuć fałszywy alarm. Każda kontrola stoi w osobnej linii, bo przy set -e błąd polecenia przed ostatnim && w łańcuchu nie zatrzymuje skryptu, więc nieudany type check i tak wypisałby PASS.

Tor, który nie przejdzie kontroli granicy, odeślij do jego agenta albo przenieś zabłąkany plik do fundamentu i zaplanuj od nowa. Nie scalaj toru, żeby potem ręcznie naprawić nakładanie się: tak zaczyna się konflikt następnego toru. Przegląd kodu w skali zespołu opisują strategie przeglądu kodu w Codex i kolejka code review, gdy pull requesty otwierają agenci.

Rozprosz pracę w jednej sesji przez subagentów Codex

Dział zatytułowany „Rozprosz pracę w jednej sesji przez subagentów Codex”

Subagenci są domyślnie włączeni (multi_agent ma status stable w 0.157.1). Agent sesji tworzy ich, gdy prompt prosi o pracę równoległą, a /subagents przełącza między nimi. Lepiej nadają się do pytań niż do edycji: kilku czytelników przegląda jedną bazę kodu albo kilku recenzentów jeden diff. Tory, które zapisują pliki, trzymaj w osobnych worktree, gdzie izoluje je Git.

Ogranicz ich w ~/.codex/config.toml. Każdy klucz poniżej występuje w schemacie konfiguracji 0.157.1:

[agents]
max_threads = 4 # alias of max_concurrent_threads_per_session
default_subagent_reasoning_effort = "medium" # used when the spawn call sets none
# default_subagent_model = "gpt-6-sol" # only after your own evals favour it
[agents.reviewer]
description = "Read-only reviewer. Reports findings with file and line; never edits files."
config_file = "./agents/reviewer.toml" # a config layer, relative to this file
[goals]
max_goal_token_budget = 2000000 # nested subagent tokens count toward it

Zostaw default_subagent_model nieustawione, dopóki nie masz powodu. Codex domyślnie korzysta z GPT-6 Astra, a zasada tej dokumentacji brzmi: najpierw dostrój effort, dopiero potem zmieniaj model; aktualne modele Codex i ich ceny znajdziesz w przeglądzie modeli. Od wersji 0.151.0 tokeny zużyte przez zagnieżdżonych subagentów wliczają się do budżetu /goal, więc budżet celu ogranicza też rozproszenie pracy.

Tor, który wymaga ciężkiego buildu, działa długo albo ma kilka sensownych projektów rozwiązania, lepiej pasuje do zadania w chmurze niż do worktree na laptopie. Najpierw wypchnij gałąź fundamentu: codex cloud exec działa na bieżącej gałęzi, chyba że podasz --branch (sprawdzone w codex cloud exec --help, 0.157.1), a kontener klonuje repozytorium z remote’a.

Okno terminala
# run in your terminal, inside the repository
git push -u origin feature/notification-prefs
codex cloud exec --env ENV_ID --branch feature/notification-prefs --attempts 2 - < prompts/prefs-service.md
codex cloud list --env ENV_ID # watch progress
codex cloud diff TASK_ID --attempt 2 # compare attempts
# apply the chosen attempt inside the lane's own worktree, commit it, then gate it
git worktree add -b feat/prefs-service ../wt-prefs-service feature/notification-prefs
(cd ../wt-prefs-service && codex cloud apply TASK_ID --attempt 2 \
&& git add -A && git commit -m "prefs: service lane (cloud)")
./lane-gate.sh service "$SERVICE_PATHS" # the service lane's allowed-paths regex

ENV_ID to identyfikator lub etykieta środowiska w chmurze, a TASK_ID to identyfikator lub URL, który wypisuje codex cloud exec. codex cloud apply zapisuje diff w katalogu roboczym, w którym je uruchamiasz, więc uruchom je w worktree toru i zacommituj wynik przed bramką, która odrzuca niezacommitowane zmiany. Dzięki temu tor z chmury przechodzi tę samą bramkę co tor lokalny. Tor wysłany do chmury usuń z listy for lane in w fan-out.sh, inaczej oba sięgną po ten sam worktree. Konfigurację środowiska, dostęp do internetu i to, kiedy best-of-N jest wart swojej ceny, opisuje strona środowiska chmurowe Codex.

Liczbę agentów ustalaj według przepustowości code review, nie według tego, na co pozwala komputer albo plan. Raport Faros AI „AI Engineering Report 2026” (kwiecień 2026, telemetria od 22 000 programistów) pokazał wzrost przepustowości zadań na programistę o 33,7%, przy jednoczesnym wzroście mediany czasu w code review o 441,5% i liczby incydentów na pull request o 242,7%. Więcej generowania bez większej weryfikacji przesuwa kolejkę do code review, a koszt na produkcję.

Praktyczne limity, które z tego wynikają:

  • Zacznij od trzech torów. Czwarty dodaj dopiero wtedy, gdy bramki pierwszych trzech przechodzą bez poprawek. Pięć torów na programistę traktuj jako sufit, który trzeba uzasadnić, a nie cel.
  • Jeden właściciel scalania. Tory scala autor planu, bo kolejność scalania wynika z planu.
  • Budżet przed startem. Przed uruchomieniem partii sprawdź /usage w sesji, ustaw max_threads dla subagentów i budżet /goal na długich torach. Limity planów i ich okna pięciogodzinne i tygodniowe opisuje strona zarządzanie kosztami Codex.
ObjawPrzyczynaNaprawa
Konflikty w src/routes/index.ts lub innym pliku barrelKilka torów zarejestrowało się samodzielniePrzenieś rejestrację do fundamentu ze stubami, jak w prompcie fundamentu. Przy merge’u, który już ma konflikt, użyj promptu poniżej
Tory przechodzą osobno, a razem nieWspólny stan testów, stałe porty albo dwa tory zasilające tę samą tabelęDodaj brakujący test kontraktowy do fundamentu, odizoluj dane testowe per zestaw, uruchom integrację ponownie
Dwa tory nie zgadzają się co do kształtu odpowiedziKontrakt zostawiono agentomUmieść kształt w src/types/notifications.ts w fundamencie; dodaj do kolejki obu torów wiadomość, która na niego wskazuje
Bramka zgłasza pliki spoza toruW prompcie zabrakło „edytuj tylko” albo plan przeoczył wspólny plikOdeślij wynik bramki agentowi albo przenieś plik do fundamentu i zaplanuj od nowa
Torowi w chmurze brakuje fundamentuGałąź nie została wypchnięta albo --branch wskazywał innąWypchnij gałąź fundamentu i wyślij zadanie ponownie z --branch
npm ci lub buildy wyczerpują laptopaPięć worktree naraz instaluje i testujeRozłóż starty w czasie albo przenieś najcięższe tory do chmury
Tor utknął lub się zapętliłNiejasna definicja ukończenia albo pełne okno kontekstuZatrzymaj go w codex agents, doprecyzuj definicję ukończenia w prompcie toru i uruchom nową sesję w tym samym worktree
Stare worktree się mnożąKażdy tor zostawia worktree i gałąźPo scaleniu: git worktree remove ../wt-prefs-api, git branch -d feat/prefs-api, a potem git worktree prune