Einrichtung und ein erster Aufruf
Dies ist ein unabhängiger OpenAI-kompatibler Dienst, nicht die eigene Codex-API von OpenAI. Das einzige Modell ist Open-Weight, textbasiert und verarbeitet Code gut genug für Generierungs-, Erklärungs- und Refactoring-Aufgaben, die du dennoch überprüfen solltest. Wenn du den Hintergrund zuerst wissen möchtest, erklärt die Seite zur OpenAI Codex API, wie die beiden zusammenhängen.
Installiere das SDK mit pip install openai, erstelle einen Schlüssel auf der API-Schlüssel-Seite und führe aus:
# pip install openai
from openai import OpenAI
client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY")
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a senior Python developer. Reply with code only, no commentary."},
{"role": "user", "content": "Write a function that parses an ISO 8601 date string and returns a datetime."},
],
temperature=0.2,
)
print(resp.choices[0].message.content)Das Testguthaben von $0,50 für neue Nutzer deckt Tausende kleiner Aufrufe wie diesen ab. Die Temperatur beträgt 0,2, da Code von weniger Zufälligkeit profitiert. Wenn du eine Markdown-Umrandung um die Antwort siehst, entferne sie im Code oder bitte im System-Prompt um Rohtext. Die Base URL-Seite, Codex API Base URL, listet die genaue Adresse erneut auf.
Prompting für ausführbaren Code
Einige Gewohnheiten verbessern die Ausgabe mehr als jeder Parameter.
- Gib die Sprache und Version an. "Python 3.11, nur Standardbibliothek" entfernt viel Raten.
- Gib die Signatur an. Füge die Funktionssignatur und ein Docstring ein und bitte das Modell, den Körper auszufüllen.
- Zeige ein Beispiel für Eingabe und Ausgabe. Es grenzt Randfälle besser ein als Fließtext.
- Frag nach einer Sache. Generiere die Funktion und bitte dann in einem zweiten Aufruf um Tests.
- Fordere einen Diff für Änderungen an. Whole-File-Überschreibungen verbrauchen Output-Token, die mehr kosten als Input.
Das Kontextfenster hat 100.000 Token, und max_tokens ist optional. Für eine Codeaufgabe kannst du mehrere Module einfügen und hast immer noch Platz für die Antwort. Das Setzen von max_tokens ist nur als Sicherheitsnetz gegen unkontrollierte Ausgaben nützlich.
JSON-Modus für strukturierte Ergebnisse
Wenn Code die Antwort verbraucht, verwende den JSON-Modus. Er macht die Ausgabe zu gültigem JSON; er erzwingt dein Schema nicht, also benenne die Schlüssel im Prompt und überprüfe sie.
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY")
resp = client.chat.completions.create(
model="uncensored",
response_format={"type": "json_object"},
messages=[
{"role": "system", "content": "Return JSON with keys: name, args (list of strings), returns."},
{"role": "user", "content": "Describe the signature of: def clamp(x, lo, hi)."},
],
temperature=0,
)
data = json.loads(resp.choices[0].message.content)
print(data["name"], data["args"])Kombiniere dies mit einem try/except um json.loads und einem einzelnen Retry, der den Parse-Fehler zurücksendet. In der Praxis behebt das seltene fehlerhafte Antworten. Verwende Temperatur 0, damit wiederholte Läufe übereinstimmen.
Function Calling
Mit Tools beschreibst du Funktionen und das Modell entscheidet, wann es sie aufrufen soll. Du führst die Funktion aus und sendest dann die Ausgabe mit der tool-Rolle zurück. Dies ist die Grundlage jedes Coding-Agents.
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY")
tools = [{
"type": "function",
"function": {
"name": "run_tests",
"description": "Run the project's test suite and return the output.",
"parameters": {
"type": "object",
"properties": {"path": {"type": "string"}},
"required": ["path"],
},
},
}]
messages = [{"role": "user", "content": "Run the tests in tests/unit and tell me what failed."}]
first = client.chat.completions.create(model="uncensored", messages=messages, tools=tools, tool_choice="auto")
msg = first.choices[0].message
if msg.tool_calls:
call = msg.tool_calls[0]
args = json.loads(call.function.arguments)
output = "2 passed, 1 failed: test_parse_empty" # replace with a real runner
messages.append(msg)
messages.append({"role": "tool", "tool_call_id": call.id, "content": output})
final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
print(final.choices[0].message.content)Teste generierten Code wie jeden anderen Beitrag: führe ihn aus, lints ihn und halte eine kleine Suite von Prompts mit bekannten guten Ausgaben bereit, damit du bemerkst, wenn eine Prompt-Änderung die Ergebnisse verschlechtert. Pinne seed und Temperatur, während du Versionen vergleichst.
Hinweise: Halte Tool-Beschreibungen kurz und wörtlich, validiere Argumente, bevor du etwas ausführst, und übergebe Modellausgaben niemals direkt in eine Shell. Wiederhole für eine Schleife den Aufruf, solange tool_calls vorhanden ist, und stoppe nach einer maximalen Anzahl von Schritten. Jeder Schritt sendet den Verlauf erneut, also zahlt ein zehn-Schritte-Lauf für etwa das Zehnfache des Kontexts.
Streaming und Retry bei 429
Streaming von Tokens für interaktive Tools, sobald sie eintreffen. Die Nutzung kommt am Ende des Streams, was das Kosten-Logging einfach macht.
import time
from openai import OpenAI, RateLimitError
client = OpenAI(base_url="https://api.getcodexapi.com/v1", api_key="YOUR_KEY", max_retries=0)
def ask(prompt, tries=4):
for attempt in range(tries):
try:
stream = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": prompt}],
stream=True,
stream_options={"include_usage": True},
)
text = []
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
piece = chunk.choices[0].delta.content
text.append(piece)
print(piece, end="", flush=True)
if chunk.usage:
print("\ntokens:", chunk.usage.prompt_tokens, chunk.usage.completion_tokens)
return "".join(text)
except RateLimitError:
time.sleep(5 * (attempt + 1))
raise RuntimeError("still rate limited")
ask("Explain Python generators in four sentences.")Die Limits hinter dieser Retry-Schleife: Ein vollständiger Schlüssel erlaubt 8 parallele Anfragen und 300 pro Minute, ein Trial-Schlüssel 2 und 60. Über einem Limit erhältst du HTTP 429 mit Code rate_limited oder concurrency. Temporäre Überlastung gibt ebenfalls 429 mit einem Retry-After: 5-Header. Das Beispiel setzt max_retries=0 auf dem Client, damit deine eigene Schleife die Wartezeiten steuert. Eine gestreamte Anfrage belegt ihren Concurrency-Slot, bis der Stream endet, also konsumiere oder schließe den Stream immer.
Viele Anfragen gleichzeitig ausführen
Batch-Jobs wie die Generierung von Tests für hundert Funktionen benötigen eine Concurrency-Begrenzung. Verwende einen Thread-Pool mit maximal 8 Workern bei einem vollständigen Schlüssel.
Ein einfaches Muster ist ThreadPoolExecutor(max_workers=6) um eine Funktion, die ask aufruft, und lasse zwei Slots für andere Arbeiten frei. Verwende mit dem Trial-Schlüssel 2 Worker. Wenn du eine größere Zahl übergibst, antwortet die API zusätzliche Anfragen mit concurrency-Fehlern, und deine Retry-Schleife verbringt Zeit mit Warten statt mit Arbeiten. Für Async-Code verwende AsyncOpenAI mit einem asyncio.Semaphore(6) um jeden Aufruf; es gibt dieselbe Begrenzung ohne Threads. Die Antwort-Header X-RateLimit-Limit-Requests und X-RateLimit-Limit-Concurrency zeigen die Limits für deinen Schlüssel an.
Kosten von Coding-Arbeitslasten
Der Preis beträgt $0,15 pro 1M Input-Token und $0,50 pro 1M Output-Token. Angenommen, du generierst Unit-Tests für 200 Funktionen. Jeder Aufruf sendet 1.500 Input-Token und gibt 700 Token zurück. Input: 200 x 1.500 = 300.000 Token, oder $0,045. Output: 200 x 700 = 140.000 Token, oder $0,07. Gesamt: $0,115.
Ein Refactoring einer großen Datei sendet 30.000 Token ein und 8.000 aus: $0,0045 + $0,004 = $0,0085 pro Lauf. Fehlgeschlagene oder abgelehnte Anfragen werden nicht berechnet, und Guthaben verfällt nie. Aufladungen beginnen bei $20 und können mit Karte oder Krypto bezahlt werden, mit einem Bonus von 5 % ab $50, 10 % ab $100 und 15 % ab $200. Siehe Preise und lies die Dokumentation für die vollständige Parameterliste.

