Pengaturan dan panggilan pertama
Ini adalah layanan independen yang kompatibel dengan OpenAI, bukan API Codex asli dari OpenAI. Model tunggalnya adalah open-weight, hanya teks, dan menangani kode dengan cukup baik untuk tugas generasi, penjelasan, dan refaktoring yang masih harus Anda tinjau. Jika Anda ingin latar belakang terlebih dahulu, halaman tentang OpenAI Codex API menjelaskan bagaimana keduanya berkaitan.
Instal SDK dengan pip install openai, buat kunci di halaman kunci API, dan jalankan:
# 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)Kredit uji coba pengguna baru senilai $0,50 mencakup ribuan panggilan kecil seperti ini. Suhu 0,2 karena kode mendapat manfaat dari lebih sedikit acak. Jika Anda melihat pembatas markdown di sekitar jawaban, hapus dalam kode atau minta teks mentah dalam pesan sistem. Halaman URL dasar, URL dasar API Codex, mencantumkan alamat pastinya lagi.
Prompting untuk kode yang berjalan
Beberapa kebiasaan meningkatkan output lebih dari parameter apa pun.
- Tentukan bahasa dan versinya. "Python 3.11, hanya pustaka standar" menghilangkan banyak tebak-tebakan.
- Beri tanda tangan. Tempel header fungsi dan docstring, dan minta model mengisi tubuh.
- Tampilkan satu contoh input dan output. Ini menentukan kasus tepi lebih baik daripada teks naratif.
- Minta satu hal. Hasilkan fungsinya, lalu minta tes dalam panggilan kedua.
- Minta diff untuk pengeditan. Penulisan ulang file penuh membakar token output, yang lebih mahal daripada input.
Jendela konteks adalah 100.000 token, dan max_tokens bersifat opsional. Untuk tugas kode, Anda dapat menempelkan beberapa modul dan masih memiliki ruang untuk balasan. Menetapkan max_tokens berguna hanya sebagai jaring pengaman terhadap output yang tidak terkendali.
Mode JSON untuk hasil terstruktur
Saat kode mengonsumsi jawaban, gunakan mode JSON. Ini membuat output JSON valid; ini tidak memaksakan skema Anda, jadi beri nama kunci dalam prompt dan periksa kunci tersebut.
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"])Pasang ini dengan try/except di sekitar json.loads dan satu kali percobaan ulang yang mengirimkan kesalahan parsing kembali. Dalam praktiknya, ini menangani respons yang jarang tidak sesuai format. Gunakan suhu 0 agar hasil berulang konsisten.
Pemanggilan alat
Dengan alat, Anda mendeskripsikan fungsi dan model memutuskan kapan memanggilnya. Anda menjalankan fungsi, lalu mengirim kembali output dengan peran tool. Ini adalah dasar dari setiap agen pemrograman.
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)Uji kode yang dihasilkan seperti kontribusi lain: jalankan, lint, dan simpan suite kecil prompt dengan output yang sudah diketahui benar agar Anda menyadari ketika perubahan prompt membuat hasil lebih buruk. Tetapkan seed dan suhu saat Anda membandingkan versi.
Catatan: pertahankan deskripsi fungsi pendek dan literal, validasi argumen sebelum menjalankan apa pun, dan jangan pernah meneruskan output model langsung ke shell. Untuk loop, ulangi panggilan selama tool_calls ada dan berhenti setelah jumlah langkah maksimum. Setiap langkah mengirim ulang riwayat, sehingga menjalankan sepuluh langkah memakan biaya sekitar sepuluh kali konteks.
Streaming dan percobaan ulang pada 429
Untuk alat interaktif, alirkan token saat tiba. Penggunaan ada di akhir streaming, yang memudahkan pencatatan biaya.
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.")Batas di balik loop retry itu: kunci penuh memungkinkan 8 permintaan paralel dan 300 per menit, dan kunci uji coba 2 dan 60. Di atas batas, Anda mendapatkan HTTP 429 dengan kode rate_limited atau concurrency. Beban berlebih sementara juga memberikan 429 dengan header Retry-After: 5. Contoh mengatur max_retries=0 pada klien sehingga loop Anda sendiri mengendalikan jeda. Permintaan streaming memegang slot konkurensinya hingga streaming selesai, jadi selalu konsumsi atau tutup streaming.
Menjalankan banyak permintaan sekaligus
Pekerjaan batch seperti menghasilkan pengujian untuk seratus fungsi membutuhkan batas concurrency. Gunakan kumpulan utas dengan maksimal 8 pekerja pada kunci penuh.
Pola sederhana adalah ThreadPoolExecutor(max_workers=6) di sekitar fungsi yang memanggil ask, meninggalkan dua slot tersedia untuk pekerjaan lain. Dengan kunci uji coba gunakan 2 pekerja. Jika Anda melewati angka yang lebih besar, API akan menjawab permintaan tambahan dengan kesalahan concurrency, dan loop retry Anda akan menghabiskan waktu menunggu alih-alih bekerja. Untuk kode asinkron, gunakan AsyncOpenAI dengan asyncio.Semaphore(6) di sekitar setiap panggilan; ini memberikan batas yang sama tanpa thread. Header respons X-RateLimit-Limit-Requests dan X-RateLimit-Limit-Concurrency menunjukkan batas untuk kunci Anda.
Biaya beban kerja pemrograman
Harganya adalah $0,15 per 1M token input dan $0,50 per 1M token output. Katakan Anda menghasilkan pengujian unit untuk 200 fungsi. Setiap panggilan mengirim 1.500 token input dan mengembalikan 700 token. Input: 200 x 1.500 = 300.000 token, atau $0,045. Output: 200 x 700 = 140.000 token, atau $0,07. Total: $0,115.
Refaktor file besar mengirim 30.000 token masuk dan 8.000 keluar: $0,0045 + $0,004 = $0,0085 per eksekusi. Permintaan gagal atau ditolak tidak dibebani biaya, dan saldo prabayar tidak pernah habis. Isi saldo dimulai dari $20 dan dapat dibayar dengan kartu atau kripto, dengan bonus 5% dari $50, 10% dari $100, dan 15% dari $200. Lihat harga, dan baca dokumentasi untuk daftar parameter lengkap.

