sherpa_ai.memory package#
Overview#
The memory package provides persistence and knowledge management capabilities for Sherpa AI agents, enabling them to retain information across sessions and share knowledge between different components.
Key Components
Belief: Structures for representing agent beliefs and knowledge
SharedMemory: Mechanisms for sharing information between agents
Knowledge Management: Tools for organizing and retrieving stored information
Example Usage#
from sherpa_ai.memory.shared_memory import SharedMemory
from sherpa_ai.memory.belief import Belief
# Create a shared memory instance
memory = SharedMemory()
# Create and store a belief
belief = Belief(
content="The Earth orbits the Sun.",
source="Astronomy facts",
confidence=0.99
)
# Add the belief to memory
memory.add_belief(belief)
# Retrieve beliefs on a topic
astronomy_beliefs = memory.get_beliefs_by_topic("astronomy")
print(f"Found {len(astronomy_beliefs)} beliefs about astronomy")
Submodules#
Module |
Description |
|---|---|
Provides the Belief class for representing and managing agent knowledge. |
|
Implements the SharedMemory system for knowledge persistence and sharing. |
sherpa_ai.memory.belief module#
Belief management module for Sherpa AI.
This module provides belief tracking functionality for agents in the Sherpa AI system. It defines the Belief class which manages agent state, events, and internal reasoning.
- class sherpa_ai.memory.belief.Belief(**data)[source]#
Bases:
BaseModelManages agent beliefs and state tracking.
This class maintains the agent’s belief state, including observed events, internal reasoning events, and current task information. It provides methods for updating and retrieving belief state, managing events, and handling agent actions.
- state_machine#
State machine for managing agent state.
- Type:
SherpaStateMachine
- actions#
List of available actions.
- Type:
List[BaseAction]
- belief_data#
Dictionary for storing arbitrary belief data.
- Type:
dict
- max_tokens#
Maximum number of tokens for context/history.
- Type:
int
Example
>>> belief = Belief() >>> belief.update(observation_event) >>> belief.set_current_task("Analyze the data") >>> context = belief.get_context(token_counter) >>> print(context) 'current_task: Analyze the data(task)'
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- state_machine: SherpaStateMachine#
- actions: List#
- belief_data: Dict#
- max_tokens: int#
- update(observation)[source]#
Update belief with a new observation event.
- Parameters:
observation (Event) – The event to add to the belief state.
Example
>>> belief = Belief() >>> event = Event("observation", "user_input", "Hello") >>> belief.update(event) >>> print(belief.events) [Event("observation", "user_input", "Hello")]
- get_context(token_counter)[source]#
Get the context of the agent’s belief state.
- Parameters:
token_counter (Callable[[str], int]) – Function to count tokens in text.
- Returns:
Context string containing relevant events, truncated if exceeding max_tokens.
- Return type:
str
Example
>>> belief = Belief() >>> def count_tokens(text): return len(text.split()) >>> belief.set_current_task("Analyze data") >>> context = belief.get_context(count_tokens) >>> print(context) 'current_task: Analyze data(task)'
- update_internal(event_type, name, **kwargs)[source]#
Add an internal event to the belief state.
- Parameters:
event_type (str) – Type of the internal event.
name (str) – Name of the event.
**kwargs – Additional event parameters.
Example
>>> belief = Belief() >>> belief.update_internal("reasoning", "analysis", content="Processing data") >>> print(belief.internal_events[0].event_type) 'reasoning'
- get_by_type(event_type)[source]#
Get all internal events of a specific type.
- Parameters:
event_type (str) – Type of events to retrieve.
- Returns:
List of internal events matching the type.
- Return type:
List[Event]
Example
>>> belief = Belief() >>> belief.update_internal("reasoning", "analysis") >>> events = belief.get_by_type("reasoning") >>> print(len(events)) 1
- get_events_by_type(event_type)[source]#
Retrieve events of a specific type as JSON objects.
- Parameters:
event_type (str) – The type of events to retrieve (e.g., “action_start”, “feedback”).
- Returns:
- A list of events as JSON objects, in chronological order (oldest to newest).
Each object contains the event’s properties (name, content, event_type, etc.).
- Return type:
List[dict]
Example
>>> belief = Belief() >>> belief.update_internal("action_start", "test_action", args={"param": "value"}) >>> events = belief.get_events_by_type("action_start") >>> print(events[0]["name"]) test_action
- get_events_excluding_types(exclude_types)[source]#
Retrieve events excluding specific types as JSON objects.
- Parameters:
exclude_types (List[str]) – List of event types to exclude from the results (e.g., [“feedback”, “action_start”]).
- Returns:
- A list of events as JSON objects, in chronological order (oldest to newest),
excluding events whose types are in the exclude_types list.
- Return type:
List[dict]
Example
>>> belief = Belief() >>> belief.update_internal("action_start", "action1", args={}) >>> belief.update_internal("feedback", "feedback1", content="good") >>> events = belief.get_events_excluding_types(["feedback"]) >>> print(events[0]["event_type"]) action_start
- set_current_task(content)[source]#
Set the current task in the belief state.
- Parameters:
content (str) – Content of the current task.
Example
>>> belief = Belief() >>> belief.set_current_task("Process data") >>> print(belief.current_task.content) 'Process data'
- get_internal_history(token_counter)[source]#
Get the internal history of the agent as a string, with token limiting.
This method uses get_events_excluding_types to retrieve all internal events as dicts, then converts them to strings in reverse order (most recent first) for LLM context, and applies token limiting.
- Parameters:
token_counter (Callable[[str], int]) – Function to count tokens in text.
- Returns:
- Internal history string, in reverse chronological order (most recent first),
truncated if exceeding max_tokens.
- Return type:
str
Example
>>> belief = Belief() >>> def count_tokens(text): return len(text.split()) >>> belief.update_internal("reasoning", "analysis") >>> history = belief.get_internal_history(count_tokens) >>> print(history) 'analysis(reasoning)'
- get_histories_excluding_types(exclude_types, token_counter=None, max_tokens=4000)[source]#
Get internal history excluding specific event types as a string, with token limiting.
This method uses get_events_excluding_types to retrieve internal events as dicts (excluding specified types), then converts them to strings in reverse order (most recent first) for LLM context, and applies token limiting.
- Parameters:
exclude_types (list[str]) – List of event types to exclude.
token_counter (Optional[Callable[[str], int]]) – Function to count tokens. If None, uses word count.
max_tokens (int) – Maximum number of tokens in result.
- Returns:
- Filtered history string, in reverse chronological order (most recent first),
truncated if exceeding max_tokens.
- Return type:
str
Example
>>> belief = Belief() >>> def count_tokens(text): return len(text.split()) >>> belief.update_internal("reasoning", "analysis") >>> belief.update_internal("feedback", "comment") >>> history = belief.get_histories_excluding_types(["feedback"], count_tokens) >>> print(history) 'analysis(reasoning)'
- clear_short_term_memory()[source]#
Clear short-term memory by removing all internal events and dictionary data.
Example
>>> belief = Belief() >>> belief.update_internal("reasoning", "analysis") >>> belief.set("key", "value") >>> belief.clear_short_term_memory() >>> print(len(belief.internal_events)) 0 >>> print(belief.belief_data) {}
- set_actions(actions)[source]#
Set available actions for the agent.
- Parameters:
actions (List[BaseAction]) – List of actions to make available.
Example
>>> belief = Belief() >>> actions = [Action1(), Action2()] >>> belief.set_actions(actions) >>> print(len(belief.actions)) 2
- property action_description#
Get string description of all available actions.
- Returns:
str: Newline-separated string of action descriptions.
- Example:
>>> belief = Belief() >>> belief.set_actions([Action1(), Action2()]) >>> print(belief.action_description) 'Action1: Description1
Action2: Description2’
- get_state()[source]#
Get current state name from state machine.
- Returns:
Name of current state, or None if no state machine exists.
- Return type:
str
Example
>>> belief = Belief() >>> belief.state_machine = StateMachine() >>> print(belief.get_state()) 'initial'
- get_state_obj()[source]#
Get current state object from state machine.
- Returns:
Current state object, or None if no state machine exists.
- Return type:
ts.State
Example
>>> belief = Belief() >>> belief.state_machine = StateMachine() >>> state = belief.get_state_obj() >>> print(state.name) 'initial'
- get_actions()[source]#
Get list of available actions.
- Returns:
List of available actions.
- Return type:
List[BaseAction]
Example
>>> belief = Belief() >>> belief.set_actions([Action1(), Action2()]) >>> actions = belief.get_actions() >>> print(len(actions)) 2
- get_action(action_name)[source]#
Get specific action by name.
- Parameters:
action_name (str) – Name of action to retrieve.
- Returns:
Action with matching name, or None if not found.
- Return type:
Example
>>> belief = Belief() >>> belief.set_actions([Action1(name="action1")]) >>> action = belief.get_action("action1") >>> print(action.name) 'action1'
- async async_get_actions()[source]#
Asynchronously get list of available actions.
- Returns:
List of available actions.
- Return type:
List[BaseAction]
Example
>>> belief = Belief() >>> belief.set_actions([Action1(), Action2()]) >>> actions = await belief.async_get_actions() >>> print(len(actions)) 2
- async async_get_action(action_name)[source]#
Asynchronously get specific action by name.
- Parameters:
action_name (str) – Name of action to retrieve.
- Returns:
Action with matching name, or None if not found.
- Return type:
Example
>>> belief = Belief() >>> belief.set_actions([Action1(name="action1")]) >>> action = await belief.async_get_action("action1") >>> print(action.name) 'action1'
- get_dict()[source]#
Get the belief dictionary.
- Returns:
Dictionary containing belief data.
- Return type:
dict
Example
>>> belief = Belief() >>> belief.set("key", "value") >>> print(belief.get_dict()) {'key': 'value'}
- get(key, default=None)[source]#
Get value from belief dictionary using dot notation.
- Parameters:
key (str) – Key to retrieve, can use dot notation for nested values.
default (Any) – Default value if key not found.
- Returns:
Value at key, or default if not found.
- Return type:
Any
Example
>>> belief = Belief() >>> belief.set("nested.key", "value") >>> print(belief.get("nested.key")) 'value' >>> print(belief.get("missing.key", "default")) 'default'
- get_all_keys()[source]#
Get all keys in belief dictionary, including nested keys.
- Returns:
List of all keys, using dot notation for nested keys.
- Return type:
List[str]
Example
>>> belief = Belief() >>> belief.set("nested.key", "value") >>> print(belief.get_all_keys()) ['nested.key']
- has(key)[source]#
Check if key exists in belief dictionary.
- Parameters:
key (str) – Key to check, can use dot notation for nested values.
- Returns:
True if key exists, False otherwise.
- Return type:
bool
Example
>>> belief = Belief() >>> belief.set("key", "value") >>> print(belief.has("key")) True >>> print(belief.has("missing.key")) False
Module contents#
Memory management module for Sherpa AI.
This module provides memory management functionality for the Sherpa AI system. It exports the SharedMemory and Belief classes which handle state management and belief tracking for agents.
Example
>>> from sherpa_ai.memory import SharedMemory, Belief
>>> memory = SharedMemory()
>>> belief = Belief()
>>> memory.store("key", "value")
>>> belief.update("observation", "action")
Bases:
objectManages shared memory between agents in the Sherpa AI system.
This class maintains a shared state that can be accessed and modified by multiple agents. It tracks events, plans, and current execution steps, providing methods for adding events and synchronizing state with agent beliefs. Note that the agent names registered in the shared memory must be unique
The overall objective being pursued.
- Type:
str
List of events in shared memory.
- Type:
List[Event]
Agent runtime subscriptions to specific event types.
- Type:
dict[type[Event], list[ThreadedRuntime]]
Agent runtime subscriptions based on sender.
- Type:
dict[str, list[ThreadedRuntime]]
Reentrant lock for thread safety.
- Type:
threading.RLock
Add an event to shared memory.
- Parameters:
event (Event) – Event to add to shared memory.
wait (bool) – Whether to wait for the event to be processed.
Example
>>> memory = SharedMemory("Complete the task") >>> event = Event("task", "initial_task", "Process data") >>> memory.add_event(event) >>> print(len(memory.events)) 1
Create and add an event to shared memory.
- Parameters:
event_type (str) – Type of the event.
name (str) – Name of the event.
sender (str) – Sender of the event.
wait (bool) – Whether to wait for the event to be processed.
**kwargs – Additional event parameters.
Subscribe an agent to a specific event type. :type event_type:
str:param event_type: Type of event to subscribe to. :type event_type: str :type subscriber:ThreadedRuntime:param subscriber: Agent runtime subscribing to the event type. :type subscriber: ThreadedRuntimeExample
>>> memory = SharedMemory("Complete the task") >>> runtime = ThreadedRuntime(QAAgent()) >>> memory.subscribe("trigger", runtime) >>> print(len(memory.event_type_subscriptions)) 1
Subscribe an agent to events from a specific sender.
- Parameters:
sender (str) – Sender of the events.
subscriber (ThreadedRuntime) – Agent runtime subscribing to the sender.
Example
>>> memory = SharedMemory("Complete the task") >>> subscriber = ThreadedRuntime(QAAgent()) >>> memory.subscribe_sender("agent1", runtime) >>> print(len(memory.sender_subscriptions)) 1
Get all events of a specific type.
- Parameters:
event_type (str) – Type of events to retrieve.
- Returns:
List of events matching the type.
- Return type:
List[Event]
Example
>>> memory = SharedMemory("Complete the task") >>> memory.add("task", "task1", content="First task") >>> memory.add("task", "task2", content="Second task") >>> tasks = memory.get_by_type("task") >>> print(len(tasks)) 2
- class sherpa_ai.memory.Belief(**data)[source]#
Bases:
BaseModelManages agent beliefs and state tracking.
This class maintains the agent’s belief state, including observed events, internal reasoning events, and current task information. It provides methods for updating and retrieving belief state, managing events, and handling agent actions.
- state_machine#
State machine for managing agent state.
- Type:
SherpaStateMachine
- actions#
List of available actions.
- Type:
List[BaseAction]
- belief_data#
Dictionary for storing arbitrary belief data.
- Type:
dict
- max_tokens#
Maximum number of tokens for context/history.
- Type:
int
Example
>>> belief = Belief() >>> belief.update(observation_event) >>> belief.set_current_task("Analyze the data") >>> context = belief.get_context(token_counter) >>> print(context) 'current_task: Analyze the data(task)'
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- state_machine: SherpaStateMachine#
- actions: List#
- belief_data: Dict#
- max_tokens: int#
- update(observation)[source]#
Update belief with a new observation event.
- Parameters:
observation (Event) – The event to add to the belief state.
Example
>>> belief = Belief() >>> event = Event("observation", "user_input", "Hello") >>> belief.update(event) >>> print(belief.events) [Event("observation", "user_input", "Hello")]
- get_context(token_counter)[source]#
Get the context of the agent’s belief state.
- Parameters:
token_counter (Callable[[str], int]) – Function to count tokens in text.
- Returns:
Context string containing relevant events, truncated if exceeding max_tokens.
- Return type:
str
Example
>>> belief = Belief() >>> def count_tokens(text): return len(text.split()) >>> belief.set_current_task("Analyze data") >>> context = belief.get_context(count_tokens) >>> print(context) 'current_task: Analyze data(task)'
- update_internal(event_type, name, **kwargs)[source]#
Add an internal event to the belief state.
- Parameters:
event_type (str) – Type of the internal event.
name (str) – Name of the event.
**kwargs – Additional event parameters.
Example
>>> belief = Belief() >>> belief.update_internal("reasoning", "analysis", content="Processing data") >>> print(belief.internal_events[0].event_type) 'reasoning'
- get_by_type(event_type)[source]#
Get all internal events of a specific type.
- Parameters:
event_type (str) – Type of events to retrieve.
- Returns:
List of internal events matching the type.
- Return type:
List[Event]
Example
>>> belief = Belief() >>> belief.update_internal("reasoning", "analysis") >>> events = belief.get_by_type("reasoning") >>> print(len(events)) 1
- get_events_by_type(event_type)[source]#
Retrieve events of a specific type as JSON objects.
- Parameters:
event_type (str) – The type of events to retrieve (e.g., “action_start”, “feedback”).
- Returns:
- A list of events as JSON objects, in chronological order (oldest to newest).
Each object contains the event’s properties (name, content, event_type, etc.).
- Return type:
List[dict]
Example
>>> belief = Belief() >>> belief.update_internal("action_start", "test_action", args={"param": "value"}) >>> events = belief.get_events_by_type("action_start") >>> print(events[0]["name"]) test_action
- get_events_excluding_types(exclude_types)[source]#
Retrieve events excluding specific types as JSON objects.
- Parameters:
exclude_types (List[str]) – List of event types to exclude from the results (e.g., [“feedback”, “action_start”]).
- Returns:
- A list of events as JSON objects, in chronological order (oldest to newest),
excluding events whose types are in the exclude_types list.
- Return type:
List[dict]
Example
>>> belief = Belief() >>> belief.update_internal("action_start", "action1", args={}) >>> belief.update_internal("feedback", "feedback1", content="good") >>> events = belief.get_events_excluding_types(["feedback"]) >>> print(events[0]["event_type"]) action_start
- set_current_task(content)[source]#
Set the current task in the belief state.
- Parameters:
content (str) – Content of the current task.
Example
>>> belief = Belief() >>> belief.set_current_task("Process data") >>> print(belief.current_task.content) 'Process data'
- get_internal_history(token_counter)[source]#
Get the internal history of the agent as a string, with token limiting.
This method uses get_events_excluding_types to retrieve all internal events as dicts, then converts them to strings in reverse order (most recent first) for LLM context, and applies token limiting.
- Parameters:
token_counter (Callable[[str], int]) – Function to count tokens in text.
- Returns:
- Internal history string, in reverse chronological order (most recent first),
truncated if exceeding max_tokens.
- Return type:
str
Example
>>> belief = Belief() >>> def count_tokens(text): return len(text.split()) >>> belief.update_internal("reasoning", "analysis") >>> history = belief.get_internal_history(count_tokens) >>> print(history) 'analysis(reasoning)'
- get_histories_excluding_types(exclude_types, token_counter=None, max_tokens=4000)[source]#
Get internal history excluding specific event types as a string, with token limiting.
This method uses get_events_excluding_types to retrieve internal events as dicts (excluding specified types), then converts them to strings in reverse order (most recent first) for LLM context, and applies token limiting.
- Parameters:
exclude_types (list[str]) – List of event types to exclude.
token_counter (Optional[Callable[[str], int]]) – Function to count tokens. If None, uses word count.
max_tokens (int) – Maximum number of tokens in result.
- Returns:
- Filtered history string, in reverse chronological order (most recent first),
truncated if exceeding max_tokens.
- Return type:
str
Example
>>> belief = Belief() >>> def count_tokens(text): return len(text.split()) >>> belief.update_internal("reasoning", "analysis") >>> belief.update_internal("feedback", "comment") >>> history = belief.get_histories_excluding_types(["feedback"], count_tokens) >>> print(history) 'analysis(reasoning)'
- clear_short_term_memory()[source]#
Clear short-term memory by removing all internal events and dictionary data.
Example
>>> belief = Belief() >>> belief.update_internal("reasoning", "analysis") >>> belief.set("key", "value") >>> belief.clear_short_term_memory() >>> print(len(belief.internal_events)) 0 >>> print(belief.belief_data) {}
- set_actions(actions)[source]#
Set available actions for the agent.
- Parameters:
actions (List[BaseAction]) – List of actions to make available.
Example
>>> belief = Belief() >>> actions = [Action1(), Action2()] >>> belief.set_actions(actions) >>> print(len(belief.actions)) 2
- property action_description#
Get string description of all available actions.
- Returns:
str: Newline-separated string of action descriptions.
- Example:
>>> belief = Belief() >>> belief.set_actions([Action1(), Action2()]) >>> print(belief.action_description) 'Action1: Description1
Action2: Description2’
- get_state()[source]#
Get current state name from state machine.
- Returns:
Name of current state, or None if no state machine exists.
- Return type:
str
Example
>>> belief = Belief() >>> belief.state_machine = StateMachine() >>> print(belief.get_state()) 'initial'
- get_state_obj()[source]#
Get current state object from state machine.
- Returns:
Current state object, or None if no state machine exists.
- Return type:
ts.State
Example
>>> belief = Belief() >>> belief.state_machine = StateMachine() >>> state = belief.get_state_obj() >>> print(state.name) 'initial'
- get_actions()[source]#
Get list of available actions.
- Returns:
List of available actions.
- Return type:
List[BaseAction]
Example
>>> belief = Belief() >>> belief.set_actions([Action1(), Action2()]) >>> actions = belief.get_actions() >>> print(len(actions)) 2
- get_action(action_name)[source]#
Get specific action by name.
- Parameters:
action_name (str) – Name of action to retrieve.
- Returns:
Action with matching name, or None if not found.
- Return type:
Example
>>> belief = Belief() >>> belief.set_actions([Action1(name="action1")]) >>> action = belief.get_action("action1") >>> print(action.name) 'action1'
- async async_get_actions()[source]#
Asynchronously get list of available actions.
- Returns:
List of available actions.
- Return type:
List[BaseAction]
Example
>>> belief = Belief() >>> belief.set_actions([Action1(), Action2()]) >>> actions = await belief.async_get_actions() >>> print(len(actions)) 2
- async async_get_action(action_name)[source]#
Asynchronously get specific action by name.
- Parameters:
action_name (str) – Name of action to retrieve.
- Returns:
Action with matching name, or None if not found.
- Return type:
Example
>>> belief = Belief() >>> belief.set_actions([Action1(name="action1")]) >>> action = await belief.async_get_action("action1") >>> print(action.name) 'action1'
- get_dict()[source]#
Get the belief dictionary.
- Returns:
Dictionary containing belief data.
- Return type:
dict
Example
>>> belief = Belief() >>> belief.set("key", "value") >>> print(belief.get_dict()) {'key': 'value'}
- get(key, default=None)[source]#
Get value from belief dictionary using dot notation.
- Parameters:
key (str) – Key to retrieve, can use dot notation for nested values.
default (Any) – Default value if key not found.
- Returns:
Value at key, or default if not found.
- Return type:
Any
Example
>>> belief = Belief() >>> belief.set("nested.key", "value") >>> print(belief.get("nested.key")) 'value' >>> print(belief.get("missing.key", "default")) 'default'
- get_all_keys()[source]#
Get all keys in belief dictionary, including nested keys.
- Returns:
List of all keys, using dot notation for nested keys.
- Return type:
List[str]
Example
>>> belief = Belief() >>> belief.set("nested.key", "value") >>> print(belief.get_all_keys()) ['nested.key']
- has(key)[source]#
Check if key exists in belief dictionary.
- Parameters:
key (str) – Key to check, can use dot notation for nested values.
- Returns:
True if key exists, False otherwise.
- Return type:
bool
Example
>>> belief = Belief() >>> belief.set("key", "value") >>> print(belief.has("key")) True >>> print(belief.has("missing.key")) False