NL ▾
API-sleutel aanvragen

Codex API in Python: een code-LLM aanroepen

De eenvoudigste codex api python setup is het officiële openai-pakket dat wijst naar een andere base URL. De onderstaande voorbeelden behandelen codegeneratie, JSON-modus, toolaanroepen en streaming tegen dit OpenAI-compatible endpoint.

Bijgewerkt

Een gloeiende kabel die door codeblokken naar een servercube kronkelt, ter illustratie van Python-aanroepen naar een code-LLM API
Een gloeiende kabel die een laptop verbindt met een serverblok, ter illustratie van het wijzen van een client naar een API-basis-URL

Belangrijkste punten

  • Installeer het openai-pakket, stel base_url in op https://api.getcodexapi.com/v1 en model op uncensored.
  • Gebruik een lage temperature (0 tot 0,3) voor code en JSON, hoger voor brainstormsessies.
  • Toolaanroepen, JSON-modus en streaming worden ondersteund; embeddings niet.
  • Beperk de gelijktijdige verzoeken tot 8 met een volledige sleutel en probeer 429-responses opnieuw na een korte wachttijd.

Instellen en een eerste verzoek

Dit is een onafhankelijke OpenAI-compatibele service, geen eigen Codex API van OpenAI. Het enige model is open-weight, alleen tekst, en behandelt code goed genoeg voor generatie, uitleg en refactoringtaken die je toch moet controleren. Als je eerst de achtergrond wilt, legt de pagina over de OpenAI Codex API uit hoe de twee met elkaar samenhangen.

Installeer de SDK met pip install openai, maak een sleutel aan op de API-sleutel-pagina en voer uit:

# 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)

Het trial tegoed van nieuwe gebruikers van $0,50 dekt duizenden kleine aanroepen zoals deze. Temperature is 0,2 omdat code baat heeft bij minder willekeur. Als je een markdown fence rond het antwoord ziet, verwijder het dan in code of vraag in het system message om ruwe tekst. De base URL-pagina, Codex API base URL, vermeldt het exacte adres opnieuw.

Prompten voor werkende code

Enkele gewoonten verbeteren de output meer dan elke parameter.

  • Noem de taal en versie. "Python 3.11, alleen standaardbibliotheek" elimineert veel radenwerk.
  • Geef de signature. Plak de functieheader en een docstring, en vraag het model om de body in te vullen.
  • Toon één voorbeeld van input en output. Het beperkt randgevallen beter dan prose.
  • Vraag om één ding. Genereer de functie en vraag daarna in een tweede aanroep om tests.
  • Vraag om een diff voor wijzigingen. Het opnieuw schrijven van het hele bestand verbruikt output tokens, die duurder zijn dan input.

Het contextvenster is 100.000 tokens, en max_tokens is optioneel. Voor een codetaak kun je meerdere modules plakken en toch ruimte overhouden voor het antwoord. Het instellen van max_tokens is alleen nuttig als veiligheidsnet tegen onbeheerst output.

JSON-modus voor gestructureerde resultaten

Wanneer code het antwoord consumeert, gebruik dan JSON-modus. Het maakt de output geldige JSON; het afdwingt je schema niet, dus noem de sleutels in de prompt en controleer ze.

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"])

Combineer dit met een try/except rond json.loads en één retry die de parse-fout terugstuurt. In de praktijk lost dit zelden voorkomende malformed responses op. Gebruik temperature 0 zodat herhaalde runs overeenkomen.

Function calling

Met tools beschrijf je functies en het model beslist wanneer ze aan te roepen. Je voert de functie uit en stuurt de output terug met de tool role. Dit is de basis van elke coding agent.

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)

Test gegenereerde code als elke andere bijdrage: voer hem uit, lint hem en houd een kleine suite van prompts met known-good outputs bij, zodat je merkt wanneer een promptwijziging de resultaten verslechtert. Vast seed en temperature terwijl je versies vergelijkt.

