Coverage for tools / memory_tools.py: 29%
48 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-29 02:55 +0800
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-29 02:55 +0800
1from pydantic import BaseModel, Field
2from qrclaw.tools.registry import register
3from qrclaw.memory import LongTermMemory
4from qrclaw.logger import get_logger
6logger = get_logger("qrclaw.tools.memory")
8class WriteMemoryArgs(BaseModel):
9 content: str = Field(description="要记录的重要信息,使用 Markdown 格式")
10 title: str = Field(description="可选的标题,用于分类和组织记忆", default="")
12class ReadMemoryArgs(BaseModel):
13 pass # 不需要参数,读取全部记忆
15@register(description="写入中期记忆,仅用于记录用户偏好、项目配置等需要跨会话复用的信息,任务结果、调研报告等不要写入", args_model=WriteMemoryArgs)
16def write_memory(content: str, title: str = "") -> str:
17 """
18 写入中期记忆
20 Args:
21 content: 要记录的内容(Markdown 格式)
22 title: 可选的标题
24 Returns:
25 str: 操作结果
26 """
27 logger.debug(f"写入中期记忆: {title or '无标题'}")
28 try:
29 from qrclaw.agent import get_workspace
30 from qrclaw.workspace import Workspace
31 ws = get_workspace() or Workspace("default")
32 memory = LongTermMemory(ws.memory_file)
33 success = memory.append(content, title if title else None)
35 if success:
36 result = f"已写入中期记忆: {title if title else '无标题'}"
37 logger.info(result)
38 return result
39 else:
40 error_msg = "写入中期记忆失败"
41 logger.error(error_msg)
42 return error_msg
43 except Exception as e:
44 error_msg = f"错误:写入中期记忆失败 {e}"
45 logger.error(error_msg, exc_info=True)
46 return error_msg
48@register(description="读取中期记忆,查看之前记录的重要信息", args_model=ReadMemoryArgs)
49def read_memory() -> str:
50 """
51 读取中期记忆
53 Returns:
54 str: 记忆内容(Markdown 格式)
55 """
56 logger.debug("读取中期记忆")
57 try:
58 from qrclaw.agent import get_workspace
59 from qrclaw.workspace import Workspace
60 ws = get_workspace() or Workspace("default")
61 memory = LongTermMemory(ws.memory_file)
62 content = memory.load()
64 if not content or content.strip() == "# QRClaw 中期记忆":
65 logger.info("中期记忆为空")
66 return "中期记忆为空,还没有记录任何信息"
68 logger.info(f"读取中期记忆成功: {len(content)} 字符")
69 return content
70 except Exception as e:
71 error_msg = f"错误:读取中期记忆失败 {e}"
72 logger.error(error_msg, exc_info=True)
73 return error_msg