diff --git a/packages/core/src/sync/index.ts b/packages/core/src/sync/index.ts index 3b8c8fce97..72452d3e64 100644 --- a/packages/core/src/sync/index.ts +++ b/packages/core/src/sync/index.ts @@ -21,6 +21,7 @@ import { openai } from "./providers/openai.js"; import { openrouter } from "./providers/openrouter.js"; import { ovhcloud } from "./providers/ovhcloud.js"; import { pioneer } from "./providers/pioneer.js"; +import { requesty } from "./providers/requesty.js"; import { vercel } from "./providers/vercel.js"; import { venice } from "./providers/venice.js"; import { wandb } from "./providers/wandb.js"; @@ -110,6 +111,7 @@ export const providers: { openrouter: SyncProvider; ovhcloud: SyncProvider; pioneer: SyncProvider; + requesty: SyncProvider; vercel: SyncProvider; venice: SyncProvider; wandb: SyncProvider; @@ -132,6 +134,7 @@ export const providers: { openrouter, ovhcloud, pioneer, + requesty, vercel, venice, wandb, @@ -139,7 +142,7 @@ export const providers: { }; export const groups = { - aggregators: ["crossmodel", "empiriolabs", "huggingface", "kilo", "llmgateway", "openrouter", "vercel"], + aggregators: ["crossmodel", "empiriolabs", "huggingface", "kilo", "llmgateway", "openrouter", "requesty", "vercel"], cloudflare: ["cloudflare-workers-ai"], direct: ["ambient", "anthropic", "baseten", "chutes", "deepinfra", "digitalocean", "google", "openai", "ovhcloud", "pioneer", "venice", "wandb", "xai"], } as const; diff --git a/packages/core/src/sync/providers/requesty.ts b/packages/core/src/sync/providers/requesty.ts new file mode 100644 index 0000000000..3bf646d00b --- /dev/null +++ b/packages/core/src/sync/providers/requesty.ts @@ -0,0 +1,259 @@ +import { readFileSync } from "node:fs"; +import path from "node:path"; +import { z } from "zod"; + +import type { + ExistingModel, + SyncProvider, + SyncedFullModel, + SyncedModel, +} from "../index.js"; +import { factorBaseModel, resolveCanonicalBaseModel } from "./openrouter.js"; + +const API_ENDPOINT = "https://router.requesty.ai/v1/models"; +const MODELS_DIR = path.join( + import.meta.dirname, + "..", + "..", + "..", + "..", + "..", + "models", +); +const metadataCache = new Map>(); +const RESPONSES_MODELS = new Map([ + ["openai-responses/gpt-5.4-mini", "openai/gpt-5.4-mini"], + ["openai-responses/gpt-5.4-nano", "openai/gpt-5.4-nano"], + ["openai-responses/gpt-5.5", "openai/gpt-5.5"], + ["openai-responses/gpt-5.6-luna", "openai/gpt-5.6-luna"], + ["openai-responses/gpt-5.6-sol", "openai/gpt-5.6-sol"], + ["openai-responses/gpt-5.6-terra", "openai/gpt-5.6-terra"], +]); +const SKIPPED_MODELS = new Set([ + ...RESPONSES_MODELS.values(), + "nvidia/nemotron-3.5-content-safety", +]); + +export const RequestyModel = z.object({ + id: z.string(), + api: z.string().optional(), + object: z.string().optional(), + created: z.number().optional(), + description: z.string().optional(), + input_price: z.number().nonnegative().optional(), + output_price: z.number().nonnegative().optional(), + caching_price: z.number().nonnegative().optional(), + cached_price: z.number().nonnegative().optional(), + context_window: z.number().int().nonnegative().optional(), + max_output_tokens: z.number().int().nonnegative().optional(), + supports_caching: z.boolean().optional(), + supports_vision: z.boolean().optional(), + supports_reasoning: z.boolean().optional(), + supports_tool_calling: z.boolean().optional(), + supports_image_generation: z.boolean().optional(), + supports_output_json_object: z.boolean().optional(), + supports_output_json_schema: z.boolean().optional(), +}).passthrough(); + +export const RequestyResponse = z.object({ + data: z.array(RequestyModel), +}).passthrough(); + +export type RequestyModel = z.infer; + +export const requesty = { + id: "requesty", + name: "Requesty", + modelsDir: "providers/requesty/models", + // Retain curated aliases and models missing from the public catalog. + deleteMissing: false, + async fetchModels() { + const response = await fetch(API_ENDPOINT); + if (!response.ok) { + throw new Error(`Requesty request failed: ${response.status} ${response.statusText}`); + } + return response.json(); + }, + parseModels(raw) { + return RequestyResponse.parse(raw).data.filter((model) => { + if ((model.api ?? "chat") !== "chat") return false; + if (!model.id.includes("/") || model.id.startsWith("policy/")) return false; + if (SKIPPED_MODELS.has(model.id)) return false; + return requestyBaseModel(model.id) !== undefined; + }); + }, + translateModel(model, context) { + const existing = context.existing(model.id); + const authored = context.authored(model.id); + const canonical = authored?.base_model ?? requestyBaseModel(model.id); + if (canonical === undefined) return undefined; + return { + id: model.id, + model: buildRequestyModel(model, existing, authored, canonical), + }; + }, +} satisfies SyncProvider; + +type Modality = "text" | "audio" | "image" | "video" | "pdf"; + +function price(value: number | undefined) { + if (value === undefined) return undefined; + return Math.round(value * 1_000_000_000_000) / 1_000_000; +} + +function metadata(modelID: string) { + let value = metadataCache.get(modelID); + if (value !== undefined) return value; + value = Bun.TOML.parse( + readFileSync(path.join(MODELS_DIR, `${modelID}.toml`), "utf8"), + ) as Record; + metadataCache.set(modelID, value); + return value; +} + +function metadataBoolean(modelID: string, field: string) { + const value = metadata(modelID)[field]; + return typeof value === "boolean" ? value : undefined; +} + +function metadataLimit(modelID: string) { + const value = metadata(modelID).limit; + return value !== null && typeof value === "object" && !Array.isArray(value) + ? value as { context?: number; input?: number; output?: number } + : undefined; +} + +function metadataModalities(modelID: string) { + const value = metadata(modelID).modalities; + if (value === null || typeof value !== "object" || Array.isArray(value)) return undefined; + const modalities = value as { input?: Modality[]; output?: Modality[] }; + return modalities.input !== undefined && modalities.output !== undefined + ? { input: modalities.input, output: modalities.output } + : undefined; +} + +function append(values: Modality[], value: Modality, enabled: boolean | undefined) { + return enabled === true && !values.includes(value) ? [...values, value] : values; +} + +function requestyBaseModel(modelID: string) { + return RESPONSES_MODELS.get(modelID) ?? resolveCanonicalBaseModel(modelID); +} + +function reasoningOptions( + model: RequestyModel, + reasoning: boolean, + existing: ExistingModel | undefined, +): SyncedFullModel["reasoning_options"] { + if (!reasoning) return undefined; + const canonical = requestyBaseModel(model.id); + const provider = canonical?.split("/")[0]; + if ( + provider === "openai" + || provider === "anthropic" + || canonical?.startsWith("google/gemini-") + ) { + return [ + { type: "effort", values: ["none", "low", "medium", "high", "max"] }, + { type: "budget_tokens" }, + ]; + } + if (canonical?.startsWith("google/gemma-")) return []; + return existing?.reasoning_options ?? []; +} + +export function buildRequestyModel( + model: RequestyModel, + existing: ExistingModel | undefined, + authored: ExistingModel | undefined, + canonical = requestyBaseModel(model.id), +): SyncedModel { + if (canonical === undefined) { + throw new Error(`Requesty model ${model.id} does not resolve to shared metadata`); + } + + const baseLimit = metadataLimit(canonical); + const baseModalities = metadataModalities(canonical); + const inputModalities = [...new Set([ + ...(baseModalities?.input ?? []), + ...(existing?.modalities?.input ?? []), + ])]; + const outputModalities = [...new Set([ + ...(baseModalities?.output ?? []), + ...(existing?.modalities?.output ?? []), + ])]; + const modalities = { + input: append(inputModalities.length > 0 ? inputModalities : ["text"], "image", model.supports_vision), + output: append(outputModalities.length > 0 ? outputModalities : ["text"], "image", model.supports_image_generation), + }; + const attachment = modalities.input.some((value) => value !== "text"); + const intrinsicReasoning = existing?.reasoning === true + || metadataBoolean(canonical, "reasoning") === true; + const reasoning = intrinsicReasoning || model.supports_reasoning === true; + const toolCall = model.id === "google/gemini-3.1-flash-image-preview" + ? false + : model.supports_tool_calling + ?? existing?.tool_call + ?? metadataBoolean(canonical, "tool_call"); + const reportedStructuredOutput = model.supports_output_json_schema === undefined + && model.supports_output_json_object === undefined + ? undefined + : model.supports_output_json_schema === true + || model.supports_output_json_object === true; + const structuredOutput = reportedStructuredOutput + ?? existing?.structured_output + ?? metadataBoolean(canonical, "structured_output"); + const inputPrice = price(model.input_price); + const outputPrice = price(model.output_price); + const cost = inputPrice !== undefined && outputPrice !== undefined + ? { + input: inputPrice, + output: outputPrice, + cache_read: model.supports_caching === false + ? undefined + : price(model.cached_price) ?? existing?.cost?.cache_read, + cache_write: model.supports_caching === false + ? undefined + : price(model.caching_price) ?? existing?.cost?.cache_write, + tiers: existing?.cost?.tiers, + } + : existing?.cost; + const context = model.context_window ?? existing?.limit?.context ?? baseLimit?.context ?? 0; + const output = model.max_output_tokens !== undefined && model.max_output_tokens > 0 + ? model.max_output_tokens + : existing?.limit?.output ?? baseLimit?.output ?? context; + const limit = { + context, + input: existing?.limit?.input ?? baseLimit?.input, + output, + }; + const values: Partial = { + attachment, + reasoning, + reasoning_options: reasoningOptions(model, reasoning, existing), + temperature: existing?.temperature, + tool_call: toolCall, + structured_output: structuredOutput, + status: existing?.status, + interleaved: existing?.interleaved, + provider: RESPONSES_MODELS.has(model.id) + ? { npm: "@ai-sdk/openai", shape: "responses" } + : existing?.provider, + cost, + limit, + modalities, + }; + + // Keep legacy hand-authored models inline, but update fields for which the + // Requesty API is authoritative. New and already-factored files stay based + // on shared model metadata. + if (authored !== undefined && authored.base_model === undefined) { + return { ...authored, ...values, cost, limit, modalities } as SyncedModel; + } + + return factorBaseModel( + canonical, + values, + limit, + ); +} diff --git a/packages/core/test/sync.test.ts b/packages/core/test/sync.test.ts index d9287ebca8..3e84e4c1da 100644 --- a/packages/core/test/sync.test.ts +++ b/packages/core/test/sync.test.ts @@ -33,6 +33,11 @@ import { } from "../src/sync/providers/openrouter.js"; import { buildLLMGatewayModel, type LLMGatewayModel } from "../src/sync/providers/llmgateway.js"; import { openai, parseOpenAIModels } from "../src/sync/providers/openai.js"; +import { + buildRequestyModel, + requesty, + type RequestyModel, +} from "../src/sync/providers/requesty.js"; import { resolveVeniceBaseModel } from "../src/sync/providers/venice.js"; import { buildVercelModel, vercel } from "../src/sync/providers/vercel.js"; import { buildWandbModel, type WandbModel } from "../src/sync/providers/wandb.js"; @@ -66,6 +71,155 @@ function anthropicModel(overrides: Partial = {}): AnthropicModel }; } +function requestyModel(overrides: Partial = {}): RequestyModel { + return { + id: "openai/gpt-5.5", + api: "chat", + input_price: 0.000005, + output_price: 0.00003, + cached_price: 0.0000005, + context_window: 1_050_000, + max_output_tokens: 128_000, + supports_caching: true, + supports_vision: true, + supports_reasoning: true, + supports_tool_calling: true, + supports_image_generation: false, + supports_output_json_object: true, + supports_output_json_schema: true, + ...overrides, + }; +} + +test("Requesty sync includes Responses routes from the chat catalog", () => { + const model = requestyModel({ id: "openai-responses/gpt-5.5" }); + expect(requesty.parseModels({ data: [model] })).toEqual([model]); +}); + +test("Requesty sync keeps inherited image output modalities", () => { + const model = buildRequestyModel( + requestyModel({ + id: "google/gemini-3.1-flash-image-preview", + input_price: 0.0000005, + output_price: 0.000002, + context_window: 131_072, + max_output_tokens: 32_768, + supports_image_generation: false, + }), + { + base_model: "google/gemini-3.1-flash-image-preview", + modalities: { input: ["text"], output: ["text"] }, + }, + { base_model: "google/gemini-3.1-flash-image-preview" }, + "google/gemini-3.1-flash-image-preview", + ); + + // The shared metadata already declares image output. Requesty's coarse + // capability flag must not replace it with a text-only modality override. + expect(model).not.toHaveProperty("modalities"); +}); + +test("Requesty sync preserves intrinsic reasoning and declares controls", () => { + const deepseek = buildRequestyModel( + requestyModel({ + id: "deepseek/deepseek-reasoner", + input_price: 0.00000014, + output_price: 0.00000028, + context_window: 1_000_000, + max_output_tokens: 384_000, + supports_vision: false, + supports_reasoning: false, + supports_output_json_schema: false, + }), + { + base_model: "deepseek/deepseek-reasoner", + reasoning: false, + reasoning_options: [], + }, + { base_model: "deepseek/deepseek-reasoner", reasoning: false }, + "deepseek/deepseek-reasoner", + ); + expect(deepseek).not.toHaveProperty("reasoning"); + expect(deepseek).toMatchObject({ reasoning_options: [] }); + + const openai = buildRequestyModel( + requestyModel({ id: "openai/gpt-5.4-mini" }), + undefined, + undefined, + "openai/gpt-5.4-mini", + ); + expect(openai).toMatchObject({ + reasoning_options: [ + { type: "effort", values: ["none", "low", "medium", "high", "max"] }, + { type: "budget_tokens" }, + ], + }); + + for (const [id, canonical] of [ + ["openai-responses/gpt-5.4-mini", "openai/gpt-5.4-mini"], + ["openai-responses/gpt-5.4-nano", "openai/gpt-5.4-nano"], + ["openai-responses/gpt-5.5", "openai/gpt-5.5"], + ["openai-responses/gpt-5.6-luna", "openai/gpt-5.6-luna"], + ["openai-responses/gpt-5.6-sol", "openai/gpt-5.6-sol"], + ["openai-responses/gpt-5.6-terra", "openai/gpt-5.6-terra"], + ]) { + const responsesModel = buildRequestyModel( + requestyModel({ id }), + undefined, + undefined, + canonical, + ); + expect(responsesModel).toMatchObject({ + provider: { npm: "@ai-sdk/openai", shape: "responses" }, + }); + } + + const image = buildRequestyModel( + requestyModel({ id: "google/gemini-3.1-flash-image-preview" }), + undefined, + undefined, + "google/gemini-3.1-flash-image-preview", + ); + expect(image).not.toHaveProperty("tool_call"); + + const gemma = buildRequestyModel( + requestyModel({ id: "google/gemma-4-31b-it" }), + { + base_model: "google/gemma-4-31b-it", + reasoning_options: [ + { type: "effort", values: ["none", "low", "medium", "high", "max"] }, + { type: "budget_tokens" }, + ], + }, + { base_model: "google/gemma-4-31b-it" }, + "google/gemma-4-31b-it", + ); + expect(gemma).toMatchObject({ reasoning_options: [] }); +}); + +test("Requesty sync updates existing provider-specific values", () => { + const model = buildRequestyModel( + requestyModel({ context_window: 900_000, max_output_tokens: 64_000 }), + { + base_model: "openai/gpt-5.5", + reasoning: true, + reasoning_options: [], + cost: { input: 1, output: 2 }, + limit: { context: 400_000, output: 32_000 }, + modalities: { input: ["text", "image"], output: ["text"] }, + }, + { base_model: "openai/gpt-5.5" }, + "openai/gpt-5.5", + ); + + expect(model).toMatchObject({ + cost: { input: 5, output: 30, cache_read: 0.5 }, + limit: { context: 900_000, output: 64_000 }, + }); + expect("sameModel" in requesty).toBe(false); + expect(requesty.deleteMissing).toBe(false); +}); + const anthropicPricingMarkdown = ` ## Model pricing diff --git a/providers/requesty/models/alibaba/qwen-max.toml b/providers/requesty/models/alibaba/qwen-max.toml new file mode 100644 index 0000000000..d44732ff85 --- /dev/null +++ b/providers/requesty/models/alibaba/qwen-max.toml @@ -0,0 +1,6 @@ +base_model = "alibaba/qwen-max" +structured_output = true + +[cost] +input = 1.6 +output = 6.4 diff --git a/providers/requesty/models/alibaba/qwen-plus.toml b/providers/requesty/models/alibaba/qwen-plus.toml new file mode 100644 index 0000000000..6471f13f9d --- /dev/null +++ b/providers/requesty/models/alibaba/qwen-plus.toml @@ -0,0 +1,10 @@ +base_model = "alibaba/qwen-plus" +structured_output = true +reasoning_options = [] + +[cost] +input = 0.4 +output = 1.2 + +[limit] +context = 131_072 diff --git a/providers/requesty/models/alibaba/qwen-turbo.toml b/providers/requesty/models/alibaba/qwen-turbo.toml new file mode 100644 index 0000000000..1063e96bd5 --- /dev/null +++ b/providers/requesty/models/alibaba/qwen-turbo.toml @@ -0,0 +1,7 @@ +base_model = "alibaba/qwen-turbo" +structured_output = true +reasoning_options = [] + +[cost] +input = 0.05 +output = 0.2 diff --git a/providers/requesty/models/alibaba/qwen3-coder-flash.toml b/providers/requesty/models/alibaba/qwen3-coder-flash.toml new file mode 100644 index 0000000000..114463be6b --- /dev/null +++ b/providers/requesty/models/alibaba/qwen3-coder-flash.toml @@ -0,0 +1,15 @@ +base_model = "alibaba/qwen3-coder-flash" +attachment = true +structured_output = true + +[cost] +input = 0.3 +output = 1.5 +cache_read = 0.08 +cache_write = 0.3 + +[limit] +context = 1_048_576 + +[modalities] +input = ["text", "image"] diff --git a/providers/requesty/models/alibaba/qwen3-coder-plus.toml b/providers/requesty/models/alibaba/qwen3-coder-plus.toml new file mode 100644 index 0000000000..0d54c623d9 --- /dev/null +++ b/providers/requesty/models/alibaba/qwen3-coder-plus.toml @@ -0,0 +1,10 @@ +base_model = "alibaba/qwen3-coder-plus" +attachment = true +structured_output = true + +[cost] +input = 1 +output = 5 + +[modalities] +input = ["text", "image"] diff --git a/providers/requesty/models/alibaba/qwen3-max.toml b/providers/requesty/models/alibaba/qwen3-max.toml new file mode 100644 index 0000000000..90b627bf10 --- /dev/null +++ b/providers/requesty/models/alibaba/qwen3-max.toml @@ -0,0 +1,10 @@ +base_model = "alibaba/qwen3-max" +attachment = true +structured_output = true + +[cost] +input = 0.861 +output = 3.441 + +[modalities] +input = ["text", "image"] diff --git a/providers/requesty/models/alibaba/qwen3.6-plus.toml b/providers/requesty/models/alibaba/qwen3.6-plus.toml new file mode 100644 index 0000000000..31f43fd9fa --- /dev/null +++ b/providers/requesty/models/alibaba/qwen3.6-plus.toml @@ -0,0 +1,10 @@ +base_model = "alibaba/qwen3.6-plus" +attachment = true +structured_output = true +reasoning_options = [] + +[cost] +input = 0.5 +output = 3 +cache_read = 0.05 +cache_write = 0.625 diff --git a/providers/requesty/models/alibaba/qwen3.7-max.toml b/providers/requesty/models/alibaba/qwen3.7-max.toml new file mode 100644 index 0000000000..22d302d182 --- /dev/null +++ b/providers/requesty/models/alibaba/qwen3.7-max.toml @@ -0,0 +1,12 @@ +base_model = "alibaba/qwen3.7-max" +structured_output = true +reasoning_options = [] + +[cost] +input = 2.5 +output = 7.5 +cache_read = 0.25 +cache_write = 3.125 + +[limit] +context = 1_048_576 diff --git a/providers/requesty/models/alibaba/qwen3.7-plus.toml b/providers/requesty/models/alibaba/qwen3.7-plus.toml new file mode 100644 index 0000000000..e5659e54d1 --- /dev/null +++ b/providers/requesty/models/alibaba/qwen3.7-plus.toml @@ -0,0 +1,14 @@ +base_model = "alibaba/qwen3.7-plus" +attachment = true +structured_output = true +reasoning_options = [] + +[cost] +input = 0.32 +output = 1.28 +cache_read = 0.032 +cache_write = 0.4 + +[limit] +context = 1_048_576 +output = 65_536 diff --git a/providers/requesty/models/anthropic/claude-fable-5.toml b/providers/requesty/models/anthropic/claude-fable-5.toml new file mode 100644 index 0000000000..685f20fb08 --- /dev/null +++ b/providers/requesty/models/anthropic/claude-fable-5.toml @@ -0,0 +1,15 @@ +base_model = "anthropic/claude-fable-5" +structured_output = true + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 10 +output = 50 +cache_read = 1 +cache_write = 12.5 diff --git a/providers/requesty/models/anthropic/claude-haiku-4-5.toml b/providers/requesty/models/anthropic/claude-haiku-4-5.toml index d2238e3fb5..01944a248b 100644 --- a/providers/requesty/models/anthropic/claude-haiku-4-5.toml +++ b/providers/requesty/models/anthropic/claude-haiku-4-5.toml @@ -5,21 +5,28 @@ release_date = "2025-10-15" last_updated = "2025-10-15" attachment = true reasoning = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] temperature = true tool_call = true +structured_output = true knowledge = "2025-02-01" open_weights = false +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + [cost] -input = 1.00 -output = 5.00 +input = 1 +output = 5 cache_read = 0.1 cache_write = 1.25 [limit] context = 200_000 -output = 62_000 +output = 64_000 [modalities] input = ["text", "image", "pdf"] diff --git a/providers/requesty/models/anthropic/claude-opus-4-1.toml b/providers/requesty/models/anthropic/claude-opus-4-1.toml index e98d82bf65..410e9e48dd 100644 --- a/providers/requesty/models/anthropic/claude-opus-4-1.toml +++ b/providers/requesty/models/anthropic/claude-opus-4-1.toml @@ -1,6 +1,12 @@ base_model = "anthropic/claude-opus-4-1-20250805" +structured_output = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" [cost] input = 15 diff --git a/providers/requesty/models/anthropic/claude-opus-4-5.toml b/providers/requesty/models/anthropic/claude-opus-4-5.toml index 8710c9a3c7..7be00beaaf 100644 --- a/providers/requesty/models/anthropic/claude-opus-4-5.toml +++ b/providers/requesty/models/anthropic/claude-opus-4-5.toml @@ -5,15 +5,22 @@ release_date = "2025-11-24" last_updated = "2025-11-24" attachment = true reasoning = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] temperature = true tool_call = true +structured_output = true knowledge = "2025-03-31" open_weights = false +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + [cost] -input = 5.00 -output = 25.00 +input = 5 +output = 25 cache_read = 0.5 cache_write = 6.25 diff --git a/providers/requesty/models/anthropic/claude-opus-4-7.toml b/providers/requesty/models/anthropic/claude-opus-4-7.toml new file mode 100644 index 0000000000..4c464ebf79 --- /dev/null +++ b/providers/requesty/models/anthropic/claude-opus-4-7.toml @@ -0,0 +1,15 @@ +base_model = "anthropic/claude-opus-4-7" +structured_output = true + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 5 +output = 25 +cache_read = 0.5 +cache_write = 6.25 diff --git a/providers/requesty/models/anthropic/claude-opus-4-8.toml b/providers/requesty/models/anthropic/claude-opus-4-8.toml new file mode 100644 index 0000000000..32911565b0 --- /dev/null +++ b/providers/requesty/models/anthropic/claude-opus-4-8.toml @@ -0,0 +1,15 @@ +base_model = "anthropic/claude-opus-4-8" +structured_output = true + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 5 +output = 25 +cache_read = 0.5 +cache_write = 6.25 diff --git a/providers/requesty/models/anthropic/claude-sonnet-4-5.toml b/providers/requesty/models/anthropic/claude-sonnet-4-5.toml index 612054daad..0d04a34bea 100644 --- a/providers/requesty/models/anthropic/claude-sonnet-4-5.toml +++ b/providers/requesty/models/anthropic/claude-sonnet-4-5.toml @@ -1,6 +1,12 @@ base_model = "anthropic/claude-sonnet-4-5-20250929" +structured_output = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" [cost] input = 3 diff --git a/providers/requesty/models/anthropic/claude-sonnet-4-6.toml b/providers/requesty/models/anthropic/claude-sonnet-4-6.toml index 186b6d51c4..508cf2ab74 100644 --- a/providers/requesty/models/anthropic/claude-sonnet-4-6.toml +++ b/providers/requesty/models/anthropic/claude-sonnet-4-6.toml @@ -5,30 +5,36 @@ release_date = "2026-02-17" last_updated = "2026-02-17" attachment = true reasoning = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] temperature = true tool_call = true structured_output = true knowledge = "2025-08-31" open_weights = false +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + [cost] -input = 3.00 -output = 15.00 -cache_read = 0.30 +input = 3 +output = 15 +cache_read = 0.3 cache_write = 3.75 [[cost.tiers]] -tier = { size = 200_000 } -input = 6.00 -output = 22.50 -cache_read = 0.60 -cache_write = 7.50 +tier = { type = "context", size = 200_000 } +input = 6 +output = 22.5 +cache_read = 0.6 +cache_write = 7.5 [limit] context = 1_000_000 -output = 128_000 +output = 64_000 [modalities] -input = ["text", "image"] +input = ["text", "image", "pdf"] output = ["text"] diff --git a/providers/requesty/models/anthropic/claude-sonnet-5.toml b/providers/requesty/models/anthropic/claude-sonnet-5.toml new file mode 100644 index 0000000000..ef08197229 --- /dev/null +++ b/providers/requesty/models/anthropic/claude-sonnet-5.toml @@ -0,0 +1,15 @@ +base_model = "anthropic/claude-sonnet-5" +structured_output = true + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 2 +output = 10 +cache_read = 0.2 +cache_write = 2.5 diff --git a/providers/requesty/models/deepseek/deepseek-chat.toml b/providers/requesty/models/deepseek/deepseek-chat.toml new file mode 100644 index 0000000000..e07c492dbf --- /dev/null +++ b/providers/requesty/models/deepseek/deepseek-chat.toml @@ -0,0 +1,8 @@ +base_model = "deepseek/deepseek-chat" +attachment = false +structured_output = true + +[cost] +input = 0.14 +output = 0.28 +cache_read = 0.028 diff --git a/providers/requesty/models/deepseek/deepseek-reasoner.toml b/providers/requesty/models/deepseek/deepseek-reasoner.toml new file mode 100644 index 0000000000..f286d0cde0 --- /dev/null +++ b/providers/requesty/models/deepseek/deepseek-reasoner.toml @@ -0,0 +1,9 @@ +base_model = "deepseek/deepseek-reasoner" +attachment = false +structured_output = true +reasoning_options = [] + +[cost] +input = 0.14 +output = 0.28 +cache_read = 0.028 diff --git a/providers/requesty/models/deepseek/deepseek-v4-flash.toml b/providers/requesty/models/deepseek/deepseek-v4-flash.toml new file mode 100644 index 0000000000..16e3dfec13 --- /dev/null +++ b/providers/requesty/models/deepseek/deepseek-v4-flash.toml @@ -0,0 +1,7 @@ +base_model = "deepseek/deepseek-v4-flash" +reasoning_options = [] + +[cost] +input = 0.14 +output = 0.28 +cache_read = 0.0028 diff --git a/providers/requesty/models/deepseek/deepseek-v4-pro.toml b/providers/requesty/models/deepseek/deepseek-v4-pro.toml new file mode 100644 index 0000000000..bd62eeb744 --- /dev/null +++ b/providers/requesty/models/deepseek/deepseek-v4-pro.toml @@ -0,0 +1,7 @@ +base_model = "deepseek/deepseek-v4-pro" +reasoning_options = [] + +[cost] +input = 0.435 +output = 0.87 +cache_read = 0.0145 diff --git a/providers/requesty/models/google/gemini-2.5-flash-lite.toml b/providers/requesty/models/google/gemini-2.5-flash-lite.toml new file mode 100644 index 0000000000..47ac3bff5a --- /dev/null +++ b/providers/requesty/models/google/gemini-2.5-flash-lite.toml @@ -0,0 +1,16 @@ +base_model = "google/gemini-2.5-flash-lite" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 0.1 +output = 0.4 +cache_read = 0.01 + +[limit] +output = 65_535 diff --git a/providers/requesty/models/google/gemini-2.5-flash.toml b/providers/requesty/models/google/gemini-2.5-flash.toml index c341820f3e..f92e0a0a62 100644 --- a/providers/requesty/models/google/gemini-2.5-flash.toml +++ b/providers/requesty/models/google/gemini-2.5-flash.toml @@ -5,21 +5,28 @@ release_date = "2025-06-17" last_updated = "2025-06-17" attachment = true reasoning = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] temperature = true -knowledge = "2025-01" tool_call = true +structured_output = true +knowledge = "2025-01" open_weights = false +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + [cost] -input = 0.30 -output = 2.50 +input = 0.3 +output = 2.5 cache_read = 0.075 cache_write = 0.55 [limit] context = 1_048_576 -output = 65_536 +output = 65_535 [modalities] input = ["text", "image", "audio", "video", "pdf"] diff --git a/providers/requesty/models/google/gemini-2.5-pro.toml b/providers/requesty/models/google/gemini-2.5-pro.toml index 87bcb7dff5..9c09fa539f 100644 --- a/providers/requesty/models/google/gemini-2.5-pro.toml +++ b/providers/requesty/models/google/gemini-2.5-pro.toml @@ -1,7 +1,12 @@ base_model = "google/gemini-2.5-pro" base_model_omit = ["structured_output"] -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" [cost] input = 1.25 @@ -14,3 +19,6 @@ tier = { type = "context", size = 200_000 } input = 2.5 output = 15 cache_read = 0.25 + +[limit] +output = 65_535 diff --git a/providers/requesty/models/google/gemini-3-flash-preview.toml b/providers/requesty/models/google/gemini-3-flash-preview.toml index ca138cdb2a..cdf3bf3343 100644 --- a/providers/requesty/models/google/gemini-3-flash-preview.toml +++ b/providers/requesty/models/google/gemini-3-flash-preview.toml @@ -4,12 +4,19 @@ release_date = "2025-12-17" last_updated = "2025-12-17" attachment = true reasoning = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] temperature = true -knowledge = "2025-01" tool_call = true +structured_output = true +knowledge = "2025-01" open_weights = false +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + [cost] input = 0.5 output = 3 @@ -18,7 +25,7 @@ cache_write = 1 [limit] context = 1_048_576 -output = 65_536 +output = 65_535 [modalities] input = ["text", "image", "audio", "video", "pdf"] diff --git a/providers/requesty/models/google/gemini-3-pro-preview.toml b/providers/requesty/models/google/gemini-3-pro-preview.toml index 037e789bfc..21dacadb44 100644 --- a/providers/requesty/models/google/gemini-3-pro-preview.toml +++ b/providers/requesty/models/google/gemini-3-pro-preview.toml @@ -5,21 +5,28 @@ release_date = "2025-11-18" last_updated = "2025-11-18" attachment = true reasoning = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] temperature = true -knowledge = "2025-01" tool_call = true +structured_output = true +knowledge = "2025-01" open_weights = false +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + [cost] -input = 2.00 -output = 12.00 +input = 2 +output = 12 cache_read = 0.2 -cache_write = 4.50 +cache_write = 4.5 [limit] context = 1_048_576 -output = 65_536 +output = 65_535 [modalities] input = ["text", "image", "audio", "video", "pdf"] diff --git a/providers/requesty/models/google/gemini-3.1-flash-image-preview.toml b/providers/requesty/models/google/gemini-3.1-flash-image-preview.toml new file mode 100644 index 0000000000..d3f3ff82b3 --- /dev/null +++ b/providers/requesty/models/google/gemini-3.1-flash-image-preview.toml @@ -0,0 +1,19 @@ +base_model = "google/gemini-3.1-flash-image-preview" +structured_output = false + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 0.5 +output = 2 +cache_read = 0 +cache_write = 0 + +[limit] +context = 131_072 +output = 32_768 diff --git a/providers/requesty/models/google/gemini-3.1-flash-lite-preview.toml b/providers/requesty/models/google/gemini-3.1-flash-lite-preview.toml new file mode 100644 index 0000000000..c1e9c12bbb --- /dev/null +++ b/providers/requesty/models/google/gemini-3.1-flash-lite-preview.toml @@ -0,0 +1,16 @@ +base_model = "google/gemini-3.1-flash-lite-preview" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 0.25 +output = 1.5 +cache_read = 0.025 + +[limit] +output = 65_535 diff --git a/providers/requesty/models/google/gemini-3.1-pro-preview.toml b/providers/requesty/models/google/gemini-3.1-pro-preview.toml new file mode 100644 index 0000000000..15bcd070cf --- /dev/null +++ b/providers/requesty/models/google/gemini-3.1-pro-preview.toml @@ -0,0 +1,17 @@ +base_model = "google/gemini-3.1-pro-preview" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 2 +output = 12 +cache_read = 0.2 +cache_write = 4.5 + +[limit] +output = 65_535 diff --git a/providers/requesty/models/google/gemma-4-31b-it.toml b/providers/requesty/models/google/gemma-4-31b-it.toml new file mode 100644 index 0000000000..7d7fc64cce --- /dev/null +++ b/providers/requesty/models/google/gemma-4-31b-it.toml @@ -0,0 +1,10 @@ +base_model = "google/gemma-4-31b-it" +structured_output = false +reasoning_options = [] + +[cost] +input = 0 +output = 0 + +[limit] +output = 8_192 diff --git a/providers/requesty/models/nvidia/nemotron-3-nano-30b-a3b.toml b/providers/requesty/models/nvidia/nemotron-3-nano-30b-a3b.toml new file mode 100644 index 0000000000..69ce06e8b1 --- /dev/null +++ b/providers/requesty/models/nvidia/nemotron-3-nano-30b-a3b.toml @@ -0,0 +1,7 @@ +base_model = "nvidia/nemotron-3-nano-30b-a3b" +structured_output = false +reasoning_options = [] + +[cost] +input = 0 +output = 0 diff --git a/providers/requesty/models/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning.toml b/providers/requesty/models/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning.toml new file mode 100644 index 0000000000..7bb9a33108 --- /dev/null +++ b/providers/requesty/models/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning.toml @@ -0,0 +1,11 @@ +base_model = "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning" +structured_output = false +reasoning_options = [] + +[cost] +input = 0 +output = 0 + +[limit] +context = 131_072 +output = 20_480 diff --git a/providers/requesty/models/nvidia/nemotron-3-super-120b-a12b.toml b/providers/requesty/models/nvidia/nemotron-3-super-120b-a12b.toml new file mode 100644 index 0000000000..3069ade1dd --- /dev/null +++ b/providers/requesty/models/nvidia/nemotron-3-super-120b-a12b.toml @@ -0,0 +1,11 @@ +base_model = "nvidia/nemotron-3-super-120b-a12b" +structured_output = false +reasoning_options = [] + +[cost] +input = 0 +output = 0 + +[limit] +context = 1_048_576 +output = 65_536 diff --git a/providers/requesty/models/nvidia/nemotron-3-ultra-550b-a55b.toml b/providers/requesty/models/nvidia/nemotron-3-ultra-550b-a55b.toml new file mode 100644 index 0000000000..9bbbcda0cb --- /dev/null +++ b/providers/requesty/models/nvidia/nemotron-3-ultra-550b-a55b.toml @@ -0,0 +1,11 @@ +base_model = "nvidia/nemotron-3-ultra-550b-a55b" +structured_output = false +reasoning_options = [] + +[cost] +input = 0 +output = 0 + +[limit] +context = 1_048_576 +output = 65_536 diff --git a/providers/requesty/models/openai-responses/gpt-5.4-mini.toml b/providers/requesty/models/openai-responses/gpt-5.4-mini.toml new file mode 100644 index 0000000000..81e1240e2d --- /dev/null +++ b/providers/requesty/models/openai-responses/gpt-5.4-mini.toml @@ -0,0 +1,17 @@ +base_model = "openai/gpt-5.4-mini" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 0.75 +output = 4.5 +cache_read = 0.075 + +[provider] +npm = "@ai-sdk/openai" +shape = "responses" diff --git a/providers/requesty/models/openai-responses/gpt-5.4-nano.toml b/providers/requesty/models/openai-responses/gpt-5.4-nano.toml new file mode 100644 index 0000000000..380d77ab46 --- /dev/null +++ b/providers/requesty/models/openai-responses/gpt-5.4-nano.toml @@ -0,0 +1,17 @@ +base_model = "openai/gpt-5.4-nano" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 0.2 +output = 1.25 +cache_read = 0.02 + +[provider] +npm = "@ai-sdk/openai" +shape = "responses" diff --git a/providers/requesty/models/openai-responses/gpt-5.5.toml b/providers/requesty/models/openai-responses/gpt-5.5.toml new file mode 100644 index 0000000000..dff17b35af --- /dev/null +++ b/providers/requesty/models/openai-responses/gpt-5.5.toml @@ -0,0 +1,17 @@ +base_model = "openai/gpt-5.5" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 5 +output = 30 +cache_read = 0.5 + +[provider] +npm = "@ai-sdk/openai" +shape = "responses" diff --git a/providers/requesty/models/openai-responses/gpt-5.6-luna.toml b/providers/requesty/models/openai-responses/gpt-5.6-luna.toml new file mode 100644 index 0000000000..153b58b13a --- /dev/null +++ b/providers/requesty/models/openai-responses/gpt-5.6-luna.toml @@ -0,0 +1,17 @@ +base_model = "openai/gpt-5.6-luna" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 1 +output = 6 +cache_read = 0.1 + +[provider] +npm = "@ai-sdk/openai" +shape = "responses" diff --git a/providers/requesty/models/openai-responses/gpt-5.6-sol.toml b/providers/requesty/models/openai-responses/gpt-5.6-sol.toml new file mode 100644 index 0000000000..ef8bf3f0d3 --- /dev/null +++ b/providers/requesty/models/openai-responses/gpt-5.6-sol.toml @@ -0,0 +1,17 @@ +base_model = "openai/gpt-5.6-sol" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 5 +output = 30 +cache_read = 0.5 + +[provider] +npm = "@ai-sdk/openai" +shape = "responses" diff --git a/providers/requesty/models/openai-responses/gpt-5.6-terra.toml b/providers/requesty/models/openai-responses/gpt-5.6-terra.toml new file mode 100644 index 0000000000..312c651a40 --- /dev/null +++ b/providers/requesty/models/openai-responses/gpt-5.6-terra.toml @@ -0,0 +1,17 @@ +base_model = "openai/gpt-5.6-terra" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 2.5 +output = 15 +cache_read = 0.25 + +[provider] +npm = "@ai-sdk/openai" +shape = "responses" diff --git a/providers/requesty/models/openai/gpt-4.1-mini.toml b/providers/requesty/models/openai/gpt-4.1-mini.toml index 5b1b2499bc..cf48501957 100644 --- a/providers/requesty/models/openai/gpt-4.1-mini.toml +++ b/providers/requesty/models/openai/gpt-4.1-mini.toml @@ -7,18 +7,19 @@ attachment = true reasoning = false temperature = true tool_call = true +structured_output = true knowledge = "2024-04" open_weights = false [cost] -input = 0.40 -output = 1.60 -cache_read = 0.10 +input = 0.4 +output = 1.6 +cache_read = 0.1 [limit] context = 1_047_576 output = 32_768 [modalities] -input = ["text", "image"] +input = ["text", "image", "pdf"] output = ["text"] diff --git a/providers/requesty/models/openai/gpt-4.1-nano.toml b/providers/requesty/models/openai/gpt-4.1-nano.toml new file mode 100644 index 0000000000..f85c094770 --- /dev/null +++ b/providers/requesty/models/openai/gpt-4.1-nano.toml @@ -0,0 +1,6 @@ +base_model = "openai/gpt-4.1-nano" + +[cost] +input = 0.1 +output = 0.4 +cache_read = 0.025 diff --git a/providers/requesty/models/openai/gpt-4.1.toml b/providers/requesty/models/openai/gpt-4.1.toml index 67e617230a..0501119e22 100644 --- a/providers/requesty/models/openai/gpt-4.1.toml +++ b/providers/requesty/models/openai/gpt-4.1.toml @@ -5,6 +5,3 @@ base_model_omit = ["structured_output"] input = 2 output = 8 cache_read = 0.5 - -[modalities] -input = ["text", "image"] diff --git a/providers/requesty/models/openai/gpt-4o-2024-05-13.toml b/providers/requesty/models/openai/gpt-4o-2024-05-13.toml new file mode 100644 index 0000000000..d2d5d312e7 --- /dev/null +++ b/providers/requesty/models/openai/gpt-4o-2024-05-13.toml @@ -0,0 +1,7 @@ +base_model = "openai/gpt-4o-2024-05-13" +structured_output = false + +[cost] +input = 2.5 +output = 10 +cache_read = 2.5 diff --git a/providers/requesty/models/openai/gpt-4o-2024-08-06.toml b/providers/requesty/models/openai/gpt-4o-2024-08-06.toml new file mode 100644 index 0000000000..344cd161a7 --- /dev/null +++ b/providers/requesty/models/openai/gpt-4o-2024-08-06.toml @@ -0,0 +1,6 @@ +base_model = "openai/gpt-4o-2024-08-06" + +[cost] +input = 2.5 +output = 10 +cache_read = 1.25 diff --git a/providers/requesty/models/openai/gpt-4o-2024-11-20.toml b/providers/requesty/models/openai/gpt-4o-2024-11-20.toml new file mode 100644 index 0000000000..c807afdbe1 --- /dev/null +++ b/providers/requesty/models/openai/gpt-4o-2024-11-20.toml @@ -0,0 +1,6 @@ +base_model = "openai/gpt-4o-2024-11-20" + +[cost] +input = 2.5 +output = 10 +cache_read = 1.25 diff --git a/providers/requesty/models/openai/gpt-4o-mini.toml b/providers/requesty/models/openai/gpt-4o-mini.toml index cbf5bc6092..86a921f094 100644 --- a/providers/requesty/models/openai/gpt-4o-mini.toml +++ b/providers/requesty/models/openai/gpt-4o-mini.toml @@ -7,18 +7,19 @@ attachment = true reasoning = false temperature = true tool_call = true +structured_output = true knowledge = "2024-10" open_weights = false [cost] input = 0.15 -output = 0.60 -cache_read = 0.08 +output = 0.6 +cache_read = 0.075 [limit] context = 128_000 output = 16_384 [modalities] -input = ["text", "image"] +input = ["text", "image", "pdf"] output = ["text"] diff --git a/providers/requesty/models/openai/gpt-4o.toml b/providers/requesty/models/openai/gpt-4o.toml new file mode 100644 index 0000000000..1b57e52012 --- /dev/null +++ b/providers/requesty/models/openai/gpt-4o.toml @@ -0,0 +1,6 @@ +base_model = "openai/gpt-4o" + +[cost] +input = 2.5 +output = 10 +cache_read = 1.25 diff --git a/providers/requesty/models/openai/gpt-5-mini.toml b/providers/requesty/models/openai/gpt-5-mini.toml index 62e297e5c2..eaf3473843 100644 --- a/providers/requesty/models/openai/gpt-5-mini.toml +++ b/providers/requesty/models/openai/gpt-5-mini.toml @@ -5,20 +5,28 @@ release_date = "2025-08-07" last_updated = "2025-08-07" attachment = true reasoning = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] temperature = false -knowledge = "2024-05-30" tool_call = true +structured_output = true +knowledge = "2024-05-30" open_weights = false +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + [cost] input = 0.25 -output = 2.00 -cache_read = 0.03 +output = 2 +cache_read = 0.025 [limit] -context = 128_000 -output = 32_000 +context = 400_000 +input = 272_000 +output = 128_000 [modalities] input = ["text", "image"] diff --git a/providers/requesty/models/openai/gpt-5-nano.toml b/providers/requesty/models/openai/gpt-5-nano.toml index 316044c999..92ea325e90 100644 --- a/providers/requesty/models/openai/gpt-5-nano.toml +++ b/providers/requesty/models/openai/gpt-5-nano.toml @@ -5,21 +5,29 @@ release_date = "2025-08-07" last_updated = "2025-08-07" attachment = true reasoning = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] temperature = false -knowledge = "2024-05-30" tool_call = true +structured_output = true +knowledge = "2024-05-30" open_weights = false +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + [cost] input = 0.05 -output = 0.40 -cache_read = 0.01 +output = 0.4 +cache_read = 0.005 [limit] -context = 16_000 -output = 4_000 +context = 400_000 +input = 272_000 +output = 128_000 [modalities] -input = ["text"] +input = ["text", "image"] output = ["text"] diff --git a/providers/requesty/models/openai/gpt-5.1.toml b/providers/requesty/models/openai/gpt-5.1.toml index d2c6bc22e6..344ea9f9dc 100644 --- a/providers/requesty/models/openai/gpt-5.1.toml +++ b/providers/requesty/models/openai/gpt-5.1.toml @@ -5,20 +5,27 @@ release_date = "2025-11-13" last_updated = "2025-11-13" attachment = true reasoning = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] temperature = true -knowledge = "2024-09-30" tool_call = true structured_output = true +knowledge = "2024-09-30" open_weights = false +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + [cost] input = 1.25 -output = 10.00 +output = 10 cache_read = 0.125 [limit] context = 400_000 +input = 272_000 output = 128_000 [modalities] diff --git a/providers/requesty/models/openai/gpt-5.toml b/providers/requesty/models/openai/gpt-5.toml index 390940407f..644f0ae61c 100644 --- a/providers/requesty/models/openai/gpt-5.toml +++ b/providers/requesty/models/openai/gpt-5.toml @@ -5,19 +5,27 @@ release_date = "2025-08-07" last_updated = "2025-08-07" attachment = true reasoning = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] temperature = false -knowledge = "2024-09-30" tool_call = true +structured_output = true +knowledge = "2024-09-30" open_weights = false +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + [cost] input = 1.25 -output = 10.00 -cache_read = 0.13 +output = 10 +cache_read = 0.125 [limit] context = 400_000 +input = 272_000 output = 128_000 [modalities] diff --git a/providers/requesty/models/openai/o1.toml b/providers/requesty/models/openai/o1.toml new file mode 100644 index 0000000000..3d902b37b4 --- /dev/null +++ b/providers/requesty/models/openai/o1.toml @@ -0,0 +1,13 @@ +base_model = "openai/o1" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 15 +output = 60 +cache_read = 7.5 diff --git a/providers/requesty/models/openai/o3-mini.toml b/providers/requesty/models/openai/o3-mini.toml new file mode 100644 index 0000000000..43618ef6ae --- /dev/null +++ b/providers/requesty/models/openai/o3-mini.toml @@ -0,0 +1,13 @@ +base_model = "openai/o3-mini" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 1.1 +output = 4.4 +cache_read = 0.55 diff --git a/providers/requesty/models/openai/o3.toml b/providers/requesty/models/openai/o3.toml new file mode 100644 index 0000000000..3a1118eec9 --- /dev/null +++ b/providers/requesty/models/openai/o3.toml @@ -0,0 +1,13 @@ +base_model = "openai/o3" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 2 +output = 8 +cache_read = 0.5 diff --git a/providers/requesty/models/openai/o4-mini.toml b/providers/requesty/models/openai/o4-mini.toml index b6f4f9b660..836207d921 100644 --- a/providers/requesty/models/openai/o4-mini.toml +++ b/providers/requesty/models/openai/o4-mini.toml @@ -5,16 +5,23 @@ release_date = "2025-04-16" last_updated = "2025-04-16" attachment = true reasoning = true -reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }, { type = "budget_tokens" }] temperature = true tool_call = true +structured_output = true knowledge = "2024-06" open_weights = false +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[[reasoning_options]] +type = "budget_tokens" + [cost] -input = 1.10 -output = 4.40 -cache_read = 0.28 +input = 1.1 +output = 4.4 +cache_read = 0.275 [limit] context = 200_000 diff --git a/providers/requesty/models/xai/grok-4.3.toml b/providers/requesty/models/xai/grok-4.3.toml new file mode 100644 index 0000000000..2202f0cc7f --- /dev/null +++ b/providers/requesty/models/xai/grok-4.3.toml @@ -0,0 +1,8 @@ +base_model = "xai/grok-4.3" +reasoning_options = [] + +[cost] +input = 1.25 +output = 2.5 +cache_read = 0.2 +cache_write = 1.25 diff --git a/providers/requesty/models/xai/grok-4.5.toml b/providers/requesty/models/xai/grok-4.5.toml new file mode 100644 index 0000000000..b107b86b7a --- /dev/null +++ b/providers/requesty/models/xai/grok-4.5.toml @@ -0,0 +1,8 @@ +base_model = "xai/grok-4.5" +reasoning_options = [] + +[cost] +input = 2 +output = 6 +cache_read = 0.5 +cache_write = 2 diff --git a/providers/requesty/models/xai/grok-build-0.1.toml b/providers/requesty/models/xai/grok-build-0.1.toml new file mode 100644 index 0000000000..fc1b5417d5 --- /dev/null +++ b/providers/requesty/models/xai/grok-build-0.1.toml @@ -0,0 +1,7 @@ +base_model = "xai/grok-build-0.1" +reasoning_options = [] + +[cost] +input = 1 +output = 2 +cache_read = 0.1 diff --git a/providers/requesty/models/xiaomi/mimo-v2.5-pro.toml b/providers/requesty/models/xiaomi/mimo-v2.5-pro.toml new file mode 100644 index 0000000000..8756f262ac --- /dev/null +++ b/providers/requesty/models/xiaomi/mimo-v2.5-pro.toml @@ -0,0 +1,8 @@ +base_model = "xiaomi/mimo-v2.5-pro" +structured_output = false +reasoning_options = [] + +[cost] +input = 0.435 +output = 0.87 +cache_read = 0.0036 diff --git a/providers/requesty/models/xiaomi/mimo-v2.5.toml b/providers/requesty/models/xiaomi/mimo-v2.5.toml new file mode 100644 index 0000000000..3881b6be3a --- /dev/null +++ b/providers/requesty/models/xiaomi/mimo-v2.5.toml @@ -0,0 +1,8 @@ +base_model = "xiaomi/mimo-v2.5" +structured_output = false +reasoning_options = [] + +[cost] +input = 0.14 +output = 0.28 +cache_read = 0.0028 diff --git a/providers/requesty/models/zai/glm-5.1.toml b/providers/requesty/models/zai/glm-5.1.toml new file mode 100644 index 0000000000..852f77a689 --- /dev/null +++ b/providers/requesty/models/zai/glm-5.1.toml @@ -0,0 +1,15 @@ +base_model = "zhipuai/glm-5.1" +attachment = true +structured_output = false +reasoning_options = [] + +[cost] +input = 1.4 +output = 4.4 +cache_read = 0.26 + +[limit] +output = 128_000 + +[modalities] +input = ["text", "image"] diff --git a/providers/requesty/models/zai/glm-5.2.toml b/providers/requesty/models/zai/glm-5.2.toml new file mode 100644 index 0000000000..4ee091b3be --- /dev/null +++ b/providers/requesty/models/zai/glm-5.2.toml @@ -0,0 +1,15 @@ +base_model = "zhipuai/glm-5.2" +attachment = true +structured_output = false +reasoning_options = [] + +[cost] +input = 1.4 +output = 4.4 +cache_read = 0.26 + +[limit] +output = 128_000 + +[modalities] +input = ["text", "image"]