Source code for sherpa_ai.memory.shared_memory
from __future__ import annotations
from typing import TYPE_CHECKING, List, Optional
from sherpa_ai.actions.planning import Plan
from sherpa_ai.events import Event, EventType
from sherpa_ai.memory.belief import Belief
if TYPE_CHECKING:
from sherpa_ai.agents import AgentPool
[docs]
class SharedMemory:
def __init__(self, objective: str, agent_pool: AgentPool = None):
self.objective = objective
self.agent_pool = agent_pool
self.events: List[Event] = []
self.plan: Optional[Plan] = None
self.current_step = None
[docs]
def add_event(self, event: Event):
self.events.append(event)
[docs]
def add(self, event_type: EventType, agent: str, content: str):
event = Event(event_type=event_type, agent=agent, content=content)
self.add_event(event)
[docs]
def observe(self, belief: Belief):
tasks = self.get_by_type(EventType.task)
task = tasks[-1] if len(tasks) > 0 else None
belief.set_current_task(task)
for event in self.events:
if (
event.event_type == EventType.task
or event.event_type == EventType.result
):
belief.update(event)
[docs]
def get_by_type(self, event_type):
return [event for event in self.events if event.event_type == event_type]
@property
def __dict__(self):
return {
"objective": self.objective,
"events": [event.__dict__ for event in self.events],
"plan": self.plan.__dict__ if self.plan else None,
"current_step": self.current_step.__dict__ if self.current_step else None,
}
[docs]
@classmethod
def from_dict(cls, data, agent_pool):
shared_memory = cls(objective=data["objective"], agent_pool=agent_pool)
shared_memory.events = [Event.from_dict(event) for event in data["events"]]
shared_memory.plan = Plan.from_dict(data["plan"]) if data["plan"] else None
shared_memory.current_step = (
Plan.from_dict(data["current_step"]) if data["current_step"] else None
)
return shared_memory