{"record":{"id":"4722094aebb35e36","repo":"harry0703/MoneyPrinterTurbo","slug":"llm-provider-returned-an-empty-response","errorCode":null,"errorMessage":"[{llm_provider}] returned an empty response","messagePattern":"\\[(.+?)\\] returned an empty response","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"app/services/llm.py","lineNumber":238,"sourceCode":"            dashscope.api_key = api_key\n            response = dashscope.Generation.call(\n                model=model_name, messages=[{\"role\": \"user\", \"content\": prompt}]\n            )\n            if response:\n                if isinstance(response, GenerationResponse):\n                    status_code = response.status_code\n                    if status_code != 200:\n                        raise Exception(\n                            f'[{llm_provider}] returned an error response: \"{response}\"'\n                        )\n\n                    return _extract_qwen_generation_text(response)\n                else:\n                    raise Exception(\n                        f'[{llm_provider}] returned an invalid response: \"{response}\"'\n                    )\n            else:\n                raise Exception(f\"[{llm_provider}] returned an empty response\")\n\n        if adapter == \"gemini\":\n            from google import genai\n            from google.genai import types\n\n            http_options = types.HttpOptions(base_url=base_url) if base_url else None\n            generation_config = types.GenerateContentConfig(\n                temperature=0.5,\n                top_p=1,\n                top_k=1,\n                max_output_tokens=2048,\n                safety_settings=[\n                    types.SafetySetting(\n                        category=\"HARM_CATEGORY_HARASSMENT\",\n                        threshold=\"BLOCK_ONLY_HIGH\",\n                    ),\n                    types.SafetySetting(\n                        category=\"HARM_CATEGORY_HATE_SPEECH\",","sourceCodeStart":220,"sourceCodeEnd":256,"githubUrl":"https://github.com/harry0703/MoneyPrinterTurbo/blob/1f9f19c2021a68d04df228f33e9099a0c947f6f8/app/services/llm.py#L220-L256","documentation":"Raised in the qwen branch when dashscope.Generation.call() returns a falsy value (None, empty). Normally dashscope always returns a response object, so a falsy return means the SDK failed at a level below HTTP handling — misconfiguration of the SDK, an import/install problem, or an SDK bug.","triggerScenarios":"dashscope.Generation.call(...) evaluating False under `if response:` — e.g. a GenerationResponse with __bool__ defined oddly in some SDK versions, an SDK internal failure returning None, or a patched/mocked call returning None in tests.","commonSituations":"Broken dashscope installation (mixed versions in site-packages); monkeypatched dashscope in unit tests that forgot a return value; rare SDK versions where the response object's truthiness depends on success fields; intermittent SDK-level failures after network interruptions.","solutions":["Reinstall dashscope in a clean environment: pip install --force-reinstall dashscope","If seen in tests, fix the mock: patch('dashscope.Generation.call', return_value=<valid GenerationResponse>)","Reproduce once in isolation (small script calling dashscope.Generation.call) to determine if it is SDK-wide or config-specific","If reproducible with a valid api_key, report to DashScope with the dashscope package version and switch llm_provider to an OpenAI-compatible fallback meanwhile"],"exampleFix":"# before\nresponse = dashscope.Generation.call(model=model_name, messages=[...])\nif response:\n    ...\nelse:\n    raise Exception(f\"[{llm_provider}] returned an empty response\")\n\n# after\nresponse = dashscope.Generation.call(model=model_name, messages=[...])\nif response is None:\n    raise RuntimeError(\n        f\"[qwen] dashscope returned None; dashscope version: \"\n        f\"{getattr(dashscope, '__version__', 'unknown')}\"\n    )","handlingStrategy":"type-guard","validationCode":"import dashscope\nassert hasattr(dashscope, \"Generation\"), \"dashscope SDK not installed or broken\"","typeGuard":"def has_generation_response(resp) -> bool:\n    return resp is not None","tryCatchPattern":"except Exception: — one retry is reasonable (transient SDK hiccup), then fail with SDK version info; do not loop on a stably-None return","preventionTips":["Clean-install dashscope after version changes to avoid mixed site-packages","Mock tests must return objects, never None","Monitor for this error after any dashscope upgrade"],"tags":["llm","qwen","dashscope","sdk-bug","edge-case"],"backgroundTag":null,"analyzedSha":"1f9f19c2021a68d04df228f33e9099a0c947f6f8","analyzedAt":"2026-08-14T19:41:05.568Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}