Assistente virtual web com IA para:
- Orientações rápidas (FAQ inteligente) com base em fluxos de conhecimento
- Agendamento de consultas via chat orquestrado por IA
- Análise de pedido de exames (imagem/PDF) para autorização automática ou direcionamento para auditoria
Arquitetura full‑stack:
- Backend: NestJS (Node 20+), Prisma (PostgreSQL) e OpenAI
- Frontend: React + Vite (Tailwind) com chat UI e suporte a voz, upload de arquivos e roteamento inteligente
- Chat de orientação: o usuário faz perguntas em linguagem natural. O backend reconhece intenções e responde em HTML padronizado com passos e observações. Exemplos de fluxos: Agendar Consulta, Segunda via de Boleto, Troca de Titularidade, Solicitar Autorização de Exames, Atualização Cadastral. Os fluxos ficam em
backend/src/modules/questions-ai/flows.knowledge.jsone podem ser editados sem recompilar (o build copia o JSON paradist). - Agendamento com IA: um orquestrador conduz a conversa em 7 etapas (identificação do paciente, especialidade e motivo, escolha do médico, horários disponíveis, confirmação e protocolo). Ele consulta o banco (médicos, disponibilidades) e cria o agendamento removendo a disponibilidade escolhida.
- Autorizações de Exame: o usuário envia foto/PDF do pedido. O backend extrai dados (nome do paciente, data de nascimento, lista de procedimentos), casa com a base de exames e decide: autorizado, pendente de auditoria (5 ou 10 dias) ou sem cobertura. Gera protocolos individuais e permite consultar protocolos por paciente.
backend/- NestJS com módulos:
questions-ai: perguntas/FAQ com IA e fluxo de conhecimentoappointment-ai: orquestrador de agendamento com IAexams: autorização de exames (upload de arquivo, decisão e protocolos)autheusers: autenticação JWT e gestão de usuários (rotas protegidas)appointments: serviços internos de médicos, disponibilidades e criação de consultas
prisma/: schema, migrações e clientsrc/seed/seed.ts: popular médicos, disponibilidades e alguns agendamentos de exemplo
- NestJS com módulos:
frontend/- React + Vite, UI do chat com:
- Entrada de texto/voz, respostas em HTML seguro
- Upload para autorização de exames
- Roteamento automático para fluxo de agendamento quando detectado
- React + Vite, UI do chat com:
- Node.js 20+
- PostgreSQL (DATABASE_URL)
- Chave da OpenAI (OPENAI_API_KEY)
Crie um arquivo backend/.env com:
DATABASE_URL="postgresql://USER:PASSWORD@HOST:5432/DBNAME?schema=public"
OPENAI_API_KEY="sua_chave_openai"
JWT_SECRET="um_segredo_seguro"
JWT_EXPIRES="1d" # opcional (padrão 1d)
PORT=3000 # opcional
Variáveis de ambiente (frontend): crie frontend/.env:
VITE_API_URL="http://localhost:3000"
- Instalar dependências
- Backend
- entre em
backend/e instale dependências (npm, pnpm ou yarn)
- entre em
- Frontend
- entre em
frontend/e instale dependências
- entre em
- Banco de dados e Prisma
- Configure
DATABASE_URLnobackend/.env - Aplique migrações e gere o client
- (Opcional) Rode o seed para popular médicos, disponibilidades e alguns agendamentos de demonstração
- Rodar os servidores
- Backend:
npm run start:dev(embackend/) – CORS já habilitado parahttp://localhost:5173 - Frontend:
npm run dev(emfrontend/) – abrirá emhttp://localhost:5173
Base URL do backend: http://localhost:3000
-
Perguntas/FAQ (Questions AI)
- POST
/chat/questions/ask- Body:
{ "message": "texto da pergunta" } - Resposta:
{ html: string }ou{ route: "appointment"|"exams", reason?: string }
- Body:
- POST
-
Agendamento (Appointment AI)
- POST
/chat/appointment- Body:
{ "sessionId": "sess-...", "message": "mensagem do usuário" } - Resposta:
{ reply: string }(HTML com instruções, listas numeradas, confirmações e protocolo)
- Body:
- POST
-
Autorizações de Exame (Exams)
- POST
/chat/exams(multipart/form-data)- Campo
file: imagem (JPG/PNG/GIF/BMP/WEBP) ou PDF do pedido - Resposta:
{ patient?, procedures[], source: "gpt-json+db", protocolBatch }
- Campo
- GET
/chat/exams/authorizations?name=Nome&birthDate=DD/MM/AAAA|AAAA-MM-DD- Resposta: lista de
{ protocol, status }
- Resposta: lista de
- POST
Observação: endpoints internos de appointments (listar médicos, disponibilidades e agendar a partir de availabilityId) são utilizados pelo orquestrador de IA.
-
Questions AI
- Recebe a mensagem e tenta casar com um fluxo em
flows.knowledge.jsonpor intents/padrões. - Se encontrar, a IA formata uma resposta HTML padronizada (título, passos, observações).
- Se identificar intenção operacional (ex.: “agendar consulta”), retorna uma diretiva de rota para o front acionar o módulo adequado.
- Recebe a mensagem e tenta casar com um fluxo em
-
Appointment AI
- Fluxo conversacional robusto (dados do paciente, especialidade/motivo, seleção do médico, horários, confirmação) com interpretações flexíveis (datas pt‑BR, variações de especialidade, seleção por número ou nome).
- Consulta o banco via Prisma (médicos/slots) e ao confirmar, gera protocolo único e cria o agendamento, removendo a disponibilidade.
-
Exams
- Para PDF: extrai texto localmente; para imagens: otimiza via
sharp. - Envia prompt minimalista para a OpenAI extrair apenas o essencial (paciente e procedimentos) e retorna JSON determinístico.
- Casa cada procedimento com tabela
Exame decide:AUTHORIZED,PENDING_AUDIT_5D,PENDING_AUDIT_10DouDENIED_NO_COVER. - Gera protocolos e permite consulta por paciente.
- Para PDF: extrai texto localmente; para imagens: otimiza via
Modelos principais: User, Doctor, Availability, Appointment, Exam, ExamAuthorization e entidades de chat (ChatSession, Message). Veja backend/prisma/schema.prisma.
- Seed (
backend/src/seed/seed.ts):- Cria médicos e disponibilidades (próximos 30 dias) e alguns agendamentos exemplo.
- Dica: use
prisma studiopara inspecionar dados durante o desenvolvimento.
- JWT habilitado globalmente; rotas de chat usam
@Public(). - Login
- POST
/login(bodyusername,password) retorna{ access_token }
- POST
- Gestão de usuários (
/users) é protegida por roles; apenas ADMIN. - Primeiro usuário: como a criação via API exige ADMIN, crie o primeiro usuário diretamente no banco (Prisma Studio) com
username,password(hash bcrypt) erole = ADMIN.
- Variável
VITE_API_URLaponta para o backend. Por padrão,http://localhost:3000. - Página
Chat(frontend/src/pages/Chat.tsx):- Chama
/chat/questions/aske segue a diretiva: retorna HTML ou inicia fluxo de agendamento/autorizações. - Upload de arquivos para
/chat/examscom exibição dos protocolos e decisões. - Reconhecimento de voz (quando disponível no navegador) e acessibilidade (escala de fonte persistida).
- Chama
- Backend (
backend/package.json):start:dev– Nest em watch modeseed– executasrc/seed/seed.tstest,test:e2e,lint,build
- Frontend (
frontend/package.json):dev,build,preview,lint
- Fluxos de conhecimento: edite
backend/src/modules/questions-ai/flows.knowledge.json(intents/padrões/steps/obs). O build já copia o arquivo paradist(vejanest-cli.json). - Especialidades/mapeamentos do agendamento podem ser ampliados em
appointment-ai(arquivo de mapeamento emdto/specialities.dto). - Exames e políticas de cobertura: popular tabela
Examcomaudit/opmepara ajustar decisões.
- 401/403 em rotas de usuários: gere um token via
/logine envieAuthorization: Bearer <token>ou crie o primeiro usuário diretamente via DB. - OpenAI: verifique
OPENAI_API_KEYno ambiente do backend. - CORS: o backend já libera
http://localhost:5173. - PDF sem texto: alguns PDFs “escaneados” não têm texto; prefira imagem nítida ou PDF pesquisável.
Projeto para fins de demonstração em hackathon.
