Skip to content

Releases: microsoft/autogen

python-v0.6.1

05 Jun 05:58
348bcb1
Compare
Choose a tag to compare

Bug Fixes

  • Fix bug in GraphFlow cycle check by @ekzhu in #6629
  • Fix graph validation logic and add tests by @ekzhu in #6630

Others

  • Add list of function calls and results in ToolCallSummaryMessage by @ekzhu in #6626

Full Changelog: python-v0.6.0...python-v0.6.1

python-v0.6.0

05 Jun 00:37
16e1943
Compare
Choose a tag to compare

What's New

Change to BaseGroupChatManager.select_speaker and support for concurrent agents in GraphFlow

We made a type hint change to the select_speaker method of BaseGroupChatManager to allow for a list of agent names as a return value. This makes it possible to support concurrent agents in GraphFlow, such as in a fan-out-fan-in pattern.
 

# Original signature:
async def select_speaker(self, thread: Sequence[BaseAgentEvent | BaseChatMessage]) -> str:
  ...

# New signature:
async def select_speaker(self, thread: Sequence[BaseAgentEvent | BaseChatMessage]) -> List[str] | str:
  ...

Now you can run GraphFlow with concurrent agents as follows:

import asyncio

from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import MaxMessageTermination
from autogen_agentchat.teams import DiGraphBuilder, GraphFlow
from autogen_ext.models.openai import OpenAIChatCompletionClient


async def main():
    # Initialize agents with OpenAI model clients.
    model_client = OpenAIChatCompletionClient(model="gpt-4.1-nano")
    agent_a = AssistantAgent("A", model_client=model_client, system_message="You are a helpful assistant.")
    agent_b = AssistantAgent("B", model_client=model_client, system_message="Translate input to Chinese.")
    agent_c = AssistantAgent("C", model_client=model_client, system_message="Translate input to Japanese.")

    # Create a directed graph with fan-out flow A -> (B, C).
    builder = DiGraphBuilder()
    builder.add_node(agent_a).add_node(agent_b).add_node(agent_c)
    builder.add_edge(agent_a, agent_b).add_edge(agent_a, agent_c)
    graph = builder.build()

    # Create a GraphFlow team with the directed graph.
    team = GraphFlow(
        participants=[agent_a, agent_b, agent_c],
        graph=graph,
        termination_condition=MaxMessageTermination(5),
    )

    # Run the team and print the events.
    async for event in team.run_stream(task="Write a short story about a cat."):
        print(event)


asyncio.run(main())

Agent B and C will run concurrently in separate coroutines.

  • Enable concurrent execution of agents in GraphFlow by @ekzhu in #6545

Callable conditions for GraphFlow edges

Now you can use lambda functions or other callables to specify edge conditions in GraphFlow. This addresses the issue of the keyword substring-based conditions cannot cover all possibilities and leading to "cannot find next agent" bug.

NOTE: callable conditions are currently experimental, and it cannot be serialized with the graph.

  • Add callable condition for GraphFlow edges by @ekzhu in #6623

New Agent: OpenAIAgent

  • Feature: Add OpenAIAgent backed by OpenAI Response API by @jay-thakur in #6418

MCP Improvement

AssistantAgent Improvement

Code Executors Improvement

  • Add option to auto-delete temporary files in LocalCommandLineCodeExecutor by @holtvogt in #6556
  • Include all output to error output in docker jupyter code executor by @ekzhu in #6572

OpenAIChatCompletionClient Improvement

OllamaChatCompletionClient Improvement

AnthropicBedrockChatCompletionClient Improvement

MagenticOneGroupChat Improvement

  • Use structured output for m1 orchestrator by @ekzhu in #6540

Other Changes

New Contributors

Full Changelog: python-v0.5.7...python-v0.6.0

python-v0.5.7

14 May 05:02
87cf4f0
Compare
Choose a tag to compare

What's New

AzureAISearchTool Improvements

The Azure AI Search Tool API now features unified methods:

  • create_full_text_search() (supporting "simple", "full", and "semantic" query types)
  • create_vector_search() and
  • create_hybrid_search()
    We also added support for client-side embeddings, while defaults to service embeddings when client embeddings aren't provided.

If you have been using create_keyword_search(), update your code to use create_full_text_search() with "simple" query type.

SelectorGroupChat Improvements

To support long context for the model-based selector in SelectorGroupChat, you can pass in a model context object through the new model_context parameter to customize the messages sent to the model client when selecting the next speaker.

  • Add model_context to SelectorGroupChat for enhanced speaker selection by @Ethan0456 in #6330

OTEL Tracing Improvements

