@oh-my-pi/pi-catalog 18.14.2 → 18.15.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 +11 -0
- package/dist/types/compat/auth-ids.d.ts +2 -2
- package/dist/types/compat/provider-ids.d.ts +1 -1
- package/dist/types/types.d.ts +3 -2
- package/dist/types/utils.d.ts +8 -0
- package/package.json +4 -4
- package/src/compat/auth-ids.ts +2 -0
- package/src/compat/provider-ids.ts +1 -0
- package/src/compat/rules/auth/_order.kdl +1 -1
- package/src/compat/rules/auth/modular.kdl +9 -0
- package/src/compat/rules/providers/modular.kdl +35 -0
- package/src/compat/rules/providers/sambanova.kdl +2 -0
- package/src/compat/rules.json +1 -1
- package/src/discovery/codex.ts +2 -9
- package/src/model-cache.ts +5 -4
- package/src/models.json +1 -1
- package/src/provider-models/openai-compat.ts +6 -20
- package/src/types.ts +3 -2
- package/src/utils.ts +18 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [18.15.0] - 2026-11-01
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Added Modular Cloud (`modular`) as a provider: `/login modular` with an API key, models and prices from the models.dev `modular` entry, and per-model reasoning controls for MiniMax M3.1 Flash, MiniMax M3, and Gemma 4 31B ([#17334](https://github.com/can1357/oh-my-pi/pull/17334) by [@tommyjtl](https://github.com/tommyjtl))
|
|
10
|
+
- SambaNova Cloud follow-up turns now reuse the provider's prefix cache, so multi-turn conversations stop re-processing earlier context ([#17555](https://github.com/can1357/oh-my-pi/pull/17555) by [@rjuez00](https://github.com/rjuez00))
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Fixed newly discovered OpenAI-compatible models ignoring provider-reported context and output token limits ([#17561](https://github.com/can1357/oh-my-pi/pull/17561) by [@wolfiesch](https://github.com/wolfiesch))
|
|
15
|
+
|
|
5
16
|
## [18.14.2] - 2026-10-31
|
|
6
17
|
|
|
7
18
|
### Breaking Changes
|
|
@@ -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" | "inception" | "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";
|
|
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" | "inception" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "local" | "meta" | "minimax" | "minimax-code" | "minimax-code-cn" | "mistral" | "modular" | "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" | "inception" | "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";
|
|
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" | "inception" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "meta" | "minimax-code" | "minimax-code-cn" | "modular" | "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" | "inception" | "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";
|
|
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" | "inception" | "kilo" | "kimi-code" | "litellm" | "lm-studio" | "local" | "meta" | "minimax" | "minimax-code" | "minimax-code-cn" | "mistral" | "modular" | "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";
|
package/dist/types/types.d.ts
CHANGED
|
@@ -1467,8 +1467,9 @@ export interface Model<TApi extends Api = Api> {
|
|
|
1467
1467
|
useResponsesLite?: boolean;
|
|
1468
1468
|
/**
|
|
1469
1469
|
* Service-tier ids the provider advertises for this model (Codex discovery
|
|
1470
|
-
* `service_tiers[].id`,
|
|
1471
|
-
*
|
|
1470
|
+
* `service_tiers[].id`, or an OpenAI-compatible `/v1/models` row's
|
|
1471
|
+
* `service_tiers`, e.g. `priority`, `ultrafast`). Absent when the provider
|
|
1472
|
+
* publishes no per-model tier list.
|
|
1472
1473
|
*/
|
|
1473
1474
|
serviceTiers?: readonly string[];
|
|
1474
1475
|
/** Preferred model to switch to when context promotion is triggered (model id or provider/id). */
|
package/dist/types/utils.d.ts
CHANGED
|
@@ -11,6 +11,14 @@ export declare function toPositiveNumber(value: unknown, fallback: number | null
|
|
|
11
11
|
/** Positive finite number, or `null` when the value is missing/non-positive. */
|
|
12
12
|
export declare function toPositiveNumberOrNull(value: unknown): number | null;
|
|
13
13
|
export declare function toBoolean(value: unknown): boolean | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Service-tier ids from a discovery row's `service_tiers` array, deduplicated
|
|
16
|
+
* in advertisement order. Entries may be codex-rs `{ id, name, description }`
|
|
17
|
+
* objects or bare id strings (OpenAI-compatible relays). Returns `undefined`
|
|
18
|
+
* when the value is not an array; an empty array is kept, since it is a
|
|
19
|
+
* statement that the model offers no optional tier.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseServiceTierIds(value: unknown): string[] | undefined;
|
|
14
22
|
export declare function isAnthropicOAuthToken(key: string): boolean;
|
|
15
23
|
/**
|
|
16
24
|
* Normalize a model display name: drop the gateway author prefix and
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oh-my-pi/pi-catalog",
|
|
3
|
-
"version": "18.
|
|
3
|
+
"version": "18.15.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",
|
|
@@ -88,12 +88,12 @@
|
|
|
88
88
|
"gen:proto": "bun scripts/generate-protocols.ts"
|
|
89
89
|
},
|
|
90
90
|
"dependencies": {
|
|
91
|
-
"@oh-my-pi/omptype": "18.
|
|
92
|
-
"@oh-my-pi/pi-utils": "18.
|
|
91
|
+
"@oh-my-pi/omptype": "18.15.0",
|
|
92
|
+
"@oh-my-pi/pi-utils": "18.15.0"
|
|
93
93
|
},
|
|
94
94
|
"devDependencies": {
|
|
95
95
|
"@bgotink/kdl": "0.4.0",
|
|
96
|
-
"@oh-my-pi/pi-ai": "18.
|
|
96
|
+
"@oh-my-pi/pi-ai": "18.15.0",
|
|
97
97
|
"@types/bun": "^1.3.14"
|
|
98
98
|
},
|
|
99
99
|
"engines": {
|
package/src/compat/auth-ids.ts
CHANGED
|
@@ -53,6 +53,7 @@ export type AuthProviderId =
|
|
|
53
53
|
| "minimax-code"
|
|
54
54
|
| "minimax-code-cn"
|
|
55
55
|
| "mistral"
|
|
56
|
+
| "modular"
|
|
56
57
|
| "moonshot"
|
|
57
58
|
| "muse-code"
|
|
58
59
|
| "nanogpt"
|
|
@@ -143,6 +144,7 @@ export type LoginProviderId =
|
|
|
143
144
|
| "meta"
|
|
144
145
|
| "minimax-code"
|
|
145
146
|
| "minimax-code-cn"
|
|
147
|
+
| "modular"
|
|
146
148
|
| "moonshot"
|
|
147
149
|
| "muse-code"
|
|
148
150
|
| "nanogpt"
|
|
@@ -10,4 +10,4 @@ login-order "openai-codex" "anthropic" "zai" "zai-coding-plan" "kimi-code" "open
|
|
|
10
10
|
"qianfan" "venice" "siliconflow" "siliconflow-cn" "synthetic" "nanogpt" "wafer-serverless" "coreweave" \
|
|
11
11
|
"vercel-ai-gateway" "cloudflare-ai-gateway" "cloudflare-workers-ai" "snowflake" "litellm" "kilo" "zenmux" "opencode-zen" "opencode-go" \
|
|
12
12
|
"yolo-auto" "tavily" "kagi" "exa" "parallel" "typesafe" "ollama" "ollama-cloud" "lm-studio" "llama.cpp" "vllm" \
|
|
13
|
-
"gmi-cloud" "stencil" "singularityapi-dev" "singularityapi-tech" "coralbricks"
|
|
13
|
+
"gmi-cloud" "stencil" "singularityapi-dev" "singularityapi-tech" "coralbricks" "modular"
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
auth "modular" {
|
|
2
|
+
name "Modular"
|
|
3
|
+
login "api-key" {
|
|
4
|
+
auth-url "https://console.modular.com/api_keys"
|
|
5
|
+
instructions "Create an API key in the Modular Console"
|
|
6
|
+
prompt "Paste your Modular API key" placeholder="..."
|
|
7
|
+
validate "models-endpoint" label="Modular" url="https://api.modular.com/v1/models"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Provider-wire compat for "modular". Modular Cloud serves open models on an
|
|
2
|
+
// OpenAI-compatible API. The provider is catalog-only: models, prices, and
|
|
3
|
+
// limits come from the models.dev `modular` entry. Reasoning controls differ
|
|
4
|
+
// per model and were measured against the API.
|
|
5
|
+
|
|
6
|
+
provider "modular" {
|
|
7
|
+
default-model "google/gemma-4-31b-it"
|
|
8
|
+
env "MODULAR_API_KEY"
|
|
9
|
+
|
|
10
|
+
thinking-mode "effort"
|
|
11
|
+
// The API takes OpenRouter's `reasoning` object for every model, so a model
|
|
12
|
+
// models.dev adds later works without its own block: on sends
|
|
13
|
+
// `reasoning.effort`, off sends `reasoning.enabled = false`.
|
|
14
|
+
thinking-format "openrouter"
|
|
15
|
+
|
|
16
|
+
// MiniMax M3.1 Flash takes a nested `reasoning.effort` and always thinks:
|
|
17
|
+
// `reasoning.enabled = false` still returns reasoning tokens.
|
|
18
|
+
models "MiniMaxAI/MiniMax-M3.1-Flash" {
|
|
19
|
+
thinking-requires-effort #true
|
|
20
|
+
thinking-efforts "low" "medium" "high" "xhigh" "max"
|
|
21
|
+
}
|
|
22
|
+
// MiniMax M3 and Gemma 4 31B switch reasoning with `reasoning.enabled` and
|
|
23
|
+
// ignore any effort, so the ladder is one on-rung beside off: off sends
|
|
24
|
+
// `enabled: false`, and on replaces the effort with `enabled: true`.
|
|
25
|
+
models "minimax/minimax-m3" "google/gemma-4-31b-it" {
|
|
26
|
+
thinking-efforts "high"
|
|
27
|
+
when-thinking {
|
|
28
|
+
extra-body {
|
|
29
|
+
reasoning {
|
|
30
|
+
enabled #true
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -28,6 +28,8 @@ provider "sambanova" {
|
|
|
28
28
|
// (https://docs.sambanova.ai/docs/api-reference/chat-completions/create-chat-based-completion).
|
|
29
29
|
thinking-mode "effort"
|
|
30
30
|
thinking-format "openai"
|
|
31
|
+
// Replay the streamed `reasoning` field so turn-N prompts hit the gateway's prefix cache.
|
|
32
|
+
replay-reasoning-content #true
|
|
31
33
|
class "gpt-oss" {
|
|
32
34
|
thinking-efforts "low" "medium" "high"
|
|
33
35
|
thinking-upgrade-neutral #true
|