Permissões Administrativas Necessárias
O Windows solicitou permissões de administrador para instalar o Ollama.
O que fazer:
Verifique se apareceu um prompt do Windows pedindo permissões
Clique em "Sim" ou "Allow" no prompt de UAC (User Account Control)
Aguarde alguns segundos para a instalação continuar
Se o prompt não apareceu, tente executar o OllaHub como administrador
{errorMessage}
);
case 'ERR_DOWNLOAD_FAIL':
return (
Erro ao Baixar Instalador
Não foi possível baixar o instalador do Ollama. Verifique sua conexão com a internet.
{errorMessage}
);
case 'ERR_TIMEOUT':
return (
Instalação Demorando Mais do Que o Esperado
A instalação pode ainda estar em andamento em segundo plano.
O processo de instalação pode levar alguns minutos. Se o Ollama estiver sendo instalado,
você pode verificar o status manualmente.
{errorMessage}
);
default:
return (
Erro na instalação
{errorMessage}
);
}
}
type InstallStepState = 'IDLE' | 'INSTALLING' | 'VERIFYING' | 'SUCCESS';
interface OllamaInstallStepProps {
onNext: () => void;
}
export function OllamaInstallStep({ onNext }: OllamaInstallStepProps) {
const { state, installOllama, checkChocolatey, installChocolatey, installOllamaViaChoco, checkSetupState } = useSetupWizard();
const { os: detectedOS } = useOperatingSystem();
const downloadState = useOllamaDownload();
const ollamaCheck = useOllamaCheck();
const [stepState, setStepState] = useState('IDLE');
const [useChocolatey, setUseChocolatey] = useState(false);
const [showTerminal, setShowTerminal] = useState(false);
const [isRetrying, setIsRetrying] = useState(false);
const installationInProgressRef = useRef(false);
const hasCheckedInitialRef = useRef(false);
// Função de polling ativo para aguardar serviço ficar disponível
const waitForService = async (maxAttempts = 15): Promise => {
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
const isIntact = await invoke('verify_ollama_integrity_command');
if (isIntact) {
return true;
}
} catch (error) {
console.warn(`Tentativa ${attempt}/${maxAttempts} falhou:`, error);
}
if (attempt < maxAttempts) {
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
throw new Error('Ollama não ficou disponível após 30 segundos');
};
// Verificação inicial no mount: se Ollama já estiver instalado, ir direto para SUCCESS
useEffect(() => {
if (hasCheckedInitialRef.current) return;
const checkInitial = async () => {
if (stepState === 'IDLE') {
try {
const isIntact = await invoke('verify_ollama_integrity_command');
if (isIntact) {
// Se a integridade está OK, atualizar estado do wizard e ir para SUCCESS
await checkSetupState();
setStepState('SUCCESS');
}
} catch {
// Silenciosamente ignorar - usuário ainda não instalou
}
}
hasCheckedInitialRef.current = true;
};
checkInitial();
}, [stepState, checkSetupState]);
// Sincronizar estado do polling com wizard state e atualizar FSM
useEffect(() => {
if (ollamaCheck.status === 'running' && !state.ollamaRunning) {
// Polling detectou que Ollama está rodando, atualizar wizard state
checkSetupState().catch(console.error);
}
// Atualizar FSM baseado no status
if (stepState === 'VERIFYING' && ollamaCheck.status === 'running' && state.ollamaInstalled && state.ollamaRunning) {
setStepState('SUCCESS');
ollamaCheck.stopPolling();
}
}, [ollamaCheck.status, state.ollamaRunning, state.ollamaInstalled, checkSetupState, stepState, ollamaCheck]);
const handleManualRetry = async () => {
setIsRetrying(true);
try {
await checkSetupState();
// Se já estiver instalado, ir para SUCCESS
if (state.ollamaInstalled && state.ollamaRunning) {
setStepState('SUCCESS');
} else {
// Iniciar verificação manual
setStepState('VERIFYING');
ollamaCheck.startPolling();
}
} catch (error) {
console.error('Erro ao verificar novamente:', error);
} finally {
setIsRetrying(false);
}
};
const handleCheckExisting = async () => {
setStepState('VERIFYING');
ollamaCheck.startPolling();
await checkSetupState();
};
const handleInstall = async () => {
if (installationInProgressRef.current) {
return; // Evitar múltiplas instalações simultâneas
}
installationInProgressRef.current = true;
setStepState('INSTALLING');
setShowTerminal(true);
try {
// No Windows, verificar se Chocolatey está disponível
if (detectedOS === 'windows') {
const hasChoco = await checkChocolatey();
if (hasChoco) {
setUseChocolatey(true);
// Instalar Ollama via Chocolatey
await installOllamaViaChoco();
// Após instalação, fazer polling ativo
setStepState('VERIFYING');
await waitForService(15); // 15 tentativas = 30 segundos
// Se chegou aqui, Ollama está funcional
setStepState('SUCCESS');
await checkSetupState(); // Atualizar estado do wizard
installationInProgressRef.current = false;
return;
} else {
// Tentar instalar Chocolatey primeiro
try {
await installChocolatey();
setUseChocolatey(true);
await installOllamaViaChoco();
// Após instalação, fazer polling ativo
setStepState('VERIFYING');
await waitForService(15); // 15 tentativas = 30 segundos
// Se chegou aqui, Ollama está funcional
setStepState('SUCCESS');
await checkSetupState(); // Atualizar estado do wizard
installationInProgressRef.current = false;
return;
} catch (error) {
console.warn('Falha ao usar Chocolatey, usando instalação direta:', error);
setUseChocolatey(false);
setShowTerminal(false);
}
}
}
// Fallback: instalação direta
if (!downloadState.filePath && detectedOS) {
await downloadState.handleDownload(detectedOS);
}
if (downloadState.filePath) {
await installOllama(downloadState.filePath);
} else {
await installOllama();
}
// Após instalação, fazer polling ativo
setStepState('VERIFYING');
await waitForService(15); // 15 tentativas = 30 segundos
// Se chegou aqui, Ollama está funcional
setStepState('SUCCESS');
await checkSetupState(); // Atualizar estado do wizard
} catch (error) {
console.error('Erro ao aguardar serviço:', error);
setStepState('IDLE');
} finally {
installationInProgressRef.current = false;
}
};
// Estado SUCCESS: mostrar mensagem de sucesso e botão Continuar
if (stepState === 'SUCCESS' || (state.ollamaInstalled && state.ollamaRunning)) {
return (
Instalação Concluída
Ollama está instalado e rodando com sucesso.
Ollama Service is Running
Pronto para continuar com o download de modelos.
);
}
// Estado IDLE: mostrar card informativo
if (stepState === 'IDLE') {
return (
Ollama Engine
O OllaHub requer o motor Ollama para executar IAs localmente.
O Ollama é uma ferramenta open-source que permite executar modelos de linguagem grandes (LLMs) diretamente no seu computador, sem necessidade de conexão com a internet.