본문 바로가기

AI 개발

OpenRouter 완전 가이드 1편 — 300개 AI 모델을 API 키 하나로 쓰는 법

반응형

Claude, GPT, Gemini, Llama, DeepSeek를 각각 쓰려면 API 키 5개, 청구서 5개, 레이트 리밋 각개격파입니다. OpenRouter는 이걸 하나로 통합합니다. 모델만 바꾸면 됩니다. 코드는 그대로입니다.

[핵심 요약]
→ OpenRouter: 300개+ AI 모델을 단일 API 엔드포인트로 제공하는 LLM 게이트웨이
→ OpenAI 호환 API: base_url만 바꾸면 기존 코드 그대로 동작
→ 가격: 프로바이더 직접 가격 그대로 (마크업 없음) + 5.5% 플랫폼 크레딧 수수료
→ 무료 티어: 25개+ 무료 모델 (Gemma, Llama, Mistral 등) — 신용카드 불필요
→ BYOK: 자체 API 키 연결 시 월 100만 요청까지 무료 (이후 5% 수수료)
→ 폴백 라우팅: 프로바이더 장애 시 자동 대체 모델로 전환
→ 모델 variant: :free, :nitro, :floor, :thinking, :extended
→ 레이트 리밋: 무료 20 RPM / 크레딧 $10 이상 보유 시 1,000 req/일 무료 모델

OpenRouter가 필요한 이유

[직접 API 관리의 고통]

Anthropic API 키 → Claude Sonnet 4.6
OpenAI API 키    → GPT-5.4
Google API 키    → Gemini 3.1 Flash
Together AI 키   → Llama 3.3 70B
DeepSeek API 키  → DeepSeek V3

→ API 키 5개 별도 관리
→ 청구서 5개
→ 레이트 리밋 5개 따로 모니터링
→ 각 SDK 문서 따로 읽기
→ 모델 전환 시 코드 구조 변경

[OpenRouter 사용 후]

OpenRouter API 키 하나
→ 300개+ 모델 전부 접근
→ 청구서 1개 (크레딧 차감)
→ 모델 전환: model 파라미터 문자열 하나만 변경
→ OpenAI SDK 그대로 사용
→ 자동 폴백 라우팅

실전 1 — 계정 세팅

가입 및 크레딧 충전

[계정 세팅 순서]

1. https://openrouter.ai 접속 → Sign Up
2. GitHub / Google 소셜 로그인 or 이메일

3. API 키 생성:
   Settings → API Keys → Create Key
   → 키 이름 입력 (예: "my-project-dev")
   → Credit limit 설정 (예: $10 — 초과 시 자동 차단)
   → 생성된 키 즉시 복사 (다시 볼 수 없음)

4. 크레딧 충전 (유료 모델 사용 시):
   Settings → Credits → Add Credits
   → 신용카드, 암호화폐, 계좌이체 지원
   → 최소 금액 없음
   → 크레딧 만료 없음

5. 무료 시작:
   → 크레딧 없이도 무료 모델 사용 가능
   → 일 50 요청 (크레딧 $10 이상 보유 시 1,000 요청)

환경변수 설정

# .env
OPENROUTER_API_KEY=sk-or-v1-...

# 선택: 요청 메타데이터 (OpenRouter 모니터링 대시보드에서 식별용)
OPENROUTER_SITE_URL=https://myapp.com
OPENROUTER_APP_NAME=MyApp

실전 2 — 첫 API 호출

Python — OpenAI SDK 재사용

# pip install openai python-dotenv
from openai import OpenAI
import os

# OpenAI SDK + OpenRouter 엔드포인트 조합
client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=os.environ["OPENROUTER_API_KEY"],
)

response = client.chat.completions.create(
    model="anthropic/claude-sonnet-4-6",  # 모델 문자열만 바꾸면 됨
    messages=[
        {"role": "user", "content": "OpenRouter를 한 줄로 설명해줘"}
    ],
    # OpenRouter 전용 헤더 (선택 — 대시보드 식별용)
    extra_headers={
        "HTTP-Referer": os.environ.get("OPENROUTER_SITE_URL", ""),
        "X-Title": os.environ.get("OPENROUTER_APP_NAME", ""),
    }
)

print(response.choices[0].message.content)

# 비용 확인
print(f"사용 토큰: {response.usage.total_tokens}")

TypeScript/JavaScript

// npm install openai
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://openrouter.ai/api/v1",
  apiKey: process.env.OPENROUTER_API_KEY,
  defaultHeaders: {
    "HTTP-Referer": process.env.OPENROUTER_SITE_URL ?? "",
    "X-Title": process.env.OPENROUTER_APP_NAME ?? "",
  },
});

