{"record":{"id":"0e5e06b754210bc8","repo":"HKUDS/DeepTutor","slug":"image-provider-returned-no-images","errorCode":null,"errorMessage":"Image provider returned no images.","messagePattern":"Image provider returned no images\\.","errorType":"error_code","errorClass":"GenerationProviderError","httpStatus":null,"severity":"error","filePath":"deeptutor/services/imagegen/adapters/openai_compat.py","lineNumber":67,"sourceCode":"        if config.style:\n            payload[\"style\"] = config.style\n        if config.response_format:\n            payload[\"response_format\"] = config.response_format\n\n        logger.debug(\n            \"imagegen url=%s model=%s n=%d size=%s\", url, config.model, max(1, n), config.size\n        )\n        try:\n            async with httpx.AsyncClient(timeout=config.request_timeout) as client:\n                resp = await client.post(url, headers=headers, json=payload)\n                raise_for_provider(resp, \"Image generation\")\n                images = [\n                    await self._materialize(client, item) for item in self._extract_items(resp)\n                ]\n        except httpx.HTTPError as exc:\n            raise GenerationProviderError(f\"Image generation request error: {exc}\") from exc\n        if not images:\n            raise GenerationProviderError(\"Image provider returned no images.\")\n        return images\n\n    @staticmethod\n    def _extract_items(resp: httpx.Response) -> list[dict[str, Any]]:\n        data = resp.json()\n        if isinstance(data, dict):\n            items = data.get(\"data\")\n            if isinstance(items, list) and items:\n                return [item for item in items if isinstance(item, dict)]\n        raise GenerationProviderError(\"Image response had no `data` array.\")\n\n    async def _materialize(\n        self, client: httpx.AsyncClient, item: dict[str, Any]\n    ) -> tuple[bytes, str]:\n        b64 = item.get(\"b64_json\")\n        if isinstance(b64, str) and b64:\n            return base64.b64decode(b64), \"image/png\"\n        src = item.get(\"url\")","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/HKUDS/DeepTutor/blob/3e82f130422a813cdd73c10b21a44e9325f5821a/deeptutor/services/imagegen/adapters/openai_compat.py#L49-L85","documentation":"The /images/generations call succeeded but the materialized images list is empty. Since _extract_items would have raised on a missing data array, this means items existed but every _materialize call produced nothing — practically it guards against an empty-after-filtering result (e.g. data array items that were non-dict were dropped).","triggerScenarios":"A response whose data array contains only non-dict entries (all filtered out by the isinstance check in _extract_items), yielding zero items to materialize.","commonSituations":"Non-conforming provider returning strings or nulls in data; partial provider outages returning degenerate responses.","solutions":["Log the raw response JSON to see what data actually contained","If the provider is non-conforming, use the adapter/provider matching its schema or fix the gateway","Retry once — some gateways emit degenerate bodies under load"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    images = await adapter.generate(prompt, config)\nexcept GenerationProviderError as exc:\n    if \"no images\" in str(exc):\n        logger.error(\"degenerate response body: %s\", raw_body)\n        raise","preventionTips":["Log raw response bodies for imagegen calls","Alert on repeated empty results from a provider"],"tags":["imagegen","response-parsing","openai-compat"],"backgroundTag":"unexpected-response-schema","analyzedSha":"3e82f130422a813cdd73c10b21a44e9325f5821a","analyzedAt":"2026-08-27T06:57:25.364Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}