Thiết lập và cuộc gọi đầu tiên
Đây là dịch vụ tương thích OpenAI độc lập, không phải API Codex chính thức của OpenAI. Mô hình đơn của nó là mô hình trọng số mở, chỉ văn bản và xử lý mã đủ tốt cho các tác vụ tạo mã, giải thích và tái cấu trúc mà bạn vẫn nên xem lại. Nếu bạn muốn tìm hiểu trước, trang về API Codex của OpenAI giải thích mối quan hệ giữa hai bên.
Cài đặt SDK với pip install openai, tạo khóa trên trang khóa API và chạy:
# 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)Tín dụng dùng thử $0,50 cho người dùng mới bao gồm hàng nghìn lệnh gọi nhỏ như thế này. Nhiệt độ là 0,2 vì mã nguồn hưởng lợi từ ít ngẫu nhiên hơn. Nếu bạn thấy một khối mã bao quanh câu trả lời, hãy loại bỏ nó trong mã hoặc yêu cầu văn bản thô trong thông điệp hệ thống. Trang Base URL, Base URL API Codex, liệt kê lại địa chỉ chính xác.
Prompting cho mã chạy được
Một vài thói quen cải thiện đầu ra nhiều hơn bất kỳ tham số nào.
- Chỉ rõ ngôn ngữ và phiên bản. "Python 3.11, chỉ thư viện chuẩn" loại bỏ nhiều suy đoán.
- Cung cấp chữ ký. Dán phần đầu hàm và docstring, và yêu cầu mô hình điền vào thân hàm.
- Hiển thị một ví dụ đầu vào và đầu ra. Nó xác định rõ các trường hợp biên tốt hơn lời văn.
- Yêu cầu một việc. Tạo hàm, sau đó yêu cầu kiểm thử trong một lệnh gọi thứ hai.
- Yêu cầu diff để chỉnh sửa. Ghi lại toàn bộ tệp làm tiêu hao token đầu ra, vốn đắt hơn đầu vào.
Cửa sổ ngữ cảnh là 100.000 token, và max_tokens là tùy chọn. Đối với một nhiệm vụ lập trình, bạn có thể dán nhiều mô-đun và vẫn còn chỗ cho câu trả lời. Việc đặt max_tokens chỉ hữu ích như một mạng an toàn chống lại đầu ra chạy không kiểm soát.
Chế độ JSON cho kết quả có cấu trúc
Khi mã tiêu thụ câu trả lời, hãy sử dụng chế độ JSON. Nó làm cho đầu ra là JSON hợp lệ; nó không thực thi lược đồ của bạn, vì vậy hãy đặt tên các khóa trong prompt và kiểm tra chúng.
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"])Kết hợp điều này với một khối try/except xung quanh json.loads và một lần thử lại duy nhất gửi lỗi phân tích cú pháp trở lại. Trong thực tế, điều đó xử lý phản hồi bị lỗi hiếm gặp. Sử dụng nhiệt độ 0 để các lần chạy lặp lại khớp nhau.
Gọi hàm
Với các công cụ, bạn mô tả các hàm và mô hình quyết định khi nào gọi chúng. Bạn chạy hàm, sau đó gửi kết quả trở lại với vai trò tool. Đây là nền tảng của mọi tác nhân lập trình.
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)Kiểm tra mã được tạo giống như bất kỳ đóng góp nào khác: chạy nó, kiểm tra cú pháp và giữ một bộ nhỏ các prompt với đầu ra đã biết là đúng để bạn nhận ra khi thay đổi prompt làm kết quả tệ đi. Ghim seed và nhiệt độ trong khi bạn so sánh các phiên bản.
Lưu ý: giữ mô tả công cụ ngắn gọn và sát nghĩa, xác thực đối số trước khi chạy bất cứ thứ gì, và không bao giờ chuyển trực tiếp đầu ra mô hình vào shell. Đối với vòng lặp, lặp lại lệnh gọi trong khi tool_calls tồn tại và dừng sau một số bước tối đa. Mỗi bước gửi lại lịch sử, vì vậy một vòng lặp 10 bước tốn chi phí tương đương khoảng 10 lần ngữ cảnh.
Truyền phát và thử lại trên 429
Đối với các công cụ tương tác, hãy truyền phát token khi chúng đến. Dữ liệu sử dụng ở cuối luồng, giúp việc ghi nhật ký chi phí trở nên dễ dàng.
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.")Các giới hạn đằng sau vòng lặp thử lại đó: một khóa đầy đủ cho phép 8 yêu cầu đồng thời và 300 mỗi phút, và một khóa dùng thử là 2 và 60. Vượt quá giới hạn, bạn nhận được HTTP 429 với mã rate_limited hoặc concurrency. Quá tải tạm thời cũng đưa ra 429 với tiêu đề Retry-After: 5. Ví dụ đặt max_retries=0 trên client để vòng lặp của bạn kiểm soát các khoảng chờ. Một yêu cầu truyền phát giữ khe đồng thời của nó cho đến khi luồng kết thúc, vì vậy hãy luôn tiêu thụ hoặc đóng luồng.
Chạy nhiều yêu cầu đồng thời
Các công việc theo lô như tạo kiểm thử cho một trăm hàm cần giới hạn độ đồng thời. Sử dụng nhóm luồng với tối đa 8 công nhân trên khóa đầy đủ.
Một mẫu đơn giản là ThreadPoolExecutor(max_workers=6) xung quanh một hàm gọi ask, để lại hai khe trống cho công việc khác. Với khóa dùng thử, hãy sử dụng 2 công nhân. Nếu bạn truyền một số lớn hơn, API sẽ trả lời các yêu cầu bổ sung bằng lỗi concurrency và vòng lặp thử lại của bạn sẽ dành thời gian chờ đợi thay vì làm việc. Đối với mã không đồng bộ, hãy sử dụng AsyncOpenAI với asyncio.Semaphore(6) xung quanh mỗi lệnh gọi; nó cung cấp giới hạn tương tự mà không cần luồng. Các tiêu đề phản hồi X-RateLimit-Limit-Requests và X-RateLimit-Limit-Concurrency hiển thị các giới hạn cho khóa của bạn.
Chi phí tác vụ lập trình
Giá là $0,15 cho mỗi 1M token đầu vào và $0,50 cho mỗi 1M token đầu ra. Giả sử bạn tạo bài kiểm tra đơn vị cho 200 hàm. Mỗi lệnh gọi gửi 1.500 token đầu vào và trả về 700 token. Đầu vào: 200 x 1.500 = 300.000 token, hoặc $0,045. Đầu ra: 200 x 700 = 140.000 token, hoặc $0,07. Tổng cộng: $0,115.
Một lần refactoring một tệp lớn gửi 30.000 token vào và 8.000 ra: $0.0045 + $0.004 = $0.0085 mỗi lần chạy. Các yêu cầu bị lỗi hoặc bị từ chối không được tính phí và tín dụng không bao giờ hết hạn. Nạp tiền bắt đầu từ $20 và có thể thanh toán bằng thẻ hoặc crypto, với tiền thưởng 5% từ $50, 10% từ $100 và 15% từ $200. Xem bảng giá và đọc tài liệu để có danh sách đầy đủ các tham số.

