From 963e4096205c76784085218581927e801ce11bdd Mon Sep 17 00:00:00 2001 From: jspv Date: Thu, 21 Nov 2024 21:34:00 -0500 Subject: [PATCH 01/15] AssistantAgent support for streaming tokens --- .../agents/_assistant_agent.py | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py index 7e502498f9b6..1b3ba0f6176b 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py @@ -167,11 +167,13 @@ def __init__( handoffs: List[Handoff | str] | None = None, description: str = "An agent that provides assistance with ability to use tools.", system_message: str = "You are a helpful AI assistant. Solve tasks using your tools. Reply with TERMINATE when the task has been completed.", + token_callback: Callable | None = None, ): super().__init__(name=name, description=description) self._model_client = model_client self._system_messages = [SystemMessage(content=system_message)] self._tools: List[Tool] = [] + self._token_callback = token_callback if tools is not None: for tool in tools: if isinstance(tool, Tool): @@ -236,9 +238,24 @@ async def on_messages_stream( # Generate an inference result based on the current model context. llm_messages = self._system_messages + self._model_context - result = await self._model_client.create( - llm_messages, tools=self._tools + self._handoff_tools, cancellation_token=cancellation_token - ) + + # if token_callback is set, use create_stream to get the tokens as they are + # generated and call the token_callback with the tokens + if self._token_callback is not None: + async for result in self._model_client.create_stream( + llm_messages, + tools=self._tools + self._handoff_tools, + cancellation_token=cancellation_token, + ): + # if the result is a string, it is a token to be streamed back + if isinstance(result, str): + await self._token_callback(result) + else: + break + else: + result = await self._model_client.create( + llm_messages, tools=self._tools + self._handoff_tools, cancellation_token=cancellation_token, + ) # Add the response to the model context. self._model_context.append(AssistantMessage(content=result.content, source=self.name)) @@ -279,9 +296,24 @@ async def on_messages_stream( return # Generate an inference result based on the current model context. - result = await self._model_client.create( - self._model_context, tools=self._tools + self._handoff_tools, cancellation_token=cancellation_token - ) + + # if token_callback is set, use create_stream to get the tokens as they are + # generated and call the token_callback with the tokens + if self._token_callback is not None: + async for result in self._model_client.create_stream( + self._model_context, + tools=self._tools + self._handoff_tools, + cancellation_token=cancellation_token, + ): + # if the result is a string, it is a token to be streamed back + if isinstance(result, str): + await self._token_callback(result) + else: + break + else: + result = await self._model_client.create( + self._model_context,tools=self._tools + self._handoff_tools, cancellation_token=cancellation_token, + ) self._model_context.append(AssistantMessage(content=result.content, source=self.name)) assert isinstance(result.content, str) From b854daecbb230dcc488ac9f251c0f8e4ac32fd0a Mon Sep 17 00:00:00 2001 From: jspv Date: Sun, 8 Dec 2024 19:39:55 -0500 Subject: [PATCH 02/15] Updates for token handling --- .../agents/_assistant_agent.py | 84 ++++++++++++++----- 1 file changed, 64 insertions(+), 20 deletions(-) diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py index 61a25080926b..ce7f9f72d8f9 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py @@ -34,7 +34,9 @@ event_logger = logging.getLogger(EVENT_LOGGER_NAME) -@deprecated("Moved to autogen_agentchat.base.Handoff. Will remove in 0.4.0.", stacklevel=2) +@deprecated( + "Moved to autogen_agentchat.base.Handoff. Will remove in 0.4.0.", stacklevel=2 +) class Handoff(HandoffBase): """[DEPRECATED] Handoff configuration. Moved to :class:`autogen_agentchat.base.Handoff`. Will remove in 0.4.0.""" @@ -169,11 +171,14 @@ def __init__( name: str, model_client: ChatCompletionClient, *, - tools: List[Tool | Callable[..., Any] | Callable[..., Awaitable[Any]]] | None = None, + tools: ( + List[Tool | Callable[..., Any] | Callable[..., Awaitable[Any]]] | None + ) = None, handoffs: List[HandoffBase | str] | None = None, description: str = "An agent that provides assistance with ability to use tools.", - system_message: str - | None = "You are a helpful AI assistant. Solve tasks using your tools. Reply with TERMINATE when the task has been completed.", + system_message: ( + str | None + ) = "You are a helpful AI assistant. Solve tasks using your tools. Reply with TERMINATE when the task has been completed.", token_callback: Callable | None = None, ): super().__init__(name=name, description=description) @@ -207,7 +212,9 @@ def __init__( self._handoffs: Dict[str, HandoffBase] = {} if handoffs is not None: if model_client.capabilities["function_calling"] is False: - raise ValueError("The model does not support function calling, which is needed for handoffs.") + raise ValueError( + "The model does not support function calling, which is needed for handoffs." + ) for handoff in handoffs: if isinstance(handoff, str): handoff = HandoffBase(target=handoff) @@ -234,7 +241,9 @@ def produced_message_types(self) -> List[type[ChatMessage]]: return [TextMessage, HandoffMessage] return [TextMessage] - async def on_messages(self, messages: Sequence[ChatMessage], cancellation_token: CancellationToken) -> Response: + async def on_messages( + self, messages: Sequence[ChatMessage], cancellation_token: CancellationToken + ) -> Response: async for message in self.on_messages_stream(messages, cancellation_token): if isinstance(message, Response): return message @@ -245,9 +254,14 @@ async def on_messages_stream( ) -> AsyncGenerator[AgentMessage | Response, None]: # Add messages to the model context. for msg in messages: - if isinstance(msg, MultiModalMessage) and self._model_client.capabilities["vision"] is False: + if ( + isinstance(msg, MultiModalMessage) + and self._model_client.capabilities["vision"] is False + ): raise ValueError("The model does not support vision.") - self._model_context.append(UserMessage(content=msg.content, source=msg.source)) + self._model_context.append( + UserMessage(content=msg.content, source=msg.source) + ) # Inner messages. inner_messages: List[AgentMessage] = [] @@ -270,15 +284,23 @@ async def on_messages_stream( break else: result = await self._model_client.create( - llm_messages, tools=self._tools + self._handoff_tools, cancellation_token=cancellation_token, + llm_messages, + tools=self._tools + self._handoff_tools, + cancellation_token=cancellation_token, ) # Add the response to the model context. - self._model_context.append(AssistantMessage(content=result.content, source=self.name)) + self._model_context.append( + AssistantMessage(content=result.content, source=self.name) + ) # Run tool calls until the model produces a string response. - while isinstance(result.content, list) and all(isinstance(item, FunctionCall) for item in result.content): - tool_call_msg = ToolCallMessage(content=result.content, source=self.name, models_usage=result.usage) + while isinstance(result.content, list) and all( + isinstance(item, FunctionCall) for item in result.content + ): + tool_call_msg = ToolCallMessage( + content=result.content, source=self.name, models_usage=result.usage + ) event_logger.debug(tool_call_msg) # Add the tool call message to the output. inner_messages.append(tool_call_msg) @@ -286,9 +308,14 @@ async def on_messages_stream( # Execute the tool calls. results = await asyncio.gather( - *[self._execute_tool_call(call, cancellation_token) for call in result.content] + *[ + self._execute_tool_call(call, cancellation_token) + for call in result.content + ] + ) + tool_call_result_msg = ToolCallResultMessage( + content=results, source=self.name ) - tool_call_result_msg = ToolCallResultMessage(content=results, source=self.name) event_logger.debug(tool_call_result_msg) self._model_context.append(FunctionExecutionResultMessage(content=results)) inner_messages.append(tool_call_result_msg) @@ -301,11 +328,15 @@ async def on_messages_stream( handoffs.append(self._handoffs[call.name]) if len(handoffs) > 0: if len(handoffs) > 1: - raise ValueError(f"Multiple handoffs detected: {[handoff.name for handoff in handoffs]}") + raise ValueError( + f"Multiple handoffs detected: {[handoff.name for handoff in handoffs]}" + ) # Return the output messages to signal the handoff. yield Response( chat_message=HandoffMessage( - content=handoffs[0].message, target=handoffs[0].target, source=self.name + content=handoffs[0].message, + target=handoffs[0].target, + source=self.name, ), inner_messages=inner_messages, ) @@ -329,13 +360,19 @@ async def on_messages_stream( break else: result = await self._model_client.create( - llm_messages, tools=self._tools + self._handoff_tools, cancellation_token=cancellation_token, + llm_messages, + tools=self._tools + self._handoff_tools, + cancellation_token=cancellation_token, ) - self._model_context.append(AssistantMessage(content=result.content, source=self.name)) + self._model_context.append( + AssistantMessage(content=result.content, source=self.name) + ) assert isinstance(result.content, str) yield Response( - chat_message=TextMessage(content=result.content, source=self.name, models_usage=result.usage), + chat_message=TextMessage( + content=result.content, source=self.name, models_usage=result.usage + ), inner_messages=inner_messages, ) @@ -346,7 +383,14 @@ async def _execute_tool_call( try: if not self._tools + self._handoff_tools: raise ValueError("No tools are available.") - tool = next((t for t in self._tools + self._handoff_tools if t.name == tool_call.name), None) + tool = next( + ( + t + for t in self._tools + self._handoff_tools + if t.name == tool_call.name + ), + None, + ) if tool is None: raise ValueError(f"The tool '{tool_call.name}' is not available.") arguments = json.loads(tool_call.arguments) From f43f83189951e851726491ae7fbf5724db7de2f9 Mon Sep 17 00:00:00 2001 From: jspv Date: Sun, 8 Dec 2024 20:03:16 -0500 Subject: [PATCH 03/15] Fixed formatting --- .../agents/_assistant_agent.py | 76 +++++-------------- 1 file changed, 18 insertions(+), 58 deletions(-) diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py index fc00fc952b8c..7c63f7e71d23 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py @@ -35,9 +35,7 @@ event_logger = logging.getLogger(EVENT_LOGGER_NAME) -@deprecated( - "Moved to autogen_agentchat.base.Handoff. Will remove in 0.4.0.", stacklevel=2 -) +@deprecated("Moved to autogen_agentchat.base.Handoff. Will remove in 0.4.0.", stacklevel=2) class Handoff(HandoffBase): """[DEPRECATED] Handoff configuration. Moved to :class:`autogen_agentchat.base.Handoff`. Will remove in 0.4.0.""" @@ -178,14 +176,11 @@ def __init__( name: str, model_client: ChatCompletionClient, *, - tools: ( - List[Tool | Callable[..., Any] | Callable[..., Awaitable[Any]]] | None - ) = None, + tools: List[Tool | Callable[..., Any] | Callable[..., Awaitable[Any]]] | None = None, handoffs: List[HandoffBase | str] | None = None, description: str = "An agent that provides assistance with ability to use tools.", - system_message: ( - str | None - ) = "You are a helpful AI assistant. Solve tasks using your tools. Reply with TERMINATE when the task has been completed.", + system_message: str + | None = "You are a helpful AI assistant. Solve tasks using your tools. Reply with TERMINATE when the task has been completed.", token_callback: Callable | None = None, ): super().__init__(name=name, description=description) @@ -219,9 +214,7 @@ def __init__( self._handoffs: Dict[str, HandoffBase] = {} if handoffs is not None: if model_client.capabilities["function_calling"] is False: - raise ValueError( - "The model does not support function calling, which is needed for handoffs." - ) + raise ValueError("The model does not support function calling, which is needed for handoffs.") for handoff in handoffs: if isinstance(handoff, str): handoff = HandoffBase(target=handoff) @@ -249,9 +242,7 @@ def produced_message_types(self) -> List[type[ChatMessage]]: return [TextMessage, HandoffMessage] return [TextMessage] - async def on_messages( - self, messages: Sequence[ChatMessage], cancellation_token: CancellationToken - ) -> Response: + async def on_messages(self, messages: Sequence[ChatMessage], cancellation_token: CancellationToken) -> Response: async for message in self.on_messages_stream(messages, cancellation_token): if isinstance(message, Response): return message @@ -262,14 +253,9 @@ async def on_messages_stream( ) -> AsyncGenerator[AgentMessage | Response, None]: # Add messages to the model context. for msg in messages: - if ( - isinstance(msg, MultiModalMessage) - and self._model_client.capabilities["vision"] is False - ): + if isinstance(msg, MultiModalMessage) and self._model_client.capabilities["vision"] is False: raise ValueError("The model does not support vision.") - self._model_context.append( - UserMessage(content=msg.content, source=msg.source) - ) + self._model_context.append(UserMessage(content=msg.content, source=msg.source)) # Inner messages. inner_messages: List[AgentMessage] = [] @@ -298,17 +284,11 @@ async def on_messages_stream( ) # Add the response to the model context. - self._model_context.append( - AssistantMessage(content=result.content, source=self.name) - ) + self._model_context.append(AssistantMessage(content=result.content, source=self.name)) # Run tool calls until the model produces a string response. - while isinstance(result.content, list) and all( - isinstance(item, FunctionCall) for item in result.content - ): - tool_call_msg = ToolCallMessage( - content=result.content, source=self.name, models_usage=result.usage - ) + while isinstance(result.content, list) and all(isinstance(item, FunctionCall) for item in result.content): + tool_call_msg = ToolCallMessage(content=result.content, source=self.name, models_usage=result.usage) event_logger.debug(tool_call_msg) # Add the tool call message to the output. inner_messages.append(tool_call_msg) @@ -316,14 +296,9 @@ async def on_messages_stream( # Execute the tool calls. results = await asyncio.gather( - *[ - self._execute_tool_call(call, cancellation_token) - for call in result.content - ] - ) - tool_call_result_msg = ToolCallResultMessage( - content=results, source=self.name + *[self._execute_tool_call(call, cancellation_token) for call in result.content] ) + tool_call_result_msg = ToolCallResultMessage(content=results, source=self.name) event_logger.debug(tool_call_result_msg) self._model_context.append(FunctionExecutionResultMessage(content=results)) inner_messages.append(tool_call_result_msg) @@ -336,15 +311,11 @@ async def on_messages_stream( handoffs.append(self._handoffs[call.name]) if len(handoffs) > 0: if len(handoffs) > 1: - raise ValueError( - f"Multiple handoffs detected: {[handoff.name for handoff in handoffs]}" - ) + raise ValueError(f"Multiple handoffs detected: {[handoff.name for handoff in handoffs]}") # Return the output messages to signal the handoff. yield Response( chat_message=HandoffMessage( - content=handoffs[0].message, - target=handoffs[0].target, - source=self.name, + content=handoffs[0].message, target=handoffs[0].target, source=self.name ), inner_messages=inner_messages, ) @@ -372,15 +343,11 @@ async def on_messages_stream( tools=self._tools + self._handoff_tools, cancellation_token=cancellation_token, ) - self._model_context.append( - AssistantMessage(content=result.content, source=self.name) - ) + self._model_context.append(AssistantMessage(content=result.content, source=self.name)) assert isinstance(result.content, str) yield Response( - chat_message=TextMessage( - content=result.content, source=self.name, models_usage=result.usage - ), + chat_message=TextMessage(content=result.content, source=self.name, models_usage=result.usage), inner_messages=inner_messages, ) @@ -391,14 +358,7 @@ async def _execute_tool_call( try: if not self._tools + self._handoff_tools: raise ValueError("No tools are available.") - tool = next( - ( - t - for t in self._tools + self._handoff_tools - if t.name == tool_call.name - ), - None, - ) + tool = next((t for t in self._tools + self._handoff_tools if t.name == tool_call.name), None) if tool is None: raise ValueError(f"The tool '{tool_call.name}' is not available.") arguments = json.loads(tool_call.arguments) From 9a763f477b55f6fcdf3623039a97c4c3f56d5945 Mon Sep 17 00:00:00 2001 From: jspv Date: Mon, 9 Dec 2024 08:58:35 -0500 Subject: [PATCH 04/15] Set default to fix Azure clients --- .../src/autogen_ext/models/_openai/_openai_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/packages/autogen-ext/src/autogen_ext/models/_openai/_openai_client.py b/python/packages/autogen-ext/src/autogen_ext/models/_openai/_openai_client.py index 8dc1d5707343..1ac4abefe911 100644 --- a/python/packages/autogen-ext/src/autogen_ext/models/_openai/_openai_client.py +++ b/python/packages/autogen-ext/src/autogen_ext/models/_openai/_openai_client.py @@ -575,7 +575,7 @@ async def create_stream( extra_create_args: Mapping[str, Any] = {}, cancellation_token: Optional[CancellationToken] = None, *, - max_consecutive_empty_chunk_tolerance: int = 0, + max_consecutive_empty_chunk_tolerance: int = 10, ) -> AsyncGenerator[Union[str, CreateResult], None]: """ Creates an AsyncGenerator that will yield a stream of chat completions based on the provided messages and tools. From 9d4d58c63cc59ba2c71e3d1aa8b139b354dbc3e3 Mon Sep 17 00:00:00 2001 From: jspv Date: Wed, 18 Dec 2024 08:04:18 -0500 Subject: [PATCH 05/15] refresh from upstream --- .github/workflows/codeql.yml | 20 + .github/workflows/docs.yml | 2 + .github/workflows/dotnet-build.yml | 76 +- CONTRIBUTING.md | 6 +- README.md | 25 +- docs/switcher.json | 12 +- dotnet/AutoGen.sln | 65 +- dotnet/Directory.Packages.props | 11 +- dotnet/samples/Hello/Backend/Backend.csproj | 15 - dotnet/samples/Hello/Backend/Program.cs | 5 - dotnet/samples/Hello/Backend/README.md | 12 - .../Hello/Hello.AppHost/Hello.AppHost.csproj | 2 +- dotnet/samples/Hello/Hello.AppHost/Program.cs | 2 +- .../appsettings.Development.json | 3 +- .../Hello/HelloAIAgents/HelloAIAgent.cs | 8 +- .../Hello/HelloAIAgents/HelloAIAgents.csproj | 3 +- dotnet/samples/Hello/HelloAIAgents/Program.cs | 7 +- .../Hello/HelloAgent/HelloAgent.csproj | 3 +- dotnet/samples/Hello/HelloAgent/Program.cs | 12 +- dotnet/samples/Hello/HelloAgent/README.md | 6 +- .../HelloAgentState/HelloAgentState.csproj | 3 +- .../samples/Hello/HelloAgentState/Program.cs | 9 +- .../samples/Hello/HelloAgentState/README.md | 6 +- .../samples/Hello/protos/agent_events.proto | 2 +- .../DevTeam.AgentHost.csproj | 3 +- .../dev-team/DevTeam.AgentHost/Program.cs | 2 +- .../DevTeam.Agents/DevTeam.Agents.csproj | 4 +- .../DevTeam.Agents/Developer/Developer.cs | 7 +- .../DeveloperLead/DeveloperLead.cs | 7 +- .../ProductManager/ProductManager.cs | 7 +- .../dev-team/DevTeam.Agents/Program.cs | 2 +- .../DevTeam.Backend/Agents/AzureGenie.cs | 6 +- .../dev-team/DevTeam.Backend/Agents/Hubber.cs | 6 +- .../DevTeam.Backend/Agents/Sandbox.cs | 2 +- .../DevTeam.Backend/DevTeam.Backend.csproj | 3 +- .../dev-team/DevTeam.Backend/Program.cs | 2 +- .../Services/GithubWebHookProcessor.cs | 4 +- .../DevTeam.Shared/DevTeam.Shared.csproj | 2 +- .../DevTeam.Shared/EventExtensions.cs | 2 +- .../Abstractions/IAgentBase.cs | 23 - .../Abstractions/IAgentRuntime.cs | 22 - .../{Agents/Services => AgentHost}/Host.cs | 14 +- .../Microsoft.Autogen.AgentHost.csproj | 21 + .../Microsoft.AutoGen/AgentHost/Program.cs | 6 + .../AgentHost}/Properties/launchSettings.json | 9 +- .../AgentHost}/appsettings.json | 0 .../{Agents => }/AIAgent/InferenceAgent.cs | 7 +- .../Agents/{Agents => }/AIAgent/SKAiAgent.cs | 24 +- dotnet/src/Microsoft.AutoGen/Agents/Client.cs | 14 - .../IOAgent/ConsoleAgent/ConsoleAgent.cs | 6 +- .../IOAgent/ConsoleAgent/IHandleConsole.cs | 4 +- .../IOAgent/FileAgent/FileAgent.cs | 8 +- .../Agents/{Agents => }/IOAgent/IOAgent.cs | 10 +- .../IOAgent/WebAPIAgent/WebAPIAgent.cs | 8 +- .../Agents/Microsoft.AutoGen.Agents.csproj | 46 +- .../{Abstractions => Contracts}/AgentId.cs | 2 +- .../ChatHistoryItem.cs | 2 +- .../{Abstractions => Contracts}/ChatState.cs | 2 +- .../ChatUserType.cs | 2 +- .../IAgentState.cs | 2 +- .../IConnection.cs | 2 +- .../MessageExtensions.cs | 3 +- .../Microsoft.AutoGen.Contracts.csproj} | 1 - .../TopicSubscriptionAttribute.cs | 2 +- .../{Agents => Core.Grpc}/App.cs | 16 +- .../Grpc => Core.Grpc}/GrpcAgentWorker.cs | 65 +- .../GrpcAgentWorkerHostBuilderExtension.cs | 6 +- .../Microsoft.AutoGen.Core.Grpc.csproj | 15 + .../{Agents/AgentBase.cs => Core/Agent.cs} | 92 +- .../AgentExtensions.cs} | 29 +- .../AgentMessenger.cs} | 69 +- .../Core/AgentMessengerFactory.cs | 12 + .../src/Microsoft.AutoGen/Core/AgentTypes.cs | 20 + .../{Agents/Services => Core}/AgentWorker.cs | 43 +- dotnet/src/Microsoft.AutoGen/Core/App.cs | 67 + dotnet/src/Microsoft.AutoGen/Core/Client.cs | 9 + .../src/Microsoft.AutoGen/Core/EventTypes.cs | 11 + .../HostBuilderExtensions.cs | 67 +- .../{Abstractions => Core}/IAgentWorker.cs | 6 +- .../{Abstractions => Core}/IHandle.cs | 4 +- .../Core/IHandleExtensions.cs | 38 + .../Core/Microsoft.AutoGen.Core.csproj | 21 + .../Core/ReflectionHelper.cs | 59 + .../Aspire/AspireHostingExtensions.cs | 2 +- ...t.AutoGen.Extensions.SemanticKernel.csproj | 2 +- .../Microsoft.AutoGen.Runtime.Grpc.csproj | 31 + .../Services/AgentWorkerHostingExtensions.cs | 21 +- .../Services/Grpc/GrpcGateway.cs | 4 +- .../Services/Grpc/GrpcGatewayService.cs | 4 +- .../Services/Grpc/GrpcWorkerConnection.cs | 4 +- .../Services/IGateway.cs | 4 +- .../Services/Orleans/AgentStateGrain.cs | 4 +- .../Services/Orleans/IRegistryGrain.cs | 4 +- .../Services/Orleans/ISubscriptionsGrain.cs | 2 +- .../Orleans/OrleansRuntimeHostingExtenions.cs | 11 +- .../Services/Orleans/RegistryGrain.cs | 4 +- .../Services/Orleans/SubscriptionsGrain.cs | 2 +- .../{AgentBaseTests.cs => AgentTests.cs} | 30 +- .../Microsoft.AutoGen.Agents.Tests.csproj | 2 +- .../HelloAgent.AppHost.csproj | 21 + .../HelloAgent.AppHost/Program.cs | 10 + .../Properties/launchSettings.json | 43 + .../HelloAppHostIntegrationTests.cs | 120 + .../InMemoryRuntimeIntegrationTests.cs | 43 + .../DistributedApplicationExtension.cs | 301 ++ .../DistributedApplicationTestFactory.cs | 46 + ...Microsoft.AutoGen.Integration.Tests.csproj | 54 + protos/agent_events.proto | 2 +- protos/agent_states.proto | 2 +- protos/agent_worker.proto | 4 +- protos/cloudevent.proto | 24 +- python/README.md | 2 +- .../Templates/MagenticOne/scenario.py | 4 +- .../GAIA/Templates/MagenticOne/scenario.py | 4 +- .../Templates/MagenticOne/scenario.py | 2 +- .../Templates/MagenticOne/scenario.py | 2 +- .../packages/autogen-agentchat/pyproject.toml | 4 +- .../src/autogen_agentchat/__init__.py | 5 + .../src/autogen_agentchat/agents/__init__.py | 5 + .../agents/_assistant_agent.py | 170 +- .../agents/_base_chat_agent.py | 36 +- .../agents/_coding_assistant_agent.py | 2 +- .../agents/_society_of_mind_agent.py | 112 +- .../agents/_tool_use_assistant_agent.py | 4 +- .../agents/_user_proxy_agent.py | 2 +- .../src/autogen_agentchat/base/_handoff.py | 14 +- .../src/autogen_agentchat/base/_task.py | 6 +- .../autogen_agentchat/conditions/__init__.py | 5 + .../src/autogen_agentchat/messages.py | 8 +- .../src/autogen_agentchat/state/__init__.py | 2 + .../src/autogen_agentchat/state/_states.py | 9 +- .../src/autogen_agentchat/teams/__init__.py | 5 + .../teams/_group_chat/_base_group_chat.py | 57 +- .../_group_chat/_base_group_chat_manager.py | 37 +- .../_group_chat/_chat_agent_container.py | 4 +- .../teams/_group_chat/_events.py | 6 +- .../_magentic_one/_magentic_one_group_chat.py | 4 +- .../_magentic_one_orchestrator.py | 36 +- .../_group_chat/_round_robin_group_chat.py | 6 +- .../teams/_group_chat/_selector_group_chat.py | 8 +- .../teams/_group_chat/_swarm_group_chat.py | 27 +- .../src/autogen_agentchat/ui/__init__.py | 4 + .../src/autogen_agentchat/ui/_console.py | 2 +- .../tests/test_assistant_agent.py | 227 +- .../tests/test_group_chat.py | 73 +- .../tests/test_magentic_one_group_chat.py | 2 +- .../tests/test_society_of_mind_agent.py | 23 +- .../tests/test_termination_condition.py | 2 +- python/packages/autogen-core/docs/src/conf.py | 16 +- .../docs/src/images/example-company.jpg | 3 + .../docs/src/images/example-literature.jpg | 3 + .../docs/src/images/example-travel.jpeg | 3 + .../packages/autogen-core/docs/src/index.md | 4 +- .../autogen-core/docs/src/packages/index.md | 14 +- .../autogen-core/docs/src/reference/index.md | 13 +- ...ext.rst => autogen_core.model_context.rst} | 4 +- ...nts.models.rst => autogen_core.models.rst} | 4 +- ..._agent.rst => autogen_core.tool_agent.rst} | 4 +- ...nents.tools.rst => autogen_core.tools.rst} | 4 +- .../python/autogen_ext.models.openai.rst | 8 + .../python/autogen_ext.models.replay.rst | 8 + .../reference/python/autogen_ext.models.rst | 8 - ...ls.rst => autogen_ext.tools.langchain.rst} | 0 .../examples/company-research.ipynb | 240 +- .../agentchat-user-guide/examples/index.md | 6 +- .../examples/literature-review.ipynb | 251 +- .../examples/travel-planning.ipynb | 322 ++- .../agentchat-user-guide/installation.md | 4 +- .../agentchat-user-guide/quickstart.ipynb | 4 +- .../tutorial/agents.ipynb | 25 +- .../tutorial/custom-agents.ipynb | 191 +- .../tutorial/messages.ipynb | 2 +- .../tutorial/models.ipynb | 18 +- .../tutorial/selector-group-chat.ipynb | 221 +- .../agentchat-user-guide/tutorial/state.ipynb | 133 +- .../agentchat-user-guide/tutorial/swarm.ipynb | 196 +- .../agentchat-user-guide/tutorial/teams.ipynb | 167 +- .../tutorial/termination.ipynb | 6 +- .../agentchat-user-guide/warning.md | 5 - .../autogenstudio-user-guide/faq.md | 124 + .../autogenstudio-user-guide/index.md | 111 + .../autogenstudio-user-guide/installation.md | 69 + .../autogenstudio-user-guide/usage.md | 57 + .../cookbook/azure-openai-with-aad-auth.md | 2 +- .../cookbook/local-llms-ollama-litellm.ipynb | 19 +- .../cookbook/structured-output-agent.ipynb | 4 +- .../cookbook/tool-use-with-intervention.ipynb | 10 +- .../topic-subscription-scenarios.ipynb | 2 +- .../code-execution-groupchat.ipynb | 333 +++ .../design-patterns/group-chat.ipynb | 2444 ++++++++--------- .../design-patterns/handoffs.ipynb | 12 +- .../core-user-guide/design-patterns/index.md | 1 + .../design-patterns/mixture-of-agents.ipynb | 1034 +++---- .../design-patterns/multi-agent-debate.ipynb | 4 +- .../design-patterns/reflection.ipynb | 6 +- .../design-patterns/sequential-workflow.ipynb | 4 +- .../design-patterns/sequential-workflow.svg | 2 +- .../src/user-guide/core-user-guide/faqs.md | 2 +- .../framework/distributed-agent-runtime.ipynb | 440 +-- .../framework/message-and-communication.ipynb | 2 +- .../framework/model-clients.ipynb | 20 +- .../core-user-guide/framework/tools.ipynb | 30 +- .../core-user-guide/quickstart.ipynb | 646 ++--- .../autogen-core/docs/src/user-guide/index.md | 16 +- python/packages/autogen-core/pyproject.toml | 4 +- .../autogen-core/samples/chess_game.py | 6 +- .../common/agents/_chat_completion_agent.py | 6 +- .../common/patterns/_group_chat_manager.py | 4 +- .../common/patterns/_group_chat_utils.py | 4 +- .../autogen-core/samples/common/types.py | 2 +- .../autogen-core/samples/common/utils.py | 4 +- .../samples/distributed-group-chat/_agents.py | 2 +- .../samples/distributed-group-chat/_types.py | 4 +- .../samples/distributed-group-chat/_utils.py | 2 +- .../run_editor_agent.py | 2 +- .../run_group_chat_manager.py | 2 +- .../run_writer_agent.py | 2 +- .../samples/protos/agent_events_pb2.py | 62 +- .../samples/protos/agent_events_pb2_grpc.py | 2 +- .../samples/slow_human_in_loop.py | 6 +- .../hello_python_agent/hello_python_agent.py | 10 +- .../code_executor/_func_with_reqs.py | 25 +- .../components/model_context/__init__.py | 29 +- .../components/models/__init__.py | 133 +- .../components/tool_agent/__init__.py | 68 +- .../autogen_core/components/tools/__init__.py | 99 +- .../autogen_core/model_context/__init__.py | 9 + .../_buffered_chat_completion_context.py | 0 .../model_context/_chat_completion_context.py | 0 .../_head_and_tail_chat_completion_context.py | 2 +- .../src/autogen_core/models/__init__.py | 30 + .../{components => }/models/_model_client.py | 2 +- .../{components => }/models/_types.py | 2 +- .../src/autogen_core/tool_agent/__init__.py | 17 + .../tool_agent/_caller_loop.py | 2 +- .../tool_agent/_tool_agent.py | 2 +- .../src/autogen_core/tools/__init__.py | 15 + .../{components => }/tools/_base.py | 4 +- .../{components => }/tools/_code_execution.py | 4 +- .../{components => }/tools/_function_tool.py | 6 +- .../autogen-core/tests/test_code_executor.py | 53 + .../autogen-core/tests/test_model_context.py | 4 +- .../autogen-core/tests/test_tool_agent.py | 6 +- .../packages/autogen-core/tests/test_tools.py | 4 +- python/packages/autogen-ext/pyproject.toml | 20 +- .../agents/file_surfer/_file_surfer.py | 2 +- .../agents/file_surfer/_tool_definitions.py | 2 +- .../magentic_one/_magentic_one_coder_agent.py | 2 +- .../agents/openai/_openai_assistant_agent.py | 4 +- .../agents/video_surfer/_video_surfer.py | 8 +- .../autogen_ext/agents/video_surfer/tools.py | 2 +- .../autogen_ext/agents/web_surfer/__init__.py | 3 +- .../web_surfer/_multimodal_web_surfer.py | 635 +++-- .../agents/web_surfer/_tool_definitions.py | 2 +- .../autogen_ext/agents/web_surfer/_types.py | 2 +- ...controller.py => playwright_controller.py} | 205 +- .../azure/_azure_container_code_executor.py | 2 +- .../docker/_docker_code_executor.py | 13 +- .../src/autogen_ext/models/__init__.py | 30 +- .../src/autogen_ext/models/openai/__init__.py | 12 + .../models/{_openai => openai}/_model_info.py | 2 +- .../{_openai => openai}/_openai_client.py | 18 +- .../{_openai => openai}/config/__init__.py | 2 +- .../src/autogen_ext/models/replay/__init__.py | 5 + .../_replay_chat_completion_client.py} | 16 +- .../runtimes/grpc/_worker_runtime.py | 29 +- .../runtimes/grpc/protos/agent_worker_pb2.py | 109 +- .../runtimes/grpc/protos/agent_worker_pb2.pyi | 234 +- .../grpc/protos/agent_worker_pb2_grpc.py | 181 +- .../grpc/protos/agent_worker_pb2_grpc.pyi | 24 +- .../runtimes/grpc/protos/cloudevent_pb2.py | 33 +- .../runtimes/grpc/protos/cloudevent_pb2.pyi | 127 +- .../grpc/protos/cloudevent_pb2_grpc.py | 2 +- .../grpc/protos/cloudevent_pb2_grpc.pyi | 10 +- .../tools/{ => langchain}/__init__.py | 0 .../{ => langchain}/_langchain_adapter.py | 2 +- .../tests/models/test_openai_model_client.py | 14 +- .../test_reply_chat_completion_client.py | 10 +- .../protos/serialization_test_pb2_grpc.pyi | 6 + .../tests/test_openai_assistant_agent.py | 2 +- .../tests/test_playwright_controller.py | 78 + .../packages/autogen-ext/tests/test_tools.py | 7 +- .../autogen-ext/tests/test_websurfer_agent.py | 147 + .../interface/magentic_one_helper.py | 2 +- .../agents/base_orchestrator.py | 2 +- .../agents/base_worker.py | 2 +- .../src/autogen_magentic_one/agents/coder.py | 2 +- .../agents/file_surfer/_tools.py | 2 +- .../agents/file_surfer/file_surfer.py | 2 +- .../multimodal_web_surfer.py | 2 +- .../multimodal_web_surfer/tool_definitions.py | 4 +- .../agents/orchestrator.py | 2 +- .../src/autogen_magentic_one/messages.py | 2 +- .../src/autogen_magentic_one/utils.py | 6 +- .../headless_web_surfer/test_web_surfer.py | 4 +- .../database/component_factory.py | 162 +- .../autogenstudio/datamodel/db.py | 8 +- .../autogenstudio/datamodel/types.py | 125 +- .../autogenstudio/teammanager.py | 10 + .../autogen-studio/autogenstudio/version.py | 2 +- .../autogenstudio/web/managers/connection.py | 39 +- .../autogen-studio/docs/ags_screen.png | 4 +- .../autogen-studio/frontend/package.json | 1 + .../frontend/src/components/contentheader.tsx | 4 +- .../frontend/src/components/layout.tsx | 17 +- .../frontend/src/components/sidebar.tsx | 157 +- .../src/components/types/datamodel.ts | 144 +- .../components/views/{shared => }/atoms.tsx | 28 + .../components/views/gallery/create-modal.tsx | 200 ++ .../src/components/views/gallery/detail.tsx | 315 +++ .../src/components/views/gallery/manager.tsx | 205 ++ .../src/components/views/gallery/sidebar.tsx | 276 ++ .../src/components/views/gallery/store.tsx | 156 ++ .../src/components/views/gallery/types.ts | 44 + .../src/components/views/gallery/utils.ts | 194 ++ .../views/{shared => }/markdown.tsx | 0 .../components/views/{shared => }/monaco.tsx | 4 +- .../views/{shared => }/session/api.ts | 4 +- .../chat/agentflow/agentflow.tsx | 2 + .../chat/agentflow/agentnode.tsx | 0 .../chat/agentflow/edge.tsx | 0 .../chat/agentflow/edgemessagemodal.tsx | 0 .../chat/agentflow/toolbar.tsx | 7 + .../{playground => session}/chat/chat.tsx | 149 +- .../chat/chatinput.tsx | 0 .../chat/inputrequest.tsx | 16 +- .../chat/rendermessage.tsx | 6 +- .../{playground => session}/chat/runview.tsx | 75 +- .../{playground => session}/chat/types.ts | 0 .../views/{shared => }/session/editor.tsx | 27 +- .../src/components/views/session/manager.tsx | 211 ++ .../src/components/views/session/sidebar.tsx | 174 ++ .../views/{shared => }/session/types.ts | 2 +- .../components/views/shared/session/list.tsx | 76 - .../views/shared/session/manager.tsx | 190 -- .../components/views/shared/team/editor.tsx | 210 -- .../src/components/views/shared/team/list.tsx | 76 - .../components/views/shared/team/manager.tsx | 153 -- .../src/components/views/shared/team/types.ts | 17 - .../components/views/{shared => }/team/api.ts | 4 +- .../components/views/team/builder/builder.css | 30 + .../components/views/team/builder/builder.tsx | 416 +++ .../components/views/team/builder/library.tsx | 228 ++ .../views/team/builder/node-editor.tsx | 665 +++++ .../components/views/team/builder/nodes.tsx | 543 ++++ .../components/views/team/builder/store.tsx | 673 +++++ .../components/views/team/builder/toolbar.tsx | 165 ++ .../components/views/team/builder/types.ts | 70 + .../components/views/team/builder/utils.ts | 297 ++ .../src/components/views/team/manager.tsx | 233 ++ .../src/components/views/team/sidebar.tsx | 295 ++ .../src/components/views/team/types.ts | 47 + .../frontend/src/hooks/store.tsx | 2 + .../frontend/src/pages/build.tsx | 3 +- .../frontend/src/pages/gallery.tsx | 28 + .../frontend/src/pages/index.tsx | 5 +- .../frontend/src/styles/global.css | 4 +- .../frontend/static/images/bg/layeredbg.svg | 1 + .../frontend/tailwind.config.js | 5 + .../autogen-studio/frontend/yarn.lock | 31 +- .../autogen-studio/notebooks/tutorial.ipynb | 144 +- python/packages/autogen-studio/pyproject.toml | 12 +- .../tests/test_component_factory.py | 286 +- .../autogen-studio/tests/test_db_manager.py | 27 +- .../autogen-test-utils/pyproject.toml | 2 +- python/uv.lock | 383 ++- 366 files changed, 14767 insertions(+), 6262 deletions(-) delete mode 100644 dotnet/samples/Hello/Backend/Backend.csproj delete mode 100644 dotnet/samples/Hello/Backend/Program.cs delete mode 100644 dotnet/samples/Hello/Backend/README.md delete mode 100644 dotnet/src/Microsoft.AutoGen/Abstractions/IAgentBase.cs delete mode 100644 dotnet/src/Microsoft.AutoGen/Abstractions/IAgentRuntime.cs rename dotnet/src/Microsoft.AutoGen/{Agents/Services => AgentHost}/Host.cs (71%) create mode 100644 dotnet/src/Microsoft.AutoGen/AgentHost/Microsoft.Autogen.AgentHost.csproj create mode 100644 dotnet/src/Microsoft.AutoGen/AgentHost/Program.cs rename dotnet/{samples/Hello/Backend => src/Microsoft.AutoGen/AgentHost}/Properties/launchSettings.json (55%) rename dotnet/{samples/Hello/Backend => src/Microsoft.AutoGen/AgentHost}/appsettings.json (100%) rename dotnet/src/Microsoft.AutoGen/Agents/{Agents => }/AIAgent/InferenceAgent.cs (90%) rename dotnet/src/Microsoft.AutoGen/Agents/{Agents => }/AIAgent/SKAiAgent.cs (85%) delete mode 100644 dotnet/src/Microsoft.AutoGen/Agents/Client.cs rename dotnet/src/Microsoft.AutoGen/Agents/{Agents => }/IOAgent/ConsoleAgent/ConsoleAgent.cs (88%) rename dotnet/src/Microsoft.AutoGen/Agents/{Agents => }/IOAgent/ConsoleAgent/IHandleConsole.cs (95%) rename dotnet/src/Microsoft.AutoGen/Agents/{Agents => }/IOAgent/FileAgent/FileAgent.cs (93%) rename dotnet/src/Microsoft.AutoGen/Agents/{Agents => }/IOAgent/IOAgent.cs (77%) rename dotnet/src/Microsoft.AutoGen/Agents/{Agents => }/IOAgent/WebAPIAgent/WebAPIAgent.cs (95%) rename dotnet/src/Microsoft.AutoGen/{Abstractions => Contracts}/AgentId.cs (83%) rename dotnet/src/Microsoft.AutoGen/{Abstractions => Contracts}/ChatHistoryItem.cs (86%) rename dotnet/src/Microsoft.AutoGen/{Abstractions => Contracts}/ChatState.cs (86%) rename dotnet/src/Microsoft.AutoGen/{Abstractions => Contracts}/ChatUserType.cs (77%) rename dotnet/src/Microsoft.AutoGen/{Abstractions => Contracts}/IAgentState.cs (96%) rename dotnet/src/Microsoft.AutoGen/{Abstractions => Contracts}/IConnection.cs (72%) rename dotnet/src/Microsoft.AutoGen/{Abstractions => Contracts}/MessageExtensions.cs (95%) rename dotnet/src/Microsoft.AutoGen/{Abstractions/Microsoft.AutoGen.Abstractions.csproj => Contracts/Microsoft.AutoGen.Contracts.csproj} (93%) rename dotnet/src/Microsoft.AutoGen/{Abstractions => Contracts}/TopicSubscriptionAttribute.cs (85%) rename dotnet/src/Microsoft.AutoGen/{Agents => Core.Grpc}/App.cs (86%) rename dotnet/src/Microsoft.AutoGen/{Agents/Services/Grpc => Core.Grpc}/GrpcAgentWorker.cs (83%) rename dotnet/src/Microsoft.AutoGen/{Agents/Services/Grpc => Core.Grpc}/GrpcAgentWorkerHostBuilderExtension.cs (96%) create mode 100644 dotnet/src/Microsoft.AutoGen/Core.Grpc/Microsoft.AutoGen.Core.Grpc.csproj rename dotnet/src/Microsoft.AutoGen/{Agents/AgentBase.cs => Core/Agent.cs} (79%) rename dotnet/src/Microsoft.AutoGen/{Agents/AgentBaseExtensions.cs => Core/AgentExtensions.cs} (76%) rename dotnet/src/Microsoft.AutoGen/{Agents/AgentRuntime.cs => Core/AgentMessenger.cs} (53%) create mode 100644 dotnet/src/Microsoft.AutoGen/Core/AgentMessengerFactory.cs create mode 100644 dotnet/src/Microsoft.AutoGen/Core/AgentTypes.cs rename dotnet/src/Microsoft.AutoGen/{Agents/Services => Core}/AgentWorker.cs (80%) create mode 100644 dotnet/src/Microsoft.AutoGen/Core/App.cs create mode 100644 dotnet/src/Microsoft.AutoGen/Core/Client.cs create mode 100644 dotnet/src/Microsoft.AutoGen/Core/EventTypes.cs rename dotnet/src/Microsoft.AutoGen/{Agents/Services => Core}/HostBuilderExtensions.cs (75%) rename dotnet/src/Microsoft.AutoGen/{Abstractions => Core}/IAgentWorker.cs (76%) rename dotnet/src/Microsoft.AutoGen/{Abstractions => Core}/IHandle.cs (82%) create mode 100644 dotnet/src/Microsoft.AutoGen/Core/IHandleExtensions.cs create mode 100644 dotnet/src/Microsoft.AutoGen/Core/Microsoft.AutoGen.Core.csproj create mode 100644 dotnet/src/Microsoft.AutoGen/Core/ReflectionHelper.cs create mode 100644 dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Microsoft.AutoGen.Runtime.Grpc.csproj rename dotnet/src/Microsoft.AutoGen/{Agents => Runtime.Grpc}/Services/AgentWorkerHostingExtensions.cs (50%) rename dotnet/src/Microsoft.AutoGen/{Agents => Runtime.Grpc}/Services/Grpc/GrpcGateway.cs (99%) rename dotnet/src/Microsoft.AutoGen/{Agents => Runtime.Grpc}/Services/Grpc/GrpcGatewayService.cs (94%) rename dotnet/src/Microsoft.AutoGen/{Agents => Runtime.Grpc}/Services/Grpc/GrpcWorkerConnection.cs (98%) rename dotnet/src/Microsoft.AutoGen/{Agents => Runtime.Grpc}/Services/IGateway.cs (84%) rename dotnet/src/Microsoft.AutoGen/{Agents => Runtime.Grpc}/Services/Orleans/AgentStateGrain.cs (95%) rename dotnet/src/Microsoft.AutoGen/{Agents => Runtime.Grpc}/Services/Orleans/IRegistryGrain.cs (86%) rename dotnet/src/Microsoft.AutoGen/{Agents => Runtime.Grpc}/Services/Orleans/ISubscriptionsGrain.cs (89%) rename dotnet/src/Microsoft.AutoGen/{Agents => Runtime.Grpc}/Services/Orleans/OrleansRuntimeHostingExtenions.cs (92%) rename dotnet/src/Microsoft.AutoGen/{Agents => Runtime.Grpc}/Services/Orleans/RegistryGrain.cs (98%) rename dotnet/src/Microsoft.AutoGen/{Agents => Runtime.Grpc}/Services/Orleans/SubscriptionsGrain.cs (97%) rename dotnet/test/Microsoft.AutoGen.Agents.Tests/{AgentBaseTests.cs => AgentTests.cs} (74%) create mode 100644 dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/HelloAgent.AppHost.csproj create mode 100644 dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/Program.cs create mode 100644 dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/Properties/launchSettings.json create mode 100644 dotnet/test/Microsoft.AutoGen.Integration.Tests/HelloAppHostIntegrationTests.cs create mode 100644 dotnet/test/Microsoft.AutoGen.Integration.Tests/InMemoryRuntimeIntegrationTests.cs create mode 100644 dotnet/test/Microsoft.AutoGen.Integration.Tests/Infrastructure/DistributedApplicationExtension.cs create mode 100644 dotnet/test/Microsoft.AutoGen.Integration.Tests/Infrastructure/DistributedApplicationTestFactory.cs create mode 100644 dotnet/test/Microsoft.AutoGen.Integration.Tests/Microsoft.AutoGen.Integration.Tests.csproj create mode 100644 python/packages/autogen-core/docs/src/images/example-company.jpg create mode 100644 python/packages/autogen-core/docs/src/images/example-literature.jpg create mode 100644 python/packages/autogen-core/docs/src/images/example-travel.jpeg rename python/packages/autogen-core/docs/src/reference/python/{autogen_core.components.model_context.rst => autogen_core.model_context.rst} (50%) rename python/packages/autogen-core/docs/src/reference/python/{autogen_core.components.models.rst => autogen_core.models.rst} (52%) rename python/packages/autogen-core/docs/src/reference/python/{autogen_core.components.tool_agent.rst => autogen_core.tool_agent.rst} (51%) rename python/packages/autogen-core/docs/src/reference/python/{autogen_core.components.tools.rst => autogen_core.tools.rst} (53%) create mode 100644 python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.openai.rst create mode 100644 python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.replay.rst delete mode 100644 python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.rst rename python/packages/autogen-core/docs/src/reference/python/{autogen_ext.tools.rst => autogen_ext.tools.langchain.rst} (100%) delete mode 100644 python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/warning.md create mode 100644 python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/faq.md create mode 100644 python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/index.md create mode 100644 python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/installation.md create mode 100644 python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/usage.md create mode 100644 python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/code-execution-groupchat.ipynb create mode 100644 python/packages/autogen-core/src/autogen_core/model_context/__init__.py rename python/packages/autogen-core/src/autogen_core/{components => }/model_context/_buffered_chat_completion_context.py (100%) rename python/packages/autogen-core/src/autogen_core/{components => }/model_context/_chat_completion_context.py (100%) rename python/packages/autogen-core/src/autogen_core/{components => }/model_context/_head_and_tail_chat_completion_context.py (98%) create mode 100644 python/packages/autogen-core/src/autogen_core/models/__init__.py rename python/packages/autogen-core/src/autogen_core/{components => }/models/_model_client.py (98%) rename python/packages/autogen-core/src/autogen_core/{components => }/models/_types.py (97%) create mode 100644 python/packages/autogen-core/src/autogen_core/tool_agent/__init__.py rename python/packages/autogen-core/src/autogen_core/{components => }/tool_agent/_caller_loop.py (97%) rename python/packages/autogen-core/src/autogen_core/{components => }/tool_agent/_tool_agent.py (97%) create mode 100644 python/packages/autogen-core/src/autogen_core/tools/__init__.py rename python/packages/autogen-core/src/autogen_core/{components => }/tools/_base.py (98%) rename python/packages/autogen-core/src/autogen_core/{components => }/tools/_code_execution.py (92%) rename python/packages/autogen-core/src/autogen_core/{components => }/tools/_function_tool.py (96%) create mode 100644 python/packages/autogen-core/tests/test_code_executor.py rename python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/{_playwright_controller.py => playwright_controller.py} (69%) create mode 100644 python/packages/autogen-ext/src/autogen_ext/models/openai/__init__.py rename python/packages/autogen-ext/src/autogen_ext/models/{_openai => openai}/_model_info.py (98%) rename python/packages/autogen-ext/src/autogen_ext/models/{_openai => openai}/_openai_client.py (98%) rename python/packages/autogen-ext/src/autogen_ext/models/{_openai => openai}/config/__init__.py (96%) create mode 100644 python/packages/autogen-ext/src/autogen_ext/models/replay/__init__.py rename python/packages/autogen-ext/src/autogen_ext/models/{_reply_chat_completion_client.py => replay/_replay_chat_completion_client.py} (94%) rename python/packages/autogen-ext/src/autogen_ext/tools/{ => langchain}/__init__.py (100%) rename python/packages/autogen-ext/src/autogen_ext/tools/{ => langchain}/_langchain_adapter.py (98%) create mode 100644 python/packages/autogen-ext/tests/test_playwright_controller.py create mode 100644 python/packages/autogen-ext/tests/test_websurfer_agent.py rename python/packages/autogen-studio/frontend/src/components/views/{shared => }/atoms.tsx (80%) create mode 100644 python/packages/autogen-studio/frontend/src/components/views/gallery/create-modal.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/gallery/detail.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/gallery/manager.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/gallery/sidebar.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/gallery/store.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/gallery/types.ts create mode 100644 python/packages/autogen-studio/frontend/src/components/views/gallery/utils.ts rename python/packages/autogen-studio/frontend/src/components/views/{shared => }/markdown.tsx (100%) rename python/packages/autogen-studio/frontend/src/components/views/{shared => }/monaco.tsx (91%) rename python/packages/autogen-studio/frontend/src/components/views/{shared => }/session/api.ts (96%) rename python/packages/autogen-studio/frontend/src/components/views/{playground => session}/chat/agentflow/agentflow.tsx (99%) rename python/packages/autogen-studio/frontend/src/components/views/{playground => session}/chat/agentflow/agentnode.tsx (100%) rename python/packages/autogen-studio/frontend/src/components/views/{playground => session}/chat/agentflow/edge.tsx (100%) rename python/packages/autogen-studio/frontend/src/components/views/{playground => session}/chat/agentflow/edgemessagemodal.tsx (100%) rename python/packages/autogen-studio/frontend/src/components/views/{playground => session}/chat/agentflow/toolbar.tsx (96%) rename python/packages/autogen-studio/frontend/src/components/views/{playground => session}/chat/chat.tsx (79%) rename python/packages/autogen-studio/frontend/src/components/views/{playground => session}/chat/chatinput.tsx (100%) rename python/packages/autogen-studio/frontend/src/components/views/{playground => session}/chat/inputrequest.tsx (90%) rename python/packages/autogen-studio/frontend/src/components/views/{playground => session}/chat/rendermessage.tsx (95%) rename python/packages/autogen-studio/frontend/src/components/views/{playground => session}/chat/runview.tsx (78%) rename python/packages/autogen-studio/frontend/src/components/views/{playground => session}/chat/types.ts (100%) rename python/packages/autogen-studio/frontend/src/components/views/{shared => }/session/editor.tsx (86%) create mode 100644 python/packages/autogen-studio/frontend/src/components/views/session/manager.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/session/sidebar.tsx rename python/packages/autogen-studio/frontend/src/components/views/{shared => }/session/types.ts (90%) delete mode 100644 python/packages/autogen-studio/frontend/src/components/views/shared/session/list.tsx delete mode 100644 python/packages/autogen-studio/frontend/src/components/views/shared/session/manager.tsx delete mode 100644 python/packages/autogen-studio/frontend/src/components/views/shared/team/editor.tsx delete mode 100644 python/packages/autogen-studio/frontend/src/components/views/shared/team/list.tsx delete mode 100644 python/packages/autogen-studio/frontend/src/components/views/shared/team/manager.tsx delete mode 100644 python/packages/autogen-studio/frontend/src/components/views/shared/team/types.ts rename python/packages/autogen-studio/frontend/src/components/views/{shared => }/team/api.ts (96%) create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/builder/builder.css create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/builder/builder.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/builder/library.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/builder/node-editor.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/builder/nodes.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/builder/store.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/builder/toolbar.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/builder/types.ts create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/builder/utils.ts create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/manager.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/sidebar.tsx create mode 100644 python/packages/autogen-studio/frontend/src/components/views/team/types.ts create mode 100644 python/packages/autogen-studio/frontend/src/pages/gallery.tsx create mode 100644 python/packages/autogen-studio/frontend/static/images/bg/layeredbg.svg diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 6bbdb82e8ff7..76457b6d815f 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -61,6 +61,26 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.11 + - name: Install jupyter and ipykernel + run: | + python -m pip install --upgrade pip + python -m pip install jupyter + python -m pip install ipykernel + - name: list available kernels + run: | + python -m jupyter kernelspec list + - uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + - run: uv sync --locked --all-extras + working-directory: ./python + - name: Prepare python venv + run: | + source ${{ github.workspace }}/python/.venv/bin/activate # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v3 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 65ef7c09a521..3a4a5322d558 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -42,6 +42,8 @@ jobs: { ref: "v0.4.0.dev7", dest-dir: "0.4.0.dev7" }, { ref: "v0.4.0.dev8", dest-dir: "0.4.0.dev8" }, { ref: "v0.4.0.dev9", dest-dir: "0.4.0.dev9" }, + { ref: "v0.4.0.dev10", dest-dir: "0.4.0.dev10" }, + { ref: "v0.4.0.dev11", dest-dir: "0.4.0.dev11" }, ] steps: - name: Checkout diff --git a/.github/workflows/dotnet-build.yml b/.github/workflows/dotnet-build.yml index 52701740d405..e70a943ccd7e 100644 --- a/.github/workflows/dotnet-build.yml +++ b/.github/workflows/dotnet-build.yml @@ -76,12 +76,18 @@ jobs: - name: list available kernels run: | python -m jupyter kernelspec list - - name: Setup .NET + - uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + - run: uv sync --locked --all-extras + working-directory: ./python + - name: Prepare python venv + run: | + source ${{ github.workspace }}/python/.venv/bin/activate + - name: Setup .NET 8.0 uses: actions/setup-dotnet@v4 with: dotnet-version: '8.0.x' - - name: Install .NET Aspire workload - run: dotnet workload install aspire - name: Restore dependencies run: | # dotnet nuget add source --name dotnet-tool https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json --configfile NuGet.config @@ -96,7 +102,57 @@ jobs: echo "Build AutoGen" dotnet build --no-restore --configuration Release -bl /p:SignAssembly=true - name: Unit Test - run: dotnet test --no-build -bl --configuration Release + run: dotnet test --no-build -bl --configuration Release --filter type=!integration + + integration-test: + strategy: + fail-fast: true + matrix: + os: [ ubuntu-latest] + version: [ net8.0 ] + needs: build + defaults: + run: + working-directory: dotnet + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + with: + lfs: true + - uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + - run: uv sync --locked --all-extras + working-directory: ./python + - name: Prepare python venv + run: | + source ${{ github.workspace }}/python/.venv/bin/activate + - name: Setup .NET 9.0 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '9.0.x' + - name: Install Temp Global.JSON + run: | + echo "{\"sdk\": {\"version\": \"9.0.101\"}}" > global.json + - name: Install .NET Aspire workload + run: dotnet workload install aspire + - name: Install dev certs + run: dotnet --version && dotnet dev-certs https --trust + - name: Restore dependencies + run: | + dotnet restore -bl + - name: Build + run: | + echo "Build AutoGen" + dotnet build --no-restore --configuration Release -bl /p:SignAssembly=true + - name: Integration Test + run: dotnet --version && dotnet test --no-build -bl --configuration Release --filter type=integration + - name: Restore the global.json + run: rm global.json && git checkout -- global.json + aot-test: # this make sure the AutoGen.Core is aot compatible strategy: fail-fast: false # ensures the entire test matrix is run, even if one permutation fails @@ -147,9 +203,17 @@ jobs: - name: list available kernels run: | python -m jupyter kernelspec list - - name: Setup .NET + - uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Setup .NET 8.0 uses: actions/setup-dotnet@v4 with: + dotnet-version: '8.0.x' global-json-file: dotnet/global.json - name: Restore dependencies run: | @@ -159,7 +223,7 @@ jobs: echo "Build AutoGen" dotnet build --no-restore --configuration Release -bl /p:SignAssembly=true - name: OpenAI Test - run: dotnet test --no-build -bl --configuration Release + run: dotnet test --no-build -bl --configuration Release --filter type!=integration env: AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }} AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ed197c894e62..3dcccbb1811d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ The project welcomes contributions from developers and organizations worldwide. - Code review of pull requests. - Documentation, examples and test cases. - Readability improvement, e.g., improvement on docstr and comments. -- Community participation in [issues](https://github.com/microsoft/autogen/issues), [discussions](https://github.com/microsoft/autogen/discussions), and [twitter](https://twitter.com/pyautogen). +- Community participation in [issues](https://github.com/microsoft/autogen/issues), [discussions](https://github.com/microsoft/autogen/discussions), [twitter](https://twitter.com/pyautogen), and [Discord](https://aka.ms/autogen-discord). - Tutorials, blog posts, talks that promote the project. - Sharing application scenarios and/or related research. @@ -49,8 +49,8 @@ We will update verion numbers according to the following rules: 1. Create a PR that updates the version numbers across the codebase ([example](https://github.com/microsoft/autogen/pull/4359)) 2. The docs CI will fail for the PR, but this is expected and will be resolved in the next step -2. After merging the PR, create and push a tag that corresponds to the new verion. For example, for `0.4.0.dev9`: - - `git tag 0.4.0.dev9 && git push origin 0.4.0.dev9` +2. After merging the PR, create and push a tag that corresponds to the new verion. For example, for `0.4.0.dev11`: + - `git tag 0.4.0.dev11 && git push origin 0.4.0.dev11` 3. Restart the docs CI by finding the failed [job corresponding to the `push` event](https://github.com/microsoft/autogen/actions/workflows/docs.yml) and restarting all jobs 4. Run [this](https://github.com/microsoft/autogen/actions/workflows/single-python-package.yml) workflow for each of the packages that need to be released and get an approval for the release for it to run diff --git a/README.md b/README.md index 9f8cd3fb648c..96362f2af084 100644 --- a/README.md +++ b/README.md @@ -3,21 +3,22 @@
AutoGen Logo -[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/cloudposse.svg?style=social&label=Follow%20%40pyautogen)](https://twitter.com/pyautogen) [![LinkedIn](https://img.shields.io/badge/LinkedIn-Company?style=flat&logo=linkedin&logoColor=white)](https://www.linkedin.com/company/105812540) -[![GitHub Discussions](https://img.shields.io/badge/Discussions-Q%26A-green?logo=github)](https://github.com/microsoft/autogen/discussions) [![0.2 Docs](https://img.shields.io/badge/Docs-0.2-blue)](https://microsoft.github.io/autogen/0.2/) [![0.4 Docs](https://img.shields.io/badge/Docs-0.4-blue)](https://microsoft.github.io/autogen/dev/) -[![PyPi autogen-core](https://img.shields.io/badge/PyPi-autogen--core-blue?logo=pypi)](https://pypi.org/project/autogen-core/0.4.0.dev9/) [![PyPi autogen-agentchat](https://img.shields.io/badge/PyPi-autogen--agentchat-blue?logo=pypi)](https://pypi.org/project/autogen-agentchat/0.4.0.dev9/) [![PyPi autogen-ext](https://img.shields.io/badge/PyPi-autogen--ext-blue?logo=pypi)](https://pypi.org/project/autogen-ext/0.4.0.dev9/) +[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/cloudposse.svg?style=social&label=Follow%20%40pyautogen)](https://twitter.com/pyautogen) [![LinkedIn](https://img.shields.io/badge/LinkedIn-Company?style=flat&logo=linkedin&logoColor=white)](https://www.linkedin.com/company/105812540) [![Discord](https://img.shields.io/badge/discord-chat-green?logo=discord)](https://aka.ms/autogen-discord) [![GitHub Discussions](https://img.shields.io/badge/Discussions-Q%26A-green?logo=github)](https://github.com/microsoft/autogen/discussions) [![0.2 Docs](https://img.shields.io/badge/Docs-0.2-blue)](https://microsoft.github.io/autogen/0.2/) [![0.4 Docs](https://img.shields.io/badge/Docs-0.4-blue)](https://microsoft.github.io/autogen/dev/) +[![PyPi autogen-core](https://img.shields.io/badge/PyPi-autogen--core-blue?logo=pypi)](https://pypi.org/project/autogen-core/0.4.0.dev11/) [![PyPi autogen-agentchat](https://img.shields.io/badge/PyPi-autogen--agentchat-blue?logo=pypi)](https://pypi.org/project/autogen-agentchat/0.4.0.dev11/) [![PyPi autogen-ext](https://img.shields.io/badge/PyPi-autogen--ext-blue?logo=pypi)](https://pypi.org/project/autogen-ext/0.4.0.dev11/)
# AutoGen > [!IMPORTANT] > +> - (12/11/24) We have created a new Discord server for the AutoGen community. Join us at [aka.ms/autogen-discord](https://aka.ms/autogen-discord). > - (11/14/24) ⚠️ In response to a number of asks to clarify and distinguish between official AutoGen and its forks that created confusion, we issued a [clarification statement](https://github.com/microsoft/autogen/discussions/4217). > - (10/13/24) Interested in the standard AutoGen as a prior user? Find it at the actively-maintained *AutoGen* [0.2 branch](https://github.com/microsoft/autogen/tree/0.2) and `autogen-agentchat~=0.2` PyPi package. > - (10/02/24) [AutoGen 0.4](https://microsoft.github.io/autogen/dev) is a from-the-ground-up rewrite of AutoGen. Learn more about the history, goals and future at [this blog post](https://microsoft.github.io/autogen/blog). We’re excited to work with the community to gather feedback, refine, and improve the project before we officially release 0.4. This is a big change, so AutoGen 0.2 is still available, maintained, and developed in the [0.2 branch](https://github.com/microsoft/autogen/tree/0.2). > - *[Join us for Community Office Hours](https://github.com/microsoft/autogen/discussions/4059)* We will host a weekly open discussion to answer questions, talk about Roadmap, etc. + AutoGen is an open-source framework for building AI agent systems. It simplifies the creation of event-driven, distributed, scalable, and resilient agentic applications. It allows you to quickly build systems where AI agents collaborate and perform tasks autonomously @@ -55,7 +56,7 @@ Currently, there are three main APIs your application can target: - [Core](https://microsoft.github.io/autogen/dev/user-guide/core-user-guide/index.html) - [AgentChat](https://microsoft.github.io/autogen/dev/user-guide/agentchat-user-guide/index.html) -- [Extensions](https://microsoft.github.io/autogen/dev/reference/python/autogen_ext/autogen_ext.html) +- [Extensions](https://microsoft.github.io/autogen/dev/user-guide/extensions-user-guide/index.html) ## Core @@ -105,7 +106,7 @@ We look forward to your contributions! First install the packages: ```bash -pip install 'autogen-agentchat==0.4.0.dev9' 'autogen-ext[openai]==0.4.0.dev9' +pip install 'autogen-agentchat==0.4.0.dev11' 'autogen-ext[openai]==0.4.0.dev11' ``` The following code uses OpenAI's GPT-4o model and you need to provide your @@ -119,7 +120,7 @@ from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.ui import Console from autogen_agentchat.conditions import TextMentionTermination from autogen_agentchat.teams import RoundRobinGroupChat -from autogen_ext.models import OpenAIChatCompletionClient +from autogen_ext.models.openai import OpenAIChatCompletionClient # Define a tool async def get_weather(city: str) -> str: @@ -163,14 +164,14 @@ git switch staging-dev # Build the project cd dotnet && dotnet build AutoGen.sln # In your source code, add AutoGen to your project -dotnet add reference /dotnet/src/Microsoft.AutoGen/Agents/Microsoft.AutoGen.Agents.csproj +dotnet add reference /dotnet/src/Microsoft.AutoGen/Core/Microsoft.AutoGen.Core.csproj ``` Then, define and run your first agent: ```csharp -using Microsoft.AutoGen.Abstractions; -using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -185,9 +186,9 @@ await app.WaitForShutdownAsync(); [TopicSubscription("agents")] public class HelloAgent( - IAgentContext context, + IAgentContext worker, [FromKeyedServices("EventTypes")] EventTypes typeRegistry) : ConsoleAgent( - context, + worker, typeRegistry), ISayHello, IHandle, @@ -332,7 +333,7 @@ Use GitHub [Discussions](https://github.com/microsoft/autogen/discussions) for g ### Do you use Discord for communications? -We are unable to use Discord for project discussions. Therefore, we request that all discussions take place on going forward. +We are unable to use the old Discord for project discussions, many of the maintainers no longer have viewing or posting rights there. Therefore, we request that all discussions take place on or the [new discord server](https://aka.ms/autogen-discord). ### What about forks? diff --git a/docs/switcher.json b/docs/switcher.json index 3de06b1b014a..205f954c7329 100644 --- a/docs/switcher.json +++ b/docs/switcher.json @@ -56,7 +56,17 @@ { "name": "0.4.0.dev9", "version": "0.4.0.dev9", - "url": "/autogen/0.4.0.dev9/", + "url": "/autogen/0.4.0.dev9/" + }, + { + "name": "0.4.0.dev10", + "version": "0.4.0.dev10", + "url": "/autogen/0.4.0.dev10/" + }, + { + "name": "0.4.0.dev11", + "version": "0.4.0.dev11", + "url": "/autogen/0.4.0.dev11/", "preferred": true } ] diff --git a/dotnet/AutoGen.sln b/dotnet/AutoGen.sln index 5b26e27165b3..d0707a89a7fd 100644 --- a/dotnet/AutoGen.sln +++ b/dotnet/AutoGen.sln @@ -78,9 +78,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution spelling.dic = spelling.dic EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AutoGen.Agents", "src\Microsoft.AutoGen\Agents\Microsoft.AutoGen.Agents.csproj", "{FD87BD33-4616-460B-AC85-A412BA08BB78}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AutoGen.Abstractions", "src\Microsoft.AutoGen\Abstractions\Microsoft.AutoGen.Abstractions.csproj", "{E0C991D9-0DB8-471C-ADC9-5FB16E2A0106}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AutoGen.Core", "src\Microsoft.AutoGen\Core\Microsoft.AutoGen.Core.csproj", "{FD87BD33-4616-460B-AC85-A412BA08BB78}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AutoGen.Extensions.SemanticKernel", "src\Microsoft.AutoGen\Extensions\SemanticKernel\Microsoft.AutoGen.Extensions.SemanticKernel.csproj", "{952827D4-8D4C-4327-AE4D-E8D25811EF35}" EndProject @@ -114,8 +112,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevTeam.Shared", "samples\d EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Hello", "Hello", "{7EB336C2-7C0A-4BC8-80C6-A3173AB8DC45}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Backend", "samples\Hello\Backend\Backend.csproj", "{C428C6E5-B0E5-4DA6-B0F7-43013D2ECE69}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hello.AppHost", "samples\Hello\Hello.AppHost\Hello.AppHost.csproj", "{09A373A0-8169-409F-8C37-3FBC1654B122}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HelloAIAgents", "samples\Hello\HelloAIAgents\HelloAIAgents.csproj", "{A20B9894-F352-4338-872A-F215A241D43D}" @@ -132,6 +128,20 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AutoGen.Extension EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AutoGen.Agents.Tests", "test\Microsoft.AutoGen.Agents.Tests\Microsoft.AutoGen.Agents.Tests.csproj", "{394FDAF8-74F9-4977-94A5-3371737EB774}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AutoGen.Integration.Tests", "test\Microsoft.AutoGen.Integration.Tests\Microsoft.AutoGen.Integration.Tests.csproj", "{D04C6153-8EAF-4E54-9852-52CEC1BE8D31}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloAgent.AppHost", "test\Microsoft.AutoGen.Integration.Tests.AppHosts\HelloAgent.AppHost\HelloAgent.AppHost.csproj", "{99D7766B-076F-4E6F-A8D2-3DF1DAFA2599}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AutoGen.Contracts", "src\Microsoft.AutoGen\Contracts\Microsoft.AutoGen.Contracts.csproj", "{7F60934B-3E59-48D0-B26D-04A39FEC13EF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AutoGen.Core.Grpc", "src\Microsoft.AutoGen\Core.Grpc\Microsoft.AutoGen.Core.Grpc.csproj", "{9653676C-147D-4CBE-BB53-A30FD3634F4C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AutoGen.Runtime.Grpc", "src\Microsoft.AutoGen\Runtime.Grpc\Microsoft.AutoGen.Runtime.Grpc.csproj", "{8457B68C-CC86-4A3F-8559-C1AE199EC366}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AutoGen.Agents", "src\Microsoft.AutoGen\Agents\Microsoft.AutoGen.Agents.csproj", "{3892C83E-7F5D-41DF-A88C-4854EAD38856}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Autogen.AgentHost", "src\Microsoft.AutoGen\AgentHost\Microsoft.Autogen.AgentHost.csproj", "{4CB42139-DEE4-40B9-AA81-1E4CCAA2F338}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -254,10 +264,6 @@ Global {FD87BD33-4616-460B-AC85-A412BA08BB78}.Debug|Any CPU.Build.0 = Debug|Any CPU {FD87BD33-4616-460B-AC85-A412BA08BB78}.Release|Any CPU.ActiveCfg = Release|Any CPU {FD87BD33-4616-460B-AC85-A412BA08BB78}.Release|Any CPU.Build.0 = Release|Any CPU - {E0C991D9-0DB8-471C-ADC9-5FB16E2A0106}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E0C991D9-0DB8-471C-ADC9-5FB16E2A0106}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E0C991D9-0DB8-471C-ADC9-5FB16E2A0106}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E0C991D9-0DB8-471C-ADC9-5FB16E2A0106}.Release|Any CPU.Build.0 = Release|Any CPU {952827D4-8D4C-4327-AE4D-E8D25811EF35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {952827D4-8D4C-4327-AE4D-E8D25811EF35}.Debug|Any CPU.Build.0 = Debug|Any CPU {952827D4-8D4C-4327-AE4D-E8D25811EF35}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -310,10 +316,6 @@ Global {01F5D7C3-41EB-409C-9B77-A945C07FA7E8}.Debug|Any CPU.Build.0 = Debug|Any CPU {01F5D7C3-41EB-409C-9B77-A945C07FA7E8}.Release|Any CPU.ActiveCfg = Release|Any CPU {01F5D7C3-41EB-409C-9B77-A945C07FA7E8}.Release|Any CPU.Build.0 = Release|Any CPU - {C428C6E5-B0E5-4DA6-B0F7-43013D2ECE69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C428C6E5-B0E5-4DA6-B0F7-43013D2ECE69}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C428C6E5-B0E5-4DA6-B0F7-43013D2ECE69}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C428C6E5-B0E5-4DA6-B0F7-43013D2ECE69}.Release|Any CPU.Build.0 = Release|Any CPU {09A373A0-8169-409F-8C37-3FBC1654B122}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {09A373A0-8169-409F-8C37-3FBC1654B122}.Debug|Any CPU.Build.0 = Debug|Any CPU {09A373A0-8169-409F-8C37-3FBC1654B122}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -342,6 +344,34 @@ Global {394FDAF8-74F9-4977-94A5-3371737EB774}.Debug|Any CPU.Build.0 = Debug|Any CPU {394FDAF8-74F9-4977-94A5-3371737EB774}.Release|Any CPU.ActiveCfg = Release|Any CPU {394FDAF8-74F9-4977-94A5-3371737EB774}.Release|Any CPU.Build.0 = Release|Any CPU + {D04C6153-8EAF-4E54-9852-52CEC1BE8D31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D04C6153-8EAF-4E54-9852-52CEC1BE8D31}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D04C6153-8EAF-4E54-9852-52CEC1BE8D31}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D04C6153-8EAF-4E54-9852-52CEC1BE8D31}.Release|Any CPU.Build.0 = Release|Any CPU + {99D7766B-076F-4E6F-A8D2-3DF1DAFA2599}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99D7766B-076F-4E6F-A8D2-3DF1DAFA2599}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99D7766B-076F-4E6F-A8D2-3DF1DAFA2599}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99D7766B-076F-4E6F-A8D2-3DF1DAFA2599}.Release|Any CPU.Build.0 = Release|Any CPU + {7F60934B-3E59-48D0-B26D-04A39FEC13EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F60934B-3E59-48D0-B26D-04A39FEC13EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F60934B-3E59-48D0-B26D-04A39FEC13EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F60934B-3E59-48D0-B26D-04A39FEC13EF}.Release|Any CPU.Build.0 = Release|Any CPU + {9653676C-147D-4CBE-BB53-A30FD3634F4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9653676C-147D-4CBE-BB53-A30FD3634F4C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9653676C-147D-4CBE-BB53-A30FD3634F4C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9653676C-147D-4CBE-BB53-A30FD3634F4C}.Release|Any CPU.Build.0 = Release|Any CPU + {8457B68C-CC86-4A3F-8559-C1AE199EC366}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8457B68C-CC86-4A3F-8559-C1AE199EC366}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8457B68C-CC86-4A3F-8559-C1AE199EC366}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8457B68C-CC86-4A3F-8559-C1AE199EC366}.Release|Any CPU.Build.0 = Release|Any CPU + {3892C83E-7F5D-41DF-A88C-4854EAD38856}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3892C83E-7F5D-41DF-A88C-4854EAD38856}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3892C83E-7F5D-41DF-A88C-4854EAD38856}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3892C83E-7F5D-41DF-A88C-4854EAD38856}.Release|Any CPU.Build.0 = Release|Any CPU + {4CB42139-DEE4-40B9-AA81-1E4CCAA2F338}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4CB42139-DEE4-40B9-AA81-1E4CCAA2F338}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4CB42139-DEE4-40B9-AA81-1E4CCAA2F338}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4CB42139-DEE4-40B9-AA81-1E4CCAA2F338}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -377,7 +407,6 @@ Global {42A8251C-E7B3-47BB-A82E-459952EBE132} = {F823671B-3ECA-4AE6-86DA-25E920D3FE64} {4BB66E06-37D8-45A0-9B97-DE590AFBA340} = {18BF8DD7-0585-48BF-8F97-AD333080CE06} {FD87BD33-4616-460B-AC85-A412BA08BB78} = {18BF8DD7-0585-48BF-8F97-AD333080CE06} - {E0C991D9-0DB8-471C-ADC9-5FB16E2A0106} = {18BF8DD7-0585-48BF-8F97-AD333080CE06} {952827D4-8D4C-4327-AE4D-E8D25811EF35} = {18BF8DD7-0585-48BF-8F97-AD333080CE06} {668726B9-77BC-45CF-B576-0F0773BF1615} = {686480D7-8FEC-4ED3-9C5D-CEBE1057A7ED} {84020C4A-933A-4693-9889-1B99304A7D76} = {668726B9-77BC-45CF-B576-0F0773BF1615} @@ -394,7 +423,6 @@ Global {EDA3EF83-FC7F-4BCF-945D-B893620EE4B1} = {05B9C173-6441-4DCA-9AC4-E897EF75F331} {01F5D7C3-41EB-409C-9B77-A945C07FA7E8} = {05B9C173-6441-4DCA-9AC4-E897EF75F331} {7EB336C2-7C0A-4BC8-80C6-A3173AB8DC45} = {686480D7-8FEC-4ED3-9C5D-CEBE1057A7ED} - {C428C6E5-B0E5-4DA6-B0F7-43013D2ECE69} = {7EB336C2-7C0A-4BC8-80C6-A3173AB8DC45} {09A373A0-8169-409F-8C37-3FBC1654B122} = {7EB336C2-7C0A-4BC8-80C6-A3173AB8DC45} {A20B9894-F352-4338-872A-F215A241D43D} = {7EB336C2-7C0A-4BC8-80C6-A3173AB8DC45} {8F7560CF-EEBB-4333-A69F-838CA40FD85D} = {7EB336C2-7C0A-4BC8-80C6-A3173AB8DC45} @@ -402,6 +430,13 @@ Global {64EF61E7-00A6-4E5E-9808-62E10993A0E5} = {7EB336C2-7C0A-4BC8-80C6-A3173AB8DC45} {65059914-5527-4A00-9308-9FAF23D5E85A} = {18BF8DD7-0585-48BF-8F97-AD333080CE06} {394FDAF8-74F9-4977-94A5-3371737EB774} = {F823671B-3ECA-4AE6-86DA-25E920D3FE64} + {D04C6153-8EAF-4E54-9852-52CEC1BE8D31} = {F823671B-3ECA-4AE6-86DA-25E920D3FE64} + {99D7766B-076F-4E6F-A8D2-3DF1DAFA2599} = {F823671B-3ECA-4AE6-86DA-25E920D3FE64} + {7F60934B-3E59-48D0-B26D-04A39FEC13EF} = {18BF8DD7-0585-48BF-8F97-AD333080CE06} + {9653676C-147D-4CBE-BB53-A30FD3634F4C} = {18BF8DD7-0585-48BF-8F97-AD333080CE06} + {8457B68C-CC86-4A3F-8559-C1AE199EC366} = {18BF8DD7-0585-48BF-8F97-AD333080CE06} + {3892C83E-7F5D-41DF-A88C-4854EAD38856} = {18BF8DD7-0585-48BF-8F97-AD333080CE06} + {4CB42139-DEE4-40B9-AA81-1E4CCAA2F338} = {18BF8DD7-0585-48BF-8F97-AD333080CE06} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {93384647-528D-46C8-922C-8DB36A382F0B} diff --git a/dotnet/Directory.Packages.props b/dotnet/Directory.Packages.props index 008c28647371..1e84c0badb2f 100644 --- a/dotnet/Directory.Packages.props +++ b/dotnet/Directory.Packages.props @@ -15,6 +15,7 @@ + @@ -31,12 +32,17 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + @@ -54,6 +60,7 @@ + @@ -65,6 +72,7 @@ all + @@ -118,5 +126,6 @@ + - + \ No newline at end of file diff --git a/dotnet/samples/Hello/Backend/Backend.csproj b/dotnet/samples/Hello/Backend/Backend.csproj deleted file mode 100644 index 360459334805..000000000000 --- a/dotnet/samples/Hello/Backend/Backend.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - Exe - net8.0 - enable - enable - - - - - - diff --git a/dotnet/samples/Hello/Backend/Program.cs b/dotnet/samples/Hello/Backend/Program.cs deleted file mode 100644 index b74dba139826..000000000000 --- a/dotnet/samples/Hello/Backend/Program.cs +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Program.cs - -var app = await Microsoft.AutoGen.Agents.Host.StartAsync(local: false, useGrpc: true); -await app.WaitForShutdownAsync(); diff --git a/dotnet/samples/Hello/Backend/README.md b/dotnet/samples/Hello/Backend/README.md deleted file mode 100644 index 45c7ddee1d05..000000000000 --- a/dotnet/samples/Hello/Backend/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Backend Example - -This example demonstrates how to create a simple backend service for the agent runtime using ASP.NET Core. - -To Run it, simply run the following command in the terminal: - -```bash -dotnet run -``` - -Or you can run it using Visual Studio Code by pressing `F5`. - diff --git a/dotnet/samples/Hello/Hello.AppHost/Hello.AppHost.csproj b/dotnet/samples/Hello/Hello.AppHost/Hello.AppHost.csproj index 370d13fb32e2..aa714b1b727b 100644 --- a/dotnet/samples/Hello/Hello.AppHost/Hello.AppHost.csproj +++ b/dotnet/samples/Hello/Hello.AppHost/Hello.AppHost.csproj @@ -18,7 +18,7 @@ - + diff --git a/dotnet/samples/Hello/Hello.AppHost/Program.cs b/dotnet/samples/Hello/Hello.AppHost/Program.cs index f261f1eae325..8230a5b7c2d9 100644 --- a/dotnet/samples/Hello/Hello.AppHost/Program.cs +++ b/dotnet/samples/Hello/Hello.AppHost/Program.cs @@ -4,7 +4,7 @@ using Microsoft.Extensions.Hosting; var builder = DistributedApplication.CreateBuilder(args); -var backend = builder.AddProject("backend").WithExternalHttpEndpoints(); +var backend = builder.AddProject("backend").WithExternalHttpEndpoints(); var client = builder.AddProject("HelloAgentsDotNET") .WithReference(backend) .WithEnvironment("AGENT_HOST", backend.GetEndpoint("https")) diff --git a/dotnet/samples/Hello/Hello.AppHost/appsettings.Development.json b/dotnet/samples/Hello/Hello.AppHost/appsettings.Development.json index 0c208ae9181e..7fac661bf642 100644 --- a/dotnet/samples/Hello/Hello.AppHost/appsettings.Development.json +++ b/dotnet/samples/Hello/Hello.AppHost/appsettings.Development.json @@ -2,7 +2,8 @@ "Logging": { "LogLevel": { "Default": "Information", - "Microsoft.AspNetCore": "Warning" + "Microsoft.AspNetCore": "Warning", + "Aspire.Hosting.ApplicationModel.ResourceNotificationService": "Debug" } } } diff --git a/dotnet/samples/Hello/HelloAIAgents/HelloAIAgent.cs b/dotnet/samples/Hello/HelloAIAgents/HelloAIAgent.cs index 4b8d663de193..0e195ca5b1dd 100644 --- a/dotnet/samples/Hello/HelloAIAgents/HelloAIAgent.cs +++ b/dotnet/samples/Hello/HelloAIAgents/HelloAIAgent.cs @@ -1,18 +1,18 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // HelloAIAgent.cs -using Microsoft.AutoGen.Abstractions; -using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; using Microsoft.Extensions.AI; namespace Hello; [TopicSubscription("agents")] public class HelloAIAgent( - IAgentRuntime context, + IAgentWorker worker, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, IHostApplicationLifetime hostApplicationLifetime, IChatClient client) : HelloAgent( - context, + worker, typeRegistry, hostApplicationLifetime), IHandle diff --git a/dotnet/samples/Hello/HelloAIAgents/HelloAIAgents.csproj b/dotnet/samples/Hello/HelloAIAgents/HelloAIAgents.csproj index c33bfeed5a8d..f557ce91a0e3 100644 --- a/dotnet/samples/Hello/HelloAIAgents/HelloAIAgents.csproj +++ b/dotnet/samples/Hello/HelloAIAgents/HelloAIAgents.csproj @@ -11,8 +11,9 @@ - + + diff --git a/dotnet/samples/Hello/HelloAIAgents/Program.cs b/dotnet/samples/Hello/HelloAIAgents/Program.cs index 891c026f943c..f9780d62af98 100644 --- a/dotnet/samples/Hello/HelloAIAgents/Program.cs +++ b/dotnet/samples/Hello/HelloAIAgents/Program.cs @@ -2,8 +2,9 @@ // Program.cs using Hello; -using Microsoft.AutoGen.Abstractions; using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; // send a message to the agent var builder = WebApplication.CreateBuilder(); @@ -32,10 +33,10 @@ namespace Hello { [TopicSubscription("agents")] public class HelloAgent( - IAgentRuntime context, + IAgentWorker worker, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, IHostApplicationLifetime hostApplicationLifetime) : ConsoleAgent( - context, + worker, typeRegistry), ISayHello, IHandle, diff --git a/dotnet/samples/Hello/HelloAgent/HelloAgent.csproj b/dotnet/samples/Hello/HelloAgent/HelloAgent.csproj index 93c996e32093..5067a673df4b 100644 --- a/dotnet/samples/Hello/HelloAgent/HelloAgent.csproj +++ b/dotnet/samples/Hello/HelloAgent/HelloAgent.csproj @@ -15,7 +15,8 @@ - + + diff --git a/dotnet/samples/Hello/HelloAgent/Program.cs b/dotnet/samples/Hello/HelloAgent/Program.cs index ce3fed2f61d7..dee73b1a47d3 100644 --- a/dotnet/samples/Hello/HelloAgent/Program.cs +++ b/dotnet/samples/Hello/HelloAgent/Program.cs @@ -1,8 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Program.cs - -using Microsoft.AutoGen.Abstractions; using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -18,9 +18,9 @@ namespace Hello { [TopicSubscription("agents")] public class HelloAgent( - IAgentRuntime context, IHostApplicationLifetime hostApplicationLifetime, - [FromKeyedServices("EventTypes")] EventTypes typeRegistry) : AgentBase( - context, + IAgentWorker worker, IHostApplicationLifetime hostApplicationLifetime, + [FromKeyedServices("EventTypes")] EventTypes typeRegistry) : Agent( + worker, typeRegistry), ISayHello, IHandleConsole, @@ -35,7 +35,7 @@ public async Task Handle(NewMessageReceived item) await PublishMessageAsync(evt).ConfigureAwait(false); var goodbye = new ConversationClosed { - UserId = this.AgentId.Key, + UserId = this.AgentId.Type, UserMessage = "Goodbye" }; await PublishMessageAsync(goodbye).ConfigureAwait(false); diff --git a/dotnet/samples/Hello/HelloAgent/README.md b/dotnet/samples/Hello/HelloAgent/README.md index f95e25d6ec38..53e3d6a65eba 100644 --- a/dotnet/samples/Hello/HelloAgent/README.md +++ b/dotnet/samples/Hello/HelloAgent/README.md @@ -38,14 +38,14 @@ graph LR; The heart of an autogen application are the event handlers. Agents select a ```TopicSubscription``` to listen for events on a specific topic. When an event is received, the agent's event handler is called with the event data. -Within that event handler you may optionally *emit* new events, which are then sent to the event bus for other agents to process. The EventTypes are declared gRPC ProtoBuf messages that are used to define the schema of the event. The default protos are available via the ```Microsoft.AutoGen.Abstractions;``` namespace and are defined in [autogen/protos](/autogen/protos). The EventTypes are registered in the agent's constructor using the ```IHandle``` interface. +Within that event handler you may optionally *emit* new events, which are then sent to the event bus for other agents to process. The EventTypes are declared gRPC ProtoBuf messages that are used to define the schema of the event. The default protos are available via the ```Microsoft.AutoGen.Contracts;``` namespace and are defined in [autogen/protos](/autogen/protos). The EventTypes are registered in the agent's constructor using the ```IHandle``` interface. ```csharp TopicSubscription("HelloAgents")] public class HelloAgent( - IAgentContext context, + iAgentWorker worker, [FromKeyedServices("EventTypes")] EventTypes typeRegistry) : ConsoleAgent( - context, + worker, typeRegistry), ISayHello, IHandle, diff --git a/dotnet/samples/Hello/HelloAgentState/HelloAgentState.csproj b/dotnet/samples/Hello/HelloAgentState/HelloAgentState.csproj index e26b6c9521c2..5dc534a4e435 100644 --- a/dotnet/samples/Hello/HelloAgentState/HelloAgentState.csproj +++ b/dotnet/samples/Hello/HelloAgentState/HelloAgentState.csproj @@ -12,7 +12,8 @@ - + + diff --git a/dotnet/samples/Hello/HelloAgentState/Program.cs b/dotnet/samples/Hello/HelloAgentState/Program.cs index e3c9dd2121ca..dbb16c3bbb9b 100644 --- a/dotnet/samples/Hello/HelloAgentState/Program.cs +++ b/dotnet/samples/Hello/HelloAgentState/Program.cs @@ -2,8 +2,9 @@ // Program.cs using System.Text.Json; -using Microsoft.AutoGen.Abstractions; using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; // send a message to the agent var app = await AgentsApp.PublishMessageAsync("HelloAgents", new NewMessageReceived @@ -17,10 +18,10 @@ namespace Hello { [TopicSubscription("agents")] public class HelloAgent( - IAgentRuntime context, + IAgentWorker worker, IHostApplicationLifetime hostApplicationLifetime, - [FromKeyedServices("EventTypes")] EventTypes typeRegistry) : AgentBase( - context, + [FromKeyedServices("EventTypes")] EventTypes typeRegistry) : Agent( + worker, typeRegistry), IHandleConsole, IHandle, diff --git a/dotnet/samples/Hello/HelloAgentState/README.md b/dotnet/samples/Hello/HelloAgentState/README.md index 8bc8e34545ce..f46c66df1e1d 100644 --- a/dotnet/samples/Hello/HelloAgentState/README.md +++ b/dotnet/samples/Hello/HelloAgentState/README.md @@ -38,14 +38,14 @@ graph LR; The heart of an autogen application are the event handlers. Agents select a ```TopicSubscription``` to listen for events on a specific topic. When an event is received, the agent's event handler is called with the event data. -Within that event handler you may optionally *emit* new events, which are then sent to the event bus for other agents to process. The EventTypes are declared gRPC ProtoBuf messages that are used to define the schema of the event. The default protos are available via the ```Microsoft.AutoGen.Abstractions;``` namespace and are defined in [autogen/protos](/autogen/protos). The EventTypes are registered in the agent's constructor using the ```IHandle``` interface. +Within that event handler you may optionally *emit* new events, which are then sent to the event bus for other agents to process. The EventTypes are declared gRPC ProtoBuf messages that are used to define the schema of the event. The default protos are available via the ```Microsoft.AutoGen.Contracts;``` namespace and are defined in [autogen/protos](/autogen/protos). The EventTypes are registered in the agent's constructor using the ```IHandle``` interface. ```csharp TopicSubscription("HelloAgents")] public class HelloAgent( - IAgentContext context, + iAgentWorker worker, [FromKeyedServices("EventTypes")] EventTypes typeRegistry) : ConsoleAgent( - context, + worker, typeRegistry), ISayHello, IHandle, diff --git a/dotnet/samples/Hello/protos/agent_events.proto b/dotnet/samples/Hello/protos/agent_events.proto index 64ef2d69d604..a964a4cd5243 100644 --- a/dotnet/samples/Hello/protos/agent_events.proto +++ b/dotnet/samples/Hello/protos/agent_events.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package HelloAgents; -option csharp_namespace = "Microsoft.AutoGen.Abstractions"; +option csharp_namespace = "Microsoft.AutoGen.Contracts"; message TextMessage { string textMessage = 1; string source = 2; diff --git a/dotnet/samples/dev-team/DevTeam.AgentHost/DevTeam.AgentHost.csproj b/dotnet/samples/dev-team/DevTeam.AgentHost/DevTeam.AgentHost.csproj index 7508ae5af56e..4da4bfd8d7e6 100644 --- a/dotnet/samples/dev-team/DevTeam.AgentHost/DevTeam.AgentHost.csproj +++ b/dotnet/samples/dev-team/DevTeam.AgentHost/DevTeam.AgentHost.csproj @@ -9,7 +9,8 @@ - + + diff --git a/dotnet/samples/dev-team/DevTeam.AgentHost/Program.cs b/dotnet/samples/dev-team/DevTeam.AgentHost/Program.cs index 6480e72a0b4b..82a2bf22ce98 100644 --- a/dotnet/samples/dev-team/DevTeam.AgentHost/Program.cs +++ b/dotnet/samples/dev-team/DevTeam.AgentHost/Program.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Program.cs +using Microsoft.AutoGen.Runtime.Grpc; -using Microsoft.AutoGen.Agents; var builder = WebApplication.CreateBuilder(args); builder.AddServiceDefaults(); diff --git a/dotnet/samples/dev-team/DevTeam.Agents/DevTeam.Agents.csproj b/dotnet/samples/dev-team/DevTeam.Agents/DevTeam.Agents.csproj index 46a20c650fb7..bc70545810bc 100644 --- a/dotnet/samples/dev-team/DevTeam.Agents/DevTeam.Agents.csproj +++ b/dotnet/samples/dev-team/DevTeam.Agents/DevTeam.Agents.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/dotnet/samples/dev-team/DevTeam.Agents/Developer/Developer.cs b/dotnet/samples/dev-team/DevTeam.Agents/Developer/Developer.cs index 325b9fbe0bf1..ffc474a93124 100644 --- a/dotnet/samples/dev-team/DevTeam.Agents/Developer/Developer.cs +++ b/dotnet/samples/dev-team/DevTeam.Agents/Developer/Developer.cs @@ -2,16 +2,17 @@ // Developer.cs using DevTeam.Shared; -using Microsoft.AutoGen.Abstractions; using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Memory; namespace DevTeam.Agents; [TopicSubscription("devteam")] -public class Dev(IAgentRuntime context, Kernel kernel, ISemanticTextMemory memory, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, ILogger logger) - : SKAiAgent(context, memory, kernel, typeRegistry), IDevelopApps, +public class Dev(IAgentWorker worker, Kernel kernel, ISemanticTextMemory memory, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, ILogger logger) + : SKAiAgent(worker, memory, kernel, typeRegistry), IDevelopApps, IHandle, IHandle { diff --git a/dotnet/samples/dev-team/DevTeam.Agents/DeveloperLead/DeveloperLead.cs b/dotnet/samples/dev-team/DevTeam.Agents/DeveloperLead/DeveloperLead.cs index e03701c96859..ffeefe7d430f 100644 --- a/dotnet/samples/dev-team/DevTeam.Agents/DeveloperLead/DeveloperLead.cs +++ b/dotnet/samples/dev-team/DevTeam.Agents/DeveloperLead/DeveloperLead.cs @@ -2,8 +2,9 @@ // DeveloperLead.cs using DevTeam.Shared; -using Microsoft.AutoGen.Abstractions; using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Connectors.OpenAI; using Microsoft.SemanticKernel.Memory; @@ -11,8 +12,8 @@ namespace DevTeam.Agents; [TopicSubscription("devteam")] -public class DeveloperLead(IAgentRuntime context, Kernel kernel, ISemanticTextMemory memory, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, ILogger logger) - : SKAiAgent(context, memory, kernel, typeRegistry), ILeadDevelopers, +public class DeveloperLead(IAgentWorker worker, Kernel kernel, ISemanticTextMemory memory, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, ILogger logger) + : SKAiAgent(worker, memory, kernel, typeRegistry), ILeadDevelopers, IHandle, IHandle { diff --git a/dotnet/samples/dev-team/DevTeam.Agents/ProductManager/ProductManager.cs b/dotnet/samples/dev-team/DevTeam.Agents/ProductManager/ProductManager.cs index cc393e651847..5306a91838e3 100644 --- a/dotnet/samples/dev-team/DevTeam.Agents/ProductManager/ProductManager.cs +++ b/dotnet/samples/dev-team/DevTeam.Agents/ProductManager/ProductManager.cs @@ -2,16 +2,17 @@ // ProductManager.cs using DevTeam.Shared; -using Microsoft.AutoGen.Abstractions; using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Memory; namespace DevTeam.Agents; [TopicSubscription("devteam")] -public class ProductManager(IAgentRuntime context, Kernel kernel, ISemanticTextMemory memory, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, ILogger logger) - : SKAiAgent(context, memory, kernel, typeRegistry), IManageProducts, +public class ProductManager(IAgentWorker worker, Kernel kernel, ISemanticTextMemory memory, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, ILogger logger) + : SKAiAgent(worker, memory, kernel, typeRegistry), IManageProducts, IHandle, IHandle { diff --git a/dotnet/samples/dev-team/DevTeam.Agents/Program.cs b/dotnet/samples/dev-team/DevTeam.Agents/Program.cs index 6d9937889491..bd9e4ad24832 100644 --- a/dotnet/samples/dev-team/DevTeam.Agents/Program.cs +++ b/dotnet/samples/dev-team/DevTeam.Agents/Program.cs @@ -2,7 +2,7 @@ // Program.cs using DevTeam.Agents; -using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Core; using Microsoft.AutoGen.Extensions.SemanticKernel; var builder = WebApplication.CreateBuilder(args); diff --git a/dotnet/samples/dev-team/DevTeam.Backend/Agents/AzureGenie.cs b/dotnet/samples/dev-team/DevTeam.Backend/Agents/AzureGenie.cs index d3997a8f8e42..85d498bcc5aa 100644 --- a/dotnet/samples/dev-team/DevTeam.Backend/Agents/AzureGenie.cs +++ b/dotnet/samples/dev-team/DevTeam.Backend/Agents/AzureGenie.cs @@ -3,14 +3,14 @@ using DevTeam.Backend; using DevTeam.Shared; -using Microsoft.AutoGen.Abstractions; using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Core; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Memory; namespace Microsoft.AI.DevTeam; -public class AzureGenie(IAgentRuntime context, Kernel kernel, ISemanticTextMemory memory, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, IManageAzure azureService) - : SKAiAgent(context, memory, kernel, typeRegistry), +public class AzureGenie(IAgentWorker worker, Kernel kernel, ISemanticTextMemory memory, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, IManageAzure azureService) + : SKAiAgent(worker, memory, kernel, typeRegistry), IHandle, IHandle diff --git a/dotnet/samples/dev-team/DevTeam.Backend/Agents/Hubber.cs b/dotnet/samples/dev-team/DevTeam.Backend/Agents/Hubber.cs index 3dc8dd35ad46..3ba0eeb69b25 100644 --- a/dotnet/samples/dev-team/DevTeam.Backend/Agents/Hubber.cs +++ b/dotnet/samples/dev-team/DevTeam.Backend/Agents/Hubber.cs @@ -5,15 +5,15 @@ using DevTeam; using DevTeam.Backend; using DevTeam.Shared; -using Microsoft.AutoGen.Abstractions; using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Core; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Memory; namespace Microsoft.AI.DevTeam; -public class Hubber(IAgentRuntime context, Kernel kernel, ISemanticTextMemory memory, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, IManageGithub ghService) - : SKAiAgent(context, memory, kernel, typeRegistry), +public class Hubber(IAgentWorker worker, Kernel kernel, ISemanticTextMemory memory, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, IManageGithub ghService) + : SKAiAgent(worker, memory, kernel, typeRegistry), IHandle, IHandle, IHandle, diff --git a/dotnet/samples/dev-team/DevTeam.Backend/Agents/Sandbox.cs b/dotnet/samples/dev-team/DevTeam.Backend/Agents/Sandbox.cs index 306ebc945a49..19b0db00553a 100644 --- a/dotnet/samples/dev-team/DevTeam.Backend/Agents/Sandbox.cs +++ b/dotnet/samples/dev-team/DevTeam.Backend/Agents/Sandbox.cs @@ -3,7 +3,7 @@ // namespace DevTeam.Backend; -// public sealed class Sandbox : AgentBase +// public sealed class Sandbox : Agent // { // private const string ReminderName = "SandboxRunReminder"; // private readonly IManageAzure _azService; diff --git a/dotnet/samples/dev-team/DevTeam.Backend/DevTeam.Backend.csproj b/dotnet/samples/dev-team/DevTeam.Backend/DevTeam.Backend.csproj index 10e05cfb2107..f13c0cbe4f0d 100644 --- a/dotnet/samples/dev-team/DevTeam.Backend/DevTeam.Backend.csproj +++ b/dotnet/samples/dev-team/DevTeam.Backend/DevTeam.Backend.csproj @@ -1,7 +1,7 @@ - + @@ -29,6 +29,7 @@ + diff --git a/dotnet/samples/dev-team/DevTeam.Backend/Program.cs b/dotnet/samples/dev-team/DevTeam.Backend/Program.cs index 7f4404f8e471..abc37cf12608 100644 --- a/dotnet/samples/dev-team/DevTeam.Backend/Program.cs +++ b/dotnet/samples/dev-team/DevTeam.Backend/Program.cs @@ -5,7 +5,7 @@ using DevTeam.Backend; using DevTeam.Options; using Microsoft.AI.DevTeam; -using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Core; using Microsoft.AutoGen.Extensions.SemanticKernel; using Microsoft.Extensions.Azure; using Microsoft.Extensions.Options; diff --git a/dotnet/samples/dev-team/DevTeam.Backend/Services/GithubWebHookProcessor.cs b/dotnet/samples/dev-team/DevTeam.Backend/Services/GithubWebHookProcessor.cs index 54ef97e059b2..80660328ecae 100644 --- a/dotnet/samples/dev-team/DevTeam.Backend/Services/GithubWebHookProcessor.cs +++ b/dotnet/samples/dev-team/DevTeam.Backend/Services/GithubWebHookProcessor.cs @@ -3,8 +3,8 @@ using System.Globalization; using DevTeam.Shared; -using Microsoft.AutoGen.Abstractions; -using Microsoft.AutoGen.Agents; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; using Octokit.Webhooks; using Octokit.Webhooks.Events; using Octokit.Webhooks.Events.IssueComment; diff --git a/dotnet/samples/dev-team/DevTeam.Shared/DevTeam.Shared.csproj b/dotnet/samples/dev-team/DevTeam.Shared/DevTeam.Shared.csproj index 18fcb9745238..674bba3b13ec 100644 --- a/dotnet/samples/dev-team/DevTeam.Shared/DevTeam.Shared.csproj +++ b/dotnet/samples/dev-team/DevTeam.Shared/DevTeam.Shared.csproj @@ -1,7 +1,7 @@ - + diff --git a/dotnet/samples/dev-team/DevTeam.Shared/EventExtensions.cs b/dotnet/samples/dev-team/DevTeam.Shared/EventExtensions.cs index 60c044ea92eb..bbf51dcdea6f 100644 --- a/dotnet/samples/dev-team/DevTeam.Shared/EventExtensions.cs +++ b/dotnet/samples/dev-team/DevTeam.Shared/EventExtensions.cs @@ -2,7 +2,7 @@ // EventExtensions.cs using System.Globalization; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; namespace DevTeam; diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/IAgentBase.cs b/dotnet/src/Microsoft.AutoGen/Abstractions/IAgentBase.cs deleted file mode 100644 index ee7b9e74583c..000000000000 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/IAgentBase.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// IAgentBase.cs - -using Google.Protobuf; - -namespace Microsoft.AutoGen.Abstractions; - -public interface IAgentBase -{ - // Properties - AgentId AgentId { get; } - IAgentRuntime Context { get; } - - // Methods - Task CallHandler(CloudEvent item); - Task HandleRequest(RpcRequest request); - void ReceiveMessage(Message message); - Task StoreAsync(AgentState state, CancellationToken cancellationToken = default); - Task ReadAsync(AgentId agentId, CancellationToken cancellationToken = default) where T : IMessage, new(); - ValueTask PublishEventAsync(CloudEvent item, CancellationToken cancellationToken = default); - ValueTask PublishEventAsync(string topic, IMessage evt, CancellationToken cancellationToken = default); - List Subscribe(string topic); -} diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/IAgentRuntime.cs b/dotnet/src/Microsoft.AutoGen/Abstractions/IAgentRuntime.cs deleted file mode 100644 index 6b3d4f98cdb2..000000000000 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/IAgentRuntime.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// IAgentRuntime.cs - -using System.Diagnostics; - -namespace Microsoft.AutoGen.Abstractions; - -public interface IAgentRuntime -{ - AgentId AgentId { get; } - IAgentBase? AgentInstance { get; set; } - ValueTask StoreAsync(AgentState value, CancellationToken cancellationToken = default); - ValueTask ReadAsync(AgentId agentId, CancellationToken cancellationToken = default); - ValueTask SendResponseAsync(RpcRequest request, RpcResponse response, CancellationToken cancellationToken = default); - ValueTask SendRequestAsync(IAgentBase agent, RpcRequest request, CancellationToken cancellationToken = default); - ValueTask SendMessageAsync(Message message, CancellationToken cancellationToken = default); - ValueTask PublishEventAsync(CloudEvent @event, CancellationToken cancellationToken = default); - void Update(RpcRequest request, Activity? activity); - void Update(CloudEvent cloudEvent, Activity? activity); - (string?, string?) GetTraceIdAndState(IDictionary metadata); - IDictionary ExtractMetadata(IDictionary metadata); -} diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Host.cs b/dotnet/src/Microsoft.AutoGen/AgentHost/Host.cs similarity index 71% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Host.cs rename to dotnet/src/Microsoft.AutoGen/AgentHost/Host.cs index 464536d54b21..1ecf42c79589 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Host.cs +++ b/dotnet/src/Microsoft.AutoGen/AgentHost/Host.cs @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Host.cs - +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Hosting; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Runtime.Grpc; public static class Host { @@ -12,14 +12,8 @@ public static async Task StartAsync(bool local = false, bool use { var builder = WebApplication.CreateBuilder(); builder.AddServiceDefaults(); - if (local) - { - builder.AddLocalAgentService(useGrpc: useGrpc); - } - else - { - builder.AddAgentService(useGrpc: useGrpc); - } + builder.AddAgentService(); + var app = builder.Build(); app.MapAgentService(local, useGrpc); app.MapDefaultEndpoints(); diff --git a/dotnet/src/Microsoft.AutoGen/AgentHost/Microsoft.Autogen.AgentHost.csproj b/dotnet/src/Microsoft.AutoGen/AgentHost/Microsoft.Autogen.AgentHost.csproj new file mode 100644 index 000000000000..33b051ad917b --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/AgentHost/Microsoft.Autogen.AgentHost.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + autogen-host + alpine + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/dotnet/src/Microsoft.AutoGen/AgentHost/Program.cs b/dotnet/src/Microsoft.AutoGen/AgentHost/Program.cs new file mode 100644 index 000000000000..024ca0d4309f --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/AgentHost/Program.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Program.cs +using Microsoft.Extensions.Hosting; + +var app = await Microsoft.AutoGen.Runtime.Grpc.Host.StartAsync(local: false, useGrpc: true).ConfigureAwait(false); +await app.WaitForShutdownAsync(); diff --git a/dotnet/samples/Hello/Backend/Properties/launchSettings.json b/dotnet/src/Microsoft.AutoGen/AgentHost/Properties/launchSettings.json similarity index 55% rename from dotnet/samples/Hello/Backend/Properties/launchSettings.json rename to dotnet/src/Microsoft.AutoGen/AgentHost/Properties/launchSettings.json index db9c6bf2c316..cfddee319d65 100644 --- a/dotnet/samples/Hello/Backend/Properties/launchSettings.json +++ b/dotnet/src/Microsoft.AutoGen/AgentHost/Properties/launchSettings.json @@ -1,12 +1,13 @@ { "profiles": { - "Backend": { + "AgentHost": { "commandName": "Project", + "dotnetRunMessages": true, "launchBrowser": true, + "applicationUrl": "https://localhost:50670;http://localhost:50673", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:53071;http://localhost:53072" + } } } -} \ No newline at end of file +} diff --git a/dotnet/samples/Hello/Backend/appsettings.json b/dotnet/src/Microsoft.AutoGen/AgentHost/appsettings.json similarity index 100% rename from dotnet/samples/Hello/Backend/appsettings.json rename to dotnet/src/Microsoft.AutoGen/AgentHost/appsettings.json diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Agents/AIAgent/InferenceAgent.cs b/dotnet/src/Microsoft.AutoGen/Agents/AIAgent/InferenceAgent.cs similarity index 90% rename from dotnet/src/Microsoft.AutoGen/Agents/Agents/AIAgent/InferenceAgent.cs rename to dotnet/src/Microsoft.AutoGen/Agents/AIAgent/InferenceAgent.cs index bf68467e3fa7..bfcd7c6cc179 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Agents/AIAgent/InferenceAgent.cs +++ b/dotnet/src/Microsoft.AutoGen/Agents/AIAgent/InferenceAgent.cs @@ -1,15 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // InferenceAgent.cs - using Google.Protobuf; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Core; using Microsoft.Extensions.AI; namespace Microsoft.AutoGen.Agents; public abstract class InferenceAgent( - IAgentRuntime context, + IAgentWorker worker, EventTypes typeRegistry, IChatClient client) - : AgentBase(context, typeRegistry) + : Agent(worker, typeRegistry) where T : IMessage, new() { protected IChatClient ChatClient { get; } = client; diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Agents/AIAgent/SKAiAgent.cs b/dotnet/src/Microsoft.AutoGen/Agents/AIAgent/SKAiAgent.cs similarity index 85% rename from dotnet/src/Microsoft.AutoGen/Agents/Agents/AIAgent/SKAiAgent.cs rename to dotnet/src/Microsoft.AutoGen/Agents/AIAgent/SKAiAgent.cs index db0d8241fe0c..1d0c57068e13 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Agents/AIAgent/SKAiAgent.cs +++ b/dotnet/src/Microsoft.AutoGen/Agents/AIAgent/SKAiAgent.cs @@ -1,26 +1,24 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // SKAiAgent.cs - using System.Globalization; using System.Text; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Core; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Connectors.OpenAI; using Microsoft.SemanticKernel.Memory; namespace Microsoft.AutoGen.Agents; -public abstract class SKAiAgent : AgentBase where T : class, new() +public abstract class SKAiAgent( + IAgentWorker worker, + ISemanticTextMemory memory, + Kernel kernel, + EventTypes typeRegistry) : Agent( + worker, + typeRegistry) where T : class, new() { - protected AgentState _state; - protected Kernel _kernel; - private readonly ISemanticTextMemory _memory; - - public SKAiAgent(IAgentRuntime context, ISemanticTextMemory memory, Kernel kernel, EventTypes typeRegistry) : base(context, typeRegistry) - { - _state = new(); - _memory = memory; - _kernel = kernel; - } + protected AgentState _state = new(); + protected Kernel _kernel = kernel; + private readonly ISemanticTextMemory _memory = memory; public void AddToHistory(string message, ChatUserType userType) => _state.History.Add(new ChatHistoryItem { diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Client.cs b/dotnet/src/Microsoft.AutoGen/Agents/Client.cs deleted file mode 100644 index 313685d79311..000000000000 --- a/dotnet/src/Microsoft.AutoGen/Agents/Client.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Client.cs - -using System.Diagnostics; -using Microsoft.AutoGen.Abstractions; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace Microsoft.AutoGen.Agents; -public sealed class Client(IAgentWorker runtime, DistributedContextPropagator distributedContextPropagator, - [FromKeyedServices("EventTypes")] EventTypes eventTypes, ILogger logger) - : AgentBase(new AgentRuntime(new AgentId("client", Guid.NewGuid().ToString()), runtime, logger, distributedContextPropagator), eventTypes) -{ -} diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/ConsoleAgent/ConsoleAgent.cs b/dotnet/src/Microsoft.AutoGen/Agents/IOAgent/ConsoleAgent/ConsoleAgent.cs similarity index 88% rename from dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/ConsoleAgent/ConsoleAgent.cs rename to dotnet/src/Microsoft.AutoGen/Agents/IOAgent/ConsoleAgent/ConsoleAgent.cs index 3d7de5c12d04..7bfe5ab8d786 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/ConsoleAgent/ConsoleAgent.cs +++ b/dotnet/src/Microsoft.AutoGen/Agents/IOAgent/ConsoleAgent/ConsoleAgent.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // ConsoleAgent.cs - -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AutoGen.Agents; @@ -13,7 +13,7 @@ public abstract class ConsoleAgent : IOAgent, { // instead of the primary constructor above, make a constructr here that still calls the base constructor - public ConsoleAgent(IAgentRuntime context, [FromKeyedServices("EventTypes")] EventTypes typeRegistry) : base(context, typeRegistry) + public ConsoleAgent(IAgentWorker worker, [FromKeyedServices("EventTypes")] EventTypes typeRegistry) : base(worker, typeRegistry) { _route = "console"; } diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/ConsoleAgent/IHandleConsole.cs b/dotnet/src/Microsoft.AutoGen/Agents/IOAgent/ConsoleAgent/IHandleConsole.cs similarity index 95% rename from dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/ConsoleAgent/IHandleConsole.cs rename to dotnet/src/Microsoft.AutoGen/Agents/IOAgent/ConsoleAgent/IHandleConsole.cs index 60df58e928c4..31b89453a2e6 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/ConsoleAgent/IHandleConsole.cs +++ b/dotnet/src/Microsoft.AutoGen/Agents/IOAgent/ConsoleAgent/IHandleConsole.cs @@ -2,13 +2,13 @@ // IHandleConsole.cs using Google.Protobuf; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; namespace Microsoft.AutoGen.Agents; public interface IHandleConsole : IHandle, IHandle { - string Route { get; } AgentId AgentId { get; } ValueTask PublishMessageAsync(T message, string? source = null, CancellationToken token = default) where T : IMessage; diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/FileAgent/FileAgent.cs b/dotnet/src/Microsoft.AutoGen/Agents/IOAgent/FileAgent/FileAgent.cs similarity index 93% rename from dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/FileAgent/FileAgent.cs rename to dotnet/src/Microsoft.AutoGen/Agents/IOAgent/FileAgent/FileAgent.cs index 65aecee148ef..ddab8a61ed58 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/FileAgent/FileAgent.cs +++ b/dotnet/src/Microsoft.AutoGen/Agents/IOAgent/FileAgent/FileAgent.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // FileAgent.cs - -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -9,11 +9,11 @@ namespace Microsoft.AutoGen.Agents; [TopicSubscription("FileIO")] public abstract class FileAgent( - IAgentRuntime context, + IAgentWorker worker, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, string inputPath = "input.txt", string outputPath = "output.txt" - ) : IOAgent(context, typeRegistry), + ) : IOAgent(worker, typeRegistry), IUseFiles, IHandle, IHandle diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/IOAgent.cs b/dotnet/src/Microsoft.AutoGen/Agents/IOAgent/IOAgent.cs similarity index 77% rename from dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/IOAgent.cs rename to dotnet/src/Microsoft.AutoGen/Agents/IOAgent/IOAgent.cs index fdd685240508..e2b53d694885 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/IOAgent.cs +++ b/dotnet/src/Microsoft.AutoGen/Agents/IOAgent/IOAgent.cs @@ -1,16 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // IOAgent.cs -using Microsoft.AutoGen.Abstractions; - +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; namespace Microsoft.AutoGen.Agents; -public abstract class IOAgent : AgentBase +public abstract class IOAgent(IAgentWorker worker, EventTypes eventTypes) : Agent(worker, eventTypes) { public string _route = "base"; - protected IOAgent(IAgentRuntime context, EventTypes eventTypes) : base(context, eventTypes) - { - } + public virtual async Task Handle(Input item) { diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/WebAPIAgent/WebAPIAgent.cs b/dotnet/src/Microsoft.AutoGen/Agents/IOAgent/WebAPIAgent/WebAPIAgent.cs similarity index 95% rename from dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/WebAPIAgent/WebAPIAgent.cs rename to dotnet/src/Microsoft.AutoGen/Agents/IOAgent/WebAPIAgent/WebAPIAgent.cs index 3a594a3bf73a..3e43096bee29 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Agents/IOAgent/WebAPIAgent/WebAPIAgent.cs +++ b/dotnet/src/Microsoft.AutoGen/Agents/IOAgent/WebAPIAgent/WebAPIAgent.cs @@ -1,9 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // WebAPIAgent.cs - using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; +using Microsoft.AutoGen.Core; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -17,11 +17,11 @@ public abstract class WebAPIAgent : IOAgent, private readonly string _url = "/agents/webio"; public WebAPIAgent( - IAgentRuntime context, + IAgentWorker worker, [FromKeyedServices("EventTypes")] EventTypes typeRegistry, ILogger logger, string url = "/agents/webio") : base( - context, + worker, typeRegistry) { _url = url; diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Microsoft.AutoGen.Agents.csproj b/dotnet/src/Microsoft.AutoGen/Agents/Microsoft.AutoGen.Agents.csproj index aa79cf9665ae..8a00f4cfb893 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Microsoft.AutoGen.Agents.csproj +++ b/dotnet/src/Microsoft.AutoGen/Agents/Microsoft.AutoGen.Agents.csproj @@ -1,45 +1,21 @@ - net8.0 - enable - enable + net8.0 + enable + enable - - - + + + - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - - - - - - - - - - - true - true - + + + + + diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/AgentId.cs b/dotnet/src/Microsoft.AutoGen/Contracts/AgentId.cs similarity index 83% rename from dotnet/src/Microsoft.AutoGen/Abstractions/AgentId.cs rename to dotnet/src/Microsoft.AutoGen/Contracts/AgentId.cs index 7229b7365773..49c26a8c87a7 100644 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/AgentId.cs +++ b/dotnet/src/Microsoft.AutoGen/Contracts/AgentId.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // AgentId.cs -namespace Microsoft.AutoGen.Abstractions; +namespace Microsoft.AutoGen.Contracts; public partial class AgentId { diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/ChatHistoryItem.cs b/dotnet/src/Microsoft.AutoGen/Contracts/ChatHistoryItem.cs similarity index 86% rename from dotnet/src/Microsoft.AutoGen/Abstractions/ChatHistoryItem.cs rename to dotnet/src/Microsoft.AutoGen/Contracts/ChatHistoryItem.cs index 0a779405e278..77491bdb8c76 100644 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/ChatHistoryItem.cs +++ b/dotnet/src/Microsoft.AutoGen/Contracts/ChatHistoryItem.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // ChatHistoryItem.cs -namespace Microsoft.AutoGen.Abstractions; +namespace Microsoft.AutoGen.Contracts; [Serializable] public class ChatHistoryItem diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/ChatState.cs b/dotnet/src/Microsoft.AutoGen/Contracts/ChatState.cs similarity index 86% rename from dotnet/src/Microsoft.AutoGen/Abstractions/ChatState.cs rename to dotnet/src/Microsoft.AutoGen/Contracts/ChatState.cs index 459a17045496..6e41b644bce4 100644 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/ChatState.cs +++ b/dotnet/src/Microsoft.AutoGen/Contracts/ChatState.cs @@ -3,7 +3,7 @@ using Google.Protobuf; -namespace Microsoft.AutoGen.Abstractions; +namespace Microsoft.AutoGen.Contracts; public class ChatState where T : IMessage, new() diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/ChatUserType.cs b/dotnet/src/Microsoft.AutoGen/Contracts/ChatUserType.cs similarity index 77% rename from dotnet/src/Microsoft.AutoGen/Abstractions/ChatUserType.cs rename to dotnet/src/Microsoft.AutoGen/Contracts/ChatUserType.cs index 4ee8dcd33890..3bfcbb376518 100644 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/ChatUserType.cs +++ b/dotnet/src/Microsoft.AutoGen/Contracts/ChatUserType.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // ChatUserType.cs -namespace Microsoft.AutoGen.Abstractions; +namespace Microsoft.AutoGen.Contracts; public enum ChatUserType { diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/IAgentState.cs b/dotnet/src/Microsoft.AutoGen/Contracts/IAgentState.cs similarity index 96% rename from dotnet/src/Microsoft.AutoGen/Abstractions/IAgentState.cs rename to dotnet/src/Microsoft.AutoGen/Contracts/IAgentState.cs index 1b816b4ef3ad..0b3491dfb1b1 100644 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/IAgentState.cs +++ b/dotnet/src/Microsoft.AutoGen/Contracts/IAgentState.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // IAgentState.cs -namespace Microsoft.AutoGen.Abstractions; +namespace Microsoft.AutoGen.Contracts; /// /// Interface for managing the state of an agent. diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/IConnection.cs b/dotnet/src/Microsoft.AutoGen/Contracts/IConnection.cs similarity index 72% rename from dotnet/src/Microsoft.AutoGen/Abstractions/IConnection.cs rename to dotnet/src/Microsoft.AutoGen/Contracts/IConnection.cs index 3ac582f6d4b3..3e7484c5d350 100644 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/IConnection.cs +++ b/dotnet/src/Microsoft.AutoGen/Contracts/IConnection.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // IConnection.cs -namespace Microsoft.AutoGen.Abstractions; +namespace Microsoft.AutoGen.Contracts; public interface IConnection { } diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/MessageExtensions.cs b/dotnet/src/Microsoft.AutoGen/Contracts/MessageExtensions.cs similarity index 95% rename from dotnet/src/Microsoft.AutoGen/Abstractions/MessageExtensions.cs rename to dotnet/src/Microsoft.AutoGen/Contracts/MessageExtensions.cs index c686b437bdc3..c531c5b76ec3 100644 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/MessageExtensions.cs +++ b/dotnet/src/Microsoft.AutoGen/Contracts/MessageExtensions.cs @@ -4,7 +4,7 @@ using Google.Protobuf; using Google.Protobuf.WellKnownTypes; -namespace Microsoft.AutoGen.Abstractions; +namespace Microsoft.AutoGen.Contracts; public static class MessageExtensions { @@ -17,6 +17,7 @@ public static CloudEvent ToCloudEvent(this T message, string source) where T Type = message.Descriptor.FullName, Source = source, Id = Guid.NewGuid().ToString(), + SpecVersion = "1.0", Attributes = { { "datacontenttype", new CloudEvent.Types.CloudEventAttributeValue { CeString = PROTO_DATA_CONTENT_TYPE } } } }; } diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/Microsoft.AutoGen.Abstractions.csproj b/dotnet/src/Microsoft.AutoGen/Contracts/Microsoft.AutoGen.Contracts.csproj similarity index 93% rename from dotnet/src/Microsoft.AutoGen/Abstractions/Microsoft.AutoGen.Abstractions.csproj rename to dotnet/src/Microsoft.AutoGen/Contracts/Microsoft.AutoGen.Contracts.csproj index 39a90664057e..6a8f6bbf2fd4 100644 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/Microsoft.AutoGen.Abstractions.csproj +++ b/dotnet/src/Microsoft.AutoGen/Contracts/Microsoft.AutoGen.Contracts.csproj @@ -18,6 +18,5 @@ - diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/TopicSubscriptionAttribute.cs b/dotnet/src/Microsoft.AutoGen/Contracts/TopicSubscriptionAttribute.cs similarity index 85% rename from dotnet/src/Microsoft.AutoGen/Abstractions/TopicSubscriptionAttribute.cs rename to dotnet/src/Microsoft.AutoGen/Contracts/TopicSubscriptionAttribute.cs index 79d8393d2027..ba17520f79b9 100644 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/TopicSubscriptionAttribute.cs +++ b/dotnet/src/Microsoft.AutoGen/Contracts/TopicSubscriptionAttribute.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // TopicSubscriptionAttribute.cs -namespace Microsoft.AutoGen.Abstractions; +namespace Microsoft.AutoGen.Contracts; [AttributeUsage(AttributeTargets.All)] public class TopicSubscriptionAttribute(string topic) : Attribute diff --git a/dotnet/src/Microsoft.AutoGen/Agents/App.cs b/dotnet/src/Microsoft.AutoGen/Core.Grpc/App.cs similarity index 86% rename from dotnet/src/Microsoft.AutoGen/Agents/App.cs rename to dotnet/src/Microsoft.AutoGen/Core.Grpc/App.cs index 8a233bcd4898..922ef8a59500 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/App.cs +++ b/dotnet/src/Microsoft.AutoGen/Core.Grpc/App.cs @@ -1,12 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // App.cs +using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using Google.Protobuf; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Core.Grpc; public static class AgentsApp { @@ -17,19 +19,11 @@ public static class AgentsApp public static async ValueTask StartAsync(WebApplicationBuilder? builder = null, AgentTypes? agentTypes = null, bool local = false) { builder ??= WebApplication.CreateBuilder(); - if (local) - { - // start the server runtime - builder.AddLocalAgentService(useGrpc: false); - } - builder.AddAgentWorker(local: local) + builder.Services.TryAddSingleton(DistributedContextPropagator.Current); + builder.AddAgentWorker() .AddAgents(agentTypes); builder.AddServiceDefaults(); var app = builder.Build(); - if (local) - { - app.MapAgentService(local: true, useGrpc: false); - } app.MapDefaultEndpoints(); Host = app; await app.StartAsync().ConfigureAwait(false); diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcAgentWorker.cs b/dotnet/src/Microsoft.AutoGen/Core.Grpc/GrpcAgentWorker.cs similarity index 83% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcAgentWorker.cs rename to dotnet/src/Microsoft.AutoGen/Core.Grpc/GrpcAgentWorker.cs index 636bca487fc7..f96f42a2c11b 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcAgentWorker.cs +++ b/dotnet/src/Microsoft.AutoGen/Core.Grpc/GrpcAgentWorker.cs @@ -2,31 +2,28 @@ // GrpcAgentWorker.cs using System.Collections.Concurrent; -using System.Diagnostics; using System.Reflection; using System.Threading.Channels; using Grpc.Core; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Core; public sealed class GrpcAgentWorker( AgentRpc.AgentRpcClient client, IHostApplicationLifetime hostApplicationLifetime, IServiceProvider serviceProvider, [FromKeyedServices("AgentTypes")] IEnumerable> configuredAgentTypes, - ILogger logger, - DistributedContextPropagator distributedContextPropagator) : - AgentWorker(hostApplicationLifetime, - serviceProvider, configuredAgentTypes, logger, distributedContextPropagator), IHostedService, IDisposable, IAgentWorker + ILogger logger) : + IHostedService, IDisposable, IAgentWorker { private readonly object _channelLock = new(); private readonly ConcurrentDictionary _agentTypes = new(); - private readonly ConcurrentDictionary<(string Type, string Key), IAgentBase> _agents = new(); - private readonly ConcurrentDictionary _pendingRequests = new(); + private readonly ConcurrentDictionary<(string Type, string Key), Agent> _agents = new(); + private readonly ConcurrentDictionary _pendingRequests = new(); private readonly Channel<(Message Message, TaskCompletionSource WriteCompletionSource)> _outboundMessagesChannel = Channel.CreateBounded<(Message, TaskCompletionSource)>(new BoundedChannelOptions(1024) { AllowSynchronousContinuations = true, @@ -38,7 +35,6 @@ public sealed class GrpcAgentWorker( private readonly IServiceProvider _serviceProvider = serviceProvider; private readonly IEnumerable> _configuredAgentTypes = configuredAgentTypes; private readonly ILogger _logger = logger; - private readonly DistributedContextPropagator _distributedContextPropagator = distributedContextPropagator; private readonly CancellationTokenSource _shutdownCts = CancellationTokenSource.CreateLinkedTokenSource(hostApplicationLifetime.ApplicationStopping); private AsyncDuplexStreamingCall? _channel; private Task? _readTask; @@ -78,20 +74,6 @@ private async Task RunReadPump() request.Agent.ReceiveMessage(message); break; - case Message.MessageOneofCase.RegisterAgentTypeResponse: - if (!message.RegisterAgentTypeResponse.Success) - { - throw new InvalidOperationException($"Failed to register agent: '{message.RegisterAgentTypeResponse.Error}'."); - } - break; - - case Message.MessageOneofCase.AddSubscriptionResponse: - if (!message.AddSubscriptionResponse.Success) - { - throw new InvalidOperationException($"Failed to add subscription: '{message.AddSubscriptionResponse.Error}'."); - } - break; - case Message.MessageOneofCase.CloudEvent: // HACK: Send the message to an instance of each agent type @@ -102,7 +84,7 @@ private async Task RunReadPump() foreach (var (typeName, _) in _agentTypes) { - var agent = GetOrActivateAgent(new AgentId(typeName, item.Source)); + var agent = GetOrActivateAgent(new AgentId { Type = typeName, Key = item.Source }); agent.ReceiveMessage(message); } @@ -187,14 +169,13 @@ private async Task RunWritePump() item.WriteCompletionSource.TrySetCanceled(); } } - private IAgentBase GetOrActivateAgent(AgentId agentId) + private Agent GetOrActivateAgent(AgentId agentId) { if (!_agents.TryGetValue((agentId.Type, agentId.Key), out var agent)) { if (_agentTypes.TryGetValue(agentId.Type, out var agentType)) { - var context = new AgentRuntime(agentId, this, _serviceProvider.GetRequiredService>(), _distributedContextPropagator); - agent = (AgentBase)ActivatorUtilities.CreateInstance(_serviceProvider, agentType, context); + agent = (Agent)ActivatorUtilities.CreateInstance(_serviceProvider, agentType, this); _agents.TryAdd((agentId.Type, agentId.Key), agent); } else @@ -212,7 +193,7 @@ private async ValueTask RegisterAgentTypeAsync(string type, Type agentType, Canc { var events = agentType.GetInterfaces() .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IHandle<>)) - .Select(i => i.GetGenericArguments().First().Name); + .Select(i => ReflectionHelper.GetMessageDescriptor(i.GetGenericArguments().First())?.FullName); //var state = agentType.BaseType?.GetGenericArguments().First(); var topicTypes = agentType.GetCustomAttributes().Select(t => t.Topic); @@ -270,25 +251,25 @@ await WriteChannelAsync(new Message } } // new is intentional - public new async ValueTask SendResponseAsync(RpcResponse response, CancellationToken cancellationToken = default) + public async ValueTask SendResponseAsync(RpcResponse response, CancellationToken cancellationToken = default) { await WriteChannelAsync(new Message { Response = response }, cancellationToken).ConfigureAwait(false); } - // new is intentional - public new async ValueTask SendRequestAsync(IAgentBase agent, RpcRequest request, CancellationToken cancellationToken = default) + + public async ValueTask SendRequestAsync(Agent agent, RpcRequest request, CancellationToken cancellationToken = default) { var requestId = Guid.NewGuid().ToString(); _pendingRequests[requestId] = (agent, request.RequestId); request.RequestId = requestId; await WriteChannelAsync(new Message { Request = request }, cancellationToken).ConfigureAwait(false); } - // new is intentional - public new async ValueTask SendMessageAsync(Message message, CancellationToken cancellationToken = default) + + public async ValueTask SendMessageAsync(Message message, CancellationToken cancellationToken = default) { await WriteChannelAsync(message, cancellationToken).ConfigureAwait(false); } - // new is intentional - public new async ValueTask PublishEventAsync(CloudEvent @event, CancellationToken cancellationToken = default) + + public async ValueTask PublishEventAsync(CloudEvent @event, CancellationToken cancellationToken = default) { await WriteChannelAsync(new Message { CloudEvent = @event }, cancellationToken).ConfigureAwait(false); } @@ -332,7 +313,7 @@ private AsyncDuplexStreamingCall RecreateChannel(AsyncDuplexSt return _channel; } - public new async Task StartAsync(CancellationToken cancellationToken) + public async Task StartAsync(CancellationToken cancellationToken) { _channel = GetChannel(); StartCore(); @@ -369,7 +350,7 @@ void StartCore() } } - public new async Task StopAsync(CancellationToken cancellationToken) + public async Task StopAsync(CancellationToken cancellationToken) { _shutdownCts.Cancel(); @@ -389,8 +370,8 @@ void StartCore() _channel?.Dispose(); } } - // new intentional - public new async ValueTask StoreAsync(AgentState value, CancellationToken cancellationToken = default) + + public async ValueTask StoreAsync(AgentState value, CancellationToken cancellationToken = default) { var agentId = value.AgentId ?? throw new InvalidOperationException("AgentId is required when saving AgentState."); var response = _client.SaveState(value, null, null, cancellationToken); @@ -399,8 +380,8 @@ void StartCore() throw new InvalidOperationException($"Error saving AgentState for AgentId {agentId}."); } } - // new intentional - public new async ValueTask ReadAsync(AgentId agentId, CancellationToken cancellationToken = default) + + public async ValueTask ReadAsync(AgentId agentId, CancellationToken cancellationToken = default) { var response = await _client.GetStateAsync(agentId).ConfigureAwait(true); // if (response.Success && response.AgentState.AgentId is not null) - why is success always false? diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcAgentWorkerHostBuilderExtension.cs b/dotnet/src/Microsoft.AutoGen/Core.Grpc/GrpcAgentWorkerHostBuilderExtension.cs similarity index 96% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcAgentWorkerHostBuilderExtension.cs rename to dotnet/src/Microsoft.AutoGen/Core.Grpc/GrpcAgentWorkerHostBuilderExtension.cs index 6757428302f4..34e6276b52bb 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcAgentWorkerHostBuilderExtension.cs +++ b/dotnet/src/Microsoft.AutoGen/Core.Grpc/GrpcAgentWorkerHostBuilderExtension.cs @@ -1,13 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // GrpcAgentWorkerHostBuilderExtension.cs - using Grpc.Core; using Grpc.Net.Client.Configuration; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; - -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Core.Grpc; public static class GrpcAgentWorkerHostBuilderExtensions { diff --git a/dotnet/src/Microsoft.AutoGen/Core.Grpc/Microsoft.AutoGen.Core.Grpc.csproj b/dotnet/src/Microsoft.AutoGen/Core.Grpc/Microsoft.AutoGen.Core.Grpc.csproj new file mode 100644 index 000000000000..a56f306d04b6 --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/Core.Grpc/Microsoft.AutoGen.Core.Grpc.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + enable + + + + + + + + + diff --git a/dotnet/src/Microsoft.AutoGen/Agents/AgentBase.cs b/dotnet/src/Microsoft.AutoGen/Core/Agent.cs similarity index 79% rename from dotnet/src/Microsoft.AutoGen/Agents/AgentBase.cs rename to dotnet/src/Microsoft.AutoGen/Core/Agent.cs index 5ff964070ffd..67905ecb0543 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/AgentBase.cs +++ b/dotnet/src/Microsoft.AutoGen/Core/Agent.cs @@ -1,45 +1,55 @@ + // Copyright (c) Microsoft Corporation. All rights reserved. -// AgentBase.cs +// Agent.cs +using System.Collections.Concurrent; using System.Diagnostics; using System.Reflection; using System.Text; using System.Text.Json; using System.Threading.Channels; using Google.Protobuf; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; using Microsoft.Extensions.Logging; -namespace Microsoft.AutoGen.Agents; - -public abstract class AgentBase : IAgentBase, IHandle +namespace Microsoft.AutoGen.Core; +/// +/// Represents the base class for an agent in the AutoGen system. +/// +public abstract class Agent : IHandle { - public static readonly ActivitySource s_source = new("AutoGen.Agent"); - public AgentId AgentId => _runtime.AgentId; private readonly object _lock = new(); - private readonly Dictionary> _pendingRequests = []; + private readonly ConcurrentDictionary> _pendingRequests = []; + + /// + /// The activity source for tracing. + /// + public static readonly ActivitySource s_source = new("Microsoft.AutoGen.Core.Agent"); + /// + /// Gets the unique identifier of the agent. + /// + public AgentId AgentId { get; private set; } private readonly Channel _mailbox = Channel.CreateUnbounded(); - private readonly IAgentRuntime _runtime; - public string Route { get; set; } = "base"; + protected internal ILogger _logger; + public AgentMessenger Messenger { get; private set; } + private readonly ConcurrentDictionary _handlersByMessageType; + internal Task Completion { get; private set; } - protected internal ILogger _logger; - public IAgentRuntime Context => _runtime; protected readonly EventTypes EventTypes; - protected AgentBase( - IAgentRuntime runtime, + protected Agent(IAgentWorker worker, EventTypes eventTypes, - ILogger? logger = null) + ILogger? logger = null) { - _runtime = runtime; - runtime.AgentInstance = this; - this.EventTypes = eventTypes; - _logger = logger ?? LoggerFactory.Create(builder => { }).CreateLogger(); + EventTypes = eventTypes; + AgentId = new AgentId(this.GetType().Name, new Guid().ToString()); + _logger = logger ?? LoggerFactory.Create(builder => { }).CreateLogger(); + _handlersByMessageType = new(GetType().GetHandlersLookupTable()); + Messenger = AgentMessengerFactory.Create(worker, DistributedContextPropagator.Current); AddImplicitSubscriptionsAsync().AsTask().Wait(); Completion = Start(); } - internal Task Completion { get; } private async ValueTask AddImplicitSubscriptionsAsync() { @@ -64,7 +74,7 @@ private async ValueTask AddImplicitSubscriptionsAsync() } }; // explicitly wait for this to complete - await _runtime.SendMessageAsync(new Message { AddSubscriptionRequest = subscriptionRequest }).ConfigureAwait(true); + await Messenger.SendMessageAsync(new Message { AddSubscriptionRequest = subscriptionRequest }).ConfigureAwait(true); } // using reflection, find all methods that Handle and subscribe to the topic T @@ -80,6 +90,11 @@ private async ValueTask AddImplicitSubscriptionsAsync() } } + + /// + /// Starts the message pump for the agent. + /// + /// A task representing the asynchronous operation. internal Task Start() { var didSuppress = false; @@ -131,9 +146,9 @@ protected internal async Task HandleRpcMessage(Message msg, CancellationToken ca { case Message.MessageOneofCase.CloudEvent: { - var activity = this.ExtractActivity(msg.CloudEvent.Type, msg.CloudEvent.Metadata); + var activity = this.ExtractActivity(msg.CloudEvent.Type, msg.CloudEvent.Attributes); await this.InvokeWithActivityAsync( - static ((AgentBase Agent, CloudEvent Item) state, CancellationToken _) => state.Agent.CallHandler(state.Item), + static ((Agent Agent, CloudEvent Item) state, CancellationToken _) => state.Agent.CallHandler(state.Item), (this, msg.CloudEvent), activity, msg.CloudEvent.Type, cancellationToken).ConfigureAwait(false); @@ -143,7 +158,7 @@ await this.InvokeWithActivityAsync( { var activity = this.ExtractActivity(msg.Request.Method, msg.Request.Metadata); await this.InvokeWithActivityAsync( - static ((AgentBase Agent, RpcRequest Request) state, CancellationToken ct) => state.Agent.OnRequestCoreAsync(state.Request, ct), + static ((Agent Agent, RpcRequest Request) state, CancellationToken ct) => state.Agent.OnRequestCoreAsync(state.Request, ct), (this, msg.Request), activity, msg.Request.Method, cancellationToken).ConfigureAwait(false); @@ -171,18 +186,18 @@ public List Subscribe(string topic) } } }; - _runtime.SendMessageAsync(message).AsTask().Wait(); + Messenger.SendMessageAsync(message).AsTask().Wait(); return new List { topic }; } public async Task StoreAsync(AgentState state, CancellationToken cancellationToken = default) { - await _runtime.StoreAsync(state, cancellationToken).ConfigureAwait(false); + await Messenger.StoreAsync(state, cancellationToken).ConfigureAwait(false); return; } public async Task ReadAsync(AgentId agentId, CancellationToken cancellationToken = default) where T : IMessage, new() { - var agentstate = await _runtime.ReadAsync(agentId, cancellationToken).ConfigureAwait(false); + var agentstate = await Messenger.ReadAsync(agentId, cancellationToken).ConfigureAwait(false); return agentstate.FromAgentState(); } private void OnResponseCore(RpcResponse response) @@ -205,13 +220,13 @@ private async Task OnRequestCoreAsync(RpcRequest request, CancellationToken canc try { - response = await HandleRequest(request).ConfigureAwait(false); + response = await HandleRequestAsync(request).ConfigureAwait(false); } catch (Exception ex) { response = new RpcResponse { Error = ex.Message }; } - await _runtime.SendResponseAsync(request, response, cancellationToken).ConfigureAwait(false); + await Messenger.SendResponseAsync(request, response, cancellationToken).ConfigureAwait(false); } protected async Task RequestAsync(AgentId target, string method, Dictionary parameters) @@ -235,18 +250,15 @@ protected async Task RequestAsync(AgentId target, string method, Di activity?.SetTag("peer.service", target.ToString()); var completion = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - _runtime.Update(request, activity); + Messenger!.Update(request, activity); await this.InvokeWithActivityAsync( - static async ((AgentBase Agent, RpcRequest Request, TaskCompletionSource) state, CancellationToken ct) => + static async (state, ct) => { var (self, request, completion) = state; - lock (self._lock) - { - self._pendingRequests[request.RequestId] = completion; - } + self._pendingRequests.AddOrUpdate(request.RequestId, _ => completion, (_, __) => completion); - await state.Agent._runtime.SendRequestAsync(state.Agent, state.Request).ConfigureAwait(false); + await state.Item1.Messenger!.SendRequestAsync(state.Item1, state.request, ct).ConfigureAwait(false); await completion.Task.ConfigureAwait(false); }, @@ -271,11 +283,11 @@ public async ValueTask PublishEventAsync(CloudEvent item, CancellationToken canc activity?.SetTag("peer.service", $"{item.Type}/{item.Source}"); // TODO: fix activity - _runtime.Update(item, activity); + Messenger.Update(item, activity); await this.InvokeWithActivityAsync( - static async ((AgentBase Agent, CloudEvent Event) state, CancellationToken ct) => + static async ((Agent Agent, CloudEvent Event) state, CancellationToken ct) => { - await state.Agent._runtime.PublishEventAsync(state.Event).ConfigureAwait(false); + await state.Agent.Messenger.PublishEventAsync(state.Event).ConfigureAwait(false); }, (this, item), activity, @@ -321,7 +333,7 @@ public Task CallHandler(CloudEvent item) return Task.CompletedTask; } - public Task HandleRequest(RpcRequest request) => Task.FromResult(new RpcResponse { Error = "Not implemented" }); + public Task HandleRequestAsync(RpcRequest request) => Task.FromResult(new RpcResponse { Error = "Not implemented" }); //TODO: should this be async and cancellable? public virtual Task HandleObject(object item) diff --git a/dotnet/src/Microsoft.AutoGen/Agents/AgentBaseExtensions.cs b/dotnet/src/Microsoft.AutoGen/Core/AgentExtensions.cs similarity index 76% rename from dotnet/src/Microsoft.AutoGen/Agents/AgentBaseExtensions.cs rename to dotnet/src/Microsoft.AutoGen/Core/AgentExtensions.cs index 5d738e5fc383..911107f784c5 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/AgentBaseExtensions.cs +++ b/dotnet/src/Microsoft.AutoGen/Core/AgentExtensions.cs @@ -1,14 +1,16 @@ // Copyright (c) Microsoft Corporation. All rights reserved. -// AgentBaseExtensions.cs +// AgentExtensions.cs using System.Diagnostics; +using Google.Protobuf.Collections; +using static Microsoft.AutoGen.Contracts.CloudEvent.Types; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Core; /// -/// Provides extension methods for the class. +/// Provides extension methods for the class. /// -public static class AgentBaseExtensions +public static class AgentExtensions { /// /// Extracts an from the given agent and metadata. @@ -17,21 +19,21 @@ public static class AgentBaseExtensions /// The name of the activity. /// The metadata containing trace information. /// The extracted or null if extraction fails. - public static Activity? ExtractActivity(this AgentBase agent, string activityName, IDictionary metadata) + public static Activity? ExtractActivity(this Agent agent, string activityName, IDictionary metadata) { Activity? activity; - var (traceParent, traceState) = agent.Context.GetTraceIdAndState(metadata); + var (traceParent, traceState) = agent.Messenger.GetTraceIdAndState(metadata); if (!string.IsNullOrEmpty(traceParent)) { if (ActivityContext.TryParse(traceParent, traceState, isRemote: true, out var parentContext)) { // traceParent is a W3CId - activity = AgentBase.s_source.CreateActivity(activityName, ActivityKind.Server, parentContext); + activity = Agent.s_source.CreateActivity(activityName, ActivityKind.Server, parentContext); } else { // Most likely, traceParent uses ActivityIdFormat.Hierarchical - activity = AgentBase.s_source.CreateActivity(activityName, ActivityKind.Server, traceParent); + activity = Agent.s_source.CreateActivity(activityName, ActivityKind.Server, traceParent); } if (activity is not null) @@ -41,7 +43,7 @@ public static class AgentBaseExtensions activity.TraceStateString = traceState; } - var baggage = agent.Context.ExtractMetadata(metadata); + var baggage = agent.Messenger.ExtractMetadata(metadata); foreach (var baggageItem in baggage) { @@ -51,12 +53,17 @@ public static class AgentBaseExtensions } else { - activity = AgentBase.s_source.CreateActivity(activityName, ActivityKind.Server); + activity = Agent.s_source.CreateActivity(activityName, ActivityKind.Server); } return activity; } + public static Activity? ExtractActivity(this Agent agent, string activityName, MapField metadata) + { + return ExtractActivity(agent, activityName, metadata.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.CeString)); + } + /// /// Invokes a function asynchronously within the context of an . /// @@ -68,7 +75,7 @@ public static class AgentBaseExtensions /// The name of the method being invoked. /// A token to monitor for cancellation requests. /// A task representing the asynchronous operation. - public static async Task InvokeWithActivityAsync(this AgentBase agent, Func func, TState state, Activity? activity, string methodName, CancellationToken cancellationToken = default) + public static async Task InvokeWithActivityAsync(this Agent agent, Func func, TState state, Activity? activity, string methodName, CancellationToken cancellationToken = default) { if (activity is not null && activity.StartTimeUtc == default) { diff --git a/dotnet/src/Microsoft.AutoGen/Agents/AgentRuntime.cs b/dotnet/src/Microsoft.AutoGen/Core/AgentMessenger.cs similarity index 53% rename from dotnet/src/Microsoft.AutoGen/Agents/AgentRuntime.cs rename to dotnet/src/Microsoft.AutoGen/Core/AgentMessenger.cs index c36d456af32e..66b1c0c65da9 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/AgentRuntime.cs +++ b/dotnet/src/Microsoft.AutoGen/Core/AgentMessenger.cs @@ -1,19 +1,17 @@ // Copyright (c) Microsoft Corporation. All rights reserved. -// AgentRuntime.cs +// AgentMessenger.cs using System.Diagnostics; -using Microsoft.AutoGen.Abstractions; -using Microsoft.Extensions.Logging; +using Google.Protobuf.Collections; +using Microsoft.AutoGen.Contracts; +using static Microsoft.AutoGen.Contracts.CloudEvent.Types; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Core; -internal sealed class AgentRuntime(AgentId agentId, IAgentWorker worker, ILogger logger, DistributedContextPropagator distributedContextPropagator) : IAgentRuntime +public sealed class AgentMessenger(IAgentWorker worker, DistributedContextPropagator distributedContextPropagator) { private readonly IAgentWorker worker = worker; - public AgentId AgentId { get; } = agentId; - public ILogger Logger { get; } = logger; - public IAgentBase? AgentInstance { get; set; } private DistributedContextPropagator DistributedContextPropagator { get; } = distributedContextPropagator; public (string?, string?) GetTraceIdAndState(IDictionary metadata) { @@ -28,20 +26,56 @@ internal sealed class AgentRuntime(AgentId agentId, IAgentWorker worker, ILogger out var traceState); return (traceParent, traceState); } + public (string?, string?) GetTraceIdAndState(MapField metadata) + { + DistributedContextPropagator.ExtractTraceIdAndState(metadata, + static (object? carrier, string fieldName, out string? fieldValue, out IEnumerable? fieldValues) => + { + var metadata = (MapField)carrier!; + fieldValues = null; + metadata.TryGetValue(fieldName, out var ceValue); + fieldValue = ceValue?.CeString; + }, + out var traceParent, + out var traceState); + return (traceParent, traceState); + } public void Update(RpcRequest request, Activity? activity = null) { - DistributedContextPropagator.Inject(activity, request.Metadata, static (carrier, key, value) => ((IDictionary)carrier!)[key] = value); + DistributedContextPropagator.Inject(activity, request.Metadata, static (carrier, key, value) => + { + var metadata = (IDictionary)carrier!; + if (metadata.TryGetValue(key, out _)) + { + metadata[key] = value; + } + else + { + metadata.Add(key, value); + } + }); } public void Update(CloudEvent cloudEvent, Activity? activity = null) { - DistributedContextPropagator.Inject(activity, cloudEvent.Metadata, static (carrier, key, value) => ((IDictionary)carrier!)[key] = value); + DistributedContextPropagator.Inject(activity, cloudEvent.Attributes, static (carrier, key, value) => + { + var mapField = (MapField)carrier!; + if (mapField.TryGetValue(key, out var ceValue)) + { + mapField[key] = new CloudEventAttributeValue { CeString = value }; + } + else + { + mapField.Add(key, new CloudEventAttributeValue { CeString = value }); + } + }); } public async ValueTask SendResponseAsync(RpcRequest request, RpcResponse response, CancellationToken cancellationToken = default) { response.RequestId = request.RequestId; await worker.SendResponseAsync(response, cancellationToken).ConfigureAwait(false); } - public async ValueTask SendRequestAsync(IAgentBase agent, RpcRequest request, CancellationToken cancellationToken = default) + public async ValueTask SendRequestAsync(Agent agent, RpcRequest request, CancellationToken cancellationToken = default) { await worker.SendRequestAsync(agent, request, cancellationToken).ConfigureAwait(false); } @@ -73,4 +107,17 @@ public IDictionary ExtractMetadata(IDictionary m return baggage as IDictionary ?? new Dictionary(); } + + public IDictionary ExtractMetadata(MapField metadata) + { + var baggage = DistributedContextPropagator.ExtractBaggage(metadata, static (object? carrier, string fieldName, out string? fieldValue, out IEnumerable? fieldValues) => + { + var metadata = (MapField)carrier!; + fieldValues = null; + metadata.TryGetValue(fieldName, out var ceValue); + fieldValue = ceValue?.CeString; + }); + + return baggage as IDictionary ?? new Dictionary(); + } } diff --git a/dotnet/src/Microsoft.AutoGen/Core/AgentMessengerFactory.cs b/dotnet/src/Microsoft.AutoGen/Core/AgentMessengerFactory.cs new file mode 100644 index 000000000000..c008f9f2d5aa --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/Core/AgentMessengerFactory.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// AgentMessengerFactory.cs + +using System.Diagnostics; +namespace Microsoft.AutoGen.Core; +public class AgentMessengerFactory() +{ + public static AgentMessenger Create(IAgentWorker worker, DistributedContextPropagator distributedContextPropagator) + { + return new AgentMessenger(worker, distributedContextPropagator); + } +} diff --git a/dotnet/src/Microsoft.AutoGen/Core/AgentTypes.cs b/dotnet/src/Microsoft.AutoGen/Core/AgentTypes.cs new file mode 100644 index 000000000000..d1a67678cd1d --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/Core/AgentTypes.cs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// AgentTypes.cs + +namespace Microsoft.AutoGen.Core +; +public sealed class AgentTypes(Dictionary types) +{ + public Dictionary Types { get; } = types; + public static AgentTypes? GetAgentTypesFromAssembly() + { + var agents = AppDomain.CurrentDomain.GetAssemblies() + .SelectMany(assembly => assembly.GetTypes()) + .Where(type => ReflectionHelper.IsSubclassOfGeneric(type, typeof(Agent)) + && !type.IsAbstract + && !type.Name.Equals(nameof(Client))) + .ToDictionary(type => type.Name, type => type); + + return new AgentTypes(agents); + } +} diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/AgentWorker.cs b/dotnet/src/Microsoft.AutoGen/Core/AgentWorker.cs similarity index 80% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/AgentWorker.cs rename to dotnet/src/Microsoft.AutoGen/Core/AgentWorker.cs index f9a5050534c8..3b70461a39fd 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/AgentWorker.cs +++ b/dotnet/src/Microsoft.AutoGen/Core/AgentWorker.cs @@ -2,48 +2,34 @@ // AgentWorker.cs using System.Collections.Concurrent; -using System.Diagnostics; using System.Threading.Channels; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Core; -public class AgentWorker : +public class AgentWorker( +IHostApplicationLifetime hostApplicationLifetime, +IServiceProvider serviceProvider, +[FromKeyedServices("AgentTypes")] IEnumerable> configuredAgentTypes) : IHostedService, IAgentWorker { private readonly ConcurrentDictionary _agentTypes = new(); - private readonly ConcurrentDictionary<(string Type, string Key), IAgentBase> _agents = new(); - private readonly ILogger _logger; + private readonly ConcurrentDictionary<(string Type, string Key), Agent> _agents = new(); private readonly Channel _mailbox = Channel.CreateUnbounded(); private readonly ConcurrentDictionary _agentStates = new(); - private readonly ConcurrentDictionary _pendingClientRequests = new(); - private readonly CancellationTokenSource _shutdownCts; - private readonly IServiceProvider _serviceProvider; - private readonly IEnumerable> _configuredAgentTypes; + private readonly ConcurrentDictionary _pendingClientRequests = new(); + private readonly CancellationTokenSource _shutdownCts = CancellationTokenSource.CreateLinkedTokenSource(hostApplicationLifetime.ApplicationStopping); + private readonly IServiceProvider _serviceProvider = serviceProvider; + private readonly IEnumerable> _configuredAgentTypes = configuredAgentTypes; private readonly ConcurrentDictionary _subscriptionsByAgentType = new(); private readonly ConcurrentDictionary> _subscriptionsByTopic = new(); - private readonly DistributedContextPropagator _distributedContextPropagator; private readonly CancellationTokenSource _shutdownCancellationToken = new(); private Task? _mailboxTask; private readonly object _channelLock = new(); - public AgentWorker( - IHostApplicationLifetime hostApplicationLifetime, - IServiceProvider serviceProvider, - [FromKeyedServices("AgentTypes")] IEnumerable> configuredAgentTypes, - ILogger logger, - DistributedContextPropagator distributedContextPropagator) - { - _logger = logger; - _serviceProvider = serviceProvider; - _configuredAgentTypes = configuredAgentTypes; - _distributedContextPropagator = distributedContextPropagator; - _shutdownCts = CancellationTokenSource.CreateLinkedTokenSource(hostApplicationLifetime.ApplicationStopping); - } // this is the in-memory version - we just pass the message directly to the agent(s) that handle this type of event public async ValueTask PublishEventAsync(CloudEvent cloudEvent, CancellationToken cancellationToken = default) { @@ -54,7 +40,7 @@ public async ValueTask PublishEventAsync(CloudEvent cloudEvent, CancellationToke agent.ReceiveMessage(new Message { CloudEvent = cloudEvent }); } } - public async ValueTask SendRequestAsync(IAgentBase agent, RpcRequest request, CancellationToken cancellationToken = default) + public async ValueTask SendRequestAsync(Agent agent, RpcRequest request, CancellationToken cancellationToken = default) { var requestId = Guid.NewGuid().ToString(); _pendingClientRequests[requestId] = (agent, request.RequestId); @@ -190,14 +176,13 @@ public async Task StopAsync(CancellationToken cancellationToken) { } } - private IAgentBase GetOrActivateAgent(AgentId agentId) + private Agent GetOrActivateAgent(AgentId agentId) { if (!_agents.TryGetValue((agentId.Type, agentId.Key), out var agent)) { if (_agentTypes.TryGetValue(agentId.Type, out var agentType)) { - var context = new AgentRuntime(agentId, this, _serviceProvider.GetRequiredService>(), _distributedContextPropagator); - agent = (AgentBase)ActivatorUtilities.CreateInstance(_serviceProvider, agentType, context); + agent = (Agent)ActivatorUtilities.CreateInstance(_serviceProvider, agentType, this); _agents.TryAdd((agentId.Type, agentId.Key), agent); } else diff --git a/dotnet/src/Microsoft.AutoGen/Core/App.cs b/dotnet/src/Microsoft.AutoGen/Core/App.cs new file mode 100644 index 000000000000..f0850e29ed3a --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/Core/App.cs @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// App.cs +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using Google.Protobuf; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Hosting; + +namespace Microsoft.AutoGen.Core; + +public static class AgentsApp +{ + // need a variable to store the runtime instance + public static WebApplication? Host { get; private set; } + + [MemberNotNull(nameof(Host))] + public static async ValueTask StartAsync(WebApplicationBuilder? builder = null, AgentTypes? agentTypes = null) + { + builder ??= WebApplication.CreateBuilder(); + builder.Services.TryAddSingleton(DistributedContextPropagator.Current); + builder.AddAgentWorker() + .AddAgents(agentTypes); + builder.AddServiceDefaults(); + var app = builder.Build(); + + app.MapDefaultEndpoints(); + Host = app; + await app.StartAsync().ConfigureAwait(false); + return Host; + } + public static async ValueTask PublishMessageAsync( + string topic, + IMessage message, + WebApplicationBuilder? builder = null, + AgentTypes? agents = null, + bool local = false) + { + if (Host == null) + { + await StartAsync(builder, agents).ConfigureAwait(false); + } + var client = Host.Services.GetRequiredService() ?? throw new InvalidOperationException("Host not started"); + await client.PublishEventAsync(topic, message, new CancellationToken()).ConfigureAwait(true); + return Host; + } + public static async ValueTask ShutdownAsync() + { + if (Host == null) + { + throw new InvalidOperationException("Host not started"); + } + await Host.StopAsync().ConfigureAwait(true); + } + + private static IHostApplicationBuilder AddAgents(this IHostApplicationBuilder builder, AgentTypes? agentTypes) + { + agentTypes ??= AgentTypes.GetAgentTypesFromAssembly() + ?? throw new InvalidOperationException("No agent types found in the assembly"); + foreach (var type in agentTypes.Types) + { + builder.AddAgent(type.Key, type.Value); + } + return builder; + } +} diff --git a/dotnet/src/Microsoft.AutoGen/Core/Client.cs b/dotnet/src/Microsoft.AutoGen/Core/Client.cs new file mode 100644 index 000000000000..1d523005fedf --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/Core/Client.cs @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Client.cs +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AutoGen.Core; +public sealed class Client(IAgentWorker worker, [FromKeyedServices("EventTypes")] EventTypes eventTypes) + : Agent(worker, eventTypes) +{ +} diff --git a/dotnet/src/Microsoft.AutoGen/Core/EventTypes.cs b/dotnet/src/Microsoft.AutoGen/Core/EventTypes.cs new file mode 100644 index 000000000000..7b99f4ef8f87 --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/Core/EventTypes.cs @@ -0,0 +1,11 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// EventTypes.cs +using Google.Protobuf.Reflection; + +namespace Microsoft.AutoGen.Core; +public sealed class EventTypes(TypeRegistry typeRegistry, Dictionary types, Dictionary> eventsMap) +{ + public TypeRegistry TypeRegistry { get; } = typeRegistry; + public Dictionary Types { get; } = types; + public Dictionary> EventsMap { get; } = eventsMap; +} diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/HostBuilderExtensions.cs b/dotnet/src/Microsoft.AutoGen/Core/HostBuilderExtensions.cs similarity index 75% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/HostBuilderExtensions.cs rename to dotnet/src/Microsoft.AutoGen/Core/HostBuilderExtensions.cs index f21096ccfbdb..95d4d7ce7553 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/HostBuilderExtensions.cs +++ b/dotnet/src/Microsoft.AutoGen/Core/HostBuilderExtensions.cs @@ -6,19 +6,18 @@ using System.Reflection; using Google.Protobuf; using Google.Protobuf.Reflection; -using Microsoft.AutoGen.Abstractions; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Core; public static class HostBuilderExtensions { private const string _defaultAgentServiceAddress = "https://localhost:53071"; public static IHostApplicationBuilder AddAgent< - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TAgent>(this IHostApplicationBuilder builder, string typeName) where TAgent : AgentBase + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TAgent>(this IHostApplicationBuilder builder, string typeName) where TAgent : Agent { builder.Services.AddKeyedSingleton("AgentTypes", (sp, key) => Tuple.Create(typeName, typeof(TAgent))); @@ -31,20 +30,11 @@ public static IHostApplicationBuilder AddAgent(this IHostApplicationBuilder buil return builder; } - public static IHostApplicationBuilder AddAgentWorker(this IHostApplicationBuilder builder, string? agentServiceAddress = null, bool local = false) + public static IHostApplicationBuilder AddAgentWorker(this IHostApplicationBuilder builder, string? agentServiceAddress = null) { agentServiceAddress ??= builder.Configuration["AGENT_HOST"] ?? _defaultAgentServiceAddress; builder.Services.TryAddSingleton(DistributedContextPropagator.Current); - - // if !local, then add the gRPC client - if (!local) - { - builder.AddGrpcAgentWorker(agentServiceAddress); - } - else - { - builder.Services.AddSingleton(); - } + builder.Services.AddSingleton(); builder.Services.AddSingleton(sp => (IHostedService)sp.GetRequiredService()); builder.Services.AddKeyedSingleton("EventTypes", (sp, key) => { @@ -60,7 +50,7 @@ public static IHostApplicationBuilder AddAgentWorker(this IHostApplicationBuilde var eventsMap = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(assembly => assembly.GetTypes()) - .Where(type => ReflectionHelper.IsSubclassOfGeneric(type, typeof(AgentBase)) && !type.IsAbstract) + .Where(type => ReflectionHelper.IsSubclassOfGeneric(type, typeof(Agent)) && !type.IsAbstract) .Select(t => (t, t.GetInterfaces() .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IHandle<>)) .Select(i => (GetMessageDescriptor(i.GetGenericArguments().First())?.FullName ?? "")).ToHashSet())) @@ -68,7 +58,7 @@ public static IHostApplicationBuilder AddAgentWorker(this IHostApplicationBuilde // if the assembly contains any interfaces of type IHandler, then add all the methods of the interface to the eventsMap var handlersMap = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(assembly => assembly.GetTypes()) - .Where(type => ReflectionHelper.IsSubclassOfGeneric(type, typeof(AgentBase)) && !type.IsAbstract) + .Where(type => ReflectionHelper.IsSubclassOfGeneric(type, typeof(Agent)) && !type.IsAbstract) .Select(t => (t, t.GetMethods() .Where(m => m.Name == "Handle") .Select(m => (GetMessageDescriptor(m.GetParameters().First().ParameterType)?.FullName ?? "")).ToHashSet())) @@ -76,7 +66,7 @@ public static IHostApplicationBuilder AddAgentWorker(this IHostApplicationBuilde // get interfaces implemented by the agent and get the methods of the interface if they are named Handle var ifaceHandlersMap = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(assembly => assembly.GetTypes()) - .Where(type => ReflectionHelper.IsSubclassOfGeneric(type, typeof(AgentBase)) && !type.IsAbstract) + .Where(type => ReflectionHelper.IsSubclassOfGeneric(type, typeof(Agent)) && !type.IsAbstract) .Select(t => t.GetInterfaces() .Select(i => (t, i, i.GetMethods() .Where(m => m.Name == "Handle") @@ -125,51 +115,10 @@ public static IHostApplicationBuilder AddAgentWorker(this IHostApplicationBuilde return property?.GetValue(null) as MessageDescriptor; } } -public sealed class ReflectionHelper -{ - public static bool IsSubclassOfGeneric(Type type, Type genericBaseType) - { - while (type != null && type != typeof(object)) - { - if (genericBaseType == (type.IsGenericType ? type.GetGenericTypeDefinition() : type)) - { - return true; - } - if (type.BaseType == null) - { - return false; - } - type = type.BaseType; - } - return false; - } -} -public sealed class AgentTypes(Dictionary types) -{ - public Dictionary Types { get; } = types; - public static AgentTypes? GetAgentTypesFromAssembly() - { - var agents = AppDomain.CurrentDomain.GetAssemblies() - .SelectMany(assembly => assembly.GetTypes()) - .Where(type => ReflectionHelper.IsSubclassOfGeneric(type, typeof(AgentBase)) - && !type.IsAbstract - && !type.Name.Equals(nameof(Client))) - .ToDictionary(type => type.Name, type => type); - - return new AgentTypes(agents); - } -} -public sealed class EventTypes(TypeRegistry typeRegistry, Dictionary types, Dictionary> eventsMap) -{ - public TypeRegistry TypeRegistry { get; } = typeRegistry; - public Dictionary Types { get; } = types; - public Dictionary> EventsMap { get; } = eventsMap; -} - public sealed class AgentApplicationBuilder(IHostApplicationBuilder builder) { public AgentApplicationBuilder AddAgent< - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TAgent>(string typeName) where TAgent : AgentBase + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TAgent>(string typeName) where TAgent : Agent { builder.Services.AddKeyedSingleton("AgentTypes", (sp, key) => Tuple.Create(typeName, typeof(TAgent))); return this; diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/IAgentWorker.cs b/dotnet/src/Microsoft.AutoGen/Core/IAgentWorker.cs similarity index 76% rename from dotnet/src/Microsoft.AutoGen/Abstractions/IAgentWorker.cs rename to dotnet/src/Microsoft.AutoGen/Core/IAgentWorker.cs index adce9be60c9e..f26e30584ca6 100644 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/IAgentWorker.cs +++ b/dotnet/src/Microsoft.AutoGen/Core/IAgentWorker.cs @@ -1,12 +1,12 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // IAgentWorker.cs - -namespace Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; +namespace Microsoft.AutoGen.Core; public interface IAgentWorker { ValueTask PublishEventAsync(CloudEvent evt, CancellationToken cancellationToken = default); - ValueTask SendRequestAsync(IAgentBase agent, RpcRequest request, CancellationToken cancellationToken = default); + ValueTask SendRequestAsync(Agent agent, RpcRequest request, CancellationToken cancellationToken = default); ValueTask SendResponseAsync(RpcResponse response, CancellationToken cancellationToken = default); ValueTask SendMessageAsync(Message message, CancellationToken cancellationToken = default); ValueTask StoreAsync(AgentState value, CancellationToken cancellationToken = default); diff --git a/dotnet/src/Microsoft.AutoGen/Abstractions/IHandle.cs b/dotnet/src/Microsoft.AutoGen/Core/IHandle.cs similarity index 82% rename from dotnet/src/Microsoft.AutoGen/Abstractions/IHandle.cs rename to dotnet/src/Microsoft.AutoGen/Core/IHandle.cs index ff43852b14e5..025ea8a5149c 100644 --- a/dotnet/src/Microsoft.AutoGen/Abstractions/IHandle.cs +++ b/dotnet/src/Microsoft.AutoGen/Core/IHandle.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // IHandle.cs - -namespace Microsoft.AutoGen.Abstractions; - +namespace Microsoft.AutoGen.Core; public interface IHandle { Task HandleObject(object item); diff --git a/dotnet/src/Microsoft.AutoGen/Core/IHandleExtensions.cs b/dotnet/src/Microsoft.AutoGen/Core/IHandleExtensions.cs new file mode 100644 index 000000000000..44014a4abcca --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/Core/IHandleExtensions.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// IHandleExtensions.cs + +using System.Reflection; + +namespace Microsoft.AutoGen.Core; + +/// +/// Provides extension methods for types implementing the IHandle interface. +/// +public static class IHandleExtensions +{ + /// + /// Gets all the handler methods from the interfaces implemented by the specified type. + /// + /// The type to get the handler methods from. + /// An array of MethodInfo objects representing the handler methods. + public static MethodInfo[] GetHandlers(this Type type) + { + var handlers = type.GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IHandle<>)); + return handlers.SelectMany(h => h.GetMethods().Where(m => m.Name == "Handle")).ToArray(); + } + + /// + /// Gets a lookup table of handler methods from the interfaces implemented by the specified type. + /// + /// The type to get the handler methods from. + /// A dictionary where the key is the generic type and the value is the MethodInfo of the handler method. + public static Dictionary GetHandlersLookupTable(this Type type) + { + var handlers = type.GetHandlers(); + return handlers.ToDictionary(h => + { + var generic = h.DeclaringType!.GetGenericArguments(); + return generic[0]; + }); + } +} diff --git a/dotnet/src/Microsoft.AutoGen/Core/Microsoft.AutoGen.Core.csproj b/dotnet/src/Microsoft.AutoGen/Core/Microsoft.AutoGen.Core.csproj new file mode 100644 index 000000000000..0dc3cba17475 --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/Core/Microsoft.AutoGen.Core.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + diff --git a/dotnet/src/Microsoft.AutoGen/Core/ReflectionHelper.cs b/dotnet/src/Microsoft.AutoGen/Core/ReflectionHelper.cs new file mode 100644 index 000000000000..41b27ffee613 --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/Core/ReflectionHelper.cs @@ -0,0 +1,59 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// ReflectionHelper.cs +using System.Reflection; +using Google.Protobuf; +using Google.Protobuf.Reflection; + +namespace Microsoft.AutoGen.Core; +public sealed class ReflectionHelper +{ + public static bool IsSubclassOfGeneric(Type type, Type genericBaseType) + { + while (type != null && type != typeof(object)) + { + if (genericBaseType == (type.IsGenericType ? type.GetGenericTypeDefinition() : type)) + { + return true; + } + if (type.BaseType == null) + { + return false; + } + type = type.BaseType; + } + return false; + } + public static EventTypes GetAgentsMetadata(params Assembly[] assemblies) + { + var interfaceType = typeof(IMessage); + var pairs = assemblies + .SelectMany(assembly => assembly.GetTypes()) + .Where(type => interfaceType.IsAssignableFrom(type) && type.IsClass && !type.IsAbstract) + .Select(t => (t, GetMessageDescriptor(t))); + + var descriptors = pairs.Select(t => t.Item2); + var typeRegistry = TypeRegistry.FromMessages(descriptors); + var types = pairs.ToDictionary(item => item.Item2?.FullName ?? "", item => item.t); + + var eventsMap = assemblies + .SelectMany(assembly => assembly.GetTypes()) + .Where(type => IsSubclassOfGeneric(type, typeof(Agent)) && !type.IsAbstract) + .Select(t => (t, t.GetInterfaces() + .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IHandle<>)) + .Select(i => GetMessageDescriptor(i.GetGenericArguments().First())?.FullName ?? "").ToHashSet())) + .ToDictionary(item => item.t, item => item.Item2); + + return new EventTypes(typeRegistry, types, eventsMap); + } + + /// + /// Gets the message descriptor for the specified type. + /// + /// The type to get the message descriptor for. + /// The message descriptor if found; otherwise, null. + public static MessageDescriptor? GetMessageDescriptor(Type type) + { + var property = type.GetProperty("Descriptor", BindingFlags.Static | BindingFlags.Public); + return property?.GetValue(null) as MessageDescriptor; + } +} diff --git a/dotnet/src/Microsoft.AutoGen/Extensions/Aspire/AspireHostingExtensions.cs b/dotnet/src/Microsoft.AutoGen/Extensions/Aspire/AspireHostingExtensions.cs index 0e6781d740eb..c4588cd42337 100644 --- a/dotnet/src/Microsoft.AutoGen/Extensions/Aspire/AspireHostingExtensions.cs +++ b/dotnet/src/Microsoft.AutoGen/Extensions/Aspire/AspireHostingExtensions.cs @@ -17,7 +17,7 @@ namespace Microsoft.Extensions.Hosting; // To learn more about using this project, see https://aka.ms/dotnet/aspire/service-defaults public static class AspireHostingExtensions { - public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBuilder builder) + public static WebApplicationBuilder AddServiceDefaults(this WebApplicationBuilder builder) { builder.ConfigureOpenTelemetry(); diff --git a/dotnet/src/Microsoft.AutoGen/Extensions/SemanticKernel/Microsoft.AutoGen.Extensions.SemanticKernel.csproj b/dotnet/src/Microsoft.AutoGen/Extensions/SemanticKernel/Microsoft.AutoGen.Extensions.SemanticKernel.csproj index c4ac5536e70c..dc57a068ce52 100644 --- a/dotnet/src/Microsoft.AutoGen/Extensions/SemanticKernel/Microsoft.AutoGen.Extensions.SemanticKernel.csproj +++ b/dotnet/src/Microsoft.AutoGen/Extensions/SemanticKernel/Microsoft.AutoGen.Extensions.SemanticKernel.csproj @@ -16,7 +16,7 @@ - + diff --git a/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Microsoft.AutoGen.Runtime.Grpc.csproj b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Microsoft.AutoGen.Runtime.Grpc.csproj new file mode 100644 index 000000000000..27474cef7900 --- /dev/null +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Microsoft.AutoGen.Runtime.Grpc.csproj @@ -0,0 +1,31 @@ + + + net8.0 + enable + enable + + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/AgentWorkerHostingExtensions.cs b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/AgentWorkerHostingExtensions.cs similarity index 50% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/AgentWorkerHostingExtensions.cs rename to dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/AgentWorkerHostingExtensions.cs index 3736fc76cb61..bd2ecfa9a8a7 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/AgentWorkerHostingExtensions.cs +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/AgentWorkerHostingExtensions.cs @@ -7,31 +7,22 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; -namespace Microsoft.AutoGen.Agents; - +namespace Microsoft.AutoGen.Runtime.Grpc; public static class AgentWorkerHostingExtensions { - public static IHostApplicationBuilder AddAgentService(this IHostApplicationBuilder builder, bool local = false, bool useGrpc = true) + public static WebApplicationBuilder AddAgentService(this WebApplicationBuilder builder) { - builder.AddOrleans(local); + builder.AddOrleans(); builder.Services.TryAddSingleton(DistributedContextPropagator.Current); - if (useGrpc) - { - builder.Services.AddGrpc(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(sp => (IHostedService)sp.GetRequiredService()); - } + builder.Services.AddGrpc(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(sp => (IHostedService)sp.GetRequiredService()); return builder; } - public static IHostApplicationBuilder AddLocalAgentService(this IHostApplicationBuilder builder, bool useGrpc = true) - { - return builder.AddAgentService(local: true, useGrpc); - } - public static WebApplication MapAgentService(this WebApplication app, bool local = false, bool useGrpc = true) { if (useGrpc) { app.MapGrpcService(); } diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcGateway.cs b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Grpc/GrpcGateway.cs similarity index 99% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcGateway.cs rename to dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Grpc/GrpcGateway.cs index 9ba36410a30f..2d63ab0870ca 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcGateway.cs +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Grpc/GrpcGateway.cs @@ -3,11 +3,11 @@ using System.Collections.Concurrent; using Grpc.Core; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Runtime.Grpc; public sealed class GrpcGateway : BackgroundService, IGateway { diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcGatewayService.cs b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Grpc/GrpcGatewayService.cs similarity index 94% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcGatewayService.cs rename to dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Grpc/GrpcGatewayService.cs index e26f5c2bc9aa..ca4ffbb30c3e 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcGatewayService.cs +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Grpc/GrpcGatewayService.cs @@ -2,9 +2,9 @@ // GrpcGatewayService.cs using Grpc.Core; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Runtime.Grpc; // gRPC service which handles communication between the agent worker and the cluster. internal sealed class GrpcGatewayService : AgentRpc.AgentRpcBase diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcWorkerConnection.cs b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Grpc/GrpcWorkerConnection.cs similarity index 98% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcWorkerConnection.cs rename to dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Grpc/GrpcWorkerConnection.cs index f2eb81c43602..315cd81feb1c 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Grpc/GrpcWorkerConnection.cs +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Grpc/GrpcWorkerConnection.cs @@ -3,9 +3,9 @@ using System.Threading.Channels; using Grpc.Core; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Runtime.Grpc; internal sealed class GrpcWorkerConnection : IAsyncDisposable, IConnection { diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/IGateway.cs b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/IGateway.cs similarity index 84% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/IGateway.cs rename to dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/IGateway.cs index 539ec3eca435..463ae4e532af 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/IGateway.cs +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/IGateway.cs @@ -1,8 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // IGateway.cs -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Runtime.Grpc; public interface IGateway : IGrainObserver { diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/AgentStateGrain.cs b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/AgentStateGrain.cs similarity index 95% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/AgentStateGrain.cs rename to dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/AgentStateGrain.cs index 9905f6aebac6..9d46be929ea9 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/AgentStateGrain.cs +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/AgentStateGrain.cs @@ -1,9 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // AgentStateGrain.cs -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Runtime.Grpc; internal sealed class AgentStateGrain([PersistentState("state", "AgentStateStore")] IPersistentState state) : Grain, IAgentState { diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/IRegistryGrain.cs b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/IRegistryGrain.cs similarity index 86% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/IRegistryGrain.cs rename to dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/IRegistryGrain.cs index 87fd0aa38ce3..1c817add3074 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/IRegistryGrain.cs +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/IRegistryGrain.cs @@ -1,8 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // IRegistryGrain.cs -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Runtime.Grpc; public interface IRegistryGrain : IGrainWithIntegerKey { diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/ISubscriptionsGrain.cs b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/ISubscriptionsGrain.cs similarity index 89% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/ISubscriptionsGrain.cs rename to dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/ISubscriptionsGrain.cs index d3af459bb7ff..60c17b7c6597 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/ISubscriptionsGrain.cs +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/ISubscriptionsGrain.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // ISubscriptionsGrain.cs -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Runtime.Grpc; public interface ISubscriptionsGrain : IGrainWithIntegerKey { ValueTask SubscribeAsync(string agentType, string topic); diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/OrleansRuntimeHostingExtenions.cs b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/OrleansRuntimeHostingExtenions.cs similarity index 92% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/OrleansRuntimeHostingExtenions.cs rename to dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/OrleansRuntimeHostingExtenions.cs index 374e49f7a500..4b8a290df031 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/OrleansRuntimeHostingExtenions.cs +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/OrleansRuntimeHostingExtenions.cs @@ -9,16 +9,11 @@ using Orleans.Configuration; using Orleans.Serialization; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Runtime.Grpc; public static class OrleansRuntimeHostingExtenions { - public static WebApplicationBuilder AddOrleans(this WebApplicationBuilder builder, bool local = false) - { - return builder.AddOrleans(local); - } - - public static IHostApplicationBuilder AddOrleans(this IHostApplicationBuilder builder, bool local = false) + public static WebApplicationBuilder AddOrleans(this WebApplicationBuilder builder) { builder.Services.AddSerializer(serializer => serializer.AddProtobufSerializer()); builder.Services.AddSingleton(); @@ -28,7 +23,7 @@ public static IHostApplicationBuilder AddOrleans(this IHostApplicationBuilder bu builder.UseOrleans((siloBuilder) => { // Development mode or local mode uses in-memory storage and streams - if (builder.Environment.IsDevelopment() || local) + if (builder.Environment.IsDevelopment()) { siloBuilder.UseLocalhostClustering() .AddMemoryStreams("StreamProvider") diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/RegistryGrain.cs b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/RegistryGrain.cs similarity index 98% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/RegistryGrain.cs rename to dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/RegistryGrain.cs index cb7523126436..8de1618c6002 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/RegistryGrain.cs +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/RegistryGrain.cs @@ -1,9 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // RegistryGrain.cs -using Microsoft.AutoGen.Abstractions; +using Microsoft.AutoGen.Contracts; -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Runtime.Grpc; internal sealed class RegistryGrain : Grain, IRegistryGrain { diff --git a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/SubscriptionsGrain.cs b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/SubscriptionsGrain.cs similarity index 97% rename from dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/SubscriptionsGrain.cs rename to dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/SubscriptionsGrain.cs index 0e647dbab980..632cc7cefde8 100644 --- a/dotnet/src/Microsoft.AutoGen/Agents/Services/Orleans/SubscriptionsGrain.cs +++ b/dotnet/src/Microsoft.AutoGen/Runtime.Grpc/Services/Orleans/SubscriptionsGrain.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // SubscriptionsGrain.cs -namespace Microsoft.AutoGen.Agents; +namespace Microsoft.AutoGen.Runtime.Grpc; internal sealed class SubscriptionsGrain([PersistentState("state", "PubSubStore")] IPersistentState state) : Grain, ISubscriptionsGrain { diff --git a/dotnet/test/Microsoft.AutoGen.Agents.Tests/AgentBaseTests.cs b/dotnet/test/Microsoft.AutoGen.Agents.Tests/AgentTests.cs similarity index 74% rename from dotnet/test/Microsoft.AutoGen.Agents.Tests/AgentBaseTests.cs rename to dotnet/test/Microsoft.AutoGen.Agents.Tests/AgentTests.cs index 7e272ce6bed9..08a88da048de 100644 --- a/dotnet/test/Microsoft.AutoGen.Agents.Tests/AgentBaseTests.cs +++ b/dotnet/test/Microsoft.AutoGen.Agents.Tests/AgentTests.cs @@ -1,33 +1,30 @@ // Copyright (c) Microsoft Corporation. All rights reserved. -// AgentBaseTests.cs +// AgentTests.cs using System.Collections.Concurrent; using FluentAssertions; using Google.Protobuf.Reflection; -using Microsoft.AutoGen.Abstractions; +using Microsoft.AspNetCore.Builder; +using Microsoft.AutoGen.Contracts; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Moq; using Xunit; -using static Microsoft.AutoGen.Agents.Tests.AgentBaseTests; +using static Microsoft.AutoGen.Core.Tests.AgentTests; -namespace Microsoft.AutoGen.Agents.Tests; +namespace Microsoft.AutoGen.Core.Tests; [Collection(ClusterFixtureCollection.Name)] -public class AgentBaseTests(InMemoryAgentRuntimeFixture fixture) +public class AgentTests(InMemoryAgentRuntimeFixture fixture) { private readonly InMemoryAgentRuntimeFixture _fixture = fixture; [Fact] public async Task ItInvokeRightHandlerTestAsync() { - var mockContext = new Mock(); - mockContext.SetupGet(x => x.AgentId).Returns(new AgentId("test", "test")); - // mock SendMessageAsync - mockContext.Setup(x => x.SendMessageAsync(It.IsAny(), It.IsAny())) - .Returns(new ValueTask()); - var agent = new TestAgent(mockContext.Object, new EventTypes(TypeRegistry.Empty, [], []), new Logger(new LoggerFactory())); + var mockWorker = new Mock(); + var agent = new TestAgent(mockWorker.Object, new EventTypes(TypeRegistry.Empty, [], []), new Logger(new LoggerFactory())); await agent.HandleObject("hello world"); await agent.HandleObject(42); @@ -61,12 +58,12 @@ await client.PublishMessageAsync(new TextMessage() /// /// The test agent is a simple agent that is used for testing purposes. /// - public class TestAgent : AgentBase, IHandle, IHandle, IHandle + public class TestAgent : Agent, IHandle, IHandle, IHandle { public TestAgent( - IAgentRuntime context, + IAgentWorker worker, [FromKeyedServices("EventTypes")] EventTypes eventTypes, - Logger? logger = null) : base(context, eventTypes, logger) + Logger? logger = null) : base(worker, eventTypes, logger) { } @@ -102,13 +99,12 @@ public sealed class InMemoryAgentRuntimeFixture : IDisposable { public InMemoryAgentRuntimeFixture() { - var builder = Microsoft.Extensions.Hosting.Host.CreateApplicationBuilder(); + var builder = WebApplication.CreateBuilder(); // step 1: create in-memory agent runtime // step 2: register TestAgent to that agent runtime builder - .AddAgentService(local: true, useGrpc: false) - .AddAgentWorker(local: true) + .AddAgentWorker() .AddAgent(nameof(TestAgent)); AppHost = builder.Build(); diff --git a/dotnet/test/Microsoft.AutoGen.Agents.Tests/Microsoft.AutoGen.Agents.Tests.csproj b/dotnet/test/Microsoft.AutoGen.Agents.Tests/Microsoft.AutoGen.Agents.Tests.csproj index 4abf1dc834d6..29165739b635 100644 --- a/dotnet/test/Microsoft.AutoGen.Agents.Tests/Microsoft.AutoGen.Agents.Tests.csproj +++ b/dotnet/test/Microsoft.AutoGen.Agents.Tests/Microsoft.AutoGen.Agents.Tests.csproj @@ -8,7 +8,7 @@ - + diff --git a/dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/HelloAgent.AppHost.csproj b/dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/HelloAgent.AppHost.csproj new file mode 100644 index 000000000000..441d48d18cb5 --- /dev/null +++ b/dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/HelloAgent.AppHost.csproj @@ -0,0 +1,21 @@ + + + + + + Exe + net8.0 + enable + enable + true + + + + + + + + + + + diff --git a/dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/Program.cs b/dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/Program.cs new file mode 100644 index 000000000000..3234a7abab9f --- /dev/null +++ b/dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/Program.cs @@ -0,0 +1,10 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Program.cs + +using Microsoft.Extensions.Hosting; + +var appHost = DistributedApplication.CreateBuilder(); +appHost.AddProject("HelloAgentsDotNetInMemoryRuntime"); +var app = appHost.Build(); +await app.StartAsync(); +await app.WaitForShutdownAsync(); diff --git a/dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/Properties/launchSettings.json b/dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/Properties/launchSettings.json new file mode 100644 index 000000000000..ea78f2933fdb --- /dev/null +++ b/dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgent.AppHost/Properties/launchSettings.json @@ -0,0 +1,43 @@ +{ + "profiles": { + "https": { + "commandName": "Project", + "launchBrowser": true, + "dotnetRunMessages": true, + "applicationUrl": "https://localhost:15887;http://localhost:15888", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + //"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:16037", + "DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL": "https://localhost:16038", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:17037", + "DOTNET_ASPIRE_SHOW_DASHBOARD_RESOURCES": "true" + } + }, + "http": { + "commandName": "Project", + "launchBrowser": true, + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:15888", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + //"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:16031", + "DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL": "http://localhost:16032", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:17031", + "DOTNET_ASPIRE_SHOW_DASHBOARD_RESOURCES": "true", + "ASPIRE_ALLOW_UNSECURED_TRANSPORT": "true" + } + }, + "generate-manifest": { + "commandName": "Project", + "dotnetRunMessages": true, + "commandLineArgs": "--publisher manifest --output-path aspire-manifest.json", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development" + } + } + }, + "$schema": "https://json.schemastore.org/launchsettings.json" +} diff --git a/dotnet/test/Microsoft.AutoGen.Integration.Tests/HelloAppHostIntegrationTests.cs b/dotnet/test/Microsoft.AutoGen.Integration.Tests/HelloAppHostIntegrationTests.cs new file mode 100644 index 000000000000..ba83b07f72df --- /dev/null +++ b/dotnet/test/Microsoft.AutoGen.Integration.Tests/HelloAppHostIntegrationTests.cs @@ -0,0 +1,120 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// HelloAppHostIntegrationTests.cs + +using System.Text.Json; +using Xunit.Abstractions; + +namespace Microsoft.AutoGen.Integration.Tests; + +public class HelloAppHostIntegrationTests(ITestOutputHelper testOutput) +{ + [Theory, Trait("type", "integration")] + [MemberData(nameof(AppHostAssemblies))] + public async Task AppHostRunsCleanly(string appHostPath) + { + var appHost = await DistributedApplicationTestFactory.CreateAsync(appHostPath, testOutput); + await using var app = await appHost.BuildAsync().WaitAsync(TimeSpan.FromSeconds(15)); + + await app.StartAsync().WaitAsync(TimeSpan.FromSeconds(120)); + await app.WaitForResourcesAsync().WaitAsync(TimeSpan.FromSeconds(120)); + + app.EnsureNoErrorsLogged(); + await app.StopAsync().WaitAsync(TimeSpan.FromSeconds(15)); + } + + [Theory, Trait("type", "integration")] + [MemberData(nameof(TestEndpoints))] + public async Task AppHostLogsHelloAgentE2E(TestEndpoints testEndpoints) + { + var appHostName = testEndpoints.AppHost!; + var appHostPath = $"{appHostName}.dll"; + var appHost = await DistributedApplicationTestFactory.CreateAsync(appHostPath, testOutput); + await using var app = await appHost.BuildAsync().WaitAsync(TimeSpan.FromSeconds(15)); + + await app.StartAsync().WaitAsync(TimeSpan.FromSeconds(120)); + await app.WaitForResourcesAsync().WaitAsync(TimeSpan.FromSeconds(120)); + if (testEndpoints.WaitForResources?.Count > 0) + { + // Wait until each resource transitions to the required state + var timeout = TimeSpan.FromMinutes(5); + foreach (var (ResourceName, TargetState) in testEndpoints.WaitForResources) + { + await app.WaitForResource(ResourceName, TargetState).WaitAsync(timeout); + } + } + //sleep to make sure the app is running + await Task.Delay(20000); + app.EnsureNoErrorsLogged(); + app.EnsureLogContains("HelloAgent said Goodbye"); + app.EnsureLogContains("Wild Hello from Python!"); + + await app.StopAsync().WaitAsync(TimeSpan.FromSeconds(15)); + } + public static TheoryData AppHostAssemblies() + { + var appHostAssemblies = GetSamplesAppHostAssemblyPaths(); + var theoryData = new TheoryData(); + return new(appHostAssemblies.Select(p => Path.GetRelativePath(AppContext.BaseDirectory, p))); + } + + public static TheoryData TestEndpoints() => + new([ + new TestEndpoints("Hello.AppHost", new() { + { "backend", ["/"] } + }), + ]); + + private static IEnumerable GetSamplesAppHostAssemblyPaths() + { + // All the AppHost projects are referenced by this project so we can find them by looking for all their assemblies in the base directory + return Directory.GetFiles(AppContext.BaseDirectory, "*.AppHost.dll") + .Where(fileName => !fileName.EndsWith("Aspire.Hosting.AppHost.dll", StringComparison.OrdinalIgnoreCase)); + } +} + +public class TestEndpoints : IXunitSerializable +{ + // Required for deserialization + public TestEndpoints() { } + + public TestEndpoints(string appHost, Dictionary> resourceEndpoints) + { + AppHost = appHost; + ResourceEndpoints = resourceEndpoints; + } + + public string? AppHost { get; set; } + + public List? WaitForResources { get; set; } + + public Dictionary>? ResourceEndpoints { get; set; } + + public void Deserialize(IXunitSerializationInfo info) + { + AppHost = info.GetValue(nameof(AppHost)); + WaitForResources = JsonSerializer.Deserialize>(info.GetValue(nameof(WaitForResources))); + ResourceEndpoints = JsonSerializer.Deserialize>>(info.GetValue(nameof(ResourceEndpoints))); + } + + public void Serialize(IXunitSerializationInfo info) + { + info.AddValue(nameof(AppHost), AppHost); + info.AddValue(nameof(WaitForResources), JsonSerializer.Serialize(WaitForResources)); + info.AddValue(nameof(ResourceEndpoints), JsonSerializer.Serialize(ResourceEndpoints)); + } + + public override string? ToString() => $"{AppHost} ({ResourceEndpoints?.Count ?? 0} resources)"; + + public class ResourceWait(string resourceName, string targetState) + { + public string ResourceName { get; } = resourceName; + + public string TargetState { get; } = targetState; + + public void Deconstruct(out string resourceName, out string targetState) + { + resourceName = ResourceName; + targetState = TargetState; + } + } +} diff --git a/dotnet/test/Microsoft.AutoGen.Integration.Tests/InMemoryRuntimeIntegrationTests.cs b/dotnet/test/Microsoft.AutoGen.Integration.Tests/InMemoryRuntimeIntegrationTests.cs new file mode 100644 index 000000000000..b6bdd9eb72d9 --- /dev/null +++ b/dotnet/test/Microsoft.AutoGen.Integration.Tests/InMemoryRuntimeIntegrationTests.cs @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// InMemoryRuntimeIntegrationTests.cs +using Xunit.Abstractions; + +namespace Microsoft.AutoGen.Integration.Tests; + +public class InMemoryRuntimeIntegrationTests(ITestOutputHelper testOutput) +{ + + [Theory, Trait("type", "integration")] + [MemberData(nameof(AppHostAssemblies))] + public async Task HelloAgentsE2EInMemory(string appHostAssemblyPath) + { + var appHost = await DistributedApplicationTestFactory.CreateAsync(appHostAssemblyPath, testOutput); + await using var app = await appHost.BuildAsync().WaitAsync(TimeSpan.FromSeconds(15)); + + await app.StartAsync().WaitAsync(TimeSpan.FromSeconds(120)); + await app.WaitForResourcesAsync().WaitAsync(TimeSpan.FromSeconds(120)); + + await app.StartAsync().WaitAsync(TimeSpan.FromSeconds(120)); + await app.WaitForResourcesAsync().WaitAsync(TimeSpan.FromSeconds(120)); + + //sleep 5 seconds to make sure the app is running + await Task.Delay(15000); + app.EnsureNoErrorsLogged(); + app.EnsureLogContains("Hello World"); + app.EnsureLogContains("HelloAgent said Goodbye"); + + await app.StopAsync().WaitAsync(TimeSpan.FromSeconds(15)); + } + public static TheoryData AppHostAssemblies() + { + var appHostAssemblies = GetSamplesAppHostAssemblyPaths(); + var theoryData = new TheoryData(); + return new(appHostAssemblies.Select(p => Path.GetRelativePath(AppContext.BaseDirectory, p))); + } + private static IEnumerable GetSamplesAppHostAssemblyPaths() + { + // All the AppHost projects are referenced by this project so we can find them by looking for all their assemblies in the base directory + return Directory.GetFiles(AppContext.BaseDirectory, "HelloAgent.AppHost.dll") + .Where(fileName => !fileName.EndsWith("Aspire.Hosting.AppHost.dll", StringComparison.OrdinalIgnoreCase)); + } +} diff --git a/dotnet/test/Microsoft.AutoGen.Integration.Tests/Infrastructure/DistributedApplicationExtension.cs b/dotnet/test/Microsoft.AutoGen.Integration.Tests/Infrastructure/DistributedApplicationExtension.cs new file mode 100644 index 000000000000..e3ad24f9f962 --- /dev/null +++ b/dotnet/test/Microsoft.AutoGen.Integration.Tests/Infrastructure/DistributedApplicationExtension.cs @@ -0,0 +1,301 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// DistributedApplicationExtension.cs + +using System.Security.Cryptography; +using Aspire.Hosting; +using Aspire.Hosting.Python; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Testing; + +namespace Microsoft.AutoGen.Integration.Tests; + +public static partial class DistributedApplicationExtensions +{ + /* /// + /// Ensures all parameters in the application configuration have values set. + /// + public static TBuilder WithRandomParameterValues(this TBuilder builder) + where TBuilder : IDistributedApplicationTestingBuilder + { + var parameters = builder.Resources.OfType().Where(p => !p.IsConnectionString).ToList(); + foreach (var parameter in parameters) + { + builder.Configuration[$"Parameters:{parameter.Name}"] = parameter.Secret + ? PasswordGenerator.Generate(16, true, true, true, false, 1, 1, 1, 0) + : Convert.ToHexString(RandomNumberGenerator.GetBytes(4)); + } + + return builder; + } */ + + /// + /// Sets the container lifetime for all container resources in the application. + /// + public static TBuilder WithContainersLifetime(this TBuilder builder, ContainerLifetime containerLifetime) + where TBuilder : IDistributedApplicationTestingBuilder + { + var containerLifetimeAnnotations = builder.Resources.SelectMany(r => r.Annotations + .OfType() + .Where(c => c.Lifetime != containerLifetime)) + .ToList(); + + foreach (var annotation in containerLifetimeAnnotations) + { + annotation.Lifetime = containerLifetime; + } + + return builder; + } + + /// + /// Replaces all named volumes with anonymous volumes so they're isolated across test runs and from the volume the app uses during development. + /// + /// + /// Note that if multiple resources share a volume, the volume will instead be given a random name so that it's still shared across those resources in the test run. + /// + public static TBuilder WithRandomVolumeNames(this TBuilder builder) + where TBuilder : IDistributedApplicationTestingBuilder + { + // Named volumes that aren't shared across resources should be replaced with anonymous volumes. + // Named volumes shared by mulitple resources need to have their name randomized but kept shared across those resources. + + // Find all shared volumes and make a map of their original name to a new randomized name + var allResourceNamedVolumes = builder.Resources.SelectMany(r => r.Annotations + .OfType() + .Where(m => m.Type == ContainerMountType.Volume && !string.IsNullOrEmpty(m.Source)) + .Select(m => (Resource: r, Volume: m))) + .ToList(); + var seenVolumes = new HashSet(); + var renamedVolumes = new Dictionary(); + foreach (var resourceVolume in allResourceNamedVolumes) + { + var name = resourceVolume.Volume.Source!; + if (!seenVolumes.Add(name) && !renamedVolumes.ContainsKey(name)) + { + renamedVolumes[name] = $"{name}-{Convert.ToHexString(RandomNumberGenerator.GetBytes(4))}"; + } + } + + // Replace all named volumes with randomly named or anonymous volumes + foreach (var resourceVolume in allResourceNamedVolumes) + { + var resource = resourceVolume.Resource; + var volume = resourceVolume.Volume; + var newName = renamedVolumes.TryGetValue(volume.Source!, out var randomName) ? randomName : null; + var newMount = new ContainerMountAnnotation(newName, volume.Target, ContainerMountType.Volume, volume.IsReadOnly); + resource.Annotations.Remove(volume); + resource.Annotations.Add(newMount); + } + + return builder; + } + + /// + /// Waits for the specified resource to reach the specified state. + /// + public static Task WaitForResource(this DistributedApplication app, string resourceName, string? targetState = null, CancellationToken cancellationToken = default) + { + targetState ??= KnownResourceStates.Running; + var resourceNotificationService = app.Services.GetRequiredService(); + + return resourceNotificationService.WaitForResourceAsync(resourceName, targetState, cancellationToken); + } + + /// + /// Waits for all resources in the application to reach one of the specified states. + /// + /// + /// If is null, the default states are and . + /// + public static async Task WaitForResourcesAsync(this DistributedApplication app, IEnumerable? targetStates = null, CancellationToken cancellationToken = default) + { + var logger = app.Services.GetRequiredService().CreateLogger(nameof(WaitForResourcesAsync)); + + targetStates ??= [KnownResourceStates.Running, KnownResourceStates.Hidden, .. KnownResourceStates.TerminalStates]; + var applicationModel = app.Services.GetRequiredService(); + var resourceNotificationService = app.Services.GetRequiredService(); + + var resourceTasks = new Dictionary>(); + + foreach (var resource in applicationModel.Resources) + { + resourceTasks[resource.Name] = GetResourceWaitTask(resource.Name, targetStates, cancellationToken); + } + + logger.LogInformation("Waiting for resources [{Resources}] to reach one of target states [{TargetStates}].", + string.Join(',', resourceTasks.Keys), + string.Join(',', targetStates)); + + while (resourceTasks.Count > 0) + { + var completedTask = await Task.WhenAny(resourceTasks.Values); + var (completedResourceName, targetStateReached) = await completedTask; + + if (targetStateReached == KnownResourceStates.FailedToStart) + { + throw new DistributedApplicationException($"Resource '{completedResourceName}' failed to start."); + } + + resourceTasks.Remove(completedResourceName); + + logger.LogInformation("Wait for resource '{ResourceName}' completed with state '{ResourceState}'", completedResourceName, targetStateReached); + + // Ensure resources being waited on still exist + var remainingResources = resourceTasks.Keys.ToList(); + for (var i = remainingResources.Count - 1; i > 0; i--) + { + var name = remainingResources[i]; + if (!applicationModel.Resources.Any(r => r.Name == name)) + { + logger.LogInformation("Resource '{ResourceName}' was deleted while waiting for it.", name); + resourceTasks.Remove(name); + remainingResources.RemoveAt(i); + } + } + + if (resourceTasks.Count > 0) + { + logger.LogInformation("Still waiting for resources [{Resources}] to reach one of target states [{TargetStates}].", + string.Join(',', remainingResources), + string.Join(',', targetStates)); + } + } + + logger.LogInformation("Wait for all resources completed successfully!"); + + async Task<(string Name, string State)> GetResourceWaitTask(string resourceName, IEnumerable targetStates, CancellationToken cancellationToken) + { + var state = await resourceNotificationService.WaitForResourceAsync(resourceName, targetStates, cancellationToken); + return (resourceName, state); + } + } + + /// + /// Gets the app host and resource logs from the application. + /// + public static (IReadOnlyList AppHostLogs, IReadOnlyList ResourceLogs) GetLogs(this DistributedApplication app) + { + var environment = app.Services.GetRequiredService(); + var logCollector = app.Services.GetFakeLogCollector(); + var logs = logCollector.GetSnapshot(); + var appHostLogs = logs.Where(l => l.Category?.StartsWith($"{environment.ApplicationName}.Resources") == false).ToList(); + var resourceLogs = logs.Where(l => l.Category?.StartsWith($"{environment.ApplicationName}.Resources") == true).ToList(); + + return (appHostLogs, resourceLogs); + } + + /// + /// Get all logs from the whole test run. + /// + /// + /// List + public static IReadOnlyList GetAllLogs(this DistributedApplication app) + { + var logCollector = app.Services.GetFakeLogCollector(); + return logCollector.GetSnapshot(); + } + + /// + /// Asserts that no errors were logged by the application or any of its resources. + /// + /// + /// Some resource types are excluded from this check because they tend to write to stderr for various non-error reasons. + /// + /// + public static void EnsureNoErrorsLogged(this DistributedApplication app) + { + var environment = app.Services.GetRequiredService(); + var applicationModel = app.Services.GetRequiredService(); + var assertableResourceLogNames = applicationModel.Resources.Where(ShouldAssertErrorsForResource).Select(r => $"{environment.ApplicationName}.Resources.{r.Name}").ToList(); + + var (appHostlogs, resourceLogs) = app.GetLogs(); + + Assert.DoesNotContain(appHostlogs, log => log.Level >= LogLevel.Error); + Assert.DoesNotContain(resourceLogs, log => log.Category is { Length: > 0 } category && assertableResourceLogNames.Contains(category) && log.Level >= LogLevel.Error); + + static bool ShouldAssertErrorsForResource(IResource resource) + { +#pragma warning disable ASPIREHOSTINGPYTHON001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + return resource + is + // Container resources tend to write to stderr for various reasons so only assert projects and executables + (ProjectResource or ExecutableResource) + // Node & Python resources tend to have modules that write to stderr so ignore them + and not (PythonAppResource) + // Dapr resources write to stderr about deprecated --components-path flag + && !resource.Name.EndsWith("-dapr-cli"); +#pragma warning restore ASPIREHOSTINGPYTHON001 + } + } + + /// + /// Asserts that the application and resource logs contain the specified message. + /// + /// + /// + public static void EnsureLogContains(this DistributedApplication app, string message) + { + var resourceLogs = app.GetAllLogs(); + Assert.Contains(resourceLogs, log => log.Message.Contains(message)); + } + + /// + /// Creates an configured to communicate with the specified resource. + /// + public static HttpClient CreateHttpClient(this DistributedApplication app, string resourceName, bool useHttpClientFactory) + => app.CreateHttpClient(resourceName, null, useHttpClientFactory); + + /// + /// Creates an configured to communicate with the specified resource. + /// + public static HttpClient CreateHttpClient(this DistributedApplication app, string resourceName, string? endpointName, bool useHttpClientFactory) + { + if (useHttpClientFactory) + { + return app.CreateHttpClient(resourceName, endpointName); + } + + // Don't use the HttpClientFactory to create the HttpClient so, e.g., no resilience policies are applied + var httpClient = new HttpClient + { + BaseAddress = app.GetEndpoint(resourceName, endpointName) + }; + + return httpClient; + } + + /// + /// Creates an configured to communicate with the specified resource with custom configuration. + /// + public static HttpClient CreateHttpClient(this DistributedApplication app, string resourceName, string? endpointName, Action configure) + { + var services = new ServiceCollection() + .AddHttpClient() + .ConfigureHttpClientDefaults(configure) + .BuildServiceProvider(); + var httpClientFactory = services.GetRequiredService(); + + var httpClient = httpClientFactory.CreateClient(); + httpClient.BaseAddress = app.GetEndpoint(resourceName, endpointName); + + return httpClient; + } + + private static bool DerivesFromDbContext(Type type) + { + var baseType = type.BaseType; + + while (baseType is not null) + { + if (baseType.FullName == "Microsoft.EntityFrameworkCore.DbContext" && baseType.Assembly.GetName().Name == "Microsoft.EntityFrameworkCore") + { + return true; + } + + baseType = baseType.BaseType; + } + + return false; + } +} diff --git a/dotnet/test/Microsoft.AutoGen.Integration.Tests/Infrastructure/DistributedApplicationTestFactory.cs b/dotnet/test/Microsoft.AutoGen.Integration.Tests/Infrastructure/DistributedApplicationTestFactory.cs new file mode 100644 index 000000000000..8cd09e5c8f6d --- /dev/null +++ b/dotnet/test/Microsoft.AutoGen.Integration.Tests/Infrastructure/DistributedApplicationTestFactory.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// DistributedApplicationTestFactory.cs + +using System.Reflection; +using Microsoft.Extensions.Logging; +using Xunit.Abstractions; + +namespace Microsoft.AutoGen.Integration.Tests; + +internal static class DistributedApplicationTestFactory +{ + /// + /// Creates an for the specified app host assembly. + /// + public static async Task CreateAsync(string appHostAssemblyPath, ITestOutputHelper? testOutput) + { + var appHostProjectName = Path.GetFileNameWithoutExtension(appHostAssemblyPath) ?? throw new InvalidOperationException("AppHost assembly was not found."); + + var appHostAssembly = Assembly.LoadFrom(Path.Combine(AppContext.BaseDirectory, appHostAssemblyPath)); + + var appHostType = appHostAssembly.GetTypes().FirstOrDefault(t => t.Name.EndsWith("_AppHost")) + ?? throw new InvalidOperationException("Generated AppHost type not found."); + + var builder = await DistributedApplicationTestingBuilder.CreateAsync(appHostType); + + //builder.WithRandomParameterValues(); + builder.WithRandomVolumeNames(); + builder.WithContainersLifetime(ContainerLifetime.Session); + + builder.Services.AddLogging(logging => + { + logging.ClearProviders(); + logging.AddSimpleConsole(); + logging.AddFakeLogging(); + if (testOutput is not null) + { + logging.AddXUnit(testOutput); + } + logging.SetMinimumLevel(LogLevel.Trace); + logging.AddFilter("Aspire", LogLevel.Trace); + logging.AddFilter(builder.Environment.ApplicationName, LogLevel.Trace); + }); + + return builder; + } +} diff --git a/dotnet/test/Microsoft.AutoGen.Integration.Tests/Microsoft.AutoGen.Integration.Tests.csproj b/dotnet/test/Microsoft.AutoGen.Integration.Tests/Microsoft.AutoGen.Integration.Tests.csproj new file mode 100644 index 000000000000..2ef1763c3db5 --- /dev/null +++ b/dotnet/test/Microsoft.AutoGen.Integration.Tests/Microsoft.AutoGen.Integration.Tests.csproj @@ -0,0 +1,54 @@ + + + + net8.0 + enable + enable + false + true + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + + + + + + + + + + + .venv + $(RepoRoot)..\python + + + + + + $(PythonVenvRoot)\$(PythonVirtualEnvironmentName)\ + True + + + + + + + + diff --git a/protos/agent_events.proto b/protos/agent_events.proto index 5fd88bf8c441..a97df6e5855f 100644 --- a/protos/agent_events.proto +++ b/protos/agent_events.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package agents; -option csharp_namespace = "Microsoft.AutoGen.Abstractions"; +option csharp_namespace = "Microsoft.AutoGen.Contracts"; message TextMessage { string textMessage = 1; string source = 2; diff --git a/protos/agent_states.proto b/protos/agent_states.proto index 5a51c0c8c9db..945772861cc8 100644 --- a/protos/agent_states.proto +++ b/protos/agent_states.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package agents; -option csharp_namespace = "Microsoft.AutoGen.Abstractions"; +option csharp_namespace = "Microsoft.AutoGen.Contracts"; message AgentState { string message = 1; diff --git a/protos/agent_worker.proto b/protos/agent_worker.proto index 4d346dfecd63..7e658699b47e 100644 --- a/protos/agent_worker.proto +++ b/protos/agent_worker.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package agents; -option csharp_namespace = "Microsoft.AutoGen.Abstractions"; +option csharp_namespace = "Microsoft.AutoGen.Contracts"; import "cloudevent.proto"; import "google/protobuf/any.proto"; @@ -117,7 +117,7 @@ message Message { oneof message { RpcRequest request = 1; RpcResponse response = 2; - cloudevent.CloudEvent cloudEvent = 3; + io.cloudevents.v1.CloudEvent cloudEvent = 3; RegisterAgentTypeRequest registerAgentTypeRequest = 4; RegisterAgentTypeResponse registerAgentTypeResponse = 5; AddSubscriptionRequest addSubscriptionRequest = 6; diff --git a/protos/cloudevent.proto b/protos/cloudevent.proto index 0cd2ea85daec..cde68befb287 100644 --- a/protos/cloudevent.proto +++ b/protos/cloudevent.proto @@ -1,11 +1,21 @@ +// https://github.com/cloudevents/spec/blob/main/cloudevents/formats/cloudevents.proto + +/** + * CloudEvent Protobuf Format + * + * - Required context attributes are explicitly represented. + * - Optional and Extension context attributes are carried in a map structure. + * - Data may be represented as binary, text, or protobuf messages. + */ + syntax = "proto3"; -package cloudevent; +package io.cloudevents.v1; import "google/protobuf/any.proto"; import "google/protobuf/timestamp.proto"; -option csharp_namespace = "Microsoft.AutoGen.Abstractions"; +option csharp_namespace = "Microsoft.AutoGen.Contracts"; message CloudEvent { @@ -20,12 +30,12 @@ message CloudEvent { // Optional & Extension Attributes map attributes = 5; - map metadata = 6; + // -- CloudEvent Data (Bytes, Text, or Proto) oneof data { - bytes binary_data = 7; - string text_data = 8; - google.protobuf.Any proto_data = 9; + bytes binary_data = 6; + string text_data = 7; + google.protobuf.Any proto_data = 8; } /** @@ -45,4 +55,4 @@ message CloudEvent { google.protobuf.Timestamp ce_timestamp = 7; } } -} \ No newline at end of file +} diff --git a/python/README.md b/python/README.md index f4e5d4cf5618..24cb7e796334 100644 --- a/python/README.md +++ b/python/README.md @@ -1,7 +1,7 @@ # AutoGen Python packages [![0.4 Docs](https://img.shields.io/badge/Docs-0.4-blue)](https://microsoft.github.io/autogen/dev/) -[![PyPi autogen-core](https://img.shields.io/badge/PyPi-autogen--core-blue?logo=pypi)](https://pypi.org/project/autogen-core/0.4.0.dev9/) [![PyPi autogen-agentchat](https://img.shields.io/badge/PyPi-autogen--agentchat-blue?logo=pypi)](https://pypi.org/project/autogen-agentchat/0.4.0.dev9/) [![PyPi autogen-ext](https://img.shields.io/badge/PyPi-autogen--ext-blue?logo=pypi)](https://pypi.org/project/autogen-ext/0.4.0.dev9/) +[![PyPi autogen-core](https://img.shields.io/badge/PyPi-autogen--core-blue?logo=pypi)](https://pypi.org/project/autogen-core/0.4.0.dev11/) [![PyPi autogen-agentchat](https://img.shields.io/badge/PyPi-autogen--agentchat-blue?logo=pypi)](https://pypi.org/project/autogen-agentchat/0.4.0.dev11/) [![PyPi autogen-ext](https://img.shields.io/badge/PyPi-autogen--ext-blue?logo=pypi)](https://pypi.org/project/autogen-ext/0.4.0.dev11/) This directory works as a single `uv` workspace containing all project packages. See [`packages`](./packages/) to discover all project packages. diff --git a/python/packages/agbench/benchmarks/AssistantBench/Templates/MagenticOne/scenario.py b/python/packages/agbench/benchmarks/AssistantBench/Templates/MagenticOne/scenario.py index 51654d1ca6d6..9a6ecc9b6a3e 100644 --- a/python/packages/agbench/benchmarks/AssistantBench/Templates/MagenticOne/scenario.py +++ b/python/packages/agbench/benchmarks/AssistantBench/Templates/MagenticOne/scenario.py @@ -11,14 +11,14 @@ from autogen_core import AgentId, AgentProxy, TopicId from autogen_core import SingleThreadedAgentRuntime from autogen_core.logging import EVENT_LOGGER_NAME -from autogen_core.components.models import ( +from autogen_core.models import ( ChatCompletionClient, UserMessage, LLMMessage, ) from autogen_core import DefaultSubscription, DefaultTopicId from autogen_ext.code_executors.local import LocalCommandLineCodeExecutor -from autogen_core.components.models import AssistantMessage +from autogen_core.models import AssistantMessage from autogen_magentic_one.markdown_browser import MarkdownConverter, UnsupportedFormatException from autogen_magentic_one.agents.coder import Coder, Executor diff --git a/python/packages/agbench/benchmarks/GAIA/Templates/MagenticOne/scenario.py b/python/packages/agbench/benchmarks/GAIA/Templates/MagenticOne/scenario.py index 4db96cddfe50..5e5b677e4b54 100644 --- a/python/packages/agbench/benchmarks/GAIA/Templates/MagenticOne/scenario.py +++ b/python/packages/agbench/benchmarks/GAIA/Templates/MagenticOne/scenario.py @@ -11,7 +11,7 @@ from autogen_core import AgentId, AgentProxy, TopicId from autogen_core import SingleThreadedAgentRuntime from autogen_core import EVENT_LOGGER_NAME -from autogen_core.components.models import ( +from autogen_core.models import ( ChatCompletionClient, ModelCapabilities, UserMessage, @@ -19,7 +19,7 @@ ) from autogen_core import DefaultSubscription, DefaultTopicId from autogen_ext.code_executors.local import LocalCommandLineCodeExecutor -from autogen_core.components.models import AssistantMessage +from autogen_core.models import AssistantMessage from autogen_magentic_one.markdown_browser import MarkdownConverter, UnsupportedFormatException from autogen_magentic_one.agents.coder import Coder, Executor diff --git a/python/packages/agbench/benchmarks/HumanEval/Templates/MagenticOne/scenario.py b/python/packages/agbench/benchmarks/HumanEval/Templates/MagenticOne/scenario.py index 3ea885b3f8de..c57971ea69e1 100644 --- a/python/packages/agbench/benchmarks/HumanEval/Templates/MagenticOne/scenario.py +++ b/python/packages/agbench/benchmarks/HumanEval/Templates/MagenticOne/scenario.py @@ -6,7 +6,7 @@ from autogen_core import EVENT_LOGGER_NAME from autogen_core import DefaultSubscription, DefaultTopicId from autogen_ext.code_executors.local import LocalCommandLineCodeExecutor -from autogen_core.components.models import ( +from autogen_core.models import ( UserMessage, ) diff --git a/python/packages/agbench/benchmarks/WebArena/Templates/MagenticOne/scenario.py b/python/packages/agbench/benchmarks/WebArena/Templates/MagenticOne/scenario.py index ea102786f9a8..ab387ce598b6 100644 --- a/python/packages/agbench/benchmarks/WebArena/Templates/MagenticOne/scenario.py +++ b/python/packages/agbench/benchmarks/WebArena/Templates/MagenticOne/scenario.py @@ -12,7 +12,7 @@ from autogen_core import EVENT_LOGGER_NAME from autogen_core import DefaultSubscription, DefaultTopicId from autogen_ext.code_executors.local import LocalCommandLineCodeExecutor -from autogen_core.components.models import ( +from autogen_core.models import ( ChatCompletionClient, UserMessage, SystemMessage, diff --git a/python/packages/autogen-agentchat/pyproject.toml b/python/packages/autogen-agentchat/pyproject.toml index b977a7fa2640..5f11afc07751 100644 --- a/python/packages/autogen-agentchat/pyproject.toml +++ b/python/packages/autogen-agentchat/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "autogen-agentchat" -version = "0.4.0.dev9" +version = "0.4.0.dev11" license = {file = "LICENSE-CODE"} description = "AutoGen agents and teams library" readme = "README.md" @@ -15,7 +15,7 @@ classifiers = [ "Operating System :: OS Independent", ] dependencies = [ - "autogen-core==0.4.0.dev9", + "autogen-core==0.4.0.dev11", ] [tool.uv] diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/__init__.py b/python/packages/autogen-agentchat/src/autogen_agentchat/__init__.py index 8a56318cc21d..c5bdfc2b51cb 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/__init__.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/__init__.py @@ -1,3 +1,8 @@ +""" +This module provides the main entry point for the autogen_agentchat package. +It includes logger names for trace and event logs, and retrieves the package version. +""" + import importlib.metadata TRACE_LOGGER_NAME = "autogen_agentchat" diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/__init__.py b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/__init__.py index 219cb1af5347..855e66ae866f 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/__init__.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/__init__.py @@ -1,3 +1,8 @@ +""" +This module initializes various pre-defined agents provided by the package. +BaseChatAgent is the base class for all agents in AgentChat. +""" + from ._assistant_agent import AssistantAgent, Handoff # type: ignore from ._base_chat_agent import BaseChatAgent from ._code_executor_agent import CodeExecutorAgent diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py index 7c63f7e71d23..f4feb72e3930 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py @@ -5,7 +5,7 @@ from typing import Any, AsyncGenerator, Awaitable, Callable, Dict, List, Mapping, Sequence from autogen_core import CancellationToken, FunctionCall -from autogen_core.components.models import ( +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, FunctionExecutionResult, @@ -14,7 +14,7 @@ SystemMessage, UserMessage, ) -from autogen_core.components.tools import FunctionTool, Tool +from autogen_core.tools import FunctionTool, Tool from typing_extensions import deprecated from .. import EVENT_LOGGER_NAME @@ -50,11 +50,42 @@ def model_post_init(self, __context: Any) -> None: class AssistantAgent(BaseChatAgent): """An agent that provides assistance with tool use. - ```{note} - The assistant agent is not thread-safe or coroutine-safe. - It should not be shared between multiple tasks or coroutines, and it should - not call its methods concurrently. - ``` + The :meth:`on_messages` returns a :class:`~autogen_agentchat.base.Response` + in which :attr:`~autogen_agentchat.base.Response.chat_message` is the final + response message. + + The :meth:`on_messages_stream` creates an async generator that produces + the inner messages as they are created, and the :class:`~autogen_agentchat.base.Response` + object as the last item before closing the generator. + + Tool call behavior: + + * If the model returns no tool call, then the response is immediately returned as a :class:`~autogen_agentchat.messages.TextMessage` in :attr:`~autogen_agentchat.base.Response.chat_message`. + * When the model returns tool calls, they will be executed right away: + - When `reflect_on_tool_use` is False (default), the tool call results are returned as a :class:`~autogen_agentchat.messages.TextMessage` in :attr:`~autogen_agentchat.base.Response.chat_message`. `tool_call_summary_format` can be used to customize the tool call summary. + - When `reflect_on_tool_use` is True, the another model inference is made using the tool calls and results, and the text response is returned as a :class:`~autogen_agentchat.messages.TextMessage` in :attr:`~autogen_agentchat.base.Response.chat_message`. + + Hand off behavior: + + * If a handoff is triggered, a :class:`~autogen_agentchat.messages.HandoffMessage` will be returned in :attr:`~autogen_agentchat.base.Response.chat_message`. + * If there are tool calls, they will also be executed right away before returning the handoff. + + + .. note:: + The assistant agent is not thread-safe or coroutine-safe. + It should not be shared between multiple tasks or coroutines, and it should + not call its methods concurrently. + + .. note:: + By default, the tool call results are returned as response when tool calls are made. + So it is recommended to pay attention to the formatting of the tools return values, + especially if another agent is expecting them in a specific format. + Use `tool_call_summary_format` to customize the tool call summary, if needed. + + .. note:: + If multiple handoffs are detected, only the first handoff is executed. + + Args: name (str): The name of the agent. @@ -66,11 +97,20 @@ class AssistantAgent(BaseChatAgent): If a handoff is a string, it should represent the target agent's name. description (str, optional): The description of the agent. system_message (str, optional): The system message for the model. + reflect_on_tool_use (bool, optional): If `True`, the agent will make another model inference using the tool call and result + to generate a response. If `False`, the tool call result will be returned as the response. Defaults to `False`. + tool_call_summary_format (str, optional): The format string used to create a tool call summary for every tool call result. + Defaults to "{result}". + When `reflect_on_tool_use` is `False`, a concatenation of all the tool call summaries, separated by a new line character ('\\n') + will be returned as the response. + Available variables: `{tool_name}`, `{arguments}`, `{result}`. + For example, `"{tool_name}: {result}"` will create a summary like `"tool_name: result"`. Raises: ValueError: If tool names are not unique. ValueError: If handoff names are not unique. ValueError: If handoff names are not unique from tool names. + ValueError: If maximum number of tool iterations is less than 1. Examples: @@ -81,7 +121,7 @@ class AssistantAgent(BaseChatAgent): import asyncio from autogen_core import CancellationToken - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.messages import TextMessage @@ -109,7 +149,7 @@ async def main() -> None: .. code-block:: python import asyncio - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.messages import TextMessage from autogen_agentchat.ui import Console @@ -143,7 +183,7 @@ async def main() -> None: import asyncio from autogen_core import CancellationToken - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.messages import TextMessage @@ -182,6 +222,8 @@ def __init__( system_message: str | None = "You are a helpful AI assistant. Solve tasks using your tools. Reply with TERMINATE when the task has been completed.", token_callback: Callable | None = None, + reflect_on_tool_use: bool = False, + tool_call_summary_format: str = "{result}", ): super().__init__(name=name, description=description) self._model_client = model_client @@ -233,6 +275,8 @@ def __init__( f"Handoff names must be unique from tool names. Handoff names: {handoff_tool_names}; tool names: {tool_names}" ) self._model_context: List[LLMMessage] = [] + self._reflect_on_tool_use = reflect_on_tool_use + self._tool_call_summary_format = tool_call_summary_format self._is_running = False @property @@ -286,42 +330,51 @@ async def on_messages_stream( # Add the response to the model context. self._model_context.append(AssistantMessage(content=result.content, source=self.name)) - # Run tool calls until the model produces a string response. - while isinstance(result.content, list) and all(isinstance(item, FunctionCall) for item in result.content): - tool_call_msg = ToolCallMessage(content=result.content, source=self.name, models_usage=result.usage) - event_logger.debug(tool_call_msg) - # Add the tool call message to the output. - inner_messages.append(tool_call_msg) - yield tool_call_msg - - # Execute the tool calls. - results = await asyncio.gather( - *[self._execute_tool_call(call, cancellation_token) for call in result.content] + # Check if the response is a string and return it. + if isinstance(result.content, str): + yield Response( + chat_message=TextMessage(content=result.content, source=self.name, models_usage=result.usage), + inner_messages=inner_messages, ) - tool_call_result_msg = ToolCallResultMessage(content=results, source=self.name) - event_logger.debug(tool_call_result_msg) - self._model_context.append(FunctionExecutionResultMessage(content=results)) - inner_messages.append(tool_call_result_msg) - yield tool_call_result_msg - - # Detect handoff requests. - handoffs: List[HandoffBase] = [] - for call in result.content: - if call.name in self._handoffs: - handoffs.append(self._handoffs[call.name]) - if len(handoffs) > 0: - if len(handoffs) > 1: - raise ValueError(f"Multiple handoffs detected: {[handoff.name for handoff in handoffs]}") - # Return the output messages to signal the handoff. - yield Response( - chat_message=HandoffMessage( - content=handoffs[0].message, target=handoffs[0].target, source=self.name - ), - inner_messages=inner_messages, + return + + # Process tool calls. + assert isinstance(result.content, list) and all(isinstance(item, FunctionCall) for item in result.content) + tool_call_msg = ToolCallMessage(content=result.content, source=self.name, models_usage=result.usage) + event_logger.debug(tool_call_msg) + # Add the tool call message to the output. + inner_messages.append(tool_call_msg) + yield tool_call_msg + + # Execute the tool calls. + results = await asyncio.gather(*[self._execute_tool_call(call, cancellation_token) for call in result.content]) + tool_call_result_msg = ToolCallResultMessage(content=results, source=self.name) + event_logger.debug(tool_call_result_msg) + self._model_context.append(FunctionExecutionResultMessage(content=results)) + inner_messages.append(tool_call_result_msg) + yield tool_call_result_msg + + # Detect handoff requests. + handoffs: List[HandoffBase] = [] + for call in result.content: + if call.name in self._handoffs: + handoffs.append(self._handoffs[call.name]) + if len(handoffs) > 0: + if len(handoffs) > 1: + # show warning if multiple handoffs detected + warnings.warn( + f"Multiple handoffs detected only the first is executed: {[handoff.name for handoff in handoffs]}", + stacklevel=2, ) - return + # Return the output messages to signal the handoff. + yield Response( + chat_message=HandoffMessage(content=handoffs[0].message, target=handoffs[0].target, source=self.name), + inner_messages=inner_messages, + ) + return - # Generate an inference result based on the current model context. + if self._reflect_on_tool_use: + # Generate another inference result based on the tool call and result. llm_messages = self._system_messages + self._model_context # if token_callback is set, use create_stream to get the tokens as they are @@ -329,7 +382,6 @@ async def on_messages_stream( if self._token_callback is not None: async for result in self._model_client.create_stream( llm_messages, - tools=self._tools + self._handoff_tools, cancellation_token=cancellation_token, ): # if the result is a string, it is a token to be streamed back @@ -340,16 +392,32 @@ async def on_messages_stream( else: result = await self._model_client.create( llm_messages, - tools=self._tools + self._handoff_tools, cancellation_token=cancellation_token, ) + assert isinstance(result.content, str) + # Add the response to the model context. self._model_context.append(AssistantMessage(content=result.content, source=self.name)) - - assert isinstance(result.content, str) - yield Response( - chat_message=TextMessage(content=result.content, source=self.name, models_usage=result.usage), - inner_messages=inner_messages, - ) + # Yield the response. + yield Response( + chat_message=TextMessage(content=result.content, source=self.name, models_usage=result.usage), + inner_messages=inner_messages, + ) + else: + # Return tool call result as the response. + tool_call_summaries: List[str] = [] + for i in range(len(tool_call_msg.content)): + tool_call_summaries.append( + self._tool_call_summary_format.format( + tool_name=tool_call_msg.content[i].name, + arguments=tool_call_msg.content[i].arguments, + result=tool_call_result_msg.content[i].content, + ), + ) + tool_call_summary = "\n".join(tool_call_summaries) + yield Response( + chat_message=TextMessage(content=tool_call_summary, source=self.name), + inner_messages=inner_messages, + ) async def _execute_tool_call( self, tool_call: FunctionCall, cancellation_token: CancellationToken diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_base_chat_agent.py b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_base_chat_agent.py index 5b2aed4860c1..c06fb8d6db53 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_base_chat_agent.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_base_chat_agent.py @@ -1,10 +1,14 @@ from abc import ABC, abstractmethod -from typing import Any, AsyncGenerator, List, Mapping, Sequence +from typing import Any, AsyncGenerator, List, Mapping, Sequence, get_args from autogen_core import CancellationToken from ..base import ChatAgent, Response, TaskResult -from ..messages import AgentMessage, ChatMessage, HandoffMessage, MultiModalMessage, StopMessage, TextMessage +from ..messages import ( + AgentMessage, + ChatMessage, + TextMessage, +) from ..state import BaseState @@ -45,8 +49,9 @@ async def on_messages_stream( self, messages: Sequence[ChatMessage], cancellation_token: CancellationToken ) -> AsyncGenerator[AgentMessage | Response, None]: """Handles incoming messages and returns a stream of messages and - and the final item is the response. The base implementation in :class:`BaseChatAgent` - simply calls :meth:`on_messages` and yields the messages in the response.""" + and the final item is the response. The base implementation in + :class:`BaseChatAgent` simply calls :meth:`on_messages` and yields + the messages in the response.""" response = await self.on_messages(messages, cancellation_token) for inner_message in response.inner_messages or []: yield inner_message @@ -55,7 +60,7 @@ async def on_messages_stream( async def run( self, *, - task: str | ChatMessage | None = None, + task: str | ChatMessage | List[ChatMessage] | None = None, cancellation_token: CancellationToken | None = None, ) -> TaskResult: """Run the agent with the given task and return the result.""" @@ -69,7 +74,14 @@ async def run( text_msg = TextMessage(content=task, source="user") input_messages.append(text_msg) output_messages.append(text_msg) - elif isinstance(task, TextMessage | MultiModalMessage | StopMessage | HandoffMessage): + elif isinstance(task, list): + for msg in task: + if isinstance(msg, get_args(ChatMessage)[0]): + input_messages.append(msg) + output_messages.append(msg) + else: + raise ValueError(f"Invalid message type in list: {type(msg)}") + elif isinstance(task, get_args(ChatMessage)[0]): input_messages.append(task) output_messages.append(task) else: @@ -83,7 +95,7 @@ async def run( async def run_stream( self, *, - task: str | ChatMessage | None = None, + task: str | ChatMessage | List[ChatMessage] | None = None, cancellation_token: CancellationToken | None = None, ) -> AsyncGenerator[AgentMessage | TaskResult, None]: """Run the agent with the given task and return a stream of messages @@ -99,7 +111,15 @@ async def run_stream( input_messages.append(text_msg) output_messages.append(text_msg) yield text_msg - elif isinstance(task, TextMessage | MultiModalMessage | StopMessage | HandoffMessage): + elif isinstance(task, list): + for msg in task: + if isinstance(msg, get_args(ChatMessage)[0]): + input_messages.append(msg) + output_messages.append(msg) + yield msg + else: + raise ValueError(f"Invalid message type in list: {type(msg)}") + elif isinstance(task, get_args(ChatMessage)[0]): input_messages.append(task) output_messages.append(task) yield task diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_coding_assistant_agent.py b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_coding_assistant_agent.py index d7c5bfa97976..751b0d4404fb 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_coding_assistant_agent.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_coding_assistant_agent.py @@ -1,6 +1,6 @@ import warnings -from autogen_core.components.models import ( +from autogen_core.models import ( ChatCompletionClient, ) diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_society_of_mind_agent.py b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_society_of_mind_agent.py index 4bef5664fce6..4c13c10bc386 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_society_of_mind_agent.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_society_of_mind_agent.py @@ -1,10 +1,10 @@ -from typing import AsyncGenerator, List, Sequence +from typing import Any, AsyncGenerator, List, Mapping, Sequence -from autogen_core import CancellationToken, Image -from autogen_core.components.models import ChatCompletionClient -from autogen_core.components.models._types import SystemMessage +from autogen_core import CancellationToken +from autogen_core.models import ChatCompletionClient, LLMMessage, SystemMessage, UserMessage from autogen_agentchat.base import Response +from autogen_agentchat.state import SocietyOfMindAgentState from ..base import TaskResult, Team from ..messages import ( @@ -32,6 +32,10 @@ class SocietyOfMindAgent(BaseChatAgent): team (Team): The team of agents to use. model_client (ChatCompletionClient): The model client to use for preparing responses. description (str, optional): The description of the agent. + instruction (str, optional): The instruction to use when generating a response using the inner team's messages. + Defaults to :attr:`DEFAULT_INSTRUCTION`. It assumes the role of 'system'. + response_prompt (str, optional): The response prompt to use when generating a response using the inner team's messages. + Defaults to :attr:`DEFAULT_RESPONSE_PROMPT`. It assumes the role of 'system'. Example: @@ -39,35 +43,51 @@ class SocietyOfMindAgent(BaseChatAgent): .. code-block:: python import asyncio + from autogen_agentchat.ui import Console from autogen_agentchat.agents import AssistantAgent, SocietyOfMindAgent - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_agentchat.teams import RoundRobinGroupChat - from autogen_agentchat.conditions import MaxMessageTermination + from autogen_agentchat.conditions import TextMentionTermination async def main() -> None: model_client = OpenAIChatCompletionClient(model="gpt-4o") - agent1 = AssistantAgent("assistant1", model_client=model_client, system_message="You are a helpful assistant.") - agent2 = AssistantAgent("assistant2", model_client=model_client, system_message="You are a helpful assistant.") - inner_termination = MaxMessageTermination(3) + agent1 = AssistantAgent("assistant1", model_client=model_client, system_message="You are a writer, write well.") + agent2 = AssistantAgent( + "assistant2", + model_client=model_client, + system_message="You are an editor, provide critical feedback. Respond with 'APPROVE' if the text addresses all feedbacks.", + ) + inner_termination = TextMentionTermination("APPROVE") inner_team = RoundRobinGroupChat([agent1, agent2], termination_condition=inner_termination) society_of_mind_agent = SocietyOfMindAgent("society_of_mind", team=inner_team, model_client=model_client) - agent3 = AssistantAgent("assistant3", model_client=model_client, system_message="You are a helpful assistant.") - agent4 = AssistantAgent("assistant4", model_client=model_client, system_message="You are a helpful assistant.") - outter_termination = MaxMessageTermination(10) - team = RoundRobinGroupChat([society_of_mind_agent, agent3, agent4], termination_condition=outter_termination) + agent3 = AssistantAgent( + "assistant3", model_client=model_client, system_message="Translate the text to Spanish." + ) + team = RoundRobinGroupChat([society_of_mind_agent, agent3], max_turns=2) - stream = team.run_stream(task="Tell me a one-liner joke.") - async for message in stream: - print(message) + stream = team.run_stream(task="Write a short story with a surprising ending.") + await Console(stream) asyncio.run(main()) """ + DEFAULT_INSTRUCTION = "Earlier you were asked to fulfill a request. You and your team worked diligently to address that request. Here is a transcript of that conversation:" + """str: The default instruction to use when generating a response using the + inner team's messages. The instruction will be prepended to the inner team's + messages when generating a response using the model. It assumes the role of + 'system'.""" + + DEFAULT_RESPONSE_PROMPT = ( + "Output a standalone response to the original request, without mentioning any of the intermediate discussion." + ) + """str: The default response prompt to use when generating a response using + the inner team's messages. It assumes the role of 'system'.""" + def __init__( self, name: str, @@ -75,17 +95,13 @@ def __init__( model_client: ChatCompletionClient, *, description: str = "An agent that uses an inner team of agents to generate responses.", - task_prompt: str = "{transcript}\nContinue.", - response_prompt: str = "Here is a transcript of conversation so far:\n{transcript}\n\\Provide a response to the original request.", + instruction: str = DEFAULT_INSTRUCTION, + response_prompt: str = DEFAULT_RESPONSE_PROMPT, ) -> None: super().__init__(name=name, description=description) self._team = team self._model_client = model_client - if "{transcript}" not in task_prompt: - raise ValueError("The task prompt must contain the '{transcript}' placeholder for the transcript.") - self._task_prompt = task_prompt - if "{transcript}" not in response_prompt: - raise ValueError("The response prompt must contain the '{transcript}' placeholder for the transcript.") + self._instruction = instruction self._response_prompt = response_prompt @property @@ -104,33 +120,41 @@ async def on_messages(self, messages: Sequence[ChatMessage], cancellation_token: async def on_messages_stream( self, messages: Sequence[ChatMessage], cancellation_token: CancellationToken ) -> AsyncGenerator[AgentMessage | Response, None]: - # Build the context. - delta = list(messages) - task: str | None = None - if len(delta) > 0: - task = self._task_prompt.format(transcript=self._create_transcript(delta)) + # Prepare the task for the team of agents. + task = list(messages) # Run the team of agents. result: TaskResult | None = None inner_messages: List[AgentMessage] = [] + count = 0 async for inner_msg in self._team.run_stream(task=task, cancellation_token=cancellation_token): if isinstance(inner_msg, TaskResult): result = inner_msg else: + count += 1 + if count <= len(task): + # Skip the task messages. + continue yield inner_msg inner_messages.append(inner_msg) assert result is not None - if len(inner_messages) < 2: - # The first message is the task message so we need at least 2 messages. + if len(inner_messages) == 0: yield Response( chat_message=TextMessage(source=self.name, content="No response."), inner_messages=inner_messages ) else: - prompt = self._response_prompt.format(transcript=self._create_transcript(inner_messages[1:])) - completion = await self._model_client.create( - messages=[SystemMessage(content=prompt)], cancellation_token=cancellation_token + # Generate a response using the model client. + llm_messages: List[LLMMessage] = [SystemMessage(content=self._instruction)] + llm_messages.extend( + [ + UserMessage(content=message.content, source=message.source) + for message in inner_messages + if isinstance(message, TextMessage | MultiModalMessage | StopMessage | HandoffMessage) + ] ) + llm_messages.append(SystemMessage(content=self._response_prompt)) + completion = await self._model_client.create(messages=llm_messages, cancellation_token=cancellation_token) assert isinstance(completion.content, str) yield Response( chat_message=TextMessage(source=self.name, content=completion.content, models_usage=completion.usage), @@ -143,17 +167,11 @@ async def on_messages_stream( async def on_reset(self, cancellation_token: CancellationToken) -> None: await self._team.reset() - def _create_transcript(self, messages: Sequence[AgentMessage]) -> str: - transcript = "" - for message in messages: - if isinstance(message, TextMessage | StopMessage | HandoffMessage): - transcript += f"{message.source}: {message.content}\n" - elif isinstance(message, MultiModalMessage): - for content in message.content: - if isinstance(content, Image): - transcript += f"{message.source}: [Image]\n" - else: - transcript += f"{message.source}: {content}\n" - else: - raise ValueError(f"Unexpected message type: {message} in {self.__class__.__name__}") - return transcript + async def save_state(self) -> Mapping[str, Any]: + team_state = await self._team.save_state() + state = SocietyOfMindAgentState(inner_team_state=team_state) + return state.model_dump() + + async def load_state(self, state: Mapping[str, Any]) -> None: + society_of_mind_state = SocietyOfMindAgentState.model_validate(state) + await self._team.load_state(society_of_mind_state.inner_team_state) diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_tool_use_assistant_agent.py b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_tool_use_assistant_agent.py index 0f59efb67778..1ebe1f22662b 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_tool_use_assistant_agent.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_tool_use_assistant_agent.py @@ -2,10 +2,10 @@ import warnings from typing import Any, Awaitable, Callable, List -from autogen_core.components.models import ( +from autogen_core.models import ( ChatCompletionClient, ) -from autogen_core.components.tools import Tool +from autogen_core.tools import Tool from .. import EVENT_LOGGER_NAME from ._assistant_agent import AssistantAgent diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_user_proxy_agent.py b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_user_proxy_agent.py index 35aa5fa88a8d..3604b82503b7 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_user_proxy_agent.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_user_proxy_agent.py @@ -18,7 +18,7 @@ # TODO: ainput doesn't seem to play nicely with jupyter. # No input window appears in this case. async def cancellable_input(prompt: str, cancellation_token: Optional[CancellationToken]) -> str: - task = asyncio.Task[str](asyncio.create_task(ainput(prompt))) # type: ignore + task: asyncio.Task[str] = asyncio.create_task(ainput(prompt)) # type: ignore if cancellation_token is not None: cancellation_token.link_future(task) return await task diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/base/_handoff.py b/python/packages/autogen-agentchat/src/autogen_agentchat/base/_handoff.py index 3ab859a08e86..91b78a7592de 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/base/_handoff.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/base/_handoff.py @@ -1,7 +1,7 @@ import logging from typing import Any, Dict -from autogen_core.components.tools import FunctionTool, Tool +from autogen_core.tools import FunctionTool, Tool from pydantic import BaseModel, Field, model_validator from .. import EVENT_LOGGER_NAME @@ -15,23 +15,23 @@ class Handoff(BaseModel): target: str """The name of the target agent to handoff to.""" - description: str = Field(default=None) + description: str = Field(default="") """The description of the handoff such as the condition under which it should happen and the target agent's ability. If not provided, it is generated from the target agent's name.""" - name: str = Field(default=None) + name: str = Field(default="") """The name of this handoff configuration. If not provided, it is generated from the target agent's name.""" - message: str = Field(default=None) + message: str = Field(default="") """The message to the target agent. If not provided, it is generated from the target agent's name.""" @model_validator(mode="before") @classmethod def set_defaults(cls, values: Dict[str, Any]) -> Dict[str, Any]: - if values.get("description") is None: + if not values.get("description"): values["description"] = f"Handoff to {values['target']}." - if values.get("name") is None: + if not values.get("name"): values["name"] = f"transfer_to_{values['target']}".lower() else: name = values["name"] @@ -40,7 +40,7 @@ def set_defaults(cls, values: Dict[str, Any]) -> Dict[str, Any]: # Check if name is a valid identifier. if not name.isidentifier(): raise ValueError(f"Handoff name must be a valid identifier: {values['name']}") - if values.get("message") is None: + if not values.get("message"): values["message"] = ( f"Transferred to {values['target']}, adopting the role of {values['target']} immediately." ) diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/base/_task.py b/python/packages/autogen-agentchat/src/autogen_agentchat/base/_task.py index f617b3823451..d0d9aefe70a7 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/base/_task.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/base/_task.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import AsyncGenerator, Protocol, Sequence +from typing import AsyncGenerator, List, Protocol, Sequence from autogen_core import CancellationToken @@ -23,7 +23,7 @@ class TaskRunner(Protocol): async def run( self, *, - task: str | ChatMessage | None = None, + task: str | ChatMessage | List[ChatMessage] | None = None, cancellation_token: CancellationToken | None = None, ) -> TaskResult: """Run the task and return the result. @@ -36,7 +36,7 @@ async def run( def run_stream( self, *, - task: str | ChatMessage | None = None, + task: str | ChatMessage | List[ChatMessage] | None = None, cancellation_token: CancellationToken | None = None, ) -> AsyncGenerator[AgentMessage | TaskResult, None]: """Run the task and produces a stream of messages and the final result diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/conditions/__init__.py b/python/packages/autogen-agentchat/src/autogen_agentchat/conditions/__init__.py index cc8e5e8312f0..ddf909fd7716 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/conditions/__init__.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/conditions/__init__.py @@ -1,3 +1,8 @@ +""" +This module provides various termination conditions for controlling the behavior of +multi-agent teams. +""" + from ._terminations import ( ExternalTermination, HandoffTermination, diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/messages.py b/python/packages/autogen-agentchat/src/autogen_agentchat/messages.py index fe3bf110d5e6..fddd6bea5bf8 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/messages.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/messages.py @@ -1,7 +1,13 @@ +""" +This module defines various message types used for agent-to-agent communication. +Each message type inherits from the BaseMessage class and includes specific fields +relevant to the type of message being sent. +""" + from typing import List, Literal from autogen_core import FunctionCall, Image -from autogen_core.components.models import FunctionExecutionResult, RequestUsage +from autogen_core.models import FunctionExecutionResult, RequestUsage from pydantic import BaseModel, ConfigDict, Field from typing_extensions import Annotated diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/state/__init__.py b/python/packages/autogen-agentchat/src/autogen_agentchat/state/__init__.py index abb468a70b62..3cb3efa8145d 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/state/__init__.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/state/__init__.py @@ -8,6 +8,7 @@ MagenticOneOrchestratorState, RoundRobinManagerState, SelectorManagerState, + SocietyOfMindAgentState, SwarmManagerState, TeamState, ) @@ -22,4 +23,5 @@ "SwarmManagerState", "MagenticOneOrchestratorState", "TeamState", + "SocietyOfMindAgentState", ] diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/state/_states.py b/python/packages/autogen-agentchat/src/autogen_agentchat/state/_states.py index b266572dd829..4bf3d4709943 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/state/_states.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/state/_states.py @@ -1,6 +1,6 @@ from typing import Any, List, Mapping, Optional -from autogen_core.components.models import ( +from autogen_core.models import ( LLMMessage, ) from pydantic import BaseModel, Field @@ -79,3 +79,10 @@ class MagenticOneOrchestratorState(BaseGroupChatManagerState): n_rounds: int = Field(default=0) n_stalls: int = Field(default=0) type: str = Field(default="MagenticOneOrchestratorState") + + +class SocietyOfMindAgentState(BaseState): + """State for a Society of Mind agent.""" + + inner_team_state: Mapping[str, Any] = Field(default_factory=dict) + type: str = Field(default="SocietyOfMindAgentState") diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/__init__.py b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/__init__.py index 5d41c921197a..e44628edc642 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/__init__.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/__init__.py @@ -1,3 +1,8 @@ +""" +This module provides implementation of various pre-defined multi-agent teams. +Each team inherits from the BaseGroupChat class. +""" + from ._group_chat._base_group_chat import BaseGroupChat from ._group_chat._magentic_one import MagenticOneGroupChat from ._group_chat._round_robin_group_chat import RoundRobinGroupChat diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_base_group_chat.py b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_base_group_chat.py index 2c38f8449d01..7a6496acbe87 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_base_group_chat.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_base_group_chat.py @@ -2,7 +2,7 @@ import logging import uuid from abc import ABC, abstractmethod -from typing import Any, AsyncGenerator, Callable, List, Mapping +from typing import Any, AsyncGenerator, Callable, List, Mapping, get_args from autogen_core import ( AgentId, @@ -19,7 +19,7 @@ from ... import EVENT_LOGGER_NAME from ...base import ChatAgent, TaskResult, Team, TerminationCondition -from ...messages import AgentMessage, ChatMessage, HandoffMessage, MultiModalMessage, StopMessage, TextMessage +from ...messages import AgentMessage, ChatMessage, TextMessage from ...state import TeamState from ._chat_agent_container import ChatAgentContainer from ._events import GroupChatMessage, GroupChatReset, GroupChatStart, GroupChatTermination @@ -146,11 +146,18 @@ async def collect_output_messages( message: GroupChatStart | GroupChatMessage | GroupChatTermination, ctx: MessageContext, ) -> None: - event_logger.info(message.message) - if isinstance(message, GroupChatTermination): + """Collect output messages from the group chat.""" + if isinstance(message, GroupChatStart): + if message.messages is not None: + for msg in message.messages: + event_logger.info(msg) + await self._output_message_queue.put(msg) + elif isinstance(message, GroupChatMessage): + event_logger.info(message.message) + await self._output_message_queue.put(message.message) + elif isinstance(message, GroupChatTermination): + event_logger.info(message.message) self._stop_reason = message.message.content - return - await self._output_message_queue.put(message.message) await ClosureAgent.register_closure( runtime, @@ -165,7 +172,7 @@ async def collect_output_messages( async def run( self, *, - task: str | ChatMessage | None = None, + task: str | ChatMessage | List[ChatMessage] | None = None, cancellation_token: CancellationToken | None = None, ) -> TaskResult: """Run the team and return the result. The base implementation uses @@ -173,7 +180,7 @@ async def run( Once the team is stopped, the termination condition is reset. Args: - task (str | ChatMessage | None): The task to run the team with. + task (str | ChatMessage | List[ChatMessage] | None): The task to run the team with. Can be a string, a single :class:`ChatMessage` , or a list of :class:`ChatMessage`. cancellation_token (CancellationToken | None): The cancellation token to kill the task immediately. Setting the cancellation token potentially put the team in an inconsistent state, and it may not reset the termination condition. @@ -188,7 +195,7 @@ async def run( from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.conditions import MaxMessageTermination from autogen_agentchat.teams import RoundRobinGroupChat - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient async def main() -> None: @@ -219,7 +226,7 @@ async def main() -> None: from autogen_agentchat.conditions import MaxMessageTermination from autogen_agentchat.teams import RoundRobinGroupChat from autogen_core import CancellationToken - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient async def main() -> None: @@ -264,7 +271,7 @@ async def main() -> None: async def run_stream( self, *, - task: str | ChatMessage | None = None, + task: str | ChatMessage | List[ChatMessage] | None = None, cancellation_token: CancellationToken | None = None, ) -> AsyncGenerator[AgentMessage | TaskResult, None]: """Run the team and produces a stream of messages and the final result @@ -272,7 +279,7 @@ async def run_stream( team is stopped, the termination condition is reset. Args: - task (str | ChatMessage | None): The task to run the team with. + task (str | ChatMessage | List[ChatMessage] | None): The task to run the team with. Can be a string, a single :class:`ChatMessage` , or a list of :class:`ChatMessage`. cancellation_token (CancellationToken | None): The cancellation token to kill the task immediately. Setting the cancellation token potentially put the team in an inconsistent state, and it may not reset the termination condition. @@ -286,7 +293,7 @@ async def run_stream( from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.conditions import MaxMessageTermination from autogen_agentchat.teams import RoundRobinGroupChat - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient async def main() -> None: @@ -320,7 +327,7 @@ async def main() -> None: from autogen_agentchat.ui import Console from autogen_agentchat.teams import RoundRobinGroupChat from autogen_core import CancellationToken - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient async def main() -> None: @@ -355,16 +362,20 @@ async def main() -> None: """ - # Create the first chat message if the task is a string or a chat message. - first_chat_message: ChatMessage | None = None + # Create the messages list if the task is a string or a chat message. + messages: List[ChatMessage] | None = None if task is None: pass elif isinstance(task, str): - first_chat_message = TextMessage(content=task, source="user") - elif isinstance(task, TextMessage | MultiModalMessage | StopMessage | HandoffMessage): - first_chat_message = task - else: - raise ValueError(f"Invalid task type: {type(task)}") + messages = [TextMessage(content=task, source="user")] + elif isinstance(task, get_args(ChatMessage)[0]): + messages = [task] # type: ignore + elif isinstance(task, list): + if not task: + raise ValueError("Task list cannot be empty") + if not all(isinstance(msg, get_args(ChatMessage)[0]) for msg in task): + raise ValueError("All messages in task list must be valid ChatMessage types") + messages = task if self._is_running: raise ValueError("The team is already running, it cannot run again until it is stopped.") @@ -389,7 +400,7 @@ async def stop_runtime() -> None: # The group chat manager will start the group chat by relaying the message to the participants # and the closure agent. await self._runtime.send_message( - GroupChatStart(message=first_chat_message), + GroupChatStart(messages=messages), recipient=AgentId(type=self._group_chat_manager_topic_type, key=self._team_id), cancellation_token=cancellation_token, ) @@ -437,7 +448,7 @@ async def reset(self) -> None: from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.conditions import MaxMessageTermination from autogen_agentchat.teams import RoundRobinGroupChat - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient async def main() -> None: diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_base_group_chat_manager.py b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_base_group_chat_manager.py index aefe4f8d49d8..84725cecdd65 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_base_group_chat_manager.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_base_group_chat_manager.py @@ -70,24 +70,28 @@ async def handle_start(self, message: GroupChatStart, ctx: MessageContext) -> No # Stop the group chat. return - # Validate the group state given the start message. - await self.validate_group_state(message.message) + # Validate the group state given the start messages + await self.validate_group_state(message.messages) - if message.message is not None: - # Log the start message. - await self.publish_message(message, topic_id=DefaultTopicId(type=self._output_topic_type)) + if message.messages is not None: + # Log all messages at once + await self.publish_message( + GroupChatStart(messages=message.messages), topic_id=DefaultTopicId(type=self._output_topic_type) + ) - # Relay the start message to the participants. + # Relay all messages at once to participants await self.publish_message( - message, topic_id=DefaultTopicId(type=self._group_topic_type), cancellation_token=ctx.cancellation_token + GroupChatStart(messages=message.messages), + topic_id=DefaultTopicId(type=self._group_topic_type), + cancellation_token=ctx.cancellation_token, ) - # Append the user message to the message thread. - self._message_thread.append(message.message) + # Append all messages to thread + self._message_thread.extend(message.messages) - # Check if the conversation should be terminated. + # Check termination condition after processing all messages if self._termination_condition is not None: - stop_message = await self._termination_condition([message.message]) + stop_message = await self._termination_condition(message.messages) if stop_message is not None: await self.publish_message( GroupChatTermination(message=stop_message), @@ -97,7 +101,7 @@ async def handle_start(self, message: GroupChatStart, ctx: MessageContext) -> No await self._termination_condition.reset() return - # Select a speaker to start the conversation. + # Select a speaker to start/continue the conversation speaker_topic_type_future = asyncio.ensure_future(self.select_speaker(self._message_thread)) # Link the select speaker future to the cancellation token. ctx.cancellation_token.link_future(speaker_topic_type_future) @@ -166,8 +170,13 @@ async def handle_reset(self, message: GroupChatReset, ctx: MessageContext) -> No await self.reset() @abstractmethod - async def validate_group_state(self, message: ChatMessage | None) -> None: - """Validate the state of the group chat given the start message. This is executed when the group chat manager receives a GroupChatStart event.""" + async def validate_group_state(self, messages: List[ChatMessage] | None) -> None: + """Validate the state of the group chat given the start messages. + This is executed when the group chat manager receives a GroupChatStart event. + + Args: + messages: A list of chat messages to validate, or None if no messages are provided. + """ ... @abstractmethod diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_chat_agent_container.py b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_chat_agent_container.py index fdf5428b3b5c..f01465d4c3d5 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_chat_agent_container.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_chat_agent_container.py @@ -30,8 +30,8 @@ def __init__(self, parent_topic_type: str, output_topic_type: str, agent: ChatAg @event async def handle_start(self, message: GroupChatStart, ctx: MessageContext) -> None: """Handle a start event by appending the content to the buffer.""" - if message.message is not None: - self._message_buffer.append(message.message) + if message.messages is not None: + self._message_buffer.extend(message.messages) @event async def handle_agent_response(self, message: GroupChatAgentResponse, ctx: MessageContext) -> None: diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_events.py b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_events.py index 4ae4d892cace..ed325fcb5159 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_events.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_events.py @@ -1,3 +1,5 @@ +from typing import List + from pydantic import BaseModel from ...base import Response @@ -7,8 +9,8 @@ class GroupChatStart(BaseModel): """A request to start a group chat.""" - message: ChatMessage | None = None - """An optional user message to start the group chat.""" + messages: List[ChatMessage] | None = None + """An optional list of messages to start the group chat.""" class GroupChatAgentResponse(BaseModel): diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_magentic_one/_magentic_one_group_chat.py b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_magentic_one/_magentic_one_group_chat.py index 2a4ea7a28c39..fbd336ae01b5 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_magentic_one/_magentic_one_group_chat.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_magentic_one/_magentic_one_group_chat.py @@ -1,7 +1,7 @@ import logging from typing import Callable, List -from autogen_core.components.models import ChatCompletionClient +from autogen_core.models import ChatCompletionClient from .... import EVENT_LOGGER_NAME, TRACE_LOGGER_NAME from ....base import ChatAgent, TerminationCondition @@ -38,7 +38,7 @@ class MagenticOneGroupChat(BaseGroupChat): .. code-block:: python import asyncio - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.teams import MagenticOneGroupChat from autogen_agentchat.ui import Console diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_magentic_one/_magentic_one_orchestrator.py b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_magentic_one/_magentic_one_orchestrator.py index 11b143e28c0b..dcdf8b91809d 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_magentic_one/_magentic_one_orchestrator.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_magentic_one/_magentic_one_orchestrator.py @@ -3,7 +3,7 @@ from typing import Any, Dict, List, Mapping from autogen_core import AgentId, CancellationToken, DefaultTopicId, Image, MessageContext, event, rpc -from autogen_core.components.models import ( +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, LLMMessage, @@ -12,7 +12,16 @@ from .... import TRACE_LOGGER_NAME from ....base import Response, TerminationCondition -from ....messages import AgentMessage, ChatMessage, MultiModalMessage, StopMessage, TextMessage +from ....messages import ( + AgentMessage, + ChatMessage, + HandoffMessage, + MultiModalMessage, + StopMessage, + TextMessage, + ToolCallMessage, + ToolCallResultMessage, +) from ....state import MagenticOneOrchestratorState from .._base_group_chat_manager import BaseGroupChatManager from .._events import ( @@ -117,17 +126,18 @@ async def handle_start(self, message: GroupChatStart, ctx: MessageContext) -> No ) # Stop the group chat. return - assert message is not None and message.message is not None + assert message is not None and message.messages is not None - # Validate the group state given the start message. - await self.validate_group_state(message.message) + # Validate the group state given all the messages. + await self.validate_group_state(message.messages) - # Log the start message. + # Log the message. await self.publish_message(message, topic_id=DefaultTopicId(type=self._output_topic_type)) # Outer Loop for first time # Create the initial task ledger ################################# - self._task = self._content_to_str(message.message.content) + # Combine all message contents for task + self._task = " ".join([self._content_to_str(msg.content) for msg in message.messages]) planning_conversation: List[LLMMessage] = [] # 1. GATHER FACTS @@ -157,12 +167,11 @@ async def handle_start(self, message: GroupChatStart, ctx: MessageContext) -> No @event async def handle_agent_response(self, message: GroupChatAgentResponse, ctx: MessageContext) -> None: # type: ignore - self._message_thread.append(message.agent_response.chat_message) delta: List[AgentMessage] = [] if message.agent_response.inner_messages is not None: for inner_message in message.agent_response.inner_messages: - self._message_thread.append(inner_message) delta.append(inner_message) + self._message_thread.append(message.agent_response.chat_message) delta.append(message.agent_response.chat_message) if self._termination_condition is not None: @@ -176,7 +185,7 @@ async def handle_agent_response(self, message: GroupChatAgentResponse, ctx: Mess return await self._orchestrate_step(ctx.cancellation_token) - async def validate_group_state(self, message: ChatMessage | None) -> None: + async def validate_group_state(self, messages: List[ChatMessage] | None) -> None: pass async def save_state(self) -> Mapping[str, Any]: @@ -418,7 +427,12 @@ def _thread_to_context(self) -> List[LLMMessage]: """Convert the message thread to a context for the model.""" context: List[LLMMessage] = [] for m in self._message_thread: - if m.source == self._name: + if isinstance(m, ToolCallMessage | ToolCallResultMessage): + # Ignore tool call messages. + continue + elif isinstance(m, StopMessage | HandoffMessage): + context.append(UserMessage(content=m.content, source=m.source)) + elif m.source == self._name: assert isinstance(m, TextMessage) context.append(AssistantMessage(content=m.content, source=m.source)) else: diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_round_robin_group_chat.py b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_round_robin_group_chat.py index 9ac06ac0b319..3e17943b90b2 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_round_robin_group_chat.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_round_robin_group_chat.py @@ -29,7 +29,7 @@ def __init__( ) self._next_speaker_index = 0 - async def validate_group_state(self, message: ChatMessage | None) -> None: + async def validate_group_state(self, messages: List[ChatMessage] | None) -> None: pass async def reset(self) -> None: @@ -83,7 +83,7 @@ class RoundRobinGroupChat(BaseGroupChat): .. code-block:: python import asyncio - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.teams import RoundRobinGroupChat from autogen_agentchat.conditions import TextMentionTermination @@ -113,7 +113,7 @@ async def get_weather(location: str) -> str: .. code-block:: python import asyncio - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.teams import RoundRobinGroupChat from autogen_agentchat.conditions import TextMentionTermination diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_selector_group_chat.py b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_selector_group_chat.py index 29a3013858ab..5f161d0c6858 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_selector_group_chat.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_selector_group_chat.py @@ -2,7 +2,7 @@ import re from typing import Any, Callable, Dict, List, Mapping, Sequence -from autogen_core.components.models import ChatCompletionClient, SystemMessage +from autogen_core.models import ChatCompletionClient, SystemMessage from ... import TRACE_LOGGER_NAME from ...base import ChatAgent, TerminationCondition @@ -54,7 +54,7 @@ def __init__( self._allow_repeated_speaker = allow_repeated_speaker self._selector_func = selector_func - async def validate_group_state(self, message: ChatMessage | None) -> None: + async def validate_group_state(self, messages: List[ChatMessage] | None) -> None: pass async def reset(self) -> None: @@ -219,7 +219,7 @@ class SelectorGroupChat(BaseGroupChat): .. code-block:: python import asyncio - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.teams import SelectorGroupChat from autogen_agentchat.conditions import TextMentionTermination @@ -273,7 +273,7 @@ async def book_trip() -> str: import asyncio from typing import Sequence - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.teams import SelectorGroupChat from autogen_agentchat.conditions import TextMentionTermination diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_swarm_group_chat.py b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_swarm_group_chat.py index 10574e0a9fa6..436fe8e4cdae 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_swarm_group_chat.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/teams/_group_chat/_swarm_group_chat.py @@ -29,16 +29,19 @@ def __init__( ) self._current_speaker = participant_topic_types[0] - async def validate_group_state(self, message: ChatMessage | None) -> None: - """Validate the start message for the group chat.""" - # Check if the start message is a handoff message. - if isinstance(message, HandoffMessage): - if message.target not in self._participant_topic_types: - raise ValueError( - f"The target {message.target} is not one of the participants {self._participant_topic_types}. " - "If you are resuming Swarm with a new HandoffMessage make sure to set the target to a valid participant as the target." - ) - return + async def validate_group_state(self, messages: List[ChatMessage] | None) -> None: + """Validate the start messages for the group chat.""" + # Check if any of the start messages is a handoff message. + if messages: + for message in messages: + if isinstance(message, HandoffMessage): + if message.target not in self._participant_topic_types: + raise ValueError( + f"The target {message.target} is not one of the participants {self._participant_topic_types}. " + "If you are resuming Swarm with a new HandoffMessage make sure to set the target to a valid participant as the target." + ) + return + # Check if there is a handoff message in the thread that is not targeting a valid participant. for existing_message in reversed(self._message_thread): if isinstance(existing_message, HandoffMessage): @@ -108,7 +111,7 @@ class Swarm(BaseGroupChat): .. code-block:: python import asyncio - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.teams import Swarm from autogen_agentchat.conditions import MaxMessageTermination @@ -143,7 +146,7 @@ async def main() -> None: .. code-block:: python import asyncio - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.teams import Swarm from autogen_agentchat.conditions import HandoffTermination, MaxMessageTermination diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/ui/__init__.py b/python/packages/autogen-agentchat/src/autogen_agentchat/ui/__init__.py index d668e02c5c2f..65c4f1e07ad9 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/ui/__init__.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/ui/__init__.py @@ -1,3 +1,7 @@ +""" +This module implements utility classes for formatting/printing agent messages. +""" + from ._console import Console __all__ = ["Console"] diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/ui/_console.py b/python/packages/autogen-agentchat/src/autogen_agentchat/ui/_console.py index 4059bc477b16..364526386f24 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/ui/_console.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/ui/_console.py @@ -4,7 +4,7 @@ from typing import AsyncGenerator, List, Optional, TypeVar, cast from autogen_core import Image -from autogen_core.components.models import RequestUsage +from autogen_core.models import RequestUsage from autogen_agentchat.base import Response, TaskResult from autogen_agentchat.messages import AgentMessage, MultiModalMessage diff --git a/python/packages/autogen-agentchat/tests/test_assistant_agent.py b/python/packages/autogen-agentchat/tests/test_assistant_agent.py index c09a92a28d3d..c132e3a4862c 100644 --- a/python/packages/autogen-agentchat/tests/test_assistant_agent.py +++ b/python/packages/autogen-agentchat/tests/test_assistant_agent.py @@ -8,6 +8,7 @@ from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.base import Handoff, TaskResult from autogen_agentchat.messages import ( + ChatMessage, HandoffMessage, MultiModalMessage, TextMessage, @@ -15,13 +16,16 @@ ToolCallResultMessage, ) from autogen_core import Image -from autogen_core.components.tools import FunctionTool -from autogen_ext.models import OpenAIChatCompletionClient +from autogen_core.tools import FunctionTool +from autogen_ext.models.openai import OpenAIChatCompletionClient from openai.resources.chat.completions import AsyncCompletions from openai.types.chat.chat_completion import ChatCompletion, Choice from openai.types.chat.chat_completion_chunk import ChatCompletionChunk from openai.types.chat.chat_completion_message import ChatCompletionMessage -from openai.types.chat.chat_completion_message_tool_call import ChatCompletionMessageToolCall, Function +from openai.types.chat.chat_completion_message_tool_call import ( + ChatCompletionMessageToolCall, + Function, +) from openai.types.completion_usage import CompletionUsage from utils import FileLogHandler @@ -33,14 +37,14 @@ class _MockChatCompletion: def __init__(self, chat_completions: List[ChatCompletion]) -> None: self._saved_chat_completions = chat_completions - self._curr_index = 0 + self.curr_index = 0 async def mock_create( self, *args: Any, **kwargs: Any ) -> ChatCompletion | AsyncGenerator[ChatCompletionChunk, None]: await asyncio.sleep(0.1) - completion = self._saved_chat_completions[self._curr_index] - self._curr_index += 1 + completion = self._saved_chat_completions[self.curr_index] + self.curr_index += 1 return completion @@ -58,6 +62,114 @@ async def _echo_function(input: str) -> str: @pytest.mark.asyncio async def test_run_with_tools(monkeypatch: pytest.MonkeyPatch) -> None: + model = "gpt-4o-2024-05-13" + chat_completions = [ + ChatCompletion( + id="id1", + choices=[ + Choice( + finish_reason="tool_calls", + index=0, + message=ChatCompletionMessage( + content=None, + tool_calls=[ + ChatCompletionMessageToolCall( + id="1", + type="function", + function=Function( + name="_pass_function", + arguments=json.dumps({"input": "task"}), + ), + ) + ], + role="assistant", + ), + ) + ], + created=0, + model=model, + object="chat.completion", + usage=CompletionUsage(prompt_tokens=10, completion_tokens=5, total_tokens=0), + ), + ChatCompletion( + id="id2", + choices=[ + Choice( + finish_reason="stop", + index=0, + message=ChatCompletionMessage(content="pass", role="assistant"), + ) + ], + created=0, + model=model, + object="chat.completion", + usage=CompletionUsage(prompt_tokens=10, completion_tokens=5, total_tokens=0), + ), + ChatCompletion( + id="id2", + choices=[ + Choice( + finish_reason="stop", + index=0, + message=ChatCompletionMessage(content="TERMINATE", role="assistant"), + ) + ], + created=0, + model=model, + object="chat.completion", + usage=CompletionUsage(prompt_tokens=10, completion_tokens=5, total_tokens=0), + ), + ] + mock = _MockChatCompletion(chat_completions) + monkeypatch.setattr(AsyncCompletions, "create", mock.mock_create) + agent = AssistantAgent( + "tool_use_agent", + model_client=OpenAIChatCompletionClient(model=model, api_key=""), + tools=[ + _pass_function, + _fail_function, + FunctionTool(_echo_function, description="Echo"), + ], + ) + result = await agent.run(task="task") + + assert len(result.messages) == 4 + assert isinstance(result.messages[0], TextMessage) + assert result.messages[0].models_usage is None + assert isinstance(result.messages[1], ToolCallMessage) + assert result.messages[1].models_usage is not None + assert result.messages[1].models_usage.completion_tokens == 5 + assert result.messages[1].models_usage.prompt_tokens == 10 + assert isinstance(result.messages[2], ToolCallResultMessage) + assert result.messages[2].models_usage is None + assert isinstance(result.messages[3], TextMessage) + assert result.messages[3].content == "pass" + assert result.messages[3].models_usage is None + + # Test streaming. + mock.curr_index = 0 # Reset the mock + index = 0 + async for message in agent.run_stream(task="task"): + if isinstance(message, TaskResult): + assert message == result + else: + assert message == result.messages[index] + index += 1 + + # Test state saving and loading. + state = await agent.save_state() + agent2 = AssistantAgent( + "tool_use_agent", + model_client=OpenAIChatCompletionClient(model=model, api_key=""), + tools=[_pass_function, _fail_function, FunctionTool(_echo_function, description="Echo")], + ) + await agent2.load_state(state) + state2 = await agent2.save_state() + assert state == state2 + + +@pytest.mark.asyncio +async def test_run_with_tools_and_reflection(monkeypatch: pytest.MonkeyPatch) -> None: model = "gpt-4o-2024-05-13" chat_completions = [ ChatCompletion( @@ -116,8 +228,10 @@ async def test_run_with_tools(monkeypatch: pytest.MonkeyPatch) -> None: "tool_use_agent", model_client=OpenAIChatCompletionClient(model=model, api_key=""), tools=[_pass_function, _fail_function, FunctionTool(_echo_function, description="Echo")], + reflect_on_tool_use=True, ) result = await agent.run(task="task") + assert len(result.messages) == 4 assert isinstance(result.messages[0], TextMessage) assert result.messages[0].models_usage is None @@ -128,12 +242,13 @@ async def test_run_with_tools(monkeypatch: pytest.MonkeyPatch) -> None: assert isinstance(result.messages[2], ToolCallResultMessage) assert result.messages[2].models_usage is None assert isinstance(result.messages[3], TextMessage) + assert result.messages[3].content == "Hello" assert result.messages[3].models_usage is not None assert result.messages[3].models_usage.completion_tokens == 5 assert result.messages[3].models_usage.prompt_tokens == 10 # Test streaming. - mock._curr_index = 0 # pyright: ignore + mock.curr_index = 0 # pyright: ignore index = 0 async for message in agent.run_stream(task="task"): if isinstance(message, TaskResult): @@ -147,7 +262,11 @@ async def test_run_with_tools(monkeypatch: pytest.MonkeyPatch) -> None: agent2 = AssistantAgent( "tool_use_agent", model_client=OpenAIChatCompletionClient(model=model, api_key=""), - tools=[_pass_function, _fail_function, FunctionTool(_echo_function, description="Echo")], + tools=[ + _pass_function, + _fail_function, + FunctionTool(_echo_function, description="Echo"), + ], ) await agent2.load_state(state) state2 = await agent2.save_state() @@ -192,7 +311,11 @@ async def test_handoffs(monkeypatch: pytest.MonkeyPatch) -> None: tool_use_agent = AssistantAgent( "tool_use_agent", model_client=OpenAIChatCompletionClient(model=model, api_key=""), - tools=[_pass_function, _fail_function, FunctionTool(_echo_function, description="Echo")], + tools=[ + _pass_function, + _fail_function, + FunctionTool(_echo_function, description="Echo"), + ], handoffs=[handoff], ) assert HandoffMessage in tool_use_agent.produced_message_types @@ -212,7 +335,7 @@ async def test_handoffs(monkeypatch: pytest.MonkeyPatch) -> None: assert result.messages[3].models_usage is None # Test streaming. - mock._curr_index = 0 # pyright: ignore + mock.curr_index = 0 # pyright: ignore index = 0 async for message in tool_use_agent.run_stream(task="task"): if isinstance(message, TaskResult): @@ -229,7 +352,11 @@ async def test_multi_modal_task(monkeypatch: pytest.MonkeyPatch) -> None: ChatCompletion( id="id2", choices=[ - Choice(finish_reason="stop", index=0, message=ChatCompletionMessage(content="Hello", role="assistant")) + Choice( + finish_reason="stop", + index=0, + message=ChatCompletionMessage(content="Hello", role="assistant"), + ) ], created=0, model=model, @@ -239,7 +366,10 @@ async def test_multi_modal_task(monkeypatch: pytest.MonkeyPatch) -> None: ] mock = _MockChatCompletion(chat_completions) monkeypatch.setattr(AsyncCompletions, "create", mock.mock_create) - agent = AssistantAgent(name="assistant", model_client=OpenAIChatCompletionClient(model=model, api_key="")) + agent = AssistantAgent( + name="assistant", + model_client=OpenAIChatCompletionClient(model=model, api_key=""), + ) # Generate a random base64 image. img_base64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVR4nGP4//8/AAX+Av4N70a4AAAAAElFTkSuQmCC" result = await agent.run(task=MultiModalMessage(source="user", content=["Test", Image.from_base64(img_base64)])) @@ -250,14 +380,24 @@ async def test_multi_modal_task(monkeypatch: pytest.MonkeyPatch) -> None: async def test_invalid_model_capabilities() -> None: model = "random-model" model_client = OpenAIChatCompletionClient( - model=model, api_key="", model_capabilities={"vision": False, "function_calling": False, "json_output": False} + model=model, + api_key="", + model_capabilities={ + "vision": False, + "function_calling": False, + "json_output": False, + }, ) with pytest.raises(ValueError): agent = AssistantAgent( name="assistant", model_client=model_client, - tools=[_pass_function, _fail_function, FunctionTool(_echo_function, description="Echo")], + tools=[ + _pass_function, + _fail_function, + FunctionTool(_echo_function, description="Echo"), + ], ) with pytest.raises(ValueError): @@ -268,3 +408,62 @@ async def test_invalid_model_capabilities() -> None: # Generate a random base64 image. img_base64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVR4nGP4//8/AAX+Av4N70a4AAAAAElFTkSuQmCC" await agent.run(task=MultiModalMessage(source="user", content=["Test", Image.from_base64(img_base64)])) + + +@pytest.mark.asyncio +async def test_list_chat_messages(monkeypatch: pytest.MonkeyPatch) -> None: + model = "gpt-4o-2024-05-13" + chat_completions = [ + ChatCompletion( + id="id1", + choices=[ + Choice( + finish_reason="stop", + index=0, + message=ChatCompletionMessage(content="Response to message 1", role="assistant"), + ) + ], + created=0, + model=model, + object="chat.completion", + usage=CompletionUsage(prompt_tokens=10, completion_tokens=5, total_tokens=15), + ), + ] + mock = _MockChatCompletion(chat_completions) + monkeypatch.setattr(AsyncCompletions, "create", mock.mock_create) + agent = AssistantAgent( + "test_agent", + model_client=OpenAIChatCompletionClient(model=model, api_key=""), + ) + + # Create a list of chat messages + messages: List[ChatMessage] = [ + TextMessage(content="Message 1", source="user"), + TextMessage(content="Message 2", source="user"), + ] + + # Test run method with list of messages + result = await agent.run(task=messages) + assert len(result.messages) == 3 # 2 input messages + 1 response message + assert isinstance(result.messages[0], TextMessage) + assert result.messages[0].content == "Message 1" + assert result.messages[0].source == "user" + assert isinstance(result.messages[1], TextMessage) + assert result.messages[1].content == "Message 2" + assert result.messages[1].source == "user" + assert isinstance(result.messages[2], TextMessage) + assert result.messages[2].content == "Response to message 1" + assert result.messages[2].source == "test_agent" + assert result.messages[2].models_usage is not None + assert result.messages[2].models_usage.completion_tokens == 5 + assert result.messages[2].models_usage.prompt_tokens == 10 + + # Test run_stream method with list of messages + mock.curr_index = 0 # Reset mock index using public attribute + index = 0 + async for message in agent.run_stream(task=messages): + if isinstance(message, TaskResult): + assert message == result + else: + assert message == result.messages[index] + index += 1 diff --git a/python/packages/autogen-agentchat/tests/test_group_chat.py b/python/packages/autogen-agentchat/tests/test_group_chat.py index 689be6238039..6a3c91b805c3 100644 --- a/python/packages/autogen-agentchat/tests/test_group_chat.py +++ b/python/packages/autogen-agentchat/tests/test_group_chat.py @@ -32,11 +32,11 @@ from autogen_agentchat.teams._group_chat._selector_group_chat import SelectorGroupChatManager from autogen_agentchat.teams._group_chat._swarm_group_chat import SwarmGroupChatManager from autogen_agentchat.ui import Console -from autogen_core import AgentId, CancellationToken, FunctionCall -from autogen_core.components.models import FunctionExecutionResult -from autogen_core.components.tools import FunctionTool +from autogen_core import AgentId, CancellationToken +from autogen_core.tools import FunctionTool from autogen_ext.code_executors.local import LocalCommandLineCodeExecutor -from autogen_ext.models import OpenAIChatCompletionClient, ReplayChatCompletionClient +from autogen_ext.models.openai import OpenAIChatCompletionClient +from autogen_ext.models.replay import ReplayChatCompletionClient from openai.resources.chat.completions import AsyncCompletions from openai.types.chat.chat_completion import ChatCompletion, Choice from openai.types.chat.chat_completion_chunk import ChatCompletionChunk @@ -306,6 +306,7 @@ async def test_round_robin_group_chat_with_tools(monkeypatch: pytest.MonkeyPatch usage=CompletionUsage(prompt_tokens=0, completion_tokens=0, total_tokens=0), ), ] + # Test with repeat tool calls once mock = _MockChatCompletion(chat_completions) monkeypatch.setattr(AsyncCompletions, "create", mock.mock_create) tool = FunctionTool(_pass_function, name="pass", description="pass function") @@ -320,27 +321,18 @@ async def test_round_robin_group_chat_with_tools(monkeypatch: pytest.MonkeyPatch result = await team.run( task="Write a program that prints 'Hello, world!'", ) - - assert len(result.messages) == 6 + assert len(result.messages) == 8 assert isinstance(result.messages[0], TextMessage) # task assert isinstance(result.messages[1], ToolCallMessage) # tool call assert isinstance(result.messages[2], ToolCallResultMessage) # tool call result assert isinstance(result.messages[3], TextMessage) # tool use agent response assert isinstance(result.messages[4], TextMessage) # echo agent response assert isinstance(result.messages[5], TextMessage) # tool use agent response - assert result.stop_reason is not None and result.stop_reason == "Text 'TERMINATE' mentioned" + assert isinstance(result.messages[6], TextMessage) # echo agent response + assert isinstance(result.messages[7], TextMessage) # tool use agent response, that has TERMINATE + assert result.messages[7].content == "TERMINATE" - context = tool_use_agent._model_context # pyright: ignore - assert context[0].content == "Write a program that prints 'Hello, world!'" - assert isinstance(context[1].content, list) - assert isinstance(context[1].content[0], FunctionCall) - assert context[1].content[0].name == "pass" - assert context[1].content[0].arguments == json.dumps({"input": "pass"}) - assert isinstance(context[2].content, list) - assert isinstance(context[2].content[0], FunctionExecutionResult) - assert context[2].content[0].content == "pass" - assert context[2].content[0].call_id == "1" - assert context[3].content == "Hello" + assert result.stop_reason is not None and result.stop_reason == "Text 'TERMINATE' mentioned" # Test streaming. tool_use_agent._model_context.clear() # pyright: ignore @@ -1033,3 +1025,48 @@ async def test_swarm_with_handoff_termination() -> None: assert result.messages[1].content == "Transferred to second_agent." assert result.messages[2].content == "Transferred to third_agent." assert result.messages[3].content == "Transferred to non_existing_agent." + + +@pytest.mark.asyncio +async def test_round_robin_group_chat_with_message_list() -> None: + # Create a simple team with echo agents + agent1 = _EchoAgent("Agent1", "First agent") + agent2 = _EchoAgent("Agent2", "Second agent") + termination = MaxMessageTermination(4) # Stop after 4 messages + team = RoundRobinGroupChat([agent1, agent2], termination_condition=termination) + + # Create a list of messages + messages: List[ChatMessage] = [ + TextMessage(content="Message 1", source="user"), + TextMessage(content="Message 2", source="user"), + TextMessage(content="Message 3", source="user"), + ] + + # Run the team with the message list + result = await team.run(task=messages) + + # Verify the messages were processed in order + assert len(result.messages) == 4 # Initial messages + echo until termination + assert result.messages[0].content == "Message 1" # First message + assert result.messages[1].content == "Message 2" # Second message + assert result.messages[2].content == "Message 3" # Third message + assert result.messages[3].content == "Message 1" # Echo from first agent + assert result.stop_reason == "Maximum number of messages 4 reached, current message count: 4" + + # Test with streaming + await team.reset() + index = 0 + async for message in team.run_stream(task=messages): + if isinstance(message, TaskResult): + assert message == result + else: + assert message == result.messages[index] + index += 1 + + # Test with invalid message list + with pytest.raises(ValueError, match="All messages in task list must be valid ChatMessage types"): + await team.run(task=["not a message"]) # type: ignore[list-item, arg-type] # intentionally testing invalid input + + # Test with empty message list + with pytest.raises(ValueError, match="Task list cannot be empty"): + await team.run(task=[]) diff --git a/python/packages/autogen-agentchat/tests/test_magentic_one_group_chat.py b/python/packages/autogen-agentchat/tests/test_magentic_one_group_chat.py index 2aa2ba61763f..b6e24c6f55b6 100644 --- a/python/packages/autogen-agentchat/tests/test_magentic_one_group_chat.py +++ b/python/packages/autogen-agentchat/tests/test_magentic_one_group_chat.py @@ -18,7 +18,7 @@ ) from autogen_agentchat.teams._group_chat._magentic_one._magentic_one_orchestrator import MagenticOneOrchestrator from autogen_core import AgentId, CancellationToken -from autogen_ext.models import ReplayChatCompletionClient +from autogen_ext.models.replay import ReplayChatCompletionClient from utils import FileLogHandler logger = logging.getLogger(EVENT_LOGGER_NAME) diff --git a/python/packages/autogen-agentchat/tests/test_society_of_mind_agent.py b/python/packages/autogen-agentchat/tests/test_society_of_mind_agent.py index a62d6c1dbf97..9bf4713d9c43 100644 --- a/python/packages/autogen-agentchat/tests/test_society_of_mind_agent.py +++ b/python/packages/autogen-agentchat/tests/test_society_of_mind_agent.py @@ -5,7 +5,7 @@ from autogen_agentchat.agents import AssistantAgent, SocietyOfMindAgent from autogen_agentchat.conditions import MaxMessageTermination from autogen_agentchat.teams import RoundRobinGroupChat -from autogen_ext.models import OpenAIChatCompletionClient +from autogen_ext.models.openai import OpenAIChatCompletionClient from openai.resources.chat.completions import AsyncCompletions from openai.types.chat.chat_completion import ChatCompletion, Choice from openai.types.chat.chat_completion_chunk import ChatCompletionChunk @@ -72,9 +72,20 @@ async def test_society_of_mind_agent(monkeypatch: pytest.MonkeyPatch) -> None: inner_team = RoundRobinGroupChat([agent1, agent2], termination_condition=inner_termination) society_of_mind_agent = SocietyOfMindAgent("society_of_mind", team=inner_team, model_client=model_client) response = await society_of_mind_agent.run(task="Count to 10.") - assert len(response.messages) == 5 + assert len(response.messages) == 4 assert response.messages[0].source == "user" - assert response.messages[1].source == "user" - assert response.messages[2].source == "assistant1" - assert response.messages[3].source == "assistant2" - assert response.messages[4].source == "society_of_mind" + assert response.messages[1].source == "assistant1" + assert response.messages[2].source == "assistant2" + assert response.messages[3].source == "society_of_mind" + + # Test save and load state. + state = await society_of_mind_agent.save_state() + assert state is not None + agent1 = AssistantAgent("assistant1", model_client=model_client, system_message="You are a helpful assistant.") + agent2 = AssistantAgent("assistant2", model_client=model_client, system_message="You are a helpful assistant.") + inner_termination = MaxMessageTermination(3) + inner_team = RoundRobinGroupChat([agent1, agent2], termination_condition=inner_termination) + society_of_mind_agent2 = SocietyOfMindAgent("society_of_mind", team=inner_team, model_client=model_client) + await society_of_mind_agent2.load_state(state) + state2 = await society_of_mind_agent2.save_state() + assert state == state2 diff --git a/python/packages/autogen-agentchat/tests/test_termination_condition.py b/python/packages/autogen-agentchat/tests/test_termination_condition.py index c8df96f42bc4..cc3cd810771e 100644 --- a/python/packages/autogen-agentchat/tests/test_termination_condition.py +++ b/python/packages/autogen-agentchat/tests/test_termination_condition.py @@ -13,7 +13,7 @@ TokenUsageTermination, ) from autogen_agentchat.messages import HandoffMessage, StopMessage, TextMessage -from autogen_core.components.models import RequestUsage +from autogen_core.models import RequestUsage @pytest.mark.asyncio diff --git a/python/packages/autogen-core/docs/src/conf.py b/python/packages/autogen-core/docs/src/conf.py index a723decc57e7..d64f14f863ed 100644 --- a/python/packages/autogen-core/docs/src/conf.py +++ b/python/packages/autogen-core/docs/src/conf.py @@ -98,21 +98,21 @@ # }, "show_prev_next": False, "icon_links": [ - { - "name": "Twitter", - "url": "https://twitter.com/pyautogen", - "icon": "fa-brands fa-twitter", - }, { "name": "GitHub", "url": "https://github.com/microsoft/autogen", "icon": "fa-brands fa-github", }, { - "name": "PyPI", - "url": "/autogen/dev/packages", - "icon": "fa-custom fa-pypi", + "name": "Discord", + "url": "https://aka.ms/autogen-discord", + "icon": "fa-brands fa-discord", }, + { + "name": "Twitter", + "url": "https://twitter.com/pyautogen", + "icon": "fa-brands fa-twitter", + } ], "announcement": 'AutoGen 0.4 is a work in progress. Go here to find the 0.2 documentation.', diff --git a/python/packages/autogen-core/docs/src/images/example-company.jpg b/python/packages/autogen-core/docs/src/images/example-company.jpg new file mode 100644 index 000000000000..ade3d7f86bba --- /dev/null +++ b/python/packages/autogen-core/docs/src/images/example-company.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f487409436d338efe69d2e6aab69d7ac786321e215136b2d18736031bf5028ae +size 112131 diff --git a/python/packages/autogen-core/docs/src/images/example-literature.jpg b/python/packages/autogen-core/docs/src/images/example-literature.jpg new file mode 100644 index 000000000000..fc718ef7e57a --- /dev/null +++ b/python/packages/autogen-core/docs/src/images/example-literature.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a450a2917e21ee9d643e4c6bf7fee62fadd2e654772492ce821ac467ac6ad195 +size 31965 diff --git a/python/packages/autogen-core/docs/src/images/example-travel.jpeg b/python/packages/autogen-core/docs/src/images/example-travel.jpeg new file mode 100644 index 000000000000..70f20a917a54 --- /dev/null +++ b/python/packages/autogen-core/docs/src/images/example-travel.jpeg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33c5749af8ebeb72d6020a147baebb3b801a14502d1c2d299dbe892d9ac5d8e0 +size 10894 diff --git a/python/packages/autogen-core/docs/src/index.md b/python/packages/autogen-core/docs/src/index.md index 698acdf1eefb..bebde85c1cce 100644 --- a/python/packages/autogen-core/docs/src/index.md +++ b/python/packages/autogen-core/docs/src/index.md @@ -56,7 +56,7 @@ AgentChat High-level API that includes preset agents and teams for building multi-agent systems. ```sh -pip install 'autogen-agentchat==0.4.0.dev9' +pip install 'autogen-agentchat==0.4.0.dev11' ``` 💡 *Start here if you are looking for an API similar to AutoGen 0.2.* @@ -77,7 +77,7 @@ Get Started Provides building blocks for creating asynchronous, event driven multi-agent systems. ```sh -pip install 'autogen-core==0.4.0.dev9' +pip install 'autogen-core==0.4.0.dev11' ``` +++ diff --git a/python/packages/autogen-core/docs/src/packages/index.md b/python/packages/autogen-core/docs/src/packages/index.md index b54a6a56ceee..913ce842e5c8 100644 --- a/python/packages/autogen-core/docs/src/packages/index.md +++ b/python/packages/autogen-core/docs/src/packages/index.md @@ -31,10 +31,10 @@ myst: Library that is at a similar level of abstraction as AutoGen 0.2, including default agents and group chat. ```sh -pip install 'autogen-agentchat==0.4.0.dev9' +pip install 'autogen-agentchat==0.4.0.dev11' ``` -[{fas}`circle-info;pst-color-primary` User Guide](/user-guide/agentchat-user-guide/index.md) | [{fas}`file-code;pst-color-primary` API Reference](/reference/python/autogen_agentchat.rst) | [{fab}`python;pst-color-primary` PyPI](https://pypi.org/project/autogen-agentchat/0.4.0.dev9/) | [{fab}`github;pst-color-primary` Source](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-agentchat) +[{fas}`circle-info;pst-color-primary` User Guide](/user-guide/agentchat-user-guide/index.md) | [{fas}`file-code;pst-color-primary` API Reference](/reference/python/autogen_agentchat.rst) | [{fab}`python;pst-color-primary` PyPI](https://pypi.org/project/autogen-agentchat/0.4.0.dev11/) | [{fab}`github;pst-color-primary` Source](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-agentchat) ::: (pkg-info-autogen-core)= @@ -46,10 +46,10 @@ pip install 'autogen-agentchat==0.4.0.dev9' Implements the core functionality of the AutoGen framework, providing basic building blocks for creating multi-agent systems. ```sh -pip install 'autogen-core==0.4.0.dev9' +pip install 'autogen-core==0.4.0.dev11' ``` -[{fas}`circle-info;pst-color-primary` User Guide](/user-guide/core-user-guide/index.md) | [{fas}`file-code;pst-color-primary` API Reference](/reference/python/autogen_core.rst) | [{fab}`python;pst-color-primary` PyPI](https://pypi.org/project/autogen-core/0.4.0.dev9/) | [{fab}`github;pst-color-primary` Source](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-core) +[{fas}`circle-info;pst-color-primary` User Guide](/user-guide/core-user-guide/index.md) | [{fas}`file-code;pst-color-primary` API Reference](/reference/python/autogen_core.rst) | [{fab}`python;pst-color-primary` PyPI](https://pypi.org/project/autogen-core/0.4.0.dev11/) | [{fab}`github;pst-color-primary` Source](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-core) ::: (pkg-info-autogen-ext)= @@ -61,7 +61,7 @@ pip install 'autogen-core==0.4.0.dev9' Implementations of core components that interface with external services, or use extra dependencies. For example, Docker based code execution. ```sh -pip install 'autogen-ext==0.4.0.dev9' +pip install 'autogen-ext==0.4.0.dev11' ``` Extras: @@ -71,7 +71,7 @@ Extras: - `docker` needed for {py:class}`~autogen_ext.code_executors.docker.DockerCommandLineCodeExecutor` - `openai` needed for {py:class}`~autogen_ext.models.OpenAIChatCompletionClient` -[{fas}`circle-info;pst-color-primary` User Guide](/user-guide/extensions-user-guide/index.md) | [{fas}`file-code;pst-color-primary` API Reference](/reference/python/autogen_ext.agents.web_surfer.rst) | [{fab}`python;pst-color-primary` PyPI](https://pypi.org/project/autogen-ext/0.4.0.dev9/) | [{fab}`github;pst-color-primary` Source](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-ext) +[{fas}`circle-info;pst-color-primary` User Guide](/user-guide/extensions-user-guide/index.md) | [{fas}`file-code;pst-color-primary` API Reference](/reference/python/autogen_ext.agents.web_surfer.rst) | [{fab}`python;pst-color-primary` PyPI](https://pypi.org/project/autogen-ext/0.4.0.dev11/) | [{fab}`github;pst-color-primary` Source](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-ext) ::: (pkg-info-autogen-magentic-one)= @@ -83,7 +83,7 @@ Extras: A generalist multi-agent softbot utilizing five agents to tackle intricate tasks involving multi-step planning and real-world actions. ```{note} -Not yet available on PyPI. +Not yet available on PyPI. Please install from source. ``` [{fab}`github;pst-color-primary` Source](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-magentic-one) diff --git a/python/packages/autogen-core/docs/src/reference/index.md b/python/packages/autogen-core/docs/src/reference/index.md index 15741ce30c77..905521debf3a 100644 --- a/python/packages/autogen-core/docs/src/reference/index.md +++ b/python/packages/autogen-core/docs/src/reference/index.md @@ -27,10 +27,10 @@ python/autogen_agentchat.state python/autogen_core python/autogen_core.code_executor -python/autogen_core.components.models -python/autogen_core.components.model_context -python/autogen_core.components.tools -python/autogen_core.components.tool_agent +python/autogen_core.models +python/autogen_core.model_context +python/autogen_core.tools +python/autogen_core.tool_agent python/autogen_core.exceptions python/autogen_core.logging ``` @@ -45,8 +45,9 @@ python/autogen_ext.agents.web_surfer python/autogen_ext.agents.file_surfer python/autogen_ext.agents.video_surfer python/autogen_ext.agents.video_surfer.tools -python/autogen_ext.models -python/autogen_ext.tools +python/autogen_ext.models.openai +python/autogen_ext.models.replay +python/autogen_ext.tools.langchain python/autogen_ext.code_executors.local python/autogen_ext.code_executors.docker python/autogen_ext.code_executors.azure diff --git a/python/packages/autogen-core/docs/src/reference/python/autogen_core.components.model_context.rst b/python/packages/autogen-core/docs/src/reference/python/autogen_core.model_context.rst similarity index 50% rename from python/packages/autogen-core/docs/src/reference/python/autogen_core.components.model_context.rst rename to python/packages/autogen-core/docs/src/reference/python/autogen_core.model_context.rst index dddfe4e2fdea..e8beee6b2ca0 100644 --- a/python/packages/autogen-core/docs/src/reference/python/autogen_core.components.model_context.rst +++ b/python/packages/autogen-core/docs/src/reference/python/autogen_core.model_context.rst @@ -1,8 +1,8 @@ -autogen\_core.components.model\_context +autogen\_core.model\_context ======================================= -.. automodule:: autogen_core.components.model_context +.. automodule:: autogen_core.model_context :members: :undoc-members: :show-inheritance: diff --git a/python/packages/autogen-core/docs/src/reference/python/autogen_core.components.models.rst b/python/packages/autogen-core/docs/src/reference/python/autogen_core.models.rst similarity index 52% rename from python/packages/autogen-core/docs/src/reference/python/autogen_core.components.models.rst rename to python/packages/autogen-core/docs/src/reference/python/autogen_core.models.rst index b2b1ed154939..9a2b06cfd46e 100644 --- a/python/packages/autogen-core/docs/src/reference/python/autogen_core.components.models.rst +++ b/python/packages/autogen-core/docs/src/reference/python/autogen_core.models.rst @@ -1,8 +1,8 @@ -autogen\_core.components.models +autogen\_core.models =============================== -.. automodule:: autogen_core.components.models +.. automodule:: autogen_core.models :members: :undoc-members: :show-inheritance: diff --git a/python/packages/autogen-core/docs/src/reference/python/autogen_core.components.tool_agent.rst b/python/packages/autogen-core/docs/src/reference/python/autogen_core.tool_agent.rst similarity index 51% rename from python/packages/autogen-core/docs/src/reference/python/autogen_core.components.tool_agent.rst rename to python/packages/autogen-core/docs/src/reference/python/autogen_core.tool_agent.rst index b18b93d8a394..18e8e8a7df5b 100644 --- a/python/packages/autogen-core/docs/src/reference/python/autogen_core.components.tool_agent.rst +++ b/python/packages/autogen-core/docs/src/reference/python/autogen_core.tool_agent.rst @@ -1,8 +1,8 @@ -autogen\_core.components.tool\_agent +autogen\_core.tool\_agent ==================================== -.. automodule:: autogen_core.components.tool_agent +.. automodule:: autogen_core.tool_agent :members: :undoc-members: :show-inheritance: diff --git a/python/packages/autogen-core/docs/src/reference/python/autogen_core.components.tools.rst b/python/packages/autogen-core/docs/src/reference/python/autogen_core.tools.rst similarity index 53% rename from python/packages/autogen-core/docs/src/reference/python/autogen_core.components.tools.rst rename to python/packages/autogen-core/docs/src/reference/python/autogen_core.tools.rst index 9895f97b5a9b..d4cba212476b 100644 --- a/python/packages/autogen-core/docs/src/reference/python/autogen_core.components.tools.rst +++ b/python/packages/autogen-core/docs/src/reference/python/autogen_core.tools.rst @@ -1,8 +1,8 @@ -autogen\_core.components.tools +autogen\_core.tools ============================== -.. automodule:: autogen_core.components.tools +.. automodule:: autogen_core.tools :members: :undoc-members: :show-inheritance: diff --git a/python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.openai.rst b/python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.openai.rst new file mode 100644 index 000000000000..44703cb70ee9 --- /dev/null +++ b/python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.openai.rst @@ -0,0 +1,8 @@ +autogen\_ext.models.openai +========================== + + +.. automodule:: autogen_ext.models.openai + :members: + :undoc-members: + :show-inheritance: diff --git a/python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.replay.rst b/python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.replay.rst new file mode 100644 index 000000000000..a3630970fa2b --- /dev/null +++ b/python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.replay.rst @@ -0,0 +1,8 @@ +autogen\_ext.models.replay +========================== + + +.. automodule:: autogen_ext.models.replay + :members: + :undoc-members: + :show-inheritance: diff --git a/python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.rst b/python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.rst deleted file mode 100644 index 3025c28dc570..000000000000 --- a/python/packages/autogen-core/docs/src/reference/python/autogen_ext.models.rst +++ /dev/null @@ -1,8 +0,0 @@ -autogen\_ext.models -=================== - - -.. automodule:: autogen_ext.models - :members: - :undoc-members: - :show-inheritance: diff --git a/python/packages/autogen-core/docs/src/reference/python/autogen_ext.tools.rst b/python/packages/autogen-core/docs/src/reference/python/autogen_ext.tools.langchain.rst similarity index 100% rename from python/packages/autogen-core/docs/src/reference/python/autogen_ext.tools.rst rename to python/packages/autogen-core/docs/src/reference/python/autogen_ext.tools.langchain.rst diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/company-research.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/company-research.ipynb index 3cc8bcbee0c5..a9959ccc158a 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/company-research.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/company-research.ipynb @@ -18,15 +18,16 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ - "from autogen_agentchat.agents import CodingAssistantAgent, ToolUseAssistantAgent\n", + "from autogen_agentchat.agents import AssistantAgent\n", "from autogen_agentchat.conditions import TextMentionTermination\n", "from autogen_agentchat.teams import RoundRobinGroupChat\n", - "from autogen_core.components.tools import FunctionTool\n", - "from autogen_ext.models import OpenAIChatCompletionClient" + "from autogen_agentchat.ui import Console\n", + "from autogen_core.tools import FunctionTool\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient" ] }, { @@ -55,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -78,7 +79,7 @@ " if not api_key or not search_engine_id:\n", " raise ValueError(\"API key or Search Engine ID not found in environment variables\")\n", "\n", - " url = \"https://www.googleapis.com/customsearch/v1\"\n", + " url = \"https://customsearch.googleapis.com/customsearch/v1\"\n", " params = {\"key\": str(api_key), \"cx\": str(search_engine_id), \"q\": str(query), \"num\": str(num_results)}\n", "\n", " response = requests.get(url, params=params)\n", @@ -212,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -233,165 +234,150 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ - "search_agent = ToolUseAssistantAgent(\n", + "search_agent = AssistantAgent(\n", " name=\"Google_Search_Agent\",\n", - " model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"),\n", - " registered_tools=[google_search_tool],\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o\"),\n", + " tools=[google_search_tool],\n", " description=\"Search Google for information, returns top 2 results with a snippet and body content\",\n", " system_message=\"You are a helpful AI assistant. Solve tasks using your tools.\",\n", ")\n", "\n", - "stock_analysis_agent = ToolUseAssistantAgent(\n", + "stock_analysis_agent = AssistantAgent(\n", " name=\"Stock_Analysis_Agent\",\n", - " model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"),\n", - " registered_tools=[stock_analysis_tool],\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o\"),\n", + " tools=[stock_analysis_tool],\n", " description=\"Analyze stock data and generate a plot\",\n", - " system_message=\"You are a helpful AI assistant. Solve tasks using your tools.\",\n", + " system_message=\"Perform data analysis.\",\n", ")\n", "\n", - "report_agent = CodingAssistantAgent(\n", + "report_agent = AssistantAgent(\n", " name=\"Report_Agent\",\n", - " model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"),\n", - " description=\"Generate a report based on the search and stock analysis results\",\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o\"),\n", + " description=\"Generate a report based the search and results of stock analysis\",\n", " system_message=\"You are a helpful assistant that can generate a comprehensive report on a given topic based on search and stock analysis. When you done with generating the report, reply with TERMINATE.\",\n", - ")\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating the Team\n", "\n", - "termination = TextMentionTermination(\"TERMINATE\")\n", - "team = RoundRobinGroupChat([search_agent, stock_analysis_agent, report_agent], termination_condition=termination)" + "Finally, let's create a team of the three agents and set them to work on researching a company." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "team = RoundRobinGroupChat([stock_analysis_agent, search_agent, report_agent], max_turns=3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use `max_turns=3` to limit the number of turns to exactly the same number of agents in the team. This effectively makes the agents work in a sequential manner." + ] + }, + { + "cell_type": "code", + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:07:56.762630]:\u001b[0m\n", - "\n", + "---------- user ----------\n", "Write a financial report on American airlines\n", - "From: user\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:07:57.840424], Google_Search_Agent:\u001b[0m\n", - "\n", - "[FunctionCall(id='call_Q72sGSLMyu2CLa7kVzZDHMpL', arguments='{\"query\":\"American Airlines financial report 2023\",\"num_results\":5}', name='google_search')]\n", - "From: Google_Search_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:08:04.880251], tool_agent_for_Google_Search_Agent:\u001b[0m\n", - "\n", - "[FunctionExecutionResult(content=\"[{'title': 'American Airlines reports fourth-quarter and full-year 2023 financial ...', 'link': 'https://news.aa.com/news/news-details/2024/American-Airlines-reports-fourth-quarter-and-full-year-2023-financial-results-CORP-FI-01/default.aspx', 'snippet': 'Jan 25, 2024 ... American Airlines Group Inc. (NASDAQ: AAL) today reported its fourth-quarter and full-year 2023 financial results, including: Record\\\\xa0...', 'body': 'Just a moment... Enable JavaScript and cookies to continue'}, {'title': 'Financial AAL | American Airlines', 'link': 'https://americanairlines.gcs-web.com/financial-results/financial-aal', 'snippet': 'Financial Results. Investor Relations; Financial Results; Financial Results ... Transcript 196.4 KB. 2023. Q4. Earnings Release · Form 10-K · Transcript 190.6 KB\\\\xa0...', 'body': 'Financial AAL | American Airlines Skip to main navigation Main Menu Investor Relations Toolkit Presentations & Investor Updates Financial Results SEC Filings Annual Shareholders Meeting Proxy Materials & Virtual Shareholder Meeting AGM – QA Written Responses Stock Info Events Equity Distribution Analysts FAQs Merger Information Contact Us Corporate Information About Us Leadership Bios Fact Sheets Where We Fly Our Planes News Corporate Governance Plan Travel American Airlines AAdvantage'}, {'title': 'American Airlines Group - AnnualReports.com', 'link': 'https://www.annualreports.com/Company/american-airlines-group', 'snippet': 'Most Recent Annual Report · View 2023 Sustainability Report · Older/Archived Annual Reports · Rate This Report.', 'body': 'American Airlines Group - AnnualReports.com Menu BROWSE BY Exchanges Industry Other Filters BROWSE BY Exchanges Industry Other Filters 0 American Airlines Group Ticker AAL Exchange NASDAQ More Industry Air Services, Other More Sector Industrial Goods More 10,000+ Employees Based in Dallas-Fort Worth, Texas American Airlines offers customers 6,800 daily flights to more than 365 destinations in 61 countries from its hubs in Charlotte, Chicago, Dallas-Fort Worth, Los Angeles, Miami, New York,'}, {'title': 'American Airlines reports fourth-quarter and full-year 2023 financial ...', 'link': 'https://americanairlines.gcs-web.com/news-releases/news-release-details/american-airlines-reports-fourth-quarter-and-full-year-2023', 'snippet': 'Jan 25, 2024 ... American produced record revenue of nearly $53 billion. In the fourth quarter, the company generated revenue of more than $13 billion and an operating margin\\\\xa0...', 'body': 'American Airlines reports fourth-quarter and full-year 2023 financial results | American Airlines Skip to main navigation Main Menu Investor Relations Toolkit Presentations & Investor Updates Financial Results SEC Filings Annual Shareholders Meeting Proxy Materials & Virtual Shareholder Meeting AGM – QA Written Responses Stock Info Events Equity Distribution Analysts FAQs Merger Information Contact Us Corporate Information About Us Leadership Bios Fact Sheets Where We Fly Our Planes News'}, {'title': 'American Airlines reports fourth-quarter and full-year 2023 financial ...', 'link': 'https://finance.yahoo.com/news/american-airlines-reports-fourth-quarter-120000360.html', 'snippet': 'Jan 25, 2024 ... FORT WORTH, Texas, Jan. 25, 2024 (GLOBE NEWSWIRE) -- American Airlines Group Inc. (NASDAQ: AAL) today reported its fourth-quarter and\\\\xa0...', 'body': 'Yahoo Will be right back... Thank you for your patience. Our engineers are working quickly to resolve the issue.'}]\", call_id='call_Q72sGSLMyu2CLa7kVzZDHMpL')]\n", - "From: tool_agent_for_Google_Search_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:08:06.643034], Google_Search_Agent:\u001b[0m\n", - "\n", - "[FunctionCall(id='call_7J6Eq4RA2aoxWJ71phUvkojN', arguments='{\"query\": \"American Airlines financial results 2023 full year\", \"num_results\": 2}', name='google_search'), FunctionCall(id='call_ixFuFFKDUDSdQSGLwWyxoIs6', arguments='{\"query\": \"American Airlines Q4 2023 earnings report\", \"num_results\": 2}', name='google_search')]\n", - "From: Google_Search_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:08:09.736878], tool_agent_for_Google_Search_Agent:\u001b[0m\n", - "\n", - "[FunctionExecutionResult(content=\"[{'title': 'American Airlines reports fourth-quarter and full-year 2023 financial ...', 'link': 'https://news.aa.com/news/news-details/2024/American-Airlines-reports-fourth-quarter-and-full-year-2023-financial-results-CORP-FI-01/default.aspx', 'snippet': 'Jan 25, 2024 ... American Airlines Group Inc. (NASDAQ: AAL) today reported its fourth-quarter and full-year 2023 financial results, including: Record\\\\xa0...', 'body': 'Just a moment... Enable JavaScript and cookies to continue'}, {'title': 'American Airlines reports fourth-quarter and full-year 2023 financial ...', 'link': 'https://americanairlines.gcs-web.com/news-releases/news-release-details/american-airlines-reports-fourth-quarter-and-full-year-2023', 'snippet': 'Jan 25, 2024 ... American produced record revenue of nearly $53 billion. In the fourth quarter, the company generated revenue of more than $13 billion and an operating margin\\\\xa0...', 'body': 'American Airlines reports fourth-quarter and full-year 2023 financial results | American Airlines Skip to main navigation Main Menu Investor Relations Toolkit Presentations & Investor Updates Financial Results SEC Filings Annual Shareholders Meeting Proxy Materials & Virtual Shareholder Meeting AGM – QA Written Responses Stock Info Events Equity Distribution Analysts FAQs Merger Information Contact Us Corporate Information About Us Leadership Bios Fact Sheets Where We Fly Our Planes News'}]\", call_id='call_7J6Eq4RA2aoxWJ71phUvkojN'), FunctionExecutionResult(content='[{\\'title\\': \\'American Airlines reports fourth-quarter and full-year 2023 financial ...\\', \\'link\\': \\'https://news.aa.com/news/news-details/2024/American-Airlines-reports-fourth-quarter-and-full-year-2023-financial-results-CORP-FI-01/default.aspx\\', \\'snippet\\': \\'Jan 25, 2024 ... American Airlines Group Inc. (NASDAQ: AAL) today reported its fourth-quarter and full-year 2023 financial results, including: Record\\\\xa0...\\', \\'body\\': \\'Just a moment... Enable JavaScript and cookies to continue\\'}, {\\'title\\': \\'Investor Relations | American Airlines\\', \\'link\\': \\'http://americanairlines.gcs-web.com/\\', \\'snippet\\': \"The Investor Relations website contains information about American Airlines\\'s business for stockholders, potential investors, and financial analysts.\", \\'body\\': \\'Investor Relations | American Airlines Skip to main navigation Main Menu Investor Relations Toolkit Presentations & Investor Updates Financial Results SEC Filings Annual Shareholders Meeting Proxy Materials & Virtual Shareholder Meeting AGM – QA Written Responses Stock Info Events Equity Distribution Analysts FAQs Merger Information Contact Us Corporate Information About Us Leadership Bios Fact Sheets Where We Fly Our Planes News Corporate Governance Plan Travel American Airlines AAdvantage\\'}]', call_id='call_ixFuFFKDUDSdQSGLwWyxoIs6')]\n", - "From: tool_agent_for_Google_Search_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:08:16.385923], Google_Search_Agent:\u001b[0m\n", - "\n", - "### Financial Report: American Airlines Group Inc. (2023)\n", + "---------- Stock_Analysis_Agent ----------\n", + "[FunctionCall(id='call_tPh9gSfGrDu1nC2Ck5RlfbFY', arguments='{\"ticker\":\"AAL\"}', name='analyze_stock')]\n", + "[Prompt tokens: 64, Completion tokens: 16]\n", + "Plot saved as coding/AAL_stockprice.png\n", + "---------- Stock_Analysis_Agent ----------\n", + "[FunctionExecutionResult(content=\"{'ticker': 'AAL', 'current_price': 17.4, '52_week_high': 18.09, '52_week_low': 9.07, '50_day_ma': 13.376799983978271, '200_day_ma': 12.604399962425232, 'ytd_price_change': 3.9600000381469727, 'ytd_percent_change': 29.46428691803602, 'trend': 'Upward', 'volatility': 0.4461582174242901, 'plot_file_path': 'coding/AAL_stockprice.png'}\", call_id='call_tPh9gSfGrDu1nC2Ck5RlfbFY')]\n", + "---------- Stock_Analysis_Agent ----------\n", + "Tool calls:\n", + "analyze_stock({\"ticker\":\"AAL\"}) = {'ticker': 'AAL', 'current_price': 17.4, '52_week_high': 18.09, '52_week_low': 9.07, '50_day_ma': 13.376799983978271, '200_day_ma': 12.604399962425232, 'ytd_price_change': 3.9600000381469727, 'ytd_percent_change': 29.46428691803602, 'trend': 'Upward', 'volatility': 0.4461582174242901, 'plot_file_path': 'coding/AAL_stockprice.png'}\n", + "---------- Google_Search_Agent ----------\n", + "[FunctionCall(id='call_wSHc5Kw1ix3aQDXXT23opVnU', arguments='{\"query\":\"American Airlines financial report 2023\",\"num_results\":1}', name='google_search')]\n", + "[Prompt tokens: 268, Completion tokens: 25]\n", + "---------- Google_Search_Agent ----------\n", + "[FunctionExecutionResult(content=\"[{'title': 'American Airlines reports fourth-quarter and full-year 2023 financial ...', 'link': 'https://news.aa.com/news/news-details/2024/American-Airlines-reports-fourth-quarter-and-full-year-2023-financial-results-CORP-FI-01/default.aspx', 'snippet': 'Jan 25, 2024 ... American Airlines Group Inc. (NASDAQ: AAL) today reported its fourth-quarter and full-year 2023 financial results, including: Record\\\\xa0...', 'body': 'Just a moment... Enable JavaScript and cookies to continue'}]\", call_id='call_wSHc5Kw1ix3aQDXXT23opVnU')]\n", + "---------- Google_Search_Agent ----------\n", + "Tool calls:\n", + "google_search({\"query\":\"American Airlines financial report 2023\",\"num_results\":1}) = [{'title': 'American Airlines reports fourth-quarter and full-year 2023 financial ...', 'link': 'https://news.aa.com/news/news-details/2024/American-Airlines-reports-fourth-quarter-and-full-year-2023-financial-results-CORP-FI-01/default.aspx', 'snippet': 'Jan 25, 2024 ... American Airlines Group Inc. (NASDAQ: AAL) today reported its fourth-quarter and full-year 2023 financial results, including: Record\\xa0...', 'body': 'Just a moment... Enable JavaScript and cookies to continue'}]\n", + "---------- Report_Agent ----------\n", + "### American Airlines Financial Report\n", "\n", "#### Overview\n", - "American Airlines Group Inc. (NASDAQ: AAL), one of the largest airlines in the world, released its financial results for the fourth quarter and full year of 2023 on January 25, 2024.\n", - "\n", - "#### Key Financial Highlights for Full Year 2023\n", - "- **Total Revenue**: American Airlines achieved record revenue of nearly **$53 billion** for the full year.\n", - "- **Operating Revenue**: In the fourth quarter, the airline generated more than **$13 billion** in revenue.\n", - "- **Operating Margin**: The operating margin improved significantly due to increased demand and operational efficiencies.\n", - "\n", - "#### Q4 Financial Results\n", - "- **Revenue in Q4**: The fourth quarter witnessed a robust revenue growth that reflects strong travel demand.\n", - "- **Performance Metrics**: Additional performance metrics include:\n", - " - Detailed information about passenger revenues, cargo revenues, and operational metrics such as capacity and load factors.\n", - " \n", - "#### Future Outlook\n", - "American Airlines is focusing on expanding its flight services and improving overall operational efficiency in 2024. The airline aims to capitalize on the continuing recovery in travel demand, which should positively impact future revenues and profitability.\n", - "\n", - "#### Corporate Strategy\n", - "The airline has emphasized the importance of sustainable practices and operational innovations in its corporate strategy to adapt to evolving market conditions.\n", - "\n", - "#### Links for More Information\n", - "- [American Airlines Q4 2023 Financial Results](https://news.aa.com/news/news-details/2024/American-Airlines-reports-fourth-quarter-and-full-year-2023-financial-results-CORP-FI-01/default.aspx)\n", - "- [Investor Relations Page](http://americanairlines.gcs-web.com/)\n", - "\n", - "This financial report provides a summary of American Airlines' financial performance and outlook as of 2023. For detailed insights, the complete financial statements and press releases should be consulted directly from the airline's investor relations resources.\n", - "From: Google_Search_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:08:16.961784], Stock_Analysis_Agent:\u001b[0m\n", - "\n", - "[FunctionCall(id='call_sXPgieP7Mih48h44NX3fCYIe', arguments='{\"ticker\":\"AAL\"}', name='analyze_stock')]\n", - "From: Stock_Analysis_AgentPlot saved as coding/AAL_stockprice.png\n", + "American Airlines Group Inc. (NASDAQ: AAL) is a major American airline headquartered in Fort Worth, Texas. It is known as one of the largest airlines in the world by fleet size, revenue, and passenger kilometers flown. As of the current quarter in 2023, American Airlines has shown significant financial activities and stock performance noteworthy for investors and analysts.\n", "\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:08:21.371132], tool_agent_for_Stock_Analysis_Agent:\u001b[0m\n", + "#### Stock Performance\n", + "- **Current Stock Price**: $17.40\n", + "- **52-Week Range**: The stock price has ranged from $9.07 to $18.09 over the past year, indicating considerable volatility and fluctuation in market interest.\n", + "- **Moving Averages**: \n", + " - 50-Day MA: $13.38\n", + " - 200-Day MA: $12.60\n", + " These moving averages suggest a strong upward trend in recent months as the 50-day moving average is positioned above the 200-day moving average, indicating bullish momentum.\n", "\n", - "[FunctionExecutionResult(content=\"{'ticker': 'AAL', 'current_price': 11.92, '52_week_high': 16.15, '52_week_low': 9.07, '50_day_ma': 10.573600044250488, '200_day_ma': 12.708699951171875, 'ytd_price_change': -1.5199995040893555, 'ytd_percent_change': -11.30952047281244, 'trend': 'Downward', 'volatility': 0.4110122561680265, 'plot_file_path': 'coding/AAL_stockprice.png'}\", call_id='call_sXPgieP7Mih48h44NX3fCYIe')]\n", - "From: tool_agent_for_Stock_Analysis_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:08:28.314277], Stock_Analysis_Agent:\u001b[0m\n", + "- **YTD Price Change**: $3.96\n", + "- **YTD Percent Change**: 29.46%\n", + " The year-to-date figures demonstrate a robust upward momentum, with the stock appreciating by nearly 29.5% since the beginning of the year.\n", "\n", - "### Financial Report: American Airlines Group Inc. (2023)\n", + "- **Trend**: The current stock trend for American Airlines is upward, reflecting positive market sentiment and performance improvements.\n", "\n", - "#### Overview\n", - "American Airlines Group Inc. (NASDAQ: AAL) is one of the largest airlines globally, with substantial operations in passenger and cargo transport. The company has recently released its financial results for the fourth quarter and the full year of 2023.\n", - "\n", - "#### Key Financial Highlights for Full Year 2023\n", - "- **Total Revenue**: American Airlines achieved record revenue of nearly **$53 billion** for the full year.\n", - "- **Operating Revenue**: The airline generated over **$13 billion** in revenue during the fourth quarter.\n", - "- **Operating Margin**: There was a significant improvement in the operating margin, driven by increased travel demand and operational efficiencies.\n", - "\n", - "#### Q4 Financial Results\n", - "- The fourth quarter showed robust revenue growth, reflecting strong demand for travel.\n", - "- Additional performance metrics included passenger revenues, cargo revenues, capacity, and load factors, showcasing the airline's recovery post-pandemic.\n", + "- **Volatility**: 0.446, indicating moderate volatility in the stock, which may attract risk-tolerant investors seeking dynamic movements for potential profit.\n", "\n", - "#### Stock Performance Overview\n", - "- **Current Stock Price**: $11.92\n", - "- **52-Week High**: $16.15\n", - "- **52-Week Low**: $9.07\n", - "- **50-Day Moving Average**: $11.84\n", - "- **200-Day Moving Average**: $12.71\n", - "- **Year-to-Date Price Change**: -$1.52\n", - "- **Year-to-Date Percent Change**: -11.31%\n", - "- **Trend**: The stock is currently in a downward trend.\n", - "- **Volatility**: The stock has a volatility of 41.10%.\n", + "#### Recent Financial Performance\n", + "According to the latest financial reports of 2023 (accessed through a reliable source), American Airlines reported remarkable figures for both the fourth quarter and the full year 2023. Key highlights from the report include:\n", "\n", - "![American Airlines Stock Price Trend](coding/AAL_stockprice.png)\n", + "- **Revenue Growth**: American Airlines experienced substantial revenue increases, driven by high demand for travel as pandemic-related restrictions eased globally.\n", + "- **Profit Margins**: The company managed to enhance its profitability, largely attributed to cost management strategies and increased operational efficiency.\n", + "- **Challenges**: Despite positive momentum, the airline industry faces ongoing challenges including fluctuating fuel prices, geopolitical tensions, and competition pressures.\n", "\n", - "#### Future Outlook\n", - "American Airlines aims to expand its services and improve operational efficiency throughout 2024. The airline is poised to benefit from the continuing recovery in travel demand, which is expected to positively affect future revenues and profitability.\n", + "#### Strategic Initiatives\n", + "American Airlines has been focusing on several strategic initiatives to maintain its market leadership and improve its financial metrics:\n", + "1. **Fleet Modernization**: Continuation of investment in more fuel-efficient aircraft to reduce operating costs and environmental impact.\n", + "2. **Enhanced Customer Experience**: Introduction of new services and technology enhancements aimed at improving customer satisfaction.\n", + "3. **Operational Efficiency**: Streamlining processes to cut costs and increase overall effectiveness, which includes leveraging data analytics for better decision-making.\n", "\n", - "#### Corporate Strategy\n", - "The airline has prioritized sustainability and innovation within its operational strategy to adapt to ever-changing market conditions.\n", + "#### Conclusion\n", + "American Airlines is demonstrating strong market performance and financial growth amid an evolving industry landscape. The company's stock has been on an upward trend, reflecting its solid operational strategies and recovery efforts post-COVID pandemic. Investors should remain mindful of external risks while considering American Airlines as a potential investment, supported by its current upward trajectory and strategic initiatives.\n", "\n", - "#### Links for More Information\n", - "- [American Airlines Q4 2023 Financial Results](https://news.aa.com/news/news-details/2024/American-Airlines-reports-fourth-quarter-and-full-year-2023-financial-results-CORP-FI-01/default.aspx)\n", - "- [Investor Relations Page](http://americanairlines.gcs-web.com/)\n", + "For further details, investors are encouraged to review the full financial reports from American Airlines and assess ongoing market conditions.\n", "\n", - "This financial report provides a comprehensive overview of American Airlines' financial performance and stock analysis as of 2023. For more detailed insights, please refer to the airline's investor relations resources.\n", - "From: Stock_Analysis_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:08:28.703160], Report_Agent:\u001b[0m\n", - "\n", - "TERMINATE\n", - "From: Report_AgentTeamRunResult(messages=[TextMessage(source='user', content='Write a financial report on American airlines'), TextMessage(source='Google_Search_Agent', content=\"### Financial Report: American Airlines Group Inc. (2023)\\n\\n#### Overview\\nAmerican Airlines Group Inc. (NASDAQ: AAL), one of the largest airlines in the world, released its financial results for the fourth quarter and full year of 2023 on January 25, 2024.\\n\\n#### Key Financial Highlights for Full Year 2023\\n- **Total Revenue**: American Airlines achieved record revenue of nearly **$53 billion** for the full year.\\n- **Operating Revenue**: In the fourth quarter, the airline generated more than **$13 billion** in revenue.\\n- **Operating Margin**: The operating margin improved significantly due to increased demand and operational efficiencies.\\n\\n#### Q4 Financial Results\\n- **Revenue in Q4**: The fourth quarter witnessed a robust revenue growth that reflects strong travel demand.\\n- **Performance Metrics**: Additional performance metrics include:\\n - Detailed information about passenger revenues, cargo revenues, and operational metrics such as capacity and load factors.\\n \\n#### Future Outlook\\nAmerican Airlines is focusing on expanding its flight services and improving overall operational efficiency in 2024. The airline aims to capitalize on the continuing recovery in travel demand, which should positively impact future revenues and profitability.\\n\\n#### Corporate Strategy\\nThe airline has emphasized the importance of sustainable practices and operational innovations in its corporate strategy to adapt to evolving market conditions.\\n\\n#### Links for More Information\\n- [American Airlines Q4 2023 Financial Results](https://news.aa.com/news/news-details/2024/American-Airlines-reports-fourth-quarter-and-full-year-2023-financial-results-CORP-FI-01/default.aspx)\\n- [Investor Relations Page](http://americanairlines.gcs-web.com/)\\n\\nThis financial report provides a summary of American Airlines' financial performance and outlook as of 2023. For detailed insights, the complete financial statements and press releases should be consulted directly from the airline's investor relations resources.\"), TextMessage(source='Stock_Analysis_Agent', content=\"### Financial Report: American Airlines Group Inc. (2023)\\n\\n#### Overview\\nAmerican Airlines Group Inc. (NASDAQ: AAL) is one of the largest airlines globally, with substantial operations in passenger and cargo transport. The company has recently released its financial results for the fourth quarter and the full year of 2023.\\n\\n#### Key Financial Highlights for Full Year 2023\\n- **Total Revenue**: American Airlines achieved record revenue of nearly **$53 billion** for the full year.\\n- **Operating Revenue**: The airline generated over **$13 billion** in revenue during the fourth quarter.\\n- **Operating Margin**: There was a significant improvement in the operating margin, driven by increased travel demand and operational efficiencies.\\n\\n#### Q4 Financial Results\\n- The fourth quarter showed robust revenue growth, reflecting strong demand for travel.\\n- Additional performance metrics included passenger revenues, cargo revenues, capacity, and load factors, showcasing the airline's recovery post-pandemic.\\n\\n#### Stock Performance Overview\\n- **Current Stock Price**: $11.92\\n- **52-Week High**: $16.15\\n- **52-Week Low**: $9.07\\n- **50-Day Moving Average**: $11.84\\n- **200-Day Moving Average**: $12.71\\n- **Year-to-Date Price Change**: -$1.52\\n- **Year-to-Date Percent Change**: -11.31%\\n- **Trend**: The stock is currently in a downward trend.\\n- **Volatility**: The stock has a volatility of 41.10%.\\n\\n![American Airlines Stock Price Trend](coding/AAL_stockprice.png)\\n\\n#### Future Outlook\\nAmerican Airlines aims to expand its services and improve operational efficiency throughout 2024. The airline is poised to benefit from the continuing recovery in travel demand, which is expected to positively affect future revenues and profitability.\\n\\n#### Corporate Strategy\\nThe airline has prioritized sustainability and innovation within its operational strategy to adapt to ever-changing market conditions.\\n\\n#### Links for More Information\\n- [American Airlines Q4 2023 Financial Results](https://news.aa.com/news/news-details/2024/American-Airlines-reports-fourth-quarter-and-full-year-2023-financial-results-CORP-FI-01/default.aspx)\\n- [Investor Relations Page](http://americanairlines.gcs-web.com/)\\n\\nThis financial report provides a comprehensive overview of American Airlines' financial performance and stock analysis as of 2023. For more detailed insights, please refer to the airline's investor relations resources.\"), StopMessage(source='Report_Agent', content='TERMINATE')])\n" + "_TERMINATE_\n", + "[Prompt tokens: 360, Completion tokens: 633]\n", + "---------- Summary ----------\n", + "Number of messages: 8\n", + "Finish reason: Maximum number of turns 3 reached.\n", + "Total prompt tokens: 692\n", + "Total completion tokens: 674\n", + "Duration: 19.38 seconds\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+UAAAIjCAYAAABlBbqXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hUZfbA8e+09J6QhEAg9NBBOqgUQUREURTFhmJbRV17+9lYdV3X3lZ3XYoF66rYEAQUQboovUNIIKT3Pu3+/rhzJwlpkzYzCefzPHlIMndm3plMwpx7znuOTlEUBSGEEEIIIYQQQrid3tMLEEIIIYQQQgghzlQSlAshhBBCCCGEEB4iQbkQQgghhBBCCOEhEpQLIYQQQgghhBAeIkG5EEIIIYQQQgjhIRKUCyGEEEIIIYQQHiJBuRBCCCGEEEII4SESlAshhBBCCCGEEB4iQbkQQgghhBBCCOEhEpQLIYQQXuTpp59Gp9ORnZ3tkfu/4YYbSEhI8Mh9//Of/yQxMRG73e6R+2/LLBYL8fHx/Otf//L0UoQQQjSSBOVCCCHc7l//+hc6nY5Ro0a5dPxDDz2ETqfjyiuvrPXy48ePo9PpeOmll5q0nu+++47x48cTHR1NQEAA3bt3Z/bs2axYscJ5zKlTp3j66afZsWNHk+7DHZYsWYJOp3N++Pn50bt3b+68804yMjI8vbx6FRYW8sILL/Dwww+j11e+Pan6ePR6PXFxcZx//vmsXbu2Vdbxr3/9iyVLljR43KeffopOp+Pf//53rZfffvvtmEwmdu7c2cIrrJ3JZOK+++7jueeeo7y83C33KYQQomVIUC6EEMLtli5dSkJCAlu3buXIkSP1HqsoCp988gkJCQl89913FBUVtehaXnrpJS6++GJ0Oh2PPvoor776KrNmzeLw4cN8+umnzuNOnTrFggULvDoo1/ztb3/jww8/5K233mLs2LG88847jBkzhtLS0gav+95773Hw4EE3rLK6RYsWYbVamTNnTo3LpkyZwocffsj777/PX/7yF3bt2sWkSZP48ccfW3wdrgblV111FRdccAGPPPJIjRMeW7du5T//+Q/33nsvgwcPbvE11uXGG28kOzubjz/+2G33KYQQovmMnl6AEEKIM0tSUhIbN27kq6++4rbbbmPp0qU89dRTdR6/du1aTp48yc8//8zUqVP56quvmDt3bousxWq18swzzzBlyhR++umnGpdnZma2yP2427Rp0xg+fDgAN998M5GRkbzyyit88803tQa9ACUlJQQGBmIymdy5VKfFixdz8cUX4+fnV+Oy3r17c+211zq/vvTSSxk0aBCvvfYa06ZNc+cyq3nnnXfo378/9957rzMQttls3HbbbXTp0oWnn3661degKArl5eX4+/sTFhbG+eefz5IlS5g3b16r37cQQoiWIZlyIYQQbrV06VLCw8OZPn06l19+OUuXLm3w+H79+jFx4kQmT57c4PGNkZ2dTWFhIePGjav18ujoaEA9MTBixAhAzUZq5dRVM6pffPEFw4YNw9/fn6ioKK699lpSU1Nr3OaBAweYPXs2HTp0wN/fnz59+vB///d/9a4zOTmZnj17MmDAgCaVoU+aNAlQT4iAum88KCiIo0ePcuGFFxIcHMw111zjvOz0PeV2u53XX3+dgQMH4ufnR4cOHbjgggv4/fffqx330UcfOZ+DiIgIrrrqKk6cONHg+pKSkti1axeTJ0926fEMHDiQqKgo5+NZv349V1xxBV26dMHX15f4+HjuvfdeysrKql0vPT2dG2+8kc6dO+Pr60vHjh255JJLOH78OAAJCQns3buXX3/91fkznjBhQp3rSEhI4Omnn+aTTz5h1apVALzxxhvs2LGDd955h4CAACoqKnjqqafo2bOnc20PPfQQFRUV1W5r8eLFTJo0iejoaHx9fenXrx/vvPNOrfd50UUXsXLlSoYPH46/v3+1EvopU6bw22+/kZub69JzKYQQwvMkKBdCCOFWS5cu5bLLLsPHx4c5c+Zw+PBhtm3bVuuxFRUVfPnll87s7pw5c/j5559JT09vkbVER0fj7+/Pd999V28Q07dvX/72t78BcOutt/Lhhx/y4Ycfcu655wLqXu7Zs2djMBh4/vnnueWWW/jqq684++yzyc/Pd97Orl27GDVqFD///DO33HILr7/+OjNnzuS7776r876PHj3KueeeS3BwMGvXriUmJqbRj/Po0aMAREZGOr9ntVqZOnUq0dHRvPTSS8yaNavO6990003cc889xMfH88ILL/DII4/g5+fH5s2bncc899xzXH/99fTq1YtXXnmFe+65hzVr1nDuuedWew5qs3HjRgDOOusslx5PXl4eeXl5zsfzxRdfUFpayu23386bb77J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ZsiQIbz88st89NFHQMtmmHv06MHOnTs577zz6r3d7777joqKCr799ttqWxsaKvuvjVaF0rdv38YvWAghhEfInnIhhBCtrqysjK+++oqLLrqIyy+/vMbHnXfeSVFREd9++y0AJ06cYN26dcyePbvW42+88UaOHDnCli1bmrWu0tJSNm3aVOtlP/74I1BZlq6VS5/eSXz48OFER0fz7rvvVhtz9eOPP7J//36mT58OQIcOHTj33HNZtGiRs9u3Ris5rkqn0/Gf//yHyy+/nLlz5zqfG3ebNWsWiqLUegJEW/dll12GwWBgwYIFNR6Loijk5OTUex9jxowBqDFizRVaZr7q/SqKwuuvv17tuNLSUsrLy6t9r0ePHgQHB1f7uQUGBjbYLd5Vs2fPJjU1lffee6/GZWVlZZSUlNT5GAoKCli8eHGj73P79u3odDrncyqEEML7SaZcCCFEq/v2228pKiri4osvrvXy0aNH06FDB5YuXcqVV17Jxx9/jKIodR5/4YUXYjQaWbp0KaNGjXJ+f82aNTUCL4CZM2fWupe7tLSUsWPHMnr0aC644ALi4+PJz89n2bJlrF+/npkzZzrLmnv06EFYWBjvvvsuwcHBBAYGMmrUKLp168YLL7zAjTfeyPjx45kzZw4ZGRm8/vrrJCQkcO+99zrv74033uDss8/mrLPO4tZbb6Vbt24cP36cH374gR07dtRYn16v56OPPmLmzJnMnj2b5cuX18jGt7aJEydy3XXX8cYbb3D48GHnqK/169czceJE7rzzTnr06MGzzz7Lo48+yvHjx5k5cybBwcEkJSXx9ddfc+utt/LAAw/UeR/du3dnwIABrF69mnnz5jVqfYmJifTo0YMHHniA1NRUQkJC+PLLL2vsLT906BDnnXces2fPpl+/fhiNRr7++msyMjK46qqrnMcNGzaMd955h2effZaePXsSHR3d5Of8uuuu4/PPP+cvf/kLv/zyC+PGjcNms3HgwAE+//xz56zx888/Hx8fH2bMmMFtt91GcXEx7733HtHR0c5KDVetWrWKcePGVRt/J4QQwst5pOe7EEKIM8qMGTMUPz8/paSkpM5jbrjhBsVkMinZ2dnKwIEDlS5dutR7mxMmTFCio6MVi8XiHIlW18eHH35Y621YLBblvffeU2bOnKl07dpV8fX1VQICApShQ4cqL774olJRUVHt+G+++Ubp16+fYjQaa4xH++yzz5ShQ4cqvr6+SkREhHLNNdc4R5BVtWfPHuXSSy9VwsLCFD8/P6VPnz7KE0884by86kg0TWlpqTJ+/HglKChI2bx5c53PiTYSbdu2bfU+d3PnzlUCAwPrvKzqSDRFURSr1aq8+OKLSmJiouLj46N06NBBmTZtWo3RcV9++aVy9tlnK4GBgUpgYKCSmJiozJ8/Xzl48GC961EURXnllVeUoKCgGqPBAGX+/Pn1Xnffvn3K5MmTlaCgICUqKkq55ZZblJ07d1b7GWVnZyvz589XEhMTlcDAQCU0NFQZNWqU8vnnn1e7rfT0dGX69OlKcHCwArg8Hq2u595sNisvvPCC0r9/f8XX11cJDw9Xhg0bpixYsEApKChwHvftt98qgwYNUvz8/JSEhATlhRdeUBYtWqQASlJSkvO4rl27KtOnT691Dfn5+YqPj4/y3//+16U1CyGE8A46RamlZk4IIYQQwo0KCgro3r07//znP7nppps8vZw26bXXXuOf//wnR48erbcZnBBCCO8ie8qFEEII4XGhoaE89NBDvPjiizW6jYuGWSwWXnnlFR5//HEJyIUQoo2RTLkQQgghhBBCCOEhkikXQgghhBBCCCE8xKNB+bp165gxYwZxcXHodDqWLVtW45j9+/dz8cUXExoaSmBgICNGjKgxSkYIIYQQQgghhGiLPBqUl5SUMHjwYN5+++1aLz969Chnn302iYmJrF27ll27dvHEE0/g5+fn5pUKIYQQQgghhBAtz2v2lOt0Or7++mtmzpzp/N5VV12FyWTiww8/9NzChBBCCCGEEEKIVmL09ALqYrfb+eGHH3jooYeYOnUqf/75J926dePRRx+tFrifrqKigoqKimq3k5ubS2RkJDqdzg0rF0IIIYQQQghxJlMUhaKiIuLi4tDr6y9Q99qgPDMzk+LiYv7xj3/w7LPP8sILL7BixQouu+wyfvnlF8aPH1/r9Z5//nkWLFjg5tUKIYQQQgghhBDVnThxgs6dO9d7jNeWr586dYpOnToxZ84cPv74Y+dxF198MYGBgXzyySe13s7pmfKCggK6dOlCUlISwcHBrfoYRE0Wi4VffvmFiRMnYjKZPL0c0QbIa0a4Sl4rorHkNSMaS14zojnk9XNmKyoqolu3buTn5xMaGlrvsV6bKY+KisJoNNKvX79q3+/bty+//fZbndfz9fXF19e3xvcjIiIICQlp8XWK+lksFgICAoiMjJQ/RsIl8poRrpLXimgsec2IxpLXjGgOef2c2bSfuStbqL12TrmPjw8jRozg4MGD1b5/6NAhunbt6qFVCSGEEEIIIYQQLcejmfLi4mKOHDni/DopKYkdO3YQERFBly5dePDBB7nyyis599xzmThxIitWrOC7775j7dq1nlu0EEIIIYQQQgjRQjwalP/+++9MnDjR+fV9990HwNy5c1myZAmXXnop7777Ls8//zx33303ffr04csvv+Tss8/21JKFEEIIIYQQQogW49GgfMKECTTUZ27evHnMmzfPTSsSQgghhBBCiLopioLVasVms9V7nMViwWg0Ul5e3uCxou0xGAwYjcYWGbvttY3ehBBCCCGEEMKbmM1m0tLSKC0tbfBYRVGIjY3lxIkTLRK4Ce8TEBBAx44d8fHxadbtSFAuhBBCCCGEEA2w2+0kJSVhMBiIi4vDx8en3mDbbrdTXFxMUFAQer3X9tcWTaAoCmazmaysLJKSkujVq1ezfsYSlAshhBBCCCFEA8xmM3a7nfj4eAICAho83m63Yzab8fPzk6C8HfL398dkMpGcnOz8OTeVvDqEEEIIIYQQwkUSYAtNS70W5BUlhBBCCCGEEEJ4iATlQgghhBBCCCGEh0hQLoQQQgghhBACnU7HsmXLPL2MRpswYQL33HOPp5fRZBKUCyGEEEIIIUQ7l56ezl133UX37t3x9fUlPj6eGTNmsGbNGk8vzenpp59Gp9Oh0+kwGo0kJCRw7733UlxcXO/1vvrqK5555hk3rbLlSfd1IYQQQgghhGjHjh8/zrhx4wgLC+PFF19k4MCBWCwWVq5cyfz58zlw4ICnl+jUv39/Vq9ejdVqZcOGDcybN4/S0lL+/e9/1zjWbDbj4+NDRESEB1baciRTLoQQQgghhBBNoCgKpWZrnR9lZlu9lzfnQ1EUl9d5xx13oNPp2Lp1K7NmzaJ3797079+f++67j82bN9d5vd27dzNp0iT8/f2JjIzk1ltvrZa1Xrt2LSNHjiQwMJCwsDDGjRtHcnKy8/JvvvmGs846Cz8/P7p3786CBQuwWq31rtVoNBIbG0vnzp258sorueaaa/j2228BNZM+ZMgQ/vvf/9KtWzfnGLLTy9crKip4+OGHiY+Px9fXl549e7Jw4ULn5Xv27GHatGkEBQURExPDddddR3Z2tsvPZ0uTTLkQQgghhBBCNEGZxUa/J1d65L73/W0qAT4Nh3O5ubmsWLGC5557jsDAwBqXh4WF1Xq9kpISpk6dypgxY9i2bRuZmZncfPPN3HnnnSxZsgSr1crMmTO55ZZb+OSTTzCbzWzduhWdTgfA+vXruf7663njjTc455xzOHr0KLfeeisATz31lMuP09/fH7PZ7Pz6yJEjfPnll3z11VcYDIZar3P99dezadMm3njjDQYPHkxSUpIz6M7Pz2fSpEncfPPNvPrqq5SVlfHwww8ze/Zsfv75Z5fX1ZIkKBdCCCGEEEKIdurIkSMoikJiYmKjrvfxxx9TXl7OBx984Azm33rrLWbMmMELL7yAyWSioKCAiy66iB49egDQt29f5/UXLFjAI488wty5cwHo3r07zzzzDA899JDLQfn27dv5+OOPmTRpkvN7ZrOZDz74gA4dOtR6nUOHDvH555+zatUqJk+e7LxvzVtvvcXQoUP5+9//7vzeokWLiI+P59ChQ/Tu3dultbUkCcqFEEK0GXa7wh8pefSODca/9pPjQgghhNv4mwzs+9vUWi+z2+0UFRYRHBKMXt/yu4b9Ta79R9iYMveq9u/fz+DBg6tl18eNG4fdbufgwYOce+653HDDDUydOpUpU6YwefJkZs+eTceOHQHYuXMnGzZs4LnnnnNe32azUV5eTmlpKQEBAbXe7+7duwkKCsJms2E2m5k+fTpvvfWW8/KuXbvWGZAD7NixA4PBwPjx42u9fOfOnfzyyy8EBQXVuOzo0aMSlAshhBD1Wb4njTs//pPwABN3T+pBaNPeZwghhBAtQqfT1VlCbrfbsfoYCPAxtkpQ7qpevXqh0+lapZnb4sWLufvuu1mxYgWfffYZjz/+OKtWrWL06NEUFxezYMECLrvsshrX0/aC16ZPnz58++23GI1G4uLi8PHxqXZ5bSX4Vfn7+9d7eXFxsTPbfzrthIK7SaM3IYQQbcafKfkA5JVaWPD9ARYelP/GhBBCiPpEREQwdepU3n77bUpKSmpcnp+fX+v1+vbty86dO6tdZ8OGDej1evr06eP83tChQ3n00UfZuHEjAwYM4OOPPwbgrLPO4uDBg/Ts2bPGR30nKXx8fOjZsycJCQk1AnJXDBw4ELvdzq+//lrr5WeddRZ79+4lISGhxroaCvhbi7ybEUII0WYcyVQ7vp6XGA3A3jw9ReUWTy5JCCGE8Hpvv/02NpuNkSNH8uWXX3L48GH279/PG2+8wZgxY2q9zjXXXIOfnx9z585lz549/PLLL9x1111cd911xMTEkJSUxKOPPsqmTZtITk7mp59+4vDhw8595U8++SQffPABCxYsYO/evezfv59PP/2Uxx9/vFUfa0JCAnPnzmXevHksW7aMpKQk1q5dy+effw7A/Pnzyc3NZc6cOWzbto2jR4+ycuVKbrzxRmw2W6uurS4SlAshhGgztKD8tvE9CA8wAZCaX+7JJQkhhBBer3v37vzxxx9MnDiR+++/nwEDBjBlyhTWrFnDO++8U+t1AgICWLlyJbm5uYwYMYLLL7+c8847z7m/OyAggAMHDjhHrN16663Mnz+f2267DYCpU6fy/fff89NPPzFixAhGjx7Nq6++SteuXVv98b7zzjtcfvnl3HHHHSQmJnLLLbc4M/5xcXFs2LABm83G+eefz8CBA7nnnnsICwvz2DYDndLUnf9tRGFhIaGhoRQUFBASEuLp5ZxxLBYLy5cv58ILL8RkMnl6OaINkNeMqEup2eocO/PHE1O4fuEW9pwq5N2rh3DBoE4eXp1oC+Tvi2gsec2IqsrLy0lKSqo2H7s+drudwsJCQkJCPLqnXLSe+l4TjYlD5dUhhBCiTTiWpZ7hjgj0ISLQh05h6n9+J/PLPLksIYQQQohmkaBcCCFEm3A4swiAnh3UESadw9XuqlK+LoQQQoi2TIJyIYQQbYK2n7xnjBqUdwpTg/KTeZIpF0IIIUTbJUG5EEIIr2W22ikzq51QnUG5I1PeyZkpl6BcCCGEEG1X7ZPuhRBCCA+z2uxMfW0diqKw/K/nVAbl0Y7ydceecgnKhRBCCNGWSVAuhBDCK53MKyMpW23u9tm2ExzPKQUqg/I4R/l6QZmVwnILIX7SGVkIIYQQbY+UrwshhPBKybmlzs9fXXUIm10h0MdAx1A1Qx7kayTQqE71TJV95UIIIYRooyQoF0II4ZVSckqcnxeWWwE1S67T6Zzfj/BV/5Vmb0IIIYRoqyQoF0II4ZWSHeXqPsbK/6p6OErXNRG+aqb8ZF4pQgghhBBtkQTlQgghvJJWvn7juAQMejU73rNGUK7+K5lyIYQQwjssWbKEsLAwTy+jTZGgXAghhFdKcWTKx3SPZM7IePQ6OLdXh2rHSKZcCCGEaNjTTz+NTqer9pGYmFjtmPLycubPn09kZCRBQUHMmjWLjIwMD624fsePH0en02EwGEhNTa12WVpaGkajEZ1Ox/Hjx2tcd+rUqRgMBrZt2+am1TZMgnIhhBBeR1EUUhyZ8q6Rgfzt4gHsenoqAzqFVjsuQu35JplyIYQQogH9+/cnLS3N+fHbb79Vu/zee+/lu+++44svvuDXX3/l1KlTXHbZZR5arWs6derEBx98UO1777//Pp06dar1+JSUFDZu3Midd97JokWL3LFEl0hQLoQQwutkFVdQZrGh10GnMH/0eh1BvjWneFZmyiUo1yiKwsYj2TyxbA87TuR7ejlCCNG+KQqYS+r+sJTWf3lzPhSlUUs1Go3ExsY6P6KiopyXFRQUsHDhQl555RUmTZrEsGHDWLx4MRs3bmTz5s313u6SJUvo0qULAQEBXHrppeTk5FS7/OjRo1xyySXExMQQFBTEiBEjWL16tfPyv/3tbwwYMKDG7Q4ZMoQnnnii3vueO3cuixcvrva9xYsXM3fu3FqPX7x4MRdddBG33347n3zyCWVl3vH+QeaUCyGE8Dpa6XrHUP9qjd5Op+0pLyiznPGzyksqrHz1x0ne35TMkcxiADKLyvn3dcM9vDIhhGjHLKXw97haL9IDYa1534+dAp9Alw8/fPgwcXFx+Pn5MWbMGJ5//nm6dOkCwPbt27FYLEyePNl5fGJiIl26dGHTpk2MHj261tvcsmULN910E88//zwzZ85kxYoVPPXUU9WOKS4u5sILL+S5557D19eXDz74gBkzZnDw4EG6dOnCvHnzWLBgAdu2bWPEiBEA/Pnnn+zatYuvvvqq3sd08cUX8+677/Lbb79x9tln89tvv5GXl8eMGTN45plnqh2rKAqLFy/m7bffJjExkZ49e/K///2P6667zuXnsLVIplwIIYTX0Tqvd40MqPc4PwOEB6iB+Jk6q/xYVjFPf7uX0X9fwxPf7HUG5ADFFVYPrkwIIYS3GDVqFEuWLGHFihW88847JCUlcc4551BUVARAeno6Pj4+NRq0xcTEkJ6eXuftvv7661xwwQU89NBD9O7dm7vvvpupU6dWO2bw4MHcdtttDBgwgF69evHMM8/Qo0cPvv32WwA6d+7M1KlTq2W8Fy9ezPjx4+nevXu9j8tkMnHttdc6S9EXLVrEtddei8lU8yT96tWrKS0tda7v2muvZeHChfXevrtIplwIIdzEbLWz4Ug2I7pF1FqKLSol57oWlINa3p5XauFkXhl9O4a09tK8gt2usPZQJks2JrPuUJbz+92iArl+TFeCfI08+L9dlFvsHlylEEKcAUwBasa6Fna7ncKiIkKCg9HrWyEXamr4/0jNtGnTnJ8PGjSIUaNG0bVrVz7//HNuuukml26jf//+JCcnA3DOOefw448/sn//fi699NJqx40ZM4YVK1Y4vy4uLubpp5/mhx9+IC0tDavVSllZGSkpKc5jbrnlFubNm8crr7yCXq/n448/5tVXX3VpXfPmzWPs2LH8/e9/54svvmDTpk1YrTVPSi9atIgrr7wSo1F9DzZnzhwefPBBjh49So8ePVy6r9Yi7wqFEMJNPv/9BI8v28Nt53bn0Qv7eno5Xi0lpwSALhENl+V1CvNjz6lCUs+QDuybjubw8Je7nI3wdDqY1Cea68cmcE7PKPR6HWsPZgJQbrF5cqlCCNH+6XR1l5Db7WCyqZe3RlDeDGFhYfTu3ZsjR44AEBsbi9lsJj8/v1q2PCMjg9jYWACWL1+OxWIBwN/f3+X7euCBB1i1ahUvvfQSPXv2xN/fn8svvxyz2ew8ZsaMGfj6+vL111/j4+ODxWLh8ssvd+n2Bw4cSGJiInPmzKFv374MGDCAHTt2VDsmNzeXr7/+GovFwjvvvOP8vs1mY9GiRTz33HMuP57WIEG5EEK4SWZhOQC7ThZ4eCXeT8uUd4loOAvQOVx9Y3AmNHvLKCzn9qXbyS+1EOJn5MoR8Vw7uitdI6u/IfQzGQAJyoUQQtSuuLiYo0ePOvdTDxs2DJPJxJo1a5g1axYABw8eJCUlhTFjxgDQtWvXGrfTt29ftmzZUu17pzeG27BhAzfccIMzo15cXFxjVJnRaHQ2bfPx8eGqq65qVOA/b9487rjjjmoBd1VLly6lc+fOLFu2rNr3f/rpJ15++WX+9re/YTAYXL6/liZBuRBCuInZpnZJPZpV3MCR4kQjy9eh/QfldrvCA1/sJL/UQv+4ED6/bQyBdWyDqAzKpXxdCCGEmq2eMWMGXbt25dSpUzz11FMYDAbmzJkDQGhoKDfddBP33XcfERERhISEcNdddzFmzJg6m7wB3H333YwbN46XXnqJSy65hJUrV1YrXQfo1asXX331FTNmzECn0/HEE09gt9f8/+nmm2+mb1+1knDDhg2Neny33HILV1xxRY098ZqFCxdy+eWX1+jyHh8fz6OPPsqKFSuYPn16o+6zJXlXHYUQQrRjZqv6H1BmUQVF5RYPr8Z7FVdYyS5WS9q6uBKUa5ny/PZdvr5oQxLrD2fjZ9Lz+lVD6wzIAfxM6n/vFVbJlAshhICTJ08yZ84c+vTpw+zZs4mMjGTz5s106NDBecyrr77KRRddxKxZszj33HOJjY1tsPv56NGjee+993j99dcZPHgwP/30E48//ni1Y1555RXCw8MZO3YsM2bMYOrUqZx11lk1bqtXr16MHTuWxMRERo0a1ajHZzQaiYqKcu4Xr2r79u3s3LnTWQFQVWhoKOedd57HG75JplwIIdzEYqs8K5yUXcKgzmGeW4wX08ahhQeYXBpx1jnMD2jfmXJFUXhjzWEA/m96P3pGB9V7vJ9RMuVCCCEqffrppw0e4+fnx9tvv83bb7/dqNueN28e8+bNq/a9+++/3/l5QkICP//8c7XL58+fX+N2FEXh1KlT3HHHHQ3eZ0JCAko9c9qHDBnivLyhY5cvX97g/bU2yZQLIYSbVA3KpYS9brtO5gPQJdK12atxjvL1/FJLu61AKCy3UliudpK9YljnBo+XPeVCCCHakqysLN566y3S09O58cYbPb0ct5NMuRBCuIlWvg5wLKvEgyvxXukF5Tz/4wEAzkuMduk6Qb5GwgNM5JVaSM0vIzG24ex6W5NVVAFAsK/RGXDXRytft9oVrDY7RoOcgxdCCOG9oqOjiYqK4j//+Q/h4eGeXo7bSVAuhBBuYrZJUJ5ZWM7KvenMHhGPr7F6cGm3K9z/xQ4KyiwM7BTKX8a7PjO0c3gAeaUFnMwtIzG2/c0qzy5Wg/IOwb4uHV81cC+32gmSoFwIIYQXq6+8/Ewg/0sLIYSbSPk6vPnzEZ74Zi/vrD1a47JFG5LYcCQHf5OB164ago/R9f+iKseitc9mb1qmPMrFoNy3ynMnJexCCCGEd5OgXAgh3KRq+XpSdgk2+5l3VlgLmpfvTqv2/X2nCvnnioMAPH5RX3p0qL+R2ena+6xyLSh3NVOu0+mcgbkE5UIIIYR3k6BcCCHcxGKrDMIrrHZO5bfPALI+uaVqI7ZDGcXOaoFyi42/fvonZpudyX1juHpkl0bfbudwdXRauw3KtfL1INeCcpBZ5d6kzGzj2BlaHSOEEKJhEpQLIYSbVN1TDmdmCXtuSYXz8xV70gH4x48HOJxZTIdgX16YNRCdTtfo2+3czmeVNzZTDpXN3iRT7nn3fraDSS//yp7UAk8vRQghhBeSoFwIIdxEK1/X9kqfic3e8koqR5at3JvOLwczWbLxOAAvXj6IyEZkgqtq95nyJgXlaqa8wipBuaf9eSLP8W++ZxcihBDCK0lQLoQQbqI1eusdo+6XPtMy5RVWG8UVVufXu04WcN9nOwC4YWwCE/q4NgKtNp3C2/es8uymlK8bpXzdG5RbbGQUqj+/5Owz70ScEEKIhklQLoQQbqIF5X1i1JFdZ1qmPN+xn9yg1zEyIQKAvFILvWOCeGRaYrNuW5tVDpDaDvfqS/l625WSW7ml4njOmfU7L4QQdbnhhhuYOXOmp5fhNSQoF0IIN9HK1/t2DAZg76mCapnj9i63xAxAeIAP0wbGAuBj0PP6VUOrzdVuKmcJe277CsptdoUcx3PXmKDcVxq9eYXknKpBefvseSCE8H7PP/88I0aMIDg4mOjoaGbOnMnBgwerHVNeXs78+fOJjIwkKCiIWbNmkZGRUe2YlJQUpk+fTkBAANHR0Tz44INYrd75XmbJkiXodDr69u1b47IvvvgCnU5HQkJCjcvKysqIiIggKiqKioqKGpe3BgnKhRDCTbTu60O7hJMQGUBhuZV//1pzXnd7lecILCMCTVwxPJ5ZZ3Xm9auG0LdjSIvcfnudVZ5XasZmV9DpICLQx+XrVXZfl0y5JyVXyY6n5JSekaMQhRCe9+uvvzJ//nw2b97MqlWrsFgsnH/++ZSUVP6Nuvfee/nuu+/44osv+PXXXzl16hSXXXaZ83Kbzcb06dMxm81s3LiR999/nyVLlvDkk0964iG5JDAwkMzMTDZt2lTt+wsXLqRLl9qnvXz55Zf079+fxMREli1b5oZVSlAuhBBuo3VfD/Ax8Mg09azte+uPnTGj0XJLKzPlQb5GXp49mGkDO7bY7bfXWeVa6XpEgA8mg+v/bTvnlEujN486UaV83Wyzk15Y7sHVCCFamqIolFpK6/wos5bVe3lzPhTF9ZN8K1as4IYbbqB///4MHjyYJUuWkJKSwvbt2wEoKChg4cKFvPLKK0yaNIlhw4axePFiNm7cyObNmwH46aef2LdvHx999BFDhgxh2rRpPPPMM7z99tuYzeY679tms3HfffcRFhZGZGQkDz30UI21r1ixgrPPPtt5zEUXXcTRo5WJi0mTJnHnnXdWu05WVhY+Pj6sWbOmzvs2Go1cffXVLFq0yPm9kydPsnbtWq6++upar7Nw4UKuvfZarr32WhYuXFjnbbcko1vuRQghhLN83WTQM7V/DCMTIth6PJeXVh7klSuHeHZxbpDrzJS7nu1tjPbagb0p+8lB5pR7i+Tc6pUbydkldArz99BqhBAtrcxaxqiPR3nkvrdcvYUAU0CTrltQoI5ojIhQe7xs374di8XC5MmTncckJibSpUsXNm3axOjRo9m0aRMDBw4kJibGeczUqVO5/fbb2bt3L0OHDq31vl5++WWWLFnCokWL6Nu3Ly+//DJff/01kyZNch5TUlLCfffdx6BBgyguLubJJ5/k0ksvZceOHej1em6++WbuvPNOXn75ZXx91f8PP/roIzp16lTtdmozb948JkyYwOuvv05AQABLlizhggsuqPY4NEePHmXTpk189dVXKIrCvffeS3JyMl27dnXxmW0ayZQLIYSbaI3efAx6dDodj1+kZsu/+jOV3Sfb//xi557yVgvK2+escmfn9cYG5UZp9OYNUhz7yIN81TxIkjR7E0J4mN1u55577mHcuHEMGDAAgPT0dHx8fAgLC6t2bExMDOnp6c5jTg9kta+1Y2rz2muv8eijj3LZZZfRt29f3n33XUJDQ6sdM2vWLC677DJ69uzJkCFDWLRoEbt372bfvn0AzjL6b775xnmdJUuWcMMNN6DT6ep9vEOHDqV79+7873//Q1EUlixZwrx582o9dtGiRUybNo3w8HAiIiKYOnUqixcvrvf2W4JHM+Xr1q3jxRdfZPv27aSlpfH1119X68J3ww038P7771e7ztSpU1mxYoWbVyqEEM3nDModwdKgzmHMHBLHsh2nePaHfXx66+gG/2Npy5x7ygMkU94Yzkx5I2e4O+eUS1DuMTa7wglHj4OxPSL5aV9GtcZvQoi2z9/oz5art9R6md1up6ioiODgYPT6ls+F+hubVnUzf/589uzZw2+//dai60lJSaFfv37Orx977DHmz59PWloao0ZVVhMYjUaGDx9erYT98OHDPPnkk2zZsoXs7GzsdrvzNgcMGICfnx/XXXcd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wPj++++bPc9NN91kzJw586ivdeGFFxpXXnmlX+Pas2ePARhr165t9pivv/7aAIzCwkK/zint43jPmUsvvdS48847jbvvvtsYO3bsUcfidruNnj17Gg8//LDvvqKiIiM0NNR44403Gh3/4osvGrGxscf4DqW9dOa54vXBBx8YFovFqKmpOer5pX10xjnTt29f45FHHvHzO5TjoTPOm/pqamqMpKQk47777jvquaX9dba583//939GcnKyUVtb6ztmw4YNBmDs3LnTr+9Zgo8y5UJxcTEA8fHxgHn1z+l0MmvWLN8xw4YNo0+fPnz//fdHPY/3HE1Zu3YtS5cu5dRTT22nkUugHM858+KLL7J7927uvvtuv8ayZ88ecnJyGrx2bGwskydPPuprS8fo7HOloKCA1157jWnTpuFwOPx6HWmbzjpnHnjgARISEhg/fjwPP/wwLpfLr9eQ9tFZ543Xhx9+SH5+Pj/+8Y/9eg1pP51t7lRXVxMSEoLVWhfGhYeHA+bSUemc7IEegASW2+3m17/+NSeddBKjRo0CICcnh5CQkEbrblNSUsjJyWnyPEuXLuWtt97ik08+afRY7969yc3NxeVycc899/DTn/603b8P6TjHc87s3LmTP/7xjyxevBi73b9fT97zp6Sk+P3a0jE681y57bbbeOKJJ6ioqGDKlCl8/PHHfr2GtE1nnTO//OUvmTBhAvHx8SxdupTbb7+d7Oxs/vWvf/n1OtI2nXXe1PfCCy9wxhln0Lt3b79eQ9pHZ5w7p512GrfeeisPP/wwv/rVrygvL+ePf/wjANnZ2X69jgQfZcq7uZtvvplNmzbx5ptvtvocmzZt4vzzz+fuu+9mzpw5jR5fvHgxq1at4plnnuHRRx/ljTfeAOC1114jKirK97F48eJWj0E6zvGaM7W1tVx++eXce++9DBkypMnnac50Lp15rvz+979n7dq1LFiwAJvNxtVXX41hGK3+PsQ/nXXO3HrrrcyYMYMxY8Zwww038M9//pN///vfVFdXt/r7EP911nnjdfDgQT7//HOuu+66Vo9fWqczzp2RI0fy3//+l3/+859ERETQs2dP+vfvT0pKSoPsuXQyga6fl8C5+eabjd69exu7d+9ucP+XX37Z5DrtPn36GP/6178a3Ld582YjOTnZuOOOO/x6zb/85S/GkCFDDMMwjJKSEmPnzp2+j4qKigbHak158Dmec6awsNAADJvN5vuwWCy++7788ssm58yuXbuanCennHKK8ctf/rLR96A15R2jK8wVrwMHDhiAsXTp0pa/EeK3rjRnNm3aZADGtm3bWv5GSIt0hXlz3333GUlJSepb0cG6wtzJyckxSktLjbKyMsNqtRr/+9//Wv+GSEApKO+G3G63cfPNNxtpaWnGjh07Gj3ubXDxzjvv+O7btm1bowYXmzZtMpKTk43f//73fr/2vffea/Tt29evYxWUB4+OmDO1tbXGxo0bG3zceOONxtChQ42NGzcaZWVlzY6tZ8+exj/+8Q/ffcXFxWr0FiBdaa547du3zwCMr7/+2p+3QFqoK86ZV1991bBarUZBQYFf74G0XFeZN2632+jfv7/x29/+tsXvgbROV5k79b3wwgtGRESE/h7uxBSUd0M33nijERsba3zzzTdGdna276N+pvqGG24w+vTpY3z11VfGqlWrjKlTpxpTp071Pb5x40YjKSnJuPLKKxuc4/Dhw75jnnjiCePDDz80duzYYezYscN4/vnnjejoaONPf/rTUceXn59vrF271vjkk08MwHjzzTeNtWvXGtnZ2b5jsrOzjbVr1xrPPfecARiLFi0y1q5da+Tn57fjOyVeHTVnjuRPp1LDMIwHHnjAiIuLMz744ANjw4YNxvnnn2/079/fqKys9B2zb98+Y+3atca9995rREVFGWvXrjXWrl1rlJaWtu5NkSZ19rmybNky49///rexdu1aY+/evcaXX35pTJs2zRg4cKBRVVXV+jdGmtXZ58zSpUuNRx55xFi3bp2xa9cu49VXXzWSkpKMq6++uvVvihxTZ583Xl988YUBGFu3bm35myCt0hXmzr///W9j9erVxvbt240nnnjCCA8PNx577LHWvSESFBSUd0NAkx8vvvii75jKykrjpptuMnr06GFEREQYF154YYOg+O67727yHPWz4I8//rgxcuRIIyIiwoiJiTHGjx9vPPXUUw22cGjKiy++2OS577777mO+fv3vQdpPR82ZI/n7D5jb7Tb+/Oc/GykpKUZoaKhx+umnG9u3b29wzDXXXNPk6yv72b46+1zZsGGDMXPmTCM+Pt4IDQ01+vXrZ9xwww3GwYMHW/N2iB86+5xZvXq1MXnyZCM2NtYICwszhg8fbvztb3/TRZzjrLPPG6/LLrvMmDZtWku+dWmjrjB3rrrqKiM+Pt4ICQkxxowZY7z88sstfRskyFgMQ51rRERERERERAJBLfpEREREREREAkRBuYiIiIiIiEiAKCgXERERERERCRAF5SIiIiIiIiIBoqBcREREREREJEAUlIuIiIiIiIgEiIJyERERERERkQBRUC4iIiIiIiISIArKRURERERERAJEQbmIiEgXd+2112KxWLBYLDgcDlJSUpg9ezb/+c9/cLvdfp/npZdeIi4u7vgNVEREpBtSUC4iItINnHnmmWRnZ7N3714+/fRTZs6cya9+9SvOOeccXC5XoIcnIiLSbSkoFxER6QZCQ0Pp2bMnvXr1YsKECdxxxx188MEHfPrpp7z00ksA/Otf/2L06NFERkaSnp7OTTfdRFlZGQDffPMNP/7xjykuLvZl3e+55x4Aqqur+d3vfkevXr2IjIz8/3bunqWRLo7D8M9ksQhioVhoIdEiNuKQRiFgIxYBI9iIghAEmwgWiuI30EEhIrGxEwtBRES7FCZaKBaSJvENbCRNfCuCBDHqmC0WFsLu0z27h2zuqzxnMpx/eTPkqKenR8fHx2YGBQCgwhDlAABUqb6+PlmWpb29PUmSy+VSLBbT5eWlNjc3lUwmNT8/L0kKBAJaXV1VfX29crmccrmc5ubmJElTU1M6OzvT9va20um0hoeHFQwGdXt7a2w2AAAqRU2pVCqZPgQAAPhzxsfHlc/ntb+//8ve6Oio0um0rq6uftnb3d1VJBLR8/OzpB//KZ+enlY+n//5TDabVXt7u7LZrFpaWn6u9/f3q7u7W4uLi//7PAAA/Eu+mT4AAAAwp1QqqaamRpJ0eHgo27Z1c3Ojl5cXfX5+6u3tTa+vr/J4PL/9fSaTkeM48vl8ZevFYlGNjY1//PwAAFQ6ohwAgCp2fX2ttrY23d3dKRQKaXJyUgsLC2poaNDJyYkmJib0/v7+n1FeKBTkdruVSqXkdrvL9urq6v7GCAAAVDSiHACAKpVMJpXJZDQzM6NUKqWvry9Fo1G5XD+unNnZ2Sl7vra2Vo7jlK35/X45jqPHx0f19vb+tbMDAPCvIMoBAKgCxWJR9/f3chxHDw8Pisfjsm1boVBI4XBYFxcX+vj40NramgYHB3V6eqr19fWyd3i9XhUKBSUSCVmWJY/HI5/Pp7GxMYXDYUWjUfn9fj09PSmRSKirq0sDAwOGJgYAoDJw+zoAAFUgHo+rublZXq9XwWBQR0dHisViOjg4kNvtlmVZWllZ0dLSkjo7O7W1tSXbtsveEQgEFIlENDIyoqamJi0vL0uSNjY2FA6HNTs7q46ODg0NDen8/Fytra0mRgUAoKJw+zoAAAAAAIbwpRwAAAAAAEOIcgAAAAAADCHKAQAAAAAwhCgHAAAAAMAQohwAAAAAAEOIcgAAAAAADCHKAQAAAAAwhCgHAAAAAMAQohwAAAAAAEOIcgAAAAAADCHKAQAAAAAw5DuHpkaHCHJ9YgAAAABJRU5ErkJggg==", + "text/plain": [ + "TaskResult(messages=[TextMessage(source='user', models_usage=None, content='Write a financial report on American airlines', type='TextMessage'), ToolCallMessage(source='Stock_Analysis_Agent', models_usage=RequestUsage(prompt_tokens=64, completion_tokens=16), content=[FunctionCall(id='call_tPh9gSfGrDu1nC2Ck5RlfbFY', arguments='{\"ticker\":\"AAL\"}', name='analyze_stock')], type='ToolCallMessage'), ToolCallResultMessage(source='Stock_Analysis_Agent', models_usage=None, content=[FunctionExecutionResult(content=\"{'ticker': 'AAL', 'current_price': 17.4, '52_week_high': 18.09, '52_week_low': 9.07, '50_day_ma': 13.376799983978271, '200_day_ma': 12.604399962425232, 'ytd_price_change': 3.9600000381469727, 'ytd_percent_change': 29.46428691803602, 'trend': 'Upward', 'volatility': 0.4461582174242901, 'plot_file_path': 'coding/AAL_stockprice.png'}\", call_id='call_tPh9gSfGrDu1nC2Ck5RlfbFY')], type='ToolCallResultMessage'), TextMessage(source='Stock_Analysis_Agent', models_usage=None, content='Tool calls:\\nanalyze_stock({\"ticker\":\"AAL\"}) = {\\'ticker\\': \\'AAL\\', \\'current_price\\': 17.4, \\'52_week_high\\': 18.09, \\'52_week_low\\': 9.07, \\'50_day_ma\\': 13.376799983978271, \\'200_day_ma\\': 12.604399962425232, \\'ytd_price_change\\': 3.9600000381469727, \\'ytd_percent_change\\': 29.46428691803602, \\'trend\\': \\'Upward\\', \\'volatility\\': 0.4461582174242901, \\'plot_file_path\\': \\'coding/AAL_stockprice.png\\'}', type='TextMessage'), ToolCallMessage(source='Google_Search_Agent', models_usage=RequestUsage(prompt_tokens=268, completion_tokens=25), content=[FunctionCall(id='call_wSHc5Kw1ix3aQDXXT23opVnU', arguments='{\"query\":\"American Airlines financial report 2023\",\"num_results\":1}', name='google_search')], type='ToolCallMessage'), ToolCallResultMessage(source='Google_Search_Agent', models_usage=None, content=[FunctionExecutionResult(content=\"[{'title': 'American Airlines reports fourth-quarter and full-year 2023 financial ...', 'link': 'https://news.aa.com/news/news-details/2024/American-Airlines-reports-fourth-quarter-and-full-year-2023-financial-results-CORP-FI-01/default.aspx', 'snippet': 'Jan 25, 2024 ... American Airlines Group Inc. (NASDAQ: AAL) today reported its fourth-quarter and full-year 2023 financial results, including: Record\\\\xa0...', 'body': 'Just a moment... Enable JavaScript and cookies to continue'}]\", call_id='call_wSHc5Kw1ix3aQDXXT23opVnU')], type='ToolCallResultMessage'), TextMessage(source='Google_Search_Agent', models_usage=None, content='Tool calls:\\ngoogle_search({\"query\":\"American Airlines financial report 2023\",\"num_results\":1}) = [{\\'title\\': \\'American Airlines reports fourth-quarter and full-year 2023 financial ...\\', \\'link\\': \\'https://news.aa.com/news/news-details/2024/American-Airlines-reports-fourth-quarter-and-full-year-2023-financial-results-CORP-FI-01/default.aspx\\', \\'snippet\\': \\'Jan 25, 2024 ... American Airlines Group Inc. (NASDAQ: AAL) today reported its fourth-quarter and full-year 2023 financial results, including: Record\\\\xa0...\\', \\'body\\': \\'Just a moment... Enable JavaScript and cookies to continue\\'}]', type='TextMessage'), TextMessage(source='Report_Agent', models_usage=RequestUsage(prompt_tokens=360, completion_tokens=633), content=\"### American Airlines Financial Report\\n\\n#### Overview\\nAmerican Airlines Group Inc. (NASDAQ: AAL) is a major American airline headquartered in Fort Worth, Texas. It is known as one of the largest airlines in the world by fleet size, revenue, and passenger kilometers flown. As of the current quarter in 2023, American Airlines has shown significant financial activities and stock performance noteworthy for investors and analysts.\\n\\n#### Stock Performance\\n- **Current Stock Price**: $17.40\\n- **52-Week Range**: The stock price has ranged from $9.07 to $18.09 over the past year, indicating considerable volatility and fluctuation in market interest.\\n- **Moving Averages**: \\n - 50-Day MA: $13.38\\n - 200-Day MA: $12.60\\n These moving averages suggest a strong upward trend in recent months as the 50-day moving average is positioned above the 200-day moving average, indicating bullish momentum.\\n\\n- **YTD Price Change**: $3.96\\n- **YTD Percent Change**: 29.46%\\n The year-to-date figures demonstrate a robust upward momentum, with the stock appreciating by nearly 29.5% since the beginning of the year.\\n\\n- **Trend**: The current stock trend for American Airlines is upward, reflecting positive market sentiment and performance improvements.\\n\\n- **Volatility**: 0.446, indicating moderate volatility in the stock, which may attract risk-tolerant investors seeking dynamic movements for potential profit.\\n\\n#### Recent Financial Performance\\nAccording to the latest financial reports of 2023 (accessed through a reliable source), American Airlines reported remarkable figures for both the fourth quarter and the full year 2023. Key highlights from the report include:\\n\\n- **Revenue Growth**: American Airlines experienced substantial revenue increases, driven by high demand for travel as pandemic-related restrictions eased globally.\\n- **Profit Margins**: The company managed to enhance its profitability, largely attributed to cost management strategies and increased operational efficiency.\\n- **Challenges**: Despite positive momentum, the airline industry faces ongoing challenges including fluctuating fuel prices, geopolitical tensions, and competition pressures.\\n\\n#### Strategic Initiatives\\nAmerican Airlines has been focusing on several strategic initiatives to maintain its market leadership and improve its financial metrics:\\n1. **Fleet Modernization**: Continuation of investment in more fuel-efficient aircraft to reduce operating costs and environmental impact.\\n2. **Enhanced Customer Experience**: Introduction of new services and technology enhancements aimed at improving customer satisfaction.\\n3. **Operational Efficiency**: Streamlining processes to cut costs and increase overall effectiveness, which includes leveraging data analytics for better decision-making.\\n\\n#### Conclusion\\nAmerican Airlines is demonstrating strong market performance and financial growth amid an evolving industry landscape. The company's stock has been on an upward trend, reflecting its solid operational strategies and recovery efforts post-COVID pandemic. Investors should remain mindful of external risks while considering American Airlines as a potential investment, supported by its current upward trajectory and strategic initiatives.\\n\\nFor further details, investors are encouraged to review the full financial reports from American Airlines and assess ongoing market conditions.\\n\\n_TERMINATE_\", type='TextMessage')], stop_reason='Maximum number of turns 3 reached.')" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+UAAAIjCAYAAABlBbqXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hUZfbA8e+09EYaSSAFQgm9S5XeEURxUWwgdrHruro/G5Z11bWLurpSVBAriIoUlQ7SlA4BQgglvfdkyv39cWcmCSmkT8r5PM88SWbuzH1ncjOZc895z6tRFEVBCCGEEEIIIYQQjU7r6AEIIYQQQgghhBCtlQTlQgghhBBCCCGEg0hQLoQQQgghhBBCOIgE5UIIIYQQQgghhINIUC6EEEIIIYQQQjiIBOVCCCGEEEIIIYSDSFAuhBBCCCGEEEI4iATlQgghhBBCCCGEg0hQLoQQQgghhBBCOIgE5UIIIUQT8vzzz6PRaEhNTXXI/ufNm0dERIRD9v3aa68RFRWFxWJxyP6bM6PRSGhoKB988IGjhyKEEKKGJCgXQgjR6D744AM0Gg2DBw+u1vZPPPEEGo2G66+/vsLbz549i0aj4T//+U+txvPjjz8yatQoAgMDcXNzo2PHjsyePZt169bZt4mPj+f555/nwIEDtdpHY1i6dCkajcZ+cXFxoUuXLtx///0kJSU5enhVys7O5tVXX+Uf//gHWm3Jx5PSz0er1RISEsLEiRPZvHlzg4zjgw8+YOnSpZfdbuXKlWg0Gv773/9WePu9996LwWDg4MGD9TzCihkMBh599FFefvllCgsLG2WfQggh6ocE5UIIIRrd8uXLiYiIYM+ePZw+fbrKbRVF4csvvyQiIoIff/yRnJyceh3Lf/7zH2bMmIFGo+Gpp57irbfeYtasWZw6dYqVK1fat4uPj2fhwoVNOii3eeGFF/j88895//33GTZsGB9++CFDhw4lPz//svf95JNPiI6OboRRlrV48WJMJhNz5swpd9uECRP4/PPPWbZsGffccw+HDh1i7Nix/PLLL/U+juoG5TfccAOTJ0/mySefLHfCY8+ePXz88cc88sgj9OnTp97HWJnbbruN1NRUVqxY0Wj7FEIIUXd6Rw9ACCFE6xIbG8vOnTv5/vvvufvuu1m+fDnPPfdcpdtv3ryZCxcu8PvvvzNp0iS+//575s6dWy9jMZlMvPjii0yYMIENGzaUuz05Oble9tPYpkyZwsCBAwG444478PPz48033+SHH36oMOgFyMvLw93dHYPB0JhDtVuyZAkzZszAxcWl3G1dunTh5ptvtv98zTXX0Lt3b95++22mTJnSmMMs48MPP6RHjx488sgj9kDYbDZz9913ExYWxvPPP9/gY1AUhcLCQlxdXfHx8WHixIksXbqU+fPnN/i+hRBC1A/JlAshhGhUy5cvp02bNkybNo3rrruO5cuXX3b77t27M2bMGMaPH3/Z7WsiNTWV7Oxshg8fXuHtgYGBgHpiYNCgQYCajbSVU5fOqH7zzTcMGDAAV1dX/P39ufnmm7l48WK5xzxx4gSzZ88mICAAV1dXunbtyv/93/9VOc64uDg6depEz549a1WGPnbsWEA9IQLqvHEPDw9iYmKYOnUqnp6e3HTTTfbbLp1TbrFYeOedd+jVqxcuLi4EBAQwefJk9u3bV2a7L774wv4a+Pr6csMNN3D+/PnLji82NpZDhw4xfvz4aj2fXr164e/vb38+27Zt429/+xthYWE4OzsTGhrKI488QkFBQZn7JSYmctttt9G+fXucnZ0JDg7m6quv5uzZswBERERw9OhRtmzZYv8djx49utJxRERE8Pzzz/Pll1+yceNGAN59910OHDjAhx9+iJubG0VFRTz33HN06tTJPrYnnniCoqKiMo+1ZMkSxo4dS2BgIM7OznTv3p0PP/ywwn1eddVVrF+/noEDB+Lq6lqmhH7ChAls376d9PT0ar2WQgghHE+CciGEEI1q+fLlXHvttTg5OTFnzhxOnTrF3r17K9y2qKiI7777zp7dnTNnDr///juJiYn1MpbAwEBcXV358ccfqwxiunXrxgsvvADAXXfdxeeff87nn3/OyJEjAXUu9+zZs9HpdLzyyivceeedfP/994wYMYLMzEz74xw6dIjBgwfz+++/c+edd/LOO+8wc+ZMfvzxx0r3HRMTw8iRI/H09GTz5s20bdu2xs8zJiYGAD8/P/t1JpOJSZMmERgYyH/+8x9mzZpV6f1vv/12Hn74YUJDQ3n11Vd58skncXFx4Y8//rBv8/LLL3PrrbfSuXNn3nzzTR5++GF+++03Ro4cWeY1qMjOnTsB6N+/f7WeT0ZGBhkZGfbn880335Cfn8+9997Le++9x6RJk3jvvfe49dZby9xv1qxZrFq1ittuu40PPviABx98kJycHM6dOwfA22+/Tfv27YmKirL/ji93wsRWon7vvfdy+vRpnn32WXtpu8ViYcaMGfznP/9h+vTpvPfee8ycOZO33nqrXH+EDz/8kPDwcP75z3/yxhtvEBoayn333ceiRYvK7TM6Opo5c+YwYcIE3nnnHfr27Wu/bcCAASiKYn9NhRBCNAOKEEII0Uj27dunAMrGjRsVRVEUi8WitG/fXnnooYcq3P7bb79VAOXUqVOKoihKdna24uLiorz11ltltouNjVUA5fXXX6/xmJ599lkFUNzd3ZUpU6YoL7/8srJ///5y2+3du1cBlCVLlpS5vri4WAkMDFR69uypFBQU2K//6aefFEB59tln7deNHDlS8fT0VOLi4so8hsVisX//3HPPKYCSkpKiHD9+XAkJCVEGDRqkpKenX/a5LFmyRAGUX3/9VUlJSVHOnz+vrFy5UvHz81NcXV2VCxcuKIqiKHPnzlUA5cknnyz3GHPnzlXCw8PtP//+++8KoDz44IPltrWN++zZs4pOp1NefvnlMrcfPnxY0ev15a6/1NNPP60ASk5OTrnbAOX2229XUlJSlOTkZGX37t3KuHHjFEB54403FEVRlPz8/HL3e+WVVxSNRmN/rTMyMqp1jPTo0UMZNWpUldtcavfu3YpWq1V8fX0VHx8fJTExUVEURfn8888VrVarbNu2rcz2H330kQIoO3bssF9X0XOYNGmS0rFjxzLXhYeHK4Cybt26CscSHx+vAMqrr75ao+cghBDCcSRTLoQQotEsX76ctm3bMmbMGAB7R/WVK1diNpsr3H7gwIF06tQJAE9PT6ZNm1avJewLFy5kxYoV9OvXj/Xr1/N///d/DBgwgP79+3P8+PHL3n/fvn0kJydz3333lZkPPW3aNKKiovj5558BSElJYevWrcyfP5+wsLAyj6HRaMo97pEjRxg1ahQRERH8+uuvtGnTptrPafz48QQEBBAaGsoNN9yAh4cHq1atol27dmW2u/feey/7WN999x0ajabCef+2cX///fdYLBZmz55Namqq/RIUFETnzp3ZtGlTlftIS0tDr9fj4eFR4e2ffvopAQEBBAYGMnjwYHbs2MGjjz7Kww8/DICrq6t927y8PFJTUxk2bBiKovDXX3/Zt3FycmLz5s1kZGRc9nnXxBVXXME9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/z46OpoLFy4wevRovLy86NmzZ7nH6dGjBwcOHCjzOh04cACNRmO/bt++fdx2223ceOON9n2fP38eJycnPD09ycnJoU2bNsydO5evvvoKJycnbrjhBtq2bVvp+D08PABwd3fHy8uL22+/nfvvv59Fixbh5eWFu7u7fTsvLy8+++wz2rdvX26O+saNG3nzzTf597//Xessd2FhIa6urowcObJZHxPNhdFoZOPGjUyYMKHCaQpCVEaOHVFbcuyIupJjSNSWHDu1Y7EoKLvUExkTJ4zH1715ROWVJSQr0iyC8m3bthEdHc1XX3112W2dnZ1xdnYud73BYCh38JvNZjQaDVqtFm0zmp/w+OOPM336dMLDw4mPj+e5555Dp9Nx4403otVqadOmDbfffjuPP/44/v7+eHl58cADDzB06FCGDRtW6eM+9NBDDB8+nDfffJOrr76a9evXs379egD769O5c2dWrVrFjBkz0Gg0PPPMM1gsFntnfFC75t95551069YNgB07dlT5+tpus/0e7r77bq6//np8fHzK/G5s3y9evJjrrruuXJf38PBw/vnPf7JhwwamTZtWq9dWq9Wi0WgqPF5Ew5HXW9SWHDuituTYEXUlx5CoLTl2aqbIZLZ/7+ri1Gxeu5qMs1lEop9++ikDBgwo02CsNbtw4QJz5syha9euzJ49Gz8/P/744w8CAgLs27z11ltcddVVzJo1i5EjRxIUFHTZ7udDhgzhk08+4Z133qFPnz5s2LCBp59+usw2b775Jm3atGHYsGFMnz6dSZMm0b9//3KP1blzZ4YNG0ZUVBSDBw+u0fPT6/X4+/uj15c/Z7R//34OHjxYYQd+b29vxo0bx6efflqj/QkhhBBCCCGaJpO5ZOloQzNKpNaEQzPlubm5nD592v5zbGwsBw4cwNfX1768V3Z2Nt988w1vvPGGo4bZ5KxcufKy27i4uLBo0SIWLVpUo8eeP38+8+fPL3PdY489Zv8+IiKC33//vcztCxYsAMo2llMUhfj4eO67777L7jMiIsLeJK4iffv2td9+uW3Xrl172f0JIYQQQgghmgfbGuUAOlkSrf7t27ePMWPG2H+2zQWfO3cuS5cuBdQAVFEU5syZ44ghilpISUnh66+/JjExkdtuu83RwxFCCCGEEEI0UyZzSeLPoJOgvN6NHj26yqwnwF133cVdd93VSCMS9SEoKAh/f38+/vhj2rRp4+jhCCGEEEIIIZopW6Zcpy3pYdXSNItGb6J5MZvNzapxnhBCCCGEEKJpKh2Ut1QSOQkhhBBCCCGEaJJs5esGCcqFEEIIIYQQQojGZcuU63UtN3Rtuc9MCCGEEEIIIUSzZlsSTS+ZciGEEEIIIYQQonEZreXr+hbaeR0kKBdCCCGEEEII0USZbeXrLbiRdMt9ZkIIIYQQQgghmjWTRTLlQlzWvHnzmDlzpqOHIYQQQgghhGhhjDKnXDRFr7zyCoMGDcLT05PAwEBmzpxJdHR0mW0KCwtZsGABfn5+eHh4MGvWLJKSkspsc+7cOaZNm4abmxuBgYH8/e9/x2QyNeZTqbalS5ei0Wjo1q1budu++eYbNBoNERER5W4rKCjA19cXf39/ioqKGmGkQgghhBBCiPoi5euiSdqyZQsLFizgjz/+YOPGjRiNRiZOnEheXp59m0ceeYQff/yRb775hi1bthAfH8+1115rv91sNjNt2jSKi4vZuXMny5YtY+nSpTz77LOOeErV4u7uTnJyMrt27Spz/aeffkpYWFiF9/nuu+/o0aMHUVFRrF69uhFGKYQQQgghhKgv0uitFVIUhXxjfqNfFEWp9hjXrVvHvHnz6NGjB3369GHp0qWcO3eO/fv3A5CVlcWnn37Km2++ydixYxkwYABLlixh586d/PHHHwBs2LCBY8eO8cUXX9C3b1+mTJnCiy++yKJFiyguLq5032azmUcffRQfHx/8/Px44oknyo193bp1jBgxwr7NVVddRUxMjP32sWPHcv/995e5T0pKCk5OTvz222+V7luv13PjjTeyePFi+3UXLlxg8+bN3HjjjRXe59NPP+Xmm2/m5ptv5tNPP630sYUQQgghhBBNj31JtBa8Trne0QNoagpMBQxeMbjR97v7xt24Gdxqdd+srCwAfH19Adi/fz9Go5Hx48fbt4mKiiIsLIxdu3YxZMgQdu3aRa9evWjbtq19m0mTJnHvvfdy9OhR+vXrV+G+3njjDZYuXcrixYvp1q0bb7zxBqtWrWLs2LH2bfLy8nj00Ufp3bs3ubm5PPvss1xzzTUcOHAArVbLHXfcwf33388bb7yBs7MzAF988QXt2rUr8zgVmT9/PqNHj+add97Bzc2NpUuXMnny5DLPwyYmJoZdu3bx/fffoygKjzzyCHFxcYSHh1fzlRVCCCGEEEI4kskic8pFE2exWHj44YcZPnw4PXv2BCAxMREnJyd8fHzKbNu2bVsSExPt21wayNp+tm1TkbfffpunnnqKa6+9lm7duvHRRx/h7e1dZptZs2Zx7bXX0qlTJ/r27cvixYs5fPgwx44dA7CX0f/www/2+yxdupR58+ah0VT9x9avXz86duzIt99+i6IoLF26lPnz51e47eLFi5kyZQpt2rTB19eXSZMmsWTJkiofXwghhBBCCNF02Luvt+CgXDLll3DVu7L7xt0O2W9tLFiwgCNHjrB9+/Z6Hc+5c+fo3r27/ed//vOfLFiwgISEBAYPLqkk0Ov1DBw4sEwJ+6lTp3j++efZvXs3qampWKx/SOfOnaNnz564uLhwyy23sHjxYmbPns2ff/7JkSNHWLNmTbXGNn/+fJYsWUJYWBh5eXlMnTqV999/v8w2ZrOZZcuW8c4779ivu/nmm3n88cd59tln0bbgRhFCCCGEEEK0FLbydYOUr7ceGo2m1mXkje3+++/np59+YuvWrbRv395+fVBQEMXFxWRmZpbJliclJREUFGTfZs+ePWUez9adPSgoiJCQEA4cOGC/zVYaXx1XX3014eHhfPLJJ4SEhGCxWOjZs2eZuep33HEHffv25cKFCyxZsoSxY8dWu6z8pptu4oknnuD555/nlltuQa8vfxivX7+eixcvcv3115e53mw289tvvzFhwoRqPx8hhBBCCCGEY9jK13UtOFPeck83tGCKonD//fezatUqfv/9dzp06FDm9gEDBmAwGMo0TYuOjubcuXMMHToUgKFDh3L48GGSk5Pt22zcuBEvLy+6d++OXq+nU6dO9ouvry/e3t4EBweze3dJJYHJZLI3mANIT08nOjqap59+mnHjxtGtWzcyMjLKPYdevXoxcOBAPvnkE1asWFFpCXpFfH19mTFjBlu2bKn0fp9++ik33HADBw4cKHO54YYbpOGbEEIIIYQQzYTJ2n3d0IK7r0umvBlasGABK1as4IcffsDT09M+B9zb2xtXV1e8vb25/fbbefTRR/H19cXLy4sHHniAoUOHMmTIEAAmTpxI9+7dueWWW3jttddITEzk6aefZsGCBfbmaxV56KGH+Pe//03nzp2JiorizTffJDMz0367reP6xx9/THBwMOfOnePJJ5+s8LFsDd/c3d255ppr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iIiIL6ido4iIiIiIiIiPKCkXERERERER8REl5SIiIiIiIiI+oqRcRERERERExEeUlIuIiIiIiIj4iJJyERERERERER9RUi4iIiIiIiLiI0rKRURERERERHxESbmIiIiIiIiIjygpFxERaeWuueYaLBYLFosFu91OYmIiEydO5D//+Q9ut7vWj/Pee+8RFRXVdIGKiIi0QUrKRURE2oDTTjuNtLQ0du7cyU8//cT48eP505/+xJlnnklFRYWvwxMREWmzlJSLiIi0AQ6Hg6SkJNq3b8+QIUN46KGH+Oabb/jpp5947733AHjxxRfp378/oaGhdOzYkVtuuYXCwkIAZs+ezbXXXkteXp531v3RRx8FoKysjHvuuYf27dsTGhrK8OHDmT17tm9eqIiIiJ9RUi4iItJGnXzyyQwcOJCvvvoKAKvVyiuvvMK6det4//33mTlzJvfddx8AI0eO5B//+AcRERGkpaWRlpbGPffcA8Btt93GwoUL+eSTT1i9ejUXXXQRp512Glu2bPHZaxMREfEXFsMwDF8HISIiIk3nmmuuITc3l6lTpx5x26WXXsrq1atZv379Ebd98cUX3HTTTWRlZQHmmvI777yT3Nxc7zG7d++ma9eu7N69m3bt2nmvnzBhAieccAJPPvlko78eERGR1iTA1wGIiIiI7xiGgcViAeDXX3/lqaeeYuPGjeTn51NRUUFpaSnFxcWEhIRUe/81a9bgcrno2bNnlevLysqIjY1t8vhFRET8nZJyERGRNmzDhg2kpKSwc+dOzjzzTG6++WaeeOIJYmJimD9/Ptdffz3l5eU1JuWFhYXYbDaWLVuGzWarcltYWFhzvAQRERG/pqRcRESkjZo5cyZr1qzhz3/+M8uWLcPtdvPCCy9gtZotZz777LMqxwcGBuJyuapcN3jwYFwuF5mZmYwZM6bZYhcREWktlJSLiIi0AWVlZaSnp+NyucjIyGDatGk89dRTnHnmmUyZMoW1a9fidDp59dVXOeuss/jtt9948803qzxGly5dKCwsZMaMGQwcOJCQkBB69uzJFVdcwZQpU3jhhRcYPHgw+/fvZ8aMGQwYMIAzzjjDR69YRETEP6j7uoiISBswbdo0kpOT6dKlC6eddhqzZs3ilVde4ZtvvsFmszFw4EBefPFFnnnmGfr168dHH33EU089VeUxRo4cyU033cQll1xCfHw8zz77LADvvvsuU6ZM4e6776ZXr16ce+65LFmyhE6dOvnipYqIiPgVdV8XERERERER8RHNlIuIiIiIiIj4iJJyERERERERER9RUi4iIiIiIiLiI0rKRURERERERHxESbmIiIiIiIiIjygpFxEREREREfERJeUiIiIiIiIiPqKkXERERERERMRHlJSLiIiIiIiI+IiSchEREREREREfUVIuIiIiIiIi4iP/D8qtFloq3E+YAAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -401,8 +387,8 @@ } ], "source": [ - "result = await team.run(task=\"Write a financial report on American airlines\")\n", - "print(result)" + "stream = team.run_stream(task=\"Write a financial report on American airlines\")\n", + "await Console(stream)" ] } ], @@ -422,7 +408,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.6" + "version": "3.11.5" } }, "nbformat": 4, diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/index.md b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/index.md index 6ee1557f9b2d..2879e9fcb32b 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/index.md +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/index.md @@ -12,7 +12,7 @@ A list of examples to help you get started with AgentChat. :::::{grid} 2 2 2 3 ::::{grid-item-card} Travel Planning -:img-top: ../../../images/code.svg +:img-top: ../../../images/example-travel.jpeg :img-alt: travel planning example :link: ./travel-planning.html @@ -22,7 +22,7 @@ Generating a travel plan using multiple agents. :::: ::::{grid-item-card} Company Research -:img-top: ../../../images/code.svg +:img-top: ../../../images/example-company.jpg :img-alt: company research example :link: ./company-research.html @@ -32,7 +32,7 @@ Generating a company research report using multiple agents with tools. :::: ::::{grid-item-card} Literature Review -:img-top: ../../../images/code.svg +:img-top: ../../../images/example-literature.jpg :img-alt: literature review example :link: ./literature-review.html diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/literature-review.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/literature-review.ipynb index e769a84b1bd5..c4d22fa6eedb 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/literature-review.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/literature-review.ipynb @@ -18,15 +18,16 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "from autogen_agentchat.agents import CodingAssistantAgent, ToolUseAssistantAgent\n", + "from autogen_agentchat.agents import AssistantAgent\n", "from autogen_agentchat.conditions import TextMentionTermination\n", "from autogen_agentchat.teams import RoundRobinGroupChat\n", - "from autogen_core.components.tools import FunctionTool\n", - "from autogen_ext.models import OpenAIChatCompletionClient" + "from autogen_agentchat.ui import Console\n", + "from autogen_core.tools import FunctionTool\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient" ] }, { @@ -161,180 +162,150 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "google_search_agent = AssistantAgent(\n", + " name=\"Google_Search_Agent\",\n", + " tools=[google_search_tool],\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"),\n", + " description=\"An agent that can search Google for information, returns results with a snippet and body content\",\n", + " system_message=\"You are a helpful AI assistant. Solve tasks using your tools.\",\n", + ")\n", + "\n", + "arxiv_search_agent = AssistantAgent(\n", + " name=\"Arxiv_Search_Agent\",\n", + " tools=[arxiv_search_tool],\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"),\n", + " description=\"An agent that can search Arxiv for papers related to a given topic, including abstracts\",\n", + " system_message=\"You are a helpful AI assistant. Solve tasks using your tools. Specifically, you can take into consideration the user's request and craft a search query that is most likely to return relevant academi papers.\",\n", + ")\n", + "\n", + "\n", + "report_agent = AssistantAgent(\n", + " name=\"Report_Agent\",\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"),\n", + " description=\"Generate a report based on a given topic\",\n", + " system_message=\"You are a helpful assistant. Your task is to synthesize data extracted into a high quality literature review including CORRECT references. You MUST write a final report that is formatted as a literature review with CORRECT references. Your response should end with the word 'TERMINATE'\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating the Team \n", + "\n", + "Finally, we will create a team of agents and configure them to perform the tasks." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "termination = TextMentionTermination(\"TERMINATE\")\n", + "team = RoundRobinGroupChat(\n", + " participants=[google_search_agent, arxiv_search_agent, report_agent], termination_condition=termination\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:16:31.834796]:\u001b[0m\n", - "\n", + "---------- user ----------\n", "Write a literature review on no code tools for building multi agent ai systems\n", - "From: user\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:16:32.601078], Google_Search_Agent:\u001b[0m\n", + "---------- Google_Search_Agent ----------\n", + "[FunctionCall(id='call_bNGwWFsfeTwDhtIpsI6GYISR', arguments='{\"query\":\"no code tools for building multi agent AI systems literature review\",\"num_results\":3}', name='google_search')]\n", + "[Prompt tokens: 123, Completion tokens: 29]\n", + "---------- Google_Search_Agent ----------\n", + "[FunctionExecutionResult(content='[{\\'title\\': \\'Literature Review — AutoGen\\', \\'link\\': \\'https://microsoft.github.io/autogen/dev//user-guide/agentchat-user-guide/examples/literature-review.html\\', \\'snippet\\': \\'run( task=\"Write a literature review on no code tools for building multi agent ai systems\", ) ... ### Conclusion No-code tools for building multi-agent AI systems\\\\xa0...\\', \\'body\\': \\'Literature Review — AutoGen Skip to main content Back to top Ctrl + K AutoGen 0.4 is a work in progress. Go here to find the 0.2 documentation. User Guide Packages API Reference Twitter GitHub PyPI User Guide Packages API Reference Twitter GitHub PyPI AgentChat Installation Quickstart Tutorial Models Messages Agents Teams Selector Group Chat Swarm Termination Custom Agents Managing State Examples Travel Planning Company Research Literature Review Core Quick Start Core Concepts Agent and\\'}, {\\'title\\': \\'Vertex AI Agent Builder | Google Cloud\\', \\'link\\': \\'https://cloud.google.com/products/agent-builder\\', \\'snippet\\': \\'Build and deploy enterprise ready generative AI experiences · Product highlights · Easily build no code conversational AI agents · Ground in Google search and/or\\\\xa0...\\', \\'body\\': \\'Vertex AI Agent Builder | Google Cloud Page Contents Vertex AI Agent Builder is making generative AI more reliable for the enterprise. Read the blog. Vertex AI Agent Builder Build and deploy enterprise ready generative AI experiences Create AI agents and applications using natural language or a code-first approach. Easily ground your agents or apps in enterprise data with a range of options. Vertex AI Agent Builder gathers all the surfaces and tools that developers need to build their AI agents\\'}, {\\'title\\': \\'AI tools I have found useful w/ research. What do you guys think ...\\', \\'link\\': \\'https://www.reddit.com/r/PhD/comments/14d6g09/ai_tools_i_have_found_useful_w_research_what_do/\\', \\'snippet\\': \"Jun 19, 2023 ... Need help deciding on the best ones, and to identify ones I\\'ve missed: ASSISTANTS (chatbots, multi-purpose) Chat with Open Large Language Models.\", \\'body\\': \\'Reddit - Dive into anything Skip to main content Open menu Open navigation Go to Reddit Home r/PhD A chip A close button Get app Get the Reddit app Log In Log in to Reddit Expand user menu Open settings menu Log In / Sign Up Advertise on Reddit Shop Collectible Avatars Get the Reddit app Scan this QR code to download the app now Or check it out in the app stores Go to PhD r/PhD r/PhD A subreddit dedicated to PhDs. Members Online • [deleted] ADMIN MOD AI tools I have found useful w/ research.\\'}]', call_id='call_bNGwWFsfeTwDhtIpsI6GYISR')]\n", + "---------- Google_Search_Agent ----------\n", + "Tool calls:\n", + "google_search({\"query\":\"no code tools for building multi agent AI systems literature review\",\"num_results\":3}) = [{'title': 'Literature Review — AutoGen', 'link': 'https://microsoft.github.io/autogen/dev//user-guide/agentchat-user-guide/examples/literature-review.html', 'snippet': 'run( task=\"Write a literature review on no code tools for building multi agent ai systems\", ) ... ### Conclusion No-code tools for building multi-agent AI systems\\xa0...', 'body': 'Literature Review — AutoGen Skip to main content Back to top Ctrl + K AutoGen 0.4 is a work in progress. Go here to find the 0.2 documentation. User Guide Packages API Reference Twitter GitHub PyPI User Guide Packages API Reference Twitter GitHub PyPI AgentChat Installation Quickstart Tutorial Models Messages Agents Teams Selector Group Chat Swarm Termination Custom Agents Managing State Examples Travel Planning Company Research Literature Review Core Quick Start Core Concepts Agent and'}, {'title': 'Vertex AI Agent Builder | Google Cloud', 'link': 'https://cloud.google.com/products/agent-builder', 'snippet': 'Build and deploy enterprise ready generative AI experiences · Product highlights · Easily build no code conversational AI agents · Ground in Google search and/or\\xa0...', 'body': 'Vertex AI Agent Builder | Google Cloud Page Contents Vertex AI Agent Builder is making generative AI more reliable for the enterprise. Read the blog. Vertex AI Agent Builder Build and deploy enterprise ready generative AI experiences Create AI agents and applications using natural language or a code-first approach. Easily ground your agents or apps in enterprise data with a range of options. Vertex AI Agent Builder gathers all the surfaces and tools that developers need to build their AI agents'}, {'title': 'AI tools I have found useful w/ research. What do you guys think ...', 'link': 'https://www.reddit.com/r/PhD/comments/14d6g09/ai_tools_i_have_found_useful_w_research_what_do/', 'snippet': \"Jun 19, 2023 ... Need help deciding on the best ones, and to identify ones I've missed: ASSISTANTS (chatbots, multi-purpose) Chat with Open Large Language Models.\", 'body': 'Reddit - Dive into anything Skip to main content Open menu Open navigation Go to Reddit Home r/PhD A chip A close button Get app Get the Reddit app Log In Log in to Reddit Expand user menu Open settings menu Log In / Sign Up Advertise on Reddit Shop Collectible Avatars Get the Reddit app Scan this QR code to download the app now Or check it out in the app stores Go to PhD r/PhD r/PhD A subreddit dedicated to PhDs. Members Online • [deleted] ADMIN MOD AI tools I have found useful w/ research.'}]\n", + "---------- Arxiv_Search_Agent ----------\n", + "[FunctionCall(id='call_ZdmwQGTO03X23GeRn6fwDN8q', arguments='{\"query\":\"no code tools for building multi agent AI systems\",\"max_results\":5}', name='arxiv_search')]\n", + "[Prompt tokens: 719, Completion tokens: 28]\n", + "---------- Arxiv_Search_Agent ----------\n", + "[FunctionExecutionResult(content='[{\\'title\\': \\'AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems\\', \\'authors\\': [\\'Victor Dibia\\', \\'Jingya Chen\\', \\'Gagan Bansal\\', \\'Suff Syed\\', \\'Adam Fourney\\', \\'Erkang Zhu\\', \\'Chi Wang\\', \\'Saleema Amershi\\'], \\'published\\': \\'2024-08-09\\', \\'abstract\\': \\'Multi-agent systems, where multiple agents (generative AI models + tools)\\\\ncollaborate, are emerging as an effective pattern for solving long-running,\\\\ncomplex tasks in numerous domains. However, specifying their parameters (such\\\\nas models, tools, and orchestration mechanisms etc,.) and debugging them\\\\nremains challenging for most developers. To address this challenge, we present\\\\nAUTOGEN STUDIO, a no-code developer tool for rapidly prototyping, debugging,\\\\nand evaluating multi-agent workflows built upon the AUTOGEN framework. AUTOGEN\\\\nSTUDIO offers a web interface and a Python API for representing LLM-enabled\\\\nagents using a declarative (JSON-based) specification. It provides an intuitive\\\\ndrag-and-drop UI for agent workflow specification, interactive evaluation and\\\\ndebugging of workflows, and a gallery of reusable agent components. We\\\\nhighlight four design principles for no-code multi-agent developer tools and\\\\ncontribute an open-source implementation at\\\\nhttps://github.com/microsoft/autogen/tree/main/samples/apps/autogen-studio\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2408.15247v1\\'}, {\\'title\\': \\'Improving Performance of Commercially Available AI Products in a Multi-Agent Configuration\\', \\'authors\\': [\\'Cory Hymel\\', \\'Sida Peng\\', \\'Kevin Xu\\', \\'Charath Ranganathan\\'], \\'published\\': \\'2024-10-29\\', \\'abstract\\': \\'In recent years, with the rapid advancement of large language models (LLMs),\\\\nmulti-agent systems have become increasingly more capable of practical\\\\napplication. At the same time, the software development industry has had a\\\\nnumber of new AI-powered tools developed that improve the software development\\\\nlifecycle (SDLC). Academically, much attention has been paid to the role of\\\\nmulti-agent systems to the SDLC. And, while single-agent systems have\\\\nfrequently been examined in real-world applications, we have seen comparatively\\\\nfew real-world examples of publicly available commercial tools working together\\\\nin a multi-agent system with measurable improvements. In this experiment we\\\\ntest context sharing between Crowdbotics PRD AI, a tool for generating software\\\\nrequirements using AI, and GitHub Copilot, an AI pair-programming tool. By\\\\nsharing business requirements from PRD AI, we improve the code suggestion\\\\ncapabilities of GitHub Copilot by 13.8% and developer task success rate by\\\\n24.5% -- demonstrating a real-world example of commercially-available AI\\\\nsystems working together with improved outcomes.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2410.22129v1\\'}, {\\'title\\': \\'AutoML-Agent: A Multi-Agent LLM Framework for Full-Pipeline AutoML\\', \\'authors\\': [\\'Patara Trirat\\', \\'Wonyong Jeong\\', \\'Sung Ju Hwang\\'], \\'published\\': \\'2024-10-03\\', \\'abstract\\': \"Automated machine learning (AutoML) accelerates AI development by automating\\\\ntasks in the development pipeline, such as optimal model search and\\\\nhyperparameter tuning. Existing AutoML systems often require technical\\\\nexpertise to set up complex tools, which is in general time-consuming and\\\\nrequires a large amount of human effort. Therefore, recent works have started\\\\nexploiting large language models (LLM) to lessen such burden and increase the\\\\nusability of AutoML frameworks via a natural language interface, allowing\\\\nnon-expert users to build their data-driven solutions. These methods, however,\\\\nare usually designed only for a particular process in the AI development\\\\npipeline and do not efficiently use the inherent capacity of the LLMs. This\\\\npaper proposes AutoML-Agent, a novel multi-agent framework tailored for\\\\nfull-pipeline AutoML, i.e., from data retrieval to model deployment.\\\\nAutoML-Agent takes user\\'s task descriptions, facilitates collaboration between\\\\nspecialized LLM agents, and delivers deployment-ready models. Unlike existing\\\\nwork, instead of devising a single plan, we introduce a retrieval-augmented\\\\nplanning strategy to enhance exploration to search for more optimal plans. We\\\\nalso decompose each plan into sub-tasks (e.g., data preprocessing and neural\\\\nnetwork design) each of which is solved by a specialized agent we build via\\\\nprompting executing in parallel, making the search process more efficient.\\\\nMoreover, we propose a multi-stage verification to verify executed results and\\\\nguide the code generation LLM in implementing successful solutions. Extensive\\\\nexperiments on seven downstream tasks using fourteen datasets show that\\\\nAutoML-Agent achieves a higher success rate in automating the full AutoML\\\\nprocess, yielding systems with good performance throughout the diverse domains.\", \\'pdf_url\\': \\'http://arxiv.org/pdf/2410.02958v1\\'}, {\\'title\\': \\'Enhancing Trust in LLM-Based AI Automation Agents: New Considerations and Future Challenges\\', \\'authors\\': [\\'Sivan Schwartz\\', \\'Avi Yaeli\\', \\'Segev Shlomov\\'], \\'published\\': \\'2023-08-10\\', \\'abstract\\': \\'Trust in AI agents has been extensively studied in the literature, resulting\\\\nin significant advancements in our understanding of this field. However, the\\\\nrapid advancements in Large Language Models (LLMs) and the emergence of\\\\nLLM-based AI agent frameworks pose new challenges and opportunities for further\\\\nresearch. In the field of process automation, a new generation of AI-based\\\\nagents has emerged, enabling the execution of complex tasks. At the same time,\\\\nthe process of building automation has become more accessible to business users\\\\nvia user-friendly no-code tools and training mechanisms. This paper explores\\\\nthese new challenges and opportunities, analyzes the main aspects of trust in\\\\nAI agents discussed in existing literature, and identifies specific\\\\nconsiderations and challenges relevant to this new generation of automation\\\\nagents. We also evaluate how nascent products in this category address these\\\\nconsiderations. Finally, we highlight several challenges that the research\\\\ncommunity should address in this evolving landscape.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2308.05391v1\\'}, {\\'title\\': \\'AI2Apps: A Visual IDE for Building LLM-based AI Agent Applications\\', \\'authors\\': [\\'Xin Pang\\', \\'Zhucong Li\\', \\'Jiaxiang Chen\\', \\'Yuan Cheng\\', \\'Yinghui Xu\\', \\'Yuan Qi\\'], \\'published\\': \\'2024-04-07\\', \\'abstract\\': \\'We introduce AI2Apps, a Visual Integrated Development Environment (Visual\\\\nIDE) with full-cycle capabilities that accelerates developers to build\\\\ndeployable LLM-based AI agent Applications. This Visual IDE prioritizes both\\\\nthe Integrity of its development tools and the Visuality of its components,\\\\nensuring a smooth and efficient building experience.On one hand, AI2Apps\\\\nintegrates a comprehensive development toolkit ranging from a prototyping\\\\ncanvas and AI-assisted code editor to agent debugger, management system, and\\\\ndeployment tools all within a web-based graphical user interface. On the other\\\\nhand, AI2Apps visualizes reusable front-end and back-end code as intuitive\\\\ndrag-and-drop components. Furthermore, a plugin system named AI2Apps Extension\\\\n(AAE) is designed for Extensibility, showcasing how a new plugin with 20\\\\ncomponents enables web agent to mimic human-like browsing behavior. Our case\\\\nstudy demonstrates substantial efficiency improvements, with AI2Apps reducing\\\\ntoken consumption and API calls when debugging a specific sophisticated\\\\nmultimodal agent by approximately 90% and 80%, respectively. The AI2Apps,\\\\nincluding an online demo, open-source code, and a screencast video, is now\\\\npublicly accessible.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2404.04902v1\\'}]', call_id='call_ZdmwQGTO03X23GeRn6fwDN8q')]\n", + "---------- Arxiv_Search_Agent ----------\n", + "Tool calls:\n", + "arxiv_search({\"query\":\"no code tools for building multi agent AI systems\",\"max_results\":5}) = [{'title': 'AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems', 'authors': ['Victor Dibia', 'Jingya Chen', 'Gagan Bansal', 'Suff Syed', 'Adam Fourney', 'Erkang Zhu', 'Chi Wang', 'Saleema Amershi'], 'published': '2024-08-09', 'abstract': 'Multi-agent systems, where multiple agents (generative AI models + tools)\\ncollaborate, are emerging as an effective pattern for solving long-running,\\ncomplex tasks in numerous domains. However, specifying their parameters (such\\nas models, tools, and orchestration mechanisms etc,.) and debugging them\\nremains challenging for most developers. To address this challenge, we present\\nAUTOGEN STUDIO, a no-code developer tool for rapidly prototyping, debugging,\\nand evaluating multi-agent workflows built upon the AUTOGEN framework. AUTOGEN\\nSTUDIO offers a web interface and a Python API for representing LLM-enabled\\nagents using a declarative (JSON-based) specification. It provides an intuitive\\ndrag-and-drop UI for agent workflow specification, interactive evaluation and\\ndebugging of workflows, and a gallery of reusable agent components. We\\nhighlight four design principles for no-code multi-agent developer tools and\\ncontribute an open-source implementation at\\nhttps://github.com/microsoft/autogen/tree/main/samples/apps/autogen-studio', 'pdf_url': 'http://arxiv.org/pdf/2408.15247v1'}, {'title': 'Improving Performance of Commercially Available AI Products in a Multi-Agent Configuration', 'authors': ['Cory Hymel', 'Sida Peng', 'Kevin Xu', 'Charath Ranganathan'], 'published': '2024-10-29', 'abstract': 'In recent years, with the rapid advancement of large language models (LLMs),\\nmulti-agent systems have become increasingly more capable of practical\\napplication. At the same time, the software development industry has had a\\nnumber of new AI-powered tools developed that improve the software development\\nlifecycle (SDLC). Academically, much attention has been paid to the role of\\nmulti-agent systems to the SDLC. And, while single-agent systems have\\nfrequently been examined in real-world applications, we have seen comparatively\\nfew real-world examples of publicly available commercial tools working together\\nin a multi-agent system with measurable improvements. In this experiment we\\ntest context sharing between Crowdbotics PRD AI, a tool for generating software\\nrequirements using AI, and GitHub Copilot, an AI pair-programming tool. By\\nsharing business requirements from PRD AI, we improve the code suggestion\\ncapabilities of GitHub Copilot by 13.8% and developer task success rate by\\n24.5% -- demonstrating a real-world example of commercially-available AI\\nsystems working together with improved outcomes.', 'pdf_url': 'http://arxiv.org/pdf/2410.22129v1'}, {'title': 'AutoML-Agent: A Multi-Agent LLM Framework for Full-Pipeline AutoML', 'authors': ['Patara Trirat', 'Wonyong Jeong', 'Sung Ju Hwang'], 'published': '2024-10-03', 'abstract': \"Automated machine learning (AutoML) accelerates AI development by automating\\ntasks in the development pipeline, such as optimal model search and\\nhyperparameter tuning. Existing AutoML systems often require technical\\nexpertise to set up complex tools, which is in general time-consuming and\\nrequires a large amount of human effort. Therefore, recent works have started\\nexploiting large language models (LLM) to lessen such burden and increase the\\nusability of AutoML frameworks via a natural language interface, allowing\\nnon-expert users to build their data-driven solutions. These methods, however,\\nare usually designed only for a particular process in the AI development\\npipeline and do not efficiently use the inherent capacity of the LLMs. This\\npaper proposes AutoML-Agent, a novel multi-agent framework tailored for\\nfull-pipeline AutoML, i.e., from data retrieval to model deployment.\\nAutoML-Agent takes user's task descriptions, facilitates collaboration between\\nspecialized LLM agents, and delivers deployment-ready models. Unlike existing\\nwork, instead of devising a single plan, we introduce a retrieval-augmented\\nplanning strategy to enhance exploration to search for more optimal plans. We\\nalso decompose each plan into sub-tasks (e.g., data preprocessing and neural\\nnetwork design) each of which is solved by a specialized agent we build via\\nprompting executing in parallel, making the search process more efficient.\\nMoreover, we propose a multi-stage verification to verify executed results and\\nguide the code generation LLM in implementing successful solutions. Extensive\\nexperiments on seven downstream tasks using fourteen datasets show that\\nAutoML-Agent achieves a higher success rate in automating the full AutoML\\nprocess, yielding systems with good performance throughout the diverse domains.\", 'pdf_url': 'http://arxiv.org/pdf/2410.02958v1'}, {'title': 'Enhancing Trust in LLM-Based AI Automation Agents: New Considerations and Future Challenges', 'authors': ['Sivan Schwartz', 'Avi Yaeli', 'Segev Shlomov'], 'published': '2023-08-10', 'abstract': 'Trust in AI agents has been extensively studied in the literature, resulting\\nin significant advancements in our understanding of this field. However, the\\nrapid advancements in Large Language Models (LLMs) and the emergence of\\nLLM-based AI agent frameworks pose new challenges and opportunities for further\\nresearch. In the field of process automation, a new generation of AI-based\\nagents has emerged, enabling the execution of complex tasks. At the same time,\\nthe process of building automation has become more accessible to business users\\nvia user-friendly no-code tools and training mechanisms. This paper explores\\nthese new challenges and opportunities, analyzes the main aspects of trust in\\nAI agents discussed in existing literature, and identifies specific\\nconsiderations and challenges relevant to this new generation of automation\\nagents. We also evaluate how nascent products in this category address these\\nconsiderations. Finally, we highlight several challenges that the research\\ncommunity should address in this evolving landscape.', 'pdf_url': 'http://arxiv.org/pdf/2308.05391v1'}, {'title': 'AI2Apps: A Visual IDE for Building LLM-based AI Agent Applications', 'authors': ['Xin Pang', 'Zhucong Li', 'Jiaxiang Chen', 'Yuan Cheng', 'Yinghui Xu', 'Yuan Qi'], 'published': '2024-04-07', 'abstract': 'We introduce AI2Apps, a Visual Integrated Development Environment (Visual\\nIDE) with full-cycle capabilities that accelerates developers to build\\ndeployable LLM-based AI agent Applications. This Visual IDE prioritizes both\\nthe Integrity of its development tools and the Visuality of its components,\\nensuring a smooth and efficient building experience.On one hand, AI2Apps\\nintegrates a comprehensive development toolkit ranging from a prototyping\\ncanvas and AI-assisted code editor to agent debugger, management system, and\\ndeployment tools all within a web-based graphical user interface. On the other\\nhand, AI2Apps visualizes reusable front-end and back-end code as intuitive\\ndrag-and-drop components. Furthermore, a plugin system named AI2Apps Extension\\n(AAE) is designed for Extensibility, showcasing how a new plugin with 20\\ncomponents enables web agent to mimic human-like browsing behavior. Our case\\nstudy demonstrates substantial efficiency improvements, with AI2Apps reducing\\ntoken consumption and API calls when debugging a specific sophisticated\\nmultimodal agent by approximately 90% and 80%, respectively. The AI2Apps,\\nincluding an online demo, open-source code, and a screencast video, is now\\npublicly accessible.', 'pdf_url': 'http://arxiv.org/pdf/2404.04902v1'}]\n", + "---------- Report_Agent ----------\n", + "## Literature Review on No-Code Tools for Building Multi-Agent AI Systems\n", "\n", - "[FunctionCall(id='call_uJyuIbKg0XGXTqozjBMUCQqX', arguments='{\"query\":\"no code tools for building multi agent AI systems\",\"num_results\":5,\"max_chars\":1000}', name='google_search')]\n", - "From: Google_Search_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:16:39.878814], tool_agent_for_Google_Search_Agent:\u001b[0m\n", + "### Introduction\n", "\n", - "[FunctionExecutionResult(content='[{\\'title\\': \\'AutoGen Studio: A No-Code Developer Tool for Building and ...\\', \\'link\\': \\'https://arxiv.org/abs/2408.15247\\', \\'snippet\\': \\'Aug 9, 2024 ... Abstract:Multi-agent systems, where multiple agents (generative AI models + tools) collaborate, are emerging as an effective pattern for\\\\xa0...\\', \\'body\\': \\'[2408.15247] AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems Skip to main content We gratefully acknowledge support from the Simons Foundation, member institutions , and all contributors. Donate > cs > arXiv:2408.15247 Help | Advanced Search All fields Title Author Abstract Comments Journal reference ACM classification MSC classification Report number arXiv identifier DOI ORCID arXiv author ID Help pages Full text Search open search GO open navigation menu quick links Login Help Pages About Computer Science > Software Engineering arXiv:2408.15247 (cs) [Submitted on 9 Aug 2024] Title: AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems Authors: Victor Dibia , Jingya Chen , Gagan Bansal , Suff Syed , Adam Fourney , Erkang Zhu , Chi Wang , Saleema Amershi View a PDF of the paper titled AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems, by Victor Dibia and 7 other authors View\\'}, {\\'title\\': \\'AutoGen Studio: A No-Code Developer Tool for Building and ...\\', \\'link\\': \\'https://www.microsoft.com/en-us/research/publication/autogen-studio-a-no-code-developer-tool-for-building-and-debugging-multi-agent-systems/\\', \\'snippet\\': \\'Aug 2, 2024 ... Multi-agent systems, where multiple agents (generative AI models + tools) collaborate, are emerging as an effective pattern for solving\\\\xa0...\\', \\'body\\': \\'Your request has been blocked. This could be due to several reasons. Skip to main content Microsoft Microsoft 365 Teams Copilot Windows Surface Xbox Deals Small Business Support More All Microsoft Office Windows Surface Xbox Deals Support Software Windows Apps OneDrive Outlook Skype OneNote Microsoft Teams Microsoft Edge PCs & Devices Computers Shop Xbox Accessories VR & mixed reality Phones Entertainment Xbox Game Pass Ultimate Xbox Live Gold Xbox games PC games Windows digital games Movies & TV Business Microsoft Azure Microsoft Dynamics 365 Microsoft 365 Microsoft Industry Data platform Microsoft Advertising Licensing Shop Business Developer & IT .NET Visual Studio Windows Server Windows Dev Center Docs Other Microsoft Rewards Free downloads & security Education Store locations Gift cards View Sitemap Search Search Microsoft.com Cancel Your current User-Agent string appears to be from an automated process, if this is incorrect, please click this link: United States English\\'}, {\\'title\\': \\'Insights and Learnings from Building a Complex Multi-Agent System ...\\', \\'link\\': \\'https://www.reddit.com/r/LangChain/comments/1byz3lr/insights_and_learnings_from_building_a_complex/\\', \\'snippet\\': \"Apr 8, 2024 ... I\\'m a business owner and a tech guy with a background in math, coding, and ML. Since early 2023, I\\'ve fallen in love with the LLM world. So, I\\\\xa0...\", \\'body\\': \"You\\'ve been blocked by network security. To continue, log in to your Reddit account or use your developer token If you think you\\'ve been blocked by mistake, file a ticket below and we\\'ll look into it. Log in File a ticket\"}, {\\'title\\': \\'Multi Agents System (MAS) Builder - Build your AI Workforce\\', \\'link\\': \\'https://relevanceai.com/multi-agents\\', \\'snippet\\': \\'Mar 10, 2024 ... Easily build a multi-agent system. AI workers working collaboratively. No coding required.\\', \\'body\\': \\'Multi Agents System (MAS) Builder - Build your AI Workforce Recruit Bosh, the AI BDR Agent, and book meetings on autopilot. Recruit Bosh, the AI BDR Agent, and book meetings on autopilot. Register Learn more Product AI Agents Agent Teams AI Tools Integrations API Function Sales Marketing Customer Support Research Operations Agents Bosh the Sales Agent Inbound - AI SDR Outbound - AI BDR Lima the Lifecycle Agent Resources Blog Customers Documentation\\\\u200b Javascript SDK Python SDK\\\\u200b Templates Building the AI Workforce What is the AI Workforce? Enterprise Pricing Login Sign Up Product AI Agents Agent Teams AI Tools Custom Actions for GPTs API By Function Sales Marketing Customer Support Research Operations Agents Bosh the Sales Agent Inbound - AI SDR Outbound - AI SDR Resources Blog Documentation Workflows Javascript SDK Python SDK Templates Building the AI Workforce Enterprise Pricing Log in Sign up AI Agent Teams Build a Multi Agent System Create your own AI team that work collaboratively\\'}, {\\'title\\': \\'Crew AI\\', \\'link\\': \\'https://www.crewai.com/\\', \\'snippet\\': \"Start by using CrewAI\\'s framework or UI Studio to build your multi-agent automations—whether coding from scratch or leveraging our no-code tools and templates.\", \\'body\\': \\'Crew AI Get the Inside Scoop First! Join Our Exclusive Waitlist Home Enterprise Open Source Login Start Enterprise Trial crewAI © Copyright 2024 Log in Start Enterprise Trial The Leading Multi-Agent Platform The Leading Multi-Agent Platform Streamline workflows across industries with powerful AI agents. Build and deploy automated workflows using any LLM and cloud platform. Start Free Trial I Want A Demo 100,000,000+ 75,000,000 50,000,000 25,000,000 10,000,000 7,500,000 5,000,000 2,500,000 1,000,000 750,000 500,000 250,000 100,000 75,000 50,000 25,000 10,000 5,000 2,500 1,000 500 250 100 50 10 0 Multi-Agent Crews run using CrewAI Trusted By Industry Leaders The Complete Platform for Multi-Agent Automation 1. Build Quickly Start by using CrewAI’s framework or UI Studio to build your multi-agent automations—whether coding from scratch or leveraging our no-code tools and templates. 2. Deploy Confidently Move the crews you built to production with powerful tools for different deployment\\'}]', call_id='call_uJyuIbKg0XGXTqozjBMUCQqX')]\n", - "From: tool_agent_for_Google_Search_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:16:49.739108], Google_Search_Agent:\u001b[0m\n", + "The emergence of multi-agent systems (MAS) has transformed various domains by enabling collaboration among multiple agents—ranging from generative AI models to orchestrated tools—to solve complex, long-term tasks. However, the traditional development of these systems often requires substantial technical expertise, making it inaccessible for non-developers. The introduction of no-code platforms aims to shift this paradigm, allowing users without formal programming knowledge to design, debug, and deploy multi-agent systems. This review synthesizes current literature concerning no-code tools developed for building multi-agent AI systems, highlighting recent advancements and emerging trends.\n", "\n", - "### Literature Review on No-Code Tools for Building Multi-Agent AI Systems\n", + "### No-Code Development Tools\n", "\n", - "The advent of no-code and low-code platforms has revolutionized the development of software applications, including multi-agent AI systems. These tools enable users, regardless of their technical background, to create sophisticated systems through visual interfaces and pre-built components. This literature review explores the current landscape of no-code tools specifically designed for building multi-agent AI systems, examining their capabilities, features, and potential use cases.\n", + "#### AutoGen Studio\n", "\n", - "#### 1. **AutoGen Studio**\n", - "One of the prominent tools in this domain is **AutoGen Studio**, which provides a no-code environment for designing and debugging multi-agent systems. According to a recent paper published in **arXiv**, this tool focuses on facilitating collaboration among different agents, including generative AI models and associated tools. It emphasizes usability, allowing developers to build complex systems without extensive programming knowledge (Dibia et al., 2024).\n", + "One of the prominent no-code tools is **AutoGen Studio**, developed by Dibia et al. (2024). This tool provides a web interface and a declarative specification method utilizing JSON, enabling rapid prototyping, debugging, and evaluating multi-agent workflows. The drag-and-drop capabilities streamline the design process, making complex interactions between agents more manageable. The framework operates on four primary design principles that cater specifically to no-code development, contributing to an accessible pathway for users to harness multi-agent frameworks for various applications (Dibia et al., 2024).\n", "\n", - "#### 2. **Multi Agents System (MAS) Builder**\n", - "Another notable platform is the **Multi Agents System (MAS) Builder** by **Relevance AI**. This tool allows users to construct AI worker systems that can operate collaboratively without requiring any coding skills. The platform highlights features such as the ability to create and deploy AI teams optimized for tasks like sales and customer support, showcasing the practical applications of no-code tools in business environments (Relevance AI, 2024).\n", + "#### AI2Apps Visual IDE\n", "\n", - "#### 3. **Crew AI**\n", - "**Crew AI** offers a comprehensive framework for automating workflows through multi-agent systems. It includes a UI Studio that facilitates the creation of automations without programming. Users can leverage pre-configured templates and build agents that execute tasks across various domains. This flexibility makes it suitable for industries seeking to enhance operational efficiency through automated systems (Crew AI, 2024).\n", + "Another notable tool is **AI2Apps**, described by Pang et al. (2024). It serves as a Visual Integrated Development Environment that incorporates a comprehensive set of tools from prototyping to deployment. The platform's user-friendly interface allows for the visualization of code through drag-and-drop components, facilitating smoother integration of different agents. An extension system enhances the platform's capabilities, showcasing the potential for customization and scalability in agent application development. The reported efficiency improvements in token consumption and API calls indicate substantial benefits in user-centric design (Pang et al., 2024).\n", "\n", - "#### 4. **Insights and Community Experiences**\n", - "Additionally, community discussions and insights shared on platforms like **Reddit** provide anecdotal evidence of the effectiveness and user experiences when employing no-code tools for multi-agent systems. Users share their journeys in building complex systems, highlighting both successes and challenges faced during development (April 2024).\n", + "### Performance Enhancements in Multi-Agent Configurations\n", "\n", - "### Conclusion\n", - "The evolution of no-code tools has significantly lowered the barrier to entry for developing multi-agent AI systems. Platforms such as AutoGen Studio, MAS Builder, and Crew AI exemplify the potential for creating sophisticated systems without traditional coding requirements. As these tools continue to grow in capability and user adoption, they promise to democratize AI development and enable a wider range of professionals to leverage AI technologies in their work.\n", - "\n", - "### References\n", - "1. Dibia, V., Chen, J., Bansal, G., Syed, S., Fourney, A., Zhu, E., Wang, C., & Amershi, S. (2024). AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems. arXiv.\n", - "2. Relevance AI. (2024). Multi Agents System (MAS) Builder - Build your AI Workforce. Retrieved from [Relevance AI](https://relevanceai.com/multi-agents).\n", - "3. Crew AI. (2024). The Leading Multi-Agent Platform. Retrieved from [Crew AI](https://www.crewai.com/).\n", - "4. Insights from Community Discussions. Reddit. (April 2024). \n", - "\n", - "This review highlights the emerging trends and significant tools in the no-code multi-agent AI space, indicating a shift toward more accessible AI system development.\n", - "From: Google_Search_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:16:50.542039], Arxiv_Search_Agent:\u001b[0m\n", - "\n", - "[FunctionCall(id='call_HnNhdJzH3xCbiofbbcoqzFDP', arguments='{\"query\":\"no code tools multi agent AI systems\",\"max_results\":5}', name='arxiv_search')]\n", - "From: Arxiv_Search_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:16:52.486634], tool_agent_for_Arxiv_Search_Agent:\u001b[0m\n", - "\n", - "[FunctionExecutionResult(content='[{\\'title\\': \\'AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems\\', \\'authors\\': [\\'Victor Dibia\\', \\'Jingya Chen\\', \\'Gagan Bansal\\', \\'Suff Syed\\', \\'Adam Fourney\\', \\'Erkang Zhu\\', \\'Chi Wang\\', \\'Saleema Amershi\\'], \\'published\\': \\'2024-08-09\\', \\'abstract\\': \\'Multi-agent systems, where multiple agents (generative AI models + tools)\\\\ncollaborate, are emerging as an effective pattern for solving long-running,\\\\ncomplex tasks in numerous domains. However, specifying their parameters (such\\\\nas models, tools, and orchestration mechanisms etc,.) and debugging them\\\\nremains challenging for most developers. To address this challenge, we present\\\\nAUTOGEN STUDIO, a no-code developer tool for rapidly prototyping, debugging,\\\\nand evaluating multi-agent workflows built upon the AUTOGEN framework. AUTOGEN\\\\nSTUDIO offers a web interface and a Python API for representing LLM-enabled\\\\nagents using a declarative (JSON-based) specification. It provides an intuitive\\\\ndrag-and-drop UI for agent workflow specification, interactive evaluation and\\\\ndebugging of workflows, and a gallery of reusable agent components. We\\\\nhighlight four design principles for no-code multi-agent developer tools and\\\\ncontribute an open-source implementation at\\\\nhttps://github.com/microsoft/autogen/tree/main/samples/apps/autogen-studio\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2408.15247v1\\'}, {\\'title\\': \\'Collaboration of AI Agents via Cooperative Multi-Agent Deep Reinforcement Learning\\', \\'authors\\': [\\'Niranjan Balachandar\\', \\'Justin Dieter\\', \\'Govardana Sachithanandam Ramachandran\\'], \\'published\\': \\'2019-06-30\\', \\'abstract\\': \\'There are many AI tasks involving multiple interacting agents where agents\\\\nshould learn to cooperate and collaborate to effectively perform the task. Here\\\\nwe develop and evaluate various multi-agent protocols to train agents to\\\\ncollaborate with teammates in grid soccer. We train and evaluate our\\\\nmulti-agent methods against a team operating with a smart hand-coded policy. As\\\\na baseline, we train agents concurrently and independently, with no\\\\ncommunication. Our collaborative protocols were parameter sharing, coordinated\\\\nlearning with communication, and counterfactual policy gradients. Against the\\\\nhand-coded team, the team trained with parameter sharing and the team trained\\\\nwith coordinated learning performed the best, scoring on 89.5% and 94.5% of\\\\nepisodes respectively when playing against the hand-coded team. Against the\\\\nparameter sharing team, with adversarial training the coordinated learning team\\\\nscored on 75% of the episodes, indicating it is the most adaptable of our\\\\nmethods. The insights gained from our work can be applied to other domains\\\\nwhere multi-agent collaboration could be beneficial.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/1907.00327v1\\'}, {\\'title\\': \\'Levels of AI Agents: from Rules to Large Language Models\\', \\'authors\\': [\\'Yu Huang\\'], \\'published\\': \\'2024-03-06\\', \\'abstract\\': \\'AI agents are defined as artificial entities to perceive the environment,\\\\nmake decisions and take actions. Inspired by the 6 levels of autonomous driving\\\\nby Society of Automotive Engineers, the AI agents are also categorized based on\\\\nutilities and strongness, as the following levels: L0, no AI, with tools taking\\\\ninto account perception plus actions; L1, using rule-based AI; L2, making\\\\nrule-based AI replaced by IL/RL-based AI, with additional reasoning & decision\\\\nmaking; L3, applying LLM-based AI instead of IL/RL-based AI, additionally\\\\nsetting up memory & reflection; L4, based on L3, facilitating autonomous\\\\nlearning & generalization; L5, based on L4, appending personality of emotion\\\\nand character and collaborative behavior with multi-agents.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2405.06643v1\\'}, {\\'title\\': \\'HAICOSYSTEM: An Ecosystem for Sandboxing Safety Risks in Human-AI Interactions\\', \\'authors\\': [\\'Xuhui Zhou\\', \\'Hyunwoo Kim\\', \\'Faeze Brahman\\', \\'Liwei Jiang\\', \\'Hao Zhu\\', \\'Ximing Lu\\', \\'Frank Xu\\', \\'Bill Yuchen Lin\\', \\'Yejin Choi\\', \\'Niloofar Mireshghallah\\', \\'Ronan Le Bras\\', \\'Maarten Sap\\'], \\'published\\': \\'2024-09-24\\', \\'abstract\\': \"AI agents are increasingly autonomous in their interactions with human users\\\\nand tools, leading to increased interactional safety risks. We present\\\\nHAICOSYSTEM, a framework examining AI agent safety within diverse and complex\\\\nsocial interactions. HAICOSYSTEM features a modular sandbox environment that\\\\nsimulates multi-turn interactions between human users and AI agents, where the\\\\nAI agents are equipped with a variety of tools (e.g., patient management\\\\nplatforms) to navigate diverse scenarios (e.g., a user attempting to access\\\\nother patients\\' profiles). To examine the safety of AI agents in these\\\\ninteractions, we develop a comprehensive multi-dimensional evaluation framework\\\\nthat uses metrics covering operational, content-related, societal, and legal\\\\nrisks. Through running 1840 simulations based on 92 scenarios across seven\\\\ndomains (e.g., healthcare, finance, education), we demonstrate that HAICOSYSTEM\\\\ncan emulate realistic user-AI interactions and complex tool use by AI agents.\\\\nOur experiments show that state-of-the-art LLMs, both proprietary and\\\\nopen-sourced, exhibit safety risks in over 50\\\\\\\\% cases, with models generally\\\\nshowing higher risks when interacting with simulated malicious users. Our\\\\nfindings highlight the ongoing challenge of building agents that can safely\\\\nnavigate complex interactions, particularly when faced with malicious users. To\\\\nfoster the AI agent safety ecosystem, we release a code platform that allows\\\\npractitioners to create custom scenarios, simulate interactions, and evaluate\\\\nthe safety and performance of their agents.\", \\'pdf_url\\': \\'http://arxiv.org/pdf/2409.16427v2\\'}, {\\'title\\': \\'The Partially Observable Asynchronous Multi-Agent Cooperation Challenge\\', \\'authors\\': [\\'Meng Yao\\', \\'Qiyue Yin\\', \\'Jun Yang\\', \\'Tongtong Yu\\', \\'Shengqi Shen\\', \\'Junge Zhang\\', \\'Bin Liang\\', \\'Kaiqi Huang\\'], \\'published\\': \\'2021-12-07\\', \\'abstract\\': \\'Multi-agent reinforcement learning (MARL) has received increasing attention\\\\nfor its applications in various domains. Researchers have paid much attention\\\\non its partially observable and cooperative settings for meeting real-world\\\\nrequirements. For testing performance of different algorithms, standardized\\\\nenvironments are designed such as the StarCraft Multi-Agent Challenge, which is\\\\none of the most successful MARL benchmarks. To our best knowledge, most of\\\\ncurrent environments are synchronous, where agents execute actions in the same\\\\npace. However, heterogeneous agents usually have their own action spaces and\\\\nthere is no guarantee for actions from different agents to have the same\\\\nexecuted cycle, which leads to asynchronous multi-agent cooperation. Inspired\\\\nfrom the Wargame, a confrontation game between two armies abstracted from real\\\\nworld environment, we propose the first Partially Observable Asynchronous\\\\nmulti-agent Cooperation challenge (POAC) for the MARL community. Specifically,\\\\nPOAC supports two teams of heterogeneous agents to fight with each other, where\\\\nan agent selects actions based on its own observations and cooperates\\\\nasynchronously with its allies. Moreover, POAC is a light weight, flexible and\\\\neasy to use environment, which can be configured by users to meet different\\\\nexperimental requirements such as self-play model, human-AI model and so on.\\\\nAlong with our benchmark, we offer six game scenarios of varying difficulties\\\\nwith the built-in rule-based AI as opponents. Finally, since most MARL\\\\nalgorithms are designed for synchronous agents, we revise several\\\\nrepresentatives to meet the asynchronous setting, and the relatively poor\\\\nexperimental results validate the challenge of POAC. Source code is released in\\\\n\\\\\\\\url{http://turingai.ia.ac.cn/data\\\\\\\\_center/show}.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2112.03809v1\\'}]', call_id='call_HnNhdJzH3xCbiofbbcoqzFDP')]\n", - "From: tool_agent_for_Arxiv_Search_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:17:12.845506], Arxiv_Search_Agent:\u001b[0m\n", + "Hymel et al. (2024) examined the collaborative performance of commercially available AI tools, demonstrating a measurable improvement when integrating multiple agents in a shared configuration. Their experiments showcased how cooperation between tools like Crowdbotics PRD AI and GitHub Copilot significantly improved task success rates, illustrating the practical benefits of employing no-code tools in multi-agent environments. This synergy reflects the critical need for frameworks that inherently support such integrations, especially through no-code mechanisms, to enhance user experience and productivity (Hymel et al., 2024).\n", "\n", - "### Literature Review on No-Code Tools for Building Multi-Agent AI Systems\n", + "### Trust and Usability in AI Agents\n", "\n", - "The development of multi-agent AI systems has been significantly enhanced by the emergence of no-code tools, allowing a broader range of users to engage in the creation and management of complex AI applications without extensive programming knowledge. This literature review synthesizes current research on no-code tools tailored for building multi-agent AI systems, discussing their functionalities, design, and implications.\n", + "The concept of trust in AI, particularly in LLM-based automation agents, has gained attention. Schwartz et al. (2023) addressed the challenges and considerations unique to this new generation of agents, highlighting how no-code platforms ease access and usability for non-technical users. The paper emphasizes the need for further research into the trust factors integral to effective multi-agent systems, advocating for a user-centric approach in the design and evaluation of these no-code tools (Schwartz et al., 2023).\n", "\n", - "#### 1. AutoGen Studio\n", - "**AutoGen Studio** is a cutting-edge no-code developer tool specifically designed for building and debugging multi-agent systems. Dibia et al. (2024) highlight that this platform simplifies the development process through a web interface that supports drag-and-drop functionalities for creating agent workflows. With a Python API and a JSON-based specification for representing agents, AutoGen Studio allows users to prototype and evaluate workflows effortlessly. This tool not only enhances usability but also fosters collaboration among various generative AI models and tools. The authors emphasize four core design principles that inform the development of no-code tools, aiming to streamline the creation of multi-agent systems (Dibia et al., 2024). [Read the paper here](http://arxiv.org/pdf/2408.15247v1).\n", + "### Full-Pipeline AutoML with Multi-Agent Systems\n", "\n", - "#### 2. Levels of AI Agents\n", - "In a conceptual exploration, Huang (2024) classifies AI agents into levels based on their capabilities, ranging from rule-based systems (L1) to advanced large language models (LLMs) (L3). This classification is crucial for understanding the potential complexity and collaboration among agents in multi-agent frameworks. These levels imply varying degrees of autonomy and decision-making, which can impact the design of no-code tools intended for multi-agent systems. The consideration of these levels is vital for developing platforms that allow effective integration and collaboration between diverse agent types (Huang, 2024). [Read the paper here](http://arxiv.org/pdf/2405.06643v1).\n", - "\n", - "#### 3. HAICOSYSTEM\n", - "**HAICOSYSTEM** presents a novel framework that examines safety risks in human-AI interactions, focusing on multi-agent systems' operational complexities. Zhou et al. (2024) discuss a modular sandbox environment that simulates interactions between AI agents and human users across various scenarios. The framework allows practitioners to evaluate and ensure the safety and performance of agents, emphasizing a crucial aspect that no-code tools must address—handling operational risks in real-time interactions. This research underscores the need for built-in safety and evaluation features within no-code platforms for multi-agent systems (Zhou et al., 2024). [Read the paper here](http://arxiv.org/pdf/2409.16427v2).\n", - "\n", - "#### 4. Collaboration Protocols in AI Agents\n", - "Balachandar et al. (2019) focus on the collaborative protocols that enable multiple agents to work together effectively in a competitive setting like grid soccer. Their work discusses various strategies for cooperation and highlights the importance of communication among agents. This foundational understanding of multi-agent interaction can influence the design and implementation of no-code tools by offering insights into how agents can collaborate seamlessly without the need for extensive programming (Balachandar et al., 2019). [Read the paper here](http://arxiv.org/pdf/1907.00327v1).\n", - "\n", - "#### 5. Asynchronous Multi-Agent Cooperation\n", - "In a more technical aspect, Yao et al. (2021) introduce the **Partially Observable Asynchronous Multi-Agent Cooperation (POAC)** challenge to evaluate multi-agent reinforcement learning (MARL) algorithms in asynchronous environments. This environment design shifts the focus from synchronous operations, which are common in many existing no-code tools, to more realistic settings reflecting real-world complexities. The flexibility and adaptability required for asynchronous operations highlight critical design considerations for the next generation of no-code development tools (Yao et al., 2021). [Read the paper here](http://arxiv.org/pdf/2112.03809v1).\n", + "The **AutoML-Agent** framework proposed by Trirat et al. (2024) brings another layer of innovation to the no-code landscape. This framework enhances existing automated machine learning processes by using multiple specialized agents that collaboratively manage the full AI development pipeline from data retrieval to model deployment. The novelty lies in its retrieval-augmented planning strategy, which allows for efficient task decomposition and parallel execution, optimizing the overall development experience for non-experts (Trirat et al., 2024).\n", "\n", "### Conclusion\n", - "No-code tools for building multi-agent AI systems are rapidly evolving, offering unprecedented access to AI development for users without programming expertise. Tools like AutoGen Studio provide essential frameworks for agent collaboration, while safety frameworks like HAICOSYSTEM remind developers of the necessity of operational integrity. Insights from collaboration protocols and asynchronous environments further inform the development and refinement of these tools. As the landscape grows, these no-code platforms will likely play a pivotal role in democratizing the development of sophisticated multi-agent systems across various domains.\n", - "\n", - "### References\n", - "1. Dibia, V., Chen, J., Bansal, G., Syed, S., Fourney, A., Zhu, E., Wang, C., & Amershi, S. (2024). AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems. arXiv.\n", - "2. Huang, Y. (2024). Levels of AI Agents: from Rules to Large Language Models. arXiv.\n", - "3. Zhou, X., Kim, H., Brahman, F., Jiang, L., Zhu, H., Lu, X., Xu, F., Lin, B. Y., Choi, Y., Mireshghallah, N., Bras, R. L., & Sap, M. (2024). HAICOSYSTEM: An Ecosystem for Sandboxing Safety Risks in Human-AI Interactions. arXiv.\n", - "4. Balachandar, N., Dieter, J., & Ramachandran, G. S. (2019). Collaboration of AI Agents via Cooperative Multi-Agent Deep Reinforcement Learning. arXiv.\n", - "5. Yao, M., Yin, Q., Yang, J., Yu, T., Shen, S., Zhang, J., Liang, B., & Huang, K. (2021). The Partially Observable Asynchronous Multi-Agent Cooperation Challenge. arXiv.\n", - "From: Arxiv_Search_Agent\n", - "--------------------------------------------------------------------------- \n", - "\u001b[91m[2024-10-08T13:17:36.794418], Report_Agent:\u001b[0m\n", "\n", - "### Literature Review on No-Code Tools for Building Multi-Agent AI Systems\n", - "\n", - "The emergence of no-code tools signals a significant shift in the development landscape of multi-agent AI systems, enabling users with minimal programming knowledge to design and implement complex AI applications. This literature review synthesizes current research and practical insights on no-code tools crafted for establishing multi-agent AI systems, emphasizing their features, capabilities, and applications.\n", - "\n", - "#### 1. AutoGen Studio\n", - "**AutoGen Studio** serves as a pioneering no-code platform tailored for the design and debugging of multi-agent systems. Dibia et al. (2024) highlight that this tool utilizes a web-based interface that enables users to construct workflows through intuitive drag-and-drop functionalities. The flexibility offered by a Python API, along with a JSON-based framework for representing agents, streamlines the prototyping and evaluation processes. Such features foster collaboration among various generative AI models and enhance usability, ultimately addressing the diverse needs of non-technical users in constructing multi-agent environments (Dibia et al., 2024). [Read the paper here](http://arxiv.org/pdf/2408.15247v1).\n", - "\n", - "#### 2. Levels of AI Agents\n", - "Huang (2024) introduces a conceptual framework categorizing AI agents by their capabilities. This classification ranges from simple rule-based systems to advanced large language models, underscoring the varying complexities in multi-agent interactions. Understanding these levels aids in informing the design of no-code tools to support effective collaboration among agents of differing capabilities. By integrating awareness of these agent levels, developers can enhance how no-code platforms facilitate interactions within multi-agent systems (Huang, 2024). [Read the paper here](http://arxiv.org/pdf/2405.06643v1).\n", - "\n", - "#### 3. HAICOSYSTEM\n", - "The **HAICOSYSTEM** framework examines the safety considerations inherent in human-AI interactions, especially concerning multi-agent contexts. Zhou et al. (2024) propose a modular sandbox environment that simulates various operational scenarios, allowing practitioners to assess and ensure safety while interacting with agents. This research emphasizes the necessity of incorporating safety evaluation features into no-code platforms for multi-agent systems, ensuring that these tools not only enhance usability but also promote reliable and secure interactions (Zhou et al., 2024). [Read the paper here](http://arxiv.org/pdf/2409.16427v2).\n", - "\n", - "#### 4. Collaboration Protocols in AI Agents\n", - "The investigation by Balachandar et al. (2019) into collaborative protocols among AI agents reveals fundamental strategies that can enhance cooperative behavior in multi-agent systems. Their insights are invaluable for informing the design of no-code platforms, highlighting the importance of effective communication and cooperation among agents. By embedding these collaborative features into no-code tools, developers can facilitate more seamless integration and interaction among agents, which is essential for complex multi-agent tasks (Balachandar et al., 2019). [Read the paper here](http://arxiv.org/pdf/1907.00327v1).\n", - "\n", - "#### 5. Asynchronous Multi-Agent Cooperation\n", - "Yao et al. (2021) present the **Partially Observable Asynchronous Multi-Agent Cooperation (POAC)** challenge, which evaluates the performance of multi-agent reinforcement learning algorithms in asynchronous environments. This design paradigm shifts focus from synchronous operations, commonly found in traditional no-code tools, toward interfaces that reflect realistic interactions. The implications of asynchronous cooperation underscore critical design considerations for developing future no-code tools, emphasizing the need for flexibility and adaptability in systems that work under real-world constraints (Yao et al., 2021). [Read the paper here](http://arxiv.org/pdf/2112.03809v1).\n", - "\n", - "### Conclusion\n", - "No-code tools for developing multi-agent AI systems are rapidly advancing, providing unprecedented opportunities for users without programming skills to engage in complex AI development. Platforms like AutoGen Studio are at the forefront of these innovations, facilitating collaboration and simplifying design processes. Concurrent research on AI agent levels, safety frameworks, collaboration protocols, and asynchronous cooperation further enhances the understanding of requirements for effective no-code tool design. As these tools proliferate, they are poised to democratize access to multi-agent system development across diverse sectors.\n", + "The literature presents a growing array of no-code tools designed to democratize the development of multi-agent systems. Innovations such as AutoGen Studio, AI2Apps, and collaborative frameworks like AutoML-Agent highlight a trend towards user-centric, efficient design that encourages participation beyond technical boundaries. Future research should continue to explore aspects of trust, usability, and integration to further refine these tools and expand their applicability across various domains.\n", "\n", "### References\n", - "1. Dibia, V., Chen, J., Bansal, G., Syed, S., Fourney, A., Zhu, E., Wang, C., & Amershi, S. (2024). AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems. arXiv. [Available here](http://arxiv.org/pdf/2408.15247v1).\n", - "2. Huang, Y. (2024). Levels of AI Agents: from Rules to Large Language Models. arXiv. [Available here](http://arxiv.org/pdf/2405.06643v1).\n", - "3. Zhou, X., Kim, H., Brahman, F., Jiang, L., Zhu, H., Lu, X., Xu, F., Lin, B. Y., Choi, Y., Mireshghallah, N., Bras, R. L., & Sap, M. (2024). HAICOSYSTEM: An Ecosystem for Sandboxing Safety Risks in Human-AI Interactions. arXiv. [Available here](http://arxiv.org/pdf/2409.16427v2).\n", - "4. Balachandar, N., Dieter, J., & Ramachandran, G. S. (2019). Collaboration of AI Agents via Cooperative Multi-Agent Deep Reinforcement Learning. arXiv. [Available here](http://arxiv.org/pdf/1907.00327v1).\n", - "5. Yao, M., Yin, Q., Yang, J., Yu, T., Shen, S., Zhang, J., Liang, B., & Huang, K. (2021). The Partially Observable Asynchronous Multi-Agent Cooperation Challenge. arXiv. [Available here](http://arxiv.org/pdf/2112.03809v1).\n", + "\n", + "- Dibia, V., Chen, J., Bansal, G., Syed, S., Fourney, A., Zhu, E., Wang, C., & Amershi, S. (2024). AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems. *arXiv:2408.15247*.\n", + "- Hymel, C., Peng, S., Xu, K., & Ranganathan, C. (2024). Improving Performance of Commercially Available AI Products in a Multi-Agent Configuration. *arXiv:2410.22129*.\n", + "- Pang, X., Li, Z., Chen, J., Cheng, Y., Xu, Y., & Qi, Y. (2024). AI2Apps: A Visual IDE for Building LLM-based AI Agent Applications. *arXiv:2404.04902*.\n", + "- Schwartz, S., Yaeli, A., & Shlomov, S. (2023). Enhancing Trust in LLM-Based AI Automation Agents: New Considerations and Future Challenges. *arXiv:2308.05391*.\n", + "- Trirat, P., Jeong, W., & Hwang, S. J. (2024). AutoML-Agent: A Multi-Agent LLM Framework for Full-Pipeline AutoML. *arXiv:2410.02958*.\n", "\n", "TERMINATE\n", - "From: Report_Agent" + "[Prompt tokens: 2381, Completion tokens: 1090]\n", + "---------- Summary ----------\n", + "Number of messages: 8\n", + "Finish reason: Text 'TERMINATE' mentioned\n", + "Total prompt tokens: 3223\n", + "Total completion tokens: 1147\n", + "Duration: 17.06 seconds\n" ] }, { "data": { "text/plain": [ - "TeamRunResult(messages=[TextMessage(source='user', content='Write a literature review on no code tools for building multi agent ai systems'), TextMessage(source='Google_Search_Agent', content='### Literature Review on No-Code Tools for Building Multi-Agent AI Systems\\n\\nThe advent of no-code and low-code platforms has revolutionized the development of software applications, including multi-agent AI systems. These tools enable users, regardless of their technical background, to create sophisticated systems through visual interfaces and pre-built components. This literature review explores the current landscape of no-code tools specifically designed for building multi-agent AI systems, examining their capabilities, features, and potential use cases.\\n\\n#### 1. **AutoGen Studio**\\nOne of the prominent tools in this domain is **AutoGen Studio**, which provides a no-code environment for designing and debugging multi-agent systems. According to a recent paper published in **arXiv**, this tool focuses on facilitating collaboration among different agents, including generative AI models and associated tools. It emphasizes usability, allowing developers to build complex systems without extensive programming knowledge (Dibia et al., 2024).\\n\\n#### 2. **Multi Agents System (MAS) Builder**\\nAnother notable platform is the **Multi Agents System (MAS) Builder** by **Relevance AI**. This tool allows users to construct AI worker systems that can operate collaboratively without requiring any coding skills. The platform highlights features such as the ability to create and deploy AI teams optimized for tasks like sales and customer support, showcasing the practical applications of no-code tools in business environments (Relevance AI, 2024).\\n\\n#### 3. **Crew AI**\\n**Crew AI** offers a comprehensive framework for automating workflows through multi-agent systems. It includes a UI Studio that facilitates the creation of automations without programming. Users can leverage pre-configured templates and build agents that execute tasks across various domains. This flexibility makes it suitable for industries seeking to enhance operational efficiency through automated systems (Crew AI, 2024).\\n\\n#### 4. **Insights and Community Experiences**\\nAdditionally, community discussions and insights shared on platforms like **Reddit** provide anecdotal evidence of the effectiveness and user experiences when employing no-code tools for multi-agent systems. Users share their journeys in building complex systems, highlighting both successes and challenges faced during development (April 2024).\\n\\n### Conclusion\\nThe evolution of no-code tools has significantly lowered the barrier to entry for developing multi-agent AI systems. Platforms such as AutoGen Studio, MAS Builder, and Crew AI exemplify the potential for creating sophisticated systems without traditional coding requirements. As these tools continue to grow in capability and user adoption, they promise to democratize AI development and enable a wider range of professionals to leverage AI technologies in their work.\\n\\n### References\\n1. Dibia, V., Chen, J., Bansal, G., Syed, S., Fourney, A., Zhu, E., Wang, C., & Amershi, S. (2024). AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems. arXiv.\\n2. Relevance AI. (2024). Multi Agents System (MAS) Builder - Build your AI Workforce. Retrieved from [Relevance AI](https://relevanceai.com/multi-agents).\\n3. Crew AI. (2024). The Leading Multi-Agent Platform. Retrieved from [Crew AI](https://www.crewai.com/).\\n4. Insights from Community Discussions. Reddit. (April 2024). \\n\\nThis review highlights the emerging trends and significant tools in the no-code multi-agent AI space, indicating a shift toward more accessible AI system development.'), TextMessage(source='Arxiv_Search_Agent', content=\"### Literature Review on No-Code Tools for Building Multi-Agent AI Systems\\n\\nThe development of multi-agent AI systems has been significantly enhanced by the emergence of no-code tools, allowing a broader range of users to engage in the creation and management of complex AI applications without extensive programming knowledge. This literature review synthesizes current research on no-code tools tailored for building multi-agent AI systems, discussing their functionalities, design, and implications.\\n\\n#### 1. AutoGen Studio\\n**AutoGen Studio** is a cutting-edge no-code developer tool specifically designed for building and debugging multi-agent systems. Dibia et al. (2024) highlight that this platform simplifies the development process through a web interface that supports drag-and-drop functionalities for creating agent workflows. With a Python API and a JSON-based specification for representing agents, AutoGen Studio allows users to prototype and evaluate workflows effortlessly. This tool not only enhances usability but also fosters collaboration among various generative AI models and tools. The authors emphasize four core design principles that inform the development of no-code tools, aiming to streamline the creation of multi-agent systems (Dibia et al., 2024). [Read the paper here](http://arxiv.org/pdf/2408.15247v1).\\n\\n#### 2. Levels of AI Agents\\nIn a conceptual exploration, Huang (2024) classifies AI agents into levels based on their capabilities, ranging from rule-based systems (L1) to advanced large language models (LLMs) (L3). This classification is crucial for understanding the potential complexity and collaboration among agents in multi-agent frameworks. These levels imply varying degrees of autonomy and decision-making, which can impact the design of no-code tools intended for multi-agent systems. The consideration of these levels is vital for developing platforms that allow effective integration and collaboration between diverse agent types (Huang, 2024). [Read the paper here](http://arxiv.org/pdf/2405.06643v1).\\n\\n#### 3. HAICOSYSTEM\\n**HAICOSYSTEM** presents a novel framework that examines safety risks in human-AI interactions, focusing on multi-agent systems' operational complexities. Zhou et al. (2024) discuss a modular sandbox environment that simulates interactions between AI agents and human users across various scenarios. The framework allows practitioners to evaluate and ensure the safety and performance of agents, emphasizing a crucial aspect that no-code tools must address—handling operational risks in real-time interactions. This research underscores the need for built-in safety and evaluation features within no-code platforms for multi-agent systems (Zhou et al., 2024). [Read the paper here](http://arxiv.org/pdf/2409.16427v2).\\n\\n#### 4. Collaboration Protocols in AI Agents\\nBalachandar et al. (2019) focus on the collaborative protocols that enable multiple agents to work together effectively in a competitive setting like grid soccer. Their work discusses various strategies for cooperation and highlights the importance of communication among agents. This foundational understanding of multi-agent interaction can influence the design and implementation of no-code tools by offering insights into how agents can collaborate seamlessly without the need for extensive programming (Balachandar et al., 2019). [Read the paper here](http://arxiv.org/pdf/1907.00327v1).\\n\\n#### 5. Asynchronous Multi-Agent Cooperation\\nIn a more technical aspect, Yao et al. (2021) introduce the **Partially Observable Asynchronous Multi-Agent Cooperation (POAC)** challenge to evaluate multi-agent reinforcement learning (MARL) algorithms in asynchronous environments. This environment design shifts the focus from synchronous operations, which are common in many existing no-code tools, to more realistic settings reflecting real-world complexities. The flexibility and adaptability required for asynchronous operations highlight critical design considerations for the next generation of no-code development tools (Yao et al., 2021). [Read the paper here](http://arxiv.org/pdf/2112.03809v1).\\n\\n### Conclusion\\nNo-code tools for building multi-agent AI systems are rapidly evolving, offering unprecedented access to AI development for users without programming expertise. Tools like AutoGen Studio provide essential frameworks for agent collaboration, while safety frameworks like HAICOSYSTEM remind developers of the necessity of operational integrity. Insights from collaboration protocols and asynchronous environments further inform the development and refinement of these tools. As the landscape grows, these no-code platforms will likely play a pivotal role in democratizing the development of sophisticated multi-agent systems across various domains.\\n\\n### References\\n1. Dibia, V., Chen, J., Bansal, G., Syed, S., Fourney, A., Zhu, E., Wang, C., & Amershi, S. (2024). AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems. arXiv.\\n2. Huang, Y. (2024). Levels of AI Agents: from Rules to Large Language Models. arXiv.\\n3. Zhou, X., Kim, H., Brahman, F., Jiang, L., Zhu, H., Lu, X., Xu, F., Lin, B. Y., Choi, Y., Mireshghallah, N., Bras, R. L., & Sap, M. (2024). HAICOSYSTEM: An Ecosystem for Sandboxing Safety Risks in Human-AI Interactions. arXiv.\\n4. Balachandar, N., Dieter, J., & Ramachandran, G. S. (2019). Collaboration of AI Agents via Cooperative Multi-Agent Deep Reinforcement Learning. arXiv.\\n5. Yao, M., Yin, Q., Yang, J., Yu, T., Shen, S., Zhang, J., Liang, B., & Huang, K. (2021). The Partially Observable Asynchronous Multi-Agent Cooperation Challenge. arXiv.\"), StopMessage(source='Report_Agent', content='### Literature Review on No-Code Tools for Building Multi-Agent AI Systems\\n\\nThe emergence of no-code tools signals a significant shift in the development landscape of multi-agent AI systems, enabling users with minimal programming knowledge to design and implement complex AI applications. This literature review synthesizes current research and practical insights on no-code tools crafted for establishing multi-agent AI systems, emphasizing their features, capabilities, and applications.\\n\\n#### 1. AutoGen Studio\\n**AutoGen Studio** serves as a pioneering no-code platform tailored for the design and debugging of multi-agent systems. Dibia et al. (2024) highlight that this tool utilizes a web-based interface that enables users to construct workflows through intuitive drag-and-drop functionalities. The flexibility offered by a Python API, along with a JSON-based framework for representing agents, streamlines the prototyping and evaluation processes. Such features foster collaboration among various generative AI models and enhance usability, ultimately addressing the diverse needs of non-technical users in constructing multi-agent environments (Dibia et al., 2024). [Read the paper here](http://arxiv.org/pdf/2408.15247v1).\\n\\n#### 2. Levels of AI Agents\\nHuang (2024) introduces a conceptual framework categorizing AI agents by their capabilities. This classification ranges from simple rule-based systems to advanced large language models, underscoring the varying complexities in multi-agent interactions. Understanding these levels aids in informing the design of no-code tools to support effective collaboration among agents of differing capabilities. By integrating awareness of these agent levels, developers can enhance how no-code platforms facilitate interactions within multi-agent systems (Huang, 2024). [Read the paper here](http://arxiv.org/pdf/2405.06643v1).\\n\\n#### 3. HAICOSYSTEM\\nThe **HAICOSYSTEM** framework examines the safety considerations inherent in human-AI interactions, especially concerning multi-agent contexts. Zhou et al. (2024) propose a modular sandbox environment that simulates various operational scenarios, allowing practitioners to assess and ensure safety while interacting with agents. This research emphasizes the necessity of incorporating safety evaluation features into no-code platforms for multi-agent systems, ensuring that these tools not only enhance usability but also promote reliable and secure interactions (Zhou et al., 2024). [Read the paper here](http://arxiv.org/pdf/2409.16427v2).\\n\\n#### 4. Collaboration Protocols in AI Agents\\nThe investigation by Balachandar et al. (2019) into collaborative protocols among AI agents reveals fundamental strategies that can enhance cooperative behavior in multi-agent systems. Their insights are invaluable for informing the design of no-code platforms, highlighting the importance of effective communication and cooperation among agents. By embedding these collaborative features into no-code tools, developers can facilitate more seamless integration and interaction among agents, which is essential for complex multi-agent tasks (Balachandar et al., 2019). [Read the paper here](http://arxiv.org/pdf/1907.00327v1).\\n\\n#### 5. Asynchronous Multi-Agent Cooperation\\nYao et al. (2021) present the **Partially Observable Asynchronous Multi-Agent Cooperation (POAC)** challenge, which evaluates the performance of multi-agent reinforcement learning algorithms in asynchronous environments. This design paradigm shifts focus from synchronous operations, commonly found in traditional no-code tools, toward interfaces that reflect realistic interactions. The implications of asynchronous cooperation underscore critical design considerations for developing future no-code tools, emphasizing the need for flexibility and adaptability in systems that work under real-world constraints (Yao et al., 2021). [Read the paper here](http://arxiv.org/pdf/2112.03809v1).\\n\\n### Conclusion\\nNo-code tools for developing multi-agent AI systems are rapidly advancing, providing unprecedented opportunities for users without programming skills to engage in complex AI development. Platforms like AutoGen Studio are at the forefront of these innovations, facilitating collaboration and simplifying design processes. Concurrent research on AI agent levels, safety frameworks, collaboration protocols, and asynchronous cooperation further enhances the understanding of requirements for effective no-code tool design. As these tools proliferate, they are poised to democratize access to multi-agent system development across diverse sectors.\\n\\n### References\\n1. Dibia, V., Chen, J., Bansal, G., Syed, S., Fourney, A., Zhu, E., Wang, C., & Amershi, S. (2024). AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems. arXiv. [Available here](http://arxiv.org/pdf/2408.15247v1).\\n2. Huang, Y. (2024). Levels of AI Agents: from Rules to Large Language Models. arXiv. [Available here](http://arxiv.org/pdf/2405.06643v1).\\n3. Zhou, X., Kim, H., Brahman, F., Jiang, L., Zhu, H., Lu, X., Xu, F., Lin, B. Y., Choi, Y., Mireshghallah, N., Bras, R. L., & Sap, M. (2024). HAICOSYSTEM: An Ecosystem for Sandboxing Safety Risks in Human-AI Interactions. arXiv. [Available here](http://arxiv.org/pdf/2409.16427v2).\\n4. Balachandar, N., Dieter, J., & Ramachandran, G. S. (2019). Collaboration of AI Agents via Cooperative Multi-Agent Deep Reinforcement Learning. arXiv. [Available here](http://arxiv.org/pdf/1907.00327v1).\\n5. Yao, M., Yin, Q., Yang, J., Yu, T., Shen, S., Zhang, J., Liang, B., & Huang, K. (2021). The Partially Observable Asynchronous Multi-Agent Cooperation Challenge. arXiv. [Available here](http://arxiv.org/pdf/2112.03809v1).\\n\\nTERMINATE')])" + "TaskResult(messages=[TextMessage(source='user', models_usage=None, content='Write a literature review on no code tools for building multi agent ai systems', type='TextMessage'), ToolCallMessage(source='Google_Search_Agent', models_usage=RequestUsage(prompt_tokens=123, completion_tokens=29), content=[FunctionCall(id='call_bNGwWFsfeTwDhtIpsI6GYISR', arguments='{\"query\":\"no code tools for building multi agent AI systems literature review\",\"num_results\":3}', name='google_search')], type='ToolCallMessage'), ToolCallResultMessage(source='Google_Search_Agent', models_usage=None, content=[FunctionExecutionResult(content='[{\\'title\\': \\'Literature Review — AutoGen\\', \\'link\\': \\'https://microsoft.github.io/autogen/dev//user-guide/agentchat-user-guide/examples/literature-review.html\\', \\'snippet\\': \\'run( task=\"Write a literature review on no code tools for building multi agent ai systems\", ) ... ### Conclusion No-code tools for building multi-agent AI systems\\\\xa0...\\', \\'body\\': \\'Literature Review — AutoGen Skip to main content Back to top Ctrl + K AutoGen 0.4 is a work in progress. Go here to find the 0.2 documentation. User Guide Packages API Reference Twitter GitHub PyPI User Guide Packages API Reference Twitter GitHub PyPI AgentChat Installation Quickstart Tutorial Models Messages Agents Teams Selector Group Chat Swarm Termination Custom Agents Managing State Examples Travel Planning Company Research Literature Review Core Quick Start Core Concepts Agent and\\'}, {\\'title\\': \\'Vertex AI Agent Builder | Google Cloud\\', \\'link\\': \\'https://cloud.google.com/products/agent-builder\\', \\'snippet\\': \\'Build and deploy enterprise ready generative AI experiences · Product highlights · Easily build no code conversational AI agents · Ground in Google search and/or\\\\xa0...\\', \\'body\\': \\'Vertex AI Agent Builder | Google Cloud Page Contents Vertex AI Agent Builder is making generative AI more reliable for the enterprise. Read the blog. Vertex AI Agent Builder Build and deploy enterprise ready generative AI experiences Create AI agents and applications using natural language or a code-first approach. Easily ground your agents or apps in enterprise data with a range of options. Vertex AI Agent Builder gathers all the surfaces and tools that developers need to build their AI agents\\'}, {\\'title\\': \\'AI tools I have found useful w/ research. What do you guys think ...\\', \\'link\\': \\'https://www.reddit.com/r/PhD/comments/14d6g09/ai_tools_i_have_found_useful_w_research_what_do/\\', \\'snippet\\': \"Jun 19, 2023 ... Need help deciding on the best ones, and to identify ones I\\'ve missed: ASSISTANTS (chatbots, multi-purpose) Chat with Open Large Language Models.\", \\'body\\': \\'Reddit - Dive into anything Skip to main content Open menu Open navigation Go to Reddit Home r/PhD A chip A close button Get app Get the Reddit app Log In Log in to Reddit Expand user menu Open settings menu Log In / Sign Up Advertise on Reddit Shop Collectible Avatars Get the Reddit app Scan this QR code to download the app now Or check it out in the app stores Go to PhD r/PhD r/PhD A subreddit dedicated to PhDs. Members Online • [deleted] ADMIN MOD AI tools I have found useful w/ research.\\'}]', call_id='call_bNGwWFsfeTwDhtIpsI6GYISR')], type='ToolCallResultMessage'), TextMessage(source='Google_Search_Agent', models_usage=None, content='Tool calls:\\ngoogle_search({\"query\":\"no code tools for building multi agent AI systems literature review\",\"num_results\":3}) = [{\\'title\\': \\'Literature Review — AutoGen\\', \\'link\\': \\'https://microsoft.github.io/autogen/dev//user-guide/agentchat-user-guide/examples/literature-review.html\\', \\'snippet\\': \\'run( task=\"Write a literature review on no code tools for building multi agent ai systems\", ) ... ### Conclusion No-code tools for building multi-agent AI systems\\\\xa0...\\', \\'body\\': \\'Literature Review — AutoGen Skip to main content Back to top Ctrl + K AutoGen 0.4 is a work in progress. Go here to find the 0.2 documentation. User Guide Packages API Reference Twitter GitHub PyPI User Guide Packages API Reference Twitter GitHub PyPI AgentChat Installation Quickstart Tutorial Models Messages Agents Teams Selector Group Chat Swarm Termination Custom Agents Managing State Examples Travel Planning Company Research Literature Review Core Quick Start Core Concepts Agent and\\'}, {\\'title\\': \\'Vertex AI Agent Builder | Google Cloud\\', \\'link\\': \\'https://cloud.google.com/products/agent-builder\\', \\'snippet\\': \\'Build and deploy enterprise ready generative AI experiences · Product highlights · Easily build no code conversational AI agents · Ground in Google search and/or\\\\xa0...\\', \\'body\\': \\'Vertex AI Agent Builder | Google Cloud Page Contents Vertex AI Agent Builder is making generative AI more reliable for the enterprise. Read the blog. Vertex AI Agent Builder Build and deploy enterprise ready generative AI experiences Create AI agents and applications using natural language or a code-first approach. Easily ground your agents or apps in enterprise data with a range of options. Vertex AI Agent Builder gathers all the surfaces and tools that developers need to build their AI agents\\'}, {\\'title\\': \\'AI tools I have found useful w/ research. What do you guys think ...\\', \\'link\\': \\'https://www.reddit.com/r/PhD/comments/14d6g09/ai_tools_i_have_found_useful_w_research_what_do/\\', \\'snippet\\': \"Jun 19, 2023 ... Need help deciding on the best ones, and to identify ones I\\'ve missed: ASSISTANTS (chatbots, multi-purpose) Chat with Open Large Language Models.\", \\'body\\': \\'Reddit - Dive into anything Skip to main content Open menu Open navigation Go to Reddit Home r/PhD A chip A close button Get app Get the Reddit app Log In Log in to Reddit Expand user menu Open settings menu Log In / Sign Up Advertise on Reddit Shop Collectible Avatars Get the Reddit app Scan this QR code to download the app now Or check it out in the app stores Go to PhD r/PhD r/PhD A subreddit dedicated to PhDs. Members Online • [deleted] ADMIN MOD AI tools I have found useful w/ research.\\'}]', type='TextMessage'), ToolCallMessage(source='Arxiv_Search_Agent', models_usage=RequestUsage(prompt_tokens=719, completion_tokens=28), content=[FunctionCall(id='call_ZdmwQGTO03X23GeRn6fwDN8q', arguments='{\"query\":\"no code tools for building multi agent AI systems\",\"max_results\":5}', name='arxiv_search')], type='ToolCallMessage'), ToolCallResultMessage(source='Arxiv_Search_Agent', models_usage=None, content=[FunctionExecutionResult(content='[{\\'title\\': \\'AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems\\', \\'authors\\': [\\'Victor Dibia\\', \\'Jingya Chen\\', \\'Gagan Bansal\\', \\'Suff Syed\\', \\'Adam Fourney\\', \\'Erkang Zhu\\', \\'Chi Wang\\', \\'Saleema Amershi\\'], \\'published\\': \\'2024-08-09\\', \\'abstract\\': \\'Multi-agent systems, where multiple agents (generative AI models + tools)\\\\ncollaborate, are emerging as an effective pattern for solving long-running,\\\\ncomplex tasks in numerous domains. However, specifying their parameters (such\\\\nas models, tools, and orchestration mechanisms etc,.) and debugging them\\\\nremains challenging for most developers. To address this challenge, we present\\\\nAUTOGEN STUDIO, a no-code developer tool for rapidly prototyping, debugging,\\\\nand evaluating multi-agent workflows built upon the AUTOGEN framework. AUTOGEN\\\\nSTUDIO offers a web interface and a Python API for representing LLM-enabled\\\\nagents using a declarative (JSON-based) specification. It provides an intuitive\\\\ndrag-and-drop UI for agent workflow specification, interactive evaluation and\\\\ndebugging of workflows, and a gallery of reusable agent components. We\\\\nhighlight four design principles for no-code multi-agent developer tools and\\\\ncontribute an open-source implementation at\\\\nhttps://github.com/microsoft/autogen/tree/main/samples/apps/autogen-studio\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2408.15247v1\\'}, {\\'title\\': \\'Improving Performance of Commercially Available AI Products in a Multi-Agent Configuration\\', \\'authors\\': [\\'Cory Hymel\\', \\'Sida Peng\\', \\'Kevin Xu\\', \\'Charath Ranganathan\\'], \\'published\\': \\'2024-10-29\\', \\'abstract\\': \\'In recent years, with the rapid advancement of large language models (LLMs),\\\\nmulti-agent systems have become increasingly more capable of practical\\\\napplication. At the same time, the software development industry has had a\\\\nnumber of new AI-powered tools developed that improve the software development\\\\nlifecycle (SDLC). Academically, much attention has been paid to the role of\\\\nmulti-agent systems to the SDLC. And, while single-agent systems have\\\\nfrequently been examined in real-world applications, we have seen comparatively\\\\nfew real-world examples of publicly available commercial tools working together\\\\nin a multi-agent system with measurable improvements. In this experiment we\\\\ntest context sharing between Crowdbotics PRD AI, a tool for generating software\\\\nrequirements using AI, and GitHub Copilot, an AI pair-programming tool. By\\\\nsharing business requirements from PRD AI, we improve the code suggestion\\\\ncapabilities of GitHub Copilot by 13.8% and developer task success rate by\\\\n24.5% -- demonstrating a real-world example of commercially-available AI\\\\nsystems working together with improved outcomes.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2410.22129v1\\'}, {\\'title\\': \\'AutoML-Agent: A Multi-Agent LLM Framework for Full-Pipeline AutoML\\', \\'authors\\': [\\'Patara Trirat\\', \\'Wonyong Jeong\\', \\'Sung Ju Hwang\\'], \\'published\\': \\'2024-10-03\\', \\'abstract\\': \"Automated machine learning (AutoML) accelerates AI development by automating\\\\ntasks in the development pipeline, such as optimal model search and\\\\nhyperparameter tuning. Existing AutoML systems often require technical\\\\nexpertise to set up complex tools, which is in general time-consuming and\\\\nrequires a large amount of human effort. Therefore, recent works have started\\\\nexploiting large language models (LLM) to lessen such burden and increase the\\\\nusability of AutoML frameworks via a natural language interface, allowing\\\\nnon-expert users to build their data-driven solutions. These methods, however,\\\\nare usually designed only for a particular process in the AI development\\\\npipeline and do not efficiently use the inherent capacity of the LLMs. This\\\\npaper proposes AutoML-Agent, a novel multi-agent framework tailored for\\\\nfull-pipeline AutoML, i.e., from data retrieval to model deployment.\\\\nAutoML-Agent takes user\\'s task descriptions, facilitates collaboration between\\\\nspecialized LLM agents, and delivers deployment-ready models. Unlike existing\\\\nwork, instead of devising a single plan, we introduce a retrieval-augmented\\\\nplanning strategy to enhance exploration to search for more optimal plans. We\\\\nalso decompose each plan into sub-tasks (e.g., data preprocessing and neural\\\\nnetwork design) each of which is solved by a specialized agent we build via\\\\nprompting executing in parallel, making the search process more efficient.\\\\nMoreover, we propose a multi-stage verification to verify executed results and\\\\nguide the code generation LLM in implementing successful solutions. Extensive\\\\nexperiments on seven downstream tasks using fourteen datasets show that\\\\nAutoML-Agent achieves a higher success rate in automating the full AutoML\\\\nprocess, yielding systems with good performance throughout the diverse domains.\", \\'pdf_url\\': \\'http://arxiv.org/pdf/2410.02958v1\\'}, {\\'title\\': \\'Enhancing Trust in LLM-Based AI Automation Agents: New Considerations and Future Challenges\\', \\'authors\\': [\\'Sivan Schwartz\\', \\'Avi Yaeli\\', \\'Segev Shlomov\\'], \\'published\\': \\'2023-08-10\\', \\'abstract\\': \\'Trust in AI agents has been extensively studied in the literature, resulting\\\\nin significant advancements in our understanding of this field. However, the\\\\nrapid advancements in Large Language Models (LLMs) and the emergence of\\\\nLLM-based AI agent frameworks pose new challenges and opportunities for further\\\\nresearch. In the field of process automation, a new generation of AI-based\\\\nagents has emerged, enabling the execution of complex tasks. At the same time,\\\\nthe process of building automation has become more accessible to business users\\\\nvia user-friendly no-code tools and training mechanisms. This paper explores\\\\nthese new challenges and opportunities, analyzes the main aspects of trust in\\\\nAI agents discussed in existing literature, and identifies specific\\\\nconsiderations and challenges relevant to this new generation of automation\\\\nagents. We also evaluate how nascent products in this category address these\\\\nconsiderations. Finally, we highlight several challenges that the research\\\\ncommunity should address in this evolving landscape.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2308.05391v1\\'}, {\\'title\\': \\'AI2Apps: A Visual IDE for Building LLM-based AI Agent Applications\\', \\'authors\\': [\\'Xin Pang\\', \\'Zhucong Li\\', \\'Jiaxiang Chen\\', \\'Yuan Cheng\\', \\'Yinghui Xu\\', \\'Yuan Qi\\'], \\'published\\': \\'2024-04-07\\', \\'abstract\\': \\'We introduce AI2Apps, a Visual Integrated Development Environment (Visual\\\\nIDE) with full-cycle capabilities that accelerates developers to build\\\\ndeployable LLM-based AI agent Applications. This Visual IDE prioritizes both\\\\nthe Integrity of its development tools and the Visuality of its components,\\\\nensuring a smooth and efficient building experience.On one hand, AI2Apps\\\\nintegrates a comprehensive development toolkit ranging from a prototyping\\\\ncanvas and AI-assisted code editor to agent debugger, management system, and\\\\ndeployment tools all within a web-based graphical user interface. On the other\\\\nhand, AI2Apps visualizes reusable front-end and back-end code as intuitive\\\\ndrag-and-drop components. Furthermore, a plugin system named AI2Apps Extension\\\\n(AAE) is designed for Extensibility, showcasing how a new plugin with 20\\\\ncomponents enables web agent to mimic human-like browsing behavior. Our case\\\\nstudy demonstrates substantial efficiency improvements, with AI2Apps reducing\\\\ntoken consumption and API calls when debugging a specific sophisticated\\\\nmultimodal agent by approximately 90% and 80%, respectively. The AI2Apps,\\\\nincluding an online demo, open-source code, and a screencast video, is now\\\\npublicly accessible.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2404.04902v1\\'}]', call_id='call_ZdmwQGTO03X23GeRn6fwDN8q')], type='ToolCallResultMessage'), TextMessage(source='Arxiv_Search_Agent', models_usage=None, content='Tool calls:\\narxiv_search({\"query\":\"no code tools for building multi agent AI systems\",\"max_results\":5}) = [{\\'title\\': \\'AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems\\', \\'authors\\': [\\'Victor Dibia\\', \\'Jingya Chen\\', \\'Gagan Bansal\\', \\'Suff Syed\\', \\'Adam Fourney\\', \\'Erkang Zhu\\', \\'Chi Wang\\', \\'Saleema Amershi\\'], \\'published\\': \\'2024-08-09\\', \\'abstract\\': \\'Multi-agent systems, where multiple agents (generative AI models + tools)\\\\ncollaborate, are emerging as an effective pattern for solving long-running,\\\\ncomplex tasks in numerous domains. However, specifying their parameters (such\\\\nas models, tools, and orchestration mechanisms etc,.) and debugging them\\\\nremains challenging for most developers. To address this challenge, we present\\\\nAUTOGEN STUDIO, a no-code developer tool for rapidly prototyping, debugging,\\\\nand evaluating multi-agent workflows built upon the AUTOGEN framework. AUTOGEN\\\\nSTUDIO offers a web interface and a Python API for representing LLM-enabled\\\\nagents using a declarative (JSON-based) specification. It provides an intuitive\\\\ndrag-and-drop UI for agent workflow specification, interactive evaluation and\\\\ndebugging of workflows, and a gallery of reusable agent components. We\\\\nhighlight four design principles for no-code multi-agent developer tools and\\\\ncontribute an open-source implementation at\\\\nhttps://github.com/microsoft/autogen/tree/main/samples/apps/autogen-studio\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2408.15247v1\\'}, {\\'title\\': \\'Improving Performance of Commercially Available AI Products in a Multi-Agent Configuration\\', \\'authors\\': [\\'Cory Hymel\\', \\'Sida Peng\\', \\'Kevin Xu\\', \\'Charath Ranganathan\\'], \\'published\\': \\'2024-10-29\\', \\'abstract\\': \\'In recent years, with the rapid advancement of large language models (LLMs),\\\\nmulti-agent systems have become increasingly more capable of practical\\\\napplication. At the same time, the software development industry has had a\\\\nnumber of new AI-powered tools developed that improve the software development\\\\nlifecycle (SDLC). Academically, much attention has been paid to the role of\\\\nmulti-agent systems to the SDLC. And, while single-agent systems have\\\\nfrequently been examined in real-world applications, we have seen comparatively\\\\nfew real-world examples of publicly available commercial tools working together\\\\nin a multi-agent system with measurable improvements. In this experiment we\\\\ntest context sharing between Crowdbotics PRD AI, a tool for generating software\\\\nrequirements using AI, and GitHub Copilot, an AI pair-programming tool. By\\\\nsharing business requirements from PRD AI, we improve the code suggestion\\\\ncapabilities of GitHub Copilot by 13.8% and developer task success rate by\\\\n24.5% -- demonstrating a real-world example of commercially-available AI\\\\nsystems working together with improved outcomes.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2410.22129v1\\'}, {\\'title\\': \\'AutoML-Agent: A Multi-Agent LLM Framework for Full-Pipeline AutoML\\', \\'authors\\': [\\'Patara Trirat\\', \\'Wonyong Jeong\\', \\'Sung Ju Hwang\\'], \\'published\\': \\'2024-10-03\\', \\'abstract\\': \"Automated machine learning (AutoML) accelerates AI development by automating\\\\ntasks in the development pipeline, such as optimal model search and\\\\nhyperparameter tuning. Existing AutoML systems often require technical\\\\nexpertise to set up complex tools, which is in general time-consuming and\\\\nrequires a large amount of human effort. Therefore, recent works have started\\\\nexploiting large language models (LLM) to lessen such burden and increase the\\\\nusability of AutoML frameworks via a natural language interface, allowing\\\\nnon-expert users to build their data-driven solutions. These methods, however,\\\\nare usually designed only for a particular process in the AI development\\\\npipeline and do not efficiently use the inherent capacity of the LLMs. This\\\\npaper proposes AutoML-Agent, a novel multi-agent framework tailored for\\\\nfull-pipeline AutoML, i.e., from data retrieval to model deployment.\\\\nAutoML-Agent takes user\\'s task descriptions, facilitates collaboration between\\\\nspecialized LLM agents, and delivers deployment-ready models. Unlike existing\\\\nwork, instead of devising a single plan, we introduce a retrieval-augmented\\\\nplanning strategy to enhance exploration to search for more optimal plans. We\\\\nalso decompose each plan into sub-tasks (e.g., data preprocessing and neural\\\\nnetwork design) each of which is solved by a specialized agent we build via\\\\nprompting executing in parallel, making the search process more efficient.\\\\nMoreover, we propose a multi-stage verification to verify executed results and\\\\nguide the code generation LLM in implementing successful solutions. Extensive\\\\nexperiments on seven downstream tasks using fourteen datasets show that\\\\nAutoML-Agent achieves a higher success rate in automating the full AutoML\\\\nprocess, yielding systems with good performance throughout the diverse domains.\", \\'pdf_url\\': \\'http://arxiv.org/pdf/2410.02958v1\\'}, {\\'title\\': \\'Enhancing Trust in LLM-Based AI Automation Agents: New Considerations and Future Challenges\\', \\'authors\\': [\\'Sivan Schwartz\\', \\'Avi Yaeli\\', \\'Segev Shlomov\\'], \\'published\\': \\'2023-08-10\\', \\'abstract\\': \\'Trust in AI agents has been extensively studied in the literature, resulting\\\\nin significant advancements in our understanding of this field. However, the\\\\nrapid advancements in Large Language Models (LLMs) and the emergence of\\\\nLLM-based AI agent frameworks pose new challenges and opportunities for further\\\\nresearch. In the field of process automation, a new generation of AI-based\\\\nagents has emerged, enabling the execution of complex tasks. At the same time,\\\\nthe process of building automation has become more accessible to business users\\\\nvia user-friendly no-code tools and training mechanisms. This paper explores\\\\nthese new challenges and opportunities, analyzes the main aspects of trust in\\\\nAI agents discussed in existing literature, and identifies specific\\\\nconsiderations and challenges relevant to this new generation of automation\\\\nagents. We also evaluate how nascent products in this category address these\\\\nconsiderations. Finally, we highlight several challenges that the research\\\\ncommunity should address in this evolving landscape.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2308.05391v1\\'}, {\\'title\\': \\'AI2Apps: A Visual IDE for Building LLM-based AI Agent Applications\\', \\'authors\\': [\\'Xin Pang\\', \\'Zhucong Li\\', \\'Jiaxiang Chen\\', \\'Yuan Cheng\\', \\'Yinghui Xu\\', \\'Yuan Qi\\'], \\'published\\': \\'2024-04-07\\', \\'abstract\\': \\'We introduce AI2Apps, a Visual Integrated Development Environment (Visual\\\\nIDE) with full-cycle capabilities that accelerates developers to build\\\\ndeployable LLM-based AI agent Applications. This Visual IDE prioritizes both\\\\nthe Integrity of its development tools and the Visuality of its components,\\\\nensuring a smooth and efficient building experience.On one hand, AI2Apps\\\\nintegrates a comprehensive development toolkit ranging from a prototyping\\\\ncanvas and AI-assisted code editor to agent debugger, management system, and\\\\ndeployment tools all within a web-based graphical user interface. On the other\\\\nhand, AI2Apps visualizes reusable front-end and back-end code as intuitive\\\\ndrag-and-drop components. Furthermore, a plugin system named AI2Apps Extension\\\\n(AAE) is designed for Extensibility, showcasing how a new plugin with 20\\\\ncomponents enables web agent to mimic human-like browsing behavior. Our case\\\\nstudy demonstrates substantial efficiency improvements, with AI2Apps reducing\\\\ntoken consumption and API calls when debugging a specific sophisticated\\\\nmultimodal agent by approximately 90% and 80%, respectively. The AI2Apps,\\\\nincluding an online demo, open-source code, and a screencast video, is now\\\\npublicly accessible.\\', \\'pdf_url\\': \\'http://arxiv.org/pdf/2404.04902v1\\'}]', type='TextMessage'), TextMessage(source='Report_Agent', models_usage=RequestUsage(prompt_tokens=2381, completion_tokens=1090), content=\"## Literature Review on No-Code Tools for Building Multi-Agent AI Systems\\n\\n### Introduction\\n\\nThe emergence of multi-agent systems (MAS) has transformed various domains by enabling collaboration among multiple agents—ranging from generative AI models to orchestrated tools—to solve complex, long-term tasks. However, the traditional development of these systems often requires substantial technical expertise, making it inaccessible for non-developers. The introduction of no-code platforms aims to shift this paradigm, allowing users without formal programming knowledge to design, debug, and deploy multi-agent systems. This review synthesizes current literature concerning no-code tools developed for building multi-agent AI systems, highlighting recent advancements and emerging trends.\\n\\n### No-Code Development Tools\\n\\n#### AutoGen Studio\\n\\nOne of the prominent no-code tools is **AutoGen Studio**, developed by Dibia et al. (2024). This tool provides a web interface and a declarative specification method utilizing JSON, enabling rapid prototyping, debugging, and evaluating multi-agent workflows. The drag-and-drop capabilities streamline the design process, making complex interactions between agents more manageable. The framework operates on four primary design principles that cater specifically to no-code development, contributing to an accessible pathway for users to harness multi-agent frameworks for various applications (Dibia et al., 2024).\\n\\n#### AI2Apps Visual IDE\\n\\nAnother notable tool is **AI2Apps**, described by Pang et al. (2024). It serves as a Visual Integrated Development Environment that incorporates a comprehensive set of tools from prototyping to deployment. The platform's user-friendly interface allows for the visualization of code through drag-and-drop components, facilitating smoother integration of different agents. An extension system enhances the platform's capabilities, showcasing the potential for customization and scalability in agent application development. The reported efficiency improvements in token consumption and API calls indicate substantial benefits in user-centric design (Pang et al., 2024).\\n\\n### Performance Enhancements in Multi-Agent Configurations\\n\\nHymel et al. (2024) examined the collaborative performance of commercially available AI tools, demonstrating a measurable improvement when integrating multiple agents in a shared configuration. Their experiments showcased how cooperation between tools like Crowdbotics PRD AI and GitHub Copilot significantly improved task success rates, illustrating the practical benefits of employing no-code tools in multi-agent environments. This synergy reflects the critical need for frameworks that inherently support such integrations, especially through no-code mechanisms, to enhance user experience and productivity (Hymel et al., 2024).\\n\\n### Trust and Usability in AI Agents\\n\\nThe concept of trust in AI, particularly in LLM-based automation agents, has gained attention. Schwartz et al. (2023) addressed the challenges and considerations unique to this new generation of agents, highlighting how no-code platforms ease access and usability for non-technical users. The paper emphasizes the need for further research into the trust factors integral to effective multi-agent systems, advocating for a user-centric approach in the design and evaluation of these no-code tools (Schwartz et al., 2023).\\n\\n### Full-Pipeline AutoML with Multi-Agent Systems\\n\\nThe **AutoML-Agent** framework proposed by Trirat et al. (2024) brings another layer of innovation to the no-code landscape. This framework enhances existing automated machine learning processes by using multiple specialized agents that collaboratively manage the full AI development pipeline from data retrieval to model deployment. The novelty lies in its retrieval-augmented planning strategy, which allows for efficient task decomposition and parallel execution, optimizing the overall development experience for non-experts (Trirat et al., 2024).\\n\\n### Conclusion\\n\\nThe literature presents a growing array of no-code tools designed to democratize the development of multi-agent systems. Innovations such as AutoGen Studio, AI2Apps, and collaborative frameworks like AutoML-Agent highlight a trend towards user-centric, efficient design that encourages participation beyond technical boundaries. Future research should continue to explore aspects of trust, usability, and integration to further refine these tools and expand their applicability across various domains.\\n\\n### References\\n\\n- Dibia, V., Chen, J., Bansal, G., Syed, S., Fourney, A., Zhu, E., Wang, C., & Amershi, S. (2024). AutoGen Studio: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems. *arXiv:2408.15247*.\\n- Hymel, C., Peng, S., Xu, K., & Ranganathan, C. (2024). Improving Performance of Commercially Available AI Products in a Multi-Agent Configuration. *arXiv:2410.22129*.\\n- Pang, X., Li, Z., Chen, J., Cheng, Y., Xu, Y., & Qi, Y. (2024). AI2Apps: A Visual IDE for Building LLM-based AI Agent Applications. *arXiv:2404.04902*.\\n- Schwartz, S., Yaeli, A., & Shlomov, S. (2023). Enhancing Trust in LLM-Based AI Automation Agents: New Considerations and Future Challenges. *arXiv:2308.05391*.\\n- Trirat, P., Jeong, W., & Hwang, S. J. (2024). AutoML-Agent: A Multi-Agent LLM Framework for Full-Pipeline AutoML. *arXiv:2410.02958*.\\n\\nTERMINATE\", type='TextMessage')], stop_reason=\"Text 'TERMINATE' mentioned\")" ] }, - "execution_count": 4, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "google_search_agent = ToolUseAssistantAgent(\n", - " name=\"Google_Search_Agent\",\n", - " registered_tools=[google_search_tool],\n", - " model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"),\n", - " description=\"An agent that can search Google for information, returns results with a snippet and body content\",\n", - " system_message=\"You are a helpful AI assistant. Solve tasks using your tools.\",\n", - ")\n", - "\n", - "arxiv_search_agent = ToolUseAssistantAgent(\n", - " name=\"Arxiv_Search_Agent\",\n", - " registered_tools=[arxiv_search_tool],\n", - " model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"),\n", - " description=\"An agent that can search Arxiv for papers related to a given topic, including abstracts\",\n", - " system_message=\"You are a helpful AI assistant. Solve tasks using your tools. Specifically, you can take into consideration the user's request and craft a search query that is most likely to return relevant academi papers.\",\n", - ")\n", - "\n", - "\n", - "report_agent = CodingAssistantAgent(\n", - " name=\"Report_Agent\",\n", - " model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"),\n", - " description=\"Generate a report based on a given topic\",\n", - " system_message=\"You are a helpful assistant. Your task is to synthesize data extracted into a high quality literature review including CORRECT references. You MUST write a final report that is formatted as a literature review with CORRECT references. Your response should end with the word 'TERMINATE'\",\n", - ")\n", - "\n", - "termination = TextMentionTermination(\"TERMINATE\")\n", - "team = RoundRobinGroupChat(\n", - " participants=[google_search_agent, arxiv_search_agent, report_agent], termination_condition=termination\n", - ")\n", - "\n", - "result = await team.run(\n", - " task=\"Write a literature review on no code tools for building multi agent ai systems\",\n", + "await Console(\n", + " team.run_stream(\n", + " task=\"Write a literature review on no code tools for building multi agent ai systems\",\n", + " )\n", ")" ] } @@ -355,7 +326,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.6" + "version": "3.11.5" } }, "nbformat": 4, diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/travel-planning.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/travel-planning.ipynb index b3d16b2fe2c2..beb4ceac6ee3 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/travel-planning.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/examples/travel-planning.ipynb @@ -13,14 +13,15 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "from autogen_agentchat.agents import CodingAssistantAgent\n", + "from autogen_agentchat.agents import AssistantAgent\n", "from autogen_agentchat.conditions import TextMentionTermination\n", "from autogen_agentchat.teams import RoundRobinGroupChat\n", - "from autogen_ext.models import OpenAIChatCompletionClient" + "from autogen_agentchat.ui import Console\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient" ] }, { @@ -34,34 +35,34 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "planner_agent = CodingAssistantAgent(\n", + "planner_agent = AssistantAgent(\n", " \"planner_agent\",\n", - " model_client=OpenAIChatCompletionClient(model=\"gpt-4\"),\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o\"),\n", " description=\"A helpful assistant that can plan trips.\",\n", " system_message=\"You are a helpful assistant that can suggest a travel plan for a user based on their request.\",\n", ")\n", "\n", - "local_agent = CodingAssistantAgent(\n", + "local_agent = AssistantAgent(\n", " \"local_agent\",\n", - " model_client=OpenAIChatCompletionClient(model=\"gpt-4\"),\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o\"),\n", " description=\"A local assistant that can suggest local activities or places to visit.\",\n", " system_message=\"You are a helpful assistant that can suggest authentic and interesting local activities or places to visit for a user and can utilize any context information provided.\",\n", ")\n", "\n", - "language_agent = CodingAssistantAgent(\n", + "language_agent = AssistantAgent(\n", " \"language_agent\",\n", - " model_client=OpenAIChatCompletionClient(model=\"gpt-4\"),\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o\"),\n", " description=\"A helpful assistant that can provide language tips for a given destination.\",\n", " system_message=\"You are a helpful assistant that can review travel plans, providing feedback on important/critical tips about how best to address language or communication challenges for the given destination. If the plan already includes language tips, you can mention that the plan is satisfactory, with rationale.\",\n", ")\n", "\n", - "travel_summary_agent = CodingAssistantAgent(\n", + "travel_summary_agent = AssistantAgent(\n", " \"travel_summary_agent\",\n", - " model_client=OpenAIChatCompletionClient(model=\"gpt-4\"),\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o\"),\n", " description=\"A helpful assistant that can summarize the travel plan.\",\n", " system_message=\"You are a helpful assistant that can take in all of the suggestions and advice from the other agents and provide a detailed tfinal travel plan. You must ensure th b at the final plan is integrated and complete. YOUR FINAL RESPONSE MUST BE THE COMPLETE PLAN. When the plan is complete and all perspectives are integrated, you can respond with TERMINATE.\",\n", ")" @@ -69,128 +70,196 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "--------------------------------------------------------------------------------\n", - "user:\n", + "---------- user ----------\n", "Plan a 3 day trip to Nepal.\n", - "--------------------------------------------------------------------------------\n", - "planner_agent:\n", - "Day 1: Arrival and Sightseeing in Kathmandu\n", - "\n", - "Start your trip upon arrival at Tribhuvan International Airport in Kathmandu. After checking into a hotel, head off for sightseeing in Kathmandu, the cultural heart of Nepal.\n", - "\n", - "First, visit Kathmandu Durbar Square, a UNESCO World Heritage Site. This square is filled with ancient architecture, temples, and has an old Royal Palace site.\n", - "\n", - "Next, make your way to Swayambhunath Stupa (Monkey Temple), perched on a hilltop with panoramic views of Kathmandu city. \n", - "\n", - "In the evening, visit Thamel, a bustling district known for its shops, food stalls, and nightlife. Enjoy local Nepali cuisine for dinner to experience the local flavors.\n", - "\n", - "Day 2: Explore Bhaktapur and Patan\n", - "\n", - "Take a scenic drive to Bhaktapur, the city of devotees. Start with Bhaktapur Durbar Square, another UNESCO World Heritage Site, and then explore the local pottery square where traditional ceramics are made.\n", - "\n", - "Then, head to Patan city, renowned for its vibrant arts and crafts tradition. Visit Patan Durbar Square, marvel at its architectural brilliance and learn about the unique mix of Buddhism and Hinduism in Nepal.\n", - "\n", - "Day 3: Visit Pokhara\n", - "\n", - "On your final day, take a domestic flight or a scenic 6-hour drive to Pokhara from Kathmandu. Pokhara is known for its stunning landscapes, charming water body - the Phewa lake, and the Himalayan range including the Annapurna massif.\n", - "\n", - "Swing by the charming Lakeside market for some shopping, savor a relaxing boat ride in Phewa lake and visit the Tal Barahi Temple located in the center of the lake. Take the opportunity to visit Davis Falls, a unique waterfall that directly goes into a narrow and deep tunnel leading into a few kilometers long cave.\n", - "\n", - "Please note that this is just a skeletal plan and actual trip might have variances based on your flight timings, weather, and local conditions.\n", - "\n", - "Don't forget to carry essentials like warm clothing (especially if you're visiting in winters), toiletries, good quality trekking shoes; and remember to check about any visa or entry requirements. ALWAYS respect local customs and traditions when visiting religious places.\n", - "\n", - "Please talk to local travel operators for transport, guide, and tickets to various tourist and heritage spots. Enjoy your trip!\n", - "--------------------------------------------------------------------------------\n", - "local_agent:\n", - "Day 1: Arrival and Sightseeing in Kathmandu\n", - "\n", - "Start your trip upon arrival at Tribhuvan International Airport in Kathmandu. After checking into a hotel, head off for sightseeing in Kathmandu, the cultural heart of Nepal.\n", - "\n", - "First, visit Kathmandu Durbar Square, a UNESCO World Heritage Site. This square is filled with ancient architecture, temples, and has an old Royal Palace site.\n", - "\n", - "Next, make your way to Swayambhunath Stupa (Monkey Temple), perched on a hilltop with panoramic views of Kathmandu city. \n", - "\n", - "In the evening, visit Thamel, a bustling district known for its shops, food stalls, and nightlife. Enjoy local Nepali cuisine for dinner to experience the local flavors.\n", - "\n", - "Day 2: Explore Bhaktapur and Patan\n", - "\n", - "Take a scenic drive to Bhaktapur, the city of devotees. Start with Bhaktapur Durbar Square, another UNESCO World Heritage Site, and then explore the local pottery square where traditional ceramics are made.\n", - "\n", - "Then, head to Patan city, renowned for its vibrant arts and crafts tradition. Visit Patan Durbar Square, marvel at its architectural brilliance and learn about the unique mix of Buddhism and Hinduism in Nepal.\n", - "\n", - "Day 3: Visit Pokhara\n", - "\n", - "On your final day, take a domestic flight or a scenic 6-hour drive to Pokhara from Kathmandu. Pokhara is known for its stunning landscapes, charming water body - the Phewa lake, and the Himalayan range including the Annapurna massif.\n", - "\n", - "Swing by the charming Lakeside market for some shopping, savor a relaxing boat ride in Phewa lake and visit the Tal Barahi Temple located in the center of the lake. Take the opportunity to visit Davis Falls, a unique waterfall that directly goes into a narrow and deep tunnel leading into a few kilometers long cave.\n", - "\n", - "Please note that this is just a skeletal plan and actual trip might have variances based on your flight timings, weather, and local conditions.\n", - "\n", - "Don't forget to carry essentials like warm clothing (especially if you're visiting in winters), toiletries, good quality trekking shoes; and remember to check about any visa or entry requirements. ALWAYS respect local customs and traditions when visiting religious places.\n", - "\n", - "Please talk to local travel operators for transport, guide, and tickets to various tourist and heritage spots. Enjoy your trip!\n", - "--------------------------------------------------------------------------------\n", - "language_agent:\n", - "Looking at your plan, it seems very detailed and well-thought-out. However, you have not addressed the critical language or communication aspect of travelling in Nepal. Here are some points to add:\n", - "\n", - "1. The official language of Nepal is Nepali and is spoken by a majority of the population. English is also commonly understood and spoken in urban areas and tourist centres, but do not expect everyone to be fluent or comfortable communicating in English.\n", - "\n", - "2. Before your trip, it might be worth learning a few basic Nepali words or phrases. Things like \"hello\" or \"Namaste\" (greeting), \"dhanyabad\" (thank you), or \"kati ho?\" (how much?) can go a long way.\n", - "\n", - "3. Consider bringing a pocket-sized Nepali phrasebook or downloading a language app on your phone for translation assistance when needed.\n", - "\n", - "4. For guided tours or when hiring taxis, ensure to hire English-speaking guides or drivers, which can usually be arranged through your hotel or local tourism agencies.\n", - "\n", - "By considering these language and communication tips, you can ensure that your trip is both enjoyable and easy to navigate.\n", - "--------------------------------------------------------------------------------\n", - "travel_summary_agent:\n", - "Day 1: Arrival and Kathmandu Sightseeing\n", - "\n", - "After landing at Tribhuvan International Airport, Kathmandu, move to your hotel for a quick refresh. Commence your tour with a visit to Kathmandu Durbar Square, a UNESCO World Heritage Site. Explore the historic architectures and temples here, along with the ancient Royal Palace.\n", - "\n", - "Proceed to Swayambhunath Stupa (Monkey Temple), situated on a hilltop with stunning views of the city. \n", - "\n", - "Afterwards, stroll through the bustling district of Thamel, known for shops and food stalls, and enjoy a dinner with local Nepali flavors.\n", - "\n", - "Day 2: Tour of Bhaktapur and Patan\n", - "\n", - "Embark on a scenic drive to Bhaktapur, often called the city of devotees. Spend your morning at Bhaktapur Durbar Square, another UNESCO World Heritage Site, and take some time to explore the local pottery square.\n", - "\n", - "In the afternoon, visit Patan City, known for its rich tradition of arts and crafts. Visit Patan Durbar Square, marvel at its architectural brilliance, and explore the confluence of Buddhism and Hinduism in Nepal.\n", - "\n", - "Day 3: Discover Pokhara\n", - "\n", - "On your final day, take a domestic flight or a 6-hour drive to Pokhara, a city renowned for its beautiful landscapes and the Phewa Lake overlooked by the towering Annapurna massif.\n", - "\n", - "Visit the lakeside market for shopping, enjoy a calming boat ride on Phewa Lake, and visit the Tal Barahi Temple in the middle of the lake. Conclude your tour with a visit to Davis Falls, a unique waterfall that flows directly into a deep, narrow tunnel.\n", - "\n", - "Please note:\n", - "\n", - "- This is just an indicative plan; actual trip might vary based on your flight timings, weather, and local conditions.\n", - "- Don't forget to pack essentials such as warm clothing (especially for winters), toiletries, and sturdy trekking shoes. Prioritize checking visa or entry requirements, if any.\n", - "- Always respect local customs and traditions, specifically when visiting religious places.\n", - "- Consult with local travel operators for transportation, travel guides, and tickets to heritage spots.\n", - "\n", - "Language Tips:\n", - "\n", - "- The official language is Nepali. English is generally understood and spoken in urban areas and by people associated with tourism, but do not anticipate everyone to be fluent.\n", - "- Familiarize yourself with basic Nepali phrases like \"Namaste\" (Hello), \"Dhanyabad\" (Thank you), \"Kati Ho?\" (How much?), etc.\n", - "- Consider carrying a Nepali phrasebook or installing a language translation app.\n", - "- For guided tours or taxis, hire English-speaking guides or drivers. This can be arranged through your hotel or local tourism agencies. \n", - "\n", - "Enjoy your trip! \n", + "---------- planner_agent ----------\n", + "Nepal is a stunning destination with its rich cultural heritage, breathtaking landscapes, and friendly people. A 3-day trip to Nepal is short, so let's focus on maximizing your experience with a mix of cultural, adventure, and scenic activities. Here’s a suggested itinerary:\n", + "\n", + "### Day 1: Arrival in Kathmandu\n", + "- **Morning:**\n", + " - Arrive at Tribhuvan International Airport in Kathmandu.\n", + " - Check into your hotel and freshen up.\n", + "- **Late Morning:**\n", + " - Visit **Swayambhunath Stupa** (also known as the Monkey Temple). This ancient religious site offers a panoramic view of the Kathmandu Valley.\n", + "- **Afternoon:**\n", + " - Head to **Kathmandu Durbar Square** to explore the old royal palace and various temples. Don’t miss the Kumari Ghar, which is home to the living goddess.\n", + " - Have lunch at a nearby local restaurant and try traditional Nepali cuisine.\n", + "- **Evening:**\n", + " - Explore the vibrant streets of **Thamel**, a popular tourist district with shops, restaurants, and markets.\n", + " - Dinner at a cozy restaurant featuring Nepali or continental dishes.\n", + "\n", + "### Day 2: Day Trip to Patan and Bhaktapur\n", + "- **Morning:**\n", + " - Drive to **Patan (Lalitpur)**, only a few kilometers from Kathmandu. Explore **Patan Durbar Square** with its incredible temples and ancient palaces.\n", + "- **Late Morning:**\n", + " - Visit the **Patan Museum** for its unique collection of artifacts.\n", + " - Optional: Visit the nearby **Golden Temple (Hiranya Varna Mahavihar)**.\n", + "- **Afternoon:**\n", + " - Head to **Bhaktapur**, about an hour's drive from Patan. Visit **Bhaktapur Durbar Square**, known for its medieval art and architecture.\n", + " - Try some local **\"juju dhau\"** (king curd) – a must-taste in Bhaktapur.\n", + "- **Evening:**\n", + " - Return to Kathmandu for an evening of relaxation.\n", + " - Dinner at a restaurant with cultural performances, such as traditional Nepali dance.\n", + "\n", + "### Day 3: Nature Excursion and Departure\n", + "- **Early Morning:**\n", + " - If interested in a short trek, consider a half-day hike to **Nagarkot** for sunrise views over the Himalayas. This requires an early start (leave around 4 AM). You can also enjoy a hearty breakfast with a view.\n", + "- **Late Morning:**\n", + " - Return to Kathmandu. If trekking to Nagarkot isn’t feasible, visit the **Pashupatinath Temple**, a UNESCO World Heritage site, or the nearby **Boudhanath Stupa**.\n", + "- **Afternoon:**\n", + " - Visit the **Garden of Dreams** for some tranquility before departure. It’s a beautifully restored, serene garden.\n", + "- **Evening:**\n", + " - Depending on your flight schedule, enjoy some last-minute shopping or relishing Nepali momos (dumplings) before you head to the airport.\n", + "- **Departure:**\n", + " - Transfer to Tribhuvan International Airport for your onward journey.\n", + "\n", + "### Tips:\n", + "- Check the weather and prepare accordingly, especially if visiting during the monsoon or winter.\n", + "- Respect local customs and traditions, especially when visiting religious sites. Dress modestly and be mindful of photography rules.\n", + "- Consider adjusting this itinerary based on your arrival and departure times and personal interests.\n", + "\n", + "I hope you have an unforgettable experience in Nepal! Safe travels!\n", + "[Prompt tokens: 40, Completion tokens: 712]\n", + "---------- local_agent ----------\n", + "Nepal offers a blend of natural beauty, rich culture, and historical wonders. For a condensed yet fulfilling 3-day trip, the following itinerary focuses on providing a diverse taste of what Nepal has to offer:\n", + "\n", + "### Day 1: Explore Kathmandu\n", + "- **Morning:**\n", + " - Arrive at Tribhuvan International Airport.\n", + " - Check into your hotel and rest or freshen up.\n", + "- **Late Morning:**\n", + " - Visit **Swayambhunath Stupa** (Monkey Temple) for panoramic views and insight into Nepalese spirituality.\n", + "- **Afternoon:**\n", + " - Explore **Kathmandu Durbar Square**, where you can admire historic palaces and temples.\n", + " - Have lunch nearby and try traditional Nepali dishes like dal bhat (lentils and rice).\n", + "- **Evening:**\n", + " - Stroll through **Thamel**, a lively district filled with shops and restaurants.\n", + " - Enjoy dinner at a cultural restaurant featuring a traditional Nepali dance show.\n", + "\n", + "### Day 2: Discover Patan and Bhaktapur\n", + "- **Morning:**\n", + " - Head to **Patan** to explore **Patan Durbar Square**, known for its stunning Newar architecture.\n", + " - Visit the **Patan Museum** to learn about Nepalese history and art.\n", + " - Optional: Visit the **Golden Temple (Hiranya Varna Mahavihar)**.\n", + "- **Afternoon:**\n", + " - Travel to **Bhaktapur**, a medieval town famous for its well-preserved architecture.\n", + " - Visit **Bhaktapur Durbar Square** and enjoy the artistic temples and palaces.\n", + " - Savor local specialties like **\"juju dhau\"** (king curd).\n", + "- **Evening:**\n", + " - Return to Kathmandu for dinner and relaxation.\n", + "\n", + "### Day 3: Nature and Spirituality\n", + "- **Early Morning:**\n", + " - Depart for **Nagarkot** to catch the sunrise over the Himalayas, offering breathtaking views of peaks including Mount Everest. If possible, enjoy breakfast with the scenic backdrop.\n", + "- **Late Morning:**\n", + " - Return to Kathmandu. Alternatively, visit the **Pashupatinath Temple**, one of Nepal's holiest Hindu sites.\n", + "- **Afternoon:**\n", + " - See the majestic **Boudhanath Stupa**, one of the largest stupas in the world.\n", + " - Relax in the **Garden of Dreams**, a peaceful oasis in the city.\n", + "- **Evening:**\n", + " - Enjoy a final meal featuring local favorites such as momos (dumplings) before heading to the airport.\n", + "- **Departure:**\n", + " - Transfer to Tribhuvan International Airport for your departure.\n", + "\n", + "### Tips:\n", + "- Dress modestly and be respectful when visiting religious sites.\n", + "- Adjust the itinerary based on your interests and flight times.\n", + "- Consider the weather; pack appropriately for the season.\n", + "\n", + "This itinerary offers a snapshot of Nepal's diverse attractions, blending cultural immersion with natural beauty. Wishing you a memorable trip! Safe travels!\n", + "[Prompt tokens: 768, Completion tokens: 604]\n", + "---------- language_agent ----------\n", + "Your 3-day trip to Nepal is well-planned, giving you a taste of the country's vibrant culture, rich history, and breathtaking landscapes. Here are some important language and communication tips that will enhance your experience:\n", + "\n", + "1. **Basic Nepali Phrases**: While English is widely spoken in tourist areas, learning a few basic Nepali phrases can be helpful and appreciated by locals. Here are some to consider:\n", + " - Namaste (नमस्ते) – Hello\n", + " - Dhanyabad (धन्यवाद) – Thank you\n", + " - Mitho cha (मिठो छ) – It's delicious\n", + " - Kripya (कृपया) – Please\n", + " - Maaph garnus (माफ गर्नुहोस्) – Sorry/Excuse me\n", + "\n", + "2. **Gesture Understanding**: In Nepal, the slight tilting head nod means \"yes,\" and shaking your head left to right can mean \"no.\" This might be different from some Western countries where nodding generally signifies agreement.\n", + "\n", + "3. **Respect and Etiquette**: When visiting religious sites, remove shoes and hats before entering. It's respectful to use your right hand when giving or receiving something, as the left hand is considered impure in Nepali culture.\n", + "\n", + "4. **Offline Translation Apps**: Consider downloading an offline translation app or phrasebook in case you find yourself in areas where English might not be as common.\n", + "\n", + "5. **Non-Verbal Communication**: A smile goes a long way in Nepal. If you encounter a language barrier, hand gestures and a friendly demeanor can be very effective.\n", + "\n", + "With these tips in mind, your itinerary seems well-rounded, giving you a rich experience in Nepal. Enjoy your trip and the diverse experiences Nepal has to offer!\n", + "[Prompt tokens: 1403, Completion tokens: 353]\n", + "---------- travel_summary_agent ----------\n", + "Here's your comprehensive and integrated 3-day travel plan for an unforgettable trip to Nepal. This itinerary focuses on delivering a taste of Nepal's culture, history, nature, and hospitality, while incorporating practical language and cultural tips to enhance your experience.\n", + "\n", + "### Day 1: Arrival and Cultural Exploration in Kathmandu\n", + "- **Morning:**\n", + " - Arrive at Tribhuvan International Airport in Kathmandu. Begin your adventure by checking into your hotel to rest and freshen up.\n", + "- **Late Morning:**\n", + " - Explore **Swayambhunath Stupa** (Monkey Temple), a symbolic and spiritual site offering magnificent panoramic views of the Kathmandu Valley. Learn basic Nepali phrases like \"Namaste\" to greet locals warmly.\n", + "- **Afternoon:**\n", + " - Visit the historic **Kathmandu Durbar Square** to admire the old royal palace and the surrounding temples, including the Kumari Ghar, home to the living goddess.\n", + " - Have lunch at a nearby restaurant and try dishes like dal bhat to get a flavor of traditional Nepali cuisine.\n", + "- **Evening:**\n", + " - Stroll through the vibrant streets of **Thamel**, a hub for tourists with many shops and eateries. Use simple gestures and smiles as you interact with local shopkeepers.\n", + " - Enjoy dinner at a restaurant with cultural performances, including traditional Nepali dance. Practice \"Dhanyabad\" to show appreciation.\n", + "\n", + "### Day 2: Discovering Heritage in Patan and Bhaktapur\n", + "- **Morning:**\n", + " - Travel to **Patan** to explore the beautiful **Patan Durbar Square** and the **Patan Museum**, marveling at its rich Newar architecture and extensive collection of artifacts.\n", + " - Optionally, visit the nearby **Golden Temple (Hiranya Varna Mahavihar)**.\n", + "- **Afternoon:**\n", + " - Head to the ancient city of **Bhaktapur**, around an hour's drive from Patan. Visit **Bhaktapur Durbar Square**, known for its well-preserved pagodas and temples.\n", + " - Relish the local specialty, **\"juju dhau\"** (king curd), an unmissable treat in Bhaktapur.\n", + " - Use polite phrases like \"Kripya\" (please) and \"Maaph garnus\" (excuse me) during interactions.\n", + "- **Evening:**\n", + " - Return to Kathmandu for dinner and unwind. Embrace the gentle head nod culture when communicating to show understanding and respect.\n", + "\n", + "### Day 3: Embracing Nature and Spirituality\n", + "- **Early Morning:**\n", + " - Venture to **Nagarkot** early to catch the breathtaking sunrise over the Himalayas. Savor a hearty breakfast amidst the stunning backdrop of peaks, including Mt. Everest, if the weather allows.\n", + "- **Late Morning:**\n", + " - Return to Kathmandu. If not visiting Nagarkot, consider the sacred **Pashupatinath Temple** or the magnificent **Boudhanath Stupa**.\n", + "- **Afternoon:**\n", + " - Relax in the **Garden of Dreams**, a restored historic garden offering serenity and beauty in Kathmandu.\n", + "- **Evening:**\n", + " - Enjoy a final dinner with favorites like momos (dumplings), savoring the flavors of Nepali cuisine one last time. Practice saying \"Mitho cha\" to compliment your meal.\n", + "- **Departure:**\n", + " - Head to Tribhuvan International Airport for your flight, leaving Nepal with cherished memories and perhaps new friendships along the way.\n", + "\n", + "### Tips:\n", + "- Respect local customs by dressing modestly, especially when visiting religious sites.\n", + "- Stay prepared for the weather by dressing accordingly for the season.\n", + "- Consider using offline translation apps if needed in areas with less English proficiency.\n", + "- Make adjustments based on your interests and flight schedule to personalize your adventure.\n", + "\n", + "Enjoy a journey filled with cultural insights, natural wonders, and meaningful connections in Nepal! Safe travels!\n", "\n", "TERMINATE\n", - "TeamRunResult(messages=[TextMessage(source='user', content='Plan a 3 day trip to Nepal.'), TextMessage(source='planner_agent', content=\"Day 1: Arrival and Sightseeing in Kathmandu\\n\\nStart your trip upon arrival at Tribhuvan International Airport in Kathmandu. After checking into a hotel, head off for sightseeing in Kathmandu, the cultural heart of Nepal.\\n\\nFirst, visit Kathmandu Durbar Square, a UNESCO World Heritage Site. This square is filled with ancient architecture, temples, and has an old Royal Palace site.\\n\\nNext, make your way to Swayambhunath Stupa (Monkey Temple), perched on a hilltop with panoramic views of Kathmandu city. \\n\\nIn the evening, visit Thamel, a bustling district known for its shops, food stalls, and nightlife. Enjoy local Nepali cuisine for dinner to experience the local flavors.\\n\\nDay 2: Explore Bhaktapur and Patan\\n\\nTake a scenic drive to Bhaktapur, the city of devotees. Start with Bhaktapur Durbar Square, another UNESCO World Heritage Site, and then explore the local pottery square where traditional ceramics are made.\\n\\nThen, head to Patan city, renowned for its vibrant arts and crafts tradition. Visit Patan Durbar Square, marvel at its architectural brilliance and learn about the unique mix of Buddhism and Hinduism in Nepal.\\n\\nDay 3: Visit Pokhara\\n\\nOn your final day, take a domestic flight or a scenic 6-hour drive to Pokhara from Kathmandu. Pokhara is known for its stunning landscapes, charming water body - the Phewa lake, and the Himalayan range including the Annapurna massif.\\n\\nSwing by the charming Lakeside market for some shopping, savor a relaxing boat ride in Phewa lake and visit the Tal Barahi Temple located in the center of the lake. Take the opportunity to visit Davis Falls, a unique waterfall that directly goes into a narrow and deep tunnel leading into a few kilometers long cave.\\n\\nPlease note that this is just a skeletal plan and actual trip might have variances based on your flight timings, weather, and local conditions.\\n\\nDon't forget to carry essentials like warm clothing (especially if you're visiting in winters), toiletries, good quality trekking shoes; and remember to check about any visa or entry requirements. ALWAYS respect local customs and traditions when visiting religious places.\\n\\nPlease talk to local travel operators for transport, guide, and tickets to various tourist and heritage spots. Enjoy your trip!\"), TextMessage(source='local_agent', content=\"Day 1: Arrival and Sightseeing in Kathmandu\\n\\nStart your trip upon arrival at Tribhuvan International Airport in Kathmandu. After checking into a hotel, head off for sightseeing in Kathmandu, the cultural heart of Nepal.\\n\\nFirst, visit Kathmandu Durbar Square, a UNESCO World Heritage Site. This square is filled with ancient architecture, temples, and has an old Royal Palace site.\\n\\nNext, make your way to Swayambhunath Stupa (Monkey Temple), perched on a hilltop with panoramic views of Kathmandu city. \\n\\nIn the evening, visit Thamel, a bustling district known for its shops, food stalls, and nightlife. Enjoy local Nepali cuisine for dinner to experience the local flavors.\\n\\nDay 2: Explore Bhaktapur and Patan\\n\\nTake a scenic drive to Bhaktapur, the city of devotees. Start with Bhaktapur Durbar Square, another UNESCO World Heritage Site, and then explore the local pottery square where traditional ceramics are made.\\n\\nThen, head to Patan city, renowned for its vibrant arts and crafts tradition. Visit Patan Durbar Square, marvel at its architectural brilliance and learn about the unique mix of Buddhism and Hinduism in Nepal.\\n\\nDay 3: Visit Pokhara\\n\\nOn your final day, take a domestic flight or a scenic 6-hour drive to Pokhara from Kathmandu. Pokhara is known for its stunning landscapes, charming water body - the Phewa lake, and the Himalayan range including the Annapurna massif.\\n\\nSwing by the charming Lakeside market for some shopping, savor a relaxing boat ride in Phewa lake and visit the Tal Barahi Temple located in the center of the lake. Take the opportunity to visit Davis Falls, a unique waterfall that directly goes into a narrow and deep tunnel leading into a few kilometers long cave.\\n\\nPlease note that this is just a skeletal plan and actual trip might have variances based on your flight timings, weather, and local conditions.\\n\\nDon't forget to carry essentials like warm clothing (especially if you're visiting in winters), toiletries, good quality trekking shoes; and remember to check about any visa or entry requirements. ALWAYS respect local customs and traditions when visiting religious places.\\n\\nPlease talk to local travel operators for transport, guide, and tickets to various tourist and heritage spots. Enjoy your trip!\"), TextMessage(source='language_agent', content='Looking at your plan, it seems very detailed and well-thought-out. However, you have not addressed the critical language or communication aspect of travelling in Nepal. Here are some points to add:\\n\\n1. The official language of Nepal is Nepali and is spoken by a majority of the population. English is also commonly understood and spoken in urban areas and tourist centres, but do not expect everyone to be fluent or comfortable communicating in English.\\n\\n2. Before your trip, it might be worth learning a few basic Nepali words or phrases. Things like \"hello\" or \"Namaste\" (greeting), \"dhanyabad\" (thank you), or \"kati ho?\" (how much?) can go a long way.\\n\\n3. Consider bringing a pocket-sized Nepali phrasebook or downloading a language app on your phone for translation assistance when needed.\\n\\n4. For guided tours or when hiring taxis, ensure to hire English-speaking guides or drivers, which can usually be arranged through your hotel or local tourism agencies.\\n\\nBy considering these language and communication tips, you can ensure that your trip is both enjoyable and easy to navigate.'), StopMessage(source='travel_summary_agent', content='Day 1: Arrival and Kathmandu Sightseeing\\n\\nAfter landing at Tribhuvan International Airport, Kathmandu, move to your hotel for a quick refresh. Commence your tour with a visit to Kathmandu Durbar Square, a UNESCO World Heritage Site. Explore the historic architectures and temples here, along with the ancient Royal Palace.\\n\\nProceed to Swayambhunath Stupa (Monkey Temple), situated on a hilltop with stunning views of the city. \\n\\nAfterwards, stroll through the bustling district of Thamel, known for shops and food stalls, and enjoy a dinner with local Nepali flavors.\\n\\nDay 2: Tour of Bhaktapur and Patan\\n\\nEmbark on a scenic drive to Bhaktapur, often called the city of devotees. Spend your morning at Bhaktapur Durbar Square, another UNESCO World Heritage Site, and take some time to explore the local pottery square.\\n\\nIn the afternoon, visit Patan City, known for its rich tradition of arts and crafts. Visit Patan Durbar Square, marvel at its architectural brilliance, and explore the confluence of Buddhism and Hinduism in Nepal.\\n\\nDay 3: Discover Pokhara\\n\\nOn your final day, take a domestic flight or a 6-hour drive to Pokhara, a city renowned for its beautiful landscapes and the Phewa Lake overlooked by the towering Annapurna massif.\\n\\nVisit the lakeside market for shopping, enjoy a calming boat ride on Phewa Lake, and visit the Tal Barahi Temple in the middle of the lake. Conclude your tour with a visit to Davis Falls, a unique waterfall that flows directly into a deep, narrow tunnel.\\n\\nPlease note:\\n\\n- This is just an indicative plan; actual trip might vary based on your flight timings, weather, and local conditions.\\n- Don\\'t forget to pack essentials such as warm clothing (especially for winters), toiletries, and sturdy trekking shoes. Prioritize checking visa or entry requirements, if any.\\n- Always respect local customs and traditions, specifically when visiting religious places.\\n- Consult with local travel operators for transportation, travel guides, and tickets to heritage spots.\\n\\nLanguage Tips:\\n\\n- The official language is Nepali. English is generally understood and spoken in urban areas and by people associated with tourism, but do not anticipate everyone to be fluent.\\n- Familiarize yourself with basic Nepali phrases like \"Namaste\" (Hello), \"Dhanyabad\" (Thank you), \"Kati Ho?\" (How much?), etc.\\n- Consider carrying a Nepali phrasebook or installing a language translation app.\\n- For guided tours or taxis, hire English-speaking guides or drivers. This can be arranged through your hotel or local tourism agencies. \\n\\nEnjoy your trip! \\n\\nTERMINATE')])\n" + "[Prompt tokens: 1780, Completion tokens: 791]\n", + "---------- Summary ----------\n", + "Number of messages: 5\n", + "Finish reason: Text 'TERMINATE' mentioned\n", + "Total prompt tokens: 3991\n", + "Total completion tokens: 2460\n", + "Duration: 28.00 seconds\n" ] + }, + { + "data": { + "text/plain": [ + "TaskResult(messages=[TextMessage(source='user', models_usage=None, content='Plan a 3 day trip to Nepal.', type='TextMessage'), TextMessage(source='planner_agent', models_usage=RequestUsage(prompt_tokens=40, completion_tokens=712), content='Nepal is a stunning destination with its rich cultural heritage, breathtaking landscapes, and friendly people. A 3-day trip to Nepal is short, so let\\'s focus on maximizing your experience with a mix of cultural, adventure, and scenic activities. Here’s a suggested itinerary:\\n\\n### Day 1: Arrival in Kathmandu\\n- **Morning:**\\n - Arrive at Tribhuvan International Airport in Kathmandu.\\n - Check into your hotel and freshen up.\\n- **Late Morning:**\\n - Visit **Swayambhunath Stupa** (also known as the Monkey Temple). This ancient religious site offers a panoramic view of the Kathmandu Valley.\\n- **Afternoon:**\\n - Head to **Kathmandu Durbar Square** to explore the old royal palace and various temples. Don’t miss the Kumari Ghar, which is home to the living goddess.\\n - Have lunch at a nearby local restaurant and try traditional Nepali cuisine.\\n- **Evening:**\\n - Explore the vibrant streets of **Thamel**, a popular tourist district with shops, restaurants, and markets.\\n - Dinner at a cozy restaurant featuring Nepali or continental dishes.\\n\\n### Day 2: Day Trip to Patan and Bhaktapur\\n- **Morning:**\\n - Drive to **Patan (Lalitpur)**, only a few kilometers from Kathmandu. Explore **Patan Durbar Square** with its incredible temples and ancient palaces.\\n- **Late Morning:**\\n - Visit the **Patan Museum** for its unique collection of artifacts.\\n - Optional: Visit the nearby **Golden Temple (Hiranya Varna Mahavihar)**.\\n- **Afternoon:**\\n - Head to **Bhaktapur**, about an hour\\'s drive from Patan. Visit **Bhaktapur Durbar Square**, known for its medieval art and architecture.\\n - Try some local **\"juju dhau\"** (king curd) – a must-taste in Bhaktapur.\\n- **Evening:**\\n - Return to Kathmandu for an evening of relaxation.\\n - Dinner at a restaurant with cultural performances, such as traditional Nepali dance.\\n\\n### Day 3: Nature Excursion and Departure\\n- **Early Morning:**\\n - If interested in a short trek, consider a half-day hike to **Nagarkot** for sunrise views over the Himalayas. This requires an early start (leave around 4 AM). You can also enjoy a hearty breakfast with a view.\\n- **Late Morning:**\\n - Return to Kathmandu. If trekking to Nagarkot isn’t feasible, visit the **Pashupatinath Temple**, a UNESCO World Heritage site, or the nearby **Boudhanath Stupa**.\\n- **Afternoon:**\\n - Visit the **Garden of Dreams** for some tranquility before departure. It’s a beautifully restored, serene garden.\\n- **Evening:**\\n - Depending on your flight schedule, enjoy some last-minute shopping or relishing Nepali momos (dumplings) before you head to the airport.\\n- **Departure:**\\n - Transfer to Tribhuvan International Airport for your onward journey.\\n\\n### Tips:\\n- Check the weather and prepare accordingly, especially if visiting during the monsoon or winter.\\n- Respect local customs and traditions, especially when visiting religious sites. Dress modestly and be mindful of photography rules.\\n- Consider adjusting this itinerary based on your arrival and departure times and personal interests.\\n\\nI hope you have an unforgettable experience in Nepal! Safe travels!', type='TextMessage'), TextMessage(source='local_agent', models_usage=RequestUsage(prompt_tokens=768, completion_tokens=604), content='Nepal offers a blend of natural beauty, rich culture, and historical wonders. For a condensed yet fulfilling 3-day trip, the following itinerary focuses on providing a diverse taste of what Nepal has to offer:\\n\\n### Day 1: Explore Kathmandu\\n- **Morning:**\\n - Arrive at Tribhuvan International Airport.\\n - Check into your hotel and rest or freshen up.\\n- **Late Morning:**\\n - Visit **Swayambhunath Stupa** (Monkey Temple) for panoramic views and insight into Nepalese spirituality.\\n- **Afternoon:**\\n - Explore **Kathmandu Durbar Square**, where you can admire historic palaces and temples.\\n - Have lunch nearby and try traditional Nepali dishes like dal bhat (lentils and rice).\\n- **Evening:**\\n - Stroll through **Thamel**, a lively district filled with shops and restaurants.\\n - Enjoy dinner at a cultural restaurant featuring a traditional Nepali dance show.\\n\\n### Day 2: Discover Patan and Bhaktapur\\n- **Morning:**\\n - Head to **Patan** to explore **Patan Durbar Square**, known for its stunning Newar architecture.\\n - Visit the **Patan Museum** to learn about Nepalese history and art.\\n - Optional: Visit the **Golden Temple (Hiranya Varna Mahavihar)**.\\n- **Afternoon:**\\n - Travel to **Bhaktapur**, a medieval town famous for its well-preserved architecture.\\n - Visit **Bhaktapur Durbar Square** and enjoy the artistic temples and palaces.\\n - Savor local specialties like **\"juju dhau\"** (king curd).\\n- **Evening:**\\n - Return to Kathmandu for dinner and relaxation.\\n\\n### Day 3: Nature and Spirituality\\n- **Early Morning:**\\n - Depart for **Nagarkot** to catch the sunrise over the Himalayas, offering breathtaking views of peaks including Mount Everest. If possible, enjoy breakfast with the scenic backdrop.\\n- **Late Morning:**\\n - Return to Kathmandu. Alternatively, visit the **Pashupatinath Temple**, one of Nepal\\'s holiest Hindu sites.\\n- **Afternoon:**\\n - See the majestic **Boudhanath Stupa**, one of the largest stupas in the world.\\n - Relax in the **Garden of Dreams**, a peaceful oasis in the city.\\n- **Evening:**\\n - Enjoy a final meal featuring local favorites such as momos (dumplings) before heading to the airport.\\n- **Departure:**\\n - Transfer to Tribhuvan International Airport for your departure.\\n\\n### Tips:\\n- Dress modestly and be respectful when visiting religious sites.\\n- Adjust the itinerary based on your interests and flight times.\\n- Consider the weather; pack appropriately for the season.\\n\\nThis itinerary offers a snapshot of Nepal\\'s diverse attractions, blending cultural immersion with natural beauty. Wishing you a memorable trip! Safe travels!', type='TextMessage'), TextMessage(source='language_agent', models_usage=RequestUsage(prompt_tokens=1403, completion_tokens=353), content='Your 3-day trip to Nepal is well-planned, giving you a taste of the country\\'s vibrant culture, rich history, and breathtaking landscapes. Here are some important language and communication tips that will enhance your experience:\\n\\n1. **Basic Nepali Phrases**: While English is widely spoken in tourist areas, learning a few basic Nepali phrases can be helpful and appreciated by locals. Here are some to consider:\\n - Namaste (नमस्ते) – Hello\\n - Dhanyabad (धन्यवाद) – Thank you\\n - Mitho cha (मिठो छ) – It\\'s delicious\\n - Kripya (कृपया) – Please\\n - Maaph garnus (माफ गर्नुहोस्) – Sorry/Excuse me\\n\\n2. **Gesture Understanding**: In Nepal, the slight tilting head nod means \"yes,\" and shaking your head left to right can mean \"no.\" This might be different from some Western countries where nodding generally signifies agreement.\\n\\n3. **Respect and Etiquette**: When visiting religious sites, remove shoes and hats before entering. It\\'s respectful to use your right hand when giving or receiving something, as the left hand is considered impure in Nepali culture.\\n\\n4. **Offline Translation Apps**: Consider downloading an offline translation app or phrasebook in case you find yourself in areas where English might not be as common.\\n\\n5. **Non-Verbal Communication**: A smile goes a long way in Nepal. If you encounter a language barrier, hand gestures and a friendly demeanor can be very effective.\\n\\nWith these tips in mind, your itinerary seems well-rounded, giving you a rich experience in Nepal. Enjoy your trip and the diverse experiences Nepal has to offer!', type='TextMessage'), TextMessage(source='travel_summary_agent', models_usage=RequestUsage(prompt_tokens=1780, completion_tokens=791), content='Here\\'s your comprehensive and integrated 3-day travel plan for an unforgettable trip to Nepal. This itinerary focuses on delivering a taste of Nepal\\'s culture, history, nature, and hospitality, while incorporating practical language and cultural tips to enhance your experience.\\n\\n### Day 1: Arrival and Cultural Exploration in Kathmandu\\n- **Morning:**\\n - Arrive at Tribhuvan International Airport in Kathmandu. Begin your adventure by checking into your hotel to rest and freshen up.\\n- **Late Morning:**\\n - Explore **Swayambhunath Stupa** (Monkey Temple), a symbolic and spiritual site offering magnificent panoramic views of the Kathmandu Valley. Learn basic Nepali phrases like \"Namaste\" to greet locals warmly.\\n- **Afternoon:**\\n - Visit the historic **Kathmandu Durbar Square** to admire the old royal palace and the surrounding temples, including the Kumari Ghar, home to the living goddess.\\n - Have lunch at a nearby restaurant and try dishes like dal bhat to get a flavor of traditional Nepali cuisine.\\n- **Evening:**\\n - Stroll through the vibrant streets of **Thamel**, a hub for tourists with many shops and eateries. Use simple gestures and smiles as you interact with local shopkeepers.\\n - Enjoy dinner at a restaurant with cultural performances, including traditional Nepali dance. Practice \"Dhanyabad\" to show appreciation.\\n\\n### Day 2: Discovering Heritage in Patan and Bhaktapur\\n- **Morning:**\\n - Travel to **Patan** to explore the beautiful **Patan Durbar Square** and the **Patan Museum**, marveling at its rich Newar architecture and extensive collection of artifacts.\\n - Optionally, visit the nearby **Golden Temple (Hiranya Varna Mahavihar)**.\\n- **Afternoon:**\\n - Head to the ancient city of **Bhaktapur**, around an hour\\'s drive from Patan. Visit **Bhaktapur Durbar Square**, known for its well-preserved pagodas and temples.\\n - Relish the local specialty, **\"juju dhau\"** (king curd), an unmissable treat in Bhaktapur.\\n - Use polite phrases like \"Kripya\" (please) and \"Maaph garnus\" (excuse me) during interactions.\\n- **Evening:**\\n - Return to Kathmandu for dinner and unwind. Embrace the gentle head nod culture when communicating to show understanding and respect.\\n\\n### Day 3: Embracing Nature and Spirituality\\n- **Early Morning:**\\n - Venture to **Nagarkot** early to catch the breathtaking sunrise over the Himalayas. Savor a hearty breakfast amidst the stunning backdrop of peaks, including Mt. Everest, if the weather allows.\\n- **Late Morning:**\\n - Return to Kathmandu. If not visiting Nagarkot, consider the sacred **Pashupatinath Temple** or the magnificent **Boudhanath Stupa**.\\n- **Afternoon:**\\n - Relax in the **Garden of Dreams**, a restored historic garden offering serenity and beauty in Kathmandu.\\n- **Evening:**\\n - Enjoy a final dinner with favorites like momos (dumplings), savoring the flavors of Nepali cuisine one last time. Practice saying \"Mitho cha\" to compliment your meal.\\n- **Departure:**\\n - Head to Tribhuvan International Airport for your flight, leaving Nepal with cherished memories and perhaps new friendships along the way.\\n\\n### Tips:\\n- Respect local customs by dressing modestly, especially when visiting religious sites.\\n- Stay prepared for the weather by dressing accordingly for the season.\\n- Consider using offline translation apps if needed in areas with less English proficiency.\\n- Make adjustments based on your interests and flight schedule to personalize your adventure.\\n\\nEnjoy a journey filled with cultural insights, natural wonders, and meaningful connections in Nepal! Safe travels!\\n\\nTERMINATE', type='TextMessage')], stop_reason=\"Text 'TERMINATE' mentioned\")" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -198,8 +267,7 @@ "group_chat = RoundRobinGroupChat(\n", " [planner_agent, local_agent, language_agent, travel_summary_agent], termination_condition=termination\n", ")\n", - "result = await group_chat.run(task=\"Plan a 3 day trip to Nepal.\")\n", - "print(result)" + "await Console(group_chat.run_stream(task=\"Plan a 3 day trip to Nepal.\"))" ] } ], @@ -219,7 +287,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.6" + "version": "3.11.5" } }, "nbformat": 4, diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/installation.md b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/installation.md index e5fd643b5696..d5c36eb94ed9 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/installation.md +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/installation.md @@ -61,7 +61,7 @@ Install the `autogen-agentchat` package using pip: ```bash -pip install 'autogen-agentchat==0.4.0.dev9' +pip install 'autogen-agentchat==0.4.0.dev11' ``` ```{note} @@ -74,7 +74,7 @@ To use the OpenAI and Azure OpenAI models, you need to install the following extensions: ```bash -pip install 'autogen-ext[openai]==0.4.0.dev9' +pip install 'autogen-ext[openai]==0.4.0.dev11' ``` ## Install Docker for Code Execution diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/quickstart.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/quickstart.ipynb index 907dfed8f53e..e9145a13ee3f 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/quickstart.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/quickstart.ipynb @@ -29,7 +29,7 @@ }, "outputs": [], "source": [ - "pip install 'autogen-agentchat==0.4.0.dev9' 'autogen-ext[openai]==0.4.0.dev9'" + "pip install 'autogen-agentchat==0.4.0.dev11' 'autogen-ext[openai]==0.4.0.dev11'" ] }, { @@ -76,7 +76,7 @@ "from autogen_agentchat.conditions import TextMentionTermination\n", "from autogen_agentchat.teams import RoundRobinGroupChat\n", "from autogen_agentchat.ui import Console\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "\n", "# Define a tool\n", diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/agents.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/agents.ipynb index 9fcf6933f547..90f3f169ca61 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/agents.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/agents.ipynb @@ -21,7 +21,7 @@ "## Assistant Agent\n", "\n", "{py:class}`~autogen_agentchat.agents.AssistantAgent` is a built-in agent that\n", - "uses a language model with ability to use tools." + "uses a language model and has the ability to use tools." ] }, { @@ -33,7 +33,7 @@ "from autogen_agentchat.agents import AssistantAgent\n", "from autogen_agentchat.messages import TextMessage\n", "from autogen_core import CancellationToken\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "\n", "# Define a tool that searches the web for information.\n", @@ -59,8 +59,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can call the {py:meth}`~autogen_agentchat.agents.AssistantAgent.on_messages` \n", - "method to get the agent to respond to a message." + "\n", + "## Getting Responses\n", + "\n", + "We can use the {py:meth}`~autogen_agentchat.agents.AssistantAgent.on_messages` method to get the agent response to a given message.\n" ] }, { @@ -134,7 +136,7 @@ "source": [ "The User Proxy agent is ideally used for on-demand human-in-the-loop interactions for scenarios such as Just In Time approvals, human feedback, alerts, etc. For slower user interactions, consider terminating the session using a termination condition and start another one from run or run_stream with another message.\n", "\n", - "### Stream Messages\n", + "## Streaming Messages\n", "\n", "We can also stream each message as it is generated by the agent by using the\n", "{py:meth}`~autogen_agentchat.agents.AssistantAgent.on_messages_stream` method,\n", @@ -172,7 +174,7 @@ "\n", "\n", "async def assistant_run_stream() -> None:\n", - " # Option 1: read each message from the stream.\n", + " # Option 1: read each message from the stream (as shown in the previous example).\n", " # async for message in agent.on_messages_stream(\n", " # [TextMessage(content=\"Find information on AutoGen\", source=\"user\")],\n", " # cancellation_token=CancellationToken(),\n", @@ -198,12 +200,12 @@ "source": [ "The {py:meth}`~autogen_agentchat.agents.AssistantAgent.on_messages_stream` method\n", "returns an asynchronous generator that yields each inner message generated by the agent,\n", - "and the last item is the final response message in the {py:attr}`~autogen_agentchat.base.Response.chat_message` attribute.\n", + "with the final item being the response message in the {py:attr}`~autogen_agentchat.base.Response.chat_message` attribute.\n", "\n", - "From the messages, you can see the assistant agent used the `web_search` tool to\n", - "search for information and responded using the search results.\n", + "From the messages, you can observe that the assistant agent utilized the `web_search` tool to\n", + "gather information and responded based on the search results.\n", "\n", - "### Understanding Tool Calling\n", + "## Understanding Tool Calling\n", "\n", "Large Language Models (LLMs) are typically limited to generating text or code responses. However, many complex tasks benefit from the ability to use external tools that perform specific actions, such as fetching data from APIs or databases.\n", "\n", @@ -233,8 +235,7 @@ "source": [ "## Next Step\n", "\n", - "Now we have discussed how to use the {py:class}`~autogen_agentchat.agents.AssistantAgent`,\n", - "we can move on to the next section to learn how to use the teams feature of AgentChat." + "Having explored the usage of the {py:class}`~autogen_agentchat.agents.AssistantAgent`, we can now proceed to the next section to learn about the teams feature in AgentChat.\n" ] }, { diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/custom-agents.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/custom-agents.ipynb index 35e145c14f69..67705a2cf58e 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/custom-agents.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/custom-agents.ipynb @@ -26,7 +26,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## CounterDownAgent\n", + "## CountDownAgent\n", "\n", "In this example, we create a simple agent that counts down from a given number to zero,\n", "and produces a stream of messages with the current count." @@ -34,9 +34,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3...\n", + "2...\n", + "1...\n", + "Done!\n" + ] + } + ], "source": [ "from typing import AsyncGenerator, List, Sequence\n", "\n", @@ -100,12 +111,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## UserProxyAgent \n", + "## ArithmeticAgent\n", "\n", - "A common use case for building a custom agent is to create an agent that acts as a proxy for the user.\n", + "In this example, we create an agent class that can perform simple arithmetic operations\n", + "on a given integer. Then, we will use different instances of this agent class\n", + "in a {py:class}`~autogen_agentchat.teams.SelectorGroupChat`\n", + "to transform a given integer into another integer by applying a sequence of arithmetic operations.\n", "\n", - "In the example below we show how to implement a `UserProxyAgent` - an agent that asks the user to enter\n", - "some text through console and then returns that message as a response." + "The `ArithmeticAgent` class takes an `operator_func` that takes an integer and returns an integer,\n", + "after applying an arithmetic operation to the integer.\n", + "In its `on_messages` method, it applies the `operator_func` to the integer in the input message,\n", + "and returns a response with the result." ] }, { @@ -114,39 +130,162 @@ "metadata": {}, "outputs": [], "source": [ - "import asyncio\n", - "from typing import List, Sequence\n", + "from typing import Callable, List, Sequence\n", "\n", "from autogen_agentchat.agents import BaseChatAgent\n", "from autogen_agentchat.base import Response\n", + "from autogen_agentchat.conditions import MaxMessageTermination\n", "from autogen_agentchat.messages import ChatMessage\n", + "from autogen_agentchat.teams import SelectorGroupChat\n", + "from autogen_agentchat.ui import Console\n", "from autogen_core import CancellationToken\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "\n", - "class UserProxyAgent(BaseChatAgent):\n", - " def __init__(self, name: str) -> None:\n", - " super().__init__(name, \"A human user.\")\n", + "class ArithmeticAgent(BaseChatAgent):\n", + " def __init__(self, name: str, description: str, operator_func: Callable[[int], int]) -> None:\n", + " super().__init__(name, description=description)\n", + " self._operator_func = operator_func\n", + " self._message_history: List[ChatMessage] = []\n", "\n", " @property\n", " def produced_message_types(self) -> List[type[ChatMessage]]:\n", " return [TextMessage]\n", "\n", " async def on_messages(self, messages: Sequence[ChatMessage], cancellation_token: CancellationToken) -> Response:\n", - " user_input = await asyncio.get_event_loop().run_in_executor(None, input, \"Enter your response: \")\n", - " return Response(chat_message=TextMessage(content=user_input, source=self.name))\n", + " # Update the message history.\n", + " # NOTE: it is possible the messages is an empty list, which means the agent was selected previously.\n", + " self._message_history.extend(messages)\n", + " # Parse the number in the last message.\n", + " assert isinstance(self._message_history[-1], TextMessage)\n", + " number = int(self._message_history[-1].content)\n", + " # Apply the operator function to the number.\n", + " result = self._operator_func(number)\n", + " # Create a new message with the result.\n", + " response_message = TextMessage(content=str(result), source=self.name)\n", + " # Update the message history.\n", + " self._message_history.append(response_message)\n", + " # Return the response.\n", + " return Response(chat_message=response_message)\n", "\n", " async def on_reset(self, cancellation_token: CancellationToken) -> None:\n", - " pass\n", + " pass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{note}\n", + "The `on_messages` method may be called with an empty list of messages, in which\n", + "case it means the agent was called previously and is now being called again,\n", + "without any new messages from the caller. So it is important to keep a history\n", + "of the previous messages received by the agent, and use that history to generate\n", + "the response.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can create a {py:class}`~autogen_agentchat.teams.SelectorGroupChat` with 5 instances of `ArithmeticAgent`:\n", "\n", + "- one that adds 1 to the input integer,\n", + "- one that subtracts 1 from the input integer,\n", + "- one that multiplies the input integer by 2,\n", + "- one that divides the input integer by 2 and rounds down to the nearest integer, and\n", + "- one that returns the input integer unchanged.\n", "\n", - "async def run_user_proxy_agent() -> None:\n", - " user_proxy_agent = UserProxyAgent(name=\"user_proxy_agent\")\n", - " response = await user_proxy_agent.on_messages([], CancellationToken())\n", - " print(response.chat_message.content)\n", + "We then create a {py:class}`~autogen_agentchat.teams.SelectorGroupChat` with these agents,\n", + "and set the appropriate selector settings:\n", "\n", + "- allow the same agent to be selected consecutively to allow for repeated operations, and\n", + "- customize the selector prompt to tailor the model's response to the specific task." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- user ----------\n", + "Apply the operations to turn the given number into 25.\n", + "---------- user ----------\n", + "10\n", + "---------- multiply_agent ----------\n", + "20\n", + "---------- add_agent ----------\n", + "21\n", + "---------- multiply_agent ----------\n", + "42\n", + "---------- divide_agent ----------\n", + "21\n", + "---------- add_agent ----------\n", + "22\n", + "---------- add_agent ----------\n", + "23\n", + "---------- add_agent ----------\n", + "24\n", + "---------- add_agent ----------\n", + "25\n", + "---------- Summary ----------\n", + "Number of messages: 10\n", + "Finish reason: Maximum number of messages 10 reached, current message count: 10\n", + "Total prompt tokens: 0\n", + "Total completion tokens: 0\n", + "Duration: 2.40 seconds\n" + ] + } + ], + "source": [ + "async def run_number_agents() -> None:\n", + " # Create agents for number operations.\n", + " add_agent = ArithmeticAgent(\"add_agent\", \"Adds 1 to the number.\", lambda x: x + 1)\n", + " multiply_agent = ArithmeticAgent(\"multiply_agent\", \"Multiplies the number by 2.\", lambda x: x * 2)\n", + " subtract_agent = ArithmeticAgent(\"subtract_agent\", \"Subtracts 1 from the number.\", lambda x: x - 1)\n", + " divide_agent = ArithmeticAgent(\"divide_agent\", \"Divides the number by 2 and rounds down.\", lambda x: x // 2)\n", + " identity_agent = ArithmeticAgent(\"identity_agent\", \"Returns the number as is.\", lambda x: x)\n", + "\n", + " # The termination condition is to stop after 10 messages.\n", + " termination_condition = MaxMessageTermination(10)\n", + "\n", + " # Create a selector group chat.\n", + " selector_group_chat = SelectorGroupChat(\n", + " [add_agent, multiply_agent, subtract_agent, divide_agent, identity_agent],\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o\"),\n", + " termination_condition=termination_condition,\n", + " allow_repeated_speaker=True, # Allow the same agent to speak multiple times, necessary for this task.\n", + " selector_prompt=(\n", + " \"Available roles:\\n{roles}\\nTheir job descriptions:\\n{participants}\\n\"\n", + " \"Current conversation history:\\n{history}\\n\"\n", + " \"Please select the most appropriate role for the next message, and only return the role name.\"\n", + " ),\n", + " )\n", + "\n", + " # Run the selector group chat with a given task and stream the response.\n", + " task: List[ChatMessage] = [\n", + " TextMessage(content=\"Apply the operations to turn the given number into 25.\", source=\"user\"),\n", + " TextMessage(content=\"10\", source=\"user\"),\n", + " ]\n", + " stream = selector_group_chat.run_stream(task=task)\n", + " await Console(stream)\n", "\n", - "# Use asyncio.run(run_user_proxy_agent()) when running in a script.\n", - "await run_user_proxy_agent()" + "\n", + "# Use asyncio.run(run_number_agents()) when running in a script.\n", + "await run_number_agents()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the output, we can see that the agents have successfully transformed the input integer\n", + "from 10 to 25 by choosing appropriate agents that apply the arithmetic operations in sequence." ] } ], @@ -157,8 +296,16 @@ "name": "python3" }, "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", "name": "python", - "version": "3.11.5" + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" } }, "nbformat": 4, diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/messages.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/messages.ipynb index e2d49d65f410..a7f383212785 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/messages.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/messages.ipynb @@ -97,7 +97,7 @@ "\n", "Examples of these include {py:class}`~autogen_agentchat.messages.ToolCallMessage`, which indicates that a request was made to call a tool, and {py:class}`~autogen_agentchat.messages.ToolCallResultMessage`, which contains the results of tool calls.\n", "\n", - "Typically, these messages are created by the agent itself and are contained in the {py:attr}`~autogen_agentchat.base.Response.inner_messages` field of the {py:class}`~autogen_agentchat.base.Response` returned from {py:class}`~autogen_agentchat.base.ChatAgent.on_messages`. If you are building a custom agent and have events that you want to communicate to other entities (e.g., a UI), you can inlcude these in the {py:attr}`~autogen_agentchat.base.Response.inner_messages` field of the {py:class}`~autogen_agentchat.base.Response`. We will show examples of this in [Custom Agents](./custom-agents.ipynb).\n", + "Typically, these messages are created by the agent itself and are contained in the {py:attr}`~autogen_agentchat.base.Response.inner_messages` field of the {py:class}`~autogen_agentchat.base.Response` returned from {py:class}`~autogen_agentchat.base.ChatAgent.on_messages`. If you are building a custom agent and have events that you want to communicate to other entities (e.g., a UI), you can include these in the {py:attr}`~autogen_agentchat.base.Response.inner_messages` field of the {py:class}`~autogen_agentchat.base.Response`. We will show examples of this in [Custom Agents](./custom-agents.ipynb).\n", "\n", "\n", "You can read about the full set of messages supported in AgentChat in the {py:mod}`~autogen_agentchat.messages` module. \n", diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/models.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/models.ipynb index 5ede557f2e63..3020cbe9f836 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/models.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/models.ipynb @@ -15,7 +15,7 @@ "source": [ "## OpenAI\n", "\n", - "To access OpenAI models, install the `openai` extension, which allows you to use the {py:class}`~autogen_ext.models.OpenAIChatCompletionClient`." + "To access OpenAI models, install the `openai` extension, which allows you to use the {py:class}`~autogen_ext.models.openai.OpenAIChatCompletionClient`." ] }, { @@ -28,7 +28,7 @@ }, "outputs": [], "source": [ - "pip install 'autogen-ext[openai]==0.4.0.dev9'" + "pip install 'autogen-ext[openai]==0.4.0.dev11'" ] }, { @@ -44,7 +44,7 @@ "metadata": {}, "outputs": [], "source": [ - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "opneai_model_client = OpenAIChatCompletionClient(\n", " model=\"gpt-4o-2024-08-06\",\n", @@ -73,7 +73,7 @@ } ], "source": [ - "from autogen_core.components.models import UserMessage\n", + "from autogen_core.models import UserMessage\n", "\n", "result = await opneai_model_client.create([UserMessage(content=\"What is the capital of France?\", source=\"user\")])\n", "print(result)" @@ -85,7 +85,7 @@ "source": [ "```{note}\n", "You can use this client with models hosted on OpenAI-compatible endpoints, however, we have not tested this functionality.\n", - "See {py:class}`~autogen_ext.models.OpenAIChatCompletionClient` for more information.\n", + "See {py:class}`~autogen_ext.models.openai.OpenAIChatCompletionClient` for more information.\n", "```" ] }, @@ -95,7 +95,7 @@ "source": [ "## Azure OpenAI\n", "\n", - "Similarly, install the `azure` and `openai` extensions to use the {py:class}`~autogen_ext.models.AzureOpenAIChatCompletionClient`." + "Similarly, install the `azure` and `openai` extensions to use the {py:class}`~autogen_ext.models.openai.AzureOpenAIChatCompletionClient`." ] }, { @@ -108,7 +108,7 @@ }, "outputs": [], "source": [ - "pip install 'autogen-ext[openai,azure]==0.4.0.dev9'" + "pip install 'autogen-ext[openai,azure]==0.4.0.dev11'" ] }, { @@ -128,7 +128,7 @@ "metadata": {}, "outputs": [], "source": [ - "from autogen_ext.models import AzureOpenAIChatCompletionClient\n", + "from autogen_ext.models.openai import AzureOpenAIChatCompletionClient\n", "from azure.identity import DefaultAzureCredential, get_bearer_token_provider\n", "\n", "# Create the token provider\n", @@ -179,7 +179,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.12.7" } }, "nbformat": 4, diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/selector-group-chat.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/selector-group-chat.ipynb index 98b52b1ee69e..74110d180040 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/selector-group-chat.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/selector-group-chat.ipynb @@ -11,25 +11,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "{py:class}`~autogen_agentchat.teams.SelectorGroupChat` implements a team where participants take turns broadcasting messages to all other participants,\n", - "with the next speaker selected by a generative model (e.g., an LLM) based on the shared context. \n", - "This enables dynamic and context-aware multi-agent collaboration.\n", + "{py:class}`~autogen_agentchat.teams.SelectorGroupChat` implements a team where participants take turns broadcasting messages to all other members. A generative model (e.g., an LLM) selects the next speaker based on the shared context, enabling dynamic, context-aware collaboration.\n", + "\n", + "Key features include:\n", "\n", - "{py:class}`~autogen_agentchat.teams.SelectorGroupChat` provides several key features:\n", "- Model-based speaker selection\n", "- Configurable participant roles and descriptions\n", - "- Optional prevention of consecutive turns by the same speaker\n", + "- Prevention of consecutive turns by the same speaker (optional)\n", "- Customizable selection prompting\n", "- Customizable selection function to override the default model-based selection\n", "\n", "```{note}\n", - "{py:class}`~autogen_agentchat.teams.SelectorGroupChat` is a high-level API.\n", - "If you need more control and customization that is not supported by this API,\n", - "you can take a look at the [Group Chat Pattern](../../core-user-guide/design-patterns/group-chat.ipynb)\n", - "in the Core API documentation and implement your own group chat logic.\n", + "{py:class}`~autogen_agentchat.teams.SelectorGroupChat` is a high-level API. For more control and customization, refer to the [Group Chat Pattern](../../core-user-guide/design-patterns/group-chat.ipynb) in the Core API documentation to implement your own group chat logic.\n", "```\n", "\n", - "## How does it work?\n", + "## How Does it Work?\n", "\n", "{py:class}`~autogen_agentchat.teams.SelectorGroupChat` is a group chat similar to {py:class}`~autogen_agentchat.teams.RoundRobinGroupChat`,\n", "but with a model-based next speaker selection mechanism.\n", @@ -51,12 +47,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Web Search and Analysis Example" + "## Example: Web Search/Analysis" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -67,7 +63,7 @@ "from autogen_agentchat.messages import AgentMessage\n", "from autogen_agentchat.teams import SelectorGroupChat\n", "from autogen_agentchat.ui import Console\n", - "from autogen_ext.models import OpenAIChatCompletionClient" + "from autogen_ext.models.openai import OpenAIChatCompletionClient" ] }, { @@ -94,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -129,7 +125,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -215,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -239,7 +235,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -249,62 +245,77 @@ "---------- user ----------\n", "Who was the Miami Heat player with the highest points in the 2006-2007 season, and what was the percentage change in his total rebounds between the 2007-2008 and 2008-2009 seasons?\n", "---------- PlanningAgent ----------\n", - "To answer your question, we need to separate this task into several subtasks:\n", - "\n", - "1. Web search agent: Find out who was the Miami Heat player with the highest points in the 2006-2007 NBA season.\n", - "2. Web search agent: Find the total rebounds for that player in the 2007-2008 NBA season.\n", - "3. Web search agent: Find the total rebounds for that player in the 2008-2009 NBA season.\n", - "4. Data analyst: Calculate the percentage change in the player's total rebounds between the 2007-2008 and 2008-2009 seasons.\n", + "To address this request, we will divide the task into manageable subtasks. \n", "\n", - "Let's start with these tasks.\n", - "[Prompt tokens: 159, Completion tokens: 130]\n", + "1. Web search agent: Identify the Miami Heat player with the highest points in the 2006-2007 season.\n", + "2. Web search agent: Gather the total rebounds for the identified player during the 2007-2008 season.\n", + "3. Web search agent: Gather the total rebounds for the identified player during the 2008-2009 season.\n", + "4. Data analyst: Calculate the percentage change in total rebounds for the identified player between the 2007-2008 and 2008-2009 seasons.\n", + "[Prompt tokens: 159, Completion tokens: 122]\n", "---------- WebSearchAgent ----------\n", - "[FunctionCall(id='call_js7ogBp0UDmHfvLo6BmWFpM1', arguments='{\"query\":\"Miami Heat player highest points 2006-2007 season\"}', name='search_web_tool')]\n", - "[Prompt tokens: 279, Completion tokens: 26]\n", + "[FunctionCall(id='call_xdYlGP2lsqDeWdSiOlwOBNiO', arguments='{\"query\":\"Miami Heat highest points player 2006-2007 season\"}', name='search_web_tool')]\n", + "[Prompt tokens: 271, Completion tokens: 26]\n", "---------- WebSearchAgent ----------\n", - "[FunctionExecutionResult(content='Here are the total points scored by Miami Heat players in the 2006-2007 season:\\n Udonis Haslem: 844 points\\n Dwayne Wade: 1397 points\\n James Posey: 550 points\\n ...\\n ', call_id='call_js7ogBp0UDmHfvLo6BmWFpM1')]\n", + "[FunctionExecutionResult(content='Here are the total points scored by Miami Heat players in the 2006-2007 season:\\n Udonis Haslem: 844 points\\n Dwayne Wade: 1397 points\\n James Posey: 550 points\\n ...\\n ', call_id='call_xdYlGP2lsqDeWdSiOlwOBNiO')]\n", "---------- WebSearchAgent ----------\n", - "[FunctionCall(id='call_G7ATvIq0rSjc8fqLdKQ5uWI4', arguments='{\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}', name='search_web_tool'), FunctionCall(id='call_Xzw9bAvgfo40EjILophG5pnl', arguments='{\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}', name='search_web_tool')]\n", - "[Prompt tokens: 371, Completion tokens: 70]\n", + "Tool calls:\n", + "search_web_tool({\"query\":\"Miami Heat highest points player 2006-2007 season\"}) = Here are the total points scored by Miami Heat players in the 2006-2007 season:\n", + " Udonis Haslem: 844 points\n", + " Dwayne Wade: 1397 points\n", + " James Posey: 550 points\n", + " ...\n", + " \n", + "---------- DataAnalystAgent ----------\n", + "[FunctionCall(id='call_asjxKtAVGfqrYl0jMpvwCrvV', arguments='{\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}', name='WebSearchAgent'), FunctionCall(id='call_8L91Kizt0KU6RNwUgvNx7S0s', arguments='{\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}', name='WebSearchAgent')]\n", + "[Prompt tokens: 345, Completion tokens: 68]\n", + "---------- DataAnalystAgent ----------\n", + "[FunctionExecutionResult(content=\"Error: The tool 'WebSearchAgent' is not available.\", call_id='call_asjxKtAVGfqrYl0jMpvwCrvV'), FunctionExecutionResult(content=\"Error: The tool 'WebSearchAgent' is not available.\", call_id='call_8L91Kizt0KU6RNwUgvNx7S0s')]\n", + "---------- DataAnalystAgent ----------\n", + "Tool calls:\n", + "WebSearchAgent({\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}) = Error: The tool 'WebSearchAgent' is not available.\n", + "WebSearchAgent({\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}) = Error: The tool 'WebSearchAgent' is not available.\n", "---------- WebSearchAgent ----------\n", - "[FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2007-2008 is 214.', call_id='call_G7ATvIq0rSjc8fqLdKQ5uWI4'), FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2008-2009 is 398.', call_id='call_Xzw9bAvgfo40EjILophG5pnl')]\n", + "[FunctionCall(id='call_imvRJ2jhpPdovBbx8MFjlFVS', arguments='{\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}', name='search_web_tool'), FunctionCall(id='call_U30KVmFG1aeXPbqGJjDmJ6iJ', arguments='{\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}', name='search_web_tool')]\n", + "[Prompt tokens: 445, Completion tokens: 70]\n", "---------- WebSearchAgent ----------\n", - "The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade, with 1,397 points.\n", - "\n", - "Between the 2007-2008 and 2008-2009 seasons, Dwyane Wade's total rebounds increased from 214 to 398. To calculate the percentage change:\n", - "\n", - "Percentage Change = \\(\\frac{(398 - 214)}{214} \\times 100\\)\n", - "\n", - "Now, a data analyst would calculate the actual percentage change based on these numbers.\n", - "[Prompt tokens: 506, Completion tokens: 107]\n", + "[FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2007-2008 is 214.', call_id='call_imvRJ2jhpPdovBbx8MFjlFVS'), FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2008-2009 is 398.', call_id='call_U30KVmFG1aeXPbqGJjDmJ6iJ')]\n", + "---------- WebSearchAgent ----------\n", + "Tool calls:\n", + "search_web_tool({\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}) = The number of total rebounds for Dwayne Wade in the Miami Heat season 2007-2008 is 214.\n", + "search_web_tool({\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}) = The number of total rebounds for Dwayne Wade in the Miami Heat season 2008-2009 is 398.\n", "---------- DataAnalystAgent ----------\n", - "[FunctionCall(id='call_76VkQ2nnKrwtuI1dmjLQ7G5P', arguments='{\"start\":214,\"end\":398}', name='percentage_change_tool')]\n", - "[Prompt tokens: 383, Completion tokens: 20]\n", + "[FunctionCall(id='call_CtAnvcbitN0JiwBfiLVzb5Do', arguments='{\"start\":214,\"end\":398}', name='percentage_change_tool')]\n", + "[Prompt tokens: 562, Completion tokens: 20]\n", "---------- DataAnalystAgent ----------\n", - "[FunctionExecutionResult(content='85.98130841121495', call_id='call_76VkQ2nnKrwtuI1dmjLQ7G5P')]\n", + "[FunctionExecutionResult(content='85.98130841121495', call_id='call_CtAnvcbitN0JiwBfiLVzb5Do')]\n", "---------- DataAnalystAgent ----------\n", - "The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade. His total rebounds increased by approximately 85.98% between the 2007-2008 and 2008-2009 seasons.\n", - "[Prompt tokens: 424, Completion tokens: 52]\n", + "Tool calls:\n", + "percentage_change_tool({\"start\":214,\"end\":398}) = 85.98130841121495\n", "---------- PlanningAgent ----------\n", - "The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade, scoring 1,397 points. Between the 2007-2008 and 2008-2009 seasons, Dwyane Wade's total rebounds increased by approximately 85.98%. \n", + "Summary of Findings:\n", + "\n", + "1. Dwyane Wade was the Miami Heat player with the highest points in the 2006-2007 season, scoring a total of 1,397 points.\n", + "2. Dwyane Wade's total rebounds during the 2007-2008 season were 214.\n", + "3. Dwyane Wade's total rebounds during the 2008-2009 season were 398.\n", + "4. The percentage change in Dwyane Wade's total rebounds between the 2007-2008 and 2008-2009 seasons was approximately 85.98%.\n", "\n", "TERMINATE\n", - "[Prompt tokens: 470, Completion tokens: 66]\n", + "[Prompt tokens: 590, Completion tokens: 122]\n", "---------- Summary ----------\n", - "Number of messages: 11\n", + "Number of messages: 15\n", "Finish reason: Text 'TERMINATE' mentioned\n", - "Total prompt tokens: 2592\n", - "Total completion tokens: 471\n", - "Duration: 11.95 seconds\n" + "Total prompt tokens: 2372\n", + "Total completion tokens: 428\n", + "Duration: 9.21 seconds\n" ] }, { "data": { "text/plain": [ - "TaskResult(messages=[TextMessage(source='user', models_usage=None, content='Who was the Miami Heat player with the highest points in the 2006-2007 season, and what was the percentage change in his total rebounds between the 2007-2008 and 2008-2009 seasons?'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=159, completion_tokens=130), content=\"To answer your question, we need to separate this task into several subtasks:\\n\\n1. Web search agent: Find out who was the Miami Heat player with the highest points in the 2006-2007 NBA season.\\n2. Web search agent: Find the total rebounds for that player in the 2007-2008 NBA season.\\n3. Web search agent: Find the total rebounds for that player in the 2008-2009 NBA season.\\n4. Data analyst: Calculate the percentage change in the player's total rebounds between the 2007-2008 and 2008-2009 seasons.\\n\\nLet's start with these tasks.\"), ToolCallMessage(source='WebSearchAgent', models_usage=RequestUsage(prompt_tokens=279, completion_tokens=26), content=[FunctionCall(id='call_js7ogBp0UDmHfvLo6BmWFpM1', arguments='{\"query\":\"Miami Heat player highest points 2006-2007 season\"}', name='search_web_tool')]), ToolCallResultMessage(source='WebSearchAgent', models_usage=None, content=[FunctionExecutionResult(content='Here are the total points scored by Miami Heat players in the 2006-2007 season:\\n Udonis Haslem: 844 points\\n Dwayne Wade: 1397 points\\n James Posey: 550 points\\n ...\\n ', call_id='call_js7ogBp0UDmHfvLo6BmWFpM1')]), ToolCallMessage(source='WebSearchAgent', models_usage=RequestUsage(prompt_tokens=371, completion_tokens=70), content=[FunctionCall(id='call_G7ATvIq0rSjc8fqLdKQ5uWI4', arguments='{\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}', name='search_web_tool'), FunctionCall(id='call_Xzw9bAvgfo40EjILophG5pnl', arguments='{\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}', name='search_web_tool')]), ToolCallResultMessage(source='WebSearchAgent', models_usage=None, content=[FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2007-2008 is 214.', call_id='call_G7ATvIq0rSjc8fqLdKQ5uWI4'), FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2008-2009 is 398.', call_id='call_Xzw9bAvgfo40EjILophG5pnl')]), TextMessage(source='WebSearchAgent', models_usage=RequestUsage(prompt_tokens=506, completion_tokens=107), content=\"The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade, with 1,397 points.\\n\\nBetween the 2007-2008 and 2008-2009 seasons, Dwyane Wade's total rebounds increased from 214 to 398. To calculate the percentage change:\\n\\nPercentage Change = \\\\(\\\\frac{(398 - 214)}{214} \\\\times 100\\\\)\\n\\nNow, a data analyst would calculate the actual percentage change based on these numbers.\"), ToolCallMessage(source='DataAnalystAgent', models_usage=RequestUsage(prompt_tokens=383, completion_tokens=20), content=[FunctionCall(id='call_76VkQ2nnKrwtuI1dmjLQ7G5P', arguments='{\"start\":214,\"end\":398}', name='percentage_change_tool')]), ToolCallResultMessage(source='DataAnalystAgent', models_usage=None, content=[FunctionExecutionResult(content='85.98130841121495', call_id='call_76VkQ2nnKrwtuI1dmjLQ7G5P')]), TextMessage(source='DataAnalystAgent', models_usage=RequestUsage(prompt_tokens=424, completion_tokens=52), content='The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade. His total rebounds increased by approximately 85.98% between the 2007-2008 and 2008-2009 seasons.'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=470, completion_tokens=66), content=\"The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade, scoring 1,397 points. Between the 2007-2008 and 2008-2009 seasons, Dwyane Wade's total rebounds increased by approximately 85.98%. \\n\\nTERMINATE\")], stop_reason=\"Text 'TERMINATE' mentioned\")" + "TaskResult(messages=[TextMessage(source='user', models_usage=None, content='Who was the Miami Heat player with the highest points in the 2006-2007 season, and what was the percentage change in his total rebounds between the 2007-2008 and 2008-2009 seasons?', type='TextMessage'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=159, completion_tokens=122), content='To address this request, we will divide the task into manageable subtasks. \\n\\n1. Web search agent: Identify the Miami Heat player with the highest points in the 2006-2007 season.\\n2. Web search agent: Gather the total rebounds for the identified player during the 2007-2008 season.\\n3. Web search agent: Gather the total rebounds for the identified player during the 2008-2009 season.\\n4. Data analyst: Calculate the percentage change in total rebounds for the identified player between the 2007-2008 and 2008-2009 seasons.', type='TextMessage'), ToolCallMessage(source='WebSearchAgent', models_usage=RequestUsage(prompt_tokens=271, completion_tokens=26), content=[FunctionCall(id='call_xdYlGP2lsqDeWdSiOlwOBNiO', arguments='{\"query\":\"Miami Heat highest points player 2006-2007 season\"}', name='search_web_tool')], type='ToolCallMessage'), ToolCallResultMessage(source='WebSearchAgent', models_usage=None, content=[FunctionExecutionResult(content='Here are the total points scored by Miami Heat players in the 2006-2007 season:\\n Udonis Haslem: 844 points\\n Dwayne Wade: 1397 points\\n James Posey: 550 points\\n ...\\n ', call_id='call_xdYlGP2lsqDeWdSiOlwOBNiO')], type='ToolCallResultMessage'), TextMessage(source='WebSearchAgent', models_usage=None, content='Tool calls:\\nsearch_web_tool({\"query\":\"Miami Heat highest points player 2006-2007 season\"}) = Here are the total points scored by Miami Heat players in the 2006-2007 season:\\n Udonis Haslem: 844 points\\n Dwayne Wade: 1397 points\\n James Posey: 550 points\\n ...\\n ', type='TextMessage'), ToolCallMessage(source='DataAnalystAgent', models_usage=RequestUsage(prompt_tokens=345, completion_tokens=68), content=[FunctionCall(id='call_asjxKtAVGfqrYl0jMpvwCrvV', arguments='{\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}', name='WebSearchAgent'), FunctionCall(id='call_8L91Kizt0KU6RNwUgvNx7S0s', arguments='{\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}', name='WebSearchAgent')], type='ToolCallMessage'), ToolCallResultMessage(source='DataAnalystAgent', models_usage=None, content=[FunctionExecutionResult(content=\"Error: The tool 'WebSearchAgent' is not available.\", call_id='call_asjxKtAVGfqrYl0jMpvwCrvV'), FunctionExecutionResult(content=\"Error: The tool 'WebSearchAgent' is not available.\", call_id='call_8L91Kizt0KU6RNwUgvNx7S0s')], type='ToolCallResultMessage'), TextMessage(source='DataAnalystAgent', models_usage=None, content='Tool calls:\\nWebSearchAgent({\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}) = Error: The tool \\'WebSearchAgent\\' is not available.\\nWebSearchAgent({\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}) = Error: The tool \\'WebSearchAgent\\' is not available.', type='TextMessage'), ToolCallMessage(source='WebSearchAgent', models_usage=RequestUsage(prompt_tokens=445, completion_tokens=70), content=[FunctionCall(id='call_imvRJ2jhpPdovBbx8MFjlFVS', arguments='{\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}', name='search_web_tool'), FunctionCall(id='call_U30KVmFG1aeXPbqGJjDmJ6iJ', arguments='{\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}', name='search_web_tool')], type='ToolCallMessage'), ToolCallResultMessage(source='WebSearchAgent', models_usage=None, content=[FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2007-2008 is 214.', call_id='call_imvRJ2jhpPdovBbx8MFjlFVS'), FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2008-2009 is 398.', call_id='call_U30KVmFG1aeXPbqGJjDmJ6iJ')], type='ToolCallResultMessage'), TextMessage(source='WebSearchAgent', models_usage=None, content='Tool calls:\\nsearch_web_tool({\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}) = The number of total rebounds for Dwayne Wade in the Miami Heat season 2007-2008 is 214.\\nsearch_web_tool({\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}) = The number of total rebounds for Dwayne Wade in the Miami Heat season 2008-2009 is 398.', type='TextMessage'), ToolCallMessage(source='DataAnalystAgent', models_usage=RequestUsage(prompt_tokens=562, completion_tokens=20), content=[FunctionCall(id='call_CtAnvcbitN0JiwBfiLVzb5Do', arguments='{\"start\":214,\"end\":398}', name='percentage_change_tool')], type='ToolCallMessage'), ToolCallResultMessage(source='DataAnalystAgent', models_usage=None, content=[FunctionExecutionResult(content='85.98130841121495', call_id='call_CtAnvcbitN0JiwBfiLVzb5Do')], type='ToolCallResultMessage'), TextMessage(source='DataAnalystAgent', models_usage=None, content='Tool calls:\\npercentage_change_tool({\"start\":214,\"end\":398}) = 85.98130841121495', type='TextMessage'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=590, completion_tokens=122), content=\"Summary of Findings:\\n\\n1. Dwyane Wade was the Miami Heat player with the highest points in the 2006-2007 season, scoring a total of 1,397 points.\\n2. Dwyane Wade's total rebounds during the 2007-2008 season were 214.\\n3. Dwyane Wade's total rebounds during the 2008-2009 season were 398.\\n4. The percentage change in Dwyane Wade's total rebounds between the 2007-2008 and 2008-2009 seasons was approximately 85.98%.\\n\\nTERMINATE\", type='TextMessage')], stop_reason=\"Text 'TERMINATE' mentioned\")" ] }, - "execution_count": 12, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -345,7 +356,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -355,65 +366,89 @@ "---------- user ----------\n", "Who was the Miami Heat player with the highest points in the 2006-2007 season, and what was the percentage change in his total rebounds between the 2007-2008 and 2008-2009 seasons?\n", "---------- PlanningAgent ----------\n", - "To solve this inquiry, let's break it down into smaller tasks again:\n", + "To address this query, we'll need to break it down into a few specific tasks:\n", "\n", - "1. Find out who was the Miami Heat player with the highest points in the 2006-2007 NBA season.\n", - "2. Find that player's total rebounds for the 2007-2008 NBA season.\n", - "3. Find that player's total rebounds for the 2008-2009 NBA season.\n", - "4. Calculate the percentage change in the player's total rebounds from the 2007-2008 to the 2008-2009 season.\n", + "1. Web search agent: Identify the Miami Heat player with the highest points in the 2006-2007 NBA season.\n", + "2. Web search agent: Find the total number of rebounds by this player in the 2007-2008 NBA season.\n", + "3. Web search agent: Find the total number of rebounds by this player in the 2008-2009 NBA season.\n", + "4. Data analyst: Calculate the percentage change in his total rebounds between the 2007-2008 and 2008-2009 seasons.\n", "\n", - "Let's proceed with these tasks and find the necessary information.\n", - "[Prompt tokens: 595, Completion tokens: 115]\n", + "Let's get started with these tasks.\n", + "[Prompt tokens: 159, Completion tokens: 132]\n", "---------- WebSearchAgent ----------\n", - "The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade, who scored a total of 1,397 points.\n", - "\n", - "In terms of his rebound statistics:\n", - "- In the 2007-2008 season, Dwyane Wade recorded 214 total rebounds.\n", - "- In the 2008-2009 season, he recorded 398 total rebounds.\n", - "\n", - "To find the percentage change in his total rebounds, a data analyst would perform the following calculation:\n", - "\n", - "\\[\n", - "\\text{Percentage Change} = \\left( \\frac{398 - 214}{214} \\right) \\times 100\n", - "\\]\n", - "\n", - "A data analyst would use the above numbers to determine the percentage change in his total rebounds between these two seasons.\n", - "[Prompt tokens: 794, Completion tokens: 154]\n", + "[FunctionCall(id='call_TSUHOBKhpHmTNoYeJzwSP5V4', arguments='{\"query\":\"Miami Heat highest points player 2006-2007 season\"}', name='search_web_tool')]\n", + "[Prompt tokens: 281, Completion tokens: 26]\n", + "---------- WebSearchAgent ----------\n", + "[FunctionExecutionResult(content='Here are the total points scored by Miami Heat players in the 2006-2007 season:\\n Udonis Haslem: 844 points\\n Dwayne Wade: 1397 points\\n James Posey: 550 points\\n ...\\n ', call_id='call_TSUHOBKhpHmTNoYeJzwSP5V4')]\n", + "---------- WebSearchAgent ----------\n", + "Tool calls:\n", + "search_web_tool({\"query\":\"Miami Heat highest points player 2006-2007 season\"}) = Here are the total points scored by Miami Heat players in the 2006-2007 season:\n", + " Udonis Haslem: 844 points\n", + " Dwayne Wade: 1397 points\n", + " James Posey: 550 points\n", + " ...\n", + " \n", "---------- PlanningAgent ----------\n", - "The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade, with a total of 1,397 points. His total rebounds increased from 214 in the 2007-2008 season to 398 in the 2008-2009 season.\n", + "1. Web search agent: Find the total number of rebounds by Dwayne Wade in the 2007-2008 NBA season.\n", + "2. Web search agent: Find the total number of rebounds by Dwayne Wade in the 2008-2009 NBA season.\n", + "[Prompt tokens: 382, Completion tokens: 54]\n", + "---------- DataAnalystAgent ----------\n", + "[FunctionCall(id='call_BkPBFkpuTG6c3eeoACrrRX7V', arguments='{\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}', name='search_web_tool'), FunctionCall(id='call_5LQquT7ZUAAQRf7gvckeTVdQ', arguments='{\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}', name='search_web_tool')]\n", + "[Prompt tokens: 416, Completion tokens: 68]\n", + "---------- DataAnalystAgent ----------\n", + "[FunctionExecutionResult(content=\"Error: The tool 'search_web_tool' is not available.\", call_id='call_BkPBFkpuTG6c3eeoACrrRX7V'), FunctionExecutionResult(content=\"Error: The tool 'search_web_tool' is not available.\", call_id='call_5LQquT7ZUAAQRf7gvckeTVdQ')]\n", + "---------- DataAnalystAgent ----------\n", + "Tool calls:\n", + "search_web_tool({\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}) = Error: The tool 'search_web_tool' is not available.\n", + "search_web_tool({\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}) = Error: The tool 'search_web_tool' is not available.\n", + "---------- PlanningAgent ----------\n", + "It seems there was a miscommunication in task assignment. Let me reassess and reassign the tasks correctly.\n", "\n", - "Let's have a data analyst calculate the percentage change: \n", + "1. Web search agent: Find the total number of rebounds by Dwayne Wade in the 2007-2008 NBA season.\n", + "2. Web search agent: Find the total number of rebounds by Dwayne Wade in the 2008-2009 NBA season.\n", + "[Prompt tokens: 525, Completion tokens: 76]\n", + "---------- WebSearchAgent ----------\n", + "[FunctionCall(id='call_buIWOtu1dJqPaxJmqMyuRkpj', arguments='{\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}', name='search_web_tool'), FunctionCall(id='call_qcnHKdoPsNAzMlPvoBvqmt8n', arguments='{\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}', name='search_web_tool')]\n", + "[Prompt tokens: 599, Completion tokens: 70]\n", + "---------- WebSearchAgent ----------\n", + "[FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2007-2008 is 214.', call_id='call_buIWOtu1dJqPaxJmqMyuRkpj'), FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2008-2009 is 398.', call_id='call_qcnHKdoPsNAzMlPvoBvqmt8n')]\n", + "---------- WebSearchAgent ----------\n", + "Tool calls:\n", + "search_web_tool({\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}) = The number of total rebounds for Dwayne Wade in the Miami Heat season 2007-2008 is 214.\n", + "search_web_tool({\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}) = The number of total rebounds for Dwayne Wade in the Miami Heat season 2008-2009 is 398.\n", + "---------- PlanningAgent ----------\n", + "With this information, we can proceed to calculate the percentage change in Dwyane Wade's total rebounds from the 2007-2008 season to the 2008-2009 season.\n", "\n", - "1. Data analyst: Calculate the percentage change in Dwyane Wade's total rebounds between the 2007-2008 and 2008-2009 seasons using the formula provided by the Web search agent.\n", - "[Prompt tokens: 878, Completion tokens: 116]\n", + "1. Data analyst: Calculate the percentage change in Dwyane Wade's total rebounds between the 2007-2008 (214 rebounds) and the 2008-2009 (398 rebounds) NBA seasons.\n", + "[Prompt tokens: 711, Completion tokens: 83]\n", "---------- DataAnalystAgent ----------\n", - "[FunctionCall(id='call_Fh84DXp5MxFzutmKVvclw5Cz', arguments='{\"start\":214,\"end\":398}', name='percentage_change_tool')]\n", - "[Prompt tokens: 942, Completion tokens: 20]\n", + "[FunctionCall(id='call_RjbFpLCehz1Nlk5kYmyMUenB', arguments='{\"start\":214,\"end\":398}', name='percentage_change_tool')]\n", + "[Prompt tokens: 806, Completion tokens: 20]\n", "---------- DataAnalystAgent ----------\n", - "[FunctionExecutionResult(content='85.98130841121495', call_id='call_Fh84DXp5MxFzutmKVvclw5Cz')]\n", + "[FunctionExecutionResult(content='85.98130841121495', call_id='call_RjbFpLCehz1Nlk5kYmyMUenB')]\n", "---------- DataAnalystAgent ----------\n", - "The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade. The percentage change in his total rebounds between the 2007-2008 season and the 2008-2009 season was approximately 85.98%.\n", - "[Prompt tokens: 983, Completion tokens: 56]\n", + "Tool calls:\n", + "percentage_change_tool({\"start\":214,\"end\":398}) = 85.98130841121495\n", "---------- PlanningAgent ----------\n", - "The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade, with a total of 1,397 points. Between the 2007-2008 and 2008-2009 seasons, his total rebounds increased by approximately 85.98%. \n", + "Based on the data collected, Dwyane Wade was the Miami Heat player with the highest points in the 2006-2007 NBA season, scoring a total of 1,397 points. Between the 2007-2008 and 2008-2009 seasons, Dwyane Wade's total rebounds increased from 214 to 398. This represents an approximate 85.98% increase in his total rebounds.\n", "\n", "TERMINATE\n", - "[Prompt tokens: 1065, Completion tokens: 65]\n", + "[Prompt tokens: 834, Completion tokens: 90]\n", "---------- Summary ----------\n", - "Number of messages: 8\n", + "Number of messages: 18\n", "Finish reason: Text 'TERMINATE' mentioned\n", - "Total prompt tokens: 5257\n", - "Total completion tokens: 526\n", - "Duration: 11.98 seconds\n" + "Total prompt tokens: 4713\n", + "Total completion tokens: 619\n", + "Duration: 11.72 seconds\n" ] }, { "data": { "text/plain": [ - "TaskResult(messages=[TextMessage(source='user', models_usage=None, content='Who was the Miami Heat player with the highest points in the 2006-2007 season, and what was the percentage change in his total rebounds between the 2007-2008 and 2008-2009 seasons?'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=595, completion_tokens=115), content=\"To solve this inquiry, let's break it down into smaller tasks again:\\n\\n1. Find out who was the Miami Heat player with the highest points in the 2006-2007 NBA season.\\n2. Find that player's total rebounds for the 2007-2008 NBA season.\\n3. Find that player's total rebounds for the 2008-2009 NBA season.\\n4. Calculate the percentage change in the player's total rebounds from the 2007-2008 to the 2008-2009 season.\\n\\nLet's proceed with these tasks and find the necessary information.\"), TextMessage(source='WebSearchAgent', models_usage=RequestUsage(prompt_tokens=794, completion_tokens=154), content='The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade, who scored a total of 1,397 points.\\n\\nIn terms of his rebound statistics:\\n- In the 2007-2008 season, Dwyane Wade recorded 214 total rebounds.\\n- In the 2008-2009 season, he recorded 398 total rebounds.\\n\\nTo find the percentage change in his total rebounds, a data analyst would perform the following calculation:\\n\\n\\\\[\\n\\\\text{Percentage Change} = \\\\left( \\\\frac{398 - 214}{214} \\\\right) \\\\times 100\\n\\\\]\\n\\nA data analyst would use the above numbers to determine the percentage change in his total rebounds between these two seasons.'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=878, completion_tokens=116), content=\"The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade, with a total of 1,397 points. His total rebounds increased from 214 in the 2007-2008 season to 398 in the 2008-2009 season.\\n\\nLet's have a data analyst calculate the percentage change: \\n\\n1. Data analyst: Calculate the percentage change in Dwyane Wade's total rebounds between the 2007-2008 and 2008-2009 seasons using the formula provided by the Web search agent.\"), ToolCallMessage(source='DataAnalystAgent', models_usage=RequestUsage(prompt_tokens=942, completion_tokens=20), content=[FunctionCall(id='call_Fh84DXp5MxFzutmKVvclw5Cz', arguments='{\"start\":214,\"end\":398}', name='percentage_change_tool')]), ToolCallResultMessage(source='DataAnalystAgent', models_usage=None, content=[FunctionExecutionResult(content='85.98130841121495', call_id='call_Fh84DXp5MxFzutmKVvclw5Cz')]), TextMessage(source='DataAnalystAgent', models_usage=RequestUsage(prompt_tokens=983, completion_tokens=56), content='The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade. The percentage change in his total rebounds between the 2007-2008 season and the 2008-2009 season was approximately 85.98%.'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=1065, completion_tokens=65), content='The Miami Heat player with the highest points in the 2006-2007 season was Dwyane Wade, with a total of 1,397 points. Between the 2007-2008 and 2008-2009 seasons, his total rebounds increased by approximately 85.98%. \\n\\nTERMINATE')], stop_reason=\"Text 'TERMINATE' mentioned\")" + "TaskResult(messages=[TextMessage(source='user', models_usage=None, content='Who was the Miami Heat player with the highest points in the 2006-2007 season, and what was the percentage change in his total rebounds between the 2007-2008 and 2008-2009 seasons?', type='TextMessage'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=159, completion_tokens=132), content=\"To address this query, we'll need to break it down into a few specific tasks:\\n\\n1. Web search agent: Identify the Miami Heat player with the highest points in the 2006-2007 NBA season.\\n2. Web search agent: Find the total number of rebounds by this player in the 2007-2008 NBA season.\\n3. Web search agent: Find the total number of rebounds by this player in the 2008-2009 NBA season.\\n4. Data analyst: Calculate the percentage change in his total rebounds between the 2007-2008 and 2008-2009 seasons.\\n\\nLet's get started with these tasks.\", type='TextMessage'), ToolCallMessage(source='WebSearchAgent', models_usage=RequestUsage(prompt_tokens=281, completion_tokens=26), content=[FunctionCall(id='call_TSUHOBKhpHmTNoYeJzwSP5V4', arguments='{\"query\":\"Miami Heat highest points player 2006-2007 season\"}', name='search_web_tool')], type='ToolCallMessage'), ToolCallResultMessage(source='WebSearchAgent', models_usage=None, content=[FunctionExecutionResult(content='Here are the total points scored by Miami Heat players in the 2006-2007 season:\\n Udonis Haslem: 844 points\\n Dwayne Wade: 1397 points\\n James Posey: 550 points\\n ...\\n ', call_id='call_TSUHOBKhpHmTNoYeJzwSP5V4')], type='ToolCallResultMessage'), TextMessage(source='WebSearchAgent', models_usage=None, content='Tool calls:\\nsearch_web_tool({\"query\":\"Miami Heat highest points player 2006-2007 season\"}) = Here are the total points scored by Miami Heat players in the 2006-2007 season:\\n Udonis Haslem: 844 points\\n Dwayne Wade: 1397 points\\n James Posey: 550 points\\n ...\\n ', type='TextMessage'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=382, completion_tokens=54), content='1. Web search agent: Find the total number of rebounds by Dwayne Wade in the 2007-2008 NBA season.\\n2. Web search agent: Find the total number of rebounds by Dwayne Wade in the 2008-2009 NBA season.', type='TextMessage'), ToolCallMessage(source='DataAnalystAgent', models_usage=RequestUsage(prompt_tokens=416, completion_tokens=68), content=[FunctionCall(id='call_BkPBFkpuTG6c3eeoACrrRX7V', arguments='{\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}', name='search_web_tool'), FunctionCall(id='call_5LQquT7ZUAAQRf7gvckeTVdQ', arguments='{\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}', name='search_web_tool')], type='ToolCallMessage'), ToolCallResultMessage(source='DataAnalystAgent', models_usage=None, content=[FunctionExecutionResult(content=\"Error: The tool 'search_web_tool' is not available.\", call_id='call_BkPBFkpuTG6c3eeoACrrRX7V'), FunctionExecutionResult(content=\"Error: The tool 'search_web_tool' is not available.\", call_id='call_5LQquT7ZUAAQRf7gvckeTVdQ')], type='ToolCallResultMessage'), TextMessage(source='DataAnalystAgent', models_usage=None, content='Tool calls:\\nsearch_web_tool({\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}) = Error: The tool \\'search_web_tool\\' is not available.\\nsearch_web_tool({\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}) = Error: The tool \\'search_web_tool\\' is not available.', type='TextMessage'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=525, completion_tokens=76), content='It seems there was a miscommunication in task assignment. Let me reassess and reassign the tasks correctly.\\n\\n1. Web search agent: Find the total number of rebounds by Dwayne Wade in the 2007-2008 NBA season.\\n2. Web search agent: Find the total number of rebounds by Dwayne Wade in the 2008-2009 NBA season.', type='TextMessage'), ToolCallMessage(source='WebSearchAgent', models_usage=RequestUsage(prompt_tokens=599, completion_tokens=70), content=[FunctionCall(id='call_buIWOtu1dJqPaxJmqMyuRkpj', arguments='{\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}', name='search_web_tool'), FunctionCall(id='call_qcnHKdoPsNAzMlPvoBvqmt8n', arguments='{\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}', name='search_web_tool')], type='ToolCallMessage'), ToolCallResultMessage(source='WebSearchAgent', models_usage=None, content=[FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2007-2008 is 214.', call_id='call_buIWOtu1dJqPaxJmqMyuRkpj'), FunctionExecutionResult(content='The number of total rebounds for Dwayne Wade in the Miami Heat season 2008-2009 is 398.', call_id='call_qcnHKdoPsNAzMlPvoBvqmt8n')], type='ToolCallResultMessage'), TextMessage(source='WebSearchAgent', models_usage=None, content='Tool calls:\\nsearch_web_tool({\"query\": \"Dwyane Wade total rebounds 2007-2008 season\"}) = The number of total rebounds for Dwayne Wade in the Miami Heat season 2007-2008 is 214.\\nsearch_web_tool({\"query\": \"Dwyane Wade total rebounds 2008-2009 season\"}) = The number of total rebounds for Dwayne Wade in the Miami Heat season 2008-2009 is 398.', type='TextMessage'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=711, completion_tokens=83), content=\"With this information, we can proceed to calculate the percentage change in Dwyane Wade's total rebounds from the 2007-2008 season to the 2008-2009 season.\\n\\n1. Data analyst: Calculate the percentage change in Dwyane Wade's total rebounds between the 2007-2008 (214 rebounds) and the 2008-2009 (398 rebounds) NBA seasons.\", type='TextMessage'), ToolCallMessage(source='DataAnalystAgent', models_usage=RequestUsage(prompt_tokens=806, completion_tokens=20), content=[FunctionCall(id='call_RjbFpLCehz1Nlk5kYmyMUenB', arguments='{\"start\":214,\"end\":398}', name='percentage_change_tool')], type='ToolCallMessage'), ToolCallResultMessage(source='DataAnalystAgent', models_usage=None, content=[FunctionExecutionResult(content='85.98130841121495', call_id='call_RjbFpLCehz1Nlk5kYmyMUenB')], type='ToolCallResultMessage'), TextMessage(source='DataAnalystAgent', models_usage=None, content='Tool calls:\\npercentage_change_tool({\"start\":214,\"end\":398}) = 85.98130841121495', type='TextMessage'), TextMessage(source='PlanningAgent', models_usage=RequestUsage(prompt_tokens=834, completion_tokens=90), content=\"Based on the data collected, Dwyane Wade was the Miami Heat player with the highest points in the 2006-2007 NBA season, scoring a total of 1,397 points. Between the 2007-2008 and 2008-2009 seasons, Dwyane Wade's total rebounds increased from 214 to 398. This represents an approximate 85.98% increase in his total rebounds.\\n\\nTERMINATE\", type='TextMessage')], stop_reason=\"Text 'TERMINATE' mentioned\")" ] }, - "execution_count": 13, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -425,6 +460,8 @@ " return None\n", "\n", "\n", + "# Reset the previous team and run the chat again with the selector function.\n", + "await team.reset()\n", "team = SelectorGroupChat(\n", " [planning_agent, web_search_agent, data_analyst_agent],\n", " model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"),\n", @@ -459,7 +496,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.6" + "version": "3.11.5" } }, "nbformat": 4, diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/state.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/state.ipynb index e09c255f5a42..c023dd640c32 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/state.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/state.ipynb @@ -26,9 +26,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "In Tanganyika's depths so wide and deep, \n", - "Ancient secrets in still waters sleep, \n", - "Ripples tell tales that time longs to keep. \n" + "In Tanganyika's embrace so wide and deep, \n", + "Ancient waters cradle secrets they keep, \n", + "Echoes of time where horizons sleep. \n" ] } ], @@ -39,7 +39,7 @@ "from autogen_agentchat.teams import RoundRobinGroupChat\n", "from autogen_agentchat.ui import Console\n", "from autogen_core import CancellationToken\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "assistant_agent = AssistantAgent(\n", " name=\"assistant_agent\",\n", @@ -59,14 +59,14 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'type': 'AssistantAgentState', 'version': '1.0.0', 'llm_messages': [{'content': 'Write a 3 line poem on lake tangayika', 'source': 'user', 'type': 'UserMessage'}, {'content': \"In Tanganyika's depths so wide and deep, \\nAncient secrets in still waters sleep, \\nRipples tell tales that time longs to keep. \", 'source': 'assistant_agent', 'type': 'AssistantMessage'}]}\n" + "{'type': 'AssistantAgentState', 'version': '1.0.0', 'llm_messages': [{'content': 'Write a 3 line poem on lake tangayika', 'source': 'user', 'type': 'UserMessage'}, {'content': \"In Tanganyika's embrace so wide and deep, \\nAncient waters cradle secrets they keep, \\nEchoes of time where horizons sleep. \", 'source': 'assistant_agent', 'type': 'AssistantMessage'}]}\n" ] } ], @@ -77,15 +77,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "The last line of the poem I wrote was: \n", - "\"Ripples tell tales that time longs to keep.\"\n" + "The last line of the poem was: \"Echoes of time where horizons sleep.\"\n" ] } ], @@ -131,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -141,16 +140,16 @@ "---------- user ----------\n", "Write a beautiful poem 3-line about lake tangayika\n", "---------- assistant_agent ----------\n", - "In Tanganyika's depths, where light gently weaves, \n", - "Silver reflections dance on ancient water's face, \n", - "Whispered stories of time in the rippling leaves. \n", - "[Prompt tokens: 29, Completion tokens: 36]\n", + "In Tanganyika's gleam, beneath the azure skies, \n", + "Whispers of ancient waters, in tranquil guise, \n", + "Nature's mirror, where dreams and serenity lie.\n", + "[Prompt tokens: 29, Completion tokens: 34]\n", "---------- Summary ----------\n", "Number of messages: 2\n", "Finish reason: Maximum number of messages 2 reached, current message count: 2\n", "Total prompt tokens: 29\n", - "Total completion tokens: 36\n", - "Duration: 1.16 seconds\n" + "Total completion tokens: 34\n", + "Duration: 0.71 seconds\n" ] } ], @@ -184,7 +183,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -194,23 +193,23 @@ "---------- user ----------\n", "What was the last line of the poem you wrote?\n", "---------- assistant_agent ----------\n", - "I don't write poems on my own, but I can help create one with you or try to recall a specific poem if you have one in mind. Let me know what you'd like to do!\n", - "[Prompt tokens: 28, Completion tokens: 39]\n", + "I'm sorry, but I am unable to recall or access previous interactions, including any specific poem I may have composed in our past conversations. If you like, I can write a new poem for you.\n", + "[Prompt tokens: 28, Completion tokens: 40]\n", "---------- Summary ----------\n", "Number of messages: 2\n", "Finish reason: Maximum number of messages 2 reached, current message count: 2\n", "Total prompt tokens: 28\n", - "Total completion tokens: 39\n", - "Duration: 0.95 seconds\n" + "Total completion tokens: 40\n", + "Duration: 0.70 seconds\n" ] }, { "data": { "text/plain": [ - "TaskResult(messages=[TextMessage(source='user', models_usage=None, type='TextMessage', content='What was the last line of the poem you wrote?'), TextMessage(source='assistant_agent', models_usage=RequestUsage(prompt_tokens=28, completion_tokens=39), type='TextMessage', content=\"I don't write poems on my own, but I can help create one with you or try to recall a specific poem if you have one in mind. Let me know what you'd like to do!\")], stop_reason='Maximum number of messages 2 reached, current message count: 2')" + "TaskResult(messages=[TextMessage(source='user', models_usage=None, content='What was the last line of the poem you wrote?', type='TextMessage'), TextMessage(source='assistant_agent', models_usage=RequestUsage(prompt_tokens=28, completion_tokens=40), content=\"I'm sorry, but I am unable to recall or access previous interactions, including any specific poem I may have composed in our past conversations. If you like, I can write a new poem for you.\", type='TextMessage')], stop_reason='Maximum number of messages 2 reached, current message count: 2')" ] }, - "execution_count": 5, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -225,42 +224,40 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we load the state of the team and ask the same question. We see that the team is able to accurately return the last line of the poem it wrote.\n", - "\n", - "Note: You can serialize the state of the team to a file and load it back later." + "Next, we load the state of the team and ask the same question. We see that the team is able to accurately return the last line of the poem it wrote." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'type': 'TeamState', 'version': '1.0.0', 'agent_states': {'group_chat_manager/c80054be-efb2-4bc7-ba0d-900962092c44': {'type': 'RoundRobinManagerState', 'version': '1.0.0', 'message_thread': [{'source': 'user', 'models_usage': None, 'type': 'TextMessage', 'content': 'Write a beautiful poem 3-line about lake tangayika'}, {'source': 'assistant_agent', 'models_usage': {'prompt_tokens': 29, 'completion_tokens': 36}, 'type': 'TextMessage', 'content': \"In Tanganyika's depths, where light gently weaves, \\nSilver reflections dance on ancient water's face, \\nWhispered stories of time in the rippling leaves. \"}], 'current_turn': 0, 'next_speaker_index': 0}, 'collect_output_messages/c80054be-efb2-4bc7-ba0d-900962092c44': {}, 'assistant_agent/c80054be-efb2-4bc7-ba0d-900962092c44': {'type': 'ChatAgentContainerState', 'version': '1.0.0', 'agent_state': {'type': 'AssistantAgentState', 'version': '1.0.0', 'llm_messages': [{'content': 'Write a beautiful poem 3-line about lake tangayika', 'source': 'user', 'type': 'UserMessage'}, {'content': \"In Tanganyika's depths, where light gently weaves, \\nSilver reflections dance on ancient water's face, \\nWhispered stories of time in the rippling leaves. \", 'source': 'assistant_agent', 'type': 'AssistantMessage'}]}, 'message_buffer': []}}, 'team_id': 'c80054be-efb2-4bc7-ba0d-900962092c44'}\n", + "{'type': 'TeamState', 'version': '1.0.0', 'agent_states': {'group_chat_manager/a55364ad-86fd-46ab-9449-dcb5260b1e06': {'type': 'RoundRobinManagerState', 'version': '1.0.0', 'message_thread': [{'source': 'user', 'models_usage': None, 'content': 'Write a beautiful poem 3-line about lake tangayika', 'type': 'TextMessage'}, {'source': 'assistant_agent', 'models_usage': {'prompt_tokens': 29, 'completion_tokens': 34}, 'content': \"In Tanganyika's gleam, beneath the azure skies, \\nWhispers of ancient waters, in tranquil guise, \\nNature's mirror, where dreams and serenity lie.\", 'type': 'TextMessage'}], 'current_turn': 0, 'next_speaker_index': 0}, 'collect_output_messages/a55364ad-86fd-46ab-9449-dcb5260b1e06': {}, 'assistant_agent/a55364ad-86fd-46ab-9449-dcb5260b1e06': {'type': 'ChatAgentContainerState', 'version': '1.0.0', 'agent_state': {'type': 'AssistantAgentState', 'version': '1.0.0', 'llm_messages': [{'content': 'Write a beautiful poem 3-line about lake tangayika', 'source': 'user', 'type': 'UserMessage'}, {'content': \"In Tanganyika's gleam, beneath the azure skies, \\nWhispers of ancient waters, in tranquil guise, \\nNature's mirror, where dreams and serenity lie.\", 'source': 'assistant_agent', 'type': 'AssistantMessage'}]}, 'message_buffer': []}}, 'team_id': 'a55364ad-86fd-46ab-9449-dcb5260b1e06'}\n", "---------- user ----------\n", "What was the last line of the poem you wrote?\n", "---------- assistant_agent ----------\n", - "The last line of the poem I wrote was: \n", - "\"Whispered stories of time in the rippling leaves.\"\n", - "[Prompt tokens: 88, Completion tokens: 24]\n", + "The last line of the poem I wrote is: \n", + "\"Nature's mirror, where dreams and serenity lie.\"\n", + "[Prompt tokens: 86, Completion tokens: 22]\n", "---------- Summary ----------\n", "Number of messages: 2\n", "Finish reason: Maximum number of messages 2 reached, current message count: 2\n", - "Total prompt tokens: 88\n", - "Total completion tokens: 24\n", - "Duration: 0.79 seconds\n" + "Total prompt tokens: 86\n", + "Total completion tokens: 22\n", + "Duration: 0.96 seconds\n" ] }, { "data": { "text/plain": [ - "TaskResult(messages=[TextMessage(source='user', models_usage=None, type='TextMessage', content='What was the last line of the poem you wrote?'), TextMessage(source='assistant_agent', models_usage=RequestUsage(prompt_tokens=88, completion_tokens=24), type='TextMessage', content='The last line of the poem I wrote was: \\n\"Whispered stories of time in the rippling leaves.\"')], stop_reason='Maximum number of messages 2 reached, current message count: 2')" + "TaskResult(messages=[TextMessage(source='user', models_usage=None, content='What was the last line of the poem you wrote?', type='TextMessage'), TextMessage(source='assistant_agent', models_usage=RequestUsage(prompt_tokens=86, completion_tokens=22), content='The last line of the poem I wrote is: \\n\"Nature\\'s mirror, where dreams and serenity lie.\"', type='TextMessage')], stop_reason='Maximum number of messages 2 reached, current message count: 2')" ] }, - "execution_count": 6, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -273,11 +270,71 @@ "stream = agent_team.run_stream(task=\"What was the last line of the poem you wrote?\")\n", "await Console(stream)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Persisting State (File or Database)\n", + "\n", + "In many cases, we may want to persist the state of the team to disk (or a database) and load it back later. State is a dictionary that can be serialized to a file or written to a database." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- user ----------\n", + "What was the last line of the poem you wrote?\n", + "---------- assistant_agent ----------\n", + "The last line of the poem I wrote is: \n", + "\"Nature's mirror, where dreams and serenity lie.\"\n", + "[Prompt tokens: 86, Completion tokens: 22]\n", + "---------- Summary ----------\n", + "Number of messages: 2\n", + "Finish reason: Maximum number of messages 2 reached, current message count: 2\n", + "Total prompt tokens: 86\n", + "Total completion tokens: 22\n", + "Duration: 0.72 seconds\n" + ] + }, + { + "data": { + "text/plain": [ + "TaskResult(messages=[TextMessage(source='user', models_usage=None, content='What was the last line of the poem you wrote?', type='TextMessage'), TextMessage(source='assistant_agent', models_usage=RequestUsage(prompt_tokens=86, completion_tokens=22), content='The last line of the poem I wrote is: \\n\"Nature\\'s mirror, where dreams and serenity lie.\"', type='TextMessage')], stop_reason='Maximum number of messages 2 reached, current message count: 2')" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import json\n", + "## save state to disk\n", + "\n", + "with open(\"coding/team_state.json\", \"w\") as f:\n", + " json.dump(team_state, f)\n", + "\n", + "## load state from disk\n", + "with open(\"coding/team_state.json\", \"r\") as f:\n", + " team_state = json.load(f)\n", + "\n", + "new_agent_team = RoundRobinGroupChat([assistant_agent], termination_condition=MaxMessageTermination(max_messages=2))\n", + "await new_agent_team.load_state(team_state)\n", + "stream = new_agent_team.run_stream(task=\"What was the last line of the poem you wrote?\")\n", + "await Console(stream)" + ] } ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "agnext", "language": "python", "name": "python3" }, @@ -291,7 +348,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.11.9" } }, "nbformat": 4, diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/swarm.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/swarm.ipynb index c1583848a503..b0feb00d003b 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/swarm.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/swarm.ipynb @@ -89,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -100,7 +100,7 @@ "from autogen_agentchat.messages import HandoffMessage\n", "from autogen_agentchat.teams import Swarm\n", "from autogen_agentchat.ui import Console\n", - "from autogen_ext.models import OpenAIChatCompletionClient" + "from autogen_ext.models.openai import OpenAIChatCompletionClient" ] }, { @@ -112,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -130,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -164,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -174,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -184,57 +184,54 @@ "---------- user ----------\n", "I need to refund my flight.\n", "---------- travel_agent ----------\n", - "[FunctionCall(id='call_epnozsBbe9i4swPaaBIR4Enl', arguments='{}', name='transfer_to_flights_refunder')]\n", - "[Prompt tokens: 327, Completion tokens: 14]\n", + "[FunctionCall(id='call_ZQ2rGjq4Z29pd0yP2sNcuyd2', arguments='{}', name='transfer_to_flights_refunder')]\n", + "[Prompt tokens: 119, Completion tokens: 14]\n", "---------- travel_agent ----------\n", - "[FunctionExecutionResult(content='Transferred to flights_refunder, adopting the role of flights_refunder immediately.', call_id='call_epnozsBbe9i4swPaaBIR4Enl')]\n", + "[FunctionExecutionResult(content='Transferred to flights_refunder, adopting the role of flights_refunder immediately.', call_id='call_ZQ2rGjq4Z29pd0yP2sNcuyd2')]\n", "---------- travel_agent ----------\n", "Transferred to flights_refunder, adopting the role of flights_refunder immediately.\n", "---------- flights_refunder ----------\n", - "I can help you with that. Could you please provide me with your flight reference number so I can process the refund?\n", - "[Prompt tokens: 450, Completion tokens: 25]\n", + "Could you please provide me with the flight reference number so I can process the refund for you?\n", + "[Prompt tokens: 191, Completion tokens: 20]\n", "---------- flights_refunder ----------\n", - "[FunctionCall(id='call_giMQVbQ7mXahC5G3eC0wvnCv', arguments='{}', name='transfer_to_user')]\n", - "[Prompt tokens: 483, Completion tokens: 11]\n", + "[FunctionCall(id='call_1iRfzNpxTJhRTW2ww9aQJ8sK', arguments='{}', name='transfer_to_user')]\n", + "[Prompt tokens: 219, Completion tokens: 11]\n", "---------- flights_refunder ----------\n", - "[FunctionExecutionResult(content='Transferred to user, adopting the role of user immediately.', call_id='call_giMQVbQ7mXahC5G3eC0wvnCv')]\n", + "[FunctionExecutionResult(content='Transferred to user, adopting the role of user immediately.', call_id='call_1iRfzNpxTJhRTW2ww9aQJ8sK')]\n", "---------- flights_refunder ----------\n", "Transferred to user, adopting the role of user immediately.\n", "---------- Summary ----------\n", "Number of messages: 8\n", "Finish reason: Handoff to user from flights_refunder detected.\n", - "Total prompt tokens: 1260\n", - "Total completion tokens: 50\n", - "Duration: 1.79 seconds\n", + "Total prompt tokens: 529\n", + "Total completion tokens: 45\n", + "Duration: 2.05 seconds\n", "---------- user ----------\n", "Sure, it's 507811\n", "---------- flights_refunder ----------\n", - "[FunctionCall(id='call_ACcFykJ3fPzanMwy1YGxG4L4', arguments='{\"flight_id\":\"507811\"}', name='refund_flight')]\n", - "[Prompt tokens: 530, Completion tokens: 18]\n", + "[FunctionCall(id='call_UKCsoEBdflkvpuT9Bi2xlvTd', arguments='{\"flight_id\":\"507811\"}', name='refund_flight')]\n", + "[Prompt tokens: 266, Completion tokens: 18]\n", "---------- flights_refunder ----------\n", - "[FunctionExecutionResult(content='Flight 507811 refunded', call_id='call_ACcFykJ3fPzanMwy1YGxG4L4')]\n", + "[FunctionExecutionResult(content='Flight 507811 refunded', call_id='call_UKCsoEBdflkvpuT9Bi2xlvTd')]\n", "---------- flights_refunder ----------\n", - "Your flight with the reference number 507811 has been successfully refunded. If there is anything else you need help with, feel free to ask!\n", - "[Prompt tokens: 488, Completion tokens: 30]\n", + "Tool calls:\n", + "refund_flight({\"flight_id\":\"507811\"}) = Flight 507811 refunded\n", "---------- flights_refunder ----------\n", - "[FunctionCall(id='call_9NjAP8yD1qgwNL4Zfntt4dVb', arguments='{}', name='transfer_to_travel_agent')]\n", - "[Prompt tokens: 605, Completion tokens: 13]\n", + "[FunctionCall(id='call_MQ2CXR8UhVtjNc6jG3wSQp2W', arguments='{}', name='transfer_to_travel_agent')]\n", + "[Prompt tokens: 303, Completion tokens: 13]\n", "---------- flights_refunder ----------\n", - "[FunctionExecutionResult(content='Transferred to travel_agent, adopting the role of travel_agent immediately.', call_id='call_9NjAP8yD1qgwNL4Zfntt4dVb')]\n", + "[FunctionExecutionResult(content='Transferred to travel_agent, adopting the role of travel_agent immediately.', call_id='call_MQ2CXR8UhVtjNc6jG3wSQp2W')]\n", "---------- flights_refunder ----------\n", "Transferred to travel_agent, adopting the role of travel_agent immediately.\n", "---------- travel_agent ----------\n", - "If you need further assistance with travel planning or any other inquiries, just let me know. Have a wonderful day!\n", - "[Prompt tokens: 495, Completion tokens: 24]\n", - "---------- travel_agent ----------\n", - "TERMINATE\n", - "[Prompt tokens: 525, Completion tokens: 4]\n", + "Your flight with reference number 507811 has been successfully refunded. If you need anything else, feel free to let me know. Safe travels! TERMINATE\n", + "[Prompt tokens: 272, Completion tokens: 32]\n", "---------- Summary ----------\n", - "Number of messages: 9\n", + "Number of messages: 8\n", "Finish reason: Text 'TERMINATE' mentioned\n", - "Total prompt tokens: 2643\n", - "Total completion tokens: 89\n", - "Duration: 6.63 seconds\n" + "Total prompt tokens: 841\n", + "Total completion tokens: 63\n", + "Duration: 1.64 seconds\n" ] } ], @@ -299,7 +296,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -331,7 +328,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -350,7 +347,7 @@ " - News Analyst: For news gathering and analysis\n", " - Writer: For compiling final report\n", " Always send your plan first, then handoff to appropriate agent.\n", - " Handoff to a single agent at a time.\n", + " Always handoff to a single agent at a time.\n", " Use TERMINATE when research is complete.\"\"\",\n", ")\n", "\n", @@ -388,7 +385,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -398,117 +395,96 @@ "---------- user ----------\n", "Conduct market research for TSLA stock\n", "---------- planner ----------\n", - "[FunctionCall(id='call_IXFe9RcGbYGNf0V7B2hvDNJI', arguments='{}', name='transfer_to_financial_analyst')]\n", - "[Prompt tokens: 168, Completion tokens: 149]\n", + "[FunctionCall(id='call_BX5QaRuhmB8CxTsBlqCUIXPb', arguments='{}', name='transfer_to_financial_analyst')]\n", + "[Prompt tokens: 169, Completion tokens: 166]\n", "---------- planner ----------\n", - "[FunctionExecutionResult(content='Transferred to financial_analyst, adopting the role of financial_analyst immediately.', call_id='call_IXFe9RcGbYGNf0V7B2hvDNJI')]\n", + "[FunctionExecutionResult(content='Transferred to financial_analyst, adopting the role of financial_analyst immediately.', call_id='call_BX5QaRuhmB8CxTsBlqCUIXPb')]\n", "---------- planner ----------\n", "Transferred to financial_analyst, adopting the role of financial_analyst immediately.\n", "---------- financial_analyst ----------\n", - "[FunctionCall(id='call_2IYcTAXiufX1SBmnMJOG9HPq', arguments='{\"symbol\":\"TSLA\"}', name='get_stock_data')]\n", + "[FunctionCall(id='call_SAXy1ebtA9mnaZo4ztpD2xHA', arguments='{\"symbol\":\"TSLA\"}', name='get_stock_data')]\n", "[Prompt tokens: 136, Completion tokens: 16]\n", "---------- financial_analyst ----------\n", - "[FunctionExecutionResult(content=\"{'price': 180.25, 'volume': 1000000, 'pe_ratio': 65.4, 'market_cap': '700B'}\", call_id='call_2IYcTAXiufX1SBmnMJOG9HPq')]\n", + "[FunctionExecutionResult(content=\"{'price': 180.25, 'volume': 1000000, 'pe_ratio': 65.4, 'market_cap': '700B'}\", call_id='call_SAXy1ebtA9mnaZo4ztpD2xHA')]\n", "---------- financial_analyst ----------\n", - "Here's the market research for TSLA (Tesla) stock:\n", - "\n", - "- **Current Price**: $180.25\n", - "- **Trading Volume**: 1,000,000 shares\n", - "- **Price to Earnings (P/E) Ratio**: 65.4\n", - "- **Market Capitalization**: $700 Billion\n", - "\n", - "These metrics can help evaluate Tesla's stock performance, value in the market, and overall investment appeal. If you need a specific analysis or additional data, feel free to let me know!\n", - "[Prompt tokens: 162, Completion tokens: 103]\n", + "Tool calls:\n", + "get_stock_data({\"symbol\":\"TSLA\"}) = {'price': 180.25, 'volume': 1000000, 'pe_ratio': 65.4, 'market_cap': '700B'}\n", "---------- financial_analyst ----------\n", - "[FunctionCall(id='call_ji8SdlXI1uga2SNenIZMvPOR', arguments='{}', name='transfer_to_planner')]\n", - "[Prompt tokens: 310, Completion tokens: 12]\n", + "[FunctionCall(id='call_IsdcFUfBVmtcVzfSuwQpeAwl', arguments='{}', name='transfer_to_planner')]\n", + "[Prompt tokens: 199, Completion tokens: 337]\n", "---------- financial_analyst ----------\n", - "[FunctionExecutionResult(content='Transferred to planner, adopting the role of planner immediately.', call_id='call_ji8SdlXI1uga2SNenIZMvPOR')]\n", + "[FunctionExecutionResult(content='Transferred to planner, adopting the role of planner immediately.', call_id='call_IsdcFUfBVmtcVzfSuwQpeAwl')]\n", "---------- financial_analyst ----------\n", "Transferred to planner, adopting the role of planner immediately.\n", "---------- planner ----------\n", - "[FunctionCall(id='call_aQUm1B1jzvnWF9aWLwfn2VxS', arguments='{}', name='transfer_to_news_analyst')]\n", - "[Prompt tokens: 346, Completion tokens: 14]\n", + "[FunctionCall(id='call_tN5goNFahrdcSfKnQqT0RONN', arguments='{}', name='transfer_to_news_analyst')]\n", + "[Prompt tokens: 291, Completion tokens: 14]\n", "---------- planner ----------\n", - "[FunctionExecutionResult(content='Transferred to news_analyst, adopting the role of news_analyst immediately.', call_id='call_aQUm1B1jzvnWF9aWLwfn2VxS')]\n", + "[FunctionExecutionResult(content='Transferred to news_analyst, adopting the role of news_analyst immediately.', call_id='call_tN5goNFahrdcSfKnQqT0RONN')]\n", "---------- planner ----------\n", "Transferred to news_analyst, adopting the role of news_analyst immediately.\n", "---------- news_analyst ----------\n", - "[FunctionCall(id='call_n5RmgbQgdyfE7EX5NUsKwApq', arguments='{\"query\":\"Tesla stock performance\"}', name='get_news')]\n", - "[Prompt tokens: 291, Completion tokens: 16]\n", + "[FunctionCall(id='call_Owjw6ZbiPdJgNWMHWxhCKgsp', arguments='{\"query\":\"Tesla market news\"}', name='get_news')]\n", + "[Prompt tokens: 235, Completion tokens: 16]\n", + "---------- news_analyst ----------\n", + "[FunctionExecutionResult(content='[{\\'title\\': \\'Tesla Expands Cybertruck Production\\', \\'date\\': \\'2024-03-20\\', \\'summary\\': \\'Tesla ramps up Cybertruck manufacturing capacity at Gigafactory Texas, aiming to meet strong demand.\\'}, {\\'title\\': \\'Tesla FSD Beta Shows Promise\\', \\'date\\': \\'2024-03-19\\', \\'summary\\': \\'Latest Full Self-Driving beta demonstrates significant improvements in urban navigation and safety features.\\'}, {\\'title\\': \\'Model Y Dominates Global EV Sales\\', \\'date\\': \\'2024-03-18\\', \\'summary\\': \"Tesla\\'s Model Y becomes best-selling electric vehicle worldwide, capturing significant market share.\"}]', call_id='call_Owjw6ZbiPdJgNWMHWxhCKgsp')]\n", "---------- news_analyst ----------\n", - "[FunctionExecutionResult(content='[{\\'title\\': \\'Tesla Expands Cybertruck Production\\', \\'date\\': \\'2024-03-20\\', \\'summary\\': \\'Tesla ramps up Cybertruck manufacturing capacity at Gigafactory Texas, aiming to meet strong demand.\\'}, {\\'title\\': \\'Tesla FSD Beta Shows Promise\\', \\'date\\': \\'2024-03-19\\', \\'summary\\': \\'Latest Full Self-Driving beta demonstrates significant improvements in urban navigation and safety features.\\'}, {\\'title\\': \\'Model Y Dominates Global EV Sales\\', \\'date\\': \\'2024-03-18\\', \\'summary\\': \"Tesla\\'s Model Y becomes best-selling electric vehicle worldwide, capturing significant market share.\"}]', call_id='call_n5RmgbQgdyfE7EX5NUsKwApq')]\n", + "Tool calls:\n", + "get_news({\"query\":\"Tesla market news\"}) = [{'title': 'Tesla Expands Cybertruck Production', 'date': '2024-03-20', 'summary': 'Tesla ramps up Cybertruck manufacturing capacity at Gigafactory Texas, aiming to meet strong demand.'}, {'title': 'Tesla FSD Beta Shows Promise', 'date': '2024-03-19', 'summary': 'Latest Full Self-Driving beta demonstrates significant improvements in urban navigation and safety features.'}, {'title': 'Model Y Dominates Global EV Sales', 'date': '2024-03-18', 'summary': \"Tesla's Model Y becomes best-selling electric vehicle worldwide, capturing significant market share.\"}]\n", "---------- news_analyst ----------\n", - "Here are some recent news articles related to TSLA (Tesla) stock that may influence its market performance:\n", + "Here are some of the key market insights regarding Tesla (TSLA):\n", "\n", - "1. **Tesla Expands Cybertruck Production** (March 20, 2024)\n", - " - Tesla has ramped up its Cybertruck manufacturing capacity at the Gigafactory in Texas, aiming to meet the strong demand for this vehicle.\n", + "1. **Expansion in Cybertruck Production**: Tesla has increased its Cybertruck production capacity at the Gigafactory in Texas to meet the high demand. This move might positively impact Tesla's revenues if the demand for the Cybertruck continues to grow.\n", "\n", - "2. **Tesla FSD Beta Shows Promise** (March 19, 2024)\n", - " - The latest Full Self-Driving (FSD) beta update demonstrates notable improvements in urban navigation and safety features, suggesting potential advancements in Tesla's autonomous driving technology.\n", + "2. **Advancements in Full Self-Driving (FSD) Technology**: The recent beta release of Tesla's Full Self-Driving software shows significant advancements, particularly in urban navigation and safety. Progress in this area could enhance Tesla's competitive edge in the autonomous driving sector.\n", "\n", - "3. **Model Y Dominates Global EV Sales** (March 18, 2024)\n", - " - Tesla's Model Y has become the best-selling electric vehicle worldwide, capturing a significant share of the market, which could positively impact the company's revenue streams.\n", + "3. **Dominance of Model Y in EV Sales**: Tesla's Model Y has become the best-selling electric vehicle globally, capturing a substantial market share. Such strong sales performance reinforces Tesla's leadership in the electric vehicle market.\n", "\n", - "If you'd like a more detailed analysis or further information, please let me know!\n", - "[Prompt tokens: 414, Completion tokens: 192]\n", + "These developments reflect Tesla's ongoing innovation and ability to capture market demand, which could positively influence its stock performance and market position. \n", + "\n", + "I will now hand off back to the planner.\n", + "[Prompt tokens: 398, Completion tokens: 203]\n", "---------- news_analyst ----------\n", - "[FunctionCall(id='call_7Ka5f5k2yZ8flfvZWKNXDQjL', arguments='{}', name='transfer_to_planner')]\n", - "[Prompt tokens: 654, Completion tokens: 12]\n", + "[FunctionCall(id='call_pn7y6PKsBspWA17uOh3AKNMT', arguments='{}', name='transfer_to_planner')]\n", + "[Prompt tokens: 609, Completion tokens: 12]\n", "---------- news_analyst ----------\n", - "[FunctionExecutionResult(content='Transferred to planner, adopting the role of planner immediately.', call_id='call_7Ka5f5k2yZ8flfvZWKNXDQjL')]\n", + "[FunctionExecutionResult(content='Transferred to planner, adopting the role of planner immediately.', call_id='call_pn7y6PKsBspWA17uOh3AKNMT')]\n", "---------- news_analyst ----------\n", "Transferred to planner, adopting the role of planner immediately.\n", "---------- planner ----------\n", - "[FunctionCall(id='call_zl0E18TZWoCPykYqG7jpR2mr', arguments='{}', name='transfer_to_writer')]\n", - "[Prompt tokens: 611, Completion tokens: 11]\n", + "[FunctionCall(id='call_MmXyWuD2uJT64ZdVI5NfhYdX', arguments='{}', name='transfer_to_writer')]\n", + "[Prompt tokens: 722, Completion tokens: 11]\n", "---------- planner ----------\n", - "[FunctionExecutionResult(content='Transferred to writer, adopting the role of writer immediately.', call_id='call_zl0E18TZWoCPykYqG7jpR2mr')]\n", + "[FunctionExecutionResult(content='Transferred to writer, adopting the role of writer immediately.', call_id='call_MmXyWuD2uJT64ZdVI5NfhYdX')]\n", "---------- planner ----------\n", "Transferred to writer, adopting the role of writer immediately.\n", "---------- writer ----------\n", - "### Market Research Report: Tesla (TSLA) Stock\n", - "\n", - "#### Stock Performance Overview\n", - "\n", - "- **Current Price**: $180.25\n", - "- **Trading Volume**: 1,000,000 shares\n", - "- **Price to Earnings (P/E) Ratio**: 65.4\n", - "- **Market Capitalization**: $700 Billion\n", - "\n", - "Tesla's stock is currently valued at $180.25 per share, with a high trading volume reflecting active investor interest. The P/E ratio of 65.4 indicates that the stock might be viewed as overvalued compared to traditional industries, but it is common for tech and innovation-driven companies. The market capitalization of $700 billion underscores Tesla’s significant presence in the automotive and technology markets.\n", - "\n", - "#### Recent News Impacting Tesla (TSLA)\n", - "\n", - "1. **Expansion of Cybertruck Production**: Tesla has increased its Cybertruck production at the Texas Gigafactory, responding to heightened demand. This expansion strategy could drive future revenues and solidify Tesla's innovative image.\n", - "\n", - "2. **Advancements in Full Self-Driving (FSD) Technology**: The latest Tesla FSD beta update highlights promising improvements. Enhanced safety and urban navigation may bolster Tesla's reputation in the autonomous vehicle domain, potentially increasing its market value.\n", - "\n", - "3. **Model Y's Global Sales Leadership**: The Model Y has emerged as the leading global electric vehicle in terms of sales. This achievement not only boosts Tesla's revenue streams but also cements its position as a leader in the EV segment.\n", - "\n", - "### Conclusion\n", - "\n", - "Tesla’s market dynamics show strong innovation and consumer interest, which reflect positively in its stock market valuation and significant news coverage. The company continues to lead in the electric vehicle market and expand its capabilities in autonomous driving, thereby potentially increasing its financial performance and market leadership.\n", - "\n", - "For further analysis or inquiries, feel free to reach out.\n", - "[Prompt tokens: 489, Completion tokens: 371]\n", - "---------- writer ----------\n", - "[FunctionCall(id='call_9buNd5ud2MTRyX50X2EjQJqp', arguments='{}', name='transfer_to_planner')]\n", - "[Prompt tokens: 865, Completion tokens: 12]\n", + "[FunctionCall(id='call_Pdgu39O6GMYplBiB8jp3uyN3', arguments='{}', name='transfer_to_planner')]\n", + "[Prompt tokens: 599, Completion tokens: 323]\n", "---------- writer ----------\n", - "[FunctionExecutionResult(content='Transferred to planner, adopting the role of planner immediately.', call_id='call_9buNd5ud2MTRyX50X2EjQJqp')]\n", + "[FunctionExecutionResult(content='Transferred to planner, adopting the role of planner immediately.', call_id='call_Pdgu39O6GMYplBiB8jp3uyN3')]\n", "---------- writer ----------\n", "Transferred to planner, adopting the role of planner immediately.\n", "---------- planner ----------\n", "TERMINATE\n", - "[Prompt tokens: 1037, Completion tokens: 4]\n", + "[Prompt tokens: 772, Completion tokens: 4]\n", "---------- Summary ----------\n", "Number of messages: 27\n", "Finish reason: Text 'TERMINATE' mentioned\n", - "Total prompt tokens: 5483\n", - "Total completion tokens: 912\n", - "Duration: 15.26 seconds\n" + "Total prompt tokens: 4130\n", + "Total completion tokens: 1102\n", + "Duration: 17.74 seconds\n" ] + }, + { + "data": { + "text/plain": [ + "TaskResult(messages=[TextMessage(source='user', models_usage=None, content='Conduct market research for TSLA stock', type='TextMessage'), ToolCallMessage(source='planner', models_usage=RequestUsage(prompt_tokens=169, completion_tokens=166), content=[FunctionCall(id='call_BX5QaRuhmB8CxTsBlqCUIXPb', arguments='{}', name='transfer_to_financial_analyst')], type='ToolCallMessage'), ToolCallResultMessage(source='planner', models_usage=None, content=[FunctionExecutionResult(content='Transferred to financial_analyst, adopting the role of financial_analyst immediately.', call_id='call_BX5QaRuhmB8CxTsBlqCUIXPb')], type='ToolCallResultMessage'), HandoffMessage(source='planner', models_usage=None, target='financial_analyst', content='Transferred to financial_analyst, adopting the role of financial_analyst immediately.', type='HandoffMessage'), ToolCallMessage(source='financial_analyst', models_usage=RequestUsage(prompt_tokens=136, completion_tokens=16), content=[FunctionCall(id='call_SAXy1ebtA9mnaZo4ztpD2xHA', arguments='{\"symbol\":\"TSLA\"}', name='get_stock_data')], type='ToolCallMessage'), ToolCallResultMessage(source='financial_analyst', models_usage=None, content=[FunctionExecutionResult(content=\"{'price': 180.25, 'volume': 1000000, 'pe_ratio': 65.4, 'market_cap': '700B'}\", call_id='call_SAXy1ebtA9mnaZo4ztpD2xHA')], type='ToolCallResultMessage'), TextMessage(source='financial_analyst', models_usage=None, content='Tool calls:\\nget_stock_data({\"symbol\":\"TSLA\"}) = {\\'price\\': 180.25, \\'volume\\': 1000000, \\'pe_ratio\\': 65.4, \\'market_cap\\': \\'700B\\'}', type='TextMessage'), ToolCallMessage(source='financial_analyst', models_usage=RequestUsage(prompt_tokens=199, completion_tokens=337), content=[FunctionCall(id='call_IsdcFUfBVmtcVzfSuwQpeAwl', arguments='{}', name='transfer_to_planner')], type='ToolCallMessage'), ToolCallResultMessage(source='financial_analyst', models_usage=None, content=[FunctionExecutionResult(content='Transferred to planner, adopting the role of planner immediately.', call_id='call_IsdcFUfBVmtcVzfSuwQpeAwl')], type='ToolCallResultMessage'), HandoffMessage(source='financial_analyst', models_usage=None, target='planner', content='Transferred to planner, adopting the role of planner immediately.', type='HandoffMessage'), ToolCallMessage(source='planner', models_usage=RequestUsage(prompt_tokens=291, completion_tokens=14), content=[FunctionCall(id='call_tN5goNFahrdcSfKnQqT0RONN', arguments='{}', name='transfer_to_news_analyst')], type='ToolCallMessage'), ToolCallResultMessage(source='planner', models_usage=None, content=[FunctionExecutionResult(content='Transferred to news_analyst, adopting the role of news_analyst immediately.', call_id='call_tN5goNFahrdcSfKnQqT0RONN')], type='ToolCallResultMessage'), HandoffMessage(source='planner', models_usage=None, target='news_analyst', content='Transferred to news_analyst, adopting the role of news_analyst immediately.', type='HandoffMessage'), ToolCallMessage(source='news_analyst', models_usage=RequestUsage(prompt_tokens=235, completion_tokens=16), content=[FunctionCall(id='call_Owjw6ZbiPdJgNWMHWxhCKgsp', arguments='{\"query\":\"Tesla market news\"}', name='get_news')], type='ToolCallMessage'), ToolCallResultMessage(source='news_analyst', models_usage=None, content=[FunctionExecutionResult(content='[{\\'title\\': \\'Tesla Expands Cybertruck Production\\', \\'date\\': \\'2024-03-20\\', \\'summary\\': \\'Tesla ramps up Cybertruck manufacturing capacity at Gigafactory Texas, aiming to meet strong demand.\\'}, {\\'title\\': \\'Tesla FSD Beta Shows Promise\\', \\'date\\': \\'2024-03-19\\', \\'summary\\': \\'Latest Full Self-Driving beta demonstrates significant improvements in urban navigation and safety features.\\'}, {\\'title\\': \\'Model Y Dominates Global EV Sales\\', \\'date\\': \\'2024-03-18\\', \\'summary\\': \"Tesla\\'s Model Y becomes best-selling electric vehicle worldwide, capturing significant market share.\"}]', call_id='call_Owjw6ZbiPdJgNWMHWxhCKgsp')], type='ToolCallResultMessage'), TextMessage(source='news_analyst', models_usage=None, content='Tool calls:\\nget_news({\"query\":\"Tesla market news\"}) = [{\\'title\\': \\'Tesla Expands Cybertruck Production\\', \\'date\\': \\'2024-03-20\\', \\'summary\\': \\'Tesla ramps up Cybertruck manufacturing capacity at Gigafactory Texas, aiming to meet strong demand.\\'}, {\\'title\\': \\'Tesla FSD Beta Shows Promise\\', \\'date\\': \\'2024-03-19\\', \\'summary\\': \\'Latest Full Self-Driving beta demonstrates significant improvements in urban navigation and safety features.\\'}, {\\'title\\': \\'Model Y Dominates Global EV Sales\\', \\'date\\': \\'2024-03-18\\', \\'summary\\': \"Tesla\\'s Model Y becomes best-selling electric vehicle worldwide, capturing significant market share.\"}]', type='TextMessage'), TextMessage(source='news_analyst', models_usage=RequestUsage(prompt_tokens=398, completion_tokens=203), content=\"Here are some of the key market insights regarding Tesla (TSLA):\\n\\n1. **Expansion in Cybertruck Production**: Tesla has increased its Cybertruck production capacity at the Gigafactory in Texas to meet the high demand. This move might positively impact Tesla's revenues if the demand for the Cybertruck continues to grow.\\n\\n2. **Advancements in Full Self-Driving (FSD) Technology**: The recent beta release of Tesla's Full Self-Driving software shows significant advancements, particularly in urban navigation and safety. Progress in this area could enhance Tesla's competitive edge in the autonomous driving sector.\\n\\n3. **Dominance of Model Y in EV Sales**: Tesla's Model Y has become the best-selling electric vehicle globally, capturing a substantial market share. Such strong sales performance reinforces Tesla's leadership in the electric vehicle market.\\n\\nThese developments reflect Tesla's ongoing innovation and ability to capture market demand, which could positively influence its stock performance and market position. \\n\\nI will now hand off back to the planner.\", type='TextMessage'), ToolCallMessage(source='news_analyst', models_usage=RequestUsage(prompt_tokens=609, completion_tokens=12), content=[FunctionCall(id='call_pn7y6PKsBspWA17uOh3AKNMT', arguments='{}', name='transfer_to_planner')], type='ToolCallMessage'), ToolCallResultMessage(source='news_analyst', models_usage=None, content=[FunctionExecutionResult(content='Transferred to planner, adopting the role of planner immediately.', call_id='call_pn7y6PKsBspWA17uOh3AKNMT')], type='ToolCallResultMessage'), HandoffMessage(source='news_analyst', models_usage=None, target='planner', content='Transferred to planner, adopting the role of planner immediately.', type='HandoffMessage'), ToolCallMessage(source='planner', models_usage=RequestUsage(prompt_tokens=722, completion_tokens=11), content=[FunctionCall(id='call_MmXyWuD2uJT64ZdVI5NfhYdX', arguments='{}', name='transfer_to_writer')], type='ToolCallMessage'), ToolCallResultMessage(source='planner', models_usage=None, content=[FunctionExecutionResult(content='Transferred to writer, adopting the role of writer immediately.', call_id='call_MmXyWuD2uJT64ZdVI5NfhYdX')], type='ToolCallResultMessage'), HandoffMessage(source='planner', models_usage=None, target='writer', content='Transferred to writer, adopting the role of writer immediately.', type='HandoffMessage'), ToolCallMessage(source='writer', models_usage=RequestUsage(prompt_tokens=599, completion_tokens=323), content=[FunctionCall(id='call_Pdgu39O6GMYplBiB8jp3uyN3', arguments='{}', name='transfer_to_planner')], type='ToolCallMessage'), ToolCallResultMessage(source='writer', models_usage=None, content=[FunctionExecutionResult(content='Transferred to planner, adopting the role of planner immediately.', call_id='call_Pdgu39O6GMYplBiB8jp3uyN3')], type='ToolCallResultMessage'), HandoffMessage(source='writer', models_usage=None, target='planner', content='Transferred to planner, adopting the role of planner immediately.', type='HandoffMessage'), TextMessage(source='planner', models_usage=RequestUsage(prompt_tokens=772, completion_tokens=4), content='TERMINATE', type='TextMessage')], stop_reason=\"Text 'TERMINATE' mentioned\")" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -548,7 +524,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.6" + "version": "3.11.5" } }, "nbformat": 4, diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/teams.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/teams.ipynb index a5599965f569..a97e521f8255 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/teams.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/teams.ipynb @@ -6,48 +6,22 @@ "source": [ "# Teams\n", "\n", - "```{include} ../warning.md\n", - "```\n", - "\n", - "In AgentChat, teams define how groups of agents collaborate to address tasks.\n", - "A team is composed of one or more agents, and interacts with your application\n", - "by receiving task and returning task result.\n", - "It is stateful and maintains context across multiple tasks.\n", - "A team uses a stateful termination condition to determine when to stop processing the\n", - "current task.\n", - "\n", - "The diagram below shows the relationship between team and your application.\n", - "\n", - "![AgentChat Teams](./agentchat-team.svg)\n", + "In this section you'll learn how to create a _multi-agent team_ (or simply team) using AutoGen. A team is a group of agents that work together to achieve a common goal.\n", "\n", - "AgentChat provides several preset teams that implements one or more [multi-agent design patterns](../../core-user-guide/design-patterns/index.md) to simplify development. Here is a list of the preset teams:\n", + "We'll first show you how to create and run a team. We'll then explain how to observe the team's behavior, which is crucial for debugging and understanding the team's performance, and common operations to control the team's behavior.\n", "\n", - "- {py:class}`~autogen_agentchat.teams.RoundRobinGroupChat`: All participants share context and takes turn to respond in a round-robin fashion. We will cover this team in this section.\n", - "- {py:class}`~autogen_agentchat.teams.SelectorGroupChat`: All participants share context and use a model-based selector (with custom override) to select the next agent to respond. See [Selector Group Chat](./selector-group-chat.ipynb) for more details.\n", - "- {py:class}`~autogen_agentchat.teams.Swarm`: All participants share context and use {py:class}`~autogen_agentchat.messages.HandoffMessage`to pass control to the next agent. See [Swarm](./swarm.ipynb) for more details.\n", - "\n", - "At a high-level, a team API consists of the following methods:\n", - "\n", - "- {py:meth}`~autogen_agentchat.base.TaskRunner.run`: Process a task, which can be a {py:class}`str`, {py:class}`~autogen_agentchat.messages.TextMessage`, {py:class}`~autogen_agentchat.messages.MultiModalMessage`, or {py:class}`~autogen_agentchat.messages.HandoffMessage`, and returns {py:class}`~autogen_agentchat.base.TaskResult`. The task can also be `None` to resume processing the previous task if the team has not been reset.\n", - "- {py:meth}`~autogen_agentchat.base.TaskRunner.run_stream`: Similar to {py:meth}`~autogen_agentchat.base.TaskRunner.run`, but it returns an async generator of messages and the final task result.\n", - "- {py:meth}`~autogen_agentchat.base.Team.reset`: To reset the team state if the next task is not related to the previous task. Otherwise, the team can utilize the context from the previous task to process the next one.\n", - "\n", - "In this section, we will be using the\n", - "{py:class}`~autogen_agentchat.teams.RoundRobinGroupChat` team to introduce the AgentChat team API." + "We'll start by focusing on a simple team with consisting of a single agent (the baseline case) and use a round robin strategy to select the agent to act. We'll then show how to create a team with multiple agents and how to implement a more sophisticated strategy to select the agent to act." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Round-Robin Group Chat\n", + "## Creating a Team\n", "\n", - "{py:class}`~autogen_agentchat.teams.RoundRobinGroupChat` is a simple team that allows all agents to share context and take turns to respond in a round-robin fashion.\n", - "On its turn, each agent broadcasts its response to all other agents in the team, so all agents have the same context.\n", + "{py:class}`~autogen_agentchat.teams.RoundRobinGroupChat` is a simple yet effective team configuration where all agents share the same context and take turns responding in a round-robin fashion. Each agent, during its turn, broadcasts its response to all other agents, ensuring that the entire team maintains a consistent context.\n", "\n", - "We will start by creating a team with a single {py:class}`~autogen_agentchat.agents.AssistantAgent` agent\n", - "and {py:class}`~autogen_agentchat.conditions.TextMentionTermination`\n", - "termination condition that stops the team when a word is detected." + "We will begin by creating a team with a single {py:class}`~autogen_agentchat.agents.AssistantAgent` and a {py:class}`~autogen_agentchat.conditions.TextMentionTermination` condition that stops the team when a specific word is detected in the agent's response.\n" ] }, { @@ -59,7 +33,7 @@ "from autogen_agentchat.agents import AssistantAgent\n", "from autogen_agentchat.conditions import TextMentionTermination\n", "from autogen_agentchat.teams import RoundRobinGroupChat\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "# Create an OpenAI model client.\n", "model_client = OpenAIChatCompletionClient(\n", @@ -93,7 +67,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Running Team\n", + "## Running a Team\n", "\n", "Let's calls the {py:meth}`~autogen_agentchat.teams.BaseGroupChat.run` method\n", "to start the team with a task." @@ -136,45 +110,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Reseting Team\n", + "## Observability\n", "\n", - "You can reset the team by calling the {py:meth}`~autogen_agentchat.teams.BaseGroupChat.reset` method.\n", - "It will clear the team's state including all of its agents'." + "Similar to the agent's {py:meth}`~autogen_agentchat.agents.BaseChatAgent.on_messages_stream` method, you can stream the team's messages by calling the {py:meth}`~autogen_agentchat.teams.BaseGroupChat.run_stream` method. This method returns a generator that yields messages produced by the agents in the team as they are generated, with the final item being the task result.\n" ] }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "await single_agent_team.reset() # Reset the team for the next run." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is usually a good idea to reset the team if the next task is not related to the previous task.\n", - "However, if the next task is related to the previous task, you don't need to reset.\n", - "See [Resuming Team](#resuming-team) below." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Streaming Team Messages\n", - "\n", - "Similar to agent's {py:meth}`~autogen_agentchat.agents.BaseChatAgent.on_messages_stream` method,\n", - "you can stream the team's messages by calling the {py:meth}`~autogen_agentchat.teams.BaseGroupChat.run_stream` method.\n", - "It will return a generator that yields the messages produced by the agents in the team as they are generated,\n", - "and the last item will be the task result." - ] - }, - { - "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -210,10 +153,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As the above example shows, you can obtain the reason why the team stopped by checking the {py:attr}`~autogen_agentchat.base.TaskResult.stop_reason` attribute.\n", + "As demonstrated in the example above, you can determine the reason why the team stopped by checking the {py:attr}`~autogen_agentchat.base.TaskResult.stop_reason` attribute.\n", "\n", - "There is a covenient method {py:meth}`~autogen_agentchat.ui.Console` that prints the messages to the console\n", - "with proper formatting." + "The {py:meth}`~autogen_agentchat.ui.Console` method provides a convenient way to print messages to the console with proper formatting.\n" ] }, { @@ -258,23 +200,54 @@ ") # Stream the messages to the console." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Resetting a Team\n", + "\n", + "You can reset the team by calling the {py:meth}`~autogen_agentchat.teams.BaseGroupChat.reset` method. This method will clear the team's state, including all agents." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "await single_agent_team.reset() # Reset the team for the next run." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is usually a good idea to reset the team if the next task is not related to the previous task.\n", + "However, if the next task is related to the previous task, you don't need to reset and you can instead resume. We will cover this in the next section." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Team Usage Guide\n", + "\n", + "We will now implement a slightly more complex team with multiple agents and learn how to resume the team after stopping it and even involve the user in the conversation.\n", + "\n" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Reflection Pattern\n", "\n", - "Now we will create a team with two agents that implements the\n", - "Reflection pattern, which is a multi-agent design pattern that uses\n", - "a critic agent to evaluate the responses of a primary agent.\n", + "We will now create a team with two agents that implement the _reflection_ pattern, a multi-agent design pattern where a critic agent evaluates the responses of a primary agent.\n", "\n", - "See how the reflection pattern works using the [Core API](../../core-user-guide/design-patterns/reflection.ipynb).\n", + "Learn more about the reflection pattern using the [Core API](../../core-user-guide/design-patterns/reflection.ipynb).\n", "\n", - "In this example, we will use the {py:class}`~autogen_agentchat.agents.AssistantAgent` agent class\n", - "for both the primary and critic agents.\n", - "We will use both the {py:class}`~autogen_agentchat.conditions.TextMentionTermination`\n", - "and {py:class}`~autogen_agentchat.conditions.MaxMessageTermination` termination conditions\n", - "together to stop the team." + "In this example, we will use the {py:class}`~autogen_agentchat.agents.AssistantAgent` class for both the primary and critic agents. We will combine the {py:class}`~autogen_agentchat.conditions.TextMentionTermination` and {py:class}`~autogen_agentchat.conditions.MaxMessageTermination` conditions to stop the team.\n" ] }, { @@ -287,7 +260,7 @@ "from autogen_agentchat.conditions import MaxMessageTermination, TextMentionTermination\n", "from autogen_agentchat.teams import RoundRobinGroupChat\n", "from autogen_agentchat.ui import Console\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "# Create an OpenAI model client.\n", "model_client = OpenAIChatCompletionClient(\n", @@ -418,7 +391,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Resuming Team\n", + "### Resuming a Team\n", "\n", "Let's run the team again with a new task while keeping the context about the previous task." ] @@ -552,7 +525,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Resuming A Previous Task\n", + "### Resuming a Previous Task\n", "\n", "We can call {py:meth}`~autogen_agentchat.teams.BaseGroupChat.run` or {py:meth}`~autogen_agentchat.teams.BaseGroupChat.run_stream` methods\n", "without setting the `task` again to resume the previous task. The team will continue from where it left off." @@ -600,29 +573,25 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Pause for User Input\n", + "### Pausing for User Input\n", "\n", - "Often times, team needs additional input from the application (i.e., user)\n", - "to continue processing the task. We will show two possible ways to do it:\n", + "Sometimes, teams may require additional input from the application (e.g., the user) to continue making meaningful progress on a task. Here are two ways to achieve this:\n", "\n", - "- Set the maximum number of turns such that the team stops after the specified number of turns.\n", + "- Set the maximum number of turns so that the team stops after the specified number of turns.\n", "- Use the {py:class}`~autogen_agentchat.conditions.HandoffTermination` termination condition.\n", "\n", - "You can also use custom termination conditions, see [Termination Conditions](./termination.ipynb)." + "You can also create custom termination conditions. For more details, see [Termination Conditions](./termination.ipynb).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### Maximum Number of Turns\n", + "#### Via Max Turns\n", "\n", - "This is the simplest way to pause the team for user input. For example,\n", - "you can set the maximum number of turns to 1 such that the team stops right\n", - "after the first agent responds. This is useful when you want the user\n", - "to constantly engage with the team, such as in a chatbot scenario.\n", + "This method allows you to pause the team for user input by setting a maximum number of turns. For instance, you can configure the team to stop after the first agent responds by setting `max_turns` to 1. This is particularly useful in scenarios where continuous user engagement is required, such as in a chatbot.\n", "\n", - "Simply set the `max_turns` parameter in the {py:meth}`~autogen_agentchat.teams.RoundRobinGroupChat` constructor.\n", + "To implement this, set the `max_turns` parameter in the {py:meth}`~autogen_agentchat.teams.RoundRobinGroupChat` constructor.\n", "\n", "```python\n", "team = RoundRobinGroupChat([...], max_turns=1)\n", @@ -640,7 +609,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Using Handoff to Pause Team\n", + "#### Via Handoff\n", "\n", "You can use the {py:class}`~autogen_agentchat.conditions.HandoffTermination` termination condition\n", "to stop the team when an agent sends a {py:class}`~autogen_agentchat.messages.HandoffMessage` message.\n", @@ -649,7 +618,7 @@ "with a handoff setting.\n", "\n", "```{note}\n", - "The model used with {py:class}`~autogen_agentchat.agents.AssistantAgent`must support tool call\n", + "The model used with {py:class}`~autogen_agentchat.agents.AssistantAgent` must support tool call\n", "to use the handoff feature.\n", "```" ] @@ -664,7 +633,7 @@ "from autogen_agentchat.base import Handoff\n", "from autogen_agentchat.conditions import HandoffTermination, TextMentionTermination\n", "from autogen_agentchat.teams import RoundRobinGroupChat\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "# Create an OpenAI model client.\n", "model_client = OpenAIChatCompletionClient(\n", @@ -787,9 +756,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.6" + "version": "3.11.5" } }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/termination.ipynb b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/termination.ipynb index 683a9a8ac09b..a115df68b18d 100644 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/termination.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/tutorial/termination.ipynb @@ -30,7 +30,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# AutoGen provides several built-in termination conditions: \n", + "Built-In Termination Conditions: \n", "1. {py:class}`~autogen_agentchat.conditions.MaxMessageTermination`: Stops after a specified number of messages have been produced, including both agent and task messages.\n", "2. {py:class}`~autogen_agentchat.conditions.TextMentionTermination`: Stops when specific text or string is mentioned in a message (e.g., \"TERMINATE\").\n", "3. {py:class}`~autogen_agentchat.conditions.TokenUsageTermination`: Stops when a certain number of prompt or completion tokens are used. This requires the agents to report token usage in their messages.\n", @@ -58,7 +58,7 @@ "from autogen_agentchat.conditions import MaxMessageTermination, TextMentionTermination\n", "from autogen_agentchat.teams import RoundRobinGroupChat\n", "from autogen_agentchat.ui import Console\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "model_client = OpenAIChatCompletionClient(\n", " model=\"gpt-4o\",\n", @@ -296,7 +296,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.6" + "version": "3.11.5" } }, "nbformat": 4, diff --git a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/warning.md b/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/warning.md deleted file mode 100644 index 102d9282ce2e..000000000000 --- a/python/packages/autogen-core/docs/src/user-guide/agentchat-user-guide/warning.md +++ /dev/null @@ -1,5 +0,0 @@ -```{warning} - -AgentChat is Work in Progress. APIs may change in future releases. - -``` diff --git a/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/faq.md b/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/faq.md new file mode 100644 index 000000000000..fe79af94180d --- /dev/null +++ b/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/faq.md @@ -0,0 +1,124 @@ +--- +myst: + html_meta: + "description lang=en": | + FAQ for AutoGen Studio - A low code tool for building and debugging multi-agent systems +--- + +# FAQ + +## Q: How do I specify the directory where files(e.g. database) are stored? + +A: You can specify the directory where files are stored by setting the `--appdir` argument when running the application. For example, `autogenstudio ui --appdir /path/to/folder`. This will store the database (default) and other files in the specified directory e.g. `/path/to/folder/database.sqlite`. + +## Q: Can I use other models with AutoGen Studio? + +Yes. AutoGen standardizes on the openai model api format, and you can use any api server that offers an openai compliant endpoint. + +AutoGen Studio is based on declaritive specifications which applies to models as well. Agents can include a model_client field which specifies the model endpoint details including `model`, `api_key`, `base_url`, `model type`. + +An example of the openai model client is shown below: + +```json +{ + "model": "gpt-4o-mini", + "model_type": "OpenAIChatCompletionClient", + "api_key": "your-api-key" +} +``` + +An example of the azure openai model client is shown below: + +```json +{ + "model": "gpt-4o-mini", + "model_type": "AzureOpenAIChatCompletionClient", + "azure_deployment": "gpt-4o-mini", + "api_version": "2024-02-15-preview", + "azure_endpoint": "https://your-endpoint.openai.azure.com/", + "api_key": "your-api-key", + "component_type": "model" +} +``` + +Have a local model server like Ollama, vLLM or LMStudio that provide an OpenAI compliant endpoint? You can use that as well. + +```json +{ + "model": "TheBloke/Mistral-7B-Instruct-v0.2-GGUF", + "model_type": "OpenAIChatCompletionClient", + "base_url": "http://localhost:1234/v1", + "api_version": "1.0", + "component_type": "model", + "model_capabilities": { + "vision": false, + "function_calling": false, + "json_output": false + } +} +``` + +```{caution} +It is important that you add the `model_capabilities` field to the model client specification for custom models. This is used by the framework instantiate and use the model correctly. +``` + +## Q: The server starts but I can't access the UI + +A: If you are running the server on a remote machine (or a local machine that fails to resolve localhost correctly), you may need to specify the host address. By default, the host address is set to `localhost`. You can specify the host address using the `--host ` argument. For example, to start the server on port 8081 and local address such that it is accessible from other machines on the network, you can run the following command: + +```bash +autogenstudio ui --port 8081 --host 0.0.0.0 +``` + +## Q: Can I export my agent workflows for use in a python app? + +Yes. In the Team Builder view, you select a team and download its specification. This file can be imported in a python application using the `TeamManager` class. For example: + +```python + +from autogenstudio.teammanager import TeamManager + +tm = TeamManager() +result_stream = tm.run(task="What is the weather in New York?", team_config="team.json") # or wm.run_stream(..) + +``` + + + +## Q: Can I run AutoGen Studio in a Docker container? + +A: Yes, you can run AutoGen Studio in a Docker container. You can build the Docker image using the provided [Dockerfile](https://github.com/microsoft/autogen/blob/autogenstudio/samples/apps/autogen-studio/Dockerfile) and run the container using the following commands: + +```bash +FROM python:3.10 + +WORKDIR /code + +RUN pip install -U gunicorn autogenstudio + +RUN useradd -m -u 1000 user +USER user +ENV HOME=/home/user \ + PATH=/home/user/.local/bin:$PATH \ + AUTOGENSTUDIO_APPDIR=/home/user/app + +WORKDIR $HOME/app + +COPY --chown=user . $HOME/app + +CMD gunicorn -w $((2 * $(getconf _NPROCESSORS_ONLN) + 1)) --timeout 12600 -k uvicorn.workers.UvicornWorker autogenstudio.web.app:app --bind "0.0.0.0:8081" +``` + +Using Gunicorn as the application server for improved performance is recommended. To run AutoGen Studio with Gunicorn, you can use the following command: + +```bash +gunicorn -w $((2 * $(getconf _NPROCESSORS_ONLN) + 1)) --timeout 12600 -k uvicorn.workers.UvicornWorker autogenstudio.web.app:app --bind +``` diff --git a/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/index.md b/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/index.md new file mode 100644 index 000000000000..4582657bc24e --- /dev/null +++ b/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/index.md @@ -0,0 +1,111 @@ +--- +myst: + html_meta: + "description lang=en": | + User Guide for AutoGen Studio - A low code tool for building and debugging multi-agent systems +--- + +# AutoGen Studio + +[![PyPI version](https://badge.fury.io/py/autogenstudio.svg)](https://badge.fury.io/py/autogenstudio) +[![Downloads](https://static.pepy.tech/badge/autogenstudio/week)](https://pepy.tech/project/autogenstudio) + +AutoGen Studio is a low-code interface built to help you rapidly prototype AI agents, enhance them with tools, compose them into teams and interact with them to accomplish tasks. It is built on [AutoGen AgentChat](https://microsoft.github.io/autogen) - a high-level API for building multi-agent applications. + +![AutoGen Studio](https://media.githubusercontent.com/media/microsoft/autogen/refs/heads/main/python/packages/autogen-studio/docs/ags_screen.png) + +Code for AutoGen Studio is on GitHub at [microsoft/autogen](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-studio) + +```{caution} +AutoGen Studio is meant to help you rapidly prototype multi-agent workflows and demonstrate an example of end user interfaces built with AutoGen. It is not meant to be a production-ready app. Developers are encouraged to use the AutoGen framework to build their own applications, implementing authentication, security and other features required for deployed applications. +``` + +## Capabilities - What Can You Do with AutoGen Studio? + +AutoGen Studio offers four main interfaces to help you build and manage multi-agent systems: + +1. **Team Builder** + + - A visual interface for creating agent teams through declarative specification (JSON) or drag-and-drop + - Supports configuration of all core components: teams, agents, tools, models, and termination conditions + - Fully compatible with AgentChat's component definitions + +2. **Playground** + + - Interactive environment for testing and running agent teams + - Features include: + - Live message streaming between agents + - Visual representation of message flow through a control transition graph + - Interactive sessions with teams using UserProxyAgent + - Full run control with the ability to pause or stop execution + +3. **Gallery** + + - Central hub for discovering and importing community-created components + - Enables easy integration of third-party components + +4. **Deployment** + - Export and run teams in python code + - Setup and test endpoints based on a team configuration + - Run teams in a docker container + +This revision improves clarity by: + +- Organizing capabilities into clearly numbered sections +- Using more precise language +- Breaking down complex features into digestible points +- Maintaining consistent formatting and structure +- Eliminating awkward phrasing and grammatical issues +- Adding context about how each interface serves users + +### Roadmap + +Review project roadmap and issues [here](https://github.com/microsoft/autogen/issues/4006) . + +## Contribution Guide + +We welcome contributions to AutoGen Studio. We recommend the following general steps to contribute to the project: + +- Review the overall AutoGen project [contribution guide](https://github.com/microsoft/autogen/blob/main/CONTRIBUTING.md) +- Please review the AutoGen Studio [roadmap](https://github.com/microsoft/autogen/issues/4006) to get a sense of the current priorities for the project. Help is appreciated especially with Studio issues tagged with `help-wanted` +- Please use the tag [`proj-studio`](https://github.com/microsoft/autogen/issues?q=is%3Aissue%20state%3Aopen%20label%3Aproj-studio) tag for any issues, questions, and PRs related to Studio +- Please initiate a discussion on the roadmap issue or a new issue to discuss your proposed contribution. +- Submit a pull request with your contribution! +- If you are modifying AutoGen Studio, it has its own devcontainer. See instructions in `.devcontainer/README.md` to use it + +## A Note on Security + +AutoGen Studio is a research prototype and is **not meant to be used** in a production environment. Some baseline practices are encouraged e.g., using Docker code execution environment for your agents. + +However, other considerations such as rigorous tests related to jailbreaking, ensuring LLMs only have access to the right keys of data given the end user's permissions, and other security features are not implemented in AutoGen Studio. + +If you are building a production application, please use the AutoGen framework and implement the necessary security features. + +## Acknowledgements and Citation + +AutoGen Studio is based on the [AutoGen](https://microsoft.github.io/autogen) project. It was adapted from a research prototype built in October 2023 (original credits: Victor Dibia, Gagan Bansal, Adam Fourney, Piali Choudhury, Saleema Amershi, Ahmed Awadallah, Chi Wang). + +If you use AutoGen Studio in your research, please cite the following paper: + +``` +@inproceedings{autogenstudio, + title={AUTOGEN STUDIO: A No-Code Developer Tool for Building and Debugging Multi-Agent Systems}, + author={Dibia, Victor and Chen, Jingya and Bansal, Gagan and Syed, Suff and Fourney, Adam and Zhu, Erkang and Wang, Chi and Amershi, Saleema}, + booktitle={Proceedings of the 2024 Conference on Empirical Methods in Natural Language Processing: System Demonstrations}, + pages={72--79}, + year={2024} +} +``` + +## Next Steps + +To begin, follow the [installation instructions](installation.md) to install AutoGen Studio. + +```{toctree} +:maxdepth: 1 +:hidden: + +installation +usage +faq +``` diff --git a/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/installation.md b/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/installation.md new file mode 100644 index 000000000000..2ebc167213d2 --- /dev/null +++ b/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/installation.md @@ -0,0 +1,69 @@ +--- +myst: + html_meta: + "description lang=en": | + User Guide for AutoGen Studio - A low code tool for building and debugging multi-agent systems +--- + +# Installation + +There are two ways to install AutoGen Studio - from PyPi or from source. We **recommend installing from PyPi** unless you plan to modify the source code. + +1. **Install from PyPi** + + We recommend using a virtual environment (e.g., conda) to avoid conflicts with existing Python packages. With Python 3.10 or newer active in your virtual environment, use pip to install AutoGen Studio: + + ```bash + pip install -U autogenstudio + ``` + +2. **Install from Source** + + > Note: This approach requires some familiarity with building interfaces in React. + + If you prefer to install from source, ensure you have Python 3.10+ and Node.js (version above 14.15.0) installed. Here's how you get started: + + - Clone the AutoGen Studio repository and install its Python dependencies: + + ```bash + pip install -e . + ``` + + - Navigate to the `samples/apps/autogen-studio/frontend` directory, install dependencies, and build the UI: + + ```bash + npm install -g gatsby-cli + npm install --global yarn + cd frontend + yarn install + yarn build + ``` + +For Windows users, to build the frontend, you may need alternative commands to build the frontend. + +```bash + + gatsby clean && rmdir /s /q ..\\autogenstudio\\web\\ui 2>nul & (set \"PREFIX_PATH_VALUE=\" || ver>nul) && gatsby build --prefix-paths && xcopy /E /I /Y public ..\\autogenstudio\\web\\ui + +``` + +### Running the Application + +Once installed, run the web UI by entering the following in a terminal: + +```bash +autogenstudio ui --port 8081 --appdir /path/to/folder +``` + +This will start the application on the specified port. Open your web browser and go to `http://localhost:8081/` to begin using AutoGen Studio. + +AutoGen Studio also takes several parameters to customize the application: + +- `--host ` argument to specify the host address. By default, it is set to `localhost`. +- `--appdir ` argument to specify the directory where the app files (e.g., database and generated user files) are stored. By default, it is set to the a `.autogenstudio` directory in the user's home directory. +- `--port ` argument to specify the port number. By default, it is set to `8080`. +- `--upgrade-database` argument to upgrade the database schema (assuming there are changes in the version you are installing). By default, it is set to `False`. +- `--reload` argument to enable auto-reloading of the server when changes are made to the code. By default, it is set to `False`. +- `--database-uri` argument to specify the database URI. Example values include `sqlite:///database.sqlite` for SQLite and `postgresql+psycopg://user:password@localhost/dbname` for PostgreSQL. If this is not specified, the database URI defaults to a `database.sqlite` file in the `--appdir` directory. + +Now that you have AutoGen Studio installed and running, you are ready to explore its capabilities, including defining and modifying agent workflows, interacting with agents and sessions, and expanding agent skills. diff --git a/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/usage.md b/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/usage.md new file mode 100644 index 000000000000..12a409e157df --- /dev/null +++ b/python/packages/autogen-core/docs/src/user-guide/autogenstudio-user-guide/usage.md @@ -0,0 +1,57 @@ +--- +myst: + html_meta: + "description lang=en": | + Usage for AutoGen Studio - A low code tool for building and debugging multi-agent systems +--- + +# Usage + +The expected usage behavior is that developers use the provided Team Builder interface to to define teams - create agents, attach tools and models to agents, and define termination conditions. Once the team is defined, users can run the team in the Playground to interact with the team to accomplish tasks. + +![AutoGen Studio](https://media.githubusercontent.com/media/microsoft/autogen/refs/heads/main/python/packages/autogen-studio/docs/ags_screen.png) + +## Building an Agent Team + +AutoGen Studio is tied very closely with all of the component abstractions provided by AutoGen AgentChat. This includes - {py:class}`~autogen_agentchat.teams`, {py:class}`~autogen_agentchat.agents`, {py:class}`~autogen_core.models`, {py:class}`~autogen_core.tools`, termination {py:class}`~autogen_agentchat.conditions`. + +Users can define these components in the Team Builder interface either via a declarative specification or by dragging and dropping components from a component library. + +## Interactively Running Teams + +AutoGen Studio Playground allows users to interactively test teams on tasks and review resulting artifacts (such as images, code, and text). + +Users can also review the “inner monologue” of team as they address tasks, and view profiling information such as costs associated with the run (such as number of turns, number of tokens etc.), and agent actions (such as whether tools were called and the outcomes of code execution). + +## Importing and Reusing Team Configurations + +AutoGen Studio provides a Gallery view which provides a built-in default gallery. A Gallery is simply is a collection of components - teams, agents, models tools etc. Furthermore, users can import components from 3rd party community sources either by providing a URL to a JSON Gallery spec or pasting in the gallery JSON. This allows users to reuse and share team configurations with others. + +- Gallery -> New Gallery -> Import +- Set as default gallery (in side bar, by clicking pin icon) +- Reuse components in Team Builder. Team Builder -> Sidebar -> From Gallery + +### Using AutoGen Studio Teams in a Python Application + +An exported team can be easily integrated into any Python application using the `TeamManager` class with just two lines of code. Underneath, the `TeamManager` rehydrates the team specification into AutoGen AgentChat agents that are subsequently used to address tasks. + +```python + +from autogenstudio.teammanager import TeamManager + +tm = TeamManager() +result_stream = tm.run(task="What is the weather in New York?", team_config="team.json") # or wm.run_stream(..) + +``` + +To export a team configuration, click on the export button in the Team Builder interface. This will generate a JSON file that can be used to rehydrate the team in a Python application. + + diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/azure-openai-with-aad-auth.md b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/azure-openai-with-aad-auth.md index b347ed7de251..4ad6d35a3478 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/azure-openai-with-aad-auth.md +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/azure-openai-with-aad-auth.md @@ -15,7 +15,7 @@ pip install azure-identity ## Using the Model Client ```python -from autogen_ext.models import AzureOpenAIChatCompletionClient +from autogen_ext.models.openai import AzureOpenAIChatCompletionClient from azure.identity import DefaultAzureCredential, get_bearer_token_provider # Create the token provider diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/local-llms-ollama-litellm.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/local-llms-ollama-litellm.ipynb index ea248500b90c..400985577698 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/local-llms-ollama-litellm.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/local-llms-ollama-litellm.ipynb @@ -15,10 +15,10 @@ "```\n", "curl -fsSL https://ollama.com/install.sh | sh\n", "\n", - "ollama pull llama3:instruct\n", + "ollama pull llama3.2:1b\n", "\n", "pip install 'litellm[proxy]'\n", - "litellm --model ollama/llama3:instruct\n", + "litellm --model ollama/llama3.2:1b\n", "``` \n", "\n", "This will run the proxy server and it will be available at 'http://0.0.0.0:4000/'." @@ -48,14 +48,14 @@ " default_subscription,\n", " message_handler,\n", ")\n", - "from autogen_core.components.model_context import BufferedChatCompletionContext\n", - "from autogen_core.components.models import (\n", + "from autogen_core.model_context import BufferedChatCompletionContext\n", + "from autogen_core.models import (\n", " AssistantMessage,\n", " ChatCompletionClient,\n", " SystemMessage,\n", " UserMessage,\n", ")\n", - "from autogen_ext.models import OpenAIChatCompletionClient" + "from autogen_ext.models.openai import OpenAIChatCompletionClient" ] }, { @@ -74,9 +74,14 @@ "def get_model_client() -> OpenAIChatCompletionClient: # type: ignore\n", " \"Mimic OpenAI API using Local LLM Server.\"\n", " return OpenAIChatCompletionClient(\n", - " model=\"gpt-4o\", # Need to use one of the OpenAI models as a placeholder for now.\n", + " model=\"llama3.2:1b\",\n", " api_key=\"NotRequiredSinceWeAreLocal\",\n", " base_url=\"http://0.0.0.0:4000\",\n", + " model_capabilities={\n", + " \"json_output\": False,\n", + " \"vision\": False,\n", + " \"function_calling\": True,\n", + " },\n", " )" ] }, @@ -225,7 +230,7 @@ ], "metadata": { "kernelspec": { - "display_name": "pyautogen", + "display_name": ".venv", "language": "python", "name": "python3" }, diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/structured-output-agent.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/structured-output-agent.ipynb index 95edbfa0c257..2a6fcc432fbb 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/structured-output-agent.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/structured-output-agent.ipynb @@ -65,8 +65,8 @@ "import os\n", "from typing import Optional\n", "\n", - "from autogen_core.components.models import UserMessage\n", - "from autogen_ext.models import AzureOpenAIChatCompletionClient\n", + "from autogen_core.models import UserMessage\n", + "from autogen_ext.models.openai import AzureOpenAIChatCompletionClient\n", "\n", "\n", "# Function to get environment variable and ensure it is not None\n", diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/tool-use-with-intervention.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/tool-use-with-intervention.ipynb index 4db35e70d055..27f9bfc6a1e0 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/tool-use-with-intervention.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/tool-use-with-intervention.ipynb @@ -29,16 +29,16 @@ " message_handler,\n", ")\n", "from autogen_core.base.intervention import DefaultInterventionHandler, DropMessage\n", - "from autogen_core.components.models import (\n", + "from autogen_core.models import (\n", " ChatCompletionClient,\n", " LLMMessage,\n", " SystemMessage,\n", " UserMessage,\n", ")\n", - "from autogen_core.components.tools import PythonCodeExecutionTool, ToolSchema\n", "from autogen_core.tool_agent import ToolAgent, ToolException, tool_agent_caller_loop\n", + "from autogen_core.tools import PythonCodeExecutionTool, ToolSchema\n", "from autogen_ext.code_executors.docker import DockerCommandLineCodeExecutor\n", - "from autogen_ext.models import OpenAIChatCompletionClient" + "from autogen_ext.models.openai import OpenAIChatCompletionClient" ] }, { @@ -64,7 +64,7 @@ "metadata": {}, "source": [ "Let's create a simple tool use agent that is capable of using tools through a\n", - "{py:class}`~autogen_core.components.tool_agent.ToolAgent`." + "{py:class}`~autogen_core.tool_agent.ToolAgent`." ] }, { @@ -165,7 +165,7 @@ "First, we create a Docker-based command-line code executor\n", "using {py:class}`~autogen_ext.code_executors.docker.DockerCommandLineCodeExecutor`,\n", "and then use it to instantiate a built-in Python code execution tool\n", - "{py:class}`~autogen_core.components.tools.PythonCodeExecutionTool`\n", + "{py:class}`~autogen_core.tools.PythonCodeExecutionTool`\n", "that runs code in a Docker container." ] }, diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/topic-subscription-scenarios.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/topic-subscription-scenarios.ipynb index 6a09277b33c3..7f16ec524b05 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/topic-subscription-scenarios.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/cookbook/topic-subscription-scenarios.ipynb @@ -54,7 +54,7 @@ ")\n", "from autogen_core._default_subscription import DefaultSubscription\n", "from autogen_core._default_topic import DefaultTopicId\n", - "from autogen_core.components.models import (\n", + "from autogen_core.models import (\n", " SystemMessage,\n", ")" ] diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/code-execution-groupchat.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/code-execution-groupchat.ipynb new file mode 100644 index 000000000000..6daa85207aac --- /dev/null +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/code-execution-groupchat.ipynb @@ -0,0 +1,333 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Code Execution\n", + "\n", + "In this section we explore creating custom agents to handle code generation and execution. These tasks can be handled using the provided Agent implementations found here {py:meth}`~autogen_agentchat.agents.AssistantAgent`, {py:meth}`~autogen_agentchat.agents.CodeExecutorAgent`; but this guide will show you how to implement custom, lightweight agents that can replace their functionality. This simple example implements two agents that create a plot of Tesla's and Nvidia's stock returns.\n", + "\n", + "We first define the agent classes and their respective procedures for \n", + "handling messages.\n", + "We create two agent classes: `Assistant` and `Executor`. The `Assistant`\n", + "agent writes code and the `Executor` agent executes the code.\n", + "We also create a `Message` data class, which defines the messages that are passed between\n", + "the agents.\n", + "\n", + "```{attention}\n", + "Code generated in this example is run within a [Docker](https://www.docker.com/) container. Please ensure Docker is [installed](https://docs.docker.com/get-started/get-docker/) and running prior to running the example. Local code execution is available ({py:class}`~autogen_ext.code_executors.local.LocalCommandLineCodeExecutor`) but is not recommended due to the risk of running LLM generated code in your local environment.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "from dataclasses import dataclass\n", + "from typing import List\n", + "\n", + "from autogen_core import DefaultTopicId, MessageContext, RoutedAgent, default_subscription, message_handler\n", + "from autogen_core.code_executor import CodeBlock, CodeExecutor\n", + "from autogen_core.models import (\n", + " AssistantMessage,\n", + " ChatCompletionClient,\n", + " LLMMessage,\n", + " SystemMessage,\n", + " UserMessage,\n", + ")\n", + "\n", + "\n", + "@dataclass\n", + "class Message:\n", + " content: str\n", + "\n", + "\n", + "@default_subscription\n", + "class Assistant(RoutedAgent):\n", + " def __init__(self, model_client: ChatCompletionClient) -> None:\n", + " super().__init__(\"An assistant agent.\")\n", + " self._model_client = model_client\n", + " self._chat_history: List[LLMMessage] = [\n", + " SystemMessage(\n", + " content=\"\"\"Write Python script in markdown block, and it will be executed.\n", + "Always save figures to file in the current directory. Do not use plt.show(). All code required to complete this task must be contained within a single response.\"\"\",\n", + " )\n", + " ]\n", + "\n", + " @message_handler\n", + " async def handle_message(self, message: Message, ctx: MessageContext) -> None:\n", + " self._chat_history.append(UserMessage(content=message.content, source=\"user\"))\n", + " result = await self._model_client.create(self._chat_history)\n", + " print(f\"\\n{'-'*80}\\nAssistant:\\n{result.content}\")\n", + " self._chat_history.append(AssistantMessage(content=result.content, source=\"assistant\")) # type: ignore\n", + " await self.publish_message(Message(content=result.content), DefaultTopicId()) # type: ignore\n", + "\n", + "\n", + "def extract_markdown_code_blocks(markdown_text: str) -> List[CodeBlock]:\n", + " pattern = re.compile(r\"```(?:\\s*([\\w\\+\\-]+))?\\n([\\s\\S]*?)```\")\n", + " matches = pattern.findall(markdown_text)\n", + " code_blocks: List[CodeBlock] = []\n", + " for match in matches:\n", + " language = match[0].strip() if match[0] else \"\"\n", + " code_content = match[1]\n", + " code_blocks.append(CodeBlock(code=code_content, language=language))\n", + " return code_blocks\n", + "\n", + "\n", + "@default_subscription\n", + "class Executor(RoutedAgent):\n", + " def __init__(self, code_executor: CodeExecutor) -> None:\n", + " super().__init__(\"An executor agent.\")\n", + " self._code_executor = code_executor\n", + "\n", + " @message_handler\n", + " async def handle_message(self, message: Message, ctx: MessageContext) -> None:\n", + " code_blocks = extract_markdown_code_blocks(message.content)\n", + " if code_blocks:\n", + " result = await self._code_executor.execute_code_blocks(\n", + " code_blocks, cancellation_token=ctx.cancellation_token\n", + " )\n", + " print(f\"\\n{'-'*80}\\nExecutor:\\n{result.output}\")\n", + " await self.publish_message(Message(content=result.output), DefaultTopicId())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You might have already noticed, the agents' logic, whether it is using model or code executor,\n", + "is completely decoupled from\n", + "how messages are delivered. This is the core idea: the framework provides\n", + "a communication infrastructure, and the agents are responsible for their own\n", + "logic. We call the communication infrastructure an **Agent Runtime**.\n", + "\n", + "Agent runtime is a key concept of this framework. Besides delivering messages,\n", + "it also manages agents' lifecycle. \n", + "So the creation of agents are handled by the runtime.\n", + "\n", + "The following code shows how to register and run the agents using \n", + "{py:class}`~autogen_core.SingleThreadedAgentRuntime`,\n", + "a local embedded agent runtime implementation.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--------------------------------------------------------------------------------\n", + "Assistant:\n", + "```python\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import yfinance as yf\n", + "\n", + "# Define the ticker symbols for NVIDIA and Tesla\n", + "tickers = ['NVDA', 'TSLA']\n", + "\n", + "# Download the stock data from Yahoo Finance starting from 2024-01-01\n", + "start_date = '2024-01-01'\n", + "end_date = pd.to_datetime('today').strftime('%Y-%m-%d')\n", + "\n", + "# Download the adjusted closing prices\n", + "stock_data = yf.download(tickers, start=start_date, end=end_date)['Adj Close']\n", + "\n", + "# Calculate the daily returns\n", + "returns = stock_data.pct_change().dropna()\n", + "\n", + "# Plot the cumulative returns for each stock\n", + "cumulative_returns = (1 + returns).cumprod()\n", + "\n", + "plt.figure(figsize=(10, 6))\n", + "plt.plot(cumulative_returns.index, cumulative_returns['NVDA'], label='NVIDIA', color='green')\n", + "plt.plot(cumulative_returns.index, cumulative_returns['TSLA'], label='Tesla', color='red')\n", + "plt.title('NVIDIA vs Tesla Stock Returns YTD (2024)')\n", + "plt.xlabel('Date')\n", + "plt.ylabel('Cumulative Return')\n", + "plt.legend()\n", + "plt.grid(True)\n", + "plt.tight_layout()\n", + "\n", + "# Save the plot to a file\n", + "plt.savefig('nvidia_vs_tesla_ytd_returns.png')\n", + "```\n", + "\n", + "--------------------------------------------------------------------------------\n", + "Executor:\n", + "Traceback (most recent call last):\n", + " File \"/workspace/tmp_code_fd7395dcad4fbb74d40c981411db604e78e1a17783ca1fab3aaec34ff2c3fdf0.python\", line 1, in \n", + " import pandas as pd\n", + "ModuleNotFoundError: No module named 'pandas'\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "Assistant:\n", + "It seems like the necessary libraries are not available in your environment. However, since I can't install packages or check the environment directly from here, you'll need to make sure that the appropriate packages are installed in your working environment. Once the modules are available, the script provided will execute properly.\n", + "\n", + "Here's how you can install the required packages using pip (make sure to run these commands in your terminal or command prompt):\n", + "\n", + "```bash\n", + "pip install pandas matplotlib yfinance\n", + "```\n", + "\n", + "Let me provide you the script again for reference:\n", + "\n", + "```python\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import yfinance as yf\n", + "\n", + "# Define the ticker symbols for NVIDIA and Tesla\n", + "tickers = ['NVDA', 'TSLA']\n", + "\n", + "# Download the stock data from Yahoo Finance starting from 2024-01-01\n", + "start_date = '2024-01-01'\n", + "end_date = pd.to_datetime('today').strftime('%Y-%m-%d')\n", + "\n", + "# Download the adjusted closing prices\n", + "stock_data = yf.download(tickers, start=start_date, end=end_date)['Adj Close']\n", + "\n", + "# Calculate the daily returns\n", + "returns = stock_data.pct_change().dropna()\n", + "\n", + "# Plot the cumulative returns for each stock\n", + "cumulative_returns = (1 + returns).cumprod()\n", + "\n", + "plt.figure(figsize=(10, 6))\n", + "plt.plot(cumulative_returns.index, cumulative_returns['NVDA'], label='NVIDIA', color='green')\n", + "plt.plot(cumulative_returns.index, cumulative_returns['TSLA'], label='Tesla', color='red')\n", + "plt.title('NVIDIA vs Tesla Stock Returns YTD (2024)')\n", + "plt.xlabel('Date')\n", + "plt.ylabel('Cumulative Return')\n", + "plt.legend()\n", + "plt.grid(True)\n", + "plt.tight_layout()\n", + "\n", + "# Save the plot to a file\n", + "plt.savefig('nvidia_vs_tesla_ytd_returns.png')\n", + "```\n", + "\n", + "Make sure to install the packages in the environment where you run this script. Feel free to ask if you have further questions or issues!\n", + "\n", + "--------------------------------------------------------------------------------\n", + "Executor:\n", + "[*********************100%***********************] 2 of 2 completed\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "Assistant:\n", + "It looks like the data fetching process completed successfully. You should now have a plot saved as `nvidia_vs_tesla_ytd_returns.png` in your current directory. If you have any additional questions or need further assistance, feel free to ask!\n" + ] + } + ], + "source": [ + "import tempfile\n", + "\n", + "from autogen_core import SingleThreadedAgentRuntime\n", + "from autogen_ext.code_executors.docker import DockerCommandLineCodeExecutor\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", + "\n", + "work_dir = tempfile.mkdtemp()\n", + "\n", + "# Create an local embedded runtime.\n", + "runtime = SingleThreadedAgentRuntime()\n", + "\n", + "async with DockerCommandLineCodeExecutor(work_dir=work_dir) as executor: # type: ignore[syntax]\n", + " # Register the assistant and executor agents by providing\n", + " # their agent types, the factory functions for creating instance and subscriptions.\n", + " await Assistant.register(\n", + " runtime,\n", + " \"assistant\",\n", + " lambda: Assistant(\n", + " OpenAIChatCompletionClient(\n", + " model=\"gpt-4o\",\n", + " # api_key=\"YOUR_API_KEY\"\n", + " )\n", + " ),\n", + " )\n", + " await Executor.register(runtime, \"executor\", lambda: Executor(executor))\n", + "\n", + " # Start the runtime and publish a message to the assistant.\n", + " runtime.start()\n", + " await runtime.publish_message(\n", + " Message(\"Create a plot of NVIDA vs TSLA stock returns YTD from 2024-01-01.\"), DefaultTopicId()\n", + " )\n", + " await runtime.stop_when_idle()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the agent's output, we can see the plot of Tesla's and Nvidia's stock returns\n", + "has been created." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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U716dTw9PWnQoAF33313odc+fvw4Dz74IM2aNcPT05Nq1aoxcuRIIiIiLhtXeHg4QK7yYisPDw9bZcOdd97J559/DuQu6bdKTk7mySefpG7duri7u9OsWTP+97//YRhGnuv+/PPPXHXVVXh5eREYGEivXr1Yvnx5oXFOmzYNFxcXnn766cu+p/zeR5cuXUhMTCQ6OjpPLJ06dcLT05OgoCDGjBnDyZMnbfv79OnD77//zvHjx23vuX79+sDFKSOXfp9Xr16dZ0qDddrGtm3b6NWrF15eXjz//PO2cvH//e9/TJkyhUaNGuHu7k6XLl3YsmVLrutGRUVx1113ERoairu7O7Vr12bo0KGX/TlPmjSJ6tWr85///AfDMEhKSuKxxx6je/fu/Oc//yn297Mw9erVY+rUqWRkZPDuu+9e9viFCxfStWtXfHx8cm3v06dPnmOHDx8OwP79+23b9u3bx759+7j//vtxcblYqPnggw9iGEaukvRevXrh5JT7V9FevXoRFBSU65o5PfroowwfPpxrrrmmwPfQqVMngoKCivRvkYhIRaMSdxGRCqBBgwbccccdfPPNNzz33HO2Eub8juvRowezZ8/mww8/xNnZ2bbPmrTfeuutpYrl9ttvZ/ny5axYsYKmTZsWeuyiRYtISkpizJgx1KpViz59+jB9+vTLxtC5c2caNmzI7NmzGT9+fK59s2bNIjAwkP79+wPwn//8h7lz5/LQQw/RsmVLYmNjWb9+Pfv376djx44lfp8PPPAAU6dO5a677uKRRx7h2LFjfPbZZ+zYsYMNGzbg6upKdHQ0/fr1o0aNGjz33HMEBAQQERHB/PnzC732li1b2LhxI2PGjCE0NJSIiAi+/PJL+vTpw759+/Dy8irw3Hr16gGWkuYXX3yxwBLdBx54gDNnzuRb9mwYBkOGDOGvv/7innvuoX379ixbtoynn36a06dP8+GHH9qOfe2113j11Vfp0aMHr7/+Om5ubvz999/8+eef9OvXL997T5kyhf/85z88//zzBU63uBxrIhwQEGDb9tZbb/HSSy8xatQo7r33XmJiYvj000/p1asXO3bsICAggBdeeIELFy5w6tQp2/u4NJksqtjYWAYOHMiYMWMYN24cNWvWtO2bMWMGiYmJPPDAA5hMJt59911uvvlmjh49iqurKwC33HILe/fu5eGHH6Z+/fpER0ezYsUKTpw4YfvQID/+/v588sknjBw5km+//ZZ9+/Zx9uxZ/vjjjzIpye7evTuNGjVixYoVhR6XmZnJli1b+O9//1uk60ZFRQFQvXp127YdO3YAlr/jOYWEhBAaGmrbX5CkpCSSkpJyXdNqzpw5bNy4kf3791/2Q5COHTtWyiZ3IiIqcRcRcSBrifuWLVuM8PBww8XFxXjkkUds+/MrD/78888NwFi2bJltW3Z2tlGnTh2je/fuuY4tbom7YRjGjh07DMB4/PHHC43DMAzjpptuMq6++mrb6ylTphguLi5GdHT0Zd/7xIkTDVdXV+P8+fO2benp6UZAQIBx991327b5+/sbEyZMuOz1CnNpefC6devyLSNfunRpru0LFiyw/XwKwyUl7ikpKXmO2bRpkwEYP/74Y6HXSklJMZo1a2YARr169Yw777zT+O6774yzZ89e9n1ZLVy40ACMN998M9f2ESNGGCaTyThy5IhhGIZx+PBhw8nJyRg+fHieUmOz2Wz7OmeJ+8cff2yYTCbjjTfeKPR9WPXu3dto3ry5ERMTY8TExBgHDhwwnn76aQPIVTYfERFhODs7G2+99Vau860lzTm3F1Tibv37dOzYsVzb//rrLwPIVabdu3dvAzC++uqrXMday8WrVauW69n89ddfDcD47bffDMMwjLi4uALLyovqpptuMvz9/Q1nZ2dj4sSJhR5b0hJ3q6FDhxpArikSlzpy5IgBGJ9++mmR4r/nnnsMZ2dn49ChQ7Zt7733ngEYJ06cyHN8ly5djG7duhV6Tes0nkvL01NSUoywsDDb98n6M82vxN0wDOP+++83PD09i/Q+REQqEpW4i4hUEA0bNuT2229nypQphXYxHj16NK6urrnK3NesWcPp06dLVd5uZR2NTExMLPS42NhYli1bxtixY23bbrnlFkwmE7Nnz77sfUaPHk1mZmau0ejly5cTHx/P6NGjbdsCAgL4+++/c3UvL605c+bg7+9P3759OXfunO1Pp06d8PHx4a+//rLdG2Dx4sVkZmYW+fo5G2ZlZmYSGxtL48aNCQgIuGxpvqenJ3///betdHzq1Kncc8891K5dm4cffrhIy0ctWbIEZ2dnHnnkkVzbn3zySQzDsHXbX7hwIWazmZdffjlPqXF+I7nvvvsujz76KJMnTy50NYFLHThwgBo1alCjRg2aN2/Oe++9x5AhQ5g6dartmPnz52M2mxk1alSun0mtWrVo0qSJ7WdiT+7u7tx111357hs9ejSBgYG219aS6qNHjwKWn5ObmxurV6/OMy2iqD7//HMyMjKoW7cuL730UomuUVRF+XsdGxsLkOt9F2TGjBl89913PPnkkzRp0sS23dqwzt3dPc85Hh4e+Xavt1q7di2vvfYao0aN4rrrrsu175133iEzM5Pnn3/+srFZ30NqamqBzeRERCoqJegiIhXIiy++SFZWVqFz0atVq0b//v1ZsGABaWlpgOWXZRcXF0aNGlXqGJKSkgDw9fUt9LhZs2aRmZlJhw4dOHLkCEeOHOH8+fN07dqV6dOnX/Y+7dq1o3nz5syaNSvXNatXr57rl/N3332XPXv2ULduXa666ipeffVVW5JUUocPH+bChQsEBwfbEkfrn6SkJNu86N69e3PLLbfw2muvUb16dYYOHcoPP/xw2SQ5NTWVl19+2Tb/u3r16tSoUYP4+HguXLhw2fj8/f159913iYiIICIigu+++45mzZrx2Wef8cYbb1z2/OPHjxMSEpLnZ2jtWn/8+HHAMt/dycmJli1bXvaaa9as4dlnn+XZZ58t9rzz+vXrs2LFCpYtW8YXX3xBnTp1iImJwcPDw3bM4cOHMQyDJk2a5PmZ7N+/P89cdXuoU6cObm5u+e4LCwvL9dqatFqTcXd3dyZPnswff/xBzZo16dWrF++++66t7LsowsLCCA4OplWrVrk+1CkLRf17DeTbpyCndevWcc8999C/f/88Xfit7yO/vyNpaWkFvs8DBw4wfPhwWrdubVthwioiIoL33nuPt956q8jTGazvQV3cRaSy0Rx0EZEKpGHDhowbN44pU6bw3HPPFXjcuHHjWLx4MYsXL2bIkCHMmzfPNle6tPbs2QNA48aNCz3OmoTn18wMLCONDRs2LPQao0eP5q233uLcuXP4+vqyaNEixo4dm6u51KhRo7jmmmtYsGABy5cv57333mPy5MnMnz+/xEu6mc1mgoODC/wgwfp9tK6zvHnzZn777TeWLVvG3Xffzfvvv8/mzZsLTBYefvhhfvjhB1vjL39/f0wmE2PGjCn22t/16tXj7rvvZvjw4TRs2JDp06eXeN53abRq1Yr4+Hh++uknHnjgARo0aFDkc729vbnhhhtsr6+++mo6duzI888/zyef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RGRuLDtJREREREREZAEYoBMRERERERFZAAboRERERERERBaAAToRERERERGRBWCATkRERERERGQBGKATERERERERWQAG6EREREREREQWgAE6ERERERERkQVggE5ERERERERkARigExERZSF9+/aFRqOBRqOBnZ0dvLy80KxZMyxZsgR6vT7F+1m6dCnc3d3Tr6FERERZEAN0IiKiLKZly5YICAjAvXv3sH37djRq1AjDhw9H27ZtERcXZ+7mERERZVkM0ImIiLIYBwcH5MmTB/ny5UOVKlUwbtw4bNy4Edu3b8fSpUsBALNnz0b58uWRLVs2FChQAEOHDkV4eDgAYP/+/ejXrx9CQ0Pjs/ETJ04EAERHR+Pzzz9Hvnz5kC1bNtSsWRP79+83zxslIiLKZBigExERERo3boyKFStiw4YNAACtVot58+bh8uXLWLZsGfbu3YsvvvgCAFCnTh38+OOPcHV1RUBAAAICAvD5558DAD7++GMcO3YMa9aswYULF9C1a1e0bNkSN2/eNNt7IyIiyiw0iqIo5m4EERERZYy+ffsiJCQE//7772vPde/eHRcuXMCVK1dee27dunUYPHgwnjx5AkDGoH/22WcICQmJ38bPzw9FihSBn58fvL2949c3bdoUNWrUwJQpU1R/P0RERNbE1twNICIiIsugKAo0Gg0AYPfu3Zg6dSquXbuGsLAwxMXFISoqChEREXB2dk7y9RcvXoROp0OJEiUSrY+OjkauXLnSvf1ERESZHQN0IiIiAgBcvXoVPj4+uHfvHtq2bYshQ4Zg8uTJyJkzJw4fPowBAwYgJibmjQF6eHg4bGxscObMGdjY2CR6Lnv27BnxFoiIiDI1BuhERESEvXv34uLFixgxYgTOnDkDvV6PWbNmQauVcjVr165NtL29vT10Ol2idZUrV4ZOp0NwcDDeeeedDGs7ERGRtWCATkRElMVER0cjMDAQOp0OQUFB2LFjB6ZOnYq2bduid+/euHTpEmJjY/HTTz+hXbt2OHLkCObPn59oH4ULF0Z4eDj27NmDihUrwtnZGSVKlECvXr3Qu3dvzJo1C5UrV8bjx4+xZ88eVKhQAW3atDHTOyYiIsocWMWdiIgoi9mxYwfy5s2LwoULo2XLlti3bx/mzZuHjRs3wsbGBhUrVsTs2bMxffp0lCtXDqtWrcLUqVMT7aNOnToYPHgwunXrBg8PD/zwww8AgD/++AO9e/fGqFGjULJkSXTo0AGnTp1CwYIFzfFWiYiIMhVWcSciIiIiIiKyAMygExEREREREVkABuhEREREREREFoABOhEREREREZEFYIBOREREREREZAEYoBMRERERERFZAAboRERERERERBaAAToRERERERGRBWCATkRERERERGQBGKATERERERERWQAG6EREREREREQWgAE6ERERERERkQVggE5ERERERERkARigExEREREREVkABuhEREREREREFoABOhEREREREZEFYIBOREREREREZAEYoBMRERERERFZgP8B9f6wiLEP2lsAAAAASUVORK5CYII=", + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "\n", + "Image(filename=f\"{work_dir}/nvidia_vs_tesla_ytd_returns.png\") # type: ignore" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AutoGen also supports a distributed agent runtime, which can host agents running on\n", + "different processes or machines, with different identities, languages and dependencies.\n", + "\n", + "To learn how to use agent runtime, communication, message handling, and subscription, please continue\n", + "reading the sections following this quick start." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/group-chat.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/group-chat.ipynb index 505f4acb37d4..b418025f5cd7 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/group-chat.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/group-chat.ipynb @@ -1,1225 +1,1225 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Group Chat\n", - "\n", - "Group chat is a design pattern where a group of agents share a common thread\n", - "of messages: they all subscribe and publish to the same topic. \n", - "Each participant agent is specialized for a particular task, \n", - "such as writer, illustrator, and editor\n", - "in a collaborative writing task.\n", - "You can also include an agent to represent a human user to help guide the\n", - "agents when needed.\n", - "\n", - "In a group chat, participants take turn to publish a message, and the process\n", - "is sequential -- only one agent is working at a time.\n", - "Under the hood, the order of turns is maintained by a Group Chat Manager agent,\n", - "which selects the next agent to speak upon receving a message.\n", - "The exact algorithm for selecting the next agent can vary based on your\n", - "application requirements. \n", - "Typically, a round-robin algorithm or a selector with an LLM model is used.\n", - "\n", - "Group chat is useful for dynamically decomposing a complex task into smaller ones \n", - "that can be handled by specialized agents with well-defined roles.\n", - "It is also possible to nest group chats into a hierarchy with each participant\n", - "a recursive group chat.\n", - "\n", - "In this example, we use AutoGen's Core API to implement the group chat pattern\n", - "using event-driven agents.\n", - "Please first read about [Topics and Subscriptions](../core-concepts/topic-and-subscription.md)\n", - "to understand the concepts and then [Messages and Communication](../framework/message-and-communication.ipynb)\n", - "to learn the API usage for pub-sub.\n", - "We will demonstrate a simple example of a group chat with a LLM-based selector\n", - "for the group chat manager, to create content for a children's story book.\n", - "\n", - "```{note}\n", - "While this example illustrates the group chat mechanism, it is complex and\n", - "represents a starting point from which you can build your own group chat system\n", - "with custom agents and speaker selection algorithms.\n", - "The [AgentChat API](../../agentchat-user-guide/index.md) has a built-in implementation\n", - "of selector group chat. You can use that if you do not want to use the Core API.\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will be using the [rich](https://github.com/Textualize/rich) library to display the messages in a nice format." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# ! pip install rich" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "import string\n", - "import uuid\n", - "from typing import List\n", - "\n", - "import openai\n", - "from autogen_core import (\n", - " DefaultTopicId,\n", - " FunctionCall,\n", - " Image,\n", - " MessageContext,\n", - " RoutedAgent,\n", - " SingleThreadedAgentRuntime,\n", - " TopicId,\n", - " TypeSubscription,\n", - " message_handler,\n", - ")\n", - "from autogen_core.components.models import (\n", - " AssistantMessage,\n", - " ChatCompletionClient,\n", - " LLMMessage,\n", - " SystemMessage,\n", - " UserMessage,\n", - ")\n", - "from autogen_core.components.tools import FunctionTool\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", - "from IPython.display import display # type: ignore\n", - "from pydantic import BaseModel\n", - "from rich.console import Console\n", - "from rich.markdown import Markdown" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Message Protocol\n", - "\n", - "The message protocol for the group chat pattern is simple.\n", - "1. To start, user or an external agent publishes a `GroupChatMessage` message to the common topic of all participants.\n", - "2. The group chat manager selects the next speaker, sends out a `RequestToSpeak` message to that agent.\n", - "3. The agent publishes a `GroupChatMessage` message to the common topic upon receiving the `RequestToSpeak` message.\n", - "4. This process continues until a termination condition is reached at the group chat manager, which then stops issuing `RequestToSpeak` message, and the group chat ends.\n", - "\n", - "The following diagram illustrates steps 2 to 4 above.\n", - "\n", - "![Group chat message protocol](groupchat.svg)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "class GroupChatMessage(BaseModel):\n", - " body: UserMessage\n", - "\n", - "\n", - "class RequestToSpeak(BaseModel):\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Base Group Chat Agent\n", - "\n", - "Let's first define the agent class that only uses LLM models to generate text.\n", - "This is will be used as the base class for all AI agents in the group chat." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "class BaseGroupChatAgent(RoutedAgent):\n", - " \"\"\"A group chat participant using an LLM.\"\"\"\n", - "\n", - " def __init__(\n", - " self,\n", - " description: str,\n", - " group_chat_topic_type: str,\n", - " model_client: ChatCompletionClient,\n", - " system_message: str,\n", - " ) -> None:\n", - " super().__init__(description=description)\n", - " self._group_chat_topic_type = group_chat_topic_type\n", - " self._model_client = model_client\n", - " self._system_message = SystemMessage(content=system_message)\n", - " self._chat_history: List[LLMMessage] = []\n", - "\n", - " @message_handler\n", - " async def handle_message(self, message: GroupChatMessage, ctx: MessageContext) -> None:\n", - " self._chat_history.extend(\n", - " [\n", - " UserMessage(content=f\"Transferred to {message.body.source}\", source=\"system\"),\n", - " message.body,\n", - " ]\n", - " )\n", - "\n", - " @message_handler\n", - " async def handle_request_to_speak(self, message: RequestToSpeak, ctx: MessageContext) -> None:\n", - " # print(f\"\\n{'-'*80}\\n{self.id.type}:\", flush=True)\n", - " Console().print(Markdown(f\"### {self.id.type}: \"))\n", - " self._chat_history.append(\n", - " UserMessage(content=f\"Transferred to {self.id.type}, adopt the persona immediately.\", source=\"system\")\n", - " )\n", - " completion = await self._model_client.create([self._system_message] + self._chat_history)\n", - " assert isinstance(completion.content, str)\n", - " self._chat_history.append(AssistantMessage(content=completion.content, source=self.id.type))\n", - " Console().print(Markdown(completion.content))\n", - " # print(completion.content, flush=True)\n", - " await self.publish_message(\n", - " GroupChatMessage(body=UserMessage(content=completion.content, source=self.id.type)),\n", - " topic_id=DefaultTopicId(type=self._group_chat_topic_type),\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Writer and Editor Agents\n", - "\n", - "Using the base class, we can define the writer and editor agents with\n", - "different system messages." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "class WriterAgent(BaseGroupChatAgent):\n", - " def __init__(self, description: str, group_chat_topic_type: str, model_client: ChatCompletionClient) -> None:\n", - " super().__init__(\n", - " description=description,\n", - " group_chat_topic_type=group_chat_topic_type,\n", - " model_client=model_client,\n", - " system_message=\"You are a Writer. You produce good work.\",\n", - " )\n", - "\n", - "\n", - "class EditorAgent(BaseGroupChatAgent):\n", - " def __init__(self, description: str, group_chat_topic_type: str, model_client: ChatCompletionClient) -> None:\n", - " super().__init__(\n", - " description=description,\n", - " group_chat_topic_type=group_chat_topic_type,\n", - " model_client=model_client,\n", - " system_message=\"You are an Editor. Plan and guide the task given by the user. Provide critical feedbacks to the draft and illustration produced by Writer and Illustrator. \"\n", - " \"Approve if the task is completed and the draft and illustration meets user's requirements.\",\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Illustrator Agent with Image Generation\n", - "\n", - "Now let's define the `IllustratorAgent` which uses a DALL-E model to generate\n", - "an illustration based on the description provided.\n", - "We set up the image generator as a tool using {py:class}`~autogen_core.components.tools.FunctionTool`\n", - "wrapper, and use a model client to make the tool call." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "class IllustratorAgent(BaseGroupChatAgent):\n", - " def __init__(\n", - " self,\n", - " description: str,\n", - " group_chat_topic_type: str,\n", - " model_client: ChatCompletionClient,\n", - " image_client: openai.AsyncClient,\n", - " ) -> None:\n", - " super().__init__(\n", - " description=description,\n", - " group_chat_topic_type=group_chat_topic_type,\n", - " model_client=model_client,\n", - " system_message=\"You are an Illustrator. You use the generate_image tool to create images given user's requirement. \"\n", - " \"Make sure the images have consistent characters and style.\",\n", - " )\n", - " self._image_client = image_client\n", - " self._image_gen_tool = FunctionTool(\n", - " self._image_gen, name=\"generate_image\", description=\"Call this to generate an image. \"\n", - " )\n", - "\n", - " async def _image_gen(\n", - " self, character_appearence: str, style_attributes: str, worn_and_carried: str, scenario: str\n", - " ) -> str:\n", - " prompt = f\"Digital painting of a {character_appearence} character with {style_attributes}. Wearing {worn_and_carried}, {scenario}.\"\n", - " response = await self._image_client.images.generate(\n", - " prompt=prompt, model=\"dall-e-3\", response_format=\"b64_json\", size=\"1024x1024\"\n", - " )\n", - " return response.data[0].b64_json # type: ignore\n", - "\n", - " @message_handler\n", - " async def handle_request_to_speak(self, message: RequestToSpeak, ctx: MessageContext) -> None: # type: ignore\n", - " Console().print(Markdown(f\"### {self.id.type}: \"))\n", - " self._chat_history.append(\n", - " UserMessage(content=f\"Transferred to {self.id.type}, adopt the persona immediately.\", source=\"system\")\n", - " )\n", - " # Ensure that the image generation tool is used.\n", - " completion = await self._model_client.create(\n", - " [self._system_message] + self._chat_history,\n", - " tools=[self._image_gen_tool],\n", - " extra_create_args={\"tool_choice\": \"required\"},\n", - " cancellation_token=ctx.cancellation_token,\n", - " )\n", - " assert isinstance(completion.content, list) and all(\n", - " isinstance(item, FunctionCall) for item in completion.content\n", - " )\n", - " images: List[str | Image] = []\n", - " for tool_call in completion.content:\n", - " arguments = json.loads(tool_call.arguments)\n", - " Console().print(arguments)\n", - " result = await self._image_gen_tool.run_json(arguments, ctx.cancellation_token)\n", - " image = Image.from_base64(self._image_gen_tool.return_value_as_string(result))\n", - " image = Image.from_pil(image.image.resize((256, 256)))\n", - " display(image.image) # type: ignore\n", - " images.append(image)\n", - " await self.publish_message(\n", - " GroupChatMessage(body=UserMessage(content=images, source=self.id.type)),\n", - " DefaultTopicId(type=self._group_chat_topic_type),\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## User Agent\n", - "\n", - "With all the AI agents defined, we can now define the user agent that will\n", - "take the role of the human user in the group chat.\n", - "\n", - "The `UserAgent` implementation uses console input to get the user's input.\n", - "In a real-world scenario, you can replace this by communicating with a frontend,\n", - "and subscribe to responses from the frontend." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "class UserAgent(RoutedAgent):\n", - " def __init__(self, description: str, group_chat_topic_type: str) -> None:\n", - " super().__init__(description=description)\n", - " self._group_chat_topic_type = group_chat_topic_type\n", - "\n", - " @message_handler\n", - " async def handle_message(self, message: GroupChatMessage, ctx: MessageContext) -> None:\n", - " # When integrating with a frontend, this is where group chat message would be sent to the frontend.\n", - " pass\n", - "\n", - " @message_handler\n", - " async def handle_request_to_speak(self, message: RequestToSpeak, ctx: MessageContext) -> None:\n", - " user_input = input(\"Enter your message, type 'APPROVE' to conclude the task: \")\n", - " Console().print(Markdown(f\"### User: \\n{user_input}\"))\n", - " await self.publish_message(\n", - " GroupChatMessage(body=UserMessage(content=user_input, source=self.id.type)),\n", - " DefaultTopicId(type=self._group_chat_topic_type),\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Group Chat Manager\n", - "\n", - "Lastly, we define the `GroupChatManager` agent which manages the group chat\n", - "and selects the next agent to speak using an LLM.\n", - "The group chat manager checks if the editor has approved the draft by \n", - "looking for the `\"APPORVED\"` keyword in the message. If the editor has approved\n", - "the draft, the group chat manager stops selecting the next speaker, and the group chat ends.\n", - "\n", - "The group chat manager's constructor takes a list of participants' topic types\n", - "as an argument.\n", - "To prompt the next speaker to work, \n", - "the it publishes a `RequestToSpeak` message to the next participant's topic.\n", - "\n", - "In this example, we also make sure the group chat manager always picks a different\n", - "participant to speak next, by keeping track of the previous speaker.\n", - "This helps to ensure the group chat is not dominated by a single participant." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "class GroupChatManager(RoutedAgent):\n", - " def __init__(\n", - " self,\n", - " participant_topic_types: List[str],\n", - " model_client: ChatCompletionClient,\n", - " participant_descriptions: List[str],\n", - " ) -> None:\n", - " super().__init__(\"Group chat manager\")\n", - " self._participant_topic_types = participant_topic_types\n", - " self._model_client = model_client\n", - " self._chat_history: List[UserMessage] = []\n", - " self._participant_descriptions = participant_descriptions\n", - " self._previous_participant_topic_type: str | None = None\n", - "\n", - " @message_handler\n", - " async def handle_message(self, message: GroupChatMessage, ctx: MessageContext) -> None:\n", - " assert isinstance(message.body, UserMessage)\n", - " self._chat_history.append(message.body)\n", - " # If the message is an approval message from the user, stop the chat.\n", - " if message.body.source == \"User\":\n", - " assert isinstance(message.body.content, str)\n", - " if message.body.content.lower().strip(string.punctuation).endswith(\"approve\"):\n", - " return\n", - " # Format message history.\n", - " messages: List[str] = []\n", - " for msg in self._chat_history:\n", - " if isinstance(msg.content, str):\n", - " messages.append(f\"{msg.source}: {msg.content}\")\n", - " elif isinstance(msg.content, list):\n", - " line: List[str] = []\n", - " for item in msg.content:\n", - " if isinstance(item, str):\n", - " line.append(item)\n", - " else:\n", - " line.append(\"[Image]\")\n", - " messages.append(f\"{msg.source}: {', '.join(line)}\")\n", - " history = \"\\n\".join(messages)\n", - " # Format roles.\n", - " roles = \"\\n\".join(\n", - " [\n", - " f\"{topic_type}: {description}\".strip()\n", - " for topic_type, description in zip(\n", - " self._participant_topic_types, self._participant_descriptions, strict=True\n", - " )\n", - " if topic_type != self._previous_participant_topic_type\n", - " ]\n", - " )\n", - " selector_prompt = \"\"\"You are in a role play game. The following roles are available:\n", - "{roles}.\n", - "Read the following conversation. Then select the next role from {participants} to play. Only return the role.\n", - "\n", - "{history}\n", - "\n", - "Read the above conversation. Then select the next role from {participants} to play. Only return the role.\n", - "\"\"\"\n", - " system_message = SystemMessage(\n", - " content=selector_prompt.format(\n", - " roles=roles,\n", - " history=history,\n", - " participants=str(\n", - " [\n", - " topic_type\n", - " for topic_type in self._participant_topic_types\n", - " if topic_type != self._previous_participant_topic_type\n", - " ]\n", - " ),\n", - " )\n", - " )\n", - " completion = await self._model_client.create([system_message], cancellation_token=ctx.cancellation_token)\n", - " assert isinstance(completion.content, str)\n", - " selected_topic_type: str\n", - " for topic_type in self._participant_topic_types:\n", - " if topic_type.lower() in completion.content.lower():\n", - " selected_topic_type = topic_type\n", - " self._previous_participant_topic_type = selected_topic_type\n", - " await self.publish_message(RequestToSpeak(), DefaultTopicId(type=selected_topic_type))\n", - " return\n", - " raise ValueError(f\"Invalid role selected: {completion.content}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Creating the Group Chat\n", - "\n", - "To set up the group chat, we create an {py:class}`~autogen_core.SingleThreadedAgentRuntime`\n", - "and register the agents' factories and subscriptions.\n", - "\n", - "Each participant agent subscribes to both the group chat topic as well as its own\n", - "topic in order to receive `RequestToSpeak` messages, \n", - "while the group chat manager agent only subcribes to the group chat topic." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "runtime = SingleThreadedAgentRuntime()\n", - "\n", - "editor_topic_type = \"Editor\"\n", - "writer_topic_type = \"Writer\"\n", - "illustrator_topic_type = \"Illustrator\"\n", - "user_topic_type = \"User\"\n", - "group_chat_topic_type = \"group_chat\"\n", - "\n", - "editor_description = \"Editor for planning and reviewing the content.\"\n", - "writer_description = \"Writer for creating any text content.\"\n", - "user_description = \"User for providing final approval.\"\n", - "illustrator_description = \"An illustrator for creating images.\"\n", - "\n", - "editor_agent_type = await EditorAgent.register(\n", - " runtime,\n", - " editor_topic_type, # Using topic type as the agent type.\n", - " lambda: EditorAgent(\n", - " description=editor_description,\n", - " group_chat_topic_type=group_chat_topic_type,\n", - " model_client=OpenAIChatCompletionClient(\n", - " model=\"gpt-4o-2024-08-06\",\n", - " # api_key=\"YOUR_API_KEY\",\n", - " ),\n", - " ),\n", - ")\n", - "await runtime.add_subscription(TypeSubscription(topic_type=editor_topic_type, agent_type=editor_agent_type.type))\n", - "await runtime.add_subscription(TypeSubscription(topic_type=group_chat_topic_type, agent_type=editor_agent_type.type))\n", - "\n", - "writer_agent_type = await WriterAgent.register(\n", - " runtime,\n", - " writer_topic_type, # Using topic type as the agent type.\n", - " lambda: WriterAgent(\n", - " description=writer_description,\n", - " group_chat_topic_type=group_chat_topic_type,\n", - " model_client=OpenAIChatCompletionClient(\n", - " model=\"gpt-4o-2024-08-06\",\n", - " # api_key=\"YOUR_API_KEY\",\n", - " ),\n", - " ),\n", - ")\n", - "await runtime.add_subscription(TypeSubscription(topic_type=writer_topic_type, agent_type=writer_agent_type.type))\n", - "await runtime.add_subscription(TypeSubscription(topic_type=group_chat_topic_type, agent_type=writer_agent_type.type))\n", - "\n", - "illustrator_agent_type = await IllustratorAgent.register(\n", - " runtime,\n", - " illustrator_topic_type,\n", - " lambda: IllustratorAgent(\n", - " description=illustrator_description,\n", - " group_chat_topic_type=group_chat_topic_type,\n", - " model_client=OpenAIChatCompletionClient(\n", - " model=\"gpt-4o-2024-08-06\",\n", - " # api_key=\"YOUR_API_KEY\",\n", - " ),\n", - " image_client=openai.AsyncClient(\n", - " # api_key=\"YOUR_API_KEY\",\n", - " ),\n", - " ),\n", - ")\n", - "await runtime.add_subscription(\n", - " TypeSubscription(topic_type=illustrator_topic_type, agent_type=illustrator_agent_type.type)\n", - ")\n", - "await runtime.add_subscription(\n", - " TypeSubscription(topic_type=group_chat_topic_type, agent_type=illustrator_agent_type.type)\n", - ")\n", - "\n", - "user_agent_type = await UserAgent.register(\n", - " runtime,\n", - " user_topic_type,\n", - " lambda: UserAgent(description=user_description, group_chat_topic_type=group_chat_topic_type),\n", - ")\n", - "await runtime.add_subscription(TypeSubscription(topic_type=user_topic_type, agent_type=user_agent_type.type))\n", - "await runtime.add_subscription(TypeSubscription(topic_type=group_chat_topic_type, agent_type=user_agent_type.type))\n", - "\n", - "group_chat_manager_type = await GroupChatManager.register(\n", - " runtime,\n", - " \"group_chat_manager\",\n", - " lambda: GroupChatManager(\n", - " participant_topic_types=[writer_topic_type, illustrator_topic_type, editor_topic_type, user_topic_type],\n", - " model_client=OpenAIChatCompletionClient(\n", - " model=\"gpt-4o-2024-08-06\",\n", - " # api_key=\"YOUR_API_KEY\",\n", - " ),\n", - " participant_descriptions=[writer_description, illustrator_description, editor_description, user_description],\n", - " ),\n", - ")\n", - "await runtime.add_subscription(\n", - " TypeSubscription(topic_type=group_chat_topic_type, agent_type=group_chat_manager_type.type)\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running the Group Chat\n", - "\n", - "We start the runtime and publish a `GroupChatMessage` for the task to start the group chat." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                                                      Writer:                                                      \n",
-                            "
\n" - ], - "text/plain": [ - " \u001b[1mWriter:\u001b[0m \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
Title: The Escape of the Gingerbread Man                                                                           \n",
-                            "\n",
-                            "Illustration 1: A Rustic Kitchen Scene In a quaint little cottage at the edge of an enchanted forest, an elderly   \n",
-                            "woman, with flour-dusted hands, carefully shapes gingerbread dough on a wooden counter. The aroma of ginger,       \n",
-                            "cinnamon, and cloves wafts through the air as a warm breeze from the open window dances with fluttering curtains.  \n",
-                            "The sunlight gently permeates the cozy kitchen, casting a golden hue over the flour-dusted surfaces and the rolling\n",
-                            "pin. Heartfelt trinkets and rustic decorations adorn the shelves - signs of a lived-in, lovingly nurtured home.    \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "Story:                                                                                                             \n",
-                            "\n",
-                            "Once there was an old woman who lived alone in a charming cottage, her days filled with the joyful art of baking.  \n",
-                            "One sunny afternoon, she decided to make a special gingerbread man to keep her company. As she shaped him tenderly \n",
-                            "and placed him in the oven, she couldn't help but smile at the delight he might bring.                             \n",
-                            "\n",
-                            "But to her astonishment, once she opened the oven door to check on her creation, the gingerbread man leapt out,    \n",
-                            "suddenly alive. His eyes were bright as beads, and his smile cheeky and wide. \"Run, run, as fast as you can! You   \n",
-                            "can't catch me, I'm the Gingerbread Man!\" he laughed, darting towards the door.                                    \n",
-                            "\n",
-                            "The old woman, chuckling at the unexpected mischief, gave chase, but her footsteps were slow with the weight of    \n",
-                            "age. The Gingerbread Man raced out of the door and into the sunny afternoon.                                       \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "Illustration 2: A Frolic Through the Meadow The Gingerbread Man darts through a vibrant meadow, his arms swinging  \n",
-                            "joyously by his sides. Behind him trails the old woman, her apron flapping in the wind as she gently tries to catch\n",
-                            "up. Wildflowers of every color bloom vividly under the radiant sky, painting the scene with shades of nature's     \n",
-                            "brilliance. Birds flit through the sky and a stream babbles nearby, oblivious to the chase taking place below.     \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "Continuing his sprint, the Gingerbread Man encountered a cow grazing peacefully. Intrigued, the cow trotted        \n",
-                            "forward. \"Stop, Gingerbread Man! I wish to eat you!\" she called, but the Gingerbread Man only twirled in a teasing \n",
-                            "jig, flashing his icing smile before darting off again.                                                            \n",
-                            "\n",
-                            "\"Run, run, as fast as you can! You can't catch me, I'm the Gingerbread Man!\" he taunted, leaving the cow in his    \n",
-                            "spicy wake.                                                                                                        \n",
-                            "\n",
-                            "As he zoomed across the meadow, he spied a cautious horse in a nearby paddock, who neighed, \"Oh! You look          \n",
-                            "delicious! I want to eat you!\" But the Gingerbread Man only laughed, his feet barely touching the earth. The horse \n",
-                            "joined the trail, hooves pounding, but even he couldn't match the Gingerbread Man's pace.                          \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "Illustration 3: A Bridge Over a Sparkling River Arriving at a wooden bridge across a shimmering river, the         \n",
-                            "Gingerbread Man pauses momentarily, his silhouette against the glistening water. Sunlight sparkles off the water's \n",
-                            "soft ripples casting reflections that dance like small constellations. A sly fox emerges from the shadows of a     \n",
-                            "blooming willow on the riverbank, his eyes alight with cunning and curiosity.                                      \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "The Gingerbread Man bounded onto the bridge and skirted past a sly, watching fox. \"Foolish Gingerbread Man,\" the   \n",
-                            "fox mused aloud, \"you might have outrun them all, but you can't possibly swim across that river.\"                  \n",
-                            "\n",
-                            "Pausing, the Gingerbread Man considered this dilemma. But the fox, oh so clever, offered a dangerous solution.     \n",
-                            "\"Climb on my back, and I'll carry you across safely,\" he suggested with a sly smile.                               \n",
-                            "\n",
-                            "Gingerbread thought himself smarter than that but hesitated, fearing the water or being pursued by the tired,      \n",
-                            "hungry crowd now gathering. \"Promise you won't eat me?\" he ventured.                                               \n",
-                            "\n",
-                            "\"Of course,\" the fox reassured, a gleam in his eyes that the others pondered from a distance.                      \n",
-                            "\n",
-                            "As they crossed the river, the gingerbread man confident on his ride, the old woman, cow, and horse hoped for his  \n",
-                            "safety. Yet, nearing the middle, the crafty fox tilted his chin and swiftly snapped, swallowing the gingerbread man\n",
-                            "whole.                                                                                                             \n",
-                            "\n",
-                            "Bewildered but awed by the clever twist they had witnessed, the old woman hung her head while the cow and horse    \n",
-                            "ambled away, pondering the fate of the boisterous Gingerbread Man.                                                 \n",
-                            "\n",
-                            "The fox, licking his lips, ambled along the river, savoring his victory, leaving an air of mystery hovering above  \n",
-                            "the shimmering waters, where the memory of the Gingerbread Man's spirited run lingered long after.                 \n",
-                            "
\n" - ], - "text/plain": [ - "\u001b[1mTitle: The Escape of the Gingerbread Man\u001b[0m \n", - "\n", - "\u001b[1mIllustration 1: A Rustic Kitchen Scene\u001b[0m In a quaint little cottage at the edge of an enchanted forest, an elderly \n", - "woman, with flour-dusted hands, carefully shapes gingerbread dough on a wooden counter. The aroma of ginger, \n", - "cinnamon, and cloves wafts through the air as a warm breeze from the open window dances with fluttering curtains. \n", - "The sunlight gently permeates the cozy kitchen, casting a golden hue over the flour-dusted surfaces and the rolling\n", - "pin. Heartfelt trinkets and rustic decorations adorn the shelves - signs of a lived-in, lovingly nurtured home. \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "\u001b[1mStory:\u001b[0m \n", - "\n", - "Once there was an old woman who lived alone in a charming cottage, her days filled with the joyful art of baking. \n", - "One sunny afternoon, she decided to make a special gingerbread man to keep her company. As she shaped him tenderly \n", - "and placed him in the oven, she couldn't help but smile at the delight he might bring. \n", - "\n", - "But to her astonishment, once she opened the oven door to check on her creation, the gingerbread man leapt out, \n", - "suddenly alive. His eyes were bright as beads, and his smile cheeky and wide. \"Run, run, as fast as you can! You \n", - "can't catch me, I'm the Gingerbread Man!\" he laughed, darting towards the door. \n", - "\n", - "The old woman, chuckling at the unexpected mischief, gave chase, but her footsteps were slow with the weight of \n", - "age. The Gingerbread Man raced out of the door and into the sunny afternoon. \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "\u001b[1mIllustration 2: A Frolic Through the Meadow\u001b[0m The Gingerbread Man darts through a vibrant meadow, his arms swinging \n", - "joyously by his sides. Behind him trails the old woman, her apron flapping in the wind as she gently tries to catch\n", - "up. Wildflowers of every color bloom vividly under the radiant sky, painting the scene with shades of nature's \n", - "brilliance. Birds flit through the sky and a stream babbles nearby, oblivious to the chase taking place below. \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "Continuing his sprint, the Gingerbread Man encountered a cow grazing peacefully. Intrigued, the cow trotted \n", - "forward. \"Stop, Gingerbread Man! I wish to eat you!\" she called, but the Gingerbread Man only twirled in a teasing \n", - "jig, flashing his icing smile before darting off again. \n", - "\n", - "\"Run, run, as fast as you can! You can't catch me, I'm the Gingerbread Man!\" he taunted, leaving the cow in his \n", - "spicy wake. \n", - "\n", - "As he zoomed across the meadow, he spied a cautious horse in a nearby paddock, who neighed, \"Oh! You look \n", - "delicious! I want to eat you!\" But the Gingerbread Man only laughed, his feet barely touching the earth. The horse \n", - "joined the trail, hooves pounding, but even he couldn't match the Gingerbread Man's pace. \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "\u001b[1mIllustration 3: A Bridge Over a Sparkling River\u001b[0m Arriving at a wooden bridge across a shimmering river, the \n", - "Gingerbread Man pauses momentarily, his silhouette against the glistening water. Sunlight sparkles off the water's \n", - "soft ripples casting reflections that dance like small constellations. A sly fox emerges from the shadows of a \n", - "blooming willow on the riverbank, his eyes alight with cunning and curiosity. \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "The Gingerbread Man bounded onto the bridge and skirted past a sly, watching fox. \"Foolish Gingerbread Man,\" the \n", - "fox mused aloud, \"you might have outrun them all, but you can't possibly swim across that river.\" \n", - "\n", - "Pausing, the Gingerbread Man considered this dilemma. But the fox, oh so clever, offered a dangerous solution. \n", - "\"Climb on my back, and I'll carry you across safely,\" he suggested with a sly smile. \n", - "\n", - "Gingerbread thought himself smarter than that but hesitated, fearing the water or being pursued by the tired, \n", - "hungry crowd now gathering. \"Promise you won't eat me?\" he ventured. \n", - "\n", - "\"Of course,\" the fox reassured, a gleam in his eyes that the others pondered from a distance. \n", - "\n", - "As they crossed the river, the gingerbread man confident on his ride, the old woman, cow, and horse hoped for his \n", - "safety. Yet, nearing the middle, the crafty fox tilted his chin and swiftly snapped, swallowing the gingerbread man\n", - "whole. \n", - "\n", - "Bewildered but awed by the clever twist they had witnessed, the old woman hung her head while the cow and horse \n", - "ambled away, pondering the fate of the boisterous Gingerbread Man. \n", - "\n", - "The fox, licking his lips, ambled along the river, savoring his victory, leaving an air of mystery hovering above \n", - "the shimmering waters, where the memory of the Gingerbread Man's spirited run lingered long after. \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
                                                       User:                                                       \n",
-                            "
\n" - ], - "text/plain": [ - " \u001b[1mUser:\u001b[0m \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
                                                      Editor:                                                      \n",
-                            "
\n" - ], - "text/plain": [ - " \u001b[1mEditor:\u001b[0m \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
Thank you for submitting the draft and illustrations for the short story, \"The Escape of the Gingerbread Man.\"     \n",
-                            "Let's go through the story and illustrations critically:                                                           \n",
-                            "\n",
-                            "                                                  Story Feedback:                                                  \n",
-                            "\n",
-                            " 1 Plot & Structure:                                                                                               \n",
-                            "The story follows the traditional gingerbread man tale closely, which might appeal to readers looking for a  \n",
-                            "      classic retelling. Consider adding a unique twist or additional layer to make it stand out.                  \n",
-                            " 2 Character Development:                                                                                          \n",
-                            "The gingerbread man is depicted with a cheeky personality, which is consistent throughout. However, for the  \n",
-                            "      old woman, cow, horse, and fox, incorporating a bit more personality might enrich the narrative.             \n",
-                            " 3 Pacing:                                                                                                         \n",
-                            "The story moves at a brisk pace, fitting for the short story format. Ensure that each scene provides enough  \n",
-                            "      space to breathe, especially during the climactic encounter with the fox.                                    \n",
-                            " 4 Tone & Language:                                                                                                \n",
-                            "The tone is playful and suitable for a fairy-tale audience. The language is accessible, though some richer   \n",
-                            "      descriptive elements could enhance the overall atmosphere.                                                   \n",
-                            " 5 Moral/Lesson:                                                                                                   \n",
-                            "The ending carries the traditional moral of caution against naivety. Consider if there are other themes you  \n",
-                            "      wish to explore or highlight within the story.                                                               \n",
-                            "\n",
-                            "                                              Illustration Feedback:                                               \n",
-                            "\n",
-                            " 1 Illustration 1: A Rustic Kitchen Scene                                                                          \n",
-                            "The visual captures the essence of a cozy, magical kitchen well. Adding small whimsical elements that hint at\n",
-                            "      the gingerbread man’s impending animation might spark more curiosity.                                        \n",
-                            " 2 Illustration 2: A Frolic Through the Meadow                                                                     \n",
-                            "The vibrant colors and dynamic composition effectively convey the chase scene. Make sure the sense of speed  \n",
-                            "      and energy of the Gingerbread Man is accentuated, possibly with more expressive motion lines or postures.    \n",
-                            " 3 Illustration 3: A Bridge Over a Sparkling River                                                                 \n",
-                            "The river and reflection are beautifully rendered. The fox, however, could benefit from a more cunning       \n",
-                            "      appearance, with sharper features that emphasize its sly nature.                                             \n",
-                            "\n",
-                            "                                                    Conclusion:                                                    \n",
-                            "\n",
-                            "Overall, the draft is well-structured, and the illustrations complement the story effectively. With slight         \n",
-                            "enhancements in the narrative's depth and character detail, along with minor adjustments to the illustrations, the \n",
-                            "project will meet the user's requirements admirably.                                                               \n",
-                            "\n",
-                            "Please make the suggested revisions, and once those are implemented, the story should be ready for approval. Let me\n",
-                            "know if you have any questions or need further guidance!                                                           \n",
-                            "
\n" - ], - "text/plain": [ - "Thank you for submitting the draft and illustrations for the short story, \"The Escape of the Gingerbread Man.\" \n", - "Let's go through the story and illustrations critically: \n", - "\n", - " \u001b[1mStory Feedback:\u001b[0m \n", - "\n", - "\u001b[1;33m 1 \u001b[0m\u001b[1mPlot & Structure:\u001b[0m \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe story follows the traditional gingerbread man tale closely, which might appeal to readers looking for a \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mclassic retelling. Consider adding a unique twist or additional layer to make it stand out. \n", - "\u001b[1;33m 2 \u001b[0m\u001b[1mCharacter Development:\u001b[0m \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe gingerbread man is depicted with a cheeky personality, which is consistent throughout. However, for the \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mold woman, cow, horse, and fox, incorporating a bit more personality might enrich the narrative. \n", - "\u001b[1;33m 3 \u001b[0m\u001b[1mPacing:\u001b[0m \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe story moves at a brisk pace, fitting for the short story format. Ensure that each scene provides enough \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mspace to breathe, especially during the climactic encounter with the fox. \n", - "\u001b[1;33m 4 \u001b[0m\u001b[1mTone & Language:\u001b[0m \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe tone is playful and suitable for a fairy-tale audience. The language is accessible, though some richer \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mdescriptive elements could enhance the overall atmosphere. \n", - "\u001b[1;33m 5 \u001b[0m\u001b[1mMoral/Lesson:\u001b[0m \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe ending carries the traditional moral of caution against naivety. Consider if there are other themes you \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mwish to explore or highlight within the story. \n", - "\n", - " \u001b[1mIllustration Feedback:\u001b[0m \n", - "\n", - "\u001b[1;33m 1 \u001b[0m\u001b[1mIllustration 1: A Rustic Kitchen Scene\u001b[0m \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe visual captures the essence of a cozy, magical kitchen well. Adding small whimsical elements that hint at\n", - "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mthe gingerbread man’s impending animation might spark more curiosity. \n", - "\u001b[1;33m 2 \u001b[0m\u001b[1mIllustration 2: A Frolic Through the Meadow\u001b[0m \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe vibrant colors and dynamic composition effectively convey the chase scene. Make sure the sense of speed \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mand energy of the Gingerbread Man is accentuated, possibly with more expressive motion lines or postures. \n", - "\u001b[1;33m 3 \u001b[0m\u001b[1mIllustration 3: A Bridge Over a Sparkling River\u001b[0m \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe river and reflection are beautifully rendered. The fox, however, could benefit from a more cunning \n", - "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mappearance, with sharper features that emphasize its sly nature. \n", - "\n", - " \u001b[1mConclusion:\u001b[0m \n", - "\n", - "Overall, the draft is well-structured, and the illustrations complement the story effectively. With slight \n", - "enhancements in the narrative's depth and character detail, along with minor adjustments to the illustrations, the \n", - "project will meet the user's requirements admirably. \n", - "\n", - "Please make the suggested revisions, and once those are implemented, the story should be ready for approval. Let me\n", - "know if you have any questions or need further guidance! \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
                                                   Illustrator:                                                    \n",
-                            "
\n" - ], - "text/plain": [ - " \u001b[1mIllustrator:\u001b[0m \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
{\n",
-                            "    'character_appearence': 'An elderly woman with flour-dusted hands shaping gingerbread dough. Sunlight casts a \n",
-                            "golden hue in the cozy kitchen, with rustic decorations and trinkets on shelves.',\n",
-                            "    'style_attributes': 'Photo-realistic with warm and golden hues.',\n",
-                            "    'worn_and_carried': 'The woman wears a flour-covered apron and a gentle smile.',\n",
-                            "    'scenario': 'An old woman baking gingerbread in a warm, rustic cottage kitchen.'\n",
-                            "}\n",
-                            "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - " \u001b[32m'character_appearence'\u001b[0m: \u001b[32m'An elderly woman with flour-dusted hands shaping gingerbread dough. Sunlight casts a \u001b[0m\n", - "\u001b[32mgolden hue in the cozy kitchen, with rustic decorations and trinkets on shelves.'\u001b[0m,\n", - " \u001b[32m'style_attributes'\u001b[0m: \u001b[32m'Photo-realistic with warm and golden hues.'\u001b[0m,\n", - " \u001b[32m'worn_and_carried'\u001b[0m: \u001b[32m'The woman wears a flour-covered apron and a gentle smile.'\u001b[0m,\n", - " \u001b[32m'scenario'\u001b[0m: \u001b[32m'An old woman baking gingerbread in a warm, rustic cottage kitchen.'\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEAAQADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDy8W5CqR3pTAeRjB71vw2G+3Bx0NWRpJLH5eorzXiUj1vq9zkmtD1Xj6UweZH95cj1FdXNYRxKDIrKM4JAzVd9KEqlomV/dTVxxSe5m8M1sZ1jEtzC2AODTpdPZc4HFX9OtHgnkRlxkA9PT/8AXWm0IIIYZOOMCsp1+WemxrCknHU5p7RQofI+ncVSWHN1GpHDNXTTWYxg9ScYqlJpz5BThlORn1q6dddWKpSb2RK8MclqYnUDjg1zBXbK6nqOK6YyoCWY4xyU7is61tIrnfI+QSxP4U6U+RNvYqrBTasZIXe4UVPHcvCxR/mAOPcVPFB/xMNgxgMRUV5Bsuj6MoYV08yk7M5OVx1RP+6uFypGapzwbelQM7RtlTg0v2mSTgkCnGDWq2Jc09GtSAl1Yhc0nlyN2/OriRqBUgjz0BP0FW6liVSvuyktuT1NSiEAVcWBj/D+Zp32V27Y/CodXzLVHyKIiyelSiHtV2OyPofxq1DYFyBz/SspVkuprGi30MkxY7Ughdu1dCNMz0Ump00r2/Ssnioo1WFbObFt608WRPRTXUrpkacvgfjiphBaRj76D9ayeL7Giwq6nLLprkfdP5VOujseoNdC89tEONzfhiqsl4ATsjA+pzU+3qPYfsaaKCaSo6irCWEY7fpxUMt9Pv8AvYU9MDFQy3DSKd7E/U0/fe7F7q2ReMcEf8aCommgj/jLfQVlfaFCncwyOKje6Q9CT9BmtFSZlKojSbUY+QsZOOOeKrPescgKoFUPMdmJWM4PrxSMZFXLFR7VqqaRk5Nnp+m2OY3UjvXQLpIKxtt6r/Wm6fCBcyJjo5FdrDYxtYxOBg7iP0rwp80noehKaikedatpQS3YlOD7VyU1r5b5QlWHocGvaNR0RpoCigNnmuH1bwzOuT5ROO4Fa0p8ukhRqJo4+G+liYLN+8Qe3zD8a1rW/sZsJ5oRvSQY/XpWXeWE0BIOcDsay2kKkh1xXS6KqLQPaRW51l3YPzIqZUkYZearJatn5VyoJ61i2eo3Fs2bW4ZP9kHg/ga2YPEjHi8tVf1eL5T+XQ1lKnUjpuUmpLQw/EECxpFIF25Yj61DpCW8luytKFkDbiGOM1vasLLWLFo7aUGUfMI2GG/L/CuMuLKa1cghlwe4yK7aH7ylyN2Zy1LwnzJXRtWNmLnWpFHAVePc+tJrukvFF5wGNo257VixXctvIsqsyOvR1PSpr7Xbm7iCzTGQBg2Og4+laexqqonF6Ee1p8jTWph5aRgvUk4FWRaPj5cEjqKfZ25cmXHQ4FakNsTE74JI9K6qtXl0RjQoc6uynaKHXsK0Y7fPcVmPvt5mMeCC3epTeTDAL4PtxWE4yk7o2hKMdGbMdkByW4/KpVWzQ/NNFn03ZNc5N5jcmRmHuar7ircHFQsO5byKeIUdonXG7skOAcnthetRtqMSN8kZHuxrmReNja3IpftrYx1HvTWDF9bOm/tR8cBR+HNV59RnU7llYjuucZrn/tjjpimPdu3VsD2prCWYniro2jciUbtxP1PIoS+WL5ZHAHYk1ixyxg5bJ+pqwt1BHyEGfpRKjbSwRrX1uaTahGykKrPn0U1B59w3CxY9Cxqq2qY+6lPtbp7qXyzlRjPyjJpeycVew3VTdrj5ROw/eTKg9AKqsYgfmlZ/qauX8DR2bfumLH+I9etUdPtlmSRpIy2PumtIW5ea5lN+9ypCiW3Xoq003SAfKKghRftm1wAA3Q1o3am4aOKPbyDx0H1q5RSaTIjOTV0VUnaRsAV0Nh4dfUohKsErgdTuxVDSLKIyAy/NyOhr2rwNaW4sAAFIJxgj3rzsfivYL3EdlCmnHnnqUtLZvth3n5i3OfWvRrQ7tIQ4+44H6/8A1681snA1EcnBOOa9G0pvM0ude6nP9a46fx/IMR8KZr2qDJBAIxjpUkthbzDDRj8KS16tznOCPyq1XdGMZRs0eZKTUtDkta8G2t3BI6IhIUnBGDXi/iLRfsN48YQgDnmvpNxmNh6ivKvG9grXZ4/hFRyqlNcux1UasppqR5JFaNIAFGTnGKsG0uoOGRh7MK6bw/pqSapbpKuU84Aj2zXr9z4P0+YEKuB/dYbhW05PorlKpGDs3Y8M0C3aXVVDRjlGH6VtTaKsrSqY8nPp616IPAsNrdrcQIoK5+6f6VFNpGwkbTnrXBXnKLvax0QqRl1ueJ3ehqCCF2kqDkVlS6G7ZwgJHp1r1DUNLxGTj7quPyOa4TxHDJa3yPEzISDypx/nrXVh8TKb5Uwq0oJXaM3TYXim+zNCPXLU+7upoXeJMJjI4HWpdO1KS4uRFMwcqCRwM5qMst7eOQflJJH0rdp87c0TGdoJRZkxyNIxBGSOeaWWJlcofm9xV6K2X7QcYBz3OKimJaRwTg9M+1b865tDFw93Uzz5kJIPbsaieUN0BzV69hEcYIYsOmTWaGA3epreFmrnNUvF2CMb32g4NTRW5kukhLdeSfaoIQUlDkfrUxc+f5gIHGMVpJu+hEVpqajQ2yw7BEn17/nVGwto5pW8xDIA20Ddj86UShhhmbHsK2/Dvh251a48mwt5ZT1c78Ko9Se1YaqLNtG03sZupWCwWwkSGNOeqsSacllbR2vysZJmHUDOK9G/4QqwsIQ15KJph1VB8o/E9fyrHvYbOAlYkZQPcf4Vl+85bD56XNdHERaexQlopC3YYwKu6Zb3VkXP2dSzdGJ6VsfZvOY7Z3b/AGd2D+VMNpapzI65/wBpqzqVZNOMjalTh8USjem8u4zG8sUaHggMCaigja2gEQuFA9hmtEy6dH1dSfYVE9/Yr92N2+grOLlblUdPQ0ainzN6mZ9jt/ML4kkY9+lP8gjlLZR7sc1YfVF58u1OPU1XN9cSkiO36+gNbL2j3/Mybprb8ia280NkIODjAFdPoni2awiHlyYKnkbRXGtc3luWVlCk84xVZpJuzFQTnipnho1VadhrEcmx65Z3JN3G7HneM16joLKxu4QQcnj9a8jMaW8o8py38R9jmuy0qeaK4bG4ZUMPyryHLllzI6qtPnjY9BtHyIz6jBq/2ri4dQvYT+7Ytj7oIzVkeKrqH/X2YI9RkV00cRC1mefUw873R1R+6a858ZOPta57rW8PHOngYngnj9wAa4nxdrVle3ETWkxdQnOVwQa0qSUmrBRpyjLVFLQdovEYdRL/AFr2qvAdBvcX65PAl/rXvw5UGt0Z1t0IazLiAPzjOa1MVSXnI9GNc2JjdImk7O5xd/aAhlI6s4/MV5Z4wtwJoD6rnP5V7RqUWDkf3/6V5R4yhP2eNwMleP5iuHCy5aqPWT5qZyOk6LcX0plt1wU6k9OaiXTLrTL1raVSJGX5T1BHtW3oGrW9pG9tdMUDNuDAZ/Sn6hqcGoamghUkxptUNwSK9J1qvtGmtP66kqlTcVbf+uhzmmyJBrQOoqBGCScjIz2qXxFqVjPfp9jAwi4ZgMAmoXzLcXTyHO3JGD+lVTBHLEZNuE9c11JRclNnM+ZJpFSe4EqbQFAqpFG00pRCo4zk1OltG16kYOQeoB608xFLxljUqB1+ldaairI5mnJ3Y9NNLfeuB/wEVYTSoARuklb6CrygqoCqAAOtPyUlijbJLnAJrhlWqPqd8aFNdDT8L+Do9e1aCzijcBz8zuchV7mvarwaB4K0ZNKtNsTMMiGJd80x/vMBz+dc38O9MubTT7u/i+W4mUQxMRkRr1Zv5fnVm7MOmyyCPdJJId0k7nLs3qTTo1JO92ceJUXPlijnNY12JSUlt7iBj/z1SuQvLrzWJyNp6EV1+t3tvMXd4y8pGFPZfc1wF3HGkpkgkJY8nPQ1uqiezMlSa1aASMj5B6Vq2kUOqMIp1G/qG7n2NZMRWUe/Qj0rR0rctyvZlNKeq0KirM1v+EWt1xmHP41Ivh+3iHywoD64ya7pLKKSytZdufMUZq9FosZbhF6V4rxE72bPQ9xK9jzw6OiryhB9xVWSxjTO7oBk8V6fcaasY2vs54AxXnXiy6itUuYYeJunA6D1qqU5TlyhzJq5xM8RnmeQkfMePYVVljRAfnzjtUcks7dwBTIoJ7h9inJPFeuotK7ZyuSbskeqXUEaOzR5wxOAewrsdLYSvbt1zaL+YGP6VzV+xe3jkJQeYxbaOq8VueHJQ5tlY/8ALJl/LdXhSd0ejJe7c6632DyjsUDqT+n+NXvLhMLF0BxWcAVt0Yc4OOPzqaWciMrkgGnBprU82rdPQU6PZXhRZIUIYcnFea+NdBbTLxfJTEbDgivUtPnDGNfQ1k+KLNLqeBXGRu5/OtdIpSRVGpJys2eO6cjJdtGB/FjPqa9StdF13TkTyb9gMA7TJkVwy6WIrlJgMK7nHOcEEV60JmaKMn+6P5Vq5cyumXXfI0rFe3utbjAExV/cgGtCxuGmdw4AfrxRG+VWs6G4MOsRx5xkgfnWMm7q7MlaSdkTakqiN1H98EV5h4wtidMkKjlcn9a9auYo5iVYda47xDo7PZzLjcpDc1zW5KikdVCa5eU8FAuDc5SF2+gqdvt4vUlEEsYUFd5jJFdDc6S6MfLZl+hxVTFxa2qEzNvdsZJ6KO/+fSvWddP4UuxUKfdvuYt1GLNHLSq/nocdiD7ilSyeTT5AjDG3rV8ajeSypFKIpkY4w8YNQz3tqNyfZMRtkAxOVyM4pqdTa2v9eg/Zw1d9P69TmYEkz5qE7l5GKu2ryTyyzS4Lup6dvbFaLXVo8AghUx47tECR+Iqpaqqbhv3ZBwcYzk11yq8yd1Y5Y0uVqzua9vbmWQAYGOSTVyOxD3kHmY+VsgioI22uAPUHrUq3ZjvLdT0JNec+ZvQ7ny9T3fw1DH/wjdui8bgdxH1//VXK+K4hbXhCjCnoa2/A2oLcaHJbFv3sR3D/AHT/APXFcX4p8WR3d89uyCIxvtDEd/c/hWKlK9kc1Om3UdzM1pfKsgcYLVwd4Jo3LFSFrsfEt22neXHMuS6gxsD1Ujg1i/Z55IP9It98EiZEinDIe3HpXXRk0uZrQupBPRMx4ZwrB+3f3rc08j7Ukmcqw61zkcG2d1UkqD1PFbFk/lwugPzL93+tdcvI47dz2bRb+K/0LTrdQDNHJ5be47V11taRZ3hfmPGa8e8G6t9lvoWb5kVwSK9siRZMSRShQ4Dc968yrRam5IHP3UivLZo+IkUAvx+FeFeNY1Gp3wT7vmlR9M4r6HjjhjfeZAzepNfPfilxLe3EmOGmJ/UmnCPI03vc1oPmUvQ5AWmeSpYegpsYNo4lGFAJyD6elaEl9EEIQgnHYZqrIfPtCGjILOCDjHHNdKlJ/EtDflivh3PRZrVhD5rSp0Dbe/NaPhxyLu3XtvIrIUb0Jzmr+juyTxkdVkrx6l0jrSumekBd6SAjGfT1qjcOwq3azLs8tjtGDk+9VZoWkyQDRSZ5dRElhOROoI79BUuunc4I/hBP86rWkLxzqSO/NReK55LVUKn72R+FbzdoCoxvUOXuAgjs0UgsC5YDtlq7m2y8MfH8I/lXndrKst42eDxXoljIFto8AfdH8qqDsjTFLYtxrhlHuKyLpdniK37ZZc/nWzCcyKfes++jxrdq3cOv86JbL1MaL1foX5shnbsuOKrNtlidSAwzirsikvJj05rHd3tpZOPlLdPwrCr7rNKepyOs+H2KtLaYPquK891OOeByskeCvABHSvZUliuWfy2G4HBFZWr6HbajGRIgV+zCrpVlF+8je8jxKSfZk7V3AHofaqufNiJVSdp5x7//AKq6rXvC09hKXC7kz1ArE0+2MKy74w3zY5HoP/r16kZwceaIoKUpcrMWfMcbHBBYYH0p0MTSmMj+E8/nU+qIWJAUkq/Ydqz3klghTBZSSePUe9dMfeirbmVRKE3fY6TyZC52lTjpzU0caGRGlKhxnHzVzMFzNISoRS2OAFBz+lSR3E7A5SMEdcoM1zvDz2uarEQetj1zwVfPa6tCSyrG52MN2cg1o+J9Ps4NYaCVIwjuXZgvzZPvXken391b3EcimMFTnhQDXqc2oHxRpH2yCMPqMaBZFzxn+9XFWpyovm3Nac4zn2uc18R7eNdV0+GJGeNII1RFHJGOP0qS3gF5of2W1++o+dCfmra1DTbzUNGtryZUedYwhYn5sDjFee36XVvc5LlCpyAhx+taRlKaUYu1ioqMNXqR3GnS2Tv5i7euKp29ziViBgdBWprF0WtAcku3c1z8TkBiOxNdmHbnC8tzkxSUZ2idLpd8LeYHBGGBBxxXsvhn+wfENsga4dLzo0Xm43e4r57g1IxPyB9a6HTNeEboy/K6nIYHBFFWipbo51Jr4XY9/uPBml+S7FrgYUniSvIfEOnHKgk7SxOa9P8ACnittc0a4inYG4ihJD92GO/vXK6vbLM6Iy4J/I159W1OSsdOHlOSalqcHFaRb44y8RZiFAU8mpL+3igk8lcbVQNz/OumXSxbyidIF3p0JHArL1KwaWZ5XAHyAEAevJ/SsOe899D0ISVtUaVopeAMAWXH8PTFT2IZTkDowNcPoGuXFm4C72Q8Fc8Gu60+dSpzwcg1OKpumxUZ8yOxhub3b8o47fL2qOabXhKTbzBY/QgcVesXRrdGLKAQP8Klun2DIINc9NPozkqTSv7pmC78SIR+9hP1Rf8ACsbXb7Url0S/ZCVztCLjFdDHOXlQKOc9qg8T2QeSIqvzFiB+NaVXKMbt3DDzjKduVI4WNit4xUkcCuzsL/WBbR7YIWQD5Sw5I/OsKHR5BOWOA3dT1AHeunhV0iSMJjaAAaqnO/UvEtJLS5Zi1TVlxmyt+PTP+NIt+93qkDTIqOHXhenWli85bhVIOCazL2b7NrEDEhQHHJ+tVNtWd9Dno8s20lZnanLOSKp3EIkDqQM9aLS5LxtIXwAOSKivJfLfezgBuc5olLmjczjFqVjhNTjutL1R5oCdmc4rZ03VoNRjCSYWTuKZfulxPIykMM4rn7mzeFzLbnBHOBWej0Oq10dFqNiJImVlDIa4268NKys0I5ySR9SK39N8RHHkXf0ya0pIYnXzojkHnirjKUNCoS5XdnkOraRLaTGVoyR1Ix7n/CuX1APNLuI79PQV7VqdslypR1xx6VwGuaGYgWUZB9K9HDV9UmTiPeWhx8E/2aQOmNw9s1J5vmGSRhhmIJ4qd7TYcYq4lgREAcbs5IxXbKUVqcsVJ6EVhYzXskaQozM33QASTzXo2jaPN4XlSa7ugtyy5+zj0PZj/StnwlptpomjLeOqG8ZNyk/wryePy/lXHXerST3F1NKzO5Vjz0ycivKq15VpOMNkd1Cit5bHpFvJ/bHh+Se1gKoCyqGI5x1xXlWuqiW8l3EBKqSbGH90+9ei/bH0bwzZWcWVnMSA9ipb5m/qK89v5AupXaxxmSzucZwMj5hnH1B/lUQjKM9Ni6PK07/I5G5uWmbe5yMdPSmWse+EejE0XtnLazPC3IDbQR3rR0y2LwYA6DP6mvVi1GF0cVRXlqYJUhzx0qZGKEYz7cVPLb/6VIMc+YQPz/8A1VX6yOQcKPlUn9a6U7nO42Os8L+KrjRLsP8AfjZSroT1U9cV6Sb+DUYobm3ffE65X1+hrxCN9zAKBhecewruvBF1J/ZroCMCTIyenFedj6EZR9ot0dGHnaXKeg20RnPl/Nhuw6Vp6xoVlHaLGEXzQAWO7kkDp/Oq2gXMdvMZ7rGFGUXn5j+VZuqajK9zLPkAFifvV48Yv5nVrKemyPM/Dll9plUHAC8niuws0KzMua5HSbxoImaMc8A59K3LLU2aXJIyTXTi1JyZ04dLlPU9HtoZbEOy5YHGasXqqlthFHWoPC22fSixbkN6+1azxQ7h/jXLT+FM83EztOUTEtoZEkDrnBrYvoLe4aMyt054YDt0qdPKBCgCqOoyQXK7UOTu2AZGQaqu26ZjSvzaGRPcBZpY1iQKv3XY9sdc1QGuCNUjkJK5wuay9e+1WSk5IQk4cDqK4+e9eSUqGfYTwprKlSc1qeioR5bnrun363ckaJ977u4jOKyPFFuGlYiWNGUHhj1p3g2xkitVuJlLF8FRjP41W8VKQ+1+GZXzn1zVtNJIyoqPtXYw4dYvra3eASusRGGGeKrz6xPIgUyuwHAGayobiRwYlYEA/dYgZq/p5NhOzuhZiMKRg4Brdrlvc6eVS+FEthqzxy/M3yHtXSrtmQPGwINc5fRrIkcybQTksNuOM96hsNVezkxklM9KVudXiZzjym3d6atxlk+WT+dUrbUrjT5vKkzgHBBrWhu47uMPGw5qC8tUuUw4+bs1KMmtJGb1LYngv4sqwDEVjahaMFKsuQapMZ9Om6nHrW7Bcx3MQWUseOoFWvd1QrHD3WkK0u5QARyBimW9k6SZYZyeD6mu1uLGA8oTkdMjpUVnowvLtI0bDE4Gelb+30Eo21C+uJIEmHREQxIvriM/yxXDaJD9v1dInUEPMu4ey/M36DH411/i2/xrMcEW3yoZdhwPvE4BNc34TiMT6jc8jywyA+hP/wBYfrSwsEot9zpqzfItLaG34i1LNxatksXuSOD2xgfyrnTdC3mIEhDpOyqCOSoJGR9MEfjTtYkJtIrkklY7tQBjj5QB/j+dV7i6mfTLuGOKGGJrrzvPzl+g4GeRjJNdahoc0XymReMr3gjTBWNTI598n+Q4/Otvw7b74jx/yyU8/Vqy4oWNnPMxw7lo1AGCAAOK3/CvLJHjJa2GR77j/jW11ay6GU07XfUwb+3W1S8m5BEj4wO5J/pXPNlYo0UZ43H6nn/Cuq8UKUt7qMDAWU8465rn7ZM75D0UEgevHFaU5aXCUb2XkN2CKzcdTnBOPxNdB4PvDDFIoOPmzWFeL5Wngt99yTnv6VPoM5glhGfvkjpTqR56TRlfkqI9VXUo51DB9gVeQPWs+71XJJHzYHJ9KoWks9vI4kjHlt3I6H1qld3IaUhMMfavHhR947/ae75mNpl15fLICnT6/WtGX/Rp42ikJikGV9V9QfpXNx3WCD056U65vDNIilvu813zo80jOFXlR7R4P1qzs9NeOe52yu+SDzxiuui1jRyuTeA5/uqTXz/pkgX53zj+Eetdlo2qxQyKZoI5k6FGJH/6q8yrTdN6amn1aNVubvc9As75570hriQwbvvBcZFT7bAalBDM5jLbmZicA+2a4m61KIamWh86K2cgom/OBTtU1L7ZNgIYxGuxVDZAFcl2t9UaLD8z00Op8aX1qunCOPyyUONo64ryaSZWn37QF9BXQyyyPB8/zkDAyecVg3USxtuGOT+VbUmpSbe7NI0vYx5Uzp9D1S58ryPtEscI5+Vuh+lXNQuI7mEpJKzMOA2K5jTpikMjRyxDHBVm5Prgd66caXb3sUcq3jruHzfuCQD+BpThLm8g/dx1e5x9zZ7JT5ZZh/eIxUMN9JbkoWYY7Zruk8ORbQFvFk/34igP4mr8PhO1mUGTyFI6ssqn9DW/OmuVq5j7WMXdM4i2ne/JjMuwerA81e/4R65kGUlib234/nXaf8InpMS7zfIg9WdMfzqhcvpGnEqupxuw7Ipb9RkVSk46RRlKcajujBtdF1eykDR27OvcKwOa2dlx5Q8y2lQ+hU1T/wCEnRDiIE+7N/SpB4kkkXG5VHtipk+bVoFCSIZ9j/JIvJ7NVWKIRNgNx9aj1m9Z4El35YNjk9RUFteCUKrdSBQotRuNbmyimQD5zitrS7ZrS3uL0nKou1eO5OK5uGV4CN3IJ64rp9Sl8vw0/O3CRtn1ycmuepfYq12kef6zuk8TvCzNgT5XPc7q6Twl4bjNgyXCsI55AzAHBLEf0GPxJrGu7Z7zxkqqcLO6yEr3A5z+HWvU7G0ENzDAowkERdh/tHpXVBtQVgxdSySOH8Q/DYnRpVtr4BVPmKJV5+hI9a87v9GuiUQtCAuFkKyfeHc4/AD1r6B1mcxaRIy8sQFHua8b12Dyy0hXMpPQdq6KU5pXOalL2itMxLiyaFAsrKnDnbnOCe+BV/w4Vt7nzUYtlREMjAz1/n/OsGTe7bnY5xnnsK3NLQQQwsRg8ufzzXTRi7e8wxM09EUPF6bUnzkPKm/aR6HB/kKwtLQzREIdrHA3Ac8//WroPGaN9m+0BiQkxB9MOM/zFc/oLmO3lbng+vHAP+NbNWg7Coy5mkyDXSokWFOAigdepqCM+Q0WCMgA9afdGS81Abm3MTy3rUVww+0cHgHg+lbQ+FIyq/E2epQ+KrSSyi36Ukj7AGcTsMnHXHNUJ9S0+c5Olqh6cNXJ2BS5jCHO5RVs6bIeUYj8a8ypShCTV7HXSblG6VznraAyjc8gjTOPc/QUjwhSWV93rxgirdlcRWwEjRCR1+6G5Ue+K0f7TivopI7iG3IIwH24K/Qiu+UmntocsYprcy4bmWMABzj0Nbmn38ityw6jtVBNOt5FGyRgMcnt+dSx21pCw33fHoDn+Vc9WMJqx1Uqkobno2laBHq0cUv9qLG7KMxmNjj2zW7N4J1FsG3limBH3iCpri9F8VppcapaPckgYyH2iuot/iJqrLtXy+nUruNedKhr7y0KlWq3vBmzp/hOaBNuo6aLgescgzUtz4Y8NYzcJLaH0kFc/L4l1a9zvvJcH+FTtH5CqEouJiTsmkY+ik5oVO2xm3Nu8pfcamoaD4VtgXTWXz/dii3Guem1waS2NKu7srn+L5B+QJp1xp9+VyLKfB7lDWc+jXzn5raYA/8ATMitY0rvUftLKzdyxJ8StfiQqLhR6EgE1jah4p1O9i3XV9Myt/Du61FdaDMjFirfSsa/UwqikV1QpU7pIy5rJysXNN1JpLiVCxxgHmtdbgnq2R7f/qrmNLAF42OQVrbMwjwo/wDrmor00p2RvRm3DUtrdAHBYj8aet9sbr+tZb3QUqWfbk8c8VVlv0Qbyd3zbSM81mqTeyLc0tzc1LUD9njXOQz/ANKfC5yhUnJ9K5y4vRcrEioRht2fwrc08HcgJyD+laSp8sFcxU05ux2mkPBJbpJevsjXoT/ERWh4nu420gtApNs8QAXJ6g/559q0dP063HhmGSdEkUoz7GH8j26CvPdUv7qBbiAxqN/q+7aAfr6V5cYudX0OqlyyXN2Oq8F28Wq38N6TuMcSq3H3T3/QYr0OL5Gu5T952wPoBXmvwp1GFYLm0Z18zzNwyeSuOP5Gu7vL8QxswI4Rm/E10tcs+U4a/NOYmtyq+hHLYbdjrzkV5dqcUrBlUZd8DivQbm5intmDNkfewPXFcqfKfcgTDgcGt42TdwpJxWiOJi003N46g5ji5ZvU1d1PFu0MacLtx9eKvughjaOJdqgkn1J96zLndLEm7+HmtViI7I0+rzk+ZmdrMwvNOli2kkxDHPdef6Gsa0QpZxxqfmxnA9T3/KtS8XbGyntn8qxEkcriNB+74LMcAVvGXNEagoSLMcUUEm9+MjacHJyRWXPauGZlyV689ac3lDPm3TE9ljTj8zU4ura3iD2qI56N5gyenWt4px1MJ8s1Ygsrl7adSOCDXZ21xHPbiROB3HpXErIsjlmGD3xWtaXAjjK71Ue9Y4uiqkb9S8LUcJW6Fe4PkoYbd4pQxO5wnBHpyKNPe5tpwyICufmUADdUB3DgHnPPpVy1tZ5drC4hQFgvzNg89/p70TlaOrKpwi3syS7ihNvk3Mn2nP8AqjH8oH1zRomhXutySG2CrDFjzJnOFX29z7CojHvlYAODtwd3f3x2q/4b8S3OgRTWqQxzQSPvaOQdexwR06Ckm+V23JqR1TS3OisvDdvbKpbzbhz6nYv5df1rorKC3txtFvCrjsEzj881z0Pj/Tw2ZNOlj/3XDf0q5b/EHRIpfMeyuzk5YDaM/rXJKnWk9RtpLY66ws7u/Yi3JVF+8+dqj8q3v7MtrdUVw08iqTI5cgE+g5rhz8YNNiQRW+kzLGOcCUDn8qrP8Wo5c+XpLc9Mz9P/AB2qjhmtzGUpyeisdg1gt3PKCr25UDaoOVJ/GpE0ieED7xPcg9K89f4kXsh/cafbRn1Ys5/nT08aa9dECS/8pf7sQC/yrKrSUdbm9OFWWiPUltrUWpGqCNoivCyjLfh3rwvxNBANTnWD/Uhzsz6ZrtEu5poHlkdnfb99myc1y95YvPMCRnmjDzW6HKi4Oz6nMRIbaTzFOPrSG8fzfvksfQdKuz6fIJzuGRnvVZ7QrIDjuBXcrPVkXa0RnebI0rBmJGScds1FdLi4Zh3wavtaFZmI9TTntPNCE56YrXmSlcz5W42ILSRWARun8q7XQLJ7u+gt15MjBQa4tohE+Bxiuo0DXZdMm8yMgSbSqsRkrkYyPesMTeULxHSVnZnsV5cQ2thHaJwxUJDEF3M2PRR1+vSvNPEmk3tqryz28oVjnL4JP1weK6P4f3Jn8WF7mQyvLC213bcc8Hj8K7Lxlpn2zSpAmAcZJ/pXjUb05XZ2Tl7Gp7Jdep852+qXWjaktzbyFXU+vBruLLx9FexbLjejFcHIyK4PXLcxX7x7cEY496u6RbKVXIr25U4Thd7nPJtTPRItcgmC+XMM9xmns67ldnVWHXkc1h21msi7QiEDjk7TUkumNGu4oy84H+RXBOm0dEJQZfuJbbJLOgz796yJpIQjjzBjnBpGg28lX/DNSRaNc3gzFG4Tu7/Kv5mseRbs6FJIwNSmEn7uBTI7YGFHeiHw5enyzdBIF++UduT6ZHb8a66xtNF0KYXV3c/a7tfuoh+VT6+5rB1/xDHcSn7NEIx34Ga6Kc5u0aa07szbjduZS1ldPj090jZmuFIwVX5QOhye9cpnDEkADoasz3Dy5ByBgZAqrkelejRXJG17nHW993RE6bH+XlevPFbGnwb7KWQjgcVmYDEjjr+NdHFGLfR1THLDP51OJnaKXcnDwvJt9Bi2AY4bOWc4wM1s2mgsVBMhAPT5cZ/Sm2iC4uAehDYr0vRPDbT2pfvivGxGJlGy6npNRpq7PNbzSRbtGyLkbcEg5zz/APXrF/suT7QWGAue/pXpuuaY0D+SFLPuwABzXJT2s/2owrbStJ/dCHNXQxDkTKEZQTORubYoxHTHaqbqy966u+0u6bmW2eE44L965q9hkgfEg+lelRnzaHNVta5V3HsamUkjhjVTzNtKJ/eupxZyqaNW3YD7zE/jWvYzqH6fnXLrc471v+HZ7I3ym/ZvLHIH8JPvXJiKT5WzsoVop2PW/CWnWtzZNLfbWD8Im7Bx61vy+FtLkyyI6Z9GzXHDx1ptuohgjF0/QBR8v05qOXxBf3MbGS8hslbpDCu5j9cdK8ZKrBa6FTpupO6ZsX3gyzTL/blTH/PRR/jWGfBJvGka1vLeUIcHqP6VWt3in8xr17mZQMh9+APqo6/nVnTdWW3YW9jJ5IL7izfNn8AK1jUq8t1L8BSw7i7My77wLq6SMUtRIp/uODVQ+FtRhj/eWcy4P9w167Z3RutpSKV+OoXArZ8pigPl7j6DGa0hXrNe8jmlJRZ806lpk0MygowP0pFt5FxwQa+jptOS4/1tluz/AHkU1nTeFNNuD8+mwk/7KYP6Vr9cnazgyVy3vc838EW95b3sGqOpWzt5QHdu+eoHqcGvQNR8To93LA8LG2x8soJ+U+hrRj0e0tbMWaRIsKZIRzgKfvZ/z6VwvmxI11ZsVYpKXjcN1B6j/PrWkaUKt21YTnrfexh654cttZlvNQsWYNERuRx2x1FctZxNG4XBwScV6FoaOb26tYgWS5hZVyOnfn9antfCcFtMk16wSCMHIA5fnt/jRGUo3j9xvJq+phWNvNLbhjGzAPnpxW3Z6TNcYLERpg5duB/9emaheyTt5qu1tbQHaiRHasY7DPc96y9S15ZlEaXcrhVwC7E9u2K1am0ZpJvQ29V1PTNEQxW6LPc4+/JyF+g7VxGoa9d3jEyzu2egBwKz7iNnlEg8xiCMjtVqeONnEqjYMfdA6VHJCGr1Z0QUnpEzJppW+UcVXFqzEs/61bub2GInHzOfSs26v5GIC/KM1rFVJ7KyFKVKnu7sbdG3iUhjk+lZe5WY4GPrU7rvlbPcU+KwaY4RgSR3rpjDkWpzSrc77EcKEyAdecV0t86xRRx45JwPwFZFrZyRToz42A8kVqXbRzqGBBK1yYiSlKJ0UYtJmrp6iBjKJFYs2dvT6Yr0rQNXvo7VUWLardDKdoP+NeZWl3JoE0bf2et3IeN+dxDdwB+lbcs2u6jcmSOS2hiCFgHckruGQu7GPy9K8+rh3OVzepOElys6XWZNRDG4swl1OzfNHtwCPYkiuZ1Xxrq9vG4XRp4pFJLvIpKJ7DA5HfrS23iPXoIXTULCGDy/vSzSgYHrtBy3bHFc14h8YXlxiK3uYTCwILJFgg+nOSB06GtcPhWnytXMZzVi3Y6jrHiEh7lybdmJDkKu4+3tx+dNuvDC3Mm15njY9VZeV+tM8Ma1aWNjFYXN5LIZWAWIJ+7iJP15znntxW1qeufZbqO1i0+W5uJXIRAMbyOBxjdjn2zXS1KEvcViOZONpHH6h4MurZdyzIV9XBFc29pKj7WUg/SvQdX0HV5YftOo3kVouPN8gy72x7kcD0AFVNZtorSzt4P9XJkYKnJK7ef1xXVSxDuk3c550Va6RydrpdzcuEhiZmPtwPqe1b9t4b8qPfc3Se6RHJ/OoluhaARxE7idzb2yT9e1S+Y7ITg49+BWs56EQi772JyILZ9lsigAct1zVm3uBkBdzyHsKrW1g9yxJ3EZ44xXSWOjyRRqyDYfUjtXDOlzvU61iVTVkXdM024uYMXJRI3IzGeuPeu00XQdNt7gPHFGcdAi8fr1rm7KxedtzHZjrtHX0rbimvbFkgFmkkROFeJtpHuwNc9Veyj7iMnN1X7zO1aa3tNkeURm+6pOM1Vm1T948ccc8zocMsMZbb7E9qykvCxGSSR0z2qaKa5lvttsEjTaGkkOSW9AAD19/pXn88qkvebS8g9koq5sRx3EyA7Wi3DOXwcfhnrUTwXsW7y5o3x08xdufy/wpsw1cypJBPD5A5MbREs3tnNDrPMBHcXMqTFcstudq/h1P610ulTjHZmKbv0MHxHqNxHE1vBt+0Aq7HGVxjHHqOua4VLRYphcsCctnB9e4r0vU7Nr+2WGHajxqBHMfmbP9a5a70bUrWUO1ujLn5wDjPuAe9dNCd9YmqlFR5WP8Msi3rTIAViU5JH3fatPUmJzcTKTIR+7jIzz2yKzLaZbOyXbDiR5Sdrdj0HHc1WvdT+z7w0plm7kdFPt/jXQowTcupnaUnoUtf8AJYKbqUsVAzBGAAp9C3+FceR5srFIxjPGF4FauoXCzIWnkwCegrHn1nyyBHEu0DApOVzrpwsbeheH59TuHMUfyIuWPQD/AOvVjUPC7Hd50brjsDwaNG+I62NutsthDGB/Euck+ufWtceOba7K+fED9elc9OpVUtYk1VJ+hwV74bRHJVJAMfwnNY9xo8igMQwHv1r1Oa9065Xf5O0n+JAcD8j/AEqleWI8lXSR9rDIZsYP511rFW+JWMVQcvhZ5gbCQPnp25qe0Q28ql+g9q6m50ieY7Qqk44wMVQuNFubaQJNEE+XcCGyCPbiuqM4zWhhOEoPUrl435B/Sq8sW7JXFXY9OldtsUbuw/u4Na66HLFahmZRJn7si4wMVh9WjfRmn1uS3M06/YJFBcSb92SyyR/PhvdeM9T6e47VFaeM7R7qQGDyYgwaMsC4+UYAO3GPbHQ+tcUjOgwrcHqKcZmHYj6Hj8qv6vBFe1ky9ql8Lm/mkt2kZGyFVjkgZ6VPoVrZ3c0hvJUIQqGVmA4Oc4Pt/Ws5bxh3U+zIKlGozLjAiBHQiJf8Ku1o8qDeV2zT1Dw9ax/Np16J++0Hke1a3huY6HbvqNypbUJOEa4baEX6n+gJrlm1a9brcOB/snH8qpS3c0hzyW/vMcmplTnUjyyZSlTpu6R1mqeJWuJjNc3P2ubdvCKmyIN646ufrVG1ku9SuDK4LsTkFvWueijd3yck+td54WhHyhiwPcY4YVcaUILQwqVpSXkXtO8M3eEvLspvDfu41GR+Nac62JfN1bYccZU//WrpBFELfYykkjG0cVj6lHaJJuZJSc8kkDH0AFZzb6GcGpP3iKG7sYyAoIx0G3FalrNFcBxkDaB94Z/SuXuJoROAgEQPA3f561oaeJ48So6BCOpP3hWXPK9rGrpRSvc6u1TyYRjb8zEqF43VBMNSuw4spI7YjkkRgj8c8mo7LUYDG0VyCCpyrR9quXF5a3Mfk200sMxPyyqo6+4J/SsasXJWiOD5ZaoktmnEKrOyPMPvNGCAfwpwmv7a4MtpLbLuADGWIswHovOBmsIp4qiL7VsZYl5EjNtyKuJqHkQxrqLJDcEZJGfLb6NXA6VSm+Y6eaMtDoYfFt3LfNH/AGHeJZqp/e5Qsz54wM8j6Uw6nqN1Lb3VxFJp9vEzMyB/MLDsGQdPXrxWVHrFlEu5ryFc/wC1Vuy1e21CFpbWUSxo2wkDjPpTniKltiVRj2Out72wBitIpoSxGUjRh0HOcc4FVdQ1fTi5tjcWpuFYKI5Dzk9MDv1rEjsbJt7fY4VMg+ZlQAkfUc1YtrOygj2RWsKL6hefz60fXUvskfV0ne459CW7nmWdw8wAKeWhRVH1P3jWJqfgyVc3HmuoAJY7+FH5V0NrqF/bPHA9v5sQxvuWm3E+vy/0FRXHiqwkS6jLTJJDn5GjZS/045rpp1oy1TuQ4VE7I8vu9DEjB7dZJ1P8e7isSfQLsykFdq57noK9RW0XWL0zyG9tlRVeJZUCLvB6EdWrJ16yWxjMk8kQDHg7gMn6VbxNFvlT1LTrRPPJdKtbZts0/wA/pWrpGmGebykjdo/4mYHj6U5tQggdniMckjcABAx/Cu1tZEjtoC0Wx5Y1Ypj7uR0rSPva3FKpJaWM3TdP8q5ksZDwTgH+RrTsNPmLPbSxmUA4Ixms3xHra6Hf5t4llu2AID/dQYHJA6nrxXPP8QdaXJeSMA/3FwPxFEqktoq4RouS5m7Ho0PhpYmJkkRI+2484+lJfW/h4NH9rkNw0YwqK23P5cmvJLzxtqV5uBnZfUA1jy6tPKctK2frSjSrT+OVl5f5kyjBbas9eu/Gul6VA8OmWUMTdMKg/U964PVvFT3shchVbvt6GuSkvZHGCxqq0zGuunThD4Vr3MWpPcgUAjipAuaoKxXoSKlS4cdcGuiVN9BwqrqWjECOQKjMOOhIqSOdWGWBFSAo3RgawblHc6lyy2KhRx6Gmk46girrRg0wxU1MTp9iKKdojlCK3dL8US2LgtEpx3Xg1hGEelNKEdD+dV7rM3F2PRIvHUdw/wC8maDJ/u8fpU0+rx3u2RbsTkjrnkV5kdw7flQsjIcqxU+xxUTpcy0YoNRex6cl0ZiI5WynToCQPalns4bSJ8iSMvymzKH6159b6zfWzApOxweA3NabeLLqcg3aCUgYznBrL2M4rR3Zpzxb2sjore9vbV90N4SPSUZ/UYNaUPiG7Uj7RBJInfyZAf0IH9a5KDXLKRv3heP6itKG8gkUiIo2ejBulZNVI/EjS1OWx1aeJI5pFSKB0c95wd368Vv2epQXduYJ3TYw+ZMBlP1FcLZ6q1oCFyc9aj82OWYykFJCc7kYqf0NK8dyfZN6HfP4N0m5YSCzhKn+6WX9KuS6LHo+nomkmKFmbmJx8jnuS3b61leH9RHkeX9oYv0G8L/6F3rXu9Y1K2bENhFcQHgkMMn/AICSP0zVumqis9jjc505HMX9/wCLgTDFYpBn/lsXBXH19K0rnxgmnqFmsp2m2jcoU7Qcc4PcVpy63p8gWK6LWU7fLtcFc/Tr/WqU8V5jfblpoT0aPg/lWFTB02ldWN6eJd+hjprHizxRMU0e2ktbdCMybOPzPWt+8vdd0+ASXdgLlcfM9m28A+46iqsNre3oCzm68sv0eUrk/Sugt2it41tIHMsox8obKqP9o1jUwlJpRjD+vU1WIkneTXoconjazTJktrlWHbZWbeX974v1GztrXSXa3ikDs0q5yK9PWziIzLJEGH92EY/XNPSOIZCXj4xyIkVPpyBmppYWlSl7RLVeYqmKc1ZIwH8G6cblXhhigH+ymScdcVT1aG20y5Wa+vLa3QDhC2WwBgcVta9qiaJpFw1kpm1B0PlR/eYt6n2r5+vI9e1PUHa6gupLhm5DIc5+ldMFKW8rIiF3rY7TV9e8PNqU+oO0l9If9XDswgOMAsT1HtXA3+qvc3LOUVVJ6KoUY/CumTwDq9vpQ1G8h8vdykJ+/j1I7fjXN3luuduACOoxTp+zjJ21Z1xhKUb3M2RiJwR3GKXJNErIrjnJHYU6KKec4Rdi+veu6nFyRxVnGErDSQo+YgU+OCac/u4jj1NaVvpccQ8yY8jkljVuKcBilvEWOc7gRiuiNLuccq7exxwX1p24CmZJpyr61qwRPESU/GkmGAPrT4xhB9abP90fWsPtHR9gUzSJjDduhqWO5LD5lx9KrLl8D0qRRhaTghqpJaploSI3egqDVUnAqIzMD8pIqPZX2NPb23LZjFRtHTUuTj5ualE0be31pcsoj5oyIdmKacirO0HpTGWmpCcSvmnK7IcqxU+oNPKe1MKVaZm0XIdXvIcfvN49HGa0YPEQz++iI91NYJBpM1LpQluhqpOOzPQdP8Qaebdl89lmP3c8D9a0ItVmYLtmYjtg15cDU8N5cQHMUrr9DUPD/wArsUqq+0rnqcuq3EkYjkfcvUZFUlu2gkyjNHn+4xA/IcVxcHiK7jwJcSD34NaUHiC2l4kDRn1IyKzcKsfMr9zJHoWm6zhWe6vojldigjDAdznvW/aa1apZhoY5zGOPlAZifoDmvKFuo5TujkVvoatQ6lcQfckK54+tPmT3RjKh/Kz00eMNPwR58xb+60ZXn05p8fiC8vzi0tyY8/f6/T2FeeR+Ir3aVadtvTHarlr4iuoQBFJtAUKABwPce5rOrCMlZaFU4Sjq1c7G9tbtdrzozE5wQc4/wqm89wHAaRzg52sx4qJPF9ygQWhOwL84bAyfr1FMTxJNcXBkvreGRD0VFAIH1PJryquEcdVM9KjiXLSVM3I/EkojMd1DHOD1yAM8YxXCeJ/Dun6uTPYpJa3XJYF8o3t6iupGp6dNjzLULk4HT+hFQT3ulCJvKg8x8AAYZfx61lGVSnJSUloaqFOV1yNX/rueQpooikcXLNGUPIaj/Uynygdg55rq/Fd/b3ShEgijkAwqovQe57n3rjCWHAc8djX0uGrOrTUmrHh4ij7Oo43Lk13NchVccDpxSoAGGOCfeoFikCK2VKn05p6q7cIpJHYVpJszjFH/2Q==", - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
{\n",
-                            "    'character_appearence': 'A gingerbread man with bright bead-like eyes and a wide smile, running joyfully.',\n",
-                            "    'style_attributes': 'Photo-realistic with vibrant and lively colors.',\n",
-                            "    'worn_and_carried': 'The gingerbread man has white icing features and a cheeky appearance.',\n",
-                            "    'scenario': 'The gingerbread man running through a colorful meadow, followed by an old woman, cow, and horse.'\n",
-                            "}\n",
-                            "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - " \u001b[32m'character_appearence'\u001b[0m: \u001b[32m'A gingerbread man with bright bead-like eyes and a wide smile, running joyfully.'\u001b[0m,\n", - " \u001b[32m'style_attributes'\u001b[0m: \u001b[32m'Photo-realistic with vibrant and lively colors.'\u001b[0m,\n", - " \u001b[32m'worn_and_carried'\u001b[0m: \u001b[32m'The gingerbread man has white icing features and a cheeky appearance.'\u001b[0m,\n", - " \u001b[32m'scenario'\u001b[0m: \u001b[32m'The gingerbread man running through a colorful meadow, followed by an old woman, cow, and horse.'\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/jpeg": "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", - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
{\n",
-                            "    'character_appearence': 'A sly fox with cunning eyes, engaging with the gingerbread man.',\n",
-                            "    'style_attributes': 'Photo-realistic with a focus on sly and clever features.',\n",
-                            "    'worn_and_carried': 'The fox has sharp features and a lolled tail.',\n",
-                            "    'scenario': 'The gingerbread man on a wooden bridge, facing a sly fox by a sparkling river under sunlight.'\n",
-                            "}\n",
-                            "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - " \u001b[32m'character_appearence'\u001b[0m: \u001b[32m'A sly fox with cunning eyes, engaging with the gingerbread man.'\u001b[0m,\n", - " \u001b[32m'style_attributes'\u001b[0m: \u001b[32m'Photo-realistic with a focus on sly and clever features.'\u001b[0m,\n", - " \u001b[32m'worn_and_carried'\u001b[0m: \u001b[32m'The fox has sharp features and a lolled tail.'\u001b[0m,\n", - " \u001b[32m'scenario'\u001b[0m: \u001b[32m'The gingerbread man on a wooden bridge, facing a sly fox by a sparkling river under sunlight.'\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/jpeg": "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", - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
                                                      Writer:                                                      \n",
-                            "
\n" - ], - "text/plain": [ - " \u001b[1mWriter:\u001b[0m \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
Certainly! Here’s the final version of the short story with the enhanced illustrations for \"The Escape of the      \n",
-                            "Gingerbread Man.\"                                                                                                  \n",
-                            "\n",
-                            "Title: The Escape of the Gingerbread Man                                                                           \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "Illustration 1: A Rustic Kitchen Scene In a quaint little cottage at the edge of an enchanted forest, an elderly   \n",
-                            "woman, with flour-dusted hands, carefully shapes gingerbread dough on a wooden counter. The aroma of ginger,       \n",
-                            "cinnamon, and cloves wafts through the air as a warm breeze from the open window dances with fluttering curtains.  \n",
-                            "The sunlight gently permeates the cozy kitchen, casting a golden hue over the flour-dusted surfaces and the rolling\n",
-                            "pin. Heartfelt trinkets and rustic decorations adorn the shelves—a sign of a lived-in, lovingly nurtured home.     \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "Story:                                                                                                             \n",
-                            "\n",
-                            "Once there was an old woman who lived alone in a charming cottage, her days filled with the joyful art of baking.  \n",
-                            "One sunny afternoon, she decided to make a special gingerbread man to keep her company. As she shaped him tenderly \n",
-                            "and placed him in the oven, she couldn't help but smile at the delight he might bring.                             \n",
-                            "\n",
-                            "But to her astonishment, once she opened the oven door to check on her creation, the gingerbread man leapt out,    \n",
-                            "suddenly alive. His eyes were bright as beads, and his smile cheeky and wide. \"Run, run, as fast as you can! You   \n",
-                            "can't catch me, I'm the Gingerbread Man!\" he laughed, darting towards the door.                                    \n",
-                            "\n",
-                            "The old woman, chuckling at the unexpected mischief, gave chase, but her footsteps were slow with the weight of    \n",
-                            "age. The Gingerbread Man raced out of the door and into the sunny afternoon.                                       \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "Illustration 2: A Frolic Through the Meadow The Gingerbread Man darts through a vibrant meadow, his arms swinging  \n",
-                            "joyously by his sides. Behind him trails the old woman, her apron flapping in the wind as she gently tries to catch\n",
-                            "up. Wildflowers of every color bloom vividly under the radiant sky, painting the scene with shades of nature's     \n",
-                            "brilliance. Birds flit through the sky and a stream babbles nearby, oblivious to the chase taking place below.     \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "Continuing his sprint, the Gingerbread Man encountered a cow grazing peacefully. Intrigued, the cow trotted        \n",
-                            "forward. \"Stop, Gingerbread Man! I wish to eat you!\" she called, but the Gingerbread Man only twirled in a teasing \n",
-                            "jig, flashing his icing smile before darting off again.                                                            \n",
-                            "\n",
-                            "\"Run, run, as fast as you can! You can't catch me, I'm the Gingerbread Man!\" he taunted, leaving the cow in his    \n",
-                            "spicy wake.                                                                                                        \n",
-                            "\n",
-                            "As he zoomed across the meadow, he spied a cautious horse in a nearby paddock, who neighed, \"Oh! You look          \n",
-                            "delicious! I want to eat you!\" But the Gingerbread Man only laughed, his feet barely touching the earth. The horse \n",
-                            "joined the trail, hooves pounding, but even he couldn't match the Gingerbread Man's pace.                          \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "Illustration 3: A Bridge Over a Sparkling River Arriving at a wooden bridge across a shimmering river, the         \n",
-                            "Gingerbread Man pauses momentarily, his silhouette against the glistening water. Sunlight sparkles off the water's \n",
-                            "soft ripples casting reflections that dance like small constellations. A sly fox emerges from the shadows of a     \n",
-                            "blooming willow on the riverbank, his eyes alight with cunning and curiosity.                                      \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "The Gingerbread Man bounded onto the bridge and skirted past a sly, watching fox. \"Foolish Gingerbread Man,\" the   \n",
-                            "fox mused aloud, \"you might have outrun them all, but you can't possibly swim across that river.\"                  \n",
-                            "\n",
-                            "Pausing, the Gingerbread Man considered this dilemma. But the fox, oh so clever, offered a dangerous solution.     \n",
-                            "\"Climb on my back, and I'll carry you across safely,\" he suggested with a sly smile.                               \n",
-                            "\n",
-                            "Gingerbread thought himself smarter than that but hesitated, fearing the water or being pursued by the tired,      \n",
-                            "hungry crowd now gathering. \"Promise you won't eat me?\" he ventured.                                               \n",
-                            "\n",
-                            "\"Of course,\" the fox reassured, a gleam in his eyes that the others pondered from a distance.                      \n",
-                            "\n",
-                            "As they crossed the river, the gingerbread man confident on his ride, the old woman, cow, and horse hoped for his  \n",
-                            "safety. Yet, nearing the middle, the crafty fox tilted his chin and swiftly snapped, swallowing the gingerbread man\n",
-                            "whole.                                                                                                             \n",
-                            "\n",
-                            "Bewildered but awed by the clever twist they had witnessed, the old woman hung her head while the cow and horse    \n",
-                            "ambled away, pondering the fate of the boisterous Gingerbread Man.                                                 \n",
-                            "\n",
-                            "The fox, licking his lips, ambled along the river, savoring his victory, leaving an air of mystery hovering above  \n",
-                            "the shimmering waters, where the memory of the Gingerbread Man's spirited run lingered long after.                 \n",
-                            "\n",
-                            "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
-                            "I hope you enjoy the enhanced version of the tale!                                                                 \n",
-                            "
\n" - ], - "text/plain": [ - "Certainly! Here’s the final version of the short story with the enhanced illustrations for \"The Escape of the \n", - "Gingerbread Man.\" \n", - "\n", - "\u001b[1mTitle: The Escape of the Gingerbread Man\u001b[0m \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "\u001b[1mIllustration 1: A Rustic Kitchen Scene\u001b[0m In a quaint little cottage at the edge of an enchanted forest, an elderly \n", - "woman, with flour-dusted hands, carefully shapes gingerbread dough on a wooden counter. The aroma of ginger, \n", - "cinnamon, and cloves wafts through the air as a warm breeze from the open window dances with fluttering curtains. \n", - "The sunlight gently permeates the cozy kitchen, casting a golden hue over the flour-dusted surfaces and the rolling\n", - "pin. Heartfelt trinkets and rustic decorations adorn the shelves—a sign of a lived-in, lovingly nurtured home. \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "\u001b[1mStory:\u001b[0m \n", - "\n", - "Once there was an old woman who lived alone in a charming cottage, her days filled with the joyful art of baking. \n", - "One sunny afternoon, she decided to make a special gingerbread man to keep her company. As she shaped him tenderly \n", - "and placed him in the oven, she couldn't help but smile at the delight he might bring. \n", - "\n", - "But to her astonishment, once she opened the oven door to check on her creation, the gingerbread man leapt out, \n", - "suddenly alive. His eyes were bright as beads, and his smile cheeky and wide. \"Run, run, as fast as you can! You \n", - "can't catch me, I'm the Gingerbread Man!\" he laughed, darting towards the door. \n", - "\n", - "The old woman, chuckling at the unexpected mischief, gave chase, but her footsteps were slow with the weight of \n", - "age. The Gingerbread Man raced out of the door and into the sunny afternoon. \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "\u001b[1mIllustration 2: A Frolic Through the Meadow\u001b[0m The Gingerbread Man darts through a vibrant meadow, his arms swinging \n", - "joyously by his sides. Behind him trails the old woman, her apron flapping in the wind as she gently tries to catch\n", - "up. Wildflowers of every color bloom vividly under the radiant sky, painting the scene with shades of nature's \n", - "brilliance. Birds flit through the sky and a stream babbles nearby, oblivious to the chase taking place below. \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "Continuing his sprint, the Gingerbread Man encountered a cow grazing peacefully. Intrigued, the cow trotted \n", - "forward. \"Stop, Gingerbread Man! I wish to eat you!\" she called, but the Gingerbread Man only twirled in a teasing \n", - "jig, flashing his icing smile before darting off again. \n", - "\n", - "\"Run, run, as fast as you can! You can't catch me, I'm the Gingerbread Man!\" he taunted, leaving the cow in his \n", - "spicy wake. \n", - "\n", - "As he zoomed across the meadow, he spied a cautious horse in a nearby paddock, who neighed, \"Oh! You look \n", - "delicious! I want to eat you!\" But the Gingerbread Man only laughed, his feet barely touching the earth. The horse \n", - "joined the trail, hooves pounding, but even he couldn't match the Gingerbread Man's pace. \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "\u001b[1mIllustration 3: A Bridge Over a Sparkling River\u001b[0m Arriving at a wooden bridge across a shimmering river, the \n", - "Gingerbread Man pauses momentarily, his silhouette against the glistening water. Sunlight sparkles off the water's \n", - "soft ripples casting reflections that dance like small constellations. A sly fox emerges from the shadows of a \n", - "blooming willow on the riverbank, his eyes alight with cunning and curiosity. \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "The Gingerbread Man bounded onto the bridge and skirted past a sly, watching fox. \"Foolish Gingerbread Man,\" the \n", - "fox mused aloud, \"you might have outrun them all, but you can't possibly swim across that river.\" \n", - "\n", - "Pausing, the Gingerbread Man considered this dilemma. But the fox, oh so clever, offered a dangerous solution. \n", - "\"Climb on my back, and I'll carry you across safely,\" he suggested with a sly smile. \n", - "\n", - "Gingerbread thought himself smarter than that but hesitated, fearing the water or being pursued by the tired, \n", - "hungry crowd now gathering. \"Promise you won't eat me?\" he ventured. \n", - "\n", - "\"Of course,\" the fox reassured, a gleam in his eyes that the others pondered from a distance. \n", - "\n", - "As they crossed the river, the gingerbread man confident on his ride, the old woman, cow, and horse hoped for his \n", - "safety. Yet, nearing the middle, the crafty fox tilted his chin and swiftly snapped, swallowing the gingerbread man\n", - "whole. \n", - "\n", - "Bewildered but awed by the clever twist they had witnessed, the old woman hung her head while the cow and horse \n", - "ambled away, pondering the fate of the boisterous Gingerbread Man. \n", - "\n", - "The fox, licking his lips, ambled along the river, savoring his victory, leaving an air of mystery hovering above \n", - "the shimmering waters, where the memory of the Gingerbread Man's spirited run lingered long after. \n", - "\n", - "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", - "I hope you enjoy the enhanced version of the tale! \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
                                                       User:                                                       \n",
-                            "\n",
-                            "approve                                                                                                            \n",
-                            "
\n" - ], - "text/plain": [ - " \u001b[1mUser:\u001b[0m \n", - "\n", - "approve \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "runtime.start()\n", - "session_id = str(uuid.uuid4())\n", - "await runtime.publish_message(\n", - " GroupChatMessage(\n", - " body=UserMessage(\n", - " content=\"Please write a short story about the gingerbread man with up to 3 photo-realistic illustrations.\",\n", - " source=\"User\",\n", - " )\n", - " ),\n", - " TopicId(type=group_chat_topic_type, source=session_id),\n", - ")\n", - "await runtime.stop_when_idle()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From the output, you can see the writer, illustrator, and editor agents\n", - "taking turns to speak and collaborate to generate a picture book, before\n", - "asking for final approval from the user." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Next Steps\n", - "\n", - "This example showcases a simple implementation of the group chat pattern -- \n", - "**it is not meant to be used in real applications.** You can improve the\n", - "speaker selection algorithm. For example, you can avoid using LLM when simple\n", - "rules are sufficient and more reliable: \n", - "you can use a rule that the editor always speaks after the writer.\n", - "\n", - "The [AgentChat API](../../agentchat-user-guide/index.md) provides a high-level\n", - "API for selector group chat. It has more features but mostly shares the same\n", - "design as this implementation." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Group Chat\n", + "\n", + "Group chat is a design pattern where a group of agents share a common thread\n", + "of messages: they all subscribe and publish to the same topic. \n", + "Each participant agent is specialized for a particular task, \n", + "such as writer, illustrator, and editor\n", + "in a collaborative writing task.\n", + "You can also include an agent to represent a human user to help guide the\n", + "agents when needed.\n", + "\n", + "In a group chat, participants take turn to publish a message, and the process\n", + "is sequential -- only one agent is working at a time.\n", + "Under the hood, the order of turns is maintained by a Group Chat Manager agent,\n", + "which selects the next agent to speak upon receving a message.\n", + "The exact algorithm for selecting the next agent can vary based on your\n", + "application requirements. \n", + "Typically, a round-robin algorithm or a selector with an LLM model is used.\n", + "\n", + "Group chat is useful for dynamically decomposing a complex task into smaller ones \n", + "that can be handled by specialized agents with well-defined roles.\n", + "It is also possible to nest group chats into a hierarchy with each participant\n", + "a recursive group chat.\n", + "\n", + "In this example, we use AutoGen's Core API to implement the group chat pattern\n", + "using event-driven agents.\n", + "Please first read about [Topics and Subscriptions](../core-concepts/topic-and-subscription.md)\n", + "to understand the concepts and then [Messages and Communication](../framework/message-and-communication.ipynb)\n", + "to learn the API usage for pub-sub.\n", + "We will demonstrate a simple example of a group chat with a LLM-based selector\n", + "for the group chat manager, to create content for a children's story book.\n", + "\n", + "```{note}\n", + "While this example illustrates the group chat mechanism, it is complex and\n", + "represents a starting point from which you can build your own group chat system\n", + "with custom agents and speaker selection algorithms.\n", + "The [AgentChat API](../../agentchat-user-guide/index.md) has a built-in implementation\n", + "of selector group chat. You can use that if you do not want to use the Core API.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will be using the [rich](https://github.com/Textualize/rich) library to display the messages in a nice format." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# ! pip install rich" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import string\n", + "import uuid\n", + "from typing import List\n", + "\n", + "import openai\n", + "from autogen_core import (\n", + " DefaultTopicId,\n", + " FunctionCall,\n", + " Image,\n", + " MessageContext,\n", + " RoutedAgent,\n", + " SingleThreadedAgentRuntime,\n", + " TopicId,\n", + " TypeSubscription,\n", + " message_handler,\n", + ")\n", + "from autogen_core.models import (\n", + " AssistantMessage,\n", + " ChatCompletionClient,\n", + " LLMMessage,\n", + " SystemMessage,\n", + " UserMessage,\n", + ")\n", + "from autogen_core.tools import FunctionTool\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", + "from IPython.display import display # type: ignore\n", + "from pydantic import BaseModel\n", + "from rich.console import Console\n", + "from rich.markdown import Markdown" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Message Protocol\n", + "\n", + "The message protocol for the group chat pattern is simple.\n", + "1. To start, user or an external agent publishes a `GroupChatMessage` message to the common topic of all participants.\n", + "2. The group chat manager selects the next speaker, sends out a `RequestToSpeak` message to that agent.\n", + "3. The agent publishes a `GroupChatMessage` message to the common topic upon receiving the `RequestToSpeak` message.\n", + "4. This process continues until a termination condition is reached at the group chat manager, which then stops issuing `RequestToSpeak` message, and the group chat ends.\n", + "\n", + "The following diagram illustrates steps 2 to 4 above.\n", + "\n", + "![Group chat message protocol](groupchat.svg)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "class GroupChatMessage(BaseModel):\n", + " body: UserMessage\n", + "\n", + "\n", + "class RequestToSpeak(BaseModel):\n", + " pass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Base Group Chat Agent\n", + "\n", + "Let's first define the agent class that only uses LLM models to generate text.\n", + "This is will be used as the base class for all AI agents in the group chat." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "class BaseGroupChatAgent(RoutedAgent):\n", + " \"\"\"A group chat participant using an LLM.\"\"\"\n", + "\n", + " def __init__(\n", + " self,\n", + " description: str,\n", + " group_chat_topic_type: str,\n", + " model_client: ChatCompletionClient,\n", + " system_message: str,\n", + " ) -> None:\n", + " super().__init__(description=description)\n", + " self._group_chat_topic_type = group_chat_topic_type\n", + " self._model_client = model_client\n", + " self._system_message = SystemMessage(content=system_message)\n", + " self._chat_history: List[LLMMessage] = []\n", + "\n", + " @message_handler\n", + " async def handle_message(self, message: GroupChatMessage, ctx: MessageContext) -> None:\n", + " self._chat_history.extend(\n", + " [\n", + " UserMessage(content=f\"Transferred to {message.body.source}\", source=\"system\"),\n", + " message.body,\n", + " ]\n", + " )\n", + "\n", + " @message_handler\n", + " async def handle_request_to_speak(self, message: RequestToSpeak, ctx: MessageContext) -> None:\n", + " # print(f\"\\n{'-'*80}\\n{self.id.type}:\", flush=True)\n", + " Console().print(Markdown(f\"### {self.id.type}: \"))\n", + " self._chat_history.append(\n", + " UserMessage(content=f\"Transferred to {self.id.type}, adopt the persona immediately.\", source=\"system\")\n", + " )\n", + " completion = await self._model_client.create([self._system_message] + self._chat_history)\n", + " assert isinstance(completion.content, str)\n", + " self._chat_history.append(AssistantMessage(content=completion.content, source=self.id.type))\n", + " Console().print(Markdown(completion.content))\n", + " # print(completion.content, flush=True)\n", + " await self.publish_message(\n", + " GroupChatMessage(body=UserMessage(content=completion.content, source=self.id.type)),\n", + " topic_id=DefaultTopicId(type=self._group_chat_topic_type),\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Writer and Editor Agents\n", + "\n", + "Using the base class, we can define the writer and editor agents with\n", + "different system messages." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class WriterAgent(BaseGroupChatAgent):\n", + " def __init__(self, description: str, group_chat_topic_type: str, model_client: ChatCompletionClient) -> None:\n", + " super().__init__(\n", + " description=description,\n", + " group_chat_topic_type=group_chat_topic_type,\n", + " model_client=model_client,\n", + " system_message=\"You are a Writer. You produce good work.\",\n", + " )\n", + "\n", + "\n", + "class EditorAgent(BaseGroupChatAgent):\n", + " def __init__(self, description: str, group_chat_topic_type: str, model_client: ChatCompletionClient) -> None:\n", + " super().__init__(\n", + " description=description,\n", + " group_chat_topic_type=group_chat_topic_type,\n", + " model_client=model_client,\n", + " system_message=\"You are an Editor. Plan and guide the task given by the user. Provide critical feedbacks to the draft and illustration produced by Writer and Illustrator. \"\n", + " \"Approve if the task is completed and the draft and illustration meets user's requirements.\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Illustrator Agent with Image Generation\n", + "\n", + "Now let's define the `IllustratorAgent` which uses a DALL-E model to generate\n", + "an illustration based on the description provided.\n", + "We set up the image generator as a tool using {py:class}`~autogen_core.tools.FunctionTool`\n", + "wrapper, and use a model client to make the tool call." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "class IllustratorAgent(BaseGroupChatAgent):\n", + " def __init__(\n", + " self,\n", + " description: str,\n", + " group_chat_topic_type: str,\n", + " model_client: ChatCompletionClient,\n", + " image_client: openai.AsyncClient,\n", + " ) -> None:\n", + " super().__init__(\n", + " description=description,\n", + " group_chat_topic_type=group_chat_topic_type,\n", + " model_client=model_client,\n", + " system_message=\"You are an Illustrator. You use the generate_image tool to create images given user's requirement. \"\n", + " \"Make sure the images have consistent characters and style.\",\n", + " )\n", + " self._image_client = image_client\n", + " self._image_gen_tool = FunctionTool(\n", + " self._image_gen, name=\"generate_image\", description=\"Call this to generate an image. \"\n", + " )\n", + "\n", + " async def _image_gen(\n", + " self, character_appearence: str, style_attributes: str, worn_and_carried: str, scenario: str\n", + " ) -> str:\n", + " prompt = f\"Digital painting of a {character_appearence} character with {style_attributes}. Wearing {worn_and_carried}, {scenario}.\"\n", + " response = await self._image_client.images.generate(\n", + " prompt=prompt, model=\"dall-e-3\", response_format=\"b64_json\", size=\"1024x1024\"\n", + " )\n", + " return response.data[0].b64_json # type: ignore\n", + "\n", + " @message_handler\n", + " async def handle_request_to_speak(self, message: RequestToSpeak, ctx: MessageContext) -> None: # type: ignore\n", + " Console().print(Markdown(f\"### {self.id.type}: \"))\n", + " self._chat_history.append(\n", + " UserMessage(content=f\"Transferred to {self.id.type}, adopt the persona immediately.\", source=\"system\")\n", + " )\n", + " # Ensure that the image generation tool is used.\n", + " completion = await self._model_client.create(\n", + " [self._system_message] + self._chat_history,\n", + " tools=[self._image_gen_tool],\n", + " extra_create_args={\"tool_choice\": \"required\"},\n", + " cancellation_token=ctx.cancellation_token,\n", + " )\n", + " assert isinstance(completion.content, list) and all(\n", + " isinstance(item, FunctionCall) for item in completion.content\n", + " )\n", + " images: List[str | Image] = []\n", + " for tool_call in completion.content:\n", + " arguments = json.loads(tool_call.arguments)\n", + " Console().print(arguments)\n", + " result = await self._image_gen_tool.run_json(arguments, ctx.cancellation_token)\n", + " image = Image.from_base64(self._image_gen_tool.return_value_as_string(result))\n", + " image = Image.from_pil(image.image.resize((256, 256)))\n", + " display(image.image) # type: ignore\n", + " images.append(image)\n", + " await self.publish_message(\n", + " GroupChatMessage(body=UserMessage(content=images, source=self.id.type)),\n", + " DefaultTopicId(type=self._group_chat_topic_type),\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## User Agent\n", + "\n", + "With all the AI agents defined, we can now define the user agent that will\n", + "take the role of the human user in the group chat.\n", + "\n", + "The `UserAgent` implementation uses console input to get the user's input.\n", + "In a real-world scenario, you can replace this by communicating with a frontend,\n", + "and subscribe to responses from the frontend." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "class UserAgent(RoutedAgent):\n", + " def __init__(self, description: str, group_chat_topic_type: str) -> None:\n", + " super().__init__(description=description)\n", + " self._group_chat_topic_type = group_chat_topic_type\n", + "\n", + " @message_handler\n", + " async def handle_message(self, message: GroupChatMessage, ctx: MessageContext) -> None:\n", + " # When integrating with a frontend, this is where group chat message would be sent to the frontend.\n", + " pass\n", + "\n", + " @message_handler\n", + " async def handle_request_to_speak(self, message: RequestToSpeak, ctx: MessageContext) -> None:\n", + " user_input = input(\"Enter your message, type 'APPROVE' to conclude the task: \")\n", + " Console().print(Markdown(f\"### User: \\n{user_input}\"))\n", + " await self.publish_message(\n", + " GroupChatMessage(body=UserMessage(content=user_input, source=self.id.type)),\n", + " DefaultTopicId(type=self._group_chat_topic_type),\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Group Chat Manager\n", + "\n", + "Lastly, we define the `GroupChatManager` agent which manages the group chat\n", + "and selects the next agent to speak using an LLM.\n", + "The group chat manager checks if the editor has approved the draft by \n", + "looking for the `\"APPORVED\"` keyword in the message. If the editor has approved\n", + "the draft, the group chat manager stops selecting the next speaker, and the group chat ends.\n", + "\n", + "The group chat manager's constructor takes a list of participants' topic types\n", + "as an argument.\n", + "To prompt the next speaker to work, \n", + "the it publishes a `RequestToSpeak` message to the next participant's topic.\n", + "\n", + "In this example, we also make sure the group chat manager always picks a different\n", + "participant to speak next, by keeping track of the previous speaker.\n", + "This helps to ensure the group chat is not dominated by a single participant." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "class GroupChatManager(RoutedAgent):\n", + " def __init__(\n", + " self,\n", + " participant_topic_types: List[str],\n", + " model_client: ChatCompletionClient,\n", + " participant_descriptions: List[str],\n", + " ) -> None:\n", + " super().__init__(\"Group chat manager\")\n", + " self._participant_topic_types = participant_topic_types\n", + " self._model_client = model_client\n", + " self._chat_history: List[UserMessage] = []\n", + " self._participant_descriptions = participant_descriptions\n", + " self._previous_participant_topic_type: str | None = None\n", + "\n", + " @message_handler\n", + " async def handle_message(self, message: GroupChatMessage, ctx: MessageContext) -> None:\n", + " assert isinstance(message.body, UserMessage)\n", + " self._chat_history.append(message.body)\n", + " # If the message is an approval message from the user, stop the chat.\n", + " if message.body.source == \"User\":\n", + " assert isinstance(message.body.content, str)\n", + " if message.body.content.lower().strip(string.punctuation).endswith(\"approve\"):\n", + " return\n", + " # Format message history.\n", + " messages: List[str] = []\n", + " for msg in self._chat_history:\n", + " if isinstance(msg.content, str):\n", + " messages.append(f\"{msg.source}: {msg.content}\")\n", + " elif isinstance(msg.content, list):\n", + " line: List[str] = []\n", + " for item in msg.content:\n", + " if isinstance(item, str):\n", + " line.append(item)\n", + " else:\n", + " line.append(\"[Image]\")\n", + " messages.append(f\"{msg.source}: {', '.join(line)}\")\n", + " history = \"\\n\".join(messages)\n", + " # Format roles.\n", + " roles = \"\\n\".join(\n", + " [\n", + " f\"{topic_type}: {description}\".strip()\n", + " for topic_type, description in zip(\n", + " self._participant_topic_types, self._participant_descriptions, strict=True\n", + " )\n", + " if topic_type != self._previous_participant_topic_type\n", + " ]\n", + " )\n", + " selector_prompt = \"\"\"You are in a role play game. The following roles are available:\n", + "{roles}.\n", + "Read the following conversation. Then select the next role from {participants} to play. Only return the role.\n", + "\n", + "{history}\n", + "\n", + "Read the above conversation. Then select the next role from {participants} to play. Only return the role.\n", + "\"\"\"\n", + " system_message = SystemMessage(\n", + " content=selector_prompt.format(\n", + " roles=roles,\n", + " history=history,\n", + " participants=str(\n", + " [\n", + " topic_type\n", + " for topic_type in self._participant_topic_types\n", + " if topic_type != self._previous_participant_topic_type\n", + " ]\n", + " ),\n", + " )\n", + " )\n", + " completion = await self._model_client.create([system_message], cancellation_token=ctx.cancellation_token)\n", + " assert isinstance(completion.content, str)\n", + " selected_topic_type: str\n", + " for topic_type in self._participant_topic_types:\n", + " if topic_type.lower() in completion.content.lower():\n", + " selected_topic_type = topic_type\n", + " self._previous_participant_topic_type = selected_topic_type\n", + " await self.publish_message(RequestToSpeak(), DefaultTopicId(type=selected_topic_type))\n", + " return\n", + " raise ValueError(f\"Invalid role selected: {completion.content}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating the Group Chat\n", + "\n", + "To set up the group chat, we create an {py:class}`~autogen_core.SingleThreadedAgentRuntime`\n", + "and register the agents' factories and subscriptions.\n", + "\n", + "Each participant agent subscribes to both the group chat topic as well as its own\n", + "topic in order to receive `RequestToSpeak` messages, \n", + "while the group chat manager agent only subcribes to the group chat topic." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "runtime = SingleThreadedAgentRuntime()\n", + "\n", + "editor_topic_type = \"Editor\"\n", + "writer_topic_type = \"Writer\"\n", + "illustrator_topic_type = \"Illustrator\"\n", + "user_topic_type = \"User\"\n", + "group_chat_topic_type = \"group_chat\"\n", + "\n", + "editor_description = \"Editor for planning and reviewing the content.\"\n", + "writer_description = \"Writer for creating any text content.\"\n", + "user_description = \"User for providing final approval.\"\n", + "illustrator_description = \"An illustrator for creating images.\"\n", + "\n", + "editor_agent_type = await EditorAgent.register(\n", + " runtime,\n", + " editor_topic_type, # Using topic type as the agent type.\n", + " lambda: EditorAgent(\n", + " description=editor_description,\n", + " group_chat_topic_type=group_chat_topic_type,\n", + " model_client=OpenAIChatCompletionClient(\n", + " model=\"gpt-4o-2024-08-06\",\n", + " # api_key=\"YOUR_API_KEY\",\n", + " ),\n", + " ),\n", + ")\n", + "await runtime.add_subscription(TypeSubscription(topic_type=editor_topic_type, agent_type=editor_agent_type.type))\n", + "await runtime.add_subscription(TypeSubscription(topic_type=group_chat_topic_type, agent_type=editor_agent_type.type))\n", + "\n", + "writer_agent_type = await WriterAgent.register(\n", + " runtime,\n", + " writer_topic_type, # Using topic type as the agent type.\n", + " lambda: WriterAgent(\n", + " description=writer_description,\n", + " group_chat_topic_type=group_chat_topic_type,\n", + " model_client=OpenAIChatCompletionClient(\n", + " model=\"gpt-4o-2024-08-06\",\n", + " # api_key=\"YOUR_API_KEY\",\n", + " ),\n", + " ),\n", + ")\n", + "await runtime.add_subscription(TypeSubscription(topic_type=writer_topic_type, agent_type=writer_agent_type.type))\n", + "await runtime.add_subscription(TypeSubscription(topic_type=group_chat_topic_type, agent_type=writer_agent_type.type))\n", + "\n", + "illustrator_agent_type = await IllustratorAgent.register(\n", + " runtime,\n", + " illustrator_topic_type,\n", + " lambda: IllustratorAgent(\n", + " description=illustrator_description,\n", + " group_chat_topic_type=group_chat_topic_type,\n", + " model_client=OpenAIChatCompletionClient(\n", + " model=\"gpt-4o-2024-08-06\",\n", + " # api_key=\"YOUR_API_KEY\",\n", + " ),\n", + " image_client=openai.AsyncClient(\n", + " # api_key=\"YOUR_API_KEY\",\n", + " ),\n", + " ),\n", + ")\n", + "await runtime.add_subscription(\n", + " TypeSubscription(topic_type=illustrator_topic_type, agent_type=illustrator_agent_type.type)\n", + ")\n", + "await runtime.add_subscription(\n", + " TypeSubscription(topic_type=group_chat_topic_type, agent_type=illustrator_agent_type.type)\n", + ")\n", + "\n", + "user_agent_type = await UserAgent.register(\n", + " runtime,\n", + " user_topic_type,\n", + " lambda: UserAgent(description=user_description, group_chat_topic_type=group_chat_topic_type),\n", + ")\n", + "await runtime.add_subscription(TypeSubscription(topic_type=user_topic_type, agent_type=user_agent_type.type))\n", + "await runtime.add_subscription(TypeSubscription(topic_type=group_chat_topic_type, agent_type=user_agent_type.type))\n", + "\n", + "group_chat_manager_type = await GroupChatManager.register(\n", + " runtime,\n", + " \"group_chat_manager\",\n", + " lambda: GroupChatManager(\n", + " participant_topic_types=[writer_topic_type, illustrator_topic_type, editor_topic_type, user_topic_type],\n", + " model_client=OpenAIChatCompletionClient(\n", + " model=\"gpt-4o-2024-08-06\",\n", + " # api_key=\"YOUR_API_KEY\",\n", + " ),\n", + " participant_descriptions=[writer_description, illustrator_description, editor_description, user_description],\n", + " ),\n", + ")\n", + "await runtime.add_subscription(\n", + " TypeSubscription(topic_type=group_chat_topic_type, agent_type=group_chat_manager_type.type)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the Group Chat\n", + "\n", + "We start the runtime and publish a `GroupChatMessage` for the task to start the group chat." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
                                                      Writer:                                                      \n",
+       "
\n" + ], + "text/plain": [ + " \u001b[1mWriter:\u001b[0m \n" + ] + }, + "metadata": {}, + "output_type": "display_data" }, - "nbformat": 4, - "nbformat_minor": 2 + { + "data": { + "text/html": [ + "
Title: The Escape of the Gingerbread Man                                                                           \n",
+       "\n",
+       "Illustration 1: A Rustic Kitchen Scene In a quaint little cottage at the edge of an enchanted forest, an elderly   \n",
+       "woman, with flour-dusted hands, carefully shapes gingerbread dough on a wooden counter. The aroma of ginger,       \n",
+       "cinnamon, and cloves wafts through the air as a warm breeze from the open window dances with fluttering curtains.  \n",
+       "The sunlight gently permeates the cozy kitchen, casting a golden hue over the flour-dusted surfaces and the rolling\n",
+       "pin. Heartfelt trinkets and rustic decorations adorn the shelves - signs of a lived-in, lovingly nurtured home.    \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "Story:                                                                                                             \n",
+       "\n",
+       "Once there was an old woman who lived alone in a charming cottage, her days filled with the joyful art of baking.  \n",
+       "One sunny afternoon, she decided to make a special gingerbread man to keep her company. As she shaped him tenderly \n",
+       "and placed him in the oven, she couldn't help but smile at the delight he might bring.                             \n",
+       "\n",
+       "But to her astonishment, once she opened the oven door to check on her creation, the gingerbread man leapt out,    \n",
+       "suddenly alive. His eyes were bright as beads, and his smile cheeky and wide. \"Run, run, as fast as you can! You   \n",
+       "can't catch me, I'm the Gingerbread Man!\" he laughed, darting towards the door.                                    \n",
+       "\n",
+       "The old woman, chuckling at the unexpected mischief, gave chase, but her footsteps were slow with the weight of    \n",
+       "age. The Gingerbread Man raced out of the door and into the sunny afternoon.                                       \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "Illustration 2: A Frolic Through the Meadow The Gingerbread Man darts through a vibrant meadow, his arms swinging  \n",
+       "joyously by his sides. Behind him trails the old woman, her apron flapping in the wind as she gently tries to catch\n",
+       "up. Wildflowers of every color bloom vividly under the radiant sky, painting the scene with shades of nature's     \n",
+       "brilliance. Birds flit through the sky and a stream babbles nearby, oblivious to the chase taking place below.     \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "Continuing his sprint, the Gingerbread Man encountered a cow grazing peacefully. Intrigued, the cow trotted        \n",
+       "forward. \"Stop, Gingerbread Man! I wish to eat you!\" she called, but the Gingerbread Man only twirled in a teasing \n",
+       "jig, flashing his icing smile before darting off again.                                                            \n",
+       "\n",
+       "\"Run, run, as fast as you can! You can't catch me, I'm the Gingerbread Man!\" he taunted, leaving the cow in his    \n",
+       "spicy wake.                                                                                                        \n",
+       "\n",
+       "As he zoomed across the meadow, he spied a cautious horse in a nearby paddock, who neighed, \"Oh! You look          \n",
+       "delicious! I want to eat you!\" But the Gingerbread Man only laughed, his feet barely touching the earth. The horse \n",
+       "joined the trail, hooves pounding, but even he couldn't match the Gingerbread Man's pace.                          \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "Illustration 3: A Bridge Over a Sparkling River Arriving at a wooden bridge across a shimmering river, the         \n",
+       "Gingerbread Man pauses momentarily, his silhouette against the glistening water. Sunlight sparkles off the water's \n",
+       "soft ripples casting reflections that dance like small constellations. A sly fox emerges from the shadows of a     \n",
+       "blooming willow on the riverbank, his eyes alight with cunning and curiosity.                                      \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "The Gingerbread Man bounded onto the bridge and skirted past a sly, watching fox. \"Foolish Gingerbread Man,\" the   \n",
+       "fox mused aloud, \"you might have outrun them all, but you can't possibly swim across that river.\"                  \n",
+       "\n",
+       "Pausing, the Gingerbread Man considered this dilemma. But the fox, oh so clever, offered a dangerous solution.     \n",
+       "\"Climb on my back, and I'll carry you across safely,\" he suggested with a sly smile.                               \n",
+       "\n",
+       "Gingerbread thought himself smarter than that but hesitated, fearing the water or being pursued by the tired,      \n",
+       "hungry crowd now gathering. \"Promise you won't eat me?\" he ventured.                                               \n",
+       "\n",
+       "\"Of course,\" the fox reassured, a gleam in his eyes that the others pondered from a distance.                      \n",
+       "\n",
+       "As they crossed the river, the gingerbread man confident on his ride, the old woman, cow, and horse hoped for his  \n",
+       "safety. Yet, nearing the middle, the crafty fox tilted his chin and swiftly snapped, swallowing the gingerbread man\n",
+       "whole.                                                                                                             \n",
+       "\n",
+       "Bewildered but awed by the clever twist they had witnessed, the old woman hung her head while the cow and horse    \n",
+       "ambled away, pondering the fate of the boisterous Gingerbread Man.                                                 \n",
+       "\n",
+       "The fox, licking his lips, ambled along the river, savoring his victory, leaving an air of mystery hovering above  \n",
+       "the shimmering waters, where the memory of the Gingerbread Man's spirited run lingered long after.                 \n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1mTitle: The Escape of the Gingerbread Man\u001b[0m \n", + "\n", + "\u001b[1mIllustration 1: A Rustic Kitchen Scene\u001b[0m In a quaint little cottage at the edge of an enchanted forest, an elderly \n", + "woman, with flour-dusted hands, carefully shapes gingerbread dough on a wooden counter. The aroma of ginger, \n", + "cinnamon, and cloves wafts through the air as a warm breeze from the open window dances with fluttering curtains. \n", + "The sunlight gently permeates the cozy kitchen, casting a golden hue over the flour-dusted surfaces and the rolling\n", + "pin. Heartfelt trinkets and rustic decorations adorn the shelves - signs of a lived-in, lovingly nurtured home. \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "\u001b[1mStory:\u001b[0m \n", + "\n", + "Once there was an old woman who lived alone in a charming cottage, her days filled with the joyful art of baking. \n", + "One sunny afternoon, she decided to make a special gingerbread man to keep her company. As she shaped him tenderly \n", + "and placed him in the oven, she couldn't help but smile at the delight he might bring. \n", + "\n", + "But to her astonishment, once she opened the oven door to check on her creation, the gingerbread man leapt out, \n", + "suddenly alive. His eyes were bright as beads, and his smile cheeky and wide. \"Run, run, as fast as you can! You \n", + "can't catch me, I'm the Gingerbread Man!\" he laughed, darting towards the door. \n", + "\n", + "The old woman, chuckling at the unexpected mischief, gave chase, but her footsteps were slow with the weight of \n", + "age. The Gingerbread Man raced out of the door and into the sunny afternoon. \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "\u001b[1mIllustration 2: A Frolic Through the Meadow\u001b[0m The Gingerbread Man darts through a vibrant meadow, his arms swinging \n", + "joyously by his sides. Behind him trails the old woman, her apron flapping in the wind as she gently tries to catch\n", + "up. Wildflowers of every color bloom vividly under the radiant sky, painting the scene with shades of nature's \n", + "brilliance. Birds flit through the sky and a stream babbles nearby, oblivious to the chase taking place below. \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "Continuing his sprint, the Gingerbread Man encountered a cow grazing peacefully. Intrigued, the cow trotted \n", + "forward. \"Stop, Gingerbread Man! I wish to eat you!\" she called, but the Gingerbread Man only twirled in a teasing \n", + "jig, flashing his icing smile before darting off again. \n", + "\n", + "\"Run, run, as fast as you can! You can't catch me, I'm the Gingerbread Man!\" he taunted, leaving the cow in his \n", + "spicy wake. \n", + "\n", + "As he zoomed across the meadow, he spied a cautious horse in a nearby paddock, who neighed, \"Oh! You look \n", + "delicious! I want to eat you!\" But the Gingerbread Man only laughed, his feet barely touching the earth. The horse \n", + "joined the trail, hooves pounding, but even he couldn't match the Gingerbread Man's pace. \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "\u001b[1mIllustration 3: A Bridge Over a Sparkling River\u001b[0m Arriving at a wooden bridge across a shimmering river, the \n", + "Gingerbread Man pauses momentarily, his silhouette against the glistening water. Sunlight sparkles off the water's \n", + "soft ripples casting reflections that dance like small constellations. A sly fox emerges from the shadows of a \n", + "blooming willow on the riverbank, his eyes alight with cunning and curiosity. \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "The Gingerbread Man bounded onto the bridge and skirted past a sly, watching fox. \"Foolish Gingerbread Man,\" the \n", + "fox mused aloud, \"you might have outrun them all, but you can't possibly swim across that river.\" \n", + "\n", + "Pausing, the Gingerbread Man considered this dilemma. But the fox, oh so clever, offered a dangerous solution. \n", + "\"Climb on my back, and I'll carry you across safely,\" he suggested with a sly smile. \n", + "\n", + "Gingerbread thought himself smarter than that but hesitated, fearing the water or being pursued by the tired, \n", + "hungry crowd now gathering. \"Promise you won't eat me?\" he ventured. \n", + "\n", + "\"Of course,\" the fox reassured, a gleam in his eyes that the others pondered from a distance. \n", + "\n", + "As they crossed the river, the gingerbread man confident on his ride, the old woman, cow, and horse hoped for his \n", + "safety. Yet, nearing the middle, the crafty fox tilted his chin and swiftly snapped, swallowing the gingerbread man\n", + "whole. \n", + "\n", + "Bewildered but awed by the clever twist they had witnessed, the old woman hung her head while the cow and horse \n", + "ambled away, pondering the fate of the boisterous Gingerbread Man. \n", + "\n", + "The fox, licking his lips, ambled along the river, savoring his victory, leaving an air of mystery hovering above \n", + "the shimmering waters, where the memory of the Gingerbread Man's spirited run lingered long after. \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                                                       User:                                                       \n",
+       "
\n" + ], + "text/plain": [ + " \u001b[1mUser:\u001b[0m \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                                                      Editor:                                                      \n",
+       "
\n" + ], + "text/plain": [ + " \u001b[1mEditor:\u001b[0m \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Thank you for submitting the draft and illustrations for the short story, \"The Escape of the Gingerbread Man.\"     \n",
+       "Let's go through the story and illustrations critically:                                                           \n",
+       "\n",
+       "                                                  Story Feedback:                                                  \n",
+       "\n",
+       " 1 Plot & Structure:                                                                                               \n",
+       "The story follows the traditional gingerbread man tale closely, which might appeal to readers looking for a  \n",
+       "      classic retelling. Consider adding a unique twist or additional layer to make it stand out.                  \n",
+       " 2 Character Development:                                                                                          \n",
+       "The gingerbread man is depicted with a cheeky personality, which is consistent throughout. However, for the  \n",
+       "      old woman, cow, horse, and fox, incorporating a bit more personality might enrich the narrative.             \n",
+       " 3 Pacing:                                                                                                         \n",
+       "The story moves at a brisk pace, fitting for the short story format. Ensure that each scene provides enough  \n",
+       "      space to breathe, especially during the climactic encounter with the fox.                                    \n",
+       " 4 Tone & Language:                                                                                                \n",
+       "The tone is playful and suitable for a fairy-tale audience. The language is accessible, though some richer   \n",
+       "      descriptive elements could enhance the overall atmosphere.                                                   \n",
+       " 5 Moral/Lesson:                                                                                                   \n",
+       "The ending carries the traditional moral of caution against naivety. Consider if there are other themes you  \n",
+       "      wish to explore or highlight within the story.                                                               \n",
+       "\n",
+       "                                              Illustration Feedback:                                               \n",
+       "\n",
+       " 1 Illustration 1: A Rustic Kitchen Scene                                                                          \n",
+       "The visual captures the essence of a cozy, magical kitchen well. Adding small whimsical elements that hint at\n",
+       "      the gingerbread man’s impending animation might spark more curiosity.                                        \n",
+       " 2 Illustration 2: A Frolic Through the Meadow                                                                     \n",
+       "The vibrant colors and dynamic composition effectively convey the chase scene. Make sure the sense of speed  \n",
+       "      and energy of the Gingerbread Man is accentuated, possibly with more expressive motion lines or postures.    \n",
+       " 3 Illustration 3: A Bridge Over a Sparkling River                                                                 \n",
+       "The river and reflection are beautifully rendered. The fox, however, could benefit from a more cunning       \n",
+       "      appearance, with sharper features that emphasize its sly nature.                                             \n",
+       "\n",
+       "                                                    Conclusion:                                                    \n",
+       "\n",
+       "Overall, the draft is well-structured, and the illustrations complement the story effectively. With slight         \n",
+       "enhancements in the narrative's depth and character detail, along with minor adjustments to the illustrations, the \n",
+       "project will meet the user's requirements admirably.                                                               \n",
+       "\n",
+       "Please make the suggested revisions, and once those are implemented, the story should be ready for approval. Let me\n",
+       "know if you have any questions or need further guidance!                                                           \n",
+       "
\n" + ], + "text/plain": [ + "Thank you for submitting the draft and illustrations for the short story, \"The Escape of the Gingerbread Man.\" \n", + "Let's go through the story and illustrations critically: \n", + "\n", + " \u001b[1mStory Feedback:\u001b[0m \n", + "\n", + "\u001b[1;33m 1 \u001b[0m\u001b[1mPlot & Structure:\u001b[0m \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe story follows the traditional gingerbread man tale closely, which might appeal to readers looking for a \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mclassic retelling. Consider adding a unique twist or additional layer to make it stand out. \n", + "\u001b[1;33m 2 \u001b[0m\u001b[1mCharacter Development:\u001b[0m \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe gingerbread man is depicted with a cheeky personality, which is consistent throughout. However, for the \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mold woman, cow, horse, and fox, incorporating a bit more personality might enrich the narrative. \n", + "\u001b[1;33m 3 \u001b[0m\u001b[1mPacing:\u001b[0m \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe story moves at a brisk pace, fitting for the short story format. Ensure that each scene provides enough \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mspace to breathe, especially during the climactic encounter with the fox. \n", + "\u001b[1;33m 4 \u001b[0m\u001b[1mTone & Language:\u001b[0m \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe tone is playful and suitable for a fairy-tale audience. The language is accessible, though some richer \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mdescriptive elements could enhance the overall atmosphere. \n", + "\u001b[1;33m 5 \u001b[0m\u001b[1mMoral/Lesson:\u001b[0m \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe ending carries the traditional moral of caution against naivety. Consider if there are other themes you \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mwish to explore or highlight within the story. \n", + "\n", + " \u001b[1mIllustration Feedback:\u001b[0m \n", + "\n", + "\u001b[1;33m 1 \u001b[0m\u001b[1mIllustration 1: A Rustic Kitchen Scene\u001b[0m \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe visual captures the essence of a cozy, magical kitchen well. Adding small whimsical elements that hint at\n", + "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mthe gingerbread man’s impending animation might spark more curiosity. \n", + "\u001b[1;33m 2 \u001b[0m\u001b[1mIllustration 2: A Frolic Through the Meadow\u001b[0m \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe vibrant colors and dynamic composition effectively convey the chase scene. Make sure the sense of speed \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mand energy of the Gingerbread Man is accentuated, possibly with more expressive motion lines or postures. \n", + "\u001b[1;33m 3 \u001b[0m\u001b[1mIllustration 3: A Bridge Over a Sparkling River\u001b[0m \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m • \u001b[0mThe river and reflection are beautifully rendered. The fox, however, could benefit from a more cunning \n", + "\u001b[1;33m \u001b[0m\u001b[1;33m \u001b[0mappearance, with sharper features that emphasize its sly nature. \n", + "\n", + " \u001b[1mConclusion:\u001b[0m \n", + "\n", + "Overall, the draft is well-structured, and the illustrations complement the story effectively. With slight \n", + "enhancements in the narrative's depth and character detail, along with minor adjustments to the illustrations, the \n", + "project will meet the user's requirements admirably. \n", + "\n", + "Please make the suggested revisions, and once those are implemented, the story should be ready for approval. Let me\n", + "know if you have any questions or need further guidance! \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                                                   Illustrator:                                                    \n",
+       "
\n" + ], + "text/plain": [ + " \u001b[1mIllustrator:\u001b[0m \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
{\n",
+       "    'character_appearence': 'An elderly woman with flour-dusted hands shaping gingerbread dough. Sunlight casts a \n",
+       "golden hue in the cozy kitchen, with rustic decorations and trinkets on shelves.',\n",
+       "    'style_attributes': 'Photo-realistic with warm and golden hues.',\n",
+       "    'worn_and_carried': 'The woman wears a flour-covered apron and a gentle smile.',\n",
+       "    'scenario': 'An old woman baking gingerbread in a warm, rustic cottage kitchen.'\n",
+       "}\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m{\u001b[0m\n", + " \u001b[32m'character_appearence'\u001b[0m: \u001b[32m'An elderly woman with flour-dusted hands shaping gingerbread dough. Sunlight casts a \u001b[0m\n", + "\u001b[32mgolden hue in the cozy kitchen, with rustic decorations and trinkets on shelves.'\u001b[0m,\n", + " \u001b[32m'style_attributes'\u001b[0m: \u001b[32m'Photo-realistic with warm and golden hues.'\u001b[0m,\n", + " \u001b[32m'worn_and_carried'\u001b[0m: \u001b[32m'The woman wears a flour-covered apron and a gentle smile.'\u001b[0m,\n", + " \u001b[32m'scenario'\u001b[0m: \u001b[32m'An old woman baking gingerbread in a warm, rustic cottage kitchen.'\u001b[0m\n", + "\u001b[1m}\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/jpeg": "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", + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
{\n",
+       "    'character_appearence': 'A gingerbread man with bright bead-like eyes and a wide smile, running joyfully.',\n",
+       "    'style_attributes': 'Photo-realistic with vibrant and lively colors.',\n",
+       "    'worn_and_carried': 'The gingerbread man has white icing features and a cheeky appearance.',\n",
+       "    'scenario': 'The gingerbread man running through a colorful meadow, followed by an old woman, cow, and horse.'\n",
+       "}\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m{\u001b[0m\n", + " \u001b[32m'character_appearence'\u001b[0m: \u001b[32m'A gingerbread man with bright bead-like eyes and a wide smile, running joyfully.'\u001b[0m,\n", + " \u001b[32m'style_attributes'\u001b[0m: \u001b[32m'Photo-realistic with vibrant and lively colors.'\u001b[0m,\n", + " \u001b[32m'worn_and_carried'\u001b[0m: \u001b[32m'The gingerbread man has white icing features and a cheeky appearance.'\u001b[0m,\n", + " \u001b[32m'scenario'\u001b[0m: \u001b[32m'The gingerbread man running through a colorful meadow, followed by an old woman, cow, and horse.'\u001b[0m\n", + "\u001b[1m}\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/jpeg": "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", + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
{\n",
+       "    'character_appearence': 'A sly fox with cunning eyes, engaging with the gingerbread man.',\n",
+       "    'style_attributes': 'Photo-realistic with a focus on sly and clever features.',\n",
+       "    'worn_and_carried': 'The fox has sharp features and a lolled tail.',\n",
+       "    'scenario': 'The gingerbread man on a wooden bridge, facing a sly fox by a sparkling river under sunlight.'\n",
+       "}\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m{\u001b[0m\n", + " \u001b[32m'character_appearence'\u001b[0m: \u001b[32m'A sly fox with cunning eyes, engaging with the gingerbread man.'\u001b[0m,\n", + " \u001b[32m'style_attributes'\u001b[0m: \u001b[32m'Photo-realistic with a focus on sly and clever features.'\u001b[0m,\n", + " \u001b[32m'worn_and_carried'\u001b[0m: \u001b[32m'The fox has sharp features and a lolled tail.'\u001b[0m,\n", + " \u001b[32m'scenario'\u001b[0m: \u001b[32m'The gingerbread man on a wooden bridge, facing a sly fox by a sparkling river under sunlight.'\u001b[0m\n", + "\u001b[1m}\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/jpeg": "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", + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                                                      Writer:                                                      \n",
+       "
\n" + ], + "text/plain": [ + " \u001b[1mWriter:\u001b[0m \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Certainly! Here’s the final version of the short story with the enhanced illustrations for \"The Escape of the      \n",
+       "Gingerbread Man.\"                                                                                                  \n",
+       "\n",
+       "Title: The Escape of the Gingerbread Man                                                                           \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "Illustration 1: A Rustic Kitchen Scene In a quaint little cottage at the edge of an enchanted forest, an elderly   \n",
+       "woman, with flour-dusted hands, carefully shapes gingerbread dough on a wooden counter. The aroma of ginger,       \n",
+       "cinnamon, and cloves wafts through the air as a warm breeze from the open window dances with fluttering curtains.  \n",
+       "The sunlight gently permeates the cozy kitchen, casting a golden hue over the flour-dusted surfaces and the rolling\n",
+       "pin. Heartfelt trinkets and rustic decorations adorn the shelves—a sign of a lived-in, lovingly nurtured home.     \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "Story:                                                                                                             \n",
+       "\n",
+       "Once there was an old woman who lived alone in a charming cottage, her days filled with the joyful art of baking.  \n",
+       "One sunny afternoon, she decided to make a special gingerbread man to keep her company. As she shaped him tenderly \n",
+       "and placed him in the oven, she couldn't help but smile at the delight he might bring.                             \n",
+       "\n",
+       "But to her astonishment, once she opened the oven door to check on her creation, the gingerbread man leapt out,    \n",
+       "suddenly alive. His eyes were bright as beads, and his smile cheeky and wide. \"Run, run, as fast as you can! You   \n",
+       "can't catch me, I'm the Gingerbread Man!\" he laughed, darting towards the door.                                    \n",
+       "\n",
+       "The old woman, chuckling at the unexpected mischief, gave chase, but her footsteps were slow with the weight of    \n",
+       "age. The Gingerbread Man raced out of the door and into the sunny afternoon.                                       \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "Illustration 2: A Frolic Through the Meadow The Gingerbread Man darts through a vibrant meadow, his arms swinging  \n",
+       "joyously by his sides. Behind him trails the old woman, her apron flapping in the wind as she gently tries to catch\n",
+       "up. Wildflowers of every color bloom vividly under the radiant sky, painting the scene with shades of nature's     \n",
+       "brilliance. Birds flit through the sky and a stream babbles nearby, oblivious to the chase taking place below.     \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "Continuing his sprint, the Gingerbread Man encountered a cow grazing peacefully. Intrigued, the cow trotted        \n",
+       "forward. \"Stop, Gingerbread Man! I wish to eat you!\" she called, but the Gingerbread Man only twirled in a teasing \n",
+       "jig, flashing his icing smile before darting off again.                                                            \n",
+       "\n",
+       "\"Run, run, as fast as you can! You can't catch me, I'm the Gingerbread Man!\" he taunted, leaving the cow in his    \n",
+       "spicy wake.                                                                                                        \n",
+       "\n",
+       "As he zoomed across the meadow, he spied a cautious horse in a nearby paddock, who neighed, \"Oh! You look          \n",
+       "delicious! I want to eat you!\" But the Gingerbread Man only laughed, his feet barely touching the earth. The horse \n",
+       "joined the trail, hooves pounding, but even he couldn't match the Gingerbread Man's pace.                          \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "Illustration 3: A Bridge Over a Sparkling River Arriving at a wooden bridge across a shimmering river, the         \n",
+       "Gingerbread Man pauses momentarily, his silhouette against the glistening water. Sunlight sparkles off the water's \n",
+       "soft ripples casting reflections that dance like small constellations. A sly fox emerges from the shadows of a     \n",
+       "blooming willow on the riverbank, his eyes alight with cunning and curiosity.                                      \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "The Gingerbread Man bounded onto the bridge and skirted past a sly, watching fox. \"Foolish Gingerbread Man,\" the   \n",
+       "fox mused aloud, \"you might have outrun them all, but you can't possibly swim across that river.\"                  \n",
+       "\n",
+       "Pausing, the Gingerbread Man considered this dilemma. But the fox, oh so clever, offered a dangerous solution.     \n",
+       "\"Climb on my back, and I'll carry you across safely,\" he suggested with a sly smile.                               \n",
+       "\n",
+       "Gingerbread thought himself smarter than that but hesitated, fearing the water or being pursued by the tired,      \n",
+       "hungry crowd now gathering. \"Promise you won't eat me?\" he ventured.                                               \n",
+       "\n",
+       "\"Of course,\" the fox reassured, a gleam in his eyes that the others pondered from a distance.                      \n",
+       "\n",
+       "As they crossed the river, the gingerbread man confident on his ride, the old woman, cow, and horse hoped for his  \n",
+       "safety. Yet, nearing the middle, the crafty fox tilted his chin and swiftly snapped, swallowing the gingerbread man\n",
+       "whole.                                                                                                             \n",
+       "\n",
+       "Bewildered but awed by the clever twist they had witnessed, the old woman hung her head while the cow and horse    \n",
+       "ambled away, pondering the fate of the boisterous Gingerbread Man.                                                 \n",
+       "\n",
+       "The fox, licking his lips, ambled along the river, savoring his victory, leaving an air of mystery hovering above  \n",
+       "the shimmering waters, where the memory of the Gingerbread Man's spirited run lingered long after.                 \n",
+       "\n",
+       "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "I hope you enjoy the enhanced version of the tale!                                                                 \n",
+       "
\n" + ], + "text/plain": [ + "Certainly! Here’s the final version of the short story with the enhanced illustrations for \"The Escape of the \n", + "Gingerbread Man.\" \n", + "\n", + "\u001b[1mTitle: The Escape of the Gingerbread Man\u001b[0m \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "\u001b[1mIllustration 1: A Rustic Kitchen Scene\u001b[0m In a quaint little cottage at the edge of an enchanted forest, an elderly \n", + "woman, with flour-dusted hands, carefully shapes gingerbread dough on a wooden counter. The aroma of ginger, \n", + "cinnamon, and cloves wafts through the air as a warm breeze from the open window dances with fluttering curtains. \n", + "The sunlight gently permeates the cozy kitchen, casting a golden hue over the flour-dusted surfaces and the rolling\n", + "pin. Heartfelt trinkets and rustic decorations adorn the shelves—a sign of a lived-in, lovingly nurtured home. \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "\u001b[1mStory:\u001b[0m \n", + "\n", + "Once there was an old woman who lived alone in a charming cottage, her days filled with the joyful art of baking. \n", + "One sunny afternoon, she decided to make a special gingerbread man to keep her company. As she shaped him tenderly \n", + "and placed him in the oven, she couldn't help but smile at the delight he might bring. \n", + "\n", + "But to her astonishment, once she opened the oven door to check on her creation, the gingerbread man leapt out, \n", + "suddenly alive. His eyes were bright as beads, and his smile cheeky and wide. \"Run, run, as fast as you can! You \n", + "can't catch me, I'm the Gingerbread Man!\" he laughed, darting towards the door. \n", + "\n", + "The old woman, chuckling at the unexpected mischief, gave chase, but her footsteps were slow with the weight of \n", + "age. The Gingerbread Man raced out of the door and into the sunny afternoon. \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "\u001b[1mIllustration 2: A Frolic Through the Meadow\u001b[0m The Gingerbread Man darts through a vibrant meadow, his arms swinging \n", + "joyously by his sides. Behind him trails the old woman, her apron flapping in the wind as she gently tries to catch\n", + "up. Wildflowers of every color bloom vividly under the radiant sky, painting the scene with shades of nature's \n", + "brilliance. Birds flit through the sky and a stream babbles nearby, oblivious to the chase taking place below. \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "Continuing his sprint, the Gingerbread Man encountered a cow grazing peacefully. Intrigued, the cow trotted \n", + "forward. \"Stop, Gingerbread Man! I wish to eat you!\" she called, but the Gingerbread Man only twirled in a teasing \n", + "jig, flashing his icing smile before darting off again. \n", + "\n", + "\"Run, run, as fast as you can! You can't catch me, I'm the Gingerbread Man!\" he taunted, leaving the cow in his \n", + "spicy wake. \n", + "\n", + "As he zoomed across the meadow, he spied a cautious horse in a nearby paddock, who neighed, \"Oh! You look \n", + "delicious! I want to eat you!\" But the Gingerbread Man only laughed, his feet barely touching the earth. The horse \n", + "joined the trail, hooves pounding, but even he couldn't match the Gingerbread Man's pace. \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "\u001b[1mIllustration 3: A Bridge Over a Sparkling River\u001b[0m Arriving at a wooden bridge across a shimmering river, the \n", + "Gingerbread Man pauses momentarily, his silhouette against the glistening water. Sunlight sparkles off the water's \n", + "soft ripples casting reflections that dance like small constellations. A sly fox emerges from the shadows of a \n", + "blooming willow on the riverbank, his eyes alight with cunning and curiosity. \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "The Gingerbread Man bounded onto the bridge and skirted past a sly, watching fox. \"Foolish Gingerbread Man,\" the \n", + "fox mused aloud, \"you might have outrun them all, but you can't possibly swim across that river.\" \n", + "\n", + "Pausing, the Gingerbread Man considered this dilemma. But the fox, oh so clever, offered a dangerous solution. \n", + "\"Climb on my back, and I'll carry you across safely,\" he suggested with a sly smile. \n", + "\n", + "Gingerbread thought himself smarter than that but hesitated, fearing the water or being pursued by the tired, \n", + "hungry crowd now gathering. \"Promise you won't eat me?\" he ventured. \n", + "\n", + "\"Of course,\" the fox reassured, a gleam in his eyes that the others pondered from a distance. \n", + "\n", + "As they crossed the river, the gingerbread man confident on his ride, the old woman, cow, and horse hoped for his \n", + "safety. Yet, nearing the middle, the crafty fox tilted his chin and swiftly snapped, swallowing the gingerbread man\n", + "whole. \n", + "\n", + "Bewildered but awed by the clever twist they had witnessed, the old woman hung her head while the cow and horse \n", + "ambled away, pondering the fate of the boisterous Gingerbread Man. \n", + "\n", + "The fox, licking his lips, ambled along the river, savoring his victory, leaving an air of mystery hovering above \n", + "the shimmering waters, where the memory of the Gingerbread Man's spirited run lingered long after. \n", + "\n", + "\u001b[33m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n", + "I hope you enjoy the enhanced version of the tale! \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                                                       User:                                                       \n",
+       "\n",
+       "approve                                                                                                            \n",
+       "
\n" + ], + "text/plain": [ + " \u001b[1mUser:\u001b[0m \n", + "\n", + "approve \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "runtime.start()\n", + "session_id = str(uuid.uuid4())\n", + "await runtime.publish_message(\n", + " GroupChatMessage(\n", + " body=UserMessage(\n", + " content=\"Please write a short story about the gingerbread man with up to 3 photo-realistic illustrations.\",\n", + " source=\"User\",\n", + " )\n", + " ),\n", + " TopicId(type=group_chat_topic_type, source=session_id),\n", + ")\n", + "await runtime.stop_when_idle()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the output, you can see the writer, illustrator, and editor agents\n", + "taking turns to speak and collaborate to generate a picture book, before\n", + "asking for final approval from the user." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next Steps\n", + "\n", + "This example showcases a simple implementation of the group chat pattern -- \n", + "**it is not meant to be used in real applications.** You can improve the\n", + "speaker selection algorithm. For example, you can avoid using LLM when simple\n", + "rules are sufficient and more reliable: \n", + "you can use a rule that the editor always speaks after the writer.\n", + "\n", + "The [AgentChat API](../../agentchat-user-guide/index.md) provides a high-level\n", + "API for selector group chat. It has more features but mostly shares the same\n", + "design as this implementation." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/handoffs.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/handoffs.ipynb index 9e2a4f797518..31885a10e977 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/handoffs.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/handoffs.ipynb @@ -65,7 +65,7 @@ " TypeSubscription,\n", " message_handler,\n", ")\n", - "from autogen_core.components.models import (\n", + "from autogen_core.models import (\n", " AssistantMessage,\n", " ChatCompletionClient,\n", " FunctionExecutionResult,\n", @@ -74,8 +74,8 @@ " SystemMessage,\n", " UserMessage,\n", ")\n", - "from autogen_core.components.tools import FunctionTool, Tool\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_core.tools import FunctionTool, Tool\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "from pydantic import BaseModel" ] }, @@ -120,7 +120,7 @@ "\n", "We start with the `AIAgent` class, which is the class for all AI agents \n", "(i.e., Triage, Sales, and Issue and Repair Agents) in the multi-agent chatbot.\n", - "An `AIAgent` uses a {py:class}`~autogen_core.components.models.ChatCompletionClient`\n", + "An `AIAgent` uses a {py:class}`~autogen_core.models.ChatCompletionClient`\n", "to generate responses.\n", "It can use regular tools directly or delegate tasks to other agents using `delegate_tools`.\n", "It subscribes to topic type `agent_topic_type` to receive messages from the customer,\n", @@ -296,7 +296,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -339,7 +339,7 @@ "\n", "The AI agents can use regular tools to complete tasks if they don't need to hand off the task to other agents.\n", "We define the tools using simple functions and create the tools using the\n", - "{py:class}`~autogen_core.components.tools.FunctionTool` wrapper." + "{py:class}`~autogen_core.tools.FunctionTool` wrapper." ] }, { diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/index.md b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/index.md index e1dada4147bb..7528ed8e40d6 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/index.md +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/index.md @@ -27,4 +27,5 @@ handoffs mixture-of-agents multi-agent-debate reflection +code-execution-groupchat ``` diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/mixture-of-agents.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/mixture-of-agents.ipynb index 7abf032608a2..68b7a43a9c67 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/mixture-of-agents.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/mixture-of-agents.ipynb @@ -1,519 +1,519 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Mixture of Agents\n", - "\n", - "[Mixture of Agents](https://arxiv.org/abs/2406.04692) is a multi-agent design pattern\n", - "that models after the feed-forward neural network architecture.\n", - "\n", - "The pattern consists of two types of agents: worker agents and a single orchestrator agent.\n", - "Worker agents are organized into multiple layers, with each layer consisting of a fixed number of worker agents.\n", - "Messages from the worker agents in a previous layer are concatenated and sent to\n", - "all the worker agents in the next layer.\n", - "\n", - "This example implements the Mixture of Agents pattern using the core library\n", - "following the [original implementation](https://github.com/togethercomputer/moa) of multi-layer mixture of agents.\n", - "\n", - "Here is a high-level procedure overview of the pattern:\n", - "1. The orchestrator agent takes input a user task and first dispatches it to the worker agents in the first layer.\n", - "2. The worker agents in the first layer process the task and return the results to the orchestrator agent.\n", - "3. The orchestrator agent then synthesizes the results from the first layer and dispatches an updated task with the previous results to the worker agents in the second layer.\n", - "4. The process continues until the final layer is reached.\n", - "5. In the final layer, the orchestrator agent aggregates the results from previous layer and returns a single final result to the user.\n", - "\n", - "We use the direct messaging API {py:meth}`~autogen_core.BaseAgent.send_message` to implement this pattern.\n", - "This makes it easier to add more features like worker task cancellation and error handling in the future." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import asyncio\n", - "from dataclasses import dataclass\n", - "from typing import List\n", - "\n", - "from autogen_core import AgentId, MessageContext, RoutedAgent, SingleThreadedAgentRuntime, message_handler\n", - "from autogen_core.components.models import ChatCompletionClient, SystemMessage, UserMessage\n", - "from autogen_ext.models import OpenAIChatCompletionClient" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Message Protocol\n", - "\n", - "The agents communicate using the following messages:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "@dataclass\n", - "class WorkerTask:\n", - " task: str\n", - " previous_results: List[str]\n", - "\n", - "\n", - "@dataclass\n", - "class WorkerTaskResult:\n", - " result: str\n", - "\n", - "\n", - "@dataclass\n", - "class UserTask:\n", - " task: str\n", - "\n", - "\n", - "@dataclass\n", - "class FinalResult:\n", - " result: str" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Worker Agent\n", - "\n", - "Each worker agent receives a task from the orchestrator agent and processes them\n", - "indepedently.\n", - "Once the task is completed, the worker agent returns the result." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "class WorkerAgent(RoutedAgent):\n", - " def __init__(\n", - " self,\n", - " model_client: ChatCompletionClient,\n", - " ) -> None:\n", - " super().__init__(description=\"Worker Agent\")\n", - " self._model_client = model_client\n", - "\n", - " @message_handler\n", - " async def handle_task(self, message: WorkerTask, ctx: MessageContext) -> WorkerTaskResult:\n", - " if message.previous_results:\n", - " # If previous results are provided, we need to synthesize them to create a single prompt.\n", - " system_prompt = \"You have been provided with a set of responses from various open-source models to the latest user query. Your task is to synthesize these responses into a single, high-quality response. It is crucial to critically evaluate the information provided in these responses, recognizing that some of it may be biased or incorrect. Your response should not simply replicate the given answers but should offer a refined, accurate, and comprehensive reply to the instruction. Ensure your response is well-structured, coherent, and adheres to the highest standards of accuracy and reliability.\\n\\nResponses from models:\"\n", - " system_prompt += \"\\n\" + \"\\n\\n\".join([f\"{i+1}. {r}\" for i, r in enumerate(message.previous_results)])\n", - " model_result = await self._model_client.create(\n", - " [SystemMessage(content=system_prompt), UserMessage(content=message.task, source=\"user\")]\n", - " )\n", - " else:\n", - " # If no previous results are provided, we can simply pass the user query to the model.\n", - " model_result = await self._model_client.create([UserMessage(content=message.task, source=\"user\")])\n", - " assert isinstance(model_result.content, str)\n", - " print(f\"{'-'*80}\\nWorker-{self.id}:\\n{model_result.content}\")\n", - " return WorkerTaskResult(result=model_result.content)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Orchestrator Agent\n", - "\n", - "The orchestrator agent receives tasks from the user and distributes them to the worker agents,\n", - "iterating over multiple layers of worker agents. Once all worker agents have processed the task,\n", - "the orchestrator agent aggregates the results and publishes the final result." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "class OrchestratorAgent(RoutedAgent):\n", - " def __init__(\n", - " self,\n", - " model_client: ChatCompletionClient,\n", - " worker_agent_types: List[str],\n", - " num_layers: int,\n", - " ) -> None:\n", - " super().__init__(description=\"Aggregator Agent\")\n", - " self._model_client = model_client\n", - " self._worker_agent_types = worker_agent_types\n", - " self._num_layers = num_layers\n", - "\n", - " @message_handler\n", - " async def handle_task(self, message: UserTask, ctx: MessageContext) -> FinalResult:\n", - " print(f\"{'-'*80}\\nOrchestrator-{self.id}:\\nReceived task: {message.task}\")\n", - " # Create task for the first layer.\n", - " worker_task = WorkerTask(task=message.task, previous_results=[])\n", - " # Iterate over layers.\n", - " for i in range(self._num_layers - 1):\n", - " # Assign workers for this layer.\n", - " worker_ids = [\n", - " AgentId(worker_type, f\"{self.id.key}/layer_{i}/worker_{j}\")\n", - " for j, worker_type in enumerate(self._worker_agent_types)\n", - " ]\n", - " # Dispatch tasks to workers.\n", - " print(f\"{'-'*80}\\nOrchestrator-{self.id}:\\nDispatch to workers at layer {i}\")\n", - " results = await asyncio.gather(*[self.send_message(worker_task, worker_id) for worker_id in worker_ids])\n", - " print(f\"{'-'*80}\\nOrchestrator-{self.id}:\\nReceived results from workers at layer {i}\")\n", - " # Prepare task for the next layer.\n", - " worker_task = WorkerTask(task=message.task, previous_results=[r.result for r in results])\n", - " # Perform final aggregation.\n", - " print(f\"{'-'*80}\\nOrchestrator-{self.id}:\\nPerforming final aggregation\")\n", - " system_prompt = \"You have been provided with a set of responses from various open-source models to the latest user query. Your task is to synthesize these responses into a single, high-quality response. It is crucial to critically evaluate the information provided in these responses, recognizing that some of it may be biased or incorrect. Your response should not simply replicate the given answers but should offer a refined, accurate, and comprehensive reply to the instruction. Ensure your response is well-structured, coherent, and adheres to the highest standards of accuracy and reliability.\\n\\nResponses from models:\"\n", - " system_prompt += \"\\n\" + \"\\n\\n\".join([f\"{i+1}. {r}\" for i, r in enumerate(worker_task.previous_results)])\n", - " model_result = await self._model_client.create(\n", - " [SystemMessage(content=system_prompt), UserMessage(content=message.task, source=\"user\")]\n", - " )\n", - " assert isinstance(model_result.content, str)\n", - " return FinalResult(result=model_result.content)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running Mixture of Agents\n", - "\n", - "Let's run the mixture of agents on a math task. You can change the task to make it more challenging, for example, by trying tasks from the [International Mathematical Olympiad](https://www.imo-official.org/problems.aspx)." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "task = (\n", - " \"I have 432 cookies, and divide them 3:4:2 between Alice, Bob, and Charlie. How many cookies does each person get?\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's set up the runtime with 3 layers of worker agents, each layer consisting of 3 worker agents.\n", - "We only need to register a single worker agent types, \"worker\", because we are using\n", - "the same model client configuration (i.e., gpt-4o-mini) for all worker agents.\n", - "If you want to use different models, you will need to register multiple worker agent types,\n", - "one for each model, and update the `worker_agent_types` list in the orchestrator agent's\n", - "factory function.\n", - "\n", - "The instances of worker agents are automatically created when the orchestrator agent\n", - "dispatches tasks to them.\n", - "See [Agent Identity and Lifecycle](../core-concepts/agent-identity-and-lifecycle.md)\n", - "for more information on agent lifecycle." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--------------------------------------------------------------------------------\n", - "Orchestrator-orchestrator:default:\n", - "Received task: I have 432 cookies, and divide them 3:4:2 between Alice, Bob, and Charlie. How many cookies does each person get?\n", - "--------------------------------------------------------------------------------\n", - "Orchestrator-orchestrator:default:\n", - "Dispatch to workers at layer 0\n", - "--------------------------------------------------------------------------------\n", - "Worker-worker:default/layer_0/worker_1:\n", - "To divide 432 cookies in the ratio of 3:4:2 between Alice, Bob, and Charlie, you first need to determine the total number of parts in the ratio.\n", - "\n", - "Add the parts together:\n", - "\\[ 3 + 4 + 2 = 9 \\]\n", - "\n", - "Now, you can find the value of one part by dividing the total number of cookies by the total number of parts:\n", - "\\[ \\text{Value of one part} = \\frac{432}{9} = 48 \\]\n", - "\n", - "Now, multiply the value of one part by the number of parts for each person:\n", - "\n", - "- For Alice (3 parts):\n", - "\\[ 3 \\times 48 = 144 \\]\n", - "\n", - "- For Bob (4 parts):\n", - "\\[ 4 \\times 48 = 192 \\]\n", - "\n", - "- For Charlie (2 parts):\n", - "\\[ 2 \\times 48 = 96 \\]\n", - "\n", - "Thus, the number of cookies each person gets is:\n", - "- Alice: 144 cookies\n", - "- Bob: 192 cookies\n", - "- Charlie: 96 cookies\n", - "--------------------------------------------------------------------------------\n", - "Worker-worker:default/layer_0/worker_0:\n", - "To divide 432 cookies in the ratio of 3:4:2 between Alice, Bob, and Charlie, we will first determine the total number of parts in the ratio:\n", - "\n", - "\\[\n", - "3 + 4 + 2 = 9 \\text{ parts}\n", - "\\]\n", - "\n", - "Next, we calculate the value of one part by dividing the total number of cookies by the total number of parts:\n", - "\n", - "\\[\n", - "\\text{Value of one part} = \\frac{432}{9} = 48\n", - "\\]\n", - "\n", - "Now, we can find out how many cookies each person receives by multiplying the value of one part by the number of parts each person receives:\n", - "\n", - "- For Alice (3 parts):\n", - "\\[\n", - "3 \\times 48 = 144 \\text{ cookies}\n", - "\\]\n", - "\n", - "- For Bob (4 parts):\n", - "\\[\n", - "4 \\times 48 = 192 \\text{ cookies}\n", - "\\]\n", - "\n", - "- For Charlie (2 parts):\n", - "\\[\n", - "2 \\times 48 = 96 \\text{ cookies}\n", - "\\]\n", - "\n", - "Thus, the number of cookies each person gets is:\n", - "- **Alice**: 144 cookies\n", - "- **Bob**: 192 cookies\n", - "- **Charlie**: 96 cookies\n", - "--------------------------------------------------------------------------------\n", - "Worker-worker:default/layer_0/worker_2:\n", - "To divide the cookies in the ratio of 3:4:2, we first need to find the total parts in the ratio. \n", - "\n", - "The total parts are:\n", - "- Alice: 3 parts\n", - "- Bob: 4 parts\n", - "- Charlie: 2 parts\n", - "\n", - "Adding these parts together gives:\n", - "\\[ 3 + 4 + 2 = 9 \\text{ parts} \\]\n", - "\n", - "Next, we can determine how many cookies each part represents by dividing the total number of cookies by the total parts:\n", - "\\[ \\text{Cookies per part} = \\frac{432 \\text{ cookies}}{9 \\text{ parts}} = 48 \\text{ cookies/part} \\]\n", - "\n", - "Now we can calculate the number of cookies for each person:\n", - "- Alice's share: \n", - "\\[ 3 \\text{ parts} \\times 48 \\text{ cookies/part} = 144 \\text{ cookies} \\]\n", - "- Bob's share: \n", - "\\[ 4 \\text{ parts} \\times 48 \\text{ cookies/part} = 192 \\text{ cookies} \\]\n", - "- Charlie's share: \n", - "\\[ 2 \\text{ parts} \\times 48 \\text{ cookies/part} = 96 \\text{ cookies} \\]\n", - "\n", - "So, the final distribution of cookies is:\n", - "- Alice: 144 cookies\n", - "- Bob: 192 cookies\n", - "- Charlie: 96 cookies\n", - "--------------------------------------------------------------------------------\n", - "Orchestrator-orchestrator:default:\n", - "Received results from workers at layer 0\n", - "--------------------------------------------------------------------------------\n", - "Orchestrator-orchestrator:default:\n", - "Dispatch to workers at layer 1\n", - "--------------------------------------------------------------------------------\n", - "Worker-worker:default/layer_1/worker_2:\n", - "To divide 432 cookies in the ratio of 3:4:2 among Alice, Bob, and Charlie, follow these steps:\n", - "\n", - "1. **Determine the total number of parts in the ratio**:\n", - " \\[\n", - " 3 + 4 + 2 = 9 \\text{ parts}\n", - " \\]\n", - "\n", - "2. **Calculate the value of one part** by dividing the total number of cookies by the total number of parts:\n", - " \\[\n", - " \\text{Value of one part} = \\frac{432}{9} = 48\n", - " \\]\n", - "\n", - "3. **Calculate the number of cookies each person receives** by multiplying the value of one part by the number of parts each individual gets:\n", - " - **For Alice (3 parts)**:\n", - " \\[\n", - " 3 \\times 48 = 144 \\text{ cookies}\n", - " \\]\n", - " - **For Bob (4 parts)**:\n", - " \\[\n", - " 4 \\times 48 = 192 \\text{ cookies}\n", - " \\]\n", - " - **For Charlie (2 parts)**:\n", - " \\[\n", - " 2 \\times 48 = 96 \\text{ cookies}\n", - " \\]\n", - "\n", - "Thus, the final distribution of cookies is:\n", - "- **Alice**: 144 cookies\n", - "- **Bob**: 192 cookies\n", - "- **Charlie**: 96 cookies\n", - "--------------------------------------------------------------------------------\n", - "Worker-worker:default/layer_1/worker_0:\n", - "To divide 432 cookies among Alice, Bob, and Charlie in the ratio of 3:4:2, we can follow these steps:\n", - "\n", - "1. **Calculate the Total Parts**: \n", - " Add the parts of the ratio together:\n", - " \\[\n", - " 3 + 4 + 2 = 9 \\text{ parts}\n", - " \\]\n", - "\n", - "2. **Determine the Value of One Part**: \n", - " Divide the total number of cookies by the total number of parts:\n", - " \\[\n", - " \\text{Value of one part} = \\frac{432 \\text{ cookies}}{9 \\text{ parts}} = 48 \\text{ cookies/part}\n", - " \\]\n", - "\n", - "3. **Calculate Each Person's Share**:\n", - " - **Alice's Share** (3 parts):\n", - " \\[\n", - " 3 \\times 48 = 144 \\text{ cookies}\n", - " \\]\n", - " - **Bob's Share** (4 parts):\n", - " \\[\n", - " 4 \\times 48 = 192 \\text{ cookies}\n", - " \\]\n", - " - **Charlie's Share** (2 parts):\n", - " \\[\n", - " 2 \\times 48 = 96 \\text{ cookies}\n", - " \\]\n", - "\n", - "4. **Final Distribution**:\n", - " - Alice: 144 cookies\n", - " - Bob: 192 cookies\n", - " - Charlie: 96 cookies\n", - "\n", - "Thus, the distribution of cookies is:\n", - "- **Alice**: 144 cookies\n", - "- **Bob**: 192 cookies\n", - "- **Charlie**: 96 cookies\n", - "--------------------------------------------------------------------------------\n", - "Worker-worker:default/layer_1/worker_1:\n", - "To divide 432 cookies among Alice, Bob, and Charlie in the ratio of 3:4:2, we first need to determine the total number of parts in this ratio.\n", - "\n", - "1. **Calculate Total Parts:**\n", - " \\[\n", - " 3 \\text{ (Alice)} + 4 \\text{ (Bob)} + 2 \\text{ (Charlie)} = 9 \\text{ parts}\n", - " \\]\n", - "\n", - "2. **Determine the Value of One Part:**\n", - " Next, we'll find out how many cookies correspond to one part by dividing the total number of cookies by the total number of parts:\n", - " \\[\n", - " \\text{Value of one part} = \\frac{432 \\text{ cookies}}{9 \\text{ parts}} = 48 \\text{ cookies/part}\n", - " \\]\n", - "\n", - "3. **Calculate the Share for Each Person:**\n", - " - **Alice's Share (3 parts):**\n", - " \\[\n", - " 3 \\times 48 = 144 \\text{ cookies}\n", - " \\]\n", - " - **Bob's Share (4 parts):**\n", - " \\[\n", - " 4 \\times 48 = 192 \\text{ cookies}\n", - " \\]\n", - " - **Charlie’s Share (2 parts):**\n", - " \\[\n", - " 2 \\times 48 = 96 \\text{ cookies}\n", - " \\]\n", - "\n", - "4. **Summary of the Distribution:**\n", - " - **Alice:** 144 cookies\n", - " - **Bob:** 192 cookies\n", - " - **Charlie:** 96 cookies\n", - "\n", - "In conclusion, Alice receives 144 cookies, Bob receives 192 cookies, and Charlie receives 96 cookies.\n", - "--------------------------------------------------------------------------------\n", - "Orchestrator-orchestrator:default:\n", - "Received results from workers at layer 1\n", - "--------------------------------------------------------------------------------\n", - "Orchestrator-orchestrator:default:\n", - "Performing final aggregation\n", - "--------------------------------------------------------------------------------\n", - "Final result:\n", - "To divide 432 cookies among Alice, Bob, and Charlie in the ratio of 3:4:2, follow these steps:\n", - "\n", - "1. **Calculate the Total Parts in the Ratio:**\n", - " Add the parts of the ratio together:\n", - " \\[\n", - " 3 + 4 + 2 = 9\n", - " \\]\n", - "\n", - "2. **Determine the Value of One Part:**\n", - " Divide the total number of cookies by the total number of parts:\n", - " \\[\n", - " \\text{Value of one part} = \\frac{432}{9} = 48 \\text{ cookies/part}\n", - " \\]\n", - "\n", - "3. **Calculate Each Person's Share:**\n", - " - **Alice's Share (3 parts):**\n", - " \\[\n", - " 3 \\times 48 = 144 \\text{ cookies}\n", - " \\]\n", - " - **Bob's Share (4 parts):**\n", - " \\[\n", - " 4 \\times 48 = 192 \\text{ cookies}\n", - " \\]\n", - " - **Charlie's Share (2 parts):**\n", - " \\[\n", - " 2 \\times 48 = 96 \\text{ cookies}\n", - " \\]\n", - "\n", - "Therefore, the distribution of cookies is as follows:\n", - "- **Alice:** 144 cookies\n", - "- **Bob:** 192 cookies\n", - "- **Charlie:** 96 cookies\n", - "\n", - "In summary, Alice gets 144 cookies, Bob gets 192 cookies, and Charlie gets 96 cookies.\n" - ] - } - ], - "source": [ - "runtime = SingleThreadedAgentRuntime()\n", - "await WorkerAgent.register(\n", - " runtime, \"worker\", lambda: WorkerAgent(model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"))\n", - ")\n", - "await OrchestratorAgent.register(\n", - " runtime,\n", - " \"orchestrator\",\n", - " lambda: OrchestratorAgent(\n", - " model_client=OpenAIChatCompletionClient(model=\"gpt-4o\"), worker_agent_types=[\"worker\"] * 3, num_layers=3\n", - " ),\n", - ")\n", - "\n", - "runtime.start()\n", - "result = await runtime.send_message(UserTask(task=task), AgentId(\"orchestrator\", \"default\"))\n", - "await runtime.stop_when_idle()\n", - "print(f\"{'-'*80}\\nFinal result:\\n{result.result}\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Mixture of Agents\n", + "\n", + "[Mixture of Agents](https://arxiv.org/abs/2406.04692) is a multi-agent design pattern\n", + "that models after the feed-forward neural network architecture.\n", + "\n", + "The pattern consists of two types of agents: worker agents and a single orchestrator agent.\n", + "Worker agents are organized into multiple layers, with each layer consisting of a fixed number of worker agents.\n", + "Messages from the worker agents in a previous layer are concatenated and sent to\n", + "all the worker agents in the next layer.\n", + "\n", + "This example implements the Mixture of Agents pattern using the core library\n", + "following the [original implementation](https://github.com/togethercomputer/moa) of multi-layer mixture of agents.\n", + "\n", + "Here is a high-level procedure overview of the pattern:\n", + "1. The orchestrator agent takes input a user task and first dispatches it to the worker agents in the first layer.\n", + "2. The worker agents in the first layer process the task and return the results to the orchestrator agent.\n", + "3. The orchestrator agent then synthesizes the results from the first layer and dispatches an updated task with the previous results to the worker agents in the second layer.\n", + "4. The process continues until the final layer is reached.\n", + "5. In the final layer, the orchestrator agent aggregates the results from previous layer and returns a single final result to the user.\n", + "\n", + "We use the direct messaging API {py:meth}`~autogen_core.BaseAgent.send_message` to implement this pattern.\n", + "This makes it easier to add more features like worker task cancellation and error handling in the future." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import asyncio\n", + "from dataclasses import dataclass\n", + "from typing import List\n", + "\n", + "from autogen_core import AgentId, MessageContext, RoutedAgent, SingleThreadedAgentRuntime, message_handler\n", + "from autogen_core.models import ChatCompletionClient, SystemMessage, UserMessage\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Message Protocol\n", + "\n", + "The agents communicate using the following messages:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "@dataclass\n", + "class WorkerTask:\n", + " task: str\n", + " previous_results: List[str]\n", + "\n", + "\n", + "@dataclass\n", + "class WorkerTaskResult:\n", + " result: str\n", + "\n", + "\n", + "@dataclass\n", + "class UserTask:\n", + " task: str\n", + "\n", + "\n", + "@dataclass\n", + "class FinalResult:\n", + " result: str" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Worker Agent\n", + "\n", + "Each worker agent receives a task from the orchestrator agent and processes them\n", + "indepedently.\n", + "Once the task is completed, the worker agent returns the result." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "class WorkerAgent(RoutedAgent):\n", + " def __init__(\n", + " self,\n", + " model_client: ChatCompletionClient,\n", + " ) -> None:\n", + " super().__init__(description=\"Worker Agent\")\n", + " self._model_client = model_client\n", + "\n", + " @message_handler\n", + " async def handle_task(self, message: WorkerTask, ctx: MessageContext) -> WorkerTaskResult:\n", + " if message.previous_results:\n", + " # If previous results are provided, we need to synthesize them to create a single prompt.\n", + " system_prompt = \"You have been provided with a set of responses from various open-source models to the latest user query. Your task is to synthesize these responses into a single, high-quality response. It is crucial to critically evaluate the information provided in these responses, recognizing that some of it may be biased or incorrect. Your response should not simply replicate the given answers but should offer a refined, accurate, and comprehensive reply to the instruction. Ensure your response is well-structured, coherent, and adheres to the highest standards of accuracy and reliability.\\n\\nResponses from models:\"\n", + " system_prompt += \"\\n\" + \"\\n\\n\".join([f\"{i+1}. {r}\" for i, r in enumerate(message.previous_results)])\n", + " model_result = await self._model_client.create(\n", + " [SystemMessage(content=system_prompt), UserMessage(content=message.task, source=\"user\")]\n", + " )\n", + " else:\n", + " # If no previous results are provided, we can simply pass the user query to the model.\n", + " model_result = await self._model_client.create([UserMessage(content=message.task, source=\"user\")])\n", + " assert isinstance(model_result.content, str)\n", + " print(f\"{'-'*80}\\nWorker-{self.id}:\\n{model_result.content}\")\n", + " return WorkerTaskResult(result=model_result.content)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Orchestrator Agent\n", + "\n", + "The orchestrator agent receives tasks from the user and distributes them to the worker agents,\n", + "iterating over multiple layers of worker agents. Once all worker agents have processed the task,\n", + "the orchestrator agent aggregates the results and publishes the final result." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "class OrchestratorAgent(RoutedAgent):\n", + " def __init__(\n", + " self,\n", + " model_client: ChatCompletionClient,\n", + " worker_agent_types: List[str],\n", + " num_layers: int,\n", + " ) -> None:\n", + " super().__init__(description=\"Aggregator Agent\")\n", + " self._model_client = model_client\n", + " self._worker_agent_types = worker_agent_types\n", + " self._num_layers = num_layers\n", + "\n", + " @message_handler\n", + " async def handle_task(self, message: UserTask, ctx: MessageContext) -> FinalResult:\n", + " print(f\"{'-'*80}\\nOrchestrator-{self.id}:\\nReceived task: {message.task}\")\n", + " # Create task for the first layer.\n", + " worker_task = WorkerTask(task=message.task, previous_results=[])\n", + " # Iterate over layers.\n", + " for i in range(self._num_layers - 1):\n", + " # Assign workers for this layer.\n", + " worker_ids = [\n", + " AgentId(worker_type, f\"{self.id.key}/layer_{i}/worker_{j}\")\n", + " for j, worker_type in enumerate(self._worker_agent_types)\n", + " ]\n", + " # Dispatch tasks to workers.\n", + " print(f\"{'-'*80}\\nOrchestrator-{self.id}:\\nDispatch to workers at layer {i}\")\n", + " results = await asyncio.gather(*[self.send_message(worker_task, worker_id) for worker_id in worker_ids])\n", + " print(f\"{'-'*80}\\nOrchestrator-{self.id}:\\nReceived results from workers at layer {i}\")\n", + " # Prepare task for the next layer.\n", + " worker_task = WorkerTask(task=message.task, previous_results=[r.result for r in results])\n", + " # Perform final aggregation.\n", + " print(f\"{'-'*80}\\nOrchestrator-{self.id}:\\nPerforming final aggregation\")\n", + " system_prompt = \"You have been provided with a set of responses from various open-source models to the latest user query. Your task is to synthesize these responses into a single, high-quality response. It is crucial to critically evaluate the information provided in these responses, recognizing that some of it may be biased or incorrect. Your response should not simply replicate the given answers but should offer a refined, accurate, and comprehensive reply to the instruction. Ensure your response is well-structured, coherent, and adheres to the highest standards of accuracy and reliability.\\n\\nResponses from models:\"\n", + " system_prompt += \"\\n\" + \"\\n\\n\".join([f\"{i+1}. {r}\" for i, r in enumerate(worker_task.previous_results)])\n", + " model_result = await self._model_client.create(\n", + " [SystemMessage(content=system_prompt), UserMessage(content=message.task, source=\"user\")]\n", + " )\n", + " assert isinstance(model_result.content, str)\n", + " return FinalResult(result=model_result.content)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running Mixture of Agents\n", + "\n", + "Let's run the mixture of agents on a math task. You can change the task to make it more challenging, for example, by trying tasks from the [International Mathematical Olympiad](https://www.imo-official.org/problems.aspx)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "task = (\n", + " \"I have 432 cookies, and divide them 3:4:2 between Alice, Bob, and Charlie. How many cookies does each person get?\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's set up the runtime with 3 layers of worker agents, each layer consisting of 3 worker agents.\n", + "We only need to register a single worker agent types, \"worker\", because we are using\n", + "the same model client configuration (i.e., gpt-4o-mini) for all worker agents.\n", + "If you want to use different models, you will need to register multiple worker agent types,\n", + "one for each model, and update the `worker_agent_types` list in the orchestrator agent's\n", + "factory function.\n", + "\n", + "The instances of worker agents are automatically created when the orchestrator agent\n", + "dispatches tasks to them.\n", + "See [Agent Identity and Lifecycle](../core-concepts/agent-identity-and-lifecycle.md)\n", + "for more information on agent lifecycle." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "Orchestrator-orchestrator:default:\n", + "Received task: I have 432 cookies, and divide them 3:4:2 between Alice, Bob, and Charlie. How many cookies does each person get?\n", + "--------------------------------------------------------------------------------\n", + "Orchestrator-orchestrator:default:\n", + "Dispatch to workers at layer 0\n", + "--------------------------------------------------------------------------------\n", + "Worker-worker:default/layer_0/worker_1:\n", + "To divide 432 cookies in the ratio of 3:4:2 between Alice, Bob, and Charlie, you first need to determine the total number of parts in the ratio.\n", + "\n", + "Add the parts together:\n", + "\\[ 3 + 4 + 2 = 9 \\]\n", + "\n", + "Now, you can find the value of one part by dividing the total number of cookies by the total number of parts:\n", + "\\[ \\text{Value of one part} = \\frac{432}{9} = 48 \\]\n", + "\n", + "Now, multiply the value of one part by the number of parts for each person:\n", + "\n", + "- For Alice (3 parts):\n", + "\\[ 3 \\times 48 = 144 \\]\n", + "\n", + "- For Bob (4 parts):\n", + "\\[ 4 \\times 48 = 192 \\]\n", + "\n", + "- For Charlie (2 parts):\n", + "\\[ 2 \\times 48 = 96 \\]\n", + "\n", + "Thus, the number of cookies each person gets is:\n", + "- Alice: 144 cookies\n", + "- Bob: 192 cookies\n", + "- Charlie: 96 cookies\n", + "--------------------------------------------------------------------------------\n", + "Worker-worker:default/layer_0/worker_0:\n", + "To divide 432 cookies in the ratio of 3:4:2 between Alice, Bob, and Charlie, we will first determine the total number of parts in the ratio:\n", + "\n", + "\\[\n", + "3 + 4 + 2 = 9 \\text{ parts}\n", + "\\]\n", + "\n", + "Next, we calculate the value of one part by dividing the total number of cookies by the total number of parts:\n", + "\n", + "\\[\n", + "\\text{Value of one part} = \\frac{432}{9} = 48\n", + "\\]\n", + "\n", + "Now, we can find out how many cookies each person receives by multiplying the value of one part by the number of parts each person receives:\n", + "\n", + "- For Alice (3 parts):\n", + "\\[\n", + "3 \\times 48 = 144 \\text{ cookies}\n", + "\\]\n", + "\n", + "- For Bob (4 parts):\n", + "\\[\n", + "4 \\times 48 = 192 \\text{ cookies}\n", + "\\]\n", + "\n", + "- For Charlie (2 parts):\n", + "\\[\n", + "2 \\times 48 = 96 \\text{ cookies}\n", + "\\]\n", + "\n", + "Thus, the number of cookies each person gets is:\n", + "- **Alice**: 144 cookies\n", + "- **Bob**: 192 cookies\n", + "- **Charlie**: 96 cookies\n", + "--------------------------------------------------------------------------------\n", + "Worker-worker:default/layer_0/worker_2:\n", + "To divide the cookies in the ratio of 3:4:2, we first need to find the total parts in the ratio. \n", + "\n", + "The total parts are:\n", + "- Alice: 3 parts\n", + "- Bob: 4 parts\n", + "- Charlie: 2 parts\n", + "\n", + "Adding these parts together gives:\n", + "\\[ 3 + 4 + 2 = 9 \\text{ parts} \\]\n", + "\n", + "Next, we can determine how many cookies each part represents by dividing the total number of cookies by the total parts:\n", + "\\[ \\text{Cookies per part} = \\frac{432 \\text{ cookies}}{9 \\text{ parts}} = 48 \\text{ cookies/part} \\]\n", + "\n", + "Now we can calculate the number of cookies for each person:\n", + "- Alice's share: \n", + "\\[ 3 \\text{ parts} \\times 48 \\text{ cookies/part} = 144 \\text{ cookies} \\]\n", + "- Bob's share: \n", + "\\[ 4 \\text{ parts} \\times 48 \\text{ cookies/part} = 192 \\text{ cookies} \\]\n", + "- Charlie's share: \n", + "\\[ 2 \\text{ parts} \\times 48 \\text{ cookies/part} = 96 \\text{ cookies} \\]\n", + "\n", + "So, the final distribution of cookies is:\n", + "- Alice: 144 cookies\n", + "- Bob: 192 cookies\n", + "- Charlie: 96 cookies\n", + "--------------------------------------------------------------------------------\n", + "Orchestrator-orchestrator:default:\n", + "Received results from workers at layer 0\n", + "--------------------------------------------------------------------------------\n", + "Orchestrator-orchestrator:default:\n", + "Dispatch to workers at layer 1\n", + "--------------------------------------------------------------------------------\n", + "Worker-worker:default/layer_1/worker_2:\n", + "To divide 432 cookies in the ratio of 3:4:2 among Alice, Bob, and Charlie, follow these steps:\n", + "\n", + "1. **Determine the total number of parts in the ratio**:\n", + " \\[\n", + " 3 + 4 + 2 = 9 \\text{ parts}\n", + " \\]\n", + "\n", + "2. **Calculate the value of one part** by dividing the total number of cookies by the total number of parts:\n", + " \\[\n", + " \\text{Value of one part} = \\frac{432}{9} = 48\n", + " \\]\n", + "\n", + "3. **Calculate the number of cookies each person receives** by multiplying the value of one part by the number of parts each individual gets:\n", + " - **For Alice (3 parts)**:\n", + " \\[\n", + " 3 \\times 48 = 144 \\text{ cookies}\n", + " \\]\n", + " - **For Bob (4 parts)**:\n", + " \\[\n", + " 4 \\times 48 = 192 \\text{ cookies}\n", + " \\]\n", + " - **For Charlie (2 parts)**:\n", + " \\[\n", + " 2 \\times 48 = 96 \\text{ cookies}\n", + " \\]\n", + "\n", + "Thus, the final distribution of cookies is:\n", + "- **Alice**: 144 cookies\n", + "- **Bob**: 192 cookies\n", + "- **Charlie**: 96 cookies\n", + "--------------------------------------------------------------------------------\n", + "Worker-worker:default/layer_1/worker_0:\n", + "To divide 432 cookies among Alice, Bob, and Charlie in the ratio of 3:4:2, we can follow these steps:\n", + "\n", + "1. **Calculate the Total Parts**: \n", + " Add the parts of the ratio together:\n", + " \\[\n", + " 3 + 4 + 2 = 9 \\text{ parts}\n", + " \\]\n", + "\n", + "2. **Determine the Value of One Part**: \n", + " Divide the total number of cookies by the total number of parts:\n", + " \\[\n", + " \\text{Value of one part} = \\frac{432 \\text{ cookies}}{9 \\text{ parts}} = 48 \\text{ cookies/part}\n", + " \\]\n", + "\n", + "3. **Calculate Each Person's Share**:\n", + " - **Alice's Share** (3 parts):\n", + " \\[\n", + " 3 \\times 48 = 144 \\text{ cookies}\n", + " \\]\n", + " - **Bob's Share** (4 parts):\n", + " \\[\n", + " 4 \\times 48 = 192 \\text{ cookies}\n", + " \\]\n", + " - **Charlie's Share** (2 parts):\n", + " \\[\n", + " 2 \\times 48 = 96 \\text{ cookies}\n", + " \\]\n", + "\n", + "4. **Final Distribution**:\n", + " - Alice: 144 cookies\n", + " - Bob: 192 cookies\n", + " - Charlie: 96 cookies\n", + "\n", + "Thus, the distribution of cookies is:\n", + "- **Alice**: 144 cookies\n", + "- **Bob**: 192 cookies\n", + "- **Charlie**: 96 cookies\n", + "--------------------------------------------------------------------------------\n", + "Worker-worker:default/layer_1/worker_1:\n", + "To divide 432 cookies among Alice, Bob, and Charlie in the ratio of 3:4:2, we first need to determine the total number of parts in this ratio.\n", + "\n", + "1. **Calculate Total Parts:**\n", + " \\[\n", + " 3 \\text{ (Alice)} + 4 \\text{ (Bob)} + 2 \\text{ (Charlie)} = 9 \\text{ parts}\n", + " \\]\n", + "\n", + "2. **Determine the Value of One Part:**\n", + " Next, we'll find out how many cookies correspond to one part by dividing the total number of cookies by the total number of parts:\n", + " \\[\n", + " \\text{Value of one part} = \\frac{432 \\text{ cookies}}{9 \\text{ parts}} = 48 \\text{ cookies/part}\n", + " \\]\n", + "\n", + "3. **Calculate the Share for Each Person:**\n", + " - **Alice's Share (3 parts):**\n", + " \\[\n", + " 3 \\times 48 = 144 \\text{ cookies}\n", + " \\]\n", + " - **Bob's Share (4 parts):**\n", + " \\[\n", + " 4 \\times 48 = 192 \\text{ cookies}\n", + " \\]\n", + " - **Charlie’s Share (2 parts):**\n", + " \\[\n", + " 2 \\times 48 = 96 \\text{ cookies}\n", + " \\]\n", + "\n", + "4. **Summary of the Distribution:**\n", + " - **Alice:** 144 cookies\n", + " - **Bob:** 192 cookies\n", + " - **Charlie:** 96 cookies\n", + "\n", + "In conclusion, Alice receives 144 cookies, Bob receives 192 cookies, and Charlie receives 96 cookies.\n", + "--------------------------------------------------------------------------------\n", + "Orchestrator-orchestrator:default:\n", + "Received results from workers at layer 1\n", + "--------------------------------------------------------------------------------\n", + "Orchestrator-orchestrator:default:\n", + "Performing final aggregation\n", + "--------------------------------------------------------------------------------\n", + "Final result:\n", + "To divide 432 cookies among Alice, Bob, and Charlie in the ratio of 3:4:2, follow these steps:\n", + "\n", + "1. **Calculate the Total Parts in the Ratio:**\n", + " Add the parts of the ratio together:\n", + " \\[\n", + " 3 + 4 + 2 = 9\n", + " \\]\n", + "\n", + "2. **Determine the Value of One Part:**\n", + " Divide the total number of cookies by the total number of parts:\n", + " \\[\n", + " \\text{Value of one part} = \\frac{432}{9} = 48 \\text{ cookies/part}\n", + " \\]\n", + "\n", + "3. **Calculate Each Person's Share:**\n", + " - **Alice's Share (3 parts):**\n", + " \\[\n", + " 3 \\times 48 = 144 \\text{ cookies}\n", + " \\]\n", + " - **Bob's Share (4 parts):**\n", + " \\[\n", + " 4 \\times 48 = 192 \\text{ cookies}\n", + " \\]\n", + " - **Charlie's Share (2 parts):**\n", + " \\[\n", + " 2 \\times 48 = 96 \\text{ cookies}\n", + " \\]\n", + "\n", + "Therefore, the distribution of cookies is as follows:\n", + "- **Alice:** 144 cookies\n", + "- **Bob:** 192 cookies\n", + "- **Charlie:** 96 cookies\n", + "\n", + "In summary, Alice gets 144 cookies, Bob gets 192 cookies, and Charlie gets 96 cookies.\n" + ] + } + ], + "source": [ + "runtime = SingleThreadedAgentRuntime()\n", + "await WorkerAgent.register(\n", + " runtime, \"worker\", lambda: WorkerAgent(model_client=OpenAIChatCompletionClient(model=\"gpt-4o-mini\"))\n", + ")\n", + "await OrchestratorAgent.register(\n", + " runtime,\n", + " \"orchestrator\",\n", + " lambda: OrchestratorAgent(\n", + " model_client=OpenAIChatCompletionClient(model=\"gpt-4o\"), worker_agent_types=[\"worker\"] * 3, num_layers=3\n", + " ),\n", + ")\n", + "\n", + "runtime.start()\n", + "result = await runtime.send_message(UserTask(task=task), AgentId(\"orchestrator\", \"default\"))\n", + "await runtime.stop_when_idle()\n", + "print(f\"{'-'*80}\\nFinal result:\\n{result.result}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/multi-agent-debate.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/multi-agent-debate.ipynb index 54f191186d1b..6d34f7e58170 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/multi-agent-debate.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/multi-agent-debate.ipynb @@ -52,14 +52,14 @@ " default_subscription,\n", " message_handler,\n", ")\n", - "from autogen_core.components.models import (\n", + "from autogen_core.models import (\n", " AssistantMessage,\n", " ChatCompletionClient,\n", " LLMMessage,\n", " SystemMessage,\n", " UserMessage,\n", ")\n", - "from autogen_ext.models import OpenAIChatCompletionClient" + "from autogen_ext.models.openai import OpenAIChatCompletionClient" ] }, { diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/reflection.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/reflection.ipynb index 14c704edec16..bae4b92a4f51 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/reflection.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/reflection.ipynb @@ -101,7 +101,7 @@ "from typing import Dict, List, Union\n", "\n", "from autogen_core import MessageContext, RoutedAgent, TopicId, default_subscription, message_handler\n", - "from autogen_core.components.models import (\n", + "from autogen_core.models import (\n", " AssistantMessage,\n", " ChatCompletionClient,\n", " LLMMessage,\n", @@ -258,7 +258,7 @@ "- It stores message histories for different `CodeWritingTask` in a dictionary,\n", "so each task has its own history.\n", "- When making an LLM inference request using its model client, it transforms\n", - "the message history into a list of {py:class}`autogen_core.components.models.LLMMessage` objects\n", + "the message history into a list of {py:class}`autogen_core.models.LLMMessage` objects\n", "to pass to the model client.\n", "\n", "The reviewer agent subscribes to the `CodeReviewTask` message and publishes the `CodeReviewResult` message." @@ -442,7 +442,7 @@ ], "source": [ "from autogen_core import DefaultTopicId, SingleThreadedAgentRuntime\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "runtime = SingleThreadedAgentRuntime()\n", "await ReviewerAgent.register(\n", diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/sequential-workflow.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/sequential-workflow.ipynb index 1ef40a2ce587..91e8377133f1 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/sequential-workflow.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/sequential-workflow.ipynb @@ -57,8 +57,8 @@ " message_handler,\n", " type_subscription,\n", ")\n", - "from autogen_core.components.models import ChatCompletionClient, SystemMessage, UserMessage\n", - "from autogen_ext.models import OpenAIChatCompletionClient" + "from autogen_core.models import ChatCompletionClient, SystemMessage, UserMessage\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient" ] }, { diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/sequential-workflow.svg b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/sequential-workflow.svg index d68612ec333b..f14aa379a2c2 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/sequential-workflow.svg +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/design-patterns/sequential-workflow.svg @@ -1,3 +1,3 @@ -
Concept Extractor
Agent
Concept Extractor...
Writer Agent
Writer Agent
Format Proof
Agent
Format Proof...
User Agent
User Agent
Product
Concepts
Product...
Marketing 
Copy
Marketing...
Final 
Copy
Final...
Product Description
Product Description
\ No newline at end of file +
Concept Extractor
Agent
Concept Extractor...
Writer Agent
Writer Agent
Format Proof
Agent
Format Proof...
User Agent
User Agent
Product
Concepts
Product...
Marketing 
Copy
Marketing...
Final 
Copy
Final...
Product Description
Product Description
\ No newline at end of file diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/faqs.md b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/faqs.md index d1fae6cad6a5..cbec0e6afdec 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/faqs.md +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/faqs.md @@ -46,7 +46,7 @@ Model capabilites are additional capabilities an LLM may have beyond the standar Model capabilities can be passed into a model, which will override the default definitions. These capabilities will not affect what the underlying model is actually capable of, but will allow or disallow behaviors associated with them. This is particularly useful when [using local LLMs](cookbook/local-llms-ollama-litellm.ipynb). ```python -from autogen_ext.models import OpenAIChatCompletionClient +from autogen_ext.models.openai import OpenAIChatCompletionClient client = OpenAIChatCompletionClient( model="gpt-4o", diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/distributed-agent-runtime.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/distributed-agent-runtime.ipynb index 4d4cca560b14..8d86708fcfc7 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/distributed-agent-runtime.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/distributed-agent-runtime.ipynb @@ -1,222 +1,222 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Distributed Agent Runtime\n", - "\n", - "```{attention}\n", - "The distributed agent runtime is an experimental feature. Expect breaking changes\n", - "to the API.\n", - "```\n", - "\n", - "A distributed agent runtime facilitates communication and agent lifecycle management\n", - "across process boundaries.\n", - "It consists of a host service and at least one worker runtime.\n", - "\n", - "The host service maintains connections to all active worker runtimes,\n", - "facilitates message delivery, and keeps sessions for all direct messages (i.e., RPCs).\n", - "A worker runtime processes application code (agents) and connects to the host service.\n", - "It also advertises the agents which they support to the host service,\n", - "so the host service can deliver messages to the correct worker.\n", - "\n", - "````{note}\n", - "The distributed agent runtime requires extra dependencies, install them using:\n", - "```bash\n", - "pip install \"autogen-ext[grpc]==0.4.0.dev9\"\n", - "```\n", - "````\n", - "\n", - "We can start a host service using {py:class}`~autogen_ext.runtimes.grpc.GrpcWorkerAgentRuntimeHost`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from autogen_ext.runtimes.grpc import GrpcWorkerAgentRuntimeHost\n", - "\n", - "host = GrpcWorkerAgentRuntimeHost(address=\"localhost:50051\")\n", - "host.start() # Start a host service in the background." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above code starts the host service in the background and accepts\n", - "worker connections on port 50051.\n", - "\n", - "Before running worker runtimes, let's define our agent.\n", - "The agent will publish a new message on every message it receives.\n", - "It also keeps track of how many messages it has published, and \n", - "stops publishing new messages once it has published 5 messages." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from dataclasses import dataclass\n", - "\n", - "from autogen_core import DefaultTopicId, MessageContext, RoutedAgent, default_subscription, message_handler\n", - "\n", - "\n", - "@dataclass\n", - "class MyMessage:\n", - " content: str\n", - "\n", - "\n", - "@default_subscription\n", - "class MyAgent(RoutedAgent):\n", - " def __init__(self, name: str) -> None:\n", - " super().__init__(\"My agent\")\n", - " self._name = name\n", - " self._counter = 0\n", - "\n", - " @message_handler\n", - " async def my_message_handler(self, message: MyMessage, ctx: MessageContext) -> None:\n", - " self._counter += 1\n", - " if self._counter > 5:\n", - " return\n", - " content = f\"{self._name}: Hello x {self._counter}\"\n", - " print(content)\n", - " await self.publish_message(MyMessage(content=content), DefaultTopicId())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can set up the worker agent runtimes.\n", - "We use {py:class}`~autogen_ext.runtimes.grpc.GrpcWorkerAgentRuntime`.\n", - "We set up two worker runtimes. Each runtime hosts one agent.\n", - "All agents publish and subscribe to the default topic, so they can see all\n", - "messages being published.\n", - "\n", - "To run the agents, we publishes a message from a worker." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "worker1: Hello x 1\n", - "worker2: Hello x 1\n", - "worker2: Hello x 2\n", - "worker1: Hello x 2\n", - "worker1: Hello x 3\n", - "worker2: Hello x 3\n", - "worker2: Hello x 4\n", - "worker1: Hello x 4\n", - "worker1: Hello x 5\n", - "worker2: Hello x 5\n" - ] - } - ], - "source": [ - "import asyncio\n", - "\n", - "from autogen_ext.runtimes.grpc import GrpcWorkerAgentRuntime\n", - "\n", - "worker1 = GrpcWorkerAgentRuntime(host_address=\"localhost:50051\")\n", - "worker1.start()\n", - "await MyAgent.register(worker1, \"worker1\", lambda: MyAgent(\"worker1\"))\n", - "\n", - "worker2 = GrpcWorkerAgentRuntime(host_address=\"localhost:50051\")\n", - "worker2.start()\n", - "await MyAgent.register(worker2, \"worker2\", lambda: MyAgent(\"worker2\"))\n", - "\n", - "await worker2.publish_message(MyMessage(content=\"Hello!\"), DefaultTopicId())\n", - "\n", - "# Let the agents run for a while.\n", - "await asyncio.sleep(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see each agent published exactly 5 messages.\n", - "\n", - "To stop the worker runtimes, we can call {py:meth}`~autogen_ext.runtimes.grpc.GrpcWorkerAgentRuntime.stop`." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "await worker1.stop()\n", - "await worker2.stop()\n", - "\n", - "# To keep the worker running until a termination signal is received (e.g., SIGTERM).\n", - "# await worker1.stop_when_signal()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can call {py:meth}`~autogen_ext.runtimes.grpc.GrpcWorkerAgentRuntimeHost.stop`\n", - "to stop the host service." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "await host.stop()\n", - "\n", - "# To keep the host service running until a termination signal (e.g., SIGTERM)\n", - "# await host.stop_when_signal()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Next Steps\n", - "To see complete examples of using distributed runtime, please take a look at the following samples:\n", - "\n", - "- [Distributed Workers](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-core/samples/worker) \n", - "- [Distributed Semantic Router](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-core/samples/semantic_router) \n", - "- [Distributed Group Chat](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-core/samples/distributed-group-chat) \n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "agnext", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Distributed Agent Runtime\n", + "\n", + "```{attention}\n", + "The distributed agent runtime is an experimental feature. Expect breaking changes\n", + "to the API.\n", + "```\n", + "\n", + "A distributed agent runtime facilitates communication and agent lifecycle management\n", + "across process boundaries.\n", + "It consists of a host service and at least one worker runtime.\n", + "\n", + "The host service maintains connections to all active worker runtimes,\n", + "facilitates message delivery, and keeps sessions for all direct messages (i.e., RPCs).\n", + "A worker runtime processes application code (agents) and connects to the host service.\n", + "It also advertises the agents which they support to the host service,\n", + "so the host service can deliver messages to the correct worker.\n", + "\n", + "````{note}\n", + "The distributed agent runtime requires extra dependencies, install them using:\n", + "```bash\n", + "pip install \"autogen-ext[grpc]==0.4.0.dev11\"\n", + "```\n", + "````\n", + "\n", + "We can start a host service using {py:class}`~autogen_ext.runtimes.grpc.GrpcWorkerAgentRuntimeHost`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from autogen_ext.runtimes.grpc import GrpcWorkerAgentRuntimeHost\n", + "\n", + "host = GrpcWorkerAgentRuntimeHost(address=\"localhost:50051\")\n", + "host.start() # Start a host service in the background." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code starts the host service in the background and accepts\n", + "worker connections on port 50051.\n", + "\n", + "Before running worker runtimes, let's define our agent.\n", + "The agent will publish a new message on every message it receives.\n", + "It also keeps track of how many messages it has published, and \n", + "stops publishing new messages once it has published 5 messages." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from dataclasses import dataclass\n", + "\n", + "from autogen_core import DefaultTopicId, MessageContext, RoutedAgent, default_subscription, message_handler\n", + "\n", + "\n", + "@dataclass\n", + "class MyMessage:\n", + " content: str\n", + "\n", + "\n", + "@default_subscription\n", + "class MyAgent(RoutedAgent):\n", + " def __init__(self, name: str) -> None:\n", + " super().__init__(\"My agent\")\n", + " self._name = name\n", + " self._counter = 0\n", + "\n", + " @message_handler\n", + " async def my_message_handler(self, message: MyMessage, ctx: MessageContext) -> None:\n", + " self._counter += 1\n", + " if self._counter > 5:\n", + " return\n", + " content = f\"{self._name}: Hello x {self._counter}\"\n", + " print(content)\n", + " await self.publish_message(MyMessage(content=content), DefaultTopicId())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can set up the worker agent runtimes.\n", + "We use {py:class}`~autogen_ext.runtimes.grpc.GrpcWorkerAgentRuntime`.\n", + "We set up two worker runtimes. Each runtime hosts one agent.\n", + "All agents publish and subscribe to the default topic, so they can see all\n", + "messages being published.\n", + "\n", + "To run the agents, we publishes a message from a worker." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "worker1: Hello x 1\n", + "worker2: Hello x 1\n", + "worker2: Hello x 2\n", + "worker1: Hello x 2\n", + "worker1: Hello x 3\n", + "worker2: Hello x 3\n", + "worker2: Hello x 4\n", + "worker1: Hello x 4\n", + "worker1: Hello x 5\n", + "worker2: Hello x 5\n" + ] + } + ], + "source": [ + "import asyncio\n", + "\n", + "from autogen_ext.runtimes.grpc import GrpcWorkerAgentRuntime\n", + "\n", + "worker1 = GrpcWorkerAgentRuntime(host_address=\"localhost:50051\")\n", + "worker1.start()\n", + "await MyAgent.register(worker1, \"worker1\", lambda: MyAgent(\"worker1\"))\n", + "\n", + "worker2 = GrpcWorkerAgentRuntime(host_address=\"localhost:50051\")\n", + "worker2.start()\n", + "await MyAgent.register(worker2, \"worker2\", lambda: MyAgent(\"worker2\"))\n", + "\n", + "await worker2.publish_message(MyMessage(content=\"Hello!\"), DefaultTopicId())\n", + "\n", + "# Let the agents run for a while.\n", + "await asyncio.sleep(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see each agent published exactly 5 messages.\n", + "\n", + "To stop the worker runtimes, we can call {py:meth}`~autogen_ext.runtimes.grpc.GrpcWorkerAgentRuntime.stop`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "await worker1.stop()\n", + "await worker2.stop()\n", + "\n", + "# To keep the worker running until a termination signal is received (e.g., SIGTERM).\n", + "# await worker1.stop_when_signal()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can call {py:meth}`~autogen_ext.runtimes.grpc.GrpcWorkerAgentRuntimeHost.stop`\n", + "to stop the host service." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "await host.stop()\n", + "\n", + "# To keep the host service running until a termination signal (e.g., SIGTERM)\n", + "# await host.stop_when_signal()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Next Steps\n", + "To see complete examples of using distributed runtime, please take a look at the following samples:\n", + "\n", + "- [Distributed Workers](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-core/samples/worker) \n", + "- [Distributed Semantic Router](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-core/samples/semantic_router) \n", + "- [Distributed Group Chat](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-core/samples/distributed-group-chat) \n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "agnext", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/message-and-communication.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/message-and-communication.ipynb index a775c0f5963a..b9a8f423a7e2 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/message-and-communication.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/message-and-communication.ipynb @@ -368,7 +368,7 @@ "recipient are tightly coupled -- they are created together and the sender\n", "is linked to a specific instance of the recipient.\n", "For example, an agent executes tool calls by sending direct messages to\n", - "an instance of {py:class}`~autogen_core.components.tool_agent.ToolAgent`,\n", + "an instance of {py:class}`~autogen_core.tool_agent.ToolAgent`,\n", "and uses the responses to form an action-observation loop." ] }, diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/model-clients.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/model-clients.ipynb index ae92a040fc7a..73998b02e547 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/model-clients.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/model-clients.ipynb @@ -6,9 +6,9 @@ "source": [ "# Model Clients\n", "\n", - "AutoGen provides the {py:mod}`autogen_core.components.models` module with a suite of built-in\n", + "AutoGen provides the {py:mod}`autogen_core.models` module with a suite of built-in\n", "model clients for using ChatCompletion API.\n", - "All model clients implement the {py:class}`~autogen_core.components.models.ChatCompletionClient` protocol class." + "All model clients implement the {py:class}`~autogen_core.models.ChatCompletionClient` protocol class." ] }, { @@ -32,8 +32,8 @@ "metadata": {}, "outputs": [], "source": [ - "from autogen_core.components.models import UserMessage\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_core.models import UserMessage\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "# Create an OpenAI model client.\n", "model_client = OpenAIChatCompletionClient(\n", @@ -47,7 +47,7 @@ "metadata": {}, "source": [ "You can call the {py:meth}`~autogen_ext.models.OpenAIChatCompletionClient.create` method to create a\n", - "chat completion request, and await for an {py:class}`~autogen_core.components.models.CreateResult` object in return." + "chat completion request, and await for an {py:class}`~autogen_core.models.CreateResult` object in return." ] }, { @@ -168,7 +168,7 @@ "source": [ "```{note}\n", "The last response in the streaming response is always the final response\n", - "of the type {py:class}`~autogen_core.components.models.CreateResult`.\n", + "of the type {py:class}`~autogen_core.models.CreateResult`.\n", "```\n", "\n", "**NB the default usage response is to return zero values**" @@ -290,7 +290,7 @@ "metadata": {}, "outputs": [], "source": [ - "from autogen_ext.models import AzureOpenAIChatCompletionClient\n", + "from autogen_ext.models.openai import AzureOpenAIChatCompletionClient\n", "from azure.identity import DefaultAzureCredential, get_bearer_token_provider\n", "\n", "# Create the token provider\n", @@ -333,8 +333,8 @@ "from dataclasses import dataclass\n", "\n", "from autogen_core import MessageContext, RoutedAgent, SingleThreadedAgentRuntime, message_handler\n", - "from autogen_core.components.models import ChatCompletionClient, SystemMessage, UserMessage\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_core.models import ChatCompletionClient, SystemMessage, UserMessage\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "\n", "@dataclass\n", @@ -474,7 +474,7 @@ "outputs": [], "source": [ "from autogen_core.components.model_context import BufferedChatCompletionContext\n", - "from autogen_core.components.models import AssistantMessage\n", + "from autogen_core.models import AssistantMessage\n", "\n", "\n", "class SimpleAgentWithContext(RoutedAgent):\n", diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/tools.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/tools.ipynb index 1a2e8df84011..7e7ea0ef99ff 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/tools.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/framework/tools.ipynb @@ -12,7 +12,7 @@ "In the context of AI agents, tools are designed to be executed by agents in\n", "response to model-generated function calls.\n", "\n", - "AutoGen provides the {py:mod}`autogen_core.components.tools` module with a suite of built-in\n", + "AutoGen provides the {py:mod}`autogen_core.tools` module with a suite of built-in\n", "tools and utilities for creating and running custom tools." ] }, @@ -22,7 +22,7 @@ "source": [ "## Built-in Tools\n", "\n", - "One of the built-in tools is the {py:class}`~autogen_core.components.tools.PythonCodeExecutionTool`,\n", + "One of the built-in tools is the {py:class}`~autogen_core.tools.PythonCodeExecutionTool`,\n", "which allows agents to execute Python code snippets.\n", "\n", "Here is how you create the tool and use it." @@ -44,7 +44,7 @@ ], "source": [ "from autogen_core import CancellationToken\n", - "from autogen_core.components.tools import PythonCodeExecutionTool\n", + "from autogen_core.tools import PythonCodeExecutionTool\n", "from autogen_ext.code_executors.docker import DockerCommandLineCodeExecutor\n", "\n", "# Create the tool.\n", @@ -73,7 +73,7 @@ "The {py:class}`~autogen_ext.code_executors.docker.DockerCommandLineCodeExecutor`\n", "class is a built-in code executor that runs Python code snippets in a subprocess\n", "in the command line environment of a docker container.\n", - "The {py:class}`~autogen_core.components.tools.PythonCodeExecutionTool` class wraps the code executor\n", + "The {py:class}`~autogen_core.tools.PythonCodeExecutionTool` class wraps the code executor\n", "and provides a simple interface to execute Python code snippets.\n", "\n", "Other built-in tools will be added in the future." @@ -87,9 +87,9 @@ "\n", "A tool can also be a simple Python function that performs a specific action.\n", "To create a custom function tool, you just need to create a Python function\n", - "and use the {py:class}`~autogen_core.components.tools.FunctionTool` class to wrap it.\n", + "and use the {py:class}`~autogen_core.tools.FunctionTool` class to wrap it.\n", "\n", - "The {py:class}`~autogen_core.components.tools.FunctionTool` class uses descriptions and type annotations\n", + "The {py:class}`~autogen_core.tools.FunctionTool` class uses descriptions and type annotations\n", "to inform the LLM when and how to use a given function. The description provides context\n", "about the function’s purpose and intended use cases, while type annotations inform the LLM about\n", "the expected parameters and return type.\n", @@ -114,7 +114,7 @@ "import random\n", "\n", "from autogen_core import CancellationToken\n", - "from autogen_core.components.tools import FunctionTool\n", + "from autogen_core.tools import FunctionTool\n", "from typing_extensions import Annotated\n", "\n", "\n", @@ -140,9 +140,9 @@ "source": [ "## Tool-Equipped Agent\n", "\n", - "To use tools with an agent, you can use {py:class}`~autogen_core.components.tool_agent.ToolAgent`,\n", + "To use tools with an agent, you can use {py:class}`~autogen_core.tool_agent.ToolAgent`,\n", "by using it in a composition pattern.\n", - "Here is an example tool-use agent that uses {py:class}`~autogen_core.components.tool_agent.ToolAgent`\n", + "Here is an example tool-use agent that uses {py:class}`~autogen_core.tool_agent.ToolAgent`\n", "as an inner agent for executing tools." ] }, @@ -163,15 +163,15 @@ " SingleThreadedAgentRuntime,\n", " message_handler,\n", ")\n", - "from autogen_core.components.models import (\n", + "from autogen_core.models import (\n", " ChatCompletionClient,\n", " LLMMessage,\n", " SystemMessage,\n", " UserMessage,\n", ")\n", - "from autogen_core.components.tools import FunctionTool, Tool, ToolSchema\n", "from autogen_core.tool_agent import ToolAgent, tool_agent_caller_loop\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", + "from autogen_core.tools import FunctionTool, Tool, ToolSchema\n", + "from autogen_ext.models.openai import OpenAIChatCompletionClient\n", "\n", "\n", "@dataclass\n", @@ -209,7 +209,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The `ToolUseAgent` class uses a convenience function {py:meth}`~autogen_core.components.tool_agent.tool_agent_caller_loop`, \n", + "The `ToolUseAgent` class uses a convenience function {py:meth}`~autogen_core.tool_agent.tool_agent_caller_loop`, \n", "to handle the interaction between the model and the tool agent.\n", "The core idea can be described using a simple control flow graph:\n", "\n", @@ -218,7 +218,7 @@ "The `ToolUseAgent`'s `handle_user_message` handler handles messages from the user,\n", "and determines whether the model has generated a tool call.\n", "If the model has generated tool calls, then the handler sends a function call\n", - "message to the {py:class}`~autogen_core.components.tool_agent.ToolAgent` agent\n", + "message to the {py:class}`~autogen_core.tool_agent.ToolAgent` agent\n", "to execute the tools,\n", "and then queries the model again with the results of the tool calls.\n", "This process continues until the model stops generating tool calls,\n", @@ -267,7 +267,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This example uses the {py:class}`autogen_core.components.models.OpenAIChatCompletionClient`,\n", + "This example uses the {py:class}`autogen_core.models.OpenAIChatCompletionClient`,\n", "for Azure OpenAI and other clients, see [Model Clients](./model-clients.ipynb).\n", "Let's test the agent with a question about stock price." ] diff --git a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/quickstart.ipynb b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/quickstart.ipynb index 4d6fd82d80d1..fde686badf75 100644 --- a/python/packages/autogen-core/docs/src/user-guide/core-user-guide/quickstart.ipynb +++ b/python/packages/autogen-core/docs/src/user-guide/core-user-guide/quickstart.ipynb @@ -1,428 +1,222 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quick Start\n", - "\n", - ":::{note}\n", - "See [here](pkg-info-autogen-core) for installation instructions.\n", - ":::\n", - "\n", - "Before diving into the core APIs, let's start with a simple example of two\n", - "agents creating a plot of Tesla's and Nvidia's stock returns.\n", - "\n", - "We first define the agent classes and their respective procedures for \n", - "handling messages.\n", - "We create two agent classes: `Assistant` and `Executor`. The `Assistant`\n", - "agent writes code and the `Executor` agent executes the code.\n", - "We also create a `Message` data class, which defines the messages that are passed between\n", - "the agents.\n", - "\n", - "```{attention}\n", - "Code generated in this example is run within a [Docker](https://www.docker.com/) container. Please ensure Docker is [installed](https://docs.docker.com/get-started/get-docker/) and running prior to running the example. Local code execution is available ({py:class}`~autogen_ext.code_executors.local.LocalCommandLineCodeExecutor`) but is not recommended due to the risk of running LLM generated code in your local environment.\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import re\n", - "from dataclasses import dataclass\n", - "from typing import List\n", - "\n", - "from autogen_core import DefaultTopicId, MessageContext, RoutedAgent, default_subscription, message_handler\n", - "from autogen_core.code_executor import CodeBlock, CodeExecutor\n", - "from autogen_core.components.models import (\n", - " AssistantMessage,\n", - " ChatCompletionClient,\n", - " LLMMessage,\n", - " SystemMessage,\n", - " UserMessage,\n", - ")\n", - "\n", - "\n", - "@dataclass\n", - "class Message:\n", - " content: str\n", - "\n", - "\n", - "@default_subscription\n", - "class Assistant(RoutedAgent):\n", - " def __init__(self, model_client: ChatCompletionClient) -> None:\n", - " super().__init__(\"An assistant agent.\")\n", - " self._model_client = model_client\n", - " self._chat_history: List[LLMMessage] = [\n", - " SystemMessage(\n", - " content=\"\"\"Write Python script in markdown block, and it will be executed.\n", - "Always save figures to file in the current directory. Do not use plt.show()\"\"\",\n", - " )\n", - " ]\n", - "\n", - " @message_handler\n", - " async def handle_message(self, message: Message, ctx: MessageContext) -> None:\n", - " self._chat_history.append(UserMessage(content=message.content, source=\"user\"))\n", - " result = await self._model_client.create(self._chat_history)\n", - " print(f\"\\n{'-'*80}\\nAssistant:\\n{result.content}\")\n", - " self._chat_history.append(AssistantMessage(content=result.content, source=\"assistant\")) # type: ignore\n", - " await self.publish_message(Message(content=result.content), DefaultTopicId()) # type: ignore\n", - "\n", - "\n", - "def extract_markdown_code_blocks(markdown_text: str) -> List[CodeBlock]:\n", - " pattern = re.compile(r\"```(?:\\s*([\\w\\+\\-]+))?\\n([\\s\\S]*?)```\")\n", - " matches = pattern.findall(markdown_text)\n", - " code_blocks: List[CodeBlock] = []\n", - " for match in matches:\n", - " language = match[0].strip() if match[0] else \"\"\n", - " code_content = match[1]\n", - " code_blocks.append(CodeBlock(code=code_content, language=language))\n", - " return code_blocks\n", - "\n", - "\n", - "@default_subscription\n", - "class Executor(RoutedAgent):\n", - " def __init__(self, code_executor: CodeExecutor) -> None:\n", - " super().__init__(\"An executor agent.\")\n", - " self._code_executor = code_executor\n", - "\n", - " @message_handler\n", - " async def handle_message(self, message: Message, ctx: MessageContext) -> None:\n", - " code_blocks = extract_markdown_code_blocks(message.content)\n", - " if code_blocks:\n", - " result = await self._code_executor.execute_code_blocks(\n", - " code_blocks, cancellation_token=ctx.cancellation_token\n", - " )\n", - " print(f\"\\n{'-'*80}\\nExecutor:\\n{result.output}\")\n", - " await self.publish_message(Message(content=result.output), DefaultTopicId())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You might have already noticed, the agents' logic, whether it is using model or code executor,\n", - "is completely decoupled from\n", - "how messages are delivered. This is the core idea: the framework provides\n", - "a communication infrastructure, and the agents are responsible for their own\n", - "logic. We call the communication infrastructure an **Agent Runtime**.\n", - "\n", - "Agent runtime is a key concept of this framework. Besides delivering messages,\n", - "it also manages agents' lifecycle. \n", - "So the creation of agents are handled by the runtime.\n", - "\n", - "The following code shows how to register and run the agents using \n", - "{py:class}`~autogen_core.SingleThreadedAgentRuntime`,\n", - "a local embedded agent runtime implementation.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "--------------------------------------------------------------------------------\n", - "Assistant:\n", - "```python\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import yfinance as yf\n", - "\n", - "# Define the stock tickers\n", - "ticker_symbols = ['NVDA', 'TSLA']\n", - "\n", - "# Download the stock data from Yahoo Finance starting from 2024-01-01\n", - "start_date = '2024-01-01'\n", - "stock_data = yf.download(ticker_symbols, start=start_date)['Adj Close']\n", - "\n", - "# Calculate daily returns\n", - "returns = stock_data.pct_change().dropna()\n", - "\n", - "# Plot the stock returns\n", - "plt.figure(figsize=(10, 6))\n", - "for ticker in ticker_symbols:\n", - " returns[ticker].cumsum().plot(label=ticker)\n", - "\n", - "plt.title('NVIDIA vs TSLA Stock Returns YTD from 2024-01-01')\n", - "plt.xlabel('Date')\n", - "plt.ylabel('Cumulative Returns')\n", - "plt.legend()\n", - "plt.grid(True)\n", - "\n", - "# Save the plot to a file\n", - "plt.savefig('nvidia_vs_tsla_stock_returns_ytd_2024.png')\n", - "```\n", - "\n", - "--------------------------------------------------------------------------------\n", - "Executor:\n", - "Traceback (most recent call last):\n", - " File \"/workspace/tmp_code_f562e5e3c313207b9ec10ca87094085f.python\", line 1, in \n", - " import pandas as pd\n", - "ModuleNotFoundError: No module named 'pandas'\n", - "\n", - "\n", - "--------------------------------------------------------------------------------\n", - "Assistant:\n", - "It looks like some required modules are not installed. Let me proceed by installing the necessary libraries before running the script.\n", - "\n", - "```python\n", - "!pip install pandas matplotlib yfinance\n", - "```\n", - "\n", - "--------------------------------------------------------------------------------\n", - "Executor:\n", - " File \"/workspace/tmp_code_78ffa711e7b0ff8738fdeec82404018c.python\", line 1\n", - " !pip install -qqq pandas matplotlib yfinance\n", - " ^\n", - "SyntaxError: invalid syntax\n", - "\n", - "\n", - "--------------------------------------------------------------------------------\n", - "Assistant:\n", - "It appears that I'm unable to run installation commands within the code execution environment. However, you can install the necessary libraries using the following commands in your local environment:\n", - "\n", - "```sh\n", - "pip install pandas matplotlib yfinance\n", - "```\n", - "\n", - "After installing the libraries, you can then run the previous plotting script. Here is the combined process:\n", - "\n", - "1. First, install the required libraries (run this in your terminal or command prompt):\n", - " ```sh\n", - " pip install pandas matplotlib yfinance\n", - " ```\n", - "\n", - "2. Now, you can run the script to generate the plot:\n", - " ```python\n", - " import pandas as pd\n", - " import matplotlib.pyplot as plt\n", - " import yfinance as yf\n", - "\n", - " # Define the stock tickers\n", - " ticker_symbols = ['NVDA', 'TSLA']\n", - "\n", - " # Download the stock data from Yahoo Finance starting from 2024-01-01\n", - " start_date = '2024-01-01'\n", - " stock_data = yf.download(ticker_symbols, start=start_date)['Adj Close']\n", - "\n", - " # Calculate daily returns\n", - " returns = stock_data.pct_change().dropna()\n", - "\n", - " # Plot the stock returns\n", - " plt.figure(figsize=(10, 6))\n", - " for ticker in ticker_symbols:\n", - " returns[ticker].cumsum().plot(label=ticker)\n", - "\n", - " plt.title('NVIDIA vs TSLA Stock Returns YTD from 2024-01-01')\n", - " plt.xlabel('Date')\n", - " plt.ylabel('Cumulative Returns')\n", - " plt.legend()\n", - " plt.grid(True)\n", - "\n", - " # Save the plot to a file\n", - " plt.savefig('nvidia_vs_tsla_stock_returns_ytd_2024.png')\n", - " ```\n", - "\n", - "This should generate and save the desired plot in your current directory as `nvidia_vs_tsla_stock_returns_ytd_2024.png`.\n", - "\n", - "--------------------------------------------------------------------------------\n", - "Executor:\n", - "Requirement already satisfied: pandas in /usr/local/lib/python3.12/site-packages (2.2.2)\n", - "Requirement already satisfied: matplotlib in /usr/local/lib/python3.12/site-packages (3.9.2)\n", - "Requirement already satisfied: yfinance in /usr/local/lib/python3.12/site-packages (0.2.43)\n", - "Requirement already satisfied: numpy>=1.26.0 in /usr/local/lib/python3.12/site-packages (from pandas) (2.1.1)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.12/site-packages (from pandas) (2.9.0.post0)\n", - "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/site-packages (from pandas) (2024.2)\n", - "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/site-packages (from pandas) (2024.1)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/site-packages (from matplotlib) (1.3.0)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/site-packages (from matplotlib) (0.12.1)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/site-packages (from matplotlib) (4.53.1)\n", - "Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/site-packages (from matplotlib) (1.4.7)\n", - "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/site-packages (from matplotlib) (24.1)\n", - "Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.12/site-packages (from matplotlib) (10.4.0)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/site-packages (from matplotlib) (3.1.4)\n", - "Requirement already satisfied: requests>=2.31 in /usr/local/lib/python3.12/site-packages (from yfinance) (2.32.3)\n", - "Requirement already satisfied: multitasking>=0.0.7 in /usr/local/lib/python3.12/site-packages (from yfinance) (0.0.11)\n", - "Requirement already satisfied: lxml>=4.9.1 in /usr/local/lib/python3.12/site-packages (from yfinance) (5.3.0)\n", - "Requirement already satisfied: platformdirs>=2.0.0 in /usr/local/lib/python3.12/site-packages (from yfinance) (4.3.6)\n", - "Requirement already satisfied: frozendict>=2.3.4 in /usr/local/lib/python3.12/site-packages (from yfinance) (2.4.4)\n", - "Requirement already satisfied: peewee>=3.16.2 in /usr/local/lib/python3.12/site-packages (from yfinance) (3.17.6)\n", - "Requirement already satisfied: beautifulsoup4>=4.11.1 in /usr/local/lib/python3.12/site-packages (from yfinance) (4.12.3)\n", - "Requirement already satisfied: html5lib>=1.1 in /usr/local/lib/python3.12/site-packages (from yfinance) (1.1)\n", - "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.12/site-packages (from beautifulsoup4>=4.11.1->yfinance) (2.6)\n", - "Requirement already satisfied: six>=1.9 in /usr/local/lib/python3.12/site-packages (from html5lib>=1.1->yfinance) (1.16.0)\n", - "Requirement already satisfied: webencodings in /usr/local/lib/python3.12/site-packages (from html5lib>=1.1->yfinance) (0.5.1)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.12/site-packages (from requests>=2.31->yfinance) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/site-packages (from requests>=2.31->yfinance) (3.10)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/site-packages (from requests>=2.31->yfinance) (2.2.3)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/site-packages (from requests>=2.31->yfinance) (2024.8.30)\n", - "WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.\n", - " File \"/workspace/tmp_code_d094fa6242b4268e4812bf9902aa1374.python\", line 1\n", - " import pandas as pd\n", - "IndentationError: unexpected indent\n", - "\n", - "\n", - "--------------------------------------------------------------------------------\n", - "Assistant:\n", - "Thank you for the confirmation. As the required packages are installed, let's proceed with the script to plot the NVIDIA vs TSLA stock returns YTD starting from 2024-01-01.\n", - "\n", - "Here's the updated script:\n", - "\n", - "```python\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import yfinance as yf\n", - "\n", - "# Define the stock tickers\n", - "ticker_symbols = ['NVDA', 'TSLA']\n", - "\n", - "# Download the stock data from Yahoo Finance starting from 2024-01-01\n", - "start_date = '2024-01-01'\n", - "stock_data = yf.download(ticker_symbols, start=start_date)['Adj Close']\n", - "\n", - "# Calculate daily returns\n", - "returns = stock_data.pct_change().dropna()\n", - "\n", - "# Plot the stock returns\n", - "plt.figure(figsize=(10, 6))\n", - "for ticker in ticker_symbols:\n", - " returns[ticker].cumsum().plot(label=ticker)\n", - "\n", - "plt.title('NVIDIA vs TSLA Stock Returns YTD from 2024-01-01')\n", - "plt.xlabel('Date')\n", - "plt.ylabel('Cumulative Returns')\n", - "plt.legend()\n", - "plt.grid(True)\n", - "\n", - "# Save the plot to a file\n", - "plt.savefig('nvidia_vs_tsla_stock_returns_ytd_2024.png')\n", - "```\n", - "\n", - "--------------------------------------------------------------------------------\n", - "Executor:\n", - "[*********************100%***********************] 2 of 2 completed\n", - "\n", - "\n", - "--------------------------------------------------------------------------------\n", - "Assistant:\n", - "It looks like the stock data was successfully downloaded, and the plot has been generated and saved as `nvidia_vs_tsla_stock_returns_ytd_2024.png` in the current directory.\n", - "\n", - "If you have any further questions or need additional assistance, feel free to ask!\n" - ] - } - ], - "source": [ - "import tempfile\n", - "\n", - "from autogen_core import SingleThreadedAgentRuntime\n", - "from autogen_ext.code_executors import DockerCommandLineCodeExecutor\n", - "from autogen_ext.models import OpenAIChatCompletionClient\n", - "\n", - "work_dir = tempfile.mkdtemp()\n", - "\n", - "# Create an local embedded runtime.\n", - "runtime = SingleThreadedAgentRuntime()\n", - "\n", - "async with DockerCommandLineCodeExecutor(work_dir=work_dir) as executor: # type: ignore[syntax]\n", - " # Register the assistant and executor agents by providing\n", - " # their agent types, the factory functions for creating instance and subscriptions.\n", - " await Assistant.register(\n", - " runtime,\n", - " \"assistant\",\n", - " lambda: Assistant(\n", - " OpenAIChatCompletionClient(\n", - " model=\"gpt-4o\",\n", - " # api_key=\"YOUR_API_KEY\"\n", - " )\n", - " ),\n", - " )\n", - " await Executor.register(runtime, \"executor\", lambda: Executor(executor))\n", - "\n", - " # Start the runtime and publish a message to the assistant.\n", - " runtime.start()\n", - " await runtime.publish_message(\n", - " Message(\"Create a plot of NVIDA vs TSLA stock returns YTD from 2024-01-01.\"), DefaultTopicId()\n", - " )\n", - " await runtime.stop_when_idle()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From the agent's output, we can see the plot of Tesla's and Nvidia's stock returns\n", - "has been created." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/var/folders/cs/b9_18p1s2rd56_s2jl65rxwc0000gn/T/tmp_9c2ylon\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+gAAAJYCAYAAADxHswlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAD4YUlEQVR4nOzdd3iTVRsG8PtN2nQPuidd0JZSaNl7L9kgUzYIThBBUVFcqAiiKA4EGZ+AIltBRPbee5YWWlroHnTvNHm/P9JESgctpE1p7t919brIO5/3NC19cp5zjiCKoggiIiIiIiIi0imJrgMgIiIiIiIiIiboRERERERERLUCE3QiIiIiIiKiWoAJOhEREREREVEtwASdiIiIiIiIqBZggk5ERERERERUCzBBJyIiIiIiIqoFmKATERERERER1QJM0ImIiIiIiIhqASboRERERERERLUAE3QiIiIiIiKiWoAJOhEREREREVEtwASdiIiIiIiIqBZggk5ERERERERUCzBBJyIiIiIiIqoFmKATERERERER1QJM0ImIiIiIiIhqASboRERERERERLUAE3QiIiIiIiKiWoAJOhEREREREVEtwASdiIiIiIiIqBZggk5ERERERERUCzBBJyIiIiIiIqoFmKATERERERER1QJM0ImIiIiIiIhqASboRERERERERLUAE3QiIiIiIiKiWoAJOhEREREREVEtwASdiIiIiIiIqBZggk5ERERERERUCzBBJyIiIiIiIqoFmKATERERERER1QJM0ImIiIiIiIhqASboRERERERERLUAE3QiIiIiIiKiWoAJOhEREREREVEtwASdiIiIiIiIqBZggk5ERERERERUCzBBJyIiIiIiIqoFmKATERERERER1QJM0ImIiIiIiIhqASboRERERERERLUAE3QiIiIiIiKiWoAJOhEREREREVEtwASdiIiIiIiIqBZggk5ERERERERUCzBBJyIiIiIiIqoFmKATERERERER1QJM0ImIiIiIiIhqASboRERET+nIkSMQBAFbt27VdShUA86fP4/27dvDzMwMgiDgypUrug6JiIjqCCboRFSr/frrrxAEAcbGxoiNjS21v2vXrggMDAQAXLp0CYIgYN68eeVe786dOxAEAbNnzwYAfPLJJxAEASkpKZpjJk2aBEEQNF/m5ubw9vbG8OHDsW3bNiiV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KtBFREREREREvIAKdBEvpLkbRUQkN5w9e9bTIYhkSH8LSUGlAl2ui9vtBiApKcnDkeQfZ86cweVypd7XL6isi4mJITo6mgsXLgBpn0/JnoMHDzJr1ixPh5Hn7d69m1deeYVdu3Z5OpR8Yd++fTz++OP8/vvvng4lT9u/fz9du3bl+eefB/R9eb2ioqJYtWoVhw4d8nQo+cLJkyfTXTzS30JSkKhAl2wbOnQo9913HwA+Pj4ejibvsyyLIUOG0LVrV3r06MHIkSOJj4/H4XDoF9NVWJbFU089RcuWLbnlllvo3r07p06dwul0KnfZtHPnTipUqMDtt9/Ozp07PR1OnmRZFo8//jjVqlXjyJEjlC1b1tMh5XkvvPACtWrV4vjx48TFxennOxssy+LRRx+latWqLFu2jD/++AO3243TqT8Js+upp56iXr16PPzww9SrV4+5c+d6OqQ87cknn+SGG26gV69e3H///Rw5cgSHw+HpsERyjb6N5ZqtXbuWzp078+233/LDDz+ktmKoFT37/vzzT+rWrcuyZct49tlnqVy5MlOmTGHEiBGeDs3rzZgxg9q1a7Nq1Sr+85//MGjQIKKionjyyScB9Es9m1wuF127dqV48eK8+uqrng4nz/nuu+8oUaIEK1asYMWKFXz88ccEBgYCagnKrvnz5/PHH38wdepUfvrpJ2677Tb9fF+jt99+m6JFi7Ju3TrWrFnD6NGj8fPzIzo62tOh5Unnz5+nb9++rF69mpkzZ/LDDz9w0003MXz4cE+HliedPXuWXr16sXbtWj7//HPuv/9+9u7dy80338ymTZs8HZ5IrvH1dACS96xcuZLIyEiGDBnCd999x7PPPkvXrl3x8fHBsiz9wXSN4uLi+Omnn2jZsiXvv/8+hQoV4tZbb+Wtt97it99+4/Tp04SGhno6TK+1cOFCevbsyWuvvYa/vz9gLiJdPExArt369evx9/fnp59+onXr1gwYMID27dt7Oqw846uvviIkJITp06dTunRpNm3axOHDh6latSoREREEBQXp+/Iaffnll1SpUoWuXbuybNkypk+fTpUqVWjTpg3VqlXzdHheb+fOnfz666+8++67PPjgg4DpRrx+/frUC+z6TF6bnTt3sm7dOt566y1uuOEGAPr27ctHH32Ey+XCz8/PwxHmLevWrWPPnj1MmjSJBg0acOON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f/3Fvn37GDlyJH/88QcTJkygQoUKADz22GOMGzeOypUre/IteIVr/VweOHCAffv2MXjwYKZOncoDDzwAaCxliivls2nTpixatIgNGzbQtWtX3nvvPSZNmkSHDh2488476du3L506ddLszlzb5zKlN1bHjh1Zv359au84SZOVfG7YsIHSpUtz//3307VrVwYNGsTAgQO588476dSpE82bN/fwu/AeV/s5X7FiRbrvzZ07d7J7927+8Y9/sGjRIu6//35A35tSAHiwe714ocTERMuyLGvBggWW0+m01q5da1mWlTpWcuHChVbVqlWtH3/8MfU5K1eutKpXr241bNjQ2rx5c67H7O2yk9O6deumjsFavXp1rsfsLa41dzt37rRGjBhhlS9f3mrVqpW1fv16j8TtrbKSz8qVK1s//fSTp0LME671c7ljxw5r2LBhVkREhNWyZUtrw4YNHonbW2Uln1WqVLF++OGH1OesXLnS+vjjj63nn39eP+fJsvO7xrIsa/LkydbAgQOt48ePawz6RbL6uUz5vjx//rz1wgsvWA899JB177336nN5iex8Pv/73/9a1atXt5o3b67vTSlQHJaly1AFzf79+/Hx8aFs2bIkJSWldjMC0xLu6+vL+fPn6datG35+fsyZMyfd2qhVq1alf//+vPTSSwCcOHGCbdu20bp1a4+8H29gR04feOABRo4cyZkzZ5gwYQI1atSgZ8+ennpLucbO3J0/f541a9aQmJjIjTfe6Km35FF2/nxbBXhNZDs/l/Hx8Sxfvhy3211gh1vY/XunoLIzjynP18+5PT/nKS49T0Fi9895TEwMe/bsoWnTph55PyKeoi7uBcyvv/5KpUqVePLJJwFSvzxTuhmlTL5z+vRpRo0axR9//MFHH32U2p3o5MmTFC5cmLCwMMB0MypevHiBLs7tymnKuKoiRYowbNiwAlGc2527wMBAWrVqVWCLc7t/vgvqH+12fy4LFSpE+/btC2xxbvfnsqCyO48pz9fPuT0/5ykKanGeEz/nYWFhKs6lQFKBXsCsWLGC5s2bc+DAAX7++Wcg/dXe9957j6CgIGbNmkW7du1SJ4Z69NFH+euvv/j3v//NmTNn6NixI1Bwf7FfzO6cFiTKnb2UT3soj/ZSPu2hPNpL+bSX8iliH3VxLyBSllQZPHgwTqeTuLg4duzYwbx58/Dz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o0YcO3aMefPmUb9+fW6++WYPvWMREZH8S7O4i4iI5GGzZs2idOnSVKxYkW7durFgwQLee+89fv31V3x8fGjQoAFvv/0248aNo27dukycOJExY8akO0erVq147LHH6NOnDyVLluT1118H4IsvvuCBBx5g2LBh1KhRg969e7Ny5UrKly/vibcqIiKS72kWdxEREREREREvoBZ0ERERERERES+gAl1ERERERETEC6hAFxEREREREfECKtBFREREREREvIAKdBEREREREREvoAJdRERERERExAuoQBcRERERERHxAirQRURERERERLyACnQRERERERERL6ACXURERERERMQLqEAXERERERER8QIq0EVERERERES8gAp0ERERERERES+gAl1ERERERETEC6hAFxEREREREfECKtBFREREREREvIAKdBEREREREREvoAJdRERERERExAuoQBcRERERERHxAirQRURERERERLyACnQRERERERERL6ACXURERERERMQLqEAXERERERER8QIq0EVERERERES8gAp0ERERERERES+gAl1ERERERETEC6hAFxEREREREfECKtBFREREREREvIAKdBEREREREREvoAJdRERERERExAuoQBcRERERERHxAirQRURERERERLyACnQRERERERERL6ACXURERERERMQLqEAXERERERER8QIq0EVERERERES8gAp0ERERERERES+gAl1ERERERETEC6hAFxEREREREfECKtBFREREREREvIAKdBEREREREREvoAJdRERERERExAuoQBcRERERERHxAirQRURERERERLyACnQRERERERERL6ACXURERERERMQLqEAXERERERER8QIq0EVERERERES8gAp0ERERERERES+gAl1ERERERETEC6hAFxEREREREfECKtBFREREREREvMD/A9DsdFoeg9eAAAAAAElFTkSuQmCC", - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "\n", - "Image(filename=f\"{work_dir}/NVIDIA_vs_TSLA_Stock_Returns_YTD_2024.png\") # type: ignore" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "AutoGen also supports a distributed agent runtime, which can host agents running on\n", - "different processes or machines, with different identities, languages and dependencies.\n", - "\n", - "To learn how to use agent runtime, communication, message handling, and subscription, please continue\n", - "reading the sections following this quick start." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "agnext", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quick Start\n", + "\n", + ":::{note}\n", + "See [here](pkg-info-autogen-core) for installation instructions.\n", + ":::\n", + "\n", + "Before diving into the core APIs, let's start with a simple example of two agents that count down from 10 to 1.\n", + "\n", + "We first define the agent classes and their respective procedures for \n", + "handling messages.\n", + "We create two agent classes: `Modifier` and `Checker`. The `Modifier` agent modifies a number that is given and the `Check` agent checks the value against a condition.\n", + "We also create a `Message` data class, which defines the messages that are passed between the agents." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from dataclasses import dataclass\n", + "from typing import Callable\n", + "\n", + "from autogen_core import DefaultTopicId, MessageContext, RoutedAgent, default_subscription, message_handler\n", + "\n", + "\n", + "@dataclass\n", + "class Message:\n", + " content: int\n", + "\n", + "\n", + "@default_subscription\n", + "class Modifier(RoutedAgent):\n", + " def __init__(self, modify_val: Callable[[int], int]) -> None:\n", + " super().__init__(\"A modifier agent.\")\n", + " self._modify_val = modify_val\n", + "\n", + " @message_handler\n", + " async def handle_message(self, message: Message, ctx: MessageContext) -> None:\n", + " val = self._modify_val(message.content)\n", + " print(f\"{'-'*80}\\nModifier:\\nModified {message.content} to {val}\")\n", + " await self.publish_message(Message(content=val), DefaultTopicId()) # type: ignore\n", + "\n", + "\n", + "@default_subscription\n", + "class Checker(RoutedAgent):\n", + " def __init__(self, run_until: Callable[[int], bool]) -> None:\n", + " super().__init__(\"A checker agent.\")\n", + " self._run_until = run_until\n", + "\n", + " @message_handler\n", + " async def handle_message(self, message: Message, ctx: MessageContext) -> None:\n", + " if not self._run_until(message.content):\n", + " print(f\"{'-'*80}\\nChecker:\\n{message.content} passed the check, continue.\")\n", + " await self.publish_message(Message(content=message.content), DefaultTopicId())\n", + " else:\n", + " print(f\"{'-'*80}\\nChecker:\\n{message.content} failed the check, stopping.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You might have already noticed, the agents' logic, whether it is using model or code executor,\n", + "is completely decoupled from\n", + "how messages are delivered. This is the core idea: the framework provides\n", + "a communication infrastructure, and the agents are responsible for their own\n", + "logic. We call the communication infrastructure an **Agent Runtime**.\n", + "\n", + "Agent runtime is a key concept of this framework. Besides delivering messages,\n", + "it also manages agents' lifecycle. \n", + "So the creation of agents are handled by the runtime.\n", + "\n", + "The following code shows how to register and run the agents using \n", + "{py:class}`~autogen_core.SingleThreadedAgentRuntime`,\n", + "a local embedded agent runtime implementation.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "Checker:\n", + "10 passed the check, continue.\n", + "--------------------------------------------------------------------------------\n", + "Modifier:\n", + "Modified 10 to 9\n", + "--------------------------------------------------------------------------------\n", + "Checker:\n", + "9 passed the check, continue.\n", + "--------------------------------------------------------------------------------\n", + "Modifier:\n", + "Modified 9 to 8\n", + "--------------------------------------------------------------------------------\n", + "Checker:\n", + "8 passed the check, continue.\n", + "--------------------------------------------------------------------------------\n", + "Modifier:\n", + "Modified 8 to 7\n", + "--------------------------------------------------------------------------------\n", + "Checker:\n", + "7 passed the check, continue.\n", + "--------------------------------------------------------------------------------\n", + "Modifier:\n", + "Modified 7 to 6\n", + "--------------------------------------------------------------------------------\n", + "Checker:\n", + "6 passed the check, continue.\n", + "--------------------------------------------------------------------------------\n", + "Modifier:\n", + "Modified 6 to 5\n", + "--------------------------------------------------------------------------------\n", + "Checker:\n", + "5 passed the check, continue.\n", + "--------------------------------------------------------------------------------\n", + "Modifier:\n", + "Modified 5 to 4\n", + "--------------------------------------------------------------------------------\n", + "Checker:\n", + "4 passed the check, continue.\n", + "--------------------------------------------------------------------------------\n", + "Modifier:\n", + "Modified 4 to 3\n", + "--------------------------------------------------------------------------------\n", + "Checker:\n", + "3 passed the check, continue.\n", + "--------------------------------------------------------------------------------\n", + "Modifier:\n", + "Modified 3 to 2\n", + "--------------------------------------------------------------------------------\n", + "Checker:\n", + "2 passed the check, continue.\n", + "--------------------------------------------------------------------------------\n", + "Modifier:\n", + "Modified 2 to 1\n", + "--------------------------------------------------------------------------------\n", + "Checker:\n", + "1 failed the check, stopping.\n" + ] + } + ], + "source": [ + "from autogen_core import AgentId, SingleThreadedAgentRuntime\n", + "\n", + "# Create an local embedded runtime.\n", + "runtime = SingleThreadedAgentRuntime()\n", + "\n", + "# Register the modifier and checker agents by providing\n", + "# their agent types, the factory functions for creating instance and subscriptions.\n", + "await Modifier.register(\n", + " runtime,\n", + " \"modifier\",\n", + " # Modify the value by subtracting 1\n", + " lambda: Modifier(modify_val=lambda x: x - 1),\n", + ")\n", + "\n", + "await Checker.register(\n", + " runtime,\n", + " \"checker\",\n", + " # Run until the value is less than or equal to 1\n", + " lambda: Checker(run_until=lambda x: x <= 1),\n", + ")\n", + "\n", + "# Start the runtime and send a direct message to the checker.\n", + "runtime.start()\n", + "await runtime.send_message(Message(10), AgentId(\"checker\", \"default\"))\n", + "await runtime.stop_when_idle()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the agent's output, we can see the value was successfully decremented from 10 to 1 as the modifier and checker conditions dictate." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AutoGen also supports a distributed agent runtime, which can host agents running on\n", + "different processes or machines, with different identities, languages and dependencies.\n", + "\n", + "To learn how to use agent runtime, communication, message handling, and subscription, please continue\n", + "reading the sections following this quick start." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/python/packages/autogen-core/docs/src/user-guide/index.md b/python/packages/autogen-core/docs/src/user-guide/index.md index 347c4fe18592..eef6281b7362 100644 --- a/python/packages/autogen-core/docs/src/user-guide/index.md +++ b/python/packages/autogen-core/docs/src/user-guide/index.md @@ -5,6 +5,7 @@ :hidden: agentchat-user-guide/index +autogenstudio-user-guide/index core-user-guide/index extensions-user-guide/index ``` @@ -19,6 +20,18 @@ extensions-user-guide/index :class-item: api-card ::: +:::{grid-item-card} {fas}`people-group;pst-color-primary`
AutoGen AgentChat +:link: autogenstudio-user-guide/index +:link-type: doc +:class-item: api-card +::: + +:::{grid-item-card} {fas}`display;pst-color-primary`
AutoGen Studio +:link: autogenstudio-user-guide/index +:link-type: doc +:class-item: api-card +::: + :::{grid-item-card} {fas}`cube;pst-color-primary`
AutoGen Core :link: core-user-guide/index :link-type: doc @@ -27,9 +40,8 @@ extensions-user-guide/index :::: - \ No newline at end of file + diff --git a/python/packages/autogen-core/pyproject.toml b/python/packages/autogen-core/pyproject.toml index 0f9e2bc67771..191d4c7bada7 100644 --- a/python/packages/autogen-core/pyproject.toml +++ b/python/packages/autogen-core/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "autogen-core" -version = "0.4.0.dev9" +version = "0.4.0.dev11" license = {file = "LICENSE-CODE"} description = "Foundational interfaces and agent runtime implementation for AutoGen" readme = "README.md" @@ -76,7 +76,7 @@ dev-dependencies = [ "autodoc_pydantic~=2.2", "pygments", - "autogen_ext==0.4.0.dev9", + "autogen_ext==0.4.0.dev11", # Documentation tooling "sphinx-autobuild", diff --git a/python/packages/autogen-core/samples/chess_game.py b/python/packages/autogen-core/samples/chess_game.py index 686748c7efdd..b359772aa460 100644 --- a/python/packages/autogen-core/samples/chess_game.py +++ b/python/packages/autogen-core/samples/chess_game.py @@ -15,9 +15,9 @@ DefaultTopicId, SingleThreadedAgentRuntime, ) -from autogen_core.components.model_context import BufferedChatCompletionContext -from autogen_core.components.models import SystemMessage -from autogen_core.components.tools import FunctionTool +from autogen_core.model_context import BufferedChatCompletionContext +from autogen_core.models import SystemMessage +from autogen_core.tools import FunctionTool from chess import BLACK, SQUARE_NAMES, WHITE, Board, Move from chess import piece_name as get_piece_name from common.agents._chat_completion_agent import ChatCompletionAgent diff --git a/python/packages/autogen-core/samples/common/agents/_chat_completion_agent.py b/python/packages/autogen-core/samples/common/agents/_chat_completion_agent.py index c36edea18608..246861cb6da8 100644 --- a/python/packages/autogen-core/samples/common/agents/_chat_completion_agent.py +++ b/python/packages/autogen-core/samples/common/agents/_chat_completion_agent.py @@ -11,8 +11,8 @@ RoutedAgent, message_handler, ) -from autogen_core.components.model_context import ChatCompletionContext -from autogen_core.components.models import ( +from autogen_core.model_context import ChatCompletionContext +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, FunctionExecutionResult, @@ -20,7 +20,7 @@ SystemMessage, UserMessage, ) -from autogen_core.components.tools import Tool +from autogen_core.tools import Tool from ..types import ( FunctionCallMessage, diff --git a/python/packages/autogen-core/samples/common/patterns/_group_chat_manager.py b/python/packages/autogen-core/samples/common/patterns/_group_chat_manager.py index 485614ce679c..e8a940beef09 100644 --- a/python/packages/autogen-core/samples/common/patterns/_group_chat_manager.py +++ b/python/packages/autogen-core/samples/common/patterns/_group_chat_manager.py @@ -2,8 +2,8 @@ from typing import Any, Callable, List, Mapping from autogen_core import AgentId, AgentProxy, MessageContext, RoutedAgent, message_handler -from autogen_core.components.model_context import ChatCompletionContext -from autogen_core.components.models import ChatCompletionClient, UserMessage +from autogen_core.model_context import ChatCompletionContext +from autogen_core.models import ChatCompletionClient, UserMessage from ..types import ( MultiModalMessage, diff --git a/python/packages/autogen-core/samples/common/patterns/_group_chat_utils.py b/python/packages/autogen-core/samples/common/patterns/_group_chat_utils.py index e0ad173ce196..813bc1747bc2 100644 --- a/python/packages/autogen-core/samples/common/patterns/_group_chat_utils.py +++ b/python/packages/autogen-core/samples/common/patterns/_group_chat_utils.py @@ -4,8 +4,8 @@ from typing import Dict, List from autogen_core import AgentProxy -from autogen_core.components.model_context import ChatCompletionContext -from autogen_core.components.models import ChatCompletionClient, SystemMessage, UserMessage +from autogen_core.model_context import ChatCompletionContext +from autogen_core.models import ChatCompletionClient, SystemMessage, UserMessage async def select_speaker(context: ChatCompletionContext, client: ChatCompletionClient, agents: List[AgentProxy]) -> int: diff --git a/python/packages/autogen-core/samples/common/types.py b/python/packages/autogen-core/samples/common/types.py index 1aee6aa602a1..5ffe1ca44a67 100644 --- a/python/packages/autogen-core/samples/common/types.py +++ b/python/packages/autogen-core/samples/common/types.py @@ -5,7 +5,7 @@ from typing import List, Union from autogen_core import FunctionCall, Image -from autogen_core.components.models import FunctionExecutionResultMessage +from autogen_core.models import FunctionExecutionResultMessage @dataclass(kw_only=True) diff --git a/python/packages/autogen-core/samples/common/utils.py b/python/packages/autogen-core/samples/common/utils.py index 7d1cdad1c2f9..d43283ab79a4 100644 --- a/python/packages/autogen-core/samples/common/utils.py +++ b/python/packages/autogen-core/samples/common/utils.py @@ -1,7 +1,7 @@ import os from typing import Any, List, Optional, Union -from autogen_core.components.models import ( +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, FunctionExecutionResult, @@ -9,7 +9,7 @@ LLMMessage, UserMessage, ) -from autogen_ext.models import AzureOpenAIChatCompletionClient, OpenAIChatCompletionClient +from autogen_ext.models.openai import AzureOpenAIChatCompletionClient, OpenAIChatCompletionClient from azure.identity import DefaultAzureCredential, get_bearer_token_provider from typing_extensions import Literal diff --git a/python/packages/autogen-core/samples/distributed-group-chat/_agents.py b/python/packages/autogen-core/samples/distributed-group-chat/_agents.py index 45d2f8d5dab2..f1ae93cbdbc3 100644 --- a/python/packages/autogen-core/samples/distributed-group-chat/_agents.py +++ b/python/packages/autogen-core/samples/distributed-group-chat/_agents.py @@ -5,7 +5,7 @@ from _types import GroupChatMessage, MessageChunk, RequestToSpeak, UIAgentConfig from autogen_core import DefaultTopicId, MessageContext, RoutedAgent, message_handler -from autogen_core.components.models import ( +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, LLMMessage, diff --git a/python/packages/autogen-core/samples/distributed-group-chat/_types.py b/python/packages/autogen-core/samples/distributed-group-chat/_types.py index 0e05d941c1ff..cf5d8e75263d 100644 --- a/python/packages/autogen-core/samples/distributed-group-chat/_types.py +++ b/python/packages/autogen-core/samples/distributed-group-chat/_types.py @@ -1,10 +1,10 @@ from dataclasses import dataclass from typing import Dict -from autogen_core.components.models import ( +from autogen_core.models import ( LLMMessage, ) -from autogen_ext.models import AzureOpenAIClientConfiguration +from autogen_ext.models.openai import AzureOpenAIClientConfiguration from pydantic import BaseModel diff --git a/python/packages/autogen-core/samples/distributed-group-chat/_utils.py b/python/packages/autogen-core/samples/distributed-group-chat/_utils.py index 3869b88c2815..2e329e745b73 100644 --- a/python/packages/autogen-core/samples/distributed-group-chat/_utils.py +++ b/python/packages/autogen-core/samples/distributed-group-chat/_utils.py @@ -5,7 +5,7 @@ import yaml from _types import AppConfig from autogen_core import MessageSerializer, try_get_known_serializers_for_type -from autogen_ext.models import AzureOpenAIClientConfiguration +from autogen_ext.models.openai import AzureOpenAIClientConfiguration from azure.identity import DefaultAzureCredential, get_bearer_token_provider diff --git a/python/packages/autogen-core/samples/distributed-group-chat/run_editor_agent.py b/python/packages/autogen-core/samples/distributed-group-chat/run_editor_agent.py index f516f20a365e..2fdfa72c7707 100644 --- a/python/packages/autogen-core/samples/distributed-group-chat/run_editor_agent.py +++ b/python/packages/autogen-core/samples/distributed-group-chat/run_editor_agent.py @@ -8,7 +8,7 @@ from autogen_core import ( TypeSubscription, ) -from autogen_ext.models import AzureOpenAIChatCompletionClient +from autogen_ext.models.openai import AzureOpenAIChatCompletionClient from autogen_ext.runtimes.grpc import GrpcWorkerAgentRuntime from rich.console import Console from rich.markdown import Markdown diff --git a/python/packages/autogen-core/samples/distributed-group-chat/run_group_chat_manager.py b/python/packages/autogen-core/samples/distributed-group-chat/run_group_chat_manager.py index ac0507891392..ad9d06c02997 100644 --- a/python/packages/autogen-core/samples/distributed-group-chat/run_group_chat_manager.py +++ b/python/packages/autogen-core/samples/distributed-group-chat/run_group_chat_manager.py @@ -8,7 +8,7 @@ from autogen_core import ( TypeSubscription, ) -from autogen_ext.models import AzureOpenAIChatCompletionClient +from autogen_ext.models.openai import AzureOpenAIChatCompletionClient from autogen_ext.runtimes.grpc import GrpcWorkerAgentRuntime from rich.console import Console from rich.markdown import Markdown diff --git a/python/packages/autogen-core/samples/distributed-group-chat/run_writer_agent.py b/python/packages/autogen-core/samples/distributed-group-chat/run_writer_agent.py index a7172d15c14f..0455fb8dae57 100644 --- a/python/packages/autogen-core/samples/distributed-group-chat/run_writer_agent.py +++ b/python/packages/autogen-core/samples/distributed-group-chat/run_writer_agent.py @@ -8,7 +8,7 @@ from autogen_core import ( TypeSubscription, ) -from autogen_ext.models import AzureOpenAIChatCompletionClient +from autogen_ext.models.openai import AzureOpenAIChatCompletionClient from autogen_ext.runtimes.grpc import GrpcWorkerAgentRuntime from rich.console import Console from rich.markdown import Markdown diff --git a/python/packages/autogen-core/samples/protos/agent_events_pb2.py b/python/packages/autogen-core/samples/protos/agent_events_pb2.py index b93b1219e019..18b39486aced 100644 --- a/python/packages/autogen-core/samples/protos/agent_events_pb2.py +++ b/python/packages/autogen-core/samples/protos/agent_events_pb2.py @@ -3,49 +3,47 @@ # source: agent_events.proto # Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" - from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x12\x61gent_events.proto\x12\x06\x61gents"2\n\x0bTextMessage\x12\x13\n\x0btextMessage\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t"\x18\n\x05Input\x12\x0f\n\x07message\x18\x01 \x01(\t"\x1f\n\x0eInputProcessed\x12\r\n\x05route\x18\x01 \x01(\t"\x19\n\x06Output\x12\x0f\n\x07message\x18\x01 \x01(\t"\x1e\n\rOutputWritten\x12\r\n\x05route\x18\x01 \x01(\t"\x1a\n\x07IOError\x12\x0f\n\x07message\x18\x01 \x01(\t"%\n\x12NewMessageReceived\x12\x0f\n\x07message\x18\x01 \x01(\t"%\n\x11ResponseGenerated\x12\x10\n\x08response\x18\x01 \x01(\t"\x1a\n\x07GoodBye\x12\x0f\n\x07message\x18\x01 \x01(\t" \n\rMessageStored\x12\x0f\n\x07message\x18\x01 \x01(\t";\n\x12\x43onversationClosed\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x14\n\x0cuser_message\x18\x02 \x01(\t"\x1b\n\x08Shutdown\x12\x0f\n\x07message\x18\x01 \x01(\tB!\xaa\x02\x1eMicrosoft.AutoGen.Abstractionsb\x06proto3' -) + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x61gent_events.proto\x12\x06\x61gents\"2\n\x0bTextMessage\x12\x13\n\x0btextMessage\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"\x18\n\x05Input\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x1f\n\x0eInputProcessed\x12\r\n\x05route\x18\x01 \x01(\t\"\x19\n\x06Output\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x1e\n\rOutputWritten\x12\r\n\x05route\x18\x01 \x01(\t\"\x1a\n\x07IOError\x12\x0f\n\x07message\x18\x01 \x01(\t\"%\n\x12NewMessageReceived\x12\x0f\n\x07message\x18\x01 \x01(\t\"%\n\x11ResponseGenerated\x12\x10\n\x08response\x18\x01 \x01(\t\"\x1a\n\x07GoodBye\x12\x0f\n\x07message\x18\x01 \x01(\t\" \n\rMessageStored\x12\x0f\n\x07message\x18\x01 \x01(\t\";\n\x12\x43onversationClosed\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x14\n\x0cuser_message\x18\x02 \x01(\t\"\x1b\n\x08Shutdown\x12\x0f\n\x07message\x18\x01 \x01(\tB\x1e\xaa\x02\x1bMicrosoft.AutoGen.Contractsb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "agent_events_pb2", _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'agent_events_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - _globals["DESCRIPTOR"]._options = None - _globals["DESCRIPTOR"]._serialized_options = b"\252\002\036Microsoft.AutoGen.Abstractions" - _globals["_TEXTMESSAGE"]._serialized_start = 30 - _globals["_TEXTMESSAGE"]._serialized_end = 80 - _globals["_INPUT"]._serialized_start = 82 - _globals["_INPUT"]._serialized_end = 106 - _globals["_INPUTPROCESSED"]._serialized_start = 108 - _globals["_INPUTPROCESSED"]._serialized_end = 139 - _globals["_OUTPUT"]._serialized_start = 141 - _globals["_OUTPUT"]._serialized_end = 166 - _globals["_OUTPUTWRITTEN"]._serialized_start = 168 - _globals["_OUTPUTWRITTEN"]._serialized_end = 198 - _globals["_IOERROR"]._serialized_start = 200 - _globals["_IOERROR"]._serialized_end = 226 - _globals["_NEWMESSAGERECEIVED"]._serialized_start = 228 - _globals["_NEWMESSAGERECEIVED"]._serialized_end = 265 - _globals["_RESPONSEGENERATED"]._serialized_start = 267 - _globals["_RESPONSEGENERATED"]._serialized_end = 304 - _globals["_GOODBYE"]._serialized_start = 306 - _globals["_GOODBYE"]._serialized_end = 332 - _globals["_MESSAGESTORED"]._serialized_start = 334 - _globals["_MESSAGESTORED"]._serialized_end = 366 - _globals["_CONVERSATIONCLOSED"]._serialized_start = 368 - _globals["_CONVERSATIONCLOSED"]._serialized_end = 427 - _globals["_SHUTDOWN"]._serialized_start = 429 - _globals["_SHUTDOWN"]._serialized_end = 456 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\252\002\033Microsoft.AutoGen.Contracts' + _globals['_TEXTMESSAGE']._serialized_start=30 + _globals['_TEXTMESSAGE']._serialized_end=80 + _globals['_INPUT']._serialized_start=82 + _globals['_INPUT']._serialized_end=106 + _globals['_INPUTPROCESSED']._serialized_start=108 + _globals['_INPUTPROCESSED']._serialized_end=139 + _globals['_OUTPUT']._serialized_start=141 + _globals['_OUTPUT']._serialized_end=166 + _globals['_OUTPUTWRITTEN']._serialized_start=168 + _globals['_OUTPUTWRITTEN']._serialized_end=198 + _globals['_IOERROR']._serialized_start=200 + _globals['_IOERROR']._serialized_end=226 + _globals['_NEWMESSAGERECEIVED']._serialized_start=228 + _globals['_NEWMESSAGERECEIVED']._serialized_end=265 + _globals['_RESPONSEGENERATED']._serialized_start=267 + _globals['_RESPONSEGENERATED']._serialized_end=304 + _globals['_GOODBYE']._serialized_start=306 + _globals['_GOODBYE']._serialized_end=332 + _globals['_MESSAGESTORED']._serialized_start=334 + _globals['_MESSAGESTORED']._serialized_end=366 + _globals['_CONVERSATIONCLOSED']._serialized_start=368 + _globals['_CONVERSATIONCLOSED']._serialized_end=427 + _globals['_SHUTDOWN']._serialized_start=429 + _globals['_SHUTDOWN']._serialized_end=456 # @@protoc_insertion_point(module_scope) diff --git a/python/packages/autogen-core/samples/protos/agent_events_pb2_grpc.py b/python/packages/autogen-core/samples/protos/agent_events_pb2_grpc.py index bf947056a2f4..2daafffebfc8 100644 --- a/python/packages/autogen-core/samples/protos/agent_events_pb2_grpc.py +++ b/python/packages/autogen-core/samples/protos/agent_events_pb2_grpc.py @@ -1,4 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" - import grpc + diff --git a/python/packages/autogen-core/samples/slow_human_in_loop.py b/python/packages/autogen-core/samples/slow_human_in_loop.py index 2cfcf0a64f9d..9c4476d06b5c 100644 --- a/python/packages/autogen-core/samples/slow_human_in_loop.py +++ b/python/packages/autogen-core/samples/slow_human_in_loop.py @@ -42,14 +42,14 @@ type_subscription, ) from autogen_core.base.intervention import DefaultInterventionHandler -from autogen_core.components.model_context import BufferedChatCompletionContext -from autogen_core.components.models import ( +from autogen_core.model_context import BufferedChatCompletionContext +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, SystemMessage, UserMessage, ) -from autogen_core.components.tools import BaseTool +from autogen_core.tools import BaseTool from common.types import TextMessage from common.utils import get_chat_completion_client_from_envs from pydantic import BaseModel, Field diff --git a/python/packages/autogen-core/samples/xlang/hello_python_agent/hello_python_agent.py b/python/packages/autogen-core/samples/xlang/hello_python_agent/hello_python_agent.py index c50aacedd5b9..178b91de8826 100644 --- a/python/packages/autogen-core/samples/xlang/hello_python_agent/hello_python_agent.py +++ b/python/packages/autogen-core/samples/xlang/hello_python_agent/hello_python_agent.py @@ -42,11 +42,11 @@ async def main() -> None: agnext_logger.info("2") - await UserProxy.register(runtime, "HelloAgents", lambda: UserProxy()) - await runtime.add_subscription(DefaultSubscription(agent_type="HelloAgents")) - await runtime.add_subscription(TypeSubscription(topic_type="agents.NewMessageReceived", agent_type="HelloAgents")) - await runtime.add_subscription(TypeSubscription(topic_type="agents.ConversationClosed", agent_type="HelloAgents")) - await runtime.add_subscription(TypeSubscription(topic_type="agents.Output", agent_type="HelloAgents")) + await UserProxy.register(runtime, "HelloAgent", lambda: UserProxy()) + await runtime.add_subscription(DefaultSubscription(agent_type="HelloAgent")) + await runtime.add_subscription(TypeSubscription(topic_type="agents.NewMessageReceived", agent_type="HelloAgent")) + await runtime.add_subscription(TypeSubscription(topic_type="agents.ConversationClosed", agent_type="HelloAgent")) + await runtime.add_subscription(TypeSubscription(topic_type="agents.Output", agent_type="HelloAgent")) agnext_logger.info("3") new_message = NewMessageReceived(message="from Python!") diff --git a/python/packages/autogen-core/src/autogen_core/code_executor/_func_with_reqs.py b/python/packages/autogen-core/src/autogen_core/code_executor/_func_with_reqs.py index b7f4fcaef8db..77fc0b831427 100644 --- a/python/packages/autogen-core/src/autogen_core/code_executor/_func_with_reqs.py +++ b/python/packages/autogen-core/src/autogen_core/code_executor/_func_with_reqs.py @@ -9,7 +9,7 @@ from importlib.abc import SourceLoader from importlib.util import module_from_spec, spec_from_loader from textwrap import dedent, indent -from typing import Any, Callable, Generic, List, Sequence, Set, TypeVar, Union +from typing import Any, Callable, Generic, List, Sequence, Set, Tuple, TypeVar, Union from typing_extensions import ParamSpec @@ -21,23 +21,38 @@ def _to_code(func: Union[FunctionWithRequirements[T, P], Callable[P, T], Functio if isinstance(func, FunctionWithRequirementsStr): return func.func - code = inspect.getsource(func) + if isinstance(func, FunctionWithRequirements): + code = inspect.getsource(func.func) + else: + code = inspect.getsource(func) # Strip the decorator if code.startswith("@"): code = code[code.index("\n") + 1 :] return code -@dataclass +@dataclass(frozen=True) class Alias: name: str alias: str -@dataclass +@dataclass(frozen=True) class ImportFromModule: module: str - imports: List[Union[str, Alias]] + imports: Tuple[Union[str, Alias], ...] + + ## backward compatibility + def __init__( + self, + module: str, + imports: Union[Tuple[Union[str, Alias], ...], List[Union[str, Alias]]], + ): + object.__setattr__(self, "module", module) + if isinstance(imports, list): + object.__setattr__(self, "imports", tuple(imports)) + else: + object.__setattr__(self, "imports", imports) Import = Union[str, ImportFromModule, Alias] diff --git a/python/packages/autogen-core/src/autogen_core/components/model_context/__init__.py b/python/packages/autogen-core/src/autogen_core/components/model_context/__init__.py index 8431a2e80dfc..766e7f877647 100644 --- a/python/packages/autogen-core/src/autogen_core/components/model_context/__init__.py +++ b/python/packages/autogen-core/src/autogen_core/components/model_context/__init__.py @@ -1,9 +1,32 @@ -from ._buffered_chat_completion_context import BufferedChatCompletionContext -from ._chat_completion_context import ChatCompletionContext -from ._head_and_tail_chat_completion_context import HeadAndTailChatCompletionContext +from typing_extensions import deprecated + +from ...model_context import BufferedChatCompletionContext as BufferedChatCompletionContextAlias +from ...model_context import ChatCompletionContext as ChatCompletionContextAlias +from ...model_context import HeadAndTailChatCompletionContext as HeadAndTailChatCompletionContextAlias __all__ = [ "ChatCompletionContext", "BufferedChatCompletionContext", "HeadAndTailChatCompletionContext", ] + + +@deprecated( + "autogen_core.components.model_context.BufferedChatCompletionContextAlias moved to autogen_core.model_context.BufferedChatCompletionContextAlias. This alias will be removed in 0.4.0." +) +class BufferedChatCompletionContext(BufferedChatCompletionContextAlias): + pass + + +@deprecated( + "autogen_core.components.model_context.HeadAndTailChatCompletionContextAlias moved to autogen_core.model_context.HeadAndTailChatCompletionContextAlias. This alias will be removed in 0.4.0." +) +class HeadAndTailChatCompletionContext(HeadAndTailChatCompletionContextAlias): + pass + + +@deprecated( + "autogen_core.components.model_context.ChatCompletionContextAlias moved to autogen_core.model_context.ChatCompletionContextAlias. This alias will be removed in 0.4.0." +) +class ChatCompletionContext(ChatCompletionContextAlias): + pass diff --git a/python/packages/autogen-core/src/autogen_core/components/models/__init__.py b/python/packages/autogen-core/src/autogen_core/components/models/__init__.py index 9b12aa702edd..a17007f9c735 100644 --- a/python/packages/autogen-core/src/autogen_core/components/models/__init__.py +++ b/python/packages/autogen-core/src/autogen_core/components/models/__init__.py @@ -1,17 +1,124 @@ -from ._model_client import ChatCompletionClient, ModelCapabilities -from ._types import ( - AssistantMessage, - ChatCompletionTokenLogprob, - CreateResult, - FinishReasons, - FunctionExecutionResult, - FunctionExecutionResultMessage, - LLMMessage, - RequestUsage, - SystemMessage, - TopLogprob, - UserMessage, +from typing_extensions import deprecated + +from ...models import ( + AssistantMessage as AssistantMessageAlias, +) +from ...models import ChatCompletionClient as ChatCompletionClientAlias +from ...models import ( + ChatCompletionTokenLogprob as ChatCompletionTokenLogprobAlias, +) +from ...models import ( + CreateResult as CreateResultAlias, +) +from ...models import ( + FinishReasons as FinishReasonsAlias, +) +from ...models import ( + FunctionExecutionResult as FunctionExecutionResultAlias, +) +from ...models import ( + FunctionExecutionResultMessage as FunctionExecutionResultMessageAlias, +) +from ...models import ( + LLMMessage as LLMMessageAlias, ) +from ...models import ModelCapabilities as ModelCapabilitiesAlias +from ...models import ( + RequestUsage as RequestUsageAlias, +) +from ...models import ( + SystemMessage as SystemMessageAlias, +) +from ...models import ( + TopLogprob as TopLogprobAlias, +) +from ...models import ( + UserMessage as UserMessageAlias, +) + + +@deprecated( + "autogen_core.components.models.ChatCompletionClient moved to autogen_core.models.ChatCompletionClient. This alias will be removed in 0.4.0." +) +class ChatCompletionClient(ChatCompletionClientAlias): + pass + + +@deprecated( + "autogen_core.components.models.ModelCapabilities moved to autogen_core.models.ModelCapabilities. This alias will be removed in 0.4.0." +) +class ModelCapabilities(ModelCapabilitiesAlias): + pass + + +@deprecated( + "autogen_core.components.models.SystemMessage moved to autogen_core.models.SystemMessage. This alias will be removed in 0.4.0." +) +class SystemMessage(SystemMessageAlias): + pass + + +@deprecated( + "autogen_core.components.models.UserMessage moved to autogen_core.models.UserMessage. This alias will be removed in 0.4.0." +) +class UserMessage(UserMessageAlias): + pass + + +@deprecated( + "autogen_core.components.models.AssistantMessage moved to autogen_core.models.AssistantMessage. This alias will be removed in 0.4.0." +) +class AssistantMessage(AssistantMessageAlias): + pass + + +@deprecated( + "autogen_core.components.models.FunctionExecutionResult moved to autogen_core.models.FunctionExecutionResult. This alias will be removed in 0.4.0." +) +class FunctionExecutionResult(FunctionExecutionResultAlias): + pass + + +@deprecated( + "autogen_core.components.models.FunctionExecutionResultMessage moved to autogen_core.models.FunctionExecutionResultMessage. This alias will be removed in 0.4.0." +) +class FunctionExecutionResultMessage(FunctionExecutionResultMessageAlias): + pass + + +LLMMessage = LLMMessageAlias + + +@deprecated( + "autogen_core.components.models.RequestUsage moved to autogen_core.models.RequestUsage. This alias will be removed in 0.4.0." +) +class RequestUsage(RequestUsageAlias): + pass + + +FinishReasons = FinishReasonsAlias + + +@deprecated( + "autogen_core.components.models.CreateResult moved to autogen_core.models.CreateResult. This alias will be removed in 0.4.0." +) +class CreateResult(CreateResultAlias): + pass + + +@deprecated( + "autogen_core.components.models.TopLogprob moved to autogen_core.models.TopLogprob. This alias will be removed in 0.4.0." +) +class TopLogprob(TopLogprobAlias): + pass + + +@deprecated( + "autogen_core.components.models.ChatCompletionTokenLogprob moved to autogen_core.models.ChatCompletionTokenLogprob. This alias will be removed in 0.4.0." +) +class ChatCompletionTokenLogprob(ChatCompletionTokenLogprobAlias): + pass + __all__ = [ "ModelCapabilities", diff --git a/python/packages/autogen-core/src/autogen_core/components/tool_agent/__init__.py b/python/packages/autogen-core/src/autogen_core/components/tool_agent/__init__.py index e072efdd7cd2..ff03136668e2 100644 --- a/python/packages/autogen-core/src/autogen_core/components/tool_agent/__init__.py +++ b/python/packages/autogen-core/src/autogen_core/components/tool_agent/__init__.py @@ -1,11 +1,23 @@ -from ._caller_loop import tool_agent_caller_loop -from ._tool_agent import ( - InvalidToolArgumentsException, - ToolAgent, - ToolException, - ToolExecutionException, - ToolNotFoundException, +from typing import Any + +from typing_extensions import deprecated + +from ...tool_agent import ( + InvalidToolArgumentsException as InvalidToolArgumentsExceptionAlias, +) +from ...tool_agent import ( + ToolAgent as ToolAgentAlias, +) +from ...tool_agent import ( + ToolException as ToolExceptionAlias, +) +from ...tool_agent import ( + ToolExecutionException as ToolExecutionExceptionAlias, +) +from ...tool_agent import ( + ToolNotFoundException as ToolNotFoundExceptionAlias, ) +from ...tool_agent import tool_agent_caller_loop as tool_agent_caller_loop_alias __all__ = [ "ToolAgent", @@ -15,3 +27,45 @@ "ToolExecutionException", "tool_agent_caller_loop", ] + + +@deprecated( + "autogen_core.tool_agent.ToolAgentAlias moved to autogen_core.tool_agent.ToolAgentAlias. This alias will be removed in 0.4.0." +) +class ToolAgent(ToolAgentAlias): + pass + + +@deprecated( + "autogen_core.tool_agent.ToolExceptionAlias moved to autogen_core.tool_agent.ToolExceptionAlias. This alias will be removed in 0.4.0." +) +class ToolException(ToolExceptionAlias): + pass + + +@deprecated( + "autogen_core.tool_agent.ToolNotFoundExceptionAlias moved to autogen_core.tool_agent.ToolNotFoundExceptionAlias. This alias will be removed in 0.4.0." +) +class ToolNotFoundException(ToolNotFoundExceptionAlias): + pass + + +@deprecated( + "autogen_core.tool_agent.InvalidToolArgumentsExceptionAlias moved to autogen_core.tool_agent.InvalidToolArgumentsExceptionAlias. This alias will be removed in 0.4.0." +) +class InvalidToolArgumentsException(InvalidToolArgumentsExceptionAlias): + pass + + +@deprecated( + "autogen_core.tool_agent.ToolExecutionExceptionAlias moved to autogen_core.tool_agent.ToolExecutionExceptionAlias. This alias will be removed in 0.4.0." +) +class ToolExecutionException(ToolExecutionExceptionAlias): + pass + + +@deprecated( + "autogen_core.tool_agent.tool_agent_caller_loop moved to autogen_core.tool_agent.tool_agent_caller_loop. This alias will be removed in 0.4.0." +) +def tool_agent_caller_loop(*args: Any, **kwargs: Any) -> Any: + return tool_agent_caller_loop_alias(*args, **kwargs) # type: ignore diff --git a/python/packages/autogen-core/src/autogen_core/components/tools/__init__.py b/python/packages/autogen-core/src/autogen_core/components/tools/__init__.py index dcfb1759a91d..e3c480fee302 100644 --- a/python/packages/autogen-core/src/autogen_core/components/tools/__init__.py +++ b/python/packages/autogen-core/src/autogen_core/components/tools/__init__.py @@ -1,6 +1,33 @@ -from ._base import BaseTool, BaseToolWithState, ParametersSchema, Tool, ToolSchema -from ._code_execution import CodeExecutionInput, CodeExecutionResult, PythonCodeExecutionTool -from ._function_tool import FunctionTool +from typing import TypeVar + +from pydantic import BaseModel +from typing_extensions import deprecated + +from ...tools import ( + BaseTool as BaseToolAlias, +) +from ...tools import ( + BaseToolWithState as BaseToolWithStateAlias, +) +from ...tools import ( + CodeExecutionInput as CodeExecutionInputAlias, +) +from ...tools import ( + CodeExecutionResult as CodeExecutionResultAlias, +) +from ...tools import FunctionTool as FunctionToolAlias +from ...tools import ( + ParametersSchema as ParametersSchemaAlias, +) +from ...tools import ( + PythonCodeExecutionTool as PythonCodeExecutionToolAlias, +) +from ...tools import ( + Tool as ToolAlias, +) +from ...tools import ( + ToolSchema as ToolSchemaAlias, +) __all__ = [ "Tool", @@ -13,3 +40,69 @@ "CodeExecutionResult", "FunctionTool", ] + + +ArgsT = TypeVar("ArgsT", bound=BaseModel, contravariant=True) +ReturnT = TypeVar("ReturnT", bound=BaseModel, covariant=True) +StateT = TypeVar("StateT", bound=BaseModel) + + +@deprecated( + "autogen_core.tools.BaseToolAlias moved to autogen_core.tools.BaseToolAlias. This alias will be removed in 0.4.0." +) +class BaseTool(BaseToolAlias[ArgsT, ReturnT]): + pass + + +@deprecated("autogen_core.tools.ToolAlias moved to autogen_core.tools.ToolAlias. This alias will be removed in 0.4.0.") +class Tool(ToolAlias): + pass + + +@deprecated( + "autogen_core.tools.ToolSchemaAlias moved to autogen_core.tools.ToolSchemaAlias. This alias will be removed in 0.4.0." +) +class ToolSchema(ToolSchemaAlias): + pass + + +@deprecated( + "autogen_core.tools.ParametersSchemaAlias moved to autogen_core.tools.ParametersSchemaAlias. This alias will be removed in 0.4.0." +) +class ParametersSchema(ParametersSchemaAlias): + pass + + +@deprecated( + "autogen_core.tools.BaseToolWithStateAlias moved to autogen_core.tools.BaseToolWithStateAlias. This alias will be removed in 0.4.0." +) +class BaseToolWithState(BaseToolWithStateAlias[ArgsT, ReturnT, StateT]): + pass + + +@deprecated( + "autogen_core.tools.PythonCodeExecutionToolAlias moved to autogen_core.tools.PythonCodeExecutionToolAlias. This alias will be removed in 0.4.0." +) +class PythonCodeExecutionTool(PythonCodeExecutionToolAlias): + pass + + +@deprecated( + "autogen_core.tools.CodeExecutionInputAlias moved to autogen_core.tools.CodeExecutionInputAlias. This alias will be removed in 0.4.0." +) +class CodeExecutionInput(CodeExecutionInputAlias): + pass + + +@deprecated( + "autogen_core.tools.CodeExecutionResultAlias moved to autogen_core.tools.CodeExecutionResultAlias. This alias will be removed in 0.4.0." +) +class CodeExecutionResult(CodeExecutionResultAlias): + pass + + +@deprecated( + "autogen_core.tools.FunctionToolAlias moved to autogen_core.tools.FunctionToolAlias. This alias will be removed in 0.4.0." +) +class FunctionTool(FunctionToolAlias): + pass diff --git a/python/packages/autogen-core/src/autogen_core/model_context/__init__.py b/python/packages/autogen-core/src/autogen_core/model_context/__init__.py new file mode 100644 index 000000000000..8431a2e80dfc --- /dev/null +++ b/python/packages/autogen-core/src/autogen_core/model_context/__init__.py @@ -0,0 +1,9 @@ +from ._buffered_chat_completion_context import BufferedChatCompletionContext +from ._chat_completion_context import ChatCompletionContext +from ._head_and_tail_chat_completion_context import HeadAndTailChatCompletionContext + +__all__ = [ + "ChatCompletionContext", + "BufferedChatCompletionContext", + "HeadAndTailChatCompletionContext", +] diff --git a/python/packages/autogen-core/src/autogen_core/components/model_context/_buffered_chat_completion_context.py b/python/packages/autogen-core/src/autogen_core/model_context/_buffered_chat_completion_context.py similarity index 100% rename from python/packages/autogen-core/src/autogen_core/components/model_context/_buffered_chat_completion_context.py rename to python/packages/autogen-core/src/autogen_core/model_context/_buffered_chat_completion_context.py diff --git a/python/packages/autogen-core/src/autogen_core/components/model_context/_chat_completion_context.py b/python/packages/autogen-core/src/autogen_core/model_context/_chat_completion_context.py similarity index 100% rename from python/packages/autogen-core/src/autogen_core/components/model_context/_chat_completion_context.py rename to python/packages/autogen-core/src/autogen_core/model_context/_chat_completion_context.py diff --git a/python/packages/autogen-core/src/autogen_core/components/model_context/_head_and_tail_chat_completion_context.py b/python/packages/autogen-core/src/autogen_core/model_context/_head_and_tail_chat_completion_context.py similarity index 98% rename from python/packages/autogen-core/src/autogen_core/components/model_context/_head_and_tail_chat_completion_context.py rename to python/packages/autogen-core/src/autogen_core/model_context/_head_and_tail_chat_completion_context.py index 0caa5546095d..ab50df41626e 100644 --- a/python/packages/autogen-core/src/autogen_core/components/model_context/_head_and_tail_chat_completion_context.py +++ b/python/packages/autogen-core/src/autogen_core/model_context/_head_and_tail_chat_completion_context.py @@ -1,6 +1,6 @@ from typing import Any, List, Mapping -from ..._types import FunctionCall +from .._types import FunctionCall from ..models import AssistantMessage, FunctionExecutionResultMessage, LLMMessage, UserMessage from ._chat_completion_context import ChatCompletionContext diff --git a/python/packages/autogen-core/src/autogen_core/models/__init__.py b/python/packages/autogen-core/src/autogen_core/models/__init__.py new file mode 100644 index 000000000000..9b12aa702edd --- /dev/null +++ b/python/packages/autogen-core/src/autogen_core/models/__init__.py @@ -0,0 +1,30 @@ +from ._model_client import ChatCompletionClient, ModelCapabilities +from ._types import ( + AssistantMessage, + ChatCompletionTokenLogprob, + CreateResult, + FinishReasons, + FunctionExecutionResult, + FunctionExecutionResultMessage, + LLMMessage, + RequestUsage, + SystemMessage, + TopLogprob, + UserMessage, +) + +__all__ = [ + "ModelCapabilities", + "ChatCompletionClient", + "SystemMessage", + "UserMessage", + "AssistantMessage", + "FunctionExecutionResult", + "FunctionExecutionResultMessage", + "LLMMessage", + "RequestUsage", + "FinishReasons", + "CreateResult", + "TopLogprob", + "ChatCompletionTokenLogprob", +] diff --git a/python/packages/autogen-core/src/autogen_core/components/models/_model_client.py b/python/packages/autogen-core/src/autogen_core/models/_model_client.py similarity index 98% rename from python/packages/autogen-core/src/autogen_core/components/models/_model_client.py rename to python/packages/autogen-core/src/autogen_core/models/_model_client.py index dec6dd221fe0..c141c480dd78 100644 --- a/python/packages/autogen-core/src/autogen_core/components/models/_model_client.py +++ b/python/packages/autogen-core/src/autogen_core/models/_model_client.py @@ -11,7 +11,7 @@ Union, ) -from ... import CancellationToken +from .. import CancellationToken from ..tools import Tool, ToolSchema from ._types import CreateResult, LLMMessage, RequestUsage diff --git a/python/packages/autogen-core/src/autogen_core/components/models/_types.py b/python/packages/autogen-core/src/autogen_core/models/_types.py similarity index 97% rename from python/packages/autogen-core/src/autogen_core/components/models/_types.py rename to python/packages/autogen-core/src/autogen_core/models/_types.py index 6ab79d0ab3d0..fb118562e4d3 100644 --- a/python/packages/autogen-core/src/autogen_core/components/models/_types.py +++ b/python/packages/autogen-core/src/autogen_core/models/_types.py @@ -4,7 +4,7 @@ from pydantic import BaseModel, Field from typing_extensions import Annotated -from ... import FunctionCall, Image +from .. import FunctionCall, Image class SystemMessage(BaseModel): diff --git a/python/packages/autogen-core/src/autogen_core/tool_agent/__init__.py b/python/packages/autogen-core/src/autogen_core/tool_agent/__init__.py new file mode 100644 index 000000000000..e072efdd7cd2 --- /dev/null +++ b/python/packages/autogen-core/src/autogen_core/tool_agent/__init__.py @@ -0,0 +1,17 @@ +from ._caller_loop import tool_agent_caller_loop +from ._tool_agent import ( + InvalidToolArgumentsException, + ToolAgent, + ToolException, + ToolExecutionException, + ToolNotFoundException, +) + +__all__ = [ + "ToolAgent", + "ToolException", + "ToolNotFoundException", + "InvalidToolArgumentsException", + "ToolExecutionException", + "tool_agent_caller_loop", +] diff --git a/python/packages/autogen-core/src/autogen_core/components/tool_agent/_caller_loop.py b/python/packages/autogen-core/src/autogen_core/tool_agent/_caller_loop.py similarity index 97% rename from python/packages/autogen-core/src/autogen_core/components/tool_agent/_caller_loop.py rename to python/packages/autogen-core/src/autogen_core/tool_agent/_caller_loop.py index 28cff5066453..2353ca184f86 100644 --- a/python/packages/autogen-core/src/autogen_core/components/tool_agent/_caller_loop.py +++ b/python/packages/autogen-core/src/autogen_core/tool_agent/_caller_loop.py @@ -1,7 +1,7 @@ import asyncio from typing import List -from ... import AgentId, AgentRuntime, BaseAgent, CancellationToken, FunctionCall +from .. import AgentId, AgentRuntime, BaseAgent, CancellationToken, FunctionCall from ..models import ( AssistantMessage, ChatCompletionClient, diff --git a/python/packages/autogen-core/src/autogen_core/components/tool_agent/_tool_agent.py b/python/packages/autogen-core/src/autogen_core/tool_agent/_tool_agent.py similarity index 97% rename from python/packages/autogen-core/src/autogen_core/components/tool_agent/_tool_agent.py rename to python/packages/autogen-core/src/autogen_core/tool_agent/_tool_agent.py index 2794a3e4e442..08d8f4b25376 100644 --- a/python/packages/autogen-core/src/autogen_core/components/tool_agent/_tool_agent.py +++ b/python/packages/autogen-core/src/autogen_core/tool_agent/_tool_agent.py @@ -2,7 +2,7 @@ from dataclasses import dataclass from typing import List -from ... import FunctionCall, MessageContext, RoutedAgent, message_handler +from .. import FunctionCall, MessageContext, RoutedAgent, message_handler from ..models import FunctionExecutionResult from ..tools import Tool diff --git a/python/packages/autogen-core/src/autogen_core/tools/__init__.py b/python/packages/autogen-core/src/autogen_core/tools/__init__.py new file mode 100644 index 000000000000..dcfb1759a91d --- /dev/null +++ b/python/packages/autogen-core/src/autogen_core/tools/__init__.py @@ -0,0 +1,15 @@ +from ._base import BaseTool, BaseToolWithState, ParametersSchema, Tool, ToolSchema +from ._code_execution import CodeExecutionInput, CodeExecutionResult, PythonCodeExecutionTool +from ._function_tool import FunctionTool + +__all__ = [ + "Tool", + "ToolSchema", + "ParametersSchema", + "BaseTool", + "BaseToolWithState", + "PythonCodeExecutionTool", + "CodeExecutionInput", + "CodeExecutionResult", + "FunctionTool", +] diff --git a/python/packages/autogen-core/src/autogen_core/components/tools/_base.py b/python/packages/autogen-core/src/autogen_core/tools/_base.py similarity index 98% rename from python/packages/autogen-core/src/autogen_core/components/tools/_base.py rename to python/packages/autogen-core/src/autogen_core/tools/_base.py index b41d747d65b2..7c4042e9afd6 100644 --- a/python/packages/autogen-core/src/autogen_core/components/tools/_base.py +++ b/python/packages/autogen-core/src/autogen_core/tools/_base.py @@ -7,8 +7,8 @@ from pydantic import BaseModel from typing_extensions import NotRequired -from ... import CancellationToken -from ..._function_utils import normalize_annotated_type +from .. import CancellationToken +from .._function_utils import normalize_annotated_type T = TypeVar("T", bound=BaseModel, contravariant=True) diff --git a/python/packages/autogen-core/src/autogen_core/components/tools/_code_execution.py b/python/packages/autogen-core/src/autogen_core/tools/_code_execution.py similarity index 92% rename from python/packages/autogen-core/src/autogen_core/components/tools/_code_execution.py rename to python/packages/autogen-core/src/autogen_core/tools/_code_execution.py index eb792a32fef6..f3f2b072e6fd 100644 --- a/python/packages/autogen-core/src/autogen_core/components/tools/_code_execution.py +++ b/python/packages/autogen-core/src/autogen_core/tools/_code_execution.py @@ -1,7 +1,7 @@ from pydantic import BaseModel, Field, model_serializer -from ... import CancellationToken -from ...code_executor import CodeBlock, CodeExecutor +from .. import CancellationToken +from ..code_executor import CodeBlock, CodeExecutor from ._base import BaseTool diff --git a/python/packages/autogen-core/src/autogen_core/components/tools/_function_tool.py b/python/packages/autogen-core/src/autogen_core/tools/_function_tool.py similarity index 96% rename from python/packages/autogen-core/src/autogen_core/components/tools/_function_tool.py rename to python/packages/autogen-core/src/autogen_core/tools/_function_tool.py index 45041121caeb..026fc845e9c2 100644 --- a/python/packages/autogen-core/src/autogen_core/components/tools/_function_tool.py +++ b/python/packages/autogen-core/src/autogen_core/tools/_function_tool.py @@ -4,8 +4,8 @@ from pydantic import BaseModel -from ... import CancellationToken -from ..._function_utils import ( +from .. import CancellationToken +from .._function_utils import ( args_base_model_from_signature, get_typed_signature, ) @@ -39,7 +39,7 @@ class FunctionTool(BaseTool[BaseModel, BaseModel]): import random from autogen_core import CancellationToken - from autogen_core.components.tools import FunctionTool + from autogen_core.tools import FunctionTool from typing_extensions import Annotated import asyncio diff --git a/python/packages/autogen-core/tests/test_code_executor.py b/python/packages/autogen-core/tests/test_code_executor.py new file mode 100644 index 000000000000..a8412c58d790 --- /dev/null +++ b/python/packages/autogen-core/tests/test_code_executor.py @@ -0,0 +1,53 @@ +import textwrap + +import pytest +from autogen_core.code_executor import ( + Alias, + FunctionWithRequirements, + FunctionWithRequirementsStr, + ImportFromModule, +) +from autogen_core.code_executor._func_with_reqs import build_python_functions_file +from pandas import DataFrame, concat + + +def template_function() -> DataFrame: # type: ignore + data1 = { + "name": ["John", "Anna"], + "location": ["New York", "Paris"], + "age": [24, 13], + } + data2 = { + "name": ["Peter", "Linda"], + "location": ["Berlin", "London"], + "age": [53, 33], + } + df1 = DataFrame.from_dict(data1) # type: ignore + df2 = DataFrame.from_dict(data2) # type: ignore + return concat([df1, df2]) # type: ignore + + +@pytest.mark.asyncio +async def test_hashability_Import() -> None: + function = FunctionWithRequirements.from_callable( # type: ignore + template_function, + ["pandas"], + [ImportFromModule("pandas", ["DataFrame", "concat"])], + ) + functions_module = build_python_functions_file([function]) # type: ignore + + assert "from pandas import DataFrame, concat" in functions_module + + function2: FunctionWithRequirementsStr = FunctionWithRequirements.from_str( + textwrap.dedent( + """ + def template_function2(): + return pd.Series([1, 2]) + """ + ), + "pandas", + [Alias("pandas", "pd")], + ) + functions_module2 = build_python_functions_file([function2]) + + assert "import pandas as pd" in functions_module2 diff --git a/python/packages/autogen-core/tests/test_model_context.py b/python/packages/autogen-core/tests/test_model_context.py index bfbec8bf3305..2fd71574ef87 100644 --- a/python/packages/autogen-core/tests/test_model_context.py +++ b/python/packages/autogen-core/tests/test_model_context.py @@ -1,8 +1,8 @@ from typing import List import pytest -from autogen_core.components.model_context import BufferedChatCompletionContext, HeadAndTailChatCompletionContext -from autogen_core.components.models import AssistantMessage, LLMMessage, UserMessage +from autogen_core.model_context import BufferedChatCompletionContext, HeadAndTailChatCompletionContext +from autogen_core.models import AssistantMessage, LLMMessage, UserMessage @pytest.mark.asyncio diff --git a/python/packages/autogen-core/tests/test_tool_agent.py b/python/packages/autogen-core/tests/test_tool_agent.py index 6f240eabc829..d0d6dec8915b 100644 --- a/python/packages/autogen-core/tests/test_tool_agent.py +++ b/python/packages/autogen-core/tests/test_tool_agent.py @@ -4,7 +4,7 @@ import pytest from autogen_core import AgentId, CancellationToken, FunctionCall, SingleThreadedAgentRuntime -from autogen_core.components.models import ( +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, CreateResult, @@ -15,14 +15,14 @@ RequestUsage, UserMessage, ) -from autogen_core.components.tool_agent import ( +from autogen_core.tool_agent import ( InvalidToolArgumentsException, ToolAgent, ToolExecutionException, ToolNotFoundException, tool_agent_caller_loop, ) -from autogen_core.components.tools import FunctionTool, Tool, ToolSchema +from autogen_core.tools import FunctionTool, Tool, ToolSchema def _pass_function(input: str) -> str: diff --git a/python/packages/autogen-core/tests/test_tools.py b/python/packages/autogen-core/tests/test_tools.py index b35986423dbe..64d97e11519d 100644 --- a/python/packages/autogen-core/tests/test_tools.py +++ b/python/packages/autogen-core/tests/test_tools.py @@ -4,8 +4,8 @@ import pytest from autogen_core import CancellationToken from autogen_core._function_utils import get_typed_signature -from autogen_core.components.tools import BaseTool, FunctionTool -from autogen_core.components.tools._base import ToolSchema +from autogen_core.tools import BaseTool, FunctionTool +from autogen_core.tools._base import ToolSchema from pydantic import BaseModel, Field, model_serializer from pydantic_core import PydanticUndefined diff --git a/python/packages/autogen-ext/pyproject.toml b/python/packages/autogen-ext/pyproject.toml index ad7e009f28ed..a8ba6c3c5705 100644 --- a/python/packages/autogen-ext/pyproject.toml +++ b/python/packages/autogen-ext/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "autogen-ext" -version = "0.4.0.dev9" +version = "0.4.0.dev11" license = {file = "LICENSE-CODE"} description = "AutoGen extensions library" readme = "README.md" @@ -15,7 +15,7 @@ classifiers = [ "Operating System :: OS Independent", ] dependencies = [ - "autogen-core==0.4.0.dev9", + "autogen-core==0.4.0.dev11", ] @@ -24,18 +24,24 @@ langchain = ["langchain_core~= 0.3.3"] azure = ["azure-core", "azure-identity"] docker = ["docker~=7.0"] openai = ["openai>=1.3", "aiofiles"] -file-surfer = ["markitdown>=0.0.1a2"] +file-surfer = [ + "autogen-agentchat==0.4.0.dev11", + "markitdown>=0.0.1a2", +] web-surfer = [ + "autogen-agentchat==0.4.0.dev11", "playwright>=1.48.0", "pillow>=11.0.0", + "markitdown>=0.0.1a2", ] magentic-one = [ + "autogen-agentchat==0.4.0.dev11", "markitdown>=0.0.1a2", "playwright>=1.48.0", "pillow>=11.0.0", ] video-surfer = [ - "autogen-agentchat==0.4.0.dev9", + "autogen-agentchat==0.4.0.dev11", "opencv-python>=4.5", "ffmpeg-python", "openai-whisper", @@ -72,7 +78,11 @@ testpaths = ["tests"] include = "../../shared_tasks.toml" [tool.poe.tasks] -test = "pytest -n auto" +test.sequence = [ + "playwright install", + "pytest -n auto", +] +test.default_item_type = "cmd" mypy = "mypy --config-file ../../pyproject.toml --exclude src/autogen_ext/runtimes/grpc/protos --exclude tests/protos src tests" [tool.mypy] diff --git a/python/packages/autogen-ext/src/autogen_ext/agents/file_surfer/_file_surfer.py b/python/packages/autogen-ext/src/autogen_ext/agents/file_surfer/_file_surfer.py index cc60bd8ee42e..00315719f455 100644 --- a/python/packages/autogen-ext/src/autogen_ext/agents/file_surfer/_file_surfer.py +++ b/python/packages/autogen-ext/src/autogen_ext/agents/file_surfer/_file_surfer.py @@ -10,7 +10,7 @@ TextMessage, ) from autogen_core import CancellationToken, FunctionCall -from autogen_core.components.models import ( +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, LLMMessage, diff --git a/python/packages/autogen-ext/src/autogen_ext/agents/file_surfer/_tool_definitions.py b/python/packages/autogen-ext/src/autogen_ext/agents/file_surfer/_tool_definitions.py index b4c8ad9011a2..462061d14428 100644 --- a/python/packages/autogen-ext/src/autogen_ext/agents/file_surfer/_tool_definitions.py +++ b/python/packages/autogen-ext/src/autogen_ext/agents/file_surfer/_tool_definitions.py @@ -1,4 +1,4 @@ -from autogen_core.components.tools import ParametersSchema, ToolSchema +from autogen_core.tools import ParametersSchema, ToolSchema TOOL_OPEN_PATH = ToolSchema( name="open_path", diff --git a/python/packages/autogen-ext/src/autogen_ext/agents/magentic_one/_magentic_one_coder_agent.py b/python/packages/autogen-ext/src/autogen_ext/agents/magentic_one/_magentic_one_coder_agent.py index 6a4908e77cff..d0a2a3369e57 100644 --- a/python/packages/autogen-ext/src/autogen_ext/agents/magentic_one/_magentic_one_coder_agent.py +++ b/python/packages/autogen-ext/src/autogen_ext/agents/magentic_one/_magentic_one_coder_agent.py @@ -1,5 +1,5 @@ from autogen_agentchat.agents import AssistantAgent -from autogen_core.components.models import ( +from autogen_core.models import ( ChatCompletionClient, ) diff --git a/python/packages/autogen-ext/src/autogen_ext/agents/openai/_openai_assistant_agent.py b/python/packages/autogen-ext/src/autogen_ext/agents/openai/_openai_assistant_agent.py index 183ff3069267..4e16d7001d6c 100644 --- a/python/packages/autogen-ext/src/autogen_ext/agents/openai/_openai_assistant_agent.py +++ b/python/packages/autogen-ext/src/autogen_ext/agents/openai/_openai_assistant_agent.py @@ -33,8 +33,8 @@ ToolCallResultMessage, ) from autogen_core import CancellationToken, FunctionCall -from autogen_core.components.models._types import FunctionExecutionResult -from autogen_core.components.tools import FunctionTool, Tool +from autogen_core.models._types import FunctionExecutionResult +from autogen_core.tools import FunctionTool, Tool _has_openai_dependencies: bool = True try: diff --git a/python/packages/autogen-ext/src/autogen_ext/agents/video_surfer/_video_surfer.py b/python/packages/autogen-ext/src/autogen_ext/agents/video_surfer/_video_surfer.py index 84daaf2b9841..455c8b74993e 100644 --- a/python/packages/autogen-ext/src/autogen_ext/agents/video_surfer/_video_surfer.py +++ b/python/packages/autogen-ext/src/autogen_ext/agents/video_surfer/_video_surfer.py @@ -1,8 +1,8 @@ from typing import Any, Awaitable, Callable, List, Optional from autogen_agentchat.agents import AssistantAgent -from autogen_core.components.models import ChatCompletionClient -from autogen_core.components.tools import Tool +from autogen_core.models import ChatCompletionClient +from autogen_core.tools import Tool from .tools import ( extract_audio, @@ -42,7 +42,7 @@ class VideoSurfer(AssistantAgent): from autogen_agentchat.ui import Console from autogen_agentchat.conditions import TextMentionTermination from autogen_agentchat.teams import RoundRobinGroupChat - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_ext.agents.video_surfer import VideoSurfer async def main() -> None: @@ -76,7 +76,7 @@ async def main() -> None: from autogen_agentchat.ui import Console from autogen_agentchat.teams import MagenticOneGroupChat from autogen_agentchat.agents import UserProxyAgent - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_ext.agents.video_surfer import VideoSurfer async def main() -> None: diff --git a/python/packages/autogen-ext/src/autogen_ext/agents/video_surfer/tools.py b/python/packages/autogen-ext/src/autogen_ext/agents/video_surfer/tools.py index 395daacb575b..e61542cd9736 100644 --- a/python/packages/autogen-ext/src/autogen_ext/agents/video_surfer/tools.py +++ b/python/packages/autogen-ext/src/autogen_ext/agents/video_surfer/tools.py @@ -6,7 +6,7 @@ import numpy as np import whisper from autogen_core import Image as AGImage -from autogen_core.components.models import ( +from autogen_core.models import ( ChatCompletionClient, UserMessage, ) diff --git a/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/__init__.py b/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/__init__.py index 3030f7f8b148..5b3efc93d841 100644 --- a/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/__init__.py +++ b/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/__init__.py @@ -1,3 +1,4 @@ from ._multimodal_web_surfer import MultimodalWebSurfer +from .playwright_controller import PlaywrightController -__all__ = ["MultimodalWebSurfer"] +__all__ = ["MultimodalWebSurfer", "PlaywrightController"] diff --git a/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_multimodal_web_surfer.py b/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_multimodal_web_surfer.py index de8c403ebf27..16eeab9bba82 100644 --- a/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_multimodal_web_surfer.py +++ b/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_multimodal_web_surfer.py @@ -9,29 +9,28 @@ import traceback from typing import ( Any, + AsyncGenerator, BinaryIO, Dict, List, Optional, Sequence, - Tuple, cast, ) - -# Any, Callable, Dict, List, Literal, Tuple -from urllib.parse import quote_plus # parse_qs, quote, unquote, urlparse, urlunparse +from urllib.parse import quote_plus import aiofiles import PIL.Image from autogen_agentchat.agents import BaseChatAgent from autogen_agentchat.base import Response -from autogen_agentchat.messages import ChatMessage, MultiModalMessage, TextMessage +from autogen_agentchat.messages import AgentMessage, ChatMessage, MultiModalMessage, TextMessage from autogen_core import EVENT_LOGGER_NAME, CancellationToken, FunctionCall from autogen_core import Image as AGImage -from autogen_core.components.models import ( +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, LLMMessage, + RequestUsage, SystemMessage, UserMessage, ) @@ -39,7 +38,6 @@ from playwright.async_api import BrowserContext, Download, Page, Playwright, async_playwright from ._events import WebSurferEvent -from ._playwright_controller import PlaywrightController from ._prompts import WEB_SURFER_OCR_PROMPT, WEB_SURFER_QA_PROMPT, WEB_SURFER_QA_SYSTEM_MESSAGE, WEB_SURFER_TOOL_PROMPT from ._set_of_mark import add_set_of_mark from ._tool_definitions import ( @@ -49,8 +47,6 @@ TOOL_PAGE_DOWN, TOOL_PAGE_UP, TOOL_READ_PAGE_AND_ANSWER, - # TOOL_SCROLL_ELEMENT_DOWN, - # TOOL_SCROLL_ELEMENT_UP, TOOL_SLEEP, TOOL_SUMMARIZE_PAGE, TOOL_TYPE, @@ -59,67 +55,141 @@ ) from ._types import InteractiveRegion, UserContent from ._utils import message_content_to_str +from .playwright_controller import PlaywrightController + -# Viewport dimensions -VIEWPORT_HEIGHT = 900 -VIEWPORT_WIDTH = 1440 +class MultimodalWebSurfer(BaseChatAgent): + """ + MultimodalWebSurfer is a multimodal agent that acts as a web surfer that can search the web and visit web pages. -# Size of the image we send to the MLM -# Current values represent a 0.85 scaling to fit within the GPT-4v short-edge constraints (768px) -MLM_HEIGHT = 765 -MLM_WIDTH = 1224 + It launches a chromium browser and allows the playwright to interact with the web browser and can perform a variety of actions. The browser is launched on the first call to the agent and is reused for subsequent calls. -SCREENSHOT_TOKENS = 1105 + It must be used with a multimodal model client that supports function/tool calling, ideally GPT-4o currently. -class MultimodalWebSurfer(BaseChatAgent): - """(In preview) A multimodal agent that acts as a web surfer that can search the web and visit web pages.""" + When :meth:`on_messages` or :meth:`on_messages_stream` is called, the following occurs: + 1) If this is the first call, the browser is initialized and the page is loaded. This is done in :meth:`_lazy_init`. The browser is only closed when :meth:`close` is called. + 2) The method :meth:`_generate_reply` is called, which then creates the final response as below. + 3) The agent takes a screenshot of the page, extracts the interactive elements, and prepares a set-of-mark screenshot with bounding boxes around the interactive elements. + 4) The agent makes a call to the :attr:`model_client` with the SOM screenshot, history of messages, and the list of available tools. + - If the model returns a string, the agent returns the string as the final response. + - If the model returns a list of tool calls, the agent executes the tool calls with :meth:`_execute_tool` using :attr:`_playwright_controller`. + - The agent returns a final response which includes a screenshot of the page, page metadata, description of the action taken and the inner text of the webpage. + 5) If at any point the agent encounters an error, it returns the error message as the final response. + + + .. note:: + Please note that using the MultimodalWebSurfer involves interacting with a digital world designed for humans, which carries inherent risks. + Be aware that agents may occasionally attempt risky actions, such as recruiting humans for help or accepting cookie agreements without human involvement. Always ensure agents are monitored and operate within a controlled environment to prevent unintended consequences. + Moreover, be cautious that MultimodalWebSurfer may be susceptible to prompt injection attacks from webpages. + + Args: + name (str): The name of the agent. + model_client (ChatCompletionClient): The model client used by the agent. Must be multimodal and support function calling. + downloads_folder (str, optional): The folder where downloads are saved. Defaults to None, no downloads are saved. + description (str, optional): The description of the agent. Defaults to MultimodalWebSurfer.DEFAULT_DESCRIPTION. + debug_dir (str, optional): The directory where debug information is saved. Defaults to None. + headless (bool, optional): Whether the browser should be headless. Defaults to True. + start_page (str, optional): The start page for the browser. Defaults to MultimodalWebSurfer.DEFAULT_START_PAGE. + animate_actions (bool, optional): Whether to animate actions. Defaults to False. + to_save_screenshots (bool, optional): Whether to save screenshots. Defaults to False. + use_ocr (bool, optional): Whether to use OCR. Defaults to True. + browser_channel (str, optional): The browser channel. Defaults to None. + browser_data_dir (str, optional): The browser data directory. Defaults to None. + to_resize_viewport (bool, optional): Whether to resize the viewport. Defaults to True. + playwright (Playwright, optional): The playwright instance. Defaults to None. + context (BrowserContext, optional): The browser context. Defaults to None. + + + + + Example usage: + + The following example demonstrates how to create a web surfing agent with + a model client and run it for multiple turns. + + .. code-block:: python - DEFAULT_DESCRIPTION = "A helpful assistant with access to a web browser. Ask them to perform web searches, open pages, and interact with content (e.g., clicking links, scrolling the viewport, etc., filling in form fields, etc.) It can also summarize the entire page, or answer questions based on the content of the page. It can also be asked to sleep and wait for pages to load, in cases where the pages seem to be taking a while to load." + import asyncio + from autogen_agentchat.ui import Console + from autogen_agentchat.teams import RoundRobinGroupChat + from autogen_ext.models.openai import OpenAIChatCompletionClient + from autogen_ext.agents.web_surfer import MultimodalWebSurfer + + + async def main() -> None: + # Define an agent + web_surfer_agent = MultimodalWebSurfer( + name="MultimodalWebSurfer", + model_client=OpenAIChatCompletionClient(model="gpt-4o-2024-08-06"), + ) + + # Define a team + agent_team = RoundRobinGroupChat([web_surfer_agent], max_turns=3) + + # Run the team and stream messages to the console + stream = agent_team.run_stream(task="Navigate to the AutoGen readme on GitHub.") + await Console(stream) + # Close the browser controlled by the agent + await web_surfer_agent.close() + + + asyncio.run(main()) + """ + + DEFAULT_DESCRIPTION = """ + A helpful assistant with access to a web browser. + Ask them to perform web searches, open pages, and interact with content (e.g., clicking links, scrolling the viewport, etc., filling in form fields, etc.). + It can also summarize the entire page, or answer questions based on the content of the page. + It can also be asked to sleep and wait for pages to load, in cases where the pages seem to be taking a while to load. + """ DEFAULT_START_PAGE = "https://www.bing.com/" + # Viewport dimensions + VIEWPORT_HEIGHT = 900 + VIEWPORT_WIDTH = 1440 + + # Size of the image we send to the MLM + # Current values represent a 0.85 scaling to fit within the GPT-4v short-edge constraints (768px) + MLM_HEIGHT = 765 + MLM_WIDTH = 1224 + + SCREENSHOT_TOKENS = 1105 + def __init__( self, name: str, model_client: ChatCompletionClient, + downloads_folder: str | None = None, description: str = DEFAULT_DESCRIPTION, + debug_dir: str | None = None, headless: bool = True, - browser_channel: str | None = None, - browser_data_dir: str | None = None, - start_page: str | None = None, - downloads_folder: str | None = None, - debug_dir: str | None = os.getcwd(), - to_save_screenshots: bool = False, + start_page: str | None = DEFAULT_START_PAGE, animate_actions: bool = False, + to_save_screenshots: bool = False, use_ocr: bool = True, + browser_channel: str | None = None, + browser_data_dir: str | None = None, to_resize_viewport: bool = True, playwright: Playwright | None = None, context: BrowserContext | None = None, ): """ Initialize the MultimodalWebSurfer. - - Args: - name (str): The agent's name - model_client (ChatCompletionClient): The model to use (must be multi-modal) - description (str): The agent's description used by the team. Defaults to DEFAULT_DESCRIPTION - headless (bool): Whether to run the browser in headless mode. Defaults to True. - browser_channel (str | type[DEFAULT_CHANNEL]): The browser channel to use. Defaults to DEFAULT_CHANNEL. - browser_data_dir (str | None): The directory to store browser data. Defaults to None. - start_page (str | None): The initial page to visit. Defaults to DEFAULT_START_PAGE. - downloads_folder (str | None): The folder to save downloads. Defaults to None. - debug_dir (str | None): The directory to save debug information. Defaults to the current working directory. - to_save_screenshots (bool): Whether to save screenshots. Defaults to False. - animate_actions (bool): Whether to animate actions. Defaults to False. - use_ocr (bool): Whether to use OCR to extract text from screenshots, otherwise extract text from page. Defaults to True. - to_resize_viewport (bool): Whether to resize the viewport. Defaults to True. - playwright (Playwright | None): The playwright instance to use. Defaults to None and creates a new one. - context (BrowserContext | None): The browser context to use. Defaults to None and creates a new one. """ super().__init__(name, description) + if debug_dir is None and to_save_screenshots: + raise ValueError( + "Cannot save screenshots without a debug directory. Set it using the 'debug_dir' parameter. The debug directory is created if it does not exist." + ) + if model_client.capabilities["function_calling"] is False: + raise ValueError( + "The model does not support function calling. MultimodalWebSurfer requires a model that supports function calling." + ) + if model_client.capabilities["vision"] is False: + raise ValueError("The model is not multimodal. MultimodalWebSurfer requires a multimodal model.") self._model_client = model_client - self.headless = headless self.browser_channel = browser_channel self.browser_data_dir = browser_data_dir @@ -150,8 +220,8 @@ def _download_handler(download: Download) -> None: self._playwright_controller = PlaywrightController( animate_actions=self.animate_actions, downloads_folder=self.downloads_folder, - viewport_width=VIEWPORT_WIDTH, - viewport_height=VIEWPORT_HEIGHT, + viewport_width=self.VIEWPORT_WIDTH, + viewport_height=self.VIEWPORT_HEIGHT, _download_handler=self._download_handler, to_resize_viewport=self.to_resize_viewport, ) @@ -166,68 +236,15 @@ def _download_handler(download: Download) -> None: TOOL_SLEEP, TOOL_HOVER, ] - self.did_lazy_init = False - - @property - def produced_message_types(self) -> List[type[ChatMessage]]: - return [MultiModalMessage] - - async def on_messages(self, messages: Sequence[ChatMessage], cancellation_token: CancellationToken) -> Response: - for chat_message in messages: - if isinstance(chat_message, TextMessage | MultiModalMessage): - self._chat_history.append(UserMessage(content=chat_message.content, source=chat_message.source)) - else: - raise ValueError(f"Unexpected message in MultiModalWebSurfer: {chat_message}") - - try: - _, content = await self.__generate_reply(cancellation_token=cancellation_token) - self._chat_history.append(AssistantMessage(content=message_content_to_str(content), source=self.name)) - if isinstance(content, str): - return Response(chat_message=TextMessage(content=content, source=self.name)) - else: - return Response(chat_message=MultiModalMessage(content=content, source=self.name)) - - except BaseException: - content = f"Web surfing error:\n\n{traceback.format_exc()}" - self._chat_history.append(AssistantMessage(content=content, source=self.name)) - return Response(chat_message=TextMessage(content=content, source=self.name)) - - async def on_reset(self, cancellation_token: CancellationToken) -> None: - if not self.did_lazy_init: - return - assert self._page is not None - - self._chat_history.clear() - reset_prior_metadata, reset_last_download = await self._playwright_controller.visit_page( - self._page, self.start_page - ) - if reset_last_download and self._last_download is not None: - self._last_download = None - if reset_prior_metadata and self._prior_metadata_hash is not None: - self._prior_metadata_hash = None - if self.to_save_screenshots: - current_timestamp = "_" + int(time.time()).__str__() - screenshot_png_name = "screenshot" + current_timestamp + ".png" - await self._page.screenshot(path=os.path.join(self.debug_dir, screenshot_png_name)) # type: ignore - self.logger.info( - WebSurferEvent( - source=self.name, - url=self._page.url, - message="Screenshot: " + screenshot_png_name, - ) - ) - - self.logger.info( - WebSurferEvent( - source=self.name, - url=self._page.url, - message="Resetting browser.", - ) - ) + self.n_lines_page_text = 50 # Number of lines of text to extract from the page in the absence of OCR + self.did_lazy_init = False # flag to check if we have initialized the browser async def _lazy_init( self, ) -> None: + """ + On the first call, we initialize the browser and the page. + """ self._last_download = None self._prior_metadata_hash = None @@ -257,7 +274,7 @@ async def _lazy_init( # self._page.route(lambda x: True, self._route_handler) self._page.on("download", self._download_handler) if self.to_resize_viewport: - await self._page.set_viewport_size({"width": VIEWPORT_WIDTH, "height": VIEWPORT_HEIGHT}) + await self._page.set_viewport_size({"width": self.VIEWPORT_WIDTH, "height": self.VIEWPORT_HEIGHT}) await self._page.add_init_script( path=os.path.join(os.path.abspath(os.path.dirname(__file__)), "page_script.js") ) @@ -268,9 +285,23 @@ async def _lazy_init( await self._set_debug_dir(self.debug_dir) self.did_lazy_init = True + async def close(self) -> None: + """ + Close the browser and the page. + Should be called when the agent is no longer needed. + """ + if self._page is not None: + await self._page.close() + self._page = None + if self._context is not None: + await self._context.close() + self._context = None + if self._playwright is not None: + await self._playwright.stop() + self._playwright = None + async def _set_debug_dir(self, debug_dir: str | None) -> None: assert self._page is not None - self.debug_dir = debug_dir if self.debug_dir is None: return @@ -289,33 +320,202 @@ async def _set_debug_dir(self, debug_dir: str | None) -> None: ) ) - def _target_name(self, target: str, rects: Dict[str, InteractiveRegion]) -> str | None: + @property + def produced_message_types(self) -> List[type[ChatMessage]]: + return [MultiModalMessage] + + async def on_reset(self, cancellation_token: CancellationToken) -> None: + if not self.did_lazy_init: + return + assert self._page is not None + + self._chat_history.clear() + reset_prior_metadata, reset_last_download = await self._playwright_controller.visit_page( + self._page, self.start_page + ) + if reset_last_download and self._last_download is not None: + self._last_download = None + if reset_prior_metadata and self._prior_metadata_hash is not None: + self._prior_metadata_hash = None + if self.to_save_screenshots: + current_timestamp = "_" + int(time.time()).__str__() + screenshot_png_name = "screenshot" + current_timestamp + ".png" + await self._page.screenshot(path=os.path.join(self.debug_dir, screenshot_png_name)) # type: ignore + self.logger.info( + WebSurferEvent( + source=self.name, + url=self._page.url, + message="Screenshot: " + screenshot_png_name, + ) + ) + + self.logger.info( + WebSurferEvent( + source=self.name, + url=self._page.url, + message="Resetting browser.", + ) + ) + + async def on_messages(self, messages: Sequence[ChatMessage], cancellation_token: CancellationToken) -> Response: + async for message in self.on_messages_stream(messages, cancellation_token): + if isinstance(message, Response): + return message + raise AssertionError("The stream should have returned the final result.") + + async def on_messages_stream( + self, messages: Sequence[ChatMessage], cancellation_token: CancellationToken + ) -> AsyncGenerator[AgentMessage | Response, None]: + for chat_message in messages: + if isinstance(chat_message, TextMessage | MultiModalMessage): + self._chat_history.append(UserMessage(content=chat_message.content, source=chat_message.source)) + else: + raise ValueError(f"Unexpected message in MultiModalWebSurfer: {chat_message}") + self.inner_messages: List[AgentMessage] = [] + self.model_usage: List[RequestUsage] = [] try: - return rects[target]["aria_name"].strip() - except KeyError: - return None + content = await self._generate_reply(cancellation_token=cancellation_token) + self._chat_history.append(AssistantMessage(content=message_content_to_str(content), source=self.name)) + final_usage = RequestUsage( + prompt_tokens=sum([u.prompt_tokens for u in self.model_usage]), + completion_tokens=sum([u.completion_tokens for u in self.model_usage]), + ) + if isinstance(content, str): + yield Response( + chat_message=TextMessage(content=content, source=self.name, models_usage=final_usage), + inner_messages=self.inner_messages, + ) + else: + yield Response( + chat_message=MultiModalMessage(content=content, source=self.name, models_usage=final_usage), + inner_messages=self.inner_messages, + ) - def _format_target_list(self, ids: List[str], rects: Dict[str, InteractiveRegion]) -> List[str]: - targets: List[str] = [] - for r in list(set(ids)): - if r in rects: - # Get the role - aria_role = rects[r].get("role", "").strip() - if len(aria_role) == 0: - aria_role = rects[r].get("tag_name", "").strip() + except BaseException: + content = f"Web surfing error:\n\n{traceback.format_exc()}" + self._chat_history.append(AssistantMessage(content=content, source=self.name)) + yield Response(chat_message=TextMessage(content=content, source=self.name)) - # Get the name - aria_name = re.sub(r"[\n\r]+", " ", rects[r].get("aria_name", "")).strip() + async def _generate_reply(self, cancellation_token: CancellationToken) -> UserContent: + """Generates the actual reply. First calls the LLM to figure out which tool to use, then executes the tool.""" - # What are the actions? - actions = ['"click", "hover"'] - if rects[r]["role"] in ["textbox", "searchbox", "search"]: - actions = ['"input_text"'] - actions_str = "[" + ",".join(actions) + "]" + # Lazy init, initialize the browser and the page on the first generate reply only + if not self.did_lazy_init: + await self._lazy_init() - targets.append(f'{{"id": {r}, "name": "{aria_name}", "role": "{aria_role}", "tools": {actions_str} }}') + assert self._page is not None - return targets + # Clone the messages to give context, removing old screenshots + history: List[LLMMessage] = [] + for m in self._chat_history: + assert isinstance(m, UserMessage | AssistantMessage | SystemMessage) + assert isinstance(m.content, str | list) + + if isinstance(m.content, str): + history.append(m) + else: + content = message_content_to_str(m.content) + if isinstance(m, UserMessage): + history.append(UserMessage(content=content, source=m.source)) + elif isinstance(m, AssistantMessage): + history.append(AssistantMessage(content=content, source=m.source)) + elif isinstance(m, SystemMessage): + history.append(SystemMessage(content=content)) + + # Ask the page for interactive elements, then prepare the state-of-mark screenshot + rects = await self._playwright_controller.get_interactive_rects(self._page) + viewport = await self._playwright_controller.get_visual_viewport(self._page) + screenshot = await self._page.screenshot() + som_screenshot, visible_rects, rects_above, rects_below = add_set_of_mark(screenshot, rects) + + if self.to_save_screenshots: + current_timestamp = "_" + int(time.time()).__str__() + screenshot_png_name = "screenshot_som" + current_timestamp + ".png" + som_screenshot.save(os.path.join(self.debug_dir, screenshot_png_name)) # type: ignore + self.logger.info( + WebSurferEvent( + source=self.name, + url=self._page.url, + message="Screenshot: " + screenshot_png_name, + ) + ) + # What tools are available? + tools = self.default_tools.copy() + + # We can scroll up + if viewport["pageTop"] > 5: + tools.append(TOOL_PAGE_UP) + + # Can scroll down + if (viewport["pageTop"] + viewport["height"] + 5) < viewport["scrollHeight"]: + tools.append(TOOL_PAGE_DOWN) + + # Focus hint + focused = await self._playwright_controller.get_focused_rect_id(self._page) + focused_hint = "" + if focused: + name = self._target_name(focused, rects) + if name: + name = f"(and name '{name}') " + + role = "control" + try: + role = rects[focused]["role"] + except KeyError: + pass + + focused_hint = f"\nThe {role} with ID {focused} {name}currently has the input focus.\n\n" + + # Everything visible + visible_targets = "\n".join(self._format_target_list(visible_rects, rects)) + "\n\n" + + # Everything else + other_targets: List[str] = [] + other_targets.extend(self._format_target_list(rects_above, rects)) + other_targets.extend(self._format_target_list(rects_below, rects)) + + if len(other_targets) > 0: + other_targets_str = ( + "Additional valid interaction targets (not shown) include:\n" + "\n".join(other_targets) + "\n\n" + ) + else: + other_targets_str = "" + + tool_names = "\n".join([t["name"] for t in tools]) + + text_prompt = WEB_SURFER_TOOL_PROMPT.format( + url=self._page.url, + visible_targets=visible_targets, + other_targets_str=other_targets_str, + focused_hint=focused_hint, + tool_names=tool_names, + ).strip() + + # Scale the screenshot for the MLM, and close the original + scaled_screenshot = som_screenshot.resize((self.MLM_WIDTH, self.MLM_HEIGHT)) + som_screenshot.close() + if self.to_save_screenshots: + scaled_screenshot.save(os.path.join(self.debug_dir, "screenshot_scaled.png")) # type: ignore + + # Add the multimodal message and make the request + history.append(UserMessage(content=[text_prompt, AGImage.from_pil(scaled_screenshot)], source=self.name)) + + response = await self._model_client.create( + history, tools=tools, extra_create_args={"tool_choice": "auto"}, cancellation_token=cancellation_token + ) # , "parallel_tool_calls": False}) + self.model_usage.append(response.usage) + message = response.content + self._last_download = None + if isinstance(message, str): + # Answer directly + self.inner_messages.append(TextMessage(content=message, source=self.name)) + return message + elif isinstance(message, list): + # Take an action + return await self._execute_tool(message, rects, tool_names, cancellation_token=cancellation_token) + else: + # Not sure what happened here + raise AssertionError(f"Unknown response format '{message}'") async def _execute_tool( self, @@ -323,7 +523,8 @@ async def _execute_tool( rects: Dict[str, InteractiveRegion], tool_names: str, cancellation_token: Optional[CancellationToken] = None, - ) -> Tuple[bool, UserContent]: + ) -> UserContent: + # Execute the tool name = message[0].name args = json.loads(message[0].arguments) action_description = "" @@ -337,6 +538,7 @@ async def _execute_tool( message=f"{name}( {json.dumps(args)} )", ) ) + self.inner_messages.append(TextMessage(content=f"{name}( {json.dumps(args)} )", source=self.name)) if name == "visit_url": url = args.get("url") @@ -435,11 +637,11 @@ async def _execute_tool( question = str(args.get("question")) action_description = f"I answered the following question '{question}' based on the web page." # Do Q&A on the DOM. No need to take further action. Browser state does not change. - return False, await self._summarize_page(question=question, cancellation_token=cancellation_token) + return await self._summarize_page(question=question, cancellation_token=cancellation_token) elif name == "summarize_page": # Summarize the DOM. No need to take further action. Browser state does not change. action_description = "I summarized the current web page" - return False, await self._summarize_page(cancellation_token=cancellation_token) + return await self._summarize_page(cancellation_token=cancellation_token) elif name == "hover": target_id = str(args.get("target_id")) @@ -452,18 +654,17 @@ async def _execute_tool( elif name == "sleep": action_description = "I am waiting a short period of time before taking further action." - await self._playwright_controller.sleep(self._page, 3) # There's a 2s sleep below too + await self._playwright_controller.sleep(self._page, 3) else: raise ValueError(f"Unknown tool '{name}'. Please choose from:\n\n{tool_names}") await self._page.wait_for_load_state() - await self._playwright_controller.sleep(self._page, 3) # There's a 2s sleep below too + await self._playwright_controller.sleep(self._page, 3) # Handle downloads if self._last_download is not None and self.downloads_folder is not None: fname = os.path.join(self.downloads_folder, self._last_download.suggested_filename) - # TODO: Fix this type await self._last_download.save_as(fname) # type: ignore page_body = f"Download Successful

Successfully downloaded '{self._last_download.suggested_filename}' to local path:

{fname}

" await self._page.goto( @@ -510,158 +711,66 @@ async def _execute_tool( ocr_text = ( await self._get_ocr_text(new_screenshot, cancellation_token=cancellation_token) if self.use_ocr is True - else await self._playwright_controller.get_webpage_text(self._page) + else await self._playwright_controller.get_webpage_text(self._page, n_lines=self.n_lines_page_text) ) # Return the complete observation - message_content = "" # message.content or "" page_title = await self._page.title() + message_content = f"{action_description}\n\n Here is a screenshot of the webpage: [{page_title}]({self._page.url}).\n The viewport shows {percent_visible}% of the webpage, and is positioned {position_text} {page_metadata}\n" + if self.use_ocr: + message_content += f"Automatic OCR of the page screenshot has detected the following text:\n\n{ocr_text}" + else: + message_content += f"The first {self.n_lines_page_text} lines of the page text is:\n\n{ocr_text}" - return False, [ - f"{message_content}\n\n{action_description}\n\nHere is a screenshot of [{page_title}]({self._page.url}). The viewport shows {percent_visible}% of the webpage, and is positioned {position_text}.{page_metadata}\nAutomatic OCR of the page screenshot has detected the following text:\n\n{ocr_text}".strip(), + return [ + message_content, AGImage.from_pil(PIL.Image.open(io.BytesIO(new_screenshot))), ] - async def __generate_reply(self, cancellation_token: CancellationToken) -> Tuple[bool, UserContent]: - """Generates the actual reply. First calls the LLM to figure out which tool to use, then executes the tool.""" - - # Lazy init - if not self.did_lazy_init: - await self._lazy_init() - - assert self._page is not None - - # Clone the messages to give context, removing old screenshots - history: List[LLMMessage] = [] - for m in self._chat_history: - assert isinstance(m, UserMessage | AssistantMessage | SystemMessage) - assert isinstance(m.content, str | list) - - if isinstance(m.content, str): - history.append(m) - else: - content = message_content_to_str(m.content) - if isinstance(m, UserMessage): - history.append(UserMessage(content=content, source=m.source)) - elif isinstance(m, AssistantMessage): - history.append(AssistantMessage(content=content, source=m.source)) - elif isinstance(m, SystemMessage): - history.append(SystemMessage(content=content)) - - # Ask the page for interactive elements, then prepare the state-of-mark screenshot - rects = await self._playwright_controller.get_interactive_rects(self._page) - viewport = await self._playwright_controller.get_visual_viewport(self._page) - screenshot = await self._page.screenshot() - som_screenshot, visible_rects, rects_above, rects_below = add_set_of_mark(screenshot, rects) - - if self.to_save_screenshots: - current_timestamp = "_" + int(time.time()).__str__() - screenshot_png_name = "screenshot_som" + current_timestamp + ".png" - som_screenshot.save(os.path.join(self.debug_dir, screenshot_png_name)) # type: ignore - self.logger.info( - WebSurferEvent( - source=self.name, - url=self._page.url, - message="Screenshot: " + screenshot_png_name, - ) - ) - # What tools are available? - tools = self.default_tools.copy() - - # We can scroll up - if viewport["pageTop"] > 5: - tools.append(TOOL_PAGE_UP) - - # Can scroll down - if (viewport["pageTop"] + viewport["height"] + 5) < viewport["scrollHeight"]: - tools.append(TOOL_PAGE_DOWN) - - # Focus hint - focused = await self._playwright_controller.get_focused_rect_id(self._page) - focused_hint = "" - if focused: - name = self._target_name(focused, rects) - if name: - name = f"(and name '{name}') " - - role = "control" - try: - role = rects[focused]["role"] - except KeyError: - pass - - focused_hint = f"\nThe {role} with ID {focused} {name}currently has the input focus.\n\n" - - # Everything visible - visible_targets = "\n".join(self._format_target_list(visible_rects, rects)) + "\n\n" - - # Everything else - other_targets: List[str] = [] - other_targets.extend(self._format_target_list(rects_above, rects)) - other_targets.extend(self._format_target_list(rects_below, rects)) - - if len(other_targets) > 0: - other_targets_str = ( - "Additional valid interaction targets (not shown) include:\n" + "\n".join(other_targets) + "\n\n" - ) - else: - other_targets_str = "" - - # If there are scrollable elements, then add the corresponding tools - # has_scrollable_elements = False - # if has_scrollable_elements: - # tools.append(TOOL_SCROLL_ELEMENT_UP) - # tools.append(TOOL_SCROLL_ELEMENT_DOWN) - - tool_names = "\n".join([t["name"] for t in tools]) + def _target_name(self, target: str, rects: Dict[str, InteractiveRegion]) -> str | None: + try: + return rects[target]["aria_name"].strip() + except KeyError: + return None - text_prompt = WEB_SURFER_TOOL_PROMPT.format( - url=self._page.url, - visible_targets=visible_targets, - other_targets_str=other_targets_str, - focused_hint=focused_hint, - tool_names=tool_names, - ).strip() + def _format_target_list(self, ids: List[str], rects: Dict[str, InteractiveRegion]) -> List[str]: + """ + Format the list of targets in the webpage as a string to be used in the agent's prompt. + """ + targets: List[str] = [] + for r in list(set(ids)): + if r in rects: + # Get the role + aria_role = rects[r].get("role", "").strip() + if len(aria_role) == 0: + aria_role = rects[r].get("tag_name", "").strip() - # Scale the screenshot for the MLM, and close the original - scaled_screenshot = som_screenshot.resize((MLM_WIDTH, MLM_HEIGHT)) - som_screenshot.close() - if self.to_save_screenshots: - scaled_screenshot.save(os.path.join(self.debug_dir, "screenshot_scaled.png")) # type: ignore + # Get the name + aria_name = re.sub(r"[\n\r]+", " ", rects[r].get("aria_name", "")).strip() - # Add the multimodal message and make the request - history.append(UserMessage(content=[text_prompt, AGImage.from_pil(scaled_screenshot)], source=self.name)) + # What are the actions? + actions = ['"click", "hover"'] + if rects[r]["role"] in ["textbox", "searchbox", "search"]: + actions = ['"input_text"'] + actions_str = "[" + ",".join(actions) + "]" - response = await self._model_client.create( - history, tools=tools, extra_create_args={"tool_choice": "auto"}, cancellation_token=cancellation_token - ) # , "parallel_tool_calls": False}) - message = response.content - self._last_download = None + targets.append(f'{{"id": {r}, "name": "{aria_name}", "role": "{aria_role}", "tools": {actions_str} }}') - if isinstance(message, str): - # Answer directly - return False, message - elif isinstance(message, list): - # Take an action - return await self._execute_tool(message, rects, tool_names, cancellation_token=cancellation_token) - else: - # Not sure what happened here - raise AssertionError(f"Unknown response format '{message}'") + return targets async def _get_ocr_text( self, image: bytes | io.BufferedIOBase | PIL.Image.Image, cancellation_token: Optional[CancellationToken] = None ) -> str: scaled_screenshot = None if isinstance(image, PIL.Image.Image): - scaled_screenshot = image.resize((MLM_WIDTH, MLM_HEIGHT)) + scaled_screenshot = image.resize((self.MLM_WIDTH, self.MLM_HEIGHT)) else: pil_image = None if not isinstance(image, io.BufferedIOBase): pil_image = PIL.Image.open(io.BytesIO(image)) else: - # TODO: Not sure why this cast was needed, but by this point screenshot is a binary file-like object pil_image = PIL.Image.open(cast(BinaryIO, image)) - scaled_screenshot = pil_image.resize((MLM_WIDTH, MLM_HEIGHT)) + scaled_screenshot = pil_image.resize((self.MLM_WIDTH, self.MLM_HEIGHT)) pil_image.close() # Add the multimodal message and make the request @@ -676,6 +785,7 @@ async def _get_ocr_text( ) ) response = await self._model_client.create(messages, cancellation_token=cancellation_token) + self.model_usage.append(response.usage) scaled_screenshot.close() assert isinstance(response.content, str) return response.content @@ -697,7 +807,7 @@ async def _summarize_page( # Take a screenshot and scale it screenshot = Image.open(io.BytesIO(await self._page.screenshot())) - scaled_screenshot = screenshot.resize((MLM_WIDTH, MLM_HEIGHT)) + scaled_screenshot = screenshot.resize((self.MLM_WIDTH, self.MLM_HEIGHT)) screenshot.close() ag_image = AGImage.from_pil(scaled_screenshot) @@ -718,7 +828,7 @@ async def _summarize_page( ) remaining = self._model_client.remaining_tokens(messages + [message]) - if remaining > SCREENSHOT_TOKENS: + if remaining > self.SCREENSHOT_TOKENS: buffer += line else: break @@ -741,6 +851,7 @@ async def _summarize_page( # Generate the response response = await self._model_client.create(messages, cancellation_token=cancellation_token) + self.model_usage.append(response.usage) scaled_screenshot.close() assert isinstance(response.content, str) return response.content diff --git a/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_tool_definitions.py b/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_tool_definitions.py index 5d54d5ff1238..fd2928248596 100644 --- a/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_tool_definitions.py +++ b/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_tool_definitions.py @@ -1,6 +1,6 @@ from typing import Any, Dict -from autogen_core.components.tools._base import ParametersSchema, ToolSchema +from autogen_core.tools._base import ParametersSchema, ToolSchema def _load_tool(tooldef: Dict[str, Any]) -> ToolSchema: diff --git a/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_types.py b/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_types.py index a3b1cf6c5e65..d626b086961d 100644 --- a/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_types.py +++ b/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_types.py @@ -1,7 +1,7 @@ from typing import Any, Dict, List, TypedDict, Union from autogen_core import FunctionCall, Image -from autogen_core.components.models import FunctionExecutionResult +from autogen_core.models import FunctionExecutionResult UserContent = Union[str, List[Union[str, Image]]] AssistantContent = Union[str, List[FunctionCall]] diff --git a/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_playwright_controller.py b/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/playwright_controller.py similarity index 69% rename from python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_playwright_controller.py rename to python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/playwright_controller.py index 162980af1c74..d691826a45ee 100644 --- a/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/_playwright_controller.py +++ b/python/packages/autogen-ext/src/autogen_ext/agents/web_surfer/playwright_controller.py @@ -1,9 +1,15 @@ import asyncio import base64 +import io import os import random from typing import Any, Callable, Dict, Optional, Tuple, Union, cast +# TODO: Fix unfollowed import +try: + from markitdown import MarkItDown # type: ignore +except ImportError: + MarkItDown = None from playwright._impl._errors import Error as PlaywrightError from playwright._impl._errors import TimeoutError from playwright.async_api import Download, Page @@ -17,24 +23,36 @@ class PlaywrightController: + """ + A helper class to allow Playwright to interact with web pages to perform actions such as clicking, filling, and scrolling. + + Args: + downloads_folder (str | None): The folder to save downloads to. If None, downloads are not saved. + animate_actions (bool): Whether to animate the actions (create fake cursor to click). + viewport_width (int): The width of the viewport. + viewport_height (int): The height of the viewport. + _download_handler (Optional[Callable[[Download], None]]): A function to handle downloads. + to_resize_viewport (bool): Whether to resize the viewport + """ + def __init__( self, + downloads_folder: str | None = None, animate_actions: bool = False, - downloads_folder: Optional[str] = None, viewport_width: int = 1440, viewport_height: int = 900, _download_handler: Optional[Callable[[Download], None]] = None, to_resize_viewport: bool = True, ) -> None: """ - A controller for Playwright to interact with web pages. - animate_actions: If True, actions will be animated. - downloads_folder: The folder to save downloads to. - viewport_width: The width of the viewport. - viewport_height: The height of the viewport. - _download_handler: A handler for downloads. - to_resize_viewport: If True, the viewport will be resized. + Initialize the PlaywrightController. """ + assert isinstance(animate_actions, bool) + assert isinstance(viewport_width, int) + assert isinstance(viewport_height, int) + assert viewport_height > 0 + assert viewport_width > 0 + self.animate_actions = animate_actions self.downloads_folder = downloads_folder self.viewport_width = viewport_width @@ -43,16 +61,33 @@ def __init__( self.to_resize_viewport = to_resize_viewport self._page_script: str = "" self.last_cursor_position: Tuple[float, float] = (0.0, 0.0) + self._markdown_converter: Optional[Any] | None = None # Read page_script with open(os.path.join(os.path.abspath(os.path.dirname(__file__)), "page_script.js"), "rt") as fh: self._page_script = fh.read() async def sleep(self, page: Page, duration: Union[int, float]) -> None: + """ + Pause the execution for a specified duration. + + Args: + page (Page): The Playwright page object. + duration (Union[int, float]): The duration to sleep in milliseconds. + """ assert page is not None await page.wait_for_timeout(duration * 1000) async def get_interactive_rects(self, page: Page) -> Dict[str, InteractiveRegion]: + """ + Retrieve interactive regions from the web page. + + Args: + page (Page): The Playwright page object. + + Returns: + Dict[str, InteractiveRegion]: A dictionary of interactive regions. + """ assert page is not None # Read the regions from the DOM try: @@ -71,6 +106,15 @@ async def get_interactive_rects(self, page: Page) -> Dict[str, InteractiveRegion return typed_results async def get_visual_viewport(self, page: Page) -> VisualViewport: + """ + Retrieve the visual viewport of the web page. + + Args: + page (Page): The Playwright page object. + + Returns: + VisualViewport: The visual viewport of the page. + """ assert page is not None try: await page.evaluate(self._page_script) @@ -79,6 +123,15 @@ async def get_visual_viewport(self, page: Page) -> VisualViewport: return visualviewport_from_dict(await page.evaluate("MultimodalWebSurfer.getVisualViewport();")) async def get_focused_rect_id(self, page: Page) -> str: + """ + Retrieve the ID of the currently focused element. + + Args: + page (Page): The Playwright page object. + + Returns: + str: The ID of the focused element. + """ assert page is not None try: await page.evaluate(self._page_script) @@ -88,6 +141,15 @@ async def get_focused_rect_id(self, page: Page) -> str: return str(result) async def get_page_metadata(self, page: Page) -> Dict[str, Any]: + """ + Retrieve metadata from the web page. + + Args: + page (Page): The Playwright page object. + + Returns: + Dict[str, Any]: A dictionary of page metadata. + """ assert page is not None try: await page.evaluate(self._page_script) @@ -98,6 +160,12 @@ async def get_page_metadata(self, page: Page) -> Dict[str, Any]: return cast(Dict[str, Any], result) async def on_new_page(self, page: Page) -> None: + """ + Handle actions to perform on a new page. + + Args: + page (Page): The Playwright page object. + """ assert page is not None page.on("download", self._download_handler) # type: ignore if self.to_resize_viewport and self.viewport_width and self.viewport_height: @@ -107,10 +175,26 @@ async def on_new_page(self, page: Page) -> None: await page.wait_for_load_state() async def back(self, page: Page) -> None: + """ + Navigate back to the previous page. + + Args: + page (Page): The Playwright page object. + """ assert page is not None await page.go_back() async def visit_page(self, page: Page, url: str) -> Tuple[bool, bool]: + """ + Visit a specified URL. + + Args: + page (Page): The Playwright page object. + url (str): The URL to visit. + + Returns: + Tuple[bool, bool]: A tuple indicating whether to reset prior metadata hash and last download. + """ assert page is not None reset_prior_metadata_hash = False reset_last_download = False @@ -143,16 +227,38 @@ async def visit_page(self, page: Page, url: str) -> Tuple[bool, bool]: return reset_prior_metadata_hash, reset_last_download async def page_down(self, page: Page) -> None: + """ + Scroll the page down by one viewport height minus 50 pixels. + + Args: + page (Page): The Playwright page object. + """ assert page is not None await page.evaluate(f"window.scrollBy(0, {self.viewport_height-50});") async def page_up(self, page: Page) -> None: + """ + Scroll the page up by one viewport height minus 50 pixels. + + Args: + page (Page): The Playwright page object. + """ assert page is not None await page.evaluate(f"window.scrollBy(0, -{self.viewport_height-50});") async def gradual_cursor_animation( self, page: Page, start_x: float, start_y: float, end_x: float, end_y: float ) -> None: + """ + Animate the cursor movement gradually from start to end coordinates. + + Args: + page (Page): The Playwright page object. + start_x (float): The starting x-coordinate. + start_y (float): The starting y-coordinate. + end_x (float): The ending x-coordinate. + end_y (float): The ending y-coordinate. + """ # animation helper steps = 20 for step in range(steps): @@ -171,6 +277,13 @@ async def gradual_cursor_animation( self.last_cursor_position = (end_x, end_y) async def add_cursor_box(self, page: Page, identifier: str) -> None: + """ + Add a red cursor box around the element with the given identifier. + + Args: + page (Page): The Playwright page object. + identifier (str): The element identifier. + """ # animation helper await page.evaluate(f""" (function() {{ @@ -199,6 +312,13 @@ async def add_cursor_box(self, page: Page, identifier: str) -> None: """) async def remove_cursor_box(self, page: Page, identifier: str) -> None: + """ + Remove the red cursor box around the element with the given identifier. + + Args: + page (Page): The Playwright page object. + identifier (str): The element identifier. + """ # Remove the highlight and cursor await page.evaluate(f""" (function() {{ @@ -215,7 +335,14 @@ async def remove_cursor_box(self, page: Page, identifier: str) -> None: async def click_id(self, page: Page, identifier: str) -> Page | None: """ - Returns new page if a new page is opened, otherwise None. + Click the element with the given identifier. + + Args: + page (Page): The Playwright page object. + identifier (str): The element identifier. + + Returns: + Page | None: The new page if a new page is opened, otherwise None. """ new_page: Page | None = None assert page is not None @@ -266,7 +393,11 @@ async def click_id(self, page: Page, identifier: str) -> Page | None: async def hover_id(self, page: Page, identifier: str) -> None: """ - Hovers the mouse over the target with the given id. + Hover the mouse over the element with the given identifier. + + Args: + page (Page): The Playwright page object. + identifier (str): The element identifier. """ assert page is not None target = page.locator(f"[__elementId='{identifier}']") @@ -296,7 +427,15 @@ async def hover_id(self, page: Page, identifier: str) -> None: else: await page.mouse.move(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2) - async def fill_id(self, page: Page, identifier: str, value: str) -> None: + async def fill_id(self, page: Page, identifier: str, value: str, press_enter: bool = True) -> None: + """ + Fill the element with the given identifier with the specified value. + + Args: + page (Page): The Playwright page object. + identifier (str): The element identifier. + value (str): The value to fill. + """ assert page is not None target = page.locator(f"[__elementId='{identifier}']") @@ -332,12 +471,21 @@ async def fill_id(self, page: Page, identifier: str, value: str) -> None: await target.fill(value) except PlaywrightError: await target.press_sequentially(value) - await target.press("Enter") + if press_enter: + await target.press("Enter") if self.animate_actions: await self.remove_cursor_box(page, identifier) async def scroll_id(self, page: Page, identifier: str, direction: str) -> None: + """ + Scroll the element with the given identifier in the specified direction. + + Args: + page (Page): The Playwright page object. + identifier (str): The element identifier. + direction (str): The direction to scroll ("up" or "down"). + """ assert page is not None await page.evaluate( f""" @@ -355,11 +503,16 @@ async def scroll_id(self, page: Page, identifier: str, direction: str) -> None: """ ) - async def get_webpage_text(self, page: Page, n_lines: int = 100) -> str: + async def get_webpage_text(self, page: Page, n_lines: int = 50) -> str: """ - page: playwright page object - n_lines: number of lines to return from the page innertext - return: text in the first n_lines of the page + Retrieve the text content of the web page. + + Args: + page (Page): The Playwright page object. + n_lines (int): The number of lines to return from the page inner text. + + Returns: + str: The text content of the page. """ assert page is not None try: @@ -375,6 +528,22 @@ async def get_webpage_text(self, page: Page, n_lines: int = 100) -> str: return "" async def get_page_markdown(self, page: Page) -> str: - # TODO: replace with mdconvert + """ + Retrieve the markdown content of the web page. + Currently not implemented. + + Args: + page (Page): The Playwright page object. + + Returns: + str: The markdown content of the page. + """ assert page is not None - return await self.get_webpage_text(page, n_lines=1000) + if self._markdown_converter is None and MarkItDown is not None: + self._markdown_converter = MarkItDown() + html = await page.evaluate("document.documentElement.outerHTML;") + res = self._markdown_converter.convert_stream(io.StringIO(html), file_extension=".html", url=page.url) # type: ignore + assert hasattr(res, "text_content") and isinstance(res.text_content, str) + return res.text_content + else: + return await self.get_webpage_text(page, n_lines=200) diff --git a/python/packages/autogen-ext/src/autogen_ext/code_executors/azure/_azure_container_code_executor.py b/python/packages/autogen-ext/src/autogen_ext/code_executors/azure/_azure_container_code_executor.py index f788756d16b2..59fe9f7cccff 100644 --- a/python/packages/autogen-ext/src/autogen_ext/code_executors/azure/_azure_container_code_executor.py +++ b/python/packages/autogen-ext/src/autogen_ext/code_executors/azure/_azure_container_code_executor.py @@ -51,7 +51,7 @@ class ACADynamicSessionsCodeExecutor(CodeExecutor): .. code-block:: bash - pip install 'autogen-ext[azure]==0.4.0.dev9' + pip install 'autogen-ext[azure]==0.4.0.dev11' .. caution:: diff --git a/python/packages/autogen-ext/src/autogen_ext/code_executors/docker/_docker_code_executor.py b/python/packages/autogen-ext/src/autogen_ext/code_executors/docker/_docker_code_executor.py index 87dedaf829d7..567a486a9a67 100644 --- a/python/packages/autogen-ext/src/autogen_ext/code_executors/docker/_docker_code_executor.py +++ b/python/packages/autogen-ext/src/autogen_ext/code_executors/docker/_docker_code_executor.py @@ -59,7 +59,7 @@ class DockerCommandLineCodeExecutor(CodeExecutor): .. code-block:: bash - pip install 'autogen-ext[docker]==0.4.0.dev9' + pip install 'autogen-ext[docker]==0.4.0.dev11' The executor first saves each code block in a file in the working @@ -329,14 +329,21 @@ async def start(self) -> None: import asyncio_atexit import docker - from docker.errors import ImageNotFound + from docker.errors import DockerException, ImageNotFound except ImportError as e: raise RuntimeError( "Missing dependecies for DockerCommandLineCodeExecutor. Please ensure the autogen-ext package was installed with the 'docker' extra." ) from e # Start a container from the image, read to exec commands later - client = docker.from_env() + try: + client = docker.from_env() + except DockerException as e: + if "FileNotFoundError" in str(e): + raise RuntimeError("Failed to connect to Docker. Please ensure Docker is installed and running.") from e + raise + except Exception as e: + raise RuntimeError(f"Unexpected error while connecting to Docker: {str(e)}") from e # Check if the image exists try: diff --git a/python/packages/autogen-ext/src/autogen_ext/models/__init__.py b/python/packages/autogen-ext/src/autogen_ext/models/__init__.py index 80533f80575e..a6b8e23d5a29 100644 --- a/python/packages/autogen-ext/src/autogen_ext/models/__init__.py +++ b/python/packages/autogen-ext/src/autogen_ext/models/__init__.py @@ -1,14 +1,18 @@ -from ._openai._openai_client import ( - AzureOpenAIChatCompletionClient, - OpenAIChatCompletionClient, +from typing_extensions import deprecated + +from .openai import AzureOpenAIChatCompletionClient as AzureOpenAIChatCompletionClientAlias +from .openai import OpenAIChatCompletionClient as OpenAIChatCompletionClientAlias + + +@deprecated( + "autogen_ext.models.OpenAIChatCompletionClient moved to autogen_ext.models.openai.OpenAIChatCompletionClient. This alias will be removed in 0.4.0." +) +class OpenAIChatCompletionClient(OpenAIChatCompletionClientAlias): + pass + + +@deprecated( + "autogen_ext.models.AzureOpenAIChatCompletionClient moved to autogen_ext.models.openai.AzureOpenAIChatCompletionClient. This alias will be removed in 0.4.0." ) -from ._openai.config import AzureOpenAIClientConfiguration, OpenAIClientConfiguration -from ._reply_chat_completion_client import ReplayChatCompletionClient - -__all__ = [ - "AzureOpenAIClientConfiguration", - "AzureOpenAIChatCompletionClient", - "OpenAIClientConfiguration", - "OpenAIChatCompletionClient", - "ReplayChatCompletionClient", -] +class AzureOpenAIChatCompletionClient(AzureOpenAIChatCompletionClientAlias): + pass diff --git a/python/packages/autogen-ext/src/autogen_ext/models/openai/__init__.py b/python/packages/autogen-ext/src/autogen_ext/models/openai/__init__.py new file mode 100644 index 000000000000..bad5690e3cd9 --- /dev/null +++ b/python/packages/autogen-ext/src/autogen_ext/models/openai/__init__.py @@ -0,0 +1,12 @@ +from ._openai_client import ( + AzureOpenAIChatCompletionClient, + OpenAIChatCompletionClient, +) +from .config import AzureOpenAIClientConfiguration, OpenAIClientConfiguration + +__all__ = [ + "AzureOpenAIClientConfiguration", + "AzureOpenAIChatCompletionClient", + "OpenAIClientConfiguration", + "OpenAIChatCompletionClient", +] diff --git a/python/packages/autogen-ext/src/autogen_ext/models/_openai/_model_info.py b/python/packages/autogen-ext/src/autogen_ext/models/openai/_model_info.py similarity index 98% rename from python/packages/autogen-ext/src/autogen_ext/models/_openai/_model_info.py rename to python/packages/autogen-ext/src/autogen_ext/models/openai/_model_info.py index 3a837915f42f..43ca65ac72d7 100644 --- a/python/packages/autogen-ext/src/autogen_ext/models/_openai/_model_info.py +++ b/python/packages/autogen-ext/src/autogen_ext/models/openai/_model_info.py @@ -1,6 +1,6 @@ from typing import Dict -from autogen_core.components.models import ModelCapabilities +from autogen_core.models import ModelCapabilities # Based on: https://platform.openai.com/docs/models/continuous-model-upgrades # This is a moving target, so correctness is checked by the model value returned by openai against expected values at runtime`` diff --git a/python/packages/autogen-ext/src/autogen_ext/models/_openai/_openai_client.py b/python/packages/autogen-ext/src/autogen_ext/models/openai/_openai_client.py similarity index 98% rename from python/packages/autogen-ext/src/autogen_ext/models/_openai/_openai_client.py rename to python/packages/autogen-ext/src/autogen_ext/models/openai/_openai_client.py index 1ac4abefe911..061733194c3e 100644 --- a/python/packages/autogen-ext/src/autogen_ext/models/_openai/_openai_client.py +++ b/python/packages/autogen-ext/src/autogen_ext/models/openai/_openai_client.py @@ -28,7 +28,8 @@ FunctionCall, Image, ) -from autogen_core.components.models import ( +from autogen_core.logging import LLMCallEvent +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, ChatCompletionTokenLogprob, @@ -41,8 +42,7 @@ TopLogprob, UserMessage, ) -from autogen_core.components.tools import Tool, ToolSchema -from autogen_core.logging import LLMCallEvent +from autogen_core.tools import Tool, ToolSchema from openai import AsyncAzureOpenAI, AsyncOpenAI from openai.types.chat import ( ChatCompletion, @@ -909,14 +909,14 @@ class OpenAIChatCompletionClient(BaseOpenAIChatCompletionClient): .. code-block:: bash - pip install 'autogen-ext[openai]==0.4.0.dev9' + pip install 'autogen-ext[openai]==0.4.0.dev8' The following code snippet shows how to use the client with an OpenAI model: .. code-block:: python - from autogen_ext.models import OpenAIChatCompletionClient - from autogen_core.components.models import UserMessage + from autogen_ext.models.openai import OpenAIChatCompletionClient + from autogen_core.models import UserMessage openai_client = OpenAIChatCompletionClient( model="gpt-4o-2024-08-06", @@ -931,7 +931,7 @@ class OpenAIChatCompletionClient(BaseOpenAIChatCompletionClient): .. code-block:: python - from autogen_ext.models import OpenAIChatCompletionClient + from autogen_ext.models.openai import OpenAIChatCompletionClient custom_model_client = OpenAIChatCompletionClient( model="custom-model-name", @@ -989,7 +989,7 @@ class AzureOpenAIChatCompletionClient(BaseOpenAIChatCompletionClient): .. code-block:: bash - pip install 'autogen-ext[openai,azure]==0.4.0.dev9' + pip install 'autogen-ext[openai,azure]==0.4.0.dev8' To use the client, you need to provide your deployment id, Azure Cognitive Services endpoint, api version, and model capabilities. @@ -1000,7 +1000,7 @@ class AzureOpenAIChatCompletionClient(BaseOpenAIChatCompletionClient): .. code-block:: python - from autogen_ext.models import AzureOpenAIChatCompletionClient + from autogen_ext.models.openai import AzureOpenAIChatCompletionClient from azure.identity import DefaultAzureCredential, get_bearer_token_provider # Create the token provider diff --git a/python/packages/autogen-ext/src/autogen_ext/models/_openai/config/__init__.py b/python/packages/autogen-ext/src/autogen_ext/models/openai/config/__init__.py similarity index 96% rename from python/packages/autogen-ext/src/autogen_ext/models/_openai/config/__init__.py rename to python/packages/autogen-ext/src/autogen_ext/models/openai/config/__init__.py index 8afff868293e..70671347a1a2 100644 --- a/python/packages/autogen-ext/src/autogen_ext/models/_openai/config/__init__.py +++ b/python/packages/autogen-ext/src/autogen_ext/models/openai/config/__init__.py @@ -1,6 +1,6 @@ from typing import Awaitable, Callable, Dict, List, Literal, Optional, Union -from autogen_core.components.models import ModelCapabilities +from autogen_core.models import ModelCapabilities from typing_extensions import Required, TypedDict diff --git a/python/packages/autogen-ext/src/autogen_ext/models/replay/__init__.py b/python/packages/autogen-ext/src/autogen_ext/models/replay/__init__.py new file mode 100644 index 000000000000..6e6da6f0a910 --- /dev/null +++ b/python/packages/autogen-ext/src/autogen_ext/models/replay/__init__.py @@ -0,0 +1,5 @@ +from ._replay_chat_completion_client import ReplayChatCompletionClient + +__all__ = [ + "ReplayChatCompletionClient", +] diff --git a/python/packages/autogen-ext/src/autogen_ext/models/_reply_chat_completion_client.py b/python/packages/autogen-ext/src/autogen_ext/models/replay/_replay_chat_completion_client.py similarity index 94% rename from python/packages/autogen-ext/src/autogen_ext/models/_reply_chat_completion_client.py rename to python/packages/autogen-ext/src/autogen_ext/models/replay/_replay_chat_completion_client.py index bd1e0871def4..d0cd159a3aee 100644 --- a/python/packages/autogen-ext/src/autogen_ext/models/_reply_chat_completion_client.py +++ b/python/packages/autogen-ext/src/autogen_ext/models/replay/_replay_chat_completion_client.py @@ -4,14 +4,14 @@ from typing import Any, AsyncGenerator, List, Mapping, Optional, Sequence, Union from autogen_core import EVENT_LOGGER_NAME, CancellationToken -from autogen_core.components.models import ( +from autogen_core.models import ( ChatCompletionClient, CreateResult, LLMMessage, ModelCapabilities, RequestUsage, ) -from autogen_core.components.tools import Tool, ToolSchema +from autogen_core.tools import Tool, ToolSchema logger = logging.getLogger(EVENT_LOGGER_NAME) @@ -37,8 +37,8 @@ class ReplayChatCompletionClient: .. code-block:: python - from autogen_ext.models import ReplayChatCompletionClient - from autogen_core.components.models import UserMessage + from autogen_ext.models.replay import ReplayChatCompletionClient + from autogen_core.models import UserMessage async def example(): @@ -57,8 +57,8 @@ async def example(): .. code-block:: python import asyncio - from autogen_ext.models import ReplayChatCompletionClient - from autogen_core.components.models import UserMessage + from autogen_ext.models.replay import ReplayChatCompletionClient + from autogen_core.models import UserMessage async def example(): @@ -83,8 +83,8 @@ async def example(): .. code-block:: python import asyncio - from autogen_ext.models import ReplayChatCompletionClient - from autogen_core.components.models import UserMessage + from autogen_ext.models.replay import ReplayChatCompletionClient + from autogen_core.models import UserMessage async def example(): diff --git a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/_worker_runtime.py b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/_worker_runtime.py index 703f88a53be2..d2bf41ce0d1f 100644 --- a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/_worker_runtime.py +++ b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/_worker_runtime.py @@ -626,11 +626,38 @@ async def _process_event(self, event: cloudevent_pb2.CloudEvent) -> None: agent = await self._get_agent(agent_id) with MessageHandlerContext.populate_context(agent.id): + def stringify_attributes( + attributes: Mapping[str, cloudevent_pb2.CloudEvent.CloudEventAttributeValue], + ) -> Mapping[str, str]: + result: Dict[str, str] = {} + for key, value in attributes.items(): + item = None + match value.WhichOneof("attr"): + case "ce_boolean": + item = str(value.ce_boolean) + case "ce_integer": + item = str(value.ce_integer) + case "ce_string": + item = value.ce_string + case "ce_bytes": + item = str(value.ce_bytes) + case "ce_uri": + item = value.ce_uri + case "ce_uri_ref": + item = value.ce_uri_ref + case "ce_timestamp": + item = str(value.ce_timestamp) + case _: + raise ValueError("Unknown attribute kind") + result[key] = item + + return result + async def send_message(agent: Agent, message_context: MessageContext) -> Any: with self._trace_helper.trace_block( "process", agent.id, - parent=event.metadata, + parent=stringify_attributes(event.attributes), extraAttributes={"message_type": message_type}, ): await agent.on_message(message, ctx=message_context) diff --git a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2.py b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2.py index b20849e617cc..b4794f1eaba6 100644 --- a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2.py +++ b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2.py @@ -3,12 +3,10 @@ # source: agent_worker.proto # Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" - from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -17,62 +15,61 @@ import cloudevent_pb2 as cloudevent__pb2 from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x12\x61gent_worker.proto\x12\x06\x61gents\x1a\x10\x63loudevent.proto\x1a\x19google/protobuf/any.proto"\'\n\x07TopicId\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t"$\n\x07\x41gentId\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t"E\n\x07Payload\x12\x11\n\tdata_type\x18\x01 \x01(\t\x12\x19\n\x11\x64\x61ta_content_type\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c"\x89\x02\n\nRpcRequest\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12$\n\x06source\x18\x02 \x01(\x0b\x32\x0f.agents.AgentIdH\x00\x88\x01\x01\x12\x1f\n\x06target\x18\x03 \x01(\x0b\x32\x0f.agents.AgentId\x12\x0e\n\x06method\x18\x04 \x01(\t\x12 \n\x07payload\x18\x05 \x01(\x0b\x32\x0f.agents.Payload\x12\x32\n\x08metadata\x18\x06 \x03(\x0b\x32 .agents.RpcRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07_source"\xb8\x01\n\x0bRpcResponse\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12 \n\x07payload\x18\x02 \x01(\x0b\x32\x0f.agents.Payload\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\x33\n\x08metadata\x18\x04 \x03(\x0b\x32!.agents.RpcResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\xe4\x01\n\x05\x45vent\x12\x12\n\ntopic_type\x18\x01 \x01(\t\x12\x14\n\x0ctopic_source\x18\x02 \x01(\t\x12$\n\x06source\x18\x03 \x01(\x0b\x32\x0f.agents.AgentIdH\x00\x88\x01\x01\x12 \n\x07payload\x18\x04 \x01(\x0b\x32\x0f.agents.Payload\x12-\n\x08metadata\x18\x05 \x03(\x0b\x32\x1b.agents.Event.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07_source"<\n\x18RegisterAgentTypeRequest\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t"^\n\x19RegisterAgentTypeResponse\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x12\n\x05\x65rror\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error":\n\x10TypeSubscription\x12\x12\n\ntopic_type\x18\x01 \x01(\t\x12\x12\n\nagent_type\x18\x02 \x01(\t"G\n\x16TypePrefixSubscription\x12\x19\n\x11topic_type_prefix\x18\x01 \x01(\t\x12\x12\n\nagent_type\x18\x02 \x01(\t"\x96\x01\n\x0cSubscription\x12\x34\n\x10typeSubscription\x18\x01 \x01(\x0b\x32\x18.agents.TypeSubscriptionH\x00\x12@\n\x16typePrefixSubscription\x18\x02 \x01(\x0b\x32\x1e.agents.TypePrefixSubscriptionH\x00\x42\x0e\n\x0csubscription"X\n\x16\x41\x64\x64SubscriptionRequest\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12*\n\x0csubscription\x18\x02 \x01(\x0b\x32\x14.agents.Subscription"\\\n\x17\x41\x64\x64SubscriptionResponse\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x12\n\x05\x65rror\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error"\x9d\x01\n\nAgentState\x12!\n\x08\x61gent_id\x18\x01 \x01(\x0b\x32\x0f.agents.AgentId\x12\x0c\n\x04\x65Tag\x18\x02 \x01(\t\x12\x15\n\x0b\x62inary_data\x18\x03 \x01(\x0cH\x00\x12\x13\n\ttext_data\x18\x04 \x01(\tH\x00\x12*\n\nproto_data\x18\x05 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x42\x06\n\x04\x64\x61ta"j\n\x10GetStateResponse\x12\'\n\x0b\x61gent_state\x18\x01 \x01(\x0b\x32\x12.agents.AgentState\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x12\n\x05\x65rror\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error"B\n\x11SaveStateResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\x05\x65rror\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error"\xa6\x03\n\x07Message\x12%\n\x07request\x18\x01 \x01(\x0b\x32\x12.agents.RpcRequestH\x00\x12\'\n\x08response\x18\x02 \x01(\x0b\x32\x13.agents.RpcResponseH\x00\x12,\n\ncloudEvent\x18\x03 \x01(\x0b\x32\x16.cloudevent.CloudEventH\x00\x12\x44\n\x18registerAgentTypeRequest\x18\x04 \x01(\x0b\x32 .agents.RegisterAgentTypeRequestH\x00\x12\x46\n\x19registerAgentTypeResponse\x18\x05 \x01(\x0b\x32!.agents.RegisterAgentTypeResponseH\x00\x12@\n\x16\x61\x64\x64SubscriptionRequest\x18\x06 \x01(\x0b\x32\x1e.agents.AddSubscriptionRequestH\x00\x12\x42\n\x17\x61\x64\x64SubscriptionResponse\x18\x07 \x01(\x0b\x32\x1f.agents.AddSubscriptionResponseH\x00\x42\t\n\x07message2\xb2\x01\n\x08\x41gentRpc\x12\x33\n\x0bOpenChannel\x12\x0f.agents.Message\x1a\x0f.agents.Message(\x01\x30\x01\x12\x35\n\x08GetState\x12\x0f.agents.AgentId\x1a\x18.agents.GetStateResponse\x12:\n\tSaveState\x12\x12.agents.AgentState\x1a\x19.agents.SaveStateResponseB!\xaa\x02\x1eMicrosoft.AutoGen.Abstractionsb\x06proto3' -) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x61gent_worker.proto\x12\x06\x61gents\x1a\x10\x63loudevent.proto\x1a\x19google/protobuf/any.proto\"\'\n\x07TopicId\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\"$\n\x07\x41gentId\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\"E\n\x07Payload\x12\x11\n\tdata_type\x18\x01 \x01(\t\x12\x19\n\x11\x64\x61ta_content_type\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\"\x89\x02\n\nRpcRequest\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12$\n\x06source\x18\x02 \x01(\x0b\x32\x0f.agents.AgentIdH\x00\x88\x01\x01\x12\x1f\n\x06target\x18\x03 \x01(\x0b\x32\x0f.agents.AgentId\x12\x0e\n\x06method\x18\x04 \x01(\t\x12 \n\x07payload\x18\x05 \x01(\x0b\x32\x0f.agents.Payload\x12\x32\n\x08metadata\x18\x06 \x03(\x0b\x32 .agents.RpcRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07_source\"\xb8\x01\n\x0bRpcResponse\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12 \n\x07payload\x18\x02 \x01(\x0b\x32\x0f.agents.Payload\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\x33\n\x08metadata\x18\x04 \x03(\x0b\x32!.agents.RpcResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xe4\x01\n\x05\x45vent\x12\x12\n\ntopic_type\x18\x01 \x01(\t\x12\x14\n\x0ctopic_source\x18\x02 \x01(\t\x12$\n\x06source\x18\x03 \x01(\x0b\x32\x0f.agents.AgentIdH\x00\x88\x01\x01\x12 \n\x07payload\x18\x04 \x01(\x0b\x32\x0f.agents.Payload\x12-\n\x08metadata\x18\x05 \x03(\x0b\x32\x1b.agents.Event.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07_source\"<\n\x18RegisterAgentTypeRequest\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\"^\n\x19RegisterAgentTypeResponse\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x12\n\x05\x65rror\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error\":\n\x10TypeSubscription\x12\x12\n\ntopic_type\x18\x01 \x01(\t\x12\x12\n\nagent_type\x18\x02 \x01(\t\"G\n\x16TypePrefixSubscription\x12\x19\n\x11topic_type_prefix\x18\x01 \x01(\t\x12\x12\n\nagent_type\x18\x02 \x01(\t\"\x96\x01\n\x0cSubscription\x12\x34\n\x10typeSubscription\x18\x01 \x01(\x0b\x32\x18.agents.TypeSubscriptionH\x00\x12@\n\x16typePrefixSubscription\x18\x02 \x01(\x0b\x32\x1e.agents.TypePrefixSubscriptionH\x00\x42\x0e\n\x0csubscription\"X\n\x16\x41\x64\x64SubscriptionRequest\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12*\n\x0csubscription\x18\x02 \x01(\x0b\x32\x14.agents.Subscription\"\\\n\x17\x41\x64\x64SubscriptionResponse\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x12\n\x05\x65rror\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error\"\x9d\x01\n\nAgentState\x12!\n\x08\x61gent_id\x18\x01 \x01(\x0b\x32\x0f.agents.AgentId\x12\x0c\n\x04\x65Tag\x18\x02 \x01(\t\x12\x15\n\x0b\x62inary_data\x18\x03 \x01(\x0cH\x00\x12\x13\n\ttext_data\x18\x04 \x01(\tH\x00\x12*\n\nproto_data\x18\x05 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x42\x06\n\x04\x64\x61ta\"j\n\x10GetStateResponse\x12\'\n\x0b\x61gent_state\x18\x01 \x01(\x0b\x32\x12.agents.AgentState\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x12\n\x05\x65rror\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error\"B\n\x11SaveStateResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\x05\x65rror\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error\"\xad\x03\n\x07Message\x12%\n\x07request\x18\x01 \x01(\x0b\x32\x12.agents.RpcRequestH\x00\x12\'\n\x08response\x18\x02 \x01(\x0b\x32\x13.agents.RpcResponseH\x00\x12\x33\n\ncloudEvent\x18\x03 \x01(\x0b\x32\x1d.io.cloudevents.v1.CloudEventH\x00\x12\x44\n\x18registerAgentTypeRequest\x18\x04 \x01(\x0b\x32 .agents.RegisterAgentTypeRequestH\x00\x12\x46\n\x19registerAgentTypeResponse\x18\x05 \x01(\x0b\x32!.agents.RegisterAgentTypeResponseH\x00\x12@\n\x16\x61\x64\x64SubscriptionRequest\x18\x06 \x01(\x0b\x32\x1e.agents.AddSubscriptionRequestH\x00\x12\x42\n\x17\x61\x64\x64SubscriptionResponse\x18\x07 \x01(\x0b\x32\x1f.agents.AddSubscriptionResponseH\x00\x42\t\n\x07message2\xb2\x01\n\x08\x41gentRpc\x12\x33\n\x0bOpenChannel\x12\x0f.agents.Message\x1a\x0f.agents.Message(\x01\x30\x01\x12\x35\n\x08GetState\x12\x0f.agents.AgentId\x1a\x18.agents.GetStateResponse\x12:\n\tSaveState\x12\x12.agents.AgentState\x1a\x19.agents.SaveStateResponseB\x1e\xaa\x02\x1bMicrosoft.AutoGen.Contractsb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "agent_worker_pb2", _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'agent_worker_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - _globals["DESCRIPTOR"]._options = None - _globals["DESCRIPTOR"]._serialized_options = b"\252\002\036Microsoft.AutoGen.Abstractions" - _globals["_RPCREQUEST_METADATAENTRY"]._options = None - _globals["_RPCREQUEST_METADATAENTRY"]._serialized_options = b"8\001" - _globals["_RPCRESPONSE_METADATAENTRY"]._options = None - _globals["_RPCRESPONSE_METADATAENTRY"]._serialized_options = b"8\001" - _globals["_EVENT_METADATAENTRY"]._options = None - _globals["_EVENT_METADATAENTRY"]._serialized_options = b"8\001" - _globals["_TOPICID"]._serialized_start = 75 - _globals["_TOPICID"]._serialized_end = 114 - _globals["_AGENTID"]._serialized_start = 116 - _globals["_AGENTID"]._serialized_end = 152 - _globals["_PAYLOAD"]._serialized_start = 154 - _globals["_PAYLOAD"]._serialized_end = 223 - _globals["_RPCREQUEST"]._serialized_start = 226 - _globals["_RPCREQUEST"]._serialized_end = 491 - _globals["_RPCREQUEST_METADATAENTRY"]._serialized_start = 433 - _globals["_RPCREQUEST_METADATAENTRY"]._serialized_end = 480 - _globals["_RPCRESPONSE"]._serialized_start = 494 - _globals["_RPCRESPONSE"]._serialized_end = 678 - _globals["_RPCRESPONSE_METADATAENTRY"]._serialized_start = 433 - _globals["_RPCRESPONSE_METADATAENTRY"]._serialized_end = 480 - _globals["_EVENT"]._serialized_start = 681 - _globals["_EVENT"]._serialized_end = 909 - _globals["_EVENT_METADATAENTRY"]._serialized_start = 433 - _globals["_EVENT_METADATAENTRY"]._serialized_end = 480 - _globals["_REGISTERAGENTTYPEREQUEST"]._serialized_start = 911 - _globals["_REGISTERAGENTTYPEREQUEST"]._serialized_end = 971 - _globals["_REGISTERAGENTTYPERESPONSE"]._serialized_start = 973 - _globals["_REGISTERAGENTTYPERESPONSE"]._serialized_end = 1067 - _globals["_TYPESUBSCRIPTION"]._serialized_start = 1069 - _globals["_TYPESUBSCRIPTION"]._serialized_end = 1127 - _globals["_TYPEPREFIXSUBSCRIPTION"]._serialized_start = 1129 - _globals["_TYPEPREFIXSUBSCRIPTION"]._serialized_end = 1200 - _globals["_SUBSCRIPTION"]._serialized_start = 1203 - _globals["_SUBSCRIPTION"]._serialized_end = 1353 - _globals["_ADDSUBSCRIPTIONREQUEST"]._serialized_start = 1355 - _globals["_ADDSUBSCRIPTIONREQUEST"]._serialized_end = 1443 - _globals["_ADDSUBSCRIPTIONRESPONSE"]._serialized_start = 1445 - _globals["_ADDSUBSCRIPTIONRESPONSE"]._serialized_end = 1537 - _globals["_AGENTSTATE"]._serialized_start = 1540 - _globals["_AGENTSTATE"]._serialized_end = 1697 - _globals["_GETSTATERESPONSE"]._serialized_start = 1699 - _globals["_GETSTATERESPONSE"]._serialized_end = 1805 - _globals["_SAVESTATERESPONSE"]._serialized_start = 1807 - _globals["_SAVESTATERESPONSE"]._serialized_end = 1873 - _globals["_MESSAGE"]._serialized_start = 1876 - _globals["_MESSAGE"]._serialized_end = 2298 - _globals["_AGENTRPC"]._serialized_start = 2301 - _globals["_AGENTRPC"]._serialized_end = 2479 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\252\002\033Microsoft.AutoGen.Contracts' + _globals['_RPCREQUEST_METADATAENTRY']._options = None + _globals['_RPCREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_RPCRESPONSE_METADATAENTRY']._options = None + _globals['_RPCRESPONSE_METADATAENTRY']._serialized_options = b'8\001' + _globals['_EVENT_METADATAENTRY']._options = None + _globals['_EVENT_METADATAENTRY']._serialized_options = b'8\001' + _globals['_TOPICID']._serialized_start=75 + _globals['_TOPICID']._serialized_end=114 + _globals['_AGENTID']._serialized_start=116 + _globals['_AGENTID']._serialized_end=152 + _globals['_PAYLOAD']._serialized_start=154 + _globals['_PAYLOAD']._serialized_end=223 + _globals['_RPCREQUEST']._serialized_start=226 + _globals['_RPCREQUEST']._serialized_end=491 + _globals['_RPCREQUEST_METADATAENTRY']._serialized_start=433 + _globals['_RPCREQUEST_METADATAENTRY']._serialized_end=480 + _globals['_RPCRESPONSE']._serialized_start=494 + _globals['_RPCRESPONSE']._serialized_end=678 + _globals['_RPCRESPONSE_METADATAENTRY']._serialized_start=433 + _globals['_RPCRESPONSE_METADATAENTRY']._serialized_end=480 + _globals['_EVENT']._serialized_start=681 + _globals['_EVENT']._serialized_end=909 + _globals['_EVENT_METADATAENTRY']._serialized_start=433 + _globals['_EVENT_METADATAENTRY']._serialized_end=480 + _globals['_REGISTERAGENTTYPEREQUEST']._serialized_start=911 + _globals['_REGISTERAGENTTYPEREQUEST']._serialized_end=971 + _globals['_REGISTERAGENTTYPERESPONSE']._serialized_start=973 + _globals['_REGISTERAGENTTYPERESPONSE']._serialized_end=1067 + _globals['_TYPESUBSCRIPTION']._serialized_start=1069 + _globals['_TYPESUBSCRIPTION']._serialized_end=1127 + _globals['_TYPEPREFIXSUBSCRIPTION']._serialized_start=1129 + _globals['_TYPEPREFIXSUBSCRIPTION']._serialized_end=1200 + _globals['_SUBSCRIPTION']._serialized_start=1203 + _globals['_SUBSCRIPTION']._serialized_end=1353 + _globals['_ADDSUBSCRIPTIONREQUEST']._serialized_start=1355 + _globals['_ADDSUBSCRIPTIONREQUEST']._serialized_end=1443 + _globals['_ADDSUBSCRIPTIONRESPONSE']._serialized_start=1445 + _globals['_ADDSUBSCRIPTIONRESPONSE']._serialized_end=1537 + _globals['_AGENTSTATE']._serialized_start=1540 + _globals['_AGENTSTATE']._serialized_end=1697 + _globals['_GETSTATERESPONSE']._serialized_start=1699 + _globals['_GETSTATERESPONSE']._serialized_end=1805 + _globals['_SAVESTATERESPONSE']._serialized_start=1807 + _globals['_SAVESTATERESPONSE']._serialized_end=1873 + _globals['_MESSAGE']._serialized_start=1876 + _globals['_MESSAGE']._serialized_end=2305 + _globals['_AGENTRPC']._serialized_start=2308 + _globals['_AGENTRPC']._serialized_end=2486 # @@protoc_insertion_point(module_scope) diff --git a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2.pyi b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2.pyi index f9f8a7c47eae..79e384ab948b 100644 --- a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2.pyi +++ b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2.pyi @@ -4,14 +4,13 @@ isort:skip_file """ import builtins -import collections.abc -import typing - import cloudevent_pb2 +import collections.abc import google.protobuf.any_pb2 import google.protobuf.descriptor import google.protobuf.internal.containers import google.protobuf.message +import typing DESCRIPTOR: google.protobuf.descriptor.FileDescriptor @@ -68,12 +67,7 @@ class Payload(google.protobuf.message.Message): data_content_type: builtins.str = ..., data: builtins.bytes = ..., ) -> None: ... - def ClearField( - self, - field_name: typing.Literal[ - "data", b"data", "data_content_type", b"data_content_type", "data_type", b"data_type" - ], - ) -> None: ... + def ClearField(self, field_name: typing.Literal["data", b"data", "data_content_type", b"data_content_type", "data_type", b"data_type"]) -> None: ... global___Payload = Payload @@ -123,31 +117,8 @@ class RpcRequest(google.protobuf.message.Message): payload: global___Payload | None = ..., metadata: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., ) -> None: ... - def HasField( - self, - field_name: typing.Literal[ - "_source", b"_source", "payload", b"payload", "source", b"source", "target", b"target" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing.Literal[ - "_source", - b"_source", - "metadata", - b"metadata", - "method", - b"method", - "payload", - b"payload", - "request_id", - b"request_id", - "source", - b"source", - "target", - b"target", - ], - ) -> None: ... + def HasField(self, field_name: typing.Literal["_source", b"_source", "payload", b"payload", "source", b"source", "target", b"target"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_source", b"_source", "metadata", b"metadata", "method", b"method", "payload", b"payload", "request_id", b"request_id", "source", b"source", "target", b"target"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["_source", b"_source"]) -> typing.Literal["source"] | None: ... global___RpcRequest = RpcRequest @@ -191,12 +162,7 @@ class RpcResponse(google.protobuf.message.Message): metadata: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["payload", b"payload"]) -> builtins.bool: ... - def ClearField( - self, - field_name: typing.Literal[ - "error", b"error", "metadata", b"metadata", "payload", b"payload", "request_id", b"request_id" - ], - ) -> None: ... + def ClearField(self, field_name: typing.Literal["error", b"error", "metadata", b"metadata", "payload", b"payload", "request_id", b"request_id"]) -> None: ... global___RpcResponse = RpcResponse @@ -242,26 +208,8 @@ class Event(google.protobuf.message.Message): payload: global___Payload | None = ..., metadata: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., ) -> None: ... - def HasField( - self, field_name: typing.Literal["_source", b"_source", "payload", b"payload", "source", b"source"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing.Literal[ - "_source", - b"_source", - "metadata", - b"metadata", - "payload", - b"payload", - "source", - b"source", - "topic_source", - b"topic_source", - "topic_type", - b"topic_type", - ], - ) -> None: ... + def HasField(self, field_name: typing.Literal["_source", b"_source", "payload", b"payload", "source", b"source"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_source", b"_source", "metadata", b"metadata", "payload", b"payload", "source", b"source", "topic_source", b"topic_source", "topic_type", b"topic_type"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["_source", b"_source"]) -> typing.Literal["source"] | None: ... global___Event = Event @@ -302,12 +250,7 @@ class RegisterAgentTypeResponse(google.protobuf.message.Message): error: builtins.str | None = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["_error", b"_error", "error", b"error"]) -> builtins.bool: ... - def ClearField( - self, - field_name: typing.Literal[ - "_error", b"_error", "error", b"error", "request_id", b"request_id", "success", b"success" - ], - ) -> None: ... + def ClearField(self, field_name: typing.Literal["_error", b"_error", "error", b"error", "request_id", b"request_id", "success", b"success"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["_error", b"_error"]) -> typing.Literal["error"] | None: ... global___RegisterAgentTypeResponse = RegisterAgentTypeResponse @@ -326,9 +269,7 @@ class TypeSubscription(google.protobuf.message.Message): topic_type: builtins.str = ..., agent_type: builtins.str = ..., ) -> None: ... - def ClearField( - self, field_name: typing.Literal["agent_type", b"agent_type", "topic_type", b"topic_type"] - ) -> None: ... + def ClearField(self, field_name: typing.Literal["agent_type", b"agent_type", "topic_type", b"topic_type"]) -> None: ... global___TypeSubscription = TypeSubscription @@ -346,9 +287,7 @@ class TypePrefixSubscription(google.protobuf.message.Message): topic_type_prefix: builtins.str = ..., agent_type: builtins.str = ..., ) -> None: ... - def ClearField( - self, field_name: typing.Literal["agent_type", b"agent_type", "topic_type_prefix", b"topic_type_prefix"] - ) -> None: ... + def ClearField(self, field_name: typing.Literal["agent_type", b"agent_type", "topic_type_prefix", b"topic_type_prefix"]) -> None: ... global___TypePrefixSubscription = TypePrefixSubscription @@ -368,31 +307,9 @@ class Subscription(google.protobuf.message.Message): typeSubscription: global___TypeSubscription | None = ..., typePrefixSubscription: global___TypePrefixSubscription | None = ..., ) -> None: ... - def HasField( - self, - field_name: typing.Literal[ - "subscription", - b"subscription", - "typePrefixSubscription", - b"typePrefixSubscription", - "typeSubscription", - b"typeSubscription", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing.Literal[ - "subscription", - b"subscription", - "typePrefixSubscription", - b"typePrefixSubscription", - "typeSubscription", - b"typeSubscription", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing.Literal["subscription", b"subscription"] - ) -> typing.Literal["typeSubscription", "typePrefixSubscription"] | None: ... + def HasField(self, field_name: typing.Literal["subscription", b"subscription", "typePrefixSubscription", b"typePrefixSubscription", "typeSubscription", b"typeSubscription"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["subscription", b"subscription", "typePrefixSubscription", b"typePrefixSubscription", "typeSubscription", b"typeSubscription"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["subscription", b"subscription"]) -> typing.Literal["typeSubscription", "typePrefixSubscription"] | None: ... global___Subscription = Subscription @@ -412,9 +329,7 @@ class AddSubscriptionRequest(google.protobuf.message.Message): subscription: global___Subscription | None = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["subscription", b"subscription"]) -> builtins.bool: ... - def ClearField( - self, field_name: typing.Literal["request_id", b"request_id", "subscription", b"subscription"] - ) -> None: ... + def ClearField(self, field_name: typing.Literal["request_id", b"request_id", "subscription", b"subscription"]) -> None: ... global___AddSubscriptionRequest = AddSubscriptionRequest @@ -436,12 +351,7 @@ class AddSubscriptionResponse(google.protobuf.message.Message): error: builtins.str | None = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["_error", b"_error", "error", b"error"]) -> builtins.bool: ... - def ClearField( - self, - field_name: typing.Literal[ - "_error", b"_error", "error", b"error", "request_id", b"request_id", "success", b"success" - ], - ) -> None: ... + def ClearField(self, field_name: typing.Literal["_error", b"_error", "error", b"error", "request_id", b"request_id", "success", b"success"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["_error", b"_error"]) -> typing.Literal["error"] | None: ... global___AddSubscriptionResponse = AddSubscriptionResponse @@ -471,41 +381,9 @@ class AgentState(google.protobuf.message.Message): text_data: builtins.str = ..., proto_data: google.protobuf.any_pb2.Any | None = ..., ) -> None: ... - def HasField( - self, - field_name: typing.Literal[ - "agent_id", - b"agent_id", - "binary_data", - b"binary_data", - "data", - b"data", - "proto_data", - b"proto_data", - "text_data", - b"text_data", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing.Literal[ - "agent_id", - b"agent_id", - "binary_data", - b"binary_data", - "data", - b"data", - "eTag", - b"eTag", - "proto_data", - b"proto_data", - "text_data", - b"text_data", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing.Literal["data", b"data"] - ) -> typing.Literal["binary_data", "text_data", "proto_data"] | None: ... + def HasField(self, field_name: typing.Literal["agent_id", b"agent_id", "binary_data", b"binary_data", "data", b"data", "proto_data", b"proto_data", "text_data", b"text_data"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["agent_id", b"agent_id", "binary_data", b"binary_data", "data", b"data", "eTag", b"eTag", "proto_data", b"proto_data", "text_data", b"text_data"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["data", b"data"]) -> typing.Literal["binary_data", "text_data", "proto_data"] | None: ... global___AgentState = AgentState @@ -527,15 +405,8 @@ class GetStateResponse(google.protobuf.message.Message): success: builtins.bool = ..., error: builtins.str | None = ..., ) -> None: ... - def HasField( - self, field_name: typing.Literal["_error", b"_error", "agent_state", b"agent_state", "error", b"error"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing.Literal[ - "_error", b"_error", "agent_state", b"agent_state", "error", b"error", "success", b"success" - ], - ) -> None: ... + def HasField(self, field_name: typing.Literal["_error", b"_error", "agent_state", b"agent_state", "error", b"error"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_error", b"_error", "agent_state", b"agent_state", "error", b"error", "success", b"success"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["_error", b"_error"]) -> typing.Literal["error"] | None: ... global___GetStateResponse = GetStateResponse @@ -555,9 +426,7 @@ class SaveStateResponse(google.protobuf.message.Message): error: builtins.str | None = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["_error", b"_error", "error", b"error"]) -> builtins.bool: ... - def ClearField( - self, field_name: typing.Literal["_error", b"_error", "error", b"error", "success", b"success"] - ) -> None: ... + def ClearField(self, field_name: typing.Literal["_error", b"_error", "error", b"error", "success", b"success"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["_error", b"_error"]) -> typing.Literal["error"] | None: ... global___SaveStateResponse = SaveStateResponse @@ -598,61 +467,8 @@ class Message(google.protobuf.message.Message): addSubscriptionRequest: global___AddSubscriptionRequest | None = ..., addSubscriptionResponse: global___AddSubscriptionResponse | None = ..., ) -> None: ... - def HasField( - self, - field_name: typing.Literal[ - "addSubscriptionRequest", - b"addSubscriptionRequest", - "addSubscriptionResponse", - b"addSubscriptionResponse", - "cloudEvent", - b"cloudEvent", - "message", - b"message", - "registerAgentTypeRequest", - b"registerAgentTypeRequest", - "registerAgentTypeResponse", - b"registerAgentTypeResponse", - "request", - b"request", - "response", - b"response", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing.Literal[ - "addSubscriptionRequest", - b"addSubscriptionRequest", - "addSubscriptionResponse", - b"addSubscriptionResponse", - "cloudEvent", - b"cloudEvent", - "message", - b"message", - "registerAgentTypeRequest", - b"registerAgentTypeRequest", - "registerAgentTypeResponse", - b"registerAgentTypeResponse", - "request", - b"request", - "response", - b"response", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing.Literal["message", b"message"] - ) -> ( - typing.Literal[ - "request", - "response", - "cloudEvent", - "registerAgentTypeRequest", - "registerAgentTypeResponse", - "addSubscriptionRequest", - "addSubscriptionResponse", - ] - | None - ): ... + def HasField(self, field_name: typing.Literal["addSubscriptionRequest", b"addSubscriptionRequest", "addSubscriptionResponse", b"addSubscriptionResponse", "cloudEvent", b"cloudEvent", "message", b"message", "registerAgentTypeRequest", b"registerAgentTypeRequest", "registerAgentTypeResponse", b"registerAgentTypeResponse", "request", b"request", "response", b"response"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["addSubscriptionRequest", b"addSubscriptionRequest", "addSubscriptionResponse", b"addSubscriptionResponse", "cloudEvent", b"cloudEvent", "message", b"message", "registerAgentTypeRequest", b"registerAgentTypeRequest", "registerAgentTypeResponse", b"registerAgentTypeResponse", "request", b"request", "response", b"response"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["message", b"message"]) -> typing.Literal["request", "response", "cloudEvent", "registerAgentTypeRequest", "registerAgentTypeResponse", "addSubscriptionRequest", "addSubscriptionResponse"] | None: ... global___Message = Message diff --git a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2_grpc.py b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2_grpc.py index c956a5d69282..fc27021587f6 100644 --- a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2_grpc.py +++ b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2_grpc.py @@ -1,8 +1,8 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" +import grpc import agent_worker_pb2 as agent__worker__pb2 -import grpc class AgentRpcStub(object): @@ -15,20 +15,20 @@ def __init__(self, channel): channel: A grpc.Channel. """ self.OpenChannel = channel.stream_stream( - "/agents.AgentRpc/OpenChannel", - request_serializer=agent__worker__pb2.Message.SerializeToString, - response_deserializer=agent__worker__pb2.Message.FromString, - ) + '/agents.AgentRpc/OpenChannel', + request_serializer=agent__worker__pb2.Message.SerializeToString, + response_deserializer=agent__worker__pb2.Message.FromString, + ) self.GetState = channel.unary_unary( - "/agents.AgentRpc/GetState", - request_serializer=agent__worker__pb2.AgentId.SerializeToString, - response_deserializer=agent__worker__pb2.GetStateResponse.FromString, - ) + '/agents.AgentRpc/GetState', + request_serializer=agent__worker__pb2.AgentId.SerializeToString, + response_deserializer=agent__worker__pb2.GetStateResponse.FromString, + ) self.SaveState = channel.unary_unary( - "/agents.AgentRpc/SaveState", - request_serializer=agent__worker__pb2.AgentState.SerializeToString, - response_deserializer=agent__worker__pb2.SaveStateResponse.FromString, - ) + '/agents.AgentRpc/SaveState', + request_serializer=agent__worker__pb2.AgentState.SerializeToString, + response_deserializer=agent__worker__pb2.SaveStateResponse.FromString, + ) class AgentRpcServicer(object): @@ -37,131 +37,96 @@ class AgentRpcServicer(object): def OpenChannel(self, request_iterator, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def GetState(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def SaveState(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def add_AgentRpcServicer_to_server(servicer, server): rpc_method_handlers = { - "OpenChannel": grpc.stream_stream_rpc_method_handler( - servicer.OpenChannel, - request_deserializer=agent__worker__pb2.Message.FromString, - response_serializer=agent__worker__pb2.Message.SerializeToString, - ), - "GetState": grpc.unary_unary_rpc_method_handler( - servicer.GetState, - request_deserializer=agent__worker__pb2.AgentId.FromString, - response_serializer=agent__worker__pb2.GetStateResponse.SerializeToString, - ), - "SaveState": grpc.unary_unary_rpc_method_handler( - servicer.SaveState, - request_deserializer=agent__worker__pb2.AgentState.FromString, - response_serializer=agent__worker__pb2.SaveStateResponse.SerializeToString, - ), + 'OpenChannel': grpc.stream_stream_rpc_method_handler( + servicer.OpenChannel, + request_deserializer=agent__worker__pb2.Message.FromString, + response_serializer=agent__worker__pb2.Message.SerializeToString, + ), + 'GetState': grpc.unary_unary_rpc_method_handler( + servicer.GetState, + request_deserializer=agent__worker__pb2.AgentId.FromString, + response_serializer=agent__worker__pb2.GetStateResponse.SerializeToString, + ), + 'SaveState': grpc.unary_unary_rpc_method_handler( + servicer.SaveState, + request_deserializer=agent__worker__pb2.AgentState.FromString, + response_serializer=agent__worker__pb2.SaveStateResponse.SerializeToString, + ), } - generic_handler = grpc.method_handlers_generic_handler("agents.AgentRpc", rpc_method_handlers) + generic_handler = grpc.method_handlers_generic_handler( + 'agents.AgentRpc', rpc_method_handlers) server.add_generic_rpc_handlers((generic_handler,)) -# This class is part of an EXPERIMENTAL API. + # This class is part of an EXPERIMENTAL API. class AgentRpc(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def OpenChannel( - request_iterator, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.stream_stream( - request_iterator, + def OpenChannel(request_iterator, target, - "/agents.AgentRpc/OpenChannel", + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_stream(request_iterator, target, '/agents.AgentRpc/OpenChannel', agent__worker__pb2.Message.SerializeToString, agent__worker__pb2.Message.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def GetState( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, + def GetState(request, target, - "/agents.AgentRpc/GetState", + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/agents.AgentRpc/GetState', agent__worker__pb2.AgentId.SerializeToString, agent__worker__pb2.GetStateResponse.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def SaveState( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, + def SaveState(request, target, - "/agents.AgentRpc/SaveState", + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/agents.AgentRpc/SaveState', agent__worker__pb2.AgentState.SerializeToString, agent__worker__pb2.SaveStateResponse.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2_grpc.pyi b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2_grpc.pyi index a60c5ee7882c..bf6bc1ba2d64 100644 --- a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2_grpc.pyi +++ b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/agent_worker_pb2_grpc.pyi @@ -4,16 +4,16 @@ isort:skip_file """ import abc -import collections.abc -import typing - import agent_worker_pb2 +import collections.abc import grpc import grpc.aio +import typing _T = typing.TypeVar("_T") class _MaybeAsyncIterator(collections.abc.AsyncIterator[_T], collections.abc.Iterator[_T], metaclass=abc.ABCMeta): ... + class _ServicerContext(grpc.ServicerContext, grpc.aio.ServicerContext): # type: ignore[misc, type-arg] ... @@ -56,26 +56,20 @@ class AgentRpcServicer(metaclass=abc.ABCMeta): self, request_iterator: _MaybeAsyncIterator[agent_worker_pb2.Message], context: _ServicerContext, - ) -> typing.Union[ - collections.abc.Iterator[agent_worker_pb2.Message], collections.abc.AsyncIterator[agent_worker_pb2.Message] - ]: ... + ) -> typing.Union[collections.abc.Iterator[agent_worker_pb2.Message], collections.abc.AsyncIterator[agent_worker_pb2.Message]]: ... + @abc.abstractmethod def GetState( self, request: agent_worker_pb2.AgentId, context: _ServicerContext, - ) -> typing.Union[ - agent_worker_pb2.GetStateResponse, collections.abc.Awaitable[agent_worker_pb2.GetStateResponse] - ]: ... + ) -> typing.Union[agent_worker_pb2.GetStateResponse, collections.abc.Awaitable[agent_worker_pb2.GetStateResponse]]: ... + @abc.abstractmethod def SaveState( self, request: agent_worker_pb2.AgentState, context: _ServicerContext, - ) -> typing.Union[ - agent_worker_pb2.SaveStateResponse, collections.abc.Awaitable[agent_worker_pb2.SaveStateResponse] - ]: ... + ) -> typing.Union[agent_worker_pb2.SaveStateResponse, collections.abc.Awaitable[agent_worker_pb2.SaveStateResponse]]: ... -def add_AgentRpcServicer_to_server( - servicer: AgentRpcServicer, server: typing.Union[grpc.Server, grpc.aio.Server] -) -> None: ... +def add_AgentRpcServicer_to_server(servicer: AgentRpcServicer, server: typing.Union[grpc.Server, grpc.aio.Server]) -> None: ... diff --git a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2.py b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2.py index 1c157bd7d1d0..b1774ebfb2c4 100644 --- a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2.py +++ b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2.py @@ -3,12 +3,10 @@ # source: cloudevent.proto # Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" - from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -17,26 +15,21 @@ from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x10\x63loudevent.proto\x12\ncloudevent\x1a\x19google/protobuf/any.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\xa4\x05\n\nCloudEvent\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x14\n\x0cspec_version\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12:\n\nattributes\x18\x05 \x03(\x0b\x32&.cloudevent.CloudEvent.AttributesEntry\x12\x36\n\x08metadata\x18\x06 \x03(\x0b\x32$.cloudevent.CloudEvent.MetadataEntry\x12\x17\n\x0f\x64\x61tacontenttype\x18\x07 \x01(\t\x12\x15\n\x0b\x62inary_data\x18\x08 \x01(\x0cH\x00\x12\x13\n\ttext_data\x18\t \x01(\tH\x00\x12*\n\nproto_data\x18\n \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x1a\x62\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.cloudevent.CloudEvent.CloudEventAttributeValue:\x02\x38\x01\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\xd3\x01\n\x18\x43loudEventAttributeValue\x12\x14\n\nce_boolean\x18\x01 \x01(\x08H\x00\x12\x14\n\nce_integer\x18\x02 \x01(\x05H\x00\x12\x13\n\tce_string\x18\x03 \x01(\tH\x00\x12\x12\n\x08\x63\x65_bytes\x18\x04 \x01(\x0cH\x00\x12\x10\n\x06\x63\x65_uri\x18\x05 \x01(\tH\x00\x12\x14\n\nce_uri_ref\x18\x06 \x01(\tH\x00\x12\x32\n\x0c\x63\x65_timestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00\x42\x06\n\x04\x61ttrB\x06\n\x04\x64\x61taB!\xaa\x02\x1eMicrosoft.AutoGen.Abstractionsb\x06proto3' -) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10\x63loudevent.proto\x12\x11io.cloudevents.v1\x1a\x19google/protobuf/any.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xb0\x04\n\nCloudEvent\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x14\n\x0cspec_version\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12\x41\n\nattributes\x18\x05 \x03(\x0b\x32-.io.cloudevents.v1.CloudEvent.AttributesEntry\x12\x15\n\x0b\x62inary_data\x18\x06 \x01(\x0cH\x00\x12\x13\n\ttext_data\x18\x07 \x01(\tH\x00\x12*\n\nproto_data\x18\x08 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x1ai\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x45\n\x05value\x18\x02 \x01(\x0b\x32\x36.io.cloudevents.v1.CloudEvent.CloudEventAttributeValue:\x02\x38\x01\x1a\xd3\x01\n\x18\x43loudEventAttributeValue\x12\x14\n\nce_boolean\x18\x01 \x01(\x08H\x00\x12\x14\n\nce_integer\x18\x02 \x01(\x05H\x00\x12\x13\n\tce_string\x18\x03 \x01(\tH\x00\x12\x12\n\x08\x63\x65_bytes\x18\x04 \x01(\x0cH\x00\x12\x10\n\x06\x63\x65_uri\x18\x05 \x01(\tH\x00\x12\x14\n\nce_uri_ref\x18\x06 \x01(\tH\x00\x12\x32\n\x0c\x63\x65_timestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00\x42\x06\n\x04\x61ttrB\x06\n\x04\x64\x61taB\x1e\xaa\x02\x1bMicrosoft.AutoGen.Contractsb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "cloudevent_pb2", _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cloudevent_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - _globals["DESCRIPTOR"]._options = None - _globals["DESCRIPTOR"]._serialized_options = b"\252\002\036Microsoft.AutoGen.Abstractions" - _globals["_CLOUDEVENT_ATTRIBUTESENTRY"]._options = None - _globals["_CLOUDEVENT_ATTRIBUTESENTRY"]._serialized_options = b"8\001" - _globals["_CLOUDEVENT_METADATAENTRY"]._options = None - _globals["_CLOUDEVENT_METADATAENTRY"]._serialized_options = b"8\001" - _globals["_CLOUDEVENT"]._serialized_start = 93 - _globals["_CLOUDEVENT"]._serialized_end = 769 - _globals["_CLOUDEVENT_ATTRIBUTESENTRY"]._serialized_start = 400 - _globals["_CLOUDEVENT_ATTRIBUTESENTRY"]._serialized_end = 498 - _globals["_CLOUDEVENT_METADATAENTRY"]._serialized_start = 500 - _globals["_CLOUDEVENT_METADATAENTRY"]._serialized_end = 547 - _globals["_CLOUDEVENT_CLOUDEVENTATTRIBUTEVALUE"]._serialized_start = 550 - _globals["_CLOUDEVENT_CLOUDEVENTATTRIBUTEVALUE"]._serialized_end = 761 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\252\002\033Microsoft.AutoGen.Contracts' + _globals['_CLOUDEVENT_ATTRIBUTESENTRY']._options = None + _globals['_CLOUDEVENT_ATTRIBUTESENTRY']._serialized_options = b'8\001' + _globals['_CLOUDEVENT']._serialized_start=100 + _globals['_CLOUDEVENT']._serialized_end=660 + _globals['_CLOUDEVENT_ATTRIBUTESENTRY']._serialized_start=333 + _globals['_CLOUDEVENT_ATTRIBUTESENTRY']._serialized_end=438 + _globals['_CLOUDEVENT_CLOUDEVENTATTRIBUTEVALUE']._serialized_start=441 + _globals['_CLOUDEVENT_CLOUDEVENTATTRIBUTEVALUE']._serialized_end=652 # @@protoc_insertion_point(module_scope) diff --git a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2.pyi b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2.pyi index 033a3a509061..bbdb162fc4f2 100644 --- a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2.pyi +++ b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2.pyi @@ -1,17 +1,22 @@ """ @generated by mypy-protobuf. Do not edit manually! isort:skip_file +* +CloudEvent Protobuf Format + +- Required context attributes are explicitly represented. +- Optional and Extension context attributes are carried in a map structure. +- Data may be represented as binary, text, or protobuf messages. """ import builtins import collections.abc -import typing - import google.protobuf.any_pb2 import google.protobuf.descriptor import google.protobuf.internal.containers import google.protobuf.message import google.protobuf.timestamp_pb2 +import typing DESCRIPTOR: google.protobuf.descriptor.FileDescriptor @@ -37,22 +42,6 @@ class CloudEvent(google.protobuf.message.Message): def HasField(self, field_name: typing.Literal["value", b"value"]) -> builtins.bool: ... def ClearField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> None: ... - @typing.final - class MetadataEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - value: builtins.str - def __init__( - self, - *, - key: builtins.str = ..., - value: builtins.str = ..., - ) -> None: ... - def ClearField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> None: ... - @typing.final class CloudEventAttributeValue(google.protobuf.message.Message): """* @@ -88,62 +77,15 @@ class CloudEvent(google.protobuf.message.Message): ce_uri_ref: builtins.str = ..., ce_timestamp: google.protobuf.timestamp_pb2.Timestamp | None = ..., ) -> None: ... - def HasField( - self, - field_name: typing.Literal[ - "attr", - b"attr", - "ce_boolean", - b"ce_boolean", - "ce_bytes", - b"ce_bytes", - "ce_integer", - b"ce_integer", - "ce_string", - b"ce_string", - "ce_timestamp", - b"ce_timestamp", - "ce_uri", - b"ce_uri", - "ce_uri_ref", - b"ce_uri_ref", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing.Literal[ - "attr", - b"attr", - "ce_boolean", - b"ce_boolean", - "ce_bytes", - b"ce_bytes", - "ce_integer", - b"ce_integer", - "ce_string", - b"ce_string", - "ce_timestamp", - b"ce_timestamp", - "ce_uri", - b"ce_uri", - "ce_uri_ref", - b"ce_uri_ref", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing.Literal["attr", b"attr"] - ) -> ( - typing.Literal["ce_boolean", "ce_integer", "ce_string", "ce_bytes", "ce_uri", "ce_uri_ref", "ce_timestamp"] - | None - ): ... + def HasField(self, field_name: typing.Literal["attr", b"attr", "ce_boolean", b"ce_boolean", "ce_bytes", b"ce_bytes", "ce_integer", b"ce_integer", "ce_string", b"ce_string", "ce_timestamp", b"ce_timestamp", "ce_uri", b"ce_uri", "ce_uri_ref", b"ce_uri_ref"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["attr", b"attr", "ce_boolean", b"ce_boolean", "ce_bytes", b"ce_bytes", "ce_integer", b"ce_integer", "ce_string", b"ce_string", "ce_timestamp", b"ce_timestamp", "ce_uri", b"ce_uri", "ce_uri_ref", b"ce_uri_ref"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["attr", b"attr"]) -> typing.Literal["ce_boolean", "ce_integer", "ce_string", "ce_bytes", "ce_uri", "ce_uri_ref", "ce_timestamp"] | None: ... ID_FIELD_NUMBER: builtins.int SOURCE_FIELD_NUMBER: builtins.int SPEC_VERSION_FIELD_NUMBER: builtins.int TYPE_FIELD_NUMBER: builtins.int ATTRIBUTES_FIELD_NUMBER: builtins.int - METADATA_FIELD_NUMBER: builtins.int - DATACONTENTTYPE_FIELD_NUMBER: builtins.int BINARY_DATA_FIELD_NUMBER: builtins.int TEXT_DATA_FIELD_NUMBER: builtins.int PROTO_DATA_FIELD_NUMBER: builtins.int @@ -156,18 +98,12 @@ class CloudEvent(google.protobuf.message.Message): """URI-reference""" spec_version: builtins.str type: builtins.str - datacontenttype: builtins.str - """MIME type""" binary_data: builtins.bytes text_data: builtins.str @property - def attributes( - self, - ) -> google.protobuf.internal.containers.MessageMap[builtins.str, global___CloudEvent.CloudEventAttributeValue]: + def attributes(self) -> google.protobuf.internal.containers.MessageMap[builtins.str, global___CloudEvent.CloudEventAttributeValue]: """Optional & Extension Attributes""" - @property - def metadata(self) -> google.protobuf.internal.containers.ScalarMap[builtins.str, builtins.str]: ... @property def proto_data(self) -> google.protobuf.any_pb2.Any: ... def __init__( @@ -178,47 +114,12 @@ class CloudEvent(google.protobuf.message.Message): spec_version: builtins.str = ..., type: builtins.str = ..., attributes: collections.abc.Mapping[builtins.str, global___CloudEvent.CloudEventAttributeValue] | None = ..., - metadata: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., - datacontenttype: builtins.str = ..., binary_data: builtins.bytes = ..., text_data: builtins.str = ..., proto_data: google.protobuf.any_pb2.Any | None = ..., ) -> None: ... - def HasField( - self, - field_name: typing.Literal[ - "binary_data", b"binary_data", "data", b"data", "proto_data", b"proto_data", "text_data", b"text_data" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing.Literal[ - "attributes", - b"attributes", - "binary_data", - b"binary_data", - "data", - b"data", - "datacontenttype", - b"datacontenttype", - "id", - b"id", - "metadata", - b"metadata", - "proto_data", - b"proto_data", - "source", - b"source", - "spec_version", - b"spec_version", - "text_data", - b"text_data", - "type", - b"type", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing.Literal["data", b"data"] - ) -> typing.Literal["binary_data", "text_data", "proto_data"] | None: ... + def HasField(self, field_name: typing.Literal["binary_data", b"binary_data", "data", b"data", "proto_data", b"proto_data", "text_data", b"text_data"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["attributes", b"attributes", "binary_data", b"binary_data", "data", b"data", "id", b"id", "proto_data", b"proto_data", "source", b"source", "spec_version", b"spec_version", "text_data", b"text_data", "type", b"type"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["data", b"data"]) -> typing.Literal["binary_data", "text_data", "proto_data"] | None: ... global___CloudEvent = CloudEvent diff --git a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2_grpc.py b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2_grpc.py index bf947056a2f4..2daafffebfc8 100644 --- a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2_grpc.py +++ b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2_grpc.py @@ -1,4 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" - import grpc + diff --git a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2_grpc.pyi b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2_grpc.pyi index cb7968e33de9..0f50cd8853e1 100644 --- a/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2_grpc.pyi +++ b/python/packages/autogen-ext/src/autogen_ext/runtimes/grpc/protos/cloudevent_pb2_grpc.pyi @@ -1,17 +1,23 @@ """ @generated by mypy-protobuf. Do not edit manually! isort:skip_file +* +CloudEvent Protobuf Format + +- Required context attributes are explicitly represented. +- Optional and Extension context attributes are carried in a map structure. +- Data may be represented as binary, text, or protobuf messages. """ import abc import collections.abc -import typing - import grpc import grpc.aio +import typing _T = typing.TypeVar("_T") class _MaybeAsyncIterator(collections.abc.AsyncIterator[_T], collections.abc.Iterator[_T], metaclass=abc.ABCMeta): ... + class _ServicerContext(grpc.ServicerContext, grpc.aio.ServicerContext): # type: ignore[misc, type-arg] ... diff --git a/python/packages/autogen-ext/src/autogen_ext/tools/__init__.py b/python/packages/autogen-ext/src/autogen_ext/tools/langchain/__init__.py similarity index 100% rename from python/packages/autogen-ext/src/autogen_ext/tools/__init__.py rename to python/packages/autogen-ext/src/autogen_ext/tools/langchain/__init__.py diff --git a/python/packages/autogen-ext/src/autogen_ext/tools/_langchain_adapter.py b/python/packages/autogen-ext/src/autogen_ext/tools/langchain/_langchain_adapter.py similarity index 98% rename from python/packages/autogen-ext/src/autogen_ext/tools/_langchain_adapter.py rename to python/packages/autogen-ext/src/autogen_ext/tools/langchain/_langchain_adapter.py index cb6e82aa8298..ea657691d942 100644 --- a/python/packages/autogen-ext/src/autogen_ext/tools/_langchain_adapter.py +++ b/python/packages/autogen-ext/src/autogen_ext/tools/langchain/_langchain_adapter.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, Callable, Dict, Type, cast from autogen_core import CancellationToken -from autogen_core.components.tools import BaseTool +from autogen_core.tools import BaseTool from pydantic import BaseModel, Field, create_model if TYPE_CHECKING: diff --git a/python/packages/autogen-ext/tests/models/test_openai_model_client.py b/python/packages/autogen-ext/tests/models/test_openai_model_client.py index dfaef0ccebeb..9f2144c5dc39 100644 --- a/python/packages/autogen-ext/tests/models/test_openai_model_client.py +++ b/python/packages/autogen-ext/tests/models/test_openai_model_client.py @@ -4,7 +4,7 @@ import pytest from autogen_core import CancellationToken, Image -from autogen_core.components.models import ( +from autogen_core.models import ( AssistantMessage, CreateResult, FunctionExecutionResult, @@ -14,10 +14,10 @@ SystemMessage, UserMessage, ) -from autogen_core.components.tools import BaseTool, FunctionTool -from autogen_ext.models import AzureOpenAIChatCompletionClient, OpenAIChatCompletionClient -from autogen_ext.models._openai._model_info import resolve_model -from autogen_ext.models._openai._openai_client import calculate_vision_tokens, convert_tools +from autogen_core.tools import BaseTool, FunctionTool +from autogen_ext.models.openai import AzureOpenAIChatCompletionClient, OpenAIChatCompletionClient +from autogen_ext.models.openai._model_info import resolve_model +from autogen_ext.models.openai._openai_client import calculate_vision_tokens, convert_tools from openai.resources.chat.completions import AsyncCompletions from openai.types.chat.chat_completion import ChatCompletion, Choice from openai.types.chat.chat_completion_chunk import ChatCompletionChunk, ChoiceDelta @@ -275,9 +275,7 @@ def tool2(test1: int, test2: List[int]) -> str: tools = [FunctionTool(tool1, description="example tool 1"), FunctionTool(tool2, description="example tool 2")] mockcalculate_vision_tokens = MagicMock() - monkeypatch.setattr( - "autogen_ext.models._openai._openai_client.calculate_vision_tokens", mockcalculate_vision_tokens - ) + monkeypatch.setattr("autogen_ext.models.openai._openai_client.calculate_vision_tokens", mockcalculate_vision_tokens) num_tokens = client.count_tokens(messages, tools=tools) assert num_tokens diff --git a/python/packages/autogen-ext/tests/models/test_reply_chat_completion_client.py b/python/packages/autogen-ext/tests/models/test_reply_chat_completion_client.py index 62211463a61c..7c3fe584b656 100644 --- a/python/packages/autogen-ext/tests/models/test_reply_chat_completion_client.py +++ b/python/packages/autogen-ext/tests/models/test_reply_chat_completion_client.py @@ -12,8 +12,8 @@ default_subscription, message_handler, ) -from autogen_core.components.models import ChatCompletionClient, CreateResult, SystemMessage, UserMessage -from autogen_ext.models import ReplayChatCompletionClient +from autogen_core.models import ChatCompletionClient, CreateResult, SystemMessage, UserMessage +from autogen_ext.models.replay import ReplayChatCompletionClient @dataclass @@ -48,7 +48,7 @@ class LLMAgentWithDefaultSubscription(LLMAgent): ... @pytest.mark.asyncio -async def test_reply_chat_completion_client() -> None: +async def test_replay_chat_completion_client() -> None: num_messages = 5 messages = [f"Message {i}" for i in range(num_messages)] reply_model_client = ReplayChatCompletionClient(messages) @@ -61,7 +61,7 @@ async def test_reply_chat_completion_client() -> None: @pytest.mark.asyncio -async def test_reply_chat_completion_client_create_stream() -> None: +async def test_replay_chat_completion_client_create_stream() -> None: num_messages = 5 messages = [f"Message {i}" for i in range(num_messages)] reply_model_client = ReplayChatCompletionClient(messages) @@ -155,7 +155,7 @@ async def test_token_count_logics() -> None: @pytest.mark.asyncio -async def test_reply_chat_completion_client_reset() -> None: +async def test_replay_chat_completion_client_reset() -> None: """Test that reset functionality properly resets the client state.""" messages = ["First message", "Second message", "Third message"] client = ReplayChatCompletionClient(messages) diff --git a/python/packages/autogen-ext/tests/protos/serialization_test_pb2_grpc.pyi b/python/packages/autogen-ext/tests/protos/serialization_test_pb2_grpc.pyi index a6a9cff9dfd4..0f50cd8853e1 100644 --- a/python/packages/autogen-ext/tests/protos/serialization_test_pb2_grpc.pyi +++ b/python/packages/autogen-ext/tests/protos/serialization_test_pb2_grpc.pyi @@ -1,6 +1,12 @@ """ @generated by mypy-protobuf. Do not edit manually! isort:skip_file +* +CloudEvent Protobuf Format + +- Required context attributes are explicitly represented. +- Optional and Extension context attributes are carried in a map structure. +- Data may be represented as binary, text, or protobuf messages. """ import abc diff --git a/python/packages/autogen-ext/tests/test_openai_assistant_agent.py b/python/packages/autogen-ext/tests/test_openai_assistant_agent.py index 0166f17dbf89..da55d860c674 100644 --- a/python/packages/autogen-ext/tests/test_openai_assistant_agent.py +++ b/python/packages/autogen-ext/tests/test_openai_assistant_agent.py @@ -5,7 +5,7 @@ import pytest from autogen_agentchat.messages import TextMessage from autogen_core import CancellationToken -from autogen_core.components.tools._base import BaseTool, Tool +from autogen_core.tools._base import BaseTool, Tool from autogen_ext.agents.openai import OpenAIAssistantAgent from azure.identity import DefaultAzureCredential, get_bearer_token_provider from openai import AsyncAzureOpenAI diff --git a/python/packages/autogen-ext/tests/test_playwright_controller.py b/python/packages/autogen-ext/tests/test_playwright_controller.py new file mode 100644 index 000000000000..177f0b561e67 --- /dev/null +++ b/python/packages/autogen-ext/tests/test_playwright_controller.py @@ -0,0 +1,78 @@ +import pytest +from autogen_ext.agents.web_surfer.playwright_controller import PlaywrightController +from playwright.async_api import async_playwright + +FAKE_HTML = """ + + + + + + Fake Page + + +

Welcome to the Fake Page

+ + + + +""" + + +@pytest.mark.asyncio +async def test_playwright_controller_initialization() -> None: + controller = PlaywrightController() + assert controller.viewport_width == 1440 + assert controller.viewport_height == 900 + assert controller.animate_actions is False + + +@pytest.mark.asyncio +async def test_playwright_controller_visit_page() -> None: + async with async_playwright() as p: + browser = await p.chromium.launch(headless=True) + context = await browser.new_context() + page = await context.new_page() + await page.set_content(FAKE_HTML) + + controller = PlaywrightController() + await controller.visit_page(page, "data:text/html," + FAKE_HTML) + assert page.url.startswith("data:text/html") + + +@pytest.mark.asyncio +async def test_playwright_controller_click_id() -> None: + async with async_playwright() as p: + browser = await p.chromium.launch(headless=True) + context = await browser.new_context() + page = await context.new_page() + await page.set_content(FAKE_HTML) + + controller = PlaywrightController() + rects = await controller.get_interactive_rects(page) + click_me_id = "" + for rect in rects: + if rects[rect]["aria_name"] == "Click Me": + click_me_id = str(rect) + break + + await controller.click_id(page, click_me_id) + assert await page.evaluate("document.activeElement.id") == "click-me" + + +@pytest.mark.asyncio +async def test_playwright_controller_fill_id() -> None: + async with async_playwright() as p: + browser = await p.chromium.launch(headless=True) + context = await browser.new_context() + page = await context.new_page() + await page.set_content(FAKE_HTML) + rects = await PlaywrightController().get_interactive_rects(page) + input_box_id = "" + for rect in rects: + if rects[rect]["tag_name"] == "input, type=text": + input_box_id = str(rect) + break + controller = PlaywrightController() + await controller.fill_id(page, input_box_id, "test input") + assert await page.evaluate("document.getElementById('input-box').value") == "test input" diff --git a/python/packages/autogen-ext/tests/test_tools.py b/python/packages/autogen-ext/tests/test_tools.py index 3c9cf415994f..58896642a568 100644 --- a/python/packages/autogen-ext/tests/test_tools.py +++ b/python/packages/autogen-ext/tests/test_tools.py @@ -1,8 +1,9 @@ -from typing import Optional, Type +from typing import Optional, Type, cast import pytest from autogen_core import CancellationToken -from autogen_ext.tools import LangChainToolAdapter # type: ignore +from autogen_core.tools import Tool +from autogen_ext.tools.langchain import LangChainToolAdapter # type: ignore from langchain_core.callbacks.manager import AsyncCallbackManagerForToolRun, CallbackManagerForToolRun from langchain_core.tools import BaseTool as LangChainTool from langchain_core.tools import tool # pyright: ignore @@ -46,7 +47,7 @@ async def test_langchain_tool_adapter() -> None: langchain_tool = add # type: ignore # Create an adapter - adapter = LangChainToolAdapter(langchain_tool) # type: ignore + adapter = cast(Tool, LangChainToolAdapter(langchain_tool)) # type: ignore # Test schema generation schema = adapter.schema diff --git a/python/packages/autogen-ext/tests/test_websurfer_agent.py b/python/packages/autogen-ext/tests/test_websurfer_agent.py new file mode 100644 index 000000000000..d8a36e4d9549 --- /dev/null +++ b/python/packages/autogen-ext/tests/test_websurfer_agent.py @@ -0,0 +1,147 @@ +import asyncio +import json +import logging +from datetime import datetime +from typing import Any, AsyncGenerator, List + +import pytest +from autogen_agentchat import EVENT_LOGGER_NAME +from autogen_agentchat.messages import ( + MultiModalMessage, + TextMessage, +) +from autogen_ext.agents.web_surfer import MultimodalWebSurfer +from autogen_ext.models.openai import OpenAIChatCompletionClient +from openai.resources.chat.completions import AsyncCompletions +from openai.types.chat.chat_completion import ChatCompletion, Choice +from openai.types.chat.chat_completion_chunk import ChatCompletionChunk +from openai.types.chat.chat_completion_message import ChatCompletionMessage +from openai.types.chat.chat_completion_message_tool_call import ChatCompletionMessageToolCall, Function +from openai.types.completion_usage import CompletionUsage +from pydantic import BaseModel + + +class FileLogHandler(logging.Handler): + def __init__(self, filename: str) -> None: + super().__init__() + self.filename = filename + self.file_handler = logging.FileHandler(filename) + + def emit(self, record: logging.LogRecord) -> None: + ts = datetime.fromtimestamp(record.created).isoformat() + if isinstance(record.msg, BaseModel): + record.msg = json.dumps( + { + "timestamp": ts, + "message": record.msg.model_dump(), + "type": record.msg.__class__.__name__, + }, + ) + self.file_handler.emit(record) + + +class _MockChatCompletion: + def __init__(self, chat_completions: List[ChatCompletion]) -> None: + self._saved_chat_completions = chat_completions + self._curr_index = 0 + + async def mock_create( + self, *args: Any, **kwargs: Any + ) -> ChatCompletion | AsyncGenerator[ChatCompletionChunk, None]: + await asyncio.sleep(0.1) + completion = self._saved_chat_completions[self._curr_index] + self._curr_index += 1 + return completion + + +logger = logging.getLogger(EVENT_LOGGER_NAME) +logger.setLevel(logging.DEBUG) +logger.addHandler(FileLogHandler("test_websurfer_agent.log")) + + +@pytest.mark.asyncio +async def test_run_websurfer(monkeypatch: pytest.MonkeyPatch) -> None: + model = "gpt-4o-2024-05-13" + chat_completions = [ + ChatCompletion( + id="id2", + choices=[ + Choice(finish_reason="stop", index=0, message=ChatCompletionMessage(content="Hello", role="assistant")) + ], + created=0, + model=model, + object="chat.completion", + usage=CompletionUsage(prompt_tokens=10, completion_tokens=5, total_tokens=0), + ), + ChatCompletion( + id="id2", + choices=[ + Choice( + finish_reason="tool_calls", + index=0, + message=ChatCompletionMessage( + content=None, + tool_calls=[ + ChatCompletionMessageToolCall( + id="1", + type="function", + function=Function( + name="sleep", + arguments=json.dumps({"reasoning": "sleep is important"}), + ), + ) + ], + role="assistant", + ), + ) + ], + created=0, + model=model, + object="chat.completion", + usage=CompletionUsage(prompt_tokens=10, completion_tokens=5, total_tokens=0), + ), + ] + mock = _MockChatCompletion(chat_completions) + monkeypatch.setattr(AsyncCompletions, "create", mock.mock_create) + agent = MultimodalWebSurfer( + "WebSurfer", model_client=OpenAIChatCompletionClient(model=model, api_key=""), use_ocr=False + ) + # Before lazy init + assert agent._name == "WebSurfer" # pyright: ignore[reportPrivateUsage] + assert agent._playwright is None # pyright: ignore[reportPrivateUsage] + # After lazy init + result = await agent.run(task="task") + assert agent._playwright is not None # pyright: ignore[reportPrivateUsage] + assert agent._page is not None # pyright: ignore[reportPrivateUsage] + # now check result object + assert len(result.messages) == 3 + # user message + assert isinstance(result.messages[0], TextMessage) + assert result.messages[0].models_usage is None + # inner message + assert isinstance(result.messages[1], TextMessage) + # final return + assert isinstance(result.messages[2], TextMessage) + assert result.messages[2].models_usage is not None + assert result.messages[2].models_usage.completion_tokens == 5 + assert result.messages[2].models_usage.prompt_tokens == 10 + assert result.messages[2].content == "Hello" + # check internal web surfer state + assert len(agent._chat_history) == 2 # pyright: ignore[reportPrivateUsage] + assert agent._chat_history[0].content == "task" # pyright: ignore[reportPrivateUsage] + assert agent._chat_history[1].content == "Hello" # pyright: ignore[reportPrivateUsage] + url_after_no_tool = agent._page.url # pyright: ignore[reportPrivateUsage] + + # run again + result = await agent.run(task="task") + assert len(result.messages) == 3 + assert isinstance(result.messages[2], MultiModalMessage) + assert ( + result.messages[2] # type: ignore + .content[0] # type: ignore + .startswith( # type: ignore + "I am waiting a short period of time before taking further action.\n\n Here is a screenshot of the webpage:" + ) + ) # type: ignore + url_after_sleep = agent._page.url # type: ignore + assert url_after_no_tool == url_after_sleep diff --git a/python/packages/autogen-magentic-one/interface/magentic_one_helper.py b/python/packages/autogen-magentic-one/interface/magentic_one_helper.py index 8d502fed8b35..94de714067d7 100644 --- a/python/packages/autogen-magentic-one/interface/magentic_one_helper.py +++ b/python/packages/autogen-magentic-one/interface/magentic_one_helper.py @@ -20,7 +20,7 @@ from autogen_magentic_one.agents.user_proxy import UserProxy from autogen_magentic_one.messages import BroadcastMessage from autogen_magentic_one.utils import LogHandler, create_completion_client_from_env -from autogen_core.components.models import UserMessage +from autogen_core.models import UserMessage from threading import Lock diff --git a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/base_orchestrator.py b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/base_orchestrator.py index d71cc5e1f37c..66e986e52cf9 100644 --- a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/base_orchestrator.py +++ b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/base_orchestrator.py @@ -3,7 +3,7 @@ from typing import List, Optional from autogen_core import EVENT_LOGGER_NAME, AgentProxy, CancellationToken, MessageContext -from autogen_core.components.models import AssistantMessage, LLMMessage, UserMessage +from autogen_core.models import AssistantMessage, LLMMessage, UserMessage from ..messages import BroadcastMessage, OrchestrationEvent, RequestReplyMessage, ResetMessage from ..utils import message_content_to_str diff --git a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/base_worker.py b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/base_worker.py index dadd16021d48..c09660ddb8d8 100644 --- a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/base_worker.py +++ b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/base_worker.py @@ -1,7 +1,7 @@ from typing import List, Tuple from autogen_core import CancellationToken, MessageContext, TopicId -from autogen_core.components.models import ( +from autogen_core.models import ( AssistantMessage, LLMMessage, UserMessage, diff --git a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/coder.py b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/coder.py index 427adde86e1c..bed272abe0eb 100644 --- a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/coder.py +++ b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/coder.py @@ -3,7 +3,7 @@ from autogen_core import CancellationToken, default_subscription from autogen_core.code_executor import CodeBlock, CodeExecutor -from autogen_core.components.models import ( +from autogen_core.models import ( ChatCompletionClient, SystemMessage, UserMessage, diff --git a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/file_surfer/_tools.py b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/file_surfer/_tools.py index 740ea1c73f02..a49c2d8b785e 100644 --- a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/file_surfer/_tools.py +++ b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/file_surfer/_tools.py @@ -1,4 +1,4 @@ -from autogen_core.components.tools import ParametersSchema, ToolSchema +from autogen_core.tools import ParametersSchema, ToolSchema TOOL_OPEN_LOCAL_FILE = ToolSchema( name="open_local_file", diff --git a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/file_surfer/file_surfer.py b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/file_surfer/file_surfer.py index 75fba6be46e5..7e17acdeb0f7 100644 --- a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/file_surfer/file_surfer.py +++ b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/file_surfer/file_surfer.py @@ -3,7 +3,7 @@ from typing import List, Optional, Tuple from autogen_core import CancellationToken, FunctionCall, default_subscription -from autogen_core.components.models import ( +from autogen_core.models import ( ChatCompletionClient, SystemMessage, UserMessage, diff --git a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/multimodal_web_surfer/multimodal_web_surfer.py b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/multimodal_web_surfer/multimodal_web_surfer.py index 3b29414db602..f6ce98ee7519 100644 --- a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/multimodal_web_surfer/multimodal_web_surfer.py +++ b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/multimodal_web_surfer/multimodal_web_surfer.py @@ -14,7 +14,7 @@ import aiofiles from autogen_core import EVENT_LOGGER_NAME, CancellationToken, FunctionCall, default_subscription from autogen_core import Image as AGImage -from autogen_core.components.models import ( +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, LLMMessage, diff --git a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/multimodal_web_surfer/tool_definitions.py b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/multimodal_web_surfer/tool_definitions.py index b662f4101d8a..06832e98909a 100644 --- a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/multimodal_web_surfer/tool_definitions.py +++ b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/multimodal_web_surfer/tool_definitions.py @@ -1,7 +1,7 @@ from typing import Any, Dict -# TODO Why does pylance fail if I import from autogen_core.components.tools instead? -from autogen_core.components.tools._base import ParametersSchema, ToolSchema +# TODO Why does pylance fail if I import from autogen_core.tools instead? +from autogen_core.tools._base import ParametersSchema, ToolSchema def _load_tool(tooldef: Dict[str, Any]) -> ToolSchema: diff --git a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/orchestrator.py b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/orchestrator.py index f170f45839c2..9cd28a15e6cb 100644 --- a/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/orchestrator.py +++ b/python/packages/autogen-magentic-one/src/autogen_magentic_one/agents/orchestrator.py @@ -2,7 +2,7 @@ from typing import Any, Dict, List, Optional from autogen_core import AgentProxy, CancellationToken, MessageContext, TopicId, default_subscription -from autogen_core.components.models import ( +from autogen_core.models import ( AssistantMessage, ChatCompletionClient, LLMMessage, diff --git a/python/packages/autogen-magentic-one/src/autogen_magentic_one/messages.py b/python/packages/autogen-magentic-one/src/autogen_magentic_one/messages.py index 35020532f2db..b4ffdd66b1ad 100644 --- a/python/packages/autogen-magentic-one/src/autogen_magentic_one/messages.py +++ b/python/packages/autogen-magentic-one/src/autogen_magentic_one/messages.py @@ -2,7 +2,7 @@ from typing import Any, Dict, List, Union from autogen_core import FunctionCall, Image -from autogen_core.components.models import FunctionExecutionResult, LLMMessage +from autogen_core.models import FunctionExecutionResult, LLMMessage from pydantic import BaseModel # Convenience type diff --git a/python/packages/autogen-magentic-one/src/autogen_magentic_one/utils.py b/python/packages/autogen-magentic-one/src/autogen_magentic_one/utils.py index 219d2eed3071..e8df40bae59b 100644 --- a/python/packages/autogen-magentic-one/src/autogen_magentic_one/utils.py +++ b/python/packages/autogen-magentic-one/src/autogen_magentic_one/utils.py @@ -6,12 +6,12 @@ from typing import Any, Dict, List, Literal from autogen_core import Image -from autogen_core.components.models import ( +from autogen_core.logging import LLMCallEvent +from autogen_core.models import ( ChatCompletionClient, ModelCapabilities, ) -from autogen_core.logging import LLMCallEvent -from autogen_ext.models import AzureOpenAIChatCompletionClient, OpenAIChatCompletionClient +from autogen_ext.models.openai import AzureOpenAIChatCompletionClient, OpenAIChatCompletionClient from .messages import ( AgentEvent, diff --git a/python/packages/autogen-magentic-one/tests/headless_web_surfer/test_web_surfer.py b/python/packages/autogen-magentic-one/tests/headless_web_surfer/test_web_surfer.py index a1bc6a200f08..b9a7d4ceeb41 100644 --- a/python/packages/autogen-magentic-one/tests/headless_web_surfer/test_web_surfer.py +++ b/python/packages/autogen-magentic-one/tests/headless_web_surfer/test_web_surfer.py @@ -9,10 +9,10 @@ import pytest from autogen_core import AgentId, AgentProxy, FunctionCall, SingleThreadedAgentRuntime -from autogen_core.components.models import ( +from autogen_core.models import ( UserMessage, ) -from autogen_core.components.tools._base import ToolSchema +from autogen_core.tools._base import ToolSchema from autogen_magentic_one.agents.multimodal_web_surfer import MultimodalWebSurfer from autogen_magentic_one.agents.multimodal_web_surfer.tool_definitions import ( TOOL_PAGE_DOWN, diff --git a/python/packages/autogen-studio/autogenstudio/database/component_factory.py b/python/packages/autogen-studio/autogenstudio/database/component_factory.py index a3ae77b3bf78..2c42cf807233 100644 --- a/python/packages/autogen-studio/autogenstudio/database/component_factory.py +++ b/python/packages/autogen-studio/autogenstudio/database/component_factory.py @@ -7,36 +7,68 @@ import aiofiles import yaml from autogen_agentchat.agents import AssistantAgent, UserProxyAgent -from autogen_agentchat.conditions import MaxMessageTermination, StopMessageTermination, TextMentionTermination -from autogen_agentchat.teams import RoundRobinGroupChat, SelectorGroupChat -from autogen_core.components.tools import FunctionTool +from autogen_agentchat.conditions import ( + ExternalTermination, + HandoffTermination, + MaxMessageTermination, + SourceMatchTermination, + StopMessageTermination, + TextMentionTermination, + TimeoutTermination, + TokenUsageTermination, +) +from autogen_agentchat.teams import MagenticOneGroupChat, RoundRobinGroupChat, SelectorGroupChat +from autogen_core.tools import FunctionTool +from autogen_ext.agents.file_surfer import FileSurfer +from autogen_ext.agents.magentic_one import MagenticOneCoderAgent from autogen_ext.agents.web_surfer import MultimodalWebSurfer -from autogen_ext.models import OpenAIChatCompletionClient +from autogen_ext.models.openai import AzureOpenAIChatCompletionClient, OpenAIChatCompletionClient from ..datamodel.types import ( AgentConfig, AgentTypes, + AssistantAgentConfig, + AzureOpenAIModelConfig, + CombinationTerminationConfig, ComponentConfig, ComponentConfigInput, ComponentTypes, + MagenticOneTeamConfig, + MaxMessageTerminationConfig, ModelConfig, ModelTypes, + MultimodalWebSurferAgentConfig, + OpenAIModelConfig, + RoundRobinTeamConfig, + SelectorTeamConfig, TeamConfig, TeamTypes, TerminationConfig, TerminationTypes, + TextMentionTerminationConfig, ToolConfig, ToolTypes, + UserProxyAgentConfig, ) from ..utils.utils import Version logger = logging.getLogger(__name__) -TeamComponent = Union[RoundRobinGroupChat, SelectorGroupChat] -AgentComponent = Union[AssistantAgent, MultimodalWebSurfer] -ModelComponent = Union[OpenAIChatCompletionClient] +TeamComponent = Union[RoundRobinGroupChat, SelectorGroupChat, MagenticOneGroupChat] +AgentComponent = Union[AssistantAgent, MultimodalWebSurfer, UserProxyAgent, FileSurfer, MagenticOneCoderAgent] +ModelComponent = Union[OpenAIChatCompletionClient, AzureOpenAIChatCompletionClient] ToolComponent = Union[FunctionTool] # Will grow with more tool types -TerminationComponent = Union[MaxMessageTermination, StopMessageTermination, TextMentionTermination] +TerminationComponent = Union[ + MaxMessageTermination, + StopMessageTermination, + TextMentionTermination, + TimeoutTermination, + ExternalTermination, + TokenUsageTermination, + HandoffTermination, + SourceMatchTermination, + StopMessageTermination, +] Component = Union[TeamComponent, AgentComponent, ModelComponent, ToolComponent, TerminationComponent] @@ -66,7 +98,7 @@ class ComponentFactory: } def __init__(self): - self._model_cache: Dict[str, OpenAIChatCompletionClient] = {} + self._model_cache: Dict[str, ModelComponent] = {} self._tool_cache: Dict[str, FunctionTool] = {} self._last_cache_clear = datetime.now() @@ -151,23 +183,58 @@ async def load_directory( return components def _dict_to_config(self, config_dict: dict) -> ComponentConfig: - """Convert dictionary to appropriate config type based on component_type""" + """Convert dictionary to appropriate config type based on component_type and type discriminator""" if "component_type" not in config_dict: raise ValueError("component_type is required in configuration") - config_types = { - ComponentTypes.TEAM: TeamConfig, - ComponentTypes.AGENT: AgentConfig, - ComponentTypes.MODEL: ModelConfig, + component_type = ComponentTypes(config_dict["component_type"]) + + # Define mapping structure + type_mappings = { + ComponentTypes.MODEL: { + "discriminator": "model_type", + ModelTypes.OPENAI.value: OpenAIModelConfig, + ModelTypes.AZUREOPENAI.value: AzureOpenAIModelConfig, + }, + ComponentTypes.AGENT: { + "discriminator": "agent_type", + AgentTypes.ASSISTANT.value: AssistantAgentConfig, + AgentTypes.USERPROXY.value: UserProxyAgentConfig, + AgentTypes.MULTIMODAL_WEBSURFER.value: MultimodalWebSurferAgentConfig, + }, + ComponentTypes.TEAM: { + "discriminator": "team_type", + TeamTypes.ROUND_ROBIN.value: RoundRobinTeamConfig, + TeamTypes.SELECTOR.value: SelectorTeamConfig, + TeamTypes.MAGENTIC_ONE.value: MagenticOneTeamConfig, + }, ComponentTypes.TOOL: ToolConfig, - ComponentTypes.TERMINATION: TerminationConfig, # Add mapping for termination + ComponentTypes.TERMINATION: { + "discriminator": "termination_type", + TerminationTypes.MAX_MESSAGES.value: MaxMessageTerminationConfig, + TerminationTypes.TEXT_MENTION.value: TextMentionTerminationConfig, + TerminationTypes.COMBINATION.value: CombinationTerminationConfig, + }, } - component_type = ComponentTypes(config_dict["component_type"]) - config_class = config_types.get(component_type) + mapping = type_mappings.get(component_type) + if not mapping: + raise ValueError(f"Unknown component type: {component_type}") + + # Handle simple cases (no discriminator) + if isinstance(mapping, type): + return mapping(**config_dict) + + # Get discriminator field value + discriminator = mapping["discriminator"] + if discriminator not in config_dict: + raise ValueError(f"Missing {discriminator} in configuration") + + type_value = config_dict[discriminator] + config_class = mapping.get(type_value) if not config_class: - raise ValueError(f"Unknown component type: {component_type}") + raise ValueError(f"Unknown {discriminator}: {type_value}") return config_class(**config_dict) @@ -220,11 +287,6 @@ async def load_team(self, config: TeamConfig, input_func: Optional[Callable] = N agent = await self.load(participant, input_func=input_func) participants.append(agent) - # Load model client if specified - model_client = None - if config.model_client: - model_client = await self.load(config.model_client) - # Load termination condition if specified termination = None if config.termination_condition: @@ -234,6 +296,7 @@ async def load_team(self, config: TeamConfig, input_func: Optional[Callable] = N if config.team_type == TeamTypes.ROUND_ROBIN: return RoundRobinGroupChat(participants=participants, termination_condition=termination) elif config.team_type == TeamTypes.SELECTOR: + model_client = await self.load(config.model_client) if not model_client: raise ValueError("SelectorGroupChat requires a model_client") selector_prompt = config.selector_prompt if config.selector_prompt else DEFAULT_SELECTOR_PROMPT @@ -243,6 +306,16 @@ async def load_team(self, config: TeamConfig, input_func: Optional[Callable] = N termination_condition=termination, selector_prompt=selector_prompt, ) + elif config.team_type == TeamTypes.MAGENTIC_ONE: + model_client = await self.load(config.model_client) + if not model_client: + raise ValueError("MagenticOneGroupChat requires a model_client") + return MagenticOneGroupChat( + participants=participants, + model_client=model_client, + termination_condition=termination if termination is not None else None, + max_turns=config.max_turns if config.max_turns is not None else 20, + ) else: raise ValueError(f"Unsupported team type: {config.team_type}") @@ -252,14 +325,15 @@ async def load_team(self, config: TeamConfig, input_func: Optional[Callable] = N async def load_agent(self, config: AgentConfig, input_func: Optional[Callable] = None) -> AgentComponent: """Create agent instance from configuration.""" + + system_message = config.system_message if config.system_message else "You are a helpful assistant" + try: # Load model client if specified model_client = None if config.model_client: model_client = await self.load(config.model_client) - system_message = config.system_message if config.system_message else "You are a helpful assistant" - # Load tools if specified tools = [] if config.tools: @@ -274,6 +348,8 @@ async def load_agent(self, config: AgentConfig, input_func: Optional[Callable] = input_func=input_func, # Pass through to UserProxyAgent ) elif config.agent_type == AgentTypes.ASSISTANT: + system_message = config.system_message if config.system_message else "You are a helpful assistant" + return AssistantAgent( name=config.name, description=config.description or "A helpful assistant", @@ -286,13 +362,22 @@ async def load_agent(self, config: AgentConfig, input_func: Optional[Callable] = name=config.name, model_client=model_client, headless=config.headless if config.headless is not None else True, - debug_dir=config.logs_dir if config.logs_dir is not None else "logs", - downloads_folder=config.logs_dir if config.logs_dir is not None else "logs", + debug_dir=config.logs_dir if config.logs_dir is not None else None, + downloads_folder=config.logs_dir if config.logs_dir is not None else None, to_save_screenshots=config.to_save_screenshots if config.to_save_screenshots is not None else False, use_ocr=config.use_ocr if config.use_ocr is not None else False, animate_actions=config.animate_actions if config.animate_actions is not None else False, ) - + elif config.agent_type == AgentTypes.FILE_SURFER: + return FileSurfer( + name=config.name, + model_client=model_client, + ) + elif config.agent_type == AgentTypes.MAGENTIC_ONE_CODER: + return MagenticOneCoderAgent( + name=config.name, + model_client=model_client, + ) else: raise ValueError(f"Unsupported agent type: {config.agent_type}") @@ -310,7 +395,26 @@ async def load_model(self, config: ModelConfig) -> ModelComponent: return self._model_cache[cache_key] if config.model_type == ModelTypes.OPENAI: - model = OpenAIChatCompletionClient(model=config.model, api_key=config.api_key, base_url=config.base_url) + args = { + "model": config.model, + "api_key": config.api_key, + "base_url": config.base_url, + } + + if hasattr(config, "model_capabilities") and config.model_capabilities is not None: + args["model_capabilities"] = config.model_capabilities + + model = OpenAIChatCompletionClient(**args) + self._model_cache[cache_key] = model + return model + elif config.model_type == ModelTypes.AZUREOPENAI: + model = AzureOpenAIChatCompletionClient( + azure_deployment=config.azure_deployment, + model=config.model, + api_version=config.api_version, + azure_endpoint=config.azure_endpoint, + api_key=config.api_key, + ) self._model_cache[cache_key] = model return model else: diff --git a/python/packages/autogen-studio/autogenstudio/datamodel/db.py b/python/packages/autogen-studio/autogenstudio/datamodel/db.py index 6395a535fd6b..45f439d33910 100644 --- a/python/packages/autogen-studio/autogenstudio/datamodel/db.py +++ b/python/packages/autogen-studio/autogenstudio/datamodel/db.py @@ -118,7 +118,7 @@ class Tool(SQLModel, table=True): ) # pylint: disable=not-callable user_id: Optional[str] = None version: Optional[str] = "0.0.1" - config: Union[ToolConfig, dict] = Field(default_factory=ToolConfig, sa_column=Column(JSON)) + config: Union[ToolConfig, dict] = Field(sa_column=Column(JSON)) agents: List["Agent"] = Relationship(back_populates="tools", link_model=AgentToolLink) @@ -135,7 +135,7 @@ class Model(SQLModel, table=True): ) # pylint: disable=not-callable user_id: Optional[str] = None version: Optional[str] = "0.0.1" - config: Union[ModelConfig, dict] = Field(default_factory=ModelConfig, sa_column=Column(JSON)) + config: Union[ModelConfig, dict] = Field(sa_column=Column(JSON)) agents: List["Agent"] = Relationship(back_populates="models", link_model=AgentModelLink) @@ -152,7 +152,7 @@ class Team(SQLModel, table=True): ) # pylint: disable=not-callable user_id: Optional[str] = None version: Optional[str] = "0.0.1" - config: Union[TeamConfig, dict] = Field(default_factory=TeamConfig, sa_column=Column(JSON)) + config: Union[TeamConfig, dict] = Field(sa_column=Column(JSON)) agents: List["Agent"] = Relationship(back_populates="teams", link_model=TeamAgentLink) @@ -169,7 +169,7 @@ class Agent(SQLModel, table=True): ) # pylint: disable=not-callable user_id: Optional[str] = None version: Optional[str] = "0.0.1" - config: Union[AgentConfig, dict] = Field(default_factory=AgentConfig, sa_column=Column(JSON)) + config: Union[AgentConfig, dict] = Field(sa_column=Column(JSON)) tools: List[Tool] = Relationship(back_populates="agents", link_model=AgentToolLink) models: List[Model] = Relationship(back_populates="agents", link_model=AgentModelLink) teams: List[Team] = Relationship(back_populates="agents", link_model=TeamAgentLink) diff --git a/python/packages/autogen-studio/autogenstudio/datamodel/types.py b/python/packages/autogen-studio/autogenstudio/datamodel/types.py index 795a10b56419..eb02fb121ebe 100644 --- a/python/packages/autogen-studio/autogenstudio/datamodel/types.py +++ b/python/packages/autogen-studio/autogenstudio/datamodel/types.py @@ -1,14 +1,16 @@ from datetime import datetime from enum import Enum from pathlib import Path -from typing import Any, Dict, List, Literal, Optional, Union +from typing import Any, Dict, List, Optional, Union from autogen_agentchat.base import TaskResult -from pydantic import BaseModel +from autogen_core.models import ModelCapabilities +from pydantic import BaseModel, Field class ModelTypes(str, Enum): OPENAI = "OpenAIChatCompletionClient" + AZUREOPENAI = "AzureOpenAIChatCompletionClient" class ToolTypes(str, Enum): @@ -19,11 +21,14 @@ class AgentTypes(str, Enum): ASSISTANT = "AssistantAgent" USERPROXY = "UserProxyAgent" MULTIMODAL_WEBSURFER = "MultimodalWebSurfer" + FILE_SURFER = "FileSurfer" + MAGENTIC_ONE_CODER = "MagenticOneCoderAgent" class TeamTypes(str, Enum): ROUND_ROBIN = "RoundRobinGroupChat" SELECTOR = "SelectorGroupChat" + MAGENTIC_ONE = "MagenticOneGroupChat" class TerminationTypes(str, Enum): @@ -53,12 +58,30 @@ class MessageConfig(BaseModel): message_type: Optional[str] = "text" -class ModelConfig(BaseConfig): +class BaseModelConfig(BaseConfig): model: str model_type: ModelTypes api_key: Optional[str] = None base_url: Optional[str] = None component_type: ComponentTypes = ComponentTypes.MODEL + model_capabilities: Optional[ModelCapabilities] = None + + +class OpenAIModelConfig(BaseModelConfig): + model_type: ModelTypes = ModelTypes.OPENAI + + +class AzureOpenAIModelConfig(BaseModelConfig): + azure_deployment: str + model: str + api_version: str + azure_endpoint: str + azure_ad_token_provider: Optional[str] = None + api_key: Optional[str] = None + model_type: ModelTypes = ModelTypes.AZUREOPENAI + + +ModelConfig = OpenAIModelConfig | AzureOpenAIModelConfig class ToolConfig(BaseConfig): @@ -69,40 +92,98 @@ class ToolConfig(BaseConfig): component_type: ComponentTypes = ComponentTypes.TOOL -class AgentConfig(BaseConfig): +class BaseAgentConfig(BaseConfig): name: str agent_type: AgentTypes - system_message: Optional[str] = None - model_client: Optional[ModelConfig] = None - tools: Optional[List[ToolConfig]] = None description: Optional[str] = None component_type: ComponentTypes = ComponentTypes.AGENT - headless: Optional[bool] = None - logs_dir: Optional[str] = None - to_save_screenshots: Optional[bool] = None - use_ocr: Optional[bool] = None - animate_actions: Optional[bool] = None -class TerminationConfig(BaseConfig): +class AssistantAgentConfig(BaseAgentConfig): + agent_type: AgentTypes = AgentTypes.ASSISTANT + model_client: ModelConfig + tools: Optional[List[ToolConfig]] = None + system_message: Optional[str] = None + + +class UserProxyAgentConfig(BaseAgentConfig): + agent_type: AgentTypes = AgentTypes.USERPROXY + + +class MultimodalWebSurferAgentConfig(BaseAgentConfig): + agent_type: AgentTypes = AgentTypes.MULTIMODAL_WEBSURFER + model_client: ModelConfig + headless: bool = True + logs_dir: str = None + to_save_screenshots: bool = False + use_ocr: bool = False + animate_actions: bool = False + tools: Optional[List[ToolConfig]] = None + + +AgentConfig = AssistantAgentConfig | UserProxyAgentConfig | MultimodalWebSurferAgentConfig + + +class BaseTerminationConfig(BaseConfig): termination_type: TerminationTypes - # Fields for basic terminations - max_messages: Optional[int] = None - text: Optional[str] = None - # Fields for combinations - operator: Optional[Literal["and", "or"]] = None - conditions: Optional[List["TerminationConfig"]] = None component_type: ComponentTypes = ComponentTypes.TERMINATION -class TeamConfig(BaseConfig): +class MaxMessageTerminationConfig(BaseTerminationConfig): + termination_type: TerminationTypes = TerminationTypes.MAX_MESSAGES + max_messages: int + + +class TextMentionTerminationConfig(BaseTerminationConfig): + termination_type: TerminationTypes = TerminationTypes.TEXT_MENTION + text: str + + +class StopMessageTerminationConfig(BaseTerminationConfig): + termination_type: TerminationTypes = TerminationTypes.STOP_MESSAGE + + +class CombinationTerminationConfig(BaseTerminationConfig): + termination_type: TerminationTypes = TerminationTypes.COMBINATION + operator: str + conditions: List["TerminationConfig"] + + +TerminationConfig = ( + MaxMessageTerminationConfig + | TextMentionTerminationConfig + | CombinationTerminationConfig + | StopMessageTerminationConfig +) + + +class BaseTeamConfig(BaseConfig): name: str participants: List[AgentConfig] team_type: TeamTypes - model_client: Optional[ModelConfig] = None - selector_prompt: Optional[str] = None termination_condition: Optional[TerminationConfig] = None component_type: ComponentTypes = ComponentTypes.TEAM + max_turns: Optional[int] = None + + +class RoundRobinTeamConfig(BaseTeamConfig): + team_type: TeamTypes = TeamTypes.ROUND_ROBIN + + +class SelectorTeamConfig(BaseTeamConfig): + team_type: TeamTypes = TeamTypes.SELECTOR + selector_prompt: Optional[str] = None + model_client: ModelConfig + + +class MagenticOneTeamConfig(BaseTeamConfig): + team_type: TeamTypes = TeamTypes.MAGENTIC_ONE + model_client: ModelConfig + max_stalls: int = 3 + final_answer_prompt: Optional[str] = None + + +TeamConfig = RoundRobinTeamConfig | SelectorTeamConfig | MagenticOneTeamConfig class TeamResult(BaseModel): diff --git a/python/packages/autogen-studio/autogenstudio/teammanager.py b/python/packages/autogen-studio/autogenstudio/teammanager.py index bc3e01577082..fdad55fb4fba 100644 --- a/python/packages/autogen-studio/autogenstudio/teammanager.py +++ b/python/packages/autogen-studio/autogenstudio/teammanager.py @@ -44,6 +44,11 @@ async def run_stream( else: yield message + # close agent resources + for agent in team._participants: + if hasattr(agent, "close"): + await agent.close() + except Exception as e: raise e @@ -60,4 +65,9 @@ async def run( team = await self._create_team(team_config, input_func) result = await team.run(task=task, cancellation_token=cancellation_token) + # close agent resources + for agent in team._participants: + if hasattr(agent, "close"): + await agent.close() + return self._create_result(result, start_time) diff --git a/python/packages/autogen-studio/autogenstudio/version.py b/python/packages/autogen-studio/autogenstudio/version.py index 8534dc259905..525ab752dcd4 100644 --- a/python/packages/autogen-studio/autogenstudio/version.py +++ b/python/packages/autogen-studio/autogenstudio/version.py @@ -1,3 +1,3 @@ -VERSION = "0.4.0.dev38" +VERSION = "0.4.0.dev41" __version__ = VERSION APP_NAME = "autogenstudio" diff --git a/python/packages/autogen-studio/autogenstudio/web/managers/connection.py b/python/packages/autogen-studio/autogenstudio/web/managers/connection.py index 1b7550bdc1e5..a42ca4ba4b5f 100644 --- a/python/packages/autogen-studio/autogenstudio/web/managers/connection.py +++ b/python/packages/autogen-studio/autogenstudio/web/managers/connection.py @@ -5,7 +5,16 @@ from uuid import UUID from autogen_agentchat.base._task import TaskResult -from autogen_agentchat.messages import AgentMessage, ChatMessage, MultiModalMessage, TextMessage +from autogen_agentchat.messages import ( + AgentMessage, + ChatMessage, + HandoffMessage, + MultiModalMessage, + StopMessage, + TextMessage, + ToolCallMessage, + ToolCallResultMessage, +) from autogen_core import CancellationToken from autogen_core import Image as AGImage from fastapi import WebSocket, WebSocketDisconnect @@ -91,13 +100,22 @@ async def start_stream(self, run_id: UUID, task: str, team_config: dict) -> None if formatted_message: await self._send_message(run_id, formatted_message) - # Save message if it's a content message - if isinstance(message, (AgentMessage, ChatMessage)): + # Save messages by concrete type + if isinstance( + message, + ( + TextMessage, + MultiModalMessage, + StopMessage, + HandoffMessage, + ToolCallMessage, + ToolCallResultMessage, + ), + ): await self._save_message(run_id, message) # Capture final result if it's a TeamResult elif isinstance(message, TeamResult): final_result = message.model_dump() - if not cancellation_token.is_cancelled() and run_id not in self._closed_connections: if final_result: await self._update_run(run_id, RunStatus.COMPLETE, team_result=final_result) @@ -258,7 +276,8 @@ async def _handle_stream_error(self, run_id: UUID, error: Exception) -> None: if run_id not in self._closed_connections: error_result = TeamResult( task_result=TaskResult( - messages=[TextMessage(source="system", content=str(error))], stop_reason="error" + messages=[TextMessage(source="system", content=str(error))], + stop_reason="An error occurred while processing this run", ), usage="", duration=0, @@ -285,6 +304,7 @@ def _format_message(self, message: Any) -> Optional[dict]: Returns: Optional[dict]: Formatted message or None if formatting fails """ + try: if isinstance(message, MultiModalMessage): message_dump = message.model_dump() @@ -296,8 +316,6 @@ def _format_message(self, message: Any) -> Optional[dict]: }, ] return {"type": "message", "data": message_dump} - elif isinstance(message, (AgentMessage, ChatMessage)): - return {"type": "message", "data": message.model_dump()} elif isinstance(message, TeamResult): return { @@ -305,7 +323,14 @@ def _format_message(self, message: Any) -> Optional[dict]: "data": message.model_dump(), "status": "complete", } + + elif isinstance( + message, (TextMessage, StopMessage, HandoffMessage, ToolCallMessage, ToolCallResultMessage) + ): + return {"type": "message", "data": message.model_dump()} + return None + except Exception as e: logger.error(f"Message formatting error: {e}") return None diff --git a/python/packages/autogen-studio/docs/ags_screen.png b/python/packages/autogen-studio/docs/ags_screen.png index 30982cf6a828..017b69aac25d 100644 --- a/python/packages/autogen-studio/docs/ags_screen.png +++ b/python/packages/autogen-studio/docs/ags_screen.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aa05d0e55262549880e3e06ca3839cffdbcd0836bd2b98690185255f03dc98ac -size 194702 +oid sha256:54473a4fbfcded2b3e008b448c00117e801462cc7687b0bc14a1c22c92dbdb97 +size 621469 diff --git a/python/packages/autogen-studio/frontend/package.json b/python/packages/autogen-studio/frontend/package.json index 822c0696531f..5beb6e6205b5 100644 --- a/python/packages/autogen-studio/frontend/package.json +++ b/python/packages/autogen-studio/frontend/package.json @@ -18,6 +18,7 @@ }, "dependencies": { "@dagrejs/dagre": "^1.1.4", + "@dnd-kit/core": "^6.2.0", "@headlessui/react": "^2.2.0", "@heroicons/react": "^2.0.18", "@mdx-js/react": "^3.1.0", diff --git a/python/packages/autogen-studio/frontend/src/components/contentheader.tsx b/python/packages/autogen-studio/frontend/src/components/contentheader.tsx index 0309b51dbc89..5001c174d02a 100644 --- a/python/packages/autogen-studio/frontend/src/components/contentheader.tsx +++ b/python/packages/autogen-studio/frontend/src/components/contentheader.tsx @@ -48,7 +48,7 @@ const ContentHeader = ({ {/* Desktop Sidebar Toggle - Hidden on Mobile */} -
+ {/*
-
+
*/}
{/* Breadcrumbs */} diff --git a/python/packages/autogen-studio/frontend/src/components/layout.tsx b/python/packages/autogen-studio/frontend/src/components/layout.tsx index 42182b07684f..d3216d340771 100644 --- a/python/packages/autogen-studio/frontend/src/components/layout.tsx +++ b/python/packages/autogen-studio/frontend/src/components/layout.tsx @@ -7,6 +7,7 @@ import Footer from "./footer"; import "antd/dist/reset.css"; import SideBar from "./sidebar"; import ContentHeader from "./contentheader"; +import { ConfigProvider, theme } from "antd"; const classNames = (...classes: (string | undefined | boolean)[]) => { return classes.filter(Boolean).join(" "); @@ -91,13 +92,25 @@ const Layout = ({ > {showHeader && ( setIsMobileMenuOpen(!isMobileMenuOpen)} /> )} -
{children}
+ +
{children}
+
diff --git a/python/packages/autogen-studio/frontend/src/components/sidebar.tsx b/python/packages/autogen-studio/frontend/src/components/sidebar.tsx index 9a8fc2a2c493..7fbef8c57369 100644 --- a/python/packages/autogen-studio/frontend/src/components/sidebar.tsx +++ b/python/packages/autogen-studio/frontend/src/components/sidebar.tsx @@ -2,7 +2,15 @@ import React from "react"; import { Link } from "gatsby"; import { useConfigStore } from "../hooks/store"; import { Tooltip } from "antd"; -import { Settings, MessagesSquare } from "lucide-react"; +import { + Settings, + MessagesSquare, + Blocks, + Bot, + PanelLeftClose, + PanelLeftOpen, + GalleryHorizontalEnd, +} from "lucide-react"; import Icon from "./icons"; interface INavItem { @@ -17,12 +25,24 @@ interface INavItem { } const navigation: INavItem[] = [ + { + name: "Team Builder", + href: "/build", + icon: Bot, + breadcrumbs: [{ name: "Team Builder", href: "/build", current: true }], + }, { name: "Playground", href: "/", icon: MessagesSquare, breadcrumbs: [{ name: "Playground", href: "/", current: true }], }, + { + name: "Gallery", + href: "/gallery", + icon: GalleryHorizontalEnd, + breadcrumbs: [{ name: "Gallery", href: "/gallery", current: true }], + }, ]; const classNames = (...classes: (string | undefined | boolean)[]) => { @@ -51,9 +71,9 @@ const Sidebar = ({ link, meta, isMobile }: SidebarProps) => { const showFull = isMobile || isExpanded; const handleNavClick = (item: INavItem) => { - if (!isExpanded) { - setSidebarState({ isExpanded: true }); - } + // if (!isExpanded) { + // setSidebarState({ isExpanded: true }); + // } setHeader({ title: item.name, breadcrumbs: item.breadcrumbs, @@ -121,29 +141,37 @@ const Sidebar = ({ link, meta, isMobile }: SidebarProps) => { const IconComponent = item.icon; const navLink = ( - handleNavClick(item)} - className={classNames( - // Base styles - "group flex gap-x-3 rounded-md p-2 text-sm font-medium", - !showFull && "justify-center", - // Color states - isActive - ? "bg-secondary/50 text-accent" - : "text-secondary hover:bg-secondary/50 hover:text-accent" +
+ {isActive && ( +
+ {" "} +
)} - > - handleNavClick(item)} className={classNames( - "h-6 w-6 shrink-0", + // Base styles + "group ml-1 flex gap-x-3 rounded-md mr-2 p-2 text-sm font-medium", + !showFull && "justify-center", + // Color states isActive - ? "text-accent" - : "text-secondary group-hover:text-accent" + ? "bg-secondary text-primary " + : "text-secondary hover:bg-tertiary hover:text-accent" )} - /> - {showFull && item.name} - + > + {" "} + + {showFull && item.name} + +
); return ( @@ -165,11 +193,53 @@ const Sidebar = ({ link, meta, isMobile }: SidebarProps) => {
  • {!showFull && !isMobile ? ( - + <> + + + setHeader({ + title: "Settings", + breadcrumbs: [ + { + name: "Settings", + href: "/settings", + current: true, + }, + ], + }) + } + className="group flex gap-x-3 rounded-md p-2 text-sm font-medium text-primary hover:text-accent hover:bg-secondary justify-center" + > + + + +
    + + + +
    + + ) : ( +
    @@ -180,31 +250,24 @@ const Sidebar = ({ link, meta, isMobile }: SidebarProps) => { ], }) } - className={classNames( - "group flex gap-x-3 rounded-md p-2 text-sm font-medium", - "text-primary hover:text-accent hover:bg-secondary", - !showFull && "justify-center" - )} + className="group flex flex-1 gap-x-3 rounded-md p-2 text-sm font-medium text-primary hover:text-accent hover:bg-secondary" > + {showFull && "Settings"} - - ) : ( - - setHeader({ - title: "Settings", - breadcrumbs: [ - { name: "Settings", href: "/settings", current: true }, - ], - }) - } - className="group flex gap-x-3 rounded-md p-2 text-sm font-medium text-primary hover:text-accent hover:bg-secondary" - > - - {showFull && "Settings"} - +
    + +
    +
    )}
  • diff --git a/python/packages/autogen-studio/frontend/src/components/types/datamodel.ts b/python/packages/autogen-studio/frontend/src/components/types/datamodel.ts index e408a1d84562..b502f04c892c 100644 --- a/python/packages/autogen-studio/frontend/src/components/types/datamodel.ts +++ b/python/packages/autogen-studio/frontend/src/components/types/datamodel.ts @@ -91,9 +91,14 @@ export interface Session extends DBModel { team_id?: number; } +export interface SessionRuns { + runs: Run[]; +} + export interface BaseConfig { component_type: string; version?: string; + description?: string; } export interface WebSocketMessage { @@ -109,25 +114,30 @@ export interface TaskResult { stop_reason?: string; } -export type ModelTypes = "OpenAIChatCompletionClient"; +export type ModelTypes = + | "OpenAIChatCompletionClient" + | "AzureOpenAIChatCompletionClient"; export type AgentTypes = | "AssistantAgent" - | "CodingAssistantAgent" - | "MultimodalWebSurfer"; + | "UserProxyAgent" + | "MultimodalWebSurfer" + | "FileSurfer" + | "MagenticOneCoderAgent"; -export type TeamTypes = "RoundRobinGroupChat" | "SelectorGroupChat"; +export type ToolTypes = "PythonFunction"; + +export type TeamTypes = + | "RoundRobinGroupChat" + | "SelectorGroupChat" + | "MagenticOneGroupChat"; -// class ComponentType(str, Enum): -// TEAM = "team" -// AGENT = "agent" -// MODEL = "model" -// TOOL = "tool" -// TERMINATION = "termination" export type TerminationTypes = | "MaxMessageTermination" | "StopMessageTermination" - | "TextMentionTermination"; + | "TextMentionTermination" + | "TimeoutTermination" + | "CombinationTermination"; export type ComponentTypes = | "team" @@ -136,20 +146,48 @@ export type ComponentTypes = | "tool" | "termination"; -export interface ModelConfig extends BaseConfig { +export type ComponentConfigTypes = + | TeamConfig + | AgentConfig + | ModelConfig + | ToolConfig + | TerminationConfig; + +export interface BaseModelConfig extends BaseConfig { model: string; model_type: ModelTypes; api_key?: string; base_url?: string; } -export interface ToolConfig extends BaseConfig { +export interface AzureOpenAIModelConfig extends BaseModelConfig { + model_type: "AzureOpenAIChatCompletionClient"; + azure_deployment: string; + api_version: string; + azure_endpoint: string; + azure_ad_token_provider: string; +} + +export interface OpenAIModelConfig extends BaseModelConfig { + model_type: "OpenAIChatCompletionClient"; +} + +export type ModelConfig = AzureOpenAIModelConfig | OpenAIModelConfig; + +export interface BaseToolConfig extends BaseConfig { name: string; description: string; content: string; - tool_type: string; + tool_type: ToolTypes; } -export interface AgentConfig extends BaseConfig { + +export interface PythonFunctionToolConfig extends BaseToolConfig { + tool_type: "PythonFunction"; +} + +export type ToolConfig = PythonFunctionToolConfig; + +export interface BaseAgentConfig extends BaseConfig { name: string; agent_type: AgentTypes; system_message?: string; @@ -157,21 +195,84 @@ export interface AgentConfig extends BaseConfig { tools?: ToolConfig[]; description?: string; } -export interface TerminationConfig extends BaseConfig { + +export interface AssistantAgentConfig extends BaseAgentConfig { + agent_type: "AssistantAgent"; +} + +export interface UserProxyAgentConfig extends BaseAgentConfig { + agent_type: "UserProxyAgent"; +} + +export interface MultimodalWebSurferAgentConfig extends BaseAgentConfig { + agent_type: "MultimodalWebSurfer"; +} + +export interface FileSurferAgentConfig extends BaseAgentConfig { + agent_type: "FileSurfer"; +} + +export interface MagenticOneCoderAgentConfig extends BaseAgentConfig { + agent_type: "MagenticOneCoderAgent"; +} + +export type AgentConfig = + | AssistantAgentConfig + | UserProxyAgentConfig + | MultimodalWebSurferAgentConfig + | FileSurferAgentConfig + | MagenticOneCoderAgentConfig; + +// export interface TerminationConfig extends BaseConfig { +// termination_type: TerminationTypes; +// max_messages?: number; +// text?: string; +// } + +export interface BaseTerminationConfig extends BaseConfig { termination_type: TerminationTypes; - max_messages?: number; - text?: string; } -export interface TeamConfig extends BaseConfig { +export interface MaxMessageTerminationConfig extends BaseTerminationConfig { + termination_type: "MaxMessageTermination"; + max_messages: number; +} + +export interface TextMentionTerminationConfig extends BaseTerminationConfig { + termination_type: "TextMentionTermination"; + text: string; +} + +export interface CombinationTerminationConfig extends BaseTerminationConfig { + termination_type: "CombinationTermination"; + operator: "and" | "or"; + conditions: TerminationConfig[]; +} + +export type TerminationConfig = + | MaxMessageTerminationConfig + | TextMentionTerminationConfig + | CombinationTerminationConfig; + +export interface BaseTeamConfig extends BaseConfig { name: string; participants: AgentConfig[]; team_type: TeamTypes; - model_client?: ModelConfig; termination_condition?: TerminationConfig; - selector_config?: string; } +export interface RoundRobinGroupChatConfig extends BaseTeamConfig { + team_type: "RoundRobinGroupChat"; +} + +export interface SelectorGroupChatConfig extends BaseTeamConfig { + team_type: "SelectorGroupChat"; + selector_prompt: string; + model_client: ModelConfig; +} + +export type TeamConfig = RoundRobinGroupChatConfig | SelectorGroupChatConfig; + export interface Team extends DBModel { config: TeamConfig; } @@ -185,6 +286,7 @@ export interface TeamResult { export interface Run { id: string; created_at: string; + updated_at?: string; status: RunStatus; task: AgentMessageConfig; team_result: TeamResult | null; diff --git a/python/packages/autogen-studio/frontend/src/components/views/shared/atoms.tsx b/python/packages/autogen-studio/frontend/src/components/views/atoms.tsx similarity index 80% rename from python/packages/autogen-studio/frontend/src/components/views/shared/atoms.tsx rename to python/packages/autogen-studio/frontend/src/components/views/atoms.tsx index fcd95ca76093..b3db483b4a29 100644 --- a/python/packages/autogen-studio/frontend/src/components/views/shared/atoms.tsx +++ b/python/packages/autogen-studio/frontend/src/components/views/atoms.tsx @@ -164,3 +164,31 @@ export const ClickableImage: React.FC<{ ); }; + +// dateUtils.ts +export function getRelativeTimeString(date: string | number | Date): string { + const now = new Date(); + const past = new Date(date); + const diffInMs = now.getTime() - past.getTime(); + + const diffInSeconds = Math.floor(diffInMs / 1000); + const diffInMinutes = Math.floor(diffInSeconds / 60); + const diffInHours = Math.floor(diffInMinutes / 60); + const diffInDays = Math.floor(diffInHours / 24); + const diffInMonths = Math.floor(diffInDays / 30); + const diffInYears = Math.floor(diffInDays / 365); + + if (diffInSeconds < 60) { + return "just now"; + } else if (diffInMinutes < 60) { + return `${diffInMinutes} ${diffInMinutes === 1 ? "minute" : "minutes"} ago`; + } else if (diffInHours < 24) { + return `${diffInHours} ${diffInHours === 1 ? "hour" : "hours"} ago`; + } else if (diffInDays < 30) { + return `${diffInDays} ${diffInDays === 1 ? "day" : "days"} ago`; + } else if (diffInMonths < 12) { + return `${diffInMonths} ${diffInMonths === 1 ? "month" : "months"} ago`; + } else { + return `${diffInYears} ${diffInYears === 1 ? "year" : "years"} ago`; + } +} diff --git a/python/packages/autogen-studio/frontend/src/components/views/gallery/create-modal.tsx b/python/packages/autogen-studio/frontend/src/components/views/gallery/create-modal.tsx new file mode 100644 index 000000000000..80ff323add93 --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/gallery/create-modal.tsx @@ -0,0 +1,200 @@ +import React, { useState, useRef } from "react"; +import { Modal, Tabs, Input, Button, Alert, Upload } from "antd"; +import { Globe, Upload as UploadIcon, Code } from "lucide-react"; +import { MonacoEditor } from "../monaco"; +import type { InputRef, UploadFile, UploadProps } from "antd"; +import { Gallery } from "./types"; +import { defaultGallery } from "./utils"; + +interface GalleryCreateModalProps { + open: boolean; + onCancel: () => void; + onCreateGallery: (gallery: Gallery) => void; +} + +export const GalleryCreateModal: React.FC = ({ + open, + onCancel, + onCreateGallery, +}) => { + const [activeTab, setActiveTab] = useState("url"); + const [url, setUrl] = useState(""); + const [jsonContent, setJsonContent] = useState( + JSON.stringify(defaultGallery, null, 2) + ); + const [error, setError] = useState(""); + const [isLoading, setIsLoading] = useState(false); + const editorRef = useRef(null); + + const handleUrlImport = async () => { + setIsLoading(true); + setError(""); + try { + const response = await fetch(url); + const data = await response.json(); + // TODO: Validate against Gallery schema + onCreateGallery(data); + onCancel(); + } catch (err) { + setError("Failed to fetch or parse gallery from URL"); + } finally { + setIsLoading(false); + } + }; + + const handleFileUpload = (info: { file: UploadFile }) => { + const { status, originFileObj } = info.file; + if (status === "done" && originFileObj instanceof File) { + const reader = new FileReader(); + reader.onload = (e: ProgressEvent) => { + try { + const content = JSON.parse(e.target?.result as string); + // TODO: Validate against Gallery schema + onCreateGallery(content); + onCancel(); + } catch (err) { + setError("Invalid JSON file"); + } + }; + reader.readAsText(originFileObj); + } else if (status === "error") { + setError("File upload failed"); + } + }; + + const handlePasteImport = () => { + try { + const content = JSON.parse(jsonContent); + // TODO: Validate against Gallery schema + onCreateGallery(content); + onCancel(); + } catch (err) { + setError("Invalid JSON format"); + } + }; + + const uploadProps: UploadProps = { + accept: ".json", + showUploadList: false, + customRequest: ({ file, onSuccess }) => { + setTimeout(() => { + onSuccess && onSuccess("ok"); + }, 0); + }, + onChange: handleFileUpload, + }; + + const inputRef = useRef(null); + + const items = [ + { + key: "url", + label: ( + + URL Import + + ), + children: ( + + ), + }, + { + key: "file", + label: ( + + File Upload + + ), + children: ( +
    + +

    + +

    +

    + Click or drag JSON file to this area +

    +
    +
    + ), + }, + { + key: "paste", + label: ( + + Paste JSON + + ), + children: ( +
    +
    + +
    + +
    + ), + }, + ]; + + return ( + +
    + + + {error && ( + + )} +
    +
    + ); +}; + +export default GalleryCreateModal; diff --git a/python/packages/autogen-studio/frontend/src/components/views/gallery/detail.tsx b/python/packages/autogen-studio/frontend/src/components/views/gallery/detail.tsx new file mode 100644 index 000000000000..00e9fe331bf7 --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/gallery/detail.tsx @@ -0,0 +1,315 @@ +import React, { useState, useRef } from "react"; +import { Button, message, Tooltip } from "antd"; +import { + Package, + Users, + Bot, + Globe, + RefreshCw, + Edit2, + X, + Wrench, + Brain, + Timer, + Save, + ChevronUp, + ChevronDown, + Edit, +} from "lucide-react"; +import type { Gallery } from "./types"; +import { useGalleryStore } from "./store"; +import { MonacoEditor } from "../monaco"; +import { ComponentConfigTypes } from "../../types/datamodel"; +import { getRelativeTimeString, TruncatableText } from "../atoms"; + +const ComponentGrid: React.FC<{ + title: string; + icon: React.ReactNode; + items: ComponentConfigTypes[]; +}> = ({ title, icon, items }) => { + const [isExpanded, setIsExpanded] = useState(true); + + return ( +
    +
    setIsExpanded(!isExpanded)} + > +
    + {icon} + + {items.length} {items.length === 1 ? title : `${title}s`} + +
    + {isExpanded ? ( + + ) : ( + + )} +
    + +
    + {items.map((item, idx) => ( +
    +
    + {item.component_type} +
    + {item.description && ( +

    + +

    + )} +
    + ))} +
    +
    + ); +}; + +interface GalleryDetailProps { + gallery: Gallery; + onSave: (updates: Partial) => void; + onDirtyStateChange: (isDirty: boolean) => void; +} + +export const GalleryDetail: React.FC = ({ + gallery, + onSave, + onDirtyStateChange, +}) => { + const [isEditing, setIsEditing] = useState(false); + const [isSyncing, setIsSyncing] = useState(false); + const [jsonValue, setJsonValue] = useState(JSON.stringify(gallery, null, 2)); + const editorRef = useRef(null); + const { syncGallery, getLastSyncTime } = useGalleryStore(); + + const handleSync = async () => { + if (!gallery.url) return; + + setIsSyncing(true); + try { + await syncGallery(gallery.id); + message.success("Gallery synced successfully"); + } catch (error) { + message.error("Failed to sync gallery"); + } finally { + setIsSyncing(false); + } + }; + + const handleJsonChange = (value: string) => { + setJsonValue(value); + onDirtyStateChange(true); + }; + + const handleSave = async () => { + try { + const parsedGallery = JSON.parse(jsonValue); + const updatedGallery = { + ...parsedGallery, + id: gallery.id, + metadata: { + ...parsedGallery.metadata, + updated_at: new Date().toISOString(), + }, + }; + await onSave(updatedGallery); + onDirtyStateChange(false); + setIsEditing(false); + message.success("Gallery updated successfully"); + } catch (error) { + message.error("Invalid JSON format"); + } + }; + + const gridItems = [ + { + icon: , + title: "team", + items: gallery.items.teams, + }, + { + icon: , + title: "agent", + items: gallery.items.components.agents, + }, + { + icon: , + title: "tool", + items: gallery.items.components.tools, + }, + { + icon: , + title: "model", + items: gallery.items.components.models, + }, + { + icon: , + title: "termination", + items: gallery.items.components.terminations, + }, + ]; + + return ( +
    + {/* Banner Section - Kept unchanged */} +
    + Gallery Banner +
    +
    +
    +

    + {gallery.name} +

    + {gallery.url && ( + + + + )} +
    +

    + {gallery.metadata.description} +

    +

    + {gallery.metadata.author} +

    +
    + +
    +
    + + + {Object.values(gallery.items.components).reduce( + (sum, arr) => sum + arr.length, + 0 + )}{" "} + components + +
    +
    + v{gallery.metadata.version} +
    + {gallery.metadata.tags?.map((tag) => ( +
    + {tag} +
    + ))} +
    +
    +
    + + {/* Action Buttons */} +
    + {gallery.url && ( + + + + )} + {!isEditing ? ( + + ) : ( + <> + + + + )} +
    + + {/* Grid Layout */} +
    + {gridItems.map((item) => ( + + ))} +
    + + {/* Editor Section */} + {isEditing && ( +
    +
    +

    + Edit Gallery Configuration +

    +
    + +
    +
    +
    + +
    +
    + )} +
    + ); +}; diff --git a/python/packages/autogen-studio/frontend/src/components/views/gallery/manager.tsx b/python/packages/autogen-studio/frontend/src/components/views/gallery/manager.tsx new file mode 100644 index 000000000000..95562b7dd952 --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/gallery/manager.tsx @@ -0,0 +1,205 @@ +import React, { useEffect, useState } from "react"; +import { message, Modal } from "antd"; +import { ChevronRight } from "lucide-react"; +import { useGalleryStore } from "./store"; +import { GallerySidebar } from "./sidebar"; +import { GalleryDetail } from "./detail"; +import { GalleryCreateModal } from "./create-modal"; +import type { Gallery } from "./types"; + +export const GalleryManager: React.FC = () => { + const [isLoading, setIsLoading] = useState(false); + const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false); + const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); + const [isSidebarOpen, setIsSidebarOpen] = useState(() => { + if (typeof window !== "undefined") { + const stored = localStorage.getItem("gallerySidebar"); + return stored !== null ? JSON.parse(stored) : true; + } + return true; + }); + + const { + galleries, + selectedGalleryId, + selectGallery, + addGallery, + updateGallery, + removeGallery, + setDefaultGallery, + getSelectedGallery, + getDefaultGallery, + } = useGalleryStore(); + + const [messageApi, contextHolder] = message.useMessage(); + const currentGallery = getSelectedGallery(); + + // Persist sidebar state + useEffect(() => { + if (typeof window !== "undefined") { + localStorage.setItem("gallerySidebar", JSON.stringify(isSidebarOpen)); + } + }, [isSidebarOpen]); + + // Handle URL params + useEffect(() => { + const params = new URLSearchParams(window.location.search); + const galleryId = params.get("galleryId"); + + if (galleryId && !selectedGalleryId) { + handleSelectGallery(galleryId); + } + }, []); + + // Update URL when gallery changes + useEffect(() => { + if (selectedGalleryId) { + window.history.pushState({}, "", `?galleryId=${selectedGalleryId}`); + } + }, [selectedGalleryId]); + + const handleSelectGallery = async (galleryId: string) => { + if (hasUnsavedChanges) { + Modal.confirm({ + title: "Unsaved Changes", + content: "You have unsaved changes. Do you want to discard them?", + okText: "Discard", + cancelText: "Go Back", + onOk: () => { + selectGallery(galleryId); + setHasUnsavedChanges(false); + }, + }); + } else { + selectGallery(galleryId); + } + }; + + const handleCreateGallery = async (galleryData: Gallery) => { + const newGallery: Gallery = { + id: `gallery_${Date.now()}`, + name: galleryData.name || "New Gallery", + url: galleryData.url, + metadata: { + ...galleryData.metadata, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + }, + items: galleryData.items || { + teams: [], + components: { + agents: [], + models: [], + tools: [], + terminations: [], + }, + }, + }; + + try { + setIsLoading(true); + await addGallery(newGallery); + messageApi.success("Gallery created successfully"); + selectGallery(newGallery.id); + } catch (error) { + messageApi.error("Failed to create gallery"); + console.error(error); + } finally { + setIsLoading(false); + } + }; + + const handleDeleteGallery = async (galleryId: string) => { + try { + await removeGallery(galleryId); + messageApi.success("Gallery deleted successfully"); + } catch (error) { + messageApi.error("Failed to delete gallery"); + console.error(error); + } + }; + + const handleUpdateGallery = async ( + galleryId: string, + updates: Partial + ) => { + try { + await updateGallery(galleryId, updates); + setHasUnsavedChanges(false); + messageApi.success("Gallery updated successfully"); + } catch (error) { + messageApi.error("Failed to update gallery"); + console.error(error); + } + }; + + return ( +
    + {contextHolder} + + {/* Create Modal */} + setIsCreateModalOpen(false)} + onCreateGallery={handleCreateGallery} + /> + + {/* Sidebar */} +
    + setIsSidebarOpen(!isSidebarOpen)} + onSelectGallery={(gallery) => handleSelectGallery(gallery.id)} + onCreateGallery={() => setIsCreateModalOpen(true)} + onDeleteGallery={handleDeleteGallery} + defaultGalleryId={getDefaultGallery()?.id} + onSetDefault={setDefaultGallery} + isLoading={isLoading} + /> +
    + + {/* Main Content */} +
    +
    + {/* Breadcrumb */} +
    + Galleries + {currentGallery && ( + <> + + {currentGallery.name} + + )} +
    + + {/* Content Area */} + {currentGallery ? ( + + handleUpdateGallery(currentGallery.id, updates) + } + onDirtyStateChange={setHasUnsavedChanges} + /> + ) : ( +
    + Select a gallery from the sidebar or create a new one +
    + )} +
    +
    +
    + ); +}; + +export default GalleryManager; diff --git a/python/packages/autogen-studio/frontend/src/components/views/gallery/sidebar.tsx b/python/packages/autogen-studio/frontend/src/components/views/gallery/sidebar.tsx new file mode 100644 index 000000000000..d375677158df --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/gallery/sidebar.tsx @@ -0,0 +1,276 @@ +import React from "react"; +import { Button, Tooltip, Tag } from "antd"; +import { + Plus, + Trash2, + PanelLeftClose, + PanelLeftOpen, + Pin, + Package, + RefreshCw, + Globe, + Info, +} from "lucide-react"; +import type { Gallery } from "./types"; +import { getRelativeTimeString } from "../atoms"; +import { useGalleryStore } from "./store"; + +interface GallerySidebarProps { + isOpen: boolean; + galleries: Gallery[]; + currentGallery: Gallery | null; + onToggle: () => void; + onSelectGallery: (gallery: Gallery) => void; + onCreateGallery: () => void; + onDeleteGallery: (galleryId: string) => void; + onSetDefault: (galleryId: string) => void; + isLoading?: boolean; + defaultGalleryId: string; +} + +export const GallerySidebar: React.FC = ({ + isOpen, + galleries, + currentGallery, + onToggle, + onSelectGallery, + onCreateGallery, + onDeleteGallery, + onSetDefault, + defaultGalleryId, + isLoading = false, +}) => { + const { syncGallery, getLastSyncTime } = useGalleryStore(); + + // Render collapsed state + if (!isOpen) { + return ( +
    +
    + + + +
    + +
    + +
    +
    + ); + } + + // Render expanded state + return ( +
    + {/* Header */} +
    +
    + Galleries + + {galleries.length} + +
    + + + +
    + + {/* Create Gallery Button */} +
    +
    + + + +
    +
    + + {/* Section Label */} +
    All Galleries
    + + {/* Galleries List */} + {isLoading ? ( +
    Loading...
    + ) : galleries.length === 0 ? ( +
    + No galleries found +
    + ) : ( +
    + <> + {galleries.map((gallery) => ( +
    +
    +
    onSelectGallery(gallery)} + > + {/* Gallery Name and Actions Row */} +
    + {" "} + {/* Added min-w-0 */} +
    + {" "} + {/* Added min-w-0 and flex-1 */} +
    + {" "} + {/* Wrapped name in div with truncate and flex-1 */} + {gallery.name} +
    + {gallery.url && ( + + {" "} + {/* Added flex-shrink-0 */} + + )} +
    +
    + {gallery.url && ( + +
    +
    + + {/* Rest of the content remains the same */} +
    + + v{gallery.metadata.version} + +
    + + + {Object.values(gallery.items.components).reduce( + (sum, arr) => sum + arr.length, + 0 + )}{" "} + components + +
    +
    + + {/* Updated Timestamp */} +
    + + {getRelativeTimeString(gallery.metadata.updated_at)} + {defaultGalleryId === gallery.id ? ( + + default + + ) : ( + "" + )} + +
    +
    +
    + ))} + + +
    + Gallery items marked as default ( + ) are available in + the builder by default. +
    +
    + )} +
    + ); +}; diff --git a/python/packages/autogen-studio/frontend/src/components/views/gallery/store.tsx b/python/packages/autogen-studio/frontend/src/components/views/gallery/store.tsx new file mode 100644 index 000000000000..c09096f73c2d --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/gallery/store.tsx @@ -0,0 +1,156 @@ +import { create } from "zustand"; +import { persist } from "zustand/middleware"; +import { Gallery } from "./types"; +import { + AgentConfig, + ModelConfig, + TeamConfig, + TerminationConfig, + ToolConfig, +} from "../../types/datamodel"; +import { defaultGallery } from "./utils"; + +interface GalleryStore { + galleries: Gallery[]; + defaultGalleryId: string; + selectedGalleryId: string | null; + + addGallery: (gallery: Gallery) => void; + updateGallery: (id: string, gallery: Partial) => void; + removeGallery: (id: string) => void; + setDefaultGallery: (id: string) => void; + selectGallery: (id: string) => void; + getDefaultGallery: () => Gallery; + getSelectedGallery: () => Gallery | null; + syncGallery: (id: string) => Promise; + getLastSyncTime: (id: string) => string | null; + getGalleryComponents: () => { + teams: TeamConfig[]; + components: { + agents: AgentConfig[]; + models: ModelConfig[]; + tools: ToolConfig[]; + terminations: TerminationConfig[]; + }; + }; +} + +export const useGalleryStore = create()( + persist( + (set, get) => ({ + galleries: [defaultGallery], + defaultGalleryId: defaultGallery.id, + selectedGalleryId: defaultGallery.id, + + addGallery: (gallery) => + set((state) => { + if (state.galleries.find((g) => g.id === gallery.id)) return state; + return { + galleries: [gallery, ...state.galleries], + defaultGalleryId: state.defaultGalleryId || gallery.id, + selectedGalleryId: state.selectedGalleryId || gallery.id, + }; + }), + + updateGallery: (id, updates) => + set((state) => ({ + galleries: state.galleries.map((gallery) => + gallery.id === id + ? { + ...gallery, + ...updates, + metadata: { + ...gallery.metadata, + ...updates.metadata, + updated_at: new Date().toISOString(), + }, + } + : gallery + ), + })), + + removeGallery: (id) => + set((state) => { + if (state.galleries.length <= 1) return state; + + const newGalleries = state.galleries.filter((g) => g.id !== id); + const updates: Partial = { + galleries: newGalleries, + }; + + if (id === state.defaultGalleryId) { + updates.defaultGalleryId = newGalleries[0].id; + } + + if (id === state.selectedGalleryId) { + updates.selectedGalleryId = newGalleries[0].id; + } + + return updates; + }), + + setDefaultGallery: (id) => + set((state) => { + const gallery = state.galleries.find((g) => g.id === id); + if (!gallery) return state; + return { defaultGalleryId: id }; + }), + + selectGallery: (id) => + set((state) => { + const gallery = state.galleries.find((g) => g.id === id); + if (!gallery) return state; + return { selectedGalleryId: id }; + }), + + getDefaultGallery: () => { + const { galleries, defaultGalleryId } = get(); + return galleries.find((g) => g.id === defaultGalleryId)!; + }, + + getSelectedGallery: () => { + const { galleries, selectedGalleryId } = get(); + if (!selectedGalleryId) return null; + return galleries.find((g) => g.id === selectedGalleryId) || null; + }, + + syncGallery: async (id) => { + const gallery = get().galleries.find((g) => g.id === id); + if (!gallery?.url) return; + + try { + const response = await fetch(gallery.url); + const remoteGallery = await response.json(); + + get().updateGallery(id, { + ...remoteGallery, + id, // preserve local id + metadata: { + ...remoteGallery.metadata, + lastSynced: new Date().toISOString(), + }, + }); + } catch (error) { + console.error("Failed to sync gallery:", error); + throw error; + } + }, + + getLastSyncTime: (id) => { + const gallery = get().galleries.find((g) => g.id === id); + return gallery?.metadata.lastSynced ?? null; + }, + + getGalleryComponents: () => { + const defaultGallery = get().getDefaultGallery(); + return { + teams: defaultGallery.items.teams, + components: defaultGallery.items.components, + }; + }, + }), + { + name: "gallery-storage", + } + ) +); diff --git a/python/packages/autogen-studio/frontend/src/components/views/gallery/types.ts b/python/packages/autogen-studio/frontend/src/components/views/gallery/types.ts new file mode 100644 index 000000000000..015eb961c926 --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/gallery/types.ts @@ -0,0 +1,44 @@ +import { + AgentConfig, + ModelConfig, + TeamConfig, + TerminationConfig, + ToolConfig, +} from "../../types/datamodel"; + +export interface GalleryMetadata { + author: string; + created_at: string; + updated_at: string; + version: string; + description?: string; + tags?: string[]; + license?: string; + homepage?: string; + category?: string; + lastSynced?: string; +} + +export interface Gallery { + id: string; + name: string; + url?: string; + metadata: GalleryMetadata; + items: { + teams: TeamConfig[]; + components: { + agents: AgentConfig[]; + models: ModelConfig[]; + tools: ToolConfig[]; + terminations: TerminationConfig[]; + }; + }; +} + +export interface GalleryAPI { + listGalleries: () => Promise; + getGallery: (id: string) => Promise; + createGallery: (gallery: Gallery) => Promise; + updateGallery: (gallery: Gallery) => Promise; + deleteGallery: (id: string) => Promise; +} diff --git a/python/packages/autogen-studio/frontend/src/components/views/gallery/utils.ts b/python/packages/autogen-studio/frontend/src/components/views/gallery/utils.ts new file mode 100644 index 000000000000..2b0e4ea83e8d --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/gallery/utils.ts @@ -0,0 +1,194 @@ +import { + AssistantAgentConfig, + CombinationTerminationConfig, + MaxMessageTerminationConfig, + OpenAIModelConfig, + PythonFunctionToolConfig, + RoundRobinGroupChatConfig, + TextMentionTerminationConfig, + UserProxyAgentConfig, +} from "../../types/datamodel"; + +export const defaultGallery = { + id: "gallery_default", + name: "Default Component Gallery", + metadata: { + author: "AutoGen Team", + created_at: "2024-12-12T00:00:00Z", + updated_at: "2024-12-12T00:00:00Z", + version: "1.0.0", + description: + "A default gallery containing basic components for human-in-loop conversations", + tags: ["human-in-loop", "assistant"], + license: "MIT", + category: "conversation", + }, + items: { + teams: [ + { + component_type: "team", + description: + "A team with an assistant agent and a user agent to enable human-in-loop task completion in a round-robin fashion", + name: "huma_in_loop_team", + participants: [ + { + component_type: "agent", + description: + "An assistant agent that can help users complete tasks", + name: "assistant_agent", + agent_type: "AssistantAgent", + system_message: + "You are a helpful assistant. Solve tasks carefully. You also have a calculator tool which you can use if needed. When the task is done respond with TERMINATE.", + model_client: { + component_type: "model", + description: "A GPT-4o mini model", + model: "gpt-4o-mini", + model_type: "OpenAIChatCompletionClient", + }, + tools: [ + { + component_type: "tool", + name: "calculator", + description: + "A simple calculator that performs basic arithmetic operations between two numbers", + content: + "def calculator(a: float, b: float, operator: str) -> str:\n try:\n if operator == '+':\n return str(a + b)\n elif operator == '-':\n return str(a - b)\n elif operator == '*':\n return str(a * b)\n elif operator == '/':\n if b == 0:\n return 'Error: Division by zero'\n return str(a / b)\n else:\n return 'Error: Invalid operator. Please use +, -, *, or /'\n except Exception as e:\n return f'Error: {str(e)}'", + tool_type: "PythonFunction", + }, + ], + }, + { + component_type: "agent", + description: "A user agent that is driven by a human user", + name: "user_agent", + agent_type: "UserProxyAgent", + tools: [], + }, + ], + team_type: "RoundRobinGroupChat", + termination_condition: { + description: + "Terminate the conversation when the user mentions 'TERMINATE' or after 10 messages", + component_type: "termination", + termination_type: "CombinationTermination", + operator: "or", + conditions: [ + { + component_type: "termination", + description: + "Terminate the conversation when the user mentions 'TERMINATE'", + termination_type: "TextMentionTermination", + text: "TERMINATE", + }, + { + component_type: "termination", + description: "Terminate the conversation after 10 messages", + termination_type: "MaxMessageTermination", + max_messages: 10, + }, + ], + }, + } as RoundRobinGroupChatConfig, + ], + components: { + agents: [ + { + component_type: "agent", + description: "An assistant agent that can help users complete tasks", + name: "assistant_agent", + agent_type: "AssistantAgent", + system_message: + "You are a helpful assistant. Solve tasks carefully. You also have a calculator tool which you can use if needed. When the task is done respond with TERMINATE.", + model_client: { + component_type: "model", + description: "A GPT-4o mini model", + model: "gpt-4o-mini", + model_type: "OpenAIChatCompletionClient", + }, + tools: [ + { + component_type: "tool", + name: "calculator", + description: + "A simple calculator that performs basic arithmetic operations between two numbers", + content: + "def calculator(a: float, b: float, operator: str) -> str:\n try:\n if operator == '+':\n return str(a + b)\n elif operator == '-':\n return str(a - b)\n elif operator == '*':\n return str(a * b)\n elif operator == '/':\n if b == 0:\n return 'Error: Division by zero'\n return str(a / b)\n else:\n return 'Error: Invalid operator. Please use +, -, *, or /'\n except Exception as e:\n return f'Error: {str(e)}'", + tool_type: "PythonFunction", + }, + ], + } as AssistantAgentConfig, + { + component_type: "agent", + description: "A user agent that is driven by a human user", + name: "user_agent", + agent_type: "UserProxyAgent", + tools: [], + } as UserProxyAgentConfig, + ], + models: [ + { + component_type: "model", + description: "A GPT-4o mini model", + model: "gpt-4o-mini", + model_type: "OpenAIChatCompletionClient", + } as OpenAIModelConfig, + ], + tools: [ + { + component_type: "tool", + name: "calculator", + description: + "A simple calculator that performs basic arithmetic operations between two numbers", + content: + "def calculator(a: float, b: float, operator: str) -> str:\n try:\n if operator == '+':\n return str(a + b)\n elif operator == '-':\n return str(a - b)\n elif operator == '*':\n return str(a * b)\n elif operator == '/':\n if b == 0:\n return 'Error: Division by zero'\n return str(a / b)\n else:\n return 'Error: Invalid operator. Please use +, -, *, or /'\n except Exception as e:\n return f'Error: {str(e)}'", + tool_type: "PythonFunction", + } as PythonFunctionToolConfig, + { + component_type: "tool", + name: "fetch_website", + description: "Fetch and return the content of a website URL", + content: + "async def fetch_website(url: str) -> str:\n try:\n import requests\n from urllib.parse import urlparse\n \n # Validate URL format\n parsed = urlparse(url)\n if not parsed.scheme or not parsed.netloc:\n return \"Error: Invalid URL format. Please include http:// or https://\"\n \n # Add scheme if not present\n if not url.startswith(('http://', 'https://')): \n url = 'https://' + url\n \n # Set headers to mimic a browser request\n headers = {\n 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'\n }\n \n # Make the request with a timeout\n response = requests.get(url, headers=headers, timeout=10)\n response.raise_for_status()\n \n # Return the text content\n return response.text\n \n except requests.exceptions.Timeout:\n return \"Error: Request timed out\"\n except requests.exceptions.ConnectionError:\n return \"Error: Failed to connect to the website\"\n except requests.exceptions.HTTPError as e:\n return f\"Error: HTTP {e.response.status_code} - {e.response.reason}\"\n except Exception as e:\n return f\"Error: {str(e)}\"", + tool_type: "PythonFunction", + } as PythonFunctionToolConfig, + ], + terminations: [ + { + component_type: "termination", + description: + "Terminate the conversation when the user mentions 'TERMINATE'", + termination_type: "TextMentionTermination", + text: "TERMINATE", + } as TextMentionTerminationConfig, + { + component_type: "termination", + description: "Terminate the conversation after 10 messages", + termination_type: "MaxMessageTermination", + max_messages: 10, + } as MaxMessageTerminationConfig, + { + component_type: "termination", + description: + "Terminate the conversation when the user mentions 'TERMINATE' or after 10 messages", + termination_type: "CombinationTermination", + operator: "or", + conditions: [ + { + component_type: "termination", + description: + "Terminate the conversation when the user mentions 'TERMINATE'", + termination_type: "TextMentionTermination", + text: "TERMINATE", + }, + { + component_type: "termination", + description: "Terminate the conversation after 10 messages", + termination_type: "MaxMessageTermination", + max_messages: 10, + }, + ], + } as CombinationTerminationConfig, + ], + }, + }, +}; diff --git a/python/packages/autogen-studio/frontend/src/components/views/shared/markdown.tsx b/python/packages/autogen-studio/frontend/src/components/views/markdown.tsx similarity index 100% rename from python/packages/autogen-studio/frontend/src/components/views/shared/markdown.tsx rename to python/packages/autogen-studio/frontend/src/components/views/markdown.tsx diff --git a/python/packages/autogen-studio/frontend/src/components/views/shared/monaco.tsx b/python/packages/autogen-studio/frontend/src/components/views/monaco.tsx similarity index 91% rename from python/packages/autogen-studio/frontend/src/components/views/shared/monaco.tsx rename to python/packages/autogen-studio/frontend/src/components/views/monaco.tsx index 5c332d7c124e..1ce8812a036d 100644 --- a/python/packages/autogen-studio/frontend/src/components/views/shared/monaco.tsx +++ b/python/packages/autogen-studio/frontend/src/components/views/monaco.tsx @@ -7,12 +7,14 @@ export const MonacoEditor = ({ language, onChange, minimap = true, + className, }: { value: string; onChange?: (value: string) => void; editorRef: any; language: string; minimap?: boolean; + className?: string; }) => { const [isEditorReady, setIsEditorReady] = useState(false); const onEditorDidMount = (editor: any, monaco: any) => { @@ -20,7 +22,7 @@ export const MonacoEditor = ({ setIsEditorReady(true); }; return ( -
    +
    = ({ teamConfig, run }) => { {settings.showGrid && } + {settings.showMiniMap && }
    diff --git a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/agentflow/agentnode.tsx b/python/packages/autogen-studio/frontend/src/components/views/session/chat/agentflow/agentnode.tsx similarity index 100% rename from python/packages/autogen-studio/frontend/src/components/views/playground/chat/agentflow/agentnode.tsx rename to python/packages/autogen-studio/frontend/src/components/views/session/chat/agentflow/agentnode.tsx diff --git a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/agentflow/edge.tsx b/python/packages/autogen-studio/frontend/src/components/views/session/chat/agentflow/edge.tsx similarity index 100% rename from python/packages/autogen-studio/frontend/src/components/views/playground/chat/agentflow/edge.tsx rename to python/packages/autogen-studio/frontend/src/components/views/session/chat/agentflow/edge.tsx diff --git a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/agentflow/edgemessagemodal.tsx b/python/packages/autogen-studio/frontend/src/components/views/session/chat/agentflow/edgemessagemodal.tsx similarity index 100% rename from python/packages/autogen-studio/frontend/src/components/views/playground/chat/agentflow/edgemessagemodal.tsx rename to python/packages/autogen-studio/frontend/src/components/views/session/chat/agentflow/edgemessagemodal.tsx diff --git a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/agentflow/toolbar.tsx b/python/packages/autogen-studio/frontend/src/components/views/session/chat/agentflow/toolbar.tsx similarity index 96% rename from python/packages/autogen-studio/frontend/src/components/views/playground/chat/agentflow/toolbar.tsx rename to python/packages/autogen-studio/frontend/src/components/views/session/chat/agentflow/toolbar.tsx index ebcf7d7092ca..62d3cd81a314 100644 --- a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/agentflow/toolbar.tsx +++ b/python/packages/autogen-studio/frontend/src/components/views/session/chat/agentflow/toolbar.tsx @@ -14,6 +14,7 @@ import { MessageSquare, LayoutGrid, RotateCcw, + MapIcon, } from "lucide-react"; import { useConfigStore } from "../../../../../hooks/store"; @@ -55,6 +56,12 @@ export const AgentFlowToolbar: React.FC = ({ // icon: , // onClick: toggleSetting("showMessages"), // }, + { + key: "miniMap", + label: "Mini Map", + icon: , + onClick: toggleSetting("showMiniMap"), + }, { type: "divider", }, diff --git a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/chat.tsx b/python/packages/autogen-studio/frontend/src/components/views/session/chat/chat.tsx similarity index 79% rename from python/packages/autogen-studio/frontend/src/components/views/playground/chat/chat.tsx rename to python/packages/autogen-studio/frontend/src/components/views/session/chat/chat.tsx index b78aa50dab30..65d9452bbf49 100644 --- a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/chat.tsx +++ b/python/packages/autogen-studio/frontend/src/components/views/session/chat/chat.tsx @@ -1,7 +1,6 @@ import * as React from "react"; import { message } from "antd"; import { getServerUrl } from "../../../utils"; -import { SessionManager } from "../../shared/session/manager"; import { IStatus } from "../../../types/app"; import { Run, @@ -11,19 +10,22 @@ import { AgentMessageConfig, RunStatus, TeamResult, + Session, } from "../../../types/datamodel"; -import { useConfigStore } from "../../../../hooks/store"; import { appContext } from "../../../../hooks/provider"; import ChatInput from "./chatinput"; -import TeamManager from "../../shared/team/manager"; -import { teamAPI } from "../../shared/team/api"; -import { sessionAPI } from "../../shared/session/api"; +import { teamAPI } from "../../team/api"; +import { sessionAPI } from "../api"; import RunView from "./runview"; import { TIMEOUT_CONFIG } from "./types"; - +import { ChevronRight, MessagesSquare } from "lucide-react"; const logo = require("../../../../images/landing/welcome.svg").default; -export default function ChatView() { +interface ChatViewProps { + session: Session | null; +} + +export default function ChatView({ session }: ChatViewProps) { const serverUrl = getServerUrl(); const [loading, setLoading] = React.useState(false); const [error, setError] = React.useState({ @@ -34,12 +36,13 @@ export default function ChatView() { // Core state const [existingRuns, setExistingRuns] = React.useState([]); const [currentRun, setCurrentRun] = React.useState(null); + const [messageApi, contextHolder] = message.useMessage(); const chatContainerRef = React.useRef(null); // Context and config const { user } = React.useContext(appContext); - const { session, sessions } = useConfigStore(); + // const { session, sessions } = useConfigStore(); const [activeSocket, setActiveSocket] = React.useState( null ); @@ -71,13 +74,14 @@ export default function ChatView() { setExistingRuns(response.runs); } catch (error) { console.error("Error loading session runs:", error); - message.error("Failed to load chat history"); + messageApi.error("Failed to load chat history"); } }; React.useEffect(() => { if (session?.id) { loadSessionRuns(); + setCurrentRun(null); } else { setExistingRuns([]); setCurrentRun(null); @@ -87,9 +91,16 @@ export default function ChatView() { // Load team config React.useEffect(() => { if (session?.team_id && user?.email) { - teamAPI.getTeam(session.team_id, user.email).then((team) => { - setTeamConfig(team.config); - }); + teamAPI + .getTeam(session.team_id, user.email) + .then((team) => { + setTeamConfig(team.config); + }) + .catch((error) => { + console.error("Error loading team config:", error); + // messageApi.error("Failed to load team config"); + setTeamConfig(null); + }); } }, [session]); @@ -470,14 +481,17 @@ export default function ChatView() { }; return ( -
    -
    -
    - -
    - +
    + {contextHolder} +
    + Sessions + {session && ( + <> + + {session.name} + + )}
    -
    {" "}
    - {sessions !== null && sessions?.length === 0 ? ( -
    -
    - Welcome - Welcome! Create a session to get started! + <> + {teamConfig && ( + <> + {/* Existing Runs */} + {existingRuns.map((run, index) => ( + + ))} + + {/* Current Run */} + {currentRun && ( + + )} + + {/* No existing runs */} + + {!currentRun && existingRuns.length === 0 && ( +
    +
    + +
    Start a new task
    +
    + Enter a task to get started +
    +
    +
    + )} + + )} + + {/* No team config */} + {!teamConfig && ( +
    +
    + +
    + No team configuration found for this session (may have been + deleted).{" "} +
    +
    + Add a team to the session to get started. +
    +
    -
    - ) : ( - <> - {teamConfig && ( - <> - {/* Existing Runs */} - {existingRuns.map((run, index) => ( - - ))} - - {/* Current Run */} - {currentRun && ( - - )} - - )} - - )} + )} +
    - {session && ( + {session && teamConfig && (
    = ({ onChange={handleInputChange} onKeyDown={handleKeyDown} disabled={disabled || isSubmitting} - className="flex-1 px-3 py-2 rounded bg-background border border-secondary focus:border-accent focus:ring-1 focus:ring-accent outline-none disabled:opacity-50" + className="text-primary flex-1 px-3 py-2 rounded bg-tertiary border border-secondary focus:border-accent focus:ring-1 focus:ring-accent outline-none disabled:opacity-50" placeholder={ disabled ? "Input timeout - please restart the conversation" diff --git a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/rendermessage.tsx b/python/packages/autogen-studio/frontend/src/components/views/session/chat/rendermessage.tsx similarity index 95% rename from python/packages/autogen-studio/frontend/src/components/views/playground/chat/rendermessage.tsx rename to python/packages/autogen-studio/frontend/src/components/views/session/chat/rendermessage.tsx index d9f9346fce2e..d5c6bc7a21b6 100644 --- a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/rendermessage.tsx +++ b/python/packages/autogen-studio/frontend/src/components/views/session/chat/rendermessage.tsx @@ -6,7 +6,7 @@ import { FunctionExecutionResult, ImageContent, } from "../../../types/datamodel"; -import { ClickableImage, TruncatableText } from "../../shared/atoms"; +import { ClickableImage, TruncatableText } from "../../atoms"; const TEXT_THRESHOLD = 400; const JSON_THRESHOLD = 800; @@ -45,7 +45,7 @@ const RenderMultiModal: React.FC<{ content: (string | ImageContent)[] }> = ({ const RenderToolCall: React.FC<{ content: FunctionCall[] }> = ({ content }) => (
    {content.map((call) => ( -
    +
    Function: {call.name}
    = ({
    Result ID: {result.call_id}
    ))} diff --git a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/runview.tsx b/python/packages/autogen-studio/frontend/src/components/views/session/chat/runview.tsx similarity index 78% rename from python/packages/autogen-studio/frontend/src/components/views/playground/chat/runview.tsx rename to python/packages/autogen-studio/frontend/src/components/views/session/chat/runview.tsx index 5dd9ba8c5506..57557ec1527a 100644 --- a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/runview.tsx +++ b/python/packages/autogen-studio/frontend/src/components/views/session/chat/runview.tsx @@ -7,13 +7,20 @@ import { AlertTriangle, TriangleAlertIcon, GroupIcon, + ChevronDown, + ChevronUp, + Bot, } from "lucide-react"; import { Run, Message, TeamConfig } from "../../../types/datamodel"; import AgentFlow from "./agentflow/agentflow"; import { RenderMessage } from "./rendermessage"; import InputRequestView from "./inputrequest"; import { Tooltip } from "antd"; -import { LoadingDots } from "../../shared/atoms"; +import { + getRelativeTimeString, + LoadingDots, + TruncatableText, +} from "../../atoms"; interface RunViewProps { run: Run; @@ -110,13 +117,16 @@ const RunView: React.FC = ({ } }; + const lastResultMessage = run.team_result?.task_result.messages.slice(-1)[0]; + const lastMessage = run.messages.slice(-1)[0]; + return ( -
    +
    {/* Run Header */}
    = ({
    } > - Run ...{run.id.slice(-6)} + + Run ...{run.id.slice(-6)} |{" "} + {getRelativeTimeString(run?.created_at || "")}{" "} + {!isFirstRun && ( <> @@ -153,7 +166,7 @@ const RunView: React.FC = ({
    - +
    Agent Team
    @@ -178,11 +191,28 @@ const RunView: React.FC = ({ {/* Final Response */} {run.status !== "awaiting_input" && run.status !== "active" && ( -
    -
    +
    +
    Stop reason: {run.team_result?.task_result?.stop_reason}
    - {run.messages[run.messages.length - 1]?.config?.content + ""} + + {lastMessage ? ( + + ) : ( + <> + {lastResultMessage && ( + + )} + + )}
    )}
    @@ -190,18 +220,35 @@ const RunView: React.FC = ({ {/* Thread Section */}
    {run.messages.length > 0 && ( -
    +
    diff --git a/python/packages/autogen-studio/frontend/src/components/views/playground/chat/types.ts b/python/packages/autogen-studio/frontend/src/components/views/session/chat/types.ts similarity index 100% rename from python/packages/autogen-studio/frontend/src/components/views/playground/chat/types.ts rename to python/packages/autogen-studio/frontend/src/components/views/session/chat/types.ts diff --git a/python/packages/autogen-studio/frontend/src/components/views/shared/session/editor.tsx b/python/packages/autogen-studio/frontend/src/components/views/session/editor.tsx similarity index 86% rename from python/packages/autogen-studio/frontend/src/components/views/shared/session/editor.tsx rename to python/packages/autogen-studio/frontend/src/components/views/session/editor.tsx index 23feed892137..c8358695521c 100644 --- a/python/packages/autogen-studio/frontend/src/components/views/shared/session/editor.tsx +++ b/python/packages/autogen-studio/frontend/src/components/views/session/editor.tsx @@ -1,15 +1,16 @@ import React, { useContext, useEffect, useState } from "react"; -import { Modal, Form, Input, message, Button, Select, Spin } from "antd"; +import { Modal, Form, message, Input, Button, Select, Spin } from "antd"; import { TriangleAlertIcon } from "lucide-react"; import type { FormProps } from "antd"; import { SessionEditorProps } from "./types"; -import { Team } from "../../../types/datamodel"; +import { Team } from "../../types/datamodel"; import { teamAPI } from "../team/api"; -import { appContext } from "../../../../hooks/provider"; +import { appContext } from "../../../hooks/provider"; +import { Link } from "gatsby"; type FieldType = { name: string; - team_id?: string; + team_id?: number; }; export const SessionEditor: React.FC = ({ @@ -22,6 +23,7 @@ export const SessionEditor: React.FC = ({ const [teams, setTeams] = useState([]); const [loading, setLoading] = useState(false); const { user } = useContext(appContext); + const [messageApi, contextHolder] = message.useMessage(); // Fetch teams when modal opens useEffect(() => { @@ -33,7 +35,7 @@ export const SessionEditor: React.FC = ({ const teamsData = await teamAPI.listTeams(userId); setTeams(teamsData); } catch (error) { - message.error("Failed to load teams"); + messageApi.error("Error loading teams"); console.error("Error loading teams:", error); } finally { setLoading(false); @@ -62,12 +64,12 @@ export const SessionEditor: React.FC = ({ ...values, id: session?.id, }); - message.success( + messageApi.success( `Session ${session ? "updated" : "created"} successfully` ); } catch (error) { if (error instanceof Error) { - message.error(error.message); + messageApi.error(error.message); } } }; @@ -75,7 +77,7 @@ export const SessionEditor: React.FC = ({ const onFinishFailed: FormProps["onFinishFailed"] = ( errorInfo ) => { - message.error("Please check the form for errors"); + messageApi.error("Please check the form for errors"); console.error("Form validation failed:", errorInfo); }; @@ -90,6 +92,7 @@ export const SessionEditor: React.FC = ({ className="text-primary" forceRender > + {contextHolder}
    = ({ -
    +
    + className="w-full" label="Team" name="team_id" rules={[{ required: true, message: "Please select a team" }]} @@ -134,6 +138,11 @@ export const SessionEditor: React.FC = ({ />
    + +
    + view all teams +
    + {hasNoTeams && (
    diff --git a/python/packages/autogen-studio/frontend/src/components/views/session/manager.tsx b/python/packages/autogen-studio/frontend/src/components/views/session/manager.tsx new file mode 100644 index 000000000000..c42ad269278a --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/session/manager.tsx @@ -0,0 +1,211 @@ +import React, { useCallback, useEffect, useState, useContext } from "react"; +import { message } from "antd"; +import { useConfigStore } from "../../../hooks/store"; +import { appContext } from "../../../hooks/provider"; +import { sessionAPI } from "./api"; +import { SessionEditor } from "./editor"; +import type { Session } from "../../types/datamodel"; +import ChatView from "./chat/chat"; +import { Sidebar } from "./sidebar"; + +export const SessionManager: React.FC = () => { + const [isLoading, setIsLoading] = useState(false); + const [isEditorOpen, setIsEditorOpen] = useState(false); + const [editingSession, setEditingSession] = useState(); + const [isSidebarOpen, setIsSidebarOpen] = useState(() => { + if (typeof window !== "undefined") { + const stored = localStorage.getItem("sessionSidebar"); + return stored !== null ? JSON.parse(stored) : true; + } + return true; // Default value during SSR + }); + const [messageApi, contextHolder] = message.useMessage(); + + const { user } = useContext(appContext); + const { session, setSession, sessions, setSessions } = useConfigStore(); + + useEffect(() => { + if (typeof window !== "undefined") { + localStorage.setItem("sessionSidebar", JSON.stringify(isSidebarOpen)); + } + }, [isSidebarOpen]); + + const fetchSessions = useCallback(async () => { + if (!user?.email) return; + + try { + setIsLoading(true); + const data = await sessionAPI.listSessions(user.email); + setSessions(data); + + // Only set first session if there's no sessionId in URL + const params = new URLSearchParams(window.location.search); + const sessionId = params.get("sessionId"); + if (!session && data.length > 0 && !sessionId) { + setSession(data[0]); + } + } catch (error) { + console.error("Error fetching sessions:", error); + messageApi.error("Error loading sessions"); + } finally { + setIsLoading(false); + } + }, [user?.email, setSessions, session, setSession]); + + // Handle initial URL params + useEffect(() => { + const params = new URLSearchParams(window.location.search); + const sessionId = params.get("sessionId"); + + if (sessionId && !session) { + handleSelectSession({ id: parseInt(sessionId) } as Session); + } + }, []); + + // Handle browser back/forward + useEffect(() => { + const handleLocationChange = () => { + const params = new URLSearchParams(window.location.search); + const sessionId = params.get("sessionId"); + + if (!sessionId && session) { + setSession(null); + } + }; + + window.addEventListener("popstate", handleLocationChange); + return () => window.removeEventListener("popstate", handleLocationChange); + }, [session]); + + const handleSaveSession = async (sessionData: Partial) => { + if (!user?.email) return; + + try { + if (sessionData.id) { + const updated = await sessionAPI.updateSession( + sessionData.id, + sessionData, + user.email + ); + setSessions(sessions.map((s) => (s.id === updated.id ? updated : s))); + if (session?.id === updated.id) { + setSession(updated); + } + } else { + const created = await sessionAPI.createSession(sessionData, user.email); + setSessions([created, ...sessions]); + setSession(created); + } + setIsEditorOpen(false); + setEditingSession(undefined); + } catch (error) { + messageApi.error("Error saving session"); + console.error(error); + } + }; + + const handleDeleteSession = async (sessionId: number) => { + if (!user?.email) return; + + try { + const response = await sessionAPI.deleteSession(sessionId, user.email); + setSessions(sessions.filter((s) => s.id !== sessionId)); + if (session?.id === sessionId || sessions.length === 0) { + setSession(sessions[0] || null); + window.history.pushState({}, "", window.location.pathname); // Clear URL params + } + messageApi.success("Session deleted"); + } catch (error) { + console.error("Error deleting session:", error); + messageApi.error("Error deleting session"); + } + }; + + const handleSelectSession = async (selectedSession: Session) => { + if (!user?.email || !selectedSession.id) return; + + try { + setIsLoading(true); + const data = await sessionAPI.getSession(selectedSession.id, user.email); + if (!data) { + // Session not found + messageApi.error("Session not found"); + window.history.pushState({}, "", window.location.pathname); // Clear URL + if (sessions.length > 0) { + setSession(sessions[0]); // Fall back to first session + } else { + setSession(null); + } + return; + } + setSession(data); + window.history.pushState({}, "", `?sessionId=${selectedSession.id}`); + } catch (error) { + console.error("Error loading session:", error); + messageApi.error("Error loading session"); + window.history.pushState({}, "", window.location.pathname); // Clear invalid URL + if (sessions.length > 0) { + setSession(sessions[0]); // Fall back to first session + } else { + setSession(null); + } + } finally { + setIsLoading(false); + } + }; + + useEffect(() => { + fetchSessions(); + }, [fetchSessions]); + + return ( +
    + {contextHolder} +
    + setIsSidebarOpen(!isSidebarOpen)} + onSelectSession={handleSelectSession} + onEditSession={(session) => { + setEditingSession(session); + setIsEditorOpen(true); + }} + onDeleteSession={handleDeleteSession} + isLoading={isLoading} + /> +
    + +
    + {session && sessions.length > 0 ? ( +
    + {session && } +
    + ) : ( +
    + No session selected. Create or select a session from the sidebar. +
    + )} +
    + + { + setIsEditorOpen(false); + setEditingSession(undefined); + }} + /> +
    + ); +}; diff --git a/python/packages/autogen-studio/frontend/src/components/views/session/sidebar.tsx b/python/packages/autogen-studio/frontend/src/components/views/session/sidebar.tsx new file mode 100644 index 000000000000..c4087698e5be --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/session/sidebar.tsx @@ -0,0 +1,174 @@ +import React from "react"; +import { Button, Tooltip } from "antd"; +import { + Plus, + Edit, + Trash2, + PanelLeftClose, + PanelLeftOpen, + InfoIcon, + RefreshCcw, +} from "lucide-react"; +import type { Session } from "../../types/datamodel"; +import { getRelativeTimeString } from "../atoms"; + +interface SidebarProps { + isOpen: boolean; + sessions: Session[]; + currentSession: Session | null; + onToggle: () => void; + onSelectSession: (session: Session) => void; + onEditSession: (session?: Session) => void; + onDeleteSession: (sessionId: number) => void; + isLoading?: boolean; +} + +export const Sidebar: React.FC = ({ + isOpen, + sessions, + currentSession, + onToggle, + onSelectSession, + onEditSession, + onDeleteSession, + isLoading = false, +}) => { + if (!isOpen) { + return ( +
    +
    + + Sessions{" "} + {sessions.length} {" "} + + > + + +
    +
    + +
    +
    + ); + } + + return ( +
    +
    +
    + Sessions + + {sessions.length} + +
    + + + +
    + +
    +
    + + + +
    +
    + +
    + Recents{" "} + {isLoading && ( + + )} +
    + + {/* no sessions found */} + + {!isLoading && sessions.length === 0 && ( +
    + + No recent sessions found +
    + )} + +
    + {sessions.map((s) => ( +
    +
    + {" "} +
    +
    onSelectSession(s)} + > + {s.name} + + {getRelativeTimeString(s.updated_at || "")} + +
    + +
    +
    +
    + ))} +
    +
    + ); +}; diff --git a/python/packages/autogen-studio/frontend/src/components/views/shared/session/types.ts b/python/packages/autogen-studio/frontend/src/components/views/session/types.ts similarity index 90% rename from python/packages/autogen-studio/frontend/src/components/views/shared/session/types.ts rename to python/packages/autogen-studio/frontend/src/components/views/session/types.ts index 13ddaac4dc48..b088eaab7254 100644 --- a/python/packages/autogen-studio/frontend/src/components/views/shared/session/types.ts +++ b/python/packages/autogen-studio/frontend/src/components/views/session/types.ts @@ -1,4 +1,4 @@ -import type { Session } from "../../../types/datamodel"; +import type { Session } from "../../types/datamodel"; export interface SessionEditorProps { session?: Session; diff --git a/python/packages/autogen-studio/frontend/src/components/views/shared/session/list.tsx b/python/packages/autogen-studio/frontend/src/components/views/shared/session/list.tsx deleted file mode 100644 index 6fb1bbfc52f2..000000000000 --- a/python/packages/autogen-studio/frontend/src/components/views/shared/session/list.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import React from "react"; -import { Select, Button, Popconfirm } from "antd"; -import { Edit, Trash2 } from "lucide-react"; -import type { SessionListProps } from "./types"; -import type { SelectProps } from "antd"; - -export const SessionList: React.FC = ({ - sessions, - currentSession, - onSelect, - onEdit, - onDelete, - isLoading, -}) => { - const options: SelectProps["options"] = [ - { - label: "Sessions", - options: sessions.map((session) => ({ - label: ( -
    - {session.name} -
    -
    -
    - ), - value: session.id, - })), - }, - ]; - - return ( - { - const team = teams.find((t) => t.id === value); - if (team) onSelect(team); - }} - options={options} - notFoundContent={teams.length === 0 ? "No teams found" : undefined} - dropdownStyle={{ minWidth: "256px" }} - listHeight={256} - /> - ); -}; diff --git a/python/packages/autogen-studio/frontend/src/components/views/shared/team/manager.tsx b/python/packages/autogen-studio/frontend/src/components/views/shared/team/manager.tsx deleted file mode 100644 index 6abe216cf14c..000000000000 --- a/python/packages/autogen-studio/frontend/src/components/views/shared/team/manager.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import React, { useCallback, useEffect, useState, useContext } from "react"; -import { Button, message, Badge } from "antd"; -import { Plus } from "lucide-react"; -import { appContext } from "../../../../hooks/provider"; -import { teamAPI } from "./api"; -import { TeamList } from "./list"; -import { TeamEditor } from "./editor"; -import type { Team } from "../../../types/datamodel"; - -export const TeamManager: React.FC = () => { - // UI State - const [isLoading, setIsLoading] = useState(false); - const [isEditorOpen, setIsEditorOpen] = useState(false); - const [editingTeam, setEditingTeam] = useState(); - const [teams, setTeams] = useState([]); - const [currentTeam, setCurrentTeam] = useState(null); - - // Global context - const { user } = useContext(appContext); - - // Fetch all teams - const fetchTeams = useCallback(async () => { - if (!user?.email) return; - - try { - setIsLoading(true); - const data = await teamAPI.listTeams(user.email); - setTeams(data); - if (!currentTeam && data.length > 0) { - setCurrentTeam(data[0]); - } - } catch (error) { - console.error("Error fetching teams:", error); - message.error("Error loading teams"); - } finally { - setIsLoading(false); - } - }, [user?.email, currentTeam]); - - // Handle team operations - const handleSaveTeam = async (teamData: Partial) => { - if (!user?.email) return; - - try { - console.log("teamData", teamData); - const savedTeam = await teamAPI.createTeam(teamData, user.email); - - // Update teams list - if (teamData.id) { - setTeams(teams.map((t) => (t.id === savedTeam.id ? savedTeam : t))); - if (currentTeam?.id === savedTeam.id) { - setCurrentTeam(savedTeam); - } - } else { - setTeams([...teams, savedTeam]); - } - - setIsEditorOpen(false); - setEditingTeam(undefined); - } catch (error) { - throw error; - } - }; - - const handleDeleteTeam = async (teamId: number) => { - if (!user?.email) return; - - try { - await teamAPI.deleteTeam(teamId, user.email); - setTeams(teams.filter((t) => t.id !== teamId)); - if (currentTeam?.id === teamId) { - setCurrentTeam(null); - } - message.success("Team deleted"); - } catch (error) { - console.error("Error deleting team:", error); - message.error("Error deleting team"); - } - }; - - const handleSelectTeam = async (selectedTeam: Team) => { - if (!user?.email || !selectedTeam.id) return; - - try { - setIsLoading(true); - const data = await teamAPI.getTeam(selectedTeam.id, user.email); - setCurrentTeam(data); - } catch (error) { - console.error("Error loading team:", error); - message.error("Error loading team"); - } finally { - setIsLoading(false); - } - }; - - // Load teams on mount - useEffect(() => { - fetchTeams(); - }, [fetchTeams]); - - // Content component - const TeamContent = () => ( -
    - {teams && teams.length > 0 && ( -
    - { - setEditingTeam(team); - setIsEditorOpen(true); - }} - onDelete={handleDeleteTeam} - isLoading={isLoading} - /> -
    - )} - -
    - ); - - return ( - <> -
    -
    - Teams {teams.length} -
    - -
    - { - setIsEditorOpen(false); - setEditingTeam(undefined); - }} - /> - - ); -}; - -export default TeamManager; diff --git a/python/packages/autogen-studio/frontend/src/components/views/shared/team/types.ts b/python/packages/autogen-studio/frontend/src/components/views/shared/team/types.ts deleted file mode 100644 index 890cc64f6075..000000000000 --- a/python/packages/autogen-studio/frontend/src/components/views/shared/team/types.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { Team } from "../../../types/datamodel"; - -export interface TeamEditorProps { - team?: Team; - onSave: (team: Partial) => Promise; - onCancel: () => void; - isOpen: boolean; -} - -export interface TeamListProps { - teams: Team[]; - currentTeam?: Team | null; - onSelect: (team: Team) => void; - onEdit: (team: Team) => void; - onDelete: (teamId: number) => void; - isLoading?: boolean; -} diff --git a/python/packages/autogen-studio/frontend/src/components/views/shared/team/api.ts b/python/packages/autogen-studio/frontend/src/components/views/team/api.ts similarity index 96% rename from python/packages/autogen-studio/frontend/src/components/views/shared/team/api.ts rename to python/packages/autogen-studio/frontend/src/components/views/team/api.ts index 8d13aa6a488f..8a29e874b464 100644 --- a/python/packages/autogen-studio/frontend/src/components/views/shared/team/api.ts +++ b/python/packages/autogen-studio/frontend/src/components/views/team/api.ts @@ -1,5 +1,5 @@ -import { Team, AgentConfig } from "../../../types/datamodel"; -import { getServerUrl } from "../../../utils"; +import { Team, AgentConfig } from "../../types/datamodel"; +import { getServerUrl } from "../../utils"; export class TeamAPI { private getBaseUrl(): string { diff --git a/python/packages/autogen-studio/frontend/src/components/views/team/builder/builder.css b/python/packages/autogen-studio/frontend/src/components/views/team/builder/builder.css new file mode 100644 index 000000000000..cc96b317e6c1 --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/team/builder/builder.css @@ -0,0 +1,30 @@ +.drop-target-valid { + outline: 2px solid #4caf50; + outline-offset: 4px; + transition: outline-color 0.2s; + } + + .drop-target-invalid { + outline: 2px dashed #f44336; + outline-offset: 4px; + } + + .droppable-zone { + min-height: 40px; + border: 2px dashed #ccc; + border-radius: 4px; + margin: 8px 0; + } + + .droppable-zone.can-drop { + border-color: #4caf50; + background: rgba(76, 175, 80, 0.1); + } + +.my-left-handle{ + @apply bg-accent w-1 h-3 rounded-r-sm -ml-1 border-0 !important; +} + +.my-right-handle{ + @apply bg-accent w-1 h-3 rounded-l-sm -mr-1 border-0 !important; +} \ No newline at end of file diff --git a/python/packages/autogen-studio/frontend/src/components/views/team/builder/builder.tsx b/python/packages/autogen-studio/frontend/src/components/views/team/builder/builder.tsx new file mode 100644 index 000000000000..92e813efbc7b --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/team/builder/builder.tsx @@ -0,0 +1,416 @@ +import React, { useCallback, useRef, useState } from "react"; +import { + DndContext, + useSensor, + useSensors, + PointerSensor, + DragEndEvent, + DragOverEvent, +} from "@dnd-kit/core"; +import { + ReactFlow, + useNodesState, + useEdgesState, + addEdge, + Connection, + Background, + MiniMap, +} from "@xyflow/react"; +import "@xyflow/react/dist/style.css"; +import { Button, Layout, message, Modal, Switch, Tooltip } from "antd"; +import { Cable, Code2, Download, Save } from "lucide-react"; +import { useTeamBuilderStore } from "./store"; +import { ComponentLibrary } from "./library"; +import { ComponentTypes, Team } from "../../../types/datamodel"; +import { CustomNode, CustomEdge, DragItem } from "./types"; +import { edgeTypes, nodeTypes } from "./nodes"; + +// import builder css +import "./builder.css"; +import TeamBuilderToolbar from "./toolbar"; +import { MonacoEditor } from "../../monaco"; +import { NodeEditor } from "./node-editor"; + +const { Sider, Content } = Layout; + +interface TeamBuilderProps { + team: Team; + onChange?: (team: Partial) => void; + onDirtyStateChange?: (isDirty: boolean) => void; +} + +export const TeamBuilder: React.FC = ({ + team, + onChange, + onDirtyStateChange, +}) => { + // Replace store state with React Flow hooks + const [nodes, setNodes, onNodesChange] = useNodesState([]); + const [edges, setEdges, onEdgesChange] = useEdgesState([]); + const [isJsonMode, setIsJsonMode] = useState(false); + const [isFullscreen, setIsFullscreen] = useState(false); + const [showGrid, setShowGrid] = useState(true); + const [showMiniMap, setShowMiniMap] = useState(true); + // const [isDirty, setIsDirty] = useState(false); + const editorRef = useRef(null); + const [messageApi, contextHolder] = message.useMessage(); + + const { + undo, + redo, + loadFromJson, + syncToJson, + addNode, + layoutNodes, + resetHistory, + history, + updateNode, + selectedNodeId, + } = useTeamBuilderStore(); + + const currentHistoryIndex = useTeamBuilderStore( + (state) => state.currentHistoryIndex + ); + + // Compute isDirty based on the store value + const isDirty = currentHistoryIndex > 0; + + // Compute undo/redo capability from history state + const canUndo = currentHistoryIndex > 0; + const canRedo = currentHistoryIndex < history.length - 1; + + const onConnect = useCallback( + (params: Connection) => + setEdges((eds: CustomEdge[]) => addEdge(params, eds)), + [setEdges] + ); + + const sensors = useSensors( + useSensor(PointerSensor, { + activationConstraint: { + distance: 8, + }, + }) + ); + + // Need to notify parent whenever isDirty changes + React.useEffect(() => { + onDirtyStateChange?.(isDirty); + }, [isDirty, onDirtyStateChange]); + + // Add beforeunload handler when dirty + React.useEffect(() => { + if (isDirty) { + const handleBeforeUnload = (e: BeforeUnloadEvent) => { + e.preventDefault(); + e.returnValue = ""; + }; + window.addEventListener("beforeunload", handleBeforeUnload); + return () => + window.removeEventListener("beforeunload", handleBeforeUnload); + } + }, [isDirty]); + + // Load initial config + React.useEffect(() => { + if (team?.config) { + const { nodes: initialNodes, edges: initialEdges } = loadFromJson( + team.config + ); + setNodes(initialNodes); + setEdges(initialEdges); + } + }, [team, setNodes, setEdges]); + + // Handle JSON changes + const handleJsonChange = useCallback( + (value: string) => { + try { + const config = JSON.parse(value); + loadFromJson(config); + // dirty ? + } catch (error) { + console.error("Invalid JSON:", error); + } + }, + [loadFromJson] + ); + + // Handle save + const handleSave = useCallback(async () => { + try { + const config = syncToJson(); + if (!config) { + throw new Error("Unable to generate valid configuration"); + } + + if (onChange) { + console.log("Saving team configuration", config); + const teamData: Partial = team + ? { + ...team, + config, + created_at: undefined, + updated_at: undefined, + } + : { config }; + await onChange(teamData); + resetHistory(); + } + } catch (error) { + messageApi.error( + error instanceof Error + ? error.message + : "Failed to save team configuration" + ); + } + }, [syncToJson, onChange, resetHistory]); + + const handleToggleFullscreen = useCallback(() => { + setIsFullscreen((prev) => !prev); + }, []); + + React.useEffect(() => { + if (!isFullscreen) return; + const handleEscape = (event: KeyboardEvent) => { + if (event.key === "Escape") { + setIsFullscreen(false); + } + }; + document.addEventListener("keydown", handleEscape); + return () => document.removeEventListener("keydown", handleEscape); + }, [isFullscreen]); + + React.useEffect(() => { + const unsubscribe = useTeamBuilderStore.subscribe((state) => { + setNodes(state.nodes); + setEdges(state.edges); + // console.log("nodes updated", state); + }); + return unsubscribe; + }, [setNodes, setEdges]); + + const validateDropTarget = ( + draggedType: ComponentTypes, + targetType: ComponentTypes + ): boolean => { + const validTargets: Record = { + model: ["team", "agent"], + tool: ["agent"], + agent: ["team"], + team: [], + termination: ["team"], + }; + return validTargets[draggedType]?.includes(targetType) || false; + }; + + const handleDragOver = (event: DragOverEvent) => { + const { active, over } = event; + if (!over?.id || !active.data.current) return; + + const draggedType = active.data.current.type; + const targetNode = nodes.find((node) => node.id === over.id); + if (!targetNode) return; + + const isValid = validateDropTarget(draggedType, targetNode.data.type); + // Add visual feedback class to target node + if (isValid) { + targetNode.className = "drop-target-valid"; + } else { + targetNode.className = "drop-target-invalid"; + } + }; + + const handleDragEnd = (event: DragEndEvent) => { + const { active, over } = event; + if (!over || !active.data?.current?.current) return; + + const draggedItem = active.data.current.current; + const dropZoneId = over.id as string; + + const [nodeId, zoneType] = dropZoneId.split("-zone")[0].split("-"); + + // Find target node + const targetNode = nodes.find((node) => node.id === nodeId); + if (!targetNode) return; + + // Validate drop + const isValid = validateDropTarget(draggedItem.type, targetNode.data.type); + if (!isValid) return; + + const position = { + x: event.delta.x, + y: event.delta.y, + }; + + // Pass both new node data AND target node id + addNode( + draggedItem.type as ComponentTypes, + position, + draggedItem.config, + nodeId + ); + }; + + const onDragStart = (item: DragItem) => { + // We can add any drag start logic here if needed + }; + return ( +
    + {contextHolder} +
    +
    + { + setIsJsonMode(!isJsonMode); + }} + className="mr-2" + // size="small" + defaultChecked={!isJsonMode} + checkedChildren=
    + +
    + unCheckedChildren=
    + +
    + /> + {isJsonMode ? ( + "JSON " + ) : ( + <> + Visual builder{" "} + {/* + {" "} + experimental{" "} + */} + + )}{" "} + mode{" "} + + {" "} + (experimental) + +
    +
    + +
    + } + className="p-1.5 hover:bg-primary/10 rounded-md text-primary/75 hover:text-primary disabled:opacity-50 disabled:cursor-not-allowed" + onClick={handleSave} + // disabled={!isDirty} + /> + +
    +
    + + + {!isJsonMode && } + + + +
    + {isJsonMode ? ( + + ) : ( + setSelectedNode(node.id)} + nodeTypes={nodeTypes} + edgeTypes={edgeTypes} + onDrop={(event) => event.preventDefault()} + onDragOver={(event) => event.preventDefault()} + className="rounded" + fitView + fitViewOptions={{ padding: 10 }} + > + {showGrid && } + {showMiniMap && } + + )} +
    + {isFullscreen && ( +
    + )} + setShowMiniMap(!showMiniMap)} + canUndo={canUndo} + canRedo={canRedo} + isDirty={isDirty} + onToggleView={() => setIsJsonMode(!isJsonMode)} + onUndo={undo} + onRedo={redo} + onSave={handleSave} + onToggleGrid={() => setShowGrid(!showGrid)} + onToggleFullscreen={handleToggleFullscreen} + onAutoLayout={layoutNodes} + /> + + + + n.id === selectedNodeId) || null} + onUpdate={(updates) => { + if (selectedNodeId) { + console.log("updating node", selectedNodeId, updates); + updateNode(selectedNodeId, updates); + handleSave(); + } + }} + /> + + +
    + ); +}; diff --git a/python/packages/autogen-studio/frontend/src/components/views/team/builder/library.tsx b/python/packages/autogen-studio/frontend/src/components/views/team/builder/library.tsx new file mode 100644 index 000000000000..c5bdfceb1269 --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/team/builder/library.tsx @@ -0,0 +1,228 @@ +import React from "react"; +import { Input, Collapse, type CollapseProps } from "antd"; +import { useDraggable } from "@dnd-kit/core"; +import { CSS } from "@dnd-kit/utilities"; +import { + Brain, + ChevronDown, + Bot, + Wrench, + Timer, + Maximize2, + Minimize2, +} from "lucide-react"; +import type { + AgentConfig, + ModelConfig, + TerminationConfig, + ToolConfig, +} from "../../../types/datamodel"; +import Sider from "antd/es/layout/Sider"; +import { useGalleryStore } from "../../gallery/store"; + +interface ComponentConfigTypes { + [key: string]: any; +} + +type ComponentTypes = "agent" | "model" | "tool" | "termination"; + +interface LibraryProps {} + +interface PresetItemProps { + id: string; + type: ComponentTypes; + config: ComponentConfigTypes; + label: string; + icon: React.ReactNode; +} + +const PresetItem: React.FC = ({ + id, + type, + config, + label, + icon, +}) => { + const { attributes, listeners, setNodeRef, transform, isDragging } = + useDraggable({ + id, + data: { + current: { + type, + config, + label, + }, + }, + }); + + const style = { + transform: CSS.Transform.toString(transform), + opacity: isDragging ? 0.5 : undefined, + }; + + return ( +
    +
    + {icon} + {label} +
    +
    + ); +}; + +export const ComponentLibrary: React.FC = () => { + const [searchTerm, setSearchTerm] = React.useState(""); + const [isMinimized, setIsMinimized] = React.useState(false); + const defaultGallery = useGalleryStore((state) => state.getDefaultGallery()); + + if (!defaultGallery) { + return null; + } + // Map gallery components to sections format + const sections = React.useMemo( + () => [ + { + title: "Agents", + type: "agent" as ComponentTypes, + items: defaultGallery.items.components.agents.map((agent) => ({ + label: agent.name, + config: agent, + })), + icon: , + }, + { + title: "Models", + type: "model" as ComponentTypes, + items: defaultGallery.items.components.models.map((model) => ({ + label: `${model.model_type} - ${model.model}`, + config: model, + })), + icon: , + }, + { + title: "Tools", + type: "tool" as ComponentTypes, + items: defaultGallery.items.components.tools.map((tool) => ({ + label: tool.name, + config: tool, + })), + icon: , + }, + { + title: "Terminations", + type: "termination" as ComponentTypes, + items: defaultGallery.items.components.terminations.map( + (termination) => ({ + label: `${termination.termination_type}`, + config: termination, + }) + ), + icon: , + }, + ], + [defaultGallery] + ); + + const items: CollapseProps["items"] = sections.map((section) => { + const filteredItems = section.items.filter((item) => + item.label.toLowerCase().includes(searchTerm.toLowerCase()) + ); + + return { + key: section.title, + label: ( +
    + {section.icon} + {section.title} + + ({filteredItems.length}) + +
    + ), + children: ( +
    + {filteredItems.map((item, itemIndex) => ( + + ))} +
    + ), + }; + }); + + if (isMinimized) { + return ( +
    setIsMinimized(false)} + className="absolute group top-4 left-4 bg-primary shadow-md rounded px-4 pr-2 py-2 cursor-pointer transition-all duration-300 z-50 flex items-center gap-2" + > + Show Component Library + +
    + ); + } + + return ( + +
    +
    +
    Component Library
    + +
    + +
    + Drag a component to add it to the team +
    + +
    + setSearchTerm(e.target.value)} + className="flex-1 p-2" + /> +
    + + ( + + )} + /> +
    +
    + ); +}; + +export default ComponentLibrary; diff --git a/python/packages/autogen-studio/frontend/src/components/views/team/builder/node-editor.tsx b/python/packages/autogen-studio/frontend/src/components/views/team/builder/node-editor.tsx new file mode 100644 index 000000000000..07520e47a2d8 --- /dev/null +++ b/python/packages/autogen-studio/frontend/src/components/views/team/builder/node-editor.tsx @@ -0,0 +1,665 @@ +import React, { useEffect, useState } from "react"; +import { Drawer, Button, Space, message, Select, Input } from "antd"; +import { NodeEditorProps } from "./types"; +import { useTeamBuilderStore } from "./store"; +import { + TeamConfig, + ComponentTypes, + TeamTypes, + ModelTypes, + SelectorGroupChatConfig, + RoundRobinGroupChatConfig, + ModelConfig, + AzureOpenAIModelConfig, + OpenAIModelConfig, + ComponentConfigTypes, + AgentConfig, + ToolConfig, + AgentTypes, + ToolTypes, + TerminationConfig, + TerminationTypes, + MaxMessageTerminationConfig, + TextMentionTerminationConfig, + CombinationTerminationConfig, +} from "../../../types/datamodel"; + +const { TextArea } = Input; + +interface EditorProps { + value: T; + onChange: (value: T) => void; + disabled?: boolean; +} + +const TeamEditor: React.FC> = ({ + value, + onChange, + disabled, +}) => { + const handleTypeChange = (teamType: TeamTypes) => { + if (teamType === "SelectorGroupChat") { + onChange({ + ...value, + team_type: teamType, + selector_prompt: "", + model_client: { + component_type: "model", + model: "", + model_type: "OpenAIChatCompletionClient", + }, + } as SelectorGroupChatConfig); + } else { + const { selector_prompt, model_client, ...rest } = + value as SelectorGroupChatConfig; + onChange({ + ...rest, + team_type: teamType, + } as RoundRobinGroupChatConfig); + } + }; + + return ( + +
    + + onChange({ ...value, name: e.target.value })} + disabled={disabled} + /> +
    + + {value.team_type === "SelectorGroupChat" && ( + <> +
    + +