การตั้งค่าและการเรียกครั้งแรก
นี่คือบริการที่เข้ากันได้กับ 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 ดู ราคา และอ่าน เอกสาร สำหรับรายการพารามิเตอร์เต็ม

