oobabooga/textgen · error · InvalidRequestError
messages: missing image_url in content item
Error message
messages: missing image_url in content item
What it means
A content item with type 'image_url' must contain an 'image_url' object which itself contains a 'url' key. Missing either raises InvalidRequestError (400, param='messages'). The url may be an http(s) link or a base64 data URI.
Source
Thrown at modules/api/completions.py:521
content = m.get('content')
if content is None:
# OpenAI allows content: null on assistant messages when tool_calls is present
if m['role'] == 'assistant' and m.get('tool_calls'):
m['content'] = ''
else:
raise InvalidRequestError(message="messages: missing content", param='messages')
# Validate multimodal content structure
if isinstance(content, list):
for item in content:
if not isinstance(item, dict) or 'type' not in item:
raise InvalidRequestError(message="messages: invalid content item format", param='messages')
if item['type'] not in ['text', 'image_url']:
raise InvalidRequestError(message="messages: unsupported content type", param='messages')
if item['type'] == 'text' and 'text' not in item:
raise InvalidRequestError(message="messages: missing text in content item", param='messages')
if item['type'] == 'image_url' and ('image_url' not in item or 'url' not in item['image_url']):
raise InvalidRequestError(message="messages: missing image_url in content item", param='messages')
# Chat Completions
object_type = 'chat.completion' if not stream else 'chat.completion.chunk'
created_time = int(time.time())
cmpl_id = "chatcmpl-%d" % (int(time.time() * 1000000000))
resp_list = 'data' if is_legacy else 'choices'
# generation parameters
generate_params = process_parameters(body, is_legacy=is_legacy)
if stop_event is not None:
generate_params['stop_event'] = stop_event
continue_ = body['continue_']
# Instruction template
if body['instruction_template_str']:
instruction_template_str = body['instruction_template_str']
elif body['instruction_template']:
instruction_template = body['instruction_template']View on GitHub (pinned to ed888c71f2)
Solutions
- Use the full nesting: {"type": "image_url", "image_url": {"url": "https://..." or "data:image/jpeg;base64,..."}}.
- Check the URL is non-empty and a valid string before appending the item.
- For local files, base64-encode into a data URI since the server fetches URLs server-side.
Example fix
# before
{"type": "image_url", "url": "https://example.com/cat.png"}
# after
{"type": "image_url", "image_url": {"url": "https://example.com/cat.png"}} Defensive patterns
Strategy: validation
Validate before calling
def image_item(url: str) -> dict:
if not url or not isinstance(url, str):
raise ValueError('image url required')
return {'type': 'image_url', 'image_url': {'url': url}} Type guard
def is_valid_image_item(i) -> bool:
return (isinstance(i, dict) and i.get('type') == 'image_url'
and isinstance(i.get('image_url'), dict)
and isinstance(i['image_url'].get('url'), str) and bool(i['image_url']['url'])) Try / catch
try:
resp = client.chat.completions.create(model=m, messages=msgs)
except openai.BadRequestError as e:
if 'missing image_url' in str(e):
raise ValueError('image content item missing nested image_url.url')
raise Prevention
- Always nest: {'type':'image_url','image_url':{'url': ...}}; never flatten.
- Base64 local files into data: URIs; the server fetches URLs itself.
- Fail fast at build time if the image source produced an empty URL.
When it happens
Trigger: POST /v1/chat/completions with {"type": "image_url"} alone, {"type": "image_url", "url": u} (url at wrong level), or {"type": "image_url", "image_url": {}} (no url).
Common situations: Flattening the nested structure by mistake; sending {'image_url': {'url': None}} from a pipeline where image loading failed; adapting from a schema that puts the URL at item top level.
Related errors
- messages: invalid content item format
- messages: unsupported content type
- messages: missing text in content item
- functions is not supported.
- function_call is not supported.
AI-assisted analysis of oobabooga/textgen@ed888c71f2 (2026-08-15).
Data as JSON: /api/errors/d4c370e9a5ab3f84.
Report an issue: GitHub.