@oh-my-pi/pi-catalog 18.1.11 → 18.1.12
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 +15 -0
- package/dist/types/compat/auth-ids.d.ts +2 -2
- package/dist/types/compat/context-window.d.ts +7 -0
- package/dist/types/compat/types.d.ts +1 -0
- package/dist/types/provider-models/descriptors.d.ts +5 -0
- package/dist/types/provider-models/openai-compat.d.ts +3 -0
- package/dist/types/types.d.ts +12 -1
- package/package.json +4 -4
- package/src/build.ts +4 -0
- package/src/compat/auth-ids.ts +2 -0
- package/src/compat/axes.ts +3 -1
- package/src/compat/context-window.ts +31 -0
- package/src/compat/resolve.ts +1 -0
- package/src/compat/rules/README.md +1 -1
- package/src/compat/rules/auth/_order.kdl +1 -1
- package/src/compat/rules/auth/muse-code.kdl +28 -0
- package/src/compat/rules/classes/meta.kdl +7 -1
- package/src/compat/rules/providers/meta.kdl +1 -0
- package/src/compat/rules/providers/muse-code.kdl +16 -0
- package/src/compat/rules/providers/openai-codex.kdl +27 -0
- package/src/compat/rules/runtime/behavior.kdl +2 -1
- package/src/compat/rules.json +195 -21
- package/src/compat/types.ts +1 -1
- package/src/discovery/codex.ts +6 -2
- package/src/models.json +503 -5
- package/src/provider-models/cache-provider-id.ts +9 -0
- package/src/provider-models/descriptors.ts +7 -0
- package/src/provider-models/openai-compat.ts +57 -3
- package/src/types.ts +12 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [18.1.12] - 2026-09-06
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Added Muse Code as a provider with Muse Spark models and live account-scoped discovery.
|
|
10
|
+
- Muse Code subscriptions now resolve a compact edit-prompt variant, cutting recurring per-request tool bytes without touching other providers.
|
|
11
|
+
- Added Meta's new `max` reasoning effort tier to Muse Spark 1.3 (standard) on the Meta Model API and Muse Code.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- Fixed OpenCode Go/Zen live model discovery (`GET /v1/models`) missing `x-opencode-session` and omp's `User-Agent`: discovery requests now attribute with the stable install id so the requests OpenCode flags as `Bun fetch` carry the required session header.
|
|
16
|
+
- Fixed GPT-6 Astra requests through GitHub Copilot failing with an unsupported endpoint error ([#10874](https://github.com/can1357/oh-my-pi/pull/10874) by [@xpcmdshell](https://github.com/xpcmdshell)).
|
|
17
|
+
- Fixed GPT-6 Astra showing as free with a 272K-token window in the OpenAI Codex catalog by applying its documented pricing; `/extended-context` enables the wire-advertised 872K-token maximum ([#10980](https://github.com/can1357/oh-my-pi/pull/10980) by [@H4vC](https://github.com/H4vC)).
|
|
18
|
+
- Made extended-context catalog rebuilds faster by resolving each model's maximum window once per process ([#11039](https://github.com/can1357/oh-my-pi/pull/11039) by [@H4vC](https://github.com/H4vC)).
|
|
19
|
+
|
|
5
20
|
## [18.1.9] - 2026-09-04
|
|
6
21
|
|
|
7
22
|
### 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" | "azure" | "baseten" | "bedrock-mantle" | "cerebras" | "cline-pass" | "cloudflare-ai-gateway" | "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" | "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" | "cline-pass" | "cloudflare-ai-gateway" | "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" | "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" | "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" | "cline-pass" | "cloudflare-ai-gateway" | "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";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Model } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Maximum prompt window for extended context. Live discovery takes precedence
|
|
4
|
+
* over rule-owned fallbacks for older bundled or cached model metadata. Resolve
|
|
5
|
+
* at catalog composition time so frozen bundled rows need no runtime mutation.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveMaxContextWindow(model: Model): number | undefined;
|
|
@@ -262,6 +262,11 @@ export declare const CATALOG_PROVIDERS: readonly [{
|
|
|
262
262
|
readonly defaultModel: "devstral-medium-latest";
|
|
263
263
|
readonly envVars: readonly ["MISTRAL_API_KEY"];
|
|
264
264
|
readonly createModelManagerOptions: (config: ModelManagerConfig) => import("../index.js").ModelManagerOptions<"openai-completions", unknown>;
|
|
265
|
+
}, {
|
|
266
|
+
readonly id: "muse-code";
|
|
267
|
+
readonly defaultModel: "muse-spark-1.3";
|
|
268
|
+
readonly createModelManagerOptions: (config: ModelManagerConfig) => import("../index.js").ModelManagerOptions<"openai-responses", unknown>;
|
|
269
|
+
readonly dynamicModelsAuthoritative: true;
|
|
265
270
|
}, {
|
|
266
271
|
readonly id: "meta";
|
|
267
272
|
readonly defaultModel: "muse-spark-1.1";
|
|
@@ -509,6 +509,9 @@ export interface MetaModelManagerConfig {
|
|
|
509
509
|
fetch?: FetchImpl;
|
|
510
510
|
}
|
|
511
511
|
export declare function metaModelManagerOptions(config?: MetaModelManagerConfig): ModelManagerOptions<"openai-responses">;
|
|
512
|
+
/** Muse Code shares Meta Model API's model capabilities and equivalent token pricing. */
|
|
513
|
+
export declare const MUSE_CODE_STATIC_MODELS: readonly ModelSpec<"openai-responses">[];
|
|
514
|
+
export declare function museCodeModelManagerOptions(config?: MetaModelManagerConfig): ModelManagerOptions<"openai-responses">;
|
|
512
515
|
export interface MoonshotModelManagerConfig {
|
|
513
516
|
apiKey?: string;
|
|
514
517
|
baseUrl?: string;
|
package/dist/types/types.d.ts
CHANGED
|
@@ -653,6 +653,8 @@ export interface ResolvedOpenAISharedCompat {
|
|
|
653
653
|
isOpenRouterHost: boolean;
|
|
654
654
|
/** Whether this endpoint needs a max-token field even when caller did not set one. */
|
|
655
655
|
alwaysSendMaxTokens: boolean;
|
|
656
|
+
/** Clamp a requested output-token count to the model's advertised ceiling. */
|
|
657
|
+
clampOutputToModelMax: boolean;
|
|
656
658
|
openRouterRouting?: OpenAICompat["openRouterRouting"];
|
|
657
659
|
/** Provider-specific wire model-id transform applied to the base id. */
|
|
658
660
|
wireModelIdMode: "raw" | "cline-pass" | "firepass" | "fireworks" | "openrouter";
|
|
@@ -673,7 +675,7 @@ export interface ResolvedOpenAISharedCompat {
|
|
|
673
675
|
* `buildModel`; request handlers read fields and never detect, resolve, or
|
|
674
676
|
* allocate.
|
|
675
677
|
*/
|
|
676
|
-
export type ResolvedOpenAICompat = ResolvedOpenAISharedCompat & Required<Omit<OpenAICompat, "supportsDeveloperRole" | "supportsReasoningEffort" | "reasoningEffortMap" | "supportsReasoningParams" | "supportsReasoningSummary" | "supportsSamplingParams" | "supportsPenaltyAndStopParams" | "thinkingFormat" | "kimiApiFormat" | "reasoningDisableMode" | "omitReasoningEffort" | "includeEncryptedReasoning" | "filterReasoningHistory" | "disableReasoningOnForcedToolChoice" | "disableReasoningOnToolChoice" | "supportsToolChoice" | "supportsForcedToolChoice" | "supportsNamedToolChoice" | "reasoningContentField" | "requiresReasoningContentForToolCalls" | "requiresReasoningContentForAllAssistantTurns" | "allowsSyntheticReasoningContentForToolCalls" | "replayReasoningContent" | "qwenPreserveThinking" | "qwenTemplateReasoningEffort" | "requiresThinkingAsText" | "requiresMistralToolIds" | "requiresToolResultName" | "requiresAssistantAfterToolResult" | "requiresAssistantContentForToolCalls" | "stripDeepseekSpecialTokens" | "streamMarkupHealingPattern" | "reasoningDeltasMayBeCumulative" | "emptyLengthFinishIsContextError" | "usesOpenAIToolCallIdLimit" | "promptCacheSessionHeader" | "supportsPromptCacheBreakpoints" | "promptCacheBreakpointTtl" | "openRouterRouting" | "isOpenRouterHost" | "supportsStrictMode" | "supportsLongPromptCacheRetention" | "alwaysSendMaxTokens" | "wireModelIdMode" | "vercelGatewayRouting" | "extraBody" | "toolStrictMode" | "toolSchemaFlavor" | "streamFirstEventTimeoutMs" | "streamIdleTimeoutMs" | "cacheControlFormat" | "thinkingKeep" | "strictResponsesPairing" | "supportsImageDetailOriginal" | "stripImageInput" | "thinkingLoopGuard" | "whenThinking">> & {
|
|
678
|
+
export type ResolvedOpenAICompat = ResolvedOpenAISharedCompat & Required<Omit<OpenAICompat, "supportsDeveloperRole" | "supportsReasoningEffort" | "reasoningEffortMap" | "supportsReasoningParams" | "supportsReasoningSummary" | "supportsSamplingParams" | "supportsPenaltyAndStopParams" | "thinkingFormat" | "kimiApiFormat" | "reasoningDisableMode" | "omitReasoningEffort" | "includeEncryptedReasoning" | "filterReasoningHistory" | "disableReasoningOnForcedToolChoice" | "disableReasoningOnToolChoice" | "supportsToolChoice" | "supportsForcedToolChoice" | "supportsNamedToolChoice" | "reasoningContentField" | "requiresReasoningContentForToolCalls" | "requiresReasoningContentForAllAssistantTurns" | "allowsSyntheticReasoningContentForToolCalls" | "replayReasoningContent" | "qwenPreserveThinking" | "qwenTemplateReasoningEffort" | "requiresThinkingAsText" | "requiresMistralToolIds" | "requiresToolResultName" | "requiresAssistantAfterToolResult" | "requiresAssistantContentForToolCalls" | "stripDeepseekSpecialTokens" | "streamMarkupHealingPattern" | "reasoningDeltasMayBeCumulative" | "emptyLengthFinishIsContextError" | "usesOpenAIToolCallIdLimit" | "promptCacheSessionHeader" | "supportsPromptCacheBreakpoints" | "promptCacheBreakpointTtl" | "openRouterRouting" | "isOpenRouterHost" | "supportsStrictMode" | "supportsLongPromptCacheRetention" | "alwaysSendMaxTokens" | "clampOutputToModelMax" | "wireModelIdMode" | "vercelGatewayRouting" | "extraBody" | "toolStrictMode" | "toolSchemaFlavor" | "streamFirstEventTimeoutMs" | "streamIdleTimeoutMs" | "cacheControlFormat" | "thinkingKeep" | "strictResponsesPairing" | "supportsImageDetailOriginal" | "stripImageInput" | "thinkingLoopGuard" | "whenThinking">> & {
|
|
677
679
|
vercelGatewayRouting?: OpenAICompat["vercelGatewayRouting"];
|
|
678
680
|
extraBody?: OpenAICompat["extraBody"];
|
|
679
681
|
cacheControlFormat?: OpenAICompat["cacheControlFormat"];
|
|
@@ -942,6 +944,8 @@ export interface Model<TApi extends Api = Api> {
|
|
|
942
944
|
/** Premium Copilot requests charged per user-initiated request (defaults to 1). */
|
|
943
945
|
premiumMultiplier?: number;
|
|
944
946
|
contextWindow: number | null;
|
|
947
|
+
/** Optional larger prompt window available when extended context is enabled. */
|
|
948
|
+
maxContextWindow?: number;
|
|
945
949
|
maxTokens: number | null;
|
|
946
950
|
/**
|
|
947
951
|
* When `true`, providers MUST omit `max_output_tokens` (Responses) /
|
|
@@ -1023,6 +1027,13 @@ export interface Model<TApi extends Api = Api> {
|
|
|
1023
1027
|
* - `"function"` or undefined: JSON function-tool with `{input: string}` (spec §1.2).
|
|
1024
1028
|
*/
|
|
1025
1029
|
applyPatchToolType?: "freeform" | "function";
|
|
1030
|
+
/**
|
|
1031
|
+
* Edit-tool description density for this model. `"compact"` selects the
|
|
1032
|
+
* terse mode prompt (all operations and invariants preserved) for hosts
|
|
1033
|
+
* where per-request prompt bytes are the dominant cost. Generated catalog
|
|
1034
|
+
* policy sets it; the edit tool falls back to the full prompt when unset.
|
|
1035
|
+
*/
|
|
1036
|
+
editPromptVariant?: "full" | "compact";
|
|
1026
1037
|
/**
|
|
1027
1038
|
* Force OAuth-style request shaping for providers whose API key prefix doesn't
|
|
1028
1039
|
* match an OAuth token (e.g. routing Anthropic traffic through a proxy that
|
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.12",
|
|
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.12",
|
|
39
|
+
"@oh-my-pi/pi-utils": "18.1.12"
|
|
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.12",
|
|
44
44
|
"@types/bun": "^1.3.14"
|
|
45
45
|
},
|
|
46
46
|
"engines": {
|
package/src/build.ts
CHANGED
|
@@ -52,6 +52,10 @@ function applyCatalogAssignments<TApi extends Api>(model: Model<TApi>, catalog:
|
|
|
52
52
|
if (applyPatchToolType === "freeform" || applyPatchToolType === "function") {
|
|
53
53
|
model.applyPatchToolType = applyPatchToolType;
|
|
54
54
|
}
|
|
55
|
+
const editPromptVariant = catalog.editPromptVariant;
|
|
56
|
+
if (editPromptVariant === "full" || editPromptVariant === "compact") {
|
|
57
|
+
model.editPromptVariant = editPromptVariant;
|
|
58
|
+
}
|
|
55
59
|
const requiresCursorToolSchemaProjection = catalog.requiresCursorToolSchemaProjection;
|
|
56
60
|
if (requiresCursorToolSchemaProjection === true) {
|
|
57
61
|
model.requiresCursorToolSchemaProjection = true;
|
package/src/compat/auth-ids.ts
CHANGED
|
@@ -45,6 +45,7 @@ export type AuthProviderId =
|
|
|
45
45
|
| "minimax-code-cn"
|
|
46
46
|
| "mistral"
|
|
47
47
|
| "moonshot"
|
|
48
|
+
| "muse-code"
|
|
48
49
|
| "nanogpt"
|
|
49
50
|
| "novita"
|
|
50
51
|
| "nvidia"
|
|
@@ -119,6 +120,7 @@ export type LoginProviderId =
|
|
|
119
120
|
| "minimax-code"
|
|
120
121
|
| "minimax-code-cn"
|
|
121
122
|
| "moonshot"
|
|
123
|
+
| "muse-code"
|
|
122
124
|
| "nanogpt"
|
|
123
125
|
| "novita"
|
|
124
126
|
| "nvidia"
|
package/src/compat/axes.ts
CHANGED
|
@@ -90,7 +90,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
|
|
|
90
90
|
"allows-synthetic-reasoning-content-for-tool-calls": wire("allowsSyntheticReasoningContentForToolCalls", OAI),
|
|
91
91
|
"always-send-max-tokens": wire("alwaysSendMaxTokens", OAI),
|
|
92
92
|
"cache-control-format": wire("cacheControlFormat", OAI, "scalar", ["anthropic"]),
|
|
93
|
-
"clamp-output-to-model-max": wire("clampOutputToModelMax",
|
|
93
|
+
"clamp-output-to-model-max": wire("clampOutputToModelMax", OAI),
|
|
94
94
|
"disable-reasoning-on-forced-tool-choice": wire("disableReasoningOnForcedToolChoice", OAI),
|
|
95
95
|
"disable-reasoning-on-tool-choice": wire("disableReasoningOnToolChoice", OAI),
|
|
96
96
|
"drop-thinking-when-reasoning-effort": wire("dropThinkingWhenReasoningEffort", ["openai"]),
|
|
@@ -271,11 +271,13 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
|
|
|
271
271
|
"context-window-floor": { key: "contextWindowFloor", set: "catalog", shape: "scalar" },
|
|
272
272
|
"cost-patch": { key: "costPatch", set: "catalog", shape: "object" },
|
|
273
273
|
"delegation-bias": { key: "delegationBias", set: "catalog", shape: "scalar", values: DELEGATION_BIASES },
|
|
274
|
+
"edit-prompt-variant": { key: "editPromptVariant", set: "catalog", shape: "scalar", values: ["full", "compact"] },
|
|
274
275
|
"edit-revision": { key: "editRevision", set: "catalog", shape: "scalar" },
|
|
275
276
|
"input-modalities": { key: "inputModalities", set: "catalog", shape: "array", values: ["text", "image"] },
|
|
276
277
|
"limits-patch": { key: "limitsPatch", set: "catalog", shape: "object" },
|
|
277
278
|
"long-context-cost": { key: "longContext", set: "catalog", shape: "object" },
|
|
278
279
|
"long-usage-limit-fallback": { key: "longUsageLimitFallback", set: "catalog", shape: "scalar" },
|
|
280
|
+
"max-context-window": { key: "maxContextWindow", set: "catalog", shape: "scalar" },
|
|
279
281
|
"requires-cursor-tool-schema-projection": {
|
|
280
282
|
key: "requiresCursorToolSchemaProjection",
|
|
281
283
|
set: "catalog",
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { toModelSpec } from "../provider-models/bundled-references";
|
|
2
|
+
import type { Model } from "../types";
|
|
3
|
+
import { resolveModelPolicy } from "./resolve";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Rule-owned fallback maxima by `provider/id/api`. The rule table is static
|
|
7
|
+
* per process (compiled into rules.json), so one resolution per model key is
|
|
8
|
+
* enough — composition calls this per model on every rebuild while extended
|
|
9
|
+
* context is enabled, and the full policy resolve (identity classification
|
|
10
|
+
* plus cascade walk) is wasted work per call.
|
|
11
|
+
*/
|
|
12
|
+
const ruleFallbackCache = new Map<string, number | undefined>();
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Maximum prompt window for extended context. Live discovery takes precedence
|
|
16
|
+
* over rule-owned fallbacks for older bundled or cached model metadata. Resolve
|
|
17
|
+
* at catalog composition time so frozen bundled rows need no runtime mutation.
|
|
18
|
+
*/
|
|
19
|
+
export function resolveMaxContextWindow(model: Model): number | undefined {
|
|
20
|
+
const maximum = model.maxContextWindow;
|
|
21
|
+
if (typeof maximum === "number" && Number.isFinite(maximum) && maximum > 0) {
|
|
22
|
+
return maximum;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const key = `${model.provider} ${model.id} ${model.api}`;
|
|
26
|
+
if (ruleFallbackCache.has(key)) return ruleFallbackCache.get(key);
|
|
27
|
+
const fallback = resolveModelPolicy(toModelSpec(model)).catalog.maxContextWindow;
|
|
28
|
+
const resolved = typeof fallback === "number" && Number.isFinite(fallback) && fallback > 0 ? fallback : undefined;
|
|
29
|
+
ruleFallbackCache.set(key, resolved);
|
|
30
|
+
return resolved;
|
|
31
|
+
}
|
package/src/compat/resolve.ts
CHANGED
|
@@ -753,6 +753,7 @@ function resolveOpenAIResponsesPolicy(
|
|
|
753
753
|
wireModelIdMode: isOpenRouter ? "openrouter" : "raw",
|
|
754
754
|
toolSchemaFlavor: facts.is("kimi") ? "moonshot-mfjs" : undefined,
|
|
755
755
|
alwaysSendMaxTokens: facts.is("kimi"),
|
|
756
|
+
clampOutputToModelMax: false,
|
|
756
757
|
supportsObfuscationOptOut: isOpenAIUrl || provider === "openai",
|
|
757
758
|
officialEndpoint: isOfficialOpenAIEndpoint(provider, baseUrl),
|
|
758
759
|
harmonyLeakMitigation: false,
|
|
@@ -276,7 +276,7 @@ auth "anthropic" {
|
|
|
276
276
|
credential {
|
|
277
277
|
access "access_token" // dot path; `claim="a|b"` reads JWT claims; `literal="…"` pins a value
|
|
278
278
|
refresh "refresh_token"
|
|
279
|
-
expires "seconds" path="expires_in" from="created_at" skew-ms=300000 // or `expires "jwt" fallback-ms=N` / `expires "never"`
|
|
279
|
+
expires "seconds" path="expires_in" from="created_at" skew-ms=300000 fallback-ms=3600000 // or `expires "jwt" fallback-ms=N` / `expires "never"`
|
|
280
280
|
email "account.email_address" // also account-id, org-id, org-name, project-id, api-endpoint, enterprise-url
|
|
281
281
|
}
|
|
282
282
|
userinfo url="https://…/userinfo" email="email" account-id="sub"
|
|
@@ -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" "deepseek" "meta" "moonshot" \
|
|
8
|
+
"xiaomi-token-plan-ams" "xiaomi-token-plan-cn" "firepass" "cline-pass" "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,28 @@
|
|
|
1
|
+
auth "muse-code" {
|
|
2
|
+
name "Muse Code (Subscription)"
|
|
3
|
+
expiry "jwt-or-never"
|
|
4
|
+
login "device-code" {
|
|
5
|
+
client-id "1031625952748946"
|
|
6
|
+
device url="https://auth.meta.com/oidc/device/authorization/" {
|
|
7
|
+
headers {
|
|
8
|
+
Accept "application/json"
|
|
9
|
+
"x-api-version" "1.0.0"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
token url="https://auth.meta.com/oidc/device/token/" {
|
|
13
|
+
headers {
|
|
14
|
+
Accept "application/json"
|
|
15
|
+
"x-api-version" "1.0.0"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
response user-code="user_code" device-code="device_code" verification-uri="verification_uri" verification-uri-complete="verification_uri_complete" interval="interval" expires-in="expires_in"
|
|
19
|
+
instructions "Enter code: {user_code}"
|
|
20
|
+
credential {
|
|
21
|
+
// Model requests use the minted API key, not the account token. Meta's
|
|
22
|
+
// device response omits expiry and rejects refresh_token grants.
|
|
23
|
+
expires "never"
|
|
24
|
+
}
|
|
25
|
+
after-exchange hook="muse-code-key"
|
|
26
|
+
}
|
|
27
|
+
refresh "none"
|
|
28
|
+
}
|
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
class "meta" {
|
|
4
4
|
// Exact ids on purpose: only an exact selector upgrades hosts whose
|
|
5
5
|
// discovery misreports a Muse Spark revision as non-reasoning.
|
|
6
|
-
|
|
6
|
+
// muse-spark-1.3 exposes the max effort tier; older/contributor revisions
|
|
7
|
+
// keep the 5-tier ladder.
|
|
8
|
+
models "muse-spark-1.3" {
|
|
9
|
+
thinking-efforts "minimal" "low" "medium" "high" "xhigh" "max"
|
|
10
|
+
thinking-mode "effort"
|
|
11
|
+
}
|
|
12
|
+
models "muse-spark-1.1" "muse-spark-1.2" "muse-spark-1.2-contributor" "muse-spark-1.3-contributor" {
|
|
7
13
|
thinking-efforts "minimal" "low" "medium" "high" "xhigh"
|
|
8
14
|
thinking-mode "effort"
|
|
9
15
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Muse Code subscriptions use the same Model API wire contract as direct Meta API keys.
|
|
2
|
+
|
|
3
|
+
provider "muse-code" {
|
|
4
|
+
include-encrypted-reasoning #true
|
|
5
|
+
supports-reasoning-effort #true
|
|
6
|
+
clamp-output-to-model-max #true
|
|
7
|
+
// Subscription tier bills per request; the compact edit prompt cuts the
|
|
8
|
+
// recurring tool-schema bytes. Verified 2026-09-05 against api.meta.ai/v1:
|
|
9
|
+
// `custom` tools are rejected with 400 "`custom` tools are not supported
|
|
10
|
+
// on this endpoint", so apply-patch must stay a function tool here.
|
|
11
|
+
edit-prompt-variant "compact"
|
|
12
|
+
class "unknown" {
|
|
13
|
+
thinking-efforts "minimal" "low" "medium" "high" "xhigh"
|
|
14
|
+
thinking-mode "effort"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -29,6 +29,24 @@ provider "openai-codex" {
|
|
|
29
29
|
cache-write 15.625
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
+
// Codex discovery currently reports Astra's legacy 272K window and no
|
|
33
|
+
// pricing. Attribute subscription usage at the documented credit-equivalent
|
|
34
|
+
// rates, with free cache writes and without the API's >272K multiplier.
|
|
35
|
+
// The wire's 872K `max_context_window` (client 0.153.1, 2026-09-04) is the
|
|
36
|
+
// `/extended-context` maximum (see the `max-context-window` fallback
|
|
37
|
+
// below); the default stays at 272K so compaction fires first.
|
|
38
|
+
models "gpt-6-astra" "gpt-6-astra-wm" {
|
|
39
|
+
cost-patch {
|
|
40
|
+
input 10.0
|
|
41
|
+
output 50.0
|
|
42
|
+
cache-read 1.0
|
|
43
|
+
cache-write 0
|
|
44
|
+
}
|
|
45
|
+
service-tier-cost {
|
|
46
|
+
flex 0.5
|
|
47
|
+
priority 2.5
|
|
48
|
+
}
|
|
49
|
+
}
|
|
32
50
|
class "openai" {
|
|
33
51
|
revision ">=5.3 <5.7" {
|
|
34
52
|
thinking-mode "effort"
|
|
@@ -118,4 +136,13 @@ provider "openai-codex" {
|
|
|
118
136
|
models "gpt-5.6-luna" "gpt-5.6-sol" "gpt-5.6-terra" {
|
|
119
137
|
context-window-floor 1000000
|
|
120
138
|
}
|
|
139
|
+
// Residue: the Codex registry advertises Astra's 272000 default prompt
|
|
140
|
+
// window with max_context_window=872000 (client 0.153.1, 2026-09-04).
|
|
141
|
+
// Older bundled and cached catalogs omit the maximum; live discovery
|
|
142
|
+
// takes precedence. The fallback stays at the deployment-advertised
|
|
143
|
+
// maximum so offline extended context never advertises a window the
|
|
144
|
+
// deployment rejects.
|
|
145
|
+
models "gpt-6-astra" "gpt-6-astra-wm" {
|
|
146
|
+
max-context-window 872000
|
|
147
|
+
}
|
|
121
148
|
}
|
|
@@ -127,6 +127,7 @@ behavior {
|
|
|
127
127
|
// Meta's /v1/models lists image generation and transcription SKUs beside
|
|
128
128
|
// the Muse Spark chat models.
|
|
129
129
|
exclude-models provider="meta" prefix="muse-image-" prefix="muse-voice-"
|
|
130
|
+
exclude-models provider="muse-code" prefix="muse-image-" prefix="muse-voice-"
|
|
130
131
|
// NanoGPT's roster interleaves non-text SKUs by name token.
|
|
131
132
|
exclude-models provider="nanogpt" substring="embedding" substring="image" substring="vision" \
|
|
132
133
|
substring="audio" substring="speech" substring="transcribe" substring="moderation" \
|
|
@@ -154,7 +155,7 @@ behavior {
|
|
|
154
155
|
api-routes provider="github-copilot" default="openai-completions" {
|
|
155
156
|
route "anthropic-messages" glob="claude-haiku-*" glob="claude-sonnet-*" glob="claude-opus-*" \
|
|
156
157
|
glob="claude-fable-*" glob="claude-mythos-*"
|
|
157
|
-
route "openai-responses" exact="grok-4.5" exact="grok-4.6" prefix="gpt-5" prefix="oswe" prefix="mai-"
|
|
158
|
+
route "openai-responses" exact="grok-4.5" exact="grok-4.6" prefix="gpt-5" prefix="gpt-6" prefix="oswe" prefix="mai-"
|
|
158
159
|
}
|
|
159
160
|
// ZenMux fronts Anthropic ids on a dedicated Messages endpoint; every
|
|
160
161
|
// other namespace stays on chat completions.
|