@oh-my-pi/pi-catalog 18.10.4 → 18.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [18.11.0] - 2026-10-14
6
+
7
+ ### Added
8
+
9
+ - Added `local/nemotron-streaming-en-0.6b` for local streaming English dictation ([#15759](https://github.com/can1357/oh-my-pi/pull/15759) by [@daaximus](https://github.com/daaximus)).
10
+ - Added SambaNova Cloud (`sambanova`) as a provider: `/login sambanova` with an API key, and the live `/v1/models` roster with its prices, reasoning models, and Gemma 4 image input ([#14986](https://github.com/can1357/oh-my-pi/pull/14986) by [@rjuez00](https://github.com/rjuez00))
11
+
12
+ ### Changed
13
+
14
+ - OpenCode Go requests now go to the current `https://opencode.ai/inference/go/v1` endpoint instead of the legacy `/zen/go` one ([#15722](https://github.com/can1357/oh-my-pi/issues/15722))
15
+
16
+ ### Fixed
17
+
18
+ - Fixed OpenCode Go's `deepseek-flash` alias showing $0, unknown limits, and no reasoning instead of the V4.1 Flash rate card and capabilities ([#15357](https://github.com/can1357/oh-my-pi/issues/15357))
19
+ - Fixed OpenCode Go's Gemini 4 Argon Contributor failing with an unsupported protocol and thinking level; it now uses the native Gemini endpoint ([#15722](https://github.com/can1357/oh-my-pi/issues/15722))
20
+
5
21
  ## [18.10.4] - 2026-10-13
6
22
 
7
23
  ### Added
@@ -1,4 +1,4 @@
1
1
  /** Every provider with an `auth/<id>.kdl` policy. */
2
- export type AuthProviderId = "abliteration" | "aiand" | "aimlapi" | "alibaba-coding-plan" | "alibaba-token-plan" | "amazon-bedrock" | "anthropic" | "apple" | "azure" | "baseten" | "bedrock-mantle" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "cloudflare-workers-ai" | "commandcode" | "coralbricks" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google" | "google-antigravity" | "google-gemini-cli" | "google-vertex" | "groq" | "helmcode" | "huggingface" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "local" | "meta" | "minimax" | "minimax-code" | "minimax-code-cn" | "mistral" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai" | "openai-codex" | "openai-codex-device" | "opencode-go" | "opencode-zen" | "openrouter" | "parallel" | "perplexity" | "qianfan" | "qwen-portal" | "sakana" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stencil" | "stepfun" | "synthetic" | "tavily" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "web" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zai-coding-plan" | "zenmux" | "zhipu-coding-plan";
2
+ export type AuthProviderId = "abliteration" | "aiand" | "aimlapi" | "alibaba-coding-plan" | "alibaba-token-plan" | "amazon-bedrock" | "anthropic" | "apple" | "azure" | "baseten" | "bedrock-mantle" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "cloudflare-workers-ai" | "commandcode" | "coralbricks" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google" | "google-antigravity" | "google-gemini-cli" | "google-vertex" | "groq" | "helmcode" | "huggingface" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "local" | "meta" | "minimax" | "minimax-code" | "minimax-code-cn" | "mistral" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai" | "openai-codex" | "openai-codex-device" | "opencode-go" | "opencode-zen" | "openrouter" | "parallel" | "perplexity" | "qianfan" | "qwen-portal" | "sakana" | "sambanova" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stencil" | "stepfun" | "synthetic" | "tavily" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "web" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zai-coding-plan" | "zenmux" | "zhipu-coding-plan";
3
3
  /** Providers whose policy declares a `login` flow (the `/login` roster). */
4
- export type LoginProviderId = "abliteration" | "aiand" | "alibaba-coding-plan" | "alibaba-token-plan" | "anthropic" | "baseten" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "cloudflare-workers-ai" | "commandcode" | "coralbricks" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google-antigravity" | "google-gemini-cli" | "helmcode" | "huggingface" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "meta" | "minimax-code" | "minimax-code-cn" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai-codex" | "openai-codex-device" | "opencode-go" | "opencode-zen" | "openrouter" | "parallel" | "perplexity" | "qianfan" | "qwen-portal" | "sakana" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stencil" | "stepfun" | "synthetic" | "tavily" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zai-coding-plan" | "zenmux" | "zhipu-coding-plan";
4
+ export type LoginProviderId = "abliteration" | "aiand" | "alibaba-coding-plan" | "alibaba-token-plan" | "anthropic" | "baseten" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "cloudflare-workers-ai" | "commandcode" | "coralbricks" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google-antigravity" | "google-gemini-cli" | "helmcode" | "huggingface" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "meta" | "minimax-code" | "minimax-code-cn" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai-codex" | "openai-codex-device" | "opencode-go" | "opencode-zen" | "openrouter" | "parallel" | "perplexity" | "qianfan" | "qwen-portal" | "sakana" | "sambanova" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stencil" | "stepfun" | "synthetic" | "tavily" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zai-coding-plan" | "zenmux" | "zhipu-coding-plan";
@@ -1,2 +1,2 @@
1
1
  /** Every chat-model provider with a catalog entry (`default-model` in its provider rules). */
2
- export type KnownProvider = "abliteration" | "aiand" | "aimlapi" | "alibaba-coding-plan" | "alibaba-token-plan" | "amazon-bedrock" | "anthropic" | "apple" | "azure" | "baseten" | "bedrock-mantle" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "cloudflare-workers-ai" | "commandcode" | "coralbricks" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google" | "google-antigravity" | "google-gemini-cli" | "google-vertex" | "groq" | "helmcode" | "huggingface" | "kilo" | "kimi-code" | "litellm" | "lm-studio" | "local" | "meta" | "minimax" | "minimax-code" | "minimax-code-cn" | "mistral" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai" | "openai-codex" | "opencode-go" | "opencode-zen" | "openrouter" | "qianfan" | "qwen-portal" | "sakana" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stepfun" | "synthetic" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "web" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zenmux" | "zhipu-coding-plan";
2
+ export type KnownProvider = "abliteration" | "aiand" | "aimlapi" | "alibaba-coding-plan" | "alibaba-token-plan" | "amazon-bedrock" | "anthropic" | "apple" | "azure" | "baseten" | "bedrock-mantle" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "cloudflare-workers-ai" | "commandcode" | "coralbricks" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google" | "google-antigravity" | "google-gemini-cli" | "google-vertex" | "groq" | "helmcode" | "huggingface" | "kilo" | "kimi-code" | "litellm" | "lm-studio" | "local" | "meta" | "minimax" | "minimax-code" | "minimax-code-cn" | "mistral" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai" | "openai-codex" | "opencode-go" | "opencode-zen" | "openrouter" | "qianfan" | "qwen-portal" | "sakana" | "sambanova" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stepfun" | "synthetic" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "web" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zenmux" | "zhipu-coding-plan";
@@ -100,6 +100,19 @@ export interface CerebrasModelManagerConfig {
100
100
  fetch?: FetchImpl;
101
101
  }
102
102
  export declare function cerebrasModelManagerOptions(config?: CerebrasModelManagerConfig): ModelManagerOptions<"openai-completions">;
103
+ /** SambaNova discovery inputs: `apiKey` enables the live roster; `baseUrl` defaults to SambaNova Cloud. */
104
+ export interface SambaNovaModelManagerConfig {
105
+ apiKey?: string;
106
+ baseUrl?: string;
107
+ fetch?: FetchImpl;
108
+ }
109
+ /**
110
+ * SambaNova Cloud's model manager. `/v1/models` requires a key, so a keyless
111
+ * manager serves only the bundled seed; with a key the live roster replaces
112
+ * it. Rows carry pricing and limits but no capability metadata: reasoning,
113
+ * thinking wire format, and image input come from `providers/sambanova.kdl`.
114
+ */
115
+ export declare function sambanovaModelManagerOptions(config?: SambaNovaModelManagerConfig): ModelManagerOptions<"openai-completions">;
103
116
  export interface HuggingfaceModelManagerConfig {
104
117
  apiKey?: string;
105
118
  baseUrl?: string;
@@ -655,6 +668,11 @@ export interface ModelsDevProviderDescriptor {
655
668
  }
656
669
  /** Generic mapper that converts models.dev data using provider descriptors. */
657
670
  export declare function mapModelsDevToModels(data: Record<string, unknown>, descriptors: readonly ModelsDevProviderDescriptor[]): ModelSpec<Api>[];
671
+ /**
672
+ * OpenCode Go endpoint for one request API. The model generator re-bases
673
+ * previous-snapshot rows with it so retained rows follow endpoint moves.
674
+ */
675
+ export declare function openCodeGoBaseUrlForApi(api: Api): string;
658
676
  /** Resolves the transport and endpoint for one Z.AI model catalog entry. */
659
677
  export declare function resolveZaiApi(modelId: string): {
660
678
  api: "anthropic-messages" | "openai-completions";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-catalog",
3
- "version": "18.10.4",
3
+ "version": "18.11.0",
4
4
  "description": "Model catalog for omp: bundled model database, provider discovery descriptors, model identity, classification, and equivalence",
5
5
  "keywords": [
6
6
  "ai",
@@ -93,12 +93,12 @@
93
93
  "gen:proto": "bun scripts/generate-protocols.ts"
94
94
  },
95
95
  "dependencies": {
96
- "@oh-my-pi/omptype": "18.10.4",
97
- "@oh-my-pi/pi-utils": "18.10.4"
96
+ "@oh-my-pi/omptype": "18.11.0",
97
+ "@oh-my-pi/pi-utils": "18.11.0"
98
98
  },
99
99
  "devDependencies": {
100
100
  "@bgotink/kdl": "0.4.0",
101
- "@oh-my-pi/pi-ai": "18.10.4",
101
+ "@oh-my-pi/pi-ai": "18.11.0",
102
102
  "@types/bun": "^1.3.14"
103
103
  },
104
104
  "engines": {
@@ -70,6 +70,7 @@ export type AuthProviderId =
70
70
  | "qianfan"
71
71
  | "qwen-portal"
72
72
  | "sakana"
73
+ | "sambanova"
73
74
  | "siliconflow"
74
75
  | "siliconflow-cn"
75
76
  | "singularityapi-dev"
@@ -157,6 +158,7 @@ export type LoginProviderId =
157
158
  | "qianfan"
158
159
  | "qwen-portal"
159
160
  | "sakana"
161
+ | "sambanova"
160
162
  | "siliconflow"
161
163
  | "siliconflow-cn"
162
164
  | "singularityapi-dev"
@@ -64,6 +64,7 @@ export type KnownProvider =
64
64
  | "qianfan"
65
65
  | "qwen-portal"
66
66
  | "sakana"
67
+ | "sambanova"
67
68
  | "siliconflow"
68
69
  | "siliconflow-cn"
69
70
  | "singularityapi-dev"
@@ -4,7 +4,7 @@
4
4
  login-order "openai-codex" "anthropic" "zai" "zai-coding-plan" "kimi-code" "openrouter" "github-copilot" \
5
5
  "cursor" "devin" "google-antigravity" "google-gemini-cli" "openai-codex-device" "xai" "xai-oauth" \
6
6
  "gitlab-duo" "gitlab-duo-agent" "alibaba-coding-plan" "alibaba-token-plan" "aiand" "abliteration" "zhipu-coding-plan" \
7
- "umans" "qwen-portal" "sakana" "minimax-code" "minimax-code-cn" "xiaomi" "xiaomi-token-plan-sgp" \
7
+ "umans" "qwen-portal" "sakana" "sambanova" "minimax-code" "minimax-code-cn" "xiaomi" "xiaomi-token-plan-sgp" \
8
8
  "xiaomi-token-plan-ams" "xiaomi-token-plan-cn" "firepass" "cline-pass" "factory-droid" "commandcode" "charm-hyper" "deepseek" "stepfun" "muse-code" "meta" "moonshot" \
9
9
  "cerebras" "baseten" "helmcode" "fireworks" "together" "nvidia" "novita" "deepinfra" "huggingface" "perplexity" \
10
10
  "qianfan" "venice" "siliconflow" "siliconflow-cn" "synthetic" "nanogpt" "wafer-serverless" "coreweave" \
@@ -0,0 +1,9 @@
1
+ auth "sambanova" {
2
+ name "SambaNova"
3
+ login "api-key" {
4
+ auth-url "https://cloud.sambanova.ai/apis"
5
+ instructions "Copy your API key from the SambaNova Cloud dashboard"
6
+ prompt "Paste your SambaNova API key" placeholder="..."
7
+ validate "models-endpoint" label="SambaNova" url="https://api.sambanova.ai/v1/models"
8
+ }
9
+ }
@@ -30,7 +30,7 @@ class "minimax" {
30
30
  // upstream metadata, not the model ceiling (documented: 1M in / 128K out).
31
31
  // Exact selectors are case-sensitive, so both served spellings are listed:
32
32
  // MiniMax hosts publish `MiniMax-M3`, Charm Hyper publishes `minimax-m3`.
33
- on "charm-hyper" "minimax" "minimax-cn" "minimax-code" "minimax-code-cn" {
33
+ on "charm-hyper" "minimax" "minimax-cn" "minimax-code" "minimax-code-cn" "sambanova" {
34
34
  models "MiniMax-M3" "minimax-m3" {
35
35
  limits-patch {
36
36
  context-window 1000000
@@ -19,6 +19,13 @@ provider "local" {
19
19
  limits
20
20
  supports-tools #false
21
21
  }
22
+ model "nemotron-streaming-en-0.6b" name="Nemotron Speech 0.6B (Streaming English)" {
23
+ reasoning #false
24
+ input "text"
25
+ cost input=0 output=0 cache-read=0 cache-write=0
26
+ limits
27
+ supports-tools #false
28
+ }
22
29
  model "whisper-base" name="Whisper Base" {
23
30
  reasoning #false
24
31
  input "text"
@@ -101,7 +108,7 @@ provider "local" {
101
108
  models "kokoro" {
102
109
  kind "tts"
103
110
  }
104
- models "parakeet-tdt-0.6b-v3" "whisper-*" {
111
+ models "parakeet-tdt-0.6b-v3" "nemotron-streaming-en-0.6b" "whisper-*" {
105
112
  kind "stt"
106
113
  }
107
114
  models "lfm*" "falcon-*" "qwen*" "llama3.2:3b" "gemma-3-1b" {
@@ -15,6 +15,37 @@ provider "opencode-go" {
15
15
  input-modalities "text" "image"
16
16
  strip-image-input #false
17
17
  }
18
+ // residue: the ids-only Go roster lists this bare V4.1 Flash alias with no
19
+ // price, limits or reasoning flag, and neither models.dev nor the bundle has
20
+ // a row to hydrate it from (#15357). Mirror the gateway's own
21
+ // `deepseek-v4.1-flash` row; `cost-fallback` yields to any price discovery
22
+ // reports later.
23
+ models "deepseek-flash" {
24
+ thinking-upgrade-neutral #true
25
+ cost-fallback {
26
+ input 0.15
27
+ output 0.6
28
+ cache-read 0.003
29
+ cache-write 0.0
30
+ }
31
+ limits-patch {
32
+ context-window 1000000
33
+ max-tokens 384000
34
+ }
35
+ }
36
+ // Live Go discovery lists Argon without capabilities; its native Gemini
37
+ // endpoint requires a thinking level and accepts LOW, MEDIUM, or HIGH.
38
+ models "gemini-4-argon-contributor" {
39
+ thinking-upgrade-neutral #true
40
+ thinking-mode "google-level"
41
+ thinking-efforts "low" "medium" "high"
42
+ thinking-requires-effort #true
43
+ input-modalities "text" "image"
44
+ limits-patch {
45
+ context-window 1048576
46
+ max-tokens 65536
47
+ }
48
+ }
18
49
  // Replaces the OpenCode reasoning-model whenThinking fallback object.
19
50
  when-thinking {
20
51
  requires-reasoning-content-for-tool-calls #true
@@ -0,0 +1,60 @@
1
+ // Provider-wire compat for "sambanova". SambaNova Cloud is an OpenAI-compatible
2
+ // gateway whose roster changes often (preview models come and go on short
3
+ // notice), so the live `/v1/models` roster is authoritative. Its rows carry
4
+ // pricing and limits but no capability metadata; the selectors below own
5
+ // reasoning, thinking wire format, and image input.
6
+
7
+ provider "sambanova" {
8
+ default-model "gpt-oss-120b"
9
+ env "SAMBANOVA_API_KEY"
10
+ discovery label="SambaNova"
11
+
12
+ dynamic-models-authoritative #true
13
+ skip-cross-provider-reference-fills #true
14
+
15
+ // `/v1/models` requires a key. This row keeps the provider visible in
16
+ // `/model` before login; the first live roster replaces it. Rate card from
17
+ // https://cloud.sambanova.ai/pricing.
18
+ seed api="openai-completions" base-url="https://api.sambanova.ai/v1" bundle="fallback" {
19
+ model "gpt-oss-120b" name="GPT OSS 120B" {
20
+ reasoning #true
21
+ input "text"
22
+ cost input=0.22 output=0.59 cache-read=0 cache-write=0
23
+ limits context=131072
24
+ }
25
+ }
26
+
27
+ // `/chat/completions` documents `reasoning_effort` as low/medium/high
28
+ // (https://docs.sambanova.ai/docs/api-reference/chat-completions/create-chat-based-completion).
29
+ thinking-mode "effort"
30
+ thinking-format "openai"
31
+ class "gpt-oss" {
32
+ thinking-efforts "low" "medium" "high"
33
+ thinking-upgrade-neutral #true
34
+ }
35
+ class "minimax" {
36
+ family "m3" {
37
+ thinking-efforts "low" "medium" "high"
38
+ thinking-upgrade-neutral #true
39
+ }
40
+ }
41
+ // DeepSeek V3.x and Gemma 4 think only when the request sets
42
+ // `chat_template_kwargs.enable_thinking`; it is off by default and no
43
+ // effort reaches the template, so the ladder is one on-rung beside off
44
+ // (https://docs.sambanova.ai/docs/en/features/text-generation).
45
+ class "deepseek" {
46
+ revision ">=3.1 <4" {
47
+ thinking-format "qwen-chat-template"
48
+ thinking-efforts "high"
49
+ thinking-upgrade-neutral #true
50
+ }
51
+ }
52
+ class "gemma" {
53
+ revision ">=4" {
54
+ thinking-format "qwen-chat-template"
55
+ thinking-efforts "high"
56
+ thinking-upgrade-neutral #true
57
+ input-modalities "text" "image"
58
+ }
59
+ }
60
+ }
@@ -181,6 +181,9 @@ behavior {
181
181
  exclude-models provider="nanogpt" substring="embedding" substring="image" substring="vision" \
182
182
  substring="audio" substring="speech" substring="transcribe" substring="moderation" \
183
183
  substring="realtime" substring="whisper" substring="tts"
184
+ // SambaNova's /v1/models may include embedding and audio SKUs.
185
+ exclude-models provider="sambanova" substring="embedding" substring="whisper" substring="audio" \
186
+ substring="e5-mistral" substring="clip"
184
187
  // AIML API's roster interleaves media/embedding SKUs; bounded tokens keep
185
188
  // chat ids from false-matching on plain substrings.
186
189
  exclude-models provider="aimlapi" token="audio" token="embed" token="embedding" token="embeddings" \
@@ -263,6 +266,7 @@ behavior {
263
266
  // responses pins are gateway-verified (deepseek-v4-flash 2026-08-08;
264
267
  // muse-spark per opencode.ai/docs/go/#endpoints, #8957, #10610).
265
268
  api-routes provider="opencode-go" {
269
+ route "google-generative-ai" exact="gemini-4-argon-contributor"
266
270
  route "anthropic-messages" exact="union-alpha"
267
271
  route "openai-responses" prefix="muse-spark-" exact="deepseek-v4-flash" exact="muse-spark-1.2" \
268
272
  exact="muse-spark-1.2-contributor" exact="muse-spark-1.3" exact="muse-spark-1.3-contributor"
@@ -1,3 +1,4 @@
1
1
  class "gemma" {
2
2
  bounded "gemma"
3
+ revision prefix="gemma-"
3
4
  }
@@ -2,6 +2,10 @@ class "meta" {
2
2
  bounded "muse-spark"
3
3
  bounded "muse-wonder"
4
4
  bounded "llama"
5
+ // SambaNova serves the bare `Meta-Llama-*` spelling with no namespace
6
+ // segment, which `bounded "llama"` never sees (prefix-anchored) and
7
+ // `namespace "meta-llama"` cannot match.
8
+ bounded "meta-llama"
5
9
  namespace "meta-llama"
6
10
 
7
11
  family "llama" glob="*llama*"