OpenAI SDK로 Yeap LLM API 시작하기
Yeap LLM API는 OpenAI와 호환됩니다. 기존 SDK를 유지하고 base_url을 https://llm.yeap.cloud/v1로 지정하면 됩니다. 키 생성, Python 및 Node.js 예제, 스트리밍, 임베딩, 키별 할당량과 모델 및 IP 제한을 다룹니다.
Yeap LLM API는 OpenAI와 호환되는 모델 게이트웨이입니다. 목표는 간단합니다. 새 SDK를 배우거나 코드를 다시 작성할 필요 없이 사용하는 것입니다. 기존 OpenAI SDK를 유지한 채 base_url을 https://llm.yeap.cloud/v1로 변경하고 Yeap API 키를 사용하면 바로 시작할 수 있습니다. 사용 요금은 토큰 단위로 Yeap 계정 잔액에서 차감되며, 다른 Yeap 제품과 동일한 잔액을 사용합니다.
사용 가능한 엔드포인트
| 엔드포인트 | 용도 |
|---|---|
POST /v1/chat/completions | 스트리밍을 지원하는 채팅 완성 |
POST /v1/completions | 텍스트 완성 |
POST /v1/embeddings | 임베딩 |
POST /v1/images/generations | 이미지 생성 |
POST /v1/audio/transcriptions | 음성을 텍스트로 변환 |
GET /v1/models | 키로 사용할 수 있는 모델 목록 조회 |
모든 엔드포인트는 Authorization: Bearer <key>로 인증합니다. 모델과 가격은 시간이 지나면서 바뀌며, 항상 GET /v1/models 또는 콘솔의 모델 목록이 기준입니다. 따라서 아래 예제에서는 특정 모델 이름 대신 자리표시자를 사용합니다.
1단계: API 키 생성
console.yeap.cloud에서 로그인한 뒤 LLM → 토큰으로 이동하여 키를 생성합니다. 다음 항목을 설정할 수 있습니다.
- 이름:
blog-summarizer-prod처럼 프로젝트나 환경을 기준으로 이름을 지정하는 것을 권장합니다. - 할당량: 이 키의 지출 한도를 설정하거나 무제한으로 지정합니다.
- 모델 제한: 특정 모델만 사용하도록 키를 제한합니다.
- IP 제한: 특정 IP에서 보낸 요청만 허용합니다.
- 만료 시점: 이 시점이 지나면 키가 자동으로 작동을 중지합니다.
키는 sk-로 시작합니다. 생성한 즉시 안전하게 저장합니다. 프로젝트별, 환경별로 별도의 키를 사용하고 비프로덕션 키에는 낮은 할당량을 설정하여 키 유출 시 피해 범위를 제한합니다.
키는 저장소에 넣지 않고 환경 변수에 보관합니다.
export YEAP_API_KEY="sk-..."
2단계: curl로 연결 확인
curl https://llm.yeap.cloud/v1/models \
-H "Authorization: Bearer $YEAP_API_KEY"
JSON 응답에서 각 항목의 id는 요청에 사용할 수 있는 모델 이름이며, 이 항목들은 data 배열에 포함되어 있습니다.
3단계: Python
pip install openai로 공식 SDK를 설치합니다.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["YEAP_API_KEY"],
base_url="https://llm.yeap.cloud/v1",
)
resp = client.chat.completions.create(
model="your-model-id", # pick one from /v1/models
messages=[
{"role": "system", "content": "You are a concise technical assistant."},
{"role": "user", "content": "Explain what a CDN is in one sentence."},
],
)
print(resp.choices[0].message.content)
print(resp.usage) # prompt_tokens / completion_tokens / total_tokens
스트리밍
채팅 애플리케이션에서는 대개 출력이 생성되는 즉시 표시해야 합니다. stream=True를 설정하면 응답이 서버 전송 이벤트(SSE) 형식으로 점진적으로 도착합니다.
stream = client.chat.completions.create(
model="your-model-id",
messages=[{"role": "user", "content": "Write a short poem about cache hits."}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
임베딩
emb = client.embeddings.create(
model="your-embedding-model-id",
input=["Yeap CDN supports HTTP/3", "How to purge the cache"],
)
vectors = [item.embedding for item in emb.data]
print(len(vectors), len(vectors[0]))
이미지 생성 및 음성 전사
이미지 및 오디오 엔드포인트도 SDK의 표준 메서드를 사용합니다. 해당 유형에 맞는 모델을 지정하면 됩니다.
# Image generation
img = client.images.generate(
model="your-image-model-id",
prompt="A minimalist illustration of a server room",
size="1024x1024",
)
print(img.data[0].url or "base64 image returned")
# Speech to text
with open("meeting.mp3", "rb") as f:
tr = client.audio.transcriptions.create(
model="your-transcription-model-id",
file=f,
)
print(tr.text)
모델에 따라 이미지가 URL 또는 base64로 반환될 수 있으므로 코드에서 두 가지 형식을 모두 처리하는 것이 좋습니다.
비용을 예측 가능하게 유지하는 습관
max_tokens를 설정합니다. 출력 토큰은 일반적으로 입력 토큰보다 비용이 높습니다. 요청 유형마다 적절한 출력 한도를 지정하면 모델이 계속 응답을 생성해 예상치 못한 요금이 발생하는 일을 방지할 수 있습니다.- 컨텍스트를 줄입니다. 여러 차례 주고받는 대화에서는 매번 전체 이력을 다시 전송합니다. 오래된 대화를 요약하거나 잘라내면 입력 토큰을 크게 줄일 수 있습니다.
- 작업에 맞는 모델을 선택합니다. 분류, 추출, 문장 재작성은 작은 모델로도 충분한 경우가 많습니다. 큰 모델은 추론이 꼭 필요한 작업에 사용합니다. 기본 모델을 정하기 전에 Playground에서 몇 가지 모델을 비교합니다.
- 키 할당량을 최종 안전장치로 사용합니다. 버그로 인해 코드가 API를 반복 호출하더라도 키의 할당량이 지출의 무제한 증가를 막아줍니다.
4단계: Node.js
npm install openai로 설치합니다.
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.YEAP_API_KEY,
baseURL: "https://llm.yeap.cloud/v1",
});
const stream = await client.chat.completions.create({
model: "your-model-id",
messages: [{ role: "user", content: "List three ways to reduce API latency." }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
코드 변경 없이 전환하기
공식 OpenAI SDK는 OPENAI_BASE_URL 및 OPENAI_API_KEY 환경 변수를 읽습니다. 도구나 스크립트가 이미 OpenAI SDK를 사용하고 있으며 코드를 수정하고 싶지 않다면 환경 설정만 변경합니다.
export OPENAI_BASE_URL="https://llm.yeap.cloud/v1"
export OPENAI_API_KEY="$YEAP_API_KEY"
사용자 지정 API 엔드포인트를 지원하는 대부분의 서드파티 도구에서도 같은 방법을 사용할 수 있습니다. 엔드포인트를 https://llm.yeap.cloud/v1로 지정하고 키에는 Yeap 키를 설정합니다.
오류 및 재시도
프로덕션 환경에서는 오류에 대비합니다.
- 401: 키가 유효하지 않거나 만료되었거나, 키의 IP 허용 목록에 없는 주소에서 요청을 보낸 경우입니다. 키 설정을 확인합니다.
- 할당량 부족: 키의 할당량을 소진했거나 계정 잔액이 부족하면 요청이 거부되며, 오류 메시지에 이유가 표시됩니다. 콘솔에서 키의 할당량을 늘리거나 잔액을 충전합니다.
- 429 및 5xx: 일반적으로 일시적인 오류이므로 대기 시간을 늘려가며 재시도해야 합니다. OpenAI SDK는 자동으로 재시도합니다.
max_retries로 재시도 횟수를,timeout으로 요청별 제한 시간을 조정합니다.
client = OpenAI(
api_key=os.environ["YEAP_API_KEY"],
base_url="https://llm.yeap.cloud/v1",
max_retries=3,
timeout=60.0,
)
사용량 모니터링
모든 요청에는 모델, 토큰 수, 비용이 함께 기록됩니다. 콘솔의 LLM 메뉴에서 요청 로그와 통계를 살펴보고 키별 지출을 확인할 수 있으므로 프로젝트별로 쉽게 구분할 수 있습니다. 코드를 작성하기 전에 모델을 비교하려면 브라우저에서 콘솔의 Playground를 바로 사용해 보시기 바랍니다.
정리
Yeap LLM API를 시작하는 데 필요한 것은 키, base_url, /v1/models에서 확인한 모델 이름의 세 가지입니다. 나머지 코드는 이미 작성해 둔 코드를 그대로 사용하면 됩니다.
Yeap Cloud에서 서비스 구축
모든 신규 계정에 DNS와 CDN 무료 요금제를 제공합니다.
계속 읽기
Yeap CDN의 새로운 엣지: Rust를 선택한 이유
CDN 엣지를 Pingora 기반의 Rust 자체 구현으로 교체했습니다. 웹사이트 연결 속도 개선, 수초 내 설정 적용, 격리 및 보안 강화 등 이번 변화가 사이트에 어떤 의미가 있는지 소개합니다.
10분 만에 Yeap CDN과 무료 HTTPS를 웹사이트에 적용하기
기존 사이트에 Yeap CDN을 적용하는 과정을 단계별로 안내합니다. 도메인 추가, 원본 서버 설정, CNAME 또는 NS 연결, 무료 Let's Encrypt 인증서 발급, SSL 모드 선택, HTTPS 강제 적용, curl 검증까지 다룹니다.
엣지의 TLS 세션 재개와 HTTP/3
세션 재개를 사용하면 재방문자가 전체 TLS 핸드셰이크를 생략할 수 있습니다. 재시작 후에도 티켓 키를 유지해야 하는 이유, 안전한 키 교체 방법, 엣지의 HTTP/3가 기존 요청 파이프라인을 재사용하는 방식을 설명합니다.