Kustom Models
Tambahkan penyedia dan model khusus (Ollama, vLLM, LM Studio, proxy) melalui ~/.pi/agent/models.json.
Daftar isi
- Minimal Example
- Full Example
- Supported APIs
- Provider Configuration
- Model Configuration
- Overriding Built-in Providers
- Per-model Overrides
- Anthropic Messages Compatibility
- OpenAI Compatibility
Contoh Minimal
Untuk model lokal (Ollama, LM Studio, vLLM), hanya id yang diperlukan per model:
{
"providers": {
"ollama": {
"baseUrl": "http://localhost:11434/v1",
"api": "openai-completions",
"apiKey": "ollama",
"models": [
{ "id": "llama3.1:8b" },
{ "id": "qwen2.5-coder:7b" }
]
}
}
}Nilai apiKey adalah pengganti karena Ollama mengabaikannya. pi masih menganggap model memerlukan autentikasi sebelum muncul di /model, jadi server lokal tanpa kunci harus menyimpan nilai dummy, menyimpan kunci untuk penyedia tersebut dengan /login, atau meneruskan --api-key saat memilih model.
Beberapa server yang kompatibel dengan OpenAI tidak memahami peran developer yang digunakan untuk model berkemampuan penalaran. Untuk penyedia tersebut, setel compat.supportsDeveloperRole ke false sehingga pi mengirimkan perintah sistem sebagai pesan system. Jika server juga tidak mendukung reasoning_effort, setel compat.supportsReasoningEffort ke false juga.
Anda dapat mengatur compat di tingkat penyedia untuk diterapkan ke semua model, atau di tingkat model untuk mengganti model tertentu. Hal ini biasanya berlaku untuk Ollama, vLLM, SGLang, dan server serupa yang kompatibel dengan 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
}
]
}
}
}Contoh Lengkap
Ganti default saat Anda memerlukan nilai spesifik:
{
"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 }
}
]
}
}
}File dimuat ulang setiap kali Anda membuka /model. Edit selama sesi; tidak perlu memulai ulang.
Contoh Google AI Studio
Gunakan google-generative-ai dengan baseUrl untuk menambahkan model dari Google AI Studio, termasuk entri Gemma 4 khusus:
{
"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
}
]
}
}
}baseUrl diperlukan saat menambahkan model khusus ke tipe google-generative-ai API.
Didukung APIs
| API | Keterangan |
|---|---|
openai-completions |
Penyelesaian Obrolan OpenAI (paling kompatibel) |
openai-responses |
Respons OpenAI API |
anthropic-messages |
Pesan Antropis API |
google-generative-ai |
AI Generatif Google |
Tetapkan api di tingkat penyedia (default untuk semua model) atau tingkat model (penggantian per model).
Konfigurasi Penyedia
| Bidang | Keterangan |
|---|---|
baseUrl |
API URL titik akhir |
api |
Tipe API (lihat di atas) |
apiKey |
Konfigurasi API key opsional (lihat resolusi nilai di bawah). Hilangkan jika autentikasi disediakan oleh /login/auth.json atau CLI --api-key. |
oauth |
Jenis penyedia OAuth dinamis. Saat ini mendukung "radius"; membutuhkan gateway baseUrl. |
headers |
Header khusus (lihat resolusi nilai di bawah) |
authHeader |
Atur true untuk menambahkan Authorization: Bearer <apiKey> secara otomatis |
models |
Array konfigurasi model |
modelOverrides |
Penggantian per model untuk model bawaan atau model yang terdaftar ekstensi pada penyedia ini |
Untuk penyedia dengan models, konfigurasi penyedia non-bawaan memerlukan baseUrl dan nilai api di tingkat penyedia atau model. apiKey tidak diperlukan untuk memuat file: model akan tersedia ketika autentikasi dikonfigurasi melalui /login/auth.json, CLI --api-key, atau penyedia apiKey. Jika tidak ada autentikasi yang dikonfigurasi, model akan dimuat tetapi tetap tidak tersedia di /model dan --list-models.
Resolusi Nilai
Bidang apiKey dan headers mendukung eksekusi perintah, interpolasi lingkungan, dan literal:
- Perintah shell:
"!command"di awal mengeksekusi seluruh nilai sebagai perintah dan menggunakan stdout"apiKey": "!security find-generic-password -ws 'anthropic'" "apiKey": "!op read 'op://vault/item/credential'" - Interpolasi lingkungan:
"$ENV_VAR"atau"${ENV_VAR}"menggunakan nilai variabel bernama. Interpolasi berfungsi di dalam literal yang lebih besar."apiKey": "$MY_API_KEY" "apiKey": "${KEY_PREFIX}_${KEY_SUFFIX}"$FOO_BARadalah variabelFOO_BAR; gunakan${FOO}_BARketikaBARadalah teks literal. Variabel lingkungan yang hilang membuat nilai tidak terselesaikan. - Lolos:
"quot;memancarkan"quot;literal;"$!"memancarkan"!"literal tanpa memicu eksekusi perintah."apiKey": "$literal-dollar-prefix" "apiKey": "$!literal-bang-prefix" - Nilai literal: Digunakan secara langsung. String huruf besar biasa seperti
MY_API_KEYbersifat literal; gunakan$MY_API_KEYuntuk variabel lingkungan."apiKey": "sk-..."
Untuk models.json, perintah shell diselesaikan pada waktu permintaan. pi sengaja tidak menerapkan TTL bawaan, penggunaan kembali yang basi, atau logika pemulihan untuk perintah sewenang-wenang. Perintah yang berbeda memerlukan strategi caching dan kegagalan yang berbeda, dan pi tidak dapat menyimpulkan perintah yang tepat.
Jika perintah Anda lambat, mahal, terbatas pada kecepatan, atau harus tetap menggunakan nilai sebelumnya pada kegagalan sementara, gabungkan perintah tersebut dalam skrip atau perintah Anda sendiri yang mengimplementasikan perilaku caching atau TTL yang Anda inginkan.
/model pemeriksaan ketersediaan menggunakan kehadiran autentikasi yang dikonfigurasi dan tidak menjalankan perintah shell.
Header Kustom
{
"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": [...]
}
}
}Konfigurasi Model
| Bidang | Diperlukan | Bawaan | Keterangan |
|---|---|---|---|
id |
Ya | — | Pengidentifikasi model (diteruskan ke API) |
name |
TIDAK | id |
Label model yang dapat dibaca manusia. Digunakan untuk mencocokkan (pola --model) dan ditampilkan sebagai teks detail model sekunder. |
api |
TIDAK | penyedia api |
Ganti API penyedia untuk model ini |
reasoning |
TIDAK | false |
Mendukung pemikiran yang diperluas |
thinkingLevelMap |
TIDAK | dihilangkan | Memetakan tingkat pemikiran pi ke nilai-nilai penyedia dan menandai tingkat yang tidak didukung (lihat di bawah) |
input |
TIDAK | ["text"] |
Jenis masukan: ["text"] atau ["text", "image"] |
contextWindow |
TIDAK | 128000 |
Ukuran jendela konteks dalam token |
maxTokens |
TIDAK | 16384 |
Token keluaran maksimum |
samplingParams |
TIDAK | dihilangkan | Parameter pengambilan sampel digabungkan kata demi kata ke dalam setiap isi permintaan (lihat di bawah) |
cost |
TIDAK | semua nol | Tarif per juta token dengan tingkat harga input opsional untuk seluruh permintaan |
compat |
TIDAK | penyedia compat |
Penggantian kompatibilitas penyedia. Digabung dengan tingkat penyedia compat ketika keduanya disetel. |
Tingkat biaya menyediakan kumpulan tarif alternatif lengkap dan berlaku untuk permintaan penuh ketika total penggunaan input (input + cacheRead + cacheWrite) melebihi inputTokensAbove. Jika beberapa tingkatan cocok, ambang batas tertinggilah yang menang.
{
"cost": {
"input": 5,
"output": 30,
"cacheRead": 0.5,
"cacheWrite": 6.25,
"tiers": [
{
"inputTokensAbove": 272000,
"input": 10,
"output": 45,
"cacheRead": 1,
"cacheWrite": 12.5
}
]
}
}Perilaku saat ini:
/model,--list-models, dan entri tampilan footer interaktif berdasarkan modelid.nameyang dikonfigurasi digunakan untuk pencocokan model dan teks detail model sekunder. Itu tidak menggantikan id model footer/bilah status.
Parameter Pengambilan Sampel
samplingParams adalah objek bentuk bebas yang digabungkan kata demi kata ke dalam setiap isi permintaan untuk model, setelah bidang pi menetapkan dirinya sendiri, sehingga kuncinya menang. Gunakan untuk mengirim parameter pengambilan sampel yang tidak dimodelkan oleh pi — termasuk parameter khusus server seperti llama.cpp min_p atau top_k vLLM:
{
"id": "deepseek-v4-flash",
"samplingParams": {
"temperature": 1.0,
"top_p": 0.95,
"top_k": 0,
"min_p": 0.0
}
}Hanya API yang kompatibel dengan OpenAI yang menerapkannya (openai-completions, openai-responses, azure-openai-responses); API lainnya abaikan saja. Kunci menggantikan bidang permintaan bernama pi (misalnya kunci temperature di sini mengalahkan suhu tingkat permintaan), jadi pilihlah kunci tersebut sebagai satu-satunya sumber kebenaran pengambilan sampel untuk suatu model. Dalam modelOverrides, samplingParams digabungkan per kunci dengan nilai model dasar.
Peta Tingkat Berpikir
Gunakan thinkingLevelMap pada model untuk mendeskripsikan kontrol pemikiran khusus model. Kuncinya adalah tingkat berpikir pi: off, minimal, low, medium, high, xhigh, max. Peta mungkin berisi lubang; misalnya, model dapat mengekspos high dan max tanpa mengekspos xhigh.
Nilai-nilai bersifat tristate:
| Nilai | Arti |
|---|---|
| dihilangkan | Level standar hingga high menggunakan pemetaan default penyedia; level xhigh dan max yang diperluas tidak didukung |
| rangkaian | Level didukung dan nilai ini dikirim ke penyedia |
null |
Level tidak didukung dan disembunyikan/dilewati/dijepit |
Contoh model yang hanya mendukung penalaran off, high, dan max:
{
"id": "deepseek-v4-pro",
"reasoning": true,
"thinkingLevelMap": {
"minimal": null,
"low": null,
"medium": null,
"high": "high",
"xhigh": null,
"max": "max"
}
}Contoh model di mana pemikiran tidak dapat dinonaktifkan:
{
"id": "always-thinking-model",
"reasoning": true,
"thinkingLevelMap": {
"off": null
}
}Migrasi: konfigurasi lama yang menggunakan compat.reasoningEffortMap harus memindahkan pemetaan tersebut ke tingkat model thinkingLevelMap. Gunakan null untuk level yang tidak seharusnya muncul di UI.
Mengganti Bawaan Providers
Rutekan penyedia bawaan melalui proxy tanpa mendefinisikan ulang model:
{
"providers": {
"anthropic": {
"baseUrl": "https://my-proxy.example.com/v1"
}
}
}Semua model Anthropic bawaan tetap tersedia. OAuth atau API key autentikasi yang ada terus berfungsi.
Untuk menggabungkan model kustom ke dalam penyedia bawaan, sertakan array models:
{
"providers": {
"anthropic": {
"baseUrl": "https://my-proxy.example.com/v1",
"apiKey": "$ANTHROPIC_API_KEY",
"api": "anthropic-messages",
"models": [...]
}
}
}Gabungkan semantik:
- Model bawaan tetap dipertahankan.
- Model khusus di-upserd sebesar
iddalam penyedia. - Jika model khusus
idcocok dengan model bawaanid, model khusus akan menggantikan model bawaan tersebut. - Jika model khusus
idbaru, model tersebut akan ditambahkan bersama model bawaan.
Penggantian Per model
Gunakan modelOverrides untuk menyesuaikan model bawaan dan mencocokkan model terdaftar ekstensi tanpa mengganti daftar model lengkap penyedia.
{
"providers": {
"openrouter": {
"modelOverrides": {
"anthropic/claude-sonnet-4": {
"name": "Claude Sonnet 4 (Bedrock Route)",
"compat": {
"openRouterRouting": {
"only": ["amazon-bedrock"]
}
}
}
}
}
}
}modelOverrides mendukung bidang berikut per model: name, reasoning, thinkingLevelMap, input, cost (sebagian), contextWindow, maxTokens, samplingParams (digabung per kunci), headers, compat.
Mengarahkan OpenAI GPT-5.6 Sol, Terra, dan Luna secara default ke jendela konteks 272000 sehingga permintaan tetap berada dalam tingkat harga konteks pendek OpenAI. Untuk ikut serta dalam jendela konteks 1,05 juta OpenAI, tingkatkan jendela tersebut untuk setiap model yang Anda gunakan:
{
"providers": {
"openai": {
"modelOverrides": {
"gpt-5.6-sol": {
"contextWindow": 1050000
}
}
}
}
}Penggantian ini mempertahankan metadata harga bawaan. Permintaan dengan total lebih dari 272 ribu token masukan menggunakan tarif konteks panjang GPT-5.6 untuk keseluruhan permintaan. Terapkan penggantian yang sama ke gpt-5.6-terra atau gpt-5.6-luna bila diperlukan.
Catatan perilaku:
modelOverridesditerapkan pada model penyedia bawaan dan model penyedia terdaftar ekstensi yang cocok.- ID model yang tidak dikenal diabaikan.
- Anda dapat menggabungkan
baseUrl/headerstingkat penyedia denganmodelOverrides. - Mengganti
namehanya mengubah pencocokan model dan teks detail sekunder; daftar footer dan model utama terus menampilkan modelid. - Jika
modelsjuga ditentukan untuk penyedia, model kustom akan digabungkan setelah penggantian bawaan. Model khusus denganidyang sama menggantikan entri model bawaan yang diganti.
Kompatibilitas Pesan Antropis
Untuk penyedia atau proxy yang menggunakan api: "anthropic-messages", gunakan compat untuk mengontrol kompatibilitas permintaan khusus Antropik.
Secara default pi mengirimkan per alat eager_input_streaming: true. Jika proxy atau backend yang kompatibel dengan Anthropic menolak kolom tersebut, setel supportsEagerToolInputStreaming ke false. Pi akan menghilangkan tools[].eager_input_streaming dan mengirimkan header beta fine-grained-tool-streaming-2025-05-14 lama untuk permintaan yang mendukung alat.
Beberapa model Antropik memerlukan pemikiran adaptif (thinking.type: "adaptive" plus output_config.effort) dibandingkan muatan pemikiran berbasis anggaran yang lama. Model bawaan mengatur ini secara otomatis. Untuk penyedia khusus atau alias yang merutekan ke model tersebut, setel forceAdaptiveThinking ke true.
Beberapa penyedia yang kompatibel dengan Anthropic mengeluarkan blok pemikiran dengan tanda tangan kosong dan masih mengharapkannya diputar ulang. Tetapkan allowEmptySignature ke true hanya untuk penyedia tersebut; Anthropic sejati menolak tanda-tanda pemikiran kosong.
Model Antropik bawaan mengaktifkan supportsStrictTools dalam metadata modelnya. Model kustom yang kompatibel dengan Anthropic harus menyetelnya ke true ketika titik akhirnya menerima definisi alat skema JSON yang ketat.
{
"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"]
}
]
}
}
}| Bidang | Keterangan |
|---|---|
supportsEagerToolInputStreaming |
Apakah penyedia menerima per alat eager_input_streaming. Bawaan: true. Setel ke false untuk menghilangkan kolom tersebut dan gunakan header beta streaming alat canggih yang lama pada permintaan yang mendukung alat. |
supportsLongCacheRetention |
Apakah penyedia menerima retensi cache panjang Antropik (cache_control.ttl: "1h") ketika retensi cache long. Bawaan: true. |
sendSessionAffinityHeaders |
Apakah akan mengirim x-session-affinity dari id sesi saat caching diaktifkan. Default: terdeteksi otomatis untuk penyedia yang dikenal. |
supportsCacheControlOnTools |
Apakah penyedia menerima penanda cache_control gaya Antropik pada definisi alat. Bawaan: true. |
forceAdaptiveThinking |
Apakah akan mengirimkan pemikiran adaptif (thinking.type: "adaptive" plus output_config.effort) untuk model ini. Model adaptif bawaan mengatur ini secara otomatis. Bawaan: false. |
allowEmptySignature |
Apakah akan memutar ulang tanda tangan berpikir kosong sebagai signature: "" alih-alih mengubah pemikiran menjadi teks. Bawaan: false. |
supportsStrictTools |
Apakah penyedia menerima definisi alat skema JSON yang ketat. Bawaan: false; model Antropik bawaan mengaktifkannya dalam metadata yang dihasilkan. |
Kompatibilitas OpenAI
Untuk penyedia dengan kompatibilitas OpenAI parsial, gunakan kolom compat.
- Tingkat penyedia
compatmenerapkan default ke semua model di bawah penyedia tersebut. - Tingkat model
compatmenggantikan nilai tingkat penyedia untuk model tersebut.
{
"providers": {
"local-llm": {
"baseUrl": "http://localhost:8080/v1",
"api": "openai-completions",
"compat": {
"supportsUsageInStreaming": false,
"maxTokensField": "max_tokens"
},
"models": [...]
}
}
}| Bidang | Keterangan |
|---|---|
supportsStore |
Penyedia mendukung bidang store |
supportsDeveloperRole |
Gunakan peran developer vs system |
supportsReasoningEffort |
Dukungan untuk parameter reasoning_effort |
supportsUsageInStreaming |
Mendukung stream_options: { include_usage: true } (default: true) |
supportsFinishReason |
Apakah respons yang dialirkan mencakup finish_reason. Saat false, pi menyimpulkan stop atau toolUse saat streaming berakhir. Bawaan: true. |
maxTokensField |
Gunakan max_completion_tokens atau max_tokens |
requiresToolResultName |
Sertakan name pada pesan hasil alat |
requiresAssistantAfterToolResult |
Sisipkan pesan asisten sebelum pesan pengguna setelah hasil alat |
requiresThinkingAsText |
Ubah blok pemikiran menjadi teks biasa |
requiresReasoningContentOnAssistantMessages |
Sertakan reasoning_content kosong pada semua pesan asisten yang diputar ulang saat penalaran diaktifkan |
thinkingFormat |
Gunakan parameter berpikir reasoning_effort, openrouter, deepseek, together, baseten, zai, qwen, chat-template, atau qwen-chat-template |
chatTemplateKwargs |
chat_template_kwargs nilai untuk thinkingFormat: "chat-template"; gunakan { "$var": "thinking.enabled" } atau { "$var": "thinking.effort" } untuk nilai berpikir yang dikontrol pi |
chatTemplateArgs |
chat_template_args nilai untuk thinkingFormat: "baseten"; gunakan { "$var": "thinking.enabled" } atau { "$var": "thinking.effort" } untuk nilai berpikir yang dikontrol pi |
cacheControlFormat |
Gunakan penanda cache_control bergaya Antropis pada perintah sistem, definisi alat terakhir, dan konten teks pengguna, asisten, atau hasil alat terakhir. Saat ini hanya anthropic yang didukung. |
sendSessionAffinityHeaders |
Untuk openai-completions, kirim header afinitas sesi dari id sesi saat cache diaktifkan. Bawaan: false. |
sessionAffinityFormat |
Untuk openai-completions dan openai-responses, format header afinitas sesi: openai mengirimkan session_id/x-client-request-id (penyelesaian juga x-session-affinity), openai-nosession menghilangkan header session_id yang berisi garis bawah, openrouter mengirimkan x-session-id. Tidak mempengaruhi parameter tubuh prompt_cache_key. Default: terdeteksi otomatis. |
supportsStrictMode |
Apakah penyedia menerima definisi alat fungsi skema JSON yang ketat. Defaultnya bergantung pada API; model OpenAI bawaan membawa metadata kemampuan eksplisit. |
supportsOpenAIGrammarTools |
Apakah API yang kompatibel dengan OpenAI memancarkan alat tata bahasa Lark/regex khusus. Ketika false, alat dengan batasan tata bahasa akan kembali ke alat dengan fungsi normal. Bawaan: false; katalog model bawaan memungkinkannya untuk model GPT-5+ di OpenAI, OpenAI Codex, Azure OpenAI, GitHub Copilot, opencode, dan Cloudflare AI Gateway. |
deferredToolsMode |
Gunakan serialisasi alat yang ditangguhkan khusus penyedia. Saat ini hanya "kimi" yang didukung untuk format Penyelesaian Obrolan Kimi yang kompatibel dengan OpenAI. |
supportsLongCacheRetention |
Apakah penyedia menerima retensi cache yang lama ketika retensi cache adalah long: prompt_cache_retention: "24h" untuk cache cepat OpenAI, atau cache_control.ttl: "1h" ketika cacheControlFormat adalah anthropic. Bawaan: true. |
openRouterRouting |
Preferensi perutean penyedia OpenRouter. Objek ini dikirim apa adanya di bidang provider di OpenRouter API request. |
vercelGatewayRouting |
Konfigurasi perutean Vercel AI Gateway untuk pemilihan penyedia (only, order) |
openrouter menggunakan reasoning: { effort }. together menggunakan reasoning: { enabled } dan juga reasoning_effort ketika supportsReasoningEffort diaktifkan. qwen menggunakan enable_thinking tingkat atas. Gunakan qwen-chat-template untuk server lokal yang kompatibel dengan Qwen yang memerlukan chat_template_kwargs.enable_thinking dan preserve_thinking. Gunakan chat-template untuk templat obrolan vLLM/Hugging Face yang memerlukan chat_template_kwargs yang dapat dikonfigurasi, seperti chatTemplateKwargs: { "thinking": { "$var": "thinking.enabled" } } untuk templat DeepSeek V3.x. Gunakan thinkingFormat: "baseten" dengan chatTemplateArgs untuk penyedia yang mengekspos kontrol peralihan melalui chat_template_args dan secara opsional mendukung reasoning_effort tingkat atas.
cacheControlFormat: "anthropic" ditujukan untuk penyedia yang kompatibel dengan OpenAI yang mengekspos cache cepat bergaya Antropik melalui penanda cache_control pada konten teks dan definisi alat.
Contoh:
{
"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
}
}
}
}
]
}
}
}Contoh Vercel AI Gerbang:
{
"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"]
}
}
}
]
}
}
}