Skip to content

Commit 283dce7

Browse files
authored
Fix/memory v2 (#1450)
1 parent 6e8b642 commit 283dce7

2 files changed

Lines changed: 9 additions & 70 deletions

File tree

examples/openclaw-plugin/text-utils.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,10 @@ export function sanitizeUserTextForCapture(text: string): string {
5858
// 格式: "System: [时间] Compacted ... Context ... [时间] 实际内容"
5959
if (COMPACTED_SYSTEM_MSG_RE.test(text)) {
6060
// 提取最后一个 ] 之后的内容(即实际用户输入)
61-
const match = text.match(/\]\s*(.+)$/);
62-
if (match && match[1]) {
63-
return match[1].replace(/\s+/g, " ").trim();
61+
const lastBracketIndex = text.lastIndexOf("]");
62+
if (lastBracketIndex !== -1) {
63+
const content = text.slice(lastBracketIndex + 1);
64+
return content.replace(/\s+/g, " ").trim();
6465
}
6566
return "";
6667
}

openviking/session/session.py

Lines changed: 5 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -182,24 +182,6 @@ def __init__(
182182

183183
logger.info(f"Session created: {self.session_id} for user {self.user}")
184184

185-
async def _get_latest_archive_last_msg_time(self) -> Optional[float]:
186-
"""获取上一次归档的最后一条消息的时间戳(毫秒),用于过滤需要提取记忆的消息。"""
187-
# 使用 compression_index - 1 获取上一次归档的索引
188-
if self._compression.compression_index <= 1:
189-
return None
190-
# 获取上一次归档的目录
191-
archive_uri = (
192-
f"{self._session_uri}/history/archive_{self._compression.compression_index - 1:03d}"
193-
)
194-
messages = await self._read_archive_messages(archive_uri)
195-
if messages and messages[-1].created_at:
196-
# 解析 ISO 时间戳为毫秒
197-
from dateutil import parser
198-
199-
dt = parser.parse(messages[-1].created_at)
200-
return dt.timestamp() * 1000
201-
return None
202-
203185
async def load(self):
204186
"""Load session data from storage."""
205187
if self._loaded:
@@ -468,11 +450,6 @@ async def commit_async(self) -> Dict[str, Any]:
468450
await self._save_meta()
469451

470452
self._compression.original_count += len(messages_to_archive)
471-
# 从最新归档中获取上一次归档的时间戳(用于过滤需要提取记忆的消息)
472-
previous_archive_time = await self._get_latest_archive_last_msg_time()
473-
logger.info(
474-
f"commit_async: previous_archive_time from archive={previous_archive_time}, compression_index={self._compression.compression_index}"
475-
)
476453
logger.info(
477454
f"Archived: {len(messages_to_archive)} messages → "
478455
f"history/archive_{self._compression.compression_index:03d}/"
@@ -490,38 +467,14 @@ async def commit_async(self) -> Dict[str, Any]:
490467
owner_user_id=self.ctx.user.user_id,
491468
)
492469

493-
# 只传递上一次归档之后的新消息给 memory extraction
494-
# 使用 previous_archive_time 过滤(在设置新时间之前)
495-
messages_for_extraction = messages_to_archive
496-
logger.info(
497-
f"Memory extraction filter: previous_archive_time={previous_archive_time}, "
498-
f"messages_count={len(messages_to_archive)}"
499-
)
500-
if previous_archive_time:
501-
archive_time_str = datetime.fromtimestamp(
502-
previous_archive_time / 1000, timezone.utc
503-
).isoformat()
504-
# 打印前几条消息的 created_at 用于调试
505-
if messages_to_archive:
506-
logger.info(
507-
f"Debug: first msg created_at={messages_to_archive[0].created_at}, "
508-
f"archive_time_str={archive_time_str}"
509-
)
510-
messages_for_extraction = [
511-
m for m in messages_to_archive if m.created_at and m.created_at > archive_time_str
512-
]
513-
logger.info(
514-
f"Memory extraction: {len(messages_to_archive)} total -> {len(messages_for_extraction)} new (after {previous_archive_time})"
515-
)
516-
517470
asyncio.create_task(
518471
self._run_memory_extraction(
519472
task_id=task.task_id,
520473
archive_uri=archive_uri,
521-
messages=messages_for_extraction,
474+
messages=messages_to_archive,
522475
usage_records=usage_snapshot,
523-
first_message_id=messages_for_extraction[0].id if messages_for_extraction else "",
524-
last_message_id=messages_for_extraction[-1].id if messages_for_extraction else "",
476+
first_message_id=messages_to_archive[0].id if messages_to_archive else "",
477+
last_message_id=messages_to_archive[-1].id if messages_to_archive else "",
525478
)
526479
)
527480

@@ -790,21 +743,6 @@ async def get_session_context(self, token_budget: int = 128_000) -> Dict[str, An
790743
context = await self._collect_session_context_components()
791744
merged_messages = context["messages"]
792745

793-
# 过滤:只返回上一次归档之后的最新消息(从最新归档获取时间戳)
794-
previous_time = await self._get_latest_archive_last_msg_time()
795-
if previous_time:
796-
original_count = len(merged_messages)
797-
archive_time_str = datetime.fromtimestamp(
798-
previous_time / 1000, timezone.utc
799-
).isoformat()
800-
merged_messages = [
801-
m for m in merged_messages if m.created_at and m.created_at > archive_time_str
802-
]
803-
logger.info(
804-
f"[get_session_context] filtered messages: {original_count} -> {len(merged_messages)}, "
805-
f"after archive time={previous_time}"
806-
)
807-
808746
message_tokens = sum(m.estimated_tokens for m in merged_messages)
809747

810748
# 精简日志:只打印关键信息
@@ -823,7 +761,7 @@ async def get_session_context(self, token_budget: int = 128_000) -> Dict[str, An
823761
if include_latest_overview:
824762
remaining_budget -= latest_archive_tokens
825763

826-
# 不再返回 pre_archive_abstracts(只保留 latest_archive_overview)
764+
# pre_archive_abstracts: 保留字段返回空数组,保持 API 向下兼容
827765
included_pre_archive_abstracts: List[Dict[str, str]] = []
828766
pre_archive_tokens = 0
829767

@@ -837,7 +775,7 @@ async def get_session_context(self, token_budget: int = 128_000) -> Dict[str, An
837775
"latest_archive_overview": (
838776
latest_archive["overview"] if include_latest_overview else ""
839777
),
840-
# 不再返回 pre_archive_abstracts
778+
"pre_archive_abstracts": [], # 保持 API 向后兼容,返回空数组
841779
"messages": [m.to_dict() for m in merged_messages],
842780
"estimatedTokens": message_tokens + archive_tokens,
843781
"stats": {

0 commit comments

Comments
 (0)