重复的召回,只需十分之一的价格。
按请求选择开启后,WOS 会以查询文本为键缓存检索结果,规则与 LLM 提示词缓存相同的前缀方式。缓存有效期间,重复或续写的查询会复用上一次的结果,缓存部分按正常 token 单价的 10% 计费。
仅限 Tablet 和 Scroll。 缓存适用于现在和将来的所有 Tablet、Scroll 模型。Book 不支持:Book 在记忆之上进行推理,并在调用之间学习,同一个问题可能合理地得到不同的答案,缓存的结果在设计上就是错误的。向 Book 发送 cache_control 会明确返回 403。
一段对话,三个回合
当代理持续与记忆对话时,实际发生的事情如下。每个回合都把到目前为止的对话作为查询发送,并开启 cache_control。
write回合 1 - “Alice: 我去年春天搬到了里斯本。”
整个查询被检索并缓存:输入按 2 倍计费(TTL 5 分钟)。
extend回合 2 - 相同文本 + “Bob: 那边天气怎么样?”
只有 Bob 的句子会被索引和检索。旧的部分按 0.1 倍,新句子按 2 倍,缓存现在以它结尾。
hit回合 3 - 再次发送完全相同的查询(重试、刷新)
完全不调用引擎。全部按 0.1 倍:这就是 90% 的折扣。
费率
| 操作 | Token 计费 | 含义 |
|---|---|---|
| 缓存写入 - TTL 5 分钟 | 2× | 第一次请求。结果保留 5 分钟,每次读取都会顺延有效期。 |
| 缓存写入 - TTL 1 小时 | 3× | 第一次请求,保留整整一小时。 |
| 缓存读取 - 命中或前缀命中 | 0.1× | 写入之后的每次请求:缓存部分按正常 token 单价的十分之一计费。 |
能省多少
一个具体的例子:你的代理把一段 3,000 token 的对话作为查询发送,并在五分钟内重复或续写 10 次。没有缓存时,是按全价计费的 30,000 输入 token。开启 5 分钟缓存后,第一次写入 6,000(2 倍)加上九次缓存读取约 2,700,共计 8,700 计费 token,节省 71%。对话越长,省得越多。
前缀规则
匹配以查询的开头为准。如果开头保持不变、只是在末尾追加了新文本,缓存部分会被复用,只检索新的部分。如果缓存文本结束之前的任何内容发生变化,则什么都无法复用。
prefix match
cached [ A B C D E F G ] ○ [ A B C D E F G ] E ✗ [ B C D E F G ] E
○ 命中 - 开头不变,只有 E 是新的部分
✗ 未命中 - 开头变了,整个查询将重新检索并重新缓存
要记住的三条规则
- 续写会连同新尾部一起重新缓存。 在 [A B C D E F G] + E 之后,缓存以 E 结尾:尾部按写入费率计费一次,下一轮可以把 A 到 E 的全部内容再次作为前缀匹配。
- 每个请求只有一个连续前缀。 一个查询不能拆成两段缓存,只有开头才能匹配。
- 写入会立即失效缓存。 任何 store、store-turn、bulk-store、forget、supersede 或删除存储的操作都会丢弃该存储的缓存,缓存的答案绝不会返回过时的记忆。
如何开启
hits = mem.search(
"...the conversation so far...", user_id="alice",
cache_control={"ttl": "5m"}, # or "1h"
)响应 - cache 对象说明发生了什么
{ "memories": [ ... ],
"cache": { "status": "hit", // "write" | "hit" | "extend"
"ttl": "5m",
"cache_read_input_tokens": 412,
"cache_creation_input_tokens": 0 } }这些功能并不依赖 SDK。缓存只是一次 HTTP 调用上的一个字段,因此任何编程语言都能使用。curl 标签页就是通用配方,Python、TypeScript 和 Rust SDK 只是对同一个调用的便捷封装。
缓存在工作区内按存储、按模型隔离,默认关闭:不发送 cache_control,请求不会有任何变化。