// OLLAMA // // URL base do Ollama // Importante: Centralizamos a configuração aqui para facilitar mudanças futuras // const OLLAMA_BASE_URL = 'http://localhost:11434'; // // Interface para tipar a requisição ao Ollama // Isso nos ajuda a ter autocompletar e evitar erros de digitação interface OllamaMessage { role: 'user' | 'assistant' | 'system'; content: string; } interface OllamaChatRequest { model: string; messages: OllamaMessage[]; stream?: boolean; } interface OllamaChatResponse { model: string; created_at: string; message: { role: string; content: string; }; done: boolean; } // Método que chama o Ollama via HTTP request // Este método encapsula toda a lógica de comunicação com o Ollama // Seguindo o princípio de Responsabilidade Única (Single Responsibility - SOLID) // // Agora aceita um array de mensagens para suportar RAG com contexto async function chamarOllama( mensagemUsuario: string, mensagemSistema?: string, modelo: string = 'qwen3:0.6b', ): Promise { try { // Prepara as mensagens // Se houver mensagem de sistema (contexto RAG), adiciona primeiro const messages: OllamaMessage[] = []; if (mensagemSistema) { messages.push({ role: 'system', content: mensagemSistema }); } messages.push({ role: 'user', content: mensagemUsuario }); // Preparamos o corpo da requisição conforme a documentação do Ollama const requestBody: OllamaChatRequest = { model: modelo, // Você pode mudar para outros modelos como 'mistral', 'codellama', etc messages: messages, stream: false // Desabilitamos o streaming para simplificar a resposta }; // Fazemos a requisição HTTP POST para o endpoint do Ollama // O endpoint /api/chat é o padrão para conversas const response = await fetch(`${OLLAMA_BASE_URL}/api/chat`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(requestBody) }); // Verificamos se a requisição foi bem-sucedida // Status 200-299 são considerados sucesso if (!response.ok) { throw new Error(`Ollama retornou status ${response.status}`); } // Convertemos a resposta para JSON const data = await response.json() as OllamaChatResponse; // Retornamos apenas o conteúdo da mensagem do assistente return data.message.content; } catch (erro) { // Registramos o erro no console para facilitar debug console.error('Erro ao chamar Ollama:', erro); // Lançamos um erro mais descritivo // Isso permite que quem chama essa função saiba o que aconteceu throw new Error('Falha na comunicação com o Ollama'); } } export { chamarOllama };