mirror of
https://github.com/simstudioai/sim.git
synced 2026-02-06 20:55:23 -05:00
2519 lines
60 KiB
TypeScript
2519 lines
60 KiB
TypeScript
/**
|
|
* Comprehensive provider definitions - Single source of truth
|
|
* This file contains all provider and model information including:
|
|
* - Model lists
|
|
* - Pricing information
|
|
* - Model capabilities (temperature support, etc.)
|
|
* - Provider configurations
|
|
*/
|
|
|
|
import type React from 'react'
|
|
import {
|
|
AnthropicIcon,
|
|
AzureIcon,
|
|
BedrockIcon,
|
|
CerebrasIcon,
|
|
DeepseekIcon,
|
|
GeminiIcon,
|
|
GroqIcon,
|
|
MistralIcon,
|
|
OllamaIcon,
|
|
OpenAIIcon,
|
|
OpenRouterIcon,
|
|
VertexIcon,
|
|
VllmIcon,
|
|
xAIIcon,
|
|
} from '@/components/icons'
|
|
import type { ModelPricing } from '@/providers/types'
|
|
|
|
export interface ModelCapabilities {
|
|
temperature?: {
|
|
min: number
|
|
max: number
|
|
}
|
|
toolUsageControl?: boolean
|
|
computerUse?: boolean
|
|
nativeStructuredOutputs?: boolean
|
|
/**
|
|
* Max output tokens configuration for Anthropic SDK's streaming timeout workaround.
|
|
* The Anthropic SDK throws an error for non-streaming requests that may take >10 minutes.
|
|
* This only applies to direct Anthropic API calls, not Bedrock (which uses AWS SDK).
|
|
*/
|
|
maxOutputTokens?: {
|
|
/** Maximum supported output tokens (used for streaming requests) */
|
|
max: number
|
|
/** Conservative default when user doesn't specify maxTokens (controls cost/latency) */
|
|
default: number
|
|
}
|
|
reasoningEffort?: {
|
|
values: string[]
|
|
}
|
|
verbosity?: {
|
|
values: string[]
|
|
}
|
|
thinking?: {
|
|
levels: string[]
|
|
default?: string
|
|
}
|
|
}
|
|
|
|
export interface ModelDefinition {
|
|
id: string
|
|
pricing: ModelPricing
|
|
capabilities: ModelCapabilities
|
|
contextWindow?: number
|
|
}
|
|
|
|
export interface ProviderDefinition {
|
|
id: string
|
|
name: string
|
|
description: string
|
|
models: ModelDefinition[]
|
|
defaultModel: string
|
|
modelPatterns?: RegExp[]
|
|
icon?: React.ComponentType<{ className?: string }>
|
|
capabilities?: ModelCapabilities
|
|
contextInformationAvailable?: boolean
|
|
}
|
|
|
|
export const PROVIDER_DEFINITIONS: Record<string, ProviderDefinition> = {
|
|
openrouter: {
|
|
id: 'openrouter',
|
|
name: 'OpenRouter',
|
|
description: 'Unified access to many models via OpenRouter',
|
|
defaultModel: '',
|
|
modelPatterns: [/^openrouter\//],
|
|
icon: OpenRouterIcon,
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
toolUsageControl: true,
|
|
},
|
|
contextInformationAvailable: false,
|
|
models: [],
|
|
},
|
|
vllm: {
|
|
id: 'vllm',
|
|
name: 'vLLM',
|
|
icon: VllmIcon,
|
|
description: 'Self-hosted vLLM with an OpenAI-compatible API',
|
|
defaultModel: 'vllm/generic',
|
|
modelPatterns: [/^vllm\//],
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
toolUsageControl: true,
|
|
},
|
|
models: [],
|
|
},
|
|
openai: {
|
|
id: 'openai',
|
|
name: 'OpenAI',
|
|
description: "OpenAI's models",
|
|
defaultModel: 'gpt-4o',
|
|
modelPatterns: [/^gpt/, /^o\d/, /^text-embedding/],
|
|
icon: OpenAIIcon,
|
|
capabilities: {
|
|
toolUsageControl: true,
|
|
},
|
|
models: [
|
|
{
|
|
id: 'gpt-4o',
|
|
pricing: {
|
|
input: 2.5,
|
|
cachedInput: 1.25,
|
|
output: 10.0,
|
|
updatedAt: '2025-06-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'gpt-5.2',
|
|
pricing: {
|
|
input: 1.75,
|
|
cachedInput: 0.175,
|
|
output: 14.0,
|
|
updatedAt: '2025-12-11',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['none', 'low', 'medium', 'high', 'xhigh'],
|
|
},
|
|
verbosity: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 400000,
|
|
},
|
|
{
|
|
id: 'gpt-5.1',
|
|
pricing: {
|
|
input: 1.25,
|
|
cachedInput: 0.125,
|
|
output: 10.0,
|
|
updatedAt: '2025-11-14',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['none', 'low', 'medium', 'high'],
|
|
},
|
|
verbosity: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 400000,
|
|
},
|
|
{
|
|
id: 'gpt-5',
|
|
pricing: {
|
|
input: 1.25,
|
|
cachedInput: 0.125,
|
|
output: 10.0,
|
|
updatedAt: '2025-08-07',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['minimal', 'low', 'medium', 'high'],
|
|
},
|
|
verbosity: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 400000,
|
|
},
|
|
{
|
|
id: 'gpt-5-mini',
|
|
pricing: {
|
|
input: 0.25,
|
|
cachedInput: 0.025,
|
|
output: 2.0,
|
|
updatedAt: '2025-08-07',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['minimal', 'low', 'medium', 'high'],
|
|
},
|
|
verbosity: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 400000,
|
|
},
|
|
{
|
|
id: 'gpt-5-nano',
|
|
pricing: {
|
|
input: 0.05,
|
|
cachedInput: 0.005,
|
|
output: 0.4,
|
|
updatedAt: '2025-08-07',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['minimal', 'low', 'medium', 'high'],
|
|
},
|
|
verbosity: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 400000,
|
|
},
|
|
{
|
|
id: 'gpt-5-chat-latest',
|
|
pricing: {
|
|
input: 1.25,
|
|
cachedInput: 0.125,
|
|
output: 10.0,
|
|
updatedAt: '2025-08-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'o1',
|
|
pricing: {
|
|
input: 15.0,
|
|
cachedInput: 7.5,
|
|
output: 60,
|
|
updatedAt: '2025-06-17',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'o3',
|
|
pricing: {
|
|
input: 2,
|
|
cachedInput: 0.5,
|
|
output: 8,
|
|
updatedAt: '2025-06-17',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'o4-mini',
|
|
pricing: {
|
|
input: 1.1,
|
|
cachedInput: 0.275,
|
|
output: 4.4,
|
|
updatedAt: '2025-06-17',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'gpt-4.1',
|
|
pricing: {
|
|
input: 2.0,
|
|
cachedInput: 0.5,
|
|
output: 8.0,
|
|
updatedAt: '2025-06-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'gpt-4.1-nano',
|
|
pricing: {
|
|
input: 0.1,
|
|
cachedInput: 0.025,
|
|
output: 0.4,
|
|
updatedAt: '2025-06-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'gpt-4.1-mini',
|
|
pricing: {
|
|
input: 0.4,
|
|
cachedInput: 0.1,
|
|
output: 1.6,
|
|
updatedAt: '2025-06-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
],
|
|
},
|
|
anthropic: {
|
|
id: 'anthropic',
|
|
name: 'Anthropic',
|
|
description: "Anthropic's Claude models",
|
|
defaultModel: 'claude-sonnet-4-5',
|
|
modelPatterns: [/^claude/],
|
|
icon: AnthropicIcon,
|
|
capabilities: {
|
|
toolUsageControl: true,
|
|
},
|
|
models: [
|
|
{
|
|
id: 'claude-opus-4-6',
|
|
pricing: {
|
|
input: 5.0,
|
|
cachedInput: 0.5,
|
|
output: 25.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
maxOutputTokens: { max: 128000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high', 'max'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'claude-opus-4-5',
|
|
pricing: {
|
|
input: 5.0,
|
|
cachedInput: 0.5,
|
|
output: 25.0,
|
|
updatedAt: '2025-11-24',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
maxOutputTokens: { max: 64000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'claude-opus-4-1',
|
|
pricing: {
|
|
input: 15.0,
|
|
cachedInput: 1.5,
|
|
output: 75.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
maxOutputTokens: { max: 32000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'claude-opus-4-0',
|
|
pricing: {
|
|
input: 15.0,
|
|
cachedInput: 1.5,
|
|
output: 75.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
maxOutputTokens: { max: 32000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'claude-sonnet-4-5',
|
|
pricing: {
|
|
input: 3.0,
|
|
cachedInput: 0.3,
|
|
output: 15.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
maxOutputTokens: { max: 64000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'claude-sonnet-4-0',
|
|
pricing: {
|
|
input: 3.0,
|
|
cachedInput: 0.3,
|
|
output: 15.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
maxOutputTokens: { max: 64000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'claude-haiku-4-5',
|
|
pricing: {
|
|
input: 1.0,
|
|
cachedInput: 0.1,
|
|
output: 5.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
maxOutputTokens: { max: 64000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'claude-3-haiku-20240307',
|
|
pricing: {
|
|
input: 0.25,
|
|
cachedInput: 0.03,
|
|
output: 1.25,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
maxOutputTokens: { max: 4096, default: 4096 },
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'claude-3-7-sonnet-latest',
|
|
pricing: {
|
|
input: 3.0,
|
|
cachedInput: 0.3,
|
|
output: 15.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
computerUse: true,
|
|
maxOutputTokens: { max: 64000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
],
|
|
},
|
|
'azure-openai': {
|
|
id: 'azure-openai',
|
|
name: 'Azure OpenAI',
|
|
description: 'Microsoft Azure OpenAI Service models',
|
|
defaultModel: 'azure/gpt-4o',
|
|
modelPatterns: [/^azure\//],
|
|
capabilities: {
|
|
toolUsageControl: true,
|
|
},
|
|
icon: AzureIcon,
|
|
models: [
|
|
{
|
|
id: 'azure/gpt-4o',
|
|
pricing: {
|
|
input: 2.5,
|
|
cachedInput: 1.25,
|
|
output: 10.0,
|
|
updatedAt: '2025-06-15',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'azure/gpt-5.2',
|
|
pricing: {
|
|
input: 1.75,
|
|
cachedInput: 0.175,
|
|
output: 14.0,
|
|
updatedAt: '2025-12-11',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['none', 'low', 'medium', 'high', 'xhigh'],
|
|
},
|
|
verbosity: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 400000,
|
|
},
|
|
{
|
|
id: 'azure/gpt-5.1',
|
|
pricing: {
|
|
input: 1.25,
|
|
cachedInput: 0.125,
|
|
output: 10.0,
|
|
updatedAt: '2025-11-14',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['none', 'low', 'medium', 'high'],
|
|
},
|
|
verbosity: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 400000,
|
|
},
|
|
{
|
|
id: 'azure/gpt-5.1-codex',
|
|
pricing: {
|
|
input: 1.25,
|
|
cachedInput: 0.125,
|
|
output: 10.0,
|
|
updatedAt: '2025-11-14',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['none', 'low', 'medium', 'high'],
|
|
},
|
|
verbosity: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 400000,
|
|
},
|
|
{
|
|
id: 'azure/gpt-5',
|
|
pricing: {
|
|
input: 1.25,
|
|
cachedInput: 0.125,
|
|
output: 10.0,
|
|
updatedAt: '2025-08-07',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['minimal', 'low', 'medium', 'high'],
|
|
},
|
|
verbosity: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 400000,
|
|
},
|
|
{
|
|
id: 'azure/gpt-5-mini',
|
|
pricing: {
|
|
input: 0.25,
|
|
cachedInput: 0.025,
|
|
output: 2.0,
|
|
updatedAt: '2025-08-07',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['minimal', 'low', 'medium', 'high'],
|
|
},
|
|
verbosity: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 400000,
|
|
},
|
|
{
|
|
id: 'azure/gpt-5-nano',
|
|
pricing: {
|
|
input: 0.05,
|
|
cachedInput: 0.005,
|
|
output: 0.4,
|
|
updatedAt: '2025-08-07',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['minimal', 'low', 'medium', 'high'],
|
|
},
|
|
verbosity: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 400000,
|
|
},
|
|
{
|
|
id: 'azure/gpt-5-chat-latest',
|
|
pricing: {
|
|
input: 1.25,
|
|
cachedInput: 0.125,
|
|
output: 10.0,
|
|
updatedAt: '2025-08-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'azure/o3',
|
|
pricing: {
|
|
input: 2,
|
|
cachedInput: 0.5,
|
|
output: 8,
|
|
updatedAt: '2026-02-06',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'azure/o4-mini',
|
|
pricing: {
|
|
input: 1.1,
|
|
cachedInput: 0.275,
|
|
output: 4.4,
|
|
updatedAt: '2025-06-15',
|
|
},
|
|
capabilities: {
|
|
reasoningEffort: {
|
|
values: ['low', 'medium', 'high'],
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'azure/gpt-4.1',
|
|
pricing: {
|
|
input: 2.0,
|
|
cachedInput: 0.5,
|
|
output: 8.0,
|
|
updatedAt: '2025-06-15',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'azure/gpt-4.1-mini',
|
|
pricing: {
|
|
input: 0.4,
|
|
cachedInput: 0.1,
|
|
output: 1.6,
|
|
updatedAt: '2025-06-15',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'azure/gpt-4.1-nano',
|
|
pricing: {
|
|
input: 0.1,
|
|
cachedInput: 0.025,
|
|
output: 0.4,
|
|
updatedAt: '2025-06-15',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'azure/model-router',
|
|
pricing: {
|
|
input: 2.0,
|
|
cachedInput: 0.5,
|
|
output: 8.0,
|
|
updatedAt: '2025-06-15',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 200000,
|
|
},
|
|
],
|
|
},
|
|
'azure-anthropic': {
|
|
id: 'azure-anthropic',
|
|
name: 'Azure Anthropic',
|
|
description: 'Anthropic Claude models via Azure AI Foundry',
|
|
defaultModel: 'azure-anthropic/claude-sonnet-4-5',
|
|
modelPatterns: [/^azure-anthropic\//],
|
|
icon: AzureIcon,
|
|
capabilities: {
|
|
toolUsageControl: true,
|
|
},
|
|
models: [
|
|
{
|
|
id: 'azure-anthropic/claude-opus-4-6',
|
|
pricing: {
|
|
input: 5.0,
|
|
cachedInput: 0.5,
|
|
output: 25.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
maxOutputTokens: { max: 128000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high', 'max'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'azure-anthropic/claude-opus-4-5',
|
|
pricing: {
|
|
input: 5.0,
|
|
cachedInput: 0.5,
|
|
output: 25.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
maxOutputTokens: { max: 64000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'azure-anthropic/claude-sonnet-4-5',
|
|
pricing: {
|
|
input: 3.0,
|
|
cachedInput: 0.3,
|
|
output: 15.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
maxOutputTokens: { max: 64000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'azure-anthropic/claude-opus-4-1',
|
|
pricing: {
|
|
input: 15.0,
|
|
cachedInput: 1.5,
|
|
output: 75.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
maxOutputTokens: { max: 32000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'azure-anthropic/claude-haiku-4-5',
|
|
pricing: {
|
|
input: 1.0,
|
|
cachedInput: 0.1,
|
|
output: 5.0,
|
|
updatedAt: '2026-02-05',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
maxOutputTokens: { max: 64000, default: 8192 },
|
|
thinking: {
|
|
levels: ['low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
],
|
|
},
|
|
google: {
|
|
id: 'google',
|
|
name: 'Google',
|
|
description: "Google's Gemini models",
|
|
defaultModel: 'gemini-2.5-pro',
|
|
modelPatterns: [/^gemini/],
|
|
capabilities: {
|
|
toolUsageControl: true,
|
|
},
|
|
icon: GeminiIcon,
|
|
models: [
|
|
{
|
|
id: 'gemini-3-pro-preview',
|
|
pricing: {
|
|
input: 2.0,
|
|
cachedInput: 0.2,
|
|
output: 12.0,
|
|
updatedAt: '2025-12-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
thinking: {
|
|
levels: ['low', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'gemini-3-flash-preview',
|
|
pricing: {
|
|
input: 0.5,
|
|
cachedInput: 0.05,
|
|
output: 3.0,
|
|
updatedAt: '2025-12-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
thinking: {
|
|
levels: ['minimal', 'low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'gemini-2.5-pro',
|
|
pricing: {
|
|
input: 1.25,
|
|
cachedInput: 0.125,
|
|
output: 10.0,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1048576,
|
|
},
|
|
{
|
|
id: 'gemini-2.5-flash',
|
|
pricing: {
|
|
input: 0.3,
|
|
cachedInput: 0.03,
|
|
output: 2.5,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1048576,
|
|
},
|
|
{
|
|
id: 'gemini-2.5-flash-lite',
|
|
pricing: {
|
|
input: 0.1,
|
|
cachedInput: 0.01,
|
|
output: 0.4,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1048576,
|
|
},
|
|
{
|
|
id: 'gemini-2.0-flash',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.4,
|
|
updatedAt: '2025-12-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'gemini-2.0-flash-lite',
|
|
pricing: {
|
|
input: 0.075,
|
|
output: 0.3,
|
|
updatedAt: '2025-12-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
],
|
|
},
|
|
vertex: {
|
|
id: 'vertex',
|
|
name: 'Vertex AI',
|
|
description: "Google's Vertex AI platform for Gemini models",
|
|
defaultModel: 'vertex/gemini-2.5-pro',
|
|
modelPatterns: [/^vertex\//],
|
|
icon: VertexIcon,
|
|
capabilities: {
|
|
toolUsageControl: true,
|
|
},
|
|
models: [
|
|
{
|
|
id: 'vertex/gemini-3-pro-preview',
|
|
pricing: {
|
|
input: 2.0,
|
|
cachedInput: 0.2,
|
|
output: 12.0,
|
|
updatedAt: '2025-12-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
thinking: {
|
|
levels: ['low', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'vertex/gemini-3-flash-preview',
|
|
pricing: {
|
|
input: 0.5,
|
|
cachedInput: 0.05,
|
|
output: 3.0,
|
|
updatedAt: '2025-12-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
thinking: {
|
|
levels: ['minimal', 'low', 'medium', 'high'],
|
|
default: 'high',
|
|
},
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'vertex/gemini-2.5-pro',
|
|
pricing: {
|
|
input: 1.25,
|
|
cachedInput: 0.125,
|
|
output: 10.0,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1048576,
|
|
},
|
|
{
|
|
id: 'vertex/gemini-2.5-flash',
|
|
pricing: {
|
|
input: 0.3,
|
|
cachedInput: 0.03,
|
|
output: 2.5,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1048576,
|
|
},
|
|
{
|
|
id: 'vertex/gemini-2.5-flash-lite',
|
|
pricing: {
|
|
input: 0.1,
|
|
cachedInput: 0.01,
|
|
output: 0.4,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1048576,
|
|
},
|
|
{
|
|
id: 'vertex/gemini-2.0-flash',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.4,
|
|
updatedAt: '2025-12-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'vertex/gemini-2.0-flash-lite',
|
|
pricing: {
|
|
input: 0.075,
|
|
output: 0.3,
|
|
updatedAt: '2025-12-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
],
|
|
},
|
|
deepseek: {
|
|
id: 'deepseek',
|
|
name: 'Deepseek',
|
|
description: "Deepseek's chat models",
|
|
defaultModel: 'deepseek-chat',
|
|
modelPatterns: [],
|
|
icon: DeepseekIcon,
|
|
capabilities: {
|
|
toolUsageControl: true,
|
|
},
|
|
models: [
|
|
{
|
|
id: 'deepseek-chat',
|
|
pricing: {
|
|
input: 0.75,
|
|
cachedInput: 0.4,
|
|
output: 1.0,
|
|
updatedAt: '2025-03-21',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'deepseek-v3',
|
|
pricing: {
|
|
input: 0.75,
|
|
cachedInput: 0.4,
|
|
output: 1.0,
|
|
updatedAt: '2025-03-21',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 2 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'deepseek-r1',
|
|
pricing: {
|
|
input: 1.0,
|
|
cachedInput: 0.5,
|
|
output: 1.5,
|
|
updatedAt: '2025-03-21',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 128000,
|
|
},
|
|
],
|
|
},
|
|
xai: {
|
|
id: 'xai',
|
|
name: 'xAI',
|
|
description: "xAI's Grok models",
|
|
defaultModel: 'grok-4-latest',
|
|
modelPatterns: [/^grok/],
|
|
icon: xAIIcon,
|
|
capabilities: {
|
|
toolUsageControl: true,
|
|
},
|
|
models: [
|
|
{
|
|
id: 'grok-4-latest',
|
|
pricing: {
|
|
input: 3.0,
|
|
cachedInput: 0.75,
|
|
output: 15.0,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'grok-4-0709',
|
|
pricing: {
|
|
input: 3.0,
|
|
cachedInput: 0.75,
|
|
output: 15.0,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'grok-4-1-fast-reasoning',
|
|
pricing: {
|
|
input: 0.2,
|
|
cachedInput: 0.05,
|
|
output: 0.5,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 2000000,
|
|
},
|
|
{
|
|
id: 'grok-4-1-fast-non-reasoning',
|
|
pricing: {
|
|
input: 0.2,
|
|
cachedInput: 0.05,
|
|
output: 0.5,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 2000000,
|
|
},
|
|
{
|
|
id: 'grok-4-fast-reasoning',
|
|
pricing: {
|
|
input: 0.2,
|
|
cachedInput: 0.25,
|
|
output: 0.5,
|
|
updatedAt: '2025-10-11',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 2000000,
|
|
},
|
|
{
|
|
id: 'grok-4-fast-non-reasoning',
|
|
pricing: {
|
|
input: 0.2,
|
|
cachedInput: 0.25,
|
|
output: 0.5,
|
|
updatedAt: '2025-10-11',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 2000000,
|
|
},
|
|
{
|
|
id: 'grok-code-fast-1',
|
|
pricing: {
|
|
input: 0.2,
|
|
cachedInput: 0.25,
|
|
output: 1.5,
|
|
updatedAt: '2025-10-11',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'grok-3-latest',
|
|
pricing: {
|
|
input: 3.0,
|
|
cachedInput: 1.5,
|
|
output: 15.0,
|
|
updatedAt: '2025-04-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 131072,
|
|
},
|
|
{
|
|
id: 'grok-3-fast-latest',
|
|
pricing: {
|
|
input: 5.0,
|
|
cachedInput: 2.5,
|
|
output: 25.0,
|
|
updatedAt: '2025-04-17',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 131072,
|
|
},
|
|
],
|
|
},
|
|
cerebras: {
|
|
id: 'cerebras',
|
|
name: 'Cerebras',
|
|
description: 'Cerebras Cloud LLMs',
|
|
defaultModel: 'cerebras/gpt-oss-120b',
|
|
modelPatterns: [/^cerebras/],
|
|
icon: CerebrasIcon,
|
|
capabilities: {
|
|
toolUsageControl: true,
|
|
},
|
|
models: [
|
|
{
|
|
id: 'cerebras/gpt-oss-120b',
|
|
pricing: {
|
|
input: 0.35,
|
|
output: 0.75,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131000,
|
|
},
|
|
{
|
|
id: 'cerebras/llama3.1-8b',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.1,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 32000,
|
|
},
|
|
{
|
|
id: 'cerebras/llama-3.3-70b',
|
|
pricing: {
|
|
input: 0.85,
|
|
output: 1.2,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'cerebras/qwen-3-32b',
|
|
pricing: {
|
|
input: 0.4,
|
|
output: 0.8,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131000,
|
|
},
|
|
{
|
|
id: 'cerebras/qwen-3-235b-a22b-instruct-2507',
|
|
pricing: {
|
|
input: 0.6,
|
|
output: 1.2,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131000,
|
|
},
|
|
{
|
|
id: 'cerebras/zai-glm-4.7',
|
|
pricing: {
|
|
input: 2.25,
|
|
output: 2.75,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131000,
|
|
},
|
|
],
|
|
},
|
|
groq: {
|
|
id: 'groq',
|
|
name: 'Groq',
|
|
description: "Groq's LLM models with high-performance inference",
|
|
defaultModel: 'groq/llama-3.3-70b-versatile',
|
|
modelPatterns: [/^groq/],
|
|
icon: GroqIcon,
|
|
capabilities: {
|
|
toolUsageControl: true,
|
|
},
|
|
models: [
|
|
{
|
|
id: 'groq/openai/gpt-oss-120b',
|
|
pricing: {
|
|
input: 0.15,
|
|
output: 0.6,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131072,
|
|
},
|
|
{
|
|
id: 'groq/openai/gpt-oss-20b',
|
|
pricing: {
|
|
input: 0.075,
|
|
output: 0.3,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131072,
|
|
},
|
|
{
|
|
id: 'groq/openai/gpt-oss-safeguard-20b',
|
|
pricing: {
|
|
input: 0.075,
|
|
output: 0.3,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131072,
|
|
},
|
|
{
|
|
id: 'groq/qwen/qwen3-32b',
|
|
pricing: {
|
|
input: 0.29,
|
|
output: 0.59,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131072,
|
|
},
|
|
{
|
|
id: 'groq/llama-3.1-8b-instant',
|
|
pricing: {
|
|
input: 0.05,
|
|
output: 0.08,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131072,
|
|
},
|
|
{
|
|
id: 'groq/llama-3.3-70b-versatile',
|
|
pricing: {
|
|
input: 0.59,
|
|
output: 0.79,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131072,
|
|
},
|
|
{
|
|
id: 'groq/meta-llama/llama-4-scout-17b-16e-instruct',
|
|
pricing: {
|
|
input: 0.11,
|
|
output: 0.34,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131072,
|
|
},
|
|
{
|
|
id: 'groq/meta-llama/llama-4-maverick-17b-128e-instruct',
|
|
pricing: {
|
|
input: 0.2,
|
|
output: 0.6,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131072,
|
|
},
|
|
{
|
|
id: 'groq/gemma2-9b-it',
|
|
pricing: {
|
|
input: 0.04,
|
|
output: 0.04,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 8192,
|
|
},
|
|
{
|
|
id: 'groq/deepseek-r1-distill-llama-70b',
|
|
pricing: {
|
|
input: 0.59,
|
|
output: 0.79,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'groq/deepseek-r1-distill-qwen-32b',
|
|
pricing: {
|
|
input: 0.69,
|
|
output: 0.69,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'groq/moonshotai/kimi-k2-instruct-0905',
|
|
pricing: {
|
|
input: 1.0,
|
|
output: 3.0,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 262144,
|
|
},
|
|
{
|
|
id: 'groq/meta-llama/llama-guard-4-12b',
|
|
pricing: {
|
|
input: 0.2,
|
|
output: 0.2,
|
|
updatedAt: '2026-01-27',
|
|
},
|
|
capabilities: {},
|
|
contextWindow: 131072,
|
|
},
|
|
],
|
|
},
|
|
mistral: {
|
|
id: 'mistral',
|
|
name: 'Mistral AI',
|
|
description: "Mistral AI's language models",
|
|
defaultModel: 'mistral-large-latest',
|
|
modelPatterns: [
|
|
/^mistral/,
|
|
/^magistral/,
|
|
/^open-mistral/,
|
|
/^codestral/,
|
|
/^ministral/,
|
|
/^devstral/,
|
|
],
|
|
icon: MistralIcon,
|
|
capabilities: {
|
|
toolUsageControl: true,
|
|
},
|
|
models: [
|
|
{
|
|
id: 'mistral-large-latest',
|
|
pricing: {
|
|
input: 0.5,
|
|
output: 1.5,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'mistral-large-2512',
|
|
pricing: {
|
|
input: 0.5,
|
|
output: 1.5,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'mistral-large-2411',
|
|
pricing: {
|
|
input: 2.0,
|
|
output: 6.0,
|
|
updatedAt: '2025-10-11',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'magistral-medium-latest',
|
|
pricing: {
|
|
input: 2.0,
|
|
output: 5.0,
|
|
updatedAt: '2025-10-11',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'magistral-medium-2509',
|
|
pricing: {
|
|
input: 2.0,
|
|
output: 5.0,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'magistral-small-latest',
|
|
pricing: {
|
|
input: 0.5,
|
|
output: 1.5,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'magistral-small-2509',
|
|
pricing: {
|
|
input: 0.5,
|
|
output: 1.5,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'mistral-medium-latest',
|
|
pricing: {
|
|
input: 0.4,
|
|
output: 2.0,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'mistral-medium-2508',
|
|
pricing: {
|
|
input: 0.4,
|
|
output: 2.0,
|
|
updatedAt: '2025-10-11',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'mistral-medium-2505',
|
|
pricing: {
|
|
input: 0.4,
|
|
output: 2.0,
|
|
updatedAt: '2025-05-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'mistral-small-latest',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.3,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'mistral-small-2506',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.3,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'open-mistral-nemo',
|
|
pricing: {
|
|
input: 0.15,
|
|
output: 0.15,
|
|
updatedAt: '2025-10-11',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'codestral-latest',
|
|
pricing: {
|
|
input: 0.3,
|
|
output: 0.9,
|
|
updatedAt: '2025-10-11',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'codestral-2508',
|
|
pricing: {
|
|
input: 0.3,
|
|
output: 0.9,
|
|
updatedAt: '2025-10-11',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'devstral-small-latest',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.3,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'devstral-small-2507',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.3,
|
|
updatedAt: '2025-07-10',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'devstral-medium-2507',
|
|
pricing: {
|
|
input: 0.5,
|
|
output: 1.5,
|
|
updatedAt: '2025-07-10',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'ministral-14b-latest',
|
|
pricing: {
|
|
input: 0.2,
|
|
output: 0.2,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'ministral-14b-2512',
|
|
pricing: {
|
|
input: 0.2,
|
|
output: 0.2,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'ministral-8b-latest',
|
|
pricing: {
|
|
input: 0.15,
|
|
output: 0.15,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'ministral-8b-2512',
|
|
pricing: {
|
|
input: 0.15,
|
|
output: 0.15,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'ministral-8b-2410',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.1,
|
|
updatedAt: '2025-10-09',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'ministral-3b-latest',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.1,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'ministral-3b-2512',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.1,
|
|
updatedAt: '2025-12-02',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 256000,
|
|
},
|
|
{
|
|
id: 'ministral-3b-2410',
|
|
pricing: {
|
|
input: 0.04,
|
|
output: 0.04,
|
|
updatedAt: '2025-10-09',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
],
|
|
},
|
|
ollama: {
|
|
id: 'ollama',
|
|
name: 'Ollama',
|
|
description: 'Local LLM models via Ollama',
|
|
defaultModel: '',
|
|
modelPatterns: [],
|
|
icon: OllamaIcon,
|
|
capabilities: {
|
|
toolUsageControl: false, // Ollama does not support tool_choice parameter
|
|
},
|
|
contextInformationAvailable: false,
|
|
models: [], // Populated dynamically
|
|
},
|
|
bedrock: {
|
|
id: 'bedrock',
|
|
name: 'AWS Bedrock',
|
|
description: 'AWS Bedrock foundation models',
|
|
defaultModel: 'bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0',
|
|
modelPatterns: [/^bedrock\//],
|
|
icon: BedrockIcon,
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
toolUsageControl: true,
|
|
},
|
|
models: [
|
|
{
|
|
id: 'bedrock/anthropic.claude-opus-4-5-20251101-v1:0',
|
|
pricing: {
|
|
input: 5.0,
|
|
output: 25.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0',
|
|
pricing: {
|
|
input: 3.0,
|
|
output: 15.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'bedrock/anthropic.claude-haiku-4-5-20251001-v1:0',
|
|
pricing: {
|
|
input: 1.0,
|
|
output: 5.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'bedrock/anthropic.claude-opus-4-1-20250805-v1:0',
|
|
pricing: {
|
|
input: 15.0,
|
|
output: 75.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
nativeStructuredOutputs: true,
|
|
},
|
|
contextWindow: 200000,
|
|
},
|
|
{
|
|
id: 'bedrock/amazon.nova-2-pro-v1:0',
|
|
pricing: {
|
|
input: 1.0,
|
|
output: 4.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'bedrock/amazon.nova-2-lite-v1:0',
|
|
pricing: {
|
|
input: 0.08,
|
|
output: 0.32,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'bedrock/amazon.nova-premier-v1:0',
|
|
pricing: {
|
|
input: 2.5,
|
|
output: 10.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'bedrock/amazon.nova-pro-v1:0',
|
|
pricing: {
|
|
input: 0.8,
|
|
output: 3.2,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 300000,
|
|
},
|
|
{
|
|
id: 'bedrock/amazon.nova-lite-v1:0',
|
|
pricing: {
|
|
input: 0.06,
|
|
output: 0.24,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 300000,
|
|
},
|
|
{
|
|
id: 'bedrock/amazon.nova-micro-v1:0',
|
|
pricing: {
|
|
input: 0.035,
|
|
output: 0.14,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/meta.llama4-maverick-17b-instruct-v1:0',
|
|
pricing: {
|
|
input: 0.24,
|
|
output: 0.97,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 1000000,
|
|
},
|
|
{
|
|
id: 'bedrock/meta.llama4-scout-17b-instruct-v1:0',
|
|
pricing: {
|
|
input: 0.18,
|
|
output: 0.72,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 3500000,
|
|
},
|
|
{
|
|
id: 'bedrock/meta.llama3-3-70b-instruct-v1:0',
|
|
pricing: {
|
|
input: 0.72,
|
|
output: 0.72,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/meta.llama3-2-90b-instruct-v1:0',
|
|
pricing: {
|
|
input: 2.0,
|
|
output: 2.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/meta.llama3-2-11b-instruct-v1:0',
|
|
pricing: {
|
|
input: 0.16,
|
|
output: 0.16,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/meta.llama3-2-3b-instruct-v1:0',
|
|
pricing: {
|
|
input: 0.15,
|
|
output: 0.15,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/meta.llama3-2-1b-instruct-v1:0',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.1,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/meta.llama3-1-405b-instruct-v1:0',
|
|
pricing: {
|
|
input: 5.32,
|
|
output: 16.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/meta.llama3-1-70b-instruct-v1:0',
|
|
pricing: {
|
|
input: 2.65,
|
|
output: 3.5,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/meta.llama3-1-8b-instruct-v1:0',
|
|
pricing: {
|
|
input: 0.3,
|
|
output: 0.6,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/mistral.mistral-large-3-675b-instruct',
|
|
pricing: {
|
|
input: 2.0,
|
|
output: 6.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/mistral.mistral-large-2411-v1:0',
|
|
pricing: {
|
|
input: 2.0,
|
|
output: 6.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/mistral.mistral-large-2407-v1:0',
|
|
pricing: {
|
|
input: 4.0,
|
|
output: 12.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/mistral.pixtral-large-2502-v1:0',
|
|
pricing: {
|
|
input: 2.0,
|
|
output: 6.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/mistral.magistral-small-2509',
|
|
pricing: {
|
|
input: 0.5,
|
|
output: 1.5,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/mistral.ministral-3-14b-instruct',
|
|
pricing: {
|
|
input: 0.2,
|
|
output: 0.2,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/mistral.ministral-3-8b-instruct',
|
|
pricing: {
|
|
input: 0.1,
|
|
output: 0.1,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/mistral.ministral-3-3b-instruct',
|
|
pricing: {
|
|
input: 0.04,
|
|
output: 0.04,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/mistral.mixtral-8x7b-instruct-v0:1',
|
|
pricing: {
|
|
input: 0.45,
|
|
output: 0.7,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 32000,
|
|
},
|
|
{
|
|
id: 'bedrock/amazon.titan-text-premier-v1:0',
|
|
pricing: {
|
|
input: 0.5,
|
|
output: 1.5,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 32000,
|
|
},
|
|
{
|
|
id: 'bedrock/cohere.command-r-plus-v1:0',
|
|
pricing: {
|
|
input: 3.0,
|
|
output: 15.0,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
{
|
|
id: 'bedrock/cohere.command-r-v1:0',
|
|
pricing: {
|
|
input: 0.5,
|
|
output: 1.5,
|
|
updatedAt: '2026-01-07',
|
|
},
|
|
capabilities: {
|
|
temperature: { min: 0, max: 1 },
|
|
},
|
|
contextWindow: 128000,
|
|
},
|
|
],
|
|
},
|
|
}
|
|
|
|
export function getProviderModels(providerId: string): string[] {
|
|
return PROVIDER_DEFINITIONS[providerId]?.models.map((m) => m.id) || []
|
|
}
|
|
|
|
export function getProviderDefaultModel(providerId: string): string {
|
|
return PROVIDER_DEFINITIONS[providerId]?.defaultModel || ''
|
|
}
|
|
|
|
export function getModelPricing(modelId: string): ModelPricing | null {
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
const model = provider.models.find((m) => m.id.toLowerCase() === modelId.toLowerCase())
|
|
if (model) {
|
|
return model.pricing
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
|
|
export function getModelCapabilities(modelId: string): ModelCapabilities | null {
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
const model = provider.models.find((m) => m.id.toLowerCase() === modelId.toLowerCase())
|
|
if (model) {
|
|
const capabilities: ModelCapabilities = { ...provider.capabilities, ...model.capabilities }
|
|
return capabilities
|
|
}
|
|
}
|
|
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
if (provider.modelPatterns) {
|
|
for (const pattern of provider.modelPatterns) {
|
|
if (pattern.test(modelId.toLowerCase())) {
|
|
return provider.capabilities || null
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
export function getModelsWithTemperatureSupport(): string[] {
|
|
const models: string[] = []
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
for (const model of provider.models) {
|
|
if (model.capabilities.temperature) {
|
|
models.push(model.id)
|
|
}
|
|
}
|
|
}
|
|
return models
|
|
}
|
|
|
|
export function getModelsWithTempRange01(): string[] {
|
|
const models: string[] = []
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
for (const model of provider.models) {
|
|
if (model.capabilities.temperature?.max === 1) {
|
|
models.push(model.id)
|
|
}
|
|
}
|
|
}
|
|
return models
|
|
}
|
|
|
|
export function getModelsWithTempRange02(): string[] {
|
|
const models: string[] = []
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
for (const model of provider.models) {
|
|
if (model.capabilities.temperature?.max === 2) {
|
|
models.push(model.id)
|
|
}
|
|
}
|
|
}
|
|
return models
|
|
}
|
|
|
|
export function getProvidersWithToolUsageControl(): string[] {
|
|
const providers: string[] = []
|
|
for (const [providerId, provider] of Object.entries(PROVIDER_DEFINITIONS)) {
|
|
if (provider.capabilities?.toolUsageControl) {
|
|
providers.push(providerId)
|
|
}
|
|
}
|
|
return providers
|
|
}
|
|
|
|
export function getHostedModels(): string[] {
|
|
return [
|
|
...getProviderModels('openai'),
|
|
...getProviderModels('anthropic'),
|
|
...getProviderModels('google'),
|
|
]
|
|
}
|
|
|
|
export function getComputerUseModels(): string[] {
|
|
const models: string[] = []
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
for (const model of provider.models) {
|
|
if (model.capabilities.computerUse) {
|
|
models.push(model.id)
|
|
}
|
|
}
|
|
}
|
|
return models
|
|
}
|
|
|
|
export function supportsTemperature(modelId: string): boolean {
|
|
const capabilities = getModelCapabilities(modelId)
|
|
return !!capabilities?.temperature
|
|
}
|
|
|
|
export function getMaxTemperature(modelId: string): number | undefined {
|
|
const capabilities = getModelCapabilities(modelId)
|
|
return capabilities?.temperature?.max
|
|
}
|
|
|
|
export function supportsToolUsageControl(providerId: string): boolean {
|
|
return getProvidersWithToolUsageControl().includes(providerId)
|
|
}
|
|
|
|
export function updateOllamaModels(models: string[]): void {
|
|
PROVIDER_DEFINITIONS.ollama.models = models.map((modelId) => ({
|
|
id: modelId,
|
|
pricing: {
|
|
input: 0,
|
|
output: 0,
|
|
updatedAt: new Date().toISOString().split('T')[0],
|
|
},
|
|
capabilities: {},
|
|
}))
|
|
}
|
|
|
|
export function updateVLLMModels(models: string[]): void {
|
|
PROVIDER_DEFINITIONS.vllm.models = models.map((modelId) => ({
|
|
id: modelId,
|
|
pricing: {
|
|
input: 0,
|
|
output: 0,
|
|
updatedAt: new Date().toISOString().split('T')[0],
|
|
},
|
|
capabilities: {},
|
|
}))
|
|
}
|
|
|
|
export function updateOpenRouterModels(models: string[]): void {
|
|
PROVIDER_DEFINITIONS.openrouter.models = models.map((modelId) => ({
|
|
id: modelId,
|
|
pricing: {
|
|
input: 0,
|
|
output: 0,
|
|
updatedAt: new Date().toISOString().split('T')[0],
|
|
},
|
|
capabilities: {},
|
|
}))
|
|
}
|
|
|
|
export const EMBEDDING_MODEL_PRICING: Record<string, ModelPricing> = {
|
|
'text-embedding-3-small': {
|
|
input: 0.02, // $0.02 per 1M tokens
|
|
output: 0.0,
|
|
updatedAt: '2025-07-10',
|
|
},
|
|
'text-embedding-3-large': {
|
|
input: 0.13, // $0.13 per 1M tokens
|
|
output: 0.0,
|
|
updatedAt: '2025-07-10',
|
|
},
|
|
'text-embedding-ada-002': {
|
|
input: 0.1, // $0.1 per 1M tokens
|
|
output: 0.0,
|
|
updatedAt: '2025-07-10',
|
|
},
|
|
}
|
|
|
|
export function getEmbeddingModelPricing(modelId: string): ModelPricing | null {
|
|
return EMBEDDING_MODEL_PRICING[modelId] || null
|
|
}
|
|
|
|
export function getModelsWithReasoningEffort(): string[] {
|
|
const models: string[] = []
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
for (const model of provider.models) {
|
|
if (model.capabilities.reasoningEffort) {
|
|
models.push(model.id)
|
|
}
|
|
}
|
|
}
|
|
return models
|
|
}
|
|
|
|
/**
|
|
* Get the reasoning effort values for a specific model
|
|
* Returns the valid options for that model, or null if the model doesn't support reasoning effort
|
|
*/
|
|
export function getReasoningEffortValuesForModel(modelId: string): string[] | null {
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
const model = provider.models.find((m) => m.id.toLowerCase() === modelId.toLowerCase())
|
|
if (model?.capabilities.reasoningEffort) {
|
|
return model.capabilities.reasoningEffort.values
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
|
|
export function getModelsWithVerbosity(): string[] {
|
|
const models: string[] = []
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
for (const model of provider.models) {
|
|
if (model.capabilities.verbosity) {
|
|
models.push(model.id)
|
|
}
|
|
}
|
|
}
|
|
return models
|
|
}
|
|
|
|
/**
|
|
* Get the verbosity values for a specific model
|
|
* Returns the valid options for that model, or null if the model doesn't support verbosity
|
|
*/
|
|
export function getVerbosityValuesForModel(modelId: string): string[] | null {
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
const model = provider.models.find((m) => m.id.toLowerCase() === modelId.toLowerCase())
|
|
if (model?.capabilities.verbosity) {
|
|
return model.capabilities.verbosity.values
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
|
|
/**
|
|
* Check if a model supports native structured outputs.
|
|
* Handles model IDs with date suffixes (e.g., claude-sonnet-4-5-20250514).
|
|
*/
|
|
export function supportsNativeStructuredOutputs(modelId: string): boolean {
|
|
const normalizedModelId = modelId.toLowerCase()
|
|
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
for (const model of provider.models) {
|
|
if (model.capabilities.nativeStructuredOutputs) {
|
|
const baseModelId = model.id.toLowerCase()
|
|
// Check exact match or date-suffixed version (e.g., claude-sonnet-4-5-20250514)
|
|
if (normalizedModelId === baseModelId || normalizedModelId.startsWith(`${baseModelId}-`)) {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
/**
|
|
* Check if a model supports thinking/reasoning features.
|
|
* Returns the thinking capability config if supported, null otherwise.
|
|
*/
|
|
export function getThinkingCapability(
|
|
modelId: string
|
|
): { levels: string[]; default?: string } | null {
|
|
const normalizedModelId = modelId.toLowerCase()
|
|
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
for (const model of provider.models) {
|
|
if (model.capabilities.thinking) {
|
|
const baseModelId = model.id.toLowerCase()
|
|
if (normalizedModelId === baseModelId || normalizedModelId.startsWith(`${baseModelId}-`)) {
|
|
return model.capabilities.thinking
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
|
|
/**
|
|
* Get all models that support thinking capability
|
|
*/
|
|
export function getModelsWithThinking(): string[] {
|
|
const models: string[] = []
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
for (const model of provider.models) {
|
|
if (model.capabilities.thinking) {
|
|
models.push(model.id)
|
|
}
|
|
}
|
|
}
|
|
return models
|
|
}
|
|
|
|
/**
|
|
* Get the thinking levels for a specific model
|
|
* Returns the valid levels for that model, or null if the model doesn't support thinking
|
|
*/
|
|
export function getThinkingLevelsForModel(modelId: string): string[] | null {
|
|
const capability = getThinkingCapability(modelId)
|
|
return capability?.levels ?? null
|
|
}
|
|
|
|
/**
|
|
* Get the max output tokens for a specific model
|
|
* Returns the model's max capacity for streaming requests,
|
|
* or the model's safe default for non-streaming requests to avoid timeout issues.
|
|
*
|
|
* @param modelId - The model ID
|
|
* @param streaming - Whether the request is streaming (default: false)
|
|
*/
|
|
export function getMaxOutputTokensForModel(modelId: string, streaming = false): number {
|
|
const normalizedModelId = modelId.toLowerCase()
|
|
const STANDARD_MAX_OUTPUT_TOKENS = 4096
|
|
|
|
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
|
|
for (const model of provider.models) {
|
|
const baseModelId = model.id.toLowerCase()
|
|
if (normalizedModelId === baseModelId || normalizedModelId.startsWith(`${baseModelId}-`)) {
|
|
const outputTokens = model.capabilities.maxOutputTokens
|
|
if (outputTokens) {
|
|
return streaming ? outputTokens.max : outputTokens.default
|
|
}
|
|
return STANDARD_MAX_OUTPUT_TOKENS
|
|
}
|
|
}
|
|
}
|
|
|
|
return STANDARD_MAX_OUTPUT_TOKENS
|
|
}
|