项目文件夹

文件
wehub-resource-sync d25d482dc2
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
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

4267 行
107 KiB
TypeScript

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
/**
* 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
}