{"record":{"id":"5eb94280661626d7","repo":"HKUDS/DeepTutor","slug":"render-failed-because-local-latex-is-missing-plea","errorCode":null,"errorMessage":"Render failed because local LaTeX is missing. Please avoid Tex/MathTex in generated code or install a LaTeX distribution.","messagePattern":"Render failed because local LaTeX is missing\\. Please avoid Tex/MathTex in generated code or install a LaTeX distribution\\.","errorType":"exception","errorClass":"ManimRenderError","httpStatus":null,"severity":"error","filePath":"deeptutor/agents/math_animator/retry_manager.py","lineNumber":131,"sourceCode":"                                timeout=self.repair_timeout_seconds,\n                            )\n                        except asyncio.TimeoutError as timeout_exc:\n                            raise ManimRenderError(\n                                f\"Code repair attempt #{attempt + 1} timed out after \"\n                                f\"{int(self.repair_timeout_seconds)}s.\"\n                            ) from timeout_exc\n                        code = repaired.code.strip() or code\n                        if self.on_status is not None:\n                            await self.on_status(\n                                f\"Retry #{attempt + 1} code generated from visual review. Re-rendering now.\"\n                            )\n                        continue\n                render_result.retry_attempts = len(retry_history)\n                render_result.retry_history = retry_history\n                return code, render_result\n            except ManimRenderError as exc:\n                if _is_non_retriable_environment_error(str(exc)):\n                    raise ManimRenderError(\n                        \"Render failed because local LaTeX is missing. \"\n                        \"Please avoid Tex/MathTex in generated code or install a LaTeX distribution.\"\n                    ) from exc\n                if attempt >= self.max_retries:\n                    raise\n                retry_attempt = RetryAttempt(attempt=attempt + 1, error=str(exc))\n                retry_history.append(retry_attempt)\n                if self.on_retry is not None:\n                    await self.on_retry(retry_attempt)\n                if self.on_status is not None:\n                    await self.on_status(f\"Generating repaired code for retry #{attempt + 1}.\")\n                try:\n                    repaired = await asyncio.wait_for(\n                        self.repair_callback(code, str(exc), attempt + 1),\n                        timeout=self.repair_timeout_seconds,\n                    )\n                except asyncio.TimeoutError as timeout_exc:\n                    raise ManimRenderError(","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/HKUDS/DeepTutor/blob/3e82f130422a813cdd73c10b21a44e9325f5821a/deeptutor/agents/math_animator/retry_manager.py#L113-L149","documentation":"Plain ValueError raised by validate_upload_safety when file_size exceeds DocumentValidator.MAX_FILE_SIZE. It is the upload-boundary guard (before any parsing) with an explicit limit stated in the message.","triggerScenarios":"Uploading a file larger than DocumentValidator.MAX_FILE_SIZE to endpoints that call _save_uploaded_files / _validate_upload_batch, websocket_mimic_generate, or safe_extract_zip with file_size provided.","commonSituations":"Users ingesting large textbooks/videos; misconfigured client not enforcing limits; proxy already streaming a huge body to the handler.","solutions":["Compress or split the file below MAX_FILE_SIZE before upload","Enforce the same limit client-side so users get immediate feedback","If your deployment genuinely needs bigger files, review/raise DocumentValidator.MAX_FILE_SIZE understanding the memory/security implications"],"exampleFix":"// before\nvalidate_upload_safety(\"big.pdf\", file_size=10**10)  # raises\n\n// after\nif file_size > DocumentValidator.MAX_FILE_SIZE:\n    return error_response(\"file too large, please split or compress\")\nvalidate_upload_safety(\"big.pdf\", file_size=file_size)","handlingStrategy":"validation","validationCode":"from deeptutor.utils.document_validator import DocumentValidator\n\nif file_size is not None and file_size > DocumentValidator.MAX_FILE_SIZE:\n    return error(f\"file exceeds {DocumentValidator.MAX_FILE_SIZE} bytes\")\nvalidate_upload_safety(filename, file_size=file_size)","typeGuard":null,"tryCatchPattern":"try:\n    validate_upload_safety(filename, file_size=file_size)\nexcept ValueError as e:\n    if str(e).startswith(\"File too large\"):\n        return http_400(str(e))","preventionTips":["Mirror MAX_FILE_SIZE in the client and reverse-proxy (client_max_body_size)","Split or compress large textbooks before ingest"],"tags":["upload","file-size","validation","limits"],"backgroundTag":"file-size-limit-exceeded","analyzedSha":"3e82f130422a813cdd73c10b21a44e9325f5821a","analyzedAt":"2026-08-27T06:57:25.364Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}