§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 接进真实系统。工具、子代理、上生产,一章一个硬骨头。