カスタム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 still treats models as requiring auth before they appear in /model, so keyless local servers should keep a dummy value, save a key for that provider with /login, or pass --api-key when selecting the model.
一部の 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 スタジオの例
google-generative-ai と baseUrl を使用して、カスタム Gemma 4 エントリを含む Google AI Studio からモデルを追加します。
{
"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は、google-generative-ai API タイプにカスタムモデルを追加する場合に必要です。
サポートされているAPI
| API | 説明 |
|---|---|
openai-completions |
OpenAI チャット補完 (最も互換性のある) |
openai-responses |
OpenAI の応答 API |
anthropic-messages |
人間的なメッセージ API |
google-generative-ai |
Google ジェネレーティブ 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 |
いいえ | 省略 | pi の思考レベルをプロバイダーの値にマッピングし、サポートされていないレベルをマークします (以下を参照) |
input |
いいえ | ["text"] |
入力タイプ: ["text"] または ["text", "image"] |
contextWindow |
いいえ | 128000 |
トークン単位のコンテキスト ウィンドウ サイズ |
maxTokens |
いいえ | 16384 |
最大出力トークン |
samplingParams |
いいえ | 省略 | サンプリングパラメータはすべてのリクエスト本文にそのままマージされます (以下を参照) |
cost |
いいえ | すべてゼロ | オプションのリクエスト全体の入力価格レベルを備えた 100 万トークンあたりのレート |
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 を公開できます。
値はトライステートです。
| 価値 | 意味 |
|---|---|
| 省略 | 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 に設定します。本物の人間は空虚な思考のサインを拒否します。
組み込みの Anthropic モデルでは、モデル メタデータで 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;組み込みの Anthropic モデルにより、生成されたメタデータでそれが可能になります。 |
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 |
chat_template_kwargs の thinkingFormat: "chat-template" の値。 pi 制御の思考値には { "$var": "thinking.enabled" } または { "$var": "thinking.effort" } を使用します |
chatTemplateArgs |
chat_template_args の thinkingFormat: "baseten" の値。 pi 制御の思考値には { "$var": "thinking.enabled" } または { "$var": "thinking.effort" } を使用します |
cacheControlFormat |
システム プロンプト、最後のツール定義、最後のユーザー、アシスタント、またはツール結果のテキスト コンテンツで、Anthropic スタイルの 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"]
}
}
}
]
}
}
}