// Inference provider login component for inline authentication import { useState, useMemo } from 'react'; import { useInference } from '@/contexts/InferenceContext'; import { OpenRouterApiProvider } from '@/providers/openrouter/api-provider'; import { OpenRouterOAuthProvider } from '@/providers/openrouter/oauth-provider'; export function InferenceLogin() { const { provider: currentProvider, setProvider, models, refreshAuthState } = useInference(); const [selectedProviderId, setSelectedProviderId] = useState(currentProvider?.id || ''); const [apiKey, setApiKey] = useState(''); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); // Create available providers const availableProviders = useMemo(() => [ new OpenRouterApiProvider(), new OpenRouterOAuthProvider(), ], []); const selectedProvider = availableProviders.find(p => p.id === selectedProviderId); const handleApiKeyLogin = async () => { if (!selectedProvider || !apiKey.trim()) return; setIsLoading(true); setError(null); try { await selectedProvider.authenticate({ type: 'api_key', apiKey: apiKey.trim(), }); // Load models after authentication await selectedProvider.loadModels(); // Set this as the active provider setProvider(selectedProvider); refreshAuthState(); // Force re-render to show auth state setApiKey(''); // Clear the API key input } catch (err) { setError(err instanceof Error ? err.message : 'Authentication failed'); } finally { setIsLoading(false); } }; const handleOAuthLogin = async () => { if (!selectedProvider) return; setIsLoading(true); setError(null); try { await selectedProvider.authenticate({ type: 'oauth', }); // Set this as the active provider setProvider(selectedProvider); refreshAuthState(); // Force re-render to show auth state } catch (err) { setError(err instanceof Error ? err.message : 'OAuth authentication failed'); } finally { setIsLoading(false); } }; const capabilities = selectedProvider?.getCapabilities(); return (

Connect to AI Provider

Choose a provider and authenticate to start chatting

{error && (

{error}

)} {/* Provider Selection */}
{selectedProvider && capabilities && (
{/* API Key Authentication */} {capabilities.authMethods.includes('api_key') && (
setApiKey(e.target.value)} placeholder="Enter your API key..." className="flex-1 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500" onKeyDown={(e) => { if (e.key === 'Enter' && apiKey.trim()) { handleApiKeyLogin(); } }} />

Your API key is stored locally and never sent to our servers

)} {/* OAuth Authentication */} {capabilities.authMethods.includes('oauth') && (
{capabilities.authMethods.includes('api_key') && (
or
)}
)}
)} {currentProvider?.isAuthenticated && models.length > 0 && (
✓ Connected successfully! You can now start chatting.
)}
); }