@falaped/falaped-kit
v0.2.7
Published
Kit compartilhado para FALAPED: PDF, Groq IA, classificação, assistente e extração
Maintainers
Readme
falaped-kit
Pacote npm compartilhado entre falaped-bot e falaped (dashboard). Oferece funções para geração de PDF (prontuário, receita, atestado), integração Groq IA (generateCaseReport para relatório por seções; transcrição, melhoria e templates em evolução), classificação de mensagens, assistente e extração de informações.
Instalação
npm install falaped-kit
# ou em monorepo com workspace:
# "falaped-kit": "workspace:*"Uso
Importe as funções e os tipos de entrada:
import {
buildReportPdf,
buildPrescriptionPdf,
generatePrescriptionPdf,
buildMedicalCertificatePdf,
htmlToPlainTextForPdf,
} from "falaped-kit";
import type {
ReportPdfInput,
ReportIdentificationField,
ReportSection,
PrescriptionPdfInput,
PrescriptionPayload,
PrescriptionDoctor,
GeneratePrescriptionPdfInput,
MedicalCertificatePdfInput,
} from "falaped-kit";Relatório (prontuário):
Tipografia e margens orientadas à ABNT NBR 14724 para documentos clínicos (reportAbntMargins em helpers.ts); corpo Helvetica 12 pt, interlinha ~1,5, alinhado à esquerda (sem recuo de primeira linha). Título do documento (cabeçalho) 18 pt negrito, centralizado, com 28 pt de espaço abaixo antes da primeira seção; títulos de seção 12 pt negrito; rodapé 10 pt simples. Cabeçalho com o título; seções em sections com linha separadora após cada uma (exceto após a última, antes do rodapé); rodapé na última página (linha de assinatura, nome · CRM · RQE, data · local, logo opcional). logoFooter: URL ou Buffer (fetch automático para URL).
HTML em textos: se o conteúdo parecer HTML (tags como <p>, <br>, <b>, listas, tabelas simples), ele é convertido para texto com quebras de parágrafo antes de ir ao PDF (cleanPreformattedText → htmlToPlainTextForPdf). O texto dentro de <b> / <strong> / <i> permanece, mas o PDF usa uma única fonte (Helvetica regular) — não há negrito real embutido na linha. Para pré-visualizar no app sem gerar PDF, use htmlToPlainTextForPdf ou looksLikeHtml.
Layout adicional previsto no wireframe (identificação do paciente, linhas pontilhadas, sigilo) pode ser acrescentado na API quando necessário.
Exemplo completo para gerar o mesmo resultado do wireframe:
const buffer = await buildReportPdf({
reportTitle: "PRONTUÁRIO MÉDICO", // opcional; padrão já é este
patientName: "Arthur Maia Campos",
date: "13/11/1990",
identification: [
{ label: "Nome", value: "Arthur Maia Campos" },
{ label: "Data de nascimento", value: "13/11/1990" },
{ label: "Responsável", value: "Geyse Arruda Campos Maia" },
],
sections: [
{ title: "Tipo de consulta", content: "Rotina" },
{ title: "História da moléstia atual", content: "..." },
],
doctorName: "Filipe Prado",
doctorCrm: "123456",
doctorRqe: "123456", // opcional; aparece no rodapé com nome e CRM
consultationDateFormatted: "18 de março de 2026",
consultationLocation: "Osasco - São Paulo",
logoFooter: "https://exemplo.com/logo.png", // ou Buffer.from(...) para imagem em memória
});
// buffer é um Buffer do PDF; pode ser escrito em arquivo (fs.writeFileSync) ou enviado na resposta HTTPGroq — relatório de caso (generateCaseReport)
Gera um mapa nomeDaSeção → texto a partir da conversa (pediatra = user, assistente = assistant). A API key não é lida do ambiente pelo kit: passe apiKey explicitamente (ex.: process.env.GROQ_API_KEY no seu app).
Os dados do paciente são dois blocos opcionais: identificação/contato (PatientIdentityContext) e dados clínicos (PatientClinicalContext), para o modelo priorizar cadastro vs. conversa de forma coerente.
import { generateCaseReport } from "@falaped/falaped-kit/groq";
import type {
ConversationMessage,
TemplateSectionInput,
PatientIdentityContext,
PatientClinicalContext,
GenerateCaseReportOptions,
} from "@falaped/falaped-kit/types";
const messages: ConversationMessage[] = [
{ role: "user", content: "Paciente com febre há 2 dias." },
{ role: "assistant", content: "Vamos registrar a queixa..." },
];
const sections: TemplateSectionInput[] = [
{ name: "Queixa principal", description: "Motivo da consulta" },
{ name: "História da moléstia atual" },
];
const identity: PatientIdentityContext | null = {
name: "Maria Silva",
birth_date: "10/05/2020",
responsible: "João Silva",
contact_phone: "(11) 99999-0000",
};
const clinical: PatientClinicalContext | null = {
allergies: "Nega",
current_medications: "Nenhum",
medical_history: "Saudável",
};
const options: GenerateCaseReportOptions = {
apiKey: process.env.GROQ_API_KEY!,
// model, temperature, maxTokens, timeoutMs — opcionais
};
const bySection = await generateCaseReport(
messages,
sections,
identity,
clinical,
options
);
// bySection["Queixa principal"], etc. — valores em PT-BR; seções sem dado: "Sem informação registrada."Função legada: generateCaseReportSections mapeia templateSections: string[] para { name }[], chama generateCaseReport com identity e clinical nulos e aceita messages com role string (apenas user e assistant são usados).
Receita: o fluxo do app usa generatePrescriptionPdf (payload + doctor + issuedAt + local + logoBuffer). O PDF segue o prontuário (margens, título RECEITUÁRIO, Paciente / nascimento opcional / data, linha, Prescrição: com medicamentos, depois Orientações, Sinais de alerta e Observações adicionais quando existirem no payload). Para integrações simples ainda existe buildPrescriptionPdf com PrescriptionPdfInput.
import {
generatePrescriptionPdf,
type PrescriptionPayload,
type PrescriptionDoctor,
} from "falaped-kit";
const payload: PrescriptionPayload = {
patientName: "Maria Silva",
birthDate: "10/05/2020",
medications: [
{ name: "Paracetamol 500mg", posology: "1x ao dia por 5 dias" },
],
orientations: "Hidratar bem.",
warningSigns: "Procurar urgência se febre > 39°C.",
additionalNotes: "Retorno em 7 dias.",
};
const doctor: PrescriptionDoctor = {
firstName: "João",
surname: "Silva",
crm: "12345",
rqe: "98765",
};
const buffer = await generatePrescriptionPdf({
payload,
doctor,
issuedAt: "19 de março de 2026",
locationDisplay: "São Paulo - SP",
locationState: "SP",
logoBuffer: undefined,
});Forma plana legada:
const buffer = await buildPrescriptionPdf({
patientName: "Maria Silva",
date: "19/03/2026",
items: [{ description: "Paracetamol 500mg", posology: "1x ao dia por 5 dias" }],
doctorName: "Dr. João",
doctorCrm: "12345",
});Atestado: mesmo padrão do prontuário (margens reportAbntMargins, título 18 pt centralizado, corpo 12 pt à esquerda, linha cinza antes do texto principal, rodapé com linha de assinatura, nome · CRM · RQE, data/local e logoFooter opcional). date alimenta o rodapé se consultationDateFormatted não for passada.
const buffer = await buildMedicalCertificatePdf({
patientName: "Maria Silva",
date: "19/03/2026",
body: "Atesto para os devidos fins que a paciente necessita de afastamento.",
daysOff: 3,
doctorName: "Dr. João",
doctorCrm: "12345",
doctorRqe: "98765", // opcional
consultationDateFormatted: "19 de março de 2026",
consultationLocation: "São Paulo - SP",
// logoFooter: "https://..." ou Buffer,
});Subpaths
Você pode importar só o que precisa:
falaped-kit— re-exporta tipos e funções PDFfalaped-kit/pdf— funções de PDFfalaped-kit/types— apenas tiposfalaped-kit/groq—generateCaseReport(relatório por seções a partir da conversa); demais funções Groq em implementaçãofalaped-kit/classify— classificação de mensagens (em implementação)falaped-kit/assistant— chat do assistente (em implementação)falaped-kit/extract— extração de dados (em implementação)
Tipos em outros projetos
Em projetos TypeScript (Next.js, Node, etc.) os tipos são resolvidos automaticamente ao importar de falaped-kit ou falaped-kit/types. Certifique-se de que o projeto consome os arquivos .d.ts gerados em dist/ (o package.json já expõe types e exports com types).
Build
npm run buildGera dist/ em ESM e CJS com declarações .d.ts.
Requisitos
- Node.js >= 18
- TypeScript 5.x (para projetos que consomem o pacote)
