PL ▾
Pobierz klucz API

API Codex w Pythonie: Wywoływanie LLM do kodowania

Najprostsza konfiguracja codex api python to oficjalny pakiet openai wskazujący na inny base URL. Poniższe przykłady obejmują generowanie kodu, tryb JSON, wywoływanie funkcji i strumieniowanie dla tego endpointu kompatybilnego z OpenAI.

Zaktualizowano

Świecący kabel prowadzący przez bloki kodu do sześcianu serwera, ilustrujący wywołania Pythona w kierunku API LLM do kodowania
Świecący kabel łączący laptop z sześcianem serwera, ilustrujący wskazanie klienta na bazowy URL API

Kluczowe punkty

  • Zainstaluj pakiet openai, ustaw base_url na https://api.getcodexapi.com/v1 i model na uncensored.
  • Używaj niskiej temperatury (0 do 0.3) dla kodu i JSON, wyższej dla brainstormingu.
  • Wywoływanie funkcji, tryb JSON i strumieniowanie są obsługiwane; osadzanie (embeddings) nie.
  • Ogranicz konkurencję do 8 dla pełnego klucza i ponawiaj odpowiedzi 429 po krótkim oczekiwaniu.

Konfiguracja i pierwsze wywołanie

To niezależna usługa kompatybilna z OpenAI, a nie własne API Codex od OpenAI. Jego jedyny model jest open-weight, tylko tekstowy i wystarczająco dobrze radzi sobie z kodem do generowania, wyjaśniania i refaktoryzacji, które i tak powinieneś przeglądać. Jeśli chcesz poznać tło, strona o OpenAI Codex API wyjaśnia, jak się one odnoszą.

Zainstaluj SDK przez pip install openai, utwórz klucz na stronie kluczy API i uruchom:

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

Kredyt próbny dla nowych użytkowników w wysokości $0,50 pokrywa tysiące małych wywołań takich jak to. Temperatura wynosi 0.2, ponieważ kod czerpie korzyści z mniejszej losowości. Jeśli widzisz znacznik markdown wokół odpowiedzi, usuń go w kodzie lub poproś w wiadomości systemowej o tekst surowy. Strona base URL, Codex API base URL, ponownie wymienia dokładny adres.

Promptowanie dla kodu, który działa

Kilka nawyków poprawia wynik bardziej niż jakikolwiek parametr.

  • Podaj język i wersję. "Python 3.11, tylko biblioteka standardowa" eliminuje wiele zgadywania.
  • Podaj sygnaturę. Wklej nagłówek funkcji i docstring i poproś model o uzupełnienie ciała.
  • Pokaż jeden przykład wejścia i wyjścia. To precyzuje przypadki brzegowe lepiej niż opis słowny.
  • Poproś o jedną rzecz. Wygeneruj funkcję, a następnie poproś o testy w drugim wywołaniu.
  • Poproś o diff dla edycji. Przepisywanie całego pliku zużywa tokeny wyjściowe, które kosztują więcej niż wejściowe.

Okno kontekstu to 100 000 tokenów, a max_tokens jest opcjonalne. W zadaniu kodowym możesz wkleić kilka modułów i nadal mieć miejsce na odpowiedź. Ustawienie max_tokens jest przydatne tylko jako zapasowe zabezpieczenie przed niekontrolowanym wzrostem wyjścia.

Tryb JSON dla wyników strukturalnych

Gdy kod przetwarza odpowiedź, użyj trybu JSON. Sprawia to, że wynik jest poprawnym JSON-em; nie wymusza twojego schematu, więc nazwij klucze w promptcie i sprawdź je.

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

Połącz to z blokiem try/except wokół json.loads i jednym ponownym wysłaniem zapytania, które zwraca błąd parsowania. W praktyce obsługuje to rzadkie niepoprawne odpowiedzi. Użyj temperatury 0, aby powtarzane uruchomienia były zgodne.

Wywoływanie funkcji

Za pomocą narzędzi opisujesz funkcje, a model decyduje, kiedy je wywołać. Uruchamiasz funkcję, a następnie wysyłasz wynik z powrotem z rolą tool. To podstawa każdego agenta kodującego.

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)

Testuj wygenerowany kod jak każdą inną zmianę: uruchom go, poddaj lintowi i utrzymuj mały zestaw promptów z znanymi poprawnymi wynikami, aby zauważyć, gdy zmiana promptu pogarsza wyniki. Ustal seed i temperaturę podczas porównywania wersji.

