Richte mir codex-router ein, damit ich in Codex zusätzlich zu den nativen GPT-Modellen auch Fremdmodelle im selben Picker nutzen kann. Die GPTs sollen weiterhin über mein ChatGPT-Abo laufen, die Fremdmodelle über einen eigenen Key.
Erklär mir vorab in einem Satz, warum ein Router nötig ist: Codex kennt nur EIN globales model_provider, und die Katalogeinträge haben kein Provider-Feld. Ohne lokalen Dispatcher scheitert jedes Fremdmodell mit "not supported when using Codex with a ChatGPT account".
SCHRITT 0 — Bezahlung zuerst klären, sonst ist alles andere umsonst
Frag mich, BEVOR du irgendetwas installierst, ob beim gewünschten Anbieter bereits eine Zahlungsart oder ein aktives Abo hinterlegt ist. Bei OpenCode Go ist das zwingend: ohne Zahlungsart antwortet der Dienst mit CreditsError/401, und Codex zeigt das später als irreführendes "exceeded retry limit, last status: 429 Too Many Requests".
Sag mir das ausdrücklich und lass mich das im Browser erledigen. Frag mich NIEMALS nach Kreditkartendaten und trag selbst keine ein.
Sag mir auch, dass OpenCode Go regulär rund 10 $/Monat kostet, der erste Monat günstiger ist und es Referral-Guthaben gibt - bspw. über https://learn.ainauten.com/opencode. Die aktuellen Konditionen soll ich bei OpenCode selbst prüfen.
SCHRITT 1 — Provider und Key
Frag mich, welchen Anbieter ich anbinden will. Übliche Optionen: OpenCode Go/Zen, OpenRouter, DeepSeek, Kimi/Moonshot, Anthropic (nur Console-API-Key, das Claude-Abo ist in Drittanwendungen untersagt).
Frag danach nach dem Key. Schreib ihn NICHT in den Chatverlauf, nicht in Kommandozeilenargumente und nicht in Logs. Leg ihn in einer Datei mit Rechten 0600 ab.
Hinweis für OpenCode: Go (/zen/go/v1) ist der Plan-Endpunkt mit rund 25 günstigen Modellen. Zen (/zen/v1) rechnet pro Token ab und hat rund 60 Modelle inklusive Claude und Gemini. Derselbe Key gilt für beide. Frag mich, welchen ich will.
SCHRITT 2 — Repo holen und PINNEN
git clone https://github.com/duolahypercho/codex-router.git ~/.local/share/codex-router
cd ~/.local/share/codex-router
git log --oneline -1 # diesen Commit merken
git checkout <commit> # fest darauf pinnen, kein bewegliches main
SCHRITT 3 — Prüfbefunde erheben, KEIN Gesamturteil
Führ die folgenden Prüfungen aus und gib mir für JEDE den ROHBEFUND aus, nicht deine Einschätzung. Weicht ein Befund von der Erwartung ab, brich ab und sag es mir, statt weiterzumachen.
a) Alter und Aktivität
git log -1 --format='%H %ad %an'
git shortlog -sne | head
Erwartung: mehrere Beitragende, Commits der letzten Wochen.
b) Installations-Hooks, der häufigste Angriffsweg
node -e 'const p=require("./package.json");console.log(JSON.stringify(p.scripts))'
Erwartung: KEIN preinstall, install, postinstall, prepare.
Findest du eines: abbrechen und mir den Inhalt zeigen.
c) Abhängigkeiten
node -e 'const p=require("./package.json");console.log(Object.keys(p.dependencies||{}))'
Erwartung: sehr wenige. Bei mehr als 10 sag mir die Liste.
d) Netzwerkziele, wohin fließen meine Daten
grep -rhoE 'https?://[a-zA-Z0-9.-]+' src bin config | sort | uniq -c | sort -rn
Gib mir die vollständige Hostliste aus. Erwartung: ausschließlich bekannte Modellanbieter, Paketregistries und 127.0.0.1. Ist ein Host dabei, den du keinem Anbieter zuordnen kannst: abbrechen.
e) Verschleierung und dynamische Ausführung
grep -rn 'eval(\|new Function\|atob(\|fromCharCode' src bin
Erwartung: keine Treffer.
f) Telemetrie
grep -rniE 'telemetry|analytics|posthog|sentry|mixpanel|segment\.io' src bin
Erwartung: keine Treffer, die Daten VERSENDEN. Treffer, die Telemetrie abschalten, sind in Ordnung. Unterscheide das und zeig mir die Zeile.
g) Umgang mit meinem Key
grep -rn 'chmod\|0o600\|0o700' src | head
Erwartung: Key-Dateien mit 0600.
h) CI-Hygiene
grep -n 'pull_request_target' .github/workflows/*.yml
Erwartung: keine Treffer. Dieser Trigger kann Secrets an fremde Pull Requests geben.
Fass danach in maximal fünf Zeilen zusammen, was du TATSÄCHLICH GESEHEN hast. Schreib ausdrücklich dazu: "Das sind mechanische Stichproben, kein vollständiges Sicherheitsaudit. Sie finden grobe Auffälligkeiten, aber keine subtile Hintertür." Behaupte NICHT, das Repo sei sicher. Behaupte nicht, du hättest den Code gelesen, wenn du nur diese Greps ausgeführt hast.
SCHRITT 4 — Backup
Zeitgestempelte Kopie von ~/.codex/config.toml anlegen, Pfad und Rollback-Befehl nennen, BEVOR irgendetwas installiert wird.
SCHRITT 5 — Installieren
Führ ./install.sh aus dem gepinnten Checkout aus, mit --no-tray und den gewünschten Provider-IDs. Der Router legt selbst einen Schnappschuss unter config.toml.pre-codex-router an. Zeig mir die Ausgabe vollständig. Das Skript installiert ein Python-Venv mit LiteLLM. Sag mir das vorher und lass MICH den Befehl bestätigen, statt ihn ungefragt zu starten.
SCHRITT 5b — Wenn der LiteLLM-Start scheitert
Meldet das Log "LiteLLM gateway exited before becoming healthy", schau vor allem anderen nach einer .env-Kollision. LiteLLM lädt python-dotenv, und find_dotenv() läuft vom Arbeitsverzeichnis nach OBEN, erwischt also auch eine globale ~/.env. Ein DATABASE_URL mit einem anderen Schema als postgresql:// lässt LiteLLM sofort abbrechen. Prüf das so:
cd <router-verzeichnis>
.venv/bin/python -c "from dotenv import find_dotenv, load_dotenv; import os; \
print(find_dotenv(usecwd=True)); load_dotenv(); print(repr(os.environ.get('DATABASE_URL')))"
Zeigt das auf eine fremde .env, leg eine .env im Router-Verzeichnis an, die NUR Kommentare enthält. Sie wird zuerst gefunden und beendet die Suche nach oben. Trag darin KEIN "DATABASE_URL=" ein, auch nicht leer: ein leerer Wert gilt als gesetzt und scheitert dann mit "unsupported scheme '<missing scheme>'". Die Variable muss vollständig ungesetzt bleiben.
Trag ".env" in .git/info/exclude ein statt in .gitignore, damit der Checkout sauber bleibt und Update-Prüfungen nicht anschlagen.
SCHRITT 6 — Auto-Update ausdrücklich verhindern
Der Router bringt bin/update mit, das von main nachzieht. Richte das NICHT als Cron, Hook oder Autostart ein. Sag mir stattdessen: dass jedes Update den geprüften Stand verlässt, dass ich vor jedem Update Schritt 3 erneut laufen lassen sollte, und mit welchem Befehl ich auf den geprüften Commit zurückkehre. Prüf auch, ob check_for_update_on_startup in meiner config.toml aktiv ist, und frag mich, ob ich das abschalten will.
SCHRITT 7 — Beide Richtungen verifizieren
codex debug models
Die Anzahl muss gestiegen sein, und die nativen GPT-Modelle müssen weiterhin gelistet sein.
Dann zwei echte Testläufe: einer mit dem billigsten Fremdmodell, einer mit einem nativen GPT-Modell. BEIDE müssen Text zurückliefern. Erst dann ist die Einrichtung fertig.
Melde sonst offen, was nicht geht, und unterscheide dabei sauber zwischen drei Fehlerarten, statt alles als "geht nicht" zu melden:
- Codex-seitig: "not supported when using Codex with a ChatGPT account"
-> Routing greift nicht, der Request ging an OpenAI statt an den Router.
- Anbieter-seitig, inhaltlich: 401/403 mit CreditsError, fehlender Zahlungsart oder verlangtem Opt-in
-> die Kette funktioniert, das Konto ist nicht freigeschaltet. Gib mir die Roh-Fehlermeldung samt Link.
- Transport: "OutputTextDelta without active item"
-> Antwortformat des Anbieters passt nicht zu Codex.
Frag mich NICHT nach Zahlungsdaten und hinterleg keine. Gib mir den Link und lass mich das selbst im Browser erledigen.
SCHRITT 8 — Übergabe und Bedienfallen
Nenn mir den gepinnten Commit, den Rollback-Befehl aus Schritt 4, wie ich den Router stoppe und wie ich ihn vollständig wieder entferne. Warn mich ausdrücklich vor diesen zwei Bedienfallen, beide sind in der Praxis aufgetreten:
1) DOPPELGÄNGER IM PICKER. Der Router kann Fremdvarianten von Modellen anbieten, die fast wie die nativen heißen, zum Beispiel "GPT-5.6-Luna" (nativ, über mein Abo) gegenüber "GPT 5.6 Luna (opencode Go)" (geroutet, kostenpflichtig). Zeig mir eine Tabelle aus Slug und Anzeigename, damit ich sie auseinanderhalten kann. Alles mit Anbieternamen in Klammern kostet extra. Frag mich, ob ich geroutete Duplikate nativer Modelle aus dem Katalog nehmen will, sie bringen mir nichts.
2) MODELL NICHT MITTEN IM GESPRÄCH WECHSELN. Die serverseitige Gesprächsverdichtung läuft über chatgpt_base_url und damit AM Router VORBEI. Sie trägt den zuvor gewählten Modellnamen weiter und scheitert dann bei OpenAI mit "The '<modell>' model is not supported when using Codex with a ChatGPT account", auch wenn inzwischen ein anderes Modell eingestellt ist. Für ein anderes Modell ein neues Gespräch öffnen.
Melde am Ende nur, was du tatsächlich verifiziert hast, mit dem jeweiligen Beleg. Rate nichts und beschönige nichts.