From b1a8b1abf870070830caa62937c2c3cf77ce09d6 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Mon, 3 Aug 2026 14:58:45 -0500 Subject: [PATCH] LIA: subir maxOutputTokens a 2048 y avisar cuando Gemini corta la respuesta MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El límite de salida estaba en 600 tokens (~450 palabras), que truncaba a media frase las respuestas largas — listados de turnos del día, comparativas por bacteriólogo. Gemini Flash admite hasta 8192; 2048 cubre esos casos sin inflar el consumo del presupuesto. Además el código nunca leía finishReason, así que una respuesta cortada por MAX_TOKENS llegaba al usuario indistinguible de una completa. Ahora se marca en el texto y se expone el flag `truncada` en la respuesta JSON. Co-Authored-By: Claude Opus 5 --- modules/turnero/api/ai_chat.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/turnero/api/ai_chat.php b/modules/turnero/api/ai_chat.php index a0028cf..ba1035b 100644 --- a/modules/turnero/api/ai_chat.php +++ b/modules/turnero/api/ai_chat.php @@ -189,7 +189,9 @@ $payload = json_encode([ ], 'generationConfig' => [ 'temperature' => 0.3, - 'maxOutputTokens' => 600, + // 600 cortaba a media frase las respuestas largas (listados de turnos, + // comparativas por bacteriólogo). Gemini Flash admite hasta 8192. + 'maxOutputTokens' => 2048, ], ], JSON_UNESCAPED_UNICODE); @@ -215,6 +217,15 @@ if ($code !== 200 || empty($gemini['candidates'][0]['content']['parts'][0]['text } $respuesta = $gemini['candidates'][0]['content']['parts'][0]['text']; + +// Gemini corta la respuesta y avisa con finishReason; sin esto el usuario recibe +// un texto truncado a media frase sin saber que faltó contenido. +$finishReason = $gemini['candidates'][0]['finishReason'] ?? null; +$truncada = ($finishReason === 'MAX_TOKENS'); +if ($truncada) { + $respuesta .= "\n\n_(respuesta cortada por longitud — pide el detalle por partes)_"; +} + $usage = $gemini['usageMetadata'] ?? []; $tokensEsta = (int)($usage['totalTokenCount'] ?? (int)((mb_strlen($pregunta) + mb_strlen($respuesta)) / 4)); $tokensUsados += $tokensEsta; @@ -224,6 +235,7 @@ $pdo->prepare("INSERT INTO lab_config (clave, valor) VALUES ('lia_tokens_usados' jsonOk([ 'respuesta' => $respuesta, + 'truncada' => $truncada, 'tokens_usados' => $tokensUsados, 'tokens_restantes' => max(0, LIA_TOKENS_MAX - $tokensUsados), 'tokens_max' => LIA_TOKENS_MAX,