'use strict'; var chunkDBTKQ3U2_cjs = require('./chunk-DBTKQ3U2.cjs'); var chunkZMNN3DOV_cjs = require('./chunk-ZMNN3DOV.cjs'); var chunkOCS2GTEN_cjs = require('./chunk-OCS2GTEN.cjs'); var chunk6QR4RQID_cjs = require('./chunk-6QR4RQID.cjs'); var chunkXSOONORA_cjs = require('./chunk-XSOONORA.cjs'); var fs = require('fs'); var module$1 = require('module'); var os = require('os'); var path = require('path'); var v4 = require('zod/v4'); var WebSocket = require('ws'); var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null; function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var fs__default = /*#__PURE__*/_interopDefault(fs); var os__default = /*#__PURE__*/_interopDefault(os); var path__default = /*#__PURE__*/_interopDefault(path); var WebSocket__default = /*#__PURE__*/_interopDefault(WebSocket); var openaiErrorDataSchema = v4.z.object({ error: v4.z.object({ message: v4.z.string(), // The additional information below is handled loosely to support // OpenAI-compatible providers that have slightly different error // responses: type: v4.z.string().nullish(), param: v4.z.any().nullish(), code: v4.z.union([v4.z.string(), v4.z.number()]).nullish() }) }); var openaiFailedResponseHandler = chunkOCS2GTEN_cjs.createJsonErrorResponseHandler({ errorSchema: openaiErrorDataSchema, errorToMessage: (data) => data.error.message }); function getOpenAILanguageModelCapabilities(modelId) { const supportsFlexProcessing = modelId.startsWith("o3") || modelId.startsWith("o4-mini") || modelId.startsWith("gpt-5") && !modelId.startsWith("gpt-5-chat"); const supportsPriorityProcessing = modelId.startsWith("gpt-4") || modelId.startsWith("gpt-5") && !modelId.startsWith("gpt-5-nano") && !modelId.startsWith("gpt-5-chat") && !modelId.startsWith("gpt-5.4-nano") || modelId.startsWith("o3") || modelId.startsWith("o4-mini"); const isReasoningModel = !(modelId.startsWith("gpt-3") || modelId.startsWith("gpt-4") || modelId.startsWith("chatgpt-4o") || modelId.startsWith("gpt-5-chat")); const supportsNonReasoningParameters = modelId.startsWith("gpt-5.1") || modelId.startsWith("gpt-5.2") || modelId.startsWith("gpt-5.3") || modelId.startsWith("gpt-5.4"); const systemMessageMode = isReasoningModel ? "developer" : "system"; return { supportsFlexProcessing, supportsPriorityProcessing, isReasoningModel, systemMessageMode, supportsNonReasoningParameters }; } function convertToOpenAIChatMessages({ prompt, systemMessageMode = "system" }) { const messages = []; const warnings = []; for (const { role, content } of prompt) { switch (role) { case "system": { switch (systemMessageMode) { case "system": { messages.push({ role: "system", content }); break; } case "developer": { messages.push({ role: "developer", content }); break; } case "remove": { warnings.push({ type: "other", message: "system messages are removed for this model" }); break; } default: { const _exhaustiveCheck = systemMessageMode; throw new Error( `Unsupported system message mode: ${_exhaustiveCheck}` ); } } break; } case "user": { if (content.length === 1 && content[0].type === "text") { messages.push({ role: "user", content: content[0].text }); break; } messages.push({ role: "user", content: content.map((part, index) => { var _a, _b, _c; switch (part.type) { case "text": { return { type: "text", text: part.text }; } case "file": { if (part.mediaType.startsWith("image/")) { const mediaType = part.mediaType === "image/*" ? "image/jpeg" : part.mediaType; return { type: "image_url", image_url: { url: part.data instanceof URL ? part.data.toString() : `data:${mediaType};base64,${chunkOCS2GTEN_cjs.convertToBase64(part.data)}`, // OpenAI specific extension: image detail detail: (_b = (_a = part.providerOptions) == null ? void 0 : _a.openai) == null ? void 0 : _b.imageDetail } }; } else if (part.mediaType.startsWith("audio/")) { if (part.data instanceof URL) { throw new chunkOCS2GTEN_cjs.UnsupportedFunctionalityError({ functionality: "audio file parts with URLs" }); } switch (part.mediaType) { case "audio/wav": { return { type: "input_audio", input_audio: { data: chunkOCS2GTEN_cjs.convertToBase64(part.data), format: "wav" } }; } case "audio/mp3": case "audio/mpeg": { return { type: "input_audio", input_audio: { data: chunkOCS2GTEN_cjs.convertToBase64(part.data), format: "mp3" } }; } default: { throw new chunkOCS2GTEN_cjs.UnsupportedFunctionalityError({ functionality: `audio content parts with media type ${part.mediaType}` }); } } } else if (part.mediaType === "application/pdf") { if (part.data instanceof URL) { throw new chunkOCS2GTEN_cjs.UnsupportedFunctionalityError({ functionality: "PDF file parts with URLs" }); } return { type: "file", file: typeof part.data === "string" && part.data.startsWith("file-") ? { file_id: part.data } : { filename: (_c = part.filename) != null ? _c : `part-${index}.pdf`, file_data: `data:application/pdf;base64,${chunkOCS2GTEN_cjs.convertToBase64(part.data)}` } }; } else { throw new chunkOCS2GTEN_cjs.UnsupportedFunctionalityError({ functionality: `file part media type ${part.mediaType}` }); } } } }) }); break; } case "assistant": { let text = ""; const toolCalls = []; for (const part of content) { switch (part.type) { case "text": { text += part.text; break; } case "tool-call": { toolCalls.push({ id: part.toolCallId, type: "function", function: { name: part.toolName, arguments: JSON.stringify(part.input) } }); break; } } } messages.push({ role: "assistant", content: text, tool_calls: toolCalls.length > 0 ? toolCalls : void 0 }); break; } case "tool": { for (const toolResponse of content) { const output = toolResponse.output; let contentValue; switch (output.type) { case "text": case "error-text": contentValue = output.value; break; case "content": case "json": case "error-json": contentValue = JSON.stringify(output.value); break; } messages.push({ role: "tool", tool_call_id: toolResponse.toolCallId, content: contentValue }); } break; } default: { const _exhaustiveCheck = role; throw new Error(`Unsupported role: ${_exhaustiveCheck}`); } } } return { messages, warnings }; } function getResponseMetadata({ id, model, created }) { return { id: id != null ? id : void 0, modelId: model != null ? model : void 0, timestamp: created ? new Date(created * 1e3) : void 0 }; } function mapOpenAIFinishReason(finishReason) { switch (finishReason) { case "stop": return "stop"; case "length": return "length"; case "content_filter": return "content-filter"; case "function_call": case "tool_calls": return "tool-calls"; default: return "unknown"; } } var openaiChatResponseSchema = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ id: v4.z.string().nullish(), created: v4.z.number().nullish(), model: v4.z.string().nullish(), choices: v4.z.array( v4.z.object({ message: v4.z.object({ role: v4.z.literal("assistant").nullish(), content: v4.z.string().nullish(), tool_calls: v4.z.array( v4.z.object({ id: v4.z.string().nullish(), type: v4.z.literal("function"), function: v4.z.object({ name: v4.z.string(), arguments: v4.z.string() }) }) ).nullish(), annotations: v4.z.array( v4.z.object({ type: v4.z.literal("url_citation"), url_citation: v4.z.object({ start_index: v4.z.number(), end_index: v4.z.number(), url: v4.z.string(), title: v4.z.string() }) }) ).nullish() }), index: v4.z.number(), logprobs: v4.z.object({ content: v4.z.array( v4.z.object({ token: v4.z.string(), logprob: v4.z.number(), top_logprobs: v4.z.array( v4.z.object({ token: v4.z.string(), logprob: v4.z.number() }) ) }) ).nullish() }).nullish(), finish_reason: v4.z.string().nullish() }) ), usage: v4.z.object({ prompt_tokens: v4.z.number().nullish(), completion_tokens: v4.z.number().nullish(), total_tokens: v4.z.number().nullish(), prompt_tokens_details: v4.z.object({ cached_tokens: v4.z.number().nullish() }).nullish(), completion_tokens_details: v4.z.object({ reasoning_tokens: v4.z.number().nullish(), accepted_prediction_tokens: v4.z.number().nullish(), rejected_prediction_tokens: v4.z.number().nullish() }).nullish() }).nullish() }) ) ); var openaiChatChunkSchema = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.union([ v4.z.object({ id: v4.z.string().nullish(), created: v4.z.number().nullish(), model: v4.z.string().nullish(), choices: v4.z.array( v4.z.object({ delta: v4.z.object({ role: v4.z.enum(["assistant"]).nullish(), content: v4.z.string().nullish(), tool_calls: v4.z.array( v4.z.object({ index: v4.z.number(), id: v4.z.string().nullish(), type: v4.z.literal("function").nullish(), function: v4.z.object({ name: v4.z.string().nullish(), arguments: v4.z.string().nullish() }) }) ).nullish(), annotations: v4.z.array( v4.z.object({ type: v4.z.literal("url_citation"), url_citation: v4.z.object({ start_index: v4.z.number(), end_index: v4.z.number(), url: v4.z.string(), title: v4.z.string() }) }) ).nullish() }).nullish(), logprobs: v4.z.object({ content: v4.z.array( v4.z.object({ token: v4.z.string(), logprob: v4.z.number(), top_logprobs: v4.z.array( v4.z.object({ token: v4.z.string(), logprob: v4.z.number() }) ) }) ).nullish() }).nullish(), finish_reason: v4.z.string().nullish(), index: v4.z.number() }) ), usage: v4.z.object({ prompt_tokens: v4.z.number().nullish(), completion_tokens: v4.z.number().nullish(), total_tokens: v4.z.number().nullish(), prompt_tokens_details: v4.z.object({ cached_tokens: v4.z.number().nullish() }).nullish(), completion_tokens_details: v4.z.object({ reasoning_tokens: v4.z.number().nullish(), accepted_prediction_tokens: v4.z.number().nullish(), rejected_prediction_tokens: v4.z.number().nullish() }).nullish() }).nullish() }), openaiErrorDataSchema ]) ) ); var openaiChatLanguageModelOptions = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ /** * Modify the likelihood of specified tokens appearing in the completion. * * Accepts a JSON object that maps tokens (specified by their token ID in * the GPT tokenizer) to an associated bias value from -100 to 100. */ logitBias: v4.z.record(v4.z.coerce.number(), v4.z.number()).optional(), /** * Return the log probabilities of the tokens. * * Setting to true will return the log probabilities of the tokens that * were generated. * * Setting to a number will return the log probabilities of the top n * tokens that were generated. */ logprobs: v4.z.union([v4.z.boolean(), v4.z.number()]).optional(), /** * Whether to enable parallel function calling during tool use. Default to true. */ parallelToolCalls: v4.z.boolean().optional(), /** * A unique identifier representing your end-user, which can help OpenAI to * monitor and detect abuse. */ user: v4.z.string().optional(), /** * Reasoning effort for reasoning models. Defaults to `medium`. */ reasoningEffort: v4.z.enum(["none", "minimal", "low", "medium", "high", "xhigh"]).optional(), /** * Maximum number of completion tokens to generate. Useful for reasoning models. */ maxCompletionTokens: v4.z.number().optional(), /** * Whether to enable persistence in responses API. */ store: v4.z.boolean().optional(), /** * Metadata to associate with the request. */ metadata: v4.z.record(v4.z.string().max(64), v4.z.string().max(512)).optional(), /** * Parameters for prediction mode. */ prediction: v4.z.record(v4.z.string(), v4.z.any()).optional(), /** * Whether to use structured outputs. * * @default true */ structuredOutputs: v4.z.boolean().optional(), /** * Service tier for the request. * - 'auto': Default service tier. The request will be processed with the service tier configured in the * Project settings. Unless otherwise configured, the Project will use 'default'. * - 'flex': 50% cheaper processing at the cost of increased latency. Only available for o3 and o4-mini models. * - 'priority': Higher-speed processing with predictably low latency at premium cost. Available for Enterprise customers. * - 'default': The request will be processed with the standard pricing and performance for the selected model. * * @default 'auto' */ serviceTier: v4.z.enum(["auto", "flex", "priority", "default"]).optional(), /** * Whether to use strict JSON schema validation. * * @default false */ strictJsonSchema: v4.z.boolean().optional(), /** * Controls the verbosity of the model's responses. * Lower values will result in more concise responses, while higher values will result in more verbose responses. */ textVerbosity: v4.z.enum(["low", "medium", "high"]).optional(), /** * A cache key for prompt caching. Allows manual control over prompt caching behavior. * Useful for improving cache hit rates and working around automatic caching issues. */ promptCacheKey: v4.z.string().optional(), /** * The retention policy for the prompt cache. * - 'in_memory': Default. Standard prompt caching behavior. * - '24h': Extended prompt caching that keeps cached prefixes active for up to 24 hours. * Currently only available for 5.1 series models. * * @default 'in_memory' */ promptCacheRetention: v4.z.enum(["in_memory", "24h"]).optional(), /** * A stable identifier used to help detect users of your application * that may be violating OpenAI's usage policies. The IDs should be a * string that uniquely identifies each user. We recommend hashing their * username or email address, in order to avoid sending us any identifying * information. */ safetyIdentifier: v4.z.string().optional() }) ) ); function prepareChatTools({ tools, toolChoice, structuredOutputs, strictJsonSchema }) { tools = (tools == null ? void 0 : tools.length) ? tools : void 0; const toolWarnings = []; if (tools == null) { return { tools: void 0, toolChoice: void 0, toolWarnings }; } const openaiTools = []; for (const tool of tools) { switch (tool.type) { case "function": openaiTools.push({ type: "function", function: { name: tool.name, description: tool.description, parameters: tool.inputSchema, strict: structuredOutputs ? strictJsonSchema : void 0 } }); break; default: toolWarnings.push({ type: "unsupported-tool", tool }); break; } } if (toolChoice == null) { return { tools: openaiTools, toolChoice: void 0, toolWarnings }; } const type = toolChoice.type; switch (type) { case "auto": case "none": case "required": return { tools: openaiTools, toolChoice: type, toolWarnings }; case "tool": return { tools: openaiTools, toolChoice: { type: "function", function: { name: toolChoice.toolName } }, toolWarnings }; default: { const _exhaustiveCheck = type; throw new chunkOCS2GTEN_cjs.UnsupportedFunctionalityError({ functionality: `tool choice type: ${_exhaustiveCheck}` }); } } } var OpenAIChatLanguageModel = class { constructor(modelId, config) { this.specificationVersion = "v2"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/] }; this.modelId = modelId; this.config = config; } get provider() { return this.config.provider; } async getArgs({ prompt, maxOutputTokens, temperature, topP, topK, frequencyPenalty, presencePenalty, stopSequences, responseFormat, seed, tools, toolChoice, providerOptions }) { var _a, _b, _c, _d; const warnings = []; const openaiOptions = (_a = await chunkOCS2GTEN_cjs.parseProviderOptions({ provider: "openai", providerOptions, schema: openaiChatLanguageModelOptions })) != null ? _a : {}; const structuredOutputs = (_b = openaiOptions.structuredOutputs) != null ? _b : true; const modelCapabilities = getOpenAILanguageModelCapabilities(this.modelId); if (topK != null) { warnings.push({ type: "unsupported-setting", setting: "topK" }); } if ((responseFormat == null ? void 0 : responseFormat.type) === "json" && responseFormat.schema != null && !structuredOutputs) { warnings.push({ type: "unsupported-setting", setting: "responseFormat", details: "JSON response format schema is only supported with structuredOutputs" }); } const { messages, warnings: messageWarnings } = convertToOpenAIChatMessages( { prompt, systemMessageMode: modelCapabilities.systemMessageMode } ); warnings.push(...messageWarnings); const strictJsonSchema = (_c = openaiOptions.strictJsonSchema) != null ? _c : false; const baseArgs = { // model id: model: this.modelId, // model specific settings: logit_bias: openaiOptions.logitBias, logprobs: openaiOptions.logprobs === true || typeof openaiOptions.logprobs === "number" ? true : void 0, top_logprobs: typeof openaiOptions.logprobs === "number" ? openaiOptions.logprobs : typeof openaiOptions.logprobs === "boolean" ? openaiOptions.logprobs ? 0 : void 0 : void 0, user: openaiOptions.user, parallel_tool_calls: openaiOptions.parallelToolCalls, // standardized settings: max_tokens: maxOutputTokens, temperature, top_p: topP, frequency_penalty: frequencyPenalty, presence_penalty: presencePenalty, response_format: (responseFormat == null ? void 0 : responseFormat.type) === "json" ? structuredOutputs && responseFormat.schema != null ? { type: "json_schema", json_schema: { schema: responseFormat.schema, strict: strictJsonSchema, name: (_d = responseFormat.name) != null ? _d : "response", description: responseFormat.description } } : { type: "json_object" } : void 0, stop: stopSequences, seed, verbosity: openaiOptions.textVerbosity, // openai specific settings: // TODO AI SDK 6: remove, we auto-map maxOutputTokens now max_completion_tokens: openaiOptions.maxCompletionTokens, store: openaiOptions.store, metadata: openaiOptions.metadata, prediction: openaiOptions.prediction, reasoning_effort: openaiOptions.reasoningEffort, service_tier: openaiOptions.serviceTier, prompt_cache_key: openaiOptions.promptCacheKey, prompt_cache_retention: openaiOptions.promptCacheRetention, safety_identifier: openaiOptions.safetyIdentifier, // messages: messages }; if (modelCapabilities.isReasoningModel) { if (openaiOptions.reasoningEffort !== "none" || !modelCapabilities.supportsNonReasoningParameters) { if (baseArgs.temperature != null) { baseArgs.temperature = void 0; warnings.push({ type: "unsupported-setting", setting: "temperature", details: "temperature is not supported for reasoning models" }); } if (baseArgs.top_p != null) { baseArgs.top_p = void 0; warnings.push({ type: "unsupported-setting", setting: "topP", details: "topP is not supported for reasoning models" }); } if (baseArgs.logprobs != null) { baseArgs.logprobs = void 0; warnings.push({ type: "other", message: "logprobs is not supported for reasoning models" }); } } if (baseArgs.frequency_penalty != null) { baseArgs.frequency_penalty = void 0; warnings.push({ type: "unsupported-setting", setting: "frequencyPenalty", details: "frequencyPenalty is not supported for reasoning models" }); } if (baseArgs.presence_penalty != null) { baseArgs.presence_penalty = void 0; warnings.push({ type: "unsupported-setting", setting: "presencePenalty", details: "presencePenalty is not supported for reasoning models" }); } if (baseArgs.logit_bias != null) { baseArgs.logit_bias = void 0; warnings.push({ type: "other", message: "logitBias is not supported for reasoning models" }); } if (baseArgs.top_logprobs != null) { baseArgs.top_logprobs = void 0; warnings.push({ type: "other", message: "topLogprobs is not supported for reasoning models" }); } if (baseArgs.max_tokens != null) { if (baseArgs.max_completion_tokens == null) { baseArgs.max_completion_tokens = baseArgs.max_tokens; } baseArgs.max_tokens = void 0; } } else if (this.modelId.startsWith("gpt-4o-search-preview") || this.modelId.startsWith("gpt-4o-mini-search-preview")) { if (baseArgs.temperature != null) { baseArgs.temperature = void 0; warnings.push({ type: "unsupported-setting", setting: "temperature", details: "temperature is not supported for the search preview models and has been removed." }); } } if (openaiOptions.serviceTier === "flex" && !modelCapabilities.supportsFlexProcessing) { warnings.push({ type: "unsupported-setting", setting: "serviceTier", details: "flex processing is only available for o3, o4-mini, and gpt-5 models" }); baseArgs.service_tier = void 0; } if (openaiOptions.serviceTier === "priority" && !modelCapabilities.supportsPriorityProcessing) { warnings.push({ type: "unsupported-setting", setting: "serviceTier", details: "priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported" }); baseArgs.service_tier = void 0; } const { tools: openaiTools, toolChoice: openaiToolChoice, toolWarnings } = prepareChatTools({ tools, toolChoice, structuredOutputs, strictJsonSchema }); return { args: { ...baseArgs, tools: openaiTools, tool_choice: openaiToolChoice }, warnings: [...warnings, ...toolWarnings] }; } async doGenerate(options) { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n; const { args: body, warnings } = await this.getArgs(options); const { responseHeaders, value: response, rawValue: rawResponse } = await chunkOCS2GTEN_cjs.postJsonToApi({ url: this.config.url({ path: "/chat/completions", modelId: this.modelId }), headers: chunkOCS2GTEN_cjs.combineHeaders(this.config.headers(), options.headers), body, failedResponseHandler: openaiFailedResponseHandler, successfulResponseHandler: chunkOCS2GTEN_cjs.createJsonResponseHandler( openaiChatResponseSchema ), abortSignal: options.abortSignal, fetch: this.config.fetch }); const choice = response.choices[0]; const content = []; const text = choice.message.content; if (text != null && text.length > 0) { content.push({ type: "text", text }); } for (const toolCall of (_a = choice.message.tool_calls) != null ? _a : []) { content.push({ type: "tool-call", toolCallId: (_b = toolCall.id) != null ? _b : chunkOCS2GTEN_cjs.generateId(), toolName: toolCall.function.name, input: toolCall.function.arguments }); } for (const annotation of (_c = choice.message.annotations) != null ? _c : []) { content.push({ type: "source", sourceType: "url", id: chunkOCS2GTEN_cjs.generateId(), url: annotation.url_citation.url, title: annotation.url_citation.title }); } const completionTokenDetails = (_d = response.usage) == null ? void 0 : _d.completion_tokens_details; const promptTokenDetails = (_e = response.usage) == null ? void 0 : _e.prompt_tokens_details; const providerMetadata = { openai: {} }; if ((completionTokenDetails == null ? void 0 : completionTokenDetails.accepted_prediction_tokens) != null) { providerMetadata.openai.acceptedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.accepted_prediction_tokens; } if ((completionTokenDetails == null ? void 0 : completionTokenDetails.rejected_prediction_tokens) != null) { providerMetadata.openai.rejectedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.rejected_prediction_tokens; } if (((_f = choice.logprobs) == null ? void 0 : _f.content) != null) { providerMetadata.openai.logprobs = choice.logprobs.content; } return { content, finishReason: mapOpenAIFinishReason(choice.finish_reason), usage: { inputTokens: (_h = (_g = response.usage) == null ? void 0 : _g.prompt_tokens) != null ? _h : void 0, outputTokens: (_j = (_i = response.usage) == null ? void 0 : _i.completion_tokens) != null ? _j : void 0, totalTokens: (_l = (_k = response.usage) == null ? void 0 : _k.total_tokens) != null ? _l : void 0, reasoningTokens: (_m = completionTokenDetails == null ? void 0 : completionTokenDetails.reasoning_tokens) != null ? _m : void 0, cachedInputTokens: (_n = promptTokenDetails == null ? void 0 : promptTokenDetails.cached_tokens) != null ? _n : void 0 }, request: { body }, response: { ...getResponseMetadata(response), headers: responseHeaders, body: rawResponse }, warnings, providerMetadata }; } async doStream(options) { const { args, warnings } = await this.getArgs(options); const body = { ...args, stream: true, stream_options: { include_usage: true } }; const { responseHeaders, value: response } = await chunkOCS2GTEN_cjs.postJsonToApi({ url: this.config.url({ path: "/chat/completions", modelId: this.modelId }), headers: chunkOCS2GTEN_cjs.combineHeaders(this.config.headers(), options.headers), body, failedResponseHandler: openaiFailedResponseHandler, successfulResponseHandler: chunkOCS2GTEN_cjs.createEventSourceResponseHandler( openaiChatChunkSchema ), abortSignal: options.abortSignal, fetch: this.config.fetch }); const toolCalls = []; let finishReason = "unknown"; const usage = { inputTokens: void 0, outputTokens: void 0, totalTokens: void 0 }; let metadataExtracted = false; let isActiveText = false; const providerMetadata = { openai: {} }; return { stream: response.pipeThrough( new TransformStream({ start(controller) { controller.enqueue({ type: "stream-start", warnings }); }, transform(chunk, controller) { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x; if (options.includeRawChunks) { controller.enqueue({ type: "raw", rawValue: chunk.rawValue }); } if (!chunk.success) { finishReason = "error"; controller.enqueue({ type: "error", error: chunk.error }); return; } const value = chunk.value; if ("error" in value) { finishReason = "error"; controller.enqueue({ type: "error", error: value.error }); return; } if (!metadataExtracted) { const metadata = getResponseMetadata(value); if (Object.values(metadata).some(Boolean)) { metadataExtracted = true; controller.enqueue({ type: "response-metadata", ...getResponseMetadata(value) }); } } if (value.usage != null) { usage.inputTokens = (_a = value.usage.prompt_tokens) != null ? _a : void 0; usage.outputTokens = (_b = value.usage.completion_tokens) != null ? _b : void 0; usage.totalTokens = (_c = value.usage.total_tokens) != null ? _c : void 0; usage.reasoningTokens = (_e = (_d = value.usage.completion_tokens_details) == null ? void 0 : _d.reasoning_tokens) != null ? _e : void 0; usage.cachedInputTokens = (_g = (_f = value.usage.prompt_tokens_details) == null ? void 0 : _f.cached_tokens) != null ? _g : void 0; if (((_h = value.usage.completion_tokens_details) == null ? void 0 : _h.accepted_prediction_tokens) != null) { providerMetadata.openai.acceptedPredictionTokens = (_i = value.usage.completion_tokens_details) == null ? void 0 : _i.accepted_prediction_tokens; } if (((_j = value.usage.completion_tokens_details) == null ? void 0 : _j.rejected_prediction_tokens) != null) { providerMetadata.openai.rejectedPredictionTokens = (_k = value.usage.completion_tokens_details) == null ? void 0 : _k.rejected_prediction_tokens; } } const choice = value.choices[0]; if ((choice == null ? void 0 : choice.finish_reason) != null) { finishReason = mapOpenAIFinishReason(choice.finish_reason); } if (((_l = choice == null ? void 0 : choice.logprobs) == null ? void 0 : _l.content) != null) { providerMetadata.openai.logprobs = choice.logprobs.content; } if ((choice == null ? void 0 : choice.delta) == null) { return; } const delta = choice.delta; if (delta.content != null) { if (!isActiveText) { controller.enqueue({ type: "text-start", id: "0" }); isActiveText = true; } controller.enqueue({ type: "text-delta", id: "0", delta: delta.content }); } if (delta.tool_calls != null) { for (const toolCallDelta of delta.tool_calls) { const index = toolCallDelta.index; if (toolCalls[index] == null) { if (toolCallDelta.type != null && toolCallDelta.type !== "function") { throw new chunkOCS2GTEN_cjs.InvalidResponseDataError({ data: toolCallDelta, message: `Expected 'function' type.` }); } if (toolCallDelta.id == null) { throw new chunkOCS2GTEN_cjs.InvalidResponseDataError({ data: toolCallDelta, message: `Expected 'id' to be a string.` }); } if (((_m = toolCallDelta.function) == null ? void 0 : _m.name) == null) { throw new chunkOCS2GTEN_cjs.InvalidResponseDataError({ data: toolCallDelta, message: `Expected 'function.name' to be a string.` }); } controller.enqueue({ type: "tool-input-start", id: toolCallDelta.id, toolName: toolCallDelta.function.name }); toolCalls[index] = { id: toolCallDelta.id, type: "function", function: { name: toolCallDelta.function.name, arguments: (_n = toolCallDelta.function.arguments) != null ? _n : "" }, hasFinished: false }; const toolCall2 = toolCalls[index]; if (((_o = toolCall2.function) == null ? void 0 : _o.name) != null && ((_p = toolCall2.function) == null ? void 0 : _p.arguments) != null) { if (toolCall2.function.arguments.length > 0) { controller.enqueue({ type: "tool-input-delta", id: toolCall2.id, delta: toolCall2.function.arguments }); } if (chunkOCS2GTEN_cjs.isParsableJson(toolCall2.function.arguments)) { controller.enqueue({ type: "tool-input-end", id: toolCall2.id }); controller.enqueue({ type: "tool-call", toolCallId: (_q = toolCall2.id) != null ? _q : chunkOCS2GTEN_cjs.generateId(), toolName: toolCall2.function.name, input: toolCall2.function.arguments }); toolCall2.hasFinished = true; } } continue; } const toolCall = toolCalls[index]; if (toolCall.hasFinished) { continue; } if (((_r = toolCallDelta.function) == null ? void 0 : _r.arguments) != null) { toolCall.function.arguments += (_t = (_s = toolCallDelta.function) == null ? void 0 : _s.arguments) != null ? _t : ""; } controller.enqueue({ type: "tool-input-delta", id: toolCall.id, delta: (_u = toolCallDelta.function.arguments) != null ? _u : "" }); if (((_v = toolCall.function) == null ? void 0 : _v.name) != null && ((_w = toolCall.function) == null ? void 0 : _w.arguments) != null && chunkOCS2GTEN_cjs.isParsableJson(toolCall.function.arguments)) { controller.enqueue({ type: "tool-input-end", id: toolCall.id }); controller.enqueue({ type: "tool-call", toolCallId: (_x = toolCall.id) != null ? _x : chunkOCS2GTEN_cjs.generateId(), toolName: toolCall.function.name, input: toolCall.function.arguments }); toolCall.hasFinished = true; } } } if (delta.annotations != null) { for (const annotation of delta.annotations) { controller.enqueue({ type: "source", sourceType: "url", id: chunkOCS2GTEN_cjs.generateId(), url: annotation.url_citation.url, title: annotation.url_citation.title }); } } }, flush(controller) { if (isActiveText) { controller.enqueue({ type: "text-end", id: "0" }); } controller.enqueue({ type: "finish", finishReason, usage, ...providerMetadata != null ? { providerMetadata } : {} }); } }) ), request: { body }, response: { headers: responseHeaders } }; } }; function convertToOpenAICompletionPrompt({ prompt, user = "user", assistant = "assistant" }) { let text = ""; if (prompt[0].role === "system") { text += `${prompt[0].content} `; prompt = prompt.slice(1); } for (const { role, content } of prompt) { switch (role) { case "system": { throw new chunkOCS2GTEN_cjs.InvalidPromptError({ message: "Unexpected system message in prompt: ${content}", prompt }); } case "user": { const userMessage = content.map((part) => { switch (part.type) { case "text": { return part.text; } } }).filter(Boolean).join(""); text += `${user}: ${userMessage} `; break; } case "assistant": { const assistantMessage = content.map((part) => { switch (part.type) { case "text": { return part.text; } case "tool-call": { throw new chunkOCS2GTEN_cjs.UnsupportedFunctionalityError({ functionality: "tool-call messages" }); } } }).join(""); text += `${assistant}: ${assistantMessage} `; break; } case "tool": { throw new chunkOCS2GTEN_cjs.UnsupportedFunctionalityError({ functionality: "tool messages" }); } default: { const _exhaustiveCheck = role; throw new Error(`Unsupported role: ${_exhaustiveCheck}`); } } } text += `${assistant}: `; return { prompt: text, stopSequences: [` ${user}:`] }; } function getResponseMetadata2({ id, model, created }) { return { id: id != null ? id : void 0, modelId: model != null ? model : void 0, timestamp: created != null ? new Date(created * 1e3) : void 0 }; } function mapOpenAIFinishReason2(finishReason) { switch (finishReason) { case "stop": return "stop"; case "length": return "length"; case "content_filter": return "content-filter"; case "function_call": case "tool_calls": return "tool-calls"; default: return "unknown"; } } var openaiCompletionResponseSchema = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ id: v4.z.string().nullish(), created: v4.z.number().nullish(), model: v4.z.string().nullish(), choices: v4.z.array( v4.z.object({ text: v4.z.string(), finish_reason: v4.z.string(), logprobs: v4.z.object({ tokens: v4.z.array(v4.z.string()), token_logprobs: v4.z.array(v4.z.number()), top_logprobs: v4.z.array(v4.z.record(v4.z.string(), v4.z.number())).nullish() }).nullish() }) ), usage: v4.z.object({ prompt_tokens: v4.z.number(), completion_tokens: v4.z.number(), total_tokens: v4.z.number() }).nullish() }) ) ); var openaiCompletionChunkSchema = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.union([ v4.z.object({ id: v4.z.string().nullish(), created: v4.z.number().nullish(), model: v4.z.string().nullish(), choices: v4.z.array( v4.z.object({ text: v4.z.string(), finish_reason: v4.z.string().nullish(), index: v4.z.number(), logprobs: v4.z.object({ tokens: v4.z.array(v4.z.string()), token_logprobs: v4.z.array(v4.z.number()), top_logprobs: v4.z.array(v4.z.record(v4.z.string(), v4.z.number())).nullish() }).nullish() }) ), usage: v4.z.object({ prompt_tokens: v4.z.number(), completion_tokens: v4.z.number(), total_tokens: v4.z.number() }).nullish() }), openaiErrorDataSchema ]) ) ); var openaiCompletionProviderOptions = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ /** Echo back the prompt in addition to the completion. */ echo: v4.z.boolean().optional(), /** Modify the likelihood of specified tokens appearing in the completion. Accepts a JSON object that maps tokens (specified by their token ID in the GPT tokenizer) to an associated bias value from -100 to 100. You can use this tokenizer tool to convert text to token IDs. Mathematically, the bias is added to the logits generated by the model prior to sampling. The exact effect will vary per model, but values between -1 and 1 should decrease or increase likelihood of selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token. As an example, you can pass {"50256": -100} to prevent the <|endoftext|> token from being generated. */ logitBias: v4.z.record(v4.z.string(), v4.z.number()).optional(), /** The suffix that comes after a completion of inserted text. */ suffix: v4.z.string().optional(), /** A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. Learn more. */ user: v4.z.string().optional(), /** Return the log probabilities of the tokens. Including logprobs will increase the response size and can slow down response times. However, it can be useful to better understand how the model is behaving. Setting to true will return the log probabilities of the tokens that were generated. Setting to a number will return the log probabilities of the top n tokens that were generated. */ logprobs: v4.z.union([v4.z.boolean(), v4.z.number()]).optional() }) ) ); var OpenAICompletionLanguageModel = class { constructor(modelId, config) { this.specificationVersion = "v2"; this.supportedUrls = { // No URLs are supported for completion models. }; this.modelId = modelId; this.config = config; } get providerOptionsName() { return this.config.provider.split(".")[0].trim(); } get provider() { return this.config.provider; } async getArgs({ prompt, maxOutputTokens, temperature, topP, topK, frequencyPenalty, presencePenalty, stopSequences: userStopSequences, responseFormat, tools, toolChoice, seed, providerOptions }) { const warnings = []; const openaiOptions = { ...await chunkOCS2GTEN_cjs.parseProviderOptions({ provider: "openai", providerOptions, schema: openaiCompletionProviderOptions }), ...await chunkOCS2GTEN_cjs.parseProviderOptions({ provider: this.providerOptionsName, providerOptions, schema: openaiCompletionProviderOptions }) }; if (topK != null) { warnings.push({ type: "unsupported-setting", setting: "topK" }); } if (tools == null ? void 0 : tools.length) { warnings.push({ type: "unsupported-setting", setting: "tools" }); } if (toolChoice != null) { warnings.push({ type: "unsupported-setting", setting: "toolChoice" }); } if (responseFormat != null && responseFormat.type !== "text") { warnings.push({ type: "unsupported-setting", setting: "responseFormat", details: "JSON response format is not supported." }); } const { prompt: completionPrompt, stopSequences } = convertToOpenAICompletionPrompt({ prompt }); const stop = [...stopSequences != null ? stopSequences : [], ...userStopSequences != null ? userStopSequences : []]; return { args: { // model id: model: this.modelId, // model specific settings: echo: openaiOptions.echo, logit_bias: openaiOptions.logitBias, logprobs: (openaiOptions == null ? void 0 : openaiOptions.logprobs) === true ? 0 : (openaiOptions == null ? void 0 : openaiOptions.logprobs) === false ? void 0 : openaiOptions == null ? void 0 : openaiOptions.logprobs, suffix: openaiOptions.suffix, user: openaiOptions.user, // standardized settings: max_tokens: maxOutputTokens, temperature, top_p: topP, frequency_penalty: frequencyPenalty, presence_penalty: presencePenalty, seed, // prompt: prompt: completionPrompt, // stop sequences: stop: stop.length > 0 ? stop : void 0 }, warnings }; } async doGenerate(options) { var _a, _b, _c; const { args, warnings } = await this.getArgs(options); const { responseHeaders, value: response, rawValue: rawResponse } = await chunkOCS2GTEN_cjs.postJsonToApi({ url: this.config.url({ path: "/completions", modelId: this.modelId }), headers: chunkOCS2GTEN_cjs.combineHeaders(this.config.headers(), options.headers), body: args, failedResponseHandler: openaiFailedResponseHandler, successfulResponseHandler: chunkOCS2GTEN_cjs.createJsonResponseHandler( openaiCompletionResponseSchema ), abortSignal: options.abortSignal, fetch: this.config.fetch }); const choice = response.choices[0]; const providerMetadata = { openai: {} }; if (choice.logprobs != null) { providerMetadata.openai.logprobs = choice.logprobs; } return { content: [{ type: "text", text: choice.text }], usage: { inputTokens: (_a = response.usage) == null ? void 0 : _a.prompt_tokens, outputTokens: (_b = response.usage) == null ? void 0 : _b.completion_tokens, totalTokens: (_c = response.usage) == null ? void 0 : _c.total_tokens }, finishReason: mapOpenAIFinishReason2(choice.finish_reason), request: { body: args }, response: { ...getResponseMetadata2(response), headers: responseHeaders, body: rawResponse }, providerMetadata, warnings }; } async doStream(options) { const { args, warnings } = await this.getArgs(options); const body = { ...args, stream: true, stream_options: { include_usage: true } }; const { responseHeaders, value: response } = await chunkOCS2GTEN_cjs.postJsonToApi({ url: this.config.url({ path: "/completions", modelId: this.modelId }), headers: chunkOCS2GTEN_cjs.combineHeaders(this.config.headers(), options.headers), body, failedResponseHandler: openaiFailedResponseHandler, successfulResponseHandler: chunkOCS2GTEN_cjs.createEventSourceResponseHandler( openaiCompletionChunkSchema ), abortSignal: options.abortSignal, fetch: this.config.fetch }); let finishReason = "unknown"; const providerMetadata = { openai: {} }; const usage = { inputTokens: void 0, outputTokens: void 0, totalTokens: void 0 }; let isFirstChunk = true; return { stream: response.pipeThrough( new TransformStream({ start(controller) { controller.enqueue({ type: "stream-start", warnings }); }, transform(chunk, controller) { if (options.includeRawChunks) { controller.enqueue({ type: "raw", rawValue: chunk.rawValue }); } if (!chunk.success) { finishReason = "error"; controller.enqueue({ type: "error", error: chunk.error }); return; } const value = chunk.value; if ("error" in value) { finishReason = "error"; controller.enqueue({ type: "error", error: value.error }); return; } if (isFirstChunk) { isFirstChunk = false; controller.enqueue({ type: "response-metadata", ...getResponseMetadata2(value) }); controller.enqueue({ type: "text-start", id: "0" }); } if (value.usage != null) { usage.inputTokens = value.usage.prompt_tokens; usage.outputTokens = value.usage.completion_tokens; usage.totalTokens = value.usage.total_tokens; } const choice = value.choices[0]; if ((choice == null ? void 0 : choice.finish_reason) != null) { finishReason = mapOpenAIFinishReason2(choice.finish_reason); } if ((choice == null ? void 0 : choice.logprobs) != null) { providerMetadata.openai.logprobs = choice.logprobs; } if ((choice == null ? void 0 : choice.text) != null && choice.text.length > 0) { controller.enqueue({ type: "text-delta", id: "0", delta: choice.text }); } }, flush(controller) { if (!isFirstChunk) { controller.enqueue({ type: "text-end", id: "0" }); } controller.enqueue({ type: "finish", finishReason, providerMetadata, usage }); } }) ), request: { body }, response: { headers: responseHeaders } }; } }; var openaiEmbeddingProviderOptions = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ /** The number of dimensions the resulting output embeddings should have. Only supported in text-embedding-3 and later models. */ dimensions: v4.z.number().optional(), /** A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. Learn more. */ user: v4.z.string().optional() }) ) ); var openaiTextEmbeddingResponseSchema = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ data: v4.z.array(v4.z.object({ embedding: v4.z.array(v4.z.number()) })), usage: v4.z.object({ prompt_tokens: v4.z.number() }).nullish() }) ) ); var OpenAIEmbeddingModel = class { constructor(modelId, config) { this.specificationVersion = "v2"; this.maxEmbeddingsPerCall = 2048; this.supportsParallelCalls = true; this.modelId = modelId; this.config = config; } get provider() { return this.config.provider; } async doEmbed({ values, headers, abortSignal, providerOptions }) { var _a; if (values.length > this.maxEmbeddingsPerCall) { throw new chunkOCS2GTEN_cjs.TooManyEmbeddingValuesForCallError({ provider: this.provider, modelId: this.modelId, maxEmbeddingsPerCall: this.maxEmbeddingsPerCall, values }); } const openaiOptions = (_a = await chunkOCS2GTEN_cjs.parseProviderOptions({ provider: "openai", providerOptions, schema: openaiEmbeddingProviderOptions })) != null ? _a : {}; const { responseHeaders, value: response, rawValue } = await chunkOCS2GTEN_cjs.postJsonToApi({ url: this.config.url({ path: "/embeddings", modelId: this.modelId }), headers: chunkOCS2GTEN_cjs.combineHeaders(this.config.headers(), headers), body: { model: this.modelId, input: values, encoding_format: "float", dimensions: openaiOptions.dimensions, user: openaiOptions.user }, failedResponseHandler: openaiFailedResponseHandler, successfulResponseHandler: chunkOCS2GTEN_cjs.createJsonResponseHandler( openaiTextEmbeddingResponseSchema ), abortSignal, fetch: this.config.fetch }); return { embeddings: response.data.map((item) => item.embedding), usage: response.usage ? { tokens: response.usage.prompt_tokens } : void 0, response: { headers: responseHeaders, body: rawValue } }; } }; var openaiImageResponseSchema = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ created: v4.z.number().nullish(), data: v4.z.array( v4.z.object({ b64_json: v4.z.string(), revised_prompt: v4.z.string().nullish() }) ), background: v4.z.string().nullish(), output_format: v4.z.string().nullish(), size: v4.z.string().nullish(), quality: v4.z.string().nullish(), usage: v4.z.object({ input_tokens: v4.z.number().nullish(), output_tokens: v4.z.number().nullish(), total_tokens: v4.z.number().nullish(), input_tokens_details: v4.z.object({ image_tokens: v4.z.number().nullish(), text_tokens: v4.z.number().nullish() }).nullish() }).nullish() }) ) ); var modelMaxImagesPerCall = { "dall-e-3": 1, "dall-e-2": 10, "gpt-image-1": 10, "gpt-image-1-mini": 10, "gpt-image-1.5": 10, "gpt-image-2": 10 }; var hasDefaultResponseFormat = /* @__PURE__ */ new Set([ "gpt-image-1", "gpt-image-1-mini", "gpt-image-1.5", "gpt-image-2" ]); var baseImageModelOptionsObject = v4.z.object({ /** * Quality of the generated image(s). * * Valid values: `standard`, `hd`, `low`, `medium`, `high`, `auto`. */ quality: v4.z.enum(["standard", "hd", "low", "medium", "high", "auto"]).optional(), /** * Background behavior for the generated image(s). * * If `transparent`, the output format must support transparency * (i.e. `png` or `webp`). */ background: v4.z.enum(["transparent", "opaque", "auto"]).optional(), /** * Format in which the generated image(s) are returned. */ outputFormat: v4.z.enum(["png", "jpeg", "webp"]).optional(), /** * Compression level (0-100) for the generated image(s). Applies to the * `jpeg` and `webp` output formats. */ outputCompression: v4.z.number().int().min(0).max(100).optional(), /** * A unique identifier representing your end-user, which can help OpenAI * to monitor and detect abuse. */ user: v4.z.string().optional() }); chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema(baseImageModelOptionsObject) ); var openaiImageModelGenerationOptions = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( baseImageModelOptionsObject.extend({ /** * Style of the generated image. `vivid` produces hyper-real and * dramatic images; `natural` produces more subdued, less hyper-real * looking images. */ style: v4.z.enum(["vivid", "natural"]).optional(), /** * Content moderation level for the generated image(s). `low` applies * less restrictive filtering. */ moderation: v4.z.enum(["auto", "low"]).optional() }) ) ); var OpenAIImageModel = class { constructor(modelId, config) { this.modelId = modelId; this.config = config; this.specificationVersion = "v2"; } get maxImagesPerCall() { var _a; return (_a = modelMaxImagesPerCall[this.modelId]) != null ? _a : 1; } get provider() { return this.config.provider; } async doGenerate({ prompt, n, size, aspectRatio, seed, providerOptions, headers, abortSignal }) { var _a, _b, _c, _d; const warnings = []; if (aspectRatio != null) { warnings.push({ type: "unsupported-setting", setting: "aspectRatio", details: "This model does not support aspect ratio. Use `size` instead." }); } if (seed != null) { warnings.push({ type: "unsupported-setting", setting: "seed" }); } const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date(); const openaiOptions = (_d = await chunkOCS2GTEN_cjs.parseProviderOptions({ provider: "openai", providerOptions, schema: openaiImageModelGenerationOptions })) != null ? _d : {}; const { value: response, responseHeaders } = await chunkOCS2GTEN_cjs.postJsonToApi({ url: this.config.url({ path: "/images/generations", modelId: this.modelId }), headers: chunkOCS2GTEN_cjs.combineHeaders(this.config.headers(), headers), body: { model: this.modelId, prompt, n, size, quality: openaiOptions.quality, style: openaiOptions.style, background: openaiOptions.background, moderation: openaiOptions.moderation, output_format: openaiOptions.outputFormat, output_compression: openaiOptions.outputCompression, user: openaiOptions.user, ...!hasDefaultResponseFormat.has(this.modelId) ? { response_format: "b64_json" } : {} }, failedResponseHandler: openaiFailedResponseHandler, successfulResponseHandler: chunkOCS2GTEN_cjs.createJsonResponseHandler( openaiImageResponseSchema ), abortSignal, fetch: this.config.fetch }); return { images: response.data.map((item) => item.b64_json), warnings, response: { timestamp: currentDate, modelId: this.modelId, headers: responseHeaders }, providerMetadata: { openai: { images: response.data.map((item, index) => ({ ...item.revised_prompt ? { revisedPrompt: item.revised_prompt } : {}, ...response.created != null ? { created: response.created } : {}, ...response.size != null ? { size: response.size } : {}, ...response.quality != null ? { quality: response.quality } : {}, ...response.background != null ? { background: response.background } : {}, ...response.output_format != null ? { outputFormat: response.output_format } : {}, ...distributeTokenDetails( response.usage, index, response.data.length ) })) } } }; } }; function distributeTokenDetails(usage, index, total) { if (usage == null) { return {}; } const result = {}; const details = usage.input_tokens_details; if ((details == null ? void 0 : details.image_tokens) != null) { const base = Math.floor(details.image_tokens / total); const remainder = details.image_tokens - base * (total - 1); result.imageTokens = index === total - 1 ? remainder : base; } if ((details == null ? void 0 : details.text_tokens) != null) { const base = Math.floor(details.text_tokens / total); const remainder = details.text_tokens - base * (total - 1); result.textTokens = index === total - 1 ? remainder : base; } if (usage.input_tokens != null) { const base = Math.floor(usage.input_tokens / total); const remainder = usage.input_tokens - base * (total - 1); result.inputTokens = index === total - 1 ? remainder : base; } if (usage.output_tokens != null) { const base = Math.floor(usage.output_tokens / total); const remainder = usage.output_tokens - base * (total - 1); result.outputTokens = index === total - 1 ? remainder : base; } return result; } var openaiTranscriptionResponseSchema = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ text: v4.z.string(), language: v4.z.string().nullish(), duration: v4.z.number().nullish(), words: v4.z.array( v4.z.object({ word: v4.z.string(), start: v4.z.number(), end: v4.z.number() }) ).nullish(), segments: v4.z.array( v4.z.object({ id: v4.z.number(), seek: v4.z.number(), start: v4.z.number(), end: v4.z.number(), text: v4.z.string(), tokens: v4.z.array(v4.z.number()), temperature: v4.z.number(), avg_logprob: v4.z.number(), compression_ratio: v4.z.number(), no_speech_prob: v4.z.number() }) ).nullish() }) ) ); var openAITranscriptionProviderOptions = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ /** * Additional information to include in the transcription response. */ include: v4.z.array(v4.z.string()).optional(), /** * The language of the input audio in ISO-639-1 format. */ language: v4.z.string().optional(), /** * An optional text to guide the model's style or continue a previous audio segment. */ prompt: v4.z.string().optional(), /** * The sampling temperature, between 0 and 1. * @default 0 */ temperature: v4.z.number().min(0).max(1).default(0).optional(), /** * The timestamp granularities to populate for this transcription. * @default ['segment'] */ timestampGranularities: v4.z.array(v4.z.enum(["word", "segment"])).default(["segment"]).optional() }) ) ); var languageMap = { afrikaans: "af", arabic: "ar", armenian: "hy", azerbaijani: "az", belarusian: "be", bosnian: "bs", bulgarian: "bg", catalan: "ca", chinese: "zh", croatian: "hr", czech: "cs", danish: "da", dutch: "nl", english: "en", estonian: "et", finnish: "fi", french: "fr", galician: "gl", german: "de", greek: "el", hebrew: "he", hindi: "hi", hungarian: "hu", icelandic: "is", indonesian: "id", italian: "it", japanese: "ja", kannada: "kn", kazakh: "kk", korean: "ko", latvian: "lv", lithuanian: "lt", macedonian: "mk", malay: "ms", marathi: "mr", maori: "mi", nepali: "ne", norwegian: "no", persian: "fa", polish: "pl", portuguese: "pt", romanian: "ro", russian: "ru", serbian: "sr", slovak: "sk", slovenian: "sl", spanish: "es", swahili: "sw", swedish: "sv", tagalog: "tl", tamil: "ta", thai: "th", turkish: "tr", ukrainian: "uk", urdu: "ur", vietnamese: "vi", welsh: "cy" }; var OpenAITranscriptionModel = class { constructor(modelId, config) { this.modelId = modelId; this.config = config; this.specificationVersion = "v2"; } get provider() { return this.config.provider; } async getArgs({ audio, mediaType, providerOptions }) { const warnings = []; const openAIOptions = await chunkOCS2GTEN_cjs.parseProviderOptions({ provider: "openai", providerOptions, schema: openAITranscriptionProviderOptions }); const formData = new FormData(); const blob = audio instanceof Uint8Array ? new Blob([audio]) : new Blob([chunkOCS2GTEN_cjs.convertBase64ToUint8Array(audio)]); formData.append("model", this.modelId); const fileExtension = chunkOCS2GTEN_cjs.mediaTypeToExtension(mediaType); formData.append( "file", new File([blob], "audio", { type: mediaType }), `audio.${fileExtension}` ); if (openAIOptions) { const transcriptionModelOptions = { include: openAIOptions.include, language: openAIOptions.language, prompt: openAIOptions.prompt, // https://platform.openai.com/docs/api-reference/audio/createTranscription#audio_createtranscription-response_format // prefer verbose_json to get segments for models that support it response_format: [ "gpt-4o-transcribe", "gpt-4o-mini-transcribe" ].includes(this.modelId) ? "json" : "verbose_json", temperature: openAIOptions.temperature, timestamp_granularities: openAIOptions.timestampGranularities }; for (const [key, value] of Object.entries(transcriptionModelOptions)) { if (value != null) { if (Array.isArray(value)) { for (const item of value) { formData.append(`${key}[]`, String(item)); } } else { formData.append(key, String(value)); } } } } return { formData, warnings }; } async doGenerate(options) { var _a, _b, _c, _d, _e, _f, _g, _h; const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date(); const { formData, warnings } = await this.getArgs(options); const { value: response, responseHeaders, rawValue: rawResponse } = await chunkOCS2GTEN_cjs.postFormDataToApi({ url: this.config.url({ path: "/audio/transcriptions", modelId: this.modelId }), headers: chunkOCS2GTEN_cjs.combineHeaders(this.config.headers(), options.headers), formData, failedResponseHandler: openaiFailedResponseHandler, successfulResponseHandler: chunkOCS2GTEN_cjs.createJsonResponseHandler( openaiTranscriptionResponseSchema ), abortSignal: options.abortSignal, fetch: this.config.fetch }); const language = response.language != null && response.language in languageMap ? languageMap[response.language] : void 0; return { text: response.text, segments: (_g = (_f = (_d = response.segments) == null ? void 0 : _d.map((segment) => ({ text: segment.text, startSecond: segment.start, endSecond: segment.end }))) != null ? _f : (_e = response.words) == null ? void 0 : _e.map((word) => ({ text: word.word, startSecond: word.start, endSecond: word.end }))) != null ? _g : [], language, durationInSeconds: (_h = response.duration) != null ? _h : void 0, warnings, response: { timestamp: currentDate, modelId: this.modelId, headers: responseHeaders, body: rawResponse } }; } }; var openaiSpeechProviderOptionsSchema = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ instructions: v4.z.string().nullish(), speed: v4.z.number().min(0.25).max(4).default(1).nullish() }) ) ); var OpenAISpeechModel = class { constructor(modelId, config) { this.modelId = modelId; this.config = config; this.specificationVersion = "v2"; } get provider() { return this.config.provider; } async getArgs({ text, voice = "alloy", outputFormat = "mp3", speed, instructions, language, providerOptions }) { const warnings = []; const openAIOptions = await chunkOCS2GTEN_cjs.parseProviderOptions({ provider: "openai", providerOptions, schema: openaiSpeechProviderOptionsSchema }); const requestBody = { model: this.modelId, input: text, voice, response_format: "mp3", speed, instructions }; if (outputFormat) { if (["mp3", "opus", "aac", "flac", "wav", "pcm"].includes(outputFormat)) { requestBody.response_format = outputFormat; } else { warnings.push({ type: "unsupported-setting", setting: "outputFormat", details: `Unsupported output format: ${outputFormat}. Using mp3 instead.` }); } } if (openAIOptions) { const speechModelOptions = {}; for (const key in speechModelOptions) { const value = speechModelOptions[key]; if (value !== void 0) { requestBody[key] = value; } } } if (language) { warnings.push({ type: "unsupported-setting", setting: "language", details: `OpenAI speech models do not support language selection. Language parameter "${language}" was ignored.` }); } return { requestBody, warnings }; } async doGenerate(options) { var _a, _b, _c; const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date(); const { requestBody, warnings } = await this.getArgs(options); const { value: audio, responseHeaders, rawValue: rawResponse } = await chunkOCS2GTEN_cjs.postJsonToApi({ url: this.config.url({ path: "/audio/speech", modelId: this.modelId }), headers: chunkOCS2GTEN_cjs.combineHeaders(this.config.headers(), options.headers), body: requestBody, failedResponseHandler: openaiFailedResponseHandler, successfulResponseHandler: chunkOCS2GTEN_cjs.createBinaryResponseHandler(), abortSignal: options.abortSignal, fetch: this.config.fetch }); return { audio, warnings, request: { body: JSON.stringify(requestBody) }, response: { timestamp: currentDate, modelId: this.modelId, headers: responseHeaders, body: rawResponse } }; } }; var localShellInputSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ action: v4.z.object({ type: v4.z.literal("exec"), command: v4.z.array(v4.z.string()), timeoutMs: v4.z.number().optional(), user: v4.z.string().optional(), workingDirectory: v4.z.string().optional(), env: v4.z.record(v4.z.string(), v4.z.string()).optional() }) }) ) ); var localShellOutputSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema(v4.z.object({ output: v4.z.string() })) ); chunkOCS2GTEN_cjs.createProviderDefinedToolFactoryWithOutputSchema({ id: "openai.local_shell", name: "local_shell", inputSchema: localShellInputSchema, outputSchema: localShellOutputSchema }); function isFileId(data, prefixes) { if (!prefixes) return false; return prefixes.some((prefix) => data.startsWith(prefix)); } async function convertToOpenAIResponsesInput({ prompt, systemMessageMode, fileIdPrefixes, store, hasLocalShellTool = false }) { var _a, _b, _c, _d, _e, _f; let input = []; const warnings = []; for (const { role, content } of prompt) { switch (role) { case "system": { switch (systemMessageMode) { case "system": { input.push({ role: "system", content }); break; } case "developer": { input.push({ role: "developer", content }); break; } case "remove": { warnings.push({ type: "other", message: "system messages are removed for this model" }); break; } default: { const _exhaustiveCheck = systemMessageMode; throw new Error( `Unsupported system message mode: ${_exhaustiveCheck}` ); } } break; } case "user": { input.push({ role: "user", content: content.map((part, index) => { var _a2, _b2, _c2; switch (part.type) { case "text": { return { type: "input_text", text: part.text }; } case "file": { if (part.mediaType.startsWith("image/")) { const mediaType = part.mediaType === "image/*" ? "image/jpeg" : part.mediaType; return { type: "input_image", ...part.data instanceof URL ? { image_url: part.data.toString() } : typeof part.data === "string" && isFileId(part.data, fileIdPrefixes) ? { file_id: part.data } : { image_url: `data:${mediaType};base64,${chunkOCS2GTEN_cjs.convertToBase64(part.data)}` }, detail: (_b2 = (_a2 = part.providerOptions) == null ? void 0 : _a2.openai) == null ? void 0 : _b2.imageDetail }; } else if (part.mediaType === "application/pdf") { if (part.data instanceof URL) { return { type: "input_file", file_url: part.data.toString() }; } return { type: "input_file", ...typeof part.data === "string" && isFileId(part.data, fileIdPrefixes) ? { file_id: part.data } : { filename: (_c2 = part.filename) != null ? _c2 : `part-${index}.pdf`, file_data: `data:application/pdf;base64,${chunkOCS2GTEN_cjs.convertToBase64(part.data)}` } }; } else { throw new chunkOCS2GTEN_cjs.UnsupportedFunctionalityError({ functionality: `file part media type ${part.mediaType}` }); } } } }) }); break; } case "assistant": { const reasoningMessages = {}; for (const part of content) { switch (part.type) { case "text": { const id = (_b = (_a = part.providerOptions) == null ? void 0 : _a.openai) == null ? void 0 : _b.itemId; const phase = (_d = (_c = part.providerOptions) == null ? void 0 : _c.openai) == null ? void 0 : _d.phase; if (store && id != null) { input.push({ type: "item_reference", id }); break; } input.push({ role: "assistant", content: [{ type: "output_text", text: part.text }], id, ...phase != null && { phase } }); break; } case "tool-call": { if (part.providerExecuted) { break; } const id = (_f = (_e = part.providerOptions) == null ? void 0 : _e.openai) == null ? void 0 : _f.itemId; if (store && id != null) { input.push({ type: "item_reference", id }); break; } if (hasLocalShellTool && part.toolName === "local_shell") { const parsedInput = await chunkOCS2GTEN_cjs.validateTypes({ value: part.input, schema: localShellInputSchema }); input.push({ type: "local_shell_call", call_id: part.toolCallId, id, action: { type: "exec", command: parsedInput.action.command, timeout_ms: parsedInput.action.timeoutMs, user: parsedInput.action.user, working_directory: parsedInput.action.workingDirectory, env: parsedInput.action.env } }); break; } input.push({ type: "function_call", call_id: part.toolCallId, name: part.toolName, arguments: JSON.stringify(part.input), id }); break; } // assistant tool result parts are from provider-executed tools: case "tool-result": { if (store) { input.push({ type: "item_reference", id: part.toolCallId }); } else { warnings.push({ type: "other", message: `Results for OpenAI tool ${part.toolName} are not sent to the API when store is false` }); } break; } case "reasoning": { const providerOptions = await chunkOCS2GTEN_cjs.parseProviderOptions({ provider: "openai", providerOptions: part.providerOptions, schema: openaiResponsesReasoningProviderOptionsSchema }); const reasoningId = providerOptions == null ? void 0 : providerOptions.itemId; if (reasoningId != null) { const reasoningMessage = reasoningMessages[reasoningId]; if (store) { if (reasoningMessage === void 0) { input.push({ type: "item_reference", id: reasoningId }); reasoningMessages[reasoningId] = { type: "reasoning", id: reasoningId, summary: [] }; } } else { const summaryParts = []; if (part.text.length > 0) { summaryParts.push({ type: "summary_text", text: part.text }); } else if (reasoningMessage !== void 0) { warnings.push({ type: "other", message: `Cannot append empty reasoning part to existing reasoning sequence. Skipping reasoning part: ${JSON.stringify(part)}.` }); } if (reasoningMessage === void 0) { reasoningMessages[reasoningId] = { type: "reasoning", id: reasoningId, encrypted_content: providerOptions == null ? void 0 : providerOptions.reasoningEncryptedContent, summary: summaryParts }; input.push(reasoningMessages[reasoningId]); } else { reasoningMessage.summary.push(...summaryParts); if ((providerOptions == null ? void 0 : providerOptions.reasoningEncryptedContent) != null) { reasoningMessage.encrypted_content = providerOptions.reasoningEncryptedContent; } } } } else { warnings.push({ type: "other", message: `Non-OpenAI reasoning parts are not supported. Skipping reasoning part: ${JSON.stringify(part)}.` }); } break; } } } break; } case "tool": { for (const part of content) { const output = part.output; if (hasLocalShellTool && part.toolName === "local_shell" && output.type === "json") { const parsedOutput = await chunkOCS2GTEN_cjs.validateTypes({ value: output.value, schema: localShellOutputSchema }); input.push({ type: "local_shell_call_output", call_id: part.toolCallId, output: parsedOutput.output }); break; } let contentValue; switch (output.type) { case "text": case "error-text": contentValue = output.value; break; case "json": case "error-json": contentValue = JSON.stringify(output.value); break; case "content": contentValue = output.value.map((item) => { switch (item.type) { case "text": { return { type: "input_text", text: item.text }; } case "media": { return item.mediaType.startsWith("image/") ? { type: "input_image", image_url: `data:${item.mediaType};base64,${item.data}` } : { type: "input_file", filename: "data", file_data: `data:${item.mediaType};base64,${item.data}` }; } } }); break; } input.push({ type: "function_call_output", call_id: part.toolCallId, output: contentValue }); } break; } default: { const _exhaustiveCheck = role; throw new Error(`Unsupported role: ${_exhaustiveCheck}`); } } } if (!store && input.some( (item) => "type" in item && item.type === "reasoning" && item.encrypted_content == null )) { warnings.push({ type: "other", message: "Reasoning parts without encrypted content are not supported when store is false. Skipping reasoning parts." }); input = input.filter( (item) => !("type" in item) || item.type !== "reasoning" || item.encrypted_content != null ); } return { input, warnings }; } var openaiResponsesReasoningProviderOptionsSchema = v4.z.object({ itemId: v4.z.string().nullish(), reasoningEncryptedContent: v4.z.string().nullish() }); function mapOpenAIResponseFinishReason({ finishReason, hasFunctionCall }) { switch (finishReason) { case void 0: case null: return hasFunctionCall ? "tool-calls" : "stop"; case "max_output_tokens": return "length"; case "content_filter": return "content-filter"; default: return hasFunctionCall ? "tool-calls" : "unknown"; } } var openaiResponsesChunkSchema = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.union([ v4.z.object({ type: v4.z.literal("response.output_text.delta"), item_id: v4.z.string(), delta: v4.z.string(), logprobs: v4.z.array( v4.z.object({ token: v4.z.string(), logprob: v4.z.number(), top_logprobs: v4.z.array( v4.z.object({ token: v4.z.string(), logprob: v4.z.number() }) ) }) ).nullish() }), v4.z.object({ type: v4.z.enum(["response.completed", "response.incomplete"]), response: v4.z.object({ incomplete_details: v4.z.object({ reason: v4.z.string() }).nullish(), usage: v4.z.object({ input_tokens: v4.z.number(), input_tokens_details: v4.z.object({ cached_tokens: v4.z.number().nullish() }).nullish(), output_tokens: v4.z.number(), output_tokens_details: v4.z.object({ reasoning_tokens: v4.z.number().nullish() }).nullish() }), service_tier: v4.z.string().nullish() }) }), v4.z.object({ type: v4.z.literal("response.created"), response: v4.z.object({ id: v4.z.string(), created_at: v4.z.number(), model: v4.z.string(), service_tier: v4.z.string().nullish() }) }), v4.z.object({ type: v4.z.literal("response.output_item.added"), output_index: v4.z.number(), item: v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("message"), id: v4.z.string(), phase: v4.z.enum(["commentary", "final_answer"]).nullish() }), v4.z.object({ type: v4.z.literal("reasoning"), id: v4.z.string(), encrypted_content: v4.z.string().nullish() }), v4.z.object({ type: v4.z.literal("function_call"), id: v4.z.string(), call_id: v4.z.string(), name: v4.z.string(), arguments: v4.z.string() }), v4.z.object({ type: v4.z.literal("web_search_call"), id: v4.z.string(), status: v4.z.string() }), v4.z.object({ type: v4.z.literal("computer_call"), id: v4.z.string(), status: v4.z.string() }), v4.z.object({ type: v4.z.literal("file_search_call"), id: v4.z.string() }), v4.z.object({ type: v4.z.literal("image_generation_call"), id: v4.z.string() }), v4.z.object({ type: v4.z.literal("code_interpreter_call"), id: v4.z.string(), container_id: v4.z.string(), code: v4.z.string().nullable(), outputs: v4.z.array( v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("logs"), logs: v4.z.string() }), v4.z.object({ type: v4.z.literal("image"), url: v4.z.string() }) ]) ).nullable(), status: v4.z.string() }) ]) }), v4.z.object({ type: v4.z.literal("response.output_item.done"), output_index: v4.z.number(), item: v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("message"), id: v4.z.string(), phase: v4.z.enum(["commentary", "final_answer"]).nullish() }), v4.z.object({ type: v4.z.literal("reasoning"), id: v4.z.string(), encrypted_content: v4.z.string().nullish() }), v4.z.object({ type: v4.z.literal("function_call"), id: v4.z.string(), call_id: v4.z.string(), name: v4.z.string(), arguments: v4.z.string(), status: v4.z.literal("completed") }), v4.z.object({ type: v4.z.literal("code_interpreter_call"), id: v4.z.string(), code: v4.z.string().nullable(), container_id: v4.z.string(), outputs: v4.z.array( v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("logs"), logs: v4.z.string() }), v4.z.object({ type: v4.z.literal("image"), url: v4.z.string() }) ]) ).nullable() }), v4.z.object({ type: v4.z.literal("image_generation_call"), id: v4.z.string(), result: v4.z.string() }), v4.z.object({ type: v4.z.literal("web_search_call"), id: v4.z.string(), status: v4.z.string(), action: v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("search"), query: v4.z.string().nullish(), sources: v4.z.array( v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("url"), url: v4.z.string() }), v4.z.object({ type: v4.z.literal("api"), name: v4.z.string() }) ]) ).nullish() }), v4.z.object({ type: v4.z.literal("open_page"), url: v4.z.string().nullish() }), v4.z.object({ type: v4.z.literal("find_in_page"), url: v4.z.string().nullish(), pattern: v4.z.string().nullish() }) ]).nullish() }), v4.z.object({ type: v4.z.literal("file_search_call"), id: v4.z.string(), queries: v4.z.array(v4.z.string()), results: v4.z.array( v4.z.object({ attributes: v4.z.record(v4.z.string(), v4.z.unknown()), file_id: v4.z.string(), filename: v4.z.string(), score: v4.z.number(), text: v4.z.string() }) ).nullish() }), v4.z.object({ type: v4.z.literal("local_shell_call"), id: v4.z.string(), call_id: v4.z.string(), action: v4.z.object({ type: v4.z.literal("exec"), command: v4.z.array(v4.z.string()), timeout_ms: v4.z.number().optional(), user: v4.z.string().optional(), working_directory: v4.z.string().optional(), env: v4.z.record(v4.z.string(), v4.z.string()).optional() }) }), v4.z.object({ type: v4.z.literal("computer_call"), id: v4.z.string(), status: v4.z.literal("completed") }) ]) }), v4.z.object({ type: v4.z.literal("response.function_call_arguments.delta"), item_id: v4.z.string(), output_index: v4.z.number(), delta: v4.z.string() }), v4.z.object({ type: v4.z.literal("response.image_generation_call.partial_image"), item_id: v4.z.string(), output_index: v4.z.number(), partial_image_b64: v4.z.string() }), v4.z.object({ type: v4.z.literal("response.code_interpreter_call_code.delta"), item_id: v4.z.string(), output_index: v4.z.number(), delta: v4.z.string() }), v4.z.object({ type: v4.z.literal("response.code_interpreter_call_code.done"), item_id: v4.z.string(), output_index: v4.z.number(), code: v4.z.string() }), v4.z.object({ type: v4.z.literal("response.output_text.annotation.added"), annotation: v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("url_citation"), start_index: v4.z.number(), end_index: v4.z.number(), url: v4.z.string(), title: v4.z.string() }), v4.z.object({ type: v4.z.literal("file_citation"), file_id: v4.z.string(), filename: v4.z.string().nullish(), index: v4.z.number().nullish(), start_index: v4.z.number().nullish(), end_index: v4.z.number().nullish(), quote: v4.z.string().nullish() }) ]) }), v4.z.object({ type: v4.z.literal("response.reasoning_summary_part.added"), item_id: v4.z.string(), summary_index: v4.z.number() }), v4.z.object({ type: v4.z.literal("response.reasoning_summary_text.delta"), item_id: v4.z.string(), summary_index: v4.z.number(), delta: v4.z.string() }), v4.z.object({ type: v4.z.literal("response.reasoning_summary_part.done"), item_id: v4.z.string(), summary_index: v4.z.number() }), v4.z.object({ type: v4.z.literal("error"), sequence_number: v4.z.number(), error: v4.z.object({ type: v4.z.string(), code: v4.z.string(), message: v4.z.string(), param: v4.z.string().nullish() }) }), v4.z.object({ type: v4.z.string() }).loose().transform((value) => ({ type: "unknown_chunk", message: value.type })) // fallback for unknown chunks ]) ) ); var openaiResponsesResponseSchema = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ id: v4.z.string().optional(), created_at: v4.z.number().optional(), error: v4.z.object({ message: v4.z.string(), type: v4.z.string(), param: v4.z.string().nullish(), code: v4.z.string() }).nullish(), model: v4.z.string().optional(), output: v4.z.array( v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("message"), role: v4.z.literal("assistant"), id: v4.z.string(), phase: v4.z.enum(["commentary", "final_answer"]).nullish(), content: v4.z.array( v4.z.object({ type: v4.z.literal("output_text"), text: v4.z.string(), logprobs: v4.z.array( v4.z.object({ token: v4.z.string(), logprob: v4.z.number(), top_logprobs: v4.z.array( v4.z.object({ token: v4.z.string(), logprob: v4.z.number() }) ) }) ).nullish(), annotations: v4.z.array( v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("url_citation"), start_index: v4.z.number(), end_index: v4.z.number(), url: v4.z.string(), title: v4.z.string() }), v4.z.object({ type: v4.z.literal("file_citation"), file_id: v4.z.string(), filename: v4.z.string().nullish(), index: v4.z.number().nullish(), start_index: v4.z.number().nullish(), end_index: v4.z.number().nullish(), quote: v4.z.string().nullish() }), v4.z.object({ type: v4.z.literal("container_file_citation"), container_id: v4.z.string(), file_id: v4.z.string(), filename: v4.z.string().nullish(), start_index: v4.z.number().nullish(), end_index: v4.z.number().nullish(), index: v4.z.number().nullish() }), v4.z.object({ type: v4.z.literal("file_path"), file_id: v4.z.string(), index: v4.z.number().nullish() }) ]) ) }) ) }), v4.z.object({ type: v4.z.literal("web_search_call"), id: v4.z.string(), status: v4.z.string(), action: v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("search"), query: v4.z.string().nullish(), sources: v4.z.array( v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("url"), url: v4.z.string() }), v4.z.object({ type: v4.z.literal("api"), name: v4.z.string() }) ]) ).nullish() }), v4.z.object({ type: v4.z.literal("open_page"), url: v4.z.string().nullish() }), v4.z.object({ type: v4.z.literal("find_in_page"), url: v4.z.string().nullish(), pattern: v4.z.string().nullish() }) ]).nullish() }), v4.z.object({ type: v4.z.literal("file_search_call"), id: v4.z.string(), queries: v4.z.array(v4.z.string()), results: v4.z.array( v4.z.object({ attributes: v4.z.record( v4.z.string(), v4.z.union([v4.z.string(), v4.z.number(), v4.z.boolean()]) ), file_id: v4.z.string(), filename: v4.z.string(), score: v4.z.number(), text: v4.z.string() }) ).nullish() }), v4.z.object({ type: v4.z.literal("code_interpreter_call"), id: v4.z.string(), code: v4.z.string().nullable(), container_id: v4.z.string(), outputs: v4.z.array( v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("logs"), logs: v4.z.string() }), v4.z.object({ type: v4.z.literal("image"), url: v4.z.string() }) ]) ).nullable() }), v4.z.object({ type: v4.z.literal("image_generation_call"), id: v4.z.string(), result: v4.z.string() }), v4.z.object({ type: v4.z.literal("local_shell_call"), id: v4.z.string(), call_id: v4.z.string(), action: v4.z.object({ type: v4.z.literal("exec"), command: v4.z.array(v4.z.string()), timeout_ms: v4.z.number().optional(), user: v4.z.string().optional(), working_directory: v4.z.string().optional(), env: v4.z.record(v4.z.string(), v4.z.string()).optional() }) }), v4.z.object({ type: v4.z.literal("function_call"), call_id: v4.z.string(), name: v4.z.string(), arguments: v4.z.string(), id: v4.z.string() }), v4.z.object({ type: v4.z.literal("computer_call"), id: v4.z.string(), status: v4.z.string().optional() }), v4.z.object({ type: v4.z.literal("reasoning"), id: v4.z.string(), encrypted_content: v4.z.string().nullish(), summary: v4.z.array( v4.z.object({ type: v4.z.literal("summary_text"), text: v4.z.string() }) ) }) ]) ).optional(), service_tier: v4.z.string().nullish(), incomplete_details: v4.z.object({ reason: v4.z.string() }).nullish(), usage: v4.z.object({ input_tokens: v4.z.number(), input_tokens_details: v4.z.object({ cached_tokens: v4.z.number().nullish() }).nullish(), output_tokens: v4.z.number(), output_tokens_details: v4.z.object({ reasoning_tokens: v4.z.number().nullish() }).nullish() }).optional() }) ) ); var TOP_LOGPROBS_MAX = 20; var openaiResponsesProviderOptionsSchema = chunkOCS2GTEN_cjs.lazyValidator( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ conversation: v4.z.string().nullish(), include: v4.z.array( v4.z.enum([ "reasoning.encrypted_content", // handled internally by default, only needed for unknown reasoning models "file_search_call.results", "message.output_text.logprobs" ]) ).nullish(), instructions: v4.z.string().nullish(), /** * Return the log probabilities of the tokens. * * Setting to true will return the log probabilities of the tokens that * were generated. * * Setting to a number will return the log probabilities of the top n * tokens that were generated. * * @see https://platform.openai.com/docs/api-reference/responses/create * @see https://cookbook.openai.com/examples/using_logprobs */ logprobs: v4.z.union([v4.z.boolean(), v4.z.number().min(1).max(TOP_LOGPROBS_MAX)]).optional(), /** * The maximum number of total calls to built-in tools that can be processed in a response. * This maximum number applies across all built-in tool calls, not per individual tool. * Any further attempts to call a tool by the model will be ignored. */ maxToolCalls: v4.z.number().nullish(), metadata: v4.z.any().nullish(), parallelToolCalls: v4.z.boolean().nullish(), previousResponseId: v4.z.string().nullish(), promptCacheKey: v4.z.string().nullish(), /** * The retention policy for the prompt cache. * - 'in_memory': Default. Standard prompt caching behavior. * - '24h': Extended prompt caching that keeps cached prefixes active for up to 24 hours. * Currently only available for 5.1 series models. * * @default 'in_memory' */ promptCacheRetention: v4.z.enum(["in_memory", "24h"]).nullish(), /** * Reasoning effort for reasoning models. Defaults to `medium`. If you use * `providerOptions` to set the `reasoningEffort` option, this model setting will be ignored. * Valid values: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' * * The 'none' type for `reasoningEffort` is only available for OpenAI's GPT-5.1 * models. Also, the 'xhigh' type for `reasoningEffort` is only available for * OpenAI's GPT-5.1-Codex-Max model. Setting `reasoningEffort` to 'none' or 'xhigh' with unsupported models will result in * an error. */ reasoningEffort: v4.z.string().nullish(), reasoningSummary: v4.z.string().nullish(), safetyIdentifier: v4.z.string().nullish(), serviceTier: v4.z.enum(["auto", "flex", "priority", "default"]).nullish(), store: v4.z.boolean().nullish(), strictJsonSchema: v4.z.boolean().nullish(), textVerbosity: v4.z.enum(["low", "medium", "high"]).nullish(), truncation: v4.z.enum(["auto", "disabled"]).nullish(), user: v4.z.string().nullish() }) ) ); var codeInterpreterInputSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ code: v4.z.string().nullish(), containerId: v4.z.string() }) ) ); var codeInterpreterOutputSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ outputs: v4.z.array( v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("logs"), logs: v4.z.string() }), v4.z.object({ type: v4.z.literal("image"), url: v4.z.string() }) ]) ).nullish() }) ) ); var codeInterpreterArgsSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ container: v4.z.union([ v4.z.string(), v4.z.object({ fileIds: v4.z.array(v4.z.string()).optional() }) ]).optional() }) ) ); var codeInterpreterToolFactory = chunkOCS2GTEN_cjs.createProviderDefinedToolFactoryWithOutputSchema({ id: "openai.code_interpreter", name: "code_interpreter", inputSchema: codeInterpreterInputSchema, outputSchema: codeInterpreterOutputSchema }); var codeInterpreter = (args = {}) => { return codeInterpreterToolFactory(args); }; var comparisonFilterSchema = v4.z.object({ key: v4.z.string(), type: v4.z.enum(["eq", "ne", "gt", "gte", "lt", "lte", "in", "nin"]), value: v4.z.union([v4.z.string(), v4.z.number(), v4.z.boolean(), v4.z.array(v4.z.string())]) }); var compoundFilterSchema = v4.z.object({ type: v4.z.enum(["and", "or"]), filters: v4.z.array( v4.z.union([comparisonFilterSchema, v4.z.lazy(() => compoundFilterSchema)]) ) }); var fileSearchArgsSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ vectorStoreIds: v4.z.array(v4.z.string()), maxNumResults: v4.z.number().optional(), ranking: v4.z.object({ ranker: v4.z.string().optional(), scoreThreshold: v4.z.number().optional() }).optional(), filters: v4.z.union([comparisonFilterSchema, compoundFilterSchema]).optional() }) ) ); var fileSearchOutputSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ queries: v4.z.array(v4.z.string()), results: v4.z.array( v4.z.object({ attributes: v4.z.record(v4.z.string(), v4.z.unknown()), fileId: v4.z.string(), filename: v4.z.string(), score: v4.z.number(), text: v4.z.string() }) ).nullable() }) ) ); var fileSearch = chunkOCS2GTEN_cjs.createProviderDefinedToolFactoryWithOutputSchema({ id: "openai.file_search", name: "file_search", inputSchema: v4.z.object({}), outputSchema: fileSearchOutputSchema }); var webSearchArgsSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ externalWebAccess: v4.z.boolean().optional(), filters: v4.z.object({ allowedDomains: v4.z.array(v4.z.string()).optional() }).optional(), searchContextSize: v4.z.enum(["low", "medium", "high"]).optional(), userLocation: v4.z.object({ type: v4.z.literal("approximate"), country: v4.z.string().optional(), city: v4.z.string().optional(), region: v4.z.string().optional(), timezone: v4.z.string().optional() }).optional() }) ) ); var webSearchInputSchema = chunkOCS2GTEN_cjs.lazySchema(() => chunkOCS2GTEN_cjs.zodSchema(v4.z.object({}))); var webSearchOutputSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ action: v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("search"), query: v4.z.string().optional() }), v4.z.object({ type: v4.z.literal("openPage"), url: v4.z.string().nullish() }), v4.z.object({ type: v4.z.literal("findInPage"), url: v4.z.string().nullish(), pattern: v4.z.string().nullish() }) ]).optional(), sources: v4.z.array( v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("url"), url: v4.z.string() }), v4.z.object({ type: v4.z.literal("api"), name: v4.z.string() }) ]) ).optional() }) ) ); chunkOCS2GTEN_cjs.createProviderDefinedToolFactoryWithOutputSchema({ id: "openai.web_search", name: "web_search", inputSchema: webSearchInputSchema, outputSchema: webSearchOutputSchema }); var webSearchPreviewArgsSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ searchContextSize: v4.z.enum(["low", "medium", "high"]).optional(), userLocation: v4.z.object({ type: v4.z.literal("approximate"), country: v4.z.string().optional(), city: v4.z.string().optional(), region: v4.z.string().optional(), timezone: v4.z.string().optional() }).optional() }) ) ); var webSearchPreviewInputSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema(v4.z.object({})) ); var webSearchPreviewOutputSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ action: v4.z.discriminatedUnion("type", [ v4.z.object({ type: v4.z.literal("search"), query: v4.z.string().optional() }), v4.z.object({ type: v4.z.literal("openPage"), url: v4.z.string().nullish() }), v4.z.object({ type: v4.z.literal("findInPage"), url: v4.z.string().nullish(), pattern: v4.z.string().nullish() }) ]).optional() }) ) ); var webSearchPreview = chunkOCS2GTEN_cjs.createProviderDefinedToolFactoryWithOutputSchema({ id: "openai.web_search_preview", name: "web_search_preview", inputSchema: webSearchPreviewInputSchema, outputSchema: webSearchPreviewOutputSchema }); var imageGenerationArgsSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema( v4.z.object({ background: v4.z.enum(["auto", "opaque", "transparent"]).optional(), inputFidelity: v4.z.enum(["low", "high"]).optional(), inputImageMask: v4.z.object({ fileId: v4.z.string().optional(), imageUrl: v4.z.string().optional() }).optional(), model: v4.z.string().optional(), moderation: v4.z.enum(["auto"]).optional(), outputCompression: v4.z.number().int().min(0).max(100).optional(), outputFormat: v4.z.enum(["png", "jpeg", "webp"]).optional(), partialImages: v4.z.number().int().min(0).max(3).optional(), quality: v4.z.enum(["auto", "low", "medium", "high"]).optional(), size: v4.z.enum(["1024x1024", "1024x1536", "1536x1024", "auto"]).optional() }).strict() ) ); var imageGenerationInputSchema = chunkOCS2GTEN_cjs.lazySchema(() => chunkOCS2GTEN_cjs.zodSchema(v4.z.object({}))); var imageGenerationOutputSchema = chunkOCS2GTEN_cjs.lazySchema( () => chunkOCS2GTEN_cjs.zodSchema(v4.z.object({ result: v4.z.string() })) ); var imageGenerationToolFactory = chunkOCS2GTEN_cjs.createProviderDefinedToolFactoryWithOutputSchema({ id: "openai.image_generation", name: "image_generation", inputSchema: imageGenerationInputSchema, outputSchema: imageGenerationOutputSchema }); var imageGeneration = (args = {}) => { return imageGenerationToolFactory(args); }; async function prepareResponsesTools({ tools, toolChoice, strictJsonSchema }) { tools = (tools == null ? void 0 : tools.length) ? tools : void 0; const toolWarnings = []; if (tools == null) { return { tools: void 0, toolChoice: void 0, toolWarnings }; } const openaiTools = []; for (const tool of tools) { switch (tool.type) { case "function": openaiTools.push({ type: "function", name: tool.name, description: tool.description, parameters: tool.inputSchema, strict: strictJsonSchema }); break; case "provider-defined": { switch (tool.id) { case "openai.file_search": { const args = await chunkOCS2GTEN_cjs.validateTypes({ value: tool.args, schema: fileSearchArgsSchema }); openaiTools.push({ type: "file_search", vector_store_ids: args.vectorStoreIds, max_num_results: args.maxNumResults, ranking_options: args.ranking ? { ranker: args.ranking.ranker, score_threshold: args.ranking.scoreThreshold } : void 0, filters: args.filters }); break; } case "openai.local_shell": { openaiTools.push({ type: "local_shell" }); break; } case "openai.web_search_preview": { const args = await chunkOCS2GTEN_cjs.validateTypes({ value: tool.args, schema: webSearchPreviewArgsSchema }); openaiTools.push({ type: "web_search_preview", search_context_size: args.searchContextSize, user_location: args.userLocation }); break; } case "openai.web_search": { const args = await chunkOCS2GTEN_cjs.validateTypes({ value: tool.args, schema: webSearchArgsSchema }); openaiTools.push({ type: "web_search", filters: args.filters != null ? { allowed_domains: args.filters.allowedDomains } : void 0, external_web_access: args.externalWebAccess, search_context_size: args.searchContextSize, user_location: args.userLocation }); break; } case "openai.code_interpreter": { const args = await chunkOCS2GTEN_cjs.validateTypes({ value: tool.args, schema: codeInterpreterArgsSchema }); openaiTools.push({ type: "code_interpreter", container: args.container == null ? { type: "auto", file_ids: void 0 } : typeof args.container === "string" ? args.container : { type: "auto", file_ids: args.container.fileIds } }); break; } case "openai.image_generation": { const args = await chunkOCS2GTEN_cjs.validateTypes({ value: tool.args, schema: imageGenerationArgsSchema }); openaiTools.push({ type: "image_generation", background: args.background, input_fidelity: args.inputFidelity, input_image_mask: args.inputImageMask ? { file_id: args.inputImageMask.fileId, image_url: args.inputImageMask.imageUrl } : void 0, model: args.model, size: args.size, quality: args.quality, moderation: args.moderation, output_format: args.outputFormat, output_compression: args.outputCompression }); break; } } break; } default: toolWarnings.push({ type: "unsupported-tool", tool }); break; } } if (toolChoice == null) { return { tools: openaiTools, toolChoice: void 0, toolWarnings }; } const type = toolChoice.type; switch (type) { case "auto": case "none": case "required": return { tools: openaiTools, toolChoice: type, toolWarnings }; case "tool": return { tools: openaiTools, toolChoice: toolChoice.toolName === "code_interpreter" || toolChoice.toolName === "file_search" || toolChoice.toolName === "image_generation" || toolChoice.toolName === "web_search_preview" || toolChoice.toolName === "web_search" ? { type: toolChoice.toolName } : { type: "function", name: toolChoice.toolName }, toolWarnings }; default: { const _exhaustiveCheck = type; throw new chunkOCS2GTEN_cjs.UnsupportedFunctionalityError({ functionality: `tool choice type: ${_exhaustiveCheck}` }); } } } var OpenAIResponsesLanguageModel = class { constructor(modelId, config) { this.specificationVersion = "v2"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/], "application/pdf": [/^https?:\/\/.*$/] }; this.modelId = modelId; this.config = config; } get provider() { return this.config.provider; } async getArgs({ maxOutputTokens, temperature, stopSequences, topP, topK, presencePenalty, frequencyPenalty, seed, prompt, providerOptions, tools, toolChoice, responseFormat }) { var _a, _b, _c, _d; const warnings = []; const modelCapabilities = getOpenAILanguageModelCapabilities(this.modelId); if (topK != null) { warnings.push({ type: "unsupported-setting", setting: "topK" }); } if (seed != null) { warnings.push({ type: "unsupported-setting", setting: "seed" }); } if (presencePenalty != null) { warnings.push({ type: "unsupported-setting", setting: "presencePenalty" }); } if (frequencyPenalty != null) { warnings.push({ type: "unsupported-setting", setting: "frequencyPenalty" }); } if (stopSequences != null) { warnings.push({ type: "unsupported-setting", setting: "stopSequences" }); } const openaiOptions = await chunkOCS2GTEN_cjs.parseProviderOptions({ provider: "openai", providerOptions, schema: openaiResponsesProviderOptionsSchema }); if ((openaiOptions == null ? void 0 : openaiOptions.conversation) && (openaiOptions == null ? void 0 : openaiOptions.previousResponseId)) { warnings.push({ type: "unsupported-setting", setting: "conversation", details: "conversation and previousResponseId cannot be used together" }); } const { input, warnings: inputWarnings } = await convertToOpenAIResponsesInput({ prompt, systemMessageMode: modelCapabilities.systemMessageMode, fileIdPrefixes: this.config.fileIdPrefixes, store: (_a = openaiOptions == null ? void 0 : openaiOptions.store) != null ? _a : true, hasLocalShellTool: hasOpenAITool("openai.local_shell") }); warnings.push(...inputWarnings); const strictJsonSchema = (_b = openaiOptions == null ? void 0 : openaiOptions.strictJsonSchema) != null ? _b : false; let include = openaiOptions == null ? void 0 : openaiOptions.include; function addInclude(key) { if (include == null) { include = [key]; } else if (!include.includes(key)) { include = [...include, key]; } } function hasOpenAITool(id) { return (tools == null ? void 0 : tools.find( (tool) => tool.type === "provider-defined" && tool.id === id )) != null; } const topLogprobs = typeof (openaiOptions == null ? void 0 : openaiOptions.logprobs) === "number" ? openaiOptions == null ? void 0 : openaiOptions.logprobs : (openaiOptions == null ? void 0 : openaiOptions.logprobs) === true ? TOP_LOGPROBS_MAX : void 0; if (topLogprobs) { addInclude("message.output_text.logprobs"); } const webSearchToolName = (_c = tools == null ? void 0 : tools.find( (tool) => tool.type === "provider-defined" && (tool.id === "openai.web_search" || tool.id === "openai.web_search_preview") )) == null ? void 0 : _c.name; if (webSearchToolName) { addInclude("web_search_call.action.sources"); } if (hasOpenAITool("openai.code_interpreter")) { addInclude("code_interpreter_call.outputs"); } const store = openaiOptions == null ? void 0 : openaiOptions.store; if (store === false && modelCapabilities.isReasoningModel) { addInclude("reasoning.encrypted_content"); } const baseArgs = { model: this.modelId, input, temperature, top_p: topP, max_output_tokens: maxOutputTokens, ...((responseFormat == null ? void 0 : responseFormat.type) === "json" || (openaiOptions == null ? void 0 : openaiOptions.textVerbosity)) && { text: { ...(responseFormat == null ? void 0 : responseFormat.type) === "json" && { format: responseFormat.schema != null ? { type: "json_schema", strict: strictJsonSchema, name: (_d = responseFormat.name) != null ? _d : "response", description: responseFormat.description, schema: responseFormat.schema } : { type: "json_object" } }, ...(openaiOptions == null ? void 0 : openaiOptions.textVerbosity) && { verbosity: openaiOptions.textVerbosity } } }, // provider options: conversation: openaiOptions == null ? void 0 : openaiOptions.conversation, max_tool_calls: openaiOptions == null ? void 0 : openaiOptions.maxToolCalls, metadata: openaiOptions == null ? void 0 : openaiOptions.metadata, parallel_tool_calls: openaiOptions == null ? void 0 : openaiOptions.parallelToolCalls, previous_response_id: openaiOptions == null ? void 0 : openaiOptions.previousResponseId, store, user: openaiOptions == null ? void 0 : openaiOptions.user, instructions: openaiOptions == null ? void 0 : openaiOptions.instructions, service_tier: openaiOptions == null ? void 0 : openaiOptions.serviceTier, include, prompt_cache_key: openaiOptions == null ? void 0 : openaiOptions.promptCacheKey, prompt_cache_retention: openaiOptions == null ? void 0 : openaiOptions.promptCacheRetention, safety_identifier: openaiOptions == null ? void 0 : openaiOptions.safetyIdentifier, top_logprobs: topLogprobs, truncation: openaiOptions == null ? void 0 : openaiOptions.truncation, // model-specific settings: ...modelCapabilities.isReasoningModel && ((openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) != null || (openaiOptions == null ? void 0 : openaiOptions.reasoningSummary) != null) && { reasoning: { ...(openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) != null && { effort: openaiOptions.reasoningEffort }, ...(openaiOptions == null ? void 0 : openaiOptions.reasoningSummary) != null && { summary: openaiOptions.reasoningSummary } } } }; if (modelCapabilities.isReasoningModel) { if (!((openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) === "none" && modelCapabilities.supportsNonReasoningParameters)) { if (baseArgs.temperature != null) { baseArgs.temperature = void 0; warnings.push({ type: "unsupported-setting", setting: "temperature", details: "temperature is not supported for reasoning models" }); } if (baseArgs.top_p != null) { baseArgs.top_p = void 0; warnings.push({ type: "unsupported-setting", setting: "topP", details: "topP is not supported for reasoning models" }); } } } else { if ((openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) != null) { warnings.push({ type: "unsupported-setting", setting: "reasoningEffort", details: "reasoningEffort is not supported for non-reasoning models" }); } if ((openaiOptions == null ? void 0 : openaiOptions.reasoningSummary) != null) { warnings.push({ type: "unsupported-setting", setting: "reasoningSummary", details: "reasoningSummary is not supported for non-reasoning models" }); } } if ((openaiOptions == null ? void 0 : openaiOptions.serviceTier) === "flex" && !modelCapabilities.supportsFlexProcessing) { warnings.push({ type: "unsupported-setting", setting: "serviceTier", details: "flex processing is only available for o3, o4-mini, and gpt-5 models" }); delete baseArgs.service_tier; } if ((openaiOptions == null ? void 0 : openaiOptions.serviceTier) === "priority" && !modelCapabilities.supportsPriorityProcessing) { warnings.push({ type: "unsupported-setting", setting: "serviceTier", details: "priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported" }); delete baseArgs.service_tier; } const { tools: openaiTools, toolChoice: openaiToolChoice, toolWarnings } = await prepareResponsesTools({ tools, toolChoice, strictJsonSchema }); return { webSearchToolName, args: { ...baseArgs, tools: openaiTools, tool_choice: openaiToolChoice }, warnings: [...warnings, ...toolWarnings], store }; } async doGenerate(options) { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B; const { args: body, warnings, webSearchToolName } = await this.getArgs(options); const url = this.config.url({ path: "/responses", modelId: this.modelId }); const providerKey = this.config.provider.replace(".responses", ""); const { responseHeaders, value: response, rawValue: rawResponse } = await chunkOCS2GTEN_cjs.postJsonToApi({ url, headers: chunkOCS2GTEN_cjs.combineHeaders(this.config.headers(), options.headers), body, failedResponseHandler: openaiFailedResponseHandler, successfulResponseHandler: chunkOCS2GTEN_cjs.createJsonResponseHandler( openaiResponsesResponseSchema ), abortSignal: options.abortSignal, fetch: this.config.fetch }); if (response.error) { throw new chunkOCS2GTEN_cjs.APICallError({ message: response.error.message, url, requestBodyValues: body, statusCode: 400, responseHeaders, responseBody: rawResponse, isRetryable: false }); } const content = []; const logprobs = []; let hasFunctionCall = false; for (const part of response.output) { switch (part.type) { case "reasoning": { if (part.summary.length === 0) { part.summary.push({ type: "summary_text", text: "" }); } for (const summary of part.summary) { content.push({ type: "reasoning", text: summary.text, providerMetadata: { [providerKey]: { itemId: part.id, reasoningEncryptedContent: (_a = part.encrypted_content) != null ? _a : null } } }); } break; } case "image_generation_call": { content.push({ type: "tool-call", toolCallId: part.id, toolName: "image_generation", input: "{}", providerExecuted: true }); content.push({ type: "tool-result", toolCallId: part.id, toolName: "image_generation", result: { result: part.result }, providerExecuted: true }); break; } case "local_shell_call": { content.push({ type: "tool-call", toolCallId: part.call_id, toolName: "local_shell", input: JSON.stringify({ action: part.action }), providerMetadata: { [providerKey]: { itemId: part.id } } }); break; } case "message": { for (const contentPart of part.content) { if (((_c = (_b = options.providerOptions) == null ? void 0 : _b.openai) == null ? void 0 : _c.logprobs) && contentPart.logprobs) { logprobs.push(contentPart.logprobs); } content.push({ type: "text", text: contentPart.text, providerMetadata: { [providerKey]: { itemId: part.id, ...part.phase != null && { phase: part.phase } } } }); for (const annotation of contentPart.annotations) { if (annotation.type === "url_citation") { content.push({ type: "source", sourceType: "url", id: (_f = (_e = (_d = this.config).generateId) == null ? void 0 : _e.call(_d)) != null ? _f : chunkOCS2GTEN_cjs.generateId(), url: annotation.url, title: annotation.title }); } else if (annotation.type === "file_citation") { content.push({ type: "source", sourceType: "document", id: (_i = (_h = (_g = this.config).generateId) == null ? void 0 : _h.call(_g)) != null ? _i : chunkOCS2GTEN_cjs.generateId(), mediaType: "text/plain", title: (_k = (_j = annotation.quote) != null ? _j : annotation.filename) != null ? _k : "Document", filename: (_l = annotation.filename) != null ? _l : annotation.file_id, ...annotation.file_id ? { providerMetadata: { [providerKey]: { fileId: annotation.file_id } } } : {} }); } else if (annotation.type === "container_file_citation") { content.push({ type: "source", sourceType: "document", id: (_o = (_n = (_m = this.config).generateId) == null ? void 0 : _n.call(_m)) != null ? _o : chunkOCS2GTEN_cjs.generateId(), mediaType: "text/plain", title: (_q = (_p = annotation.filename) != null ? _p : annotation.file_id) != null ? _q : "Document", filename: (_r = annotation.filename) != null ? _r : annotation.file_id, providerMetadata: { [providerKey]: { fileId: annotation.file_id, containerId: annotation.container_id, ...annotation.index != null ? { index: annotation.index } : {} } } }); } else if (annotation.type === "file_path") { content.push({ type: "source", sourceType: "document", id: (_u = (_t = (_s = this.config).generateId) == null ? void 0 : _t.call(_s)) != null ? _u : chunkOCS2GTEN_cjs.generateId(), mediaType: "application/octet-stream", title: annotation.file_id, filename: annotation.file_id, providerMetadata: { [providerKey]: { fileId: annotation.file_id, ...annotation.index != null ? { index: annotation.index } : {} } } }); } } } break; } case "function_call": { hasFunctionCall = true; content.push({ type: "tool-call", toolCallId: part.call_id, toolName: part.name, input: part.arguments, providerMetadata: { [providerKey]: { itemId: part.id } } }); break; } case "web_search_call": { content.push({ type: "tool-call", toolCallId: part.id, toolName: webSearchToolName != null ? webSearchToolName : "web_search", input: JSON.stringify({}), providerExecuted: true }); content.push({ type: "tool-result", toolCallId: part.id, toolName: webSearchToolName != null ? webSearchToolName : "web_search", result: mapWebSearchOutput(part.action), providerExecuted: true }); break; } case "computer_call": { content.push({ type: "tool-call", toolCallId: part.id, toolName: "computer_use", input: "", providerExecuted: true }); content.push({ type: "tool-result", toolCallId: part.id, toolName: "computer_use", result: { type: "computer_use_tool_result", status: part.status || "completed" }, providerExecuted: true }); break; } case "file_search_call": { content.push({ type: "tool-call", toolCallId: part.id, toolName: "file_search", input: "{}", providerExecuted: true }); content.push({ type: "tool-result", toolCallId: part.id, toolName: "file_search", result: { queries: part.queries, results: (_w = (_v = part.results) == null ? void 0 : _v.map((result) => ({ attributes: result.attributes, fileId: result.file_id, filename: result.filename, score: result.score, text: result.text }))) != null ? _w : null }, providerExecuted: true }); break; } case "code_interpreter_call": { content.push({ type: "tool-call", toolCallId: part.id, toolName: "code_interpreter", input: JSON.stringify({ code: part.code, containerId: part.container_id }), providerExecuted: true }); content.push({ type: "tool-result", toolCallId: part.id, toolName: "code_interpreter", result: { outputs: part.outputs }, providerExecuted: true }); break; } } } const providerMetadata = { [providerKey]: { ...response.id != null ? { responseId: response.id } : {} } }; if (logprobs.length > 0) { providerMetadata[providerKey].logprobs = logprobs; } if (typeof response.service_tier === "string") { providerMetadata[providerKey].serviceTier = response.service_tier; } const usage = response.usage; return { content, finishReason: mapOpenAIResponseFinishReason({ finishReason: (_x = response.incomplete_details) == null ? void 0 : _x.reason, hasFunctionCall }), usage: { inputTokens: usage.input_tokens, outputTokens: usage.output_tokens, totalTokens: usage.input_tokens + usage.output_tokens, reasoningTokens: (_z = (_y = usage.output_tokens_details) == null ? void 0 : _y.reasoning_tokens) != null ? _z : void 0, cachedInputTokens: (_B = (_A = usage.input_tokens_details) == null ? void 0 : _A.cached_tokens) != null ? _B : void 0 }, request: { body }, response: { id: response.id, timestamp: new Date(response.created_at * 1e3), modelId: response.model, headers: responseHeaders, body: rawResponse }, providerMetadata, warnings }; } async doStream(options) { const { args: body, warnings, webSearchToolName, store } = await this.getArgs(options); const { responseHeaders, value: response } = await chunkOCS2GTEN_cjs.postJsonToApi({ url: this.config.url({ path: "/responses", modelId: this.modelId }), headers: chunkOCS2GTEN_cjs.combineHeaders(this.config.headers(), options.headers), body: { ...body, stream: true }, failedResponseHandler: openaiFailedResponseHandler, successfulResponseHandler: chunkOCS2GTEN_cjs.createEventSourceResponseHandler( openaiResponsesChunkSchema ), abortSignal: options.abortSignal, fetch: this.config.fetch }); const self = this; const providerKey = this.config.provider.replace(".responses", ""); let finishReason = "unknown"; const usage = { inputTokens: void 0, outputTokens: void 0, totalTokens: void 0 }; const logprobs = []; let responseId = null; const ongoingToolCalls = {}; const ongoingAnnotations = []; let activeMessagePhase; let hasFunctionCall = false; const activeReasoning = {}; let serviceTier; return { stream: response.pipeThrough( new TransformStream({ start(controller) { controller.enqueue({ type: "stream-start", warnings }); }, transform(chunk, controller) { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x; if (options.includeRawChunks) { controller.enqueue({ type: "raw", rawValue: chunk.rawValue }); } if (!chunk.success) { finishReason = "error"; controller.enqueue({ type: "error", error: chunk.error }); return; } const value = chunk.value; if (isResponseOutputItemAddedChunk(value)) { if (value.item.type === "function_call") { ongoingToolCalls[value.output_index] = { toolName: value.item.name, toolCallId: value.item.call_id }; controller.enqueue({ type: "tool-input-start", id: value.item.call_id, toolName: value.item.name }); } else if (value.item.type === "web_search_call") { ongoingToolCalls[value.output_index] = { toolName: webSearchToolName != null ? webSearchToolName : "web_search", toolCallId: value.item.id }; controller.enqueue({ type: "tool-input-start", id: value.item.id, toolName: webSearchToolName != null ? webSearchToolName : "web_search", providerExecuted: true }); controller.enqueue({ type: "tool-input-end", id: value.item.id }); controller.enqueue({ type: "tool-call", toolCallId: value.item.id, toolName: webSearchToolName != null ? webSearchToolName : "web_search", input: JSON.stringify({}), providerExecuted: true }); } else if (value.item.type === "computer_call") { ongoingToolCalls[value.output_index] = { toolName: "computer_use", toolCallId: value.item.id }; controller.enqueue({ type: "tool-input-start", id: value.item.id, toolName: "computer_use", providerExecuted: true }); } else if (value.item.type === "code_interpreter_call") { ongoingToolCalls[value.output_index] = { toolName: "code_interpreter", toolCallId: value.item.id, codeInterpreter: { containerId: value.item.container_id } }; controller.enqueue({ type: "tool-input-start", id: value.item.id, toolName: "code_interpreter", providerExecuted: true }); controller.enqueue({ type: "tool-input-delta", id: value.item.id, delta: `{"containerId":"${value.item.container_id}","code":"` }); } else if (value.item.type === "file_search_call") { controller.enqueue({ type: "tool-call", toolCallId: value.item.id, toolName: "file_search", input: "{}", providerExecuted: true }); } else if (value.item.type === "image_generation_call") { controller.enqueue({ type: "tool-call", toolCallId: value.item.id, toolName: "image_generation", input: "{}", providerExecuted: true }); } else if (value.item.type === "message") { ongoingAnnotations.splice(0, ongoingAnnotations.length); activeMessagePhase = (_a = value.item.phase) != null ? _a : void 0; controller.enqueue({ type: "text-start", id: value.item.id, providerMetadata: { [providerKey]: { itemId: value.item.id, ...value.item.phase != null && { phase: value.item.phase } } } }); } else if (isResponseOutputItemAddedChunk(value) && value.item.type === "reasoning") { activeReasoning[value.item.id] = { encryptedContent: value.item.encrypted_content, summaryParts: { 0: "active" } }; controller.enqueue({ type: "reasoning-start", id: `${value.item.id}:0`, providerMetadata: { [providerKey]: { itemId: value.item.id, reasoningEncryptedContent: (_b = value.item.encrypted_content) != null ? _b : null } } }); } } else if (isResponseOutputItemDoneChunk(value)) { if (value.item.type === "message") { const phase = (_c = value.item.phase) != null ? _c : activeMessagePhase; activeMessagePhase = void 0; controller.enqueue({ type: "text-end", id: value.item.id, providerMetadata: { [providerKey]: { itemId: value.item.id, ...phase != null && { phase }, ...ongoingAnnotations.length > 0 && { annotations: ongoingAnnotations } } } }); } else if (value.item.type === "function_call") { ongoingToolCalls[value.output_index] = void 0; hasFunctionCall = true; controller.enqueue({ type: "tool-input-end", id: value.item.call_id }); controller.enqueue({ type: "tool-call", toolCallId: value.item.call_id, toolName: value.item.name, input: value.item.arguments, providerMetadata: { [providerKey]: { itemId: value.item.id } } }); } else if (value.item.type === "web_search_call") { ongoingToolCalls[value.output_index] = void 0; controller.enqueue({ type: "tool-result", toolCallId: value.item.id, toolName: webSearchToolName != null ? webSearchToolName : "web_search", result: mapWebSearchOutput(value.item.action), providerExecuted: true }); } else if (value.item.type === "computer_call") { ongoingToolCalls[value.output_index] = void 0; controller.enqueue({ type: "tool-input-end", id: value.item.id }); controller.enqueue({ type: "tool-call", toolCallId: value.item.id, toolName: "computer_use", input: "", providerExecuted: true }); controller.enqueue({ type: "tool-result", toolCallId: value.item.id, toolName: "computer_use", result: { type: "computer_use_tool_result", status: value.item.status || "completed" }, providerExecuted: true }); } else if (value.item.type === "file_search_call") { ongoingToolCalls[value.output_index] = void 0; controller.enqueue({ type: "tool-result", toolCallId: value.item.id, toolName: "file_search", result: { queries: value.item.queries, results: (_e = (_d = value.item.results) == null ? void 0 : _d.map((result) => ({ attributes: result.attributes, fileId: result.file_id, filename: result.filename, score: result.score, text: result.text }))) != null ? _e : null }, providerExecuted: true }); } else if (value.item.type === "code_interpreter_call") { ongoingToolCalls[value.output_index] = void 0; controller.enqueue({ type: "tool-result", toolCallId: value.item.id, toolName: "code_interpreter", result: { outputs: value.item.outputs }, providerExecuted: true }); } else if (value.item.type === "image_generation_call") { controller.enqueue({ type: "tool-result", toolCallId: value.item.id, toolName: "image_generation", result: { result: value.item.result }, providerExecuted: true }); } else if (value.item.type === "local_shell_call") { ongoingToolCalls[value.output_index] = void 0; controller.enqueue({ type: "tool-call", toolCallId: value.item.call_id, toolName: "local_shell", input: JSON.stringify({ action: { type: "exec", command: value.item.action.command, timeoutMs: value.item.action.timeout_ms, user: value.item.action.user, workingDirectory: value.item.action.working_directory, env: value.item.action.env } }), providerMetadata: { [providerKey]: { itemId: value.item.id } } }); } else if (value.item.type === "reasoning") { const activeReasoningPart = activeReasoning[value.item.id]; const summaryPartIndices = Object.entries( activeReasoningPart.summaryParts ).filter( ([_, status]) => status === "active" || status === "can-conclude" ).map(([summaryIndex]) => summaryIndex); for (const summaryIndex of summaryPartIndices) { controller.enqueue({ type: "reasoning-end", id: `${value.item.id}:${summaryIndex}`, providerMetadata: { [providerKey]: { itemId: value.item.id, reasoningEncryptedContent: (_f = value.item.encrypted_content) != null ? _f : null } } }); } delete activeReasoning[value.item.id]; } } else if (isResponseFunctionCallArgumentsDeltaChunk(value)) { const toolCall = ongoingToolCalls[value.output_index]; if (toolCall != null) { controller.enqueue({ type: "tool-input-delta", id: toolCall.toolCallId, delta: value.delta }); } } else if (isResponseCodeInterpreterCallCodeDeltaChunk(value)) { const toolCall = ongoingToolCalls[value.output_index]; if (toolCall != null) { controller.enqueue({ type: "tool-input-delta", id: toolCall.toolCallId, // The delta is code, which is embedding in a JSON string. // To escape it, we use JSON.stringify and slice to remove the outer quotes. delta: JSON.stringify(value.delta).slice(1, -1) }); } } else if (isResponseCodeInterpreterCallCodeDoneChunk(value)) { const toolCall = ongoingToolCalls[value.output_index]; if (toolCall != null) { controller.enqueue({ type: "tool-input-delta", id: toolCall.toolCallId, delta: '"}' }); controller.enqueue({ type: "tool-input-end", id: toolCall.toolCallId }); controller.enqueue({ type: "tool-call", toolCallId: toolCall.toolCallId, toolName: "code_interpreter", input: JSON.stringify({ code: value.code, containerId: toolCall.codeInterpreter.containerId }), providerExecuted: true }); } } else if (isResponseCreatedChunk(value)) { responseId = value.response.id; controller.enqueue({ type: "response-metadata", id: value.response.id, timestamp: new Date(value.response.created_at * 1e3), modelId: value.response.model }); } else if (isTextDeltaChunk(value)) { controller.enqueue({ type: "text-delta", id: value.item_id, delta: value.delta }); if (((_h = (_g = options.providerOptions) == null ? void 0 : _g.openai) == null ? void 0 : _h.logprobs) && value.logprobs) { logprobs.push(value.logprobs); } } else if (value.type === "response.reasoning_summary_part.added") { if (value.summary_index > 0) { const activeReasoningPart = activeReasoning[value.item_id]; activeReasoningPart.summaryParts[value.summary_index] = "active"; for (const summaryIndex of Object.keys( activeReasoningPart.summaryParts )) { if (activeReasoningPart.summaryParts[summaryIndex] === "can-conclude") { controller.enqueue({ type: "reasoning-end", id: `${value.item_id}:${summaryIndex}`, providerMetadata: { [providerKey]: { itemId: value.item_id } } }); activeReasoningPart.summaryParts[summaryIndex] = "concluded"; } } controller.enqueue({ type: "reasoning-start", id: `${value.item_id}:${value.summary_index}`, providerMetadata: { [providerKey]: { itemId: value.item_id, reasoningEncryptedContent: (_j = (_i = activeReasoning[value.item_id]) == null ? void 0 : _i.encryptedContent) != null ? _j : null } } }); } } else if (value.type === "response.reasoning_summary_text.delta") { controller.enqueue({ type: "reasoning-delta", id: `${value.item_id}:${value.summary_index}`, delta: value.delta, providerMetadata: { [providerKey]: { itemId: value.item_id } } }); } else if (value.type === "response.reasoning_summary_part.done") { if (store) { controller.enqueue({ type: "reasoning-end", id: `${value.item_id}:${value.summary_index}`, providerMetadata: { [providerKey]: { itemId: value.item_id } } }); activeReasoning[value.item_id].summaryParts[value.summary_index] = "concluded"; } else { activeReasoning[value.item_id].summaryParts[value.summary_index] = "can-conclude"; } } else if (isResponseFinishedChunk(value)) { finishReason = mapOpenAIResponseFinishReason({ finishReason: (_k = value.response.incomplete_details) == null ? void 0 : _k.reason, hasFunctionCall }); usage.inputTokens = value.response.usage.input_tokens; usage.outputTokens = value.response.usage.output_tokens; usage.totalTokens = value.response.usage.input_tokens + value.response.usage.output_tokens; usage.reasoningTokens = (_m = (_l = value.response.usage.output_tokens_details) == null ? void 0 : _l.reasoning_tokens) != null ? _m : void 0; usage.cachedInputTokens = (_o = (_n = value.response.usage.input_tokens_details) == null ? void 0 : _n.cached_tokens) != null ? _o : void 0; if (typeof value.response.service_tier === "string") { serviceTier = value.response.service_tier; } } else if (isResponseAnnotationAddedChunk(value)) { ongoingAnnotations.push(value.annotation); if (value.annotation.type === "url_citation") { controller.enqueue({ type: "source", sourceType: "url", id: (_r = (_q = (_p = self.config).generateId) == null ? void 0 : _q.call(_p)) != null ? _r : chunkOCS2GTEN_cjs.generateId(), url: value.annotation.url, title: value.annotation.title }); } else if (value.annotation.type === "file_citation") { controller.enqueue({ type: "source", sourceType: "document", id: (_u = (_t = (_s = self.config).generateId) == null ? void 0 : _t.call(_s)) != null ? _u : chunkOCS2GTEN_cjs.generateId(), mediaType: "text/plain", title: (_w = (_v = value.annotation.quote) != null ? _v : value.annotation.filename) != null ? _w : "Document", filename: (_x = value.annotation.filename) != null ? _x : value.annotation.file_id, ...value.annotation.file_id ? { providerMetadata: { [providerKey]: { fileId: value.annotation.file_id } } } : {} }); } } else if (isErrorChunk(value)) { controller.enqueue({ type: "error", error: value }); } }, flush(controller) { const providerMetadata = { [providerKey]: { responseId } }; if (logprobs.length > 0) { providerMetadata[providerKey].logprobs = logprobs; } if (serviceTier !== void 0) { providerMetadata[providerKey].serviceTier = serviceTier; } controller.enqueue({ type: "finish", finishReason, usage, providerMetadata }); } }) ), request: { body }, response: { headers: responseHeaders } }; } }; function isTextDeltaChunk(chunk) { return chunk.type === "response.output_text.delta"; } function isResponseOutputItemDoneChunk(chunk) { return chunk.type === "response.output_item.done"; } function isResponseFinishedChunk(chunk) { return chunk.type === "response.completed" || chunk.type === "response.incomplete"; } function isResponseCreatedChunk(chunk) { return chunk.type === "response.created"; } function isResponseFunctionCallArgumentsDeltaChunk(chunk) { return chunk.type === "response.function_call_arguments.delta"; } function isResponseCodeInterpreterCallCodeDeltaChunk(chunk) { return chunk.type === "response.code_interpreter_call_code.delta"; } function isResponseCodeInterpreterCallCodeDoneChunk(chunk) { return chunk.type === "response.code_interpreter_call_code.done"; } function isResponseOutputItemAddedChunk(chunk) { return chunk.type === "response.output_item.added"; } function isResponseAnnotationAddedChunk(chunk) { return chunk.type === "response.output_text.annotation.added"; } function isErrorChunk(chunk) { return chunk.type === "error"; } function mapWebSearchOutput(action) { var _a; if (action == null) { return {}; } switch (action.type) { case "search": return { action: { type: "search", query: (_a = action.query) != null ? _a : void 0 }, // include sources when provided by the Responses API (behind include flag) ...action.sources != null && { sources: action.sources } }; case "open_page": return { action: { type: "openPage", url: action.url } }; case "find_in_page": return { action: { type: "findInPage", url: action.url, pattern: action.pattern } }; } } // ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@ai-sdk/azure/2.0.108/b619578b5433f96e73335d3c59b38f31d90988cae8d0d17a40a0e35a5de905d1/node_modules/@ai-sdk/azure/dist/index.mjs var azureOpenaiTools = { codeInterpreter, fileSearch, imageGeneration, webSearchPreview }; var VERSION = "2.0.108" ; function createAzure(options = {}) { var _a; const getHeaders = () => { const baseHeaders = { "api-key": chunkOCS2GTEN_cjs.loadApiKey({ apiKey: options.apiKey, environmentVariableName: "AZURE_API_KEY", description: "Azure OpenAI" }), ...options.headers }; return chunkOCS2GTEN_cjs.withUserAgentSuffix(baseHeaders, `ai-sdk/azure/${VERSION}`); }; const getResourceName = () => chunkOCS2GTEN_cjs.loadSetting({ settingValue: options.resourceName, settingName: "resourceName", environmentVariableName: "AZURE_RESOURCE_NAME", description: "Azure OpenAI resource name" }); const apiVersion = (_a = options.apiVersion) != null ? _a : "v1"; const url = ({ path: path2, modelId }) => { var _a2; const baseUrlPrefix = (_a2 = options.baseURL) != null ? _a2 : `https://${getResourceName()}.openai.azure.com/openai`; let fullUrl; if (options.useDeploymentBasedUrls) { fullUrl = new URL(`${baseUrlPrefix}/deployments/${modelId}${path2}`); } else { fullUrl = new URL(`${baseUrlPrefix}/v1${path2}`); } fullUrl.searchParams.set("api-version", apiVersion); return fullUrl.toString(); }; const createChatModel = (deploymentName) => new OpenAIChatLanguageModel(deploymentName, { provider: "azure.chat", url, headers: getHeaders, fetch: options.fetch }); const createCompletionModel = (modelId) => new OpenAICompletionLanguageModel(modelId, { provider: "azure.completion", url, headers: getHeaders, fetch: options.fetch }); const createEmbeddingModel = (modelId) => new OpenAIEmbeddingModel(modelId, { provider: "azure.embeddings", headers: getHeaders, url, fetch: options.fetch }); const createResponsesModel = (modelId) => new OpenAIResponsesLanguageModel(modelId, { provider: "azure.responses", url, headers: getHeaders, fetch: options.fetch, fileIdPrefixes: ["assistant-"] }); const createImageModel = (modelId) => new OpenAIImageModel(modelId, { provider: "azure.image", url, headers: getHeaders, fetch: options.fetch }); const createTranscriptionModel = (modelId) => new OpenAITranscriptionModel(modelId, { provider: "azure.transcription", url, headers: getHeaders, fetch: options.fetch }); const createSpeechModel = (modelId) => new OpenAISpeechModel(modelId, { provider: "azure.speech", url, headers: getHeaders, fetch: options.fetch }); const provider = function(deploymentId) { if (new.target) { throw new Error( "The Azure OpenAI model function cannot be called with the new keyword." ); } return createChatModel(deploymentId); }; provider.languageModel = createChatModel; provider.chat = createChatModel; provider.completion = createCompletionModel; provider.embedding = createEmbeddingModel; provider.image = createImageModel; provider.imageModel = createImageModel; provider.textEmbedding = createEmbeddingModel; provider.textEmbeddingModel = createEmbeddingModel; provider.responses = createResponsesModel; provider.transcription = createTranscriptionModel; provider.speech = createSpeechModel; provider.tools = azureOpenaiTools; return provider; } createAzure(); var TERMINAL_RESPONSE_EVENTS = /* @__PURE__ */ new Set(["response.completed", "response.failed", "response.incomplete", "error"]); function createOpenAIWebSocketFetch(options) { const wsUrl = options?.url ?? "wss://api.openai.com/v1/responses"; const betaHeader = options?.betaHeader === void 0 ? "responses_websockets=2026-02-06" : options.betaHeader; const apiKeyQueryParam = options?.apiKeyQueryParam ?? false; let ws = null; let connecting = null; let connectionKey = null; let nextQueryCredentialId = 0; const queryCredentialIds = /* @__PURE__ */ new Map(); let busy = false; function getQueryCredentialCacheId(value) { if (!value) return ""; const existing = queryCredentialIds.get(value); if (existing) return existing; const id = String(++nextQueryCredentialId); queryCredentialIds.set(value, id); return id; } function getConnection(authorization, headers, signal) { if (signal?.aborted) { return Promise.reject(getAbortError(signal)); } const normalizedHeaders = { ...normalizeHeaders(options?.headers), ...headers }; const apiKey = normalizedHeaders["api-key"]; delete normalizedHeaders["authorization"]; delete normalizedHeaders["openai-beta"]; if (options?.apiKeyAsBearer || apiKeyQueryParam) { delete normalizedHeaders["api-key"]; } const queryCredential = apiKeyQueryParam ? `${apiKeyQueryParam}:${getQueryCredentialCacheId(apiKey)}` : ""; const nextConnectionKey = buildConnectionKey(authorization, normalizedHeaders, queryCredential); if (ws?.readyState === WebSocket__default.default.OPEN && connectionKey === nextConnectionKey) { return Promise.resolve(ws); } if (ws?.readyState === WebSocket__default.default.OPEN && connectionKey !== nextConnectionKey) { ws.close(); ws = null; connectionKey = null; } if (connecting && connectionKey === nextConnectionKey) return connecting; connectionKey = nextConnectionKey; connecting = new Promise((resolve, reject) => { let settled = false; const socket = new WebSocket__default.default(getWebSocketUrl(wsUrl, apiKeyQueryParam, apiKey), { headers: { ...normalizedHeaders, ...authorization ? { Authorization: authorization } : {}, ...betaHeader ? { "OpenAI-Beta": betaHeader } : {} } }); function cleanupAbortListener() { signal?.removeEventListener("abort", onAbort); } function rejectConnection(err, closeSocket = true) { if (settled) return; settled = true; connecting = null; connectionKey = null; cleanupAbortListener(); if (closeSocket) socket.close(); reject(err); } function onAbort() { rejectConnection(getAbortError(signal)); } signal?.addEventListener("abort", onAbort, { once: true }); socket.on("open", () => { if (signal?.aborted) { rejectConnection(getAbortError(signal)); return; } settled = true; ws = socket; connecting = null; cleanupAbortListener(); resolve(socket); }); socket.on("error", (err) => { rejectConnection(err, false); }); socket.on("close", () => { if (settled) return; rejectConnection(new Error("WebSocket closed before the connection opened"), false); }); socket.on("close", () => { if (ws === socket) ws = null; if (ws === null) connectionKey = null; }); }); return connecting; } async function websocketFetch(input, init) { const url = input instanceof URL ? input.toString() : typeof input === "string" ? input : input.url; if (init?.method !== "POST" || !isResponsesUrl(url)) { return globalThis.fetch(input, init); } let body; try { body = JSON.parse(typeof init.body === "string" ? init.body : ""); } catch { return globalThis.fetch(input, init); } if (!body.stream) { return globalThis.fetch(input, init); } if (busy) { if (body.previous_response_id) { throw new Error( "Cannot start an overlapping WebSocket Responses continuation. Wait for the active stream to finish before sending previous_response_id." ); } return globalThis.fetch(input, init); } const headers = normalizeHeaders(init.headers); const authorization = headers["authorization"] ?? (options?.apiKeyAsBearer && headers["api-key"] ? `Bearer ${headers["api-key"]}` : ""); busy = true; let connection; try { connection = await getConnection(authorization, headers, init?.signal); } catch (err) { busy = false; throw err; } const { stream: _stream, background: _background, ...requestBody } = body; const encoder = new TextEncoder(); let cleanupActiveStream; const responseStream = new ReadableStream({ start(controller) { let cleanedUp = false; let abortHandler; function cleanup({ closeSocket = false } = {}) { if (cleanedUp) return; cleanedUp = true; connection.off("message", onMessage); connection.off("error", onError); connection.off("close", onClose); if (abortHandler) { init?.signal?.removeEventListener("abort", abortHandler); abortHandler = void 0; } if (closeSocket && ws === connection) { connection.close(); ws = null; connectionKey = null; } busy = false; cleanupActiveStream = void 0; } cleanupActiveStream = cleanup; function onMessage(data) { const text = data.toString(); controller.enqueue(encoder.encode(formatSSEData(text))); try { const event = JSON.parse(text); if (isTerminalWebSocketEvent(event)) { controller.enqueue(encoder.encode("data: [DONE]\n\n")); cleanup({ closeSocket: shouldReconnectAfterEvent(event) }); controller.close(); } } catch { } } function onError(err) { cleanup(); controller.error(err); } function onClose() { cleanup(); try { controller.close(); } catch { } } connection.on("message", onMessage); connection.on("error", onError); connection.on("close", onClose); const signal = init?.signal; if (signal) { if (signal.aborted) { cleanup({ closeSocket: true }); controller.error(signal.reason ?? new DOMException("Aborted", "AbortError")); return; } abortHandler = () => { cleanup({ closeSocket: true }); try { controller.error(signal.reason ?? new DOMException("Aborted", "AbortError")); } catch { } }; signal.addEventListener("abort", abortHandler, { once: true }); } connection.send(JSON.stringify({ type: "response.create", ...requestBody })); }, cancel() { cleanupActiveStream?.({ closeSocket: true }); } }); return new Response(responseStream, { status: 200, headers: { "content-type": "text/event-stream" } }); } return Object.assign(websocketFetch, { /** Close the underlying WebSocket connection. */ close() { if (ws) { ws.close(); ws = null; } connectionKey = null; connecting = null; } }); } function isResponsesUrl(url) { try { return new URL(url).pathname.endsWith("/responses"); } catch { return url.split("?")[0]?.endsWith("/responses") ?? false; } } function getWebSocketUrl(url, apiKeyQueryParam, apiKey) { if (!apiKeyQueryParam || !apiKey) return url; const parsedUrl = new URL(url); parsedUrl.searchParams.set(apiKeyQueryParam, apiKey); return parsedUrl.toString(); } function formatSSEData(text) { return `${text.split(/\r?\n/).map((line) => `data: ${line}`).join("\n")} `; } function buildConnectionKey(authorization, headers, queryCredential = "") { return JSON.stringify({ authorization, queryCredential, headers: Object.entries(headers).sort(([a], [b]) => a.localeCompare(b)) }); } function isTerminalWebSocketEvent(event) { return typeof event === "object" && event !== null && "type" in event && typeof event.type === "string" && TERMINAL_RESPONSE_EVENTS.has(event.type); } function shouldReconnectAfterEvent(event) { if (typeof event !== "object" || event === null || !("error" in event)) return false; const error = event.error; return typeof error === "object" && error !== null && "code" in error && error.code === "websocket_connection_limit_reached"; } function getAbortError(signal) { return signal?.reason ?? new DOMException("Aborted", "AbortError"); } function normalizeHeaders(headers) { const result = {}; if (!headers) return result; if (headers instanceof Headers) { headers.forEach((value, key) => { result[key.toLowerCase()] = value; }); } else if (Array.isArray(headers)) { for (const [key, value] of headers) { result[key.toLowerCase()] = value; } } else { for (const [key, value] of Object.entries(headers)) { if (value != null) result[key.toLowerCase()] = value; } } return result; } // src/llm/model/gateways/azure.ts function isRecord(value) { return typeof value === "object" && value !== null && !Array.isArray(value); } function mirrorAzureProviderOptionsForOpenAI(providerOptions) { if (!isRecord(providerOptions) || !isRecord(providerOptions.azure)) { return providerOptions; } const openai = isRecord(providerOptions.openai) ? providerOptions.openai : {}; return { ...providerOptions, openai: { ...openai, ...providerOptions.azure } }; } function mirrorAzureResponseProviderOptions(prompt) { let promptModified = false; const mirroredPrompt = prompt.map((message) => { const messageWithProviderOptions = message; const providerOptions = mirrorAzureProviderOptionsForOpenAI(messageWithProviderOptions.providerOptions); const providerOptionsModified = providerOptions !== messageWithProviderOptions.providerOptions; if (!Array.isArray(message.content)) { if (providerOptionsModified) { promptModified = true; return { ...message, providerOptions }; } return message; } let contentModified = false; const content = message.content.map((part) => { if (!("providerOptions" in part)) { return part; } const providerOptions2 = mirrorAzureProviderOptionsForOpenAI(part.providerOptions); if (providerOptions2 === part.providerOptions) { return part; } contentModified = true; return { ...part, providerOptions: providerOptions2 }; }); if (!contentModified) { if (providerOptionsModified) { promptModified = true; return { ...message, providerOptions }; } return message; } promptModified = true; return { ...message, ...providerOptionsModified ? { providerOptions } : {}, content }; }); return promptModified ? mirroredPrompt : prompt; } function withAzureResponsesInputCompatibility(model) { return new Proxy(model, { get(target, property, receiver) { if (property === "doGenerate") { return (options) => target.doGenerate({ ...options, providerOptions: mirrorAzureProviderOptionsForOpenAI(options.providerOptions), prompt: mirrorAzureResponseProviderOptions(options.prompt) }); } if (property === "doStream") { return (options) => target.doStream({ ...options, providerOptions: mirrorAzureProviderOptionsForOpenAI(options.providerOptions), prompt: mirrorAzureResponseProviderOptions(options.prompt) }); } return Reflect.get(target, property, receiver); } }); } var AzureOpenAIGateway = class extends chunkOCS2GTEN_cjs.MastraModelGateway { constructor(config) { super(); this.config = config; this.validateConfig(); } config; id = "azure-openai"; name = "azure-openai"; tokenCache = new chunk6QR4RQID_cjs.InMemoryServerCache(); entraIdTokenRequests = /* @__PURE__ */ new Map(); validateConfig() { if (!this.config.resourceName) { throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_GATEWAY_INVALID_CONFIG", domain: "LLM", category: "UNKNOWN", text: "resourceName is required for Azure OpenAI gateway" }); } if (!this.config.apiKey && this.config.authentication?.type !== "entraId") { throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_GATEWAY_INVALID_CONFIG", domain: "LLM", category: "UNKNOWN", text: "apiKey or Entra ID authentication is required for Azure OpenAI gateway" }); } if (this.config.authentication?.type === "entraId" && !this.config.authentication.credential) { throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_GATEWAY_INVALID_CONFIG", domain: "LLM", category: "UNKNOWN", text: "credential is required for Azure OpenAI Entra ID authentication" }); } if (this.config.apiKey && this.config.authentication?.type === "entraId") { console.warn( "[AzureOpenAIGateway] Both apiKey and Entra ID authentication provided. Using Entra ID authentication and ignoring apiKey." ); } if (this.config.useResponsesAPI && this.config.useDeploymentBasedUrls === true) { throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_GATEWAY_INVALID_CONFIG", domain: "LLM", category: "UNKNOWN", text: "useResponsesAPI: true cannot be combined with useDeploymentBasedUrls: true. Omit useDeploymentBasedUrls or set it to false." }); } if (this.config.useResponsesAPI && this.config.apiVersion && !["v1", "preview"].includes(this.config.apiVersion)) { throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_GATEWAY_INVALID_CONFIG", domain: "LLM", category: "UNKNOWN", text: 'useResponsesAPI: true requires apiVersion: "v1" or apiVersion: "preview". Omit apiVersion to use "v1".' }); } if (this.config.useDeploymentBasedUrls === false && this.config.apiVersion && !["v1", "preview"].includes(this.config.apiVersion)) { throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_GATEWAY_INVALID_CONFIG", domain: "LLM", category: "UNKNOWN", text: 'useDeploymentBasedUrls: false requires apiVersion: "v1" or apiVersion: "preview". Omit apiVersion to use "v1".' }); } const hasDeployments = this.config.deployments && this.config.deployments.length > 0; const hasManagement = this.config.management !== void 0; if (hasDeployments && hasManagement) { console.warn( "[AzureOpenAIGateway] Both deployments and management credentials provided. Using static deployments list and ignoring management API." ); } if (hasManagement) { this.getManagementCredentials(this.config.management); } } async fetchProviders() { if (this.config.deployments && this.config.deployments.length > 0) { return { "azure-openai": { apiKeyEnvVar: [], apiKeyHeader: "api-key", name: "Azure OpenAI", models: this.config.deployments, docUrl: "https://learn.microsoft.com/en-us/azure/ai-services/openai/", gateway: "azure-openai" } }; } if (!this.config.management) { return { "azure-openai": { apiKeyEnvVar: [], apiKeyHeader: "api-key", name: "Azure OpenAI", models: [], docUrl: "https://learn.microsoft.com/en-us/azure/ai-services/openai/", gateway: "azure-openai" } }; } try { const credentials = this.getManagementCredentials(this.config.management); const token = await this.getAzureADToken({ tenantId: credentials.tenantId, clientId: credentials.clientId, clientSecret: credentials.clientSecret }); const deployments = await this.fetchDeployments(token, { subscriptionId: credentials.subscriptionId, resourceGroup: credentials.resourceGroup, resourceName: this.config.resourceName }); return { "azure-openai": { apiKeyEnvVar: [], apiKeyHeader: "api-key", name: "Azure OpenAI", models: deployments.map((d) => d.name), docUrl: "https://learn.microsoft.com/en-us/azure/ai-services/openai/", gateway: "azure-openai" } }; } catch (error) { const errorMsg = error instanceof Error ? error.message : String(error); console.warn( `[AzureOpenAIGateway] Deployment discovery failed: ${errorMsg}`, "\nReturning fallback configuration. Azure OpenAI can still be used by manually specifying deployment names." ); return { "azure-openai": { apiKeyEnvVar: [], apiKeyHeader: "api-key", name: "Azure OpenAI", models: [], docUrl: "https://learn.microsoft.com/en-us/azure/ai-services/openai/", gateway: "azure-openai" } }; } } getManagementCredentials(management) { const { tenantId, clientId, clientSecret, subscriptionId, resourceGroup } = management; const missing = []; if (!tenantId) missing.push("tenantId"); if (!clientId) missing.push("clientId"); if (!clientSecret) missing.push("clientSecret"); if (!subscriptionId) missing.push("subscriptionId"); if (!resourceGroup) missing.push("resourceGroup"); if (missing.length > 0) { throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_MANAGEMENT_CREDENTIALS_MISSING", domain: "LLM", category: "UNKNOWN", text: `Management credentials incomplete. Missing: ${missing.join(", ")}. Required fields: tenantId, clientId, clientSecret, subscriptionId, resourceGroup.` }); } return { tenantId, clientId, clientSecret, subscriptionId, resourceGroup }; } async getAzureADToken(credentials) { const { tenantId, clientId, clientSecret } = credentials; const cacheKey = `azure-mgmt-token:${tenantId}:${clientId}`; const cached = await this.tokenCache.get(cacheKey); if (cached && cached.expiresAt > Date.now() / 1e3 + 60) { return cached.token; } const tokenEndpoint = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`; const body = new URLSearchParams({ grant_type: "client_credentials", client_id: clientId, client_secret: clientSecret, scope: "https://management.azure.com/.default" }); const response = await fetch(tokenEndpoint, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: body.toString() }); if (!response.ok) { const error = await response.text(); throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_AD_TOKEN_ERROR", domain: "LLM", category: "UNKNOWN", text: `Failed to get Azure AD token: ${response.status} ${error}` }); } const tokenResponse = await response.json(); const expiresAt = Math.floor(Date.now() / 1e3) + tokenResponse.expires_in; await this.tokenCache.set(cacheKey, { token: tokenResponse.access_token, expiresAt }); return tokenResponse.access_token; } async fetchDeployments(token, credentials) { const { subscriptionId, resourceGroup, resourceName } = credentials; let url = `https://management.azure.com/subscriptions/${subscriptionId}/resourceGroups/${resourceGroup}/providers/Microsoft.CognitiveServices/accounts/${resourceName}/deployments?api-version=2024-10-01`; const allDeployments = []; while (url) { const response = await fetch(url, { headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" } }); if (!response.ok) { const error = await response.text(); throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_DEPLOYMENTS_FETCH_ERROR", domain: "LLM", category: "UNKNOWN", text: `Failed to fetch Azure deployments: ${response.status} ${error}` }); } const data = await response.json(); allDeployments.push(...data.value); url = data.nextLink; } const successfulDeployments = allDeployments.filter((d) => d.properties.provisioningState === "Succeeded"); return successfulDeployments; } buildUrl(_routerId, _envVars) { return void 0; } async getApiKey(_modelId) { return this.config.authentication?.type === "entraId" ? "" : this.config.apiKey ?? ""; } async getEntraIdToken() { if (this.config.authentication?.type !== "entraId") { throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_ENTRA_ID_AUTH_NOT_CONFIGURED", domain: "LLM", category: "UNKNOWN", text: "Entra ID authentication is not configured for Azure OpenAI gateway" }); } const scope = this.config.authentication.scope ?? "https://cognitiveservices.azure.com/.default"; const cacheKey = `azure-openai-token:${scope}`; const cached = await this.tokenCache.get(cacheKey); if (cached && cached.expiresAt > Date.now() / 1e3 + 60) { return cached.token; } let tokenRequest = this.entraIdTokenRequests.get(cacheKey); if (!tokenRequest) { tokenRequest = this.fetchEntraIdToken(scope, cacheKey); this.entraIdTokenRequests.set(cacheKey, tokenRequest); } try { const token = await tokenRequest; return token.token; } finally { this.entraIdTokenRequests.delete(cacheKey); } } async fetchEntraIdToken(scope, cacheKey) { if (this.config.authentication?.type !== "entraId") { throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_ENTRA_ID_AUTH_NOT_CONFIGURED", domain: "LLM", category: "UNKNOWN", text: "Entra ID authentication is not configured for Azure OpenAI gateway" }); } const accessToken = await this.config.authentication.credential.getToken(scope); if (!accessToken?.token) { throw new chunkXSOONORA_cjs.MastraError({ id: "AZURE_ENTRA_ID_TOKEN_ERROR", domain: "LLM", category: "UNKNOWN", text: "Failed to get Entra ID token for Azure OpenAI gateway" }); } const token = { token: accessToken.token, expiresAt: accessToken.expiresOnTimestamp ? Math.floor(accessToken.expiresOnTimestamp / 1e3) : Math.floor(Date.now() / 1e3) + 300 }; await this.tokenCache.set(cacheKey, token); return token; } createEntraIdFetch(innerFetch = fetch) { return async (input, init) => { const token = await this.getEntraIdToken(); const headers = new Headers(init?.headers); headers.delete("api-key"); headers.set("Authorization", `Bearer ${token}`); return innerFetch(input, { ...init, headers }); }; } createAzureResponsesWebSocketFetch({ useEntraId, responsesWebSocket }) { const websocketFetch = createOpenAIWebSocketFetch({ url: responsesWebSocket?.url ?? `wss://${this.config.resourceName}.openai.azure.com/openai/v1/responses`, headers: responsesWebSocket?.headers, apiKeyQueryParam: useEntraId ? false : "api-key", betaHeader: false }); return useEntraId ? Object.assign(this.createEntraIdFetch(websocketFetch), { close: websocketFetch.close }) : websocketFetch; } async resolveLanguageModel({ modelId, apiKey, headers, transport, responsesWebSocket }) { const useResponsesAPI = this.config.useResponsesAPI ?? false; const apiVersion = this.config.apiVersion || (useResponsesAPI || this.config.useDeploymentBasedUrls === false ? "v1" : "2024-04-01-preview"); const useDeploymentBasedUrls = this.config.useDeploymentBasedUrls ?? (useResponsesAPI ? false : true); const useEntraId = this.config.authentication?.type === "entraId"; const useWebSocket = useResponsesAPI && transport === "websocket"; const websocketFetch = useWebSocket ? this.createAzureResponsesWebSocketFetch({ useEntraId, responsesWebSocket }) : void 0; const azureConfig = { resourceName: this.config.resourceName, apiKey: useEntraId ? "" : apiKey, apiVersion, // Mastra's Azure gateway has historically used deployment-based URLs. // Keep that default for compatibility; set false with apiVersion: 'v1' // to use the newer Azure OpenAI v1 route. useDeploymentBasedUrls, headers: { "User-Agent": chunkOCS2GTEN_cjs.MASTRA_USER_AGENT, ...headers }, ...websocketFetch && !useEntraId ? { fetch: websocketFetch } : {} }; const azureProvider = createAzure( useEntraId ? { ...azureConfig, fetch: websocketFetch ?? this.createEntraIdFetch() } : azureConfig ); if (useResponsesAPI) { const model = withAzureResponsesInputCompatibility(azureProvider.responses(modelId)); if (websocketFetch) { Object.defineProperty(model, chunkOCS2GTEN_cjs.MASTRA_GATEWAY_STREAM_TRANSPORT, { configurable: true, value: { type: "openai-websocket", close: websocketFetch.close } }); } return model; } return azureProvider(modelId); } }; // src/llm/model/gateways/mastra.ts var MastraGateway = class extends chunkOCS2GTEN_cjs.MastraModelGateway { constructor(config) { super(); this.config = config; } config; id = "mastra"; name = "Memory Gateway"; getBaseUrl() { const raw = this.config?.baseUrl ?? process.env["MASTRA_GATEWAY_URL"] ?? "https://gateway-api.mastra.ai"; return raw.replace(/\/+$/, "").replace(/\/v1$/, ""); } shouldEnable() { return !!(this.config?.apiKey ?? process.env["MASTRA_GATEWAY_API_KEY"]); } async fetchProviders() { if (!this.shouldEnable()) { return {}; } const openrouterConfig = PROVIDER_REGISTRY["openrouter"]; const models = openrouterConfig?.models ?? []; const providers = { mastra: { apiKeyEnvVar: "MASTRA_GATEWAY_API_KEY", apiKeyHeader: "Authorization", name: "Memory Gateway", gateway: "mastra", models: [...models], docUrl: "https://mastra.ai/docs/gateway" } }; return providers; } async buildUrl(_modelId) { return `${this.getBaseUrl()}/v1`; } async getApiKey() { const apiKey = this.config?.apiKey ?? process.env["MASTRA_GATEWAY_API_KEY"]; if (!apiKey) { throw new chunkXSOONORA_cjs.MastraError({ id: "MASTRA_GATEWAY_NO_API_KEY", domain: "LLM", category: "UNKNOWN", text: "Missing MASTRA_GATEWAY_API_KEY environment variable" }); } return apiKey; } resolveLanguageModel({ modelId, providerId, apiKey, headers }) { const baseURL = `${this.getBaseUrl()}/v1`; const fullModelId = `${providerId}/${modelId}`; if (this.config?.customFetch && providerId === "anthropic") { return chunkOCS2GTEN_cjs.createAnthropic({ apiKey: "oauth-gateway-placeholder", baseURL, headers: { "User-Agent": chunkOCS2GTEN_cjs.MASTRA_USER_AGENT, [chunkOCS2GTEN_cjs.GATEWAY_AUTH_HEADER]: `Bearer ${apiKey}`, ...headers }, fetch: this.config.customFetch })(modelId); } if (this.config?.customFetch) { return chunkDBTKQ3U2_cjs.createOpenRouter({ apiKey: "oauth-gateway-placeholder", baseURL, headers: { "User-Agent": chunkOCS2GTEN_cjs.MASTRA_USER_AGENT, [chunkOCS2GTEN_cjs.GATEWAY_AUTH_HEADER]: `Bearer ${apiKey}`, ...headers }, fetch: this.config.customFetch }).chat(fullModelId); } return chunkDBTKQ3U2_cjs.createOpenRouter({ apiKey, baseURL, headers: { "User-Agent": chunkOCS2GTEN_cjs.MASTRA_USER_AGENT, ...headers } }).chat(fullModelId); } }; // src/llm/model/gateways/index.ts function getGatewayId(gateway) { return gateway.getId?.() ?? gateway.id; } function shouldEnableGateway(gateway) { return gateway.shouldEnable?.() ?? true; } function findGatewayForModel(gatewayId, gateways) { const prefixedGateway = gateways.find((g) => { const id = getGatewayId(g); return id !== "models.dev" && (id === gatewayId || gatewayId.startsWith(`${id}/`)); }); if (prefixedGateway) { return prefixedGateway; } const modelsDevGateway = gateways.find((g) => getGatewayId(g) === "models.dev"); if (modelsDevGateway) { return modelsDevGateway; } throw new chunkXSOONORA_cjs.MastraError({ id: "MODEL_ROUTER_NO_GATEWAY_FOUND", category: "USER", domain: "MODEL_ROUTER", text: `No Mastra model router gateway found for model id ${gatewayId}` }); } // src/llm/model/provider-registry.json var provider_registry_default = { providers: { helicone: { url: "https://ai-gateway.helicone.ai/v1", apiKeyEnvVar: "HELICONE_API_KEY", apiKeyHeader: "Authorization", name: "Helicone", models: [ "chatgpt-4o-latest", "claude-3-haiku-20240307", "claude-3.5-haiku", "claude-3.5-sonnet-v2", "claude-3.7-sonnet", "claude-4.5-haiku", "claude-4.5-opus", "claude-4.5-sonnet", "claude-haiku-4-5-20251001", "claude-opus-4", "claude-opus-4-1", "claude-opus-4-1-20250805", "claude-sonnet-4", "claude-sonnet-4-5-20250929", "deepseek-r1-distill-llama-70b", "deepseek-reasoner", "deepseek-tng-r1t2-chimera", "deepseek-v3", "deepseek-v3.1-terminus", "deepseek-v3.2", "ernie-4.5-21b-a3b-thinking", "gemini-2.5-flash", "gemini-2.5-flash-lite", "gemini-2.5-pro", "gemini-3-pro-preview", "gemma-3-12b-it", "gemma2-9b-it", "glm-4.6", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-mini-2025-04-14", "gpt-4.1-nano", "gpt-4o", "gpt-4o-mini", "gpt-5", "gpt-5-chat-latest", "gpt-5-codex", "gpt-5-mini", "gpt-5-nano", "gpt-5-pro", "gpt-5.1", "gpt-5.1-chat-latest", "gpt-5.1-codex", "gpt-5.1-codex-mini", "gpt-oss-120b", "gpt-oss-20b", "grok-3", "grok-3-mini", "grok-4", "grok-4-1-fast-non-reasoning", "grok-4-1-fast-reasoning", "grok-4-fast-non-reasoning", "grok-4-fast-reasoning", "grok-code-fast-1", "hermes-2-pro-llama-3-8b", "kimi-k2-0711", "kimi-k2-0905", "kimi-k2-thinking", "llama-3.1-8b-instant", "llama-3.1-8b-instruct", "llama-3.1-8b-instruct-turbo", "llama-3.3-70b-instruct", "llama-3.3-70b-versatile", "llama-4-maverick", "llama-4-scout", "llama-guard-4", "llama-prompt-guard-2-22m", "llama-prompt-guard-2-86m", "mistral-large-2411", "mistral-nemo", "mistral-small", "o1", "o1-mini", "o3", "o3-mini", "o3-pro", "o4-mini", "qwen2.5-coder-7b-fast", "qwen3-235b-a22b-thinking", "qwen3-30b-a3b", "qwen3-32b", "qwen3-coder", "qwen3-coder-30b-a3b-instruct", "qwen3-next-80b-a3b-instruct", "qwen3-vl-235b-a22b-instruct", "sonar", "sonar-deep-research", "sonar-pro", "sonar-reasoning", "sonar-reasoning-pro" ], docUrl: "https://helicone.ai/models", gateway: "models.dev" }, auriko: { url: "https://api.auriko.ai/v1", apiKeyEnvVar: "AURIKO_API_KEY", apiKeyHeader: "Authorization", name: "Auriko", models: [ "claude-opus-4-6", "claude-opus-4-7", "claude-sonnet-4-6", "deepseek-v4-flash", "deepseek-v4-pro", "gemini-2.5-flash", "gemini-2.5-pro", "gemini-3.1-pro-preview", "glm-5.1", "grok-4.3", "kimi-k2.5", "kimi-k2.6", "minimax-m2-7", "minimax-m2-7-highspeed", "qwen-3.6-plus" ], docUrl: "https://docs.auriko.ai", gateway: "models.dev" }, firepass: { url: "https://api.fireworks.ai/inference/v1/", apiKeyEnvVar: "FIREPASS_API_KEY", apiKeyHeader: "Authorization", name: "Fireworks (Firepass)", models: ["accounts/fireworks/routers/kimi-k2p6-turbo"], docUrl: "https://docs.fireworks.ai/firepass", gateway: "models.dev" }, "nano-gpt": { url: "https://nano-gpt.com/api/v1", apiKeyEnvVar: "NANO_GPT_API_KEY", apiKeyHeader: "Authorization", name: "NanoGPT", models: [ "Alibaba-NLP/Tongyi-DeepResearch-30B-A3B", "Baichuan-M2", "Baichuan4-Air", "Baichuan4-Turbo", "CrucibleLab/L3.3-70B-Loki-V2.0", "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond", "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0", "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1", "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2", "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2", "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B", "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B", "GLM-4.5-Air-Derestricted", "GLM-4.5-Air-Derestricted-Iceblink", "GLM-4.5-Air-Derestricted-Iceblink-ReExtract", "GLM-4.5-Air-Derestricted-Iceblink-v2", "GLM-4.5-Air-Derestricted-Iceblink-v2-ReExtract", "GLM-4.5-Air-Derestricted-Steam", "GLM-4.5-Air-Derestricted-Steam-ReExtract", "GLM-4.6-Derestricted-v5", "GalrionSoftworks/MN-LooseCannon-12B-v1", "Gemma-3-27B-ArliAI-RPMax-v3", "Gemma-3-27B-Big-Tiger-v3", "Gemma-3-27B-CardProjector-v4", "Gemma-3-27B-Glitter", "Gemma-3-27B-Nidum-Uncensored", "Gemma-3-27B-it", "Gemma-3-27B-it-Abliterated", "Gryphe/MythoMax-L2-13b", "Infermatic/MN-12B-Inferor-v0.0", "KAT-Coder-Air-V1", "KAT-Coder-Exp-72B-1010", "KAT-Coder-Pro-V1", "LLM360/K2-Think", "LatitudeGames/Wayfarer-Large-70B-Llama-3.3", "Llama-3.3+(3.1v3.3)-70B-Hanami-x1", "Llama-3.3+(3.1v3.3)-70B-New-Dawn-v1.1", "Llama-3.3+(3v3.3)-70B-TenyxChat-DaybreakStorywriter", "Llama-3.3-70B-Anthrobomination", "Llama-3.3-70B-Argunaut-1-SFT", "Llama-3.3-70B-ArliAI-RPMax-v1.4", "Llama-3.3-70B-ArliAI-RPMax-v2", "Llama-3.3-70B-ArliAI-RPMax-v3", "Llama-3.3-70B-Aurora-Borealis", "Llama-3.3-70B-Bigger-Body", "Llama-3.3-70B-Cirrus-x1", "Llama-3.3-70B-Cu-Mai-R1", "Llama-3.3-70B-Damascus-R1", "Llama-3.3-70B-Dark-Ages-v0.1", "Llama-3.3-70B-Electra-R1", "Llama-3.3-70B-Electranova-v1.0", "Llama-3.3-70B-Fallen-R1-v1", "Llama-3.3-70B-Fallen-v1", "Llama-3.3-70B-Forgotten-Abomination-v5.0", "Llama-3.3-70B-Forgotten-Safeword-3.6", "Llama-3.3-70B-GeneticLemonade-Opus", "Llama-3.3-70B-GeneticLemonade-Unleashed-v3", "Llama-3.3-70B-Ignition-v0.1", "Llama-3.3-70B-Incandescent-Malevolence", "Llama-3.3-70B-Legion-V2.1", "Llama-3.3-70B-MS-Nevoria", "Llama-3.3-70B-Magnum-v4-SE", "Llama-3.3-70B-Magnum-v4-SE-Cirrus-x1-SLERP", "Llama-3.3-70B-Mhnnn-x1", "Llama-3.3-70B-MiraiFanfare", "Llama-3.3-70B-Mokume-Gane-R1", "Llama-3.3-70B-Nova", "Llama-3.3-70B-Predatorial-Extasy", "Llama-3.3-70B-Progenitor-V3.3", "Llama-3.3-70B-RAWMAW", "Llama-3.3-70B-Sapphira-0.1", "Llama-3.3-70B-Sapphira-0.2", "Llama-3.3-70B-Shakudo", "Llama-3.3-70B-StrawberryLemonade-v1.0", "Llama-3.3-70B-Strawberrylemonade-v1.2", "Llama-3.3-70B-The-Omega-Directive-Unslop-v2.0", "Llama-3.3-70B-The-Omega-Directive-Unslop-v2.1", "Llama-3.3-70B-Vulpecula-R1", "Magistral-Small-2506", "MarinaraSpaghetti/NemoMix-Unleashed-12B", "Meta-Llama-3-1-8B-Instruct-FP8", "MiniMax-M1", "MiniMax-M2", "MiniMaxAI/MiniMax-M1-80k", "Mistral-Nemo-12B-Instruct-2407", "NeverSleep/Llama-3-Lumimaid-70B-v0.1", "NeverSleep/Lumimaid-v0.2-70B", "NousResearch 2/DeepHermes-3-Mistral-24B-Preview", "NousResearch 2/Hermes-4-70B:thinking", "NousResearch 2/hermes-3-llama-3.1-70b", "NousResearch 2/hermes-4-405b", "NousResearch 2/hermes-4-405b:thinking", "NousResearch 2/hermes-4-70b", "QwQ-32B-ArliAI-RpR-v1", "Qwen2.5-32B-EVA-v0.2", "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0", "ReadyArt/The-Omega-Abomination-L-70B-v1.0", "Salesforce/Llama-xLAM-2-70b-fc-r", "Sao10K/L3-8B-Stheno-v3.2", "Sao10K/L3.1-70B-Euryale-v2.2", "Sao10K/L3.1-70B-Hanami-x1", "Sao10K/L3.3-70B-Euryale-v2.3", "Steelskull/L3.3-Cu-Mai-R1-70b", "Steelskull/L3.3-Electra-R1-70b", "Steelskull/L3.3-MS-Evalebis-70b", "Steelskull/L3.3-MS-Evayale-70B", "Steelskull/L3.3-MS-Nevoria-70b", "Steelskull/L3.3-Nevoria-R1-70b", "TEE/deepseek-r1-0528", "TEE/deepseek-v3.1", "TEE/deepseek-v3.2", "TEE/gemma-3-27b-it", "TEE/glm-4.6", "TEE/glm-4.7", "TEE/glm-4.7-flash", "TEE/glm-5", "TEE/gpt-oss-120b", "TEE/gpt-oss-20b", "TEE/kimi-k2-thinking", "TEE/kimi-k2.5", "TEE/kimi-k2.5-thinking", "TEE/llama3-3-70b", "TEE/minimax-m2.1", "TEE/qwen2.5-vl-72b-instruct", "TEE/qwen3-30b-a3b-instruct-2507", "TEE/qwen3-coder", "TEE/qwen3.5-397b-a17b", "THUDM/GLM-4-32B-0414", "THUDM/GLM-4-9B-0414", "THUDM/GLM-Z1-32B-0414", "THUDM/GLM-Z1-9B-0414", "THUDM/GLM-Z1-Rumination-32B-0414", "TheDrummer 2/Anubis-70B-v1", "TheDrummer 2/Anubis-70B-v1.1", "TheDrummer 2/Cydonia-24B-v2", "TheDrummer 2/Cydonia-24B-v4", "TheDrummer 2/Cydonia-24B-v4.1", "TheDrummer 2/Cydonia-24B-v4.3", "TheDrummer 2/Magidonia-24B-v4.3", "TheDrummer 2/Rocinante-12B-v1.1", "TheDrummer 2/UnslopNemo-12B-v4.1", "TheDrummer 2/skyfall-36b-v2", "Tongyi-Zhiwen/QwenLong-L1-32B", "VongolaChouko/Starcannon-Unleashed-12B-v1.0", "abacusai/Dracarys-72B-Instruct", "aion-labs/aion-1.0", "aion-labs/aion-1.0-mini", "aion-labs/aion-rp-llama-3.1-8b", "alibaba/qwen3.6-flash", "allenai/molmo-2-8b", "allenai/olmo-3-32b-think", "allenai/olmo-3.1-32b-instruct", "allenai/olmo-3.1-32b-think", "amazon/nova-2-lite-v1", "amazon/nova-lite-v1", "amazon/nova-micro-v1", "amazon/nova-pro-v1", "anthracite-org/magnum-v2-72b", "anthracite-org/magnum-v4-72b", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.6:thinking", "anthropic/claude-opus-4.6:thinking:low", "anthropic/claude-opus-4.6:thinking:max", "anthropic/claude-opus-4.6:thinking:medium", "anthropic/claude-sonnet-4.6", "anthropic/claude-sonnet-4.6:thinking", "arcee-ai/trinity-large", "arcee-ai/trinity-mini", "asi1-mini", "auto-model", "auto-model-basic", "auto-model-premium", "auto-model-standard", "azure-gpt-4-turbo", "azure-gpt-4o", "azure-gpt-4o-mini", "azure-o1", "azure-o3-mini", "baidu/ernie-4.5-300b-a47b", "baidu/ernie-4.5-vl-28b-a3b", "baseten/Kimi-K2-Instruct-FP4", "brave", "brave-pro", "brave-research", "chroma", "chutesai/Mistral-Small-3.2-24B-Instruct-2506", "claude-3-5-haiku-20241022", "claude-3-5-sonnet-20240620", "claude-3-5-sonnet-20241022", "claude-3-7-sonnet-20250219", "claude-3-7-sonnet-reasoner", "claude-3-7-sonnet-thinking", "claude-3-7-sonnet-thinking:1024", "claude-3-7-sonnet-thinking:128000", "claude-3-7-sonnet-thinking:32768", "claude-3-7-sonnet-thinking:8192", "claude-haiku-4-5-20251001", "claude-opus-4-1-20250805", "claude-opus-4-1-thinking", "claude-opus-4-1-thinking:1024", "claude-opus-4-1-thinking:32000", "claude-opus-4-1-thinking:32768", "claude-opus-4-1-thinking:8192", "claude-opus-4-20250514", "claude-opus-4-5-20251101", "claude-opus-4-5-20251101:thinking", "claude-opus-4-thinking", "claude-opus-4-thinking:1024", "claude-opus-4-thinking:32000", "claude-opus-4-thinking:32768", "claude-opus-4-thinking:8192", "claude-sonnet-4-20250514", "claude-sonnet-4-5-20250929", "claude-sonnet-4-5-20250929-thinking", "claude-sonnet-4-thinking", "claude-sonnet-4-thinking:1024", "claude-sonnet-4-thinking:32768", "claude-sonnet-4-thinking:64000", "claude-sonnet-4-thinking:8192", "cognitivecomputations/dolphin-2.9.2-qwen2-72b", "cohere/command-r", "cohere/command-r-plus-08-2024", "command-a-reasoning-08-2025", "deepclaude", "deepcogito/cogito-v1-preview-qwen-32B", "deepcogito/cogito-v2.1-671b", "deepseek-ai/DeepSeek-R1-0528", "deepseek-ai/DeepSeek-V3.1", "deepseek-ai/DeepSeek-V3.1-Terminus", "deepseek-ai/DeepSeek-V3.1-Terminus:thinking", "deepseek-ai/DeepSeek-V3.1:thinking", "deepseek-ai/deepseek-v3.2-exp", "deepseek-ai/deepseek-v3.2-exp-thinking", "deepseek-chat", "deepseek-chat-cheaper", "deepseek-math-v2", "deepseek-r1", "deepseek-r1-sambanova", "deepseek-reasoner", "deepseek-reasoner-cheaper", "deepseek-v3-0324", "deepseek/deepseek-prover-v2-671b", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-speciale", "deepseek/deepseek-v3.2:thinking", "dmind/dmind-1", "dmind/dmind-1-mini", "doubao-1-5-thinking-pro-250415", "doubao-1-5-thinking-pro-vision-250415", "doubao-1-5-thinking-vision-pro-250428", "doubao-1.5-pro-256k", "doubao-1.5-pro-32k", "doubao-1.5-vision-pro-32k", "doubao-seed-1-6-250615", "doubao-seed-1-6-flash-250615", "doubao-seed-1-6-thinking-250615", "doubao-seed-1-8-251215", "doubao-seed-2-0-code-preview-260215", "doubao-seed-2-0-lite-260215", "doubao-seed-2-0-mini-260215", "doubao-seed-2-0-pro-260215", "doubao-seed-code-preview-latest", "ernie-4.5-8k-preview", "ernie-4.5-turbo-128k", "ernie-4.5-turbo-vl-32k", "ernie-5.0-thinking-latest", "ernie-5.0-thinking-preview", "ernie-x1-32k", "ernie-x1-32k-preview", "ernie-x1-turbo-32k", "ernie-x1.1-preview", "essentialai/rnj-1-instruct", "exa-answer", "exa-research", "exa-research-pro", "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5", "fastgpt", "featherless-ai/Qwerky-72B", "gemini-2.0-flash-001", "gemini-2.0-flash-exp-image-generation", "gemini-2.0-flash-lite", "gemini-2.0-flash-thinking-exp-01-21", "gemini-2.0-flash-thinking-exp-1219", "gemini-2.0-pro-exp-02-05", "gemini-2.0-pro-reasoner", "gemini-2.5-flash", "gemini-2.5-flash-lite", "gemini-2.5-flash-lite-preview-06-17", "gemini-2.5-flash-lite-preview-09-2025", "gemini-2.5-flash-lite-preview-09-2025-thinking", "gemini-2.5-flash-nothinking", "gemini-2.5-flash-preview-04-17", "gemini-2.5-flash-preview-04-17:thinking", "gemini-2.5-flash-preview-05-20", "gemini-2.5-flash-preview-05-20:thinking", "gemini-2.5-flash-preview-09-2025", "gemini-2.5-flash-preview-09-2025-thinking", "gemini-2.5-pro", "gemini-2.5-pro-exp-03-25", "gemini-2.5-pro-preview-03-25", "gemini-2.5-pro-preview-05-06", "gemini-2.5-pro-preview-06-05", "gemini-3-pro-image-preview", "gemini-3-pro-preview", "gemini-3-pro-preview-thinking", "gemini-exp-1206", "glm-4", "glm-4-air", "glm-4-air-0111", "glm-4-airx", "glm-4-flash", "glm-4-long", "glm-4-plus", "glm-4-plus-0111", "glm-4.1v-thinking-flash", "glm-4.1v-thinking-flashx", "glm-z1-air", "glm-z1-airx", "glm-zero-preview", "google/gemini-3-flash-preview", "google/gemini-3-flash-preview-thinking", "google/gemini-flash-1.5", "grok-3-beta", "grok-3-fast-beta", "grok-3-mini-beta", "grok-3-mini-fast-beta", "hidream", "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated", "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated", "huihui-ai/Llama-3.1-Nemotron-70B-Instruct-HF-abliterated", "huihui-ai/Llama-3.3-70B-Instruct-abliterated", "huihui-ai/Qwen2.5-32B-Instruct-abliterated", "hunyuan-t1-latest", "hunyuan-turbos-20250226", "inflatebot/MN-12B-Mag-Mell-R1", "inflection/inflection-3-pi", "inflection/inflection-3-productivity", "jamba-large", "jamba-large-1.6", "jamba-large-1.7", "jamba-mini", "jamba-mini-1.6", "jamba-mini-1.7", "kimi-k2-instruct-fast", "kimi-thinking-preview", "learnlm-1.5-pro-experimental", "meganova-ai/manta-flash-1.0", "meganova-ai/manta-mini-1.0", "meganova-ai/manta-pro-1.0", "meituan-longcat/LongCat-Flash-Chat-FP8", "meta-llama/llama-3.1-8b-instruct", "meta-llama/llama-3.2-3b-instruct", "meta-llama/llama-3.2-90b-vision-instruct", "meta-llama/llama-3.3-70b-instruct", "meta-llama/llama-4-maverick", "meta-llama/llama-4-scout", "microsoft/MAI-DS-R1-FP8", "microsoft/wizardlm-2-8x22b", "minimax/minimax-01", "minimax/minimax-m2-her", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.7", "miromind-ai/mirothinker-v1.5-235b", "mistral-small-31-24b-instruct", "mistralai/Devstral-Small-2505", "mistralai/Mistral-Nemo-Instruct-2407", "mistralai/codestral-2508", "mistralai/devstral-2-123b-instruct-2512", "mistralai/ministral-14b-2512", "mistralai/ministral-14b-instruct-2512", "mistralai/ministral-3b-2512", "mistralai/ministral-8b-2512", "mistralai/mistral-7b-instruct", "mistralai/mistral-large", "mistralai/mistral-large-3-675b-instruct-2512", "mistralai/mistral-medium-3", "mistralai/mistral-medium-3.1", "mistralai/mistral-saba", "mistralai/mistral-small-creative", "mistralai/mistral-tiny", "mistralai/mixtral-8x22b-instruct-v0.1", "mistralai/mixtral-8x7b-instruct-v0.1", "mlabonne/NeuralDaredevil-8B-abliterated", "moonshotai/Kimi-Dev-72B", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/kimi-k2-instruct", "moonshotai/kimi-k2-instruct-0711", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2-thinking-original", "moonshotai/kimi-k2-thinking-turbo-original", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.5:thinking", "moonshotai/kimi-k2.6", "moonshotai/kimi-k2.6:thinking", "nex-agi/deepseek-v3.1-nex-n1", "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16", "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF", "nvidia/Llama-3.1-Nemotron-Ultra-253B-v1", "nvidia/Llama-3.3-Nemotron-Super-49B-v1", "nvidia/Llama-3_3-Nemotron-Super-49B-v1_5", "nvidia/nemotron-3-nano-30b-a3b", "nvidia/nvidia-nemotron-nano-9b-v2", "openai/chatgpt-4o-latest", "openai/gpt-3.5-turbo", "openai/gpt-4-turbo", "openai/gpt-4-turbo-preview", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-2024-08-06", "openai/gpt-4o-2024-11-20", "openai/gpt-4o-mini", "openai/gpt-4o-mini-search-preview", "openai/gpt-4o-search-preview", "openai/gpt-5", "openai/gpt-5-chat-latest", "openai/gpt-5-codex", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-2025-11-13", "openai/gpt-5.1-chat", "openai/gpt-5.1-chat-latest", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-chat", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "openai/gpt-oss-safeguard-20b", "openai/o1", "openai/o1-preview", "openai/o1-pro", "openai/o3", "openai/o3-deep-research", "openai/o3-mini", "openai/o3-mini-high", "openai/o3-mini-low", "openai/o3-pro-2025-06-10", "openai/o4-mini", "openai/o4-mini-deep-research", "openai/o4-mini-high", "pamanseau/OpenReasoning-Nemotron-32B", "phi-4-mini-instruct", "phi-4-multimodal-instruct", "qvq-max", "qwen-3.6-plus", "qwen-image", "qwen-long", "qwen-max", "qwen-plus", "qwen-turbo", "qwen/Qwen3.6-35B-A3B", "qwen/Qwen3.6-35B-A3B:thinking", "qwen/qwen3.5-397b-a17b", "qwen25-vl-72b-instruct", "qwen3-30b-a3b-instruct-2507", "qwen3-coder-30b-a3b-instruct", "qwen3-max-2026-01-23", "qwen3-vl-235b-a22b-instruct-original", "qwen3-vl-235b-a22b-thinking", "qwen3.6-max-preview", "qwq-32b", "raifle/sorcererlm-8x22b", "sarvan-medium", "shisa-ai/shisa-v2-llama3.3-70b", "shisa-ai/shisa-v2.1-llama3.3-70b", "sonar", "sonar-deep-research", "sonar-pro", "sonar-reasoning-pro", "soob3123/GrayLine-Qwen3-8B", "soob3123/Veiled-Calla-12B", "soob3123/amoral-gemma3-27B-v2", "step-2-16k-exp", "step-2-mini", "step-3", "step-r1-v-mini", "stepfun-ai/step-3.5-flash", "stepfun-ai/step-3.5-flash:thinking", "study_gpt-chatgpt-4o-latest", "tencent/Hunyuan-MT-7B", "tngtech/DeepSeek-TNG-R1T2-Chimera", "tngtech/tng-r1t-chimera", "undi95/remm-slerp-l2-13b", "universal-summarizer", "unsloth/gemma-3-12b-it", "unsloth/gemma-3-1b-it", "unsloth/gemma-3-27b-it", "unsloth/gemma-3-4b-it", "v0-1.0-md", "v0-1.5-lg", "v0-1.5-md", "venice-uncensored", "venice-uncensored:web", "x-ai/grok-4-07-09", "x-ai/grok-4-fast", "x-ai/grok-4-fast:thinking", "x-ai/grok-4.1-fast", "x-ai/grok-4.1-fast-reasoning", "x-ai/grok-code-fast-1", "xiaomi/mimo-v2-flash", "xiaomi/mimo-v2-flash-original", "xiaomi/mimo-v2-flash-thinking", "xiaomi/mimo-v2-flash-thinking-original", "yi-large", "yi-lightning", "yi-medium-200k", "z-ai/glm-4.5v", "z-ai/glm-4.5v:thinking", "z-ai/glm-4.6", "z-ai/glm-4.6:thinking", "z-image-turbo", "zai-org/glm-4.7", "zai-org/glm-4.7-flash", "zai-org/glm-5", "zai-org/glm-5.1", "zai-org/glm-5.1:thinking", "zai-org/glm-5:thinking" ], docUrl: "https://docs.nano-gpt.com", gateway: "models.dev" }, "io-net": { url: "https://api.intelligence.io.solutions/api/v1", apiKeyEnvVar: "IOINTELLIGENCE_API_KEY", apiKeyHeader: "Authorization", name: "IO.NET", models: [ "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", "Qwen/Qwen2.5-VL-32B-Instruct", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-Next-80B-A3B-Instruct", "deepseek-ai/DeepSeek-R1-0528", "meta-llama/Llama-3.2-90B-Vision-Instruct", "meta-llama/Llama-3.3-70B-Instruct", "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", "mistralai/Devstral-Small-2505", "mistralai/Magistral-Small-2506", "mistralai/Mistral-Large-Instruct-2411", "mistralai/Mistral-Nemo-Instruct-2407", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/Kimi-K2-Thinking", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "zai-org/GLM-4.6" ], docUrl: "https://io.net/docs/guides/intelligence/io-intelligence", gateway: "models.dev" }, inception: { url: "https://api.inceptionlabs.ai/v1/", apiKeyEnvVar: "INCEPTION_API_KEY", apiKeyHeader: "Authorization", name: "Inception", models: ["mercury-2", "mercury-edit-2"], docUrl: "https://platform.inceptionlabs.ai/docs", gateway: "models.dev" }, submodel: { url: "https://llm.submodel.ai/v1", apiKeyEnvVar: "SUBMODEL_INSTAGEN_ACCESS_KEY", apiKeyHeader: "Authorization", name: "submodel", models: [ "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", "deepseek-ai/DeepSeek-R1-0528", "deepseek-ai/DeepSeek-V3-0324", "deepseek-ai/DeepSeek-V3.1", "openai/gpt-oss-120b", "zai-org/GLM-4.5-Air", "zai-org/GLM-4.5-FP8" ], docUrl: "https://submodel.gitbook.io", gateway: "models.dev" }, requesty: { url: "https://router.requesty.ai/v1", apiKeyEnvVar: "REQUESTY_API_KEY", apiKeyHeader: "Authorization", name: "Requesty", models: [ "anthropic/claude-3-7-sonnet", "anthropic/claude-haiku-4-5", "anthropic/claude-opus-4", "anthropic/claude-opus-4-1", "anthropic/claude-opus-4-5", "anthropic/claude-opus-4-6", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4-5", "anthropic/claude-sonnet-4-6", "google/gemini-2.5-flash", "google/gemini-2.5-pro", "google/gemini-3-flash-preview", "google/gemini-3-pro-preview", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4o-mini", "openai/gpt-5", "openai/gpt-5-chat", "openai/gpt-5-codex", "openai/gpt-5-image", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-chat", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-chat", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-pro", "openai/o4-mini", "xai/grok-4", "xai/grok-4-fast" ], docUrl: "https://requesty.ai/solution/llm-routing/models", gateway: "models.dev" }, zai: { url: "https://api.z.ai/api/paas/v4", apiKeyEnvVar: "ZHIPU_API_KEY", apiKeyHeader: "Authorization", name: "Z.AI", models: [ "glm-4.5", "glm-4.5-air", "glm-4.5-flash", "glm-4.5v", "glm-4.6", "glm-4.6v", "glm-4.7", "glm-4.7-flash", "glm-4.7-flashx", "glm-5", "glm-5-turbo", "glm-5.1", "glm-5v-turbo" ], docUrl: "https://docs.z.ai/guides/overview/pricing", gateway: "models.dev" }, "zai-coding-plan": { url: "https://api.z.ai/api/coding/paas/v4", apiKeyEnvVar: "ZHIPU_API_KEY", apiKeyHeader: "Authorization", name: "Z.AI Coding Plan", models: ["glm-4.5-air", "glm-4.7", "glm-5-turbo", "glm-5.1", "glm-5v-turbo"], docUrl: "https://docs.z.ai/devpack/overview", gateway: "models.dev" }, deepinfra: { apiKeyEnvVar: "DEEPINFRA_API_KEY", name: "Deep Infra", models: [ "MiniMaxAI/MiniMax-M2", "MiniMaxAI/MiniMax-M2.1", "MiniMaxAI/MiniMax-M2.5", "Qwen/Qwen3-Coder-480B-A35B-Instruct", "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", "Qwen/Qwen3.5-35B-A3B", "Qwen/Qwen3.5-397B-A17B", "Qwen/Qwen3.6-35B-A3B", "anthropic/claude-3-7-sonnet-latest", "anthropic/claude-4-opus", "deepseek-ai/DeepSeek-R1-0528", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V4-Flash", "deepseek-ai/DeepSeek-V4-Pro", "google/gemma-4-26B-A4B-it", "google/gemma-4-31B-it", "meta-llama/Llama-3.1-70B-Instruct", "meta-llama/Llama-3.1-70B-Instruct-Turbo", "meta-llama/Llama-3.1-8B-Instruct", "meta-llama/Llama-3.1-8B-Instruct-Turbo", "meta-llama/Llama-3.3-70B-Instruct-Turbo", "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", "meta-llama/Llama-4-Scout-17B-16E-Instruct", "moonshotai/Kimi-K2-Instruct", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/Kimi-K2-Thinking", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "xiaomi/mimo-v2.5", "xiaomi/mimo-v2.5-pro", "zai-org/GLM-4.6", "zai-org/GLM-4.6V", "zai-org/GLM-4.7", "zai-org/GLM-4.7-Flash", "zai-org/GLM-5", "zai-org/GLM-5.1" ], docUrl: "https://deepinfra.com/models", gateway: "models.dev", npm: "@ai-sdk/deepinfra" }, clarifai: { url: "https://api.clarifai.com/v2/ext/openai/v1", apiKeyEnvVar: "CLARIFAI_PAT", apiKeyHeader: "Authorization", name: "Clarifai", models: [ "arcee_ai/AFM/models/trinity-mini", "clarifai/main/models/mm-poly-8b", "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput", "mistralai/completion/models/Ministral-3-14B-Reasoning-2512", "mistralai/completion/models/Ministral-3-3B-Reasoning-2512", "moonshotai/chat-completion/models/Kimi-K2_6", "openai/chat-completion/models/gpt-oss-120b-high-throughput", "openai/chat-completion/models/gpt-oss-20b", "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507" ], docUrl: "https://docs.clarifai.com/compute/inference/", gateway: "models.dev" }, moark: { url: "https://moark.com/v1", apiKeyEnvVar: "MOARK_API_KEY", apiKeyHeader: "Authorization", name: "Moark", models: ["GLM-4.7", "MiniMax-M2.1"], docUrl: "https://moark.com/docs/openapi/v1#tag/%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90", gateway: "models.dev" }, frogbot: { url: "https://app.frogbot.ai/api/v1", apiKeyEnvVar: "FROGBOT_API_KEY", apiKeyHeader: "Authorization", name: "FrogBot", models: [ "claude-haiku-4-5", "claude-opus-4-6", "claude-opus-4-7", "claude-sonnet-4-6", "deepseek-v4-pro", "gemini-2.5-flash", "gemini-2.5-pro", "gemini-3-1-pro-preview", "gemini-3-flash-preview", "gpt-4o", "gpt-5-3-codex", "gpt-5-4-mini", "gpt-5-4-nano", "gpt-5-5", "gpt-oss-120b", "gpt-oss-20b", "grok-4-1-fast-non-reasoning", "grok-4-1-fast-reasoning", "grok-4-3", "grok-code-fast-1", "kimi-k2-6", "kimi-k2.5", "minimax-m2-5", "minimax-m2-7", "qwen-3-6-plus", "zai-glm-5-1" ], docUrl: "https://docs.frogbot.ai", gateway: "models.dev" }, wandb: { url: "https://api.inference.wandb.ai/v1", apiKeyEnvVar: "WANDB_API_KEY", apiKeyHeader: "Authorization", name: "Weights & Biases", models: [ "MiniMaxAI/MiniMax-M2.5", "OpenPipe/Qwen3-14B-Instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-Coder-480B-A35B-Instruct", "deepseek-ai/DeepSeek-V3.1", "meta-llama/Llama-3.1-70B-Instruct", "meta-llama/Llama-3.1-8B-Instruct", "meta-llama/Llama-3.3-70B-Instruct", "meta-llama/Llama-4-Scout-17B-16E-Instruct", "microsoft/Phi-4-mini-instruct", "moonshotai/Kimi-K2.5", "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "zai-org/GLM-5-FP8", "zai-org/GLM-5.1" ], docUrl: "https://docs.wandb.ai/guides/integrations/inference/", gateway: "models.dev" }, gmicloud: { url: "https://api.gmi-serving.com/v1", apiKeyEnvVar: "GMICLOUD_API_KEY", apiKeyHeader: "Authorization", name: "GMI Cloud", models: [ "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-4.6", "deepseek-ai/DeepSeek-V4-Flash", "deepseek-ai/DeepSeek-V4-Pro", "moonshotai/Kimi-K2.6", "zai-org/GLM-5-FP8", "zai-org/GLM-5.1-FP8" ], docUrl: "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", gateway: "models.dev" }, crof: { url: "https://crof.ai/v1", apiKeyEnvVar: "CROF_API_KEY", apiKeyHeader: "Authorization", name: "CrofAI", models: [ "deepseek-v3.2", "deepseek-v4-flash", "deepseek-v4-pro", "deepseek-v4-pro-precision", "gemma-4-31b-it", "glm-4.7", "glm-4.7-flash", "glm-5", "glm-5.1", "glm-5.1-precision", "greg", "kimi-k2.5", "kimi-k2.5-lightning", "kimi-k2.6", "kimi-k2.6-precision", "mimo-v2.5-pro", "mimo-v2.5-pro-precision", "minimax-m2.5", "qwen3.5-397b-a17b", "qwen3.5-9b", "qwen3.6-27b" ], docUrl: "https://crof.ai/docs", gateway: "models.dev" }, ambient: { url: "https://api.ambient.xyz/v1", apiKeyEnvVar: "AMBIENT_API_KEY", apiKeyHeader: "Authorization", name: "Ambient", models: ["moonshotai/kimi-k2.6", "zai-org/GLM-5.1-FP8"], docUrl: "https://ambient.xyz", gateway: "models.dev" }, "routing-run": { url: "https://api.routing.run/v1", apiKeyEnvVar: "ROUTING_RUN_API_KEY", apiKeyHeader: "Authorization", name: "routing.run", models: [ "route/deepseek-v3.2", "route/deepseek-v4-flash", "route/deepseek-v4-flash-6bit", "route/deepseek-v4-pro", "route/deepseek-v4-pro-6bit", "route/gemma-4-31b-it", "route/glm-5.1", "route/glm-5.1-6bit", "route/kimi-k2.5", "route/kimi-k2.6", "route/kimi-k2.6-6bit", "route/mimo-v2.5-pro", "route/mimo-v2.5-pro-6bit", "route/minimax-m2.5", "route/minimax-m2.5-highspeed", "route/minimax-m2.7", "route/minimax-m2.7-highspeed", "route/mistral-large-3", "route/mistral-medium-2505", "route/mistral-small-2503", "route/qwen3.6-27b", "route/step-3.5-flash", "route/step-3.5-flash-2603", "route/stepfun-3.5-flash" ], docUrl: "https://docs.routing.run/api-reference/models", gateway: "models.dev" }, "the-grid-ai": { url: "https://api.thegrid.ai/v1", apiKeyEnvVar: "THEGRIDAI_API_KEY", apiKeyHeader: "Authorization", name: "The Grid AI", models: [ "agent-max", "agent-prime", "agent-standard", "code-max", "code-prime", "code-standard", "text-max", "text-prime", "text-standard" ], docUrl: "https://thegrid.ai/docs", gateway: "models.dev" }, fastrouter: { url: "https://go.fastrouter.ai/api/v1", apiKeyEnvVar: "FASTROUTER_API_KEY", apiKeyHeader: "Authorization", name: "FastRouter", models: [ "anthropic/claude-opus-4.1", "anthropic/claude-sonnet-4", "deepseek-ai/deepseek-r1-distill-llama-70b", "google/gemini-2.5-flash", "google/gemini-2.5-pro", "moonshotai/kimi-k2", "openai/gpt-4.1", "openai/gpt-5", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "qwen/qwen3-coder", "x-ai/grok-4", "z-ai/glm-5" ], docUrl: "https://fastrouter.ai/models", gateway: "models.dev" }, "tencent-coding-plan": { url: "https://api.lkeap.cloud.tencent.com/coding/v3", apiKeyEnvVar: "TENCENT_CODING_PLAN_API_KEY", apiKeyHeader: "Authorization", name: "Tencent Coding Plan (China)", models: [ "glm-5", "hunyuan-2.0-instruct", "hunyuan-2.0-thinking", "hunyuan-t1", "hunyuan-turbos", "kimi-k2.5", "minimax-m2.5", "tc-code-latest" ], docUrl: "https://cloud.tencent.com/document/product/1772/128947", gateway: "models.dev" }, cortecs: { url: "https://api.cortecs.ai/v1", apiKeyEnvVar: "CORTECS_API_KEY", apiKeyHeader: "Authorization", name: "Cortecs", models: [ "claude-4-5-sonnet", "claude-4-6-sonnet", "claude-haiku-4-5", "claude-opus4-5", "claude-opus4-6", "claude-opus4-7", "claude-sonnet-4", "codestral-2508", "deepseek-r1-0528", "deepseek-v3-0324", "deepseek-v3.2", "deepseek-v4-flash", "deepseek-v4-pro", "devstral-2512", "devstral-small-2512", "gemini-2.5-pro", "glm-4.5", "glm-4.5-air", "glm-4.7", "glm-4.7-flash", "glm-5", "glm-5.1", "gpt-4.1", "gpt-oss-120b", "hermes-4-70b", "intellect-3", "kimi-k2-instruct", "kimi-k2-thinking", "kimi-k2.5", "kimi-k2.6", "llama-3.1-405b-instruct", "llama-3.3-70b-instruct", "minimax-m2", "minimax-m2.1", "minimax-m2.5", "minimax-m2.7", "mistral-large-2512", "mixtral-8x7B-instruct-v0.1", "nemotron-3-super-120b-a12b", "nova-pro-v1", "qwen-2.5-72b-instruct", "qwen3-235b-a22b-instruct-2507", "qwen3-32b", "qwen3-coder-30b-a3b-instruct", "qwen3-coder-480b-a35b-instruct", "qwen3-coder-next", "qwen3-next-80b-a3b-thinking", "qwen3.5-122b-a10b", "qwen3.5-397b-a17b" ], docUrl: "https://api.cortecs.ai/v1/models", gateway: "models.dev" }, baseten: { url: "https://inference.baseten.co/v1", apiKeyEnvVar: "BASETEN_API_KEY", apiKeyHeader: "Authorization", name: "Baseten", models: [ "MiniMaxAI/MiniMax-M2.5", "deepseek-ai/DeepSeek-V3-0324", "deepseek-ai/DeepSeek-V3.1", "deepseek-ai/DeepSeek-V4-Pro", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "nvidia/Nemotron-120B-A12B", "openai/gpt-oss-120b", "zai-org/GLM-4.6", "zai-org/GLM-4.7", "zai-org/GLM-5" ], docUrl: "https://docs.baseten.co/development/model-apis/overview", gateway: "models.dev" }, llama: { url: "https://api.llama.com/compat/v1/", apiKeyEnvVar: "LLAMA_API_KEY", apiKeyHeader: "Authorization", name: "Llama", models: [ "cerebras-llama-4-maverick-17b-128e-instruct", "cerebras-llama-4-scout-17b-16e-instruct", "groq-llama-4-maverick-17b-128e-instruct", "llama-3.3-70b-instruct", "llama-3.3-8b-instruct", "llama-4-maverick-17b-128e-instruct-fp8", "llama-4-scout-17b-16e-instruct-fp8" ], docUrl: "https://llama.developer.meta.com/docs/models", gateway: "models.dev" }, "novita-ai": { url: "https://api.novita.ai/openai", apiKeyEnvVar: "NOVITA_API_KEY", apiKeyHeader: "Authorization", name: "NovitaAI", models: [ "baichuan/baichuan-m2-32b", "baidu/ernie-4.5-21B-a3b", "baidu/ernie-4.5-21B-a3b-thinking", "baidu/ernie-4.5-300b-a47b-paddle", "baidu/ernie-4.5-vl-28b-a3b", "baidu/ernie-4.5-vl-28b-a3b-thinking", "baidu/ernie-4.5-vl-424b-a47b", "deepseek/deepseek-ocr", "deepseek/deepseek-ocr-2", "deepseek/deepseek-prover-v2-671b", "deepseek/deepseek-r1-0528", "deepseek/deepseek-r1-0528-qwen3-8b", "deepseek/deepseek-r1-distill-llama-70b", "deepseek/deepseek-r1-distill-qwen-14b", "deepseek/deepseek-r1-distill-qwen-32b", "deepseek/deepseek-r1-turbo", "deepseek/deepseek-v3-0324", "deepseek/deepseek-v3-turbo", "deepseek/deepseek-v3.1", "deepseek/deepseek-v3.1-terminus", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-pro", "google/gemma-3-12b-it", "google/gemma-3-27b-it", "google/gemma-4-26b-a4b-it", "google/gemma-4-31b-it", "gryphe/mythomax-l2-13b", "inclusionai/ling-2.6-1t", "inclusionai/ling-2.6-flash", "kwaipilot/kat-coder-pro", "meta-llama/llama-3-70b-instruct", "meta-llama/llama-3-8b-instruct", "meta-llama/llama-3.1-8b-instruct", "meta-llama/llama-3.2-3b-instruct", "meta-llama/llama-3.3-70b-instruct", "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", "meta-llama/llama-4-scout-17b-16e-instruct", "microsoft/wizardlm-2-8x22b", "minimax/minimax-m2", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.5-highspeed", "minimax/minimax-m2.7", "minimaxai/minimax-m1-80k", "mistralai/mistral-nemo", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-instruct", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.6", "nousresearch/hermes-2-pro-llama-3-8b", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "paddlepaddle/paddleocr-vl", "qwen/qwen-2.5-72b-instruct", "qwen/qwen-mt-plus", "qwen/qwen2.5-7b-instruct", "qwen/qwen2.5-vl-72b-instruct", "qwen/qwen3-235b-a22b-fp8", "qwen/qwen3-235b-a22b-instruct-2507", "qwen/qwen3-235b-a22b-thinking-2507", "qwen/qwen3-30b-a3b-fp8", "qwen/qwen3-32b-fp8", "qwen/qwen3-4b-fp8", "qwen/qwen3-8b-fp8", "qwen/qwen3-coder-30b-a3b-instruct", "qwen/qwen3-coder-480b-a35b-instruct", "qwen/qwen3-coder-next", "qwen/qwen3-max", "qwen/qwen3-next-80b-a3b-instruct", "qwen/qwen3-next-80b-a3b-thinking", "qwen/qwen3-omni-30b-a3b-instruct", "qwen/qwen3-omni-30b-a3b-thinking", "qwen/qwen3-vl-235b-a22b-instruct", "qwen/qwen3-vl-235b-a22b-thinking", "qwen/qwen3-vl-30b-a3b-instruct", "qwen/qwen3-vl-30b-a3b-thinking", "qwen/qwen3-vl-8b-instruct", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-27b", "qwen/qwen3.5-35b-a3b", "qwen/qwen3.5-397b-a17b", "sao10K/L3-8B-stheno-v3.2", "sao10K/l3-70b-euryale-v2.1", "sao10K/l3-8b-lunaris", "sao10K/l31-70b-euryale-v2.2", "xiaomimimo/mimo-v2-flash", "zai-org/autoglm-phone-9b-multilingual", "zai-org/glm-4.5", "zai-org/glm-4.5-air", "zai-org/glm-4.5v", "zai-org/glm-4.6", "zai-org/glm-4.6v", "zai-org/glm-4.7", "zai-org/glm-4.7-flash", "zai-org/glm-5", "zai-org/glm-5.1" ], docUrl: "https://novita.ai/docs/guides/introduction", gateway: "models.dev" }, digitalocean: { url: "https://inference.do-ai.run/v1", apiKeyEnvVar: "DIGITALOCEAN_ACCESS_TOKEN", apiKeyHeader: "Authorization", name: "DigitalOcean", models: [ "alibaba-qwen3-32b", "all-mini-lm-l6-v2", "anthropic-claude-4.1-opus", "anthropic-claude-4.5-haiku", "anthropic-claude-4.5-sonnet", "anthropic-claude-4.6-sonnet", "anthropic-claude-haiku-4.5", "anthropic-claude-opus-4", "anthropic-claude-opus-4.5", "anthropic-claude-opus-4.6", "anthropic-claude-opus-4.7", "anthropic-claude-sonnet-4", "arcee-trinity-large-thinking", "bge-m3", "bge-reranker-v2-m3", "deepseek-3.2", "deepseek-r1-distill-llama-70b", "deepseek-v3", "deepseek-v4-pro", "e5-large-v2", "fal-ai/elevenlabs/tts/multilingual-v2", "fal-ai/fast-sdxl", "fal-ai/flux/schnell", "fal-ai/stable-audio-25/text-to-audio", "gemma-4-31B-it", "glm-5", "gte-large-en-v1.5", "kimi-k2.5", "kimi-k2.6", "llama-4-maverick", "llama3-8b-instruct", "llama3.3-70b-instruct", "minimax-m2.5", "ministral-3-8b-instruct-2512", "mistral-3-14B", "mistral-7b-instruct-v0.3", "multi-qa-mpnet-base-dot-v1", "nemotron-3-nano-30b", "nemotron-3-nano-omni", "nemotron-nano-12b-v2-vl", "nvidia-nemotron-3-super-120b", "openai-gpt-4.1", "openai-gpt-4o", "openai-gpt-4o-mini", "openai-gpt-5", "openai-gpt-5-mini", "openai-gpt-5-nano", "openai-gpt-5.1-codex-max", "openai-gpt-5.2", "openai-gpt-5.2-pro", "openai-gpt-5.3-codex", "openai-gpt-5.4", "openai-gpt-5.4-mini", "openai-gpt-5.4-nano", "openai-gpt-5.4-pro", "openai-gpt-5.5", "openai-gpt-image-1", "openai-gpt-image-1.5", "openai-gpt-image-2", "openai-gpt-oss-120b", "openai-gpt-oss-20b", "openai-o1", "openai-o3", "openai-o3-mini", "qwen-2.5-14b-instruct", "qwen3-coder-flash", "qwen3-embedding-0.6b", "qwen3-tts-voicedesign", "qwen3.5-397b-a17b", "stable-diffusion-3.5-large", "wan2-2-t2v-a14b" ], docUrl: "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", gateway: "models.dev" }, moonshotai: { url: "https://api.moonshot.ai/anthropic/v1", apiKeyEnvVar: "MOONSHOT_API_KEY", apiKeyHeader: "Authorization", name: "Moonshot AI", models: [ "kimi-k2-0711-preview", "kimi-k2-0905-preview", "kimi-k2-thinking", "kimi-k2-thinking-turbo", "kimi-k2-turbo-preview", "kimi-k2.5", "kimi-k2.6" ], docUrl: "https://platform.moonshot.ai/docs/api/chat", gateway: "models.dev", npm: "@ai-sdk/anthropic" }, mistral: { url: "https://api.mistral.ai/v1", apiKeyEnvVar: "MISTRAL_API_KEY", name: "Mistral", models: [ "codestral-latest", "devstral-2512", "devstral-medium-2507", "devstral-medium-latest", "devstral-small-2505", "devstral-small-2507", "labs-devstral-small-2512", "magistral-medium-latest", "magistral-small", "ministral-3b-latest", "ministral-8b-latest", "mistral-embed", "mistral-large-2411", "mistral-large-2512", "mistral-large-latest", "mistral-medium-2505", "mistral-medium-2508", "mistral-medium-2604", "mistral-medium-latest", "mistral-nemo", "mistral-small-2506", "mistral-small-2603", "mistral-small-latest", "open-mistral-7b", "open-mixtral-8x22b", "open-mixtral-8x7b", "pixtral-12b", "pixtral-large-latest" ], docUrl: "https://docs.mistral.ai/getting-started/models/", gateway: "models.dev", npm: "@ai-sdk/mistral" }, kilo: { url: "https://api.kilo.ai/api/gateway", apiKeyEnvVar: "KILO_API_KEY", apiKeyHeader: "Authorization", name: "Kilo Gateway", models: [ "ai21/jamba-large-1.7", "aion-labs/aion-1.0", "aion-labs/aion-1.0-mini", "aion-labs/aion-2.0", "aion-labs/aion-rp-llama-3.1-8b", "alfredpros/codellama-7b-instruct-solidity", "alibaba/tongyi-deepresearch-30b-a3b", "allenai/olmo-3-32b-think", "amazon/nova-2-lite-v1", "amazon/nova-lite-v1", "amazon/nova-micro-v1", "amazon/nova-premier-v1", "amazon/nova-pro-v1", "anthracite-org/magnum-v4-72b", "anthropic/claude-3-haiku", "anthropic/claude-3.5-haiku", "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.6-fast", "anthropic/claude-opus-4.7", "anthropic/claude-opus-4.7-fast", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "arcee-ai/coder-large", "arcee-ai/maestro-reasoning", "arcee-ai/spotlight", "arcee-ai/trinity-large-preview", "arcee-ai/trinity-large-thinking", "arcee-ai/trinity-mini", "arcee-ai/virtuoso-large", "baidu/cobuddy:free", "baidu/ernie-4.5-21b-a3b", "baidu/ernie-4.5-21b-a3b-thinking", "baidu/ernie-4.5-300b-a47b", "baidu/ernie-4.5-vl-28b-a3b", "baidu/ernie-4.5-vl-424b-a47b", "baidu/qianfan-ocr-fast", "bytedance-seed/seed-1.6", "bytedance-seed/seed-1.6-flash", "bytedance-seed/seed-2.0-lite", "bytedance-seed/seed-2.0-mini", "bytedance/ui-tars-1.5-7b", "cohere/command-a", "cohere/command-r-08-2024", "cohere/command-r-plus-08-2024", "cohere/command-r7b-12-2024", "deepcogito/cogito-v2.1-671b", "deepseek/deepseek-chat", "deepseek/deepseek-chat-v3-0324", "deepseek/deepseek-chat-v3.1", "deepseek/deepseek-r1", "deepseek/deepseek-r1-0528", "deepseek/deepseek-r1-distill-llama-70b", "deepseek/deepseek-r1-distill-qwen-32b", "deepseek/deepseek-v3.1-terminus", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v3.2-speciale", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-flash:free", "deepseek/deepseek-v4-pro", "essentialai/rnj-1-instruct", "google/gemini-2.0-flash-001", "google/gemini-2.0-flash-lite-001", "google/gemini-2.5-flash", "google/gemini-2.5-flash-image", "google/gemini-2.5-flash-lite", "google/gemini-2.5-flash-lite-preview-09-2025", "google/gemini-2.5-pro", "google/gemini-2.5-pro-preview", "google/gemini-2.5-pro-preview-05-06", "google/gemini-3-flash-preview", "google/gemini-3-pro-image-preview", "google/gemini-3.1-flash-image-preview", "google/gemini-3.1-flash-lite", "google/gemini-3.1-flash-lite-preview", "google/gemini-3.1-pro-preview", "google/gemini-3.1-pro-preview-customtools", "google/gemma-2-27b-it", "google/gemma-3-12b-it", "google/gemma-3-27b-it", "google/gemma-3-4b-it", "google/gemma-3n-e4b-it", "google/gemma-4-26b-a4b-it", "google/gemma-4-31b-it", "google/lyria-3-clip-preview", "google/lyria-3-pro-preview", "gryphe/mythomax-l2-13b", "ibm-granite/granite-4.0-h-micro", "ibm-granite/granite-4.1-8b", "inception/mercury-2", "inclusionai/ling-2.6-1t", "inclusionai/ling-2.6-flash", "inclusionai/ring-2.6-1t", "inflection/inflection-3-pi", "inflection/inflection-3-productivity", "kilo-auto/balanced", "kilo-auto/free", "kilo-auto/frontier", "kilo-auto/small", "kwaipilot/kat-coder-pro-v2", "liquid/lfm-2-24b-a2b", "mancer/weaver", "meta-llama/llama-3-70b-instruct", "meta-llama/llama-3-8b-instruct", "meta-llama/llama-3.1-70b-instruct", "meta-llama/llama-3.1-8b-instruct", "meta-llama/llama-3.2-11b-vision-instruct", "meta-llama/llama-3.2-1b-instruct", "meta-llama/llama-3.2-3b-instruct", "meta-llama/llama-3.3-70b-instruct", "meta-llama/llama-4-maverick", "meta-llama/llama-4-scout", "meta-llama/llama-guard-3-8b", "meta-llama/llama-guard-4-12b", "microsoft/phi-4", "microsoft/phi-4-mini-instruct", "microsoft/wizardlm-2-8x22b", "minimax/minimax-01", "minimax/minimax-m1", "minimax/minimax-m2", "minimax/minimax-m2-her", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.7", "mistralai/codestral-2508", "mistralai/devstral-2512", "mistralai/devstral-medium", "mistralai/devstral-small", "mistralai/ministral-14b-2512", "mistralai/ministral-3b-2512", "mistralai/ministral-8b-2512", "mistralai/mistral-7b-instruct-v0.1", "mistralai/mistral-large", "mistralai/mistral-large-2407", "mistralai/mistral-large-2411", "mistralai/mistral-large-2512", "mistralai/mistral-medium-3", "mistralai/mistral-medium-3-5", "mistralai/mistral-medium-3.1", "mistralai/mistral-nemo", "mistralai/mistral-saba", "mistralai/mistral-small-24b-instruct-2501", "mistralai/mistral-small-2603", "mistralai/mistral-small-3.1-24b-instruct", "mistralai/mistral-small-3.2-24b-instruct", "mistralai/mixtral-8x22b-instruct", "mistralai/pixtral-large-2411", "mistralai/voxtral-small-24b-2507", "moonshotai/kimi-k2", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.6", "morph/morph-v3-fast", "morph/morph-v3-large", "nex-agi/deepseek-v3.1-nex-n1", "nousresearch/hermes-2-pro-llama-3-8b", "nousresearch/hermes-3-llama-3.1-405b", "nousresearch/hermes-3-llama-3.1-70b", "nousresearch/hermes-4-405b", "nousresearch/hermes-4-70b", "nvidia/llama-3.3-nemotron-super-49b-v1.5", "nvidia/nemotron-3-nano-30b-a3b", "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", "nvidia/nemotron-3-super-120b-a12b", "nvidia/nemotron-3-super-120b-a12b:free", "nvidia/nemotron-nano-9b-v2", "openai/gpt-3.5-turbo", "openai/gpt-3.5-turbo-0613", "openai/gpt-3.5-turbo-16k", "openai/gpt-3.5-turbo-instruct", "openai/gpt-4", "openai/gpt-4-0314", "openai/gpt-4-1106-preview", "openai/gpt-4-turbo", "openai/gpt-4-turbo-preview", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-2024-05-13", "openai/gpt-4o-2024-08-06", "openai/gpt-4o-2024-11-20", "openai/gpt-4o-audio-preview", "openai/gpt-4o-mini", "openai/gpt-4o-mini-2024-07-18", "openai/gpt-4o-mini-search-preview", "openai/gpt-4o-search-preview", "openai/gpt-5", "openai/gpt-5-chat", "openai/gpt-5-codex", "openai/gpt-5-image", "openai/gpt-5-image-mini", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-chat", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-chat", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-chat", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-image-2", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "openai/gpt-audio", "openai/gpt-audio-mini", "openai/gpt-chat-latest", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "openai/gpt-oss-safeguard-20b", "openai/o1", "openai/o1-pro", "openai/o3", "openai/o3-deep-research", "openai/o3-mini", "openai/o3-mini-high", "openai/o3-pro", "openai/o4-mini", "openai/o4-mini-deep-research", "openai/o4-mini-high", "openrouter/auto", "openrouter/bodybuilder", "openrouter/free", "openrouter/owl-alpha", "openrouter/pareto-code", "perceptron/perceptron-mk1", "perplexity/sonar", "perplexity/sonar-deep-research", "perplexity/sonar-pro", "perplexity/sonar-pro-search", "perplexity/sonar-reasoning-pro", "poolside/laguna-m.1:free", "poolside/laguna-xs.2:free", "prime-intellect/intellect-3", "qwen/qwen-2.5-72b-instruct", "qwen/qwen-2.5-7b-instruct", "qwen/qwen-2.5-coder-32b-instruct", "qwen/qwen-plus", "qwen/qwen-plus-2025-07-28", "qwen/qwen-plus-2025-07-28:thinking", "qwen/qwen2.5-vl-72b-instruct", "qwen/qwen3-14b", "qwen/qwen3-235b-a22b", "qwen/qwen3-235b-a22b-2507", "qwen/qwen3-235b-a22b-thinking-2507", "qwen/qwen3-30b-a3b", "qwen/qwen3-30b-a3b-instruct-2507", "qwen/qwen3-30b-a3b-thinking-2507", "qwen/qwen3-32b", "qwen/qwen3-8b", "qwen/qwen3-coder", "qwen/qwen3-coder-30b-a3b-instruct", "qwen/qwen3-coder-flash", "qwen/qwen3-coder-next", "qwen/qwen3-coder-plus", "qwen/qwen3-max", "qwen/qwen3-max-thinking", "qwen/qwen3-next-80b-a3b-instruct", "qwen/qwen3-next-80b-a3b-thinking", "qwen/qwen3-vl-235b-a22b-instruct", "qwen/qwen3-vl-235b-a22b-thinking", "qwen/qwen3-vl-30b-a3b-instruct", "qwen/qwen3-vl-30b-a3b-thinking", "qwen/qwen3-vl-32b-instruct", "qwen/qwen3-vl-8b-instruct", "qwen/qwen3-vl-8b-thinking", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-27b", "qwen/qwen3.5-35b-a3b", "qwen/qwen3.5-397b-a17b", "qwen/qwen3.5-9b", "qwen/qwen3.5-flash-02-23", "qwen/qwen3.5-plus-02-15", "qwen/qwen3.5-plus-20260420", "qwen/qwen3.6-27b", "qwen/qwen3.6-35b-a3b", "qwen/qwen3.6-flash", "qwen/qwen3.6-max-preview", "qwen/qwen3.6-plus", "rekaai/reka-edge", "rekaai/reka-flash-3", "relace/relace-apply-3", "relace/relace-search", "sao10k/l3-euryale-70b", "sao10k/l3-lunaris-8b", "sao10k/l3.1-70b-hanami-x1", "sao10k/l3.1-euryale-70b", "sao10k/l3.3-euryale-70b", "stepfun/step-3.5-flash", "stepfun/step-3.5-flash:free", "switchpoint/router", "tencent/hunyuan-a13b-instruct", "tencent/hy3-preview", "thedrummer/cydonia-24b-v4.1", "thedrummer/rocinante-12b", "thedrummer/skyfall-36b-v2", "thedrummer/unslopnemo-12b", "undi95/remm-slerp-l2-13b", "upstage/solar-pro-3", "writer/palmyra-x5", "x-ai/grok-4.20", "x-ai/grok-4.20-multi-agent", "x-ai/grok-4.3", "x-ai/grok-code-fast-1:optimized:free", "xiaomi/mimo-v2-flash", "xiaomi/mimo-v2-omni", "xiaomi/mimo-v2-pro", "xiaomi/mimo-v2.5", "xiaomi/mimo-v2.5-pro", "z-ai/glm-4-32b", "z-ai/glm-4.5", "z-ai/glm-4.5-air", "z-ai/glm-4.5v", "z-ai/glm-4.6", "z-ai/glm-4.6v", "z-ai/glm-4.7", "z-ai/glm-4.7-flash", "z-ai/glm-5", "z-ai/glm-5-turbo", "z-ai/glm-5.1", "z-ai/glm-5v-turbo", "~anthropic/claude-haiku-latest", "~anthropic/claude-opus-latest", "~anthropic/claude-sonnet-latest", "~google/gemini-flash-latest", "~google/gemini-pro-latest", "~moonshotai/kimi-latest", "~openai/gpt-latest", "~openai/gpt-mini-latest" ], docUrl: "https://kilo.ai", gateway: "models.dev" }, "cloudflare-workers-ai": { url: "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", apiKeyEnvVar: "CLOUDFLARE_API_KEY", apiKeyHeader: "Authorization", name: "Cloudflare Workers AI", models: [ "@cf/aisingapore/gemma-sea-lion-v4-27b-it", "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", "@cf/google/gemma-3-12b-it", "@cf/google/gemma-4-26b-a4b-it", "@cf/ibm-granite/granite-4.0-h-micro", "@cf/meta/llama-2-7b-chat-fp16", "@cf/meta/llama-3-8b-instruct", "@cf/meta/llama-3-8b-instruct-awq", "@cf/meta/llama-3.1-8b-instruct-awq", "@cf/meta/llama-3.1-8b-instruct-fp8", "@cf/meta/llama-3.2-11b-vision-instruct", "@cf/meta/llama-3.2-1b-instruct", "@cf/meta/llama-3.2-3b-instruct", "@cf/meta/llama-3.3-70b-instruct-fp8-fast", "@cf/meta/llama-4-scout-17b-16e-instruct", "@cf/meta/llama-guard-3-8b", "@cf/mistral/mistral-7b-instruct-v0.1", "@cf/mistralai/mistral-small-3.1-24b-instruct", "@cf/moonshotai/kimi-k2.5", "@cf/moonshotai/kimi-k2.6", "@cf/nvidia/nemotron-3-120b-a12b", "@cf/openai/gpt-oss-120b", "@cf/openai/gpt-oss-20b", "@cf/qwen/qwen2.5-coder-32b-instruct", "@cf/qwen/qwen3-30b-a3b-fp8", "@cf/qwen/qwq-32b", "@cf/zai-org/glm-4.7-flash" ], docUrl: "https://developers.cloudflare.com/workers-ai/models/", gateway: "models.dev" }, lmstudio: { url: "http://127.0.0.1:1234/v1", apiKeyEnvVar: "LMSTUDIO_API_KEY", apiKeyHeader: "Authorization", name: "LMStudio", models: ["openai/gpt-oss-20b", "qwen/qwen3-30b-a3b-2507", "qwen/qwen3-coder-30b"], docUrl: "https://lmstudio.ai/models", gateway: "models.dev" }, "xiaomi-token-plan-cn": { url: "https://token-plan-cn.xiaomimimo.com/v1", apiKeyEnvVar: "XIAOMI_API_KEY", apiKeyHeader: "Authorization", name: "Xiaomi Token Plan (China)", models: ["mimo-v2-flash", "mimo-v2-omni", "mimo-v2-pro", "mimo-v2-tts", "mimo-v2.5", "mimo-v2.5-pro"], docUrl: "https://platform.xiaomimimo.com/#/docs", gateway: "models.dev" }, morph: { url: "https://api.morphllm.com/v1", apiKeyEnvVar: "MORPH_API_KEY", apiKeyHeader: "Authorization", name: "Morph", models: ["auto", "morph-v3-fast", "morph-v3-large"], docUrl: "https://docs.morphllm.com/api-reference/introduction", gateway: "models.dev" }, nearai: { url: "https://cloud-api.near.ai/v1", apiKeyEnvVar: "NEARAI_API_KEY", apiKeyHeader: "Authorization", name: "NEAR AI Cloud", models: [ "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-Embedding-0.6B", "Qwen/Qwen3-Reranker-0.6B", "Qwen/Qwen3-VL-30B-A3B-Instruct", "Qwen/Qwen3.5-122B-A10B", "anthropic/claude-haiku-4-5", "anthropic/claude-opus-4-6", "anthropic/claude-opus-4-7", "anthropic/claude-sonnet-4-5", "anthropic/claude-sonnet-4-6", "black-forest-labs/FLUX.2-klein-4B", "google/gemini-2.5-flash", "google/gemini-2.5-flash-lite", "google/gemini-2.5-pro", "google/gemini-3.1-flash-lite", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-5", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5.1", "openai/gpt-5.2", "openai/gpt-5.4", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.5", "openai/gpt-oss-120b", "openai/o3", "openai/o3-mini", "openai/o4-mini", "openai/whisper-large-v3", "zai-org/GLM-5.1-FP8" ], docUrl: "https://docs.near.ai/", gateway: "models.dev" }, abacus: { url: "https://routellm.abacus.ai/v1", apiKeyEnvVar: "ABACUS_API_KEY", apiKeyHeader: "Authorization", name: "Abacus", models: [ "Qwen/QwQ-32B", "Qwen/Qwen2.5-72B-Instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-32B", "Qwen/qwen3-coder-480b-a35b-instruct", "claude-3-7-sonnet-20250219", "claude-haiku-4-5-20251001", "claude-opus-4-1-20250805", "claude-opus-4-20250514", "claude-opus-4-5-20251101", "claude-opus-4-6", "claude-sonnet-4-20250514", "claude-sonnet-4-5-20250929", "claude-sonnet-4-6", "deepseek-ai/DeepSeek-R1", "deepseek-ai/DeepSeek-V3.1-Terminus", "deepseek-ai/DeepSeek-V3.2", "deepseek/deepseek-v3.1", "gemini-2.5-flash", "gemini-2.5-pro", "gemini-3-flash-preview", "gemini-3.1-flash-lite-preview", "gemini-3.1-pro-preview", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o-2024-11-20", "gpt-4o-mini", "gpt-5", "gpt-5-codex", "gpt-5-mini", "gpt-5-nano", "gpt-5.1", "gpt-5.1-chat-latest", "gpt-5.1-codex", "gpt-5.1-codex-max", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.2-codex", "gpt-5.3-chat-latest", "gpt-5.3-codex", "gpt-5.3-codex-xhigh", "gpt-5.4", "grok-4-0709", "grok-4-1-fast-non-reasoning", "grok-4-fast-non-reasoning", "grok-code-fast-1", "kimi-k2-turbo-preview", "kimi-k2.5", "llama-3.3-70b-versatile", "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", "meta-llama/Meta-Llama-3.1-8B-Instruct", "o3", "o3-mini", "o3-pro", "o4-mini", "openai/gpt-oss-120b", "qwen-2.5-coder-32b", "qwen3-max", "route-llm", "zai-org/glm-4.5", "zai-org/glm-4.6", "zai-org/glm-4.7", "zai-org/glm-5" ], docUrl: "https://abacus.ai/help/api", gateway: "models.dev" }, "privatemode-ai": { url: "http://localhost:8080/v1", apiKeyEnvVar: "PRIVATEMODE_API_KEY", apiKeyHeader: "Authorization", name: "Privatemode AI", models: ["gemma-3-27b", "gpt-oss-120b", "qwen3-coder-30b-a3b", "qwen3-embedding-4b", "whisper-large-v3"], docUrl: "https://docs.privatemode.ai/api/overview", gateway: "models.dev" }, "minimax-cn-coding-plan": { url: "https://api.minimaxi.com/anthropic/v1", apiKeyEnvVar: "MINIMAX_API_KEY", apiKeyHeader: "Authorization", name: "MiniMax Token Plan (minimaxi.com)", models: [ "MiniMax-M2", "MiniMax-M2.1", "MiniMax-M2.5", "MiniMax-M2.5-highspeed", "MiniMax-M2.7", "MiniMax-M2.7-highspeed" ], docUrl: "https://platform.minimaxi.com/docs/token-plan/intro", gateway: "models.dev", npm: "@ai-sdk/anthropic" }, "xiaomi-token-plan-ams": { url: "https://token-plan-ams.xiaomimimo.com/v1", apiKeyEnvVar: "XIAOMI_API_KEY", apiKeyHeader: "Authorization", name: "Xiaomi Token Plan (Europe)", models: ["mimo-v2-flash", "mimo-v2-omni", "mimo-v2-pro", "mimo-v2-tts", "mimo-v2.5", "mimo-v2.5-pro"], docUrl: "https://platform.xiaomimimo.com/#/docs", gateway: "models.dev" }, "cloudferro-sherlock": { url: "https://api-sherlock.cloudferro.com/openai/v1/", apiKeyEnvVar: "CLOUDFERRO_SHERLOCK_API_KEY", apiKeyHeader: "Authorization", name: "CloudFerro Sherlock", models: [ "MiniMaxAI/MiniMax-M2.5", "meta-llama/Llama-3.3-70B-Instruct", "openai/gpt-oss-120b", "speakleash/Bielik-11B-v2.6-Instruct", "speakleash/Bielik-11B-v3.0-Instruct" ], docUrl: "https://docs.sherlock.cloudferro.com/", gateway: "models.dev" }, openai: { apiKeyEnvVar: "OPENAI_API_KEY", name: "OpenAI", models: [ "chatgpt-image-latest", "gpt-3.5-turbo", "gpt-4", "gpt-4-turbo", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-4o-2024-05-13", "gpt-4o-2024-08-06", "gpt-4o-2024-11-20", "gpt-4o-mini", "gpt-5", "gpt-5-chat-latest", "gpt-5-codex", "gpt-5-mini", "gpt-5-nano", "gpt-5-pro", "gpt-5.1", "gpt-5.1-chat-latest", "gpt-5.1-codex", "gpt-5.1-codex-max", "gpt-5.1-codex-mini", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.2-codex", "gpt-5.2-pro", "gpt-5.3-chat-latest", "gpt-5.3-codex", "gpt-5.3-codex-spark", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano", "gpt-5.4-pro", "gpt-5.5", "gpt-5.5-pro", "gpt-image-1", "gpt-image-1-mini", "gpt-image-1.5", "o1", "o1-mini", "o1-preview", "o1-pro", "o3", "o3-deep-research", "o3-mini", "o3-pro", "o4-mini", "o4-mini-deep-research", "text-embedding-3-large", "text-embedding-3-small", "text-embedding-ada-002" ], docUrl: "https://platform.openai.com/docs/models", gateway: "models.dev", npm: "@ai-sdk/openai" }, dinference: { url: "https://api.dinference.com/v1", apiKeyEnvVar: "DINFERENCE_API_KEY", apiKeyHeader: "Authorization", name: "DInference", models: ["glm-4.7", "glm-5", "glm-5.1", "gpt-oss-120b", "minimax-m2.5"], docUrl: "https://dinference.com", gateway: "models.dev" }, vivgrid: { url: "https://api.vivgrid.com/v1", apiKeyEnvVar: "VIVGRID_API_KEY", apiKeyHeader: "Authorization", name: "Vivgrid", models: [ "deepseek-v3.2", "deepseek-v4-pro", "gemini-3.1-flash-lite-preview", "gemini-3.1-pro-preview", "gpt-5-mini", "gpt-5.1-codex", "gpt-5.1-codex-max", "gpt-5.2-codex", "gpt-5.3-codex", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano", "gpt-5.5" ], docUrl: "https://docs.vivgrid.com/models", gateway: "models.dev", npm: "@ai-sdk/openai" }, cerebras: { apiKeyEnvVar: "CEREBRAS_API_KEY", name: "Cerebras", models: ["gpt-oss-120b", "llama3.1-8b", "qwen-3-235b-a22b-instruct-2507", "zai-glm-4.7"], docUrl: "https://inference-docs.cerebras.ai/models/overview", gateway: "models.dev", npm: "@ai-sdk/cerebras" }, vultr: { url: "https://api.vultrinference.com/v1", apiKeyEnvVar: "VULTR_API_KEY", apiKeyHeader: "Authorization", name: "Vultr", models: ["DeepSeek-V3.2", "GLM-5-FP8", "Kimi-K2.5", "MiniMax-M2.5", "gpt-oss-120b"], docUrl: "https://api.vultrinference.com/", gateway: "models.dev" }, "kuae-cloud-coding-plan": { url: "https://coding-plan-endpoint.kuaecloud.net/v1", apiKeyEnvVar: "KUAE_API_KEY", apiKeyHeader: "Authorization", name: "KUAE Cloud Coding Plan", models: ["GLM-4.7"], docUrl: "https://docs.mthreads.com/kuaecloud/kuaecloud-doc-online/coding_plan/", gateway: "models.dev" }, modelscope: { url: "https://api-inference.modelscope.cn/v1", apiKeyEnvVar: "MODELSCOPE_API_KEY", apiKeyHeader: "Authorization", name: "ModelScope", models: [ "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-30B-A3B-Thinking-2507", "Qwen/Qwen3-Coder-30B-A3B-Instruct", "ZhipuAI/GLM-4.5", "ZhipuAI/GLM-4.6" ], docUrl: "https://modelscope.cn/docs/model-service/API-Inference/intro", gateway: "models.dev" }, "kimi-for-coding": { url: "https://api.kimi.com/coding/v1", apiKeyEnvVar: "KIMI_API_KEY", apiKeyHeader: "Authorization", name: "Kimi For Coding", models: ["k2p5", "k2p6", "kimi-k2-thinking"], docUrl: "https://www.kimi.com/coding/docs/en/third-party-agents.html", gateway: "models.dev", npm: "@ai-sdk/anthropic" }, lucidquery: { url: "https://lucidquery.com/api/v1", apiKeyEnvVar: "LUCIDQUERY_API_KEY", apiKeyHeader: "Authorization", name: "LucidQuery AI", models: ["lucidnova-rf1-100b", "lucidquery-nexus-coder"], docUrl: "https://lucidquery.com/api/docs", gateway: "models.dev" }, neuralwatt: { url: "https://api.neuralwatt.com/v1", apiKeyEnvVar: "NEURALWATT_API_KEY", apiKeyHeader: "Authorization", name: "Neuralwatt", models: [ "MiniMaxAI/MiniMax-M2.5", "Qwen/Qwen3.5-397B-A17B-FP8", "Qwen/Qwen3.6-35B-A3B", "glm-5-fast", "glm-5.1-fast", "kimi-k2.5-fast", "kimi-k2.6-fast", "mistralai/Devstral-Small-2-24B-Instruct-2512", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "openai/gpt-oss-20b", "qwen3.5-397b-fast", "qwen3.6-35b-fast", "zai-org/GLM-5.1-FP8" ], docUrl: "https://portal.neuralwatt.com/docs", gateway: "models.dev" }, jiekou: { url: "https://api.jiekou.ai/openai", apiKeyEnvVar: "JIEKOU_API_KEY", apiKeyHeader: "Authorization", name: "Jiekou.AI", models: [ "baidu/ernie-4.5-300b-a47b-paddle", "baidu/ernie-4.5-vl-424b-a47b", "claude-haiku-4-5-20251001", "claude-opus-4-1-20250805", "claude-opus-4-20250514", "claude-opus-4-5-20251101", "claude-opus-4-6", "claude-sonnet-4-20250514", "claude-sonnet-4-5-20250929", "deepseek/deepseek-r1-0528", "deepseek/deepseek-v3-0324", "deepseek/deepseek-v3.1", "gemini-2.5-flash", "gemini-2.5-flash-lite", "gemini-2.5-flash-lite-preview-06-17", "gemini-2.5-flash-lite-preview-09-2025", "gemini-2.5-flash-preview-05-20", "gemini-2.5-pro", "gemini-2.5-pro-preview-06-05", "gemini-3-flash-preview", "gemini-3-pro-preview", "gpt-5-chat-latest", "gpt-5-codex", "gpt-5-mini", "gpt-5-nano", "gpt-5-pro", "gpt-5.1", "gpt-5.1-codex", "gpt-5.1-codex-max", "gpt-5.1-codex-mini", "gpt-5.2", "gpt-5.2-codex", "gpt-5.2-pro", "grok-4-0709", "grok-4-1-fast-non-reasoning", "grok-4-1-fast-reasoning", "grok-4-fast-non-reasoning", "grok-4-fast-reasoning", "grok-code-fast-1", "minimax/minimax-m2.1", "minimaxai/minimax-m1-80k", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-instruct", "moonshotai/kimi-k2.5", "o3", "o3-mini", "o4-mini", "qwen/qwen3-235b-a22b-fp8", "qwen/qwen3-235b-a22b-instruct-2507", "qwen/qwen3-235b-a22b-thinking-2507", "qwen/qwen3-30b-a3b-fp8", "qwen/qwen3-32b-fp8", "qwen/qwen3-coder-480b-a35b-instruct", "qwen/qwen3-coder-next", "qwen/qwen3-next-80b-a3b-instruct", "qwen/qwen3-next-80b-a3b-thinking", "xiaomimimo/mimo-v2-flash", "zai-org/glm-4.5", "zai-org/glm-4.5v", "zai-org/glm-4.7", "zai-org/glm-4.7-flash" ], docUrl: "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", gateway: "models.dev" }, ovhcloud: { url: "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", apiKeyEnvVar: "OVHCLOUD_API_KEY", apiKeyHeader: "Authorization", name: "OVHcloud AI Endpoints", models: [ "gpt-oss-120b", "gpt-oss-20b", "llama-3.1-8b-instruct", "meta-llama-3_3-70b-instruct", "mistral-7b-instruct-v0.3", "mistral-nemo-instruct-2407", "mistral-small-3.2-24b-instruct-2506", "qwen2.5-vl-72b-instruct", "qwen3-32b", "qwen3-coder-30b-a3b-instruct", "qwen3.5-9b" ], docUrl: "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", gateway: "models.dev" }, friendli: { url: "https://api.friendli.ai/serverless/v1", apiKeyEnvVar: "FRIENDLI_TOKEN", apiKeyHeader: "Authorization", name: "Friendli", models: [ "MiniMaxAI/MiniMax-M2.5", "Qwen/Qwen3-235B-A22B-Instruct-2507", "meta-llama/Llama-3.1-8B-Instruct", "meta-llama/Llama-3.3-70B-Instruct", "zai-org/GLM-5", "zai-org/GLM-5.1" ], docUrl: "https://friendli.ai/docs/guides/serverless_endpoints/introduction", gateway: "models.dev" }, openrouter: { url: "https://openrouter.ai/api/v1", apiKeyEnvVar: "OPENROUTER_API_KEY", name: "OpenRouter", models: [ "ai21/jamba-large-1.7", "aion-labs/aion-1.0", "aion-labs/aion-1.0-mini", "aion-labs/aion-2.0", "aion-labs/aion-rp-llama-3.1-8b", "alfredpros/codellama-7b-instruct-solidity", "alibaba/tongyi-deepresearch-30b-a3b", "allenai/olmo-3-32b-think", "amazon/nova-2-lite-v1", "amazon/nova-lite-v1", "amazon/nova-micro-v1", "amazon/nova-premier-v1", "amazon/nova-pro-v1", "anthracite-org/magnum-v4-72b", "anthropic/claude-3-haiku", "anthropic/claude-3.5-haiku", "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.6-fast", "anthropic/claude-opus-4.7", "anthropic/claude-opus-4.7-fast", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "arcee-ai/coder-large", "arcee-ai/maestro-reasoning", "arcee-ai/spotlight", "arcee-ai/trinity-large-thinking", "arcee-ai/trinity-large-thinking:free", "arcee-ai/trinity-mini", "arcee-ai/virtuoso-large", "baidu/cobuddy:free", "baidu/ernie-4.5-21b-a3b", "baidu/ernie-4.5-21b-a3b-thinking", "baidu/ernie-4.5-300b-a47b", "baidu/ernie-4.5-vl-28b-a3b", "baidu/ernie-4.5-vl-424b-a47b", "baidu/qianfan-ocr-fast", "bytedance-seed/seed-1.6", "bytedance-seed/seed-1.6-flash", "bytedance-seed/seed-2.0-lite", "bytedance-seed/seed-2.0-mini", "bytedance/ui-tars-1.5-7b", "cognitivecomputations/dolphin-mistral-24b-venice-edition:free", "cohere/command-a", "cohere/command-r-08-2024", "cohere/command-r-plus-08-2024", "cohere/command-r7b-12-2024", "deepcogito/cogito-v2.1-671b", "deepseek/deepseek-chat", "deepseek/deepseek-chat-v3-0324", "deepseek/deepseek-chat-v3.1", "deepseek/deepseek-r1", "deepseek/deepseek-r1-0528", "deepseek/deepseek-r1-distill-llama-70b", "deepseek/deepseek-r1-distill-qwen-32b", "deepseek/deepseek-v3.1-terminus", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v3.2-speciale", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-flash:free", "deepseek/deepseek-v4-pro", "essentialai/rnj-1-instruct", "google/gemini-2.0-flash-001", "google/gemini-2.0-flash-lite-001", "google/gemini-2.5-flash", "google/gemini-2.5-flash-image", "google/gemini-2.5-flash-lite", "google/gemini-2.5-flash-lite-preview-09-2025", "google/gemini-2.5-pro", "google/gemini-2.5-pro-preview", "google/gemini-2.5-pro-preview-05-06", "google/gemini-3-flash-preview", "google/gemini-3-pro-image-preview", "google/gemini-3.1-flash-image-preview", "google/gemini-3.1-flash-lite", "google/gemini-3.1-flash-lite-preview", "google/gemini-3.1-pro-preview", "google/gemini-3.1-pro-preview-customtools", "google/gemini-3.5-flash", "google/gemma-2-27b-it", "google/gemma-3-12b-it", "google/gemma-3-27b-it", "google/gemma-3-4b-it", "google/gemma-3n-e4b-it", "google/gemma-4-26b-a4b-it", "google/gemma-4-26b-a4b-it:free", "google/gemma-4-31b-it", "google/gemma-4-31b-it:free", "google/lyria-3-clip-preview", "google/lyria-3-pro-preview", "gryphe/mythomax-l2-13b", "ibm-granite/granite-4.0-h-micro", "ibm-granite/granite-4.1-8b", "inception/mercury-2", "inclusionai/ling-2.6-1t", "inclusionai/ling-2.6-flash", "inclusionai/ring-2.6-1t", "inflection/inflection-3-pi", "inflection/inflection-3-productivity", "kwaipilot/kat-coder-pro-v2", "liquid/lfm-2-24b-a2b", "liquid/lfm-2.5-1.2b-instruct:free", "liquid/lfm-2.5-1.2b-thinking:free", "mancer/weaver", "meta-llama/llama-3-70b-instruct", "meta-llama/llama-3-8b-instruct", "meta-llama/llama-3.1-70b-instruct", "meta-llama/llama-3.1-8b-instruct", "meta-llama/llama-3.2-11b-vision-instruct", "meta-llama/llama-3.2-1b-instruct", "meta-llama/llama-3.2-3b-instruct", "meta-llama/llama-3.2-3b-instruct:free", "meta-llama/llama-3.3-70b-instruct", "meta-llama/llama-3.3-70b-instruct:free", "meta-llama/llama-4-maverick", "meta-llama/llama-4-scout", "meta-llama/llama-guard-3-8b", "meta-llama/llama-guard-4-12b", "microsoft/phi-4", "microsoft/phi-4-mini-instruct", "microsoft/wizardlm-2-8x22b", "minimax/minimax-01", "minimax/minimax-m1", "minimax/minimax-m2", "minimax/minimax-m2-her", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.5:free", "minimax/minimax-m2.7", "mistralai/codestral-2508", "mistralai/devstral-2512", "mistralai/devstral-medium", "mistralai/devstral-small", "mistralai/ministral-14b-2512", "mistralai/ministral-3b-2512", "mistralai/ministral-8b-2512", "mistralai/mistral-7b-instruct-v0.1", "mistralai/mistral-large", "mistralai/mistral-large-2407", "mistralai/mistral-large-2411", "mistralai/mistral-large-2512", "mistralai/mistral-medium-3", "mistralai/mistral-medium-3-5", "mistralai/mistral-medium-3.1", "mistralai/mistral-nemo", "mistralai/mistral-saba", "mistralai/mistral-small-24b-instruct-2501", "mistralai/mistral-small-2603", "mistralai/mistral-small-3.1-24b-instruct", "mistralai/mistral-small-3.2-24b-instruct", "mistralai/mixtral-8x22b-instruct", "mistralai/pixtral-large-2411", "mistralai/voxtral-small-24b-2507", "moonshotai/kimi-k2", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.6", "morph/morph-v3-fast", "morph/morph-v3-large", "nex-agi/deepseek-v3.1-nex-n1", "nousresearch/hermes-2-pro-llama-3-8b", "nousresearch/hermes-3-llama-3.1-405b", "nousresearch/hermes-3-llama-3.1-405b:free", "nousresearch/hermes-3-llama-3.1-70b", "nousresearch/hermes-4-405b", "nousresearch/hermes-4-70b", "nvidia/llama-3.3-nemotron-super-49b-v1.5", "nvidia/nemotron-3-nano-30b-a3b", "nvidia/nemotron-3-nano-30b-a3b:free", "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", "nvidia/nemotron-3-super-120b-a12b", "nvidia/nemotron-3-super-120b-a12b:free", "nvidia/nemotron-nano-12b-v2-vl:free", "nvidia/nemotron-nano-9b-v2", "nvidia/nemotron-nano-9b-v2:free", "openai/gpt-3.5-turbo", "openai/gpt-3.5-turbo-0613", "openai/gpt-3.5-turbo-16k", "openai/gpt-3.5-turbo-instruct", "openai/gpt-4", "openai/gpt-4-0314", "openai/gpt-4-1106-preview", "openai/gpt-4-turbo", "openai/gpt-4-turbo-preview", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-2024-05-13", "openai/gpt-4o-2024-08-06", "openai/gpt-4o-2024-11-20", "openai/gpt-4o-audio-preview", "openai/gpt-4o-mini", "openai/gpt-4o-mini-2024-07-18", "openai/gpt-4o-mini-search-preview", "openai/gpt-4o-search-preview", "openai/gpt-5", "openai/gpt-5-chat", "openai/gpt-5-codex", "openai/gpt-5-image", "openai/gpt-5-image-mini", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-chat", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-chat", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-chat", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-image-2", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "openai/gpt-audio", "openai/gpt-audio-mini", "openai/gpt-chat-latest", "openai/gpt-oss-120b", "openai/gpt-oss-120b:free", "openai/gpt-oss-20b", "openai/gpt-oss-20b:free", "openai/gpt-oss-safeguard-20b", "openai/o1", "openai/o1-pro", "openai/o3", "openai/o3-deep-research", "openai/o3-mini", "openai/o3-mini-high", "openai/o3-pro", "openai/o4-mini", "openai/o4-mini-deep-research", "openai/o4-mini-high", "openrouter/auto", "openrouter/bodybuilder", "openrouter/free", "openrouter/owl-alpha", "openrouter/pareto-code", "perceptron/perceptron-mk1", "perplexity/sonar", "perplexity/sonar-deep-research", "perplexity/sonar-pro", "perplexity/sonar-pro-search", "perplexity/sonar-reasoning-pro", "poolside/laguna-m.1:free", "poolside/laguna-xs.2:free", "prime-intellect/intellect-3", "qwen/qwen-2.5-72b-instruct", "qwen/qwen-2.5-7b-instruct", "qwen/qwen-2.5-coder-32b-instruct", "qwen/qwen-plus", "qwen/qwen-plus-2025-07-28", "qwen/qwen-plus-2025-07-28:thinking", "qwen/qwen2.5-vl-72b-instruct", "qwen/qwen3-14b", "qwen/qwen3-235b-a22b", "qwen/qwen3-235b-a22b-2507", "qwen/qwen3-235b-a22b-thinking-2507", "qwen/qwen3-30b-a3b", "qwen/qwen3-30b-a3b-instruct-2507", "qwen/qwen3-30b-a3b-thinking-2507", "qwen/qwen3-32b", "qwen/qwen3-8b", "qwen/qwen3-coder", "qwen/qwen3-coder-30b-a3b-instruct", "qwen/qwen3-coder-flash", "qwen/qwen3-coder-next", "qwen/qwen3-coder-plus", "qwen/qwen3-coder:free", "qwen/qwen3-max", "qwen/qwen3-max-thinking", "qwen/qwen3-next-80b-a3b-instruct", "qwen/qwen3-next-80b-a3b-instruct:free", "qwen/qwen3-next-80b-a3b-thinking", "qwen/qwen3-vl-235b-a22b-instruct", "qwen/qwen3-vl-235b-a22b-thinking", "qwen/qwen3-vl-30b-a3b-instruct", "qwen/qwen3-vl-30b-a3b-thinking", "qwen/qwen3-vl-32b-instruct", "qwen/qwen3-vl-8b-instruct", "qwen/qwen3-vl-8b-thinking", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-27b", "qwen/qwen3.5-35b-a3b", "qwen/qwen3.5-397b-a17b", "qwen/qwen3.5-9b", "qwen/qwen3.5-flash-02-23", "qwen/qwen3.5-plus-02-15", "qwen/qwen3.5-plus-20260420", "qwen/qwen3.6-27b", "qwen/qwen3.6-35b-a3b", "qwen/qwen3.6-flash", "qwen/qwen3.6-max-preview", "qwen/qwen3.6-plus", "qwen/qwen3.7-max", "rekaai/reka-edge", "rekaai/reka-flash-3", "relace/relace-apply-3", "relace/relace-search", "sao10k/l3-euryale-70b", "sao10k/l3-lunaris-8b", "sao10k/l3.1-70b-hanami-x1", "sao10k/l3.1-euryale-70b", "sao10k/l3.3-euryale-70b", "stepfun/step-3.5-flash", "switchpoint/router", "tencent/hunyuan-a13b-instruct", "tencent/hy3-preview", "thedrummer/cydonia-24b-v4.1", "thedrummer/rocinante-12b", "thedrummer/skyfall-36b-v2", "thedrummer/unslopnemo-12b", "undi95/remm-slerp-l2-13b", "upstage/solar-pro-3", "writer/palmyra-x5", "x-ai/grok-4.20", "x-ai/grok-4.20-multi-agent", "x-ai/grok-4.3", "x-ai/grok-build-0.1", "xiaomi/mimo-v2-flash", "xiaomi/mimo-v2-omni", "xiaomi/mimo-v2-pro", "xiaomi/mimo-v2.5", "xiaomi/mimo-v2.5-pro", "z-ai/glm-4-32b", "z-ai/glm-4.5", "z-ai/glm-4.5-air", "z-ai/glm-4.5-air:free", "z-ai/glm-4.5v", "z-ai/glm-4.6", "z-ai/glm-4.6v", "z-ai/glm-4.7", "z-ai/glm-4.7-flash", "z-ai/glm-5", "z-ai/glm-5-turbo", "z-ai/glm-5.1", "z-ai/glm-5v-turbo", "~anthropic/claude-haiku-latest", "~anthropic/claude-opus-latest", "~anthropic/claude-sonnet-latest", "~google/gemini-flash-latest", "~google/gemini-pro-latest", "~moonshotai/kimi-latest", "~openai/gpt-latest", "~openai/gpt-mini-latest" ], docUrl: "https://openrouter.ai/models", gateway: "models.dev", npm: "@openrouter/ai-sdk-provider" }, "regolo-ai": { url: "https://api.regolo.ai/v1", apiKeyEnvVar: "REGOLO_API_KEY", apiKeyHeader: "Authorization", name: "Regolo AI", models: [ "gpt-oss-120b", "gpt-oss-20b", "llama-3.1-8b-instruct", "llama-3.3-70b-instruct", "minimax-m2.5", "mistral-small-4-119b", "mistral-small3.2", "qwen-image", "qwen3-coder-next", "qwen3-embedding-8b", "qwen3-reranker-4b", "qwen3.5-122b", "qwen3.5-9b" ], docUrl: "https://docs.regolo.ai/", gateway: "models.dev" }, claudinio: { url: "https://api.claudin.io/v1", apiKeyEnvVar: "CLAUDINIO_API_KEY", apiKeyHeader: "Authorization", name: "Claudinio", models: ["claudinio"], docUrl: "https://claudin.io", gateway: "models.dev" }, orcarouter: { url: "https://api.orcarouter.ai/v1", apiKeyEnvVar: "ORCAROUTER_API_KEY", apiKeyHeader: "Authorization", name: "OrcaRouter", models: [ "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "deepseek/deepseek-chat", "deepseek/deepseek-reasoner", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-pro", "google/gemini-2.5-flash", "google/gemini-2.5-flash-lite", "google/gemini-2.5-pro", "google/gemini-3-flash-preview", "google/gemini-3-pro-preview", "google/gemini-3.1-flash-lite-preview", "google/gemini-3.1-pro-preview", "google/gemini-3.1-pro-preview-customtools", "google/gemini-flash-latest", "google/gemini-flash-lite-latest", "google/gemma-4-26b-a4b-it", "google/gemma-4-31b-it", "grok/grok-4.3", "kimi/kimi-k2.5", "kimi/kimi-k2.6", "minimax/minimax-m2.5", "minimax/minimax-m2.5-highspeed", "minimax/minimax-m2.7", "minimax/minimax-m2.7-highspeed", "openai/gpt-3.5-turbo", "openai/gpt-4", "openai/gpt-4-turbo", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-2024-05-13", "openai/gpt-4o-2024-08-06", "openai/gpt-4o-2024-11-20", "openai/gpt-4o-mini", "openai/gpt-5", "openai/gpt-5-chat-latest", "openai/gpt-5-codex", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-chat-latest", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-chat-latest", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-chat-latest", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "orcarouter/auto", "qwen/qwen3-max", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-27b", "qwen/qwen3.5-35b-a3b", "qwen/qwen3.5-397b-a17b", "qwen/qwen3.5-plus", "qwen/qwen3.6-35b-a3b", "qwen/qwen3.6-plus", "z-ai/glm-4.5", "z-ai/glm-4.5-air", "z-ai/glm-4.6", "z-ai/glm-4.7", "z-ai/glm-5", "z-ai/glm-5.1" ], docUrl: "https://docs.orcarouter.ai", gateway: "models.dev" }, "opencode-go": { url: "https://opencode.ai/zen/go/v1", apiKeyEnvVar: "OPENCODE_API_KEY", apiKeyHeader: "Authorization", name: "OpenCode Go", models: [ "deepseek-v4-flash", "deepseek-v4-pro", "glm-5", "glm-5.1", "kimi-k2.5", "kimi-k2.6", "mimo-v2.5", "mimo-v2.5-pro", "minimax-m2.5", "minimax-m2.7", "qwen3.5-plus", "qwen3.6-plus" ], docUrl: "https://opencode.ai/docs/zen", gateway: "models.dev" }, llmgateway: { url: "https://api.llmgateway.io/v1", apiKeyEnvVar: "LLMGATEWAY_API_KEY", apiKeyHeader: "Authorization", name: "LLM Gateway", models: [ "auto", "claude-3-5-sonnet-20241022", "claude-3-7-sonnet", "claude-3-7-sonnet-20250219", "claude-3-opus", "claude-haiku-4-5", "claude-haiku-4-5-20251001", "claude-opus-4-1-20250805", "claude-opus-4-20250514", "claude-opus-4-5-20251101", "claude-opus-4-6", "claude-opus-4-7", "claude-sonnet-4-20250514", "claude-sonnet-4-5", "claude-sonnet-4-5-20250929", "claude-sonnet-4-6", "codestral-2508", "custom", "deepseek-r1-0528", "deepseek-v3.1", "deepseek-v3.2", "deepseek-v4-flash", "deepseek-v4-pro", "devstral-2512", "devstral-small-2507", "gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-2.5-flash", "gemini-2.5-flash-lite", "gemini-2.5-pro", "gemini-3-flash-preview", "gemini-3.1-flash-lite", "gemini-3.1-flash-lite-preview", "gemini-3.1-pro-preview", "gemini-3.5-flash", "gemini-pro-latest", "gemma-2-27b-it-together", "gemma-3-1b-it", "gemma-3-27b", "glm-4-32b-0414-128k", "glm-4.5", "glm-4.5-air", "glm-4.5-airx", "glm-4.5-flash", "glm-4.5-x", "glm-4.5v", "glm-4.6", "glm-4.6v", "glm-4.6v-flash", "glm-4.6v-flashx", "glm-4.7", "glm-4.7-flash", "glm-4.7-flashx", "glm-5", "glm-5.1", "gpt-3.5-turbo", "gpt-4", "gpt-4-turbo", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-4o-mini", "gpt-4o-mini-search-preview", "gpt-4o-search-preview", "gpt-5", "gpt-5-chat-latest", "gpt-5-mini", "gpt-5-nano", "gpt-5-pro", "gpt-5.1", "gpt-5.1-codex", "gpt-5.1-codex-mini", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.2-codex", "gpt-5.2-pro", "gpt-5.3-chat-latest", "gpt-5.3-codex", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano", "gpt-5.4-pro", "gpt-5.5", "gpt-5.5-pro", "gpt-oss-120b", "gpt-oss-20b", "grok-4-0709", "grok-4-1-fast-reasoning", "grok-4-20-beta-0309-non-reasoning", "grok-4-20-beta-0309-reasoning", "grok-4-20-non-reasoning", "grok-4-20-reasoning", "grok-4-3", "grok-4-fast-reasoning", "hermes-2-pro-llama-3-8b", "kimi-k2", "kimi-k2-thinking", "kimi-k2-thinking-turbo", "kimi-k2.5", "kimi-k2.6", "llama-3-70b-instruct", "llama-3-8b-instruct", "llama-3.1-70b-instruct", "llama-3.1-8b-instruct", "llama-3.1-nemotron-ultra-253b", "llama-3.2-11b-instruct", "llama-3.2-3b-instruct", "llama-3.3-70b-instruct", "llama-4-maverick-17b-instruct", "llama-4-scout", "llama-4-scout-17b-instruct", "mimo-v2-flash", "mimo-v2-omni", "mimo-v2-pro", "mimo-v2.5", "mimo-v2.5-pro", "minimax-m2", "minimax-m2.1", "minimax-m2.1-lightning", "minimax-m2.5", "minimax-m2.5-highspeed", "minimax-m2.7", "minimax-m2.7-highspeed", "minimax-text-01", "ministral-14b-2512", "ministral-3b-2512", "ministral-8b-2512", "mistral-large-2512", "mistral-large-latest", "mistral-small-2506", "o1", "o3", "o3-mini", "o4-mini", "pixtral-large-latest", "qwen-coder-plus", "qwen-flash", "qwen-max", "qwen-max-latest", "qwen-omni-turbo", "qwen-plus", "qwen-plus-latest", "qwen-turbo", "qwen-vl-max", "qwen-vl-plus", "qwen2-5-vl-32b-instruct", "qwen2-5-vl-72b-instruct", "qwen25-coder-7b", "qwen3-235b-a22b-fp8", "qwen3-235b-a22b-instruct-2507", "qwen3-235b-a22b-thinking-2507", "qwen3-30b-a3b-fp8", "qwen3-30b-a3b-instruct-2507", "qwen3-30b-a3b-thinking-2507", "qwen3-32b", "qwen3-32b-fp8", "qwen3-4b-fp8", "qwen3-coder-30b-a3b-instruct", "qwen3-coder-480b-a35b-instruct", "qwen3-coder-flash", "qwen3-coder-next", "qwen3-coder-plus", "qwen3-max", "qwen3-max-2026-01-23", "qwen3-next-80b-a3b-instruct", "qwen3-next-80b-a3b-thinking", "qwen3-vl-235b-a22b-instruct", "qwen3-vl-235b-a22b-thinking", "qwen3-vl-30b-a3b-instruct", "qwen3-vl-30b-a3b-thinking", "qwen3-vl-8b-instruct", "qwen3-vl-flash", "qwen3-vl-plus", "qwen3.6-35b-a3b", "qwen3.6-max-preview", "qwen3.6-plus", "qwen35-397b-a17b", "qwen37-max", "qwq-plus", "seed-1-6-250615", "seed-1-6-250915", "seed-1-6-flash-250715", "seed-1-8-251228", "sonar", "sonar-pro", "sonar-reasoning-pro" ], docUrl: "https://llmgateway.io/docs", gateway: "models.dev" }, poe: { url: "https://api.poe.com/v1", apiKeyEnvVar: "POE_API_KEY", apiKeyHeader: "Authorization", name: "Poe", models: [ "anthropic/claude-haiku-3", "anthropic/claude-haiku-3.5", "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-3.7", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "cerebras/gpt-oss-120b-cs", "cerebras/llama-3.1-8b-cs", "elevenlabs/elevenlabs-music", "elevenlabs/elevenlabs-v2.5-turbo", "elevenlabs/elevenlabs-v3", "empiriolabs/deepseek-v4-flash-el", "empiriolabs/deepseek-v4-pro-el", "fireworks-ai/kimi-k2.5-fw", "google/gemini-2.0-flash", "google/gemini-2.0-flash-lite", "google/gemini-2.5-flash", "google/gemini-2.5-flash-lite", "google/gemini-2.5-pro", "google/gemini-3-flash", "google/gemini-3.1-flash-lite", "google/gemini-3.1-pro", "google/gemini-3.5-flash", "google/gemma-4-31b", "google/imagen-3", "google/imagen-3-fast", "google/imagen-4", "google/imagen-4-fast", "google/imagen-4-ultra", "google/lyria", "google/nano-banana", "google/nano-banana-pro", "google/veo-2", "google/veo-3", "google/veo-3-fast", "google/veo-3.1", "google/veo-3.1-fast", "ideogramai/ideogram", "ideogramai/ideogram-v2", "ideogramai/ideogram-v2a", "ideogramai/ideogram-v2a-turbo", "lumalabs/ray2", "novita/deepseek-v3.2", "novita/glm-4.6", "novita/glm-4.6v", "novita/glm-4.7-flash", "novita/glm-4.7-n", "novita/glm-5", "novita/kimi-k2-thinking", "novita/kimi-k2.5", "novita/kimi-k2.6", "novita/minimax-m2.1", "openai/dall-e-3", "openai/gpt-3.5-turbo", "openai/gpt-3.5-turbo-instruct", "openai/gpt-3.5-turbo-raw", "openai/gpt-4-turbo", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-aug", "openai/gpt-4o-mini", "openai/gpt-4o-mini-search", "openai/gpt-4o-search", "openai/gpt-5", "openai/gpt-5-chat", "openai/gpt-5-codex", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.1-instant", "openai/gpt-5.2", "openai/gpt-5.2-codex", "openai/gpt-5.2-instant", "openai/gpt-5.2-pro", "openai/gpt-5.3-codex", "openai/gpt-5.3-codex-spark", "openai/gpt-5.3-instant", "openai/gpt-5.4", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "openai/gpt-image-1", "openai/gpt-image-1-mini", "openai/gpt-image-1.5", "openai/gpt-image-2", "openai/o1", "openai/o1-pro", "openai/o3", "openai/o3-deep-research", "openai/o3-mini", "openai/o3-mini-high", "openai/o3-pro", "openai/o4-mini", "openai/o4-mini-deep-research", "openai/sora-2", "openai/sora-2-pro", "poetools/claude-code", "runwayml/runway", "runwayml/runway-gen-4-turbo", "stabilityai/stablediffusionxl", "topazlabs-co/topazlabs", "trytako/tako", "xai/grok-3", "xai/grok-3-mini", "xai/grok-4", "xai/grok-4-fast-non-reasoning", "xai/grok-4-fast-reasoning", "xai/grok-4.1-fast-non-reasoning", "xai/grok-4.1-fast-reasoning", "xai/grok-4.20-multi-agent", "xai/grok-code-fast-1" ], docUrl: "https://creator.poe.com/docs/external-applications/openai-compatible-api", gateway: "models.dev" }, minimax: { url: "https://api.minimax.io/anthropic/v1", apiKeyEnvVar: "MINIMAX_API_KEY", apiKeyHeader: "Authorization", name: "MiniMax (minimax.io)", models: [ "MiniMax-M2", "MiniMax-M2.1", "MiniMax-M2.5", "MiniMax-M2.5-highspeed", "MiniMax-M2.7", "MiniMax-M2.7-highspeed" ], docUrl: "https://platform.minimax.io/docs/guides/quickstart", gateway: "models.dev", npm: "@ai-sdk/anthropic" }, groq: { url: "https://api.groq.com/openai/v1", apiKeyEnvVar: "GROQ_API_KEY", name: "Groq", models: [ "allam-2-7b", "canopylabs/orpheus-arabic-saudi", "canopylabs/orpheus-v1-english", "groq/compound", "groq/compound-mini", "llama-3.1-8b-instant", "llama-3.3-70b-versatile", "meta-llama/llama-4-scout-17b-16e-instruct", "meta-llama/llama-prompt-guard-2-22m", "meta-llama/llama-prompt-guard-2-86m", "moonshotai/kimi-k2-instruct-0905", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "openai/gpt-oss-safeguard-20b", "qwen/qwen3-32b", "whisper-large-v3", "whisper-large-v3-turbo" ], docUrl: "https://console.groq.com/docs/models", gateway: "models.dev", npm: "@ai-sdk/groq" }, "xiaomi-token-plan-sgp": { url: "https://token-plan-sgp.xiaomimimo.com/v1", apiKeyEnvVar: "XIAOMI_API_KEY", apiKeyHeader: "Authorization", name: "Xiaomi Token Plan (Singapore)", models: ["mimo-v2-flash", "mimo-v2-omni", "mimo-v2-pro", "mimo-v2-tts", "mimo-v2.5", "mimo-v2.5-pro"], docUrl: "https://platform.xiaomimimo.com/#/docs", gateway: "models.dev" }, siliconflow: { url: "https://api.siliconflow.com/v1", apiKeyEnvVar: "SILICONFLOW_API_KEY", apiKeyHeader: "Authorization", name: "SiliconFlow", models: [ "ByteDance-Seed/Seed-OSS-36B-Instruct", "MiniMaxAI/MiniMax-M2.1", "MiniMaxAI/MiniMax-M2.5", "Qwen/QwQ-32B", "Qwen/Qwen2.5-14B-Instruct", "Qwen/Qwen2.5-32B-Instruct", "Qwen/Qwen2.5-72B-Instruct", "Qwen/Qwen2.5-72B-Instruct-128K", "Qwen/Qwen2.5-7B-Instruct", "Qwen/Qwen2.5-Coder-32B-Instruct", "Qwen/Qwen2.5-VL-32B-Instruct", "Qwen/Qwen2.5-VL-72B-Instruct", "Qwen/Qwen2.5-VL-7B-Instruct", "Qwen/Qwen3-14B", "Qwen/Qwen3-235B-A22B", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-30B-A3B-Thinking-2507", "Qwen/Qwen3-32B", "Qwen/Qwen3-8B", "Qwen/Qwen3-Coder-30B-A3B-Instruct", "Qwen/Qwen3-Coder-480B-A35B-Instruct", "Qwen/Qwen3-Next-80B-A3B-Instruct", "Qwen/Qwen3-Next-80B-A3B-Thinking", "Qwen/Qwen3-Omni-30B-A3B-Captioner", "Qwen/Qwen3-Omni-30B-A3B-Instruct", "Qwen/Qwen3-Omni-30B-A3B-Thinking", "Qwen/Qwen3-VL-235B-A22B-Instruct", "Qwen/Qwen3-VL-235B-A22B-Thinking", "Qwen/Qwen3-VL-30B-A3B-Instruct", "Qwen/Qwen3-VL-30B-A3B-Thinking", "Qwen/Qwen3-VL-32B-Instruct", "Qwen/Qwen3-VL-32B-Thinking", "Qwen/Qwen3-VL-8B-Instruct", "Qwen/Qwen3-VL-8B-Thinking", "THUDM/GLM-4-32B-0414", "THUDM/GLM-4-9B-0414", "THUDM/GLM-Z1-32B-0414", "THUDM/GLM-Z1-9B-0414", "baidu/ERNIE-4.5-300B-A47B", "deepseek-ai/DeepSeek-R1", "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", "deepseek-ai/DeepSeek-V3", "deepseek-ai/DeepSeek-V3.1", "deepseek-ai/DeepSeek-V3.1-Terminus", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V3.2-Exp", "deepseek-ai/deepseek-v4-flash", "deepseek-ai/deepseek-v4-pro", "deepseek-ai/deepseek-vl2", "inclusionAI/Ling-flash-2.0", "inclusionAI/Ling-mini-2.0", "inclusionAI/Ring-flash-2.0", "meta-llama/Meta-Llama-3.1-8B-Instruct", "moonshotai/Kimi-K2-Instruct", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/Kimi-K2-Thinking", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "nex-agi/DeepSeek-V3.1-Nex-N1", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "stepfun-ai/Step-3.5-Flash", "tencent/Hunyuan-A13B-Instruct", "tencent/Hunyuan-MT-7B", "zai-org/GLM-4.5", "zai-org/GLM-4.5-Air", "zai-org/GLM-4.5V", "zai-org/GLM-4.6", "zai-org/GLM-4.6V", "zai-org/GLM-4.7", "zai-org/GLM-5", "zai-org/GLM-5.1", "zai-org/GLM-5V-Turbo" ], docUrl: "https://cloud.siliconflow.com/models", gateway: "models.dev" }, "ollama-cloud": { url: "https://ollama.com/v1", apiKeyEnvVar: "OLLAMA_API_KEY", apiKeyHeader: "Authorization", name: "Ollama Cloud", models: [ "cogito-2.1:671b", "deepseek-v3.1:671b", "deepseek-v3.2", "deepseek-v4-flash", "deepseek-v4-pro", "devstral-2:123b", "devstral-small-2:24b", "gemini-3-flash-preview", "gemma3:12b", "gemma3:27b", "gemma3:4b", "gemma4:31b", "glm-4.6", "glm-4.7", "glm-5", "glm-5.1", "gpt-oss:120b", "gpt-oss:20b", "kimi-k2-thinking", "kimi-k2.5", "kimi-k2.6", "kimi-k2:1t", "minimax-m2", "minimax-m2.1", "minimax-m2.5", "minimax-m2.7", "ministral-3:14b", "ministral-3:3b", "ministral-3:8b", "mistral-large-3:675b", "nemotron-3-nano:30b", "nemotron-3-super", "qwen3-coder-next", "qwen3-coder:480b", "qwen3-next:80b", "qwen3-vl:235b", "qwen3-vl:235b-instruct", "qwen3.5:397b", "rnj-1:8b" ], docUrl: "https://docs.ollama.com/cloud", gateway: "models.dev" }, databricks: { url: "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", apiKeyEnvVar: "DATABRICKS_TOKEN", apiKeyHeader: "Authorization", name: "Databricks", models: [ "databricks-claude-haiku-4-5", "databricks-claude-opus-4-1", "databricks-claude-opus-4-5", "databricks-claude-opus-4-6", "databricks-claude-opus-4-7", "databricks-claude-sonnet-4", "databricks-claude-sonnet-4-5", "databricks-claude-sonnet-4-6", "databricks-gemini-2-5-flash", "databricks-gemini-2-5-pro", "databricks-gemini-3-1-flash-lite", "databricks-gemini-3-1-pro", "databricks-gemini-3-flash", "databricks-gemini-3-pro", "databricks-gpt-5", "databricks-gpt-5-1", "databricks-gpt-5-2", "databricks-gpt-5-4", "databricks-gpt-5-4-mini", "databricks-gpt-5-4-nano", "databricks-gpt-5-5", "databricks-gpt-5-mini", "databricks-gpt-5-nano", "databricks-gpt-oss-120b", "databricks-gpt-oss-20b" ], docUrl: "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", gateway: "models.dev" }, berget: { url: "https://api.berget.ai/v1", apiKeyEnvVar: "BERGET_API_KEY", apiKeyHeader: "Authorization", name: "Berget.AI", models: [ "google/gemma-4-31B-it", "meta-llama/Llama-3.3-70B-Instruct", "mistralai/Mistral-Medium-3.5-128B", "mistralai/Mistral-Small-3.2-24B-Instruct-2506", "moonshotai/Kimi-K2.6", "openai/gpt-oss-120b", "zai-org/GLM-4.7" ], docUrl: "https://api.berget.ai", gateway: "models.dev" }, "moonshotai-cn": { url: "https://api.moonshot.cn/anthropic/v1", apiKeyEnvVar: "MOONSHOT_API_KEY", apiKeyHeader: "Authorization", name: "Moonshot AI (China)", models: [ "kimi-k2-0711-preview", "kimi-k2-0905-preview", "kimi-k2-thinking", "kimi-k2-thinking-turbo", "kimi-k2-turbo-preview", "kimi-k2.5", "kimi-k2.6" ], docUrl: "https://platform.moonshot.cn/docs/api/chat", gateway: "models.dev", npm: "@ai-sdk/anthropic" }, "alibaba-coding-plan-cn": { url: "https://coding.dashscope.aliyuncs.com/v1", apiKeyEnvVar: "ALIBABA_CODING_PLAN_API_KEY", apiKeyHeader: "Authorization", name: "Alibaba Coding Plan (China)", models: [ "MiniMax-M2.5", "glm-4.7", "glm-5", "kimi-k2.5", "qwen3-coder-next", "qwen3-coder-plus", "qwen3-max-2026-01-23", "qwen3.5-plus", "qwen3.6-plus" ], docUrl: "https://help.aliyun.com/zh/model-studio/coding-plan", gateway: "models.dev" }, "minimax-cn": { url: "https://api.minimaxi.com/anthropic/v1", apiKeyEnvVar: "MINIMAX_API_KEY", apiKeyHeader: "Authorization", name: "MiniMax (minimaxi.com)", models: [ "MiniMax-M2", "MiniMax-M2.1", "MiniMax-M2.5", "MiniMax-M2.5-highspeed", "MiniMax-M2.7", "MiniMax-M2.7-highspeed" ], docUrl: "https://platform.minimaxi.com/docs/guides/quickstart", gateway: "models.dev", npm: "@ai-sdk/anthropic" }, chutes: { url: "https://llm.chutes.ai/v1", apiKeyEnvVar: "CHUTES_API_KEY", apiKeyHeader: "Authorization", name: "Chutes", models: [ "MiniMaxAI/MiniMax-M2.5-TEE", "NousResearch/DeepHermes-3-Mistral-24B-Preview", "NousResearch/Hermes-4-14B", "Qwen/Qwen2.5-72B-Instruct", "Qwen/Qwen2.5-Coder-32B-Instruct", "Qwen/Qwen2.5-VL-32B-Instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507-TEE", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-30B-A3B", "Qwen/Qwen3-32B-TEE", "Qwen/Qwen3-Coder-Next-TEE", "Qwen/Qwen3-Next-80B-A3B-Instruct", "Qwen/Qwen3.5-397B-A17B-TEE", "Qwen/Qwen3.6-27B-TEE", "Qwen/Qwen3Guard-Gen-0.6B", "XiaomiMiMo/MiMo-V2-Flash-TEE", "deepseek-ai/DeepSeek-R1-0528-TEE", "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", "deepseek-ai/DeepSeek-V3-0324-TEE", "deepseek-ai/DeepSeek-V3.1-TEE", "deepseek-ai/DeepSeek-V3.2-TEE", "google/gemma-4-31B-turbo-TEE", "moonshotai/Kimi-K2.5-TEE", "moonshotai/Kimi-K2.6-TEE", "openai/gpt-oss-120b-TEE", "rednote-hilab/dots.ocr", "tngtech/DeepSeek-TNG-R1T2-Chimera-TEE", "unsloth/Llama-3.2-1B-Instruct", "unsloth/Llama-3.2-3B-Instruct", "unsloth/Mistral-Nemo-Instruct-2407", "unsloth/gemma-3-12b-it", "unsloth/gemma-3-27b-it", "unsloth/gemma-3-4b-it", "zai-org/GLM-4.6V", "zai-org/GLM-4.7-FP8", "zai-org/GLM-4.7-TEE", "zai-org/GLM-5-TEE", "zai-org/GLM-5-Turbo", "zai-org/GLM-5.1-TEE" ], docUrl: "https://llm.chutes.ai/v1/models", gateway: "models.dev" }, "siliconflow-cn": { url: "https://api.siliconflow.cn/v1", apiKeyEnvVar: "SILICONFLOW_CN_API_KEY", apiKeyHeader: "Authorization", name: "SiliconFlow (China)", models: [ "ByteDance-Seed/Seed-OSS-36B-Instruct", "Kwaipilot/KAT-Dev", "PaddlePaddle/PaddleOCR-VL", "PaddlePaddle/PaddleOCR-VL-1.5", "Pro/MiniMaxAI/MiniMax-M2.1", "Pro/MiniMaxAI/MiniMax-M2.5", "Pro/deepseek-ai/DeepSeek-R1", "Pro/deepseek-ai/DeepSeek-V3", "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", "Pro/deepseek-ai/DeepSeek-V3.2", "Pro/moonshotai/Kimi-K2-Instruct-0905", "Pro/moonshotai/Kimi-K2-Thinking", "Pro/moonshotai/Kimi-K2.5", "Pro/moonshotai/Kimi-K2.6", "Pro/zai-org/GLM-4.7", "Pro/zai-org/GLM-5", "Pro/zai-org/GLM-5.1", "Qwen/QwQ-32B", "Qwen/Qwen2.5-14B-Instruct", "Qwen/Qwen2.5-32B-Instruct", "Qwen/Qwen2.5-72B-Instruct", "Qwen/Qwen2.5-72B-Instruct-128K", "Qwen/Qwen2.5-7B-Instruct", "Qwen/Qwen2.5-Coder-32B-Instruct", "Qwen/Qwen2.5-VL-32B-Instruct", "Qwen/Qwen2.5-VL-72B-Instruct", "Qwen/Qwen3-14B", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-30B-A3B-Thinking-2507", "Qwen/Qwen3-32B", "Qwen/Qwen3-8B", "Qwen/Qwen3-Coder-30B-A3B-Instruct", "Qwen/Qwen3-Coder-480B-A35B-Instruct", "Qwen/Qwen3-Next-80B-A3B-Instruct", "Qwen/Qwen3-Next-80B-A3B-Thinking", "Qwen/Qwen3-Omni-30B-A3B-Captioner", "Qwen/Qwen3-Omni-30B-A3B-Instruct", "Qwen/Qwen3-Omni-30B-A3B-Thinking", "Qwen/Qwen3-VL-235B-A22B-Instruct", "Qwen/Qwen3-VL-235B-A22B-Thinking", "Qwen/Qwen3-VL-30B-A3B-Instruct", "Qwen/Qwen3-VL-30B-A3B-Thinking", "Qwen/Qwen3-VL-32B-Instruct", "Qwen/Qwen3-VL-32B-Thinking", "Qwen/Qwen3-VL-8B-Instruct", "Qwen/Qwen3-VL-8B-Thinking", "Qwen/Qwen3.5-122B-A10B", "Qwen/Qwen3.5-27B", "Qwen/Qwen3.5-35B-A3B", "Qwen/Qwen3.5-397B-A17B", "Qwen/Qwen3.5-4B", "Qwen/Qwen3.5-9B", "Qwen/Qwen3.6-35B-A3B", "THUDM/GLM-4-32B-0414", "THUDM/GLM-4-9B-0414", "THUDM/GLM-Z1-32B-0414", "THUDM/GLM-Z1-9B-0414", "ascend-tribe/pangu-pro-moe", "baidu/ERNIE-4.5-300B-A47B", "deepseek-ai/DeepSeek-OCR", "deepseek-ai/DeepSeek-R1", "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", "deepseek-ai/DeepSeek-V3", "deepseek-ai/DeepSeek-V3.1-Terminus", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/deepseek-vl2", "inclusionAI/Ling-flash-2.0", "inclusionAI/Ling-mini-2.0", "inclusionAI/Ring-flash-2.0", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/Kimi-K2-Thinking", "stepfun-ai/Step-3.5-Flash", "tencent/Hunyuan-A13B-Instruct", "tencent/Hunyuan-MT-7B", "zai-org/GLM-4.5-Air", "zai-org/GLM-4.5V", "zai-org/GLM-4.6", "zai-org/GLM-4.6V" ], docUrl: "https://cloud.siliconflow.com/models", gateway: "models.dev" }, nvidia: { url: "https://integrate.api.nvidia.com/v1", apiKeyEnvVar: "NVIDIA_API_KEY", apiKeyHeader: "Authorization", name: "Nvidia", models: [ "abacusai/dracarys-llama-3_1-70b-instruct", "baai/bge-m3", "black-forest-labs/flux.1-dev", "black-forest-labs/flux_1-kontext-dev", "black-forest-labs/flux_1-schnell", "black-forest-labs/flux_2-klein-4b", "bytedance/seed-oss-36b-instruct", "deepseek-ai/deepseek-v3.1-terminus", "deepseek-ai/deepseek-v3.2", "deepseek-ai/deepseek-v4-flash", "deepseek-ai/deepseek-v4-pro", "google/gemma-2-2b-it", "google/gemma-3-27b-it", "google/gemma-3n-e2b-it", "google/gemma-3n-e4b-it", "google/gemma-4-31b-it", "google/google-paligemma", "meta/esm2-650m", "meta/esmfold", "meta/llama-3.1-70b-instruct", "meta/llama-3.1-8b-instruct", "meta/llama-3.2-11b-vision-instruct", "meta/llama-3.2-1b-instruct", "meta/llama-3.2-3b-instruct", "meta/llama-3.2-90b-vision-instruct", "meta/llama-3.3-70b-instruct", "meta/llama-4-maverick-17b-128e-instruct", "meta/llama-guard-4-12b", "microsoft/phi-4-mini-instruct", "microsoft/phi-4-multimodal-instruct", "minimaxai/minimax-m2.5", "minimaxai/minimax-m2.7", "mistralai/devstral-2-123b-instruct-2512", "mistralai/magistral-small-2506", "mistralai/mistral-7b-instruct-v03", "mistralai/mistral-large-3-675b-instruct-2512", "mistralai/mistral-medium-3-instruct", "mistralai/mistral-nemotron", "mistralai/mistral-small-4-119b-2603", "mistralai/mixtral-8x22b-instruct", "mistralai/mixtral-8x7b-instruct", "moonshotai/kimi-k2-instruct", "moonshotai/kimi-k2-instruct-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2.6", "nvidia/active-speaker-detection", "nvidia/bevformer", "nvidia/cosmos-predict1-5b", "nvidia/cosmos-transfer1-7b", "nvidia/cosmos-transfer2_5-2b", "nvidia/gliner-pii", "nvidia/llama-3_1-nemotron-safety-guard-8b-v3", "nvidia/llama-3_2-nemoretriever-300m-embed-v1", "nvidia/llama-3_3-nemotron-super-49b-v1", "nvidia/llama-3_3-nemotron-super-49b-v1_5", "nvidia/llama-nemotron-embed-vl-1b-v2", "nvidia/llama-nemotron-rerank-vl-1b-v2", "nvidia/magpie-tts-zeroshot", "nvidia/nemotron-3-content-safety", "nvidia/nemotron-3-nano-30b-a3b", "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", "nvidia/nemotron-3-super-120b-a12b", "nvidia/nemotron-content-safety-reasoning-4b", "nvidia/nemotron-mini-4b-instruct", "nvidia/nemotron-voicechat", "nvidia/nv-embed-v1", "nvidia/nv-embedcode-7b-v1", "nvidia/nvidia-nemotron-nano-9b-v2", "nvidia/rerank-qa-mistral-4b", "nvidia/riva-translate-4b-instruct-v1_1", "nvidia/sparsedrive", "nvidia/streampetr", "nvidia/studiovoice", "nvidia/synthetic-video-detector", "nvidia/usdcode", "nvidia/usdvalidate", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "openai/whisper-large-v3", "qwen/qwen-image", "qwen/qwen-image-edit", "qwen/qwen2.5-coder-32b-instruct", "qwen/qwen3-coder-480b-a35b-instruct", "qwen/qwen3-next-80b-a3b-instruct", "qwen/qwen3-next-80b-a3b-thinking", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-397b-a17b", "sarvamai/sarvam-m", "stepfun-ai/step-3.5-flash", "upstage/solar-10_7b-instruct", "z-ai/glm-5.1", "z-ai/glm4.7" ], docUrl: "https://docs.api.nvidia.com/nim/", gateway: "models.dev" }, anthropic: { apiKeyEnvVar: "ANTHROPIC_API_KEY", name: "Anthropic", models: [ "claude-3-5-haiku-20241022", "claude-3-5-haiku-latest", "claude-3-5-sonnet-20240620", "claude-3-5-sonnet-20241022", "claude-3-7-sonnet-20250219", "claude-3-haiku-20240307", "claude-3-opus-20240229", "claude-3-sonnet-20240229", "claude-haiku-4-5", "claude-haiku-4-5-20251001", "claude-opus-4-0", "claude-opus-4-1", "claude-opus-4-1-20250805", "claude-opus-4-20250514", "claude-opus-4-5", "claude-opus-4-5-20251101", "claude-opus-4-6", "claude-opus-4-7", "claude-sonnet-4-0", "claude-sonnet-4-20250514", "claude-sonnet-4-5", "claude-sonnet-4-5-20250929", "claude-sonnet-4-6" ], docUrl: "https://docs.anthropic.com/en/docs/about-claude/models", gateway: "models.dev", npm: "@ai-sdk/anthropic" }, "zhipuai-coding-plan": { url: "https://open.bigmodel.cn/api/coding/paas/v4", apiKeyEnvVar: "ZHIPU_API_KEY", apiKeyHeader: "Authorization", name: "Zhipu AI Coding Plan", models: ["glm-4.5-air", "glm-4.7", "glm-5-turbo", "glm-5.1", "glm-5v-turbo"], docUrl: "https://docs.bigmodel.cn/cn/coding-plan/overview", gateway: "models.dev" }, "atomic-chat": { url: "http://127.0.0.1:1337/v1", apiKeyEnvVar: "ATOMIC_CHAT_API_KEY", apiKeyHeader: "Authorization", name: "Atomic Chat", models: [ "Meta-Llama-3_1-8B-Instruct-GGUF", "Qwen3_5-9B-MLX-4bit", "Qwen3_5-9B-Q4_K_M", "gemma-4-E4B-it-IQ4_XS", "gemma-4-E4B-it-MLX-4bit" ], docUrl: "https://atomic.chat", gateway: "models.dev" }, "github-models": { url: "https://models.github.ai/inference", apiKeyEnvVar: "GITHUB_TOKEN", apiKeyHeader: "Authorization", name: "GitHub Models", models: [ "ai21-labs/ai21-jamba-1.5-large", "ai21-labs/ai21-jamba-1.5-mini", "cohere/cohere-command-a", "cohere/cohere-command-r", "cohere/cohere-command-r-08-2024", "cohere/cohere-command-r-plus", "cohere/cohere-command-r-plus-08-2024", "core42/jais-30b-chat", "deepseek/deepseek-r1", "deepseek/deepseek-r1-0528", "deepseek/deepseek-v3-0324", "meta/llama-3.2-11b-vision-instruct", "meta/llama-3.2-90b-vision-instruct", "meta/llama-3.3-70b-instruct", "meta/llama-4-maverick-17b-128e-instruct-fp8", "meta/llama-4-scout-17b-16e-instruct", "meta/meta-llama-3-70b-instruct", "meta/meta-llama-3-8b-instruct", "meta/meta-llama-3.1-405b-instruct", "meta/meta-llama-3.1-70b-instruct", "meta/meta-llama-3.1-8b-instruct", "microsoft/mai-ds-r1", "microsoft/phi-3-medium-128k-instruct", "microsoft/phi-3-medium-4k-instruct", "microsoft/phi-3-mini-128k-instruct", "microsoft/phi-3-mini-4k-instruct", "microsoft/phi-3-small-128k-instruct", "microsoft/phi-3-small-8k-instruct", "microsoft/phi-3.5-mini-instruct", "microsoft/phi-3.5-moe-instruct", "microsoft/phi-3.5-vision-instruct", "microsoft/phi-4", "microsoft/phi-4-mini-instruct", "microsoft/phi-4-mini-reasoning", "microsoft/phi-4-multimodal-instruct", "microsoft/phi-4-reasoning", "mistral-ai/codestral-2501", "mistral-ai/ministral-3b", "mistral-ai/mistral-large-2411", "mistral-ai/mistral-medium-2505", "mistral-ai/mistral-nemo", "mistral-ai/mistral-small-2503", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-mini", "openai/o1", "openai/o1-mini", "openai/o1-preview", "openai/o3", "openai/o3-mini", "openai/o4-mini", "xai/grok-3", "xai/grok-3-mini" ], docUrl: "https://docs.github.com/en/github-models", gateway: "models.dev" }, "qiniu-ai": { url: "https://api.qnaigc.com/v1", apiKeyEnvVar: "QINIU_API_KEY", apiKeyHeader: "Authorization", name: "Qiniu", models: [ "MiniMax-M1", "claude-3.5-haiku", "claude-3.5-sonnet", "claude-3.7-sonnet", "claude-4.0-opus", "claude-4.0-sonnet", "claude-4.1-opus", "claude-4.5-haiku", "claude-4.5-opus", "claude-4.5-sonnet", "deepseek-r1", "deepseek-r1-0528", "deepseek-v3", "deepseek-v3-0324", "deepseek-v3.1", "deepseek/deepseek-math-v2", "deepseek/deepseek-v3.1-terminus", "deepseek/deepseek-v3.1-terminus-thinking", "deepseek/deepseek-v3.2-251201", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v3.2-exp-thinking", "doubao-1.5-pro-32k", "doubao-1.5-thinking-pro", "doubao-1.5-vision-pro", "doubao-seed-1.6", "doubao-seed-1.6-flash", "doubao-seed-1.6-thinking", "doubao-seed-2.0-code", "doubao-seed-2.0-lite", "doubao-seed-2.0-mini", "doubao-seed-2.0-pro", "gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-2.5-flash", "gemini-2.5-flash-image", "gemini-2.5-flash-lite", "gemini-2.5-pro", "gemini-3.0-flash-preview", "gemini-3.0-pro-image-preview", "gemini-3.0-pro-preview", "glm-4.5", "glm-4.5-air", "gpt-oss-120b", "gpt-oss-20b", "kimi-k2", "kling-v2-6", "meituan/longcat-flash-chat", "meituan/longcat-flash-lite", "mimo-v2-flash", "minimax/minimax-m2", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.5-highspeed", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2.5", "openai/gpt-5", "openai/gpt-5.2", "qwen-max-2025-01-25", "qwen-turbo", "qwen-vl-max-2025-01-25", "qwen2.5-vl-72b-instruct", "qwen2.5-vl-7b-instruct", "qwen3-235b-a22b", "qwen3-235b-a22b-instruct-2507", "qwen3-235b-a22b-thinking-2507", "qwen3-30b-a3b", "qwen3-30b-a3b-instruct-2507", "qwen3-30b-a3b-thinking-2507", "qwen3-32b", "qwen3-coder-480b-a35b-instruct", "qwen3-max", "qwen3-max-preview", "qwen3-next-80b-a3b-instruct", "qwen3-next-80b-a3b-thinking", "qwen3-vl-30b-a3b-thinking", "qwen3.5-397b-a17b", "stepfun-ai/gelab-zero-4b-preview", "stepfun/step-3.5-flash", "x-ai/grok-4-fast", "x-ai/grok-4-fast-non-reasoning", "x-ai/grok-4-fast-reasoning", "x-ai/grok-4.1-fast", "x-ai/grok-4.1-fast-non-reasoning", "x-ai/grok-4.1-fast-reasoning", "x-ai/grok-code-fast-1", "xiaomi/mimo-v2-flash", "z-ai/autoglm-phone-9b", "z-ai/glm-4.6", "z-ai/glm-4.7", "z-ai/glm-5" ], docUrl: "https://developer.qiniu.com/aitokenapi", gateway: "models.dev" }, google: { apiKeyEnvVar: ["GOOGLE_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY"], name: "Google", models: [ "gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-2.5-flash", "gemini-2.5-flash-image", "gemini-2.5-flash-lite", "gemini-2.5-flash-preview-tts", "gemini-2.5-pro", "gemini-2.5-pro-preview-tts", "gemini-3-flash-preview", "gemini-3-pro-preview", "gemini-3.1-flash-image-preview", "gemini-3.1-flash-lite", "gemini-3.1-flash-lite-preview", "gemini-3.1-pro-preview", "gemini-3.1-pro-preview-customtools", "gemini-3.5-flash", "gemini-embedding-001", "gemini-flash-latest", "gemini-flash-lite-latest", "gemma-4-26b-a4b-it", "gemma-4-31b-it" ], docUrl: "https://ai.google.dev/gemini-api/docs/models", gateway: "models.dev", npm: "@ai-sdk/google" }, scaleway: { url: "https://api.scaleway.ai/v1", apiKeyEnvVar: "SCALEWAY_API_KEY", apiKeyHeader: "Authorization", name: "Scaleway", models: [ "bge-multilingual-gemma2", "deepseek-r1-distill-llama-70b", "devstral-2-123b-instruct-2512", "gemma-3-27b-it", "gpt-oss-120b", "llama-3.1-8b-instruct", "llama-3.3-70b-instruct", "mistral-medium-3.5-128b", "mistral-nemo-instruct-2407", "mistral-small-3.2-24b-instruct-2506", "pixtral-12b-2409", "qwen3-235b-a22b-instruct-2507", "qwen3-coder-30b-a3b-instruct", "qwen3-embedding-8b", "qwen3.5-397b-a17b", "voxtral-small-24b-2507", "whisper-large-v3" ], docUrl: "https://www.scaleway.com/en/docs/generative-apis/", gateway: "models.dev" }, opencode: { url: "https://opencode.ai/zen/v1", apiKeyEnvVar: "OPENCODE_API_KEY", apiKeyHeader: "Authorization", name: "OpenCode Zen", models: [ "big-pickle", "claude-haiku-4-5", "claude-opus-4-1", "claude-opus-4-5", "claude-opus-4-6", "claude-opus-4-7", "claude-sonnet-4", "claude-sonnet-4-5", "claude-sonnet-4-6", "deepseek-v4-flash-free", "gemini-3-flash", "gemini-3.1-pro", "gemini-3.5-flash", "glm-5", "glm-5.1", "gpt-5", "gpt-5-codex", "gpt-5-nano", "gpt-5.1", "gpt-5.1-codex", "gpt-5.1-codex-max", "gpt-5.1-codex-mini", "gpt-5.2", "gpt-5.2-codex", "gpt-5.3-codex", "gpt-5.3-codex-spark", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano", "gpt-5.4-pro", "gpt-5.5", "gpt-5.5-pro", "grok-build-0.1", "kimi-k2.5", "kimi-k2.6", "minimax-m2.5", "minimax-m2.7", "nemotron-3-super-free", "qwen3.5-plus", "qwen3.6-plus" ], docUrl: "https://opencode.ai/docs/zen", gateway: "models.dev" }, mixlayer: { url: "https://models.mixlayer.ai/v1", apiKeyEnvVar: "MIXLAYER_API_KEY", apiKeyHeader: "Authorization", name: "Mixlayer", models: [ "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-27b", "qwen/qwen3.5-35b-a3b", "qwen/qwen3.5-397b-a17b", "qwen/qwen3.5-9b" ], docUrl: "https://docs.mixlayer.com", gateway: "models.dev" }, zenmux: { url: "https://zenmux.ai/api/v1", apiKeyEnvVar: "ZENMUX_API_KEY", apiKeyHeader: "Authorization", name: "ZenMux", models: [ "anthropic/claude-3.5-haiku", "anthropic/claude-3.7-sonnet", "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "baidu/ernie-5.0-thinking-preview", "deepseek/deepseek-chat", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-pro", "google/gemini-2.5-flash", "google/gemini-2.5-flash-lite", "google/gemini-2.5-pro", "google/gemini-3-flash-preview", "google/gemini-3.1-flash-lite-preview", "google/gemini-3.1-pro-preview", "inclusionai/ling-1t", "inclusionai/ring-1t", "kuaishou/kat-coder-pro-v2", "minimax/minimax-m2", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.5-lightning", "minimax/minimax-m2.7", "minimax/minimax-m2.7-highspeed", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2-thinking-turbo", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.6", "openai/gpt-5", "openai/gpt-5-codex", "openai/gpt-5.1", "openai/gpt-5.1-chat", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-chat", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "qwen/qwen3-coder-plus", "qwen/qwen3-max", "qwen/qwen3.5-flash", "qwen/qwen3.5-plus", "qwen/qwen3.6-plus", "sapiens-ai/agnes-1.5-lite", "sapiens-ai/agnes-1.5-pro", "stepfun/step-3", "stepfun/step-3.5-flash", "stepfun/step-3.5-flash-free", "tencent/hy3-preview", "volcengine/doubao-seed-1.8", "volcengine/doubao-seed-2.0-code", "volcengine/doubao-seed-2.0-lite", "volcengine/doubao-seed-2.0-mini", "volcengine/doubao-seed-2.0-pro", "volcengine/doubao-seed-code", "x-ai/grok-4", "x-ai/grok-4-fast", "x-ai/grok-4.1-fast", "x-ai/grok-4.1-fast-non-reasoning", "x-ai/grok-4.2-fast", "x-ai/grok-4.2-fast-non-reasoning", "x-ai/grok-code-fast-1", "xiaomi/mimo-v2-flash", "xiaomi/mimo-v2-omni", "xiaomi/mimo-v2-pro", "xiaomi/mimo-v2.5", "xiaomi/mimo-v2.5-pro", "z-ai/glm-4.5", "z-ai/glm-4.5-air", "z-ai/glm-4.6", "z-ai/glm-4.6v", "z-ai/glm-4.6v-flash", "z-ai/glm-4.6v-flash-free", "z-ai/glm-4.7", "z-ai/glm-4.7-flash-free", "z-ai/glm-4.7-flashx", "z-ai/glm-5", "z-ai/glm-5-turbo", "z-ai/glm-5.1", "z-ai/glm-5v-turbo" ], docUrl: "https://docs.zenmux.ai", gateway: "models.dev" }, "perplexity-agent": { url: "https://api.perplexity.ai/v1", apiKeyEnvVar: "PERPLEXITY_API_KEY", apiKeyHeader: "Authorization", name: "Perplexity Agent", models: [ "anthropic/claude-haiku-4-5", "anthropic/claude-opus-4-5", "anthropic/claude-opus-4-6", "anthropic/claude-opus-4-7", "anthropic/claude-sonnet-4-5", "anthropic/claude-sonnet-4-6", "google/gemini-2.5-flash", "google/gemini-2.5-pro", "google/gemini-3-flash-preview", "google/gemini-3.1-pro-preview", "nvidia/nemotron-3-super-120b-a12b", "openai/gpt-5-mini", "openai/gpt-5.1", "openai/gpt-5.2", "openai/gpt-5.4", "openai/gpt-5.5", "perplexity/sonar", "xai/grok-4-1-fast-non-reasoning" ], docUrl: "https://docs.perplexity.ai/docs/agent-api/models", gateway: "models.dev", npm: "@ai-sdk/openai" }, "alibaba-coding-plan": { url: "https://coding-intl.dashscope.aliyuncs.com/v1", apiKeyEnvVar: "ALIBABA_CODING_PLAN_API_KEY", apiKeyHeader: "Authorization", name: "Alibaba Coding Plan", models: [ "MiniMax-M2.5", "glm-4.7", "glm-5", "kimi-k2.5", "qwen3-coder-next", "qwen3-coder-plus", "qwen3-max-2026-01-23", "qwen3.5-plus", "qwen3.6-plus" ], docUrl: "https://www.alibabacloud.com/help/en/model-studio/coding-plan", gateway: "models.dev" }, meganova: { url: "https://api.meganova.ai/v1", apiKeyEnvVar: "MEGANOVA_API_KEY", apiKeyHeader: "Authorization", name: "Meganova", models: [ "MiniMaxAI/MiniMax-M2.1", "MiniMaxAI/MiniMax-M2.5", "Qwen/Qwen2.5-VL-32B-Instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3.5-Plus", "XiaomiMiMo/MiMo-V2-Flash", "deepseek-ai/DeepSeek-R1-0528", "deepseek-ai/DeepSeek-V3-0324", "deepseek-ai/DeepSeek-V3.1", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V3.2-Exp", "meta-llama/Llama-3.3-70B-Instruct", "mistralai/Mistral-Nemo-Instruct-2407", "mistralai/Mistral-Small-3.2-24B-Instruct-2506", "moonshotai/Kimi-K2-Thinking", "moonshotai/Kimi-K2.5", "zai-org/GLM-4.6", "zai-org/GLM-4.7", "zai-org/GLM-5" ], docUrl: "https://docs.meganova.ai", gateway: "models.dev" }, synthetic: { url: "https://api.synthetic.new/openai/v1", apiKeyEnvVar: "SYNTHETIC_API_KEY", apiKeyHeader: "Authorization", name: "Synthetic", models: [ "hf:MiniMaxAI/MiniMax-M2", "hf:MiniMaxAI/MiniMax-M2.1", "hf:MiniMaxAI/MiniMax-M2.5", "hf:Qwen/Qwen2.5-Coder-32B-Instruct", "hf:Qwen/Qwen3-235B-A22B-Instruct-2507", "hf:Qwen/Qwen3-235B-A22B-Thinking-2507", "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct", "hf:Qwen/Qwen3.5-397B-A17B", "hf:deepseek-ai/DeepSeek-R1", "hf:deepseek-ai/DeepSeek-R1-0528", "hf:deepseek-ai/DeepSeek-V3", "hf:deepseek-ai/DeepSeek-V3-0324", "hf:deepseek-ai/DeepSeek-V3.1", "hf:deepseek-ai/DeepSeek-V3.1-Terminus", "hf:deepseek-ai/DeepSeek-V3.2", "hf:meta-llama/Llama-3.1-405B-Instruct", "hf:meta-llama/Llama-3.1-70B-Instruct", "hf:meta-llama/Llama-3.1-8B-Instruct", "hf:meta-llama/Llama-3.3-70B-Instruct", "hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", "hf:meta-llama/Llama-4-Scout-17B-16E-Instruct", "hf:moonshotai/Kimi-K2-Instruct-0905", "hf:moonshotai/Kimi-K2-Thinking", "hf:moonshotai/Kimi-K2.5", "hf:moonshotai/Kimi-K2.6", "hf:nvidia/Kimi-K2.5-NVFP4", "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", "hf:openai/gpt-oss-120b", "hf:zai-org/GLM-4.6", "hf:zai-org/GLM-4.7", "hf:zai-org/GLM-4.7-Flash", "hf:zai-org/GLM-5", "hf:zai-org/GLM-5.1" ], docUrl: "https://synthetic.new/pricing", gateway: "models.dev" }, inceptron: { url: "https://api.inceptron.io/v1", apiKeyEnvVar: "INCEPTRON_API_KEY", apiKeyHeader: "Authorization", name: "Inceptron", models: [ "MiniMaxAI/MiniMax-M2.5", "moonshotai/Kimi-K2.6", "nvidia/llama-3.3-70b-instruct-fp8", "zai-org/GLM-5.1-FP8" ], docUrl: "https://docs.inceptron.io", gateway: "models.dev" }, "minimax-coding-plan": { url: "https://api.minimax.io/anthropic/v1", apiKeyEnvVar: "MINIMAX_API_KEY", apiKeyHeader: "Authorization", name: "MiniMax Token Plan (minimax.io)", models: [ "MiniMax-M2", "MiniMax-M2.1", "MiniMax-M2.5", "MiniMax-M2.5-highspeed", "MiniMax-M2.7", "MiniMax-M2.7-highspeed" ], docUrl: "https://platform.minimax.io/docs/token-plan/intro", gateway: "models.dev", npm: "@ai-sdk/anthropic" }, upstage: { url: "https://api.upstage.ai/v1/solar", apiKeyEnvVar: "UPSTAGE_API_KEY", apiKeyHeader: "Authorization", name: "Upstage", models: ["solar-mini", "solar-pro2", "solar-pro3"], docUrl: "https://developers.upstage.ai/docs/apis/chat", gateway: "models.dev" }, vercel: { apiKeyEnvVar: "AI_GATEWAY_API_KEY", name: "Vercel AI Gateway", models: [ "alibaba/qwen-3-14b", "alibaba/qwen-3-235b", "alibaba/qwen-3-30b", "alibaba/qwen-3-32b", "alibaba/qwen-3.6-max-preview", "alibaba/qwen3-235b-a22b-thinking", "alibaba/qwen3-coder", "alibaba/qwen3-coder-30b-a3b", "alibaba/qwen3-coder-next", "alibaba/qwen3-coder-plus", "alibaba/qwen3-embedding-0.6b", "alibaba/qwen3-embedding-4b", "alibaba/qwen3-embedding-8b", "alibaba/qwen3-max", "alibaba/qwen3-max-preview", "alibaba/qwen3-max-thinking", "alibaba/qwen3-next-80b-a3b-instruct", "alibaba/qwen3-next-80b-a3b-thinking", "alibaba/qwen3-vl-235b-a22b-instruct", "alibaba/qwen3-vl-instruct", "alibaba/qwen3-vl-thinking", "alibaba/qwen3.5-flash", "alibaba/qwen3.5-plus", "alibaba/qwen3.6-27b", "alibaba/qwen3.6-plus", "alibaba/qwen3.7-max", "amazon/nova-2-lite", "amazon/nova-lite", "amazon/nova-micro", "amazon/nova-pro", "amazon/titan-embed-text-v2", "anthropic/claude-3-haiku", "anthropic/claude-3-opus", "anthropic/claude-3.5-haiku", "anthropic/claude-3.5-sonnet", "anthropic/claude-3.5-sonnet-20240620", "anthropic/claude-3.7-sonnet", "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "arcee-ai/trinity-large-preview", "arcee-ai/trinity-large-thinking", "arcee-ai/trinity-mini", "bfl/flux-kontext-max", "bfl/flux-kontext-pro", "bfl/flux-pro-1.0-fill", "bfl/flux-pro-1.1", "bfl/flux-pro-1.1-ultra", "bytedance/seed-1.6", "bytedance/seed-1.8", "cohere/command-a", "cohere/embed-v4.0", "deepseek/deepseek-r1", "deepseek/deepseek-v3", "deepseek/deepseek-v3.1", "deepseek/deepseek-v3.1-terminus", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v3.2-thinking", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-pro", "google/gemini-2.0-flash", "google/gemini-2.0-flash-lite", "google/gemini-2.5-flash", "google/gemini-2.5-flash-image", "google/gemini-2.5-flash-image-preview", "google/gemini-2.5-flash-lite", "google/gemini-2.5-flash-lite-preview-09-2025", "google/gemini-2.5-flash-preview-09-2025", "google/gemini-2.5-pro", "google/gemini-3-flash", "google/gemini-3-pro-image", "google/gemini-3-pro-preview", "google/gemini-3.1-flash-image-preview", "google/gemini-3.1-flash-lite", "google/gemini-3.1-flash-lite-preview", "google/gemini-3.1-pro-preview", "google/gemini-3.5-flash", "google/gemini-embedding-001", "google/gemini-embedding-2", "google/gemma-4-26b-a4b-it", "google/gemma-4-31b-it", "google/imagen-4.0-fast-generate-001", "google/imagen-4.0-generate-001", "google/imagen-4.0-ultra-generate-001", "google/text-embedding-005", "google/text-multilingual-embedding-002", "inception/mercury-2", "inception/mercury-coder-small", "inception/mercury-edit-2", "interfaze/interfaze-beta", "kwaipilot/kat-coder-pro-v1", "kwaipilot/kat-coder-pro-v2", "meituan/longcat-flash-chat", "meituan/longcat-flash-thinking", "meituan/longcat-flash-thinking-2601", "meta/llama-3.1-70b", "meta/llama-3.1-8b", "meta/llama-3.2-11b", "meta/llama-3.2-1b", "meta/llama-3.2-3b", "meta/llama-3.2-90b", "meta/llama-3.3-70b", "meta/llama-4-maverick", "meta/llama-4-scout", "minimax/minimax-m2", "minimax/minimax-m2.1", "minimax/minimax-m2.1-lightning", "minimax/minimax-m2.5", "minimax/minimax-m2.5-highspeed", "minimax/minimax-m2.7", "minimax/minimax-m2.7-highspeed", "mistral/codestral", "mistral/codestral-embed", "mistral/devstral-2", "mistral/devstral-small", "mistral/devstral-small-2", "mistral/magistral-medium", "mistral/magistral-small", "mistral/ministral-14b", "mistral/ministral-3b", "mistral/ministral-8b", "mistral/mistral-embed", "mistral/mistral-large-3", "mistral/mistral-medium", "mistral/mistral-medium-3.5", "mistral/mistral-nemo", "mistral/mistral-small", "mistral/mixtral-8x22b-instruct", "mistral/pixtral-12b", "mistral/pixtral-large", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2-thinking-turbo", "moonshotai/kimi-k2-turbo", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.6", "morph/morph-v3-fast", "morph/morph-v3-large", "nvidia/nemotron-3-nano-30b-a3b", "nvidia/nemotron-3-super-120b-a12b", "nvidia/nemotron-nano-12b-v2-vl", "nvidia/nemotron-nano-9b-v2", "openai/codex-mini", "openai/gpt-3.5-turbo", "openai/gpt-3.5-turbo-instruct", "openai/gpt-4-turbo", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-mini", "openai/gpt-4o-mini-search-preview", "openai/gpt-5", "openai/gpt-5-chat", "openai/gpt-5-codex", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.1-instant", "openai/gpt-5.1-thinking", "openai/gpt-5.2", "openai/gpt-5.2-chat", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-chat", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "openai/gpt-oss-safeguard-20b", "openai/o1", "openai/o3", "openai/o3-deep-research", "openai/o3-mini", "openai/o3-pro", "openai/o4-mini", "openai/text-embedding-3-large", "openai/text-embedding-3-small", "openai/text-embedding-ada-002", "perplexity/sonar", "perplexity/sonar-pro", "perplexity/sonar-reasoning", "perplexity/sonar-reasoning-pro", "prime-intellect/intellect-3", "recraft/recraft-v2", "recraft/recraft-v3", "vercel/v0-1.0-md", "vercel/v0-1.5-md", "voyage/voyage-3-large", "voyage/voyage-3.5", "voyage/voyage-3.5-lite", "voyage/voyage-4", "voyage/voyage-4-large", "voyage/voyage-4-lite", "voyage/voyage-code-2", "voyage/voyage-code-3", "voyage/voyage-finance-2", "voyage/voyage-law-2", "xai/grok-4-fast-reasoning", "xai/grok-4.1-fast-non-reasoning", "xai/grok-4.1-fast-reasoning", "xai/grok-4.20-multi-agent", "xai/grok-4.20-multi-agent-beta", "xai/grok-4.20-non-reasoning", "xai/grok-4.20-non-reasoning-beta", "xai/grok-4.20-reasoning", "xai/grok-4.20-reasoning-beta", "xai/grok-4.3", "xai/grok-build-0.1", "xai/grok-imagine-image", "xai/grok-imagine-image-pro", "xiaomi/mimo-v2-flash", "xiaomi/mimo-v2-pro", "xiaomi/mimo-v2.5", "xiaomi/mimo-v2.5-pro", "zai/glm-4.5", "zai/glm-4.5-air", "zai/glm-4.5v", "zai/glm-4.6", "zai/glm-4.6v", "zai/glm-4.6v-flash", "zai/glm-4.7", "zai/glm-4.7-flash", "zai/glm-4.7-flashx", "zai/glm-5", "zai/glm-5-turbo", "zai/glm-5.1", "zai/glm-5v-turbo" ], docUrl: "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", gateway: "models.dev" }, "abliteration-ai": { url: "https://api.abliteration.ai/v1", apiKeyEnvVar: "ABLIT_KEY", apiKeyHeader: "Authorization", name: "abliteration.ai", models: ["abliterated-model"], docUrl: "https://docs.abliteration.ai/models", gateway: "models.dev" }, deepseek: { url: "https://api.deepseek.com", apiKeyEnvVar: "DEEPSEEK_API_KEY", name: "DeepSeek", models: ["deepseek-chat", "deepseek-reasoner", "deepseek-v4-flash", "deepseek-v4-pro"], docUrl: "https://api-docs.deepseek.com/quick_start/pricing", gateway: "models.dev" }, perplexity: { apiKeyEnvVar: "PERPLEXITY_API_KEY", name: "Perplexity", models: ["sonar", "sonar-deep-research", "sonar-pro", "sonar-reasoning-pro"], docUrl: "https://docs.perplexity.ai", gateway: "models.dev", npm: "@ai-sdk/perplexity" }, iflowcn: { url: "https://apis.iflow.cn/v1", apiKeyEnvVar: "IFLOW_API_KEY", apiKeyHeader: "Authorization", name: "iFlow", models: [ "deepseek-r1", "deepseek-v3", "deepseek-v3.2", "glm-4.6", "kimi-k2", "kimi-k2-0905", "qwen3-235b", "qwen3-235b-a22b-instruct", "qwen3-235b-a22b-thinking-2507", "qwen3-32b", "qwen3-coder-plus", "qwen3-max", "qwen3-max-preview", "qwen3-vl-plus" ], docUrl: "https://platform.iflow.cn/en/docs", gateway: "models.dev" }, stackit: { url: "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", apiKeyEnvVar: "STACKIT_API_KEY", apiKeyHeader: "Authorization", name: "STACKIT", models: [ "Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", "Qwen/Qwen3-VL-Embedding-8B", "cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic", "google/gemma-3-27b-it", "intfloat/e5-mistral-7b-instruct", "neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8", "neuralmagic/Mistral-Nemo-Instruct-2407-FP8", "openai/gpt-oss-120b" ], docUrl: "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", gateway: "models.dev" }, "wafer.ai": { url: "https://pass.wafer.ai/v1", apiKeyEnvVar: "WAFER_API_KEY", apiKeyHeader: "Authorization", name: "Wafer", models: ["GLM-5.1", "Qwen3.5-397B-A17B"], docUrl: "https://docs.wafer.ai/wafer-pass", gateway: "models.dev" }, evroc: { url: "https://models.think.evroc.com/v1", apiKeyEnvVar: "EVROC_API_KEY", apiKeyHeader: "Authorization", name: "evroc", models: [ "KBLab/kb-whisper-large", "Qwen/Qwen3-30B-A3B-Instruct-2507-FP8", "Qwen/Qwen3-Embedding-8B", "Qwen/Qwen3-VL-30B-A3B-Instruct", "intfloat/multilingual-e5-large-instruct", "microsoft/Phi-4-multimodal-instruct", "mistralai/Magistral-Small-2509", "mistralai/Voxtral-Small-24B-2507", "mistralai/devstral-small-2-24b-instruct-2512", "moonshotai/Kimi-K2.5", "nvidia/Llama-3.3-70B-Instruct-FP8", "openai/gpt-oss-120b", "openai/whisper-large-v3" ], docUrl: "https://docs.evroc.com/products/think/overview.html", gateway: "models.dev" }, nova: { url: "https://api.nova.amazon.com/v1", apiKeyEnvVar: "NOVA_API_KEY", apiKeyHeader: "Authorization", name: "Nova", models: ["nova-2-lite-v1", "nova-2-pro-v1"], docUrl: "https://nova.amazon.com/dev/documentation", gateway: "models.dev" }, "fireworks-ai": { url: "https://api.fireworks.ai/inference/v1/", apiKeyEnvVar: "FIREWORKS_API_KEY", apiKeyHeader: "Authorization", name: "Fireworks AI", models: [ "accounts/fireworks/models/deepseek-v3p1", "accounts/fireworks/models/deepseek-v3p2", "accounts/fireworks/models/deepseek-v4-flash", "accounts/fireworks/models/deepseek-v4-pro", "accounts/fireworks/models/glm-4p5", "accounts/fireworks/models/glm-4p5-air", "accounts/fireworks/models/glm-4p7", "accounts/fireworks/models/glm-5", "accounts/fireworks/models/glm-5p1", "accounts/fireworks/models/gpt-oss-120b", "accounts/fireworks/models/gpt-oss-20b", "accounts/fireworks/models/kimi-k2-instruct", "accounts/fireworks/models/kimi-k2-thinking", "accounts/fireworks/models/kimi-k2p5", "accounts/fireworks/models/kimi-k2p6", "accounts/fireworks/models/minimax-m2p1", "accounts/fireworks/models/minimax-m2p5", "accounts/fireworks/models/minimax-m2p7", "accounts/fireworks/models/qwen3p6-plus", "accounts/fireworks/routers/kimi-k2p5-turbo" ], docUrl: "https://fireworks.ai/docs/", gateway: "models.dev" }, alibaba: { url: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", apiKeyEnvVar: "DASHSCOPE_API_KEY", apiKeyHeader: "Authorization", name: "Alibaba", models: [ "qvq-max", "qwen-flash", "qwen-max", "qwen-mt-plus", "qwen-mt-turbo", "qwen-omni-turbo", "qwen-omni-turbo-realtime", "qwen-plus", "qwen-plus-character-ja", "qwen-turbo", "qwen-vl-max", "qwen-vl-ocr", "qwen-vl-plus", "qwen2-5-14b-instruct", "qwen2-5-32b-instruct", "qwen2-5-72b-instruct", "qwen2-5-7b-instruct", "qwen2-5-omni-7b", "qwen2-5-vl-72b-instruct", "qwen2-5-vl-7b-instruct", "qwen3-14b", "qwen3-235b-a22b", "qwen3-32b", "qwen3-8b", "qwen3-asr-flash", "qwen3-coder-30b-a3b-instruct", "qwen3-coder-480b-a35b-instruct", "qwen3-coder-flash", "qwen3-coder-plus", "qwen3-livetranslate-flash-realtime", "qwen3-max", "qwen3-next-80b-a3b-instruct", "qwen3-next-80b-a3b-thinking", "qwen3-omni-flash", "qwen3-omni-flash-realtime", "qwen3-vl-235b-a22b", "qwen3-vl-30b-a3b", "qwen3-vl-plus", "qwen3.5-122b-a10b", "qwen3.5-27b", "qwen3.5-35b-a3b", "qwen3.5-397b-a17b", "qwen3.5-plus", "qwen3.6-27b", "qwen3.6-35b-a3b", "qwen3.6-max-preview", "qwen3.6-plus", "qwen3.7-max", "qwq-plus" ], docUrl: "https://www.alibabacloud.com/help/en/model-studio/models", gateway: "models.dev" }, "302ai": { url: "https://api.302.ai/v1", apiKeyEnvVar: "302AI_API_KEY", apiKeyHeader: "Authorization", name: "302.AI", models: [ "MiniMax-M1", "MiniMax-M2", "MiniMax-M2.1", "MiniMax-M2.7", "MiniMax-M2.7-highspeed", "chatgpt-4o-latest", "claude-3-5-haiku-20241022", "claude-3-5-haiku-latest", "claude-haiku-4-5", "claude-haiku-4-5-20251001", "claude-opus-4-1-20250805", "claude-opus-4-1-20250805-thinking", "claude-opus-4-20250514", "claude-opus-4-5", "claude-opus-4-5-20251101", "claude-opus-4-5-20251101-thinking", "claude-opus-4-6", "claude-opus-4-6-thinking", "claude-opus-4-7", "claude-sonnet-4-20250514", "claude-sonnet-4-5", "claude-sonnet-4-5-20250929", "claude-sonnet-4-5-20250929-thinking", "claude-sonnet-4-6", "claude-sonnet-4-6-thinking", "deepseek-chat", "deepseek-reasoner", "deepseek-v3.2", "deepseek-v3.2-thinking", "doubao-seed-1-6-thinking-250715", "doubao-seed-1-6-vision-250815", "doubao-seed-1-8-251215", "doubao-seed-code-preview-251028", "gemini-2.0-flash-lite", "gemini-2.5-flash", "gemini-2.5-flash-image", "gemini-2.5-flash-lite-preview-09-2025", "gemini-2.5-flash-nothink", "gemini-2.5-flash-preview-09-2025", "gemini-2.5-pro", "gemini-3-flash-preview", "gemini-3-pro-image-preview", "gemini-3-pro-preview", "gemini-3.1-flash-image-preview", "glm-4.5", "glm-4.5-air", "glm-4.5-airx", "glm-4.5-x", "glm-4.5v", "glm-4.6", "glm-4.6v", "glm-4.7", "glm-4.7-flashx", "glm-5", "glm-5-turbo", "glm-5.1", "glm-5v-turbo", "glm-for-coding", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-5", "gpt-5-mini", "gpt-5-pro", "gpt-5-thinking", "gpt-5.1", "gpt-5.1-chat-latest", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-mini-2026-03-17", "gpt-5.4-nano", "gpt-5.4-nano-2026-03-17", "gpt-5.4-pro", "grok-4-1-fast-non-reasoning", "grok-4-1-fast-reasoning", "grok-4-fast-non-reasoning", "grok-4-fast-reasoning", "grok-4.1", "grok-4.20-beta-0309-non-reasoning", "grok-4.20-beta-0309-reasoning", "grok-4.20-multi-agent-beta-0309", "kimi-k2-0905-preview", "kimi-k2-thinking", "kimi-k2-thinking-turbo", "ministral-14b-2512", "mistral-large-2512", "qwen-flash", "qwen-max-latest", "qwen-plus", "qwen3-235b-a22b", "qwen3-235b-a22b-instruct-2507", "qwen3-30b-a3b", "qwen3-coder-480b-a35b-instruct", "qwen3-max-2025-09-23" ], docUrl: "https://doc.302.ai", gateway: "models.dev" }, xpersona: { url: "https://www.xpersona.co/v1", apiKeyEnvVar: "XPERSONA_API_KEY", apiKeyHeader: "Authorization", name: "Xpersona", models: ["xpersona-frieren-coder"], docUrl: "https://www.xpersona.co/docs", gateway: "models.dev" }, stepfun: { url: "https://api.stepfun.com/v1", apiKeyEnvVar: "STEPFUN_API_KEY", apiKeyHeader: "Authorization", name: "StepFun", models: ["step-1-32k", "step-2-16k", "step-3.5-flash", "step-3.5-flash-2603"], docUrl: "https://platform.stepfun.com/docs/zh/overview/concept", gateway: "models.dev" }, xai: { apiKeyEnvVar: "XAI_API_KEY", name: "xAI", models: [ "grok-4.20-0309-non-reasoning", "grok-4.20-0309-reasoning", "grok-4.20-multi-agent-0309", "grok-4.3", "grok-build-0.1", "grok-imagine-image", "grok-imagine-image-quality", "grok-imagine-video" ], docUrl: "https://docs.x.ai/docs/models", gateway: "models.dev", npm: "@ai-sdk/xai" }, sarvam: { url: "https://api.sarvam.ai/v1", apiKeyEnvVar: "SARVAM_API_KEY", apiKeyHeader: "Authorization", name: "Sarvam AI", models: ["sarvam-105b", "sarvam-30b"], docUrl: "https://docs.sarvam.ai/api-reference-docs/getting-started/models", gateway: "models.dev" }, zhipuai: { url: "https://open.bigmodel.cn/api/paas/v4", apiKeyEnvVar: "ZHIPU_API_KEY", apiKeyHeader: "Authorization", name: "Zhipu AI", models: [ "glm-4.5", "glm-4.5-air", "glm-4.5-flash", "glm-4.5v", "glm-4.6", "glm-4.6v", "glm-4.7", "glm-4.7-flash", "glm-4.7-flashx", "glm-5", "glm-5.1", "glm-5v-turbo" ], docUrl: "https://docs.z.ai/guides/overview/pricing", gateway: "models.dev" }, bailing: { url: "https://api.tbox.cn/api/llm/v1/chat/completions", apiKeyEnvVar: "BAILING_API_TOKEN", apiKeyHeader: "Authorization", name: "Bailing", models: ["Ling-1T", "Ring-1T"], docUrl: "https://alipaytbox.yuque.com/sxs0ba/ling/intro", gateway: "models.dev" }, "qihang-ai": { url: "https://api.qhaigc.net/v1", apiKeyEnvVar: "QIHANG_API_KEY", apiKeyHeader: "Authorization", name: "QiHang", models: [ "claude-haiku-4-5-20251001", "claude-opus-4-5-20251101", "claude-sonnet-4-5-20250929", "gemini-2.5-flash", "gemini-3-flash-preview", "gemini-3-pro-preview", "gpt-5-mini", "gpt-5.2", "gpt-5.2-codex" ], docUrl: "https://www.qhaigc.net/docs", gateway: "models.dev" }, lilac: { url: "https://api.getlilac.com/v1", apiKeyEnvVar: "LILAC_API_KEY", apiKeyHeader: "Authorization", name: "Lilac", models: ["google/gemma-4-31b-it", "minimaxai/minimax-m2.7", "moonshotai/kimi-k2.6", "zai-org/glm-5.1"], docUrl: "https://docs.getlilac.com/inference/models", gateway: "models.dev" }, "alibaba-cn": { url: "https://dashscope.aliyuncs.com/compatible-mode/v1", apiKeyEnvVar: "DASHSCOPE_API_KEY", apiKeyHeader: "Authorization", name: "Alibaba (China)", models: [ "MiniMax-M2.5", "MiniMax/MiniMax-M2.7", "deepseek-r1", "deepseek-r1-0528", "deepseek-r1-distill-llama-70b", "deepseek-r1-distill-llama-8b", "deepseek-r1-distill-qwen-1-5b", "deepseek-r1-distill-qwen-14b", "deepseek-r1-distill-qwen-32b", "deepseek-r1-distill-qwen-7b", "deepseek-v3", "deepseek-v3-1", "deepseek-v3-2-exp", "deepseek-v4-flash", "deepseek-v4-pro", "glm-5", "glm-5.1", "kimi-k2-thinking", "kimi-k2.5", "kimi-k2.6", "kimi/kimi-k2.5", "moonshot-kimi-k2-instruct", "qvq-max", "qwen-deep-research", "qwen-doc-turbo", "qwen-flash", "qwen-long", "qwen-math-plus", "qwen-math-turbo", "qwen-max", "qwen-mt-plus", "qwen-mt-turbo", "qwen-omni-turbo", "qwen-omni-turbo-realtime", "qwen-plus", "qwen-plus-character", "qwen-turbo", "qwen-vl-max", "qwen-vl-ocr", "qwen-vl-plus", "qwen2-5-14b-instruct", "qwen2-5-32b-instruct", "qwen2-5-72b-instruct", "qwen2-5-7b-instruct", "qwen2-5-coder-32b-instruct", "qwen2-5-coder-7b-instruct", "qwen2-5-math-72b-instruct", "qwen2-5-math-7b-instruct", "qwen2-5-omni-7b", "qwen2-5-vl-72b-instruct", "qwen2-5-vl-7b-instruct", "qwen3-14b", "qwen3-235b-a22b", "qwen3-32b", "qwen3-8b", "qwen3-asr-flash", "qwen3-coder-30b-a3b-instruct", "qwen3-coder-480b-a35b-instruct", "qwen3-coder-flash", "qwen3-coder-plus", "qwen3-max", "qwen3-next-80b-a3b-instruct", "qwen3-next-80b-a3b-thinking", "qwen3-omni-flash", "qwen3-omni-flash-realtime", "qwen3-vl-235b-a22b", "qwen3-vl-30b-a3b", "qwen3-vl-plus", "qwen3.5-397b-a17b", "qwen3.5-flash", "qwen3.5-plus", "qwen3.6-max-preview", "qwen3.6-plus", "qwq-32b", "qwq-plus", "siliconflow/deepseek-r1-0528", "siliconflow/deepseek-v3-0324", "siliconflow/deepseek-v3.1-terminus", "siliconflow/deepseek-v3.2", "tongyi-intent-detect-v3" ], docUrl: "https://www.alibabacloud.com/help/en/model-studio/models", gateway: "models.dev" }, drun: { url: "https://chat.d.run/v1", apiKeyEnvVar: "DRUN_API_KEY", apiKeyHeader: "Authorization", name: "D.Run (China)", models: ["public/deepseek-r1", "public/deepseek-v3", "public/minimax-m25"], docUrl: "https://www.d.run", gateway: "models.dev" }, huggingface: { url: "https://router.huggingface.co/v1", apiKeyEnvVar: "HF_TOKEN", apiKeyHeader: "Authorization", name: "Hugging Face", models: [ "MiniMaxAI/MiniMax-M2.1", "MiniMaxAI/MiniMax-M2.5", "MiniMaxAI/MiniMax-M2.7", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-Coder-480B-A35B-Instruct", "Qwen/Qwen3-Coder-Next", "Qwen/Qwen3-Embedding-4B", "Qwen/Qwen3-Embedding-8B", "Qwen/Qwen3-Next-80B-A3B-Instruct", "Qwen/Qwen3-Next-80B-A3B-Thinking", "Qwen/Qwen3.5-397B-A17B", "XiaomiMiMo/MiMo-V2-Flash", "deepseek-ai/DeepSeek-R1-0528", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V4-Pro", "moonshotai/Kimi-K2-Instruct", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/Kimi-K2-Thinking", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "zai-org/GLM-4.7", "zai-org/GLM-4.7-Flash", "zai-org/GLM-5", "zai-org/GLM-5.1" ], docUrl: "https://huggingface.co/docs/inference-providers", gateway: "models.dev" }, "umans-ai-coding-plan": { url: "https://api.code.umans.ai/v1", apiKeyEnvVar: "UMANS_AI_CODING_PLAN_API_KEY", apiKeyHeader: "Authorization", name: "Umans AI Coding Plan", models: ["umans-coder", "umans-flash", "umans-glm-5.1", "umans-kimi-k2.6", "umans-qwen3.6-35b-a3b"], docUrl: "https://app.umans.ai/offers/code/docs", gateway: "models.dev" }, "tencent-tokenhub": { url: "https://tokenhub.tencentmaas.com/v1", apiKeyEnvVar: "TENCENT_TOKENHUB_API_KEY", apiKeyHeader: "Authorization", name: "Tencent TokenHub", models: ["hy3-preview"], docUrl: "https://cloud.tencent.com/document/product/1823/130050", gateway: "models.dev" }, nebius: { url: "https://api.tokenfactory.nebius.com/v1", apiKeyEnvVar: "NEBIUS_API_KEY", apiKeyHeader: "Authorization", name: "Nebius Token Factory", models: [ "MiniMaxAI/MiniMax-M2.5", "MiniMaxAI/MiniMax-M2.5-fast", "NousResearch/Hermes-4-405B", "NousResearch/Hermes-4-70B", "PrimeIntellect/INTELLECT-3", "Qwen/Qwen2.5-VL-72B-Instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507-fast", "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-32B", "Qwen/Qwen3-Embedding-8B", "Qwen/Qwen3-Next-80B-A3B-Thinking", "Qwen/Qwen3-Next-80B-A3B-Thinking-fast", "Qwen/Qwen3.5-397B-A17B", "Qwen/Qwen3.5-397B-A17B-fast", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V3.2-fast", "deepseek-ai/DeepSeek-V4-Pro", "google/gemma-2-2b-it", "google/gemma-3-27b-it", "meta-llama/Llama-3.3-70B-Instruct", "meta-llama/Meta-Llama-3.1-8B-Instruct", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.5-fast", "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1", "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B", "nvidia/Nemotron-3-Nano-Omni", "nvidia/nemotron-3-super-120b-a12b", "openai/gpt-oss-120b", "openai/gpt-oss-120b-fast", "zai-org/GLM-5" ], docUrl: "https://docs.tokenfactory.nebius.com/", gateway: "models.dev" }, "hpc-ai": { url: "https://api.hpc-ai.com/inference/v1", apiKeyEnvVar: "HPC_AI_API_KEY", apiKeyHeader: "Authorization", name: "HPC-AI", models: ["minimax/minimax-m2.5", "moonshotai/kimi-k2.5", "zai-org/glm-5.1"], docUrl: "https://www.hpc-ai.com/doc/docs/quickstart/", gateway: "models.dev" }, xiaomi: { url: "https://api.xiaomimimo.com/v1", apiKeyEnvVar: "XIAOMI_API_KEY", apiKeyHeader: "Authorization", name: "Xiaomi", models: ["mimo-v2-flash", "mimo-v2-omni", "mimo-v2-pro", "mimo-v2.5", "mimo-v2.5-pro"], docUrl: "https://platform.xiaomimimo.com/#/docs", gateway: "models.dev" }, togetherai: { apiKeyEnvVar: "TOGETHER_API_KEY", name: "Together AI", models: [ "MiniMaxAI/MiniMax-M2.5", "MiniMaxAI/MiniMax-M2.7", "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", "Qwen/Qwen3-Coder-Next-FP8", "Qwen/Qwen3.5-397B-A17B", "Qwen/Qwen3.6-Plus", "deepseek-ai/DeepSeek-R1", "deepseek-ai/DeepSeek-V3", "deepseek-ai/DeepSeek-V3-1", "deepseek-ai/DeepSeek-V4-Pro", "essentialai/Rnj-1-Instruct", "google/gemma-4-31B-it", "meta-llama/Llama-3.3-70B-Instruct-Turbo", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "openai/gpt-oss-120b", "zai-org/GLM-5.1" ], docUrl: "https://docs.together.ai/docs/serverless-models", gateway: "models.dev", npm: "@ai-sdk/togetherai" }, "stepfun-ai": { url: "https://api.stepfun.ai/step_plan/v1", apiKeyEnvVar: "STEPFUN_API_KEY", apiKeyHeader: "Authorization", name: "StepFun", models: ["step-3.5-flash", "step-3.5-flash-2603"], docUrl: "https://platform.stepfun.ai/docs/en/step-plan/integrations/open-code", gateway: "models.dev" }, inference: { url: "https://inference.net/v1", apiKeyEnvVar: "INFERENCE_API_KEY", apiKeyHeader: "Authorization", name: "Inference", models: [ "google/gemma-3", "meta/llama-3.1-8b-instruct", "meta/llama-3.2-11b-vision-instruct", "meta/llama-3.2-1b-instruct", "meta/llama-3.2-3b-instruct", "mistral/mistral-nemo-12b-instruct", "osmosis/osmosis-structure-0.6b", "qwen/qwen-2.5-7b-vision-instruct", "qwen/qwen3-embedding-4b" ], docUrl: "https://inference.net/models", gateway: "models.dev" }, netlify: { apiKeyEnvVar: ["NETLIFY_TOKEN", "NETLIFY_SITE_ID"], apiKeyHeader: "Authorization", name: "Netlify", gateway: "netlify", models: [ "anthropic/claude-haiku-4-5", "anthropic/claude-haiku-4-5-20251001", "anthropic/claude-opus-4-1-20250805", "anthropic/claude-opus-4-20250514", "anthropic/claude-opus-4-5", "anthropic/claude-opus-4-5-20251101", "anthropic/claude-opus-4-6", "anthropic/claude-opus-4-7", "anthropic/claude-sonnet-4-0", "anthropic/claude-sonnet-4-20250514", "anthropic/claude-sonnet-4-5", "anthropic/claude-sonnet-4-5-20250929", "anthropic/claude-sonnet-4-6", "gemini/gemini-2.0-flash", "gemini/gemini-2.0-flash-lite", "gemini/gemini-2.5-flash", "gemini/gemini-2.5-flash-image", "gemini/gemini-2.5-flash-lite", "gemini/gemini-2.5-pro", "gemini/gemini-3-flash-preview", "gemini/gemini-3-pro-image-preview", "gemini/gemini-3.1-flash-image-preview", "gemini/gemini-3.1-flash-lite", "gemini/gemini-3.1-flash-lite-preview", "gemini/gemini-3.1-pro-preview", "gemini/gemini-3.1-pro-preview-customtools", "gemini/gemini-3.5-flash", "gemini/gemini-flash-latest", "gemini/gemini-flash-lite-latest", "openai/chat-latest", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-mini", "openai/gpt-5", "openai/gpt-5-2025-08-07", "openai/gpt-5-codex", "openai/gpt-5-mini", "openai/gpt-5-mini-2025-08-07", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-2025-11-13", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-2025-12-11", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.2-pro-2025-12-11", "openai/gpt-5.3-chat-latest", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-2026-03-05", "openai/gpt-5.4-mini", "openai/gpt-5.4-mini-2026-03-17", "openai/gpt-5.4-nano", "openai/gpt-5.4-nano-2026-03-17", "openai/gpt-5.4-pro", "openai/gpt-5.4-pro-2026-03-05", "openai/gpt-5.5", "openai/gpt-5.5-2026-04-23", "openai/gpt-5.5-pro", "openai/gpt-5.5-pro-2026-04-23", "openai/o3", "openai/o3-mini", "openai/o4-mini" ], docUrl: "https://docs.netlify.com/build/ai-gateway/overview/" } }, models: { helicone: [ "chatgpt-4o-latest", "claude-3-haiku-20240307", "claude-3.5-haiku", "claude-3.5-sonnet-v2", "claude-3.7-sonnet", "claude-4.5-haiku", "claude-4.5-opus", "claude-4.5-sonnet", "claude-haiku-4-5-20251001", "claude-opus-4", "claude-opus-4-1", "claude-opus-4-1-20250805", "claude-sonnet-4", "claude-sonnet-4-5-20250929", "deepseek-r1-distill-llama-70b", "deepseek-reasoner", "deepseek-tng-r1t2-chimera", "deepseek-v3", "deepseek-v3.1-terminus", "deepseek-v3.2", "ernie-4.5-21b-a3b-thinking", "gemini-2.5-flash", "gemini-2.5-flash-lite", "gemini-2.5-pro", "gemini-3-pro-preview", "gemma-3-12b-it", "gemma2-9b-it", "glm-4.6", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-mini-2025-04-14", "gpt-4.1-nano", "gpt-4o", "gpt-4o-mini", "gpt-5", "gpt-5-chat-latest", "gpt-5-codex", "gpt-5-mini", "gpt-5-nano", "gpt-5-pro", "gpt-5.1", "gpt-5.1-chat-latest", "gpt-5.1-codex", "gpt-5.1-codex-mini", "gpt-oss-120b", "gpt-oss-20b", "grok-3", "grok-3-mini", "grok-4", "grok-4-1-fast-non-reasoning", "grok-4-1-fast-reasoning", "grok-4-fast-non-reasoning", "grok-4-fast-reasoning", "grok-code-fast-1", "hermes-2-pro-llama-3-8b", "kimi-k2-0711", "kimi-k2-0905", "kimi-k2-thinking", "llama-3.1-8b-instant", "llama-3.1-8b-instruct", "llama-3.1-8b-instruct-turbo", "llama-3.3-70b-instruct", "llama-3.3-70b-versatile", "llama-4-maverick", "llama-4-scout", "llama-guard-4", "llama-prompt-guard-2-22m", "llama-prompt-guard-2-86m", "mistral-large-2411", "mistral-nemo", "mistral-small", "o1", "o1-mini", "o3", "o3-mini", "o3-pro", "o4-mini", "qwen2.5-coder-7b-fast", "qwen3-235b-a22b-thinking", "qwen3-30b-a3b", "qwen3-32b", "qwen3-coder", "qwen3-coder-30b-a3b-instruct", "qwen3-next-80b-a3b-instruct", "qwen3-vl-235b-a22b-instruct", "sonar", "sonar-deep-research", "sonar-pro", "sonar-reasoning", "sonar-reasoning-pro" ], auriko: [ "claude-opus-4-6", "claude-opus-4-7", "claude-sonnet-4-6", "deepseek-v4-flash", "deepseek-v4-pro", "gemini-2.5-flash", "gemini-2.5-pro", "gemini-3.1-pro-preview", "glm-5.1", "grok-4.3", "kimi-k2.5", "kimi-k2.6", "minimax-m2-7", "minimax-m2-7-highspeed", "qwen-3.6-plus" ], firepass: ["accounts/fireworks/routers/kimi-k2p6-turbo"], "nano-gpt": [ "Alibaba-NLP/Tongyi-DeepResearch-30B-A3B", "Baichuan-M2", "Baichuan4-Air", "Baichuan4-Turbo", "CrucibleLab/L3.3-70B-Loki-V2.0", "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond", "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0", "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1", "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2", "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2", "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B", "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B", "GLM-4.5-Air-Derestricted", "GLM-4.5-Air-Derestricted-Iceblink", "GLM-4.5-Air-Derestricted-Iceblink-ReExtract", "GLM-4.5-Air-Derestricted-Iceblink-v2", "GLM-4.5-Air-Derestricted-Iceblink-v2-ReExtract", "GLM-4.5-Air-Derestricted-Steam", "GLM-4.5-Air-Derestricted-Steam-ReExtract", "GLM-4.6-Derestricted-v5", "GalrionSoftworks/MN-LooseCannon-12B-v1", "Gemma-3-27B-ArliAI-RPMax-v3", "Gemma-3-27B-Big-Tiger-v3", "Gemma-3-27B-CardProjector-v4", "Gemma-3-27B-Glitter", "Gemma-3-27B-Nidum-Uncensored", "Gemma-3-27B-it", "Gemma-3-27B-it-Abliterated", "Gryphe/MythoMax-L2-13b", "Infermatic/MN-12B-Inferor-v0.0", "KAT-Coder-Air-V1", "KAT-Coder-Exp-72B-1010", "KAT-Coder-Pro-V1", "LLM360/K2-Think", "LatitudeGames/Wayfarer-Large-70B-Llama-3.3", "Llama-3.3+(3.1v3.3)-70B-Hanami-x1", "Llama-3.3+(3.1v3.3)-70B-New-Dawn-v1.1", "Llama-3.3+(3v3.3)-70B-TenyxChat-DaybreakStorywriter", "Llama-3.3-70B-Anthrobomination", "Llama-3.3-70B-Argunaut-1-SFT", "Llama-3.3-70B-ArliAI-RPMax-v1.4", "Llama-3.3-70B-ArliAI-RPMax-v2", "Llama-3.3-70B-ArliAI-RPMax-v3", "Llama-3.3-70B-Aurora-Borealis", "Llama-3.3-70B-Bigger-Body", "Llama-3.3-70B-Cirrus-x1", "Llama-3.3-70B-Cu-Mai-R1", "Llama-3.3-70B-Damascus-R1", "Llama-3.3-70B-Dark-Ages-v0.1", "Llama-3.3-70B-Electra-R1", "Llama-3.3-70B-Electranova-v1.0", "Llama-3.3-70B-Fallen-R1-v1", "Llama-3.3-70B-Fallen-v1", "Llama-3.3-70B-Forgotten-Abomination-v5.0", "Llama-3.3-70B-Forgotten-Safeword-3.6", "Llama-3.3-70B-GeneticLemonade-Opus", "Llama-3.3-70B-GeneticLemonade-Unleashed-v3", "Llama-3.3-70B-Ignition-v0.1", "Llama-3.3-70B-Incandescent-Malevolence", "Llama-3.3-70B-Legion-V2.1", "Llama-3.3-70B-MS-Nevoria", "Llama-3.3-70B-Magnum-v4-SE", "Llama-3.3-70B-Magnum-v4-SE-Cirrus-x1-SLERP", "Llama-3.3-70B-Mhnnn-x1", "Llama-3.3-70B-MiraiFanfare", "Llama-3.3-70B-Mokume-Gane-R1", "Llama-3.3-70B-Nova", "Llama-3.3-70B-Predatorial-Extasy", "Llama-3.3-70B-Progenitor-V3.3", "Llama-3.3-70B-RAWMAW", "Llama-3.3-70B-Sapphira-0.1", "Llama-3.3-70B-Sapphira-0.2", "Llama-3.3-70B-Shakudo", "Llama-3.3-70B-StrawberryLemonade-v1.0", "Llama-3.3-70B-Strawberrylemonade-v1.2", "Llama-3.3-70B-The-Omega-Directive-Unslop-v2.0", "Llama-3.3-70B-The-Omega-Directive-Unslop-v2.1", "Llama-3.3-70B-Vulpecula-R1", "Magistral-Small-2506", "MarinaraSpaghetti/NemoMix-Unleashed-12B", "Meta-Llama-3-1-8B-Instruct-FP8", "MiniMax-M1", "MiniMax-M2", "MiniMaxAI/MiniMax-M1-80k", "Mistral-Nemo-12B-Instruct-2407", "NeverSleep/Llama-3-Lumimaid-70B-v0.1", "NeverSleep/Lumimaid-v0.2-70B", "NousResearch 2/DeepHermes-3-Mistral-24B-Preview", "NousResearch 2/Hermes-4-70B:thinking", "NousResearch 2/hermes-3-llama-3.1-70b", "NousResearch 2/hermes-4-405b", "NousResearch 2/hermes-4-405b:thinking", "NousResearch 2/hermes-4-70b", "QwQ-32B-ArliAI-RpR-v1", "Qwen2.5-32B-EVA-v0.2", "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0", "ReadyArt/The-Omega-Abomination-L-70B-v1.0", "Salesforce/Llama-xLAM-2-70b-fc-r", "Sao10K/L3-8B-Stheno-v3.2", "Sao10K/L3.1-70B-Euryale-v2.2", "Sao10K/L3.1-70B-Hanami-x1", "Sao10K/L3.3-70B-Euryale-v2.3", "Steelskull/L3.3-Cu-Mai-R1-70b", "Steelskull/L3.3-Electra-R1-70b", "Steelskull/L3.3-MS-Evalebis-70b", "Steelskull/L3.3-MS-Evayale-70B", "Steelskull/L3.3-MS-Nevoria-70b", "Steelskull/L3.3-Nevoria-R1-70b", "TEE/deepseek-r1-0528", "TEE/deepseek-v3.1", "TEE/deepseek-v3.2", "TEE/gemma-3-27b-it", "TEE/glm-4.6", "TEE/glm-4.7", "TEE/glm-4.7-flash", "TEE/glm-5", "TEE/gpt-oss-120b", "TEE/gpt-oss-20b", "TEE/kimi-k2-thinking", "TEE/kimi-k2.5", "TEE/kimi-k2.5-thinking", "TEE/llama3-3-70b", "TEE/minimax-m2.1", "TEE/qwen2.5-vl-72b-instruct", "TEE/qwen3-30b-a3b-instruct-2507", "TEE/qwen3-coder", "TEE/qwen3.5-397b-a17b", "THUDM/GLM-4-32B-0414", "THUDM/GLM-4-9B-0414", "THUDM/GLM-Z1-32B-0414", "THUDM/GLM-Z1-9B-0414", "THUDM/GLM-Z1-Rumination-32B-0414", "TheDrummer 2/Anubis-70B-v1", "TheDrummer 2/Anubis-70B-v1.1", "TheDrummer 2/Cydonia-24B-v2", "TheDrummer 2/Cydonia-24B-v4", "TheDrummer 2/Cydonia-24B-v4.1", "TheDrummer 2/Cydonia-24B-v4.3", "TheDrummer 2/Magidonia-24B-v4.3", "TheDrummer 2/Rocinante-12B-v1.1", "TheDrummer 2/UnslopNemo-12B-v4.1", "TheDrummer 2/skyfall-36b-v2", "Tongyi-Zhiwen/QwenLong-L1-32B", "VongolaChouko/Starcannon-Unleashed-12B-v1.0", "abacusai/Dracarys-72B-Instruct", "aion-labs/aion-1.0", "aion-labs/aion-1.0-mini", "aion-labs/aion-rp-llama-3.1-8b", "alibaba/qwen3.6-flash", "allenai/molmo-2-8b", "allenai/olmo-3-32b-think", "allenai/olmo-3.1-32b-instruct", "allenai/olmo-3.1-32b-think", "amazon/nova-2-lite-v1", "amazon/nova-lite-v1", "amazon/nova-micro-v1", "amazon/nova-pro-v1", "anthracite-org/magnum-v2-72b", "anthracite-org/magnum-v4-72b", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.6:thinking", "anthropic/claude-opus-4.6:thinking:low", "anthropic/claude-opus-4.6:thinking:max", "anthropic/claude-opus-4.6:thinking:medium", "anthropic/claude-sonnet-4.6", "anthropic/claude-sonnet-4.6:thinking", "arcee-ai/trinity-large", "arcee-ai/trinity-mini", "asi1-mini", "auto-model", "auto-model-basic", "auto-model-premium", "auto-model-standard", "azure-gpt-4-turbo", "azure-gpt-4o", "azure-gpt-4o-mini", "azure-o1", "azure-o3-mini", "baidu/ernie-4.5-300b-a47b", "baidu/ernie-4.5-vl-28b-a3b", "baseten/Kimi-K2-Instruct-FP4", "brave", "brave-pro", "brave-research", "chroma", "chutesai/Mistral-Small-3.2-24B-Instruct-2506", "claude-3-5-haiku-20241022", "claude-3-5-sonnet-20240620", "claude-3-5-sonnet-20241022", "claude-3-7-sonnet-20250219", "claude-3-7-sonnet-reasoner", "claude-3-7-sonnet-thinking", "claude-3-7-sonnet-thinking:1024", "claude-3-7-sonnet-thinking:128000", "claude-3-7-sonnet-thinking:32768", "claude-3-7-sonnet-thinking:8192", "claude-haiku-4-5-20251001", "claude-opus-4-1-20250805", "claude-opus-4-1-thinking", "claude-opus-4-1-thinking:1024", "claude-opus-4-1-thinking:32000", "claude-opus-4-1-thinking:32768", "claude-opus-4-1-thinking:8192", "claude-opus-4-20250514", "claude-opus-4-5-20251101", "claude-opus-4-5-20251101:thinking", "claude-opus-4-thinking", "claude-opus-4-thinking:1024", "claude-opus-4-thinking:32000", "claude-opus-4-thinking:32768", "claude-opus-4-thinking:8192", "claude-sonnet-4-20250514", "claude-sonnet-4-5-20250929", "claude-sonnet-4-5-20250929-thinking", "claude-sonnet-4-thinking", "claude-sonnet-4-thinking:1024", "claude-sonnet-4-thinking:32768", "claude-sonnet-4-thinking:64000", "claude-sonnet-4-thinking:8192", "cognitivecomputations/dolphin-2.9.2-qwen2-72b", "cohere/command-r", "cohere/command-r-plus-08-2024", "command-a-reasoning-08-2025", "deepclaude", "deepcogito/cogito-v1-preview-qwen-32B", "deepcogito/cogito-v2.1-671b", "deepseek-ai/DeepSeek-R1-0528", "deepseek-ai/DeepSeek-V3.1", "deepseek-ai/DeepSeek-V3.1-Terminus", "deepseek-ai/DeepSeek-V3.1-Terminus:thinking", "deepseek-ai/DeepSeek-V3.1:thinking", "deepseek-ai/deepseek-v3.2-exp", "deepseek-ai/deepseek-v3.2-exp-thinking", "deepseek-chat", "deepseek-chat-cheaper", "deepseek-math-v2", "deepseek-r1", "deepseek-r1-sambanova", "deepseek-reasoner", "deepseek-reasoner-cheaper", "deepseek-v3-0324", "deepseek/deepseek-prover-v2-671b", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-speciale", "deepseek/deepseek-v3.2:thinking", "dmind/dmind-1", "dmind/dmind-1-mini", "doubao-1-5-thinking-pro-250415", "doubao-1-5-thinking-pro-vision-250415", "doubao-1-5-thinking-vision-pro-250428", "doubao-1.5-pro-256k", "doubao-1.5-pro-32k", "doubao-1.5-vision-pro-32k", "doubao-seed-1-6-250615", "doubao-seed-1-6-flash-250615", "doubao-seed-1-6-thinking-250615", "doubao-seed-1-8-251215", "doubao-seed-2-0-code-preview-260215", "doubao-seed-2-0-lite-260215", "doubao-seed-2-0-mini-260215", "doubao-seed-2-0-pro-260215", "doubao-seed-code-preview-latest", "ernie-4.5-8k-preview", "ernie-4.5-turbo-128k", "ernie-4.5-turbo-vl-32k", "ernie-5.0-thinking-latest", "ernie-5.0-thinking-preview", "ernie-x1-32k", "ernie-x1-32k-preview", "ernie-x1-turbo-32k", "ernie-x1.1-preview", "essentialai/rnj-1-instruct", "exa-answer", "exa-research", "exa-research-pro", "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5", "fastgpt", "featherless-ai/Qwerky-72B", "gemini-2.0-flash-001", "gemini-2.0-flash-exp-image-generation", "gemini-2.0-flash-lite", "gemini-2.0-flash-thinking-exp-01-21", "gemini-2.0-flash-thinking-exp-1219", "gemini-2.0-pro-exp-02-05", "gemini-2.0-pro-reasoner", "gemini-2.5-flash", "gemini-2.5-flash-lite", "gemini-2.5-flash-lite-preview-06-17", "gemini-2.5-flash-lite-preview-09-2025", "gemini-2.5-flash-lite-preview-09-2025-thinking", "gemini-2.5-flash-nothinking", "gemini-2.5-flash-preview-04-17", "gemini-2.5-flash-preview-04-17:thinking", "gemini-2.5-flash-preview-05-20", "gemini-2.5-flash-preview-05-20:thinking", "gemini-2.5-flash-preview-09-2025", "gemini-2.5-flash-preview-09-2025-thinking", "gemini-2.5-pro", "gemini-2.5-pro-exp-03-25", "gemini-2.5-pro-preview-03-25", "gemini-2.5-pro-preview-05-06", "gemini-2.5-pro-preview-06-05", "gemini-3-pro-image-preview", "gemini-3-pro-preview", "gemini-3-pro-preview-thinking", "gemini-exp-1206", "glm-4", "glm-4-air", "glm-4-air-0111", "glm-4-airx", "glm-4-flash", "glm-4-long", "glm-4-plus", "glm-4-plus-0111", "glm-4.1v-thinking-flash", "glm-4.1v-thinking-flashx", "glm-z1-air", "glm-z1-airx", "glm-zero-preview", "google/gemini-3-flash-preview", "google/gemini-3-flash-preview-thinking", "google/gemini-flash-1.5", "grok-3-beta", "grok-3-fast-beta", "grok-3-mini-beta", "grok-3-mini-fast-beta", "hidream", "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated", "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated", "huihui-ai/Llama-3.1-Nemotron-70B-Instruct-HF-abliterated", "huihui-ai/Llama-3.3-70B-Instruct-abliterated", "huihui-ai/Qwen2.5-32B-Instruct-abliterated", "hunyuan-t1-latest", "hunyuan-turbos-20250226", "inflatebot/MN-12B-Mag-Mell-R1", "inflection/inflection-3-pi", "inflection/inflection-3-productivity", "jamba-large", "jamba-large-1.6", "jamba-large-1.7", "jamba-mini", "jamba-mini-1.6", "jamba-mini-1.7", "kimi-k2-instruct-fast", "kimi-thinking-preview", "learnlm-1.5-pro-experimental", "meganova-ai/manta-flash-1.0", "meganova-ai/manta-mini-1.0", "meganova-ai/manta-pro-1.0", "meituan-longcat/LongCat-Flash-Chat-FP8", "meta-llama/llama-3.1-8b-instruct", "meta-llama/llama-3.2-3b-instruct", "meta-llama/llama-3.2-90b-vision-instruct", "meta-llama/llama-3.3-70b-instruct", "meta-llama/llama-4-maverick", "meta-llama/llama-4-scout", "microsoft/MAI-DS-R1-FP8", "microsoft/wizardlm-2-8x22b", "minimax/minimax-01", "minimax/minimax-m2-her", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.7", "miromind-ai/mirothinker-v1.5-235b", "mistral-small-31-24b-instruct", "mistralai/Devstral-Small-2505", "mistralai/Mistral-Nemo-Instruct-2407", "mistralai/codestral-2508", "mistralai/devstral-2-123b-instruct-2512", "mistralai/ministral-14b-2512", "mistralai/ministral-14b-instruct-2512", "mistralai/ministral-3b-2512", "mistralai/ministral-8b-2512", "mistralai/mistral-7b-instruct", "mistralai/mistral-large", "mistralai/mistral-large-3-675b-instruct-2512", "mistralai/mistral-medium-3", "mistralai/mistral-medium-3.1", "mistralai/mistral-saba", "mistralai/mistral-small-creative", "mistralai/mistral-tiny", "mistralai/mixtral-8x22b-instruct-v0.1", "mistralai/mixtral-8x7b-instruct-v0.1", "mlabonne/NeuralDaredevil-8B-abliterated", "moonshotai/Kimi-Dev-72B", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/kimi-k2-instruct", "moonshotai/kimi-k2-instruct-0711", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2-thinking-original", "moonshotai/kimi-k2-thinking-turbo-original", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.5:thinking", "moonshotai/kimi-k2.6", "moonshotai/kimi-k2.6:thinking", "nex-agi/deepseek-v3.1-nex-n1", "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16", "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF", "nvidia/Llama-3.1-Nemotron-Ultra-253B-v1", "nvidia/Llama-3.3-Nemotron-Super-49B-v1", "nvidia/Llama-3_3-Nemotron-Super-49B-v1_5", "nvidia/nemotron-3-nano-30b-a3b", "nvidia/nvidia-nemotron-nano-9b-v2", "openai/chatgpt-4o-latest", "openai/gpt-3.5-turbo", "openai/gpt-4-turbo", "openai/gpt-4-turbo-preview", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-2024-08-06", "openai/gpt-4o-2024-11-20", "openai/gpt-4o-mini", "openai/gpt-4o-mini-search-preview", "openai/gpt-4o-search-preview", "openai/gpt-5", "openai/gpt-5-chat-latest", "openai/gpt-5-codex", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-2025-11-13", "openai/gpt-5.1-chat", "openai/gpt-5.1-chat-latest", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-chat", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "openai/gpt-oss-safeguard-20b", "openai/o1", "openai/o1-preview", "openai/o1-pro", "openai/o3", "openai/o3-deep-research", "openai/o3-mini", "openai/o3-mini-high", "openai/o3-mini-low", "openai/o3-pro-2025-06-10", "openai/o4-mini", "openai/o4-mini-deep-research", "openai/o4-mini-high", "pamanseau/OpenReasoning-Nemotron-32B", "phi-4-mini-instruct", "phi-4-multimodal-instruct", "qvq-max", "qwen-3.6-plus", "qwen-image", "qwen-long", "qwen-max", "qwen-plus", "qwen-turbo", "qwen/Qwen3.6-35B-A3B", "qwen/Qwen3.6-35B-A3B:thinking", "qwen/qwen3.5-397b-a17b", "qwen25-vl-72b-instruct", "qwen3-30b-a3b-instruct-2507", "qwen3-coder-30b-a3b-instruct", "qwen3-max-2026-01-23", "qwen3-vl-235b-a22b-instruct-original", "qwen3-vl-235b-a22b-thinking", "qwen3.6-max-preview", "qwq-32b", "raifle/sorcererlm-8x22b", "sarvan-medium", "shisa-ai/shisa-v2-llama3.3-70b", "shisa-ai/shisa-v2.1-llama3.3-70b", "sonar", "sonar-deep-research", "sonar-pro", "sonar-reasoning-pro", "soob3123/GrayLine-Qwen3-8B", "soob3123/Veiled-Calla-12B", "soob3123/amoral-gemma3-27B-v2", "step-2-16k-exp", "step-2-mini", "step-3", "step-r1-v-mini", "stepfun-ai/step-3.5-flash", "stepfun-ai/step-3.5-flash:thinking", "study_gpt-chatgpt-4o-latest", "tencent/Hunyuan-MT-7B", "tngtech/DeepSeek-TNG-R1T2-Chimera", "tngtech/tng-r1t-chimera", "undi95/remm-slerp-l2-13b", "universal-summarizer", "unsloth/gemma-3-12b-it", "unsloth/gemma-3-1b-it", "unsloth/gemma-3-27b-it", "unsloth/gemma-3-4b-it", "v0-1.0-md", "v0-1.5-lg", "v0-1.5-md", "venice-uncensored", "venice-uncensored:web", "x-ai/grok-4-07-09", "x-ai/grok-4-fast", "x-ai/grok-4-fast:thinking", "x-ai/grok-4.1-fast", "x-ai/grok-4.1-fast-reasoning", "x-ai/grok-code-fast-1", "xiaomi/mimo-v2-flash", "xiaomi/mimo-v2-flash-original", "xiaomi/mimo-v2-flash-thinking", "xiaomi/mimo-v2-flash-thinking-original", "yi-large", "yi-lightning", "yi-medium-200k", "z-ai/glm-4.5v", "z-ai/glm-4.5v:thinking", "z-ai/glm-4.6", "z-ai/glm-4.6:thinking", "z-image-turbo", "zai-org/glm-4.7", "zai-org/glm-4.7-flash", "zai-org/glm-5", "zai-org/glm-5.1", "zai-org/glm-5.1:thinking", "zai-org/glm-5:thinking" ], "io-net": [ "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", "Qwen/Qwen2.5-VL-32B-Instruct", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-Next-80B-A3B-Instruct", "deepseek-ai/DeepSeek-R1-0528", "meta-llama/Llama-3.2-90B-Vision-Instruct", "meta-llama/Llama-3.3-70B-Instruct", "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", "mistralai/Devstral-Small-2505", "mistralai/Magistral-Small-2506", "mistralai/Mistral-Large-Instruct-2411", "mistralai/Mistral-Nemo-Instruct-2407", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/Kimi-K2-Thinking", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "zai-org/GLM-4.6" ], inception: ["mercury-2", "mercury-edit-2"], submodel: [ "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", "deepseek-ai/DeepSeek-R1-0528", "deepseek-ai/DeepSeek-V3-0324", "deepseek-ai/DeepSeek-V3.1", "openai/gpt-oss-120b", "zai-org/GLM-4.5-Air", "zai-org/GLM-4.5-FP8" ], requesty: [ "anthropic/claude-3-7-sonnet", "anthropic/claude-haiku-4-5", "anthropic/claude-opus-4", "anthropic/claude-opus-4-1", "anthropic/claude-opus-4-5", "anthropic/claude-opus-4-6", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4-5", "anthropic/claude-sonnet-4-6", "google/gemini-2.5-flash", "google/gemini-2.5-pro", "google/gemini-3-flash-preview", "google/gemini-3-pro-preview", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4o-mini", "openai/gpt-5", "openai/gpt-5-chat", "openai/gpt-5-codex", "openai/gpt-5-image", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-chat", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-chat", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-pro", "openai/o4-mini", "xai/grok-4", "xai/grok-4-fast" ], zai: [ "glm-4.5", "glm-4.5-air", "glm-4.5-flash", "glm-4.5v", "glm-4.6", "glm-4.6v", "glm-4.7", "glm-4.7-flash", "glm-4.7-flashx", "glm-5", "glm-5-turbo", "glm-5.1", "glm-5v-turbo" ], "zai-coding-plan": ["glm-4.5-air", "glm-4.7", "glm-5-turbo", "glm-5.1", "glm-5v-turbo"], deepinfra: [ "MiniMaxAI/MiniMax-M2", "MiniMaxAI/MiniMax-M2.1", "MiniMaxAI/MiniMax-M2.5", "Qwen/Qwen3-Coder-480B-A35B-Instruct", "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", "Qwen/Qwen3.5-35B-A3B", "Qwen/Qwen3.5-397B-A17B", "Qwen/Qwen3.6-35B-A3B", "anthropic/claude-3-7-sonnet-latest", "anthropic/claude-4-opus", "deepseek-ai/DeepSeek-R1-0528", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V4-Flash", "deepseek-ai/DeepSeek-V4-Pro", "google/gemma-4-26B-A4B-it", "google/gemma-4-31B-it", "meta-llama/Llama-3.1-70B-Instruct", "meta-llama/Llama-3.1-70B-Instruct-Turbo", "meta-llama/Llama-3.1-8B-Instruct", "meta-llama/Llama-3.1-8B-Instruct-Turbo", "meta-llama/Llama-3.3-70B-Instruct-Turbo", "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", "meta-llama/Llama-4-Scout-17B-16E-Instruct", "moonshotai/Kimi-K2-Instruct", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/Kimi-K2-Thinking", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "xiaomi/mimo-v2.5", "xiaomi/mimo-v2.5-pro", "zai-org/GLM-4.6", "zai-org/GLM-4.6V", "zai-org/GLM-4.7", "zai-org/GLM-4.7-Flash", "zai-org/GLM-5", "zai-org/GLM-5.1" ], clarifai: [ "arcee_ai/AFM/models/trinity-mini", "clarifai/main/models/mm-poly-8b", "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput", "mistralai/completion/models/Ministral-3-14B-Reasoning-2512", "mistralai/completion/models/Ministral-3-3B-Reasoning-2512", "moonshotai/chat-completion/models/Kimi-K2_6", "openai/chat-completion/models/gpt-oss-120b-high-throughput", "openai/chat-completion/models/gpt-oss-20b", "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507" ], moark: ["GLM-4.7", "MiniMax-M2.1"], frogbot: [ "claude-haiku-4-5", "claude-opus-4-6", "claude-opus-4-7", "claude-sonnet-4-6", "deepseek-v4-pro", "gemini-2.5-flash", "gemini-2.5-pro", "gemini-3-1-pro-preview", "gemini-3-flash-preview", "gpt-4o", "gpt-5-3-codex", "gpt-5-4-mini", "gpt-5-4-nano", "gpt-5-5", "gpt-oss-120b", "gpt-oss-20b", "grok-4-1-fast-non-reasoning", "grok-4-1-fast-reasoning", "grok-4-3", "grok-code-fast-1", "kimi-k2-6", "kimi-k2.5", "minimax-m2-5", "minimax-m2-7", "qwen-3-6-plus", "zai-glm-5-1" ], wandb: [ "MiniMaxAI/MiniMax-M2.5", "OpenPipe/Qwen3-14B-Instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-Coder-480B-A35B-Instruct", "deepseek-ai/DeepSeek-V3.1", "meta-llama/Llama-3.1-70B-Instruct", "meta-llama/Llama-3.1-8B-Instruct", "meta-llama/Llama-3.3-70B-Instruct", "meta-llama/Llama-4-Scout-17B-16E-Instruct", "microsoft/Phi-4-mini-instruct", "moonshotai/Kimi-K2.5", "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "zai-org/GLM-5-FP8", "zai-org/GLM-5.1" ], gmicloud: [ "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-4.6", "deepseek-ai/DeepSeek-V4-Flash", "deepseek-ai/DeepSeek-V4-Pro", "moonshotai/Kimi-K2.6", "zai-org/GLM-5-FP8", "zai-org/GLM-5.1-FP8" ], crof: [ "deepseek-v3.2", "deepseek-v4-flash", "deepseek-v4-pro", "deepseek-v4-pro-precision", "gemma-4-31b-it", "glm-4.7", "glm-4.7-flash", "glm-5", "glm-5.1", "glm-5.1-precision", "greg", "kimi-k2.5", "kimi-k2.5-lightning", "kimi-k2.6", "kimi-k2.6-precision", "mimo-v2.5-pro", "mimo-v2.5-pro-precision", "minimax-m2.5", "qwen3.5-397b-a17b", "qwen3.5-9b", "qwen3.6-27b" ], ambient: ["moonshotai/kimi-k2.6", "zai-org/GLM-5.1-FP8"], "routing-run": [ "route/deepseek-v3.2", "route/deepseek-v4-flash", "route/deepseek-v4-flash-6bit", "route/deepseek-v4-pro", "route/deepseek-v4-pro-6bit", "route/gemma-4-31b-it", "route/glm-5.1", "route/glm-5.1-6bit", "route/kimi-k2.5", "route/kimi-k2.6", "route/kimi-k2.6-6bit", "route/mimo-v2.5-pro", "route/mimo-v2.5-pro-6bit", "route/minimax-m2.5", "route/minimax-m2.5-highspeed", "route/minimax-m2.7", "route/minimax-m2.7-highspeed", "route/mistral-large-3", "route/mistral-medium-2505", "route/mistral-small-2503", "route/qwen3.6-27b", "route/step-3.5-flash", "route/step-3.5-flash-2603", "route/stepfun-3.5-flash" ], "the-grid-ai": [ "agent-max", "agent-prime", "agent-standard", "code-max", "code-prime", "code-standard", "text-max", "text-prime", "text-standard" ], fastrouter: [ "anthropic/claude-opus-4.1", "anthropic/claude-sonnet-4", "deepseek-ai/deepseek-r1-distill-llama-70b", "google/gemini-2.5-flash", "google/gemini-2.5-pro", "moonshotai/kimi-k2", "openai/gpt-4.1", "openai/gpt-5", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "qwen/qwen3-coder", "x-ai/grok-4", "z-ai/glm-5" ], "tencent-coding-plan": [ "glm-5", "hunyuan-2.0-instruct", "hunyuan-2.0-thinking", "hunyuan-t1", "hunyuan-turbos", "kimi-k2.5", "minimax-m2.5", "tc-code-latest" ], cortecs: [ "claude-4-5-sonnet", "claude-4-6-sonnet", "claude-haiku-4-5", "claude-opus4-5", "claude-opus4-6", "claude-opus4-7", "claude-sonnet-4", "codestral-2508", "deepseek-r1-0528", "deepseek-v3-0324", "deepseek-v3.2", "deepseek-v4-flash", "deepseek-v4-pro", "devstral-2512", "devstral-small-2512", "gemini-2.5-pro", "glm-4.5", "glm-4.5-air", "glm-4.7", "glm-4.7-flash", "glm-5", "glm-5.1", "gpt-4.1", "gpt-oss-120b", "hermes-4-70b", "intellect-3", "kimi-k2-instruct", "kimi-k2-thinking", "kimi-k2.5", "kimi-k2.6", "llama-3.1-405b-instruct", "llama-3.3-70b-instruct", "minimax-m2", "minimax-m2.1", "minimax-m2.5", "minimax-m2.7", "mistral-large-2512", "mixtral-8x7B-instruct-v0.1", "nemotron-3-super-120b-a12b", "nova-pro-v1", "qwen-2.5-72b-instruct", "qwen3-235b-a22b-instruct-2507", "qwen3-32b", "qwen3-coder-30b-a3b-instruct", "qwen3-coder-480b-a35b-instruct", "qwen3-coder-next", "qwen3-next-80b-a3b-thinking", "qwen3.5-122b-a10b", "qwen3.5-397b-a17b" ], baseten: [ "MiniMaxAI/MiniMax-M2.5", "deepseek-ai/DeepSeek-V3-0324", "deepseek-ai/DeepSeek-V3.1", "deepseek-ai/DeepSeek-V4-Pro", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "nvidia/Nemotron-120B-A12B", "openai/gpt-oss-120b", "zai-org/GLM-4.6", "zai-org/GLM-4.7", "zai-org/GLM-5" ], llama: [ "cerebras-llama-4-maverick-17b-128e-instruct", "cerebras-llama-4-scout-17b-16e-instruct", "groq-llama-4-maverick-17b-128e-instruct", "llama-3.3-70b-instruct", "llama-3.3-8b-instruct", "llama-4-maverick-17b-128e-instruct-fp8", "llama-4-scout-17b-16e-instruct-fp8" ], "novita-ai": [ "baichuan/baichuan-m2-32b", "baidu/ernie-4.5-21B-a3b", "baidu/ernie-4.5-21B-a3b-thinking", "baidu/ernie-4.5-300b-a47b-paddle", "baidu/ernie-4.5-vl-28b-a3b", "baidu/ernie-4.5-vl-28b-a3b-thinking", "baidu/ernie-4.5-vl-424b-a47b", "deepseek/deepseek-ocr", "deepseek/deepseek-ocr-2", "deepseek/deepseek-prover-v2-671b", "deepseek/deepseek-r1-0528", "deepseek/deepseek-r1-0528-qwen3-8b", "deepseek/deepseek-r1-distill-llama-70b", "deepseek/deepseek-r1-distill-qwen-14b", "deepseek/deepseek-r1-distill-qwen-32b", "deepseek/deepseek-r1-turbo", "deepseek/deepseek-v3-0324", "deepseek/deepseek-v3-turbo", "deepseek/deepseek-v3.1", "deepseek/deepseek-v3.1-terminus", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-pro", "google/gemma-3-12b-it", "google/gemma-3-27b-it", "google/gemma-4-26b-a4b-it", "google/gemma-4-31b-it", "gryphe/mythomax-l2-13b", "inclusionai/ling-2.6-1t", "inclusionai/ling-2.6-flash", "kwaipilot/kat-coder-pro", "meta-llama/llama-3-70b-instruct", "meta-llama/llama-3-8b-instruct", "meta-llama/llama-3.1-8b-instruct", "meta-llama/llama-3.2-3b-instruct", "meta-llama/llama-3.3-70b-instruct", "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", "meta-llama/llama-4-scout-17b-16e-instruct", "microsoft/wizardlm-2-8x22b", "minimax/minimax-m2", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.5-highspeed", "minimax/minimax-m2.7", "minimaxai/minimax-m1-80k", "mistralai/mistral-nemo", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-instruct", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.6", "nousresearch/hermes-2-pro-llama-3-8b", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "paddlepaddle/paddleocr-vl", "qwen/qwen-2.5-72b-instruct", "qwen/qwen-mt-plus", "qwen/qwen2.5-7b-instruct", "qwen/qwen2.5-vl-72b-instruct", "qwen/qwen3-235b-a22b-fp8", "qwen/qwen3-235b-a22b-instruct-2507", "qwen/qwen3-235b-a22b-thinking-2507", "qwen/qwen3-30b-a3b-fp8", "qwen/qwen3-32b-fp8", "qwen/qwen3-4b-fp8", "qwen/qwen3-8b-fp8", "qwen/qwen3-coder-30b-a3b-instruct", "qwen/qwen3-coder-480b-a35b-instruct", "qwen/qwen3-coder-next", "qwen/qwen3-max", "qwen/qwen3-next-80b-a3b-instruct", "qwen/qwen3-next-80b-a3b-thinking", "qwen/qwen3-omni-30b-a3b-instruct", "qwen/qwen3-omni-30b-a3b-thinking", "qwen/qwen3-vl-235b-a22b-instruct", "qwen/qwen3-vl-235b-a22b-thinking", "qwen/qwen3-vl-30b-a3b-instruct", "qwen/qwen3-vl-30b-a3b-thinking", "qwen/qwen3-vl-8b-instruct", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-27b", "qwen/qwen3.5-35b-a3b", "qwen/qwen3.5-397b-a17b", "sao10K/L3-8B-stheno-v3.2", "sao10K/l3-70b-euryale-v2.1", "sao10K/l3-8b-lunaris", "sao10K/l31-70b-euryale-v2.2", "xiaomimimo/mimo-v2-flash", "zai-org/autoglm-phone-9b-multilingual", "zai-org/glm-4.5", "zai-org/glm-4.5-air", "zai-org/glm-4.5v", "zai-org/glm-4.6", "zai-org/glm-4.6v", "zai-org/glm-4.7", "zai-org/glm-4.7-flash", "zai-org/glm-5", "zai-org/glm-5.1" ], digitalocean: [ "alibaba-qwen3-32b", "all-mini-lm-l6-v2", "anthropic-claude-4.1-opus", "anthropic-claude-4.5-haiku", "anthropic-claude-4.5-sonnet", "anthropic-claude-4.6-sonnet", "anthropic-claude-haiku-4.5", "anthropic-claude-opus-4", "anthropic-claude-opus-4.5", "anthropic-claude-opus-4.6", "anthropic-claude-opus-4.7", "anthropic-claude-sonnet-4", "arcee-trinity-large-thinking", "bge-m3", "bge-reranker-v2-m3", "deepseek-3.2", "deepseek-r1-distill-llama-70b", "deepseek-v3", "deepseek-v4-pro", "e5-large-v2", "fal-ai/elevenlabs/tts/multilingual-v2", "fal-ai/fast-sdxl", "fal-ai/flux/schnell", "fal-ai/stable-audio-25/text-to-audio", "gemma-4-31B-it", "glm-5", "gte-large-en-v1.5", "kimi-k2.5", "kimi-k2.6", "llama-4-maverick", "llama3-8b-instruct", "llama3.3-70b-instruct", "minimax-m2.5", "ministral-3-8b-instruct-2512", "mistral-3-14B", "mistral-7b-instruct-v0.3", "multi-qa-mpnet-base-dot-v1", "nemotron-3-nano-30b", "nemotron-3-nano-omni", "nemotron-nano-12b-v2-vl", "nvidia-nemotron-3-super-120b", "openai-gpt-4.1", "openai-gpt-4o", "openai-gpt-4o-mini", "openai-gpt-5", "openai-gpt-5-mini", "openai-gpt-5-nano", "openai-gpt-5.1-codex-max", "openai-gpt-5.2", "openai-gpt-5.2-pro", "openai-gpt-5.3-codex", "openai-gpt-5.4", "openai-gpt-5.4-mini", "openai-gpt-5.4-nano", "openai-gpt-5.4-pro", "openai-gpt-5.5", "openai-gpt-image-1", "openai-gpt-image-1.5", "openai-gpt-image-2", "openai-gpt-oss-120b", "openai-gpt-oss-20b", "openai-o1", "openai-o3", "openai-o3-mini", "qwen-2.5-14b-instruct", "qwen3-coder-flash", "qwen3-embedding-0.6b", "qwen3-tts-voicedesign", "qwen3.5-397b-a17b", "stable-diffusion-3.5-large", "wan2-2-t2v-a14b" ], moonshotai: [ "kimi-k2-0711-preview", "kimi-k2-0905-preview", "kimi-k2-thinking", "kimi-k2-thinking-turbo", "kimi-k2-turbo-preview", "kimi-k2.5", "kimi-k2.6" ], mistral: [ "codestral-latest", "devstral-2512", "devstral-medium-2507", "devstral-medium-latest", "devstral-small-2505", "devstral-small-2507", "labs-devstral-small-2512", "magistral-medium-latest", "magistral-small", "ministral-3b-latest", "ministral-8b-latest", "mistral-embed", "mistral-large-2411", "mistral-large-2512", "mistral-large-latest", "mistral-medium-2505", "mistral-medium-2508", "mistral-medium-2604", "mistral-medium-latest", "mistral-nemo", "mistral-small-2506", "mistral-small-2603", "mistral-small-latest", "open-mistral-7b", "open-mixtral-8x22b", "open-mixtral-8x7b", "pixtral-12b", "pixtral-large-latest" ], kilo: [ "ai21/jamba-large-1.7", "aion-labs/aion-1.0", "aion-labs/aion-1.0-mini", "aion-labs/aion-2.0", "aion-labs/aion-rp-llama-3.1-8b", "alfredpros/codellama-7b-instruct-solidity", "alibaba/tongyi-deepresearch-30b-a3b", "allenai/olmo-3-32b-think", "amazon/nova-2-lite-v1", "amazon/nova-lite-v1", "amazon/nova-micro-v1", "amazon/nova-premier-v1", "amazon/nova-pro-v1", "anthracite-org/magnum-v4-72b", "anthropic/claude-3-haiku", "anthropic/claude-3.5-haiku", "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.6-fast", "anthropic/claude-opus-4.7", "anthropic/claude-opus-4.7-fast", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "arcee-ai/coder-large", "arcee-ai/maestro-reasoning", "arcee-ai/spotlight", "arcee-ai/trinity-large-preview", "arcee-ai/trinity-large-thinking", "arcee-ai/trinity-mini", "arcee-ai/virtuoso-large", "baidu/cobuddy:free", "baidu/ernie-4.5-21b-a3b", "baidu/ernie-4.5-21b-a3b-thinking", "baidu/ernie-4.5-300b-a47b", "baidu/ernie-4.5-vl-28b-a3b", "baidu/ernie-4.5-vl-424b-a47b", "baidu/qianfan-ocr-fast", "bytedance-seed/seed-1.6", "bytedance-seed/seed-1.6-flash", "bytedance-seed/seed-2.0-lite", "bytedance-seed/seed-2.0-mini", "bytedance/ui-tars-1.5-7b", "cohere/command-a", "cohere/command-r-08-2024", "cohere/command-r-plus-08-2024", "cohere/command-r7b-12-2024", "deepcogito/cogito-v2.1-671b", "deepseek/deepseek-chat", "deepseek/deepseek-chat-v3-0324", "deepseek/deepseek-chat-v3.1", "deepseek/deepseek-r1", "deepseek/deepseek-r1-0528", "deepseek/deepseek-r1-distill-llama-70b", "deepseek/deepseek-r1-distill-qwen-32b", "deepseek/deepseek-v3.1-terminus", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v3.2-speciale", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-flash:free", "deepseek/deepseek-v4-pro", "essentialai/rnj-1-instruct", "google/gemini-2.0-flash-001", "google/gemini-2.0-flash-lite-001", "google/gemini-2.5-flash", "google/gemini-2.5-flash-image", "google/gemini-2.5-flash-lite", "google/gemini-2.5-flash-lite-preview-09-2025", "google/gemini-2.5-pro", "google/gemini-2.5-pro-preview", "google/gemini-2.5-pro-preview-05-06", "google/gemini-3-flash-preview", "google/gemini-3-pro-image-preview", "google/gemini-3.1-flash-image-preview", "google/gemini-3.1-flash-lite", "google/gemini-3.1-flash-lite-preview", "google/gemini-3.1-pro-preview", "google/gemini-3.1-pro-preview-customtools", "google/gemma-2-27b-it", "google/gemma-3-12b-it", "google/gemma-3-27b-it", "google/gemma-3-4b-it", "google/gemma-3n-e4b-it", "google/gemma-4-26b-a4b-it", "google/gemma-4-31b-it", "google/lyria-3-clip-preview", "google/lyria-3-pro-preview", "gryphe/mythomax-l2-13b", "ibm-granite/granite-4.0-h-micro", "ibm-granite/granite-4.1-8b", "inception/mercury-2", "inclusionai/ling-2.6-1t", "inclusionai/ling-2.6-flash", "inclusionai/ring-2.6-1t", "inflection/inflection-3-pi", "inflection/inflection-3-productivity", "kilo-auto/balanced", "kilo-auto/free", "kilo-auto/frontier", "kilo-auto/small", "kwaipilot/kat-coder-pro-v2", "liquid/lfm-2-24b-a2b", "mancer/weaver", "meta-llama/llama-3-70b-instruct", "meta-llama/llama-3-8b-instruct", "meta-llama/llama-3.1-70b-instruct", "meta-llama/llama-3.1-8b-instruct", "meta-llama/llama-3.2-11b-vision-instruct", "meta-llama/llama-3.2-1b-instruct", "meta-llama/llama-3.2-3b-instruct", "meta-llama/llama-3.3-70b-instruct", "meta-llama/llama-4-maverick", "meta-llama/llama-4-scout", "meta-llama/llama-guard-3-8b", "meta-llama/llama-guard-4-12b", "microsoft/phi-4", "microsoft/phi-4-mini-instruct", "microsoft/wizardlm-2-8x22b", "minimax/minimax-01", "minimax/minimax-m1", "minimax/minimax-m2", "minimax/minimax-m2-her", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.7", "mistralai/codestral-2508", "mistralai/devstral-2512", "mistralai/devstral-medium", "mistralai/devstral-small", "mistralai/ministral-14b-2512", "mistralai/ministral-3b-2512", "mistralai/ministral-8b-2512", "mistralai/mistral-7b-instruct-v0.1", "mistralai/mistral-large", "mistralai/mistral-large-2407", "mistralai/mistral-large-2411", "mistralai/mistral-large-2512", "mistralai/mistral-medium-3", "mistralai/mistral-medium-3-5", "mistralai/mistral-medium-3.1", "mistralai/mistral-nemo", "mistralai/mistral-saba", "mistralai/mistral-small-24b-instruct-2501", "mistralai/mistral-small-2603", "mistralai/mistral-small-3.1-24b-instruct", "mistralai/mistral-small-3.2-24b-instruct", "mistralai/mixtral-8x22b-instruct", "mistralai/pixtral-large-2411", "mistralai/voxtral-small-24b-2507", "moonshotai/kimi-k2", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.6", "morph/morph-v3-fast", "morph/morph-v3-large", "nex-agi/deepseek-v3.1-nex-n1", "nousresearch/hermes-2-pro-llama-3-8b", "nousresearch/hermes-3-llama-3.1-405b", "nousresearch/hermes-3-llama-3.1-70b", "nousresearch/hermes-4-405b", "nousresearch/hermes-4-70b", "nvidia/llama-3.3-nemotron-super-49b-v1.5", "nvidia/nemotron-3-nano-30b-a3b", "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", "nvidia/nemotron-3-super-120b-a12b", "nvidia/nemotron-3-super-120b-a12b:free", "nvidia/nemotron-nano-9b-v2", "openai/gpt-3.5-turbo", "openai/gpt-3.5-turbo-0613", "openai/gpt-3.5-turbo-16k", "openai/gpt-3.5-turbo-instruct", "openai/gpt-4", "openai/gpt-4-0314", "openai/gpt-4-1106-preview", "openai/gpt-4-turbo", "openai/gpt-4-turbo-preview", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-2024-05-13", "openai/gpt-4o-2024-08-06", "openai/gpt-4o-2024-11-20", "openai/gpt-4o-audio-preview", "openai/gpt-4o-mini", "openai/gpt-4o-mini-2024-07-18", "openai/gpt-4o-mini-search-preview", "openai/gpt-4o-search-preview", "openai/gpt-5", "openai/gpt-5-chat", "openai/gpt-5-codex", "openai/gpt-5-image", "openai/gpt-5-image-mini", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-chat", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-chat", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-chat", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-image-2", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "openai/gpt-audio", "openai/gpt-audio-mini", "openai/gpt-chat-latest", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "openai/gpt-oss-safeguard-20b", "openai/o1", "openai/o1-pro", "openai/o3", "openai/o3-deep-research", "openai/o3-mini", "openai/o3-mini-high", "openai/o3-pro", "openai/o4-mini", "openai/o4-mini-deep-research", "openai/o4-mini-high", "openrouter/auto", "openrouter/bodybuilder", "openrouter/free", "openrouter/owl-alpha", "openrouter/pareto-code", "perceptron/perceptron-mk1", "perplexity/sonar", "perplexity/sonar-deep-research", "perplexity/sonar-pro", "perplexity/sonar-pro-search", "perplexity/sonar-reasoning-pro", "poolside/laguna-m.1:free", "poolside/laguna-xs.2:free", "prime-intellect/intellect-3", "qwen/qwen-2.5-72b-instruct", "qwen/qwen-2.5-7b-instruct", "qwen/qwen-2.5-coder-32b-instruct", "qwen/qwen-plus", "qwen/qwen-plus-2025-07-28", "qwen/qwen-plus-2025-07-28:thinking", "qwen/qwen2.5-vl-72b-instruct", "qwen/qwen3-14b", "qwen/qwen3-235b-a22b", "qwen/qwen3-235b-a22b-2507", "qwen/qwen3-235b-a22b-thinking-2507", "qwen/qwen3-30b-a3b", "qwen/qwen3-30b-a3b-instruct-2507", "qwen/qwen3-30b-a3b-thinking-2507", "qwen/qwen3-32b", "qwen/qwen3-8b", "qwen/qwen3-coder", "qwen/qwen3-coder-30b-a3b-instruct", "qwen/qwen3-coder-flash", "qwen/qwen3-coder-next", "qwen/qwen3-coder-plus", "qwen/qwen3-max", "qwen/qwen3-max-thinking", "qwen/qwen3-next-80b-a3b-instruct", "qwen/qwen3-next-80b-a3b-thinking", "qwen/qwen3-vl-235b-a22b-instruct", "qwen/qwen3-vl-235b-a22b-thinking", "qwen/qwen3-vl-30b-a3b-instruct", "qwen/qwen3-vl-30b-a3b-thinking", "qwen/qwen3-vl-32b-instruct", "qwen/qwen3-vl-8b-instruct", "qwen/qwen3-vl-8b-thinking", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-27b", "qwen/qwen3.5-35b-a3b", "qwen/qwen3.5-397b-a17b", "qwen/qwen3.5-9b", "qwen/qwen3.5-flash-02-23", "qwen/qwen3.5-plus-02-15", "qwen/qwen3.5-plus-20260420", "qwen/qwen3.6-27b", "qwen/qwen3.6-35b-a3b", "qwen/qwen3.6-flash", "qwen/qwen3.6-max-preview", "qwen/qwen3.6-plus", "rekaai/reka-edge", "rekaai/reka-flash-3", "relace/relace-apply-3", "relace/relace-search", "sao10k/l3-euryale-70b", "sao10k/l3-lunaris-8b", "sao10k/l3.1-70b-hanami-x1", "sao10k/l3.1-euryale-70b", "sao10k/l3.3-euryale-70b", "stepfun/step-3.5-flash", "stepfun/step-3.5-flash:free", "switchpoint/router", "tencent/hunyuan-a13b-instruct", "tencent/hy3-preview", "thedrummer/cydonia-24b-v4.1", "thedrummer/rocinante-12b", "thedrummer/skyfall-36b-v2", "thedrummer/unslopnemo-12b", "undi95/remm-slerp-l2-13b", "upstage/solar-pro-3", "writer/palmyra-x5", "x-ai/grok-4.20", "x-ai/grok-4.20-multi-agent", "x-ai/grok-4.3", "x-ai/grok-code-fast-1:optimized:free", "xiaomi/mimo-v2-flash", "xiaomi/mimo-v2-omni", "xiaomi/mimo-v2-pro", "xiaomi/mimo-v2.5", "xiaomi/mimo-v2.5-pro", "z-ai/glm-4-32b", "z-ai/glm-4.5", "z-ai/glm-4.5-air", "z-ai/glm-4.5v", "z-ai/glm-4.6", "z-ai/glm-4.6v", "z-ai/glm-4.7", "z-ai/glm-4.7-flash", "z-ai/glm-5", "z-ai/glm-5-turbo", "z-ai/glm-5.1", "z-ai/glm-5v-turbo", "~anthropic/claude-haiku-latest", "~anthropic/claude-opus-latest", "~anthropic/claude-sonnet-latest", "~google/gemini-flash-latest", "~google/gemini-pro-latest", "~moonshotai/kimi-latest", "~openai/gpt-latest", "~openai/gpt-mini-latest" ], "cloudflare-workers-ai": [ "@cf/aisingapore/gemma-sea-lion-v4-27b-it", "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", "@cf/google/gemma-3-12b-it", "@cf/google/gemma-4-26b-a4b-it", "@cf/ibm-granite/granite-4.0-h-micro", "@cf/meta/llama-2-7b-chat-fp16", "@cf/meta/llama-3-8b-instruct", "@cf/meta/llama-3-8b-instruct-awq", "@cf/meta/llama-3.1-8b-instruct-awq", "@cf/meta/llama-3.1-8b-instruct-fp8", "@cf/meta/llama-3.2-11b-vision-instruct", "@cf/meta/llama-3.2-1b-instruct", "@cf/meta/llama-3.2-3b-instruct", "@cf/meta/llama-3.3-70b-instruct-fp8-fast", "@cf/meta/llama-4-scout-17b-16e-instruct", "@cf/meta/llama-guard-3-8b", "@cf/mistral/mistral-7b-instruct-v0.1", "@cf/mistralai/mistral-small-3.1-24b-instruct", "@cf/moonshotai/kimi-k2.5", "@cf/moonshotai/kimi-k2.6", "@cf/nvidia/nemotron-3-120b-a12b", "@cf/openai/gpt-oss-120b", "@cf/openai/gpt-oss-20b", "@cf/qwen/qwen2.5-coder-32b-instruct", "@cf/qwen/qwen3-30b-a3b-fp8", "@cf/qwen/qwq-32b", "@cf/zai-org/glm-4.7-flash" ], lmstudio: ["openai/gpt-oss-20b", "qwen/qwen3-30b-a3b-2507", "qwen/qwen3-coder-30b"], "xiaomi-token-plan-cn": [ "mimo-v2-flash", "mimo-v2-omni", "mimo-v2-pro", "mimo-v2-tts", "mimo-v2.5", "mimo-v2.5-pro" ], morph: ["auto", "morph-v3-fast", "morph-v3-large"], nearai: [ "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-Embedding-0.6B", "Qwen/Qwen3-Reranker-0.6B", "Qwen/Qwen3-VL-30B-A3B-Instruct", "Qwen/Qwen3.5-122B-A10B", "anthropic/claude-haiku-4-5", "anthropic/claude-opus-4-6", "anthropic/claude-opus-4-7", "anthropic/claude-sonnet-4-5", "anthropic/claude-sonnet-4-6", "black-forest-labs/FLUX.2-klein-4B", "google/gemini-2.5-flash", "google/gemini-2.5-flash-lite", "google/gemini-2.5-pro", "google/gemini-3.1-flash-lite", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-5", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5.1", "openai/gpt-5.2", "openai/gpt-5.4", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.5", "openai/gpt-oss-120b", "openai/o3", "openai/o3-mini", "openai/o4-mini", "openai/whisper-large-v3", "zai-org/GLM-5.1-FP8" ], abacus: [ "Qwen/QwQ-32B", "Qwen/Qwen2.5-72B-Instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-32B", "Qwen/qwen3-coder-480b-a35b-instruct", "claude-3-7-sonnet-20250219", "claude-haiku-4-5-20251001", "claude-opus-4-1-20250805", "claude-opus-4-20250514", "claude-opus-4-5-20251101", "claude-opus-4-6", "claude-sonnet-4-20250514", "claude-sonnet-4-5-20250929", "claude-sonnet-4-6", "deepseek-ai/DeepSeek-R1", "deepseek-ai/DeepSeek-V3.1-Terminus", "deepseek-ai/DeepSeek-V3.2", "deepseek/deepseek-v3.1", "gemini-2.5-flash", "gemini-2.5-pro", "gemini-3-flash-preview", "gemini-3.1-flash-lite-preview", "gemini-3.1-pro-preview", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o-2024-11-20", "gpt-4o-mini", "gpt-5", "gpt-5-codex", "gpt-5-mini", "gpt-5-nano", "gpt-5.1", "gpt-5.1-chat-latest", "gpt-5.1-codex", "gpt-5.1-codex-max", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.2-codex", "gpt-5.3-chat-latest", "gpt-5.3-codex", "gpt-5.3-codex-xhigh", "gpt-5.4", "grok-4-0709", "grok-4-1-fast-non-reasoning", "grok-4-fast-non-reasoning", "grok-code-fast-1", "kimi-k2-turbo-preview", "kimi-k2.5", "llama-3.3-70b-versatile", "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", "meta-llama/Meta-Llama-3.1-8B-Instruct", "o3", "o3-mini", "o3-pro", "o4-mini", "openai/gpt-oss-120b", "qwen-2.5-coder-32b", "qwen3-max", "route-llm", "zai-org/glm-4.5", "zai-org/glm-4.6", "zai-org/glm-4.7", "zai-org/glm-5" ], "privatemode-ai": ["gemma-3-27b", "gpt-oss-120b", "qwen3-coder-30b-a3b", "qwen3-embedding-4b", "whisper-large-v3"], "minimax-cn-coding-plan": [ "MiniMax-M2", "MiniMax-M2.1", "MiniMax-M2.5", "MiniMax-M2.5-highspeed", "MiniMax-M2.7", "MiniMax-M2.7-highspeed" ], "xiaomi-token-plan-ams": [ "mimo-v2-flash", "mimo-v2-omni", "mimo-v2-pro", "mimo-v2-tts", "mimo-v2.5", "mimo-v2.5-pro" ], "cloudferro-sherlock": [ "MiniMaxAI/MiniMax-M2.5", "meta-llama/Llama-3.3-70B-Instruct", "openai/gpt-oss-120b", "speakleash/Bielik-11B-v2.6-Instruct", "speakleash/Bielik-11B-v3.0-Instruct" ], openai: [ "chatgpt-image-latest", "gpt-3.5-turbo", "gpt-4", "gpt-4-turbo", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-4o-2024-05-13", "gpt-4o-2024-08-06", "gpt-4o-2024-11-20", "gpt-4o-mini", "gpt-5", "gpt-5-chat-latest", "gpt-5-codex", "gpt-5-mini", "gpt-5-nano", "gpt-5-pro", "gpt-5.1", "gpt-5.1-chat-latest", "gpt-5.1-codex", "gpt-5.1-codex-max", "gpt-5.1-codex-mini", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.2-codex", "gpt-5.2-pro", "gpt-5.3-chat-latest", "gpt-5.3-codex", "gpt-5.3-codex-spark", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano", "gpt-5.4-pro", "gpt-5.5", "gpt-5.5-pro", "gpt-image-1", "gpt-image-1-mini", "gpt-image-1.5", "o1", "o1-mini", "o1-preview", "o1-pro", "o3", "o3-deep-research", "o3-mini", "o3-pro", "o4-mini", "o4-mini-deep-research", "text-embedding-3-large", "text-embedding-3-small", "text-embedding-ada-002" ], dinference: ["glm-4.7", "glm-5", "glm-5.1", "gpt-oss-120b", "minimax-m2.5"], vivgrid: [ "deepseek-v3.2", "deepseek-v4-pro", "gemini-3.1-flash-lite-preview", "gemini-3.1-pro-preview", "gpt-5-mini", "gpt-5.1-codex", "gpt-5.1-codex-max", "gpt-5.2-codex", "gpt-5.3-codex", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano", "gpt-5.5" ], cerebras: ["gpt-oss-120b", "llama3.1-8b", "qwen-3-235b-a22b-instruct-2507", "zai-glm-4.7"], vultr: ["DeepSeek-V3.2", "GLM-5-FP8", "Kimi-K2.5", "MiniMax-M2.5", "gpt-oss-120b"], "kuae-cloud-coding-plan": ["GLM-4.7"], modelscope: [ "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-30B-A3B-Thinking-2507", "Qwen/Qwen3-Coder-30B-A3B-Instruct", "ZhipuAI/GLM-4.5", "ZhipuAI/GLM-4.6" ], "kimi-for-coding": ["k2p5", "k2p6", "kimi-k2-thinking"], lucidquery: ["lucidnova-rf1-100b", "lucidquery-nexus-coder"], neuralwatt: [ "MiniMaxAI/MiniMax-M2.5", "Qwen/Qwen3.5-397B-A17B-FP8", "Qwen/Qwen3.6-35B-A3B", "glm-5-fast", "glm-5.1-fast", "kimi-k2.5-fast", "kimi-k2.6-fast", "mistralai/Devstral-Small-2-24B-Instruct-2512", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "openai/gpt-oss-20b", "qwen3.5-397b-fast", "qwen3.6-35b-fast", "zai-org/GLM-5.1-FP8" ], jiekou: [ "baidu/ernie-4.5-300b-a47b-paddle", "baidu/ernie-4.5-vl-424b-a47b", "claude-haiku-4-5-20251001", "claude-opus-4-1-20250805", "claude-opus-4-20250514", "claude-opus-4-5-20251101", "claude-opus-4-6", "claude-sonnet-4-20250514", "claude-sonnet-4-5-20250929", "deepseek/deepseek-r1-0528", "deepseek/deepseek-v3-0324", "deepseek/deepseek-v3.1", "gemini-2.5-flash", "gemini-2.5-flash-lite", "gemini-2.5-flash-lite-preview-06-17", "gemini-2.5-flash-lite-preview-09-2025", "gemini-2.5-flash-preview-05-20", "gemini-2.5-pro", "gemini-2.5-pro-preview-06-05", "gemini-3-flash-preview", "gemini-3-pro-preview", "gpt-5-chat-latest", "gpt-5-codex", "gpt-5-mini", "gpt-5-nano", "gpt-5-pro", "gpt-5.1", "gpt-5.1-codex", "gpt-5.1-codex-max", "gpt-5.1-codex-mini", "gpt-5.2", "gpt-5.2-codex", "gpt-5.2-pro", "grok-4-0709", "grok-4-1-fast-non-reasoning", "grok-4-1-fast-reasoning", "grok-4-fast-non-reasoning", "grok-4-fast-reasoning", "grok-code-fast-1", "minimax/minimax-m2.1", "minimaxai/minimax-m1-80k", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-instruct", "moonshotai/kimi-k2.5", "o3", "o3-mini", "o4-mini", "qwen/qwen3-235b-a22b-fp8", "qwen/qwen3-235b-a22b-instruct-2507", "qwen/qwen3-235b-a22b-thinking-2507", "qwen/qwen3-30b-a3b-fp8", "qwen/qwen3-32b-fp8", "qwen/qwen3-coder-480b-a35b-instruct", "qwen/qwen3-coder-next", "qwen/qwen3-next-80b-a3b-instruct", "qwen/qwen3-next-80b-a3b-thinking", "xiaomimimo/mimo-v2-flash", "zai-org/glm-4.5", "zai-org/glm-4.5v", "zai-org/glm-4.7", "zai-org/glm-4.7-flash" ], ovhcloud: [ "gpt-oss-120b", "gpt-oss-20b", "llama-3.1-8b-instruct", "meta-llama-3_3-70b-instruct", "mistral-7b-instruct-v0.3", "mistral-nemo-instruct-2407", "mistral-small-3.2-24b-instruct-2506", "qwen2.5-vl-72b-instruct", "qwen3-32b", "qwen3-coder-30b-a3b-instruct", "qwen3.5-9b" ], friendli: [ "MiniMaxAI/MiniMax-M2.5", "Qwen/Qwen3-235B-A22B-Instruct-2507", "meta-llama/Llama-3.1-8B-Instruct", "meta-llama/Llama-3.3-70B-Instruct", "zai-org/GLM-5", "zai-org/GLM-5.1" ], openrouter: [ "ai21/jamba-large-1.7", "aion-labs/aion-1.0", "aion-labs/aion-1.0-mini", "aion-labs/aion-2.0", "aion-labs/aion-rp-llama-3.1-8b", "alfredpros/codellama-7b-instruct-solidity", "alibaba/tongyi-deepresearch-30b-a3b", "allenai/olmo-3-32b-think", "amazon/nova-2-lite-v1", "amazon/nova-lite-v1", "amazon/nova-micro-v1", "amazon/nova-premier-v1", "amazon/nova-pro-v1", "anthracite-org/magnum-v4-72b", "anthropic/claude-3-haiku", "anthropic/claude-3.5-haiku", "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.6-fast", "anthropic/claude-opus-4.7", "anthropic/claude-opus-4.7-fast", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "arcee-ai/coder-large", "arcee-ai/maestro-reasoning", "arcee-ai/spotlight", "arcee-ai/trinity-large-thinking", "arcee-ai/trinity-large-thinking:free", "arcee-ai/trinity-mini", "arcee-ai/virtuoso-large", "baidu/cobuddy:free", "baidu/ernie-4.5-21b-a3b", "baidu/ernie-4.5-21b-a3b-thinking", "baidu/ernie-4.5-300b-a47b", "baidu/ernie-4.5-vl-28b-a3b", "baidu/ernie-4.5-vl-424b-a47b", "baidu/qianfan-ocr-fast", "bytedance-seed/seed-1.6", "bytedance-seed/seed-1.6-flash", "bytedance-seed/seed-2.0-lite", "bytedance-seed/seed-2.0-mini", "bytedance/ui-tars-1.5-7b", "cognitivecomputations/dolphin-mistral-24b-venice-edition:free", "cohere/command-a", "cohere/command-r-08-2024", "cohere/command-r-plus-08-2024", "cohere/command-r7b-12-2024", "deepcogito/cogito-v2.1-671b", "deepseek/deepseek-chat", "deepseek/deepseek-chat-v3-0324", "deepseek/deepseek-chat-v3.1", "deepseek/deepseek-r1", "deepseek/deepseek-r1-0528", "deepseek/deepseek-r1-distill-llama-70b", "deepseek/deepseek-r1-distill-qwen-32b", "deepseek/deepseek-v3.1-terminus", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v3.2-speciale", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-flash:free", "deepseek/deepseek-v4-pro", "essentialai/rnj-1-instruct", "google/gemini-2.0-flash-001", "google/gemini-2.0-flash-lite-001", "google/gemini-2.5-flash", "google/gemini-2.5-flash-image", "google/gemini-2.5-flash-lite", "google/gemini-2.5-flash-lite-preview-09-2025", "google/gemini-2.5-pro", "google/gemini-2.5-pro-preview", "google/gemini-2.5-pro-preview-05-06", "google/gemini-3-flash-preview", "google/gemini-3-pro-image-preview", "google/gemini-3.1-flash-image-preview", "google/gemini-3.1-flash-lite", "google/gemini-3.1-flash-lite-preview", "google/gemini-3.1-pro-preview", "google/gemini-3.1-pro-preview-customtools", "google/gemini-3.5-flash", "google/gemma-2-27b-it", "google/gemma-3-12b-it", "google/gemma-3-27b-it", "google/gemma-3-4b-it", "google/gemma-3n-e4b-it", "google/gemma-4-26b-a4b-it", "google/gemma-4-26b-a4b-it:free", "google/gemma-4-31b-it", "google/gemma-4-31b-it:free", "google/lyria-3-clip-preview", "google/lyria-3-pro-preview", "gryphe/mythomax-l2-13b", "ibm-granite/granite-4.0-h-micro", "ibm-granite/granite-4.1-8b", "inception/mercury-2", "inclusionai/ling-2.6-1t", "inclusionai/ling-2.6-flash", "inclusionai/ring-2.6-1t", "inflection/inflection-3-pi", "inflection/inflection-3-productivity", "kwaipilot/kat-coder-pro-v2", "liquid/lfm-2-24b-a2b", "liquid/lfm-2.5-1.2b-instruct:free", "liquid/lfm-2.5-1.2b-thinking:free", "mancer/weaver", "meta-llama/llama-3-70b-instruct", "meta-llama/llama-3-8b-instruct", "meta-llama/llama-3.1-70b-instruct", "meta-llama/llama-3.1-8b-instruct", "meta-llama/llama-3.2-11b-vision-instruct", "meta-llama/llama-3.2-1b-instruct", "meta-llama/llama-3.2-3b-instruct", "meta-llama/llama-3.2-3b-instruct:free", "meta-llama/llama-3.3-70b-instruct", "meta-llama/llama-3.3-70b-instruct:free", "meta-llama/llama-4-maverick", "meta-llama/llama-4-scout", "meta-llama/llama-guard-3-8b", "meta-llama/llama-guard-4-12b", "microsoft/phi-4", "microsoft/phi-4-mini-instruct", "microsoft/wizardlm-2-8x22b", "minimax/minimax-01", "minimax/minimax-m1", "minimax/minimax-m2", "minimax/minimax-m2-her", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.5:free", "minimax/minimax-m2.7", "mistralai/codestral-2508", "mistralai/devstral-2512", "mistralai/devstral-medium", "mistralai/devstral-small", "mistralai/ministral-14b-2512", "mistralai/ministral-3b-2512", "mistralai/ministral-8b-2512", "mistralai/mistral-7b-instruct-v0.1", "mistralai/mistral-large", "mistralai/mistral-large-2407", "mistralai/mistral-large-2411", "mistralai/mistral-large-2512", "mistralai/mistral-medium-3", "mistralai/mistral-medium-3-5", "mistralai/mistral-medium-3.1", "mistralai/mistral-nemo", "mistralai/mistral-saba", "mistralai/mistral-small-24b-instruct-2501", "mistralai/mistral-small-2603", "mistralai/mistral-small-3.1-24b-instruct", "mistralai/mistral-small-3.2-24b-instruct", "mistralai/mixtral-8x22b-instruct", "mistralai/pixtral-large-2411", "mistralai/voxtral-small-24b-2507", "moonshotai/kimi-k2", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.6", "morph/morph-v3-fast", "morph/morph-v3-large", "nex-agi/deepseek-v3.1-nex-n1", "nousresearch/hermes-2-pro-llama-3-8b", "nousresearch/hermes-3-llama-3.1-405b", "nousresearch/hermes-3-llama-3.1-405b:free", "nousresearch/hermes-3-llama-3.1-70b", "nousresearch/hermes-4-405b", "nousresearch/hermes-4-70b", "nvidia/llama-3.3-nemotron-super-49b-v1.5", "nvidia/nemotron-3-nano-30b-a3b", "nvidia/nemotron-3-nano-30b-a3b:free", "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", "nvidia/nemotron-3-super-120b-a12b", "nvidia/nemotron-3-super-120b-a12b:free", "nvidia/nemotron-nano-12b-v2-vl:free", "nvidia/nemotron-nano-9b-v2", "nvidia/nemotron-nano-9b-v2:free", "openai/gpt-3.5-turbo", "openai/gpt-3.5-turbo-0613", "openai/gpt-3.5-turbo-16k", "openai/gpt-3.5-turbo-instruct", "openai/gpt-4", "openai/gpt-4-0314", "openai/gpt-4-1106-preview", "openai/gpt-4-turbo", "openai/gpt-4-turbo-preview", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-2024-05-13", "openai/gpt-4o-2024-08-06", "openai/gpt-4o-2024-11-20", "openai/gpt-4o-audio-preview", "openai/gpt-4o-mini", "openai/gpt-4o-mini-2024-07-18", "openai/gpt-4o-mini-search-preview", "openai/gpt-4o-search-preview", "openai/gpt-5", "openai/gpt-5-chat", "openai/gpt-5-codex", "openai/gpt-5-image", "openai/gpt-5-image-mini", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-chat", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-chat", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-chat", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-image-2", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "openai/gpt-audio", "openai/gpt-audio-mini", "openai/gpt-chat-latest", "openai/gpt-oss-120b", "openai/gpt-oss-120b:free", "openai/gpt-oss-20b", "openai/gpt-oss-20b:free", "openai/gpt-oss-safeguard-20b", "openai/o1", "openai/o1-pro", "openai/o3", "openai/o3-deep-research", "openai/o3-mini", "openai/o3-mini-high", "openai/o3-pro", "openai/o4-mini", "openai/o4-mini-deep-research", "openai/o4-mini-high", "openrouter/auto", "openrouter/bodybuilder", "openrouter/free", "openrouter/owl-alpha", "openrouter/pareto-code", "perceptron/perceptron-mk1", "perplexity/sonar", "perplexity/sonar-deep-research", "perplexity/sonar-pro", "perplexity/sonar-pro-search", "perplexity/sonar-reasoning-pro", "poolside/laguna-m.1:free", "poolside/laguna-xs.2:free", "prime-intellect/intellect-3", "qwen/qwen-2.5-72b-instruct", "qwen/qwen-2.5-7b-instruct", "qwen/qwen-2.5-coder-32b-instruct", "qwen/qwen-plus", "qwen/qwen-plus-2025-07-28", "qwen/qwen-plus-2025-07-28:thinking", "qwen/qwen2.5-vl-72b-instruct", "qwen/qwen3-14b", "qwen/qwen3-235b-a22b", "qwen/qwen3-235b-a22b-2507", "qwen/qwen3-235b-a22b-thinking-2507", "qwen/qwen3-30b-a3b", "qwen/qwen3-30b-a3b-instruct-2507", "qwen/qwen3-30b-a3b-thinking-2507", "qwen/qwen3-32b", "qwen/qwen3-8b", "qwen/qwen3-coder", "qwen/qwen3-coder-30b-a3b-instruct", "qwen/qwen3-coder-flash", "qwen/qwen3-coder-next", "qwen/qwen3-coder-plus", "qwen/qwen3-coder:free", "qwen/qwen3-max", "qwen/qwen3-max-thinking", "qwen/qwen3-next-80b-a3b-instruct", "qwen/qwen3-next-80b-a3b-instruct:free", "qwen/qwen3-next-80b-a3b-thinking", "qwen/qwen3-vl-235b-a22b-instruct", "qwen/qwen3-vl-235b-a22b-thinking", "qwen/qwen3-vl-30b-a3b-instruct", "qwen/qwen3-vl-30b-a3b-thinking", "qwen/qwen3-vl-32b-instruct", "qwen/qwen3-vl-8b-instruct", "qwen/qwen3-vl-8b-thinking", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-27b", "qwen/qwen3.5-35b-a3b", "qwen/qwen3.5-397b-a17b", "qwen/qwen3.5-9b", "qwen/qwen3.5-flash-02-23", "qwen/qwen3.5-plus-02-15", "qwen/qwen3.5-plus-20260420", "qwen/qwen3.6-27b", "qwen/qwen3.6-35b-a3b", "qwen/qwen3.6-flash", "qwen/qwen3.6-max-preview", "qwen/qwen3.6-plus", "qwen/qwen3.7-max", "rekaai/reka-edge", "rekaai/reka-flash-3", "relace/relace-apply-3", "relace/relace-search", "sao10k/l3-euryale-70b", "sao10k/l3-lunaris-8b", "sao10k/l3.1-70b-hanami-x1", "sao10k/l3.1-euryale-70b", "sao10k/l3.3-euryale-70b", "stepfun/step-3.5-flash", "switchpoint/router", "tencent/hunyuan-a13b-instruct", "tencent/hy3-preview", "thedrummer/cydonia-24b-v4.1", "thedrummer/rocinante-12b", "thedrummer/skyfall-36b-v2", "thedrummer/unslopnemo-12b", "undi95/remm-slerp-l2-13b", "upstage/solar-pro-3", "writer/palmyra-x5", "x-ai/grok-4.20", "x-ai/grok-4.20-multi-agent", "x-ai/grok-4.3", "x-ai/grok-build-0.1", "xiaomi/mimo-v2-flash", "xiaomi/mimo-v2-omni", "xiaomi/mimo-v2-pro", "xiaomi/mimo-v2.5", "xiaomi/mimo-v2.5-pro", "z-ai/glm-4-32b", "z-ai/glm-4.5", "z-ai/glm-4.5-air", "z-ai/glm-4.5-air:free", "z-ai/glm-4.5v", "z-ai/glm-4.6", "z-ai/glm-4.6v", "z-ai/glm-4.7", "z-ai/glm-4.7-flash", "z-ai/glm-5", "z-ai/glm-5-turbo", "z-ai/glm-5.1", "z-ai/glm-5v-turbo", "~anthropic/claude-haiku-latest", "~anthropic/claude-opus-latest", "~anthropic/claude-sonnet-latest", "~google/gemini-flash-latest", "~google/gemini-pro-latest", "~moonshotai/kimi-latest", "~openai/gpt-latest", "~openai/gpt-mini-latest" ], "regolo-ai": [ "gpt-oss-120b", "gpt-oss-20b", "llama-3.1-8b-instruct", "llama-3.3-70b-instruct", "minimax-m2.5", "mistral-small-4-119b", "mistral-small3.2", "qwen-image", "qwen3-coder-next", "qwen3-embedding-8b", "qwen3-reranker-4b", "qwen3.5-122b", "qwen3.5-9b" ], claudinio: ["claudinio"], orcarouter: [ "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "deepseek/deepseek-chat", "deepseek/deepseek-reasoner", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-pro", "google/gemini-2.5-flash", "google/gemini-2.5-flash-lite", "google/gemini-2.5-pro", "google/gemini-3-flash-preview", "google/gemini-3-pro-preview", "google/gemini-3.1-flash-lite-preview", "google/gemini-3.1-pro-preview", "google/gemini-3.1-pro-preview-customtools", "google/gemini-flash-latest", "google/gemini-flash-lite-latest", "google/gemma-4-26b-a4b-it", "google/gemma-4-31b-it", "grok/grok-4.3", "kimi/kimi-k2.5", "kimi/kimi-k2.6", "minimax/minimax-m2.5", "minimax/minimax-m2.5-highspeed", "minimax/minimax-m2.7", "minimax/minimax-m2.7-highspeed", "openai/gpt-3.5-turbo", "openai/gpt-4", "openai/gpt-4-turbo", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-2024-05-13", "openai/gpt-4o-2024-08-06", "openai/gpt-4o-2024-11-20", "openai/gpt-4o-mini", "openai/gpt-5", "openai/gpt-5-chat-latest", "openai/gpt-5-codex", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-chat-latest", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-chat-latest", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-chat-latest", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "orcarouter/auto", "qwen/qwen3-max", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-27b", "qwen/qwen3.5-35b-a3b", "qwen/qwen3.5-397b-a17b", "qwen/qwen3.5-plus", "qwen/qwen3.6-35b-a3b", "qwen/qwen3.6-plus", "z-ai/glm-4.5", "z-ai/glm-4.5-air", "z-ai/glm-4.6", "z-ai/glm-4.7", "z-ai/glm-5", "z-ai/glm-5.1" ], "opencode-go": [ "deepseek-v4-flash", "deepseek-v4-pro", "glm-5", "glm-5.1", "kimi-k2.5", "kimi-k2.6", "mimo-v2.5", "mimo-v2.5-pro", "minimax-m2.5", "minimax-m2.7", "qwen3.5-plus", "qwen3.6-plus" ], llmgateway: [ "auto", "claude-3-5-sonnet-20241022", "claude-3-7-sonnet", "claude-3-7-sonnet-20250219", "claude-3-opus", "claude-haiku-4-5", "claude-haiku-4-5-20251001", "claude-opus-4-1-20250805", "claude-opus-4-20250514", "claude-opus-4-5-20251101", "claude-opus-4-6", "claude-opus-4-7", "claude-sonnet-4-20250514", "claude-sonnet-4-5", "claude-sonnet-4-5-20250929", "claude-sonnet-4-6", "codestral-2508", "custom", "deepseek-r1-0528", "deepseek-v3.1", "deepseek-v3.2", "deepseek-v4-flash", "deepseek-v4-pro", "devstral-2512", "devstral-small-2507", "gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-2.5-flash", "gemini-2.5-flash-lite", "gemini-2.5-pro", "gemini-3-flash-preview", "gemini-3.1-flash-lite", "gemini-3.1-flash-lite-preview", "gemini-3.1-pro-preview", "gemini-3.5-flash", "gemini-pro-latest", "gemma-2-27b-it-together", "gemma-3-1b-it", "gemma-3-27b", "glm-4-32b-0414-128k", "glm-4.5", "glm-4.5-air", "glm-4.5-airx", "glm-4.5-flash", "glm-4.5-x", "glm-4.5v", "glm-4.6", "glm-4.6v", "glm-4.6v-flash", "glm-4.6v-flashx", "glm-4.7", "glm-4.7-flash", "glm-4.7-flashx", "glm-5", "glm-5.1", "gpt-3.5-turbo", "gpt-4", "gpt-4-turbo", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-4o-mini", "gpt-4o-mini-search-preview", "gpt-4o-search-preview", "gpt-5", "gpt-5-chat-latest", "gpt-5-mini", "gpt-5-nano", "gpt-5-pro", "gpt-5.1", "gpt-5.1-codex", "gpt-5.1-codex-mini", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.2-codex", "gpt-5.2-pro", "gpt-5.3-chat-latest", "gpt-5.3-codex", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano", "gpt-5.4-pro", "gpt-5.5", "gpt-5.5-pro", "gpt-oss-120b", "gpt-oss-20b", "grok-4-0709", "grok-4-1-fast-reasoning", "grok-4-20-beta-0309-non-reasoning", "grok-4-20-beta-0309-reasoning", "grok-4-20-non-reasoning", "grok-4-20-reasoning", "grok-4-3", "grok-4-fast-reasoning", "hermes-2-pro-llama-3-8b", "kimi-k2", "kimi-k2-thinking", "kimi-k2-thinking-turbo", "kimi-k2.5", "kimi-k2.6", "llama-3-70b-instruct", "llama-3-8b-instruct", "llama-3.1-70b-instruct", "llama-3.1-8b-instruct", "llama-3.1-nemotron-ultra-253b", "llama-3.2-11b-instruct", "llama-3.2-3b-instruct", "llama-3.3-70b-instruct", "llama-4-maverick-17b-instruct", "llama-4-scout", "llama-4-scout-17b-instruct", "mimo-v2-flash", "mimo-v2-omni", "mimo-v2-pro", "mimo-v2.5", "mimo-v2.5-pro", "minimax-m2", "minimax-m2.1", "minimax-m2.1-lightning", "minimax-m2.5", "minimax-m2.5-highspeed", "minimax-m2.7", "minimax-m2.7-highspeed", "minimax-text-01", "ministral-14b-2512", "ministral-3b-2512", "ministral-8b-2512", "mistral-large-2512", "mistral-large-latest", "mistral-small-2506", "o1", "o3", "o3-mini", "o4-mini", "pixtral-large-latest", "qwen-coder-plus", "qwen-flash", "qwen-max", "qwen-max-latest", "qwen-omni-turbo", "qwen-plus", "qwen-plus-latest", "qwen-turbo", "qwen-vl-max", "qwen-vl-plus", "qwen2-5-vl-32b-instruct", "qwen2-5-vl-72b-instruct", "qwen25-coder-7b", "qwen3-235b-a22b-fp8", "qwen3-235b-a22b-instruct-2507", "qwen3-235b-a22b-thinking-2507", "qwen3-30b-a3b-fp8", "qwen3-30b-a3b-instruct-2507", "qwen3-30b-a3b-thinking-2507", "qwen3-32b", "qwen3-32b-fp8", "qwen3-4b-fp8", "qwen3-coder-30b-a3b-instruct", "qwen3-coder-480b-a35b-instruct", "qwen3-coder-flash", "qwen3-coder-next", "qwen3-coder-plus", "qwen3-max", "qwen3-max-2026-01-23", "qwen3-next-80b-a3b-instruct", "qwen3-next-80b-a3b-thinking", "qwen3-vl-235b-a22b-instruct", "qwen3-vl-235b-a22b-thinking", "qwen3-vl-30b-a3b-instruct", "qwen3-vl-30b-a3b-thinking", "qwen3-vl-8b-instruct", "qwen3-vl-flash", "qwen3-vl-plus", "qwen3.6-35b-a3b", "qwen3.6-max-preview", "qwen3.6-plus", "qwen35-397b-a17b", "qwen37-max", "qwq-plus", "seed-1-6-250615", "seed-1-6-250915", "seed-1-6-flash-250715", "seed-1-8-251228", "sonar", "sonar-pro", "sonar-reasoning-pro" ], poe: [ "anthropic/claude-haiku-3", "anthropic/claude-haiku-3.5", "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-3.7", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "cerebras/gpt-oss-120b-cs", "cerebras/llama-3.1-8b-cs", "elevenlabs/elevenlabs-music", "elevenlabs/elevenlabs-v2.5-turbo", "elevenlabs/elevenlabs-v3", "empiriolabs/deepseek-v4-flash-el", "empiriolabs/deepseek-v4-pro-el", "fireworks-ai/kimi-k2.5-fw", "google/gemini-2.0-flash", "google/gemini-2.0-flash-lite", "google/gemini-2.5-flash", "google/gemini-2.5-flash-lite", "google/gemini-2.5-pro", "google/gemini-3-flash", "google/gemini-3.1-flash-lite", "google/gemini-3.1-pro", "google/gemini-3.5-flash", "google/gemma-4-31b", "google/imagen-3", "google/imagen-3-fast", "google/imagen-4", "google/imagen-4-fast", "google/imagen-4-ultra", "google/lyria", "google/nano-banana", "google/nano-banana-pro", "google/veo-2", "google/veo-3", "google/veo-3-fast", "google/veo-3.1", "google/veo-3.1-fast", "ideogramai/ideogram", "ideogramai/ideogram-v2", "ideogramai/ideogram-v2a", "ideogramai/ideogram-v2a-turbo", "lumalabs/ray2", "novita/deepseek-v3.2", "novita/glm-4.6", "novita/glm-4.6v", "novita/glm-4.7-flash", "novita/glm-4.7-n", "novita/glm-5", "novita/kimi-k2-thinking", "novita/kimi-k2.5", "novita/kimi-k2.6", "novita/minimax-m2.1", "openai/dall-e-3", "openai/gpt-3.5-turbo", "openai/gpt-3.5-turbo-instruct", "openai/gpt-3.5-turbo-raw", "openai/gpt-4-turbo", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-aug", "openai/gpt-4o-mini", "openai/gpt-4o-mini-search", "openai/gpt-4o-search", "openai/gpt-5", "openai/gpt-5-chat", "openai/gpt-5-codex", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.1-instant", "openai/gpt-5.2", "openai/gpt-5.2-codex", "openai/gpt-5.2-instant", "openai/gpt-5.2-pro", "openai/gpt-5.3-codex", "openai/gpt-5.3-codex-spark", "openai/gpt-5.3-instant", "openai/gpt-5.4", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "openai/gpt-image-1", "openai/gpt-image-1-mini", "openai/gpt-image-1.5", "openai/gpt-image-2", "openai/o1", "openai/o1-pro", "openai/o3", "openai/o3-deep-research", "openai/o3-mini", "openai/o3-mini-high", "openai/o3-pro", "openai/o4-mini", "openai/o4-mini-deep-research", "openai/sora-2", "openai/sora-2-pro", "poetools/claude-code", "runwayml/runway", "runwayml/runway-gen-4-turbo", "stabilityai/stablediffusionxl", "topazlabs-co/topazlabs", "trytako/tako", "xai/grok-3", "xai/grok-3-mini", "xai/grok-4", "xai/grok-4-fast-non-reasoning", "xai/grok-4-fast-reasoning", "xai/grok-4.1-fast-non-reasoning", "xai/grok-4.1-fast-reasoning", "xai/grok-4.20-multi-agent", "xai/grok-code-fast-1" ], minimax: [ "MiniMax-M2", "MiniMax-M2.1", "MiniMax-M2.5", "MiniMax-M2.5-highspeed", "MiniMax-M2.7", "MiniMax-M2.7-highspeed" ], groq: [ "allam-2-7b", "canopylabs/orpheus-arabic-saudi", "canopylabs/orpheus-v1-english", "groq/compound", "groq/compound-mini", "llama-3.1-8b-instant", "llama-3.3-70b-versatile", "meta-llama/llama-4-scout-17b-16e-instruct", "meta-llama/llama-prompt-guard-2-22m", "meta-llama/llama-prompt-guard-2-86m", "moonshotai/kimi-k2-instruct-0905", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "openai/gpt-oss-safeguard-20b", "qwen/qwen3-32b", "whisper-large-v3", "whisper-large-v3-turbo" ], "xiaomi-token-plan-sgp": [ "mimo-v2-flash", "mimo-v2-omni", "mimo-v2-pro", "mimo-v2-tts", "mimo-v2.5", "mimo-v2.5-pro" ], siliconflow: [ "ByteDance-Seed/Seed-OSS-36B-Instruct", "MiniMaxAI/MiniMax-M2.1", "MiniMaxAI/MiniMax-M2.5", "Qwen/QwQ-32B", "Qwen/Qwen2.5-14B-Instruct", "Qwen/Qwen2.5-32B-Instruct", "Qwen/Qwen2.5-72B-Instruct", "Qwen/Qwen2.5-72B-Instruct-128K", "Qwen/Qwen2.5-7B-Instruct", "Qwen/Qwen2.5-Coder-32B-Instruct", "Qwen/Qwen2.5-VL-32B-Instruct", "Qwen/Qwen2.5-VL-72B-Instruct", "Qwen/Qwen2.5-VL-7B-Instruct", "Qwen/Qwen3-14B", "Qwen/Qwen3-235B-A22B", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-30B-A3B-Thinking-2507", "Qwen/Qwen3-32B", "Qwen/Qwen3-8B", "Qwen/Qwen3-Coder-30B-A3B-Instruct", "Qwen/Qwen3-Coder-480B-A35B-Instruct", "Qwen/Qwen3-Next-80B-A3B-Instruct", "Qwen/Qwen3-Next-80B-A3B-Thinking", "Qwen/Qwen3-Omni-30B-A3B-Captioner", "Qwen/Qwen3-Omni-30B-A3B-Instruct", "Qwen/Qwen3-Omni-30B-A3B-Thinking", "Qwen/Qwen3-VL-235B-A22B-Instruct", "Qwen/Qwen3-VL-235B-A22B-Thinking", "Qwen/Qwen3-VL-30B-A3B-Instruct", "Qwen/Qwen3-VL-30B-A3B-Thinking", "Qwen/Qwen3-VL-32B-Instruct", "Qwen/Qwen3-VL-32B-Thinking", "Qwen/Qwen3-VL-8B-Instruct", "Qwen/Qwen3-VL-8B-Thinking", "THUDM/GLM-4-32B-0414", "THUDM/GLM-4-9B-0414", "THUDM/GLM-Z1-32B-0414", "THUDM/GLM-Z1-9B-0414", "baidu/ERNIE-4.5-300B-A47B", "deepseek-ai/DeepSeek-R1", "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", "deepseek-ai/DeepSeek-V3", "deepseek-ai/DeepSeek-V3.1", "deepseek-ai/DeepSeek-V3.1-Terminus", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V3.2-Exp", "deepseek-ai/deepseek-v4-flash", "deepseek-ai/deepseek-v4-pro", "deepseek-ai/deepseek-vl2", "inclusionAI/Ling-flash-2.0", "inclusionAI/Ling-mini-2.0", "inclusionAI/Ring-flash-2.0", "meta-llama/Meta-Llama-3.1-8B-Instruct", "moonshotai/Kimi-K2-Instruct", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/Kimi-K2-Thinking", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "nex-agi/DeepSeek-V3.1-Nex-N1", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "stepfun-ai/Step-3.5-Flash", "tencent/Hunyuan-A13B-Instruct", "tencent/Hunyuan-MT-7B", "zai-org/GLM-4.5", "zai-org/GLM-4.5-Air", "zai-org/GLM-4.5V", "zai-org/GLM-4.6", "zai-org/GLM-4.6V", "zai-org/GLM-4.7", "zai-org/GLM-5", "zai-org/GLM-5.1", "zai-org/GLM-5V-Turbo" ], "ollama-cloud": [ "cogito-2.1:671b", "deepseek-v3.1:671b", "deepseek-v3.2", "deepseek-v4-flash", "deepseek-v4-pro", "devstral-2:123b", "devstral-small-2:24b", "gemini-3-flash-preview", "gemma3:12b", "gemma3:27b", "gemma3:4b", "gemma4:31b", "glm-4.6", "glm-4.7", "glm-5", "glm-5.1", "gpt-oss:120b", "gpt-oss:20b", "kimi-k2-thinking", "kimi-k2.5", "kimi-k2.6", "kimi-k2:1t", "minimax-m2", "minimax-m2.1", "minimax-m2.5", "minimax-m2.7", "ministral-3:14b", "ministral-3:3b", "ministral-3:8b", "mistral-large-3:675b", "nemotron-3-nano:30b", "nemotron-3-super", "qwen3-coder-next", "qwen3-coder:480b", "qwen3-next:80b", "qwen3-vl:235b", "qwen3-vl:235b-instruct", "qwen3.5:397b", "rnj-1:8b" ], databricks: [ "databricks-claude-haiku-4-5", "databricks-claude-opus-4-1", "databricks-claude-opus-4-5", "databricks-claude-opus-4-6", "databricks-claude-opus-4-7", "databricks-claude-sonnet-4", "databricks-claude-sonnet-4-5", "databricks-claude-sonnet-4-6", "databricks-gemini-2-5-flash", "databricks-gemini-2-5-pro", "databricks-gemini-3-1-flash-lite", "databricks-gemini-3-1-pro", "databricks-gemini-3-flash", "databricks-gemini-3-pro", "databricks-gpt-5", "databricks-gpt-5-1", "databricks-gpt-5-2", "databricks-gpt-5-4", "databricks-gpt-5-4-mini", "databricks-gpt-5-4-nano", "databricks-gpt-5-5", "databricks-gpt-5-mini", "databricks-gpt-5-nano", "databricks-gpt-oss-120b", "databricks-gpt-oss-20b" ], berget: [ "google/gemma-4-31B-it", "meta-llama/Llama-3.3-70B-Instruct", "mistralai/Mistral-Medium-3.5-128B", "mistralai/Mistral-Small-3.2-24B-Instruct-2506", "moonshotai/Kimi-K2.6", "openai/gpt-oss-120b", "zai-org/GLM-4.7" ], "moonshotai-cn": [ "kimi-k2-0711-preview", "kimi-k2-0905-preview", "kimi-k2-thinking", "kimi-k2-thinking-turbo", "kimi-k2-turbo-preview", "kimi-k2.5", "kimi-k2.6" ], "alibaba-coding-plan-cn": [ "MiniMax-M2.5", "glm-4.7", "glm-5", "kimi-k2.5", "qwen3-coder-next", "qwen3-coder-plus", "qwen3-max-2026-01-23", "qwen3.5-plus", "qwen3.6-plus" ], "minimax-cn": [ "MiniMax-M2", "MiniMax-M2.1", "MiniMax-M2.5", "MiniMax-M2.5-highspeed", "MiniMax-M2.7", "MiniMax-M2.7-highspeed" ], chutes: [ "MiniMaxAI/MiniMax-M2.5-TEE", "NousResearch/DeepHermes-3-Mistral-24B-Preview", "NousResearch/Hermes-4-14B", "Qwen/Qwen2.5-72B-Instruct", "Qwen/Qwen2.5-Coder-32B-Instruct", "Qwen/Qwen2.5-VL-32B-Instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507-TEE", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-30B-A3B", "Qwen/Qwen3-32B-TEE", "Qwen/Qwen3-Coder-Next-TEE", "Qwen/Qwen3-Next-80B-A3B-Instruct", "Qwen/Qwen3.5-397B-A17B-TEE", "Qwen/Qwen3.6-27B-TEE", "Qwen/Qwen3Guard-Gen-0.6B", "XiaomiMiMo/MiMo-V2-Flash-TEE", "deepseek-ai/DeepSeek-R1-0528-TEE", "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", "deepseek-ai/DeepSeek-V3-0324-TEE", "deepseek-ai/DeepSeek-V3.1-TEE", "deepseek-ai/DeepSeek-V3.2-TEE", "google/gemma-4-31B-turbo-TEE", "moonshotai/Kimi-K2.5-TEE", "moonshotai/Kimi-K2.6-TEE", "openai/gpt-oss-120b-TEE", "rednote-hilab/dots.ocr", "tngtech/DeepSeek-TNG-R1T2-Chimera-TEE", "unsloth/Llama-3.2-1B-Instruct", "unsloth/Llama-3.2-3B-Instruct", "unsloth/Mistral-Nemo-Instruct-2407", "unsloth/gemma-3-12b-it", "unsloth/gemma-3-27b-it", "unsloth/gemma-3-4b-it", "zai-org/GLM-4.6V", "zai-org/GLM-4.7-FP8", "zai-org/GLM-4.7-TEE", "zai-org/GLM-5-TEE", "zai-org/GLM-5-Turbo", "zai-org/GLM-5.1-TEE" ], "siliconflow-cn": [ "ByteDance-Seed/Seed-OSS-36B-Instruct", "Kwaipilot/KAT-Dev", "PaddlePaddle/PaddleOCR-VL", "PaddlePaddle/PaddleOCR-VL-1.5", "Pro/MiniMaxAI/MiniMax-M2.1", "Pro/MiniMaxAI/MiniMax-M2.5", "Pro/deepseek-ai/DeepSeek-R1", "Pro/deepseek-ai/DeepSeek-V3", "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", "Pro/deepseek-ai/DeepSeek-V3.2", "Pro/moonshotai/Kimi-K2-Instruct-0905", "Pro/moonshotai/Kimi-K2-Thinking", "Pro/moonshotai/Kimi-K2.5", "Pro/moonshotai/Kimi-K2.6", "Pro/zai-org/GLM-4.7", "Pro/zai-org/GLM-5", "Pro/zai-org/GLM-5.1", "Qwen/QwQ-32B", "Qwen/Qwen2.5-14B-Instruct", "Qwen/Qwen2.5-32B-Instruct", "Qwen/Qwen2.5-72B-Instruct", "Qwen/Qwen2.5-72B-Instruct-128K", "Qwen/Qwen2.5-7B-Instruct", "Qwen/Qwen2.5-Coder-32B-Instruct", "Qwen/Qwen2.5-VL-32B-Instruct", "Qwen/Qwen2.5-VL-72B-Instruct", "Qwen/Qwen3-14B", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-30B-A3B-Thinking-2507", "Qwen/Qwen3-32B", "Qwen/Qwen3-8B", "Qwen/Qwen3-Coder-30B-A3B-Instruct", "Qwen/Qwen3-Coder-480B-A35B-Instruct", "Qwen/Qwen3-Next-80B-A3B-Instruct", "Qwen/Qwen3-Next-80B-A3B-Thinking", "Qwen/Qwen3-Omni-30B-A3B-Captioner", "Qwen/Qwen3-Omni-30B-A3B-Instruct", "Qwen/Qwen3-Omni-30B-A3B-Thinking", "Qwen/Qwen3-VL-235B-A22B-Instruct", "Qwen/Qwen3-VL-235B-A22B-Thinking", "Qwen/Qwen3-VL-30B-A3B-Instruct", "Qwen/Qwen3-VL-30B-A3B-Thinking", "Qwen/Qwen3-VL-32B-Instruct", "Qwen/Qwen3-VL-32B-Thinking", "Qwen/Qwen3-VL-8B-Instruct", "Qwen/Qwen3-VL-8B-Thinking", "Qwen/Qwen3.5-122B-A10B", "Qwen/Qwen3.5-27B", "Qwen/Qwen3.5-35B-A3B", "Qwen/Qwen3.5-397B-A17B", "Qwen/Qwen3.5-4B", "Qwen/Qwen3.5-9B", "Qwen/Qwen3.6-35B-A3B", "THUDM/GLM-4-32B-0414", "THUDM/GLM-4-9B-0414", "THUDM/GLM-Z1-32B-0414", "THUDM/GLM-Z1-9B-0414", "ascend-tribe/pangu-pro-moe", "baidu/ERNIE-4.5-300B-A47B", "deepseek-ai/DeepSeek-OCR", "deepseek-ai/DeepSeek-R1", "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", "deepseek-ai/DeepSeek-V3", "deepseek-ai/DeepSeek-V3.1-Terminus", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/deepseek-vl2", "inclusionAI/Ling-flash-2.0", "inclusionAI/Ling-mini-2.0", "inclusionAI/Ring-flash-2.0", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/Kimi-K2-Thinking", "stepfun-ai/Step-3.5-Flash", "tencent/Hunyuan-A13B-Instruct", "tencent/Hunyuan-MT-7B", "zai-org/GLM-4.5-Air", "zai-org/GLM-4.5V", "zai-org/GLM-4.6", "zai-org/GLM-4.6V" ], nvidia: [ "abacusai/dracarys-llama-3_1-70b-instruct", "baai/bge-m3", "black-forest-labs/flux.1-dev", "black-forest-labs/flux_1-kontext-dev", "black-forest-labs/flux_1-schnell", "black-forest-labs/flux_2-klein-4b", "bytedance/seed-oss-36b-instruct", "deepseek-ai/deepseek-v3.1-terminus", "deepseek-ai/deepseek-v3.2", "deepseek-ai/deepseek-v4-flash", "deepseek-ai/deepseek-v4-pro", "google/gemma-2-2b-it", "google/gemma-3-27b-it", "google/gemma-3n-e2b-it", "google/gemma-3n-e4b-it", "google/gemma-4-31b-it", "google/google-paligemma", "meta/esm2-650m", "meta/esmfold", "meta/llama-3.1-70b-instruct", "meta/llama-3.1-8b-instruct", "meta/llama-3.2-11b-vision-instruct", "meta/llama-3.2-1b-instruct", "meta/llama-3.2-3b-instruct", "meta/llama-3.2-90b-vision-instruct", "meta/llama-3.3-70b-instruct", "meta/llama-4-maverick-17b-128e-instruct", "meta/llama-guard-4-12b", "microsoft/phi-4-mini-instruct", "microsoft/phi-4-multimodal-instruct", "minimaxai/minimax-m2.5", "minimaxai/minimax-m2.7", "mistralai/devstral-2-123b-instruct-2512", "mistralai/magistral-small-2506", "mistralai/mistral-7b-instruct-v03", "mistralai/mistral-large-3-675b-instruct-2512", "mistralai/mistral-medium-3-instruct", "mistralai/mistral-nemotron", "mistralai/mistral-small-4-119b-2603", "mistralai/mixtral-8x22b-instruct", "mistralai/mixtral-8x7b-instruct", "moonshotai/kimi-k2-instruct", "moonshotai/kimi-k2-instruct-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2.6", "nvidia/active-speaker-detection", "nvidia/bevformer", "nvidia/cosmos-predict1-5b", "nvidia/cosmos-transfer1-7b", "nvidia/cosmos-transfer2_5-2b", "nvidia/gliner-pii", "nvidia/llama-3_1-nemotron-safety-guard-8b-v3", "nvidia/llama-3_2-nemoretriever-300m-embed-v1", "nvidia/llama-3_3-nemotron-super-49b-v1", "nvidia/llama-3_3-nemotron-super-49b-v1_5", "nvidia/llama-nemotron-embed-vl-1b-v2", "nvidia/llama-nemotron-rerank-vl-1b-v2", "nvidia/magpie-tts-zeroshot", "nvidia/nemotron-3-content-safety", "nvidia/nemotron-3-nano-30b-a3b", "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", "nvidia/nemotron-3-super-120b-a12b", "nvidia/nemotron-content-safety-reasoning-4b", "nvidia/nemotron-mini-4b-instruct", "nvidia/nemotron-voicechat", "nvidia/nv-embed-v1", "nvidia/nv-embedcode-7b-v1", "nvidia/nvidia-nemotron-nano-9b-v2", "nvidia/rerank-qa-mistral-4b", "nvidia/riva-translate-4b-instruct-v1_1", "nvidia/sparsedrive", "nvidia/streampetr", "nvidia/studiovoice", "nvidia/synthetic-video-detector", "nvidia/usdcode", "nvidia/usdvalidate", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "openai/whisper-large-v3", "qwen/qwen-image", "qwen/qwen-image-edit", "qwen/qwen2.5-coder-32b-instruct", "qwen/qwen3-coder-480b-a35b-instruct", "qwen/qwen3-next-80b-a3b-instruct", "qwen/qwen3-next-80b-a3b-thinking", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-397b-a17b", "sarvamai/sarvam-m", "stepfun-ai/step-3.5-flash", "upstage/solar-10_7b-instruct", "z-ai/glm-5.1", "z-ai/glm4.7" ], anthropic: [ "claude-3-5-haiku-20241022", "claude-3-5-haiku-latest", "claude-3-5-sonnet-20240620", "claude-3-5-sonnet-20241022", "claude-3-7-sonnet-20250219", "claude-3-haiku-20240307", "claude-3-opus-20240229", "claude-3-sonnet-20240229", "claude-haiku-4-5", "claude-haiku-4-5-20251001", "claude-opus-4-0", "claude-opus-4-1", "claude-opus-4-1-20250805", "claude-opus-4-20250514", "claude-opus-4-5", "claude-opus-4-5-20251101", "claude-opus-4-6", "claude-opus-4-7", "claude-sonnet-4-0", "claude-sonnet-4-20250514", "claude-sonnet-4-5", "claude-sonnet-4-5-20250929", "claude-sonnet-4-6" ], "zhipuai-coding-plan": ["glm-4.5-air", "glm-4.7", "glm-5-turbo", "glm-5.1", "glm-5v-turbo"], "atomic-chat": [ "Meta-Llama-3_1-8B-Instruct-GGUF", "Qwen3_5-9B-MLX-4bit", "Qwen3_5-9B-Q4_K_M", "gemma-4-E4B-it-IQ4_XS", "gemma-4-E4B-it-MLX-4bit" ], "github-models": [ "ai21-labs/ai21-jamba-1.5-large", "ai21-labs/ai21-jamba-1.5-mini", "cohere/cohere-command-a", "cohere/cohere-command-r", "cohere/cohere-command-r-08-2024", "cohere/cohere-command-r-plus", "cohere/cohere-command-r-plus-08-2024", "core42/jais-30b-chat", "deepseek/deepseek-r1", "deepseek/deepseek-r1-0528", "deepseek/deepseek-v3-0324", "meta/llama-3.2-11b-vision-instruct", "meta/llama-3.2-90b-vision-instruct", "meta/llama-3.3-70b-instruct", "meta/llama-4-maverick-17b-128e-instruct-fp8", "meta/llama-4-scout-17b-16e-instruct", "meta/meta-llama-3-70b-instruct", "meta/meta-llama-3-8b-instruct", "meta/meta-llama-3.1-405b-instruct", "meta/meta-llama-3.1-70b-instruct", "meta/meta-llama-3.1-8b-instruct", "microsoft/mai-ds-r1", "microsoft/phi-3-medium-128k-instruct", "microsoft/phi-3-medium-4k-instruct", "microsoft/phi-3-mini-128k-instruct", "microsoft/phi-3-mini-4k-instruct", "microsoft/phi-3-small-128k-instruct", "microsoft/phi-3-small-8k-instruct", "microsoft/phi-3.5-mini-instruct", "microsoft/phi-3.5-moe-instruct", "microsoft/phi-3.5-vision-instruct", "microsoft/phi-4", "microsoft/phi-4-mini-instruct", "microsoft/phi-4-mini-reasoning", "microsoft/phi-4-multimodal-instruct", "microsoft/phi-4-reasoning", "mistral-ai/codestral-2501", "mistral-ai/ministral-3b", "mistral-ai/mistral-large-2411", "mistral-ai/mistral-medium-2505", "mistral-ai/mistral-nemo", "mistral-ai/mistral-small-2503", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-mini", "openai/o1", "openai/o1-mini", "openai/o1-preview", "openai/o3", "openai/o3-mini", "openai/o4-mini", "xai/grok-3", "xai/grok-3-mini" ], "qiniu-ai": [ "MiniMax-M1", "claude-3.5-haiku", "claude-3.5-sonnet", "claude-3.7-sonnet", "claude-4.0-opus", "claude-4.0-sonnet", "claude-4.1-opus", "claude-4.5-haiku", "claude-4.5-opus", "claude-4.5-sonnet", "deepseek-r1", "deepseek-r1-0528", "deepseek-v3", "deepseek-v3-0324", "deepseek-v3.1", "deepseek/deepseek-math-v2", "deepseek/deepseek-v3.1-terminus", "deepseek/deepseek-v3.1-terminus-thinking", "deepseek/deepseek-v3.2-251201", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v3.2-exp-thinking", "doubao-1.5-pro-32k", "doubao-1.5-thinking-pro", "doubao-1.5-vision-pro", "doubao-seed-1.6", "doubao-seed-1.6-flash", "doubao-seed-1.6-thinking", "doubao-seed-2.0-code", "doubao-seed-2.0-lite", "doubao-seed-2.0-mini", "doubao-seed-2.0-pro", "gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-2.5-flash", "gemini-2.5-flash-image", "gemini-2.5-flash-lite", "gemini-2.5-pro", "gemini-3.0-flash-preview", "gemini-3.0-pro-image-preview", "gemini-3.0-pro-preview", "glm-4.5", "glm-4.5-air", "gpt-oss-120b", "gpt-oss-20b", "kimi-k2", "kling-v2-6", "meituan/longcat-flash-chat", "meituan/longcat-flash-lite", "mimo-v2-flash", "minimax/minimax-m2", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.5-highspeed", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2.5", "openai/gpt-5", "openai/gpt-5.2", "qwen-max-2025-01-25", "qwen-turbo", "qwen-vl-max-2025-01-25", "qwen2.5-vl-72b-instruct", "qwen2.5-vl-7b-instruct", "qwen3-235b-a22b", "qwen3-235b-a22b-instruct-2507", "qwen3-235b-a22b-thinking-2507", "qwen3-30b-a3b", "qwen3-30b-a3b-instruct-2507", "qwen3-30b-a3b-thinking-2507", "qwen3-32b", "qwen3-coder-480b-a35b-instruct", "qwen3-max", "qwen3-max-preview", "qwen3-next-80b-a3b-instruct", "qwen3-next-80b-a3b-thinking", "qwen3-vl-30b-a3b-thinking", "qwen3.5-397b-a17b", "stepfun-ai/gelab-zero-4b-preview", "stepfun/step-3.5-flash", "x-ai/grok-4-fast", "x-ai/grok-4-fast-non-reasoning", "x-ai/grok-4-fast-reasoning", "x-ai/grok-4.1-fast", "x-ai/grok-4.1-fast-non-reasoning", "x-ai/grok-4.1-fast-reasoning", "x-ai/grok-code-fast-1", "xiaomi/mimo-v2-flash", "z-ai/autoglm-phone-9b", "z-ai/glm-4.6", "z-ai/glm-4.7", "z-ai/glm-5" ], google: [ "gemini-2.0-flash", "gemini-2.0-flash-lite", "gemini-2.5-flash", "gemini-2.5-flash-image", "gemini-2.5-flash-lite", "gemini-2.5-flash-preview-tts", "gemini-2.5-pro", "gemini-2.5-pro-preview-tts", "gemini-3-flash-preview", "gemini-3-pro-preview", "gemini-3.1-flash-image-preview", "gemini-3.1-flash-lite", "gemini-3.1-flash-lite-preview", "gemini-3.1-pro-preview", "gemini-3.1-pro-preview-customtools", "gemini-3.5-flash", "gemini-embedding-001", "gemini-flash-latest", "gemini-flash-lite-latest", "gemma-4-26b-a4b-it", "gemma-4-31b-it" ], scaleway: [ "bge-multilingual-gemma2", "deepseek-r1-distill-llama-70b", "devstral-2-123b-instruct-2512", "gemma-3-27b-it", "gpt-oss-120b", "llama-3.1-8b-instruct", "llama-3.3-70b-instruct", "mistral-medium-3.5-128b", "mistral-nemo-instruct-2407", "mistral-small-3.2-24b-instruct-2506", "pixtral-12b-2409", "qwen3-235b-a22b-instruct-2507", "qwen3-coder-30b-a3b-instruct", "qwen3-embedding-8b", "qwen3.5-397b-a17b", "voxtral-small-24b-2507", "whisper-large-v3" ], opencode: [ "big-pickle", "claude-haiku-4-5", "claude-opus-4-1", "claude-opus-4-5", "claude-opus-4-6", "claude-opus-4-7", "claude-sonnet-4", "claude-sonnet-4-5", "claude-sonnet-4-6", "deepseek-v4-flash-free", "gemini-3-flash", "gemini-3.1-pro", "gemini-3.5-flash", "glm-5", "glm-5.1", "gpt-5", "gpt-5-codex", "gpt-5-nano", "gpt-5.1", "gpt-5.1-codex", "gpt-5.1-codex-max", "gpt-5.1-codex-mini", "gpt-5.2", "gpt-5.2-codex", "gpt-5.3-codex", "gpt-5.3-codex-spark", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano", "gpt-5.4-pro", "gpt-5.5", "gpt-5.5-pro", "grok-build-0.1", "kimi-k2.5", "kimi-k2.6", "minimax-m2.5", "minimax-m2.7", "nemotron-3-super-free", "qwen3.5-plus", "qwen3.6-plus" ], mixlayer: [ "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-27b", "qwen/qwen3.5-35b-a3b", "qwen/qwen3.5-397b-a17b", "qwen/qwen3.5-9b" ], zenmux: [ "anthropic/claude-3.5-haiku", "anthropic/claude-3.7-sonnet", "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "baidu/ernie-5.0-thinking-preview", "deepseek/deepseek-chat", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-pro", "google/gemini-2.5-flash", "google/gemini-2.5-flash-lite", "google/gemini-2.5-pro", "google/gemini-3-flash-preview", "google/gemini-3.1-flash-lite-preview", "google/gemini-3.1-pro-preview", "inclusionai/ling-1t", "inclusionai/ring-1t", "kuaishou/kat-coder-pro-v2", "minimax/minimax-m2", "minimax/minimax-m2.1", "minimax/minimax-m2.5", "minimax/minimax-m2.5-lightning", "minimax/minimax-m2.7", "minimax/minimax-m2.7-highspeed", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2-thinking-turbo", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.6", "openai/gpt-5", "openai/gpt-5-codex", "openai/gpt-5.1", "openai/gpt-5.1-chat", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-chat", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "qwen/qwen3-coder-plus", "qwen/qwen3-max", "qwen/qwen3.5-flash", "qwen/qwen3.5-plus", "qwen/qwen3.6-plus", "sapiens-ai/agnes-1.5-lite", "sapiens-ai/agnes-1.5-pro", "stepfun/step-3", "stepfun/step-3.5-flash", "stepfun/step-3.5-flash-free", "tencent/hy3-preview", "volcengine/doubao-seed-1.8", "volcengine/doubao-seed-2.0-code", "volcengine/doubao-seed-2.0-lite", "volcengine/doubao-seed-2.0-mini", "volcengine/doubao-seed-2.0-pro", "volcengine/doubao-seed-code", "x-ai/grok-4", "x-ai/grok-4-fast", "x-ai/grok-4.1-fast", "x-ai/grok-4.1-fast-non-reasoning", "x-ai/grok-4.2-fast", "x-ai/grok-4.2-fast-non-reasoning", "x-ai/grok-code-fast-1", "xiaomi/mimo-v2-flash", "xiaomi/mimo-v2-omni", "xiaomi/mimo-v2-pro", "xiaomi/mimo-v2.5", "xiaomi/mimo-v2.5-pro", "z-ai/glm-4.5", "z-ai/glm-4.5-air", "z-ai/glm-4.6", "z-ai/glm-4.6v", "z-ai/glm-4.6v-flash", "z-ai/glm-4.6v-flash-free", "z-ai/glm-4.7", "z-ai/glm-4.7-flash-free", "z-ai/glm-4.7-flashx", "z-ai/glm-5", "z-ai/glm-5-turbo", "z-ai/glm-5.1", "z-ai/glm-5v-turbo" ], "perplexity-agent": [ "anthropic/claude-haiku-4-5", "anthropic/claude-opus-4-5", "anthropic/claude-opus-4-6", "anthropic/claude-opus-4-7", "anthropic/claude-sonnet-4-5", "anthropic/claude-sonnet-4-6", "google/gemini-2.5-flash", "google/gemini-2.5-pro", "google/gemini-3-flash-preview", "google/gemini-3.1-pro-preview", "nvidia/nemotron-3-super-120b-a12b", "openai/gpt-5-mini", "openai/gpt-5.1", "openai/gpt-5.2", "openai/gpt-5.4", "openai/gpt-5.5", "perplexity/sonar", "xai/grok-4-1-fast-non-reasoning" ], "alibaba-coding-plan": [ "MiniMax-M2.5", "glm-4.7", "glm-5", "kimi-k2.5", "qwen3-coder-next", "qwen3-coder-plus", "qwen3-max-2026-01-23", "qwen3.5-plus", "qwen3.6-plus" ], meganova: [ "MiniMaxAI/MiniMax-M2.1", "MiniMaxAI/MiniMax-M2.5", "Qwen/Qwen2.5-VL-32B-Instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3.5-Plus", "XiaomiMiMo/MiMo-V2-Flash", "deepseek-ai/DeepSeek-R1-0528", "deepseek-ai/DeepSeek-V3-0324", "deepseek-ai/DeepSeek-V3.1", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V3.2-Exp", "meta-llama/Llama-3.3-70B-Instruct", "mistralai/Mistral-Nemo-Instruct-2407", "mistralai/Mistral-Small-3.2-24B-Instruct-2506", "moonshotai/Kimi-K2-Thinking", "moonshotai/Kimi-K2.5", "zai-org/GLM-4.6", "zai-org/GLM-4.7", "zai-org/GLM-5" ], synthetic: [ "hf:MiniMaxAI/MiniMax-M2", "hf:MiniMaxAI/MiniMax-M2.1", "hf:MiniMaxAI/MiniMax-M2.5", "hf:Qwen/Qwen2.5-Coder-32B-Instruct", "hf:Qwen/Qwen3-235B-A22B-Instruct-2507", "hf:Qwen/Qwen3-235B-A22B-Thinking-2507", "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct", "hf:Qwen/Qwen3.5-397B-A17B", "hf:deepseek-ai/DeepSeek-R1", "hf:deepseek-ai/DeepSeek-R1-0528", "hf:deepseek-ai/DeepSeek-V3", "hf:deepseek-ai/DeepSeek-V3-0324", "hf:deepseek-ai/DeepSeek-V3.1", "hf:deepseek-ai/DeepSeek-V3.1-Terminus", "hf:deepseek-ai/DeepSeek-V3.2", "hf:meta-llama/Llama-3.1-405B-Instruct", "hf:meta-llama/Llama-3.1-70B-Instruct", "hf:meta-llama/Llama-3.1-8B-Instruct", "hf:meta-llama/Llama-3.3-70B-Instruct", "hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", "hf:meta-llama/Llama-4-Scout-17B-16E-Instruct", "hf:moonshotai/Kimi-K2-Instruct-0905", "hf:moonshotai/Kimi-K2-Thinking", "hf:moonshotai/Kimi-K2.5", "hf:moonshotai/Kimi-K2.6", "hf:nvidia/Kimi-K2.5-NVFP4", "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", "hf:openai/gpt-oss-120b", "hf:zai-org/GLM-4.6", "hf:zai-org/GLM-4.7", "hf:zai-org/GLM-4.7-Flash", "hf:zai-org/GLM-5", "hf:zai-org/GLM-5.1" ], inceptron: [ "MiniMaxAI/MiniMax-M2.5", "moonshotai/Kimi-K2.6", "nvidia/llama-3.3-70b-instruct-fp8", "zai-org/GLM-5.1-FP8" ], "minimax-coding-plan": [ "MiniMax-M2", "MiniMax-M2.1", "MiniMax-M2.5", "MiniMax-M2.5-highspeed", "MiniMax-M2.7", "MiniMax-M2.7-highspeed" ], upstage: ["solar-mini", "solar-pro2", "solar-pro3"], vercel: [ "alibaba/qwen-3-14b", "alibaba/qwen-3-235b", "alibaba/qwen-3-30b", "alibaba/qwen-3-32b", "alibaba/qwen-3.6-max-preview", "alibaba/qwen3-235b-a22b-thinking", "alibaba/qwen3-coder", "alibaba/qwen3-coder-30b-a3b", "alibaba/qwen3-coder-next", "alibaba/qwen3-coder-plus", "alibaba/qwen3-embedding-0.6b", "alibaba/qwen3-embedding-4b", "alibaba/qwen3-embedding-8b", "alibaba/qwen3-max", "alibaba/qwen3-max-preview", "alibaba/qwen3-max-thinking", "alibaba/qwen3-next-80b-a3b-instruct", "alibaba/qwen3-next-80b-a3b-thinking", "alibaba/qwen3-vl-235b-a22b-instruct", "alibaba/qwen3-vl-instruct", "alibaba/qwen3-vl-thinking", "alibaba/qwen3.5-flash", "alibaba/qwen3.5-plus", "alibaba/qwen3.6-27b", "alibaba/qwen3.6-plus", "alibaba/qwen3.7-max", "amazon/nova-2-lite", "amazon/nova-lite", "amazon/nova-micro", "amazon/nova-pro", "amazon/titan-embed-text-v2", "anthropic/claude-3-haiku", "anthropic/claude-3-opus", "anthropic/claude-3.5-haiku", "anthropic/claude-3.5-sonnet", "anthropic/claude-3.5-sonnet-20240620", "anthropic/claude-3.7-sonnet", "anthropic/claude-haiku-4.5", "anthropic/claude-opus-4", "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", "arcee-ai/trinity-large-preview", "arcee-ai/trinity-large-thinking", "arcee-ai/trinity-mini", "bfl/flux-kontext-max", "bfl/flux-kontext-pro", "bfl/flux-pro-1.0-fill", "bfl/flux-pro-1.1", "bfl/flux-pro-1.1-ultra", "bytedance/seed-1.6", "bytedance/seed-1.8", "cohere/command-a", "cohere/embed-v4.0", "deepseek/deepseek-r1", "deepseek/deepseek-v3", "deepseek/deepseek-v3.1", "deepseek/deepseek-v3.1-terminus", "deepseek/deepseek-v3.2", "deepseek/deepseek-v3.2-exp", "deepseek/deepseek-v3.2-thinking", "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-pro", "google/gemini-2.0-flash", "google/gemini-2.0-flash-lite", "google/gemini-2.5-flash", "google/gemini-2.5-flash-image", "google/gemini-2.5-flash-image-preview", "google/gemini-2.5-flash-lite", "google/gemini-2.5-flash-lite-preview-09-2025", "google/gemini-2.5-flash-preview-09-2025", "google/gemini-2.5-pro", "google/gemini-3-flash", "google/gemini-3-pro-image", "google/gemini-3-pro-preview", "google/gemini-3.1-flash-image-preview", "google/gemini-3.1-flash-lite", "google/gemini-3.1-flash-lite-preview", "google/gemini-3.1-pro-preview", "google/gemini-3.5-flash", "google/gemini-embedding-001", "google/gemini-embedding-2", "google/gemma-4-26b-a4b-it", "google/gemma-4-31b-it", "google/imagen-4.0-fast-generate-001", "google/imagen-4.0-generate-001", "google/imagen-4.0-ultra-generate-001", "google/text-embedding-005", "google/text-multilingual-embedding-002", "inception/mercury-2", "inception/mercury-coder-small", "inception/mercury-edit-2", "interfaze/interfaze-beta", "kwaipilot/kat-coder-pro-v1", "kwaipilot/kat-coder-pro-v2", "meituan/longcat-flash-chat", "meituan/longcat-flash-thinking", "meituan/longcat-flash-thinking-2601", "meta/llama-3.1-70b", "meta/llama-3.1-8b", "meta/llama-3.2-11b", "meta/llama-3.2-1b", "meta/llama-3.2-3b", "meta/llama-3.2-90b", "meta/llama-3.3-70b", "meta/llama-4-maverick", "meta/llama-4-scout", "minimax/minimax-m2", "minimax/minimax-m2.1", "minimax/minimax-m2.1-lightning", "minimax/minimax-m2.5", "minimax/minimax-m2.5-highspeed", "minimax/minimax-m2.7", "minimax/minimax-m2.7-highspeed", "mistral/codestral", "mistral/codestral-embed", "mistral/devstral-2", "mistral/devstral-small", "mistral/devstral-small-2", "mistral/magistral-medium", "mistral/magistral-small", "mistral/ministral-14b", "mistral/ministral-3b", "mistral/ministral-8b", "mistral/mistral-embed", "mistral/mistral-large-3", "mistral/mistral-medium", "mistral/mistral-medium-3.5", "mistral/mistral-nemo", "mistral/mistral-small", "mistral/mixtral-8x22b-instruct", "mistral/pixtral-12b", "mistral/pixtral-large", "moonshotai/kimi-k2-0905", "moonshotai/kimi-k2-thinking", "moonshotai/kimi-k2-thinking-turbo", "moonshotai/kimi-k2-turbo", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.6", "morph/morph-v3-fast", "morph/morph-v3-large", "nvidia/nemotron-3-nano-30b-a3b", "nvidia/nemotron-3-super-120b-a12b", "nvidia/nemotron-nano-12b-v2-vl", "nvidia/nemotron-nano-9b-v2", "openai/codex-mini", "openai/gpt-3.5-turbo", "openai/gpt-3.5-turbo-instruct", "openai/gpt-4-turbo", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-mini", "openai/gpt-4o-mini-search-preview", "openai/gpt-5", "openai/gpt-5-chat", "openai/gpt-5-codex", "openai/gpt-5-mini", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.1-instant", "openai/gpt-5.1-thinking", "openai/gpt-5.2", "openai/gpt-5.2-chat", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.3-chat", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-mini", "openai/gpt-5.4-nano", "openai/gpt-5.4-pro", "openai/gpt-5.5", "openai/gpt-5.5-pro", "openai/gpt-oss-120b", "openai/gpt-oss-20b", "openai/gpt-oss-safeguard-20b", "openai/o1", "openai/o3", "openai/o3-deep-research", "openai/o3-mini", "openai/o3-pro", "openai/o4-mini", "openai/text-embedding-3-large", "openai/text-embedding-3-small", "openai/text-embedding-ada-002", "perplexity/sonar", "perplexity/sonar-pro", "perplexity/sonar-reasoning", "perplexity/sonar-reasoning-pro", "prime-intellect/intellect-3", "recraft/recraft-v2", "recraft/recraft-v3", "vercel/v0-1.0-md", "vercel/v0-1.5-md", "voyage/voyage-3-large", "voyage/voyage-3.5", "voyage/voyage-3.5-lite", "voyage/voyage-4", "voyage/voyage-4-large", "voyage/voyage-4-lite", "voyage/voyage-code-2", "voyage/voyage-code-3", "voyage/voyage-finance-2", "voyage/voyage-law-2", "xai/grok-4-fast-reasoning", "xai/grok-4.1-fast-non-reasoning", "xai/grok-4.1-fast-reasoning", "xai/grok-4.20-multi-agent", "xai/grok-4.20-multi-agent-beta", "xai/grok-4.20-non-reasoning", "xai/grok-4.20-non-reasoning-beta", "xai/grok-4.20-reasoning", "xai/grok-4.20-reasoning-beta", "xai/grok-4.3", "xai/grok-build-0.1", "xai/grok-imagine-image", "xai/grok-imagine-image-pro", "xiaomi/mimo-v2-flash", "xiaomi/mimo-v2-pro", "xiaomi/mimo-v2.5", "xiaomi/mimo-v2.5-pro", "zai/glm-4.5", "zai/glm-4.5-air", "zai/glm-4.5v", "zai/glm-4.6", "zai/glm-4.6v", "zai/glm-4.6v-flash", "zai/glm-4.7", "zai/glm-4.7-flash", "zai/glm-4.7-flashx", "zai/glm-5", "zai/glm-5-turbo", "zai/glm-5.1", "zai/glm-5v-turbo" ], "abliteration-ai": ["abliterated-model"], deepseek: ["deepseek-chat", "deepseek-reasoner", "deepseek-v4-flash", "deepseek-v4-pro"], perplexity: ["sonar", "sonar-deep-research", "sonar-pro", "sonar-reasoning-pro"], iflowcn: [ "deepseek-r1", "deepseek-v3", "deepseek-v3.2", "glm-4.6", "kimi-k2", "kimi-k2-0905", "qwen3-235b", "qwen3-235b-a22b-instruct", "qwen3-235b-a22b-thinking-2507", "qwen3-32b", "qwen3-coder-plus", "qwen3-max", "qwen3-max-preview", "qwen3-vl-plus" ], stackit: [ "Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", "Qwen/Qwen3-VL-Embedding-8B", "cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic", "google/gemma-3-27b-it", "intfloat/e5-mistral-7b-instruct", "neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8", "neuralmagic/Mistral-Nemo-Instruct-2407-FP8", "openai/gpt-oss-120b" ], "wafer.ai": ["GLM-5.1", "Qwen3.5-397B-A17B"], evroc: [ "KBLab/kb-whisper-large", "Qwen/Qwen3-30B-A3B-Instruct-2507-FP8", "Qwen/Qwen3-Embedding-8B", "Qwen/Qwen3-VL-30B-A3B-Instruct", "intfloat/multilingual-e5-large-instruct", "microsoft/Phi-4-multimodal-instruct", "mistralai/Magistral-Small-2509", "mistralai/Voxtral-Small-24B-2507", "mistralai/devstral-small-2-24b-instruct-2512", "moonshotai/Kimi-K2.5", "nvidia/Llama-3.3-70B-Instruct-FP8", "openai/gpt-oss-120b", "openai/whisper-large-v3" ], nova: ["nova-2-lite-v1", "nova-2-pro-v1"], "fireworks-ai": [ "accounts/fireworks/models/deepseek-v3p1", "accounts/fireworks/models/deepseek-v3p2", "accounts/fireworks/models/deepseek-v4-flash", "accounts/fireworks/models/deepseek-v4-pro", "accounts/fireworks/models/glm-4p5", "accounts/fireworks/models/glm-4p5-air", "accounts/fireworks/models/glm-4p7", "accounts/fireworks/models/glm-5", "accounts/fireworks/models/glm-5p1", "accounts/fireworks/models/gpt-oss-120b", "accounts/fireworks/models/gpt-oss-20b", "accounts/fireworks/models/kimi-k2-instruct", "accounts/fireworks/models/kimi-k2-thinking", "accounts/fireworks/models/kimi-k2p5", "accounts/fireworks/models/kimi-k2p6", "accounts/fireworks/models/minimax-m2p1", "accounts/fireworks/models/minimax-m2p5", "accounts/fireworks/models/minimax-m2p7", "accounts/fireworks/models/qwen3p6-plus", "accounts/fireworks/routers/kimi-k2p5-turbo" ], alibaba: [ "qvq-max", "qwen-flash", "qwen-max", "qwen-mt-plus", "qwen-mt-turbo", "qwen-omni-turbo", "qwen-omni-turbo-realtime", "qwen-plus", "qwen-plus-character-ja", "qwen-turbo", "qwen-vl-max", "qwen-vl-ocr", "qwen-vl-plus", "qwen2-5-14b-instruct", "qwen2-5-32b-instruct", "qwen2-5-72b-instruct", "qwen2-5-7b-instruct", "qwen2-5-omni-7b", "qwen2-5-vl-72b-instruct", "qwen2-5-vl-7b-instruct", "qwen3-14b", "qwen3-235b-a22b", "qwen3-32b", "qwen3-8b", "qwen3-asr-flash", "qwen3-coder-30b-a3b-instruct", "qwen3-coder-480b-a35b-instruct", "qwen3-coder-flash", "qwen3-coder-plus", "qwen3-livetranslate-flash-realtime", "qwen3-max", "qwen3-next-80b-a3b-instruct", "qwen3-next-80b-a3b-thinking", "qwen3-omni-flash", "qwen3-omni-flash-realtime", "qwen3-vl-235b-a22b", "qwen3-vl-30b-a3b", "qwen3-vl-plus", "qwen3.5-122b-a10b", "qwen3.5-27b", "qwen3.5-35b-a3b", "qwen3.5-397b-a17b", "qwen3.5-plus", "qwen3.6-27b", "qwen3.6-35b-a3b", "qwen3.6-max-preview", "qwen3.6-plus", "qwen3.7-max", "qwq-plus" ], "302ai": [ "MiniMax-M1", "MiniMax-M2", "MiniMax-M2.1", "MiniMax-M2.7", "MiniMax-M2.7-highspeed", "chatgpt-4o-latest", "claude-3-5-haiku-20241022", "claude-3-5-haiku-latest", "claude-haiku-4-5", "claude-haiku-4-5-20251001", "claude-opus-4-1-20250805", "claude-opus-4-1-20250805-thinking", "claude-opus-4-20250514", "claude-opus-4-5", "claude-opus-4-5-20251101", "claude-opus-4-5-20251101-thinking", "claude-opus-4-6", "claude-opus-4-6-thinking", "claude-opus-4-7", "claude-sonnet-4-20250514", "claude-sonnet-4-5", "claude-sonnet-4-5-20250929", "claude-sonnet-4-5-20250929-thinking", "claude-sonnet-4-6", "claude-sonnet-4-6-thinking", "deepseek-chat", "deepseek-reasoner", "deepseek-v3.2", "deepseek-v3.2-thinking", "doubao-seed-1-6-thinking-250715", "doubao-seed-1-6-vision-250815", "doubao-seed-1-8-251215", "doubao-seed-code-preview-251028", "gemini-2.0-flash-lite", "gemini-2.5-flash", "gemini-2.5-flash-image", "gemini-2.5-flash-lite-preview-09-2025", "gemini-2.5-flash-nothink", "gemini-2.5-flash-preview-09-2025", "gemini-2.5-pro", "gemini-3-flash-preview", "gemini-3-pro-image-preview", "gemini-3-pro-preview", "gemini-3.1-flash-image-preview", "glm-4.5", "glm-4.5-air", "glm-4.5-airx", "glm-4.5-x", "glm-4.5v", "glm-4.6", "glm-4.6v", "glm-4.7", "glm-4.7-flashx", "glm-5", "glm-5-turbo", "glm-5.1", "glm-5v-turbo", "glm-for-coding", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-5", "gpt-5-mini", "gpt-5-pro", "gpt-5-thinking", "gpt-5.1", "gpt-5.1-chat-latest", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-mini-2026-03-17", "gpt-5.4-nano", "gpt-5.4-nano-2026-03-17", "gpt-5.4-pro", "grok-4-1-fast-non-reasoning", "grok-4-1-fast-reasoning", "grok-4-fast-non-reasoning", "grok-4-fast-reasoning", "grok-4.1", "grok-4.20-beta-0309-non-reasoning", "grok-4.20-beta-0309-reasoning", "grok-4.20-multi-agent-beta-0309", "kimi-k2-0905-preview", "kimi-k2-thinking", "kimi-k2-thinking-turbo", "ministral-14b-2512", "mistral-large-2512", "qwen-flash", "qwen-max-latest", "qwen-plus", "qwen3-235b-a22b", "qwen3-235b-a22b-instruct-2507", "qwen3-30b-a3b", "qwen3-coder-480b-a35b-instruct", "qwen3-max-2025-09-23" ], xpersona: ["xpersona-frieren-coder"], stepfun: ["step-1-32k", "step-2-16k", "step-3.5-flash", "step-3.5-flash-2603"], xai: [ "grok-4.20-0309-non-reasoning", "grok-4.20-0309-reasoning", "grok-4.20-multi-agent-0309", "grok-4.3", "grok-build-0.1", "grok-imagine-image", "grok-imagine-image-quality", "grok-imagine-video" ], sarvam: ["sarvam-105b", "sarvam-30b"], zhipuai: [ "glm-4.5", "glm-4.5-air", "glm-4.5-flash", "glm-4.5v", "glm-4.6", "glm-4.6v", "glm-4.7", "glm-4.7-flash", "glm-4.7-flashx", "glm-5", "glm-5.1", "glm-5v-turbo" ], bailing: ["Ling-1T", "Ring-1T"], "qihang-ai": [ "claude-haiku-4-5-20251001", "claude-opus-4-5-20251101", "claude-sonnet-4-5-20250929", "gemini-2.5-flash", "gemini-3-flash-preview", "gemini-3-pro-preview", "gpt-5-mini", "gpt-5.2", "gpt-5.2-codex" ], lilac: ["google/gemma-4-31b-it", "minimaxai/minimax-m2.7", "moonshotai/kimi-k2.6", "zai-org/glm-5.1"], "alibaba-cn": [ "MiniMax-M2.5", "MiniMax/MiniMax-M2.7", "deepseek-r1", "deepseek-r1-0528", "deepseek-r1-distill-llama-70b", "deepseek-r1-distill-llama-8b", "deepseek-r1-distill-qwen-1-5b", "deepseek-r1-distill-qwen-14b", "deepseek-r1-distill-qwen-32b", "deepseek-r1-distill-qwen-7b", "deepseek-v3", "deepseek-v3-1", "deepseek-v3-2-exp", "deepseek-v4-flash", "deepseek-v4-pro", "glm-5", "glm-5.1", "kimi-k2-thinking", "kimi-k2.5", "kimi-k2.6", "kimi/kimi-k2.5", "moonshot-kimi-k2-instruct", "qvq-max", "qwen-deep-research", "qwen-doc-turbo", "qwen-flash", "qwen-long", "qwen-math-plus", "qwen-math-turbo", "qwen-max", "qwen-mt-plus", "qwen-mt-turbo", "qwen-omni-turbo", "qwen-omni-turbo-realtime", "qwen-plus", "qwen-plus-character", "qwen-turbo", "qwen-vl-max", "qwen-vl-ocr", "qwen-vl-plus", "qwen2-5-14b-instruct", "qwen2-5-32b-instruct", "qwen2-5-72b-instruct", "qwen2-5-7b-instruct", "qwen2-5-coder-32b-instruct", "qwen2-5-coder-7b-instruct", "qwen2-5-math-72b-instruct", "qwen2-5-math-7b-instruct", "qwen2-5-omni-7b", "qwen2-5-vl-72b-instruct", "qwen2-5-vl-7b-instruct", "qwen3-14b", "qwen3-235b-a22b", "qwen3-32b", "qwen3-8b", "qwen3-asr-flash", "qwen3-coder-30b-a3b-instruct", "qwen3-coder-480b-a35b-instruct", "qwen3-coder-flash", "qwen3-coder-plus", "qwen3-max", "qwen3-next-80b-a3b-instruct", "qwen3-next-80b-a3b-thinking", "qwen3-omni-flash", "qwen3-omni-flash-realtime", "qwen3-vl-235b-a22b", "qwen3-vl-30b-a3b", "qwen3-vl-plus", "qwen3.5-397b-a17b", "qwen3.5-flash", "qwen3.5-plus", "qwen3.6-max-preview", "qwen3.6-plus", "qwq-32b", "qwq-plus", "siliconflow/deepseek-r1-0528", "siliconflow/deepseek-v3-0324", "siliconflow/deepseek-v3.1-terminus", "siliconflow/deepseek-v3.2", "tongyi-intent-detect-v3" ], drun: ["public/deepseek-r1", "public/deepseek-v3", "public/minimax-m25"], huggingface: [ "MiniMaxAI/MiniMax-M2.1", "MiniMaxAI/MiniMax-M2.5", "MiniMaxAI/MiniMax-M2.7", "Qwen/Qwen3-235B-A22B-Thinking-2507", "Qwen/Qwen3-Coder-480B-A35B-Instruct", "Qwen/Qwen3-Coder-Next", "Qwen/Qwen3-Embedding-4B", "Qwen/Qwen3-Embedding-8B", "Qwen/Qwen3-Next-80B-A3B-Instruct", "Qwen/Qwen3-Next-80B-A3B-Thinking", "Qwen/Qwen3.5-397B-A17B", "XiaomiMiMo/MiMo-V2-Flash", "deepseek-ai/DeepSeek-R1-0528", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V4-Pro", "moonshotai/Kimi-K2-Instruct", "moonshotai/Kimi-K2-Instruct-0905", "moonshotai/Kimi-K2-Thinking", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "zai-org/GLM-4.7", "zai-org/GLM-4.7-Flash", "zai-org/GLM-5", "zai-org/GLM-5.1" ], "umans-ai-coding-plan": ["umans-coder", "umans-flash", "umans-glm-5.1", "umans-kimi-k2.6", "umans-qwen3.6-35b-a3b"], "tencent-tokenhub": ["hy3-preview"], nebius: [ "MiniMaxAI/MiniMax-M2.5", "MiniMaxAI/MiniMax-M2.5-fast", "NousResearch/Hermes-4-405B", "NousResearch/Hermes-4-70B", "PrimeIntellect/INTELLECT-3", "Qwen/Qwen2.5-VL-72B-Instruct", "Qwen/Qwen3-235B-A22B-Instruct-2507", "Qwen/Qwen3-235B-A22B-Thinking-2507-fast", "Qwen/Qwen3-30B-A3B-Instruct-2507", "Qwen/Qwen3-32B", "Qwen/Qwen3-Embedding-8B", "Qwen/Qwen3-Next-80B-A3B-Thinking", "Qwen/Qwen3-Next-80B-A3B-Thinking-fast", "Qwen/Qwen3.5-397B-A17B", "Qwen/Qwen3.5-397B-A17B-fast", "deepseek-ai/DeepSeek-V3.2", "deepseek-ai/DeepSeek-V3.2-fast", "deepseek-ai/DeepSeek-V4-Pro", "google/gemma-2-2b-it", "google/gemma-3-27b-it", "meta-llama/Llama-3.3-70B-Instruct", "meta-llama/Meta-Llama-3.1-8B-Instruct", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.5-fast", "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1", "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B", "nvidia/Nemotron-3-Nano-Omni", "nvidia/nemotron-3-super-120b-a12b", "openai/gpt-oss-120b", "openai/gpt-oss-120b-fast", "zai-org/GLM-5" ], "hpc-ai": ["minimax/minimax-m2.5", "moonshotai/kimi-k2.5", "zai-org/glm-5.1"], xiaomi: ["mimo-v2-flash", "mimo-v2-omni", "mimo-v2-pro", "mimo-v2.5", "mimo-v2.5-pro"], togetherai: [ "MiniMaxAI/MiniMax-M2.5", "MiniMaxAI/MiniMax-M2.7", "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", "Qwen/Qwen3-Coder-Next-FP8", "Qwen/Qwen3.5-397B-A17B", "Qwen/Qwen3.6-Plus", "deepseek-ai/DeepSeek-R1", "deepseek-ai/DeepSeek-V3", "deepseek-ai/DeepSeek-V3-1", "deepseek-ai/DeepSeek-V4-Pro", "essentialai/Rnj-1-Instruct", "google/gemma-4-31B-it", "meta-llama/Llama-3.3-70B-Instruct-Turbo", "moonshotai/Kimi-K2.5", "moonshotai/Kimi-K2.6", "openai/gpt-oss-120b", "zai-org/GLM-5.1" ], "stepfun-ai": ["step-3.5-flash", "step-3.5-flash-2603"], inference: [ "google/gemma-3", "meta/llama-3.1-8b-instruct", "meta/llama-3.2-11b-vision-instruct", "meta/llama-3.2-1b-instruct", "meta/llama-3.2-3b-instruct", "mistral/mistral-nemo-12b-instruct", "osmosis/osmosis-structure-0.6b", "qwen/qwen-2.5-7b-vision-instruct", "qwen/qwen3-embedding-4b" ], netlify: [ "anthropic/claude-haiku-4-5", "anthropic/claude-haiku-4-5-20251001", "anthropic/claude-opus-4-1-20250805", "anthropic/claude-opus-4-20250514", "anthropic/claude-opus-4-5", "anthropic/claude-opus-4-5-20251101", "anthropic/claude-opus-4-6", "anthropic/claude-opus-4-7", "anthropic/claude-sonnet-4-0", "anthropic/claude-sonnet-4-20250514", "anthropic/claude-sonnet-4-5", "anthropic/claude-sonnet-4-5-20250929", "anthropic/claude-sonnet-4-6", "gemini/gemini-2.0-flash", "gemini/gemini-2.0-flash-lite", "gemini/gemini-2.5-flash", "gemini/gemini-2.5-flash-image", "gemini/gemini-2.5-flash-lite", "gemini/gemini-2.5-pro", "gemini/gemini-3-flash-preview", "gemini/gemini-3-pro-image-preview", "gemini/gemini-3.1-flash-image-preview", "gemini/gemini-3.1-flash-lite", "gemini/gemini-3.1-flash-lite-preview", "gemini/gemini-3.1-pro-preview", "gemini/gemini-3.1-pro-preview-customtools", "gemini/gemini-3.5-flash", "gemini/gemini-flash-latest", "gemini/gemini-flash-lite-latest", "openai/chat-latest", "openai/gpt-4.1", "openai/gpt-4.1-mini", "openai/gpt-4.1-nano", "openai/gpt-4o", "openai/gpt-4o-mini", "openai/gpt-5", "openai/gpt-5-2025-08-07", "openai/gpt-5-codex", "openai/gpt-5-mini", "openai/gpt-5-mini-2025-08-07", "openai/gpt-5-nano", "openai/gpt-5-pro", "openai/gpt-5.1", "openai/gpt-5.1-2025-11-13", "openai/gpt-5.1-codex", "openai/gpt-5.1-codex-max", "openai/gpt-5.1-codex-mini", "openai/gpt-5.2", "openai/gpt-5.2-2025-12-11", "openai/gpt-5.2-codex", "openai/gpt-5.2-pro", "openai/gpt-5.2-pro-2025-12-11", "openai/gpt-5.3-chat-latest", "openai/gpt-5.3-codex", "openai/gpt-5.4", "openai/gpt-5.4-2026-03-05", "openai/gpt-5.4-mini", "openai/gpt-5.4-mini-2026-03-17", "openai/gpt-5.4-nano", "openai/gpt-5.4-nano-2026-03-17", "openai/gpt-5.4-pro", "openai/gpt-5.4-pro-2026-03-05", "openai/gpt-5.5", "openai/gpt-5.5-2026-04-23", "openai/gpt-5.5-pro", "openai/gpt-5.5-pro-2026-04-23", "openai/o3", "openai/o3-mini", "openai/o4-mini" ] }, version: "1.0.0" }; // src/llm/model/provider-registry.ts function isOfflineMode() { const value = process.env.MASTRA_OFFLINE; return value === "true" || value === "1"; } function getEnabledGatewayIds(gateways) { const enabledGatewayIds = /* @__PURE__ */ new Set(); for (const gateway of gateways) { const enabled = shouldEnableGateway(gateway); if (enabled) { enabledGatewayIds.add(getGatewayId(gateway)); } } return enabledGatewayIds; } function sanitizeRegistryDataForRuntime(data, enabledGatewayIds) { const providers = Object.fromEntries( Object.entries(data.providers).filter(([, config]) => enabledGatewayIds.has(config.gateway)) ); const models = Object.fromEntries(Object.entries(data.models).filter(([providerId]) => providerId in providers)); return { ...data, providers, models }; } var registryData = null; var CACHE_DIR = () => path__default.default.join(os__default.default.homedir(), ".cache", "mastra"); var CACHE_FILE = () => path__default.default.join(CACHE_DIR(), "gateway-refresh-time"); var GLOBAL_PROVIDER_REGISTRY_JSON = () => path__default.default.join(CACHE_DIR(), "provider-registry.json"); var GLOBAL_PROVIDER_TYPES_DTS = () => path__default.default.join(CACHE_DIR(), "provider-types.generated.d.ts"); var GLOBAL_CAPABILITIES_DIR = () => path__default.default.join(CACHE_DIR(), "capabilities"); var modelRouterCacheFailed = false; function atomicWriteFileSync(filePath, content, encoding = "utf-8") { const randomSuffix = Math.random().toString(36).substring(2, 15); const tempPath = `${filePath}.${process.pid}.${Date.now()}.${randomSuffix}.tmp`; try { fs__default.default.writeFileSync(tempPath, content, encoding); fs__default.default.renameSync(tempPath, filePath); } catch (error) { try { fs__default.default.unlinkSync(tempPath); } catch { } throw error; } } function syncGlobalCacheToLocal() { try { const globalJsonExists = fs__default.default.existsSync(GLOBAL_PROVIDER_REGISTRY_JSON()); const globalDtsExists = fs__default.default.existsSync(GLOBAL_PROVIDER_TYPES_DTS()); if (!globalJsonExists && !globalDtsExists) { return; } const packageRoot = getPackageRoot(); const localJsonPath = path__default.default.join(packageRoot, "dist", "provider-registry.json"); const localDtsPath = path__default.default.join(packageRoot, "dist", "llm", "model", "provider-types.generated.d.ts"); fs__default.default.mkdirSync(path__default.default.dirname(localJsonPath), { recursive: true }); fs__default.default.mkdirSync(path__default.default.dirname(localDtsPath), { recursive: true }); if (globalJsonExists) { const globalJsonContent = fs__default.default.readFileSync(GLOBAL_PROVIDER_REGISTRY_JSON(), "utf-8"); try { JSON.parse(globalJsonContent); } catch { try { fs__default.default.unlinkSync(GLOBAL_PROVIDER_REGISTRY_JSON()); } catch { } return; } let shouldCopyJson = true; if (fs__default.default.existsSync(localJsonPath)) { const localJsonContent = fs__default.default.readFileSync(localJsonPath, "utf-8"); shouldCopyJson = globalJsonContent !== localJsonContent; } if (shouldCopyJson) { atomicWriteFileSync(localJsonPath, globalJsonContent, "utf-8"); } } if (globalDtsExists) { const globalDtsContent = fs__default.default.readFileSync(GLOBAL_PROVIDER_TYPES_DTS(), "utf-8"); if (/readonly\s+\d/.test(globalDtsContent)) { try { fs__default.default.unlinkSync(GLOBAL_PROVIDER_TYPES_DTS()); } catch { } } else { let shouldCopyDts = true; if (fs__default.default.existsSync(localDtsPath)) { const localDtsContent = fs__default.default.readFileSync(localDtsPath, "utf-8"); shouldCopyDts = globalDtsContent !== localDtsContent; } if (shouldCopyDts) { atomicWriteFileSync(localDtsPath, globalDtsContent, "utf-8"); } } } } catch { } } function getLastRefreshTimeFromDisk() { try { if (!fs__default.default.existsSync(CACHE_FILE())) { return null; } const timestamp = fs__default.default.readFileSync(CACHE_FILE(), "utf-8").trim(); return new Date(parseInt(timestamp, 10)); } catch (err) { console.warn("[GatewayRegistry] Failed to read cache file:", err); modelRouterCacheFailed = true; return null; } } function saveLastRefreshTimeToDisk(date) { try { if (!fs__default.default.existsSync(CACHE_DIR())) { fs__default.default.mkdirSync(CACHE_DIR(), { recursive: true }); } fs__default.default.writeFileSync(CACHE_FILE(), date.getTime().toString(), "utf-8"); } catch (err) { modelRouterCacheFailed = true; console.warn("[GatewayRegistry] Failed to write cache file:", err); } } function getPackageRoot() { try { const require2 = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-DURT53SS.cjs', document.baseURI).href)) || "file://"); const packageJsonPath = require2.resolve("@mastra/core/package.json"); return path__default.default.dirname(packageJsonPath); } catch { return process.cwd(); } } function loadRegistry(useDynamicLoading, customGateways = []) { const enabledGatewayIds = getEnabledGatewayIds([ new chunkDBTKQ3U2_cjs.ModelsDevGateway({}), new chunkZMNN3DOV_cjs.NetlifyGateway(), new MastraGateway(), ...customGateways ]); if (!useDynamicLoading) { return sanitizeRegistryDataForRuntime(provider_registry_default, enabledGatewayIds); } syncGlobalCacheToLocal(); if (registryData) { return registryData; } const packageRoot = getPackageRoot(); const possiblePaths = [ // Built: in dist/ relative to package root (first priority - what gets distributed) path__default.default.join(packageRoot, "dist", "provider-registry.json"), // Development: in src/ relative to package root path__default.default.join(packageRoot, "src", "llm", "model", "provider-registry.json"), // Fallback: relative to cwd (for monorepo setups) path__default.default.join(process.cwd(), "packages/core/src/llm/model/provider-registry.json"), path__default.default.join(process.cwd(), "src/llm/model/provider-registry.json") ]; const errors = []; for (const jsonPath of possiblePaths) { try { const content = fs__default.default.readFileSync(jsonPath, "utf-8"); const parsed = JSON.parse(content); registryData = sanitizeRegistryDataForRuntime(parsed, enabledGatewayIds); return registryData; } catch (err) { const errorMessage = err instanceof Error ? err.message : String(err); errors.push(`${jsonPath}: ${errorMessage}`); const isFileNotFound = err instanceof Error && "code" in err && err.code === "ENOENT"; const isJsonParseError = err instanceof SyntaxError; if (!isFileNotFound && isJsonParseError) { console.warn( `[GatewayRegistry] Detected corrupted provider-registry.json at ${jsonPath}. Deleting corrupted file and falling back to static registry.` ); try { fs__default.default.unlinkSync(jsonPath); } catch { } registryData = sanitizeRegistryDataForRuntime(provider_registry_default, enabledGatewayIds); return registryData; } continue; } } console.warn( `[GatewayRegistry] Could not load provider registry from any path. Falling back to static registry. Tried paths: ${errors.join("\n")}` ); registryData = sanitizeRegistryDataForRuntime(provider_registry_default, enabledGatewayIds); return registryData; } var PROVIDER_REGISTRY = new Proxy({}, { get(_target, prop) { const registry = GatewayRegistry.getInstance(); const providers = registry.getProviders(); return providers[prop]; }, ownKeys() { const registry = GatewayRegistry.getInstance(); const providers = registry.getProviders(); return Object.keys(providers); }, has(_target, prop) { const registry = GatewayRegistry.getInstance(); const providers = registry.getProviders(); return prop in providers; }, getOwnPropertyDescriptor(_target, prop) { const registry = GatewayRegistry.getInstance(); const providers = registry.getProviders(); if (prop in providers) { return { enumerable: true, configurable: true }; } return void 0; } }); var PROVIDER_MODELS = new Proxy({}, { get(_target, prop) { const registry = GatewayRegistry.getInstance(); const models = registry.getModels(); return models[prop]; }, ownKeys() { const registry = GatewayRegistry.getInstance(); const models = registry.getModels(); return Object.keys(models); }, has(_target, prop) { const registry = GatewayRegistry.getInstance(); const models = registry.getModels(); return prop in models; }, getOwnPropertyDescriptor(_target, prop) { const registry = GatewayRegistry.getInstance(); const models = registry.getModels(); if (prop in models) { return { enumerable: true, configurable: true }; } return void 0; } }); function parseModelString(modelString) { const firstSlashIndex = modelString.indexOf("/"); if (firstSlashIndex !== -1) { const provider = modelString.substring(0, firstSlashIndex); const modelId = modelString.substring(firstSlashIndex + 1); if (provider && modelId) { return { provider, modelId }; } } return { provider: null, modelId: modelString }; } function getProviderConfig(providerId) { const registry = GatewayRegistry.getInstance(); return registry.getProviderConfig(providerId); } function isProviderRegistered(providerId) { const registry = GatewayRegistry.getInstance(); return registry.isProviderRegistered(providerId); } function getRegisteredProviders() { const registry = GatewayRegistry.getInstance(); const providers = registry.getProviders(); return Object.keys(providers); } var providerCapCache = /* @__PURE__ */ new Map(); function isDirectory(dir) { try { return fs__default.default.existsSync(dir) && fs__default.default.statSync(dir).isDirectory(); } catch { return false; } } function findCapabilitiesDirs(useDynamicLoading) { const packageRoot = getPackageRoot(); const distCapabilitiesDir = path__default.default.join(packageRoot, "dist", "capabilities"); const sourceCapabilitiesDir = path__default.default.join(packageRoot, "src", "llm", "model", "capabilities"); const workspaceSourceCapabilitiesDir = path__default.default.join(process.cwd(), "packages/core/src/llm/model/capabilities"); const dirs = []; if (useDynamicLoading) { const globalCapDir = GLOBAL_CAPABILITIES_DIR(); if (isDirectory(globalCapDir)) dirs.push(globalCapDir); } if (isDirectory(distCapabilitiesDir)) dirs.push(distCapabilitiesDir); if (isDirectory(sourceCapabilitiesDir)) dirs.push(sourceCapabilitiesDir); if (workspaceSourceCapabilitiesDir !== sourceCapabilitiesDir && isDirectory(workspaceSourceCapabilitiesDir)) { dirs.push(workspaceSourceCapabilitiesDir); } return dirs; } var capabilitiesDirCache; function loadProviderAttachmentModels(provider, useDynamicLoading) { if (providerCapCache.has(provider)) return providerCapCache.get(provider); if (capabilitiesDirCache === void 0) { capabilitiesDirCache = findCapabilitiesDirs(useDynamicLoading); } for (const capabilitiesDir of capabilitiesDirCache) { const filePath = path__default.default.join(capabilitiesDir, `${provider}.json`); try { const content = fs__default.default.readFileSync(filePath, "utf-8"); const data = JSON.parse(content); providerCapCache.set(provider, data.attachment); return data.attachment; } catch { continue; } } providerCapCache.set(provider, null); return null; } function getProviderAttachmentSupport(provider, modelId, useDynamicLoading) { const models = loadProviderAttachmentModels(provider, useDynamicLoading); if (!models) return void 0; return models.includes(modelId); } function modelSupportsAttachments(modelRouterId) { const { provider, modelId } = parseModelString(modelRouterId); if (!provider) return void 0; const registry = GatewayRegistry.getInstance(); const useDynamicLoading = registry["useDynamicLoading"]; const directSupport = getProviderAttachmentSupport(provider, modelId, useDynamicLoading); if (directSupport !== void 0) return directSupport; const nestedProviderDelimiter = modelId.indexOf("/"); if (nestedProviderDelimiter !== -1) { const nestedProvider = modelId.substring(0, nestedProviderDelimiter); const nestedModelId = modelId.substring(nestedProviderDelimiter + 1); if (nestedProvider && nestedModelId) { const nestedSupport = getProviderAttachmentSupport(nestedProvider, nestedModelId, useDynamicLoading); if (nestedSupport !== void 0) return nestedSupport; } } return directSupport; } function isValidModelId(modelId) { const { provider } = parseModelString(modelId); return provider !== null && isProviderRegistered(provider); } var GatewayRegistry = class _GatewayRegistry { static instance = null; lastRefreshTime = null; refreshInterval = null; isRefreshing = false; useDynamicLoading; customGateways = []; constructor(options = {}) { const isDev2 = process.env.MASTRA_DEV === "true" || process.env.MASTRA_DEV === "1"; this.useDynamicLoading = options.useDynamicLoading ?? isDev2; } /** * Get the singleton instance */ static getInstance(options) { if (!_GatewayRegistry.instance) { _GatewayRegistry.instance = new _GatewayRegistry(options); return _GatewayRegistry.instance; } if (options?.useDynamicLoading === true) { _GatewayRegistry.instance.useDynamicLoading = true; } return _GatewayRegistry.instance; } /** * Register custom gateways for type generation * @param gateways - Array of custom gateway instances */ registerCustomGateways(gateways) { this.customGateways = gateways; } /** * Get all registered custom gateways */ getCustomGateways() { return this.customGateways; } /** * Sync providers from all gateways * Requires dynamic loading to be enabled (useDynamicLoading=true). * @param forceRefresh - Force refresh even if recently synced * @param writeToSrc - Write to src/ directory in addition to dist/ (useful for manual generation in repo) */ async syncGateways(forceRefresh = false, writeToSrc = false) { if (!this.useDynamicLoading && !writeToSrc) { return; } if (isOfflineMode()) { return; } if (this.isRefreshing && !forceRefresh) { return; } this.isRefreshing = true; try { const { ModelsDevGateway: ModelsDevGateway2 } = await import('./models-dev-55YSMHB6.cjs'); const { NetlifyGateway: NetlifyGateway2 } = await import('./netlify-UPFSCOO7.cjs'); const { MastraGateway: MastraGateway2 } = await import('./mastra-SC7RDMUN.cjs'); const { fetchProvidersFromGateways, writeRegistryFiles } = await import('./registry-generator-LJFBZ6Z3.cjs'); const defaultGateways = [ new ModelsDevGateway2({}), new NetlifyGateway2(), ...writeToSrc ? [] : [new MastraGateway2()] ]; const gateways = [...defaultGateways, ...this.customGateways]; const { providers, models, attachmentCapabilities } = await fetchProvidersFromGateways(gateways); const packageRoot = getPackageRoot(); try { fs__default.default.mkdirSync(CACHE_DIR(), { recursive: true }); await writeRegistryFiles( GLOBAL_PROVIDER_REGISTRY_JSON(), GLOBAL_PROVIDER_TYPES_DTS(), providers, models, attachmentCapabilities ); } catch (error) { console.warn("[GatewayRegistry] Failed to write to global cache:", error); } const distJsonPath = path__default.default.join(packageRoot, "dist", "provider-registry.json"); const distTypesPath = path__default.default.join(packageRoot, "dist", "llm", "model", "provider-types.generated.d.ts"); await writeRegistryFiles(distJsonPath, distTypesPath, providers, models, attachmentCapabilities); const shouldWriteToSrc = writeToSrc; if (shouldWriteToSrc) { const srcJsonPath = path__default.default.join(packageRoot, "src", "llm", "model", "provider-registry.json"); const srcTypesPath = path__default.default.join(packageRoot, "src", "llm", "model", "provider-types.generated.d.ts"); await fs__default.default.promises.copyFile(distJsonPath, srcJsonPath); await fs__default.default.promises.copyFile(distTypesPath, srcTypesPath); const distCapDir = path__default.default.join(packageRoot, "dist", "capabilities"); const srcCapDir = path__default.default.join(packageRoot, "src", "llm", "model", "capabilities"); if (fs__default.default.existsSync(distCapDir)) { await fs__default.default.promises.mkdir(srcCapDir, { recursive: true }); const capFiles = fs__default.default.readdirSync(distCapDir).filter((f) => f.endsWith(".json")); for (const file of capFiles) { await fs__default.default.promises.copyFile(path__default.default.join(distCapDir, file), path__default.default.join(srcCapDir, file)); } } } if (this.useDynamicLoading) { registryData = null; providerCapCache.clear(); capabilitiesDirCache = void 0; } this.lastRefreshTime = /* @__PURE__ */ new Date(); saveLastRefreshTimeToDisk(this.lastRefreshTime); } catch { } finally { this.isRefreshing = false; } } /** * Get the last refresh time (from memory or disk cache) */ getLastRefreshTime() { return this.lastRefreshTime || getLastRefreshTimeFromDisk(); } /** * Start auto-refresh on an interval * Requires dynamic loading to be enabled (useDynamicLoading=true). * @param intervalMs - Interval in milliseconds (default: 1 hour) */ startAutoRefresh(intervalMs = 60 * 60 * 1e3) { if (!this.useDynamicLoading) { return; } if (isOfflineMode()) { return; } if (this.refreshInterval) { return; } const lastRefresh = getLastRefreshTimeFromDisk(); const now = Date.now(); const shouldRefresh = !modelRouterCacheFailed && (!lastRefresh || now - lastRefresh.getTime() > intervalMs); if (shouldRefresh) { this.syncGateways().catch(() => { }); } this.refreshInterval = setInterval(() => { if (modelRouterCacheFailed && this.refreshInterval) { clearInterval(this.refreshInterval); this.refreshInterval = null; return; } this.syncGateways().catch(() => { }); }, intervalMs); if (this.refreshInterval.unref) { this.refreshInterval.unref(); } } /** * Stop auto-refresh */ stopAutoRefresh() { if (this.refreshInterval) { clearInterval(this.refreshInterval); this.refreshInterval = null; } } /** * Get provider configuration by ID */ getProviderConfig(providerId) { const data = loadRegistry(this.useDynamicLoading, this.customGateways); return data.providers[providerId]; } /** * Check if a provider is registered */ isProviderRegistered(providerId) { const data = loadRegistry(this.useDynamicLoading, this.customGateways); return providerId in data.providers; } /** * Get all registered providers */ getProviders() { const data = loadRegistry(this.useDynamicLoading, this.customGateways); return data.providers; } /** * Get all models */ getModels() { return loadRegistry(this.useDynamicLoading, this.customGateways).models; } }; var isDev = process.env.MASTRA_DEV === "true" || process.env.MASTRA_DEV === "1"; var autoRefreshEnabled = !isOfflineMode() && (process.env.MASTRA_AUTO_REFRESH_PROVIDERS === "true" || process.env.MASTRA_AUTO_REFRESH_PROVIDERS !== "false" && isDev); if (autoRefreshEnabled) { GatewayRegistry.getInstance({ useDynamicLoading: isDev }).startAutoRefresh(); } exports.AzureOpenAIGateway = AzureOpenAIGateway; exports.GatewayRegistry = GatewayRegistry; exports.MastraGateway = MastraGateway; exports.PROVIDER_MODELS = PROVIDER_MODELS; exports.PROVIDER_REGISTRY = PROVIDER_REGISTRY; exports.createOpenAIWebSocketFetch = createOpenAIWebSocketFetch; exports.findGatewayForModel = findGatewayForModel; exports.getGatewayId = getGatewayId; exports.getProviderConfig = getProviderConfig; exports.getRegisteredProviders = getRegisteredProviders; exports.isOfflineMode = isOfflineMode; exports.isProviderRegistered = isProviderRegistered; exports.isValidModelId = isValidModelId; exports.modelSupportsAttachments = modelSupportsAttachments; exports.parseModelString = parseModelString; exports.shouldEnableGateway = shouldEnableGateway; //# sourceMappingURL=chunk-DURT53SS.cjs.map //# sourceMappingURL=chunk-DURT53SS.cjs.map