This commit is contained in:
Timothy Jaeryang Baek committed 2026-08-10 19:25:26 -06:00
1 parent f8ac75d188
commit ff74bfa6a1
1 file changed
+21 -12
+21 -12
View File
@@ -122,7 +122,7 @@ def search_memory_rows(
def sort_key(memory): def sort_key(memory):
rank = _path_rank(memory.path, lookup_path) if lookup_path else None rank = _path_rank(memory.path, lookup_path) if lookup_path else None
return rank if rank is not None else (9, 0), -(memory.updated_at or 0) return rank if rank is not None else (9, 0), -(memory.updated_at or 0), memory.id or ''
return sorted(rows, key=sort_key)[: max(1, min(limit or 20, 100))] return sorted(rows, key=sort_key)[: max(1, min(limit or 20, 100))]
@@ -213,10 +213,10 @@ def read_memory_path_rows(
def sort_key(memory): def sort_key(memory):
if memory.path == lookup_path: if memory.path == lookup_path:
return (0, 0, -(memory.updated_at or 0)) return (0, 0, -(memory.updated_at or 0), memory.id or '')
if memory.path and memory.path.startswith(f'{lookup_path}/'): if memory.path and memory.path.startswith(f'{lookup_path}/'):
return (1, len(_path_parts(memory.path)), -(memory.updated_at or 0)) return (1, len(_path_parts(memory.path)), -(memory.updated_at or 0), memory.id or '')
return (2, -len(_path_parts(memory.path)), -(memory.updated_at or 0)) return (2, -len(_path_parts(memory.path)), -(memory.updated_at or 0), memory.id or '')
return { return {
'path': lookup_path, 'path': lookup_path,
@@ -232,7 +232,7 @@ def memory_path_hints(query: str, memories: list, limit: int = 6) -> list[str]:
return [] return []
hints: list[str] = [] hints: list[str] = []
for memory in memories or []: for memory in sorted(memories or [], key=lambda item: (item.path or '', item.content or '', item.id or '')):
path = memory.path path = memory.path
if not path or path in hints: if not path or path in hints:
continue continue
@@ -286,6 +286,13 @@ def model_allows_memory(model: dict | None) -> bool:
return ((model or {}).get('info', {}).get('meta', {}).get('capabilities') or {}).get('memory', True) return ((model or {}).get('info', {}).get('meta', {}).get('capabilities') or {}).get('memory', True)
def _format_memory_context_section(title: str, memories: list[str]) -> str | None:
if not memories:
return None
ordered = sorted(memories, key=lambda memory: (memory.casefold(), memory))
return f'[{title}]\n' + '\n'.join(f'- {memory}' for memory in ordered)
async def add_memory_context(request, form_data: dict, user, model: dict | None = None): async def add_memory_context(request, form_data: dict, user, model: dict | None = None):
if not model_allows_memory(model): if not model_allows_memory(model):
return form_data return form_data
@@ -319,7 +326,7 @@ async def add_memory_context(request, form_data: dict, user, model: dict | None
seen_ids = set() seen_ids = set()
for memory in sorted( for memory in sorted(
[memory for memory in (all_memories or []) if memory.type == 'user'], [memory for memory in (all_memories or []) if memory.type == 'user'],
key=lambda item: (item.path or '', item.updated_at), key=lambda item: (item.path or '', item.updated_at or 0, item.id or ''),
): ):
seen_ids.add(memory.id) seen_ids.add(memory.id)
sections['user'].append(memory_label(memory)) sections['user'].append(memory_label(memory))
@@ -360,12 +367,14 @@ async def add_memory_context(request, form_data: dict, user, model: dict | None
sections[Memories.normalize_memory_type(metadata.get('type'))].append(label) sections[Memories.normalize_memory_type(metadata.get('type'))].append(label)
parts = [] parts = []
if sections['user']: for title, key in (
parts.append('[User Memory]\n' + '\n'.join(f'- {memory}' for memory in sections['user'])) ('User Memory', 'user'),
if sections['neighborhood']: ('Memory Neighborhood', 'neighborhood'),
parts.append('[Memory Neighborhood]\n' + '\n'.join(f'- {memory}' for memory in sections['neighborhood'])) ('Relevant Context', 'context'),
if sections['context']: ):
parts.append('[Relevant Context]\n' + '\n'.join(f'- {memory}' for memory in sections['context'])) part = _format_memory_context_section(title, sections[key])
if part:
parts.append(part)
if not parts: if not parts:
return form_data return form_data