Spaces:
Running
Running
File size: 2,919 Bytes
f1602bc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
// server.js
// Backend proxy para análisis médico y evitar CORS
require('dotenv').config();
const express = require('express');
const cors = require('cors');
const { Configuration, OpenAIApi } = require('openai');
const app = express();
const port = process.env.PORT || 3000;
app.use(cors());
app.use(express.json());
app.post('/medical-analyze', async (req, res) => {
try {
const { provider, model, apiKey, text } = req.body;
// Prompts
const systemMessage = 'Eres un médico experto especializado en generar informes clínicos concisos y estructurados.';
const userPrompt = `Te daré la transcripción detallada de mi conversación con la paciente y tú escribe una descripción detallada de la enfermedad actual y la exploración física de un paciente en contexto clínico, siguiendo estas características:\n
Enfermedad actual:\n- Incluye la edad, el género y el motivo de consulta del paciente. (si no te doy el dato, omite).\n- Detalla evolución de síntomas y su progresión.\n- Describe signos y antecedentes relevantes con lenguaje técnico comprensible.\n
Exploración física:\n- Describe hallazgos objetivos observados en la exploración.\n- Usa términos médicos precisos, sin juicios diagnósticos.\n
Tareas del modelo:\n- Responde en dos párrafos, sin títulos 'Enfermedad actual:' ni 'Exploración física:'.\n- El primero para la enfermedad actual.\n- El segundo para la exploración.\n
Transcripción: ${text}`;
const messages = [
{ role: 'system', content: systemMessage },
{ role: 'user', content: userPrompt }
];
let analysis;
if (provider === 'openai') {
const configuration = new Configuration({ apiKey });
const openai = new OpenAIApi(configuration);
const response = await openai.createChatCompletion({ model, messages, temperature: 0.5 });
analysis = response.data.choices[0].message.content;
} else if (provider === 'deepseek' || provider === 'gemini') {
// Definir URLs por proveedor
const urls = { deepseek: 'https://api.deepseek.com/v1/chat/completions', gemini: 'https://generativelanguage.googleapis.com/v1/chat/completions' };
const url = urls[provider];
const resp = await fetch(url, {
method: 'POST', headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ model, messages, temperature: 0.5 })
});
if (!resp.ok) throw new Error(`Error ${provider}: ${resp.status}`);
const data = await resp.json();
analysis = data.choices?.[0]?.message?.content;
} else {
throw new Error('Proveedor no soportado: ' + provider);
}
res.json({ analysis });
} catch (error) {
console.error('Error /medical-analyze:', error);
res.status(500).json({ error: error.message });
}
});
app.listen(port, () => {
console.log(`Backend listening on http://localhost:${port}`);
});
|