We added new metadata and message content fields to the OTEL traces emitted by the SingleThreadedAgentRuntime.

Agent Runtime Improvements

Other Python Related Changes

New Contributors

Full Changelog: python-v0.5.6...python-v0.5.7

python-v0.5.6

02 May 22:55
880a225
Compare
Choose a tag to compare

What's New

GraphFlow: customized workflows using directed graph

Should I say finally? Yes, finally, we have workflows in AutoGen. GraphFlow is a new team class as part of the AgentChat API. One way to think of GraphFlow is that it is a version of SelectorGroupChat but with a directed graph as the selector_func. However, it is actually more powerful, because the abstraction also supports concurrent agents.

Note: GraphFlow is still an experimental API. Watch out for changes in the future releases.

For more details, see our newly added user guide on GraphFlow.

If you are in a hurry, here is an example of creating a fan-out-fan-in workflow:

import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import DiGraphBuilder, GraphFlow
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import OpenAIChatCompletionClient


async def main() -> None:
    # Create an OpenAI model client
    client = OpenAIChatCompletionClient(model="gpt-4.1-nano")

    # Create the writer agent
    writer = AssistantAgent(
        "writer",
        model_client=client,
        system_message="Draft a short paragraph on climate change.",
    )

    # Create two editor agents
    editor1 = AssistantAgent(
        "editor1", model_client=client, system_message="Edit the paragraph for grammar."
    )

    editor2 = AssistantAgent(
        "editor2", model_client=client, system_message="Edit the paragraph for style."
    )

    # Create the final reviewer agent
    final_reviewer = AssistantAgent(
        "final_reviewer",
        model_client=client,
        system_message="Consolidate the grammar and style edits into a final version.",
    )

    # Build the workflow graph
    builder = DiGraphBuilder()
    builder.add_node(writer).add_node(editor1).add_node(editor2).add_node(
        final_reviewer
    )

    # Fan-out from writer to editor1 and editor2
    builder.add_edge(writer, editor1)
    builder.add_edge(writer, editor2)

    # Fan-in both editors into final reviewer
    builder.add_edge(editor1, final_reviewer)
    builder.add_edge(editor2, final_reviewer)

    # Build and validate the graph
    graph = builder.build()

    # Create the flow
    flow = GraphFlow(
        participants=builder.get_participants(),
        graph=graph,
    )

    # Run the workflow
    await Console(flow.run_stream(task="Write a short biography of Steve Jobs."))

asyncio.run(main())

Major thanks to @abhinav-aegis for the initial design and implementation of this amazing feature!

Azure AI Agent Improvement

New Sample

  • A multi-agent PostgreSQL data management example by @mehrsa in #6443

Bug Fixes:

Dev Improvement

Other Python Related Changes

New Contributors

Full Changelog: python-v0.5.5...python-v0.5.6

python-v0.5.5

25 Apr 23:56
653bcc5
Compare
Choose a tag to compare

What's New

Introduce Workbench

A workbench is a collection of tools that share state and resource. For example, you can now use MCP server through McpWorkbench rather than using tool adapters. This makes it possible to use MCP servers that requires a shared session among the tools (e.g., login session).

Here is an example of using AssistantAgent with GitHub MCP Server.

import asyncio
import os
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_ext.tools.mcp import McpWorkbench, StdioServerParams

