microsoft/autogen · error · ValueError

Multiple and Not continuous system messages are not supporte

Error message

Multiple and Not continuous system messages are not supported if model_info['multiple_system_messages'] is False

What it means

Thrown by OpenAIChatCompletionClient when model_info does not opt in to multiple_system_messages and the conversation contains system messages that are not contiguous (a system message appears after a non-system message, leaving a gap). The client automatically merges consecutive system messages into one, but cannot safely reorder or merge system messages interleaved with user/assistant turns, so it raises instead.

Source

Thrown at python/packages/autogen-ext/src/autogen_ext/models/openai/_openai_client.py:597

        if self.model_info["json_output"] is False and json_output is True:
            raise ValueError("Model does not support JSON output.")

        if not self.model_info.get("multiple_system_messages", False):
            # Some models accept only one system message(or, it will read only the last one)
            # So, merge system messages into one (if multiple and continuous)
            system_message_content = ""
            _messages: List[LLMMessage] = []
            _first_system_message_idx = -1
            _last_system_message_idx = -1
            # Index of the first system message for adding the merged system message at the correct position
            for idx, message in enumerate(messages):
                if isinstance(message, SystemMessage):
                    if _first_system_message_idx == -1:
                        _first_system_message_idx = idx
                    elif _last_system_message_idx + 1 != idx:
                        # That case, system message is not continuous
                        # Merge system messages only contiues system messages
                        raise ValueError(
                            "Multiple and Not continuous system messages are not supported if model_info['multiple_system_messages'] is False"
                        )
                    system_message_content += message.content + "\n"
                    _last_system_message_idx = idx
                else:
                    _messages.append(message)
            system_message_content = system_message_content.rstrip()
            if system_message_content != "":
                system_message = SystemMessage(content=system_message_content)
                _messages.insert(_first_system_message_idx, system_message)
            messages = _messages

        # in that case, for ad-hoc, we using startswith instead of model_family for code consistency
        if create_args.get("model", "unknown").startswith("claude-"):
            # When Claude models last message is AssistantMessage, It could not end with whitespace
            messages = self._rstrip_last_assistant_message(messages)

        oai_messages_nested = [

View on GitHub (pinned to 027ecf0a37)

Solutions

  1. Merge all system-level instructions into a single SystemMessage at the start of the conversation before calling create
  2. If the target model accepts multiple system messages, set model_info={'multiple_system_messages': True, ...}
  3. Move mid-conversation directives into UserMessage or AssistantMessage content instead of additional SystemMessages

Example fix

# before
messages = [
    SystemMessage(content="You are helpful."),
    UserMessage(content="hi", source="user"),
    SystemMessage(content="Always answer in French."),
]
await client.create(messages)

# after
messages = [
    SystemMessage(content="You are helpful. Always answer in French."),
    UserMessage(content="hi", source="user"),
]
await client.create(messages)
Defensive patterns

Strategy: validation

Validate before calling

from autogen_agentchat.messages import SystemMessage

def merged_system(messages):
    """Collapse ALL system messages into one leading SystemMessage."""
    system = "\n".join(m.content for m in messages if isinstance(m, SystemMessage))
    rest = [m for m in messages if not isinstance(m, SystemMessage)]
    return ([SystemMessage(content=system)] if system else []) + rest

Type guard

def system_messages_are_continuous(messages) -> bool:
    idxs = [i for i, m in enumerate(messages) if isinstance(m, SystemMessage)]
    return idxs == list(range(idxs[0], idxs[0] + len(idxs))) if idxs else True

Try / catch

try:
    result = await client.create(messages)
except ValueError as e:
    if "multiple_system_messages" in str(e):
        result = await client.create(merged_system(messages))
    else:
        raise

Prevention

When it happens

Trigger: Passing a message list like [SystemMessage, UserMessage, SystemMessage] to create/create_stream when model_info lacks multiple_system_messages=True. The check fires when a SystemMessage is found at an index that is not immediately after the previous SystemMessage index.

Common situations: Agents that inject a second system prompt mid-conversation (e.g. per-task instructions added after user turns); assembling contexts from multiple modules that each prepend their own SystemMessage; switching from a model that tolerates multiple system messages to one that does not.

Related errors


AI-assisted analysis of microsoft/autogen@027ecf0a37 (2026-08-15). Data as JSON: /api/errors/f853e7d54432426a. Report an issue: GitHub.