const response = await client.chat.completions.create({
  model: "google/gemini-3-flash",
  messages: [
    { role: "user", content: "OpenRouter를 한 줄로 설명해줘" }
  ],
});

console.log(response.choices[0].message.content);

순수 fetch (SDK 없이)

import httpx
import os

response = httpx.post(
    "https://openrouter.ai/api/v1/chat/completions",
    headers={
        "Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}",
        "Content-Type": "application/json",
        "HTTP-Referer": "https://myapp.com",   # 선택
        "X-Title": "MyApp",                    # 선택
    },
    json={
        "model": "meta-llama/llama-3.3-70b-instruct",
        "messages": [
            {"role": "user", "content": "안녕하세요"}
        ]
    }
)

data = response.json()
print(data["choices"][0]["message"]["content"])

# 비용 메타데이터 (OpenRouter 고유)
print(f"비용: ${data.get('usage', {}).get('cost', 0):.6f}")

실전 3 — 모델 식별자 체계

[OpenRouter 모델 ID 형식]
{provider}/{model-name}:{variant}

provider: anthropic, openai, google, meta-llama, deepseek, mistralai 등
model-name: 실제 모델명
variant: 선택 (없으면 기본 라우팅)

예시:
anthropic/claude-sonnet-4-6           # Claude Sonnet 4.6
anthropic/claude-opus-4-7             # Claude Opus 4.7
openai/gpt-5.4                        # GPT-5.4
openai/gpt-4o-mini                    # GPT-4o Mini
google/gemini-3-flash                 # Gemini 3 Flash
google/gemini-3.1-flash-lite          # Gemini 3.1 Flash Lite
meta-llama/llama-3.3-70b-instruct     # Llama 3.3 70B
deepseek/deepseek-chat                # DeepSeek V3
mistralai/mistral-large               # Mistral Large
x-ai/grok-beta                        # Grok

모델 variant 종류

# :free — 무료 모델 (크레딧 소모 없음, 레이트 리밋 있음)
model = "meta-llama/llama-3.3-70b-instruct:free"
model = "google/gemini-3-flash:free"

# :nitro — 가장 빠른 프로바이더로 라우팅 (처리량 최적화)
model = "anthropic/claude-sonnet-4-6:nitro"

# :floor — 가장 저렴한 프로바이더로 라우팅 (비용 최적화)
model = "anthropic/claude-sonnet-4-6:floor"

# :thinking — 추론(Thinking) 모드 활성화
model = "anthropic/claude-opus-4-7:thinking"
model = "google/gemini-3.1-pro:thinking"

# :extended — 더 긴 컨텍스트 윈도우
model = "openai/gpt-5.4:extended"

전체 모델 목록 API로 가져오기

import httpx
import os

# 사용 가능한 모든 모델 조회
response = httpx.get(
    "https://openrouter.ai/api/v1/models",
    headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"}
)

models = response.json()["data"]

# 무료 모델만 필터링
free_models = [
    m for m in models
    if m.get("pricing", {}).get("prompt") == "0"
]
print(f"무료 모델 수: {len(free_models)}")
for m in free_models[:5]:
    print(f"  {m['id']} — 컨텍스트: {m.get('context_length', 'N/A')}K")

# 특정 기능 지원 모델 필터링
tool_calling_models = [
    m for m in models
    if "tools" in m.get("supported_parameters", [])
]

실전 4 — 주요 모델 선택 가이드

[2026년 5월 기준 주요 모델 비교]

────────────────────────────────────────────────────────
모델 ID                              입력     출력    컨텍스트
────────────────────────────────────────────────────────
anthropic/claude-opus-4-7            $5.00   $25.00   1M
anthropic/claude-sonnet-4-6          $3.00   $15.00   1M
anthropic/claude-haiku-4-5           $0.80   $4.00    200K
openai/gpt-5.4                       $2.00   $8.00    128K
openai/gpt-4o-mini                   $0.15   $0.60    128K
google/gemini-3-flash                $0.10   $0.40    1M
google/gemini-3.1-flash-lite:free    FREE    FREE     1M
meta-llama/llama-3.3-70b:free        FREE    FREE     128K
deepseek/deepseek-chat               $0.27   $1.10    64K
mistralai/mistral-small              $0.10   $0.30    128K
────────────────────────────────────────────────────────

[태스크별 추천 모델]

코딩·에이전트 (최고 품질 필요):
→ anthropic/claude-opus-4-7
→ anthropic/claude-sonnet-4-6 (비용 효율)

빠른 응답·실시간 채팅:
→ google/gemini-3-flash (저렴 + 빠름)
→ anthropic/claude-haiku-4-5

무료 프로토타이핑:
→ meta-llama/llama-3.3-70b-instruct:free
→ google/gemini-3.1-flash-lite:free
→ mistralai/mistral-7b-instruct:free

