@dreb/ai 2.6.2 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -443,7 +443,7 @@ if (model.reasoning) {
443
443
  const response = await completeSimple(model, {
444
444
  messages: [{ role: 'user', content: 'Solve: 2x + 5 = 13' }]
445
445
  }, {
446
- reasoning: 'medium' // 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' (xhigh maps to high on non-OpenAI providers)
446
+ reasoning: 'medium' // 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' (xhigh maps to 'max' on Opus 4.6+, 'high' on other Anthropic models)
447
447
  });
448
448
 
449
449
  // Access thinking and text blocks
package/dist/models.d.ts CHANGED
@@ -46,7 +46,7 @@ export declare function calculateCost<TApi extends Api>(model: Model<TApi>, usag
46
46
  *
47
47
  * Supported today:
48
48
  * - GPT-5.2 / GPT-5.3 / GPT-5.4 model families
49
- * - Opus 4.6 models (xhigh maps to adaptive effort "max" on Anthropic-compatible providers)
49
+ * - Opus 4.6+ models (xhigh maps to adaptive effort "max" on Anthropic-compatible providers)
50
50
  */
51
51
  export declare function supportsXhigh<TApi extends Api>(model: Model<TApi>): boolean;
52
52
  /**
@@ -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;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAU3E;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\n/**\n * Check if a model supports xhigh thinking level.\n *\n * Supported today:\n * - GPT-5.2 / GPT-5.3 / GPT-5.4 model families\n * - Opus 4.6 models (xhigh maps to adaptive effort \"max\" on Anthropic-compatible providers)\n */\nexport function supportsXhigh<TApi extends Api>(model: Model<TApi>): boolean {\n\tif (model.id.includes(\"gpt-5.2\") || model.id.includes(\"gpt-5.3\") || model.id.includes(\"gpt-5.4\")) {\n\t\treturn true;\n\t}\n\n\tif (model.id.includes(\"opus-4-6\") || model.id.includes(\"opus-4.6\")) {\n\t\treturn true;\n\t}\n\n\treturn false;\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;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAe3E;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\n/**\n * Check if a model supports xhigh thinking level.\n *\n * Supported today:\n * - GPT-5.2 / GPT-5.3 / GPT-5.4 model families\n * - Opus 4.6+ models (xhigh maps to adaptive effort \"max\" on Anthropic-compatible providers)\n */\nexport function supportsXhigh<TApi extends Api>(model: Model<TApi>): boolean {\n\tif (model.id.includes(\"gpt-5.2\") || model.id.includes(\"gpt-5.3\") || model.id.includes(\"gpt-5.4\")) {\n\t\treturn true;\n\t}\n\n\tif (\n\t\tmodel.id.includes(\"opus-4-6\") ||\n\t\tmodel.id.includes(\"opus-4.6\") ||\n\t\tmodel.id.includes(\"opus-4-7\") ||\n\t\tmodel.id.includes(\"opus-4.7\")\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\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"]}
@@ -255,6 +255,23 @@ export declare const MODELS: {
255
255
  contextWindow: number;
256
256
  maxTokens: number;
257
257
  };
258
+ readonly "anthropic.claude-opus-4-7": {
259
+ id: string;
260
+ name: string;
261
+ api: "bedrock-converse-stream";
262
+ provider: string;
263
+ baseUrl: string;
264
+ reasoning: true;
265
+ input: ("image" | "text")[];
266
+ cost: {
267
+ input: number;
268
+ output: number;
269
+ cacheRead: number;
270
+ cacheWrite: number;
271
+ };
272
+ contextWindow: number;
273
+ maxTokens: number;
274
+ };
258
275
  readonly "anthropic.claude-sonnet-4-20250514-v1:0": {
259
276
  id: string;
260
277
  name: string;
@@ -408,6 +425,23 @@ export declare const MODELS: {
408
425
  contextWindow: number;
409
426
  maxTokens: number;
410
427
  };
428
+ readonly "eu.anthropic.claude-opus-4-7": {
429
+ id: string;
430
+ name: string;
431
+ api: "bedrock-converse-stream";
432
+ provider: string;
433
+ baseUrl: string;
434
+ reasoning: true;
435
+ input: ("image" | "text")[];
436
+ cost: {
437
+ input: number;
438
+ output: number;
439
+ cacheRead: number;
440
+ cacheWrite: number;
441
+ };
442
+ contextWindow: number;
443
+ maxTokens: number;
444
+ };
411
445
  readonly "eu.anthropic.claude-sonnet-4-20250514-v1:0": {
412
446
  id: string;
413
447
  name: string;
@@ -510,6 +544,23 @@ export declare const MODELS: {
510
544
  contextWindow: number;
511
545
  maxTokens: number;
512
546
  };
547
+ readonly "global.anthropic.claude-opus-4-7": {
548
+ id: string;
549
+ name: string;
550
+ api: "bedrock-converse-stream";
551
+ provider: string;
552
+ baseUrl: string;
553
+ reasoning: true;
554
+ input: ("image" | "text")[];
555
+ cost: {
556
+ input: number;
557
+ output: number;
558
+ cacheRead: number;
559
+ cacheWrite: number;
560
+ };
561
+ contextWindow: number;
562
+ maxTokens: number;
563
+ };
513
564
  readonly "global.anthropic.claude-sonnet-4-20250514-v1:0": {
514
565
  id: string;
515
566
  name: string;
@@ -1343,6 +1394,23 @@ export declare const MODELS: {
1343
1394
  contextWindow: number;
1344
1395
  maxTokens: number;
1345
1396
  };
1397
+ readonly "us.anthropic.claude-opus-4-7": {
1398
+ id: string;
1399
+ name: string;
1400
+ api: "bedrock-converse-stream";
1401
+ provider: string;
1402
+ baseUrl: string;
1403
+ reasoning: true;
1404
+ input: ("image" | "text")[];
1405
+ cost: {
1406
+ input: number;
1407
+ output: number;
1408
+ cacheRead: number;
1409
+ cacheWrite: number;
1410
+ };
1411
+ contextWindow: number;
1412
+ maxTokens: number;
1413
+ };
1346
1414
  readonly "us.anthropic.claude-sonnet-4-20250514-v1:0": {
1347
1415
  id: string;
1348
1416
  name: string;
@@ -1770,6 +1838,23 @@ export declare const MODELS: {
1770
1838
  contextWindow: number;
1771
1839
  maxTokens: number;
1772
1840
  };
1841
+ readonly "claude-opus-4-7": {
1842
+ id: string;
1843
+ name: string;
1844
+ api: "anthropic-messages";
1845
+ provider: string;
1846
+ baseUrl: string;
1847
+ reasoning: true;
1848
+ input: ("image" | "text")[];
1849
+ cost: {
1850
+ input: number;
1851
+ output: number;
1852
+ cacheRead: number;
1853
+ cacheWrite: number;
1854
+ };
1855
+ contextWindow: number;
1856
+ maxTokens: number;
1857
+ };
1773
1858
  readonly "claude-sonnet-4-0": {
1774
1859
  id: string;
1775
1860
  name: string;
@@ -6342,6 +6427,23 @@ export declare const MODELS: {
6342
6427
  contextWindow: number;
6343
6428
  maxTokens: number;
6344
6429
  };
6430
+ readonly "claude-opus-4-7": {
6431
+ id: string;
6432
+ name: string;
6433
+ api: "anthropic-messages";
6434
+ provider: string;
6435
+ baseUrl: string;
6436
+ reasoning: true;
6437
+ input: ("image" | "text")[];
6438
+ cost: {
6439
+ input: number;
6440
+ output: number;
6441
+ cacheRead: number;
6442
+ cacheWrite: number;
6443
+ };
6444
+ contextWindow: number;
6445
+ maxTokens: number;
6446
+ };
6345
6447
  readonly "claude-sonnet-4": {
6346
6448
  id: string;
6347
6449
  name: string;
@@ -6767,6 +6869,40 @@ export declare const MODELS: {
6767
6869
  contextWindow: number;
6768
6870
  maxTokens: number;
6769
6871
  };
6872
+ readonly "qwen3.5-plus": {
6873
+ id: string;
6874
+ name: string;
6875
+ api: "openai-completions";
6876
+ provider: string;
6877
+ baseUrl: string;
6878
+ reasoning: true;
6879
+ input: ("image" | "text")[];
6880
+ cost: {
6881
+ input: number;
6882
+ output: number;
6883
+ cacheRead: number;
6884
+ cacheWrite: number;
6885
+ };
6886
+ contextWindow: number;
6887
+ maxTokens: number;
6888
+ };
6889
+ readonly "qwen3.6-plus": {
6890
+ id: string;
6891
+ name: string;
6892
+ api: "openai-completions";
6893
+ provider: string;
6894
+ baseUrl: string;
6895
+ reasoning: true;
6896
+ input: ("image" | "text")[];
6897
+ cost: {
6898
+ input: number;
6899
+ output: number;
6900
+ cacheRead: number;
6901
+ cacheWrite: number;
6902
+ };
6903
+ contextWindow: number;
6904
+ maxTokens: number;
6905
+ };
6770
6906
  };
6771
6907
  readonly "opencode-go": {
6772
6908
  readonly "glm-5": {
@@ -6888,6 +7024,40 @@ export declare const MODELS: {
6888
7024
  contextWindow: number;
6889
7025
  maxTokens: number;
6890
7026
  };
7027
+ readonly "qwen3.5-plus": {
7028
+ id: string;
7029
+ name: string;
7030
+ api: "openai-completions";
7031
+ provider: string;
7032
+ baseUrl: string;
7033
+ reasoning: true;
7034
+ input: ("image" | "text")[];
7035
+ cost: {
7036
+ input: number;
7037
+ output: number;
7038
+ cacheRead: number;
7039
+ cacheWrite: number;
7040
+ };
7041
+ contextWindow: number;
7042
+ maxTokens: number;
7043
+ };
7044
+ readonly "qwen3.6-plus": {
7045
+ id: string;
7046
+ name: string;
7047
+ api: "openai-completions";
7048
+ provider: string;
7049
+ baseUrl: string;
7050
+ reasoning: true;
7051
+ input: ("image" | "text")[];
7052
+ cost: {
7053
+ input: number;
7054
+ output: number;
7055
+ cacheRead: number;
7056
+ cacheWrite: number;
7057
+ };
7058
+ contextWindow: number;
7059
+ maxTokens: number;
7060
+ };
6891
7061
  };
6892
7062
  readonly openrouter: {
6893
7063
  readonly "ai21/jamba-large-1.7": {
@@ -7196,6 +7366,23 @@ export declare const MODELS: {
7196
7366
  contextWindow: number;
7197
7367
  maxTokens: number;
7198
7368
  };
7369
+ readonly "anthropic/claude-opus-4.7": {
7370
+ id: string;
7371
+ name: string;
7372
+ api: "openai-completions";
7373
+ provider: string;
7374
+ baseUrl: string;
7375
+ reasoning: true;
7376
+ input: ("image" | "text")[];
7377
+ cost: {
7378
+ input: number;
7379
+ output: number;
7380
+ cacheRead: number;
7381
+ cacheWrite: number;
7382
+ };
7383
+ contextWindow: number;
7384
+ maxTokens: number;
7385
+ };
7199
7386
  readonly "anthropic/claude-sonnet-4": {
7200
7387
  id: string;
7201
7388
  name: string;
@@ -11533,6 +11720,23 @@ export declare const MODELS: {
11533
11720
  contextWindow: number;
11534
11721
  maxTokens: number;
11535
11722
  };
11723
+ readonly "anthropic/claude-opus-4.7": {
11724
+ id: string;
11725
+ name: string;
11726
+ api: "anthropic-messages";
11727
+ provider: string;
11728
+ baseUrl: string;
11729
+ reasoning: true;
11730
+ input: ("image" | "text")[];
11731
+ cost: {
11732
+ input: number;
11733
+ output: number;
11734
+ cacheRead: number;
11735
+ cacheWrite: number;
11736
+ };
11737
+ contextWindow: number;
11738
+ maxTokens: number;
11739
+ };
11536
11740
  readonly "anthropic/claude-sonnet-4": {
11537
11741
  id: string;
11538
11742
  name: string;
@@ -13291,7 +13495,7 @@ export declare const MODELS: {
13291
13495
  provider: string;
13292
13496
  baseUrl: string;
13293
13497
  reasoning: false;
13294
- input: "text"[];
13498
+ input: ("image" | "text")[];
13295
13499
  cost: {
13296
13500
  input: number;
13297
13501
  output: number;
@@ -13308,7 +13512,7 @@ export declare const MODELS: {
13308
13512
  provider: string;
13309
13513
  baseUrl: string;
13310
13514
  reasoning: true;
13311
- input: "text"[];
13515
+ input: ("image" | "text")[];
13312
13516
  cost: {
13313
13517
  input: number;
13314
13518
  output: number;
@@ -13325,7 +13529,7 @@ export declare const MODELS: {
13325
13529
  provider: string;
13326
13530
  baseUrl: string;
13327
13531
  reasoning: false;
13328
- input: "text"[];
13532
+ input: ("image" | "text")[];
13329
13533
  cost: {
13330
13534
  input: number;
13331
13535
  output: number;
@@ -13342,7 +13546,7 @@ export declare const MODELS: {
13342
13546
  provider: string;
13343
13547
  baseUrl: string;
13344
13548
  reasoning: true;
13345
- input: "text"[];
13549
+ input: ("image" | "text")[];
13346
13550
  cost: {
13347
13551
  input: number;
13348
13552
  output: number;
@@ -13359,7 +13563,7 @@ export declare const MODELS: {
13359
13563
  provider: string;
13360
13564
  baseUrl: string;
13361
13565
  reasoning: true;
13362
- input: "text"[];
13566
+ input: ("image" | "text")[];
13363
13567
  cost: {
13364
13568
  input: number;
13365
13569
  output: number;
@@ -13376,7 +13580,7 @@ export declare const MODELS: {
13376
13580
  provider: string;
13377
13581
  baseUrl: string;
13378
13582
  reasoning: true;
13379
- input: "text"[];
13583
+ input: ("image" | "text")[];
13380
13584
  cost: {
13381
13585
  input: number;
13382
13586
  output: number;
@@ -13699,7 +13903,7 @@ export declare const MODELS: {
13699
13903
  provider: string;
13700
13904
  baseUrl: string;
13701
13905
  reasoning: true;
13702
- input: "text"[];
13906
+ input: ("image" | "text")[];
13703
13907
  cost: {
13704
13908
  input: number;
13705
13909
  output: number;