맞춤 Models
~/.pi/agent/models.json를 통해 사용자 정의 공급자 및 모델(Ollama, vLLM, LM Studio, 프록시)을 추가합니다.
목차
- Minimal Example
- Full Example
- Supported APIs
- Provider Configuration
- Model Configuration
- Overriding Built-in Providers
- Per-model Overrides
- Anthropic Messages Compatibility
- OpenAI Compatibility
최소한의 예
로컬 모델(Ollama, LM Studio, vLLM)의 경우 모델당 id만 필요합니다.
{
"providers": {
"ollama": {
"baseUrl": "http://localhost:11434/v1",
"api": "openai-completions",
"apiKey": "ollama",
"models": [
{ "id": "llama3.1:8b" },
{ "id": "qwen2.5-coder:7b" }
]
}
}
}apiKey 값은 Ollama가 이를 무시하기 때문에 자리 표시자입니다. pi는 모델이 /model에 나타나기 전에 인증이 필요한 것으로 간주하므로 키가 없는 로컬 서버는 더미 값을 유지하고 /login를 사용하여 해당 공급자에 대한 키를 저장하거나 모델을 선택할 때 --api-key를 전달해야 합니다.
일부 OpenAI 호환 서버는 추론 가능 모델에 사용되는 developer 역할을 이해하지 못합니다. 해당 공급자의 경우 compat.supportsDeveloperRole를 false로 설정하면 pi가 대신 시스템 프롬프트를 system 메시지로 보냅니다. 서버에서도 reasoning_effort를 지원하지 않는 경우 compat.supportsReasoningEffort도 false로 설정하세요.
공급자 수준에서 compat를 설정하여 모든 모델에 적용하거나 모델 수준에서 특정 모델을 재정의할 수 있습니다. 이는 일반적으로 Ollama, vLLM, SGLang 및 유사한 OpenAI 호환 서버에 적용됩니다.
{
"providers": {
"ollama": {
"baseUrl": "http://localhost:11434/v1",
"api": "openai-completions",
"apiKey": "ollama",
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": false
},
"models": [
{
"id": "gpt-oss:20b",
"reasoning": true
}
]
}
}
}전체 예시
특정 값이 필요할 때 기본값을 재정의합니다.
{
"providers": {
"ollama": {
"baseUrl": "http://localhost:11434/v1",
"api": "openai-completions",
"apiKey": "ollama",
"models": [
{
"id": "llama3.1:8b",
"name": "Llama 3.1 8B (Local)",
"reasoning": false,
"input": ["text"],
"contextWindow": 128000,
"maxTokens": 32000,
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
}
]
}
}
}/model을 열 때마다 파일이 다시 로드됩니다. 세션 중에 편집합니다. 다시 시작할 필요가 없습니다.
Google AI 스튜디오 예시
맞춤 Gemma 4 항목을 포함하여 Google AI Studio에서 모델을 추가하려면 google-generative-ai를 baseUrl와 함께 사용하세요.
{
"providers": {
"my-google": {
"baseUrl": "https://generativelanguage.googleapis.com/v1beta",
"api": "google-generative-ai",
"apiKey": "$GEMINI_API_KEY",
"models": [
{
"id": "gemma-4-31b-it",
"name": "Gemma 4 31B",
"input": ["text", "image"],
"contextWindow": 262144,
"reasoning": true
}
]
}
}
}google-generative-ai API 유형에 사용자 정의 모델을 추가하는 경우 baseUrl가 필요합니다.
APIs 지원됨
| API | 설명 |
|---|---|
openai-completions |
OpenAI 채팅 완료(호환성이 가장 높음) |
openai-responses |
OpenAI 응답 API |
anthropic-messages |
인류학적 메시지 API |
google-generative-ai |
구글 제너레이티브 AI |
공급자 수준(모든 모델의 기본값) 또는 모델 수준(모델별 재정의)에서 api를 설정합니다.
공급자 구성
| 필드 | 설명 |
|---|---|
baseUrl |
API 엔드포인트 URL |
api |
API 유형(위 참조) |
apiKey |
선택 사항 API key 구성(아래 값 해상도 참조). /login/auth.json 또는 CLI --api-key에서 인증을 제공하는 경우 생략하세요. |
oauth |
동적 OAuth 공급자 유형. 현재 "radius"를 지원합니다. 게이트웨이 baseUrl가 필요합니다. |
headers |
맞춤 헤더(아래 값 확인 참조) |
authHeader |
true를 설정하면 Authorization: Bearer <apiKey>가 자동으로 추가됩니다. |
models |
모델 구성 배열 |
modelOverrides |
이 공급자의 내장 또는 확장 등록 모델에 대한 모델별 재정의 |
models가 있는 공급자의 경우 기본 제공되지 않는 공급자 구성에는 공급자 또는 모델 수준에서 baseUrl 및 api 값이 필요합니다. apiKey는 파일을 로드할 필요가 없습니다. /login/auth.json, CLI --api-key 또는 공급자 apiKey를 통해 인증이 구성되면 모델을 사용할 수 있습니다. 인증이 구성되지 않은 경우 모델이 로드되지만 /model 및 --list-models에서는 사용할 수 없는 상태로 유지됩니다.
가치 결정
apiKey 및 headers 필드는 명령 실행, 환경 보간 및 리터럴을 지원합니다.
- 쉘 명령: 시작 시
"!command"전체 값을 명령으로 실행하고 stdout을 사용합니다."apiKey": "!security find-generic-password -ws 'anthropic'" "apiKey": "!op read 'op://vault/item/credential'" - 환경 보간:
"$ENV_VAR"또는"${ENV_VAR}"는 명명된 변수의 값을 사용합니다. 보간은 더 큰 리터럴 내에서 작동합니다."apiKey": "$MY_API_KEY" "apiKey": "${KEY_PREFIX}_${KEY_SUFFIX}"$FOO_BAR는 변수FOO_BAR입니다.BAR가 리터럴 텍스트인 경우${FOO}_BAR를 사용하세요. 환경 변수가 누락되면 값이 확인되지 않습니다. - 이스케이프:
"quot;는 리터럴"quot;을 내보냅니다."$!"는 명령 실행을 트리거하지 않고 리터럴"!"을 내보냅니다."apiKey": "$literal-dollar-prefix" "apiKey": "$!literal-bang-prefix" - 리터럴 값: 직접 사용됩니다.
MY_API_KEY와 같은 일반 대문자 문자열은 리터럴입니다. 환경 변수에는$MY_API_KEY를 사용하세요."apiKey": "sk-..."
models.json의 경우 셸 명령은 요청 시 해결됩니다. pi는 의도적으로 임의 명령에 대해 내장 TTL, 오래된 재사용 또는 복구 논리를 적용하지 않습니다. 명령마다 다른 캐싱 및 실패 전략이 필요하며 pi는 올바른 것을 추론할 수 없습니다.
명령이 느리고, 비용이 많이 들고, 속도가 제한되어 있거나 일시적 오류 시 이전 값을 계속 사용해야 하는 경우 원하는 캐싱 또는 TTL 동작을 구현하는 고유한 스크립트나 명령으로 래핑하세요.
/model 가용성 확인은 구성된 인증 존재를 사용하고 셸 명령을 실행하지 않습니다.
맞춤 헤더
{
"providers": {
"custom-proxy": {
"baseUrl": "https://proxy.example.com/v1",
"apiKey": "$MY_API_KEY",
"api": "anthropic-messages",
"headers": {
"x-portkey-api-key": "$PORTKEY_API_KEY",
"x-secret": "!op read 'op://vault/item/secret'"
},
"models": [...]
}
}
}모델 구성
| 필드 | 필수의 | 기본 | 설명 |
|---|---|---|---|
id |
예 | — | 모델 식별자(API로 전달됨) |
name |
아니요 | id |
사람이 읽을 수 있는 모델 라벨. 일치(--model 패턴)에 사용되며 보조 모델 세부 텍스트로 표시됩니다. |
api |
아니요 | 공급자의 api |
이 모델에 대한 공급자의 API 재정의 |
reasoning |
아니요 | false |
확장된 사고를 지원합니다 |
thinkingLevelMap |
아니요 | 생략 | 파이 사고 수준을 공급자 값에 매핑하고 지원되지 않는 수준을 표시합니다(아래 참조). |
input |
아니요 | ["text"] |
입력 유형: ["text"] 또는 ["text", "image"] |
contextWindow |
아니요 | 128000 |
토큰의 컨텍스트 창 크기 |
maxTokens |
아니요 | 16384 |
최대 출력 토큰 |
samplingParams |
아니요 | 생략 | 샘플링 매개변수는 모든 요청 본문에 그대로 병합되었습니다(아래 참조). |
cost |
아니요 | 모두 0 | 선택적 요청 전체 입력 가격 책정 계층이 포함된 백만 개당 토큰 요율 |
compat |
아니요 | 제공자 compat |
공급자 호환성이 재정의됩니다. 둘 다 설정된 경우 공급자 수준 compat과 병합됩니다. |
비용 계층은 전체 대체 요금 세트를 제공하고 총 입력 사용량(input + cacheRead + cacheWrite)이 inputTokensAbove을 초과하는 경우 전체 요청에 적용됩니다. 여러 계층이 일치하는 경우 가장 높은 임계값이 우선합니다.
{
"cost": {
"input": 5,
"output": 30,
"cacheRead": 0.5,
"cacheWrite": 6.25,
"tiers": [
{
"inputTokensAbove": 272000,
"input": 10,
"output": 45,
"cacheRead": 1,
"cacheWrite": 12.5
}
]
}
}현재 동작:
/model,--list-models및 대화형 바닥글에는 모델id별 항목이 표시됩니다.- 구성된
name는 모델 일치 및 보조 모델 세부 텍스트에 사용됩니다. 바닥글/상태 표시줄 모델 ID를 대체하지 않습니다.
샘플링 매개변수
samplingParams는 필드 pi가 자체적으로 설정된 후 모델의 모든 요청 본문에 축어적으로 병합된 자유 형식 개체이므로 해당 키가 승리합니다. 이를 사용하여 pi가 모델링하지 않는 샘플링 매개변수(llama.cpp의 min_p 또는 vLLM의 top_k와 같은 서버별 매개변수 포함)를 보냅니다.
{
"id": "deepseek-v4-flash",
"samplingParams": {
"temperature": 1.0,
"top_p": 0.95,
"top_k": 0,
"min_p": 0.0
}
}OpenAI 호환 API에만 적용됩니다(openai-completions, openai-responses, azure-openai-responses). 다른 API는 무시합니다. 키는 pi의 명명된 요청 필드를 재정의하므로(예를 들어 여기서 temperature 키는 요청 수준 온도를 능가함) 모델에 대한 샘플링 진실의 단일 소스로 선호합니다. modelOverrides에서 samplingParams는 키당 기본 모델 값을 병합합니다.
사고 수준 지도
모델별 사고 제어를 설명하려면 모델에 thinkingLevelMap를 사용하세요. 키는 파이 사고 수준입니다: off, minimal, low, medium, high, xhigh, max. 지도에는 구멍이 있을 수 있습니다. 예를 들어, 모델은 xhigh를 노출하지 않고 high 및 max를 노출할 수 있습니다.
값은 3개 상태입니다.
| 값 | 의미 |
|---|---|
| 생략 | high까지의 표준 수준에서는 공급자의 기본 매핑을 사용합니다. 확장된 xhigh 및 max 수준은 지원되지 않습니다. |
| 끈 | 레벨이 지원되며 이 값이 공급자에게 전송됩니다. |
null |
레벨이 지원되지 않으며 숨겨지거나 건너뛰거나 고정되었습니다. |
off, high, max 추론만 지원하는 모델의 예:
{
"id": "deepseek-v4-pro",
"reasoning": true,
"thinkingLevelMap": {
"minimal": null,
"low": null,
"medium": null,
"high": "high",
"xhigh": null,
"max": "max"
}
}사고를 비활성화할 수 없는 모델의 예:
{
"id": "always-thinking-model",
"reasoning": true,
"thinkingLevelMap": {
"off": null
}
}마이그레이션: compat.reasoningEffortMap를 사용한 이전 구성은 해당 매핑을 모델 수준 thinkingLevelMap로 이동해야 합니다. UI에 표시되어서는 안 되는 레벨에는 null를 사용하세요.
내장 기능 재정의 Providers
모델을 재정의하지 않고 프록시를 통해 내장 공급자를 라우팅합니다.
{
"providers": {
"anthropic": {
"baseUrl": "https://my-proxy.example.com/v1"
}
}
}내장된 모든 Anthropic 모델은 계속 사용할 수 있습니다. 기존 OAuth 또는 API key 인증은 계속 작동합니다.
사용자 정의 모델을 내장 공급자로 병합하려면 models 배열을 포함하세요.
{
"providers": {
"anthropic": {
"baseUrl": "https://my-proxy.example.com/v1",
"apiKey": "$ANTHROPIC_API_KEY",
"api": "anthropic-messages",
"models": [...]
}
}
}병합 의미:
- 내장 모델이 유지됩니다.
- 사용자 정의 모델은 공급자 내에서
id로 업데이트됩니다. - 맞춤 모델
id이 기본 제공 모델id과 일치하면 맞춤 모델이 해당 기본 제공 모델을 대체합니다. - 맞춤 모델
id이 새로운 경우 내장 모델과 함께 추가됩니다.
모델별 재정의
modelOverrides를 사용하면 공급자의 전체 모델 목록을 교체하지 않고 내장 모델과 일치하는 확장 등록 모델을 맞춤 설정할 수 있습니다.
{
"providers": {
"openrouter": {
"modelOverrides": {
"anthropic/claude-sonnet-4": {
"name": "Claude Sonnet 4 (Bedrock Route)",
"compat": {
"openRouterRouting": {
"only": ["amazon-bedrock"]
}
}
}
}
}
}
}modelOverrides는 모델별로 name, reasoning, thinkingLevelMap, input, cost(일부), contextWindow, maxTokens, samplingParams(키당 병합), headers, compat 필드를 지원합니다.
Direct OpenAI GPT-5.6 Sol, Terra 및 Luna는 기본적으로 272000 컨텍스트 창으로 설정되므로 요청은 OpenAI의 단기 컨텍스트 가격 책정 계층 내에 유지됩니다. OpenAI의 1.05M 컨텍스트 창을 선택하려면 사용하는 각 모델에 대해 이를 늘리십시오.
{
"providers": {
"openai": {
"modelOverrides": {
"gpt-5.6-sol": {
"contextWindow": 1050000
}
}
}
}
}재정의는 기본 제공 가격 메타데이터를 유지합니다. 총 입력 토큰이 272K를 초과하는 요청은 전체 요청에 대해 GPT-5.6의 긴 컨텍스트 속도를 사용합니다. 필요한 경우 gpt-5.6-terra 또는 gpt-5.6-luna에 동일한 재정의를 적용합니다.
행동 참고사항:
modelOverrides는 내장 공급자 모델과 일치하는 확장 프로그램에 등록된 공급자 모델에 적용됩니다.- 알 수 없는 모델 ID는 무시됩니다.
- 공급자 수준
baseUrl/headers을modelOverrides와 결합할 수 있습니다. name를 재정의하면 모델 일치와 보조 세부 텍스트만 변경됩니다. 바닥글과 기본 모델 목록에는 계속해서 모델id이 표시됩니다.- 공급자에 대해
models도 정의된 경우 기본 제공 재정의 후에 사용자 지정 모델이 병합됩니다. 동일한id을 가진 사용자 정의 모델이 재정의된 내장 모델 항목을 대체합니다.
인류학적 메시지 호환성
api: "anthropic-messages"를 사용하는 공급자나 프록시의 경우 compat를 사용하여 Anthropic 관련 요청 호환성을 제어합니다.
기본적으로 pi는 도구별 eager_input_streaming: true를 보냅니다. 프록시 또는 Anthropic 호환 백엔드가 해당 필드를 거부하는 경우 supportsEagerToolInputStreaming를 false로 설정하세요. Pi는 tools[].eager_input_streaming를 생략하고 대신 도구 사용 요청에 대한 레거시 fine-grained-tool-streaming-2025-05-14 베타 헤더를 보냅니다.
일부 인류 모델에는 기존 예산 기반 사고 페이로드 대신 적응형 사고(thinking.type: "adaptive" + output_config.effort)가 필요합니다. 내장 모델에서는 이를 자동으로 설정합니다. 해당 모델로 라우팅되는 사용자 지정 공급자 또는 별칭의 경우 forceAdaptiveThinking를 true로 설정하세요.
일부 Anthropic 호환 제공자는 빈 서명이 있는 사고 블록을 방출하고 여전히 재생될 것으로 기대합니다. 해당 제공업체에 대해서만 allowEmptySignature를 true로 설정하세요. 진정한 인류학은 공허한 사고의 서명을 거부합니다.
내장된 인류 모델은 모델 메타데이터에서 supportsStrictTools를 활성화합니다. 사용자 정의 Anthropic 호환 모델은 해당 엔드포인트가 엄격한 JSON 스키마 도구 정의를 허용하는 경우 이를 true로 설정해야 합니다.
{
"providers": {
"anthropic-proxy": {
"baseUrl": "https://proxy.example.com",
"api": "anthropic-messages",
"apiKey": "$ANTHROPIC_PROXY_KEY",
"compat": {
"supportsEagerToolInputStreaming": false,
"supportsLongCacheRetention": true,
"forceAdaptiveThinking": true,
"allowEmptySignature": true
},
"models": [
{
"id": "claude-opus-4-7",
"reasoning": true,
"input": ["text", "image"]
}
]
}
}
}| 필드 | 설명 |
|---|---|
supportsEagerToolInputStreaming |
제공자가 도구별 eager_input_streaming를 허용하는지 여부. 기본값: true. 해당 필드를 생략하고 도구 지원 요청에 대해 기존의 세분화된 도구 스트리밍 베타 헤더를 사용하려면 false로 설정합니다. |
supportsLongCacheRetention |
캐시 보존이 long일 때 공급자가 Anthropic 장기 캐시 보존(cache_control.ttl: "1h")을 허용하는지 여부입니다. 기본값: true. |
sendSessionAffinityHeaders |
캐싱이 활성화된 경우 세션 ID에서 x-session-affinity를 보낼지 여부입니다. 기본값: 알려진 공급자에 대해 자동 감지됩니다. |
supportsCacheControlOnTools |
제공자가 도구 정의에서 Anthropic 스타일 cache_control 마커를 허용하는지 여부입니다. 기본값: true. |
forceAdaptiveThinking |
이 모델에 대해 적응적 사고(thinking.type: "adaptive" + output_config.effort)를 보낼지 여부입니다. 내장된 적응형 모델은 이를 자동으로 설정합니다. 기본값: false. |
allowEmptySignature |
생각을 텍스트로 변환하는 대신 빈 생각 서명을 signature: ""로 재생할지 여부입니다. 기본값: false. |
supportsStrictTools |
공급자가 엄격한 JSON 스키마 도구 정의를 허용하는지 여부입니다. 기본값: false; 내장된 인류 모델은 생성된 메타데이터에서 이를 가능하게 합니다. |
OpenAI 호환성
부분적인 OpenAI 호환성을 갖춘 공급자의 경우 compat 필드를 사용하세요.
- 공급자 수준
compat은 해당 공급자 아래의 모든 모델에 기본값을 적용합니다. - 모델 수준
compat은 해당 모델의 공급자 수준 값을 재정의합니다.
{
"providers": {
"local-llm": {
"baseUrl": "http://localhost:8080/v1",
"api": "openai-completions",
"compat": {
"supportsUsageInStreaming": false,
"maxTokensField": "max_tokens"
},
"models": [...]
}
}
}| 필드 | 설명 |
|---|---|
supportsStore |
공급자는 store 필드를 지원합니다. |
supportsDeveloperRole |
developer 대 system 역할 사용 |
supportsReasoningEffort |
reasoning_effort 매개변수 지원 |
supportsUsageInStreaming |
stream_options: { include_usage: true } 지원 (기본값: true) |
supportsFinishReason |
스트리밍 응답에 finish_reason가 포함되는지 여부. false인 경우 pi는 스트림이 끝나면 stop 또는 toolUse를 추론합니다. 기본값: true. |
maxTokensField |
max_completion_tokens 또는 max_tokens를 사용하세요. |
requiresToolResultName |
도구 결과 메시지에 name 포함 |
requiresAssistantAfterToolResult |
도구 결과 후 사용자 메시지 앞에 보조 메시지 삽입 |
requiresThinkingAsText |
사고 블록을 일반 텍스트로 변환 |
requiresReasoningContentOnAssistantMessages |
추론이 활성화된 경우 재생된 모든 보조 메시지에 빈 reasoning_content 포함 |
thinkingFormat |
reasoning_effort, openrouter, deepseek, together, baseten, zai, qwen, chat-template 또는 qwen-chat-template 사고 매개변수를 사용하세요. |
chatTemplateKwargs |
thinkingFormat: "chat-template"의 chat_template_kwargs 값; 파이 제어 사고 값에는 { "$var": "thinking.enabled" } 또는 { "$var": "thinking.effort" }를 사용하세요. |
chatTemplateArgs |
thinkingFormat: "baseten"의 chat_template_args 값; 파이 제어 사고 값에는 { "$var": "thinking.enabled" } 또는 { "$var": "thinking.effort" }를 사용하세요. |
cacheControlFormat |
시스템 프롬프트, 마지막 도구 정의, 마지막 사용자, 보조자 또는 도구 결과 텍스트 콘텐츠에 인류 스타일 cache_control 마커를 사용하세요. 현재는 anthropic만 지원됩니다. |
sendSessionAffinityHeaders |
openai-completions의 경우 캐싱이 활성화되면 세션 ID에서 세션 선호도 헤더를 보냅니다. 기본값: false. |
sessionAffinityFormat |
openai-completions 및 openai-responses의 경우 세션 선호도 헤더 형식: openai는 session_id/x-client-request-id를 보냅니다(완료도 x-session-affinity). openai-nosession는 밑줄이 포함된 session_id 헤더를 생략하고, openrouter는 x-session-id를 보냅니다. prompt_cache_key 본문 매개변수에는 영향을 주지 않습니다. 기본값: 자동 감지. |
supportsStrictMode |
공급자가 엄격한 JSON-스키마 기능 도구 정의를 허용하는지 여부입니다. 기본값은 API에 따라 다릅니다. 내장된 OpenAI 모델은 명시적인 기능 메타데이터를 전달합니다. |
supportsOpenAIGrammarTools |
OpenAI 호환 API가 맞춤형 Lark/정규식 문법 도구를 내보낼지 여부입니다. false인 경우 문법이 제한된 도구는 일반 기능 도구로 대체됩니다. 기본값: false; 내장된 모델 카탈로그를 사용하면 OpenAI, OpenAI Codex, Azure OpenAI, GitHub Copilot, opencode 및 Cloudflare AI Gateway의 GPT-5+ 모델에 사용할 수 있습니다. |
deferredToolsMode |
공급자별 지연 도구 직렬화를 사용합니다. 현재 Kimi의 OpenAI 호환 채팅 완료 형식에는 "kimi"만 지원됩니다. |
supportsLongCacheRetention |
캐시 보존이 long일 때 공급자가 긴 캐시 보존을 허용하는지 여부: OpenAI 프롬프트 캐싱의 경우 prompt_cache_retention: "24h" 또는 cacheControlFormat이 anthropic일 때 cache_control.ttl: "1h". 기본값: true. |
openRouterRouting |
OpenRouter 공급자 라우팅 기본 설정. 이 개체는 OpenRouter API request의 provider 필드에 있는 그대로 전송됩니다. |
vercelGatewayRouting |
공급자 선택을 위한 Vercel AI Gateway 라우팅 구성(only, order) |
openrouter는 reasoning: { effort }을 사용합니다. together는 reasoning: { enabled }를 사용하고 supportsReasoningEffort가 활성화되면 reasoning_effort도 사용합니다. qwen는 최상위 수준 enable_thinking을 사용합니다. chat_template_kwargs.enable_thinking 및 preserve_thinking가 필요한 로컬 Qwen 호환 서버에는 qwen-chat-template를 사용하세요. DeepSeek V3.x 템플릿의 경우 chatTemplateKwargs: { "thinking": { "$var": "thinking.enabled" } }와 같이 구성 가능한 chat_template_kwargs가 필요한 vLLM/Hugging Face 채팅 템플릿에는 chat-template을 사용하세요. chat_template_args을 통해 토글 컨트롤을 노출하고 선택적으로 최상위 reasoning_effort를 지원하는 공급자의 경우 thinkingFormat: "baseten"를 chatTemplateArgs와 함께 사용하세요.
cacheControlFormat: "anthropic"는 텍스트 콘텐츠 및 도구 정의의 cache_control 마커를 통해 Anthropic 스타일 프롬프트 캐싱을 노출하는 OpenAI 호환 공급자용입니다.
예:
{
"providers": {
"openrouter": {
"baseUrl": "https://openrouter.ai/api/v1",
"apiKey": "$OPENROUTER_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "openrouter/anthropic/claude-3.5-sonnet",
"name": "OpenRouter Claude 3.5 Sonnet",
"compat": {
"openRouterRouting": {
"allow_fallbacks": true,
"require_parameters": false,
"data_collection": "deny",
"zdr": true,
"enforce_distillable_text": false,
"order": ["anthropic", "amazon-bedrock", "google-vertex"],
"only": ["anthropic", "amazon-bedrock"],
"ignore": ["gmicloud", "friendli"],
"quantizations": ["fp16", "bf16"],
"sort": {
"by": "price",
"partition": "model"
},
"max_price": {
"prompt": 10,
"completion": 20
},
"preferred_min_throughput": {
"p50": 100,
"p90": 50
},
"preferred_max_latency": {
"p50": 1,
"p90": 3,
"p99": 5
}
}
}
}
]
}
}
}Vercel AI 게이트웨이 예시:
{
"providers": {
"vercel-ai-gateway": {
"baseUrl": "https://ai-gateway.vercel.sh/v1",
"apiKey": "$AI_GATEWAY_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "moonshotai/kimi-k2.5",
"name": "Kimi K2.5 (Fireworks via Vercel)",
"reasoning": true,
"input": ["text", "image"],
"cost": { "input": 0.6, "output": 3, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 262144,
"maxTokens": 262144,
"compat": {
"vercelGatewayRouting": {
"only": ["fireworks", "novita"],
"order": ["fireworks", "novita"]
}
}
}
]
}
}
}