66 lines
2.9 KiB
JavaScript
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;
|