Files
wehub-resource-sync d25d482dc2
Publish CLI Package / publish-npm (push) Waiting to run
Publish Python SDK / publish-pypi (push) Waiting to run
Publish TypeScript SDK / publish-npm (push) Waiting to run
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

4267 lines
107 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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,
BasetenIcon,
BedrockIcon,
CerebrasIcon,
DeepseekIcon,
FireworksIcon,
GeminiIcon,
GroqIcon,
LitellmIcon,
MetaIcon,
MistralIcon,
NvidiaIcon,
OllamaIcon,
OpenAIIcon,
OpenRouterIcon,
SakanaIcon,
TogetherIcon,
VertexIcon,
VllmIcon,
xAIIcon,
ZaiIcon,
} from '@/components/icons'
import type { ModelPricing, ProviderId } from '@/providers/types'
export interface ModelCapabilities {
temperature?: {
min: number
max: number
}
toolUsageControl?: boolean
computerUse?: boolean
nativeStructuredOutputs?: boolean
/** Maximum supported output tokens for this model */
maxOutputTokens?: number
reasoningEffort?: {
values: string[]
}
verbosity?: {
values: string[]
}
thinking?: {
levels: string[]
default?: string
}
deepResearch?: boolean
/** Whether this model supports conversation memory. Defaults to true if omitted. */
memory?: boolean
}
interface ModelDefinition {
id: string
pricing: ModelPricing
capabilities: ModelCapabilities
contextWindow?: number
/** ISO date string (YYYY-MM-DD) when the model was first publicly released */
releaseDate?: string
recommended?: boolean
speedOptimized?: boolean
deprecated?: boolean
}
export interface ProviderDefinition {
id: string
name: string
description: string
models: ModelDefinition[]
defaultModel: string
modelPatterns?: RegExp[]
icon?: React.ComponentType<{ className?: string }>
/** Brand color used in charts and visualizations (hex string) */
color?: string
/** True when this provider re-hosts other providers' models (e.g. Azure, Bedrock, OpenRouter) */
isReseller?: boolean
capabilities?: ModelCapabilities
contextInformationAvailable?: boolean
/** Agent-block file attachment limit and large-file delivery for this provider. */
fileAttachment?: ProviderFileAttachment
}
/**
* How a provider accepts agent-block attachments larger than the inline base64 threshold:
* `files-api` uploads to the provider Files API, `remote-url` passes a signed URL the
* provider fetches itself, `inline` means base64-only (no large-file path).
*/
export type ProviderFileAttachmentStrategy = 'inline' | 'files-api' | 'remote-url'
export interface ProviderFileAttachment {
/** Maximum attachment size the provider accepts, in bytes. */
maxBytes: number
strategy: ProviderFileAttachmentStrategy
}
/** Inline base64 attachment cap, also the fallback limit for providers without a large-file path. */
export const INLINE_ATTACHMENT_MAX_BYTES = 10 * 1024 * 1024
const DEFAULT_FILE_ATTACHMENT: ProviderFileAttachment = {
maxBytes: INLINE_ATTACHMENT_MAX_BYTES,
strategy: 'inline',
}
/** Provider-level attachment limit + strategy, keyed on the granular provider id. */
export function getProviderFileAttachment(providerId: string): ProviderFileAttachment {
return PROVIDER_DEFINITIONS[providerId]?.fileAttachment ?? DEFAULT_FILE_ATTACHMENT
}
export const PROVIDER_DEFINITIONS: Record<string, ProviderDefinition> = {
fireworks: {
id: 'fireworks',
name: 'Fireworks',
description: 'Fast inference for open-source models via Fireworks AI',
defaultModel: '',
modelPatterns: [/^fireworks\//],
icon: FireworksIcon,
color: '#FF6D3A',
isReseller: true,
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
},
contextInformationAvailable: false,
models: [],
},
together: {
id: 'together',
fileAttachment: { maxBytes: 50 * 1024 * 1024, strategy: 'remote-url' },
name: 'Together AI',
description: 'Fast inference for open-source models via Together AI',
defaultModel: '',
modelPatterns: [/^together\//],
icon: TogetherIcon,
color: '#EF2CC1',
isReseller: true,
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
},
contextInformationAvailable: false,
models: [],
},
baseten: {
id: 'baseten',
fileAttachment: { maxBytes: 25 * 1024 * 1024, strategy: 'remote-url' },
name: 'Baseten',
description: 'Fast inference for open-source models via Baseten Model APIs',
defaultModel: '',
modelPatterns: [/^baseten\//],
icon: BasetenIcon,
color: '#1A1A2E',
isReseller: true,
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
},
contextInformationAvailable: false,
models: [],
},
openrouter: {
id: 'openrouter',
fileAttachment: { maxBytes: 50 * 1024 * 1024, strategy: 'remote-url' },
name: 'OpenRouter',
description: 'Unified access to many models via OpenRouter',
defaultModel: '',
modelPatterns: [/^openrouter\//],
icon: OpenRouterIcon,
isReseller: true,
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
},
contextInformationAvailable: false,
models: [],
},
'ollama-cloud': {
id: 'ollama-cloud',
name: 'Ollama Cloud',
description: 'Hosted open-source models via Ollama Cloud (bring your own key)',
defaultModel: '',
modelPatterns: [/^ollama-cloud\//],
icon: OllamaIcon,
isReseller: true,
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: false,
},
contextInformationAvailable: false,
models: [],
},
vllm: {
id: 'vllm',
fileAttachment: { maxBytes: 25 * 1024 * 1024, strategy: 'remote-url' },
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: [],
},
litellm: {
id: 'litellm',
name: 'LiteLLM',
icon: LitellmIcon,
color: '#040229',
description: 'LiteLLM proxy with an OpenAI-compatible API',
defaultModel: '',
modelPatterns: [/^litellm\//],
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
},
models: [],
},
openai: {
id: 'openai',
fileAttachment: { maxBytes: 50 * 1024 * 1024, strategy: 'files-api' },
name: 'OpenAI',
description: "OpenAI's models",
defaultModel: 'gpt-4.1',
modelPatterns: [/^gpt/, /^o\d/, /^text-embedding/],
icon: OpenAIIcon,
color: '#E8E8E8',
capabilities: {
toolUsageControl: true,
},
models: [
// GPT-4.1 family
{
id: 'gpt-4.1',
pricing: {
input: 2.0,
cachedInput: 0.5,
output: 8.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 32768,
},
contextWindow: 1047576,
releaseDate: '2025-04-14',
},
{
id: 'gpt-4.1-mini',
pricing: {
input: 0.4,
cachedInput: 0.1,
output: 1.6,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 32768,
},
contextWindow: 1047576,
releaseDate: '2025-04-14',
},
{
id: 'gpt-4.1-nano',
pricing: {
input: 0.1,
cachedInput: 0.025,
output: 0.4,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 32768,
},
contextWindow: 1047576,
releaseDate: '2025-04-14',
deprecated: true,
},
// GPT-5.6 family
{
id: 'gpt-5.6-sol',
pricing: {
input: 5.0,
cachedInput: 0.5,
output: 30.0,
updatedAt: '2026-07-09',
},
capabilities: {
reasoningEffort: {
values: ['none', 'low', 'medium', 'high', 'xhigh', 'max'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 1050000,
releaseDate: '2026-07-09',
recommended: true,
},
{
id: 'gpt-5.6-terra',
pricing: {
input: 2.5,
cachedInput: 0.25,
output: 15.0,
updatedAt: '2026-07-09',
},
capabilities: {
reasoningEffort: {
values: ['none', 'low', 'medium', 'high', 'xhigh'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 1050000,
releaseDate: '2026-07-09',
},
{
id: 'gpt-5.6-luna',
pricing: {
input: 1.0,
cachedInput: 0.1,
output: 6.0,
updatedAt: '2026-07-09',
},
capabilities: {
reasoningEffort: {
values: ['none', 'low', 'medium', 'high', 'xhigh'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 1050000,
releaseDate: '2026-07-09',
speedOptimized: true,
},
// GPT-5.5 family
{
id: 'gpt-5.5-pro',
pricing: {
input: 30.0,
output: 180.0,
updatedAt: '2026-06-11',
},
capabilities: {
nativeStructuredOutputs: true,
reasoningEffort: {
values: ['medium', 'high', 'xhigh'],
},
maxOutputTokens: 128000,
},
contextWindow: 1050000,
releaseDate: '2026-04-23',
},
{
id: 'gpt-5.5',
pricing: {
input: 5.0,
cachedInput: 0.5,
output: 30.0,
updatedAt: '2026-06-11',
},
capabilities: {
nativeStructuredOutputs: true,
reasoningEffort: {
values: ['none', 'low', 'medium', 'high', 'xhigh'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 1050000,
releaseDate: '2026-04-23',
},
// GPT-5.4 family
{
id: 'gpt-5.4-pro',
pricing: {
input: 30.0,
output: 180.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['medium', 'high', 'xhigh'],
},
maxOutputTokens: 128000,
},
contextWindow: 1050000,
releaseDate: '2026-03-05',
},
{
id: 'gpt-5.4',
pricing: {
input: 2.5,
cachedInput: 0.25,
output: 15.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['none', 'low', 'medium', 'high', 'xhigh'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 1050000,
releaseDate: '2026-03-05',
},
{
id: 'gpt-5.4-mini',
pricing: {
input: 0.75,
cachedInput: 0.075,
output: 4.5,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['none', 'low', 'medium', 'high', 'xhigh'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2026-03-17',
},
{
id: 'gpt-5.4-nano',
pricing: {
input: 0.2,
cachedInput: 0.02,
output: 1.25,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['none', 'low', 'medium', 'high', 'xhigh'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2026-03-17',
speedOptimized: true,
},
// GPT-5.2 family
{
id: 'gpt-5.2-pro',
pricing: {
input: 21.0,
output: 168.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['medium', 'high', 'xhigh'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-12-11',
},
{
id: 'gpt-5.2',
pricing: {
input: 1.75,
cachedInput: 0.175,
output: 14.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['none', 'low', 'medium', 'high', 'xhigh'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-12-11',
},
// GPT-5.1 family
{
id: 'gpt-5.1',
pricing: {
input: 1.25,
cachedInput: 0.125,
output: 10.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['none', 'low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-11-13',
},
// GPT-5 family
{
id: 'gpt-5-pro',
pricing: {
input: 15.0,
output: 120.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['high'],
},
maxOutputTokens: 272000,
},
contextWindow: 400000,
releaseDate: '2025-10-06',
},
{
id: 'gpt-5',
pricing: {
input: 1.25,
cachedInput: 0.125,
output: 10.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['minimal', 'low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-08-07',
},
{
id: 'gpt-5-mini',
pricing: {
input: 0.25,
cachedInput: 0.025,
output: 2.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['minimal', 'low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-08-07',
},
{
id: 'gpt-5-nano',
pricing: {
input: 0.05,
cachedInput: 0.005,
output: 0.4,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['minimal', 'low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-08-07',
},
{
id: 'gpt-5-chat-latest',
pricing: {
input: 1.25,
cachedInput: 0.125,
output: 10.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 16384,
},
contextWindow: 128000,
releaseDate: '2025-08-07',
deprecated: true,
},
// o-series reasoning models
{
id: 'o4-mini',
pricing: {
input: 1.1,
cachedInput: 0.275,
output: 4.4,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 100000,
},
contextWindow: 200000,
releaseDate: '2025-04-16',
deprecated: true,
},
{
id: 'o3-pro',
pricing: {
input: 20.0,
output: 80.0,
updatedAt: '2026-06-11',
},
capabilities: {
maxOutputTokens: 100000,
},
contextWindow: 200000,
releaseDate: '2025-06-10',
},
{
id: 'o3',
pricing: {
input: 2,
cachedInput: 0.5,
output: 8,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 100000,
},
contextWindow: 200000,
releaseDate: '2025-04-16',
deprecated: true,
},
{
id: 'o3-mini',
pricing: {
input: 1.1,
cachedInput: 0.55,
output: 4.4,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 100000,
},
contextWindow: 200000,
releaseDate: '2025-01-31',
deprecated: true,
},
{
id: 'o1',
pricing: {
input: 15.0,
cachedInput: 7.5,
output: 60,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 100000,
},
contextWindow: 200000,
releaseDate: '2024-12-17',
deprecated: true,
},
// Legacy
{
id: 'gpt-4o',
pricing: {
input: 2.5,
cachedInput: 1.25,
output: 10.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 16384,
},
contextWindow: 128000,
releaseDate: '2024-05-13',
deprecated: true,
},
],
},
anthropic: {
id: 'anthropic',
fileAttachment: { maxBytes: 50 * 1024 * 1024, strategy: 'remote-url' },
name: 'Anthropic',
description: "Anthropic's Claude models",
defaultModel: 'claude-sonnet-5',
modelPatterns: [/^claude/],
icon: AnthropicIcon,
color: '#D97757',
capabilities: {
toolUsageControl: true,
},
models: [
{
id: 'claude-fable-5',
pricing: {
input: 10.0,
cachedInput: 1.0,
output: 50.0,
updatedAt: '2026-07-01',
},
capabilities: {
nativeStructuredOutputs: true,
maxOutputTokens: 128000,
thinking: {
levels: ['low', 'medium', 'high', 'xhigh', 'max'],
default: 'high',
},
},
contextWindow: 1000000,
releaseDate: '2026-06-09',
},
{
id: 'claude-sonnet-5',
pricing: {
input: 2.0,
cachedInput: 0.2,
output: 10.0,
updatedAt: '2026-06-30',
},
capabilities: {
nativeStructuredOutputs: true,
maxOutputTokens: 128000,
thinking: {
levels: ['low', 'medium', 'high', 'xhigh', 'max'],
default: 'high',
},
},
contextWindow: 1000000,
releaseDate: '2026-06-30',
recommended: true,
},
{
id: 'claude-opus-4-8',
pricing: {
input: 5.0,
cachedInput: 0.5,
output: 25.0,
updatedAt: '2026-05-28',
},
capabilities: {
nativeStructuredOutputs: true,
maxOutputTokens: 128000,
thinking: {
levels: ['low', 'medium', 'high', 'xhigh', 'max'],
default: 'high',
},
},
contextWindow: 1000000,
releaseDate: '2026-05-28',
recommended: true,
},
{
id: 'claude-opus-4-7',
pricing: {
input: 5.0,
cachedInput: 0.5,
output: 25.0,
updatedAt: '2026-04-16',
},
capabilities: {
nativeStructuredOutputs: true,
maxOutputTokens: 128000,
thinking: {
levels: ['low', 'medium', 'high', 'xhigh', 'max'],
default: 'high',
},
},
contextWindow: 1000000,
releaseDate: '2026-04-16',
},
{
id: 'claude-opus-4-6',
pricing: {
input: 5.0,
cachedInput: 0.5,
output: 25.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 128000,
thinking: {
levels: ['low', 'medium', 'high', 'max'],
default: 'high',
},
},
contextWindow: 1000000,
releaseDate: '2026-02-05',
},
{
id: 'claude-sonnet-4-6',
pricing: {
input: 3.0,
cachedInput: 0.3,
output: 15.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 128000,
thinking: {
levels: ['low', 'medium', 'high', 'max'],
default: 'high',
},
},
contextWindow: 1000000,
releaseDate: '2026-02-17',
},
{
id: 'claude-opus-4-5',
pricing: {
input: 5.0,
cachedInput: 0.5,
output: 25.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 64000,
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
},
contextWindow: 200000,
releaseDate: '2025-11-24',
},
{
id: 'claude-opus-4-1',
pricing: {
input: 15.0,
cachedInput: 1.5,
output: 75.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 32000,
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
},
contextWindow: 200000,
releaseDate: '2025-08-05',
deprecated: true,
},
{
id: 'claude-opus-4-0',
pricing: {
input: 15.0,
cachedInput: 1.5,
output: 75.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 32000,
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
},
contextWindow: 200000,
releaseDate: '2025-05-22',
deprecated: true,
},
{
id: 'claude-sonnet-4-5',
pricing: {
input: 3.0,
cachedInput: 0.3,
output: 15.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 64000,
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
},
contextWindow: 200000,
releaseDate: '2025-09-29',
},
{
id: 'claude-sonnet-4-0',
pricing: {
input: 3.0,
cachedInput: 0.3,
output: 15.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 64000,
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
},
contextWindow: 200000,
releaseDate: '2025-05-22',
deprecated: true,
},
{
id: 'claude-haiku-4-5',
pricing: {
input: 1.0,
cachedInput: 0.1,
output: 5.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 64000,
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
},
contextWindow: 200000,
releaseDate: '2025-10-15',
speedOptimized: true,
},
{
id: 'claude-3-haiku-20240307',
pricing: {
input: 0.25,
cachedInput: 0.03,
output: 1.25,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 4096,
},
contextWindow: 200000,
releaseDate: '2024-03-13',
deprecated: true,
},
],
},
'azure-openai': {
id: 'azure-openai',
name: 'Azure OpenAI',
description: 'Microsoft Azure OpenAI Service models',
defaultModel: 'azure/gpt-5.4',
modelPatterns: [/^azure\//],
capabilities: {
toolUsageControl: true,
},
icon: AzureIcon,
isReseller: true,
models: [
{
id: 'azure/gpt-4o',
pricing: {
input: 2.5,
cachedInput: 1.25,
output: 10.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 16384,
},
contextWindow: 128000,
releaseDate: '2024-11-20',
deprecated: true,
},
{
id: 'azure/gpt-5.4',
pricing: {
input: 2.5,
cachedInput: 0.25,
output: 15.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 1050000,
releaseDate: '2026-03-05',
},
{
id: 'azure/gpt-5.4-mini',
pricing: {
input: 0.75,
cachedInput: 0.075,
output: 4.5,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2026-03-17',
},
{
id: 'azure/gpt-5.4-nano',
pricing: {
input: 0.2,
cachedInput: 0.02,
output: 1.25,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2026-03-17',
},
{
id: 'azure/gpt-5.2',
pricing: {
input: 1.75,
cachedInput: 0.175,
output: 14.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['none', 'low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-12-11',
},
{
id: 'azure/gpt-5.1',
pricing: {
input: 1.25,
cachedInput: 0.125,
output: 10.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['none', 'low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-11-13',
},
{
id: 'azure/gpt-5.1-codex',
pricing: {
input: 1.25,
cachedInput: 0.125,
output: 10.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['none', 'low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-11-13',
},
{
id: 'azure/gpt-5',
pricing: {
input: 1.25,
cachedInput: 0.125,
output: 10.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['minimal', 'low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-08-07',
},
{
id: 'azure/gpt-5-mini',
pricing: {
input: 0.25,
cachedInput: 0.025,
output: 2.0,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['minimal', 'low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-08-07',
},
{
id: 'azure/gpt-5-nano',
pricing: {
input: 0.05,
cachedInput: 0.005,
output: 0.4,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['minimal', 'low', 'medium', 'high'],
},
verbosity: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 128000,
},
contextWindow: 400000,
releaseDate: '2025-08-07',
},
{
id: 'azure/gpt-5-chat',
pricing: {
input: 1.25,
cachedInput: 0.125,
output: 10.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 16384,
},
contextWindow: 128000,
releaseDate: '2025-08-07',
},
{
id: 'azure/o3',
pricing: {
input: 2,
cachedInput: 0.5,
output: 8,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 100000,
},
contextWindow: 200000,
releaseDate: '2025-04-16',
},
{
id: 'azure/o4-mini',
pricing: {
input: 1.1,
cachedInput: 0.275,
output: 4.4,
updatedAt: '2026-06-11',
},
capabilities: {
reasoningEffort: {
values: ['low', 'medium', 'high'],
},
maxOutputTokens: 100000,
},
contextWindow: 200000,
releaseDate: '2025-04-16',
},
{
id: 'azure/gpt-4.1',
pricing: {
input: 2.0,
cachedInput: 0.5,
output: 8.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 32768,
},
contextWindow: 1047576,
releaseDate: '2025-04-14',
},
{
id: 'azure/gpt-4.1-mini',
pricing: {
input: 0.4,
cachedInput: 0.1,
output: 1.6,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 32768,
},
contextWindow: 1047576,
releaseDate: '2025-04-14',
},
{
id: 'azure/gpt-4.1-nano',
pricing: {
input: 0.1,
cachedInput: 0.025,
output: 0.4,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 32768,
},
contextWindow: 1047576,
releaseDate: '2025-04-14',
},
{
id: 'azure/model-router',
pricing: {
input: 2.0,
cachedInput: 0.5,
output: 8.0,
updatedAt: '2026-04-01',
},
capabilities: {},
contextWindow: 200000,
releaseDate: '2025-05-19',
},
],
},
'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,
isReseller: true,
capabilities: {
toolUsageControl: true,
},
models: [
{
id: 'azure-anthropic/claude-opus-4-6',
pricing: {
input: 5.0,
cachedInput: 0.5,
output: 25.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 128000,
thinking: {
levels: ['low', 'medium', 'high', 'max'],
default: 'high',
},
},
contextWindow: 1000000,
releaseDate: '2026-02-05',
},
{
id: 'azure-anthropic/claude-opus-4-5',
pricing: {
input: 5.0,
cachedInput: 0.5,
output: 25.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 64000,
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
},
contextWindow: 200000,
releaseDate: '2025-11-24',
},
{
id: 'azure-anthropic/claude-sonnet-4-5',
pricing: {
input: 3.0,
cachedInput: 0.3,
output: 15.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 64000,
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
},
contextWindow: 200000,
releaseDate: '2025-09-29',
},
{
id: 'azure-anthropic/claude-opus-4-1',
pricing: {
input: 15.0,
cachedInput: 1.5,
output: 75.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 32000,
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
},
contextWindow: 200000,
releaseDate: '2025-08-05',
deprecated: true,
},
{
id: 'azure-anthropic/claude-haiku-4-5',
pricing: {
input: 1.0,
cachedInput: 0.1,
output: 5.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 64000,
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
},
contextWindow: 200000,
releaseDate: '2025-10-15',
},
],
},
google: {
id: 'google',
fileAttachment: { maxBytes: 50 * 1024 * 1024, strategy: 'files-api' },
name: 'Google',
description: "Google's Gemini models",
defaultModel: 'gemini-2.5-pro',
modelPatterns: [/^gemini/, /^deep-research/],
capabilities: {
toolUsageControl: true,
},
icon: GeminiIcon,
color: '#4285F4',
models: [
{
id: 'gemini-3.5-flash',
pricing: {
input: 1.5,
cachedInput: 0.15,
output: 9.0,
updatedAt: '2026-05-19',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['minimal', 'low', 'medium', 'high'],
default: 'medium',
},
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2026-05-19',
recommended: true,
},
{
id: 'gemini-3.1-pro-preview',
pricing: {
input: 2.0,
cachedInput: 0.2,
output: 12.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2026-02-19',
},
{
id: 'gemini-3.1-flash-lite',
pricing: {
input: 0.25,
cachedInput: 0.025,
output: 1.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['minimal', 'low', 'medium', 'high'],
default: 'minimal',
},
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2026-05-07',
speedOptimized: true,
},
{
id: 'gemini-3-flash-preview',
pricing: {
input: 0.5,
cachedInput: 0.05,
output: 3.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['minimal', 'low', 'medium', 'high'],
default: 'high',
},
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2025-12-17',
},
{
id: 'gemini-2.5-pro',
pricing: {
input: 1.25,
cachedInput: 0.125,
output: 10.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2025-03-25',
},
{
id: 'gemini-2.5-flash',
pricing: {
input: 0.3,
cachedInput: 0.03,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['low', 'medium', 'high'],
default: 'medium',
},
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2025-05-20',
},
{
id: 'gemini-2.5-flash-lite',
pricing: {
input: 0.1,
cachedInput: 0.01,
output: 0.4,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['low', 'medium', 'high'],
default: 'low',
},
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2025-06-17',
speedOptimized: true,
},
{
id: 'gemini-2.0-flash',
pricing: {
input: 0.1,
cachedInput: 0.025,
output: 0.4,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 8192,
},
contextWindow: 1048576,
releaseDate: '2025-02-05',
deprecated: true,
},
{
id: 'gemini-2.0-flash-lite',
pricing: {
input: 0.075,
output: 0.3,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 8192,
},
contextWindow: 1048576,
releaseDate: '2025-02-25',
deprecated: true,
},
{
id: 'deep-research-pro-preview-12-2025',
pricing: {
input: 2.0,
cachedInput: 0.2,
output: 12.0,
updatedAt: '2026-06-11',
},
capabilities: {
deepResearch: true,
memory: false,
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2025-12-11',
},
],
},
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,
isReseller: true,
capabilities: {
toolUsageControl: true,
},
models: [
{
id: 'vertex/gemini-3.5-flash',
pricing: {
input: 1.5,
cachedInput: 0.15,
output: 9.0,
updatedAt: '2026-05-19',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['minimal', 'low', 'medium', 'high'],
default: 'medium',
},
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2026-05-19',
recommended: true,
},
{
id: 'vertex/gemini-3.1-pro-preview',
pricing: {
input: 2.0,
cachedInput: 0.2,
output: 12.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2026-02-19',
},
{
id: 'vertex/gemini-3.1-flash-lite',
pricing: {
input: 0.25,
cachedInput: 0.025,
output: 1.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['minimal', 'low', 'medium', 'high'],
default: 'minimal',
},
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2026-05-07',
speedOptimized: true,
},
{
id: 'vertex/gemini-3-pro-preview',
pricing: {
input: 2.0,
cachedInput: 0.2,
output: 12.0,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
},
contextWindow: 1000000,
releaseDate: '2025-11-18',
deprecated: true,
},
{
id: 'vertex/gemini-3-flash-preview',
pricing: {
input: 0.5,
cachedInput: 0.05,
output: 3.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['minimal', 'low', 'medium', 'high'],
default: 'high',
},
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2025-12-17',
},
{
id: 'vertex/gemini-2.5-pro',
pricing: {
input: 1.25,
cachedInput: 0.125,
output: 10.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['low', 'medium', 'high'],
default: 'high',
},
maxOutputTokens: 65535,
},
contextWindow: 1048576,
releaseDate: '2025-03-25',
},
{
id: 'vertex/gemini-2.5-flash',
pricing: {
input: 0.3,
cachedInput: 0.03,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['low', 'medium', 'high'],
default: 'medium',
},
maxOutputTokens: 65535,
},
contextWindow: 1048576,
releaseDate: '2025-05-20',
},
{
id: 'vertex/gemini-2.5-flash-lite',
pricing: {
input: 0.1,
cachedInput: 0.01,
output: 0.4,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
thinking: {
levels: ['low', 'medium', 'high'],
default: 'low',
},
maxOutputTokens: 65535,
},
contextWindow: 1048576,
releaseDate: '2025-06-17',
speedOptimized: true,
},
{
id: 'vertex/gemini-2.0-flash',
pricing: {
input: 0.15,
cachedInput: 0.025,
output: 0.6,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1048576,
releaseDate: '2025-02-05',
deprecated: true,
},
{
id: 'vertex/gemini-2.0-flash-lite',
pricing: {
input: 0.075,
output: 0.3,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1048576,
releaseDate: '2025-02-25',
deprecated: true,
},
{
id: 'vertex/deep-research-pro-preview-12-2025',
pricing: {
input: 2.0,
cachedInput: 0.2,
output: 12.0,
updatedAt: '2026-06-11',
},
capabilities: {
deepResearch: true,
memory: false,
maxOutputTokens: 65536,
},
contextWindow: 1048576,
releaseDate: '2025-12-11',
},
],
},
deepseek: {
id: 'deepseek',
name: 'DeepSeek',
description: "DeepSeek's chat models",
defaultModel: 'deepseek-chat',
modelPatterns: [],
icon: DeepseekIcon,
color: '#4D6BFE',
capabilities: {
toolUsageControl: true,
},
models: [
{
id: 'deepseek-v4-pro',
pricing: {
input: 0.435,
cachedInput: 0.003625,
output: 0.87,
updatedAt: '2026-06-16',
},
capabilities: {},
contextWindow: 1000000,
releaseDate: '2026-04-24',
},
{
id: 'deepseek-v4-flash',
pricing: {
input: 0.14,
cachedInput: 0.0028,
output: 0.28,
updatedAt: '2026-06-16',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2026-04-24',
},
{
id: 'deepseek-chat',
pricing: {
input: 0.14,
cachedInput: 0.0028,
output: 0.28,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2024-12-26',
},
{
id: 'deepseek-v3',
pricing: {
input: 0.28,
cachedInput: 0.028,
output: 0.42,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 128000,
releaseDate: '2024-12-26',
deprecated: true,
},
{
id: 'deepseek-r1',
pricing: {
input: 0.55,
cachedInput: 0.14,
output: 2.19,
updatedAt: '2026-04-01',
},
capabilities: {},
contextWindow: 128000,
releaseDate: '2025-01-20',
deprecated: true,
},
{
id: 'deepseek-reasoner',
pricing: {
input: 0.14,
cachedInput: 0.0028,
output: 0.28,
updatedAt: '2026-06-11',
},
capabilities: {},
contextWindow: 1000000,
releaseDate: '2025-01-20',
},
],
},
xai: {
id: 'xai',
fileAttachment: { maxBytes: 20 * 1024 * 1024, strategy: 'remote-url' },
name: 'xAI',
description: "xAI's Grok models",
defaultModel: 'grok-4.5',
modelPatterns: [/^grok/],
icon: xAIIcon,
color: '#555555',
capabilities: {
toolUsageControl: true,
},
models: [
{
id: 'grok-4.5',
pricing: {
input: 2.0,
output: 6.0,
updatedAt: '2026-07-08',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 500000,
releaseDate: '2026-07-08',
recommended: true,
},
{
id: 'grok-4.3',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-05-05',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2026-04-30',
},
{
id: 'grok-4-latest',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2025-07-09',
deprecated: true,
},
{
id: 'grok-4-0709',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2025-07-09',
deprecated: true,
},
{
id: 'grok-4-1-fast-reasoning',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2025-11-19',
deprecated: true,
},
{
id: 'grok-4-1-fast-non-reasoning',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2025-11-19',
deprecated: true,
},
{
id: 'grok-4-fast-reasoning',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2025-09-19',
deprecated: true,
},
{
id: 'grok-4-fast-non-reasoning',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2025-09-19',
deprecated: true,
},
{
id: 'grok-code-fast-1',
pricing: {
input: 1.0,
cachedInput: 0.2,
output: 2.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 256000,
releaseDate: '2025-08-28',
deprecated: true,
},
{
id: 'grok-4.20-0309-reasoning',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2026-03-10',
},
{
id: 'grok-4.20-0309-non-reasoning',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2026-03-10',
},
{
id: 'grok-4.20-multi-agent-0309',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2026-03-10',
},
{
id: 'grok-3-latest',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2025-02-17',
deprecated: true,
},
{
id: 'grok-3-fast-latest',
pricing: {
input: 1.25,
cachedInput: 0.2,
output: 2.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
},
contextWindow: 1000000,
releaseDate: '2025-02-17',
deprecated: true,
},
],
},
cerebras: {
id: 'cerebras',
name: 'Cerebras',
description: 'Cerebras Cloud LLMs',
defaultModel: 'cerebras/gpt-oss-120b',
modelPatterns: [/^cerebras/],
icon: CerebrasIcon,
color: '#6D5BF7',
capabilities: {
toolUsageControl: true,
},
models: [
{
id: 'cerebras/gpt-oss-120b',
pricing: {
input: 0.35,
output: 0.75,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 40000,
},
contextWindow: 131072,
releaseDate: '2025-08-05',
},
{
id: 'cerebras/llama3.1-8b',
pricing: {
input: 0.1,
output: 0.1,
updatedAt: '2026-04-01',
},
capabilities: {},
contextWindow: 32768,
releaseDate: '2024-08-27',
deprecated: true,
},
{
id: 'cerebras/qwen-3-235b-a22b-instruct-2507',
pricing: {
input: 0.6,
output: 1.2,
updatedAt: '2026-04-01',
},
capabilities: {},
contextWindow: 131072,
releaseDate: '2025-07-29',
deprecated: true,
},
{
id: 'cerebras/zai-glm-4.7',
pricing: {
input: 2.25,
output: 2.75,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 40000,
},
contextWindow: 131072,
releaseDate: '2025-12-22',
},
{
id: 'cerebras/gemma-4-31b',
pricing: {
input: 0.99,
output: 1.49,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 2 },
maxOutputTokens: 40000,
},
contextWindow: 131072,
releaseDate: '2026-04-02',
},
],
},
groq: {
id: 'groq',
fileAttachment: { maxBytes: 20 * 1024 * 1024, strategy: 'remote-url' },
name: 'Groq',
description: "Groq's LLM models with high-performance inference",
defaultModel: 'groq/llama-3.3-70b-versatile',
modelPatterns: [/^groq/],
icon: GroqIcon,
color: '#F55036',
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
},
models: [
{
id: 'groq/openai/gpt-oss-120b',
pricing: {
input: 0.15,
cachedInput: 0.075,
output: 0.6,
updatedAt: '2026-06-11',
},
capabilities: {
maxOutputTokens: 65536,
},
contextWindow: 131072,
releaseDate: '2025-08-05',
recommended: true,
},
{
id: 'groq/openai/gpt-oss-20b',
pricing: {
input: 0.075,
cachedInput: 0.0375,
output: 0.3,
updatedAt: '2026-06-11',
},
capabilities: {
maxOutputTokens: 65536,
},
contextWindow: 131072,
releaseDate: '2025-08-05',
},
{
id: 'groq/openai/gpt-oss-safeguard-20b',
pricing: {
input: 0.075,
cachedInput: 0.0375,
output: 0.3,
updatedAt: '2026-06-11',
},
capabilities: {
maxOutputTokens: 65536,
},
contextWindow: 131072,
releaseDate: '2025-10-29',
},
{
id: 'groq/qwen/qwen3-32b',
pricing: {
input: 0.29,
output: 0.59,
updatedAt: '2026-06-11',
},
capabilities: {
maxOutputTokens: 40960,
},
contextWindow: 131072,
releaseDate: '2025-04-29',
deprecated: true,
},
{
id: 'groq/qwen/qwen3.6-27b',
pricing: {
input: 0.6,
output: 3.0,
updatedAt: '2026-07-10',
},
capabilities: {
maxOutputTokens: 32768,
},
contextWindow: 131072,
releaseDate: '2026-04-21',
},
{
id: 'groq/llama-3.1-8b-instant',
pricing: {
input: 0.05,
output: 0.08,
updatedAt: '2026-06-11',
},
capabilities: {
maxOutputTokens: 131072,
},
contextWindow: 131072,
releaseDate: '2024-07-23',
speedOptimized: true,
},
{
id: 'groq/llama-3.3-70b-versatile',
pricing: {
input: 0.59,
output: 0.79,
updatedAt: '2026-06-11',
},
capabilities: {
maxOutputTokens: 32768,
},
contextWindow: 131072,
releaseDate: '2024-12-06',
},
{
id: 'groq/meta-llama/llama-4-scout-17b-16e-instruct',
pricing: {
input: 0.11,
output: 0.34,
updatedAt: '2026-06-11',
},
capabilities: {
maxOutputTokens: 8192,
},
contextWindow: 131072,
releaseDate: '2025-04-05',
deprecated: true,
},
{
id: 'groq/moonshotai/kimi-k2-instruct-0905',
pricing: {
input: 1.0,
output: 3.0,
updatedAt: '2026-04-01',
},
capabilities: {},
contextWindow: 262144,
releaseDate: '2025-09-05',
deprecated: true,
},
],
},
sakana: {
id: 'sakana',
name: 'Sakana AI',
description: "Sakana AI's Fugu multi-agent models via an OpenAI-compatible API",
defaultModel: 'fugu',
modelPatterns: [/^fugu/],
icon: SakanaIcon,
color: '#E60000',
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
},
models: [
{
id: 'fugu',
pricing: {
input: 5,
cachedInput: 0.5,
output: 30,
updatedAt: '2026-06-22',
},
capabilities: {},
contextWindow: 1000000,
releaseDate: '2026-06-15',
speedOptimized: true,
},
{
id: 'fugu-ultra',
pricing: {
input: 5,
cachedInput: 0.5,
output: 30,
updatedAt: '2026-06-22',
},
capabilities: {},
contextWindow: 1000000,
releaseDate: '2026-06-15',
recommended: true,
},
],
},
nvidia: {
id: 'nvidia',
name: 'NVIDIA NIM',
description: "NVIDIA's Nemotron models via NIM's OpenAI-compatible API",
defaultModel: 'nvidia/nemotron-3-super-120b-a12b',
modelPatterns: [/^nvidia\//],
icon: NvidiaIcon,
color: '#77B900',
isReseller: true,
contextInformationAvailable: true,
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
},
models: [
{
id: 'nvidia/llama-3.1-nemotron-70b-instruct',
pricing: {
input: 1.2,
output: 1.2,
updatedAt: '2026-07-09',
},
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
maxOutputTokens: 4096,
},
contextWindow: 128000,
releaseDate: '2024-10-15',
},
{
id: 'nvidia/llama-3.1-nemotron-ultra-253b-v1',
pricing: {
input: 0.6,
output: 1.8,
updatedAt: '2026-07-09',
},
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
maxOutputTokens: 8192,
},
contextWindow: 131072,
releaseDate: '2025-04-07',
},
{
id: 'nvidia/llama-3.3-nemotron-super-49b-v1.5',
pricing: {
input: 0.4,
output: 0.4,
updatedAt: '2026-07-09',
},
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
maxOutputTokens: 8192,
},
contextWindow: 131072,
releaseDate: '2025-07-25',
},
{
id: 'nvidia/nemotron-3-nano-30b-a3b',
pricing: {
input: 0.05,
output: 0.2,
updatedAt: '2026-07-09',
},
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
maxOutputTokens: 8192,
},
contextWindow: 262144,
releaseDate: '2025-12-15',
speedOptimized: true,
},
{
id: 'nvidia/nemotron-3-super-120b-a12b',
pricing: {
input: 0.08,
output: 0.45,
updatedAt: '2026-07-09',
},
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
maxOutputTokens: 8192,
},
contextWindow: 1048576,
releaseDate: '2026-03-11',
recommended: true,
},
{
id: 'nvidia/nemotron-3-ultra-550b-a55b',
pricing: {
input: 0.5,
output: 2.2,
updatedAt: '2026-07-09',
},
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
maxOutputTokens: 8192,
},
contextWindow: 1048576,
releaseDate: '2026-06-04',
},
],
},
meta: {
id: 'meta',
name: 'Meta',
description: "Meta's Muse Spark models via the Meta Model API (OpenAI-compatible)",
defaultModel: 'muse-spark-1.1',
modelPatterns: [/^muse-spark/],
icon: MetaIcon,
color: '#0082FB',
capabilities: {
temperature: { min: 0, max: 2 },
toolUsageControl: true,
},
models: [
{
id: 'muse-spark-1.1',
pricing: {
input: 1.25,
cachedInput: 0.15,
output: 4.25,
updatedAt: '2026-07-09',
},
capabilities: {
reasoningEffort: {
values: ['minimal', 'low', 'medium', 'high', 'xhigh'],
},
},
contextWindow: 1048576,
releaseDate: '2026-07-09',
recommended: true,
},
],
},
zai: {
id: 'zai',
name: 'Z.ai',
description: "Z.ai's GLM models via an OpenAI-compatible API",
defaultModel: 'glm-4.6',
modelPatterns: [],
icon: ZaiIcon,
color: '#2D2D2D',
contextInformationAvailable: true,
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
},
models: [
{
id: 'glm-5.2',
pricing: {
input: 1.4,
output: 4.4,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 131072,
reasoningEffort: {
values: ['none', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'],
},
},
contextWindow: 1000000,
releaseDate: '2026-06-13',
recommended: true,
},
{
id: 'glm-5.1',
pricing: {
input: 1.4,
output: 4.4,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 131072,
thinking: {
levels: ['disabled', 'enabled'],
default: 'enabled',
},
},
contextWindow: 200000,
releaseDate: '2026-04-07',
},
{
id: 'glm-5',
pricing: {
input: 1.0,
output: 3.2,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 131072,
thinking: {
levels: ['disabled', 'enabled'],
default: 'enabled',
},
},
contextWindow: 200000,
releaseDate: '2026-02-11',
},
{
id: 'glm-5-turbo',
pricing: {
input: 1.2,
output: 4.0,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 131072,
thinking: {
levels: ['disabled', 'enabled'],
default: 'enabled',
},
},
contextWindow: 200000,
releaseDate: '2026-03-15',
},
{
id: 'glm-4.7',
pricing: {
input: 0.6,
output: 2.2,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 131072,
thinking: {
levels: ['disabled', 'enabled'],
default: 'enabled',
},
},
contextWindow: 200000,
releaseDate: '2025-12-22',
},
{
id: 'glm-4.7-flashx',
pricing: {
input: 0.07,
output: 0.4,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 131072,
},
contextWindow: 200000,
releaseDate: '2025-12-22',
},
{
id: 'glm-4.6',
pricing: {
input: 0.6,
output: 2.2,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 131072,
thinking: {
levels: ['disabled', 'enabled'],
default: 'enabled',
},
},
contextWindow: 200000,
releaseDate: '2025-09-30',
},
{
id: 'glm-4.5',
pricing: {
input: 0.6,
output: 2.2,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 98304,
thinking: {
levels: ['disabled', 'enabled'],
default: 'enabled',
},
},
contextWindow: 128000,
releaseDate: '2025-07-28',
},
{
id: 'glm-4.5-air',
pricing: {
input: 0.2,
output: 1.1,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 98304,
thinking: {
levels: ['disabled', 'enabled'],
default: 'enabled',
},
},
contextWindow: 128000,
releaseDate: '2025-07-28',
},
{
id: 'glm-4.5-x',
pricing: {
input: 2.2,
output: 8.9,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 98304,
},
contextWindow: 128000,
releaseDate: '2025-07-28',
},
{
id: 'glm-4.5-airx',
pricing: {
input: 1.1,
output: 4.5,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 98304,
},
contextWindow: 128000,
releaseDate: '2025-07-28',
},
{
id: 'glm-4-32b-0414-128k',
pricing: {
input: 0.1,
output: 0.1,
updatedAt: '2026-07-10',
},
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
maxOutputTokens: 16384,
},
contextWindow: 128000,
releaseDate: '2025-04-14',
},
],
},
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,
color: '#F7D046',
capabilities: {
toolUsageControl: true,
},
models: [
{
id: 'mistral-large-latest',
pricing: {
input: 0.5,
output: 1.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-12-02',
recommended: true,
},
{
id: 'mistral-large-2512',
pricing: {
input: 0.5,
output: 1.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-12-02',
},
{
id: 'mistral-small-2603',
pricing: {
input: 0.15,
output: 0.6,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2026-03-16',
},
{
id: 'devstral-2512',
pricing: {
input: 0.4,
output: 2.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-12-09',
},
{
id: 'mistral-large-2411',
pricing: {
input: 2.0,
output: 6.0,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2024-11-18',
deprecated: true,
},
{
id: 'magistral-medium-latest',
pricing: {
input: 2.0,
output: 5.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2025-09-18',
},
{
id: 'magistral-medium-2509',
pricing: {
input: 2.0,
output: 5.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2025-09-18',
},
{
id: 'magistral-small-latest',
pricing: {
input: 0.5,
output: 1.5,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2025-09-18',
deprecated: true,
},
{
id: 'magistral-small-2509',
pricing: {
input: 0.5,
output: 1.5,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2025-09-18',
deprecated: true,
},
{
id: 'mistral-medium-latest',
pricing: {
input: 0.4,
output: 2.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2025-08-12',
},
{
id: 'mistral-medium-2604',
pricing: {
input: 1.5,
output: 7.5,
updatedAt: '2026-06-16',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2026-04-29',
},
{
id: 'mistral-medium-2508',
pricing: {
input: 0.4,
output: 2.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2025-08-12',
},
{
id: 'mistral-medium-2505',
pricing: {
input: 0.4,
output: 2.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2025-05-07',
},
{
id: 'mistral-small-latest',
pricing: {
input: 0.15,
output: 0.6,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2026-03-16',
},
{
id: 'mistral-small-2506',
pricing: {
input: 0.1,
output: 0.3,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2025-06-20',
deprecated: true,
},
{
id: 'open-mistral-nemo',
pricing: {
input: 0.15,
output: 0.15,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2024-07-18',
},
{
id: 'codestral-latest',
pricing: {
input: 0.3,
output: 0.9,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-07-30',
},
{
id: 'codestral-2508',
pricing: {
input: 0.3,
output: 0.9,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-07-30',
},
{
id: 'devstral-latest',
pricing: {
input: 0.4,
output: 2.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-12-09',
},
{
id: 'devstral-small-latest',
pricing: {
input: 0.1,
output: 0.3,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-12-09',
deprecated: true,
},
{
id: 'devstral-small-2507',
pricing: {
input: 0.1,
output: 0.3,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2025-07-10',
deprecated: true,
},
{
id: 'devstral-medium-2507',
pricing: {
input: 0.4,
output: 2.0,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 128000,
releaseDate: '2025-07-10',
deprecated: true,
},
{
id: 'ministral-14b-latest',
pricing: {
input: 0.2,
output: 0.2,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-12-02',
speedOptimized: true,
},
{
id: 'ministral-14b-2512',
pricing: {
input: 0.2,
output: 0.2,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-12-02',
speedOptimized: true,
},
{
id: 'ministral-8b-latest',
pricing: {
input: 0.15,
output: 0.15,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-12-02',
speedOptimized: true,
},
{
id: 'ministral-8b-2512',
pricing: {
input: 0.15,
output: 0.15,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-12-02',
speedOptimized: true,
},
{
id: 'ministral-3b-latest',
pricing: {
input: 0.1,
output: 0.1,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-12-02',
speedOptimized: true,
},
{
id: 'ministral-3b-2512',
pricing: {
input: 0.1,
output: 0.1,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1.5 },
},
contextWindow: 256000,
releaseDate: '2025-12-02',
speedOptimized: true,
},
],
},
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,
color: '#FF9900',
isReseller: true,
capabilities: {
temperature: { min: 0, max: 1 },
toolUsageControl: true,
},
models: [
{
id: 'bedrock/anthropic.claude-opus-4-5-20251101-v1:0',
pricing: {
input: 5.0,
cachedInput: 0.5,
output: 25.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 64000,
},
contextWindow: 200000,
releaseDate: '2025-11-24',
},
{
id: 'bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0',
pricing: {
input: 3.0,
cachedInput: 0.3,
output: 15.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 64000,
},
contextWindow: 200000,
releaseDate: '2025-09-29',
recommended: true,
},
{
id: 'bedrock/anthropic.claude-haiku-4-5-20251001-v1:0',
pricing: {
input: 1.0,
cachedInput: 0.1,
output: 5.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 64000,
},
contextWindow: 200000,
releaseDate: '2025-10-15',
speedOptimized: true,
},
{
id: 'bedrock/anthropic.claude-opus-4-1-20250805-v1:0',
pricing: {
input: 15.0,
cachedInput: 1.5,
output: 75.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
nativeStructuredOutputs: true,
maxOutputTokens: 32000,
},
contextWindow: 200000,
releaseDate: '2025-08-05',
deprecated: true,
},
{
id: 'bedrock/amazon.nova-2-pro-v1:0',
pricing: {
input: 1.375,
output: 11.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 1000000,
releaseDate: '2025-12-02',
deprecated: true,
},
{
id: 'bedrock/amazon.nova-2-lite-v1:0',
pricing: {
input: 0.33,
cachedInput: 0.0825,
output: 2.75,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 64000,
},
contextWindow: 1000000,
releaseDate: '2025-12-02',
},
{
id: 'bedrock/amazon.nova-premier-v1:0',
pricing: {
input: 2.5,
cachedInput: 0.625,
output: 12.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 1000000,
releaseDate: '2025-04-30',
deprecated: true,
},
{
id: 'bedrock/amazon.nova-pro-v1:0',
pricing: {
input: 0.8,
cachedInput: 0.2,
output: 3.2,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 5120,
},
contextWindow: 300000,
releaseDate: '2024-12-03',
},
{
id: 'bedrock/amazon.nova-lite-v1:0',
pricing: {
input: 0.06,
cachedInput: 0.015,
output: 0.24,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 5120,
},
contextWindow: 300000,
releaseDate: '2024-12-03',
},
{
id: 'bedrock/amazon.nova-micro-v1:0',
pricing: {
input: 0.035,
cachedInput: 0.00875,
output: 0.14,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 5120,
},
contextWindow: 128000,
releaseDate: '2024-12-03',
speedOptimized: true,
},
{
id: 'bedrock/meta.llama4-maverick-17b-instruct-v1:0',
pricing: {
input: 0.24,
output: 0.97,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 8192,
},
contextWindow: 1000000,
releaseDate: '2025-04-05',
},
{
id: 'bedrock/meta.llama4-scout-17b-instruct-v1:0',
pricing: {
input: 0.17,
output: 0.66,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 8192,
},
contextWindow: 10000000,
releaseDate: '2025-04-05',
},
{
id: 'bedrock/meta.llama3-3-70b-instruct-v1:0',
pricing: {
input: 0.72,
output: 0.72,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 4096,
},
contextWindow: 128000,
releaseDate: '2024-12-06',
},
{
id: 'bedrock/meta.llama3-2-90b-instruct-v1:0',
pricing: {
input: 0.72,
output: 0.72,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 128000,
releaseDate: '2024-09-25',
deprecated: true,
},
{
id: 'bedrock/meta.llama3-2-11b-instruct-v1:0',
pricing: {
input: 0.16,
output: 0.16,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 128000,
releaseDate: '2024-09-25',
deprecated: true,
},
{
id: 'bedrock/meta.llama3-2-3b-instruct-v1:0',
pricing: {
input: 0.15,
output: 0.15,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 128000,
releaseDate: '2024-09-25',
deprecated: true,
},
{
id: 'bedrock/meta.llama3-2-1b-instruct-v1:0',
pricing: {
input: 0.1,
output: 0.1,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 128000,
releaseDate: '2024-09-25',
deprecated: true,
},
{
id: 'bedrock/meta.llama3-1-405b-instruct-v1:0',
pricing: {
input: 2.4,
output: 2.4,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 128000,
deprecated: true,
},
{
id: 'bedrock/meta.llama3-1-70b-instruct-v1:0',
pricing: {
input: 0.72,
output: 0.72,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 4096,
},
contextWindow: 128000,
releaseDate: '2024-07-23',
},
{
id: 'bedrock/meta.llama3-1-8b-instruct-v1:0',
pricing: {
input: 0.22,
output: 0.22,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 4096,
},
contextWindow: 128000,
releaseDate: '2024-07-23',
},
{
id: 'bedrock/mistral.mistral-large-3-675b-instruct',
pricing: {
input: 0.5,
output: 1.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 32768,
},
contextWindow: 256000,
releaseDate: '2025-12-02',
},
{
id: 'bedrock/mistral.mistral-large-2411-v1:0',
pricing: {
input: 2.0,
output: 6.0,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 128000,
deprecated: true,
},
{
id: 'bedrock/mistral.mistral-large-2407-v1:0',
pricing: {
input: 2.0,
output: 6.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 128000,
deprecated: true,
},
{
id: 'bedrock/mistral.pixtral-large-2502-v1:0',
pricing: {
input: 2.0,
output: 6.0,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 16384,
},
contextWindow: 128000,
},
{
id: 'bedrock/mistral.magistral-small-2509',
pricing: {
input: 0.5,
output: 1.5,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 40000,
},
contextWindow: 128000,
},
{
id: 'bedrock/mistral.ministral-3-14b-instruct',
pricing: {
input: 0.2,
output: 0.2,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 8192,
},
contextWindow: 128000,
releaseDate: '2025-12-02',
},
{
id: 'bedrock/mistral.ministral-3-8b-instruct',
pricing: {
input: 0.15,
output: 0.15,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 8192,
},
contextWindow: 128000,
releaseDate: '2025-12-02',
},
{
id: 'bedrock/mistral.ministral-3-3b-instruct',
pricing: {
input: 0.1,
output: 0.1,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 8192,
},
contextWindow: 128000,
releaseDate: '2025-12-02',
},
{
id: 'bedrock/mistral.mixtral-8x7b-instruct-v0:1',
pricing: {
input: 0.45,
output: 0.7,
updatedAt: '2026-06-11',
},
capabilities: {
temperature: { min: 0, max: 1 },
maxOutputTokens: 4096,
},
contextWindow: 32000,
},
{
id: 'bedrock/amazon.titan-text-premier-v1:0',
pricing: {
input: 0.5,
output: 1.5,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 32000,
deprecated: true,
},
{
id: 'bedrock/cohere.command-r-plus-v1:0',
pricing: {
input: 3.0,
output: 15.0,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 128000,
deprecated: true,
},
{
id: 'bedrock/cohere.command-r-v1:0',
pricing: {
input: 0.5,
output: 1.5,
updatedAt: '2026-04-01',
},
capabilities: {
temperature: { min: 0, max: 1 },
},
contextWindow: 128000,
deprecated: true,
},
],
},
}
export function getProviderModels(providerId: string): string[] {
return PROVIDER_DEFINITIONS[providerId]?.models.map((m) => m.id) || []
}
interface ModelCatalogEntry {
providerId: string
declIndex: number
releaseTime: number
}
/**
* Lowercased model ID → catalog position metadata, built once from the static
* provider catalog. Dynamic providers contribute nothing here because their model
* lists are populated at runtime (not at module load), and only catalog models are
* ever reordered by release date.
*/
const MODEL_CATALOG_INDEX: Map<string, ModelCatalogEntry> = new Map(
Object.entries(PROVIDER_DEFINITIONS).flatMap(([providerId, provider]) =>
provider.models.map((model, declIndex): [string, ModelCatalogEntry] => {
const parsed = model.releaseDate ? Date.parse(model.releaseDate) : Number.NaN
return [
model.id.toLowerCase(),
{
providerId,
declIndex,
releaseTime: Number.isNaN(parsed) ? Number.NEGATIVE_INFINITY : parsed,
},
]
})
)
)
/**
* Reorders model IDs so that, within each provider, newer models (by release date)
* come first — while preserving the caller's existing provider grouping order. The
* relative order of providers is taken from the order they first appear in `modelIds`,
* so the cross-provider layout the user already sees is never reshuffled.
*
* Models without a known release date keep their declaration order and sort after
* dated models within the same provider. IDs not found in the catalog (e.g.
* dynamically-discovered provider models) are left in their original order at the end.
*/
export function orderModelIdsByReleaseDate(modelIds: string[]): string[] {
const groups = new Map<string, string[]>()
const unknown: string[] = []
for (const id of modelIds) {
const meta = MODEL_CATALOG_INDEX.get(id.toLowerCase())
if (!meta) {
unknown.push(id)
continue
}
const bucket = groups.get(meta.providerId)
if (bucket) bucket.push(id)
else groups.set(meta.providerId, [id])
}
const ordered: string[] = []
for (const bucket of groups.values()) {
bucket.sort((a, b) => {
const ma = MODEL_CATALOG_INDEX.get(a.toLowerCase())!
const mb = MODEL_CATALOG_INDEX.get(b.toLowerCase())!
if (ma.releaseTime !== mb.releaseTime) return mb.releaseTime - ma.releaseTime
return ma.declIndex - mb.declIndex
})
ordered.push(...bucket)
}
ordered.push(...unknown)
return ordered
}
export const DYNAMIC_MODEL_PROVIDERS = [
'ollama',
'ollama-cloud',
'vllm',
'litellm',
'openrouter',
'fireworks',
'together',
'baseten',
] as const
function getAllStaticModelIds(): string[] {
const ids: string[] = []
for (const [providerId, provider] of Object.entries(PROVIDER_DEFINITIONS)) {
if ((DYNAMIC_MODEL_PROVIDERS as readonly string[]).includes(providerId)) continue
for (const model of provider.models) ids.push(model.id)
}
return ids
}
const STATIC_MODEL_ID_SET = new Set(getAllStaticModelIds().map((id) => id.toLowerCase()))
export function isKnownModelId(modelId: string): boolean {
if (!modelId || typeof modelId !== 'string') return false
const trimmed = modelId.trim()
if (!trimmed) return false
if (STATIC_MODEL_ID_SET.has(trimmed.toLowerCase())) return true
const lowered = trimmed.toLowerCase()
for (const provider of DYNAMIC_MODEL_PROVIDERS) {
if (lowered.startsWith(`${provider}/`)) return true
}
return false
}
function getRecommendedModels(): string[] {
const models: string[] = []
for (const [providerId, provider] of Object.entries(PROVIDER_DEFINITIONS)) {
if ((DYNAMIC_MODEL_PROVIDERS as readonly string[]).includes(providerId)) continue
for (const model of provider.models) {
if (model.recommended) models.push(model.id)
}
}
return models
}
export function suggestModelIdsForUnknownModel(_modelId: string, limit = 5): string[] {
const recommended = getRecommendedModels()
if (recommended.length > 0) return recommended.slice(0, limit)
return [
PROVIDER_DEFINITIONS.anthropic.defaultModel,
PROVIDER_DEFINITIONS.openai.defaultModel,
PROVIDER_DEFINITIONS.google.defaultModel,
]
.filter(Boolean)
.slice(0, limit)
}
export function getBaseModelProviders(): Record<string, ProviderId> {
return Object.entries(PROVIDER_DEFINITIONS)
.filter(
([providerId]) =>
![
'ollama',
'ollama-cloud',
'vllm',
'litellm',
'openrouter',
'fireworks',
'together',
'baseten',
].includes(providerId)
)
.reduce(
(map, [providerId, provider]) => {
provider.models.forEach((model) => {
map[model.id.toLowerCase()] = providerId as ProviderId
})
return map
},
{} as Record<string, ProviderId>
)
}
export function getProviderFromModel(model: string): ProviderId {
const normalizedModel = model.toLowerCase()
for (const [providerId, provider] of Object.entries(PROVIDER_DEFINITIONS)) {
if (
provider.models.some((providerModel) => providerModel.id.toLowerCase() === normalizedModel)
) {
return providerId as ProviderId
}
}
for (const [providerId, provider] of Object.entries(PROVIDER_DEFINITIONS)) {
if (provider.modelPatterns?.some((pattern) => pattern.test(normalizedModel))) {
return providerId as ProviderId
}
}
return 'ollama'
}
export function getProviderIcon(model: string): React.ComponentType<{ className?: string }> | null {
const providerId = getProviderFromModel(model)
return PROVIDER_DEFINITIONS[providerId]?.icon || null
}
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 getModelsWithTemperatureRange(max: number): string[] {
const models: string[] = []
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
for (const model of provider.models) {
if (model.capabilities.temperature?.max === max) {
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'),
...getProviderModels('zai'),
...getProviderModels('xai'),
]
}
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 updateLiteLLMModels(models: string[]): void {
PROVIDER_DEFINITIONS.litellm.models = models.map((modelId) => ({
id: modelId,
pricing: {
input: 0,
output: 0,
updatedAt: new Date().toISOString().split('T')[0],
},
capabilities: {},
}))
}
export function updateFireworksModels(models: string[]): void {
PROVIDER_DEFINITIONS.fireworks.models = models.map((modelId) => ({
id: modelId,
pricing: {
input: 0,
output: 0,
updatedAt: new Date().toISOString().split('T')[0],
},
capabilities: {},
}))
}
export function updateTogetherModels(models: string[]): void {
PROVIDER_DEFINITIONS.together.models = models.map((modelId) => ({
id: modelId,
pricing: {
input: 0,
output: 0,
updatedAt: new Date().toISOString().split('T')[0],
},
capabilities: {},
}))
}
export function updateBasetenModels(models: string[]): void {
PROVIDER_DEFINITIONS.baseten.models = models.map((modelId) => ({
id: modelId,
pricing: {
input: 0,
output: 0,
updatedAt: new Date().toISOString().split('T')[0],
},
capabilities: {},
}))
}
export function updateOllamaCloudModels(models: string[]): void {
PROVIDER_DEFINITIONS['ollama-cloud'].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: '2026-04-01',
},
'text-embedding-3-large': {
input: 0.13, // $0.13 per 1M tokens
output: 0.0,
updatedAt: '2026-04-01',
},
'text-embedding-ada-002': {
input: 0.1, // $0.1 per 1M tokens
output: 0.0,
updatedAt: '2026-04-01',
},
'gemini-embedding-001': {
input: 0.15, // $0.15 per 1M tokens
output: 0.0,
updatedAt: '2026-04-29',
},
}
export function getEmbeddingModelPricing(modelId: string): ModelPricing | null {
return EMBEDDING_MODEL_PRICING[modelId] || null
}
/**
* Cohere rerank pricing in USD per single search unit (one query × ≤100 docs).
* Sim caps every rerank request to ≤100 documents, so each call = 1 unit.
*/
export const RERANK_MODEL_PRICING: Record<string, { perSearchUnit: number; updatedAt: string }> = {
'rerank-v4.0-pro': { perSearchUnit: 0.0025, updatedAt: '2026-04-29' },
'rerank-v4.0-fast': { perSearchUnit: 0.002, updatedAt: '2026-04-29' },
'rerank-v3.5': { perSearchUnit: 0.002, updatedAt: '2026-04-29' },
}
export function getRerankModelPricing(
modelId: string
): { perSearchUnit: number; updatedAt: string } | null {
return RERANK_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 all models that support deep research capability
*/
export function getModelsWithDeepResearch(): string[] {
const models: string[] = []
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
for (const model of provider.models) {
if (model.capabilities.deepResearch) {
models.push(model.id)
}
}
}
return models
}
/**
* Get all models that explicitly disable memory support (memory: false).
* Models without this capability default to supporting memory.
*/
export function getModelsWithoutMemory(): string[] {
const models: string[] = []
for (const provider of Object.values(PROVIDER_DEFINITIONS)) {
for (const model of provider.models) {
if (model.capabilities.memory === false) {
models.push(model.id)
}
}
}
return models
}
/**
* Get the max output tokens for a specific model.
*
* @param modelId - The model ID
*/
export function getMaxOutputTokensForModel(modelId: string): number {
const normalizedModelId = modelId.toLowerCase()
const STANDARD_MAX_OUTPUT_TOKENS = 4096
const allModels = Object.values(PROVIDER_DEFINITIONS).flatMap((provider) => provider.models)
const exactMatch = allModels.find((model) => model.id.toLowerCase() === normalizedModelId)
if (exactMatch) {
return exactMatch.capabilities.maxOutputTokens || STANDARD_MAX_OUTPUT_TOKENS
}
for (const model of allModels) {
const baseModelId = model.id.toLowerCase()
if (normalizedModelId.startsWith(`${baseModelId}-`)) {
return model.capabilities.maxOutputTokens || STANDARD_MAX_OUTPUT_TOKENS
}
}
return STANDARD_MAX_OUTPUT_TOKENS
}