@oh-my-pi/pi-catalog 18.1.18 → 18.1.20
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 +19 -0
- package/dist/types/compat/auth-ids.d.ts +2 -2
- package/dist/types/provider-models/descriptors.d.ts +8 -0
- package/dist/types/provider-models/openai-compat.d.ts +19 -0
- package/dist/types/wire/charm-hyper.d.ts +21 -0
- package/package.json +4 -4
- package/src/compat/auth-ids.ts +2 -0
- package/src/compat/rules/auth/_order.kdl +1 -1
- package/src/compat/rules/auth/charm-hyper.kdl +19 -0
- package/src/compat/rules/classes/anthropic.kdl +17 -0
- package/src/compat/rules/classes/deepseek.kdl +11 -0
- package/src/compat/rules/classes/minimax.kdl +4 -2
- package/src/compat/rules/providers/charm-hyper.kdl +82 -0
- package/src/compat/rules/providers/deepseek.kdl +12 -1
- package/src/compat/rules/providers/opencode-go.kdl +12 -0
- package/src/compat/rules/providers/opencode-zen.kdl +12 -0
- package/src/compat/rules/providers/openrouter.kdl +0 -4
- package/src/compat/rules.json +221 -83
- package/src/models.json +5268 -4847
- package/src/provider-models/cache-provider-id.ts +28 -4
- package/src/provider-models/descriptors.ts +21 -0
- package/src/provider-models/openai-compat.ts +206 -3
- package/src/wire/charm-hyper.ts +26 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [18.1.20] - 2026-09-13
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Fixed DeepSeek V4.1 Flash dropping image attachments on hosts without their own carve-out, so the natively multimodal model is no longer treated as text-only ([#11992](https://github.com/can1357/oh-my-pi/pull/11992) by [@infernix](https://github.com/infernix)).
|
|
10
|
+
- LiteLLM model groups keep the image input their deployment declares, instead of having attachments replaced with the "model does not support vision" placeholder ([#11982](https://github.com/can1357/oh-my-pi/issues/11982), [#11985](https://github.com/can1357/oh-my-pi/pull/11985) by [@lz37](https://github.com/lz37)).
|
|
11
|
+
- Fixed OpenCode Zen/Go Muse Spark models failing every tool-call turn with a 400 "reasoning encrypted_content was not issued to this caller" error: the gateways proxy the Responses lane to Meta but can't round-trip encrypted reasoning, so those SKUs no longer request or replay it ([#11928](https://github.com/can1357/oh-my-pi/issues/11928)).
|
|
12
|
+
|
|
13
|
+
## [18.1.19] - 2026-09-12
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- Added Charm Hyper as a built-in provider with API-key login, live model discovery, and per-model pricing, effort ladders, and limits read straight from its catalog ([#11656](https://github.com/can1357/oh-my-pi/pull/11656) by [@oldschoola](https://github.com/oldschoola)).
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- `anthropic/claude-fable-5-1` cache reads now cost Anthropic's published $0.25/MTok instead of $1.00, so session cost and usage reports no longer overstate cache-read spend by 4x ([#11862](https://github.com/can1357/oh-my-pi/pull/11862) by [@camjac251](https://github.com/camjac251)).
|
|
22
|
+
|
|
5
23
|
## [18.1.18] - 2026-09-11
|
|
6
24
|
|
|
7
25
|
### Added
|
|
@@ -13,6 +31,7 @@
|
|
|
13
31
|
- OpenCode Go's DeepSeek Flash lanes (`deepseek-flash`, `deepseek-v4.1-flash`) now declare image input. The gateway serves them with vision despite the IDs carrying no vision suffix, so the class-wide `strip-image-input` rule was dropping attachments the endpoint reads; the modality is declared too, since live discovery seeds these lanes text-only ([#11774](https://github.com/can1357/oh-my-pi/pull/11774) by [@STRML](https://github.com/STRML)).
|
|
14
32
|
- Amazon Bedrock OpenAI models, plus unclassified profiles such as opaque application-inference-profile ARNs, now carry the compatibility policy required to preserve image-bearing tool results ([#11681](https://github.com/can1357/oh-my-pi/issues/11681)).
|
|
15
33
|
- DeepSeek V4.1 Flash requests now honor the documented 384K output maximum instead of being capped at 64K ([#11769](https://github.com/can1357/oh-my-pi/issues/11769)).
|
|
34
|
+
- Fixed the first-party `deepseek-flash` alias missing the V4.1 Flash wire contract: it now sends `max_tokens` with `reasoning_content` and replays reasoning and assistant content on tool calls with no tool choice ([#11799](https://github.com/can1357/oh-my-pi/pull/11799) by [@brit](https://github.com/brit)).
|
|
16
35
|
|
|
17
36
|
## [18.1.17] - 2026-09-10
|
|
18
37
|
|
|
@@ -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" | "azure" | "baseten" | "bedrock-mantle" | "cerebras" | "cline-pass" | "cloudflare-ai-gateway" | "commandcode" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google" | "google-antigravity" | "google-gemini-cli" | "google-vertex" | "groq" | "huggingface" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "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" | "synthetic" | "tavily" | "together" | "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";
|
|
2
|
+
export type AuthProviderId = "abliteration" | "aiand" | "aimlapi" | "alibaba-coding-plan" | "alibaba-token-plan" | "amazon-bedrock" | "anthropic" | "azure" | "baseten" | "bedrock-mantle" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "commandcode" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google" | "google-antigravity" | "google-gemini-cli" | "google-vertex" | "groq" | "huggingface" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "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" | "synthetic" | "tavily" | "together" | "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";
|
|
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" | "cline-pass" | "cloudflare-ai-gateway" | "commandcode" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google-antigravity" | "google-gemini-cli" | "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" | "synthetic" | "tavily" | "together" | "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" | "commandcode" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google-antigravity" | "google-gemini-cli" | "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" | "synthetic" | "tavily" | "together" | "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";
|
|
@@ -88,6 +88,14 @@ export declare const CATALOG_PROVIDERS: readonly [{
|
|
|
88
88
|
readonly catalogDiscovery: {
|
|
89
89
|
readonly label: "Cerebras";
|
|
90
90
|
};
|
|
91
|
+
}, {
|
|
92
|
+
readonly id: "charm-hyper";
|
|
93
|
+
readonly defaultModel: "glm-5.3";
|
|
94
|
+
readonly envVars: readonly ["CHARM_HYPER_API_KEY", "HYPER_API_KEY"];
|
|
95
|
+
readonly createModelManagerOptions: (config: ModelManagerConfig) => import("../index.js").ModelManagerOptions<"openai-completions", unknown>;
|
|
96
|
+
readonly allowUnauthenticated: true;
|
|
97
|
+
readonly dynamicModelsAuthoritative: true;
|
|
98
|
+
readonly skipCrossProviderReferenceFills: true;
|
|
91
99
|
}, {
|
|
92
100
|
readonly id: "cloudflare-ai-gateway";
|
|
93
101
|
readonly defaultModel: "anthropic/claude-opus-4-8";
|
|
@@ -745,3 +745,22 @@ export interface CommandCodeModelManagerConfig {
|
|
|
745
745
|
* or context window.
|
|
746
746
|
*/
|
|
747
747
|
export declare function commandCodeModelManagerOptions(config?: CommandCodeModelManagerConfig): ModelManagerOptions<Api>;
|
|
748
|
+
/**
|
|
749
|
+
* Configuration for the Charm Hyper model manager.
|
|
750
|
+
*
|
|
751
|
+
* `baseUrl` overrides the gateway root for tests and self-hosted proxies; a
|
|
752
|
+
* value that omits the `/v1` surface gains one, so a host-only override
|
|
753
|
+
* behaves like every sibling provider's.
|
|
754
|
+
*/
|
|
755
|
+
export interface CharmHyperModelManagerConfig {
|
|
756
|
+
apiKey?: string;
|
|
757
|
+
baseUrl?: string;
|
|
758
|
+
fetch?: FetchImpl;
|
|
759
|
+
}
|
|
760
|
+
/**
|
|
761
|
+
* Charm Hyper's gateway catalog. `/v1/models` is public and carries the live
|
|
762
|
+
* tariff, so discovery runs with or without a key and the snapshot is
|
|
763
|
+
* authoritative: a model the gateway stops serving is pruned rather than kept
|
|
764
|
+
* alive by a stale bundled row.
|
|
765
|
+
*/
|
|
766
|
+
export declare function charmHyperModelManagerOptions(config?: CharmHyperModelManagerConfig): ModelManagerOptions<"openai-completions">;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Charm Hyper gateway endpoint, shared so a host migration — or a self-hosted
|
|
3
|
+
* proxy override — touches a single module.
|
|
4
|
+
*/
|
|
5
|
+
export declare const CHARM_HYPER_API_BASE_URL = "https://hyper.charm.land/v1";
|
|
6
|
+
/**
|
|
7
|
+
* Resolve a configured Charm Hyper base URL onto the gateway's `/v1` surface.
|
|
8
|
+
*
|
|
9
|
+
* Every consumer must agree on this, because they key different things off the
|
|
10
|
+
* result: inference and discovery target it, `/usage` sends a bearer token to
|
|
11
|
+
* it, and the model cache namespace is hashed from it. Three separate copies
|
|
12
|
+
* previously disagreed for a blank value — the model manager treated it as
|
|
13
|
+
* absent and used the canonical host, while the others produced a bare `/v1` —
|
|
14
|
+
* so a whitespace-only override silently split inference, balance checks and
|
|
15
|
+
* caching across different endpoints.
|
|
16
|
+
*
|
|
17
|
+
* A blank or whitespace-only value therefore means "not configured" and
|
|
18
|
+
* resolves to the canonical host; anything else keeps its host and gains the
|
|
19
|
+
* `/v1` segment if it omits one.
|
|
20
|
+
*/
|
|
21
|
+
export declare function normalizeCharmHyperBaseUrl(baseUrl?: string): string;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@oh-my-pi/pi-catalog",
|
|
4
|
-
"version": "18.1.
|
|
4
|
+
"version": "18.1.20",
|
|
5
5
|
"description": "Model catalog for omp: bundled model database, provider discovery descriptors, model identity, classification, and equivalence",
|
|
6
6
|
"homepage": "https://omp.sh",
|
|
7
7
|
"author": "Stencil Labs, Inc.",
|
|
@@ -35,12 +35,12 @@
|
|
|
35
35
|
"gen:proto": "bun scripts/generate-protocols.ts"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@oh-my-pi/omptype": "18.1.
|
|
39
|
-
"@oh-my-pi/pi-utils": "18.1.
|
|
38
|
+
"@oh-my-pi/omptype": "18.1.20",
|
|
39
|
+
"@oh-my-pi/pi-utils": "18.1.20"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@bgotink/kdl": "0.4.0",
|
|
43
|
-
"@oh-my-pi/pi-ai": "18.1.
|
|
43
|
+
"@oh-my-pi/pi-ai": "18.1.20",
|
|
44
44
|
"@types/bun": "^1.3.14"
|
|
45
45
|
},
|
|
46
46
|
"engines": {
|
package/src/compat/auth-ids.ts
CHANGED
|
@@ -13,6 +13,7 @@ export type AuthProviderId =
|
|
|
13
13
|
| "baseten"
|
|
14
14
|
| "bedrock-mantle"
|
|
15
15
|
| "cerebras"
|
|
16
|
+
| "charm-hyper"
|
|
16
17
|
| "cline-pass"
|
|
17
18
|
| "cloudflare-ai-gateway"
|
|
18
19
|
| "commandcode"
|
|
@@ -94,6 +95,7 @@ export type LoginProviderId =
|
|
|
94
95
|
| "anthropic"
|
|
95
96
|
| "baseten"
|
|
96
97
|
| "cerebras"
|
|
98
|
+
| "charm-hyper"
|
|
97
99
|
| "cline-pass"
|
|
98
100
|
| "cloudflare-ai-gateway"
|
|
99
101
|
| "commandcode"
|
|
@@ -5,7 +5,7 @@ login-order "openai-codex" "anthropic" "zai" "zai-coding-plan" "kimi-code" "open
|
|
|
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
7
|
"umans" "qwen-portal" "sakana" "minimax-code" "minimax-code-cn" "xiaomi" "xiaomi-token-plan-sgp" \
|
|
8
|
-
"xiaomi-token-plan-ams" "xiaomi-token-plan-cn" "firepass" "cline-pass" "commandcode" "deepseek" "muse-code" "meta" "moonshot" \
|
|
8
|
+
"xiaomi-token-plan-ams" "xiaomi-token-plan-cn" "firepass" "cline-pass" "commandcode" "charm-hyper" "deepseek" "muse-code" "meta" "moonshot" \
|
|
9
9
|
"cerebras" "baseten" "fireworks" "together" "nvidia" "novita" "deepinfra" "huggingface" "perplexity" \
|
|
10
10
|
"qianfan" "venice" "siliconflow" "siliconflow-cn" "synthetic" "nanogpt" "wafer-serverless" "coreweave" \
|
|
11
11
|
"vercel-ai-gateway" "cloudflare-ai-gateway" "litellm" "kilo" "zenmux" "opencode-zen" "opencode-go" \
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Validation targets `/v1/credits`, not `/v1/models`: the models endpoint is
|
|
2
|
+
// public and answers 200 with no credentials or a bogus key (verified
|
|
3
|
+
// 2026-09-11), so a models-endpoint probe against it could never reject a bad
|
|
4
|
+
// key. `/v1/credits` is an authenticated, non-billable GET that returns the
|
|
5
|
+
// account balance on success and 401 `{"error":"authentication failed"}`
|
|
6
|
+
// otherwise — the same trick cline-pass uses to validate against its own
|
|
7
|
+
// `/users/me`, and cheaper than a chat-completions probe that would bill the
|
|
8
|
+
// key on every login.
|
|
9
|
+
auth "charm-hyper" {
|
|
10
|
+
name "Charm Hyper"
|
|
11
|
+
env "CHARM_HYPER_API_KEY" "HYPER_API_KEY"
|
|
12
|
+
login "api-key" {
|
|
13
|
+
auth-url "https://hyper.charm.land/"
|
|
14
|
+
instructions "Create or copy an API key from the Charm Hyper dashboard"
|
|
15
|
+
prompt "Paste your Charm Hyper API key" placeholder="sk-hyper-..."
|
|
16
|
+
normalize "strip-bearer"
|
|
17
|
+
validate "models-endpoint" label="Charm Hyper" url="https://hyper.charm.land/v1/credits"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -169,6 +169,23 @@ class "anthropic" {
|
|
|
169
169
|
cache-read 1.0
|
|
170
170
|
cache-write 12.5
|
|
171
171
|
}
|
|
172
|
+
// Fable 5.1 cut cache reads to $0.25/MTok, 0.025x input, a 75% rate
|
|
173
|
+
// unique to the 5.1 generation; Fable 5 stays at the 0.1x family
|
|
174
|
+
// default. https://www.anthropic.com/claude/fable
|
|
175
|
+
//
|
|
176
|
+
// `cost-patch` is an object axis, so the winning rule supplies the
|
|
177
|
+
// whole payload rather than merging field-wise over the family
|
|
178
|
+
// patch above. Restate input/output/cache-write, or a
|
|
179
|
+
// discovery-sourced 5.1 row (Anthropic's /v1/models omits pricing)
|
|
180
|
+
// would keep only the cache-read correction.
|
|
181
|
+
revision "=5.1" {
|
|
182
|
+
cost-patch {
|
|
183
|
+
input 10.0
|
|
184
|
+
output 50.0
|
|
185
|
+
cache-read 0.25
|
|
186
|
+
cache-write 12.5
|
|
187
|
+
}
|
|
188
|
+
}
|
|
172
189
|
limits-patch {
|
|
173
190
|
context-window 1000000
|
|
174
191
|
max-tokens 128000
|
|
@@ -73,6 +73,17 @@ class "deepseek" {
|
|
|
73
73
|
models token="vision" {
|
|
74
74
|
strip-image-input #false
|
|
75
75
|
}
|
|
76
|
+
// DeepSeek V4.1 Flash is natively multimodal (image-text-to-text), but its
|
|
77
|
+
// id carries no `vision` token, so the class-wide strip above dropped
|
|
78
|
+
// attachments the model reads on every deployment without its own carve-out.
|
|
79
|
+
// The glob also spans `-vision`/`-ocr` ids, which already set the same value
|
|
80
|
+
// below, so the explicit priority resolves that equal-rank tie instead of
|
|
81
|
+
// throwing AmbiguousOverlapError. Only the strip is disabled; the declared
|
|
82
|
+
// modality stays host-derived, so endpoints whose OpenAI-compatible surface
|
|
83
|
+
// rejects `image_url` keep their text-only contract.
|
|
84
|
+
models "*v4.1-flash*" priority=10 {
|
|
85
|
+
strip-image-input #false
|
|
86
|
+
}
|
|
76
87
|
on "ollama-cloud" "nvidia" "deepseek" "fireworks" "nanogpt" "opencode-go" "openrouter" {
|
|
77
88
|
stream-markup-healing-pattern "dsml"
|
|
78
89
|
}
|
|
@@ -28,8 +28,10 @@ class "minimax" {
|
|
|
28
28
|
}
|
|
29
29
|
// MiniMax-M3: 512K is the standard pricing-tier boundary leaked into
|
|
30
30
|
// upstream metadata, not the model ceiling (documented: 1M in / 128K out).
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
// Exact selectors are case-sensitive, so both served spellings are listed:
|
|
32
|
+
// MiniMax hosts publish `MiniMax-M3`, Charm Hyper publishes `minimax-m3`.
|
|
33
|
+
on "charm-hyper" "minimax" "minimax-cn" "minimax-code" "minimax-code-cn" {
|
|
34
|
+
models "MiniMax-M3" "minimax-m3" {
|
|
33
35
|
limits-patch {
|
|
34
36
|
context-window 1000000
|
|
35
37
|
max-tokens 128000
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// Charm Hyper gateway deployment contract.
|
|
2
|
+
//
|
|
3
|
+
// Capability data is NOT restated here: `GET /v1/models` publishes each row's
|
|
4
|
+
// context window, output cap, vision flag, effort vocabulary and per-million
|
|
5
|
+
// tariff, and `charmHyperModelManagerOptions` maps all of it verbatim —
|
|
6
|
+
// including `reasoningDisableMode`, which is derived per model from whether
|
|
7
|
+
// the advertised vocabulary contains `none`. Only facts the gateway does not
|
|
8
|
+
// publish, or publishes wrongly, belong in this file.
|
|
9
|
+
provider "charm-hyper" {
|
|
10
|
+
// OpenAI-dialect gateway in front of open-weight and third-party models.
|
|
11
|
+
// `developer` and `store` are accepted (HTTP 200) but the gateway accepts
|
|
12
|
+
// every unknown field it is handed, so acceptance is not evidence the
|
|
13
|
+
// semantics are honored; both stay off and system prompts ride the
|
|
14
|
+
// `system` role, matching every sibling gateway. The wire takes
|
|
15
|
+
// `max_tokens` (verified 2026-09-11).
|
|
16
|
+
supports-developer-role #false
|
|
17
|
+
supports-store #false
|
|
18
|
+
max-tokens-field "max_tokens"
|
|
19
|
+
thinking-mode "effort"
|
|
20
|
+
// Reasoning arrives as `reasoning_content` on both the streamed delta and
|
|
21
|
+
// the final message (verified 2026-09-11).
|
|
22
|
+
reasoning-content-field "reasoning_content"
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Blockless rows are left non-reasoning on purpose.
|
|
25
|
+
//
|
|
26
|
+
// Four ids serve a thinking model while publishing no `reasoning` block:
|
|
27
|
+
// glm-5, glm-5.1, kimi-k2-thinking and minimax-m2.7 each returned
|
|
28
|
+
// populated `reasoning_content` and non-zero `reasoning_tokens` on a
|
|
29
|
+
// multi-step prompt (2026-09-11). The other blockless rows
|
|
30
|
+
// (gemma-4-26b-a4b-it, kimi-k2.5, kimi-k2.7-code, llama-3.3-70b-instruct,
|
|
31
|
+
// llama-4-maverick-17b-128e-instruct-fp8,
|
|
32
|
+
// qwen3-coder-480b-a35b-instruct-int4-mixed-ar, qwen3-next-80b-a3b-instruct)
|
|
33
|
+
// returned none.
|
|
34
|
+
//
|
|
35
|
+
// No rule restores them, because none can be written honestly. Those four
|
|
36
|
+
// expose no effort dial, and `ThinkingConfig.efforts` is documented as
|
|
37
|
+
// never empty — a reasoning model without a controllable surface carries
|
|
38
|
+
// `thinking: undefined`, which no KDL axis can express (the only upgrade
|
|
39
|
+
// path is an exact `thinking-efforts` ladder). Synthesizing a ladder would
|
|
40
|
+
// add silent no-op rungs: the gateway answers 200 to efforts it never
|
|
41
|
+
// advertised and simply ignores them, and a repeat measurement of effort
|
|
42
|
+
// sensitivity on these ids came back non-monotonic, i.e. sampling noise
|
|
43
|
+
// rather than a hidden dial.
|
|
44
|
+
//
|
|
45
|
+
// The cost is narrow and was checked: streamed `reasoning_content` is
|
|
46
|
+
// parsed and displayed with no `model.reasoning` gate, the effort
|
|
47
|
+
// parameter is moot without a dial, and the developer-role and
|
|
48
|
+
// zai-replay paths are already disabled for this provider.
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Residue: misreported output caps. The gateway derives
|
|
51
|
+
// `max_output_tokens` as a flat fraction of the context window rather
|
|
52
|
+
// than reporting a real ceiling — 10% on 9 rows, the dominant
|
|
53
|
+
// convention — and the values are advisory, not enforced: glm-5.1
|
|
54
|
+
// publishes 3276 yet produced 14066 tokens, and minimax-m2.7 publishes
|
|
55
|
+
// 6553 yet produced 8418, both stopping on `finish_reason: "stop"`
|
|
56
|
+
// rather than `length`. An over-stated cap is never rejected either
|
|
57
|
+
// (`max_tokens: 200000` returns 200), so the risk is one-sided:
|
|
58
|
+
// over-stating costs only the context share 10% already reserves
|
|
59
|
+
// everywhere else, while under-stating truncates real output.
|
|
60
|
+
//
|
|
61
|
+
// Both corrections take a same-window peer's published value rather than
|
|
62
|
+
// inventing a ceiling, and both clear the measured floor:
|
|
63
|
+
// glm-5.1 (202750) is 1.6%; sibling glm-5 (202752) publishes 20275.
|
|
64
|
+
// minimax-m2.7 (262100) is 2.5%, the lone outlier in its window class;
|
|
65
|
+
// kimi-k2.5 (262144), kimi-k2.6 (262000) and
|
|
66
|
+
// qwen3-next-80b (262144) all publish 26214.
|
|
67
|
+
//
|
|
68
|
+
// deepseek-v4.1-flash is the only other 2.5% row and is deliberately left
|
|
69
|
+
// alone: its 1M window has no peer group that agrees on a fraction, and a
|
|
70
|
+
// long generation stopped naturally at 8504, well inside the published
|
|
71
|
+
// 26214. Measured 2026-09-11.
|
|
72
|
+
models "glm-5.1" {
|
|
73
|
+
limits-patch {
|
|
74
|
+
max-tokens 20275
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
models "minimax-m2.7" {
|
|
78
|
+
limits-patch {
|
|
79
|
+
max-tokens 26214
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -82,11 +82,22 @@ provider "deepseek" {
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
// residue: taxonomy ranks and exact globs do not isolate these models.
|
|
85
|
-
|
|
85
|
+
// The bare `deepseek-flash` alias serves DeepSeek-V4.1-Flash, so it shares
|
|
86
|
+
// the V4.1 wire contract: max_tokens + reasoning_content, mandatory replay
|
|
87
|
+
// (synthetic placeholders rejected upstream), no tool choice, and the
|
|
88
|
+
// low/high/max effort ladder the bare alias cannot inherit by family.
|
|
89
|
+
models "deepseek-flash" "deepseek-v4-flash" "deepseek-v4.1-flash-expires-on-0910" {
|
|
90
|
+
// Stale source capability data: discovery reports the bare alias as
|
|
91
|
+
// non-reasoning, so opt into the cascade upgrade for the exact ladder.
|
|
92
|
+
thinking-upgrade-neutral #true
|
|
86
93
|
max-tokens-field "max_tokens"
|
|
87
94
|
reasoning-content-field "reasoning_content"
|
|
88
95
|
requires-assistant-content-for-tool-calls #true
|
|
89
96
|
requires-reasoning-content-for-tool-calls #true
|
|
97
|
+
allows-synthetic-reasoning-content-for-tool-calls #false
|
|
90
98
|
supports-tool-choice #false
|
|
99
|
+
// The bare alias carries no taxonomy family, so it cannot inherit the
|
|
100
|
+
// flash ladder; the exact rule owns it instead.
|
|
101
|
+
thinking-efforts "low" "high" "max"
|
|
91
102
|
}
|
|
92
103
|
}
|
|
@@ -45,6 +45,18 @@ provider "opencode-go" {
|
|
|
45
45
|
class "kimi" {
|
|
46
46
|
thinking-mode "effort"
|
|
47
47
|
}
|
|
48
|
+
// The Go gateway proxies Muse Spark's Responses lane to Meta but cannot
|
|
49
|
+
// round-trip encrypted reasoning: the upstream issues `encrypted_content`
|
|
50
|
+
// bound to the gateway's own caller, so replaying it on a later step 400s
|
|
51
|
+
// with "reasoning `encrypted_content` was not issued to this caller"
|
|
52
|
+
// (#11928). Stop requesting it and drop native reasoning items from replay
|
|
53
|
+
// so multi-step tool-call turns stop failing.
|
|
54
|
+
class "meta" {
|
|
55
|
+
family "muse-spark" {
|
|
56
|
+
include-encrypted-reasoning #false
|
|
57
|
+
filter-reasoning-history #true
|
|
58
|
+
}
|
|
59
|
+
}
|
|
48
60
|
class "mimo" {
|
|
49
61
|
family "v2" {
|
|
50
62
|
thinking-mode "effort"
|
|
@@ -26,6 +26,18 @@ provider "opencode-zen" {
|
|
|
26
26
|
class "kimi" {
|
|
27
27
|
thinking-mode "effort"
|
|
28
28
|
}
|
|
29
|
+
// The Zen gateway proxies Muse Spark's Responses lane to Meta but cannot
|
|
30
|
+
// round-trip encrypted reasoning: the upstream issues `encrypted_content`
|
|
31
|
+
// bound to the gateway's own caller, so replaying it on a later step 400s
|
|
32
|
+
// with "reasoning `encrypted_content` was not issued to this caller"
|
|
33
|
+
// (#11928). Stop requesting it and drop native reasoning items from replay
|
|
34
|
+
// so multi-step tool-call turns stop failing.
|
|
35
|
+
class "meta" {
|
|
36
|
+
family "muse-spark" {
|
|
37
|
+
include-encrypted-reasoning #false
|
|
38
|
+
filter-reasoning-history #true
|
|
39
|
+
}
|
|
40
|
+
}
|
|
29
41
|
class "mimo" {
|
|
30
42
|
family "v2" {
|
|
31
43
|
thinking-mode "effort"
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
// Provider-wire compat for "openrouter"; regenerated from the frozen census using deployment contract selectors.
|
|
2
2
|
|
|
3
3
|
provider "openrouter" {
|
|
4
|
-
// V4.1 Flash accepts images despite its ID lacking a vision suffix.
|
|
5
|
-
models "deepseek/deepseek-v4.1-flash" {
|
|
6
|
-
strip-image-input #false
|
|
7
|
-
}
|
|
8
4
|
// Replaces the OpenRouter provider wire-model-id dispatch branch.
|
|
9
5
|
wire-model-id-mode "openrouter"
|
|
10
6
|
// Replaces the strict-mode provider whitelist entry.
|