Kurulum ve ilk istek
Bu bağımsız bir OpenAI uyumlu servistir, OpenAI'ın kendi Codex API'si değildir. Tek modeli açık ağırlıklıdır, yalnızca metin içerir ve kodu yeterince iyi yönetir; bu nedenle oluşturma, açıklama ve yeniden düzenleme görevleri için hala gözden geçirmeniz gerekir. İsterseniz önce arka planı öğrenmek için OpenAI Codex API sayfası iki modelin nasıl ilişkili olduğunu açıklar.
SDK'yı pip install openai ile yükleyin, API anahtarı sayfasından bir anahtar oluşturun ve çalıştırın:
# 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)Yeni kullanıcıların $0,50 değerindeki deneme kredisi, bu tür binlerce küçük çağrıyı karşılar. Kod daha az rastgelelikten yarar aldığı için sıcaklık 0.2'dir. Cevabın etrafında bir markdown fence görürseniz, kodda bunu kaldırın veya ham metin için sistem mesajında isteyin. Codex API base URL sayfası tam adresi tekrar listeler.
Çalışan kod için istem yazma
Çıktıyı geliştirmek için herhangi bir parametreden daha etkili olan birkaç alışkanlık vardır.
- Dili ve sürümü belirtin. "Python 3.11, yalnızca standart kütüphane" tahmin etme ihtiyacını büyük ölçüde azaltır.
- İmzayı verin. İşlev başlığını ve bir docstring yapıştırın ve modelden gövdeyi doldurmasını isteyin.
- Bir örnek girdi ve çıktı gösterin. Bu, metinden daha iyi kenar durumları belirler.
- Tek bir şey isteyin. İşlevi oluşturun, ardından ikinci bir çağrıda testleri isteyin.
- Düzenlemeler için bir diff isteyin. Tüm dosya yeniden yazmaları çıktı tokenlarını tüketir; bu da girdiden daha pahalıdır.
Bağlam penceresi 100.000 token boyutundadır ve max_tokens isteğe bağlıdır. Bir kod görevi için birkaç modül yapıştırıp hala yanıt için yer bırakabilirsiniz. max_tokens ayarlamak, kontrolsüz çıktılara karşı bir güvenlik ağı olarak yalnızca yararlıdır.
Yapılandırılmış sonuçlar için JSON modu
Kod cevabı tükettiğinde JSON modunu kullanın. Bu, çıktıyı geçerli JSON yapar; şemanızı zorlamaz, bu nedenle anahtarları isteminizde adlandırın ve bunları kontrol edin.
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"])Bunu try/except bloğu ile json.loads etrafında eşleştirin ve hata mesajını geri gönderen tek bir yeniden deneme ekleyin. Bu, nadir bozuk yanıtları pratikte çözer. Tekrarlanan çalıştırmaların eşleşmesi için sıcaklığı 0 olarak ayarlayın.
Araç çağırma
Araçlarla işlevleri tanımlersiniz ve model ne zaman çağıracak olduğuna karar verir. İşlevi siz çalıştırırsınız, ardından çıktıyı tool rolü ile geri gönderirsiniz. Bu, her kodlama ajanının temelidir.
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)Oluşturulan kodu diğer katkılar gibi test edin: çalıştırın, lintleyin ve bir istem değişikliğinin sonuçları kötüleştirdiğinde fark etmeniz için bilinen iyi çıktılara sahip küçük bir istem paketi tutun. Sürümleri karşılaştırırken seed ve sıcaklığı sabitleyin.
Notlar: araç açıklamalarını kısa ve doğrudan tutun, bir şey çalıştırmadan önce argümanları doğrulayın ve model çıktısını doğrudan bir kabuğa geçirmeyin. Bir döngü için, tool_calls mevcut olduğu sürece çağrıyı tekrarlayın ve maksimum adım sayısından sonra durun. Her adım geçmişi yeniden gönderir, bu nedenle on adımlı bir çalışma yaklaşık olarak on kat bağlam için ödeme yapar.
Akış ve 429 hatası durumunda yeniden deneme
Etkileşimli araçlar için tokenlar geldikçe akış yapın. Kullanım bilgisi akışın sonunda gelir, bu da maliyet loglamasını kolaylaştırır.
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.")Yeniden deneme döngüsünün arkasındaki limitler: tam anahtar 8 eşzamanlı istek ve dakikada 300 izin verir; deneme anahtarı ise 2 ve 60 izin verir. Bir limiti aştığınızda, kodu rate_limited veya concurrency olan HTTP 429 alırsınız. Geçici aşırı yüklenme de Retry-After: 5 başlığı ile 429 verir. Örnek, istemcide max_retries=0 ayarlar böylece bekleme sürelerini kendi döngünüz kontrol eder. Akışlı bir istek, akış bitene kadar eşzamanlılık slotunu tutar, bu nedenle akışı her zaman tüketin veya kapatın.
Aynı anda çok sayıda istek gönderme
Yüz işlev için testler oluşturma gibi toplu işler için bir eşzamanlılık sınırı gerekir. Tam anahtarınızda en fazla 8 işçi ile bir iş parçacığı havuzu kullanın.
Basit bir desen, ask çağıran bir işlevin etrafında ThreadPoolExecutor(max_workers=6) kullanmaktır; bu, diğer işler için iki slot boş bırakır. Deneme anahtarı ile 2 işçi kullanın. Daha büyük bir sayı geçerseniz, API ek istekleri concurrency hataları ile yanıt verir ve yeniden deneme döngünüz çalışmak yerine bekleme süresi harcar. Asenkron kod için, her çağrının etrafında asyncio.Semaphore(6) ile AsyncOpenAI kullanın; bu, iş parçacıkları olmadan aynı sınırı sağlar. X-RateLimit-Limit-Requests ve X-RateLimit-Limit-Concurrency yanıt başlıkları anahtarınız için limitleri gösterir.
Kodlama iş yüklerinin maliyeti
Fiyat 1M girdi tokenı başına $0,15 ve 1M çıktı tokenı başına $0,50'dir. Diyelim ki 200 işlev için birim testler oluşturuyorsunuz. Her çağrı 1.500 girdi tokenı gönderir ve 700 token döndürür. Girdi: 200 x 1.500 = 300.000 token veya $0,045. Çıktı: 200 x 700 = 140.000 token veya $0,07. Toplam: $0,115.
Büyük bir dosyanın refaktörlemesi 30.000 token girdisi ve 8.000 token çıktısı gönderir: çalış başına $0,0045 + $0,004 = $0,0085. Başarısız veya reddedilen istekler için ücret alınmaz ve kredi hiç sona ermez. Bakiye yükleme işlemleri $20'den başlar ve kart veya kripto ile yapılabilir; $50'den itibaren %5, $100'den itibaren %10 ve $200'den itibaren %15 bonus sağlanır. fiyatlandırma sayfasına bakın ve tam parametre listesi için dokümantasyon sayfasını okuyun.

