Skip to content

Commit f8ebb57

Browse files
committed
feat: enhance memory management with extra identifier support
- Updated MemoryManager to accept an optional extra_identifier parameter in store and query methods, allowing for more granular memory isolation. - Modified ChatMemoryQuery and ChatMemoryStore blocks to utilize the new extra_identifier feature, improving memory management capabilities across different workflows.
1 parent 5200cc8 commit f8ebb57

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

kirara_ai/memory/memory_manager.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,11 @@ def register_decomposer(self, name: str, decomposer_class: Type[MemoryDecomposer
7373
"""注册新的解析器"""
7474
self.decomposer_registry.register(name, decomposer_class)
7575

76-
def store(self, scope: MemoryScope, entry: MemoryEntry) -> None:
76+
def store(self, scope: MemoryScope, entry: MemoryEntry, extra_identifier: Optional[str] = None) -> None:
7777
"""存储新的记忆"""
7878
scope_key = scope.get_scope_key(entry.sender)
79+
if extra_identifier is not None:
80+
scope_key = f"{extra_identifier}-{scope_key}"
7981

8082
if scope_key not in self.memories:
8183
self.memories[scope_key] = self.persistence.load(scope_key)
@@ -95,10 +97,12 @@ def store(self, scope: MemoryScope, entry: MemoryEntry) -> None:
9597

9698
self.persistence.save(scope_key, self.memories[scope_key])
9799

98-
def query(self, scope: MemoryScope, sender: ChatSender) -> List[MemoryEntry]:
100+
def query(self, scope: MemoryScope, sender: ChatSender, extra_identifier: Optional[str] = None) -> List[MemoryEntry]:
99101
"""查询历史记忆"""
100102
relevant_memories = []
101103
scope_key = scope.get_scope_key(sender)
104+
if extra_identifier is not None:
105+
scope_key = f"{extra_identifier}-{scope_key}"
102106

103107
if scope_key not in self.memories:
104108
self.memories[scope_key] = self.persistence.load(scope_key)

kirara_ai/workflow/implementations/blocks/memory/chat_memory.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313

1414
def scope_type_options_provider(container: DependencyContainer, block: Block) -> List[str]:
15-
return ["global", "member", "group"]
15+
return ["global", "group", "member"]
1616

1717

1818
def decomposer_name_options_provider(container: DependencyContainer, block: Block) -> List[str]:
@@ -36,7 +36,7 @@ def __init__(
3636
Optional[str],
3737
ParamMeta(
3838
label="级别",
39-
description="要查询记忆的级别",
39+
description="要查询记忆的级别,代表记忆可以被共享的粒度。(例如:member 级别下,同一群聊下不同用户的记忆互相隔离; group 级别下,同一群组内所有成员记忆共享,但不同群组之间记忆互相隔离)",
4040
options_provider=scope_type_options_provider,
4141
),
4242
],
@@ -48,9 +48,17 @@ def __init__(
4848
options_provider=decomposer_name_options_provider,
4949
),
5050
] = "default",
51+
extra_identifier: Annotated[
52+
Optional[str],
53+
ParamMeta(
54+
label="额外隔离标识符",
55+
description="仅支持输入英文,可为空。对于同一用户,不同标识符之间的记忆互相隔离。可用于避免不同工作流之间记忆互相干扰。",
56+
),
57+
] = None,
5158
):
5259
self.scope_type = scope_type
5360
self.decomposer_name: str = decomposer_name or "default"
61+
self.extra_identifier = extra_identifier
5462

5563
def execute(self, chat_sender: ChatSender) -> Dict[str, Any]:
5664
self.memory_manager = self.container.resolve(MemoryManager)
@@ -68,7 +76,7 @@ def execute(self, chat_sender: ChatSender) -> Dict[str, Any]:
6876
self.decomposer = decomposer_registry.get_decomposer(
6977
self.decomposer_name)
7078

71-
entries = self.memory_manager.query(self.scope, chat_sender)
79+
entries = self.memory_manager.query(self.scope, chat_sender, self.extra_identifier)
7280
memory_content = self.decomposer.decompose(entries)
7381
return {"memory_content": memory_content}
7482

@@ -94,13 +102,21 @@ def __init__(
94102
Optional[str],
95103
ParamMeta(
96104
label="级别",
97-
description="要查询记忆的级别",
105+
description="要查询记忆的级别,代表记忆可以被共享的粒度。(例如:member 级别下,同一群聊下不同用户的记忆互相隔离; group 级别下,同一群组内所有成员记忆共享,但不同群组之间记忆互相隔离)",
98106
options_provider=scope_type_options_provider,
99107
),
100108
],
109+
extra_identifier: Annotated[
110+
Optional[str],
111+
ParamMeta(
112+
label="额外隔离标识符",
113+
description="仅支持输入英文,可为空。对于同一用户,不同标识符之间的记忆互相隔离。可用于避免不同工作流之间记忆互相干扰。",
114+
),
115+
] = None,
101116
):
102117
self.scope_type = scope_type
103118
self.logger = get_logger("Block.ChatMemoryStore")
119+
self.extra_identifier = extra_identifier
104120

105121
def execute(
106122
self,
@@ -140,6 +156,6 @@ def execute(
140156
self.logger.debug(f"Composed messages: {composed_messages}")
141157
memory_entries = self.composer.compose(
142158
user_msg.sender if user_msg else None, composed_messages)
143-
self.memory_manager.store(self.scope, memory_entries)
159+
self.memory_manager.store(self.scope, memory_entries, self.extra_identifier)
144160

145161
return {}

0 commit comments

Comments
 (0)