@oh-my-pi/pi-catalog 18.10.4 → 18.11.1
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 +27 -0
- package/dist/types/compat/auth-ids.d.ts +2 -2
- package/dist/types/compat/provider-ids.d.ts +1 -1
- package/dist/types/discovery/antigravity.d.ts +7 -0
- package/dist/types/provider-models/openai-compat.d.ts +18 -0
- package/dist/types/types.d.ts +3 -1
- package/package.json +4 -4
- package/src/build.ts +5 -0
- package/src/compat/auth-ids.ts +2 -0
- package/src/compat/axes.ts +1 -0
- package/src/compat/provider-ids.ts +1 -0
- package/src/compat/resolve.ts +3 -1
- package/src/compat/rules/auth/_order.kdl +1 -1
- package/src/compat/rules/auth/sambanova.kdl +9 -0
- package/src/compat/rules/classes/gemini.kdl +18 -2
- package/src/compat/rules/classes/minimax.kdl +1 -1
- package/src/compat/rules/providers/google-vertex.kdl +4 -0
- package/src/compat/rules/providers/local.kdl +8 -1
- package/src/compat/rules/providers/native-tools.kdl +3 -0
- package/src/compat/rules/providers/opencode-go.kdl +31 -0
- package/src/compat/rules/providers/sambanova.kdl +60 -0
- package/src/compat/rules/providers/xai-oauth.kdl +9 -6
- package/src/compat/rules/runtime/behavior.kdl +8 -1
- package/src/compat/rules/taxonomy/gemma.kdl +1 -0
- package/src/compat/rules/taxonomy/meta.kdl +4 -0
- package/src/compat/rules.json +1 -1
- package/src/discovery/antigravity.ts +13 -0
- package/src/models.json +1 -1
- package/src/provider-models/cache-provider-id.ts +1 -1
- package/src/provider-models/descriptors.ts +2 -0
- package/src/provider-models/google.ts +7 -1
- package/src/provider-models/openai-compat.ts +103 -5
- package/src/types.ts +3 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [18.11.1] - 2026-10-15
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Enabled long prompt-cache retention (`ttl: "1h"`) for Claude models on `google-vertex` ([#15505](https://github.com/can1357/oh-my-pi/pull/15505) by [@hpost](https://github.com/hpost))
|
|
10
|
+
- Fixed Gemini 4 Argon on Google Vertex and the Gemini API failing every request with "Thinking budget is not supported for this model": Gemini 4 now sends `thinkingLevel` instead of `thinkingBudget`, and Argon offers only the low, medium, and high levels Google accepts ([#15643](https://github.com/can1357/oh-my-pi/pull/15643) by [@kevcube](https://github.com/kevcube))
|
|
11
|
+
- Fixed the Antigravity model selector offering roster rows the backend marks disabled (`disabled: true`, e.g. `gemini-4-argon-disabled` on accounts without Argon access), which answered `Cloud Code Assist API error (404): Requested entity was not found.`; discovery now skips them the way it already skips `isInternal` rows ([#15684](https://github.com/can1357/oh-my-pi/pull/15684) by [@CharleoYang](https://github.com/CharleoYang))
|
|
12
|
+
- Removed Google Antigravity's Gemini 3.5 Flash and its `gemini-3-flash` alias from the model list; Antigravity retired them and answers every request with a retirement notice instead of a reply ([#15445](https://github.com/can1357/oh-my-pi/pull/15445) by [@will-bogusz](https://github.com/will-bogusz))
|
|
13
|
+
- Fixed `xai-oauth` Grok 4.20 models (`grok-4.20-0309-reasoning`, `-non-reasoning`, `grok-4.20-multi-agent-0309`) advertising a 2M context window when the SuperGrok API rejects prompts over 1M; auto-compaction and context usage now work from the 1M window ([#15443](https://github.com/can1357/oh-my-pi/pull/15443) by [@will-bogusz](https://github.com/will-bogusz))
|
|
14
|
+
- Fixed trailing-dot `localhost.` and `*.local.` custom endpoints losing local-backend compatibility settings ([#15798](https://github.com/can1357/oh-my-pi/issues/15798)).
|
|
15
|
+
|
|
16
|
+
## [18.11.0] - 2026-10-14
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- 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)).
|
|
21
|
+
- 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))
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- 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))
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
|
|
29
|
+
- 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))
|
|
30
|
+
- 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))
|
|
31
|
+
|
|
5
32
|
## [18.10.4] - 2026-10-13
|
|
6
33
|
|
|
7
34
|
### 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";
|
|
@@ -18,6 +18,13 @@ export interface AntigravityDiscoveryApiModel {
|
|
|
18
18
|
apiProvider?: string;
|
|
19
19
|
modelProvider?: string;
|
|
20
20
|
isInternal?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Set for roster rows the backend lists but refuses to serve on this
|
|
23
|
+
* account (e.g. `gemini-4-argon-disabled`, `tagTitle: "Unavailable"`,
|
|
24
|
+
* `model: MODEL_PLACEHOLDER_M421`); a request against such an id answers
|
|
25
|
+
* `Cloud Code Assist API error (404): Requested entity was not found.`
|
|
26
|
+
*/
|
|
27
|
+
disabled?: boolean;
|
|
21
28
|
supportsVideo?: boolean;
|
|
22
29
|
}
|
|
23
30
|
/**
|
|
@@ -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/dist/types/types.d.ts
CHANGED
|
@@ -1230,6 +1230,8 @@ export interface Model<TApi extends Api = Api> {
|
|
|
1230
1230
|
requiresGlyphTokenization?: boolean;
|
|
1231
1231
|
/** Whether this model requires Cursor's tool-schema combiner projection. */
|
|
1232
1232
|
requiresCursorToolSchemaProjection?: boolean;
|
|
1233
|
+
/** Whether advertised tool schemas occupy every model request's context (false for deferred catalogs). */
|
|
1234
|
+
toolSchemasInContext?: boolean;
|
|
1233
1235
|
/** Whether this model requires tool-result images hoisted into sibling user content blocks. */
|
|
1234
1236
|
requiresToolResultImageHoisting?: boolean;
|
|
1235
1237
|
/**
|
|
@@ -1493,7 +1495,7 @@ export interface Model<TApi extends Api = Api> {
|
|
|
1493
1495
|
* vocabulary of `buildModel`. Identical to `Model` except `compat` carries the
|
|
1494
1496
|
* sparse override shape and nothing is resolved yet.
|
|
1495
1497
|
*/
|
|
1496
|
-
export interface ModelSpec<TApi extends Api = Api> extends Omit<Model<TApi>, "compat" | "identity" | "compatConfig" | "requiresGlyphTokenization" | "requiresCursorToolSchemaProjection" | "requiresToolResultImageHoisting" | "supportsAssistantPrefill" | "supportsComputerUseConfig"> {
|
|
1498
|
+
export interface ModelSpec<TApi extends Api = Api> extends Omit<Model<TApi>, "compat" | "identity" | "compatConfig" | "requiresGlyphTokenization" | "requiresCursorToolSchemaProjection" | "toolSchemasInContext" | "requiresToolResultImageHoisting" | "supportsAssistantPrefill" | "supportsComputerUseConfig"> {
|
|
1497
1499
|
/** Sparse compatibility overrides; resolved into `Model.compat` by `buildModel`. */
|
|
1498
1500
|
compat?: CompatConfigOf<TApi>;
|
|
1499
1501
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oh-my-pi/pi-catalog",
|
|
3
|
-
"version": "18.
|
|
3
|
+
"version": "18.11.1",
|
|
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.
|
|
97
|
-
"@oh-my-pi/pi-utils": "18.
|
|
96
|
+
"@oh-my-pi/omptype": "18.11.1",
|
|
97
|
+
"@oh-my-pi/pi-utils": "18.11.1"
|
|
98
98
|
},
|
|
99
99
|
"devDependencies": {
|
|
100
100
|
"@bgotink/kdl": "0.4.0",
|
|
101
|
-
"@oh-my-pi/pi-ai": "18.
|
|
101
|
+
"@oh-my-pi/pi-ai": "18.11.1",
|
|
102
102
|
"@types/bun": "^1.3.14"
|
|
103
103
|
},
|
|
104
104
|
"engines": {
|
package/src/build.ts
CHANGED
|
@@ -115,6 +115,11 @@ function applyCatalogAssignments<TApi extends Api>(model: Model<TApi>, catalog:
|
|
|
115
115
|
} else {
|
|
116
116
|
delete model.requiresCursorToolSchemaProjection;
|
|
117
117
|
}
|
|
118
|
+
if (catalog.toolSchemasInContext === false) {
|
|
119
|
+
model.toolSchemasInContext = false;
|
|
120
|
+
} else {
|
|
121
|
+
delete model.toolSchemasInContext;
|
|
122
|
+
}
|
|
118
123
|
const requiresToolResultImageHoisting = catalog.requiresToolResultImageHoisting;
|
|
119
124
|
if (requiresToolResultImageHoisting === true) {
|
|
120
125
|
model.requiresToolResultImageHoisting = true;
|
package/src/compat/auth-ids.ts
CHANGED
|
@@ -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"
|
package/src/compat/axes.ts
CHANGED
|
@@ -340,6 +340,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
|
|
|
340
340
|
values: ["freeform", "function"],
|
|
341
341
|
},
|
|
342
342
|
"requires-native-tools": { key: "requiresNativeTools", set: "catalog", shape: "scalar", values: [true, false] },
|
|
343
|
+
"tool-schemas-in-context": { key: "toolSchemasInContext", set: "catalog", shape: "scalar", values: [true, false] },
|
|
343
344
|
"requires-tool-free-history-for-tool-opt-out": {
|
|
344
345
|
key: "requiresToolFreeHistoryForToolOptOut",
|
|
345
346
|
set: "catalog",
|
package/src/compat/resolve.ts
CHANGED
|
@@ -276,6 +276,7 @@ function hasLocalLoopbackBaseUrl(baseUrl: string | undefined): boolean {
|
|
|
276
276
|
let hostname: string;
|
|
277
277
|
try {
|
|
278
278
|
hostname = new URL(baseUrl).hostname.toLowerCase();
|
|
279
|
+
if (hostname.endsWith(".")) hostname = hostname.slice(0, -1);
|
|
279
280
|
} catch {
|
|
280
281
|
return false;
|
|
281
282
|
}
|
|
@@ -1039,7 +1040,8 @@ function defaultThinkingMode<TApi extends Api>(spec: ModelSpec<TApi>, facts: Ide
|
|
|
1039
1040
|
case "google-generative-ai":
|
|
1040
1041
|
case "google-gemini-cli":
|
|
1041
1042
|
case "google-vertex":
|
|
1042
|
-
|
|
1043
|
+
// Gemini 3+ `google-level` is a `thinking-mode` rule in classes/gemini.kdl.
|
|
1044
|
+
return "budget";
|
|
1043
1045
|
case "anthropic-messages":
|
|
1044
1046
|
if (facts.is("minimax") && facts.family("m2", "m3")) return "anthropic-adaptive";
|
|
1045
1047
|
if (facts.is("glm") && facts.revGte("5.2") && (spec.provider === "umans" || spec.provider === "zai")) {
|
|
@@ -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
|
+
}
|
|
@@ -66,13 +66,15 @@ class "gemini" {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
-
// Gemini 3.7+ Flash native thinkingLevel does not accept
|
|
70
|
-
// (400 THINKING_LEVEL_MINIMAL; observed on 3.7 and 3.8
|
|
69
|
+
// Gemini 3.7+ Flash and Gemini 4 Argon native thinkingLevel does not accept
|
|
70
|
+
// `minimal` (400 THINKING_LEVEL_MINIMAL; observed on Flash 3.7 and 3.8, and
|
|
71
|
+
// documented for Argon and Argon Cyber Permissive). Only the direct
|
|
71
72
|
// google-level transports emit `thinkingLevel` on the wire, so the tier is
|
|
72
73
|
// dropped there; budget (anthropic-messages) and reasoning_effort resellers
|
|
73
74
|
// never send the rejected value and keep the four-tier ladder. The collapsed
|
|
74
75
|
// google-antigravity / google-gemini-cli variants remap minimal -> LOW and
|
|
75
76
|
// carry their own explicit ladder, so they are unaffected.
|
|
77
|
+
// https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/4-argon
|
|
76
78
|
// https://ai.google.dev/gemini-api/docs/generate-content/thinking#thinking-levels
|
|
77
79
|
on "google" "google-vertex" "opencode-zen" {
|
|
78
80
|
family "flash" {
|
|
@@ -80,6 +82,13 @@ class "gemini" {
|
|
|
80
82
|
thinking-efforts "low" "medium" "high"
|
|
81
83
|
}
|
|
82
84
|
}
|
|
85
|
+
// Exact ids: a revision-wide rule would tie with the Pro low/high ladder.
|
|
86
|
+
// Gemini API discovery has no bundled Argon reference and infers
|
|
87
|
+
// `reasoning: false` from the id; repair it so the ladder is selectable.
|
|
88
|
+
models "gemini-4-argon" "gemini-4-argon-cyber-permissive" {
|
|
89
|
+
thinking-upgrade-neutral #true
|
|
90
|
+
thinking-efforts "low" "medium" "high"
|
|
91
|
+
}
|
|
83
92
|
}
|
|
84
93
|
// Gemini 4 Argon's introductory list price ($2/$10, $0.10 cached) ends
|
|
85
94
|
// 2026-11-30; from 2026-12-01 Google bills $4/$20, $0.20 cached, on the
|
|
@@ -116,6 +125,13 @@ class "gemini" {
|
|
|
116
125
|
// Replaces the Gemini 3+ mandatory-reasoning fallback.
|
|
117
126
|
thinking-requires-effort #true
|
|
118
127
|
}
|
|
128
|
+
// Gemini 3+ takes `thinkingLevel` on the native Google transports; Gemini 4
|
|
129
|
+
// rejects `thinkingBudget` outright (400 "Use thinking level instead").
|
|
130
|
+
on-api "google-generative-ai" "google-gemini-cli" "google-vertex" {
|
|
131
|
+
revision ">=3" {
|
|
132
|
+
thinking-mode "google-level"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
119
135
|
// Public Gemini requires the bypass sentinel on every unsigned call and
|
|
120
136
|
// supports function-part ids. Scope by adapter so custom providers using
|
|
121
137
|
// the same wire protocol inherit both contracts. The Cloud Code Assist
|
|
@@ -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
|
|
@@ -28,6 +28,10 @@ provider "google-vertex" {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
class "anthropic" {
|
|
31
|
+
// Vertex rawPredict honors `cache_control.ttl: "1h"` (writes bill to
|
|
32
|
+
// `ephemeral_1h_input_tokens`, entries outlive 5m) without any beta; the
|
|
33
|
+
// `extended-cache-ttl-2025-04-11` beta is rejected in `anthropic_beta`.
|
|
34
|
+
supports-long-cache-retention #true
|
|
31
35
|
revision ">=4.5 <4.6" {
|
|
32
36
|
thinking-efforts "minimal" "low" "medium" "high" "xhigh"
|
|
33
37
|
}
|
|
@@ -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" {
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
// Cursor always exposes server-owned native operations, even with an empty tool catalog.
|
|
2
2
|
on-api "cursor-agent" {
|
|
3
3
|
requires-native-tools #true
|
|
4
|
+
// MCP schemas live in Cursor's server-side catalog and enter model context
|
|
5
|
+
// only when dynamically selected, not as a fixed cost on every turn.
|
|
6
|
+
tool-schemas-in-context #false
|
|
4
7
|
}
|
|
@@ -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
|
+
}
|
|
@@ -15,8 +15,9 @@ provider "xai-oauth" {
|
|
|
15
15
|
|
|
16
16
|
// Source of truth for the xai-oauth chat picker. Declaration order is headline order.
|
|
17
17
|
// Context windows from hermes-agent/agent/model_metadata.py:205-220
|
|
18
|
-
// ("Values sourced from models.dev (2026-04)")
|
|
19
|
-
// coding-fine-tuned chat model; 512K context per user
|
|
18
|
+
// ("Values sourced from models.dev (2026-04)") unless a row says otherwise.
|
|
19
|
+
// grok-build is xAI's coding-fine-tuned chat model; 512K context per user
|
|
20
|
+
// spec (2026-05-17).
|
|
20
21
|
//
|
|
21
22
|
// xai-oauth's /v1/models exposes no per-request output limit on the OAuth
|
|
22
23
|
// (Grok Build / SuperGrok) surface, so maxTokens mirrors contextWindow. The
|
|
@@ -68,25 +69,27 @@ provider "xai-oauth" {
|
|
|
68
69
|
cost input=0 output=0 cache-read=0 cache-write=0
|
|
69
70
|
limits context=500000 max-tokens=500000
|
|
70
71
|
}
|
|
71
|
-
//
|
|
72
|
+
// grok-4.20-*-0309: api.x.ai rejects prompts over 1M tokens on this surface
|
|
73
|
+
// ([input_too_large] "... > 1000000 tokens", all three ids, 2026-10-12).
|
|
74
|
+
// Multi-agent is text-only per the bundled catalog.
|
|
72
75
|
model "grok-4.20-multi-agent-0309" name="Grok 4.20 (Multi-Agent)" {
|
|
73
76
|
reasoning #true
|
|
74
77
|
input "text"
|
|
75
78
|
cost input=0 output=0 cache-read=0 cache-write=0
|
|
76
|
-
limits context=
|
|
79
|
+
limits context=1000000 max-tokens=1000000
|
|
77
80
|
}
|
|
78
81
|
model "grok-4.20-0309-reasoning" name="Grok 4.20 (Reasoning)" {
|
|
79
82
|
reasoning #true
|
|
80
83
|
input "text" "image"
|
|
81
84
|
cost input=0 output=0 cache-read=0 cache-write=0
|
|
82
|
-
limits context=
|
|
85
|
+
limits context=1000000 max-tokens=1000000
|
|
83
86
|
supports-reasoning-effort #false
|
|
84
87
|
}
|
|
85
88
|
model "grok-4.20-0309-non-reasoning" name="Grok 4.20 (Non-Reasoning)" {
|
|
86
89
|
reasoning #false
|
|
87
90
|
input "text" "image"
|
|
88
91
|
cost input=0 output=0 cache-read=0 cache-write=0
|
|
89
|
-
limits context=
|
|
92
|
+
limits context=1000000 max-tokens=1000000
|
|
90
93
|
}
|
|
91
94
|
// Cursor's "Composer 2.5 Fast" exposed via SuperGrok: non-reasoning,
|
|
92
95
|
// text-only, 200K context (mirrors Cursor's composer-* catalog entries).
|
|
@@ -173,6 +173,10 @@ behavior {
|
|
|
173
173
|
// serve; the dedicated tool surfaces route them instead.
|
|
174
174
|
exclude-models provider="xai-oauth" exact="grok-imagine-image-quality" exact="grok-imagine-image-2.0" \
|
|
175
175
|
prefix="grok-imagine-video" prefix="grok-stt-" prefix="grok-voice-"
|
|
176
|
+
// Antigravity still advertises the Gemini 3.5 Flash wire ids, but every
|
|
177
|
+
// request to them answers with a retirement notice instead of a reply.
|
|
178
|
+
// `gemini-3-flash` is the family's recycled alias and routes to the same ids.
|
|
179
|
+
exclude-models provider="google-antigravity" exact="gemini-3.5-flash" exact="gemini-3-flash"
|
|
176
180
|
// Meta's /v1/models lists image generation and transcription SKUs beside
|
|
177
181
|
// the Muse Spark chat models, and SAM segmentation beside them.
|
|
178
182
|
exclude-models provider="meta" prefix="muse-image-" prefix="muse-voice-" prefix="sam-"
|
|
@@ -181,6 +185,9 @@ behavior {
|
|
|
181
185
|
exclude-models provider="nanogpt" substring="embedding" substring="image" substring="vision" \
|
|
182
186
|
substring="audio" substring="speech" substring="transcribe" substring="moderation" \
|
|
183
187
|
substring="realtime" substring="whisper" substring="tts"
|
|
188
|
+
// SambaNova's /v1/models may include embedding and audio SKUs.
|
|
189
|
+
exclude-models provider="sambanova" substring="embedding" substring="whisper" substring="audio" \
|
|
190
|
+
substring="e5-mistral" substring="clip"
|
|
184
191
|
// AIML API's roster interleaves media/embedding SKUs; bounded tokens keep
|
|
185
192
|
// chat ids from false-matching on plain substrings.
|
|
186
193
|
exclude-models provider="aimlapi" token="audio" token="embed" token="embedding" token="embeddings" \
|
|
@@ -263,6 +270,7 @@ behavior {
|
|
|
263
270
|
// responses pins are gateway-verified (deepseek-v4-flash 2026-08-08;
|
|
264
271
|
// muse-spark per opencode.ai/docs/go/#endpoints, #8957, #10610).
|
|
265
272
|
api-routes provider="opencode-go" {
|
|
273
|
+
route "google-generative-ai" exact="gemini-4-argon-contributor"
|
|
266
274
|
route "anthropic-messages" exact="union-alpha"
|
|
267
275
|
route "openai-responses" prefix="muse-spark-" exact="deepseek-v4-flash" exact="muse-spark-1.2" \
|
|
268
276
|
exact="muse-spark-1.2-contributor" exact="muse-spark-1.3" exact="muse-spark-1.3-contributor"
|
|
@@ -345,7 +353,6 @@ behavior {
|
|
|
345
353
|
// Google); price rows at their first-party equivalents, Vertex before
|
|
346
354
|
// Anthropic for Claude ids. Aliases map ids whose peer ships differently.
|
|
347
355
|
pricing-peer provider="google-antigravity" peers="google" "google-vertex" "anthropic" {
|
|
348
|
-
alias "gemini-3-flash" peer-id="gemini-3-flash-preview"
|
|
349
356
|
alias "gemini-3-pro" peer-id="gemini-3-pro-preview"
|
|
350
357
|
alias "gemini-3.1-pro" peer-id="gemini-3.1-pro-preview"
|
|
351
358
|
alias "claude-opus-4-5" peer-id="claude-opus-4-5@20251101"
|
|
@@ -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*"
|