VI ▾
Lấy khóa API

API Codex trong Python: Gọi LLM mã hóa

Cài đặt API Codex Python đơn giản nhất là gói openai chính thức trỏ đến một Base URL khác. Các ví dụ dưới đây bao gồm tạo mã, chế độ JSON, gọi hàm và truyền phát trên endpoint tương thích OpenAI này.

Cập nhật

Một sợi cáp phát sáng uốn lượn qua các khối mã vào một khối máy chủ, minh họa các lệnh gọi Python đến API LLM lập trình
Một cáp phát sáng nối laptop với khối máy chủ, minh họa việc trỏ client vào URL cơ sở API

Điểm chính

  • Cài đặt gói openai, đặt base_url thành https://api.getcodexapi.com/v1 và mô hình thành uncensored.
  • Sử dụng nhiệt độ thấp (0 đến 0,3) cho mã và JSON, cao hơn cho việc lên ý tưởng.
  • Hỗ trợ gọi hàm, chế độ JSON và truyền phát; không hỗ trợ embeddings.
  • Giới hạn độ đồng thời ở mức 8 trên khóa đầy đủ và thử lại các phản hồi 429 sau một khoảng thời gian chờ ngắn.

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ố.

Hỏi đáp

Bạn có thể sử dụng gói Python openai tiêu chuẩn không?

Có. Đặt base_url thành https://api.getcodexapi.com/v1, truyền khóa của bạn và sử dụng model ID uncensored.

Nó có hỗ trợ gọi hàm từ Python không?

Có. Truyền tools và tool_choice, sau đó trả về kết quả với vai trò tool. tool_calls được truyền phát cũng hoạt động.

Làm thế nào để tôi có đầu ra có cấu trúc?

Sử dụng response_format với type json_object, đặt tên các khóa trong prompt của bạn và xác thực kết quả trong mã.

Có client không đồng bộ không?

Gói openai cung cấp AsyncOpenAI, hoạt động tương tự với base URL này. Hãy giữ độ đồng thời ở mức 8 trở xuống trên khóa đầy đủ.

Khóa của bạn chỉ cách một biểu mẫu

Tạo tài khoản, sao chép khóa, thay đổi URL cơ sở. Đó là toàn bộ thiết lập.

Lấy khóa API