§07 会话和记忆:让 Agent 记住上下文
有次我让 Agent 改完代码,关了程序再打开。它把之前聊的全忘了,又从头读一遍文件。我才意识到 session_id 这块"记忆钥匙"有多重要。这章讲怎么留住上下文。
07.1 会话 ID 是记忆的钥匙
每次跑 Agent,SDK 都会给一个 session_id。
你把它存下来。下次带着它 resume,Agent 就记得上一轮读过什么、改过什么。我管这叫"记忆的钥匙"。
# 存下 session_id,下次接着聊
async for message in query(prompt="记住:我最爱的颜色是蓝"):
if hasattr(message, "session_id"):
saved_id = message.session_id
# 后面带着 id 继续
async for message in query(
prompt="我喜欢的颜色是什么?",
options=ClaudeAgentOptions(resume=saved_id), # 这行是关键:续上上下文
):
...
07.2 三种多轮写法
| 写法 | 适合 | 标叔的结论 |
|---|---|---|
V1 resume |
每轮新 query | 简单清晰 |
| V2 Session | TS 聊天应用 | 最灵活 |
| Python 客户端 | Python 多轮 | 自动管状态 |
Python 的 ClaudeSDKClient 最省心:在 async with 块里多轮对话,状态它自己管。
07.3 别忘了 settingSources
这是新手第一坑。我单独说。
options = ClaudeAgentOptions(
setting_sources=["project"], # 这行是关键:加载 .claude/ 下的配置
)
settingSources 默认是空数组。不设这个,Agent 看不到你项目里的 CLAUDE.md、Skills、子代理定义。
注意:
settingSources默认是[]。文档第 2 条坑原话:必须显式设
settingSources: ['project'],否则 CLAUDE.md、skills、文件型子代理都加载不出来。我见过太多人卡在这——配置写好了,Agent 却"看不见"。
07.4 上下文太长会自动压缩
会话里所有东西都累计进上下文窗口。文件越长、轮次越多,越占地方。
快满时,SDK 会自动"压缩":把老的历史总结成摘要腾空间。但早期的具体指令可能丢。持久的规则要写进 CLAUDE.md,因为它每次请求都重新注入。
记住了会话。想让 Agent 会更多本事怎么办?下一章讲自定义工具和 MCP。
把 Agent 接进真实系统。工具、子代理、上生产,一章一个硬骨头。