Konfigurasi, kustomisasi, pengaturan platform, dan referensi API untuk Pi.

Kustom Models

Tambahkan penyedia dan model khusus (Ollama, vLLM, LM Studio, proxy) melalui ~/.pi/agent/models.json.

Daftar isi

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_BAR adalah variabel FOO_BAR; gunakan ${FOO}_BAR ketika BAR adalah 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_KEY bersifat literal; gunakan $MY_API_KEY untuk 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 model id.
  • name yang 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 id dalam penyedia.
  • Jika model khusus id cocok dengan model bawaan id, model khusus akan menggantikan model bawaan tersebut.
  • Jika model khusus id baru, 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:

  • modelOverrides diterapkan pada model penyedia bawaan dan model penyedia terdaftar ekstensi yang cocok.
  • ID model yang tidak dikenal diabaikan.
  • Anda dapat menggabungkan baseUrl/headers tingkat penyedia dengan modelOverrides.
  • Mengganti name hanya mengubah pencocokan model dan teks detail sekunder; daftar footer dan model utama terus menampilkan model id.
  • Jika models juga ditentukan untuk penyedia, model kustom akan digabungkan setelah penggantian bawaan. Model khusus dengan id yang 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 compat menerapkan default ke semua model di bawah penyedia tersebut.
  • Tingkat model compat menggantikan 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"]
            }
          }
        }
      ]
    }
  }
}