TH ▾
รับคีย์ API

API Codex ใน Python: การเรียกใช้ LLM สำหรับเขียนโค้ด การเรียกใช้ LLM สำหรับเขียนโค้ด

การตั้งค่า codex api python ที่ง่ายที่สุดคือการใช้แพ็กเกจ openai ทางการโดยชี้ไปที่ base URL อื่น ตัวอย่างด้านล่างครอบคลุมการสร้างโค้ด โหมด JSON การเรียกใช้ฟังก์ชัน และสตรีมมิงกับเอนด์พอยต์ที่เข้ากันได้กับ OpenAI นี้

อัปเดต

สายไฟเรืองแสงที่พันผ่านบล็อกโค้ดเข้าสู่กล่องเซิร์ฟเวอร์ แสดงถึงการเรียก API LLM สำหรับเขียนโค้ดด้วย Python
สายเคเบิลที่ส่องแสงเชื่อมต่อกับแล็ปท็อปเข้ากับกล่องเซิร์ฟเวอร์ แสดงการชี้ไคลเอนต์ไปยัง URL ฐาน API

ประเด็นสำคัญ

  • ติดตั้งแพ็กเกจ openai, ตั้งค่า base_url เป็น https://api.getcodexapi.com/v1 และโมเดลเป็น uncensored
  • ใช้ temperature ต่ำ (0 ถึง 0.3) สำหรับโค้ดและ JSON และใช้ค่าสูงสำหรับการระดมความคิด
  • รองรับการเรียกใช้ฟังก์ชัน โหมด JSON และสตรีมมิง แต่ไม่รองรับ embeddings
  • จำกัดจำนวนคำขอพร้อมกันไว้ที่ 8 เมื่อใช้คีย์เต็ม และลองใหม่เมื่อได้รับ response 429 หลังจากหยุดรอสั้นๆ

การตั้งค่าและการเรียกครั้งแรก

นี่คือบริการที่เข้ากันได้กับ OpenAI แยกต่างหาก ไม่ใช่ Codex API ของ OpenAI โดยตรง โมเดลเดียวเป็น open-weight model ใช้ได้เฉพาะข้อความ และจัดการโค้ดได้ดีพอสำหรับการสร้าง อธิบาย และงานรีแฟกเตอร์ที่คุณควรตรวจสอบ หากต้องการดูข้อมูลพื้นฐานก่อน หน้า Codex API ของ OpenAI อธิบายความสัมพันธ์ระหว่างทั้งสอง

ติดตั้ง SDK ด้วย pip install openai สร้างคีย์ API บน หน้าคีย์ API แล้วรัน:

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

เครดิตทดลองใช้ของผู้ใช้ใหม่จำนวน $0.50 ครอบคลุมคำขอขนาดเล็กนับพันแบบเช่นนี้ Temperature ตั้งที่ 0.2 เพราะโค้ดต้องการความสุ่มน้อยกว่า หากเห็น markdown fence รอบคำตอบ ให้ตัดออกในโค้ดหรือขอข้อความดิบผ่าน system message หน้า Base URL ของ Codex API แสดงที่อยู่ที่แน่นอนอีกครั้ง

การเขียนพรอมต์สำหรับสร้างโค้ดที่ทำงานได้

นิสัยไม่กี่อย่างช่วยปรับปรุงผลลัพธ์ได้มากกว่าการปรับพารามิเตอร์ใดๆ

  • ระบุภาษาและเวอร์ชัน "Python 3.11 ใช้เฉพาะไลบรารีมาตรฐาน" ช่วยลดการคาดเดาได้มาก
  • ให้ signature วาง function header และ docstring แล้วขอให้โมเดลเติม body
  • แสดงตัวอย่างอินพุตและเอาต์พุตหนึ่งกรณี ช่วยระบุกรณีขอบเขตได้ชัดเจนกว่าการบรรยายด้วยข้อความ
  • ขอเพียงสิ่งเดียว สร้างฟังก์ชัน แล้วขอทดสอบในคำขอที่สอง
  • ขอ diff สำหรับการแก้ไข การเขียนไฟล์ใหม่ทั้งไฟล์จะเผาผลาญโทเคนเอาต์พุต ซึ่งมีค่าใช้จ่ายสูงกว่าอินพุต

