Cafe24 LLM Router는 OpenAI SDK 호환 API를 제공합니다. 하나의 API Key로 OpenAI, Anthropic, Google, DeepSeek 등 여러 프로바이더의 모델을 사용할 수 있습니다.
API를 호출하려면 먼저 API Key가 필요합니다.
API 키 관리 페이지에서 키를 생성합니다. 키는 생성 시 한 번만 표시되므로 안전하게 저장하세요.
| 항목 | 설명 |
|---|---|
| Key 형식 | sk-cafe24- + 64자 hex (총 74자) |
| Base URL | https://llm-router.cafe24.com |
| API 경로 | /api/v1/* |
| 인증 방식 | Authorization: Bearer sk-cafe24-YOUR_KEY |
curl https://llm-router.cafe24.com/api/v1/models \
-H "Authorization: Bearer sk-cafe24-YOUR_KEY"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="")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) # 실제 선택된 모델| Parameter | Type | Default | Description |
|---|---|---|---|
cost_quality_balance | string | "balanced" | "quality" 품질 우선 | "balanced" 균형 | "cost" 비용 우선 |
model_pool | string[] | null | 후보 모델 제한. 예: ["deepseek-ai/*", "Qwen/Qwen3*"] |
매 요청에 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 포함 |
| 400 | model_pool/Allowed Models 패턴이 모든 모델을 제외 (0건 매칭) | {"error":{"code":"invalid_request","message":"Auto Router: 조건을 만족하는 모델이 없습니다 (category=..., patterns=[...])","param":"model_pool"}} |
요청의 provider 객체로 프로바이더 선택을 제어합니다. 설정은 3-layer로 머지됩니다: Account < Preset < Request (request 최우선).
"provider": {
"order": ["deepinfra", "siliconflow"],
"allow_fallbacks": false
}| Field | Type | Description |
|---|---|---|
order | string[] | 프로바이더 시도 순서. 예: ["deepinfra", "siliconflow"] |
only | string[] | 이 프로바이더만 허용 (화이트리스트) |
ignore | string[] | 이 프로바이더 제외 (블랙리스트) |
allow_fallbacks | boolean | fallback 허용. 기본 true |
sort | string | "price" | "throughput" | "latency" |
max_price | object | {"prompt": 5.0, "completion": 20.0} per 1M tokens |
data_collection | string | "deny" 시 데이터 수집 프로바이더 제외 |
require_parameters | string[] | 필수 파라미터. 예: ["tools", "vision"] |
quantizations | string[] | 허용 양자화. 예: ["fp16", "fp8"] |
preferred_min_throughput | number | object | 최소 throughput. 50 또는 {"p90": 50} |
preferred_max_latency | number | object | 최대 latency. 500 또는 {"p50": 300} |
Provider Routing 설정은 3개 layer로 머지됩니다. Account < Preset < Request (request가 최우선).
| Layer | 설정 위치 | 적용 범위 |
|---|---|---|
| Account | Web 라우팅 설정 | 이 사용자의 모든 요청에 우선 적용 |
| Preset | Web 프리셋 설정 · API preset field | 해당 preset 사용 요청에만 적용 |
| Request | API 요청 body provider 객체 | 해당 요청 1회에만 적용 |
only) 는 가장 좁은 범위로 좁혀지고, "무엇을 차단한다"(ignore) 는 모두 합쳐서 차단합니다. 즉 안전한 방향으로 머지됩니다.order), "무엇 기준으로 정렬할지"(sort) 같은 단일 값은 Request 가 명시한 값이 가장 우선합니다 (없으면 Preset, 없으면 Account 순).Account / Preset / Request 가 모두 지정되어 있을 때 각 필드별 머지 동작입니다. 한 layer 만 지정되어 있으면 그 값이 그대로 사용됩니다.
| Field | Merge 방식 | 의미 |
|---|---|---|
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_fallbacks | Request layer 값 (preset/account 무시) | Request 에 미명시 시 fallback 기본값 적용 |
require_zdr | OR (어느 layer 든 true 면 true) | Zero-Data Retention 강제 — 가장 강한 정책 적용 |
실제 사용 상황에서 각 layer 의 설정이 어떻게 합쳐지는지 보여드립니다.
| 상황 | Account | Preset | Request | 최종 결과 |
|---|---|---|---|---|
ignore 합집합 | ignore=[deepinfra] | ignore=[siliconflow] | — | ignore=[deepinfra, siliconflow] |
only 교집합 — 결과 있음 | only=[deepinfra, siliconflow] | — | only=[deepinfra] | only=[deepinfra] |
only 교집합 — 결과 빈 set | only=[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 OR | require_zdr=false | require_zdr=true | — | require_zdr=true (어느 한 쪽이라도 true) |
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_fallbacks | Request layer 값 사용 (Preset/Account 무시) 기본 true | 401 / 403 / 인증 오류는 non-retryable (fallback skip) |
| Rate Limit (RPM/RPD) | API Key.rate_limit | API Key 단위만 Group/Account override 없음 | 한도 초과 → 429 |
| Budget (월간 KRW/토큰) | API Key.budget | API Key 단위만 | 한도 초과 → 403 ( budget_exceeded) |
| Semantic Cache | Admin 강제 ∧ API Key 토글 ∧ 본문 저장 ON ∧ Privacy Filter(request_response_masking) OFF ∧ PII 마스킹(log_masking, 기본 ON) OFF | 네 조건 모두 만족할 때만 활성 하나라도 부정이면 자동 비활성 | 비활성 시 cache miss 처리 (LLM 호출 진행) |
| Cache Sharing (그룹 캐시 공유) | Group.cache_sharing_enabled | Group 단위 정책 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 적용 |
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 로 강제하거나 우선순위를 두려면 모델 prefix 가 아니라 위 Provider Routing 의provider 객체(order / only / ignore)를 사용합니다. 동일 모델을 여러 provider 가 제공할 때(예: deepseek-ai/DeepSeek-V3.1 은 deepinfra·siliconflow모두 제공) 그중 하나를 선택할 수 있습니다.
{
"model": "deepseek-ai/DeepSeek-V3.1",
"provider": { "only": ["siliconflow"] } // siliconflow 로 강제
}/api/v1/models 목록에 없는 모델 ID 를 호출하면 404 model_not_found 를 반환합니다. 이는 시맨틱 캐시 hit 으로도 우회되지 않습니다.
cafe24/auto 는 / 가 있지만 모델 ID 가 아니라 Auto Router 트리거입니다. 모델 매칭 대신 자동 선택 라우팅으로 동작합니다.
BYOK(본인 키)로 호출할 때는 claude-sonnet-4-6 와 같은 형식의 prefix 없는 모델 ID 로만 호출 가능합니다. (anthropic/claude-sonnet-4-6 처럼 provider/ prefix 가 붙은 형식은 BYOK 경로에서 지원되지 않습니다.)
models 배열의 각 항목도 동일하게 모델 ID 전체로 지정합니다. 앞 모델이 실패하면 다음으로 전환됩니다.
{
"model": "deepseek-ai/DeepSeek-V3.1",
"models": [
"deepseek-ai/DeepSeek-V3.1",
"Qwen/Qwen3-32B",
"Qwen/Qwen3-8B"
]
}모델 ID 뒤에 :suffix를 붙여 동작을 변경합니다.
| Suffix | Example | Effect |
|---|---|---|
:floor | deepseek-ai/DeepSeek-V3.1:floor | 가장 저렴한 프로바이더 우선 |
:nitro | deepseek-ai/DeepSeek-V3.1:nitro | 가장 빠른 프로바이더 우선 |
:thinking | Qwen/Qwen3-32B:thinking | 추론 모드 활성화 |
:free | Qwen/Qwen3-8B:free | 무료 프로바이더 우선 (없으면 기본 라우팅) |
model 필드와 함께 models 배열로 순차 시도할 모델 체인을 지정합니다. 첫 모델이 실패하면 다음 모델로 자동 전환됩니다. model 필드는 필수이며, models만 단독 사용은 불가합니다.
{
"models": ["deepseek-ai/DeepSeek-V3.1", "Qwen/Qwen3-8B", "deepseek-ai/DeepSeek-V3.2"],
"messages": [{"role": "user", "content": "Hello"}]
}동일 대화를 같은 프로바이더로 라우팅하여 KV 캐시를 활용합니다. Multi-turn 대화 시 자동 적용됩니다.
프리셋은 모델 + 프로바이더 라우팅 + 샘플링 파라미터를 하나의 설정으로 묶어 재사용하는 기능입니다. 수정 시 자동으로 버전 스냅샷이 저장됩니다.
| Method | Example | Description |
|---|---|---|
@preset/ | "model": "@preset/fast-coding" | 프리셋의 모델과 설정 모두 적용 |
| Model override | "model": "Qwen/Qwen3-32B@preset/fast-coding" | 모델만 변경, 나머지 프리셋 적용 |
preset field | "preset": "fast-coding" | 별도 필드로 프리셋 지정 |
요청 파라미터가 프리셋 값을 오버라이드합니다. 프리셋 설정 페이지에서 UI로 생성하거나 API로 직접 관리합니다.
동일하거나 유사한 요청에 대해 캐시된 응답을 반환하여 비용을 절감하고 응답 속도를 높입니다.
| 설정 | 위치 | 설명 |
|---|---|---|
| API Key별 ON/OFF | API 키 관리 페이지 | 키별 캐시 활성화/비활성화 + 유사도 임계값 (0.70~0.99) |
| 요청별 제어 | 요청 body | "cache": {"semantic": false}로 개별 요청 캐시 비활성화 |
API Key OFF > 요청 OFF > API Key 설정 > 글로벌 기본값. API Key에서 OFF한 경우 요청에서 ON할 수 없습니다.
시맨틱 캐시는 모델 단위로 동작합니다. 동일 model_id는 호출 형식 (bare 또는 prefix)과 무관하게 동일 캐시를 공유하여 효율을 극대화합니다. 같은 모델은 어느 provider가 제공하든 응답이 본질적으로 동일하기 때문입니다.
캐시는 모델 ID 단위로 동작합니다:
Qwen/Qwen3-NotExist) → 캐시 lookup 전 차단되어 404 model_not_found즉 잘못된 모델 ID 호출이 캐시 hit 으로 silently 성공하는 일은 없습니다.
캐시 엔트리는 캐시 관리 페이지에서 조회/삭제할 수 있습니다.
요청에 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 조합별 사용량을 집계할 수 있습니다.
계정 단위 요청/응답 본문 저장 정책을 본인이 직접 토글합니다. 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 만료) |
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
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,
)POST /api/v1/chat/completions 요청 body 파라미터. 다른 엔드포인트도 공통 파라미터를 지원합니다.
| Parameter | Type | Description |
|---|---|---|
model | string | 모델 ID. "deepseek-ai/DeepSeek-V3.1", "cafe24/auto", "@preset/slug" |
messages | array | 메시지 배열. [{"role": "user", "content": "..."}] |
| Parameter | Type | Default | Description |
|---|---|---|---|
temperature | number | 1.0 | 랜덤성 (0~2) |
top_p | number | 1.0 | Nucleus sampling (0~1) |
max_tokens | integer | - | 최대 출력 토큰 수 (최소 16) |
frequency_penalty | number | 0 | 반복 억제 (-2~2) |
presence_penalty | number | 0 | 새 토픽 유도 (-2~2) |
stream | boolean | false | SSE 스트리밍 |
stop | string[] | null | 생성 중단 토큰 |
seed | integer | null | 재현성 시드 |
response_format | object | null | JSON mode / Structured Outputs |
logprobs | boolean | false | 로그 확률 반환 |
top_logprobs | integer | null | 상위 N개 로그 확률 (0~20) |
| Parameter | Type | Description |
|---|---|---|
provider | object | 프로바이더 라우팅 설정 |
models | string[] | Fallback 모델 체인 |
preset | string | 프리셋 slug |
tools | array | Function calling 도구 정의 |
tool_choice | string | object | 도구 선택 전략. "auto", "none", 또는 {"type":"function","function":{"name":"..."}} |
cost_quality_balance | string | Auto Router 균형 |
model_pool | string[] | Auto Router 후보 와일드카드 |
cache | object | 캐시 제어. {"semantic": false} |
| Parameter | Type | Description |
|---|---|---|
metadata | object | 요청 추적용 key-value. 프로바이더에 전달되지 않음. |
OpenAI / Anthropic 공식 SDK를 그대로 사용합니다. base_url만 LLM Router로 변경하면 됩니다.
OpenAI, Google, DeepSeek 등 OpenAI 호환 모델에 사용합니다.
pip install openaifrom 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"]},
},
)npm install openaiimport 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로 직접 호출할 수 있습니다.
# 환경변수 설정
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"