비용 최적화 (일반 태스크):
→ deepseek/deepseek-chat ($0.27/M — 저렴)
→ google/gemini-3-flash ($0.10/M)

긴 문서 처리 (1M+ 컨텍스트):
→ google/gemini-3.1-pro (2M 컨텍스트)
→ anthropic/claude-opus-4-7 (1M)

추론·수학:
→ anthropic/claude-opus-4-7:thinking
→ deepseek/deepseek-r1 (추론 특화)

실전 5 — 비용 구조 정확히 이해하기

[OpenRouter 비용 = 프로바이더 비용 + 플랫폼 수수료]

플랫폼 수수료 구조:
→ Pay-as-you-go: 크레딧 충전 시 5.5% 수수료
   (크레딧 $100 충전 → 실제 사용 가능 $94.5)
→ BYOK(자체 키 연결): 월 100만 요청까지 무료
   이후 표준 비용의 5%
→ 무료 모델: 수수료 없음 (레이트 리밋만)
→ Enterprise: 협의

[5.5% 수수료가 합리적인 이유]
→ API 키 5개 관리 비용 절감
→ 자동 폴백 라우팅
→ 통합 모니터링 대시보드
→ 단일 청구서

[진짜 비용 계산 예시]
Sonnet 4.6 100만 입력 토큰:
→ 직접: $3.00
→ OpenRouter Pay-as-go: $3.00 × 1.055 = $3.165 (+$0.165)
→ OpenRouter BYOK: $3.00 + $0.15 = $3.15 (5%)

→ 월 $30 미만이면 수수료 신경 쓸 필요 없음
→ 대규모 트래픽이면 BYOK가 유리

비용 응답에서 확인하기

# 매 응답에서 비용 메타데이터 추출
response = client.chat.completions.create(
    model="anthropic/claude-sonnet-4-6",
    messages=[{"role": "user", "content": "안녕"}]
)

# OpenRouter 응답 비용 정보
print(f"입력 토큰: {response.usage.prompt_tokens}")
print(f"출력 토큰: {response.usage.completion_tokens}")

# 실제 비용 (OpenRouter raw 응답에 포함)
import httpx
raw = httpx.post(
    "https://openrouter.ai/api/v1/chat/completions",
    headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
    json={
        "model": "anthropic/claude-sonnet-4-6",
        "messages": [{"role": "user", "content": "안녕"}]
    }
).json()

cost = raw.get("usage", {}).get("cost", 0)
print(f"이번 요청 비용: ${cost:.8f}")
# → $0.00001500 같이 매우 작은 값

실전 6 — 무료 티어로 시작하기

# 무료 모델로 완전 무료 챗봇 만들기
# 크레딧 불필요, 신용카드 불필요

from openai import OpenAI
import os

client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=os.environ["OPENROUTER_API_KEY"],
)

# 무료 모델 목록 (2026년 5월 기준)
FREE_MODELS = [
    "meta-llama/llama-3.3-70b-instruct:free",      # Llama 3.3 70B
    "google/gemini-3.1-flash-lite:free",             # Gemini Flash Lite
    "mistralai/mistral-7b-instruct:free",            # Mistral 7B
    "microsoft/phi-3-medium-128k-instruct:free",     # Phi-3 Medium
    "openrouter/free",                               # OpenRouter 자체 무료 모델
]

def chat_free(message: str, model: str = FREE_MODELS[0]) -> str:
    """무료 모델로 채팅"""
    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": message}]
    )
    return response.choices[0].message.content

# 사용
print(chat_free("파이썬 리스트 컴프리헨션 설명해줘"))
[무료 티어 한도]
신용카드 없음:
→ 무료 모델: 일 50 요청
→ 유료 모델: 불가

크레딧 $10 이상 보유:
→ 무료 모델: 일 1,000 요청
→ 유료 모델: 크레딧 차감

레이트 리밋:
→ 무료 모델: 20 RPM (분당 요청)
→ 유료 모델: 프로바이더 한도 따름 (OpenRouter 자체 제한 없음)

마무리

✅ 1편에서 한 것
→ 계정 세팅 + API 키 발급
→ OpenAI SDK로 첫 호출 (base_url 교체만)
→ 모델 ID 체계 이해 (provider/model:variant)
→ 주요 모델 비교 + 태스크별 선택 가이드
→ 비용 구조 (5.5% 수수료 + BYOK)
→ 무료 티어 활용

❌ 2편에서 다룰 것
→ 모델 폴백 설정 (프로바이더 장애 대응)
→ 로드밸런싱 (여러 프로바이더 동시 활용)
→ 특정 프로바이더 고정 or 제외
→ DeepSeek 시간대 할인 자동 활용
→ 비용 최적화 고급 패턴

 

반응형