หน้าต่างบริบทมีขนาด 100,000 โทเคน และ max_tokens เป็นตัวเลือก การกำหนดค่า max_tokens มีประโยชน์เป็นกับดักป้องกันผลลัพธ์ที่วิ่งไปไกลเกิน

โหมด JSON สำหรับผลลัพธ์ที่มีโครงสร้าง

เมื่อโค้ดต้องประมวลผลคำตอบ ให้ใช้โหมด JSON ซึ่งจะทำให้เอาต์พุตเป็น JSON ที่ถูกต้อง แต่ไม่ได้บังคับใช้สคีมาของคุณ ดังนั้นให้ตั้งชื่อคีย์ในพรอมต์และตรวจสอบคีย์เหล่านั้น

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

จับคู่กับ try/except รอบ json.loads และการลองใหม่หนึ่งครั้งที่ส่งข้อผิดพลาดการ parse การตอบกลับกลับมา ในทางปฏิบัติ วิธีนี้จัดการกับการตอบกลับที่ผิดรูปแบบได้ ใช้ temperature 0 เพื่อให้การรันซ้ำให้ผลลัพธ์ตรงกัน

การเรียกใช้ฟังก์ชัน

ด้วยเครื่องมือ คุณอธิบายฟังก์ชันและโมเดลจะตัดสินใจเรียกใช้ คุณเรียกใช้ฟังก์ชันแล้วส่งผลลัพธ์กลับด้วยบทบาท tool นี่คือพื้นฐานของเอเจนต์การเขียนโค้ดทุกตัว

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)

ทดสอบโค้ดที่สร้างเหมือนการมีส่วนร่วมอื่นๆ: รันโค้ด ตรวจสอบด้วย linter และเก็บชุดพรอมต์ขนาดเล็กที่มีผลลัพธ์ที่รู้กันว่าถูกต้องไว้ เพื่อสังเกตเมื่อการเปลี่ยนแปลงพรอมต์ทำให้ผลลัพธ์แย่ลง ล็อก seed และ temperature ไว้ขณะเปรียบเทียบเวอร์ชัน

หมายเหตุ: เก็บคำอธิบายเครื่องมือให้สั้นและตรงไปตรงมา ตรวจสอบอาร์กิวเมนต์ก่อนรันสิ่งใด และอย่าส่งผลลัพธ์โมเดลเข้าไปใน shell โดยตรง สำหรับลูป ให้เรียกซ้ำจนกว่า tool_calls จะปรากฏ และหยุดหลังจากจำนวนขั้นตอนสูงสุด แต่ละขั้นตอนจะส่งประวัติใหม่ ดังนั้นการรัน 10 ขั้นตอนจะจ่ายสำหรับบริบทประมาณ 10 เท่า

สตรีมมิงและการลองใหม่เมื่อได้ 429

สำหรับเครื่องมือแบบอินเทอร์แอคทีฟ ให้สตรีมโทเคนเมื่อได้รับ การใช้งานจะปรากฏที่ท้ายสตรีม ซึ่งทำให้การบันทึกต้นทุนทำได้ง่าย

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

ขีดจำกัดที่อยู่หลังลูปการลองใหม่: คีย์เต็มอนุญาตให้ทำคำขอพร้อมกัน 8 รายการและ 300 รายการต่อนาที ส่วนคีย์ทดลองใช้ทำได้ 2 และ 60 เมื่อเกินขีดจำกัด คุณจะได้รับ HTTP 429 พร้อมโค้ด rate_limited หรือ concurrency การโอเวอร์โหลดชั่วคราวยังให้ 429 พร้อม header Retry-After: 5 ตัวอย่างตั้งค่า max_retries=0 บนไคลเอนต์ เพื่อให้ลูปของคุณควบคุมการหยุดรอ คำขอแบบสตรีมจะครอบครองช่องคำขอพร้อมกันจนกว่าสตรีมจะเสร็จสิ้น ดังนั้นควรบริโภคหรือปิดสตรีมเสมอ

