'use client'; import { useState, useEffect } from 'react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Label } from '@/components/ui/label'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Button } from '@/components/ui/button'; import { Switch } from '@/components/ui/switch'; import { Slider } from '@/components/ui/slider'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Badge } from '@/components/ui/badge'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { useSettingsStore } from '@/store/settings-store'; import { DomainTagsInput } from '@/components/settings/domain-tags-input'; import { invoke } from '@tauri-apps/api/core'; import { getCurrentWindow } from '@tauri-apps/api/window'; import { CheckCircle2, XCircle, Loader2, Download, Trash2, Copy, ExternalLink, Plus, X, BookOpen, GraduationCap, Newspaper, Code, DollarSign } from 'lucide-react'; import { useToast } from '@/hooks/use-toast'; interface Model { name: string; modified_at: string; size: number; } export default function SettingsPage() { const settings = useSettingsStore(); const { toast } = useToast(); const [isCheckingConnection, setIsCheckingConnection] = useState(false); const [connectionStatus, setConnectionStatus] = useState<'idle' | 'success' | 'error'>('idle'); const [availableModels, setAvailableModels] = useState([]); const [isLoadingModels, setIsLoadingModels] = useState(false); const [storagePath, setStoragePath] = useState(''); const [showClearDialog, setShowClearDialog] = useState(false); const [isExporting, setIsExporting] = useState(false); const [isClearing, setIsClearing] = useState(false); // Load models and storage path on mount useEffect(() => { loadModels(); loadStoragePath(); }, [settings.ollamaUrl]); const loadModels = async () => { setIsLoadingModels(true); try { const response = await fetch(`${settings.ollamaUrl}/api/tags`); if (response.ok) { const data = await response.json(); setAvailableModels(data.models || []); } else { setAvailableModels([]); } } catch (error) { console.error('Failed to load models:', error); setAvailableModels([]); } finally { setIsLoadingModels(false); } }; const loadStoragePath = async () => { try { const path = await invoke('get_app_data_dir'); setStoragePath(path); } catch (error) { console.error('Failed to load storage path:', error); setStoragePath('N/A'); } }; const checkConnection = async () => { setIsCheckingConnection(true); setConnectionStatus('idle'); try { const response = await fetch(`${settings.ollamaUrl}/api/tags`, { method: 'HEAD', }); if (response.ok) { setConnectionStatus('success'); toast({ title: 'Conexão bem-sucedida', description: 'Ollama está acessível neste endpoint.', }); // Reload models after successful connection loadModels(); } else { setConnectionStatus('error'); toast({ title: 'Erro de conexão', description: `Status: ${response.status}`, variant: 'destructive', }); } } catch (error) { setConnectionStatus('error'); toast({ title: 'Erro de conexão', description: error instanceof Error ? error.message : 'Falha ao conectar', variant: 'destructive', }); } finally { setIsCheckingConnection(false); } }; const handleExportChats = async () => { setIsExporting(true); try { await invoke('export_chat_sessions'); toast({ title: 'Exportação concluída', description: 'Todos os chats foram exportados com sucesso.', }); } catch (error) { console.error('Failed to export chats:', error); toast({ title: 'Erro na exportação', description: error instanceof Error ? error.message : 'Falha ao exportar', variant: 'destructive', }); } finally { setIsExporting(false); } }; const handleClearHistory = async () => { setIsClearing(true); try { await invoke('clear_chat_history'); toast({ title: 'Histórico apagado', description: 'Todas as conversas foram removidas.', }); setShowClearDialog(false); } catch (error) { console.error('Failed to clear history:', error); toast({ title: 'Erro ao apagar', description: error instanceof Error ? error.message : 'Falha ao apagar histórico', variant: 'destructive', }); } finally { setIsClearing(false); } }; const copyStoragePath = async () => { try { await navigator.clipboard.writeText(storagePath); toast({ title: 'Caminho copiado', description: 'O caminho foi copiado para a área de transferência.', }); } catch (error) { console.error('Failed to copy path:', error); } }; return (

Configurações

Gerencie as preferências do OllaHub

AI & Models Web Search Sources & Knowledge Data & Storage {/* Tab: AI & Models */} Conexão Ollama Configure o endpoint do Ollama local
settings.setOllamaUrl(e.target.value)} placeholder="http://localhost:11434" />
{isLoadingModels ? (
Carregando modelos...
) : availableModels.length > 0 ? ( ) : ( settings.setSelectedModel(e.target.value)} placeholder="Digite o nome do modelo..." /> )}
System Prompt Defina a personalidade e comportamento padrão da IA