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

  1. Check the sequence is non-empty before calling run(); pass task=None to continue from the existing model context instead.
  2. Fix the upstream filtering logic that produced an empty list.
  3. 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

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


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