ollama.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // OLLAMA
  2. //
  3. // URL base do Ollama
  4. // Importante: Centralizamos a configuração aqui para facilitar mudanças futuras
  5. //
  6. const OLLAMA_BASE_URL = 'http://localhost:11434';
  7. //
  8. // Interface para tipar a requisição ao Ollama
  9. // Isso nos ajuda a ter autocompletar e evitar erros de digitação
  10. interface OllamaMessage {
  11. role: 'user' | 'assistant' | 'system';
  12. content: string;
  13. }
  14. interface OllamaChatRequest {
  15. model: string;
  16. messages: OllamaMessage[];
  17. stream?: boolean;
  18. }
  19. interface OllamaChatResponse {
  20. model: string;
  21. created_at: string;
  22. message: {
  23. role: string;
  24. content: string;
  25. };
  26. done: boolean;
  27. }
  28. // Método que chama o Ollama via HTTP request
  29. // Este método encapsula toda a lógica de comunicação com o Ollama
  30. // Seguindo o princípio de Responsabilidade Única (Single Responsibility - SOLID)
  31. //
  32. // Agora aceita um array de mensagens para suportar RAG com contexto
  33. async function chamarOllama(
  34. mensagemUsuario: string,
  35. mensagemSistema?: string,
  36. modelo: string = 'qwen3:0.6b',
  37. ): Promise<string> {
  38. try {
  39. // Prepara as mensagens
  40. // Se houver mensagem de sistema (contexto RAG), adiciona primeiro
  41. const messages: OllamaMessage[] = [];
  42. if (mensagemSistema) {
  43. messages.push({
  44. role: 'system',
  45. content: mensagemSistema
  46. });
  47. }
  48. messages.push({
  49. role: 'user',
  50. content: mensagemUsuario
  51. });
  52. // Preparamos o corpo da requisição conforme a documentação do Ollama
  53. const requestBody: OllamaChatRequest = {
  54. model: modelo, // Você pode mudar para outros modelos como 'mistral', 'codellama', etc
  55. messages: messages,
  56. stream: false // Desabilitamos o streaming para simplificar a resposta
  57. };
  58. // Fazemos a requisição HTTP POST para o endpoint do Ollama
  59. // O endpoint /api/chat é o padrão para conversas
  60. const response = await fetch(`${OLLAMA_BASE_URL}/api/chat`, {
  61. method: 'POST',
  62. headers: {
  63. 'Content-Type': 'application/json',
  64. },
  65. body: JSON.stringify(requestBody)
  66. });
  67. // Verificamos se a requisição foi bem-sucedida
  68. // Status 200-299 são considerados sucesso
  69. if (!response.ok) {
  70. throw new Error(`Ollama retornou status ${response.status}`);
  71. }
  72. // Convertemos a resposta para JSON
  73. const data = await response.json() as OllamaChatResponse;
  74. // Retornamos apenas o conteúdo da mensagem do assistente
  75. return data.message.content;
  76. } catch (erro) {
  77. // Registramos o erro no console para facilitar debug
  78. console.error('Erro ao chamar Ollama:', erro);
  79. // Lançamos um erro mais descritivo
  80. // Isso permite que quem chama essa função saiba o que aconteceu
  81. throw new Error('Falha na comunicação com o Ollama');
  82. }
  83. }
  84. export { chamarOllama };