Warp Router
Warp 라우터
모든 요청이 프론티어 모델을 쓸 필요는 없습니다. Warp은 프롬프트 난이도를 수 밀리초 만에 점수화해서, 품질을 지키는 선에서 가장 저렴한 티어로 요청을 보냅니다.
warp/auto — 자동 라우팅
model: "warp/auto"로 요청하면 매 요청을 평가해 알맞은 모델로 보냅니다. 쉬운 요청은 가벼운 모델이, 어려운 요청은 상위 모델이 맡습니다. 평가는 게이트웨이 안에서 수 밀리초 안에 끝나며 별도 LLM 호출이 없어, 라우팅 자체가 지연이나 비용을 더하지 않습니다.
어떤 모델이 서빙했는지는 응답 메타의 model과 x-warp-model 헤더로, 얼마나 아꼈는지는 saved_usd로 매 요청 확인할 수 있습니다.
인텐트 다이얼
워크로드마다 원하는 트레이드오프가 다릅니다. warp.dial(요청 단위) 또는 키의 라우팅 정책(routing.dial)으로 4가지 중 하나를 고릅니다. 적용된 다이얼은 응답 메타 dial과 x-warp-dial 헤더로 확인합니다.
| 다이얼 | 설명 | 추천 워크로드 |
|---|---|---|
balanced | 기본값. 비용과 품질의 균형점. | 범용 백엔드 · 사내 어시스턴트 · 기본 통합 |
strict-quality | 품질 우선. 상위 모델로 더 쉽게 올리고, 하향에 보수적입니다. | 고객 대면 챗봇 · 법률/의료 등 오답 비용이 큰 업무 |
max-savings | 절약 우선. 점수와 무관하게 가장 저렴한 티어로 보냅니다 (anchor가 걸린 최고난도 요청만 예외). | 대량 배치 · 오프라인 파이프라인 · 태깅/분류 |
low-latency | 속도 우선. 올리는 기준은 balanced와 같고, 고른 후보 중 응답이 빠른 쪽과 직전에 쓰던 모델을 우선합니다. | 앵커를 건 실시간 UI · 자동완성 · 음성/스트리밍 프런트 |
자동 라우터 — 셋
셋뿐이고, 위의 warp/auto도 그중 하나입니다. 셋 다 자동으로 라우팅하며, 무엇을 대상으로 고르는지가 다릅니다. 라우터 id를 모델 문자열로 지정할 수 있습니다. 전부 가상 모델 id라 어떤 OpenAI SDK에서도 model 문자열 하나만 바꾸면 적용됩니다.
| 라우터 id | 설명 | 추천 워크로드 |
|---|---|---|
warp/auto | 기본 — 프롬프트 난이도를 점수화해 알맞은 티어로 보냅니다. | 범용 |
warp/code | 코드 — 코딩 특화 — 티어별로 코딩 작업에 맞춰 고른 체인을 쓰고, 어려운 코드는 프론티어로 보냅니다. | 코드 작성·리팩터링·디버깅, 코딩 에이전트 |
warp/nitro | 최고 속도 — 실측 처리량(tokens/sec)·지연 기준으로 가장 빠른 모델을 고릅니다. 난이도 티어 없음. | 실시간 UI · 자동완성 · 음성/스트리밍 |
지정 라우팅 — 쓰던 모델을 기준으로
warp/auto에 모델 선택을 통째로 맡기는 게 부담스럽다면, 반대 방향으로 쓸 수 있습니다. 지금 쓰는 모델을 warp.anchor로 지정하면 그 모델이 품질 상한이 됩니다 — 어려운 요청은 반드시 그 모델이 답하고, 쉬운 요청만 아래 티어로 내려갑니다. 정할 것은 두 가지뿐입니다.
| 정하는 것 | 필드 | 값 |
|---|---|---|
| 품질 상한 | anchor | 지금 쓰는 모델의 카탈로그 id. 어려운 요청은 여기까지 올라오고, 이 위로는 올라가지 않습니다. |
| 성향 | dial | strict-quality(품질 우선) · balanced(균형, 기본값) · max-savings(절약 우선) · low-latency(속도 우선) — 인텐트 다이얼 참조. |
dial을 생략하면 balanced입니다. 즉 최소 형태는 앵커 한 줄입니다.
{
"model": "warp/auto",
"messages": [{ "role": "user", "content": "이번 분기 지표를 요약해줘" }],
"warp": {
"anchor": "anthropic/claude-fable-5"
}
}나머지는 라우터가 정합니다
어떤 경량 모델을 붙일지, 언제 내려보낼지는 고르지 않아도 됩니다. 후보는 티어별로 선별된 체인이고, 벤치마크 성적을 참고해 저희가 갱신합니다 — 직접 고르거나 관리하지 않아도 됩니다. 특정 모델이나 벤더를 쓰지 않게 하려면 고르는 대신 모델 정책으로 제외하세요.
요청 본문을 못 보내는 도구
Claude Code·Cursor처럼 고정된 형식으로만 말하는 도구는 요청에 warp 객체를 넣을 자리가 없습니다. 이런 도구는 키에 저장된 라우팅 기본값을 씁니다 — 적용 순서는 요청 > 키 > 조직이라, 키에 앵커를 저장해두면 그 키로 들어오는 warp/auto 요청 전부에 적용됩니다. 도구별 설정은 도구 연동을 참고하세요.
curl -X PATCH https://api.warp.inc/v1/org/keys/key_abc123 \
-H "Authorization: Bearer $WARP_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"routing": {
"anchorModel": "anthropic/claude-fable-5",
"dial": "balanced"
}
}'동적 가격 추적
카탈로그에 표시된 가격은 스냅샷입니다. 실제 과금 단가는 LiteLLM·OpenRouter 가격 피드에서 주기적으로 동기화되며(기본 6시간), 변경 이력은 model_pricing 이력 테이블에 기록됩니다. 현재 단가는 GET /admin/pricing으로 조회하고, POST /admin/pricing/refresh로 즉시 재동기화하거나, PUT /admin/pricing/override로 특정 모델의 단가를 수동 고정할 수 있습니다.
명시적 모델 지정
카탈로그 id는 vendor/model 형식입니다 — 예: anthropic/claude-fable-5, openai/gpt-5.2, deepseek/deepseek-v3.2. 전체 목록은 GET /v1/models로 조회합니다. 모델을 명시하면 라우팅을 거치지 않고 그대로 전달되며(classifier_score: null), 카탈로그에 없는 id는 404 model_not_found로 거부됩니다. 다만 warp.tier는 명시 모델에도 지출 상한으로 적용됩니다 — 상한을 넘는 모델을 지목하면 그 요청은 강제된 티어의 라우팅을 다시 타고, 예산 하향이 모델 이름을 하드코딩한 클라이언트만 비껴가지 않게 합니다.
요청별 warp 옵션
요청 본문의 warp 객체로 라우팅·캐시 동작을 요청 단위로 제어할 수 있습니다. 모든 필드는 선택 사항입니다.
{
"model": "warp/auto",
"messages": [{ "role": "user", "content": "핵심 API를 설계해줘" }],
"warp": {
"dial": "strict-quality",
"anchor": "anthropic/claude-fable-5",
"session_id": "conv_8f2a91",
"context_compression": true,
"no_cache": true
}
}| 필드 | 타입 | 설명 |
|---|---|---|
dial | balanced | strict-quality | max-savings | low-latency | 이 요청의 인텐트 다이얼. 생략 시 키에 설정된 다이얼, 그다음 balanced. 앵커가 걸린 요청에서만 적용됩니다. |
anchor | string | 앵커(상한) 모델 id — 초고난도 쿼리도 이 모델 이상으로는 폴백하지 않습니다. 키의 routing.anchorModel보다 우선합니다. |
cascade | boolean | 품질 재검증 — 기본 true. 티어 2·3이 낸 답이 명백히 못 쓸 응답이면 한 단계 위 티어에서 한 번 다시 서빙합니다. 자동으로 되는 것 참조. 키의 routing.cascade보다 우선합니다. |
session_id | string | 스티키 라우팅 세션 id — 같은 id의 대화는 프롬프트 캐시가 따뜻한 모델로 고정됩니다 (x-warp-sticky 헤더로 확인). |
context_compression | boolean | 과도하게 긴 프롬프트의 중간을 잘라(lost-in-the-middle trim) 더 저렴한 모델의 컨텍스트 윈도에 맞춥니다. |
tier | 1 | 2 | 3 | 라우터가 고르는 대신 이 티어를 강제합니다. 명시 모델·warp/nitro를 포함한 모든 경로에서 지출 상한으로 적용됩니다. |
no_cache | boolean | 이 요청의 캐시 조회·저장을 모두 비활성화합니다. |
no_pii_mask | boolean | 키에 PII 마스킹이 켜져 있어도 이 요청만 마스킹 없이 전달합니다. |
fallbacks | string[] | 명시 모델 요청 전용 — 지정한 모델 뒤에 이어 붙는 카탈로그 id 체인입니다. 라우터 id를 쓰면 폴백은 이미 자동으로 동작합니다. |
shadow | boolean | 검증(섀도) 모드 — 응답은 앵커(없으면 기준 모델)가 그대로 서빙하고, 라우터가 골랐을 모델과 예상 비용은 응답 메타 warp.shadow(would_model · would_tier · would_cost_usd)와 x-warp-shadow 헤더에 기록만 합니다. 실제 트래픽으로 라우터를 무위험 검증할 때 쓰세요. 키의 routing.shadow보다 우선하며, 자동 라우팅에만 적용됩니다. |
Fallback 체인의 동작
- 재시도 조건 — 업스트림이
429,5xx, 또는 인증·한도 오류(401·402·403)를 반환하거나 네트워크/타임아웃 오류가 나면 다음 후보로 자동 전환합니다 — 한 프로바이더의 키가 만료되거나 잔액이 떨어졌다고 요청 전체가 실패할 이유는 없기 때문입니다. 그 외4xx(잘못된 요청 등)는 즉시 실패합니다 — 다만 잔액 소진·엔진 과부하처럼 “이 호스트가 못 한다”는 벤더 코드가 실려 오면429처럼 다음 후보로 넘어갑니다. - 전환 순서 — 같은 모델의 대체 프로바이더(
altProviders, 예: DeepInfra → Novita)를 먼저 시도한 뒤, 다음 후보 모델로 넘어갑니다. - 추적 — 시도한 경로는 응답 메타의
attempts배열과x-warp-attempts헤더에 기록됩니다. - 전부 실패 시 —
502 upstream_unavailable로 응답합니다. - 예산 다운그레이드 — 키 또는 그 팀이 예산을 넘고 정책이
downgrade이면, 그 키의 모든 요청이 Tier 3로 강제됩니다 — 자동 라우팅도, 직접 지정한 모델도,warp/nitro도 같습니다. 거버넌스 참조.
응답 메타데이터
모든 응답에는 라우팅 결과가 본문 warp 필드와 x-warp-* 헤더로 붙습니다.
{
"id": "chatcmpl-…",
"object": "chat.completion",
"model": "moonshot/kimi-k2.7-code",
"choices": [ … ],
"usage": { "prompt_tokens": 21, "completion_tokens": 96, "total_tokens": 117 },
"warp": {
"model": "moonshot/kimi-k2.7-code",
"provider": "moonshot",
"tier": 2,
"classifier_score": 0.41,
"cache_hit": null,
"cost_usd": 0.000122,
"saved_usd": 0.003886,
"latency_ms": 842,
"pii_masked": 0,
"attempts": [],
"dial": "balanced",
"sticky": true,
"pipeline": ["difficulty:0.41→tier2", "context:fit=3/3", "sticky:applied"],
"guardrails": { "mode": "mask", "findings": 0, "blocked": false }
}
}| 헤더 | 값 |
|---|---|
x-warp-model | 실제 서빙한 카탈로그 모델 id |
x-warp-tier | 라우팅된 티어 (1–3). 티어가 없는 요청에는 헤더가 붙지 않습니다. |
x-warp-cache | exact | semantic | miss |
x-warp-cost-usd | 이 요청의 비용 (USD, 소수 6자리) |
x-warp-saved-usd | Tier 1 baseline 대비 절감액 (USD) |
x-warp-attempts | 이 요청에서 기록된 시도 메모 (폴백이 일어났을 때 등) |
x-warp-dial | 적용된 인텐트 다이얼 — balanced · strict-quality · max-savings · low-latency |
x-warp-sticky | true | false — 스티키 라우팅이 캐시가 따뜻한 프로바이더로 고정했는지. 캐시 히트 응답에는 붙지 않습니다 — 라우팅 전에 반환되기 때문입니다. |
x-warp-guardrail-findings | 가드레일 탐지 건수 (0이어도 붙습니다) — 티어드 가드레일 참조 |
스트리밍에서는 비용을 미리 알 수 없으므로 시작 시 x-warp-model · x-warp-tier · x-warp-dial · x-warp-strategy · x-warp-sticky · x-warp-attempts · x-warp-shadow · x-warp-guardrail-findings가 헤더로 나가고, 스트림의 마지막 데이터 청크(choices: [])에 usage와 warp 메타 전체가 담긴 뒤 data: [DONE]이 옵니다.