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
4267 lines
107 KiB
TypeScript
4267 lines
107 KiB
TypeScript
/**
|
||
* Comprehensive provider definitions - Single source of truth
|
||
* This file contains all provider and model information including:
|
||
* - Model lists
|
||
* - Pricing information
|
||
* - Model capabilities (temperature support, etc.)
|
||
* - Provider configurations
|
||
*/
|
||
|
||
import type React from 'react'
|
||
import {
|
||
AnthropicIcon,
|
||
AzureIcon,
|
||
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
|
||
}
|