Opmerkingen: houd tool descriptions kort en letterlijk, valideer arguments voordat je iets uitvoert en voer model output nooit direct in een shell. Herhaal de aanroep in een loop zolang tool_calls aanwezig is en stop na een maximum aantal stappen. Elke stap verstuurt de history opnieuw, dus een run van tien stappen betaalt voor ongeveer tien keer de context.

Streaming en retry bij 429

Voor interactieve tools stream je tokens zoals ze binnenkomen. Gebruik staat aan het einde van de stream, wat het loggen van kosten eenvoudig maakt.

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.")

De limieten achter die retry loop: een volledige key staat 8 gelijktijdige verzoeken en 300 per minuut toe, en een trial key 2 en 60. Bij overschrijding krijg je HTTP 429 met code rate_limited of concurrency. Tijdelijke overbelasting geeft ook 429 met een Retry-After: 5 header. De voorbeeldcode stelt max_retries=0 in op de client, zodat jouw eigen loop de wachtijden regelt. Een gestreamd verzoek houdt zijn concurrency slot vast tot de stream klaar is, dus consumeer of sluit de stream altijd.

Veel verzoeken tegelijk uitvoeren

Batch jobs zoals het genereren van tests voor honderd functies hebben een concurrency cap nodig. Gebruik een thread pool met maximaal 8 workers met een volledige key.

Een eenvoudig patroon is ThreadPoolExecutor(max_workers=6) rond een functie die ask aanroept, waardoor twee slots vrij blijven voor ander werk. Gebruik met de trial key 2 workers. Als je een groter getal doorgeeft, beantwoordt de API extra verzoeken met concurrency fouten, en zal je retry loop tijd besteden aan wachten in plaats van werken. Voor async code gebruik je AsyncOpenAI met een asyncio.Semaphore(6) rond elke aanroep; dit geeft dezelfde cap zonder threads. De response headers X-RateLimit-Limit-Requests en X-RateLimit-Limit-Concurrency tonen de limieten voor jouw key.

Kosten van codeworkloads

De prijs is $0,15 per 1M input tokens en $0,50 per 1M output tokens. Stel dat je unit tests genereert voor 200 functies. Elke aanroep stuurt 1.500 input tokens en retourneert 700 tokens. Input: 200 x 1.500 = 300.000 tokens, oftewel $0,045. Output: 200 x 700 = 140.000 tokens, oftewel $0,07. Totaal: $0,115.

Een refactor van een groot bestand stuurt 30.000 tokens in en 8.000 uit: $0,0045 + $0,004 = $0,0085 per run. Mislukte of geweigerde verzoeken worden niet in rekening gebracht, en tegoed verloopt nooit. Opwaarderingen beginnen bij $20 en kunnen worden betaald met kaart of crypto, met een bonus van 5% vanaf $50, 10% vanaf $100 en 15% vanaf $200. Zie prijzen, en lees de docs voor de volledige parameterlijst.

Vragen en antwoorden

Kan ik het standaard openai Python-pakket gebruiken?

Ja. Stel base_url in op https://api.getcodexapi.com/v1, voer je sleutel in en gebruik het model ID uncensored.

Wordt function calling vanuit Python ondersteund?

Ja. Geef tools en tool_choice door, en retourneer resultaten met de tool-rol. Gestreamde tool_calls werken ook.

Hoe krijg ik gestructureerde output?

Gebruik response_format met type json_object, noem de sleutels in je prompt en valideer het resultaat in code.

Is er een async client?

Het openai-pakket biedt AsyncOpenAI, dat op dezelfde manier werkt met deze base URL. Houd het aantal gelijktijdige verzoeken op of onder 8 met een volledige sleutel.

Je sleutel is nog maar één formulier verwijderd

Maak een account aan, kopieer de sleutel, pas de base URL aan. Dat is de hele configuratie.

API-sleutel aanvragen