Jose Salazar commited on
Commit
b819476
·
1 Parent(s): 9869459

Prevent model reasoning output and add reasoning detection/cleanup

Browse files
Files changed (1) hide show
  1. js/ia.js +35 -3
js/ia.js CHANGED
@@ -78,8 +78,13 @@ function construirPrompt(obtenerDatosPaciente, obtenerValoresFormulario, getUlti
78
  cierre = `Proporciona una interpretación clínica breve (8-10 oraciones) destacando los hallazgos más significativos y las recomendaciones diagnósticas inmediatas.`;
79
  }
80
 
81
- return `IMPORTANTE: Responde ÚNICAMENTE en español. Do not write in English under any circumstance.
82
- ${notaImagenes ? `\n ${notaImagenes}\n` : ''}
 
 
 
 
 
83
  Eres un médico veterinario especialista en patología clínica. Sólo responderás consultas asociadas a ésta área de conocimiento y basado en la evidencia proporcionada.
84
  Analiza los resultados y proporciona una interpretación clínica concisa.
85
 
@@ -88,7 +93,7 @@ function construirPrompt(obtenerDatosPaciente, obtenerValoresFormulario, getUlti
88
  Resultados de laboratorio:
89
  ${lineasValores}
90
 
91
- ${signosText ? `\nSignos clínicos: ${signosText}` : ''}
92
  ${cierre}`;
93
  }
94
 
@@ -112,6 +117,33 @@ function limpiarRespuesta(text) {
112
  // Quitar prefijos de rol que el modelo a veces antepone
113
  text = text.replace(/^\d+\s+(medical assistant|assistant|model)\s*/i, '');
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  // Quitar LaTeX
116
  text = text.replace(/\$\\boxed\{[^}]*\}\$/g, '');
117
  text = text.replace(/\\begin\{[^}]+\}[\s\S]*?\\end\{[^}]+\}/g, '');
 
78
  cierre = `Proporciona una interpretación clínica breve (8-10 oraciones) destacando los hallazgos más significativos y las recomendaciones diagnósticas inmediatas.`;
79
  }
80
 
81
+ return `INSTRUCCIONES ESTRICTAS:
82
+ 1. Responde ÚNICAMENTE en español. NUNCA escribas en inglés.
83
+ 2. NO incluyas tu proceso de razonamiento, análisis paso a paso, ni pensamiento interno.
84
+ 3. NO uses palabras como "thought", "thinking", "here's a thinking process", ni números de pasos.
85
+ 4. Responde DIRECTAMENTE con la interpretación clínica final.
86
+
87
+ ${notaImagenes ? `${notaImagenes}\n` : ''}
88
  Eres un médico veterinario especialista en patología clínica. Sólo responderás consultas asociadas a ésta área de conocimiento y basado en la evidencia proporcionada.
89
  Analiza los resultados y proporciona una interpretación clínica concisa.
90
 
 
93
  Resultados de laboratorio:
94
  ${lineasValores}
95
 
96
+ ${signosText ? `Signos clínicos: ${signosText}` : ''}
97
  ${cierre}`;
98
  }
99
 
 
117
  // Quitar prefijos de rol que el modelo a veces antepone
118
  text = text.replace(/^\d+\s+(medical assistant|assistant|model)\s*/i, '');
119
 
120
+ // Quitar bloques de razonamiento / thinking process
121
+ text = text.replace(/^thought\s*\n?/i, '');
122
+
123
+ // Detectar si el modelo solo generó razonamiento en inglés sin respuesta clínica
124
+ const tieneRazonamiento = /Here'?s a thinking process|Understand the Role|Analyze the Request|Review the Lab Results|Synthesize Findings|Formulate Clinical Interpretation/i.test(text);
125
+ const tieneEspanol = /[áéíóúñÁÉÍÓÚÑ]{2,}/.test(text) || /\b(paciente|hallazgos|interpretación|recomendaciones|análisis|resultados|clínica|diagnóstico|evaluación|hepatopatía|nefropatía|anemia|leucocitosis|neutrofilia|linfopenia|hiperglucemia|hipoglucemia|pancreatitis|hepatitis|cirrosis|insuficiencia)\b/i.test(text);
126
+ if (tieneRazonamiento && !tieneEspanol) {
127
+ return 'El modelo generó un proceso de razonamiento interno en lugar de una interpretación clínica. Esto suele deberse a que el modelo está configurado en modo "pensamiento". Intenta nuevamente o contacta al administrador del espacio para desactivar el modo de razonamiento.';
128
+ }
129
+
130
+ // Si hay razonamiento mezclado con español, intentar extraer solo la respuesta
131
+ if (tieneRazonamiento) {
132
+ // Buscar la primera línea que parezca español clínico
133
+ const lineas = text.split('\n');
134
+ let inicioRespuesta = -1;
135
+ for (let i = 0; i < lineas.length; i++) {
136
+ const linea = lineas[i].trim();
137
+ if (linea.length > 20 && /[áéíóúñÁÉÍÓÚÑ]/.test(linea) && !/\*\*[^*]+\*\*/.test(linea) && !/^\d+\./.test(linea) && !/Here'?s a thinking process/i.test(linea)) {
138
+ inicioRespuesta = i;
139
+ break;
140
+ }
141
+ }
142
+ if (inicioRespuesta > 0) {
143
+ text = lineas.slice(inicioRespuesta).join('\n');
144
+ }
145
+ }
146
+
147
  // Quitar LaTeX
148
  text = text.replace(/\$\\boxed\{[^}]*\}\$/g, '');
149
  text = text.replace(/\\begin\{[^}]+\}[\s\S]*?\\end\{[^}]+\}/g, '');