{"record":{"id":"67b14bb0f03aac76","repo":"datawhalechina/hello-agents","slug":"unsupported-vision-review-mode-vision-review-mod","errorCode":null,"errorMessage":"Unsupported vision_review_mode: {vision_review_mode}","messagePattern":"Unsupported vision_review_mode: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"Co-creation-projects/healer-666-Academic-Data-Agent/src/data_analysis_agent/agent_runner.py","lineNumber":368,"sourceCode":"                parts.append(f\"... {len(results) - 3} more result(s) omitted.\")\n        return \"\\n\\n\".join(parts)\n\n    if text:\n        parts.append(f\"Observation text:\\n{_truncate_text(text, 1200)}\")\n    return \"\\n\\n\".join(parts)\n\n\ndef _resolve_latency_mode(latency_mode: str) -> str:\n    normalized_mode = latency_mode.strip().lower()\n    if normalized_mode not in {\"auto\", \"quality\", \"fast\"}:\n        raise ValueError(f\"Unsupported latency_mode: {latency_mode}\")\n    return normalized_mode\n\n\ndef _resolve_vision_review_mode(vision_review_mode: str) -> str:\n    normalized_mode = vision_review_mode.strip().lower()\n    if normalized_mode not in {\"off\", \"auto\", \"on\"}:\n        raise ValueError(f\"Unsupported vision_review_mode: {vision_review_mode}\")\n    return normalized_mode\n\n\ndef _is_small_simple_dataset(data_context: DataContextSummary) -> bool:\n    try:\n        file_size_bytes = data_context.absolute_path.stat().st_size\n    except OSError:\n        file_size_bytes = 0\n    rows, cols = data_context.shape\n    return file_size_bytes <= 512 * 1024 and rows <= 2000 and cols <= 50\n\n\ndef _should_use_fast_path(latency_mode: str, *, small_simple_dataset: bool) -> bool:\n    return latency_mode == \"fast\" or (latency_mode == \"auto\" and small_simple_dataset)\n\n\ndef _resolve_effective_max_steps(\n    *,","sourceCodeStart":350,"sourceCodeEnd":386,"githubUrl":"https://github.com/datawhalechina/hello-agents/blob/606a07d341a47be773fab7f4b71177f53f96b2c3/Co-creation-projects/healer-666-Academic-Data-Agent/src/data_analysis_agent/agent_runner.py#L350-L386","documentation":"`_resolve_vision_review_mode` validates the vision_review_mode option after strip+lowercase and raises ValueError unless it is 'off', 'auto', or 'on'. This option controls whether the agent runs an optional vision-LLM review pass over generated charts.","triggerScenarios":"Calling the run API with vision_review_mode='enabled', 'true', 'always', or an empty string; passing None causes AttributeError on `.strip()` before the enum check fires.","commonSituations":"Booleans serialized as 'true'/'false' strings by JSON clients; hand-edited config YAML with mode names from older versions; API consumers guessing allowed values without reading the enum.","solutions":["Use exactly 'off', 'auto', or 'on' (case-insensitive, whitespace trimmed).","Map boolean flags to the enum client-side: True→'on', False→'off'.","Omit the parameter if you want the default instead of sending None.","Harden: `normalized_mode = (vision_review_mode or 'auto').strip().lower()`."],"exampleFix":"// before\nnormalized_mode = vision_review_mode.strip().lower()\nif normalized_mode not in {\"off\", \"auto\", \"on\"}:\n    raise ValueError(f\"Unsupported vision_review_mode: {vision_review_mode}\")\n\n# after\nnormalized_mode = (vision_review_mode or \"auto\").strip().lower()\nif normalized_mode not in {\"off\", \"auto\", \"on\"}:\n    raise ValueError(f\"Unsupported vision_review_mode: {vision_review_mode}\")","handlingStrategy":"type-guard","validationCode":"VISION_REVIEW_MODES = {\"off\", \"auto\", \"on\"}\n\ndef validate_vision_mode(mode: str | None) -> str:\n    normalized = (mode or \"auto\").strip().lower()\n    assert normalized in VISION_REVIEW_MODES, f\"vision_review_mode must be one of {sorted(VISION_REVIEW_MODES)}\"\n    return normalized","typeGuard":"from typing import Literal, TypeGuard\n\nVisionReviewMode = Literal[\"off\", \"auto\", \"on\"]\n\ndef is_vision_review_mode(value: object) -> TypeGuard[VisionReviewMode]:\n    return isinstance(value, str) and value.strip().lower() in {\"off\", \"auto\", \"on\"}","tryCatchPattern":"try:\n    run_analysis(data_path, vision_review_mode=mode)\nexcept ValueError as e:\n    if \"vision_review_mode\" in str(e):\n        mode = \"auto\"\n        run_analysis(data_path, vision_review_mode=mode)\n    else:\n        raise","preventionTips":["Map boolean UI toggles to 'on'/'off' before calling the API.","Keep frontend dropdown options generated from the backend enum.","Omit optional mode fields instead of sending null."],"tags":["validation","enum","valueerror","configuration","python"],"backgroundTag":null,"analyzedSha":"606a07d341a47be773fab7f4b71177f53f96b2c3","analyzedAt":"2026-08-14T22:57:27.446Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}