import { useModel } from './ModelContext'; // Import the useModel hook import { Model } from './ModelContext'; import { useMemo } from 'react'; import { gooseModels } from './GooseModels'; import { ToastFailureGeneral, ToastSuccessModelSwitch } from './toasts'; import { initializeSystem } from '../../../utils/providerUtils'; import { useRecentModels } from './RecentModels'; export function useHandleModelSelection() { const { switchModel, currentModel } = useModel(); // Access switchModel via useModel const { addRecentModel } = useRecentModels(); // Access addRecentModel from useRecentModels return async (model: Model, componentName?: string) => { try { // Check if the selected model is already the active model if (currentModel && currentModel.id === model.id) { console.log(`[${componentName}] Selected model is already active: ${model.name}`); return; } // Call the context's switchModel to update the model switchModel(model); // Keep track of the recently used models addRecentModel(model); // switch models via the backend // initialize agent await initializeSystem(model.provider.toLowerCase(), model.name); // Log to the console for tracking console.log(`[${componentName}] Switched to model: ${model.name} (${model.provider})`); // Display a success toast notification ToastSuccessModelSwitch(model); } catch (error) { // Handle errors gracefully console.error(`[${componentName}] Failed to switch model:`, error); // Display an error toast notification ToastFailureGeneral(`Failed to switch to model: ${model.name}`); } }; } export function createSelectedModel(selectedProvider, modelName) { let selectedModel = gooseModels.find( (model) => model.provider.toLowerCase() === selectedProvider && model.name.toLowerCase() === modelName.toLowerCase() ); if (!selectedModel) { // Normalize the casing for the provider using the first matching model const normalizedProvider = gooseModels.find((model) => model.provider.toLowerCase() === selectedProvider)?.provider || selectedProvider; // Construct a model object selectedModel = { name: modelName, provider: normalizedProvider, // Use normalized provider }; } return selectedModel; } export function useFilteredModels(search: string, activeKeys: string[]) { const filteredModels = useMemo(() => { const modelOptions = gooseModels.filter((model) => activeKeys.includes(model.provider)); if (!search) { return modelOptions; // Return all models if no search term } return modelOptions.filter((model) => model.name.toLowerCase().includes(search.toLowerCase())); }, [search, activeKeys]); return filteredModels; }