async def main() -> None:
    model_client = OpenAIChatCompletionClient(model="gpt-4.1-nano")
    server_params = StdioServerParams(
        command="docker",
        args=[
            "run",
            "-i",
            "--rm",
            "-e",
            "GITHUB_PERSONAL_ACCESS_TOKEN",
            "ghcr.io/github/github-mcp-server",
        ],
        env={
            "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        }
    )
    async with McpWorkbench(server_params) as mcp:
        agent = AssistantAgent(
            "github_assistant",
            model_client=model_client,
            workbench=mcp,
            reflect_on_tool_use=True,
            model_client_stream=True,
        )
        await Console(agent.run_stream(task="Is there a repository named Autogen"))
    
asyncio.run(main())

Here is another example showing a web browsing agent using Playwright MCP Server, AssistantAgent and RoundRobinGroupChat.

# First run `npm install -g @playwright/mcp@latest` to install the MCP server.
import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMessageTermination
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_ext.tools.mcp import McpWorkbench, StdioServerParams

async def main() -> None:
    model_client = OpenAIChatCompletionClient(model="gpt-4.1-nano")
    server_params = StdioServerParams(
        command="npx",
        args=[
            "@playwright/mcp@latest",
            "--headless",
        ],
    )
    async with McpWorkbench(server_params) as mcp:
        agent = AssistantAgent(
            "web_browsing_assistant",
            model_client=model_client,
            workbench=mcp,
            model_client_stream=True,
        )
        team = RoundRobinGroupChat(
            [agent],
            termination_condition=TextMessageTermination(source="web_browsing_assistant"),
        )
        await Console(team.run_stream(task="Find out how many contributors for the microsoft/autogen repository"))
    
asyncio.run(main())

Read more:

New Sample: AutoGen and FastAPI with Streaming

  • Add example using autogen-core and FastAPI for handoff multi-agent design pattern with streaming and UI by @amith-ajith in #6391

New Termination Condition: FunctionalTermination

  • Support using a function expression to create a termination condition for teams. by @ekzhu in #6398

Other Python Related Changes

  • update website version by @ekzhu in #6364
  • TEST/change gpt4, gpt4o serise to gpt4.1nano by @SongChiYoung in #6375
  • Remove name field from OpenAI Assistant Message by @ekzhu in #6388
  • Add guide for workbench and mcp & bug fixes for create_mcp_server_session by @ekzhu in #6392
  • TEST: skip when macos+uv and adding uv venv tests by @SongChiYoung in #6387
  • AssistantAgent to support Workbench by @ekzhu in #6393
  • Update agent documentation by @ekzhu in #6394
  • Update version to 0.5.5 by @ekzhu in #6397
  • Update: implement return_value_as_string for McpToolAdapter by @perfogic in #6380
  • [doc] Clarify selector prompt for SelectorGroupChat by @ekzhu in #6399
  • Document custom message types in teams API docs by @ekzhu in #6400

New Contributors

Full Changelog: python-v0.5.4...python-v0.5.5

python-v0.5.4

22 Apr 17:51
aad6caa
Compare
Choose a tag to compare

What's New

Agent and Team as Tools

You can use AgentTool and TeamTool to wrap agent and team into tools to be used by other agents.

import asyncio

from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.tools import AgentTool
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import OpenAIChatCompletionClient


async def main() -> None:
    model_client = OpenAIChatCompletionClient(model="gpt-4")
    writer = AssistantAgent(
        name="writer",
        description="A writer agent for generating text.",
        model_client=model_client,
        system_message="Write well.",
    )
    writer_tool = AgentTool(agent=writer)
    assistant = AssistantAgent(
        name="assistant",
        model_client=model_client,
        tools=[writer_tool],
        system_message="You are a helpful assistant.",
    )
    await Console(assistant.run_stream(task="Write a poem about the sea."))


asyncio.run(main())

See AgentChat Tools API for more information.

Azure AI Agent

Introducing adapter for Azure AI Agent, with support for file search, code interpreter, and more. See our Azure AI Agent Extension API.

Docker Jupyter Code Executor

Thinking about sandboxing your local Jupyter execution environment? We just added a new code executor to our family of code executors. See Docker Jupyter Code Executor Extension API.

  • Make Docker Jupyter support to the Version 0.4 as Version 0.2 by @masquerlin in #6231

Canvas Memory

Shared "whiteboard" memory can be useful for agents to collaborate on a common artifact such code, document, or illustration. Canvas Memory is an experimental extension for sharing memory and exposing tools for agents to operate on the shared memory.

New Community Extensions

Updated links to new community extensions. Notably, autogen-contextplus provides advanced model context implementations with ability to automatically summarize, truncate the model context used by agents.

SelectorGroupChat Update

SelectorGroupChat now works with models that only support streaming mode (e.g., QwQ). It can also optionally emit the inner reasoning of the model used in the selector. Set emit_team_events=True and model_client_streaming=True when creating SelectorGroupChat.

  • FEAT: SelectorGroupChat could using stream inner select_prompt by @SongChiYoung in #6286

CodeExecutorAgent Update

CodeExecutorAgent just got another refresh: it now supports max_retries_on_error parameter. You can specify how many times it can retry and self-debug in case there is error in the code execution.

ModelInfo Update

New Sample: AutoGen Core + FastAPI with Streaming

  • Add an example using autogen-core and FastAPI to create streaming responses by @ToryPan in #6335

AGBench Update

Bug Fixes

  • Bugfix: Azure AI Search Tool - fix query type by @jay-thakur in #6331
  • fix: ensure serialized messages are passed to LLMStreamStartEvent by @peterj in #6344
  • fix: ollama fails when tools use optional args by @peterj in #6343
  • Avoid re-registering a message type already registered by @jorge-wonolo in #6354
  • Fix: deserialize model_context in AssistantAgent and SocietyOfMindAgent and CodeExecutorAgent by @SongChiYoung in #6337

What's Changed

  • Update website 0.5.3 by @ekzhu in #6320
  • Update version 0.5.4 by @ekzhu in #6334
  • Generalize Continuous SystemMessage merging via model_info[“multiple_system_messages”] instead of startswith("gemini-") by @SongChiYoung in #6345
  • Add experimental notice to canvas by @ekzhu in #6349
  • Added support for exposing GPUs to docker code executor by @millerh1 in #6339

New Contributors

Full Changelog: python-v0.5.3...python-v0.5.4

python-v0.5.3

17 Apr 03:36
fb16d5a
Compare
Choose a tag to compare

What's New

CodeExecutorAgent Update

Now the CodeExecutorAgent can generate and execute code in the same invocation. See API doc for examples.

AssistantAgent Improvement

Now AssistantAgent can be serialized when output_content_type is set, thanks @abhinav-aegis's new built-in utility module autogen_core.utils for working with JSON schema.

Team Improvement

Added an optional parameter emit_team_events to configure whether team events like SelectorSpeakerEvent are emitted through run_stream.

  • [FEATURE] Option to emit group chat manager messages in AgentChat by @SongChiYoung in #6303

MCP Improvement

Now mcp_server_tools factory can reuse a shared session. See example of AssistantAgent using Playwright MCP server in the API Doc.

  • Make shared session possible for MCP tool by @ekzhu in #6312

Console Improvement

Bug Fixes

  • Fix: Azure AI Search Tool Client Lifetime Management by @jay-thakur in #6316
  • Make sure thought content is included in handoff context by @ekzhu in #6319

Python Related Changes

New Contributors

Full Changelog: python-v0.5.2...python-v0.5.3

python-v0.5.2

15 Apr 03:24
3500170
Compare
Choose a tag to compare

Python Related Changes

New Contributors

Full Changelog: python-v0.5.1...python-v0.5.2

python-v0.5.1

03 Apr 23:37
47602ea
Compare
Choose a tag to compare

What's New

AgentChat Message Types (Type Hint Changes)

Important

TL;DR: If you are not using custom agents or custom termination conditions, you don't need to change anything.
Otherwise, update AgentEvent to BaseAgentEvent and ChatMessage to BaseChatMessage in your type hints.

This is a breaking change on type hinting only, not on usage.

We updated the message types in AgentChat in this new release.
The purpose of this change is to support custom message types defined by applications.

Previously, message types are fixed and we use the union types ChatMessage and AgentEvent to refer to all the concrete built-in message types.

Now, in the main branch, the message types are organized into hierarchy: existing built-in concrete message types are subclassing either BaseChatMessage and BaseAgentEvent, depending it was part of the ChatMessage or AgentEvent union. We refactored all message handlers on_messages, on_messages_stream, run, run_stream and TerminationCondition to use the base classes in their type hints.

If you are subclassing BaseChatAgent to create your custom agents, or subclassing TerminationCondition to create your custom termination conditions, then you need to rebase the method signatures to use BaseChatMessage and BaseAgentEvent.

If you are using the union types in your existing data structures for serialization and deserialization, then you can keep using those union types to ensure the messages are being handled as concrete types. However, this will not work with custom message types.

Otherwise, your code should just work, as the refactor only makes type hint changes.

This change allows us to support custom message types. For example, we introduced a new message type StructureMessage[T] generic, that can be used to create new message types with a BaseModel content. On-going work is to get AssistantAgent to respond with StructuredMessage[T] where T is the structured output type for the model.

See the API doc on AgentChat message types: https://microsoft.github.io/autogen/stable/reference/python/autogen_agentchat.messages.html

  • Use class hierarchy to organize AgentChat message types and introduce StructuredMessage type by @ekzhu in #5998
  • Rename to use BaseChatMessage and BaseAgentEvent. Bring back union types. by @ekzhu in #6144

Structured Output

We enhanced support for structured output in model clients and agents.

For model clients, use json_output parameter to specify the structured output type
as a Pydantic model. The model client will then return a JSON string
that can be deserialized into the specified Pydantic model.

import asyncio
from typing import Literal

from autogen_core import CancellationToken
from autogen_ext.models.openai import OpenAIChatCompletionClient
from pydantic import BaseModel

# Define the structured output format.
class AgentResponse(BaseModel):
    thoughts: str
    response: Literal["happy", "sad", "neutral"]

 model_client = OpenAIChatCompletionClient(model="gpt-4o-mini")

 # Generate a response using the tool.
response = await model_client.create(
    messages=[
        SystemMessage(content="Analyze input text sentiment using the tool provided."),
        UserMessage(content="I am happy.", source="user"),
    ],
    json_ouput=AgentResponse,
)

print(response.content)
# Should be a structured output.
# {"thoughts": "The user is happy.", "response": "happy"}

For AssistantAgent, you can set output_content_type to the structured output type. The agent will automatically reflect on the tool call result and generate a StructuredMessage with the output content type.

import asyncio
from typing import Literal

from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.messages import TextMessage
from autogen_agentchat.ui import Console
from autogen_core import CancellationToken
from autogen_core.tools import FunctionTool
from autogen_ext.models.openai import OpenAIChatCompletionClient
from pydantic import BaseModel

# Define the structured output format.
class AgentResponse(BaseModel):
    thoughts: str
    response: Literal["happy", "sad", "neutral"]


# Define the function to be called as a tool.
def sentiment_analysis(text: str) -> str:
    """Given a text, return the sentiment."""
    return "happy" if "happy" in text else "sad" if "sad" in text else "neutral"


# Create a FunctionTool instance with `strict=True`,
# which is required for structured output mode.
tool = FunctionTool(sentiment_analysis, description="Sentiment Analysis", strict=True)

# Create an OpenAIChatCompletionClient instance that supports structured output.
model_client = OpenAIChatCompletionClient(
    model="gpt-4o-mini",
)

# Create an AssistantAgent instance that uses the tool and model client.
agent = AssistantAgent(
    name="assistant",
    model_client=model_client,
    tools=[tool],
    system_message="Use the tool to analyze sentiment.",
    output_content_type=AgentResponse,
)

stream = agent.on_messages_stream([TextMessage(content="I am happy today!", source="user")], CancellationToken())
await Console(stream)
---------- assistant ----------
[FunctionCall(id='call_tIZjAVyKEDuijbBwLY6RHV2p', arguments='{"text":"I am happy today!"}', name='sentiment_analysis')]
---------- assistant ----------
[FunctionExecutionResult(content='happy', call_id='call_tIZjAVyKEDuijbBwLY6RHV2p', is_error=False)]
---------- assistant ----------
{"thoughts":"The user expresses a clear positive emotion by stating they are happy today, suggesting an upbeat mood.","response":"happy"}

You can also pass a StructuredMessage to the run and run_stream methods of agents and teams as task messages. Agents will automatically deserialize the message to string and place them in their model context. StructuredMessage generated by an agent will also be passed to other agents in the team, and emitted as messages in the output stream.

  • Add structured output to model clients by @ekzhu in #5936
  • Support json schema for response format type in OpenAIChatCompletionClient by @ekzhu in #5988
  • Add output_format to AssistantAgent for structured output by @ekzhu in #6071

Azure AI Search Tool

Added a new tool for agents to perform search using Azure AI Search.

See the documentation for more details.

SelectorGroupChat Improvements

  • Implement 'candidate_func' parameter to filter down the pool of candidates for selection by @Ethan0456 in #5954
  • Add async support for selector_func and candidate_func in SelectorGroupChat by @Ethan0456 in #6068

Code Executors Improvements

  • Add cancellation support to docker executor by @ekzhu in #6027
  • Move start() and stop() as interface methods for CodeExecutor by @ekzhu in #6040
  • Changed Code Executors default directory to temporary directory by @federicovilla55 in #6143

Model Client Improvements

  • Improve documentation around model client and tool and how it works under the hood by @ekzhu in #6050
  • Add support for thought field in AzureAIChatCompletionClient by @jay-thakur in #6062
  • Add a thought process analysis, and add a reasoning field in the ModelClientStreamingChunkEvent to distinguish the thought tokens. by @y26s4824k264 in #5989
  • Add thought field support and fix LLM control parameters for OllamaChatCompletionClient by @jay-thakur in #6126
  • Modular Transformer Pipeline and Fix Gemini/Anthropic Empty Content Handling by @SongChiYoung in #6063
  • Doc/moudulor transform oai by @SongChiYoung in #6149
  • Model family resolution to support non-prefixed names like Mistral by @SongChiYoung in #6158

TokenLimitedChatCompletionContext

Introduce TokenLimitedChatCompletionContext to limit the number of tokens in the context
sent to the model.
This is useful for long-running agents that need to keep a long history of messages in the context.

Bug Fixes

Read more

python-v0.4.9.3

29 Mar 04:40
Compare
Choose a tag to compare

Patch Release

This release addresses a bug in MCP Server Tool that causes error when unset tool arguments are set to None and passed on to the server. It also improves the error message from server and adds a default timeout. #6080, #6125

Full Changelog: python-v0.4.9.2...python-v0.4.9.3