pediatric-ai-scribe-v3/src/routes/patientEducation.js
2026-05-08 22:26:53 +02:00

66 lines
2.9 KiB
JavaScript

// ============================================================
// PATIENT EDUCATION HANDOUTS — parent-facing education generated
// from an existing clinician note.
// ============================================================
var express = require('express');
var router = express.Router();
var { callAI } = require('../utils/ai');
var PROMPTS = require('../utils/prompts');
var { authMiddleware } = require('../middleware/auth');
var logger = require('../utils/logger');
var { wrapUserText, INJECTION_GUARD } = require('../utils/promptSafe');
router.use(authMiddleware);
// ── POST /patient-education ─────────────────────────────────
// Body:
// noteText — generated clinician note (required)
// diagnosis — optional explicit diagnosis override/context
// medications — optional medication list or free text
// patientAge — optional, used for age-appropriate language
// language — parent preferred language; defaults to English
// readingLevel — optional plain-language target
// model — optional override
// Returns: { success, handout, model }
router.post('/patient-education', async function(req, res) {
var start = Date.now();
try {
var body = req.body || {};
var noteText = String(body.noteText || '').trim();
if (!noteText) return res.status(400).json({ error: 'noteText is required' });
var language = String(body.language || 'English').trim() || 'English';
var context = 'PARENT PREFERRED LANGUAGE: ' + language + '\n';
context += 'PATIENT AGE: ' + (body.patientAge || 'unknown') + '\n';
context += 'READING LEVEL: ' + (body.readingLevel || 'plain language') + '\n';
if (body.diagnosis && String(body.diagnosis).trim()) {
context += 'DIAGNOSIS CONTEXT: ' + wrapUserText('diagnosis', body.diagnosis) + '\n';
}
if (body.medications && String(body.medications).trim()) {
context += 'MEDICATION CONTEXT: ' + wrapUserText('medications', body.medications) + '\n';
}
context += '\nCLINICIAN NOTE:\n' + wrapUserText('note', noteText);
var result = await callAI([
{ role: 'system', content: PROMPTS.patientEducation + INJECTION_GUARD },
{ role: 'user', content: context }
], { model: body.model, maxTokens: 1800 });
var duration = Date.now() - start;
logger.apiCall(req.user.id, '/api/patient-education', {
model: result.model,
tokensInput: result.usage && result.usage.input_tokens,
tokensOutput: result.usage && result.usage.output_tokens,
duration: duration,
statusCode: 200
});
res.json({ success: true, handout: String(result.content || '').trim(), model: result.model });
} catch (e) {
logger.error('[patientEducation] failed', e.message);
res.status(500).json({ error: 'Request failed' });
}
});
module.exports = router;