oobabooga/textgen · error · InvalidRequestError
messages: invalid content item format
Error message
messages: invalid content item format
What it means
When a message's 'content' is a list (multimodal OpenAI format), each item must be a dict containing a 'type' key. Items that are not dicts, or dicts without 'type', raise InvalidRequestError (400, param='messages') before the content is flattened for the model.
Source
Thrown at modules/api/completions.py:515
if 'role' not in m:
raise InvalidRequestError(message="messages: missing role", param='messages')
elif m['role'] == 'function':
raise InvalidRequestError(message="role: function is not supported.", param='messages')
# Handle multimodal content validation
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_']View on GitHub (pinned to ed888c71f2)
Solutions
- Wrap every list item with an explicit type: {"type": "text", "text": ...} or {"type": "image_url", "image_url": {"url": ...}}.
- For plain text, prefer a string content instead of a single-element list.
- Validate content-list shape client-side before sending.
Example fix
# before
{"role": "user", "content": ["describe this", {"image_url": {"url": u}}]}
# after
{"role": "user", "content": [{"type": "text", "text": "describe this"}, {"type": "image_url", "image_url": {"url": u}}]} Defensive patterns
Strategy: validation
Validate before calling
def valid_content_items(content: list) -> bool:
return all(isinstance(i, dict) and isinstance(i.get('type'), str) for i in content) Type guard
def is_content_item(i) -> bool:
return isinstance(i, dict) and 'type' in i and i['type'] in ('text', 'image_url') Try / catch
try:
resp = client.chat.completions.create(model=m, messages=msgs)
except openai.BadRequestError as e:
if 'invalid content item format' in str(e):
msgs = [{'role': m['role'], 'content': repair_items(m['content']) if isinstance(m.get('content'), list) else m.get('content', '')} for m in msgs]
resp = client.chat.completions.create(model=m, messages=msgs)
else:
raise Prevention
- Build multimodal items only through a helper that always sets 'type'.
- Send plain strings for text-only messages instead of one-element lists.
- Lint every content list element with a type guard before the request.
When it happens
Trigger: POST /v1/chat/completions with {"role": "user", "content": ["hello"]} (bare string item) or {"role": "user", "content": [{"text": "hello"}]} (missing 'type').
Common situations: Hand-building multimodal arrays and forgetting the {'type': 'text', ...} wrapper; mixing OpenAI vision format with Anthropic/Llama-style content blocks; old client libs that emitted text-only arrays.
Related errors
- messages: unsupported content type
- messages: missing text in content item
- messages: missing image_url 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/016a31b4b9e461a7.
Report an issue: GitHub.