설정 및 첫 번째 호출
이 서비스는 독립적인 OpenAI 호환 서비스이며 OpenAI 자체의 Codex API가 아닙니다. 단일 모델은 오픈 웨이트 모델이며 텍스트 전용으로, 생성, 설명 및 리팩토링 작업에는 코드를 잘 처리하지만 여전히 검토가 필요합니다. 배경 지식을 먼저 원하시면 OpenAI Codex API 페이지에서 두 서비스의 관계를 설명하고 있습니다.
pip install openai로 SDK를 설치하고, 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입니다. 답변에 마크다운 fence가 있으면 코드에서 제거하거나 시스템 메시지에서 원본 텍스트를 요청하세요. base URL 페이지 Codex API base URL에 정확한 주소를 다시 게시했습니다.
실행 가능한 코드 프롬프트
몇 가지 습관은 어떤 파라미터보다 출력을 더 많이 개선합니다.
- 언어와 버전을 명시하세요. "Python 3.11, 표준 라이브러리만 사용"이라고 입력하면 추측을 크게 줄일 수 있습니다.
- 시그니처를 제공하세요. 함수 헤더와 docstring을 붙여넣고 모델에 본문 작성을 요청하세요.
- 입력 예시와 출력 예시 하나(쌍)를 보여주세요. 이는 문장 설명보다 경계 사례를 명확하게 드러냅니다.
- 하나의 작업만 요청하세요. 함수를 생성한 후 두 번째 호출에서 테스트를 요청하세요.
- 수정을 위해 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 주위에 배치하고 구문 분석 오류를 다시 보내는 단일 재시도를 사용하세요. 실제로 이는 드문 잘못된 형식의 응답을 처리합니다. 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)생성된 코드는 다른 기여와 마찬가지로 테스트하세요: 코드를 실행하고 정적 분석하며, 프롬프트 변경이 결과를 악화시킬 때 알 수 있도록 알려진 정답 출력을 가진 작은 프롬프트 모음을 유지하세요. 버전을 비교하는 동안 seed과 temperature를 고정하세요.
참고: 도구 설명은 짧고 명확하게 유지하며, 실행 전에 인수를 검증하고 모델 출력을 셸에 직접 전달하지 마세요. 반복문의 경우 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와 함께 Retry-After: 5 헤더를 반환합니다. 예제에서는 클라이언트에 max_retries=0을 설정하여 대기 시간을 자체 루프가 제어하도록 합니다. 스트리밍된 요청은 스트림이 완료될 때까지 동시 요청 슬롯을 유지하므로 항상 스트림을 소비하거나 닫으세요.
동시 요청 실행
100개 함수에 대한 테스트 생성과 같은 배치 작업에는 동시성 제한이 필요합니다. 전체 키의 경우 최대 8개의 워커가 있는 스레드 풀을 사용하세요.
간단한 패턴은 ThreadPoolExecutor(max_workers=6)을 ask를 호출하는 함수에 적용하고 다른 작업을 위해 두 개의 슬롯을 비워두는 것입니다. 체험용 키의 경우 워커 2개를 사용하세요. 더 큰 숫자를 전달하면 API가 추가 요청에 concurrency 오류로 응답하며, 재시도 루프는 작업하는 대신 대기하는 데 시간을 소비합니다. 비동기 코드의 경우 각 호출에 asyncio.Semaphore(6)을 감싸서 AsyncOpenAI를 사용하세요. 이는 스레드 없이 동일한 제한을 설정합니다. X-RateLimit-Limit-Requests 및 X-RateLimit-Limit-Concurrency 응답 헤더는 키에 대한 제한을 보여줍니다.
코딩 작업의 비용
가격은 입력 토큰 100만 개당 $0.15, 출력 토큰 100만 개당 $0.50입니다. 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부터 시작하며 카드나 암호화폐로 결제할 수 있으며, $50부터 5%, $100부터 10%, $200부터 15%의 보너스가 제공됩니다. 가격을 참조하고 전체 매개변수 목록은 문서를 읽으세요.

