fix(chat): 修复关键词非列表形式时导致的解析错误
在处理记忆关键词时,旧代码使用 `ast.literal_eval` 来解析存储为字符串的关键词列表。当关键词字段为空或格式不正确时,这会引发 `ValueError` 或 `SyntaxError`。 本次修改将解析方式更换为 `json.loads`,并增加了 `try-except` 块来处理可能的 `json.JSONDecodeError`。同时,在添加记忆时,使用 `json.dumps` 来确保关键词列表被正确地序列化为 JSON 字符串,从而保证了数据存储和读取的健壮性和一致性。
This commit is contained in:
@@ -109,7 +109,7 @@ class InstantMemory:
|
|||||||
memory_id=memory_item.memory_id,
|
memory_id=memory_item.memory_id,
|
||||||
chat_id=memory_item.chat_id,
|
chat_id=memory_item.chat_id,
|
||||||
memory_text=memory_item.memory_text,
|
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,
|
create_time=memory_item.create_time,
|
||||||
last_view_time=memory_item.last_view_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()
|
query = session.execute(select(Memory).where(Memory.chat_id == self.chat_id)).scalars()
|
||||||
for mem in query:
|
for mem in query:
|
||||||
# 对每条记忆
|
# 对每条记忆
|
||||||
mem_keywords = mem.keywords or ""
|
mem_keywords_str = mem.keywords or "[]"
|
||||||
parsed = ast.literal_eval(mem_keywords)
|
try:
|
||||||
if isinstance(parsed, list):
|
mem_keywords = json.loads(mem_keywords_str)
|
||||||
mem_keywords = [str(k).strip() for k in parsed if str(k).strip()]
|
except json.JSONDecodeError:
|
||||||
else:
|
|
||||||
mem_keywords = []
|
mem_keywords = []
|
||||||
# logger.info(f"mem_keywords: {mem_keywords}")
|
# logger.info(f"mem_keywords: {mem_keywords}")
|
||||||
# logger.info(f"keywords_list: {keywords_list}")
|
# logger.info(f"keywords_list: {keywords_list}")
|
||||||
|
|||||||
Reference in New Issue
Block a user