개발자를 위한 OpenAI API: 호환 엔드포인트 사용
코드가 이미 OpenAI 전송 형식을 지원한다면 두 값(base URL과 키)만 변경하면 이 호스팅 엔드포인트에서 실행할 수 있습니다. 이 페이지는 붙여넣기할 수 있는 코드와 함께 정확한 단계를 보여줍니다.
업데이트됨

주요 포인트
- base URL을 https://api.openaigatewayapi.com/v1로 설정하고 모델을 uncensored로 설정하면 OpenAI 클라이언트 코드의 나머지 부분은 변경할 필요가 없습니다.
- 채팅 완료, 스트리밍, 도구 호출 및 JSON 모드는 모두 일반 SDK 호출을 통해 작동합니다.
- 전체 키의 경우 동시 요청 8개와 분당 300개의 요청이 제한되므로 429 재시도를 구현하세요.
- 원클릭 $0.50 체험에는 카드가 필요 없으므로 결제 전에 통합을 테스트할 수 있습니다.
짧은 버전
대부분의 개발자를 위한 openai api 가이드는 단일 벤더와 단일 청구서를 가정합니다. 그러나 전송 형식은 HTTPS 위의 JSON일 뿐이며, 많은 클라이언트 코드, 프레임워크 및 도구는 이를 구현하는 모든 서버와 통신할 수 있습니다. 이 사이트는 그러한 서버 중 하나를 호스팅합니다. SDK를 유지하고 base URL을 변경한 후 이 사이트의 키로 교체하며 모델을 uncensored로 설정하세요.
일반 앱의 전체 마이그레이션은 이 정도입니다. 아래 체크리스트를 따르세요. 페이지의 나머지 부분은 각 단계를 자세히 설명합니다.
- API 키 페이지에서 계정을 생성하고 체험 크레딧을 청구하세요.
- base URL을
https://api.openaigatewayapi.com/v1로 설정하세요. Authorization: Bearer <key>로 키를 전송하세요. SDK는api_key를 전달할 때 이를 자동으로 처리합니다.- 모든 요청에서 모델 ID로
uncensored를 사용하세요. - 마지막 부분에서 설명된 대로 짧은 재시도로 HTTP 429를 처리하세요.
두 가지 엔드포인트가 있습니다: POST /v1/chat/completions 및 GET /v1/models. 서비스는 텍스트 전용입니다. 이미지나 오디오 생성, 임베딩 없음, 파인튜닝이 없으므로 앱에서 이러한 기능을 호출하면 다른 제공자가 필요합니다.
curl로 연결 확인하기
애플리케이션을 수정하기 전에 키가 작동하는지 확인하세요. 모델 엔드포인트는 토큰을 생성하지 않으므로 가장 저렴한 테스트입니다.
export API_KEY="paste-your-key-here"
curl https://api.openaigatewayapi.com/v1/models \
-H "Authorization: Bearer $API_KEY" | grep -o uncensored
grep은 목록에 uncensored 모델 ID가 있을 경우 이를 출력합니다. 전체 JSON 목록을 보려면 grep을 제거하세요. 401을 받으면 키가 잘못되었거나 Bearer 접두사가 누락되었습니다. 이제 실제 요청을 보내세요:
curl https://api.openaigatewayapi.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [
{"role": "system", "content": "You are a concise technical assistant."},
{"role": "user", "content": "Explain idempotency keys in two sentences."}
],
"temperature": 0.4
}'
응답에는 일반적인 choices 및 usage 객체가 포함됩니다. 로깅할 가치가 있는 헤더도 포함되어 있습니다: 지원 문의용 X-Request-Id, 남은 크레딧용 X-Balance-USD, 요청 및 동시성 한계를 나타내는 두 개의 X-RateLimit-Limit-* 헤더.
공식 openai 패키지로 Python 사용
Python에서는 클라이언트 생성자만 수정하면 됩니다. 그 이후의 코드는 기존 코드와 동일합니다.
from openai import OpenAI
client = OpenAI(
base_url="https://api.openaigatewayapi.com/v1",
api_key="paste-your-key-here",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You write short, accurate release notes."},
{"role": "user", "content": "Summarise: added retry logic, fixed timeout bug."},
],
temperature=0.5,
max_tokens=200,
)
print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)
실제 코드에서는 환경 변수에서 키를 읽으세요. 샘플은 코드 조각을 짧게 유지하기 위해 하드코딩했습니다. max_tokens은 여기에서 선택사항입니다. 지정하지 않으면 완료 생성은 100,000토큰 창(프롬프트와 완료 생성의 합계)의 남은 부분을 사용할 수 있습니다. 이를 설정하면 실행 중인 생성의 비용을 제한하는 저렴한 방법이 됩니다.
스트리밍
스트리밍은 서버 전송 이벤트와 잘 알려진 stream=True 플래그를 사용합니다. 사용량 데이터는 스트림 끝에 전달되므로 마지막 청크에는 빈 choices 목록이 포함될 수 있습니다.
from openai import OpenAI
client = OpenAI(base_url="https://api.openaigatewayapi.com/v1", api_key="paste-your-key-here")
stream = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "List five edge cases for a date parser."}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
if getattr(chunk, "usage", None):
print("\ntokens:", chunk.usage.total_tokens)
용량 계획에 중요한 세부 사항이 있습니다. 스트리밍 요청은 첫 번째 토큰이 아닌 스트림이 완료될 때까지 동시성 슬롯을 유지합니다. 클라이언트가 스트림을 닫지 않고 중단하면 해당 슬롯이 예상보다 더 오래 점유된 상태로 유지됩니다.
Node.js 예제
Node SDK는 다른 이름으로 동일한 두 설정을 사용합니다.
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.openaigatewayapi.com/v1",
apiKey: process.env.GATEWAY_KEY,
});
const completion = await client.chat.completions.create({
model: "uncensored",
messages: [
{ role: "user", content: "Write a regex that matches ISO 8601 dates, and explain it." },
],
temperature: 0.3,
});
console.log(completion.choices[0].message.content);
자체 OpenAI 통합을 사용하는 프레임워크를 사용하는 경우 설정에서 base URL, API base 또는 endpoint라는 필드를 찾으세요. 해당 위치에 동일한 URL을 붙여넣기하면 보통 충분합니다. 채팅 프론트엔드, 에이전트 프레임워크 및 편집기 플러그인은 대부분 이 패턴을 따릅니다. temperature, top_p, stop, seed 및 빈도 및 존재 패널티와 같은 샘플링 매개변수는 모델에 전달됩니다.
도구 호출 및 JSON 모드
두 가지 기능은 모델이 실제 애플리케이션에 적합한지 여부를 결정합니다: 함수 호출 및 구문 분석 가능한 데이터 반환입니다. 둘 다 지원됩니다.
함수 호출
tools로 도구를 선언하고, 선택적으로 tool_choice로 선택을 강제하며, role: "tool"로 메시지를 사용하여 결과를 다시 보냅니다. 스트리밍 응답은 표준 형식과 마찬가지로 tool_calls을 조각으로 전달합니다.
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.openaigatewayapi.com/v1", api_key="paste-your-key-here")
tools = [{
"type": "function",
"function": {
"name": "get_order_status",
"description": "Look up the status of an order by its ID.",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
},
},
}]
messages = [{"role": "user", "content": "Where is order A-1042?"}]
first = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
msg = first.choices[0].message
if msg.tool_calls:
call = msg.tool_calls[0]
args = json.loads(call.function.arguments)
result = {"order_id": args["order_id"], "status": "shipped"} # your real lookup here
messages.append(msg)
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})
final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
print(final.choices[0].message.content)
실행하기 전에 항상 인수를 검증하세요. 모델은 스키마와 일치하는 JSON을 대부분의 경우에 생성하지만 모든 경우에 생성하는 것은 아니므로 call.function.arguments을 신뢰할 수 없는 입력으로 취급하세요.
JSON 모드
추출 및 분류 작업의 경우 JSON 객체를 요청하고 프롬프트에도 명시하세요. 지침에 JSON을 언급하면 플래그에만 의존하는 것보다 더 나은 결과를 얻을 수 있습니다.
from openai import OpenAI
import json
client = OpenAI(base_url="https://api.openaigatewayapi.com/v1", api_key="paste-your-key-here")
resp = client.chat.completions.create(
model="uncensored",
response_format={"type": "json_object"},
messages=[
{"role": "system", "content": "Reply with JSON only: {\"sentiment\": string, \"topics\": [string]}."},
{"role": "user", "content": "The docs are clear but the rate limits caught me off guard."},
],
)
data = json.loads(resp.choices[0].message.content)
print(data)
제한, 오류 및 재시도
전체 키는 최대 8개의 동시 요청과 분당 300개의 요청을 허용합니다. 체험 키는 최대 2개의 동시 요청과 분당 60개의 요청을 허용합니다. 최대 요청 본문 크기는 8MB입니다. 한도를 초과하면 HTTP 429가 발생하며 오류 코드로 어떤 한도를 초과했는지 알 수 있습니다.
| 오류 코드 | 의미 | 대응 방법 |
|---|---|---|
rate_limited | 분당 요청 수 초과 | 생성 속도를 줄이거나 작업을 분 동안 분산하세요 |
concurrency | 너무 많은 동시 요청 | 워커 수를 8 이하로 줄이거나 체험 키의 경우 2로 설정하세요 |
429 및 Retry-After: 5 | 일시적 과부하 | 지정된 초 동안 기다린 후 다시 시도하세요 |
SDK는 일부 실패를 이미 재시도합니다. 버스트가 배치 작업을 크래시시키지 않도록 429에 대한 자체 처리를 추가하세요:
import time
from openai import OpenAI, RateLimitError
client = OpenAI(
base_url="https://api.openaigatewayapi.com/v1",
api_key="paste-your-key-here",
max_retries=0,
)
def ask(prompt, attempts=5):
for i in range(attempts):
try:
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": prompt}],
)
return r.choices[0].message.content
except RateLimitError as e:
wait = float(e.response.headers.get("retry-after", 2 ** i))
time.sleep(wait)
raise RuntimeError("still rate limited after retries")
실패하거나 거부된 요청은 청구되지 않으므로 재시도 루프가 요금을 두 배로 늘리지 않습니다. 동시성 한도에 맞게 조정된 세마포어는 비동기 코드에서 한도 내에서 유지하는 가장 깔끔한 방법입니다.
기존 앱 마이그레이션
작동하는 앱이 있다면 새 값을 하드코딩하지 마세요. base URL, 키 및 모델 이름을 환경 변수에 넣으면 배포 없이 환경을 전환할 수 있습니다. 이렇게 하면 동일한 테스트 스위트에서 두 백엔드에서 실행하여 출력을 함께 비교할 수도 있습니다.
import os
from openai import OpenAI
client = OpenAI(
base_url=os.environ.get("LLM_BASE_URL", "https://api.openaigatewayapi.com/v1"),
api_key=os.environ["LLM_API_KEY"],
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")
def complete(messages, **kw):
return client.chat.completions.create(model=MODEL, messages=messages, **kw)
그런 다음 짧은 마이그레이션 절차를 따르세요:
- 기존 프롬프트 세트를 새 엔드포인트에서 실행하고 출력을 직접 확인하세요. 자동화된 검사는 형식 오류는 감지하지만 어조는 감지하지 않습니다.
response_format설정 시 JSON 파싱 코드가 정상 작동하는지 확인하고, 객체 주변 텍스트를 제거하는 대체 코드를 유지하세요.usage에서 실제 토큰 수를 측정하세요. 다른 모델은 텍스트를 다르게 토큰화하므로 기존 추정이 부정확할 수 있습니다.- 부하가 걸렸을 때 동시성 한계가 첫 번째로 실패하지 않도록 워커 풀을 8 이하로 설정하세요.
- 트래픽의 작은 부분에 배포하고 429 응답 비율 및 오류 로그를 모니터링한 후 범위를 넓히세요.
팀들은 이 과정에서 시스템 프롬프트를 종종 잊습니다. 거절하기 쉬운 모델을 설득하기 위해 작성된 프롬프트에는 여기에서는 불필요하고 출력을 지저분하게 할 수 있는 완곡한 문구들이 포함되는 경우가 많습니다. 프롬프트를 다시 읽고 더 이상 효과가 없는 부분을 제거하세요.
전환 전 알아야 할 사항
호환성은 요청 및 응답 형식을 포함합니다. 이것이 어떤 모델 제작사의 공식 API라는 것을 의미하지는 않습니다. 이 서비스는 독립적인 제공자가 호스팅하고 합법적인 성인 사용에 대한 콘텐츠 거부 없이 답변하도록 조정된 하나의 오픈 웨이트 모델을 실행합니다. 벤더 간 라우터가 아니므로 다른 모델 메뉴를 찾을 수 없습니다. 미성년자가 관련된 성 콘텐츠는 허용되지 않으며 이 제한은 변경할 수 없습니다.
대규모 다중 모델 플랫폼과의 세 가지 실용적 차이점을 고려하여 계획을 세우세요:
- 하나의 모델. 모델 ID는
uncensored입니다. 작업에 따라 모델을 전환하는 코드가 있다면 이를 하나로 통합하세요. - 텍스트 전용. 이 엔드포인트로 가는 경로에서 이미지, 오디오 또는 임베딩 호출을 제거하세요.
- 프롬프트 동작이 다릅니다. 다른 모델은 지시를 다르게 해석하므로 전환 후 프롬프트와 테스트를 다시 실행하세요. 출력이 어긋나는 경우 시스템 프롬프트를 조정하세요.
프롬프트는 학습에 사용되지 않습니다. 전체 매개변수 목록은 API 문서를 참조하세요. 지출을 추정 중이라면 가격 책정 페이지에서 토큰별 요금을 확인할 수 있습니다: 입력 토큰 100만 개당 $0.15, 출력 토큰 100만 개당 $0.50이며 선불 크레딧에서 청구되고 구독은 없습니다. 충전 금액은 $20부터 $500까지이며 크레딧은 만료되지 않습니다. 여러 서비스 앞에 프록시 레이어를 배치하는 것이 가치 있는지 고려 중이라면 LLM 게이트웨이 페이지에서 해당 추가 구성 요소가 유용한 경우를 다룹니다.
더 많은 가이드
질문과 답변
이 엔드포인트를 사용하려면 새 SDK가 필요한가요?
아니요. Python과 Node용 공식 OpenAI SDK는 기본 URL을 https://api.openaigatewayapi.com/v1로 설정하고 이 사이트의 키를 사용할 경우 작동합니다. 사용자 정의 엔드포인트를 설정할 수 있는 다른 클라이언트도 동일한 방식으로 작동합니다.
어떤 모델 ID를 전송해야 하나요?
모든 채팅 완료 요청의 모델 필드에 uncensored를 사용하세요. /v1/models에 GET 요청을 보내서 확인할 수 있습니다.
결제 없이 테스트할 수 있나요?
네. 가입 후 API 키 페이지에서 한 번의 클릭으로 $0.50의 무료 체험 크레딧을 받을 수 있습니다. 카드가 필요 없으며, 7일 동안 유효하고 인원당 한 번만 신청할 수 있습니다.
임베딩 또는 이미지 생성을 지원하나요?
아니요. API는 텍스트 전용이며 채팅 완성 및 모델 목록을 제공합니다. 임베딩이나 이미지를 사용하려면 별도 제공업체가 필요합니다.
프롬프트가 학습에 사용되나요?
아니요, 프롬프트는 학습에 사용되지 않습니다.
키는 양식 하나만 작성하면 받을 수 있습니다
계정을 생성하고 키를 복사한 후 기본 URL을 변경하세요. 설정은 이것으로 끝입니다.