index.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import express from 'express';
  2. import cors from 'cors';
  3. import { chamarOllama } from './ollama';
  4. import { orquestrar } from './orquestrador';
  5. import { gerenciadorMCP, inicializarMCPs } from './mcp-manager';
  6. // Criando a instância do Express
  7. const app = express();
  8. // Definindo a porta do servidor
  9. const PORT = process.env.PORT || 3000;
  10. // Middlewares
  11. // CORS: permite que o frontend faça requisições para esta API
  12. app.use(cors());
  13. // Express.json: permite que a API receba dados em formato JSON
  14. app.use(express.json());
  15. // Inicializa MCPs na inicialização da API
  16. inicializarMCPs()
  17. .then(() => {
  18. console.log('[INICIALIZAÇÃO] MCPs inicializados');
  19. console.log('[INICIALIZAÇÃO] MCPs disponíveis:',
  20. gerenciadorMCP.listarMCPs().map((m: { nome: string; }) => m.nome)
  21. );
  22. })
  23. .catch((erro: any) => {
  24. console.error('[INICIALIZAÇÃO] Erro ao inicializar MCPs:', erro);
  25. console.log('[INICIALIZAÇÃO] API continuará sem MCPs');
  26. });
  27. // Rota de ping
  28. // Esta rota é útil para verificar se a API está respondendo corretamente
  29. app.get('/ping', (req: express.Request, res: express.Response) => {
  30. res.json({
  31. message: 'pong',
  32. timestamp: new Date().toISOString()
  33. });
  34. });
  35. // Rota para chat INTELIGENTE (RAG + MCP)
  36. // Esta rota usa o orquestrador para decidir a melhor estratégia
  37. // Exemplo de uso: POST /chat com body { "mensagem": "Como fazer supino?" }
  38. app.post('/chat', async (req: express.Request, res: express.Response) => {
  39. try {
  40. const { mensagem } = req.body;
  41. // Validação básica da entrada
  42. if (!mensagem || typeof mensagem !== 'string') {
  43. return res.status(400).json({
  44. erro: 'Mensagem inválida ou não fornecida'
  45. });
  46. }
  47. if (mensagem.trim().length === 0) {
  48. return res.status(400).json({
  49. erro: 'Mensagem não pode estar vazia'
  50. });
  51. }
  52. console.log(`[API] Mensagem recebida: ${mensagem}`);
  53. // Orquestra a busca de contexto (RAG e/ou MCP)
  54. const resultado = await orquestrar(mensagem);
  55. // Chama a LLM com o prompt enriquecido
  56. console.log('[API] Enviando prompt para Ollama:\n', resultado.promptFinal);
  57. const resposta = await chamarOllama(resultado.promptFinal);
  58. // Retorna resposta com metadados detalhados
  59. res.json({
  60. resposta,
  61. metadados: {
  62. estrategia: resultado.estrategia,
  63. documentosRAG: resultado.documentosRAG || [],
  64. ferramentasMCP: resultado.ferramentasMCP || [],
  65. usouRAG: !!resultado.contextoRAG,
  66. usouMCP: !!resultado.contextoMCP
  67. },
  68. timestamp: new Date().toISOString()
  69. });
  70. } catch (erro) {
  71. console.error('[API] Erro na rota /chat:', erro);
  72. res.status(500).json({
  73. erro: 'Erro ao processar a mensagem',
  74. detalhes: erro instanceof Error ? erro.message : 'Erro desconhecido'
  75. });
  76. }
  77. });
  78. //
  79. // Rota para interagir com o modelo Ollama
  80. // Iniciando o servidor web
  81. const servidor = app.listen(PORT, () => {
  82. console.log(`\n${'='.repeat(60)}`);
  83. console.log(`Servidor rodando na porta ${PORT}`);
  84. console.log(`Acesse: http://localhost:${PORT}/ping`);
  85. console.log(`Chat: http://localhost:${PORT}/chat`);
  86. console.log(`\nSistemas integrados:`);
  87. console.log(`- RAG System (conhecimento textual)`);
  88. console.log(`- MCP Client (dados estruturados)`);
  89. console.log(`- Ollama LLM (geração de respostas)`);
  90. console.log(`- Orquestrador Inteligente (decisão automática) para atividades físicas`);
  91. console.log(`${'='.repeat(60)}\n`);
  92. });
  93. // Graceful shutdown atualizado
  94. process.on('SIGINT', async () => {
  95. console.log('\nEncerrando aplicação...');
  96. // Desconecta todos os MCPs antes de sair
  97. await gerenciadorMCP.desconectarTodos();
  98. console.log('Todos os MCPs desconectados');
  99. servidor.close(() => {
  100. console.log('Servidor encerrado');
  101. process.exit(0);
  102. });
  103. });