{"record":{"id":"5122fa2da331262e","repo":"HKUDS/DeepTutor","slug":"animationgenerator-requires-the-optional-math-anim","errorCode":null,"errorMessage":"AnimationGenerator requires the optional math-animator extras. Install with `pip install -e '.[math-animator]'` or `pip install -r requirements/math-animator.txt`.","messagePattern":"AnimationGenerator requires the optional math-animator extras\\. Install with `pip install -e '\\.\\[math-animator\\]'` or `pip install -r requirements/math-animator\\.txt`\\.","errorType":"exception","errorClass":"GenerationFailure","httpStatus":null,"severity":"error","filePath":"deeptutor/book/blocks/animation.py","lineNumber":34,"sourceCode":"from typing import Any\n\nfrom deeptutor.services.keypool import primary_api_key\n\nfrom ..models import BlockType, SourceAnchor\nfrom ._prompts import get_book_prompt, load_book_prompts\nfrom .base import BlockContext, BlockGenerator, GenerationFailure\n\nlogger = logging.getLogger(__name__)\n\n\nclass AnimationGenerator(BlockGenerator):\n    block_type = BlockType.ANIMATION\n\n    async def _generate(\n        self, ctx: BlockContext\n    ) -> tuple[dict[str, Any], list[SourceAnchor], dict[str, Any]]:\n        if importlib.util.find_spec(\"manim\") is None:\n            raise GenerationFailure(\n                \"AnimationGenerator requires the optional math-animator extras. \"\n                \"Install with `pip install -e '.[math-animator]'` \"\n                \"or `pip install -r requirements/math-animator.txt`.\"\n            )\n\n        params = ctx.block.params\n        chapter_title = params.get(\"chapter_title\", ctx.chapter.title)\n        chapter_summary = params.get(\"chapter_summary\", ctx.chapter.summary)\n        objectives = params.get(\"objectives\") or ctx.chapter.learning_objectives\n        focus = str(params.get(\"focus\") or \"\")\n        quality = str(params.get(\"quality\") or \"medium\")\n        style_hint = str(params.get(\"style_hint\") or \"\")\n        prompts = load_book_prompts(\"animation\", ctx.language)\n\n        history_lines: list[str] = []\n        if chapter_summary:\n            history_lines.append(\n                get_book_prompt(prompts, \"context_summary\")","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/HKUDS/DeepTutor/blob/3e82f130422a813cdd73c10b21a44e9325f5821a/deeptutor/book/blocks/animation.py#L16-L52","documentation":"The ANIMATION book block requires Manim, provided only via the optional `math-animator` extra. `_generate` checks `importlib.util.find_spec(\"manim\")` and fails fast with an install hint when the package is absent.","triggerScenarios":"Building a book whose outline includes an `animation` block on an environment installed with plain `pip install deeptutor` / `deeptutor-cli` (no manim); CI images that omit the extra; a fresh venv after switching install variants.","commonSituations":"Docker/CI environments trimmed to the base extras; local dev installs using `pip install -e .` instead of `pip install -e '.[math-animator]'`; deploying the CLI-only package and then authoring content with animation blocks.","solutions":["Install the extra: `pip install -e '.[math-animator]'` (or `pip install -r requirements/math-animator.txt`)","Or `pip install 'deeptutor[math-animator]'` on a released install","Check availability up front via `app.get_capability_availability('math_animator')` before generating","Drop/disable animation blocks in the book outline if video renders aren't needed"],"exampleFix":"# before\npip install deeptutor\n\n# after\npip install -e '.[math-animator]'","handlingStrategy":"validation","validationCode":"import importlib.util\nif importlib.util.find_spec(\"manim\") is None:\n    raise SystemExit(\"math-animator extras required: pip install -e '.[math-animator]'\")","typeGuard":"def animation_available() -> bool:\n    return importlib.util.find_spec(\"manim\") is not None","tryCatchPattern":"from deeptutor.book.compiler import GenerationFailure\ntry:\n    await generator._generate(ctx)\nexcept GenerationFailure as e:\n    if \"math-animator extras\" in str(e):\n        skip_or_disable_animation_blocks()","preventionTips":["Install '.[math-animator]' in any environment that renders animation blocks","Gate animation blocks on capability availability before compile","Docker/CI images: bake the extra in once"],"tags":["manim","optional-dependency","install","math-animator"],"backgroundTag":"missing-optional-dependency","analyzedSha":"3e82f130422a813cdd73c10b21a44e9325f5821a","analyzedAt":"2026-08-27T06:57:25.364Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}