{"record":{"id":"08699f012c4e91a4","repo":"ScrapeGraphAI/Scrapegraph-ai","slug":"comparison-result-missing-explanation-key","errorCode":null,"errorMessage":"comparison_result missing 'explanation' key","messagePattern":"comparison_result missing 'explanation' key","errorType":"error_code","errorClass":"InvalidStateError","httpStatus":null,"severity":"error","filePath":"scrapegraphai/utils/code_error_analysis.py","lineNumber":314,"sourceCode":"        }\n        >>> comparison_result = {\n            'differences': ['Missing docstring', 'No type hints'],\n            'explanation': 'The code is missing documentation'\n        }\n        >>> analysis = semantic_focused_analysis(state, comparison_result, mock_llm)\n    \"\"\"\n    try:\n        # Validate state using Pydantic model\n        validated_state = CodeAnalysisState(\n            generated_code=state.get(\"generated_code\", \"\"),\n            errors=state.get(\"errors\", {}),\n        )\n\n        # Validate comparison_result\n        if \"differences\" not in comparison_result:\n            raise InvalidStateError(\"comparison_result missing 'differences' key\")\n        if \"explanation\" not in comparison_result:\n            raise InvalidStateError(\"comparison_result missing 'explanation' key\")\n\n        # Create prompt template and chain\n        prompt = PromptTemplate(\n            template=get_optimal_analysis_template(\"semantic\"),\n            input_variables=[\"generated_code\", \"differences\", \"explanation\"],\n        )\n        chain = prompt | llm_model | StrOutputParser()\n\n        # Execute chain with validated inputs\n        return chain.invoke(\n            {\n                \"generated_code\": validated_state.generated_code,\n                \"differences\": json.dumps(comparison_result[\"differences\"], indent=2),\n                \"explanation\": comparison_result[\"explanation\"],\n            }\n        )\n\n    except KeyError as e:","sourceCodeStart":296,"sourceCodeEnd":332,"githubUrl":"https://github.com/ScrapeGraphAI/Scrapegraph-ai/blob/532dfffbf6ee823a6c9cf8cfedc24a93bf026780/scrapegraphai/utils/code_error_analysis.py#L296-L332","documentation":"semantic_focused_analysis requires comparison_result to contain an 'explanation' key; raised immediately after the 'differences' check when it is missing. Together the two checks define the required shape of comparison_result.","triggerScenarios":"Calling semantic_comparison_loop / semantic_focused_analysis with a comparison_result dict that has 'differences' but no 'explanation' — typical when the upstream comparison LLM omitted explanation or output parsing kept only part of the response.","commonSituations":"Comparison step's LLM returned malformed/partial JSON; custom comparison implementation that never produces 'explanation'; schema drift between scrapegraphai versions.","solutions":["Normalize comparison_result to include a non-empty 'explanation' (default to '' if absent)","Fix/parse the upstream comparison step so both keys are always produced","Add a unit test asserting the comparison output shape"],"exampleFix":"# before\nsemantic_focused_analysis(state, {\"differences\": diffs}, llm)\n# after\nsemantic_focused_analysis(state, {\"differences\": diffs, \"explanation\": expl or \"no explanation\"}, llm)","handlingStrategy":"type-guard","validationCode":"comparison_result.setdefault(\"explanation\", \"\")\nassert \"explanation\" in comparison_result","typeGuard":"def has_explanation(cr) -> bool:\n    return isinstance(cr, dict) and isinstance(cr.get(\"explanation\"), str)","tryCatchPattern":"from scrapegraphai.utils.code_error_analysis import InvalidStateError\ntry:\n    semantic_focused_analysis(state, comparison_result, llm_model)\nexcept InvalidStateError as e:\n    if \"explanation\" in str(e):\n        comparison_result[\"explanation\"] = \"\"\n        # safe to retry once","preventionTips":["Always build comparison_result with both keys","Default explanation to empty string when parsing LLM output","Unit-test the comparison step output shape"],"tags":["state","comparison-result","semantic-analysis","key-check"],"backgroundTag":"state-validation-failed","analyzedSha":"532dfffbf6ee823a6c9cf8cfedc24a93bf026780","analyzedAt":"2026-08-28T15:19:38.821Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}