AppConsulta360 / js /analysisModule.js
aarnal80's picture
Upload analysisModule.js
12a7975 verified
raw
history blame
2.66 kB
import { llmProviders } from './iaConfigModule.js';
// Módulo de análisis médico con LLM configurado (llamadas front-end)
export async function analyzeMedical(text) {
if (!text) return '';
const cfg = JSON.parse(localStorage.getItem('iaConfig')) || {};
const provider = cfg.llm.provider;
const provObj = llmProviders.find(p => p.value === provider) || {};
// Obtener API key adecuada del proveedor
const apiKey = cfg.llm.apiKeys?.[provider] ?? cfg.llm.apiKey;
const model = cfg.llm.model;
// Determinar endpoint según proveedor
let url;
if (provider === 'openai') {
url = 'https://api.openai.com/v1/chat/completions';
} else if (provider === 'deepseek') {
url = 'https://api.deepseek.com/v1/chat/completions';
} else {
throw new Error('Proveedor no soportado');
}
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}`;
let messages;
if (provider === 'openai') {
// Some OpenAI models don't support 'system' role
messages = [
{ role: 'user', content: `${systemMessage}\n\n${userPrompt}` }
];
} else {
messages = [
{ role: 'system', content: systemMessage },
{ role: 'user', content: userPrompt }
];
}
// Enviar solicitud directa al proveedor
const headers = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`
};
const payload = { model, messages, temperature: 0.5 };
const res = await fetch(url, {
method: 'POST',
headers,
body: JSON.stringify(payload)
});
if (!res.ok) {
const err = await res.text();
throw new Error(`Error en análisis médico: ${res.status} ${err}`);
}
const data = await res.json();
return data.choices?.[0]?.message?.content || '';
}