LIA: subir maxOutputTokens a 2048 y avisar cuando Gemini corta la respuesta

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 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-03 14:58:45 -05:00
co-authored by Claude Opus 5
parent f6d4ee9bdd
commit b1a8b1abf8
+13 -1
View File
@@ -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,