{"record":{"id":"8118b6162f20e227","repo":"NousResearch/hermes-agent","slug":"invalid-image-url","errorCode":"invalid_image_url","errorMessage":"invalid_image_url:Image parts must include a non-empty image URL.","messagePattern":"invalid_image_url:Image parts must include a non-empty image URL\\.","errorType":"validation","errorClass":"ValueError","httpStatus":400,"severity":"error","filePath":"gateway/platforms/api_server.py","lineNumber":623,"sourceCode":"            if text:\n                trimmed = text[:MAX_NORMALIZED_TEXT_LENGTH]\n                normalized_parts.append({\"type\": \"text\", \"text\": trimmed})\n                text_accum_len += len(trimmed)\n            continue\n\n        if part_type in _IMAGE_PART_TYPES:\n            detail = part.get(\"detail\")\n            image_ref = part.get(\"image_url\")\n            # OpenAI Responses sends ``input_image`` with a top-level\n            # ``image_url`` string; Chat Completions sends ``image_url`` as\n            # ``{\"url\": \"...\", \"detail\": \"...\"}``.  Support both.\n            if isinstance(image_ref, dict):\n                url_value = image_ref.get(\"url\")\n                detail = image_ref.get(\"detail\", detail)\n            else:\n                url_value = image_ref\n            if not isinstance(url_value, str) or not url_value.strip():\n                raise ValueError(\"invalid_image_url:Image parts must include a non-empty image URL.\")\n            url_value = url_value.strip()\n            lowered = url_value.lower()\n            if lowered.startswith(\"data:\"):\n                if not lowered.startswith(\"data:image/\") or \",\" not in url_value:\n                    raise ValueError(\n                        \"unsupported_content_type:Only image data URLs are supported. \"\n                        \"Non-image data payloads are not supported.\"\n                    )\n            elif not (lowered.startswith(\"http://\") or lowered.startswith(\"https://\")):\n                raise ValueError(\n                    \"invalid_image_url:Image inputs must use http(s) URLs or data:image/... URLs.\"\n                )\n            image_part: Dict[str, Any] = {\"type\": \"image_url\", \"image_url\": {\"url\": url_value}}\n            if detail is not None:\n                if not isinstance(detail, str) or not detail.strip():\n                    raise ValueError(\"invalid_content_part:Image detail must be a non-empty string when provided.\")\n                image_part[\"image_url\"][\"detail\"] = detail.strip()\n            normalized_parts.append(image_part)","sourceCodeStart":605,"sourceCodeEnd":641,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/gateway/platforms/api_server.py#L605-L641","documentation":"Error \"invalid_image_url:Image parts must include a non-empty image URL.\" thrown in NousResearch/hermes-agent.","triggerScenarios":"Thrown at gateway/platforms/api_server.py:623 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Include a non-empty image URL on every image content part.","Fix the client request building the image part."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"c896c09c42910c584c4c7d2325b58c14713ea42c","analyzedAt":"2026-08-14T17:18:01.089Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}