Spaces:
Running
Running
| 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 || ''; | |
| } | |