fix(backend): increase max_output_tokens to 65536, log finish_reason on error

Replace truncation-recovery heuristic with a higher token budget.
On JSON parse failure, log finish_reason and 160-char error context
to make the root cause visible.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Piotr Oleszczyk 2026-02-28 21:57:12 +01:00
parent 4abdc88286
commit 26069f5d66

View file

@ -360,13 +360,18 @@ def parse_product_text(data: ProductParseRequest) -> ProductParseResponse:
config=genai_types.GenerateContentConfig( config=genai_types.GenerateContentConfig(
system_instruction=_product_parse_system_prompt(), system_instruction=_product_parse_system_prompt(),
response_mime_type="application/json", response_mime_type="application/json",
max_output_tokens=8192, max_output_tokens=65536,
temperature=0.0, temperature=0.0,
), ),
) )
candidate = response.candidates[0] if response.candidates else None
finish_reason = str(candidate.finish_reason) if candidate else "unknown"
raw = response.text raw = response.text
if not raw: if not raw:
raise HTTPException(status_code=502, detail="LLM returned an empty response") raise HTTPException(
status_code=502,
detail=f"LLM returned an empty response (finish_reason={finish_reason})",
)
# Fallback: extract JSON object in case the model adds preamble or markdown fences # Fallback: extract JSON object in case the model adds preamble or markdown fences
if not raw.lstrip().startswith("{"): if not raw.lstrip().startswith("{"):
start = raw.find("{") start = raw.find("{")
@ -380,7 +385,12 @@ def parse_product_text(data: ProductParseRequest) -> ProductParseResponse:
try: try:
parsed = json.loads(raw) parsed = json.loads(raw)
except json.JSONDecodeError as e: except json.JSONDecodeError as e:
log.error("Gemini parse-text raw response (failed):\n%s", raw) log.error(
"Gemini parse-text JSON error at pos %d finish_reason=%s context=%r",
e.pos,
finish_reason,
raw[max(0, e.pos - 80) : e.pos + 80],
)
raise HTTPException(status_code=502, detail=f"LLM returned invalid JSON: {e}") raise HTTPException(status_code=502, detail=f"LLM returned invalid JSON: {e}")
try: try:
return ProductParseResponse.model_validate(parsed) return ProductParseResponse.model_validate(parsed)