BerriAI/litellm · error · ValueError

Message {i} must have a 'content' field

Error message

Message {i} must have a 'content' field

What it means

Converse-format validation requiring each message dict to contain a 'content' key. A message with only a role (e.g. {'role': 'user'}) fails here; the index i identifies which message.

Source

Thrown at litellm/llms/bedrock/count_tokens/transformation.py:277

        if input_type == "converse":
            # Validate Converse format (messages-based)
            messages: Final = request_data.get("messages", [])
            if not messages:
                raise ValueError("messages parameter is required for Converse input")

            if not isinstance(messages, list):
                raise ValueError("messages must be a list")

            for i, message in enumerate(messages):
                if not isinstance(message, dict):
                    raise ValueError(f"Message {i} must be a dictionary")

                if "role" not in message:
                    raise ValueError(f"Message {i} must have a 'role' field")

                if "content" not in message:
                    raise ValueError(f"Message {i} must have a 'content' field")
        else:
            # For InvokeModel format, we need at least some content to count tokens
            # The content structure varies by model, so we do minimal validation
            if len(request_data) <= 1:  # Only has 'model' field
                raise ValueError("Request must contain content to count tokens")

View on GitHub (pinned to 6c2dcb801b)

Solutions

  1. Give every message a content value, even if minimal: {'role': 'user', 'content': [{'text': ''}]}
  2. Remove role-only stub messages before the call

Example fix

# before
messages=[{'role': 'user'}, {'role': 'assistant', 'content': [...]}]

# after
messages=[{'role': 'user', 'content': [{'text': 'continue'}]}, {'role': 'assistant', 'content': [...]}]
Defensive patterns

Strategy: validation

Validate before calling

for i, m in enumerate(req["messages"]):
    if "content" not in m:
        raise ValueError(f"Message {i} must have a 'content' field")

Type guard

def has_content(m: dict) -> bool:
    return isinstance(m, dict) and "content" in m and m["content"] is not None

Prevention

When it happens

Trigger: Placeholder/empty turns like {'role': 'assistant'} used as conversation delimiters, or code that builds messages progressively and sends one before content is attached.

Common situations: Template-driven prompt builders that append role stubs first, or trimming logic that drops content while keeping the role shell.

Related errors


AI-assisted analysis of BerriAI/litellm@6c2dcb801b (2026-08-15). Data as JSON: /api/errors/cc379b011ade9351. Report an issue: GitHub.