개발 문서

Cafe24 LLM Router는 OpenAI SDK 호환 API를 제공합니다. 하나의 API Key로 OpenAI, Anthropic, Google, DeepSeek 등 여러 프로바이더의 모델을 사용할 수 있습니다.

Authentication

API를 호출하려면 먼저 API Key가 필요합니다.

1. API Key 발급

API 키 관리 페이지에서 키를 생성합니다. 키는 생성 시 한 번만 표시되므로 안전하게 저장하세요.

항목설명
Key 형식sk-cafe24- + 64자 hex (총 74자)
Base URLhttps://llm-router.cafe24.com
API 경로/api/v1/*
인증 방식Authorization: Bearer sk-cafe24-YOUR_KEY

2. 연결 테스트

curl https://llm-router.cafe24.com/api/v1/models \ -H "Authorization: Bearer sk-cafe24-YOUR_KEY"

Quick Start

API Key가 준비되었으면 Chat Completion을 호출합니다.

curl https://llm-router.cafe24.com/api/v1/chat/completions \ -H "Authorization: Bearer sk-cafe24-YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-ai/DeepSeek-V3.1", "messages": [{"role": "user", "content": "Hello!"}], "stream": true }'
from openai import OpenAI client = OpenAI( base_url="https://llm-router.cafe24.com/api/v1", api_key="sk-cafe24-YOUR_KEY", ) response = client.chat.completions.create( model="deepseek-ai/DeepSeek-V3.1", messages=[{"role": "user", "content": "Hello!"}], stream=True, ) for chunk in response: print(chunk.choices[0].delta.content or "", end="")

Auto Routing

cafe24/auto 모델을 사용하면 프롬프트를 분석하여 코딩, 추론, 번역, 창작 등 task 유형을 자동 판별하고 최적 모델을 선택합니다.

curl https://llm-router.cafe24.com/api/v1/chat/completions \ -H "Authorization: Bearer sk-cafe24-YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"model": "cafe24/auto", "messages": [{"role": "user", "content": "퀵소트를 파이썬으로 구현해줘"}] }'
response = client.chat.completions.create( model="cafe24/auto", messages=[{"role": "user", "content": "퀵소트를 파이썬으로 구현해줘"}], ) print(response.model) # 실제 선택된 모델
ParameterTypeDefaultDescription
cost_quality_balancestring"balanced""quality" 품질 우선 | "balanced" 균형 | "cost" 비용 우선
model_poolstring[]null후보 모델 제한. 예: ["deepseek-ai/*", "Qwen/Qwen3*"]

Allowed Models (Account 영구 설정)

매 요청에 model_pool을 보내는 대신, 라우팅 설정Allowed Models 필드에 와일드카드 패턴을 저장하면 모든 cafe24/auto 호출에 자동 적용됩니다 (per-request model_pool이 없을 때).

적용 범위

Auto Router 관련 설정 (cost_quality_balance, model_pool, Account의 allowed_models)은 cafe24/auto 모델로 호출했을 때만 적용됩니다. 다른 모델 (Qwen/Qwen3-32B, deepseek-ai/DeepSeek-V3.1 등) 호출 시에는 무시됩니다.

응답

HTTP케이스응답
200정상 자동 선택응답 model에 실제 선택된 모델 ID + extra_fields.resolved_model_used 포함
400model_pool/Allowed Models 패턴이 모든 모델을 제외 (0건 매칭){"error":{"code":"invalid_request","message":"Auto Router: 조건을 만족하는 모델이 없습니다 (category=..., patterns=[...])","param":"model_pool"}}

Provider Routing

요청의 provider 객체로 프로바이더 선택을 제어합니다. 설정은 3-layer로 머지됩니다: Account < Preset < Request (request 최우선).

"provider": { "order": ["deepinfra", "siliconflow"], "allow_fallbacks": false }
FieldTypeDescription
orderstring[]프로바이더 시도 순서. 예: ["deepinfra", "siliconflow"]
onlystring[]이 프로바이더만 허용 (화이트리스트)
ignorestring[]이 프로바이더 제외 (블랙리스트)
allow_fallbacksbooleanfallback 허용. 기본 true
sortstring"price" | "throughput" | "latency"
max_priceobject{"prompt": 5.0, "completion": 20.0} per 1M tokens
data_collectionstring"deny" 시 데이터 수집 프로바이더 제외
require_parametersstring[]필수 파라미터. 예: ["tools", "vision"]
quantizationsstring[]허용 양자화. 예: ["fp16", "fp8"]
preferred_min_throughputnumber | object최소 throughput. 50 또는 {"p90": 50}
preferred_max_latencynumber | object최대 latency. 500 또는 {"p50": 300}

정책 우선순위 (3-layer)

Provider Routing 설정은 3개 layer로 머지됩니다. Account < Preset < Request (request가 최우선).

Layer설정 위치적용 범위
AccountWeb 라우팅 설정이 사용자의 모든 요청에 우선 적용
PresetWeb 프리셋 설정 · API preset field해당 preset 사용 요청에만 적용
RequestAPI 요청 body provider 객체해당 요청 1회에만 적용

쉽게 말하면

  • Account 는 큰 울타리입니다. 사용자 본인이 Web 설정에서 정한 정책이며, 모든 요청에 항상 먼저 적용됩니다.
  • Preset 과 Request 는 그 울타리 안에서 동작합니다. Account 가 차단한 provider 는 Preset 이나 Request 에서 다시 허용할 수 없습니다.
  • "무엇만 허용한다"(only) 는 가장 좁은 범위로 좁혀지고, "무엇을 차단한다"(ignore) 는 모두 합쳐서 차단합니다. 즉 안전한 방향으로 머지됩니다.
  • "어느 순서로 시도할지"(order), "무엇 기준으로 정렬할지"(sort) 같은 단일 값은 Request 가 명시한 값이 가장 우선합니다 (없으면 Preset, 없으면 Account 순).

필드별 Merge 규칙

Account / Preset / Request 가 모두 지정되어 있을 때 각 필드별 머지 동작입니다. 한 layer 만 지정되어 있으면 그 값이 그대로 사용됩니다.

FieldMerge 방식의미
ignore합집합 (Account ∪ Preset ∪ Request)어느 layer 에서든 차단하면 차단 — 가장 엄격한 차단 정책
only교집합 (Account ∩ Preset ∩ Request)모든 layer 에서 허용한 것만 사용 — 가장 좁은 허용 범위. 교집합이 빈 set 이면 호출 차단
order상위 layer 우선 (Request > Preset > Account, 비-null 값이 있는 가장 상위 layer 채택)Request 가 명시하면 Request 값. Request 가 명시 안 했고 Preset 명시했으면 Preset 값. 둘 다 없으면 Account
sort상위 layer 우선 (동일)price / throughput / latency
max_price상위 layer 우선 (동일)최대 단가
data_collection상위 layer 우선 (동일)deny 시 데이터 수집 provider 제외
require_parameters상위 layer 우선 (동일)필수 파라미터 목록
quantizations상위 layer 우선 (동일)허용 양자화 목록
preferred_min_throughput상위 layer 우선 (동일)최소 throughput
preferred_max_latency상위 layer 우선 (동일)최대 latency
allow_fallbacksRequest layer 값 (preset/account 무시)Request 에 미명시 시 fallback 기본값 적용
require_zdrOR (어느 layer 든 truetrue)Zero-Data Retention 강제 — 가장 강한 정책 적용

시나리오 예시

실제 사용 상황에서 각 layer 의 설정이 어떻게 합쳐지는지 보여드립니다.

상황AccountPresetRequest최종 결과
ignore 합집합ignore=[deepinfra]ignore=[siliconflow]ignore=[deepinfra, siliconflow]
only 교집합 — 결과 있음only=[deepinfra, siliconflow]only=[deepinfra]only=[deepinfra]
only 교집합 — 결과 빈 setonly=[siliconflow]only=[deepinfra]교집합 빈 set → 호출 차단 (403)
order 덮어쓰기order=[siliconflow, deepinfra]order=[deepinfra]order=[deepinfra] (Preset 이 Account 덮어씀)
order + sort 동시 (Preset/Request 다른 필드)order=[deepinfra]sort="price"order=[deepinfra] + sort="price" (필드별 독립 머지)
require_zdr ORrequire_zdr=falserequire_zdr=truerequire_zdr=true (어느 한 쪽이라도 true)
핵심 정리
  • Account 가 정한 정책은 절대 우회되지 않습니다.
  • Preset 과 Request 는 그 안에서 추가로 좁히거나 다른 필드를 더할 수 있을 뿐입니다.
  • 의도치 않게 차단된다면 먼저 Account 의 ignore / only 설정을 확인해보세요.

모든 라우팅 설정의 우선순위 — 한눈에

Provider 객체 머지 외에도 모델 선택, 화이트리스트, BYOK, 키 선택, 캐시 등 다양한 설정이 서로 다른 위치에서 결정됩니다.
각 설정이 어디서 정해지고, 충돌 시 무엇이 이기는지를 한눈에 정리했습니다.

설정결정 위치우선순위 / 머지빈 set / 충돌 시
Model
(단일 모델)
Preset.model
· Request model
Preset 이 model 을 지정하면
Request 의 model 무시 (override)
둘 다 미지정 시 400
Models
(fallback 후보 배열)
Request models[]
· Preset.fallback_models
Request 배열 먼저 시도
→ Preset fallback_models append (dedupe)
빈 배열이면 단일 모델만 시도
Provider 객체
(12 필드)
Account
· Preset
· Request
위 "필드별 Merge 규칙" 표 참조
(필드별 합집합 / 교집합 / 덮어쓰기)
only 교집합 빈 set → 403
Suffix
(:thinking, :floor)
Request 모델명 뒤 suffix암묵 provider prefs 제공 (sort=price 등)
explicit Account/Preset/Request prefs 가 있으면 무시
(빈 필드만 채움)
해당 모델이 suffix 미지원 시 무시
모델 ID 형식
(OpenRouter 호환)
Request model 문자열 전체/ 포함 전체가 모델 ID
(prefix 를 provider 로 해석 안 함)
미등록 모델 ID → 404 model_not_found
Allowed Models
(모델 화이트리스트)
API Key.allowed_models
· Group.allowed_models
교집합
(둘 다 허용해야 사용 가능)
NULL = 제약 없음
교집합 빈 set → 호출 거부
Auto Router
(cafe24/auto)
Account routing_config
(autoroute pool patterns)
Account 의 pool patterns 만 적용
Preset / Request override 없음
pool 빈 set → 400
(Auto Router: 조건을 만족하는 모델이 없습니다)
BYOK 키 선택User.byok_config
(사용자가 등록한 외부 provider 키)
등록된 provider 호출 시 자동 선택
Account/Preset 라우팅 설정과 무관
BYOK 복호화 실패 시 system 키로 fallback
(fail-open)
System 키 선택
(Two-Tier)
Group.provider_keys
(관리자 등록)
remaining > 0 필터
remaining 최다 키
→ 모두 0이면 Least-Used
Account/Preset 무관
활성 키 0개 → ProviderError
Fallback 동작Account · Preset · Request 의 allow_fallbacksRequest layer 값 사용
(Preset/Account 무시)
기본 true
401 / 403 / 인증 오류는 non-retryable
(fallback skip)
Rate Limit
(RPM/RPD)
API Key.rate_limitAPI Key 단위만
Group/Account override 없음
한도 초과 → 429
Budget
(월간 KRW/토큰)
API Key.budgetAPI Key 단위만한도 초과 → 403
(budget_exceeded)
Semantic CacheAdmin 강제
∧ API Key 토글
∧ 본문 저장 ON
∧ Privacy Filter(request_response_masking) OFF
∧ PII 마스킹(log_masking, 기본 ON) OFF
네 조건 모두 만족할 때만 활성
하나라도 부정이면 자동 비활성
비활성 시 cache miss 처리
(LLM 호출 진행)
Cache Sharing
(그룹 캐시 공유)
Group.cache_sharing_enabledGroup 단위 정책
API Key 토글 불가
OFF 시 API Key 별 격리 캐시만 사용
Privacy Filter
(request_response_masking)
관리자 강제 (admin endpoint)User-level 토글 불가
ON 시 본문 마스킹 + cache 자동 OFF
OFF (default) 시 원문 그대로
Body 저장
(store_request_response)
User.store_request_response
(본인 토글)
User-level
OFF 시 본문 미적재 + cache 자동 OFF
OFF 시 로그 상세에서 "(저장 안 함)"
BYOK 정책
(free_quota / fee_rate)
Admin (전역 admin_settings)모든 user 동일 적용
user 별 override 없음
월 호출수 한도 초과 시
호출 단위 fee 적용
정책 영역 구분 요약
  • 3-layer 머지 영역 (Account / Preset / Request 모두 영향)
    → Provider 객체 12 필드만 해당
  • Preset override 영역
    → Model (Preset.model 이 Request.model 우선) · Models (Request 배열 + Preset.fallback_models append)
  • API Key / Group 단위 영역 (Preset / Request 영향 없음)
    → Allowed Models, BYOK 키 선택, System 키 선택, Rate Limit, Budget, Cache Sharing
  • Account / User 단위 영역
    → Auto Router pool, Body 저장, BYOK 등록 키
  • Admin 강제 영역
    → Privacy Filter, BYOK 정책 (free_quota / fee_rate), Semantic Cache 글로벌 ON/OFF

모델 ID 형식 (OpenRouter 호환)

cafe24 LLM Router 는 모델 문자열 전체를 그대로 모델 ID 로 사용합니다. 모델 ID 에 / 가 포함돼 있어도(예: deepseek-ai/DeepSeek-V3.1) 그 전체가 하나의 모델 ID 이며,/ 앞부분을 provider 로 해석하지 않습니다. GET /api/v1/models 가 반환한 id 를 그대로model 필드에 넣으면 됩니다.

{ "model": "deepseek-ai/DeepSeek-V3.1" }

Provider 선택은 provider 객체로

특정 provider 로 강제하거나 우선순위를 두려면 모델 prefix 가 아니라 위 Provider Routingprovider 객체(order / only / ignore)를 사용합니다. 동일 모델을 여러 provider 가 제공할 때(예: deepseek-ai/DeepSeek-V3.1deepinfra·siliconflow모두 제공) 그중 하나를 선택할 수 있습니다.

{ "model": "deepseek-ai/DeepSeek-V3.1", "provider": { "only": ["siliconflow"] } // siliconflow 로 강제 }

존재하지 않는 모델

/api/v1/models 목록에 없는 모델 ID 를 호출하면 404 model_not_found 를 반환합니다. 이는 시맨틱 캐시 hit 으로도 우회되지 않습니다.

Reserved Model ID

cafe24/auto/ 가 있지만 모델 ID 가 아니라 Auto Router 트리거입니다. 모델 매칭 대신 자동 선택 라우팅으로 동작합니다.

BYOK 모델 ID

BYOK(본인 키)로 호출할 때는 claude-sonnet-4-6 와 같은 형식의 prefix 없는 모델 ID 로만 호출 가능합니다. (anthropic/claude-sonnet-4-6 처럼 provider/ prefix 가 붙은 형식은 BYOK 경로에서 지원되지 않습니다.)

Fallback Chain

models 배열의 각 항목도 동일하게 모델 ID 전체로 지정합니다. 앞 모델이 실패하면 다음으로 전환됩니다.

{ "model": "deepseek-ai/DeepSeek-V3.1", "models": [ "deepseek-ai/DeepSeek-V3.1", "Qwen/Qwen3-32B", "Qwen/Qwen3-8B" ] }

Model Features

Model Suffix

모델 ID 뒤에 :suffix를 붙여 동작을 변경합니다.

SuffixExampleEffect
:floordeepseek-ai/DeepSeek-V3.1:floor가장 저렴한 프로바이더 우선
:nitrodeepseek-ai/DeepSeek-V3.1:nitro가장 빠른 프로바이더 우선
:thinkingQwen/Qwen3-32B:thinking추론 모드 활성화
:freeQwen/Qwen3-8B:free무료 프로바이더 우선 (없으면 기본 라우팅)

Model Fallback

model 필드와 함께 models 배열로 순차 시도할 모델 체인을 지정합니다. 첫 모델이 실패하면 다음 모델로 자동 전환됩니다. model 필드는 필수이며, models만 단독 사용은 불가합니다.

{ "models": ["deepseek-ai/DeepSeek-V3.1", "Qwen/Qwen3-8B", "deepseek-ai/DeepSeek-V3.2"], "messages": [{"role": "user", "content": "Hello"}] }

Sticky Routing

동일 대화를 같은 프로바이더로 라우팅하여 KV 캐시를 활용합니다. Multi-turn 대화 시 자동 적용됩니다.


Presets

프리셋은 모델 + 프로바이더 라우팅 + 샘플링 파라미터를 하나의 설정으로 묶어 재사용하는 기능입니다. 수정 시 자동으로 버전 스냅샷이 저장됩니다.

프리셋 사용 (3가지 방법)

MethodExampleDescription
@preset/"model": "@preset/fast-coding"프리셋의 모델과 설정 모두 적용
Model override"model": "Qwen/Qwen3-32B@preset/fast-coding"모델만 변경, 나머지 프리셋 적용
preset field"preset": "fast-coding"별도 필드로 프리셋 지정

요청 파라미터가 프리셋 값을 오버라이드합니다. 프리셋 설정 페이지에서 UI로 생성하거나 API로 직접 관리합니다.


Semantic Cache

동일하거나 유사한 요청에 대해 캐시된 응답을 반환하여 비용을 절감하고 응답 속도를 높입니다.

설정위치설명
API Key별 ON/OFFAPI 키 관리 페이지키별 캐시 활성화/비활성화 + 유사도 임계값 (0.70~0.99)
요청별 제어요청 body"cache": {"semantic": false}로 개별 요청 캐시 비활성화

우선순위

API Key OFF > 요청 OFF > API Key 설정 > 글로벌 기본값. API Key에서 OFF한 경우 요청에서 ON할 수 없습니다.

캐시 스코프

시맨틱 캐시는 모델 단위로 동작합니다. 동일 model_id는 호출 형식 (bare 또는 prefix)과 무관하게 동일 캐시를 공유하여 효율을 극대화합니다. 같은 모델은 어느 provider가 제공하든 응답이 본질적으로 동일하기 때문입니다.

모델 ID 와 캐시

캐시는 모델 ID 단위로 동작합니다:

  • 유효한 모델 ID → 모델 단위 캐시 정상 hit (caching 효율 유지)
  • 미등록 모델 ID (예: Qwen/Qwen3-NotExist) → 캐시 lookup 전 차단되어 404 model_not_found

즉 잘못된 모델 ID 호출이 캐시 hit 으로 silently 성공하는 일은 없습니다.

캐시 엔트리는 캐시 관리 페이지에서 조회/삭제할 수 있습니다.


Metadata

요청에 metadata를 포함하면 사용량을 팀, 프로젝트, 환경 등으로 분류하여 추적할 수 있습니다. 프로바이더에 전달되지 않으며 로그에만 저장됩니다.

curl https://llm-router.cafe24.com/api/v1/chat/completions \ -H "Authorization: Bearer sk-cafe24-YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"model": "Qwen/Qwen3-8B", "messages": [{"role": "user", "content": "Hello"}], "metadata": {"team": "backend", "project": "api-server", "env": "prod"} }'
response = client.chat.completions.create( model="Qwen/Qwen3-8B", messages=[{"role": "user", "content": "Hello"}], extra_body={"metadata": {"team": "backend", "project": "api-server"}}, )

사용 현황에서 metadata key-value 조합별 사용량을 집계할 수 있습니다.


Request/Response Body 저장

계정 단위 요청/응답 본문 저장 정책을 본인이 직접 토글합니다. default OFF — 디버깅이 필요할 때만 ON 으로 변경하세요. 본문 저장 OFF 상태에서는 시맨틱 캐시도 자동 비활성화됩니다.

항목설명
적용 범위계정 단위 — 본인이 발급한 모든 API Key 에 일괄 적용
기본값OFF — 본문이 저장되지 않음. 메타데이터/토큰/비용/모델명은 정상 적재
설정 방법프라이버시 설정 페이지 상단의 “Prompt / Response 데이터 관리” 카드에서 ON/OFF 토글
관리자 강제 OFF민감 데이터/컴플라이언스 사유로 관리자가 계정 단위 비상 OFF 가능 (audit 기록)
시맨틱 캐시본문 저장 OFF 면 시맨틱 캐시도 자동 OFF (semantic_cache_entries 가 raw 본문 저장)
보관 기간 (retention)저장된 본문의 보관 일수 — 7 / 30(기본) / 90일 중 선택. 경과 시 자동 삭제
전환 시점OFF 토글 후 최대 300초 안에 모든 키에 반영 (Redis auth cache 만료)

Privacy Filter

LLM 호출 직전 요청 내용 중 민감정보(PII)만 식별해 마스킹 후 프로바이더로 전송하는 기능입니다. 본문 저장 정책과는 독립적으로 동작하지만, 마스터 스위치가 ON 이면 시맨틱 캐시는 자동 비활성화됩니다. 프라이버시 설정 페이지에서 룰을 관리합니다.

항목설명
적용 시점LLM 호출 직전 사용자 요청 내용
처리 방식REDACT 룰: 매칭 부분만 마스킹/치환 후 전송. BLOCK 룰: 매칭 시 요청 전체를 403 guardrail_blocked 로 차단
마스터 ON/OFF관리자 강제 (request_response_masking, user 토글 불가). 단 PII 카테고리/커스텀 룰은 사용자가 직접 관리
설정 위치Privacy Filter 페이지 — 사용자가 직접 룰 추가/수정/삭제
본문 저장과 관계본문 저장 정책과는 독립 (저장 ON/OFF 무관하게 동작)
시맨틱 캐시와 관계마스터 ON 시 시맨틱 캐시 자동 OFF (마스킹된 본문은 캐시 대상 제외)

Base URL: https://llm-router.cafe24.com/api/v1

Models

GET/api/v1/models
사용 가능한 모델 목록. cafe24/auto 포함. 프로바이더 가용성 정보 포함.

Chat Completions

POST/api/v1/chat/completions
OpenAI 호환 Chat Completion. 스트리밍, Auto Routing, Preset, Provider Routing, Fallback, Function Calling, Vision 지원.
curl https://llm-router.cafe24.com/api/v1/chat/completions \ -H "Authorization: Bearer sk-cafe24-YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"model": "deepseek-ai/DeepSeek-V3.1", "messages": [{"role": "user", "content": "Hello!"}], "max_tokens": 100, "stream": true }'
response = client.chat.completions.create( model="deepseek-ai/DeepSeek-V3.1", messages=[{"role": "user", "content": "Hello!"}], max_tokens=100, stream=True, )

Request Parameters

POST /api/v1/chat/completions 요청 body 파라미터. 다른 엔드포인트도 공통 파라미터를 지원합니다.

Required

ParameterTypeDescription
modelstring모델 ID. "deepseek-ai/DeepSeek-V3.1", "cafe24/auto", "@preset/slug"
messagesarray메시지 배열. [{"role": "user", "content": "..."}]

Sampling

ParameterTypeDefaultDescription
temperaturenumber1.0랜덤성 (0~2)
top_pnumber1.0Nucleus sampling (0~1)
max_tokensinteger-최대 출력 토큰 수 (최소 16)
frequency_penaltynumber0반복 억제 (-2~2)
presence_penaltynumber0새 토픽 유도 (-2~2)
streambooleanfalseSSE 스트리밍
stopstring[]null생성 중단 토큰
seedintegernull재현성 시드
response_formatobjectnullJSON mode / Structured Outputs
logprobsbooleanfalse로그 확률 반환
top_logprobsintegernull상위 N개 로그 확률 (0~20)

Routing

ParameterTypeDescription
providerobject프로바이더 라우팅 설정
modelsstring[]Fallback 모델 체인
presetstring프리셋 slug
toolsarrayFunction calling 도구 정의
tool_choicestring | object도구 선택 전략. "auto", "none", 또는 {"type":"function","function":{"name":"..."}}
cost_quality_balancestringAuto Router 균형
model_poolstring[]Auto Router 후보 와일드카드
cacheobject캐시 제어. {"semantic": false}

Tracking

ParameterTypeDescription
metadataobject요청 추적용 key-value. 프로바이더에 전달되지 않음.

OpenAI / Anthropic 공식 SDK를 그대로 사용합니다. base_url만 LLM Router로 변경하면 됩니다.

Python (OpenAI SDK)

OpenAI, Google, DeepSeek 등 OpenAI 호환 모델에 사용합니다.

pip install openai
from openai import OpenAI client = OpenAI( base_url="https://llm-router.cafe24.com/api/v1", api_key="sk-cafe24-YOUR_KEY", ) # Chat Completion response = client.chat.completions.create( model="deepseek-ai/DeepSeek-V3.1", messages=[{"role": "user", "content": "Hello!"}], ) print(response.choices[0].message.content) # Streaming stream = client.chat.completions.create( model="deepseek-ai/DeepSeek-V3.1", messages=[{"role": "user", "content": "Hello!"}], stream=True, ) for chunk in stream: print(chunk.choices[0].delta.content or "", end="") # Metadata, Provider Routing (extra_body) response = client.chat.completions.create( model="deepseek-ai/DeepSeek-V3.1", messages=[{"role": "user", "content": "Hello"}], extra_body={ "metadata": {"team": "backend"}, "provider": {"order": ["siliconflow"]}, }, )

Node.js (OpenAI SDK)

npm install openai
import OpenAI from 'openai'; const client = new OpenAI({ baseURL: 'https://llm-router.cafe24.com/api/v1', apiKey: 'sk-cafe24-YOUR_KEY', }); // Chat Completion const response = await client.chat.completions.create({ model: 'deepseek-ai/DeepSeek-V3.1', messages: [{ role: 'user', content: 'Hello!' }], }); // Streaming const stream = await client.chat.completions.create({ model: 'deepseek-ai/DeepSeek-V3.1', messages: [{ role: 'user', content: 'Hello!' }], stream: true, }); for await (const chunk of stream) { process.stdout.write(chunk.choices[0]?.delta?.content || ''); }

curl

모든 엔드포인트를 curl로 직접 호출할 수 있습니다.

# 환경변수 설정 export LLM_ROUTER_URL="https://llm-router.cafe24.com" export LLM_ROUTER_KEY="sk-cafe24-YOUR_KEY" # Chat Completion curl $LLM_ROUTER_URL/api/v1/chat/completions \ -H "Authorization: Bearer $LLM_ROUTER_KEY" \ -H "Content-Type: application/json" \ -d '{"model": "deepseek-ai/DeepSeek-V3.1", "messages": [{"role": "user", "content": "Hello"}]}' # Model List curl $LLM_ROUTER_URL/api/v1/models \ -H "Authorization: Bearer $LLM_ROUTER_KEY"