microsoft/autogen · error · ValueError
Task list cannot be empty.
Error message
Task list cannot be empty.
What it means
In BaseChatAgent.run(), when the task argument is a sequence it must be non-empty. Passing an empty list/tuple means the agent has no input messages to send to on_messages.
Source
Thrown at python/packages/autogen-agentchat/src/autogen_agentchat/agents/_base_chat_agent.py:140
):
if cancellation_token is None:
cancellation_token = CancellationToken()
input_messages: List[BaseChatMessage] = []
output_messages: List[BaseAgentEvent | BaseChatMessage] = []
if task is None:
pass
elif isinstance(task, str):
text_msg = TextMessage(content=task, source="user")
input_messages.append(text_msg)
if output_task_messages:
output_messages.append(text_msg)
elif isinstance(task, BaseChatMessage):
input_messages.append(task)
if output_task_messages:
output_messages.append(task)
else:
if not task:
raise ValueError("Task list cannot be empty.")
# Task is a sequence of messages.
for msg in task:
if isinstance(msg, BaseChatMessage):
input_messages.append(msg)
if output_task_messages:
output_messages.append(msg)
else:
raise ValueError(f"Invalid message type in sequence: {type(msg)}")
response = await self.on_messages(input_messages, cancellation_token)
if response.inner_messages is not None:
output_messages += response.inner_messages
output_messages.append(response.chat_message)
return TaskResult(messages=output_messages)
async def run_stream(
self,
*,
task: str | BaseChatMessage | Sequence[BaseChatMessage] | None = None,View on GitHub (pinned to 027ecf0a37)
Solutions
- Check the sequence is non-empty before calling run(); pass task=None to continue from the existing model context instead.
- Fix the upstream filtering logic that produced an empty list.
- Pass a str or a single BaseChatMessage instead of a list when there is only one item.
Example fix
// before task = [m for m in messages if keep(m)] # may be [] result = await agent.run(task=task) // after task = [m for m in messages if keep(m)] result = await agent.run(task=task if task else None)
Defensive patterns
Strategy: validation
Validate before calling
task_msgs = [m for m in candidates if keep(m)]
if not task_msgs:
task_msgs = None # or skip the run
result = await agent.run(task=task_msgs) Type guard
from collections.abc import Sequence
from autogen_agentchat.messages import BaseChatMessage
def is_valid_task(task) -> bool:
if task is None or isinstance(task, (str, BaseChatMessage)):
return True
return isinstance(task, Sequence) and len(task) > 0 and all(isinstance(m, BaseChatMessage) for m in task) Try / catch
try:
result = await agent.run(task=task)
except ValueError as e:
if "cannot be empty" in str(e):
result = await agent.run(task=None) # continue from context
else:
raise Prevention
- Guard dynamic/filtered task lists with an emptiness check before run().
- Pass task=None to continue an ongoing conversation rather than an empty list.
When it happens
Trigger: Calling agent.run(task=[]) or agent.run(task=some_list) where some_list was emptied by upstream filtering logic; passing an empty generator-backed list.
Common situations: Dynamic pipelines that build message lists from filtered data (e.g. all messages filtered out) and pass the empty remainder as the task.
Related errors
- Invalid message type in sequence: {type(msg)}
- Failed to list MCP prompts
- Failed to get MCP prompt
- Failed to get MCP capabilities
- Failed to call MCP tool
AI-assisted analysis of microsoft/autogen@027ecf0a37 (2026-08-15).
Data as JSON: /api/errors/3569602041cb4b1f.
Report an issue: GitHub.