fix(chat): 修复关键词非列表形式时导致的解析错误

在处理记忆关键词时,旧代码使用 `ast.literal_eval` 来解析存储为字符串的关键词列表。当关键词字段为空或格式不正确时,这会引发 `ValueError` 或 `SyntaxError`。

本次修改将解析方式更换为 `json.loads`,并增加了 `try-except` 块来处理可能的 `json.JSONDecodeError`。同时,在添加记忆时,使用 `json.dumps` 来确保关键词列表被正确地序列化为 JSON 字符串,从而保证了数据存储和读取的健壮性和一致性。
This commit is contained in:
tt-P607
2025-08-26 12:07:30 +08:00
committed by Windpicker-owo
parent fc3412a2fa
commit 6532c30d5d

View File

@@ -109,7 +109,7 @@ class InstantMemory:
memory_id=memory_item.memory_id,
chat_id=memory_item.chat_id,
memory_text=memory_item.memory_text,
keywords=memory_item.keywords,
keywords=json.dumps(memory_item.keywords, ensure_ascii=False),
create_time=memory_item.create_time,
last_view_time=memory_item.last_view_time,
)
@@ -171,11 +171,10 @@ class InstantMemory:
query = session.execute(select(Memory).where(Memory.chat_id == self.chat_id)).scalars()
for mem in query:
# 对每条记忆
mem_keywords = mem.keywords or ""
parsed = ast.literal_eval(mem_keywords)
if isinstance(parsed, list):
mem_keywords = [str(k).strip() for k in parsed if str(k).strip()]
else:
mem_keywords_str = mem.keywords or "[]"
try:
mem_keywords = json.loads(mem_keywords_str)
except json.JSONDecodeError:
mem_keywords = []
# logger.info(f"mem_keywords: {mem_keywords}")
# logger.info(f"keywords_list: {keywords_list}")