การส่งคำขอจำนวนมากพร้อมกัน

งานแบทช์เช่นการสร้างเทสต์สำหรับฟังก์ชัน 100 ฟังก์ชันต้องการการจำกัด concurrency ใช้ thread pool ที่มี worker สูงสุด 8 ตัวสำหรับคีย์แบบเต็ม

รูปแบบง่ายๆ คือการใช้ ThreadPoolExecutor(max_workers=6) รอบฟังก์ชันที่เรียก ask โดยเหลือช่องว่างไว้ 2 ช่องสำหรับงานอื่น หากใช้คีย์ทดลอง ให้ใช้ worker 2 ตัว หากกำหนดตัวเลขที่สูงกว่านี้ API จะตอบคำขอเพิ่มเติมด้วยข้อผิดพลาด concurrency และลูปการลองใหม่ของคุณจะเสียเวลาในการรอแทนที่จะทำงาน สำหรับโค้ดแบบ async ให้ใช้ AsyncOpenAI พร้อม asyncio.Semaphore(6) รอบแต่ละการเรียกใช้ ซึ่งให้การจำกัดจำนวนเดียวกันโดยไม่ต้องใช้เธรด ส่วนหัวของรีสปอนส์ X-RateLimit-Limit-Requests และ X-RateLimit-Limit-Concurrency แสดงขีดจำกัดสำหรับคีย์ของคุณ

ต้นทุนของงานเขียนโค้ด

ราคาคือ $0.15 ต่อ 1M โทเคนอินพุต และ $0.50 ต่อ 1M โทเคนเอาต์พุต สมมติว่าคุณสร้าง unit tests สำหรับ 200 ฟังก์ชัน แต่ละการเรียกส่ง 1,500 โทเคนอินพุตและคืนค่า 700 โทเคน อินพุต: 200 x 1,500 = 300,000 โทเคน หรือ $0.045 เอาต์พุต: 200 x 700 = 140,000 โทเคน หรือ $0.07 รวม: $0.115

การรีแฟกเตอร์ไฟล์ขนาดใหญ่ส่ง 30,000 โทเคนอินพุตและ 8,000 โทเคนเอาต์พุต: $0.0045 + $0.004 = $0.0085 ต่อการรัน คำขอที่ล้มเหลวหรือถูกปฏิเสธจะไม่ถูกเรียกเก็บเงิน และเครดิตไม่หมดอายุ การเติมเงินเริ่มต้นที่ $20 และสามารถจ่ายด้วยบัตรหรือคริปโต พร้อมโบนัส 5% จาก $50, 10% จาก $100 และ 15% จาก $200 ดู ราคา และอ่าน เอกสาร สำหรับรายการพารามิเตอร์เต็ม

ถาม-ตอบ

สามารถใช้แพ็กเกจ Python ของ openai มาตรฐานได้หรือไม่

ได้ ตั้งค่า base_url เป็น https://api.getcodexapi.com/v1, ส่งคีย์ของคุณและใช้โมเดล ID uncensored

มันรองรับการเรียกใช้ฟังก์ชันจาก Python ไหม?

ได้ ส่ง tools และ tool_choice จากนั้นส่งผลลัพธ์กลับด้วย role ของ tool tool_calls แบบ stream ก็ใช้งานได้เช่นกัน

ฉันจะรับผลลัพธ์ที่มีโครงสร้างอย่างไร

ใช้ response_format พร้อม type json_object ตั้งชื่อคีย์ในพรอมต์ของคุณและตรวจสอบผลลัพธ์ในโค้ด

มีไคลเอนต์แบบ async หรือไม่

แพ็กเกจ openai มี AsyncOpenAI ซึ่งทำงานในรูปแบบเดียวกันกับ base URL นี้ รักษา concurrency ไว้ที่ 8 หรือน้อยกว่าสำหรับคีย์เต็ม

คีย์ของคุณอยู่ห่างแค่ขั้นตอนเดียว

สร้างบัญชี คัดลอกคีย์ และเปลี่ยน base URL นั่นคือการตั้งค่าทั้งหมด

รับคีย์ API