'use client'; import { useState, useEffect } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Label } from '@/components/ui/label'; import { Switch } from '@/components/ui/switch'; import { Badge } from '@/components/ui/badge'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { Slider } from '@/components/ui/slider'; import { Input } from '@/components/ui/input'; import { useSettingsStore } from '@/store/settings-store'; import { invoke } from '@tauri-apps/api/core'; import { Zap, Cpu } from 'lucide-react'; interface LocalGgufModel { path: string; name: string; size: number; quantization?: string; architecture?: string; } export function RuntimeSettingsPanel() { const { runtime, llamaCppParams, setRuntime, setLlamaCppParams } = useSettingsStore(); const [localModels, setLocalModels] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { loadLocalModels(); }, []); const loadLocalModels = async () => { try { setLoading(true); const models = await invoke('list_local_gguf_models'); setLocalModels(models); } catch (error) { console.error('Failed to load local GGUF models:', error); } finally { setLoading(false); } }; const hasLocalModels = localModels.length > 0; const isLlamaCppAvailable = hasLocalModels; return ( Runtime de Modelos Escolha entre Ollama (servidor externo) ou llama.cpp nativo (mais rápido, sem servidor) {/* Toggle de Runtime */}

{runtime === 'ollama' ? 'Usando Ollama como runtime (requer servidor externo)' : 'Usando llama.cpp nativo (mais rápido, sem servidor externo)'}

{runtime === 'ollama' ? ( <> 🦙 Ollama ) : ( <> llama.cpp )} {runtime === 'ollama' ? 'Usando Ollama como runtime (requer servidor externo)' : 'Usando llama.cpp nativo (mais rápido, sem servidor externo)'} setRuntime(checked ? 'llama-cpp' : 'ollama')} disabled={!isLlamaCppAvailable} />
{!isLlamaCppAvailable && (

Nenhum modelo GGUF local encontrado. Baixe modelos do Hugging Face para usar llama.cpp nativo.

)} {loading && (
Carregando modelos locais...
)} {hasLocalModels && (

Modelos GGUF locais encontrados: {localModels.length}

{localModels.slice(0, 5).map((model, idx) => (
• {model.name} {model.quantization && `(${model.quantization})`}
))} {localModels.length > 5 && (
... e mais {localModels.length - 5} modelo(s)
)}
)} {/* Configurações do llama.cpp */} {runtime === 'llama-cpp' && (

Número de camadas para carregar na GPU. 0 = CPU apenas

setLlamaCppParams({ nGpuLayers: value }) } min={0} max={100} step={1} className="flex-1" /> setLlamaCppParams({ nGpuLayers: parseInt(e.target.value) || 0 }) } className="w-20" min={0} max={100} />

Tamanho máximo do contexto em tokens

setLlamaCppParams({ nCtx: value }) } min={512} max={32768} step={512} className="flex-1" /> setLlamaCppParams({ nCtx: parseInt(e.target.value) || 4096 }) } className="w-24" min={512} max={32768} step={512} />

Número de threads (0 = automático)

setLlamaCppParams({ threads: parseInt(e.target.value) || 0 }) } className="w-32" min={0} max={32} />

Controla a aleatoriedade das respostas (0.0 - 2.0)

setLlamaCppParams({ temperature: value }) } min={0} max={2} step={0.1} className="flex-1" /> setLlamaCppParams({ temperature: parseFloat(e.target.value) || 0.7 }) } className="w-20" min={0} max={2} step={0.1} />
)}
); }