Repository Public MIT
1import type { LucideIcon } from "lucide-react";2import {3 Wand2, Crown, Gem, Atom, Feather, Rabbit,4 Sun, Earth, Moon, Bot, Brain, Cpu, Zap, Sparkles, Rocket, Bird, Globe,5} from "lucide-react";6import type { ClaudeModel } from "@/hooks/useChatSession";78export type ModelProvider = "anthropic" | "openai" | "google";910export interface ModelOption {11 value: ClaudeModel;12 label: string;13 sub: string;14 icon: LucideIcon;15 provider: ModelProvider;16 /** vitesse relative 1 (lent) → 3 (rapide) */17 speed: 1 | 2 | 3;18 /** intelligence relative 1 → 3 */19 power: 1 | 2 | 3;20 context?: string;21 badge?: string;22 disabled?: boolean;23}2425export const PROVIDER_LABEL: Record<ModelProvider, string> = {26 anthropic: "Anthropic",27 openai: "OpenAI",28 google: "Google",29};3031export const MODEL_OPTIONS: ModelOption[] = [32 { value: "claude-fable-5", label: "Fable 5", sub: "Le plus intelligent", icon: Wand2, provider: "anthropic", speed: 2, power: 3, context: "1M", badge: "Défaut" },33 { value: "claude-opus-4-8", label: "Opus 4.8", sub: "Agentique long horizon", icon: Crown, provider: "anthropic", speed: 1, power: 3, context: "1M" },34 { value: "claude-opus-4-7", label: "Opus 4.7", sub: "Équilibré", icon: Gem, provider: "anthropic", speed: 2, power: 3, context: "1M" },35 { value: "claude-opus-4-6", label: "Opus 4.6", sub: "Rapide et capable", icon: Atom, provider: "anthropic", speed: 2, power: 2, context: "1M" },36 { value: "claude-sonnet-4-6", label: "Sonnet 4.6", sub: "Polyvalent", icon: Feather, provider: "anthropic", speed: 3, power: 2, context: "1M" },37 { value: "claude-haiku-4-5-20251001", label: "Haiku 4.5", sub: "Le plus rapide", icon: Rabbit, provider: "anthropic", speed: 3, power: 1, context: "200K" },3839 { value: "gpt-5.6-sol", label: "GPT-5.6 Sol", sub: "Le plus puissant", icon: Sun, provider: "openai", speed: 1, power: 3 },40 { value: "gpt-5.6-terra", label: "GPT-5.6 Terra", sub: "Équilibré", icon: Earth, provider: "openai", speed: 2, power: 2 },41 { value: "gpt-5.6-luna", label: "GPT-5.6 Luna", sub: "Rapide et économe", icon: Moon, provider: "openai", speed: 3, power: 2 },42 { value: "gpt-5.5", label: "GPT-5.5", sub: "Puissant", icon: Bot, provider: "openai", speed: 2, power: 3 },43 { value: "gpt-5.4", label: "GPT-5.4", sub: "Contexte 1M", icon: Brain, provider: "openai", speed: 2, power: 2, context: "1M" },44 { value: "gpt-5.2", label: "GPT-5.2", sub: "Puissant", icon: Cpu, provider: "openai", speed: 2, power: 2 },45 { value: "gpt-5.1", label: "GPT-5.1", sub: "Équilibré", icon: Zap, provider: "openai", speed: 2, power: 2 },46 { value: "gpt-5", label: "GPT-5", sub: "Classique", icon: Sparkles, provider: "openai", speed: 2, power: 2 },47 { value: "gpt-5-mini", label: "GPT-5 Mini", sub: "Rapide", icon: Rocket, provider: "openai", speed: 3, power: 1 },48 { value: "gpt-5-nano", label: "GPT-5 Nano", sub: "Le plus rapide", icon: Bird, provider: "openai", speed: 3, power: 1 },49 { value: "gpt-4.1", label: "GPT-4.1", sub: "Contexte 1M", icon: Globe, provider: "openai", speed: 2, power: 2, context: "1M" },50 { value: "gpt-4.1-mini", label: "GPT-4.1 Mini", sub: "Économe", icon: Feather, provider: "openai", speed: 3, power: 1 },5152 { value: "gemini-3.5-flash", label: "Gemini 3.5 Flash", sub: "Le plus récent", icon: Sparkles, provider: "google", speed: 3, power: 2 },53 { value: "gemini-3.1-pro-preview", label: "Gemini 3.1 Pro", sub: "Le plus puissant", icon: Gem, provider: "google", speed: 1, power: 3 },54 { value: "gemini-3-flash-preview", label: "Gemini 3 Flash", sub: "Équilibré", icon: Zap, provider: "google", speed: 3, power: 2 },55 { value: "gemini-3.1-flash-lite", label: "Gemini 3.1 Flash Lite", sub: "Le plus rapide", icon: Bird, provider: "google", speed: 3, power: 1 },56];5758export const DEFAULT_MODEL: ClaudeModel = "claude-fable-5";5960export function getModel(value?: string | null): ModelOption {61 return MODEL_OPTIONS.find((m) => m.value === value) ?? MODEL_OPTIONS[0];62}6364export function groupModelsByProvider(): { provider: ModelProvider; label: string; models: ModelOption[] }[] {65 const providers: ModelProvider[] = ["anthropic", "openai", "google"];66 return providers.map((provider) => ({67 provider,68 label: PROVIDER_LABEL[provider],69 models: MODEL_OPTIONS.filter((m) => m.provider === provider),70 }));71}72