| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- 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);
- });
- });
|