@dreb/ai 2.64.4 → 2.64.5

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/README.md CHANGED
@@ -444,7 +444,7 @@ const response = await completeSimple(model, {
444
444
  messages: [{ role: 'user', content: 'Solve: 2x + 5 = 13' }]
445
445
  }, {
446
446
  reasoning: 'medium' // 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max'
447
- // Native normalized 'max' is model-aware (currently GPT-5.6). Claude's established xhigh mapping still emits provider-native 'max'.
447
+ // Native normalized 'max' is model-aware (currently GPT-5.6 and GPT-6 families). Claude's established xhigh mapping still emits provider-native 'max'.
448
448
  });
449
449
 
450
450
  // Access thinking and text blocks
@@ -571,6 +571,10 @@ if (message.stopReason === 'error' || message.stopReason === 'aborted') {
571
571
  }
572
572
  ```
573
573
 
574
+ ### Context Overflow
575
+
576
+ Use `isContextOverflow(message, model.contextWindow)` to detect recognized provider context-limit errors or successful responses whose full input usage exceeds the configured window. The latter compares `usage.input + usage.cacheRead + usage.cacheWrite`; output tokens do not count toward that input-only check. A conservative registry window can be lower than the server's hard limit (for example, Copilot Opus 4.8 can accept requests above its configured 200K window). Detection does not raise the registry limit or modify the response.
577
+
574
578
  ### Aborting Requests
575
579
 
576
580
  The abort signal allows you to cancel in-progress requests. Aborted requests have `stopReason === 'aborted'`:
@@ -1014,7 +1018,7 @@ const key = getEnvApiKey('openai'); // checks OPENAI_API_KEY
1014
1018
 
1015
1019
  Several providers require OAuth authentication instead of static API keys:
1016
1020
 
1017
- - **OpenAI Codex** (ChatGPT Plus/Pro subscription, access to GPT-5.x Codex models)
1021
+ - **OpenAI Codex** (ChatGPT Plus/Pro subscription, access to GPT-5.x and GPT-6 Codex models)
1018
1022
  - **GitHub Copilot** (Copilot subscription)
1019
1023
  - **Google Gemini CLI** (Gemini 2.0/2.5 via Google Cloud Code Assist; free tier or paid subscription)
1020
1024
  - **Antigravity** (Free Gemini 3, Claude, GPT-OSS via Google Cloud)
@@ -1146,7 +1150,7 @@ const response = await complete(model, {
1146
1150
 
1147
1151
  ### Provider Notes
1148
1152
 
1149
- **OpenAI Codex**: Requires a ChatGPT Plus or Pro subscription. Provides access to GPT-5.x Codex models with extended context windows and reasoning capabilities. The library automatically handles session-based prompt caching when `sessionId` is provided in stream options. You can set `transport` in stream options to `"sse"`, `"websocket"`, or `"auto"` for Codex Responses transport selection. When using WebSocket with a `sessionId`, connections are reused per session and expire after 5 minutes of inactivity.
1153
+ **OpenAI Codex**: Requires a ChatGPT Plus or Pro subscription. Provides access to GPT-5.x and GPT-6 Codex models with extended context windows and reasoning capabilities. The library automatically handles session-based prompt caching when `sessionId` is provided in stream options. You can set `transport` in stream options to `"sse"`, `"websocket"`, or `"auto"` for Codex Responses transport selection. When using WebSocket with a `sessionId`, connections are reused per session and expire after 5 minutes of inactivity.
1150
1154
 
1151
1155
  **Azure OpenAI (Responses)**: Uses the Responses API only. Set `AZURE_OPENAI_API_KEY` and either `AZURE_OPENAI_BASE_URL` or `AZURE_OPENAI_RESOURCE_NAME`. Use `AZURE_OPENAI_API_VERSION` (defaults to `v1`) to override the API version if needed. Deployment names are treated as model IDs by default, override with `azureDeploymentName` or `AZURE_OPENAI_DEPLOYMENT_NAME_MAP` using comma-separated `model-id=deployment` pairs (for example `gpt-4o-mini=my-deployment,gpt-4o=prod`). Legacy deployment-based URLs are intentionally unsupported.
1152
1156
 
package/dist/models.d.ts CHANGED
@@ -51,6 +51,7 @@ export declare function isQwen38OrLater(modelId: string): boolean;
51
51
  *
52
52
  * Supported today:
53
53
  * - GPT-5.6 model families (Sol, Terra, Luna, and the alias)
54
+ * - GPT-6 model families (Astra and future variants)
54
55
  */
55
56
  export declare function supportsMax<TApi extends Api>(model: Model<TApi>): boolean;
56
57
  /**
@@ -58,6 +59,7 @@ export declare function supportsMax<TApi extends Api>(model: Model<TApi>): boole
58
59
  *
59
60
  * Supported today:
60
61
  * - GPT-5.2 through GPT-5.6 model families
62
+ * - GPT-6 model families (Astra and future variants)
61
63
  * - Claude Opus 4.6–4.x and Claude 5 model families
62
64
  * - Kimi Code K3 (xhigh maps to its advertised "max" effort)
63
65
  * - Qwen 3.8+ model families (xhigh is their top native effort tier)
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAanE,KAAK,QAAQ,CACZ,SAAS,SAAS,aAAa,EAC/B,QAAQ,SAAS,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,IAC9C,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS;IAAE,GAAG,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,CAAC,IAAI,SAAS,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AAEjH,wBAAgB,QAAQ,CAAC,SAAS,SAAS,aAAa,EAAE,QAAQ,SAAS,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,EAC1G,QAAQ,EAAE,SAAS,EACnB,OAAO,EAAE,QAAQ,GACf,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAGtC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAGhD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CA8BnF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CA4B7F;AAED,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAE9C;AAED,wBAAgB,SAAS,CAAC,SAAS,SAAS,aAAa,EACxD,QAAQ,EAAE,SAAS,GACjB,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAGhE;AAED,wBAAgB,aAAa,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAO/F;AAoCD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIxD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAGzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAmB3E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAGtF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,SAAS,GAAG,EAC9C,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,EACjC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,GAC/B,OAAO,CAGT","sourcesContent":["import { MODELS } from \"./models.generated.js\";\nimport type { Api, KnownProvider, Model, Usage } from \"./types.js\";\n\nconst modelRegistry: Map<string, Map<string, Model<Api>>> = new Map();\n\n// Initialize registry from MODELS on module load\nfor (const [provider, models] of Object.entries(MODELS)) {\n\tconst providerModels = new Map<string, Model<Api>>();\n\tfor (const [id, model] of Object.entries(models)) {\n\t\tproviderModels.set(id, model as Model<Api>);\n\t}\n\tmodelRegistry.set(provider, providerModels);\n}\n\ntype ModelApi<\n\tTProvider extends KnownProvider,\n\tTModelId extends keyof (typeof MODELS)[TProvider],\n> = (typeof MODELS)[TProvider][TModelId] extends { api: infer TApi } ? (TApi extends Api ? TApi : never) : never;\n\nexport function getModel<TProvider extends KnownProvider, TModelId extends keyof (typeof MODELS)[TProvider]>(\n\tprovider: TProvider,\n\tmodelId: TModelId,\n): Model<ModelApi<TProvider, TModelId>> {\n\tconst providerModels = modelRegistry.get(provider);\n\treturn providerModels?.get(modelId as string) as Model<ModelApi<TProvider, TModelId>>;\n}\n\n/**\n * Check if a model ID looks like an alias (no date suffix).\n * Aliases are preferred over dated versions when fuzzy matching.\n *\n * IDs ending with `-latest` are treated as aliases.\n * IDs ending with a date pattern (`-YYYYMMDD`) are treated as dated versions.\n */\nexport function isModelAlias(id: string): boolean {\n\tif (id.endsWith(\"-latest\")) return true;\n\treturn !/-\\d{8}$/.test(id);\n}\n\n/**\n * Find a model by fuzzy matching against the provider's registered models.\n *\n * Resolution order:\n * 1. Exact match by provider + model ID (via registry Map.get)\n * 2. Case-insensitive substring match against model ID and display name\n * 3. Among matches, prefer aliases (non-dated IDs) over dated versions\n * 4. Among ties, pick the lexicographically highest (latest) ID\n *\n * This is the same matching logic used by the CLI, subagent model resolution,\n * and interactive mode — centralised here so tests can exercise the real path.\n *\n * @example\n * findModel(\"anthropic\", \"sonnet\") // → latest claude-sonnet alias\n * findModel(\"anthropic\", \"haiku\") // → latest claude-haiku alias\n * findModel(\"openai\", \"gpt-5\") // → latest gpt-5 alias\n */\nexport function findModel(provider: string, pattern: string): Model<Api> | undefined {\n\tconst providerModels = modelRegistry.get(provider);\n\tif (!providerModels) return undefined;\n\n\t// Try exact match first\n\tconst exact = providerModels.get(pattern);\n\tif (exact) return exact;\n\n\t// Substring match (case-insensitive)\n\tconst normalizedPattern = pattern.toLowerCase();\n\tconst matches = Array.from(providerModels.values()).filter(\n\t\t(m) => m.id.toLowerCase().includes(normalizedPattern) || m.name?.toLowerCase().includes(normalizedPattern),\n\t);\n\n\tif (matches.length === 0) return undefined;\n\tif (matches.length === 1) return matches[0];\n\n\t// Multiple matches — separate into aliases and dated versions\n\tconst aliases = matches.filter((m) => isModelAlias(m.id));\n\tconst datedVersions = matches.filter((m) => !isModelAlias(m.id));\n\n\tif (aliases.length > 0) {\n\t\t// Prefer alias — if multiple, pick the lexicographically highest\n\t\taliases.sort((a, b) => b.id.localeCompare(a.id));\n\t\treturn aliases[0];\n\t}\n\n\t// All dated — prefer the latest\n\tdatedVersions.sort((a, b) => b.id.localeCompare(a.id));\n\treturn datedVersions[0];\n}\n\n/**\n * Find a model by fuzzy matching against a flat array of models.\n * Same algorithm as findModel() but operates on an arbitrary model list\n * instead of the built-in registry.\n *\n * Used by model-resolver.ts and other code that manages its own model lists.\n */\nexport function findModelInList(pattern: string, models: Model<Api>[]): Model<Api> | undefined {\n\tif (models.length === 0) return undefined;\n\n\tconst normalizedPattern = pattern.toLowerCase();\n\n\t// Exact ID match (case-insensitive)\n\tconst exactById = models.find((m) => m.id.toLowerCase() === normalizedPattern);\n\tif (exactById) return exactById;\n\n\t// Substring match (case-insensitive)\n\tconst matches = models.filter(\n\t\t(m) => m.id.toLowerCase().includes(normalizedPattern) || m.name?.toLowerCase().includes(normalizedPattern),\n\t);\n\n\tif (matches.length === 0) return undefined;\n\tif (matches.length === 1) return matches[0];\n\n\t// Multiple matches — separate into aliases and dated versions\n\tconst aliases = matches.filter((m) => isModelAlias(m.id));\n\tconst datedVersions = matches.filter((m) => !isModelAlias(m.id));\n\n\tif (aliases.length > 0) {\n\t\taliases.sort((a, b) => b.id.localeCompare(a.id));\n\t\treturn aliases[0];\n\t}\n\n\tdatedVersions.sort((a, b) => b.id.localeCompare(a.id));\n\treturn datedVersions[0];\n}\n\nexport function getProviders(): KnownProvider[] {\n\treturn Array.from(modelRegistry.keys()) as KnownProvider[];\n}\n\nexport function getModels<TProvider extends KnownProvider>(\n\tprovider: TProvider,\n): Model<ModelApi<TProvider, keyof (typeof MODELS)[TProvider]>>[] {\n\tconst models = modelRegistry.get(provider);\n\treturn models ? (Array.from(models.values()) as Model<ModelApi<TProvider, keyof (typeof MODELS)[TProvider]>>[]) : [];\n}\n\nexport function calculateCost<TApi extends Api>(model: Model<TApi>, usage: Usage): Usage[\"cost\"] {\n\tusage.cost.input = (model.cost.input / 1000000) * usage.input;\n\tusage.cost.output = (model.cost.output / 1000000) * usage.output;\n\tusage.cost.cacheRead = (model.cost.cacheRead / 1000000) * usage.cacheRead;\n\tusage.cost.cacheWrite = (model.cost.cacheWrite / 1000000) * usage.cacheWrite;\n\tusage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;\n\treturn usage.cost;\n}\n\ninterface ClaudeFamilyVersion {\n\tfamily: \"opus\" | \"sonnet\";\n\tmajor: number;\n\tminor?: number;\n}\n\n/** Parse Claude family versions without mistaking long date suffixes for versions. */\nfunction claudeFamilyVersion(modelId: string): ClaudeFamilyVersion | undefined {\n\tconst match = modelId.match(/(opus|sonnet)-(\\d{1,2})(?:[.-](\\d{1,2}))?(?!\\d)/);\n\tif (!match) return undefined;\n\treturn {\n\t\tfamily: match[1] as ClaudeFamilyVersion[\"family\"],\n\t\tmajor: Number.parseInt(match[2], 10),\n\t\tminor: match[3] === undefined ? undefined : Number.parseInt(match[3], 10),\n\t};\n}\n\n/**\n * Parse Qwen family versions without mistaking parameter counts for minor versions.\n * Only a dot separates major from minor (qwen3.8-27b, Qwen-3.8); a hyphen after the\n * major version introduces the parameter size (qwen3-32b → 3.0, not 3.32). A capture\n * directly followed by a `b`-suffixed size token is a parameter count, not a version\n * (qwen-32b, Qwen-7B-Chat, deepseek-r1-distill-qwen-32b), and Qwen majors never reach\n * two digits, so only a single digit is accepted.\n */\nfunction qwenFamilyVersion(modelId: string): { major: number; minor: number } | undefined {\n\tconst match = modelId.match(/\\bqwen[\\s_-]*v?(\\d)(?:\\.(\\d+))?(?![\\d.]*b\\b)/i);\n\tif (!match) return undefined;\n\treturn {\n\t\tmajor: Number.parseInt(match[1], 10),\n\t\tminor: match[2] === undefined ? 0 : Number.parseInt(match[2], 10),\n\t};\n}\n\n/**\n * Check whether a model id belongs to Qwen 3.8 or a later Qwen generation — the first\n * Qwen family with graded `reasoning_effort` tiers (low/medium/xhigh, default xhigh).\n */\nexport function isQwen38OrLater(modelId: string): boolean {\n\tconst qwen = qwenFamilyVersion(modelId);\n\tif (!qwen) return false;\n\treturn qwen.major > 3 || (qwen.major === 3 && qwen.minor >= 8);\n}\n\n/**\n * Check if a model supports the native `max` reasoning tier.\n *\n * Supported today:\n * - GPT-5.6 model families (Sol, Terra, Luna, and the alias)\n */\nexport function supportsMax<TApi extends Api>(model: Model<TApi>): boolean {\n\tif (/(?:^|\\/)gpt-5\\.6(?:$|[-.])/.test(model.id.toLowerCase())) return true;\n\treturn false;\n}\n\n/**\n * Check if a model supports xhigh thinking level.\n *\n * Supported today:\n * - GPT-5.2 through GPT-5.6 model families\n * - Claude Opus 4.6–4.x and Claude 5 model families\n * - Kimi Code K3 (xhigh maps to its advertised \"max\" effort)\n * - Qwen 3.8+ model families (xhigh is their top native effort tier)\n */\nexport function supportsXhigh<TApi extends Api>(model: Model<TApi>): boolean {\n\tif (model.provider === \"kimi-coding-oauth\" && model.id === \"k3\") return true;\n\tif (isQwen38OrLater(model.id)) return true;\n\tif (\n\t\tmodel.id.includes(\"gpt-5.2\") ||\n\t\tmodel.id.includes(\"gpt-5.3\") ||\n\t\tmodel.id.includes(\"gpt-5.4\") ||\n\t\tmodel.id.includes(\"gpt-5.5\") ||\n\t\tmodel.id.includes(\"gpt-5.6\")\n\t) {\n\t\treturn true;\n\t}\n\n\tconst claude = claudeFamilyVersion(model.id);\n\tif (!claude) return false;\n\tif (claude.family === \"opus\") {\n\t\treturn claude.major >= 5 || (claude.major === 4 && (claude.minor ?? 0) >= 6);\n\t}\n\treturn claude.major >= 5;\n}\n\n/**\n * Check if a model uses adaptive thinking (Opus/Sonnet 4.6–4.x and Claude 5\n * families), where the `thinkingDisplay` option is honored. Mirrors the\n * per-provider internal checks.\n */\nexport function supportsAdaptiveThinking<TApi extends Api>(model: Model<TApi>): boolean {\n\tconst claude = claudeFamilyVersion(model.id);\n\treturn claude != null && (claude.major >= 5 || (claude.major === 4 && (claude.minor ?? 0) >= 6));\n}\n\n/**\n * Check if two models are equal by comparing both their id and provider.\n * Returns false if either model is null or undefined.\n */\nexport function modelsAreEqual<TApi extends Api>(\n\ta: Model<TApi> | null | undefined,\n\tb: Model<TApi> | null | undefined,\n): boolean {\n\tif (!a || !b) return false;\n\treturn a.id === b.id && a.provider === b.provider;\n}\n"]}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAanE,KAAK,QAAQ,CACZ,SAAS,SAAS,aAAa,EAC/B,QAAQ,SAAS,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,IAC9C,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS;IAAE,GAAG,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,CAAC,IAAI,SAAS,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AAEjH,wBAAgB,QAAQ,CAAC,SAAS,SAAS,aAAa,EAAE,QAAQ,SAAS,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,EAC1G,QAAQ,EAAE,SAAS,EACnB,OAAO,EAAE,QAAQ,GACf,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAGtC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAGhD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CA8BnF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CA4B7F;AAED,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAE9C;AAED,wBAAgB,SAAS,CAAC,SAAS,SAAS,aAAa,EACxD,QAAQ,EAAE,SAAS,GACjB,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAGhE;AAED,wBAAgB,aAAa,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAO/F;AAoCD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIxD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAKzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAoB3E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAGtF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,SAAS,GAAG,EAC9C,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,EACjC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,GAC/B,OAAO,CAGT","sourcesContent":["import { MODELS } from \"./models.generated.js\";\nimport type { Api, KnownProvider, Model, Usage } from \"./types.js\";\n\nconst modelRegistry: Map<string, Map<string, Model<Api>>> = new Map();\n\n// Initialize registry from MODELS on module load\nfor (const [provider, models] of Object.entries(MODELS)) {\n\tconst providerModels = new Map<string, Model<Api>>();\n\tfor (const [id, model] of Object.entries(models)) {\n\t\tproviderModels.set(id, model as Model<Api>);\n\t}\n\tmodelRegistry.set(provider, providerModels);\n}\n\ntype ModelApi<\n\tTProvider extends KnownProvider,\n\tTModelId extends keyof (typeof MODELS)[TProvider],\n> = (typeof MODELS)[TProvider][TModelId] extends { api: infer TApi } ? (TApi extends Api ? TApi : never) : never;\n\nexport function getModel<TProvider extends KnownProvider, TModelId extends keyof (typeof MODELS)[TProvider]>(\n\tprovider: TProvider,\n\tmodelId: TModelId,\n): Model<ModelApi<TProvider, TModelId>> {\n\tconst providerModels = modelRegistry.get(provider);\n\treturn providerModels?.get(modelId as string) as Model<ModelApi<TProvider, TModelId>>;\n}\n\n/**\n * Check if a model ID looks like an alias (no date suffix).\n * Aliases are preferred over dated versions when fuzzy matching.\n *\n * IDs ending with `-latest` are treated as aliases.\n * IDs ending with a date pattern (`-YYYYMMDD`) are treated as dated versions.\n */\nexport function isModelAlias(id: string): boolean {\n\tif (id.endsWith(\"-latest\")) return true;\n\treturn !/-\\d{8}$/.test(id);\n}\n\n/**\n * Find a model by fuzzy matching against the provider's registered models.\n *\n * Resolution order:\n * 1. Exact match by provider + model ID (via registry Map.get)\n * 2. Case-insensitive substring match against model ID and display name\n * 3. Among matches, prefer aliases (non-dated IDs) over dated versions\n * 4. Among ties, pick the lexicographically highest (latest) ID\n *\n * This is the same matching logic used by the CLI, subagent model resolution,\n * and interactive mode — centralised here so tests can exercise the real path.\n *\n * @example\n * findModel(\"anthropic\", \"sonnet\") // → latest claude-sonnet alias\n * findModel(\"anthropic\", \"haiku\") // → latest claude-haiku alias\n * findModel(\"openai\", \"gpt-5\") // → latest gpt-5 alias\n */\nexport function findModel(provider: string, pattern: string): Model<Api> | undefined {\n\tconst providerModels = modelRegistry.get(provider);\n\tif (!providerModels) return undefined;\n\n\t// Try exact match first\n\tconst exact = providerModels.get(pattern);\n\tif (exact) return exact;\n\n\t// Substring match (case-insensitive)\n\tconst normalizedPattern = pattern.toLowerCase();\n\tconst matches = Array.from(providerModels.values()).filter(\n\t\t(m) => m.id.toLowerCase().includes(normalizedPattern) || m.name?.toLowerCase().includes(normalizedPattern),\n\t);\n\n\tif (matches.length === 0) return undefined;\n\tif (matches.length === 1) return matches[0];\n\n\t// Multiple matches — separate into aliases and dated versions\n\tconst aliases = matches.filter((m) => isModelAlias(m.id));\n\tconst datedVersions = matches.filter((m) => !isModelAlias(m.id));\n\n\tif (aliases.length > 0) {\n\t\t// Prefer alias — if multiple, pick the lexicographically highest\n\t\taliases.sort((a, b) => b.id.localeCompare(a.id));\n\t\treturn aliases[0];\n\t}\n\n\t// All dated — prefer the latest\n\tdatedVersions.sort((a, b) => b.id.localeCompare(a.id));\n\treturn datedVersions[0];\n}\n\n/**\n * Find a model by fuzzy matching against a flat array of models.\n * Same algorithm as findModel() but operates on an arbitrary model list\n * instead of the built-in registry.\n *\n * Used by model-resolver.ts and other code that manages its own model lists.\n */\nexport function findModelInList(pattern: string, models: Model<Api>[]): Model<Api> | undefined {\n\tif (models.length === 0) return undefined;\n\n\tconst normalizedPattern = pattern.toLowerCase();\n\n\t// Exact ID match (case-insensitive)\n\tconst exactById = models.find((m) => m.id.toLowerCase() === normalizedPattern);\n\tif (exactById) return exactById;\n\n\t// Substring match (case-insensitive)\n\tconst matches = models.filter(\n\t\t(m) => m.id.toLowerCase().includes(normalizedPattern) || m.name?.toLowerCase().includes(normalizedPattern),\n\t);\n\n\tif (matches.length === 0) return undefined;\n\tif (matches.length === 1) return matches[0];\n\n\t// Multiple matches — separate into aliases and dated versions\n\tconst aliases = matches.filter((m) => isModelAlias(m.id));\n\tconst datedVersions = matches.filter((m) => !isModelAlias(m.id));\n\n\tif (aliases.length > 0) {\n\t\taliases.sort((a, b) => b.id.localeCompare(a.id));\n\t\treturn aliases[0];\n\t}\n\n\tdatedVersions.sort((a, b) => b.id.localeCompare(a.id));\n\treturn datedVersions[0];\n}\n\nexport function getProviders(): KnownProvider[] {\n\treturn Array.from(modelRegistry.keys()) as KnownProvider[];\n}\n\nexport function getModels<TProvider extends KnownProvider>(\n\tprovider: TProvider,\n): Model<ModelApi<TProvider, keyof (typeof MODELS)[TProvider]>>[] {\n\tconst models = modelRegistry.get(provider);\n\treturn models ? (Array.from(models.values()) as Model<ModelApi<TProvider, keyof (typeof MODELS)[TProvider]>>[]) : [];\n}\n\nexport function calculateCost<TApi extends Api>(model: Model<TApi>, usage: Usage): Usage[\"cost\"] {\n\tusage.cost.input = (model.cost.input / 1000000) * usage.input;\n\tusage.cost.output = (model.cost.output / 1000000) * usage.output;\n\tusage.cost.cacheRead = (model.cost.cacheRead / 1000000) * usage.cacheRead;\n\tusage.cost.cacheWrite = (model.cost.cacheWrite / 1000000) * usage.cacheWrite;\n\tusage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;\n\treturn usage.cost;\n}\n\ninterface ClaudeFamilyVersion {\n\tfamily: \"opus\" | \"sonnet\";\n\tmajor: number;\n\tminor?: number;\n}\n\n/** Parse Claude family versions without mistaking long date suffixes for versions. */\nfunction claudeFamilyVersion(modelId: string): ClaudeFamilyVersion | undefined {\n\tconst match = modelId.match(/(opus|sonnet)-(\\d{1,2})(?:[.-](\\d{1,2}))?(?!\\d)/);\n\tif (!match) return undefined;\n\treturn {\n\t\tfamily: match[1] as ClaudeFamilyVersion[\"family\"],\n\t\tmajor: Number.parseInt(match[2], 10),\n\t\tminor: match[3] === undefined ? undefined : Number.parseInt(match[3], 10),\n\t};\n}\n\n/**\n * Parse Qwen family versions without mistaking parameter counts for minor versions.\n * Only a dot separates major from minor (qwen3.8-27b, Qwen-3.8); a hyphen after the\n * major version introduces the parameter size (qwen3-32b → 3.0, not 3.32). A capture\n * directly followed by a `b`-suffixed size token is a parameter count, not a version\n * (qwen-32b, Qwen-7B-Chat, deepseek-r1-distill-qwen-32b), and Qwen majors never reach\n * two digits, so only a single digit is accepted.\n */\nfunction qwenFamilyVersion(modelId: string): { major: number; minor: number } | undefined {\n\tconst match = modelId.match(/\\bqwen[\\s_-]*v?(\\d)(?:\\.(\\d+))?(?![\\d.]*b\\b)/i);\n\tif (!match) return undefined;\n\treturn {\n\t\tmajor: Number.parseInt(match[1], 10),\n\t\tminor: match[2] === undefined ? 0 : Number.parseInt(match[2], 10),\n\t};\n}\n\n/**\n * Check whether a model id belongs to Qwen 3.8 or a later Qwen generation — the first\n * Qwen family with graded `reasoning_effort` tiers (low/medium/xhigh, default xhigh).\n */\nexport function isQwen38OrLater(modelId: string): boolean {\n\tconst qwen = qwenFamilyVersion(modelId);\n\tif (!qwen) return false;\n\treturn qwen.major > 3 || (qwen.major === 3 && qwen.minor >= 8);\n}\n\n/**\n * Check if a model supports the native `max` reasoning tier.\n *\n * Supported today:\n * - GPT-5.6 model families (Sol, Terra, Luna, and the alias)\n * - GPT-6 model families (Astra and future variants)\n */\nexport function supportsMax<TApi extends Api>(model: Model<TApi>): boolean {\n\tconst id = model.id.toLowerCase();\n\t// Anchored to the id start or a gateway \"/\" prefix so unrelated ids\n\t// (e.g. \"gpt-60\") do not match.\n\treturn /(?:^|\\/)gpt-5\\.6(?:$|[-.])/.test(id) || /(?:^|\\/)gpt-6(?:$|[-.])/.test(id);\n}\n\n/**\n * Check if a model supports xhigh thinking level.\n *\n * Supported today:\n * - GPT-5.2 through GPT-5.6 model families\n * - GPT-6 model families (Astra and future variants)\n * - Claude Opus 4.6–4.x and Claude 5 model families\n * - Kimi Code K3 (xhigh maps to its advertised \"max\" effort)\n * - Qwen 3.8+ model families (xhigh is their top native effort tier)\n */\nexport function supportsXhigh<TApi extends Api>(model: Model<TApi>): boolean {\n\tif (model.provider === \"kimi-coding-oauth\" && model.id === \"k3\") return true;\n\tif (isQwen38OrLater(model.id)) return true;\n\tif (\n\t\tmodel.id.includes(\"gpt-5.2\") ||\n\t\tmodel.id.includes(\"gpt-5.3\") ||\n\t\tmodel.id.includes(\"gpt-5.4\") ||\n\t\tmodel.id.includes(\"gpt-5.5\") ||\n\t\tmodel.id.includes(\"gpt-5.6\") ||\n\t\tmodel.id.includes(\"gpt-6\")\n\t) {\n\t\treturn true;\n\t}\n\n\tconst claude = claudeFamilyVersion(model.id);\n\tif (!claude) return false;\n\tif (claude.family === \"opus\") {\n\t\treturn claude.major >= 5 || (claude.major === 4 && (claude.minor ?? 0) >= 6);\n\t}\n\treturn claude.major >= 5;\n}\n\n/**\n * Check if a model uses adaptive thinking (Opus/Sonnet 4.6–4.x and Claude 5\n * families), where the `thinkingDisplay` option is honored. Mirrors the\n * per-provider internal checks.\n */\nexport function supportsAdaptiveThinking<TApi extends Api>(model: Model<TApi>): boolean {\n\tconst claude = claudeFamilyVersion(model.id);\n\treturn claude != null && (claude.major >= 5 || (claude.major === 4 && (claude.minor ?? 0) >= 6));\n}\n\n/**\n * Check if two models are equal by comparing both their id and provider.\n * Returns false if either model is null or undefined.\n */\nexport function modelsAreEqual<TApi extends Api>(\n\ta: Model<TApi> | null | undefined,\n\tb: Model<TApi> | null | undefined,\n): boolean {\n\tif (!a || !b) return false;\n\treturn a.id === b.id && a.provider === b.provider;\n}\n"]}
@@ -850,6 +850,23 @@ export declare const MODELS: {
850
850
  contextWindow: number;
851
851
  maxTokens: number;
852
852
  };
853
+ readonly "global.xai.grok-4.6": {
854
+ id: string;
855
+ name: string;
856
+ api: "bedrock-converse-stream";
857
+ provider: string;
858
+ baseUrl: string;
859
+ reasoning: true;
860
+ input: ("image" | "text")[];
861
+ cost: {
862
+ input: number;
863
+ output: number;
864
+ cacheRead: number;
865
+ cacheWrite: number;
866
+ };
867
+ contextWindow: number;
868
+ maxTokens: number;
869
+ };
853
870
  readonly "google.gemma-3-27b-it": {
854
871
  id: string;
855
872
  name: string;
@@ -1955,6 +1972,23 @@ export declare const MODELS: {
1955
1972
  contextWindow: number;
1956
1973
  maxTokens: number;
1957
1974
  };
1975
+ readonly "us.xai.grok-4.6": {
1976
+ id: string;
1977
+ name: string;
1978
+ api: "bedrock-converse-stream";
1979
+ provider: string;
1980
+ baseUrl: string;
1981
+ reasoning: true;
1982
+ input: ("image" | "text")[];
1983
+ cost: {
1984
+ input: number;
1985
+ output: number;
1986
+ cacheRead: number;
1987
+ cacheWrite: number;
1988
+ };
1989
+ contextWindow: number;
1990
+ maxTokens: number;
1991
+ };
1958
1992
  readonly "writer.palmyra-x4-v1:0": {
1959
1993
  id: string;
1960
1994
  name: string;
@@ -3032,14 +3066,14 @@ export declare const MODELS: {
3032
3066
  };
3033
3067
  };
3034
3068
  readonly cerebras: {
3035
- readonly "gemma-4-31b": {
3069
+ readonly "gpt-oss-120b": {
3036
3070
  id: string;
3037
3071
  name: string;
3038
3072
  api: "openai-completions";
3039
3073
  provider: string;
3040
3074
  baseUrl: string;
3041
3075
  reasoning: true;
3042
- input: ("image" | "text")[];
3076
+ input: "text"[];
3043
3077
  cost: {
3044
3078
  input: number;
3045
3079
  output: number;
@@ -3049,14 +3083,14 @@ export declare const MODELS: {
3049
3083
  contextWindow: number;
3050
3084
  maxTokens: number;
3051
3085
  };
3052
- readonly "gpt-oss-120b": {
3086
+ readonly "qwen-3.8-27b": {
3053
3087
  id: string;
3054
3088
  name: string;
3055
3089
  api: "openai-completions";
3056
3090
  provider: string;
3057
3091
  baseUrl: string;
3058
3092
  reasoning: true;
3059
- input: "text"[];
3093
+ input: ("image" | "text")[];
3060
3094
  cost: {
3061
3095
  input: number;
3062
3096
  output: number;
@@ -3594,7 +3628,7 @@ export declare const MODELS: {
3594
3628
  readonly "gpt-6-astra": {
3595
3629
  id: string;
3596
3630
  name: string;
3597
- api: "openai-completions";
3631
+ api: "openai-responses";
3598
3632
  provider: string;
3599
3633
  baseUrl: string;
3600
3634
  headers: {
@@ -3603,11 +3637,6 @@ export declare const MODELS: {
3603
3637
  "Editor-Plugin-Version": string;
3604
3638
  "Copilot-Integration-Id": string;
3605
3639
  };
3606
- compat: {
3607
- supportsStore: false;
3608
- supportsDeveloperRole: false;
3609
- supportsReasoningEffort: false;
3610
- };
3611
3640
  reasoning: true;
3612
3641
  input: ("image" | "text")[];
3613
3642
  cost: {
@@ -7680,92 +7709,7 @@ export declare const MODELS: {
7680
7709
  };
7681
7710
  };
7682
7711
  readonly "openai-codex": {
7683
- readonly "gpt-5.1": {
7684
- id: string;
7685
- name: string;
7686
- api: "openai-codex-responses";
7687
- provider: string;
7688
- baseUrl: string;
7689
- reasoning: true;
7690
- input: ("image" | "text")[];
7691
- cost: {
7692
- input: number;
7693
- output: number;
7694
- cacheRead: number;
7695
- cacheWrite: number;
7696
- };
7697
- contextWindow: number;
7698
- maxTokens: number;
7699
- };
7700
- readonly "gpt-5.1-codex-max": {
7701
- id: string;
7702
- name: string;
7703
- api: "openai-codex-responses";
7704
- provider: string;
7705
- baseUrl: string;
7706
- reasoning: true;
7707
- input: ("image" | "text")[];
7708
- cost: {
7709
- input: number;
7710
- output: number;
7711
- cacheRead: number;
7712
- cacheWrite: number;
7713
- };
7714
- contextWindow: number;
7715
- maxTokens: number;
7716
- };
7717
- readonly "gpt-5.1-codex-mini": {
7718
- id: string;
7719
- name: string;
7720
- api: "openai-codex-responses";
7721
- provider: string;
7722
- baseUrl: string;
7723
- reasoning: true;
7724
- input: ("image" | "text")[];
7725
- cost: {
7726
- input: number;
7727
- output: number;
7728
- cacheRead: number;
7729
- cacheWrite: number;
7730
- };
7731
- contextWindow: number;
7732
- maxTokens: number;
7733
- };
7734
- readonly "gpt-5.3-codex": {
7735
- id: string;
7736
- name: string;
7737
- api: "openai-codex-responses";
7738
- provider: string;
7739
- baseUrl: string;
7740
- reasoning: true;
7741
- input: ("image" | "text")[];
7742
- cost: {
7743
- input: number;
7744
- output: number;
7745
- cacheRead: number;
7746
- cacheWrite: number;
7747
- };
7748
- contextWindow: number;
7749
- maxTokens: number;
7750
- };
7751
- readonly "gpt-5.3-codex-spark": {
7752
- id: string;
7753
- name: string;
7754
- api: "openai-codex-responses";
7755
- provider: string;
7756
- baseUrl: string;
7757
- reasoning: true;
7758
- input: "text"[];
7759
- cost: {
7760
- input: number;
7761
- output: number;
7762
- cacheRead: number;
7763
- cacheWrite: number;
7764
- };
7765
- contextWindow: number;
7766
- maxTokens: number;
7767
- };
7768
- readonly "gpt-5.4": {
7712
+ readonly "gpt-5.4-mini": {
7769
7713
  id: string;
7770
7714
  name: string;
7771
7715
  api: "openai-codex-responses";
@@ -7782,7 +7726,7 @@ export declare const MODELS: {
7782
7726
  contextWindow: number;
7783
7727
  maxTokens: number;
7784
7728
  };
7785
- readonly "gpt-5.4-mini": {
7729
+ readonly "gpt-5.5": {
7786
7730
  id: string;
7787
7731
  name: string;
7788
7732
  api: "openai-codex-responses";
@@ -7799,7 +7743,7 @@ export declare const MODELS: {
7799
7743
  contextWindow: number;
7800
7744
  maxTokens: number;
7801
7745
  };
7802
- readonly "gpt-5.5": {
7746
+ readonly "gpt-5.6-luna": {
7803
7747
  id: string;
7804
7748
  name: string;
7805
7749
  api: "openai-codex-responses";
@@ -7816,7 +7760,7 @@ export declare const MODELS: {
7816
7760
  contextWindow: number;
7817
7761
  maxTokens: number;
7818
7762
  };
7819
- readonly "gpt-5.6-luna": {
7763
+ readonly "gpt-5.6-sol": {
7820
7764
  id: string;
7821
7765
  name: string;
7822
7766
  api: "openai-codex-responses";
@@ -7833,7 +7777,7 @@ export declare const MODELS: {
7833
7777
  contextWindow: number;
7834
7778
  maxTokens: number;
7835
7779
  };
7836
- readonly "gpt-5.6-sol": {
7780
+ readonly "gpt-5.6-terra": {
7837
7781
  id: string;
7838
7782
  name: string;
7839
7783
  api: "openai-codex-responses";
@@ -7850,7 +7794,7 @@ export declare const MODELS: {
7850
7794
  contextWindow: number;
7851
7795
  maxTokens: number;
7852
7796
  };
7853
- readonly "gpt-5.6-terra": {
7797
+ readonly "gpt-6-astra": {
7854
7798
  id: string;
7855
7799
  name: string;
7856
7800
  api: "openai-codex-responses";
@@ -11596,23 +11540,6 @@ export declare const MODELS: {
11596
11540
  contextWindow: number;
11597
11541
  maxTokens: number;
11598
11542
  };
11599
- readonly "minimax/minimax-m2.7:free": {
11600
- id: string;
11601
- name: string;
11602
- api: "openai-completions";
11603
- provider: string;
11604
- baseUrl: string;
11605
- reasoning: true;
11606
- input: "text"[];
11607
- cost: {
11608
- input: number;
11609
- output: number;
11610
- cacheRead: number;
11611
- cacheWrite: number;
11612
- };
11613
- contextWindow: number;
11614
- maxTokens: number;
11615
- };
11616
11543
  readonly "minimax/minimax-m3": {
11617
11544
  id: string;
11618
11545
  name: string;
@@ -11647,23 +11574,6 @@ export declare const MODELS: {
11647
11574
  contextWindow: number;
11648
11575
  maxTokens: number;
11649
11576
  };
11650
- readonly "minimax/minimax-m3:free": {
11651
- id: string;
11652
- name: string;
11653
- api: "openai-completions";
11654
- provider: string;
11655
- baseUrl: string;
11656
- reasoning: true;
11657
- input: ("image" | "text")[];
11658
- cost: {
11659
- input: number;
11660
- output: number;
11661
- cacheRead: number;
11662
- cacheWrite: number;
11663
- };
11664
- contextWindow: number;
11665
- maxTokens: number;
11666
- };
11667
11577
  readonly "mistralai/codestral-2508": {
11668
11578
  id: string;
11669
11579
  name: string;
@@ -12106,40 +12016,6 @@ export declare const MODELS: {
12106
12016
  contextWindow: number;
12107
12017
  maxTokens: number;
12108
12018
  };
12109
- readonly "nex-agi/nex-n2-mini": {
12110
- id: string;
12111
- name: string;
12112
- api: "openai-completions";
12113
- provider: string;
12114
- baseUrl: string;
12115
- reasoning: true;
12116
- input: ("image" | "text")[];
12117
- cost: {
12118
- input: number;
12119
- output: number;
12120
- cacheRead: number;
12121
- cacheWrite: number;
12122
- };
12123
- contextWindow: number;
12124
- maxTokens: number;
12125
- };
12126
- readonly "nex-agi/nex-n2-pro": {
12127
- id: string;
12128
- name: string;
12129
- api: "openai-completions";
12130
- provider: string;
12131
- baseUrl: string;
12132
- reasoning: true;
12133
- input: ("image" | "text")[];
12134
- cost: {
12135
- input: number;
12136
- output: number;
12137
- cacheRead: number;
12138
- cacheWrite: number;
12139
- };
12140
- contextWindow: number;
12141
- maxTokens: number;
12142
- };
12143
12019
  readonly "nvidia/nemotron-3-nano-30b-a3b": {
12144
12020
  id: string;
12145
12021
  name: string;
@@ -15387,23 +15263,6 @@ export declare const MODELS: {
15387
15263
  contextWindow: number;
15388
15264
  maxTokens: number;
15389
15265
  };
15390
- readonly "z-ai/glm-5.2:free": {
15391
- id: string;
15392
- name: string;
15393
- api: "openai-completions";
15394
- provider: string;
15395
- baseUrl: string;
15396
- reasoning: true;
15397
- input: "text"[];
15398
- cost: {
15399
- input: number;
15400
- output: number;
15401
- cacheRead: number;
15402
- cacheWrite: number;
15403
- };
15404
- contextWindow: number;
15405
- maxTokens: number;
15406
- };
15407
15266
  readonly "z-ai/glm-5.3": {
15408
15267
  id: string;
15409
15268
  name: string;
@@ -17514,23 +17373,6 @@ export declare const MODELS: {
17514
17373
  contextWindow: number;
17515
17374
  maxTokens: number;
17516
17375
  };
17517
- readonly "minimax/minimax-m2.7-free": {
17518
- id: string;
17519
- name: string;
17520
- api: "anthropic-messages";
17521
- provider: string;
17522
- baseUrl: string;
17523
- reasoning: true;
17524
- input: "text"[];
17525
- cost: {
17526
- input: number;
17527
- output: number;
17528
- cacheRead: number;
17529
- cacheWrite: number;
17530
- };
17531
- contextWindow: number;
17532
- maxTokens: number;
17533
- };
17534
17376
  readonly "minimax/minimax-m2.7-highspeed": {
17535
17377
  id: string;
17536
17378
  name: string;
@@ -17565,23 +17407,6 @@ export declare const MODELS: {
17565
17407
  contextWindow: number;
17566
17408
  maxTokens: number;
17567
17409
  };
17568
- readonly "minimax/minimax-m3-free": {
17569
- id: string;
17570
- name: string;
17571
- api: "anthropic-messages";
17572
- provider: string;
17573
- baseUrl: string;
17574
- reasoning: true;
17575
- input: ("image" | "text")[];
17576
- cost: {
17577
- input: number;
17578
- output: number;
17579
- cacheRead: number;
17580
- cacheWrite: number;
17581
- };
17582
- contextWindow: number;
17583
- maxTokens: number;
17584
- };
17585
17410
  readonly "mistral/codestral": {
17586
17411
  id: string;
17587
17412
  name: string;