183 lines
5.7 KiB
Python
183 lines
5.7 KiB
Python
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
# Portions derived from https://github.com/microsoft/autogen are under the MIT License.
|
|
# SPDX-License-Identifier: MIT
|
|
from typing import TYPE_CHECKING, Any, Optional, Protocol, TypeVar, Union, runtime_checkable
|
|
|
|
from ..doc_utils import export_module
|
|
|
|
__all__ = ["Agent", "LLMAgent", "LLMMessageType"]
|
|
|
|
Tool = TypeVar("Tool")
|
|
|
|
LLMMessageType = dict[str, Any]
|
|
|
|
DEFAULT_SUMMARY_METHOD = "last_msg"
|
|
|
|
|
|
@runtime_checkable
|
|
@export_module("autogen")
|
|
class Agent(Protocol):
|
|
"""(In preview) A protocol for Agent.
|
|
|
|
An agent can communicate with other agents and perform actions.
|
|
Different agents can differ in what actions they perform in the `receive` method.
|
|
"""
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
"""The name of the agent."""
|
|
...
|
|
|
|
@property
|
|
def description(self) -> str:
|
|
"""The description of the agent. Used for the agent's introduction in
|
|
a group chat setting.
|
|
"""
|
|
...
|
|
|
|
def send(
|
|
self,
|
|
message: Union[dict[str, Any], str],
|
|
recipient: "Agent",
|
|
request_reply: Optional[bool] = None,
|
|
) -> None:
|
|
"""Send a message to another agent.
|
|
|
|
Args:
|
|
message (dict or str): the message to send. If a dict, it should be
|
|
a JSON-serializable and follows the OpenAI's ChatCompletion schema.
|
|
recipient (Agent): the recipient of the message.
|
|
request_reply (bool): whether to request a reply from the recipient.
|
|
"""
|
|
...
|
|
|
|
async def a_send(
|
|
self,
|
|
message: Union[dict[str, Any], str],
|
|
recipient: "Agent",
|
|
request_reply: Optional[bool] = None,
|
|
) -> None:
|
|
"""(Async) Send a message to another agent.
|
|
|
|
Args:
|
|
message (dict or str): the message to send. If a dict, it should be
|
|
a JSON-serializable and follows the OpenAI's ChatCompletion schema.
|
|
recipient (Agent): the recipient of the message.
|
|
request_reply (bool): whether to request a reply from the recipient.
|
|
"""
|
|
...
|
|
|
|
def receive(
|
|
self,
|
|
message: Union[dict[str, Any], str],
|
|
sender: "Agent",
|
|
request_reply: Optional[bool] = None,
|
|
) -> None:
|
|
"""Receive a message from another agent.
|
|
|
|
Args:
|
|
message (dict or str): the message received. If a dict, it should be
|
|
a JSON-serializable and follows the OpenAI's ChatCompletion schema.
|
|
sender (Agent): the sender of the message.
|
|
request_reply (bool): whether the sender requests a reply.
|
|
"""
|
|
|
|
async def a_receive(
|
|
self,
|
|
message: Union[dict[str, Any], str],
|
|
sender: "Agent",
|
|
request_reply: Optional[bool] = None,
|
|
) -> None:
|
|
"""(Async) Receive a message from another agent.
|
|
|
|
Args:
|
|
message (dict or str): the message received. If a dict, it should be
|
|
a JSON-serializable and follows the OpenAI's ChatCompletion schema.
|
|
sender (Agent): the sender of the message.
|
|
request_reply (bool): whether the sender requests a reply.
|
|
"""
|
|
...
|
|
|
|
def generate_reply(
|
|
self,
|
|
messages: Optional[list[dict[str, Any]]] = None,
|
|
sender: Optional["Agent"] = None,
|
|
**kwargs: Any,
|
|
) -> Union[str, dict[str, Any], None]:
|
|
"""Generate a reply based on the received messages.
|
|
|
|
Args:
|
|
messages (list[dict[str, Any]]): a list of messages received from other agents.
|
|
The messages are dictionaries that are JSON-serializable and
|
|
follows the OpenAI's ChatCompletion schema.
|
|
sender: sender of an Agent instance.
|
|
**kwargs: Additional keyword arguments.
|
|
|
|
Returns:
|
|
str or dict or None: the generated reply. If None, no reply is generated.
|
|
"""
|
|
|
|
async def a_generate_reply(
|
|
self,
|
|
messages: Optional[list[dict[str, Any]]] = None,
|
|
sender: Optional["Agent"] = None,
|
|
**kwargs: Any,
|
|
) -> Union[str, dict[str, Any], None]:
|
|
"""(Async) Generate a reply based on the received messages.
|
|
|
|
Args:
|
|
messages (list[dict[str, Any]]): a list of messages received from other agents.
|
|
The messages are dictionaries that are JSON-serializable and
|
|
follows the OpenAI's ChatCompletion schema.
|
|
sender: sender of an Agent instance.
|
|
**kwargs: Additional keyword arguments.
|
|
|
|
Returns:
|
|
str or dict or None: the generated reply. If None, no reply is generated.
|
|
"""
|
|
...
|
|
|
|
def set_ui_tools(self, tools: list[Tool]) -> None:
|
|
"""Set the UI tools for the agent.
|
|
|
|
Args:
|
|
tools: a list of UI tools to set.
|
|
"""
|
|
...
|
|
|
|
def unset_ui_tools(self, tools: list[Tool]) -> None:
|
|
"""Unset the UI tools for the agent.
|
|
|
|
Args:
|
|
tools: a list of UI tools to set.
|
|
"""
|
|
...
|
|
|
|
|
|
@runtime_checkable
|
|
@export_module("autogen")
|
|
class LLMAgent(Agent, Protocol):
|
|
"""(In preview) A protocol for an LLM agent."""
|
|
|
|
@property
|
|
def system_message(self) -> str:
|
|
"""The system message of this agent."""
|
|
|
|
def update_system_message(self, system_message: str) -> None:
|
|
"""Update this agent's system message.
|
|
|
|
Args:
|
|
system_message (str): system message for inference.
|
|
"""
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
# mypy will fail if Conversable agent does not implement Agent protocol
|
|
from .conversable_agent import ConversableAgent
|
|
|
|
def _check_protocol_implementation(agent: ConversableAgent) -> Agent:
|
|
return agent
|