필요한 세 가지 값
모든 OpenAI 호환 클라이언트는 동일한 세 가지 항목을 요구합니다. 이 서비스의 경우 다음과 같습니다.
| 설정 | 값 |
|---|---|
| 기본 URL | https://api.getcodexapi.com/v1 |
| API 키 | API 키 페이지의 키 |
| 모델 | uncensored |
키는 Authorization: Bearer YOUR_KEY 형식으로 전송됩니다. 호출할 수 있는 두 엔드포인트는 POST /v1/chat/completions과 GET /v1/models입니다. 이는 OpenAI의 Codex가 아닌 단일 오픈 웨이트 모델을 실행하는 독립 서비스이므로, OpenAI 자체의 엔드포인트나 OpenAI 키를 동일한 설정에 붙여 넣지 마세요.
curl로 연결 확인하기
앱 구성을 수정하기 전에 터미널에서 키와 URL이 작동하는지 확인하세요. 모델 나열은 프롬프트가 필요 없으므로 가장 저렴한 확인 방법입니다:
curl https://api.getcodexapi.com/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
모델 uncensored을 포함하는 JSON 목록을 받게 됩니다. 그런 다음 실제 completion 요청을 하나 보내세요:
curl https://api.getcodexapi.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [{"role": "user", "content": "Say hello in five words."}]
}'
두 호출이 모두 작동한다면, 이후의 실패 문제는 서비스 자체가 아닌 클라이언트 설정에 있습니다. 응답 헤더에는 X-Request-Id가 포함되어 있어 특정 호출을 추적할 때 유용하며, X-Balance-USD는 남은 크레딧을 보여줍니다.
OpenAI SDK를 사용한 Python
공식 openai 패키지는 클라이언트 생성자에 base URL을 전달합니다. 코드에 다른 변경 사항은 없습니다.
from openai import OpenAI
client = OpenAI(
base_url="https://api.getcodexapi.com/v1",
api_key="YOUR_API_KEY",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a concise assistant."},
{"role": "user", "content": "Explain what a base URL is in two sentences."},
],
)
print(resp.choices[0].message.content)
설정을 코드 외부에 유지하려면 SDK가 환경에서 OPENAI_BASE_URL 및 OPENAI_API_KEY도 읽습니다:
export OPENAI_BASE_URL="https://api.getcodexapi.com/v1"
export OPENAI_API_KEY="YOUR_API_KEY"
이러한 설정이 있으면 인자 없이 OpenAI()가 이를 가져옵니다. 이는 SDK를 기반으로 한 많은 서드파티 도구가 코드 변경 없이 동일한 변수를 상속하기 때문에 편리합니다.
Node.js
JavaScript SDK는 baseURL로 표기된 동일한 옵션 이름을 사용합니다.
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.getcodexapi.com/v1",
apiKey: process.env.API_KEY,
});
const stream = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "Write a haiku about version control." }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
스트리밍은 stream: true와 함께 서버 전송 이벤트로 반환되며, 사용량 정보는 끝에 포함됩니다. 스트리밍 요청은 스트리밍이 완료될 때까지 동시성 슬롯 중 하나를 사용 중이므로, 닫지 않고 버린 스트림은 한도 계산에 계속 포함됩니다.
설정 화면이 있는 앱
데스크톱 도구와 편집기는 필드를 세 가지 방식 중 하나로 표시합니다: "Base URL", "API Base" 또는 "OpenAI-compatible endpoint". 모두 동일한 문자열을 원합니다. 시간을 절약할 수 있는 몇 가지 참고 사항:
- 벤더 고유 유형이 아닌 OpenAI 또는 "custom OpenAI-compatible" 공급자 유형을 선택하세요.
- 앱에 자유 텍스트 상자가 있는 경우 모델 이름을 직접 입력하세요.
uncensored이 정확한 ID입니다. - 앱에 "테스트 연결" 버튼이 있는 경우 일반적으로 모델 목록을 호출하며, 이 API는 이를 지원합니다.
- 일부 앱은 이전 제공업체에서 모델 목록을 캐시합니다. 드롭다운이 잘못 보이는 경우 이전 항목을 제거하고 새 항목을 추가하세요.
특정 편집기에서의 실행 예시는 Cursor 연결 가이드를 참조하거나, 전체적인 개요는 coding API 페이지를 확인하세요. 전체 파라미터 참조는 API 문서에 있습니다.
연결이 작동하면 URL, 모델 이름 및 키 생성 날짜를 다시 찾을 수 있는 어딘가에 정확한 값을 저장하세요. 팀은 나중에 구성 복사본에 오래된 값이 여전히 포함되어 있어 1시간을 잃는 경우가 많습니다. 저장소 내 단일 공유 예제 파일(실제 키 대신 자리 표시자 사용)을 사용하면 이를 방지할 수 있습니다.
일반적인 실수 및 해결법
URL은 /v1/v1로 끝납니다.
일부 클라이언트는 스스로 /v1를 추가합니다. 요청이 실패하고 클라이언트 로그에 /v1/v1/chat/completions 경로가 표시되면 입력한 base URL에서 /v1를 제거하세요. 그 반대도 마찬가지입니다: 이를 추가하지 않는 클라이언트는 설정에 필요할 수 있습니다. 요청 경로 로그는 이 문제를 빠르게 해결해 줍니다.
전체 엔드포인트를 기본 URL에 넣었습니다
기본 URL은 /v1에서 끝납니다. 여기에 /chat/completions을 입력하지 마세요. SDK는 각 호출에 경로를 추가합니다.
후행 슬래시 또는 호스트의 오타
대부분의 SDK는 후행 슬래시를 허용하지만, 일부 오래된 도구는 단순 연결로 경로를 생성하여 이중 슬래시가 생깁니다. 이상한 404 응답이 보이면 제거하세요.
잘못된 키 또는 다른 서비스의 키
OpenAI 키는 여기서 작동하지 않으며, 우리의 키는 다른 곳에서는 작동하지 않습니다. API 키 오류는 거의 항상 누락된 문자나 끝에 공백과 같은 복사/붙여넣기 문제 때문입니다.
curl에서는 작동하지만 앱에서는 작동하지 않음
curl은 성공하지만 동일한 URL과 키로 애플리케이션이 실패하면 차이가 환경에 있습니다. 앱이 프록시 뒤에서 실행 중이거나 외부 접근이 없는 컨테이너 안에 있는지, 다른 프로젝트에서 남은 오래된 환경 변수(예: OPENAI_BASE_URL)를 읽는지, 코드에서 설정한 값을 재정의하는 구성 파일이 있는지 확인하세요. 요청 직전에 클라이언트가 호출할 최종 URL을 출력하면 이러한 경우의 대부분이 1분 이내에 해결됩니다.
HTTP 429
이는 한도에 도달했음을 의미합니다. 오류 코드 rate_limited은 분당 요청 수를, concurrency은 동시에 너무 많은 요청을 의미합니다. 전체 키는 8개의 동시 요청과 분당 300개를 허용하며, 무료 체험 키는 2개와 60개를 허용합니다. 일시적 과부하 시 Retry-After: 5 헤더와 함께 429도 반환되므로 5초 기다렸다가 다시 시도하세요.
LangChain 및 URL 단일 위치 유지
OpenAI 클라이언트를 기반으로 한 프레임워크는 동일한 값을 사용합니다. LangChain의 OpenAI 통합에서 인수는 다음과 같이 이름이 지정됩니다:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.getcodexapi.com/v1",
api_key="YOUR_API_KEY",
)
print(llm.invoke("Name three uses of a base URL.").content)
프레임워크에 관계없이 URL을 코드 전반에 흩어지지 않게 하세요. 환경 변수 또는 설정 파일에 하나만 넣고 거기서 읽으세요. 이렇게 하면 시험용 키와 프로덕션 키 간 또는 기계 간 이동 시 단일 줄만 변경하면 됩니다. 또한 키를 저장소에 남기지 않습니다: 키를 환경 변수 또는 비밀 관리자에 저장하고, 커밋된 파일에는 저장하지 마세요.
OpenAI의 자체 Codex 제품에 대한 엔드포인트를 찾고 있었다면 이것이 아닙니다. 그들의 기본 URL 및 API 키은 OpenAI에 의해 문서화되므로 해당 현재 문서를 따르세요. 이 페이지의 주소는 독립적인 서비스의 것이며 여기서 발급된 키만 허용합니다.
연결 후 전송할 수 있는 데이터
엔드포인트는 스트리밍, tool calling (tools, tool_choice, 결과 반환은 role: "tool" 메시지), 그리고 response_format: {"type": "json_object"}을 통한 JSON 모드를 지원합니다. 파라미터 temperature, top_p, stop, seed 및 페널티는 전달됩니다. 컨텍스트 창은 프롬프트와 생성 결과를 합쳐 100,000 토큰이며, 최대 요청 본문 크기는 8 MB입니다.
텍스트 전용입니다. 이미지나 오디오 생성, 임베딩, 파인튜닝이 없으므로 이러한 기능에 의존하는 클라이언트 기능은 이 base URL에서 작동하지 않습니다. 사용량은 토큰당 과금되며, 입력 100만 토큰당 $0.15, 출력 100만 토큰당 $0.50입니다. 요금제 페이지에는 실행 예시가 있습니다.
