Benutzerdefiniert Models
Fügen Sie benutzerdefinierte Anbieter und Modelle (Ollama, vLLM, LM Studio, Proxys) über ~/.pi/agent/models.json hinzu.
Inhaltsverzeichnis
- Minimal Example
- Full Example
- Supported APIs
- Provider Configuration
- Model Configuration
- Overriding Built-in Providers
- Per-model Overrides
- Anthropic Messages Compatibility
- OpenAI Compatibility
Minimales Beispiel
Für lokale Modelle (Ollama, LM Studio, vLLM) ist nur id pro Modell erforderlich:
{
"providers": {
"ollama": {
"baseUrl": "http://localhost:11434/v1",
"api": "openai-completions",
"apiKey": "ollama",
"models": [
{ "id": "llama3.1:8b" },
{ "id": "qwen2.5-coder:7b" }
]
}
}
}Der Wert apiKey ist ein Platzhalter, da Ollama ihn ignoriert. pi behandelt Modelle immer noch so, dass eine Authentifizierung erforderlich ist, bevor sie in /model erscheinen, daher sollten schlüssellose lokale Server einen Dummy-Wert behalten, einen Schlüssel für diesen Anbieter mit /login speichern oder --api-key bei der Auswahl des Modells übergeben.
Einige OpenAI-kompatible Server verstehen die developer-Rolle nicht, die für Reasoning-fähige Modelle verwendet wird. Setzen Sie für diese Anbieter compat.supportsDeveloperRole auf false, damit Pi die Systemaufforderung stattdessen als system-Nachricht sendet. Wenn der Server auch reasoning_effort nicht unterstützt, setzen Sie compat.supportsReasoningEffort ebenfalls auf false.
Sie können compat auf Anbieterebene so festlegen, dass es für alle Modelle gilt, oder auf Modellebene, um ein bestimmtes Modell zu überschreiben. Dies gilt im Allgemeinen für Ollama, vLLM, SGLang und ähnliche OpenAI-kompatible Server.
{
"providers": {
"ollama": {
"baseUrl": "http://localhost:11434/v1",
"api": "openai-completions",
"apiKey": "ollama",
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": false
},
"models": [
{
"id": "gpt-oss:20b",
"reasoning": true
}
]
}
}
}Vollständiges Beispiel
Überschreiben Sie die Standardwerte, wenn Sie bestimmte Werte benötigen:
{
"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 }
}
]
}
}
}Die Datei wird jedes Mal neu geladen, wenn Sie /model öffnen. Während der Sitzung bearbeiten; Kein Neustart erforderlich.
Beispiel für Google AI Studio
Verwenden Sie google-generative-ai mit einem baseUrl, um Modelle aus Google AI Studio hinzuzufügen, einschließlich benutzerdefinierter Gemma 4-Einträge:
{
"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
}
]
}
}
}Die baseUrl ist erforderlich, wenn benutzerdefinierte Modelle zum Typ google-generative-ai API hinzugefügt werden.
Unterstützte APIs
| API | Beschreibung |
|---|---|
openai-completions |
OpenAI-Chat-Abschlüsse (am kompatibelsten) |
openai-responses |
OpenAI-Antworten API |
anthropic-messages |
Anthropische Botschaften API |
google-generative-ai |
Generative KI von Google |
Legen Sie api auf Anbieterebene (Standard für alle Modelle) oder Modellebene (Überschreibung pro Modell) fest.
Anbieterkonfiguration
| Feld | Beschreibung |
|---|---|
baseUrl |
API Endpunkt-URL |
api |
API Typ (siehe oben) |
apiKey |
Optionale API key-Konfiguration (siehe Werteauflösung unten). Lassen Sie es weg, wenn die Authentifizierung durch /login/auth.json oder CLI --api-key bereitgestellt wird. |
oauth |
Dynamischer OAuth Anbietertyp. Unterstützt derzeit "radius"; erfordert das Gateway baseUrl. |
headers |
Benutzerdefinierte Header (siehe Werteauflösung unten) |
authHeader |
Stellen Sie true ein, um Authorization: Bearer <apiKey> automatisch hinzuzufügen |
models |
Reihe von Modellkonfigurationen |
modelOverrides |
Modellspezifische Überschreibungen für integrierte oder erweiterungsregistrierte Modelle bei diesem Anbieter |
Für Anbieter mit models benötigen nicht integrierte Anbieterkonfigurationen baseUrl und einen api-Wert entweder auf Anbieter- oder Modellebene. apiKey ist zum Laden der Datei nicht erforderlich: Modelle werden verfügbar, wenn die Authentifizierung über /login/auth.json, CLI --api-key oder Anbieter apiKey konfiguriert wird. Wenn keine Authentifizierung konfiguriert ist, werden die Modelle geladen, bleiben aber in /model und --list-models nicht verfügbar.
Wertauflösung
Die Felder apiKey und headers unterstützen die Befehlsausführung, Umgebungsinterpolation und Literale:
- Shell-Befehl:
"!command"führt beim Start den gesamten Wert als Befehl aus und verwendet stdout"apiKey": "!security find-generic-password -ws 'anthropic'" "apiKey": "!op read 'op://vault/item/credential'" - Umgebungsinterpolation:
"$ENV_VAR"oder"${ENV_VAR}"verwendet den Wert der benannten Variablen. Die Interpolation funktioniert innerhalb größerer Literale."apiKey": "$MY_API_KEY" "apiKey": "${KEY_PREFIX}_${KEY_SUFFIX}"$FOO_BARist die VariableFOO_BAR; Verwenden Sie${FOO}_BAR, wennBARwörtlicher Text ist. Fehlende Umgebungsvariablen machen den Wert unaufgelöst. - Escapes:
"quot;gibt ein Literal"quot;aus;"$!"gibt ein Literal"!"aus, ohne die Befehlsausführung auszulösen."apiKey": "$literal-dollar-prefix" "apiKey": "$!literal-bang-prefix" - Wörtlicher Wert: Wird direkt verwendet. Einfache Zeichenfolgen in Großbuchstaben wie
MY_API_KEYsind Literale; Verwenden Sie$MY_API_KEYfür Umgebungsvariablen."apiKey": "sk-..."
Für models.json werden Shell-Befehle zum Zeitpunkt der Anforderung aufgelöst. pi wendet absichtlich keine integrierte TTL-, veraltete Wiederverwendungs- oder Wiederherstellungslogik für beliebige Befehle an. Unterschiedliche Befehle erfordern unterschiedliche Caching- und Fehlerstrategien, und Pi kann nicht auf die richtige schließen.
Wenn Ihr Befehl langsam, teuer oder geschwindigkeitsbegrenzt ist oder bei vorübergehenden Fehlern weiterhin einen vorherigen Wert verwenden soll, binden Sie ihn in Ihr eigenes Skript oder Ihren eigenen Befehl ein, der das gewünschte Caching- oder TTL-Verhalten implementiert.
/model Verfügbarkeitsprüfungen nutzen die konfigurierte Authentifizierungspräsenz und führen keine Shell-Befehle aus.
Benutzerdefinierte Header
{
"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": [...]
}
}
}Modellkonfiguration
| Feld | Erforderlich | Standard | Beschreibung |
|---|---|---|---|
id |
Ja | — | Modell-ID (an API übergeben) |
name |
NEIN | id |
Für Menschen lesbares Modelletikett. Wird für den Abgleich (--model Muster) verwendet und als sekundärer Modelldetailtext angezeigt. |
api |
NEIN | Anbieter api |
Überschreiben Sie die API des Anbieters für dieses Modell |
reasoning |
NEIN | false |
Unterstützt erweitertes Denken |
thinkingLevelMap |
NEIN | weggelassen | Ordnet die Pi-Denkebenen den Anbieterwerten zu und markiert nicht unterstützte Ebenen (siehe unten). |
input |
NEIN | ["text"] |
Eingabetypen: ["text"] oder ["text", "image"] |
contextWindow |
NEIN | 128000 |
Größe des Kontextfensters in Token |
maxTokens |
NEIN | 16384 |
Maximale Ausgabetoken |
samplingParams |
NEIN | weggelassen | Stichprobenparameter werden wörtlich in jeden Anfragetext eingefügt (siehe unten) |
cost |
NEIN | alles Nullen | Preise pro Million Token mit optionalen Preisstufen für die gesamte Anfrage |
compat |
NEIN | Anbieter compat |
Anbieterkompatibilitätsüberschreibungen. Wird mit Anbieterebene compat zusammengeführt, wenn beide festgelegt sind. |
Eine Kostenstufe stellt einen vollständigen alternativen Tarifsatz bereit und gilt für die gesamte Anfrage, wenn die Gesamteingabenutzung (input + cacheRead + cacheWrite) inputTokensAbove übersteigt. Wenn mehrere Stufen übereinstimmen, gewinnt der höchste Schwellenwert.
{
"cost": {
"input": 5,
"output": 30,
"cacheRead": 0.5,
"cacheWrite": 6.25,
"tiers": [
{
"inputTokensAbove": 272000,
"input": 10,
"output": 45,
"cacheRead": 1,
"cacheWrite": 12.5
}
]
}
}Aktuelles Verhalten:
/model,--list-modelsund die interaktive Fußzeile zeigt Einträge nach Modell anid.- Die konfigurierte
namewird für den Modellabgleich und sekundären Modelldetailtext verwendet. Es ersetzt nicht die Fußzeilen-/Statusleisten-Modell-ID.
Probenahmeparameter
samplingParams ist ein Freiformobjekt, das wörtlich in jeden Anforderungshauptteil für das Modell eingefügt wird, nachdem sich die Felder pi selbst festgelegt haben, sodass seine Schlüssel gewinnen. Verwenden Sie es, um Stichprobenparameter zu senden, die pi nicht modelliert – einschließlich serverspezifischer Parameter wie llama.cpps min_p oder vLLMs top_k:
{
"id": "deepseek-v4-flash",
"samplingParams": {
"temperature": 1.0,
"top_p": 0.95,
"top_k": 0,
"min_p": 0.0
}
}Nur OpenAI-kompatible APIs wenden es an (openai-completions, openai-responses, azure-openai-responses); andere APIs ignorieren es. Schlüssel haben Vorrang vor den benannten Anforderungsfeldern von pi (z. B. übertrifft hier ein temperature-Schlüssel die Temperatur auf Anforderungsebene). Bevorzugen Sie ihn daher als einzige Quelle der Stichprobenwahrheit für ein Modell. In modelOverrides verschmilzt samplingParams pro Schlüssel mit dem Wert des Basismodells.
Denkebenenkarte
Verwenden Sie thinkingLevelMap für ein Modell, um modellspezifische Denkkontrollen zu beschreiben. Schlüssel sind Pi-Denkstufen: off, minimal, low, medium, high, xhigh, max. Karten können Löcher enthalten; Beispielsweise kann ein Modell high und max freilegen, ohne xhigh freizulegen.
Die Werte sind dreistufig:
| Wert | Bedeutung |
|---|---|
| weggelassen | Standardstufen bis high verwenden die Standardzuordnung des Anbieters; Die erweiterten Stufen xhigh und max werden nicht unterstützt |
| Zeichenfolge | Level wird unterstützt und dieser Wert wird an den Anbieter gesendet |
null |
Ebene ist nicht unterstützt und versteckt/übersprungen/weggeklemmt |
Beispiel für ein Modell, das nur Off-, High- und Max-Argumentation unterstützt:
{
"id": "deepseek-v4-pro",
"reasoning": true,
"thinkingLevelMap": {
"minimal": null,
"low": null,
"medium": null,
"high": "high",
"xhigh": null,
"max": "max"
}
}Beispiel für ein Modell, bei dem das Denken nicht deaktiviert werden kann:
{
"id": "always-thinking-model",
"reasoning": true,
"thinkingLevelMap": {
"off": null
}
}Migration: Ältere Konfigurationen, die compat.reasoningEffortMap verwendet haben, sollten diese Zuordnung auf Modellebene thinkingLevelMap verschieben. Verwenden Sie null für Ebenen, die nicht in der Benutzeroberfläche angezeigt werden sollen.
Überschreiben der integrierten Providers
Leiten Sie einen integrierten Anbieter über einen Proxy weiter, ohne Modelle neu zu definieren:
{
"providers": {
"anthropic": {
"baseUrl": "https://my-proxy.example.com/v1"
}
}
}Alle eingebauten Anthropic-Modelle bleiben verfügbar. Die vorhandene OAuth- oder API key-Authentifizierung funktioniert weiterhin.
Um benutzerdefinierte Modelle mit einem integrierten Anbieter zusammenzuführen, schließen Sie das Array models ein:
{
"providers": {
"anthropic": {
"baseUrl": "https://my-proxy.example.com/v1",
"apiKey": "$ANTHROPIC_API_KEY",
"api": "anthropic-messages",
"models": [...]
}
}
}Semantik zusammenführen:
- Eingebaute Modelle bleiben erhalten.
- Benutzerdefinierte Modelle werden innerhalb des Anbieters durch
idersetzt. - Wenn ein benutzerdefiniertes Modell
idmit einem integrierten Modellidübereinstimmt, ersetzt das benutzerdefinierte Modell dieses integrierte Modell. - Wenn ein benutzerdefiniertes Modell
idneu ist, wird es neben den integrierten Modellen hinzugefügt.
Überschreibungen pro Modell
Verwenden Sie modelOverrides, um integrierte Modelle und passende erweiterungsregistrierte Modelle anzupassen, ohne die vollständige Modellliste des Anbieters zu ersetzen.
{
"providers": {
"openrouter": {
"modelOverrides": {
"anthropic/claude-sonnet-4": {
"name": "Claude Sonnet 4 (Bedrock Route)",
"compat": {
"openRouterRouting": {
"only": ["amazon-bedrock"]
}
}
}
}
}
}
}modelOverrides unterstützt diese Felder pro Modell: name, reasoning, thinkingLevelMap, input, cost (teilweise), contextWindow, maxTokens, samplingParams (zusammengeführt pro Schlüssel), headers, compat.
Direct OpenAI GPT-5.6 Sol, Terra und Luna verwenden standardmäßig ein 272000-Kontextfenster, sodass Anfragen innerhalb der Preisstufe für kurze Kontexte von OpenAI bleiben. Um sich für das 1,05-Millionen-Kontextfenster von OpenAI zu entscheiden, vergrößern Sie es für jedes von Ihnen verwendete Modell:
{
"providers": {
"openai": {
"modelOverrides": {
"gpt-5.6-sol": {
"contextWindow": 1050000
}
}
}
}
}Durch die Überschreibung bleiben die integrierten Preismetadaten erhalten. Anfragen mit insgesamt mehr als 272.000 Eingabetokens verwenden die Long-Context-Raten von GPT-5.6 für die gesamte Anfrage. Wenden Sie bei Bedarf die gleiche Überschreibung auf gpt-5.6-terra oder gpt-5.6-luna an.
Verhaltenshinweise:
modelOverrideswerden auf integrierte Anbietermodelle und passende erweiterungsregistrierte Anbietermodelle angewendet.- Unbekannte Modell-IDs werden ignoriert.
- Sie können die Anbieterebene
baseUrl/headersmitmodelOverrideskombinieren. - Das Überschreiben von
nameändert nur den Modellabgleich und den sekundären Detailtext; In der Fußzeile und in den primären Modelllisten wird weiterhin das Modellidangezeigt. - Wenn
modelsauch für einen Anbieter definiert ist, werden benutzerdefinierte Modelle nach integrierten Überschreibungen zusammengeführt. Ein benutzerdefiniertes Modell mit demselbenidersetzt den überschriebenen integrierten Modelleintrag.
Kompatibilität mit anthropischen Nachrichten
Für Anbieter oder Proxys, die api: "anthropic-messages" verwenden, verwenden Sie compat, um die Anthropic-spezifische Anforderungskompatibilität zu steuern.
Standardmäßig sendet pi pro Werkzeug eager_input_streaming: true. Wenn ein Proxy oder ein Anthropic-kompatibles Backend dieses Feld ablehnt, setzen Sie supportsEagerToolInputStreaming auf false. Pi lässt tools[].eager_input_streaming weg und sendet stattdessen den alten Beta-Header fine-grained-tool-streaming-2025-05-14 für Tool-fähige Anfragen.
Einige anthropische Modelle erfordern adaptives Denken (thinking.type: "adaptive" plus output_config.effort) anstelle der alten budgetbasierten Denklast. Bei Einbaumodellen wird dies automatisch eingestellt. Für benutzerdefinierte Anbieter oder Aliase, die an diese Modelle weiterleiten, setzen Sie forceAdaptiveThinking auf true.
Einige Anthropic-kompatible Anbieter geben Denkblöcke mit leeren Signaturen aus und erwarten sie dennoch bei der Wiedergabe. Setzen Sie allowEmptySignature nur für diese Anbieter auf true; Real Anthropic lehnt leere Denksignaturen ab.
Integrierte Anthropic-Modelle ermöglichen supportsStrictTools in ihren Modellmetadaten. Benutzerdefinierte Anthropic-kompatible Modelle müssen es auf true setzen, wenn ihr Endpunkt strikte JSON-Schema-Tooldefinitionen akzeptiert.
{
"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"]
}
]
}
}
}| Feld | Beschreibung |
|---|---|
supportsEagerToolInputStreaming |
Ob der Anbieter pro Werkzeug eager_input_streaming akzeptiert. Standard: true. Legen Sie den Wert auf false fest, um dieses Feld wegzulassen und den alten Beta-Header für das feinkörnige Tool-Streaming für Tool-fähige Anfragen zu verwenden. |
supportsLongCacheRetention |
Ob der Anbieter die lange Cache-Aufbewahrung von Anthropic (cache_control.ttl: "1h") akzeptiert, wenn die Cache-Aufbewahrung long ist. Standard: true. |
sendSessionAffinityHeaders |
Ob x-session-affinity von der Sitzungs-ID gesendet werden soll, wenn Caching aktiviert ist. Standard: Bei bekannten Anbietern automatisch erkannt. |
supportsCacheControlOnTools |
Ob der Anbieter cache_control-Markierungen im Anthropic-Stil für Werkzeugdefinitionen akzeptiert. Standard: true. |
forceAdaptiveThinking |
Ob adaptives Denken (thinking.type: "adaptive" plus output_config.effort) für dieses Modell gesendet werden soll. Integrierte adaptive Modelle stellen dies automatisch ein. Standard: false. |
allowEmptySignature |
Ob leere Denksignaturen als signature: "" wiedergegeben werden sollen, anstatt Denken in Text umzuwandeln. Standard: false. |
supportsStrictTools |
Ob der Anbieter strenge JSON-Schema-Tooldefinitionen akzeptiert. Standard: false; Integrierte anthropische Modelle ermöglichen dies in generierten Metadaten. |
OpenAI-Kompatibilität
Für Anbieter mit teilweiser OpenAI-Kompatibilität verwenden Sie das Feld compat.
- Anbieterebene
compatwendet Standardeinstellungen auf alle Modelle dieses Anbieters an. - Modellebene
compatüberschreibt Werte auf Anbieterebene für dieses Modell.
{
"providers": {
"local-llm": {
"baseUrl": "http://localhost:8080/v1",
"api": "openai-completions",
"compat": {
"supportsUsageInStreaming": false,
"maxTokensField": "max_tokens"
},
"models": [...]
}
}
}| Feld | Beschreibung |
|---|---|
supportsStore |
Der Anbieter unterstützt das Feld store |
supportsDeveloperRole |
Verwenden Sie die Rolle developer vs. system |
supportsReasoningEffort |
Unterstützung für den Parameter reasoning_effort |
supportsUsageInStreaming |
Unterstützt stream_options: { include_usage: true } (Standard: true) |
supportsFinishReason |
Ob gestreamte Antworten finish_reason enthalten. Wenn false, leitet pi stop oder toolUse ab, wenn der Stream endet. Standard: true. |
maxTokensField |
Verwenden Sie max_completion_tokens oder max_tokens |
requiresToolResultName |
Fügen Sie name in Werkzeugergebnismeldungen ein |
requiresAssistantAfterToolResult |
Fügen Sie eine Assistentennachricht vor einer Benutzernachricht nach den Werkzeugergebnissen ein |
requiresThinkingAsText |
Konvertieren Sie Denkblöcke in einfachen Text |
requiresReasoningContentOnAssistantMessages |
Fügen Sie in allen wiedergegebenen Assistentennachrichten ein leeres reasoning_content ein, wenn die Argumentation aktiviert ist |
thinkingFormat |
Verwenden Sie die Denkparameter reasoning_effort, openrouter, deepseek, together, baseten, zai, qwen, chat-template oder qwen-chat-template |
chatTemplateKwargs |
chat_template_kwargs Werte für thinkingFormat: "chat-template"; Verwenden Sie { "$var": "thinking.enabled" } oder { "$var": "thinking.effort" } für pi-kontrollierte Denkwerte |
chatTemplateArgs |
chat_template_args Werte für thinkingFormat: "baseten"; Verwenden Sie { "$var": "thinking.enabled" } oder { "$var": "thinking.effort" } für pi-kontrollierte Denkwerte |
cacheControlFormat |
Verwenden Sie cache_control-Markierungen im Anthropic-Stil für die Systemeingabeaufforderung, die letzte Werkzeugdefinition und den Textinhalt des letzten Benutzers, Assistenten oder Werkzeugergebnisses. Derzeit wird nur anthropic unterstützt. |
sendSessionAffinityHeaders |
Senden Sie für openai-completions Sitzungsaffinitätsheader von der Sitzungs-ID, wenn Caching aktiviert ist. Standard: false. |
sessionAffinityFormat |
Für openai-completions und openai-responses gilt das Session-Affinity-Header-Format: openai sendet session_id/x-client-request-id (Vervollständigungen auch x-session-affinity), openai-nosession lässt den Unterstrich enthaltenden session_id-Header weg, openrouter sendet x-session-id. Hat keinen Einfluss auf den Körperparameter prompt_cache_key. Standard: automatisch erkannt. |
supportsStrictMode |
Ob der Anbieter strenge JSON-Schema-Funktionstooldefinitionen akzeptiert. Die Standardeinstellungen hängen von der API ab; Integrierte OpenAI-Modelle enthalten explizite Fähigkeitsmetadaten. |
supportsOpenAIGrammarTools |
Ob OpenAI-kompatible APIs benutzerdefinierte Lark/Regex-Grammatiktools ausgeben. Bei false greifen grammatikbeschränkte Werkzeuge auf normale Funktionswerkzeuge zurück. Standard: false; Der integrierte Modellkatalog ermöglicht dies für GPT-5+-Modelle auf OpenAI, OpenAI Codex, Azure OpenAI, GitHub Copilot, Opencode und Cloudflare AI Gateway. |
deferredToolsMode |
Verwenden Sie die anbieterspezifische verzögerte Tool-Serialisierung. Derzeit wird nur "kimi" für Kimis OpenAI-kompatibles Chat Completions-Format unterstützt. |
supportsLongCacheRetention |
Ob der Anbieter eine lange Cache-Aufbewahrung akzeptiert, wenn die Cache-Aufbewahrung long ist: prompt_cache_retention: "24h" für OpenAI-Prompt-Caching oder cache_control.ttl: "1h", wenn cacheControlFormat anthropic ist. Standard: true. |
openRouterRouting |
Routing-Einstellungen des OpenRouter-Anbieters. Dieses Objekt wird unverändert im Feld provider von OpenRouter API request gesendet. |
vercelGatewayRouting |
Vercel AI Gateway-Routing-Konfiguration für die Anbieterauswahl (only, order) |
openrouter verwendet reasoning: { effort }. together verwendet reasoning: { enabled } und auch reasoning_effort, wenn supportsReasoningEffort aktiviert ist. qwen verwendet enable_thinking der obersten Ebene. Verwenden Sie qwen-chat-template für lokale Qwen-kompatible Server, die chat_template_kwargs.enable_thinking und preserve_thinking erfordern. Verwenden Sie chat-template für vLLM/Hugging Face-Chat-Vorlagen, die konfigurierbares chat_template_kwargs benötigen, z. B. chatTemplateKwargs: { "thinking": { "$var": "thinking.enabled" } } für DeepSeek V3.x-Vorlagen. Verwenden Sie thinkingFormat: "baseten" mit chatTemplateArgs für Anbieter, die Umschaltsteuerungen bis chat_template_args verfügbar machen und optional reasoning_effort der obersten Ebene unterstützen.
cacheControlFormat: "anthropic" ist für OpenAI-kompatible Anbieter, die Prompt-Caching im Anthropic-Stil durch cache_control-Markierungen für Textinhalte und Tooldefinitionen verfügbar machen.
Beispiel:
{
"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
}
}
}
}
]
}
}
}Beispiel für ein Vercel AI Gateway:
{
"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"]
}
}
}
]
}
}
}