import System from "@/models/system"; import { useEffect, useState } from "react"; // Providers which cannot use this feature for workspace<>model selection export const DISABLED_PROVIDERS = ["azure", "lmstudio", "native"]; const PROVIDER_DEFAULT_MODELS = { openai: [], gemini: ["gemini-pro"], anthropic: [ "claude-instant-1.2", "claude-2.0", "claude-2.1", "claude-3-opus-20240229", "claude-3-sonnet-20240229", "claude-3-haiku-20240307", ], azure: [], lmstudio: [], localai: [], ollama: [], togetherai: [], groq: ["llama2-70b-4096", "mixtral-8x7b-32768"], native: [], }; // For togetherAi, which has a large model list - we subgroup the options // by their creator organization (eg: Meta, Mistral, etc) // which makes selection easier to read. function groupModels(models) { return models.reduce((acc, model) => { acc[model.organization] = acc[model.organization] || []; acc[model.organization].push(model); return acc; }, {}); } const groupedProviders = ["togetherai", "openai"]; export default function useGetProviderModels(provider = null) { const [defaultModels, setDefaultModels] = useState([]); const [customModels, setCustomModels] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { async function fetchProviderModels() { if (!provider) return; const { models = [] } = await System.customModels(provider); if ( PROVIDER_DEFAULT_MODELS.hasOwnProperty(provider) && !groupedProviders.includes(provider) ) { setDefaultModels(PROVIDER_DEFAULT_MODELS[provider]); } else { setDefaultModels([]); } groupedProviders.includes(provider) ? setCustomModels(groupModels(models)) : setCustomModels(models); setLoading(false); } fetchProviderModels(); }, [provider]); return { defaultModels, customModels, loading }; }