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
- Merge all system-level instructions into a single SystemMessage at the start of the conversation before calling create
- If the target model accepts multiple system messages, set model_info={'multiple_system_messages': True, ...}
- 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
- Emit exactly one SystemMessage at the top of every conversation your agent builds
- Set multiple_system_messages=True in model_info only after verifying the backend accepts it
- Add a unit test asserting your message pipeline never interleaves SystemMessages
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
- Unsupported config type {config.GetType()}
- Messages should not be provided in options
- Parameter name cannot be null
- Unknown message type: {m.GetType()}
- Content is null
AI-assisted analysis of microsoft/autogen@027ecf0a37 (2026-08-15).
Data as JSON: /api/errors/f853e7d54432426a.
Report an issue: GitHub.