Uwagi: trzymaj opisy narzędzi krótkie i dosłowne, waliduj argumenty przed uruchomieniem czegokolwiek i nigdy nie przekazuj wyjścia modelu bezpośrednio do powłoki. Dla pętli powtarzaj wywołanie, dopóki tool_calls jest obecne i zatrzymaj się po maksymalnej liczbie kroków. Każdy krok ponownie wysyła historię, więc dziesięciokrokowe uruchomienie kosztuje około dziesięciokrotności kontekstu.

Strumieniowanie i ponawianie przy 429

Dla narzędzi interaktywnych strumieniuj tokeny w miarę ich przybywania. Użycie pojawia się na końcu strumienia, co ułatwia logowanie kosztów.

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

Limity za tą pętlą ponawiania: pełny klucz pozwala na 8 równoległych zapytań i 300 na minutę, a klucz próbny na 2 i 60. Po przekroczeniu limitu otrzymasz HTTP 429 z kodem rate_limited lub concurrency. Tymczasowe przeciążenie daje również 429 z nagłówkiem Retry-After: 5. Przykład ustawia max_retries=0 po stronie klienta, więc twoja własna pętla kontroluje oczekiwania. Żądanie strumieniowe trzyma swój slot konkurencji do zakończenia strumienia, więc zawsze pobieraj lub zamykaj strumień.

Wysyłanie wielu zapytań naraz

Zadania wsadowe takie jak generowanie testów dla stu funkcji potrzebują ograniczenia konkurencji. Użyj puli wątków z maksymalnie 8 pracownikami dla pełnego klucza.

Prosty wzorzec to ThreadPoolExecutor(max_workers=6) wokół funkcji wywołującej ask, pozostawiającej dwa wolne sloty na inne zadania. Przy kluczu próbnym użyj 2 wątków. Jeśli podasz większą liczbę, API odpowie na dodatkowe zapytania błędami concurrency, a pętla ponownych prób spędzi czas na oczekiwaniu zamiast na pracy. Dla kodu asynchronicznego użyj AsyncOpenAI z asyncio.Semaphore(6) wokół każdego wywołania; daje to ten sam limit bez wątków. Nagłówki odpowiedzi X-RateLimit-Limit-Requests i X-RateLimit-Limit-Concurrency pokazują limity dla Twojego klucza.

Koszt obciążeń kodujących

Cena to $0,15 za 1M tokenów wejściowych i $0,50 za 1M tokenów wyjściowych. Powiedzmy, że generujesz testy jednostkowe dla 200 funkcji. Każde wywołanie wysyła 1 500 tokenów wejściowych i zwraca 700 tokenów. Wejście: 200 x 1 500 = 300 000 tokenów, czyli $0,045. Wyjście: 200 x 700 = 140 000 tokenów, czyli $0,07. Razem: $0,115.

Refaktoryzacja dużego pliku wysyła 30 000 tokenów i zwraca 8 000: $0,0045 + $0,004 = $0,0085 za uruchomienie. Nieudane lub odrzucone żądania nie są rozliczane, a kredyt nie wygasa. Doładowania zaczynają się od $20 i mogą być opłacone kartą lub kryptowalutami, z bonusem 5% od $50, 10% od $100 i 15% od $200. Zobacz cennik i przeczytaj dokumentację dla pełnej listy parametrów.

Pytania i odpowiedzi

Czy mogę użyć standardowego pakietu openai w Pythonie?

Tak. Ustaw base_url na https://api.getcodexapi.com/v1, przekaż swój klucz i użyj identyfikatora modelu uncensored.

Czy obsługuje wywoływanie funkcji z Pythona?

Tak. Przekaż tools i tool_choice, a następnie zwróć wyniki z rolą tool. Strumieniowane tool_calls również działają.

Jak uzyskać wynik strukturalny?

Użyj response_format z typem json_object, nazwij klucze w promptcie i zwaliduj wynik w kodzie.

Czy istnieje klient asynchroniczny?

Pakiet openai zapewnia AsyncOpenAI, który działa w ten sam sposób z tym base_url. Zachowaj konkurencję na poziomie 8 lub poniżej na pełnym kluczu.

Twój klucz jest o jeden formularz stąd

Utwórz konto, skopiuj klucz, zmień bazowy URL. To cała konfiguracja.

Pobierz klucz API