Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial base.py for message broker agent-state-encapsulation #3831

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 69 additions & 5 deletions autogpt/core/messaging/base.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,73 @@
import abc
from abc import ABC, abstractmethod
from enum import Enum, StrEnum
import dataclasses
from typing import Any, List, Callable, Union


class Message(abc.ABC):
pass
class MessageCategory(StrEnum):
COMMAND = "command"
AGENT_INSTANTIATION = "agent_instantiation"
USER_INPUT = "user_input"
USER_PROMPT = "user_prompt"
AGENT_MESSAGE = "agent_message"
SELF_FEEDBACK = "self_feedback"
PLAN = "plan"


class MessageBroker(abc.ABC):
pass
class Role(StrEnum):
USER = "user"
SYSTEM = "system"
ASSISTANT = "assistant"


class Sender:
id: int # Who is sending the message, should use interface Sender
role: Role


class Receiver:
id: int # Who is receiving the message, should use interface receiver
role: Role


@dataclasses.dataclass
class Message(ABC): # ABC should be within parentheses
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recall that we've got a message struct elsewhere. It's good not to pollute our own types namespace. We should rename one or both of these (probably keep this one and rename the other, but interested to hear other opinions)

sender: Role # Use Any to allow any type of sender
message: str
kind_of_message: MessageCategory


class MessageBroker(ABC):
@property # Use property decorator instead of abc.property
def sinks(
self,
) -> List[Callable]: # Specify the return type as a list of callable objects
return []

@abstractmethod
def broadcast_message(self, message: Message) -> None:
pass

@abstractmethod
def get_messages(
self, filters: Any
) -> List[Message]: # Specify filters and return type
pass

@abstractmethod
def get_listeners(
self,
) -> List[Any]: # Specify the return type as a list of listeners
pass

@abstractmethod
def register_listener(
self,
) -> Union[str, None]: # Return ListenerStatus or None if unsuccessful
pass

@abstractmethod
def remove_listener(
self,
) -> Union[str, None]: # Return ListenerStatus or None if unsuccessful
pass