import express from 'express'; import cors from 'cors'; import { chamarOllama } from './ollama'; import { orquestrar } from './orquestrador'; import { gerenciadorMCP, inicializarMCPs } from './mcp-manager'; // Criando a instância do Express const app = express(); // Definindo a porta do servidor const PORT = process.env.PORT || 3000; // Middlewares // CORS: permite que o frontend faça requisições para esta API app.use(cors()); // Express.json: permite que a API receba dados em formato JSON app.use(express.json()); // Inicializa MCPs na inicialização da API inicializarMCPs() .then(() => { console.log('[INICIALIZAÇÃO] MCPs inicializados'); console.log('[INICIALIZAÇÃO] MCPs disponíveis:', gerenciadorMCP.listarMCPs().map((m: { nome: string; }) => m.nome) ); }) .catch((erro: any) => { console.error('[INICIALIZAÇÃO] Erro ao inicializar MCPs:', erro); console.log('[INICIALIZAÇÃO] API continuará sem MCPs'); }); // Rota de ping // Esta rota é útil para verificar se a API está respondendo corretamente app.get('/ping', (req: express.Request, res: express.Response) => { res.json({ message: 'pong', timestamp: new Date().toISOString() }); }); // Rota para chat INTELIGENTE (RAG + MCP) // Esta rota usa o orquestrador para decidir a melhor estratégia // Exemplo de uso: POST /chat com body { "mensagem": "Como fazer supino?" } app.post('/chat', async (req: express.Request, res: express.Response) => { try { const { mensagem } = req.body; // Validação básica da entrada if (!mensagem || typeof mensagem !== 'string') { return res.status(400).json({ erro: 'Mensagem inválida ou não fornecida' }); } if (mensagem.trim().length === 0) { return res.status(400).json({ erro: 'Mensagem não pode estar vazia' }); } console.log(`[API] Mensagem recebida: ${mensagem}`); // Orquestra a busca de contexto (RAG e/ou MCP) const resultado = await orquestrar(mensagem); // Chama a LLM com o prompt enriquecido console.log('[API] Enviando prompt para Ollama:\n', resultado.promptFinal); const resposta = await chamarOllama(resultado.promptFinal); // Retorna resposta com metadados detalhados res.json({ resposta, metadados: { estrategia: resultado.estrategia, documentosRAG: resultado.documentosRAG || [], ferramentasMCP: resultado.ferramentasMCP || [], usouRAG: !!resultado.contextoRAG, usouMCP: !!resultado.contextoMCP }, timestamp: new Date().toISOString() }); } catch (erro) { console.error('[API] Erro na rota /chat:', erro); res.status(500).json({ erro: 'Erro ao processar a mensagem', detalhes: erro instanceof Error ? erro.message : 'Erro desconhecido' }); } }); // // Rota para interagir com o modelo Ollama // Iniciando o servidor web const servidor = app.listen(PORT, () => { console.log(`\n${'='.repeat(60)}`); console.log(`Servidor rodando na porta ${PORT}`); console.log(`Acesse: http://localhost:${PORT}/ping`); console.log(`Chat: http://localhost:${PORT}/chat`); console.log(`\nSistemas integrados:`); console.log(`- RAG System (conhecimento textual)`); console.log(`- MCP Client (dados estruturados)`); console.log(`- Ollama LLM (geração de respostas)`); console.log(`- Orquestrador Inteligente (decisão automática) para atividades físicas`); console.log(`${'='.repeat(60)}\n`); }); // Graceful shutdown atualizado process.on('SIGINT', async () => { console.log('\nEncerrando aplicação...'); // Desconecta todos os MCPs antes de sair await gerenciadorMCP.desconectarTodos(); console.log('Todos os MCPs desconectados'); servidor.close(() => { console.log('Servidor encerrado'); process.exit(0); }); });