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,