import React, { useState, useEffect, useCallback, useMemo } from 'react'; import { AIRouterContext } from '../hooks/useAIRouterContext'; import { AIRouter } from '../router/AIRouter'; import { AIRouterConfig, AIRouterContextValue, AIRoute, AIProviderConfig, AIProvider } from '../types/ai'; interface AIRouterProviderProps { config: AIRouterConfig; children: React.ReactNode; } export function AIRouterProvider({ config, children }: AIRouterProviderProps) { const [router, setRouter] = useState(() => new AIRouter(config)); const [currentConfig, setCurrentConfig] = useState(config); const [availableProviders, setAvailableProviders] = useState([]); // Update router when config changes useEffect(() => { const newRouter = new AIRouter(config); setRouter(newRouter); setCurrentConfig(config); // Cleanup old router return () => { router.cleanup(); }; }, [config]); // Check provider availability on mount and periodically useEffect(() => { const checkProviders = async () => { try { const available = await router.getAvailableProviders(); setAvailableProviders(available); } catch (error) { console.warn('Failed to check provider availability:', error); } }; checkProviders(); // Check every 30 seconds const interval = setInterval(checkProviders, 30000); return () => clearInterval(interval); }, [router]); const updateConfig = useCallback((newConfig: Partial) => { const updatedConfig = { ...currentConfig, ...newConfig }; setCurrentConfig(updatedConfig); router.updateConfig(newConfig); }, [currentConfig, router]); const executeRoute = useCallback(async ( route: AIRoute, input: TInput, provider?: AIProviderConfig ): Promise => { return await router.execute(route, input, provider); }, [router]); const isProviderAvailable = useCallback((provider: AIProvider): boolean => { return availableProviders.includes(provider); }, [availableProviders]); const contextValue: AIRouterContextValue = useMemo(() => ({ config: currentConfig, updateConfig, executeRoute, isProviderAvailable }), [currentConfig, updateConfig, executeRoute, isProviderAvailable]); return ( {children} ); } /** * Higher-order component to provide AI Router context */ export function withAIRouter

( Component: React.ComponentType

, config: AIRouterConfig ) { return function WithAIRouterComponent(props: P) { return ( ); }; } /** * Hook to dynamically update AI Router configuration */ export function useAIRouterConfig() { const [config, setConfig] = useState>({}); const updateConfig = useCallback((newConfig: Partial) => { setConfig(prev => ({ ...prev, ...newConfig })); }, []); const resetConfig = useCallback(() => { setConfig({}); }, []); return { config, updateConfig, resetConfig }; }