| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // 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<string> {
- 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 };
|