# 提示词缓存 (/docs/zh-CN/prompt-caching)

服务商会缓存提示词的开头。之后的请求只要以完全相同的 token 开头，这部分就按缓存输入计费，价格只是普通输入的零头。OhMyGPT 把你组织好的提示词原样交给服务商，所以命中率取决于你自己的代码：每次提示词的开头是否稳定，服务商能否认出哪些请求属于同一个对话。

用 `anthropic/claude-haiku-4-5` 对同一段 9,150 token 的对话实测：

| 请求 | 缓存 | 费用 |
|---|---|---|
| 第一轮 | 写入 9,147 token | 3,168 Credits |
| 开头相同的下一次请求 | 读取 9,147 token | 275 Credits |
| 同样的提示词，不走缓存 | 无 | 2,535 Credits |

## 查看命中率 [#查看命中率]

- 单个请求：[请求明细](/docs/zh-CN/costs#查询单个请求)里的 `usage.cache_read_tokens` 与 `usage.cache_creation_tokens`。
- 一段时间：[用量](https://www.ohmygpt.com/usage)页的「缓存读取」列，或 [`GET /v1/usage/summary`](/docs/zh-CN/api/usage/getUsageSummary)（需要管理员 Key）返回的 `tokens.cache_read`，可按模型或 API Key 分组。

一次性请求命中率低是正常的。对话和 agent 循环每一轮都会重发之前的内容，大部分输入应当来自缓存。

## 让提示词的开头保持不变 [#让提示词的开头保持不变]

缓存从第一个 token 匹配到第一处不同为止，之后的内容都按新输入计费。

- 不变的内容放前面：系统提示词、工具定义、长篇参考资料；用户的新消息放最后。
- 系统提示词逐字节保持不变。里面带时间戳、请求 ID、用户名或随机排序的示例，每次都会打断命中；这些内容放进最新一条消息。
- 对话只往后追加。修改、裁剪或总结之前的消息，会让那条消息之后的缓存全部失效，所以少做，要做就一次多处理一些。
- 每一轮发送相同的工具、相同的顺序，JSON 序列化时键的顺序固定。
- 同一个对话里不换模型，每个模型的缓存各自独立。
- 太短的提示词不会被缓存，最短长度因模型而异。

## 标出哪些请求属于同一个对话 [#标出哪些请求属于同一个对话]

每一轮都发送同一个会话级的值，服务商才能把重复的提示词送到同一份缓存：

| 端点 | 字段 |
|---|---|
| Chat Completions、Responses | `prompt_cache_key` 或 `provider.conversation_id`（不超过 256 字节） |
| Anthropic Messages | `metadata.user_id` |

```bash
curl https://api.ohmygpt.com/v1/responses \
  -H "Authorization: Bearer $OHMYGPT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "openai/gpt-5.4-nano", "prompt_cache_key": "conv-8f2c", "instructions": "<the same long instructions every turn>", "input": "Hi"}'
```

用 8,351 token 的提示词连发两次，第二次响应的 `usage.input_tokens_details` 里是 `"cached_tokens": 7936`。

Claude 只缓存请求里标记过的内容。通过 Chat Completions 或 Responses 调用 Claude 时，多轮请求（带会话标识，或历史里已有助手回合）由 OhMyGPT 代为标记；单轮请求不标记，因为写入缓存比普通输入贵，上表里不走缓存的就是去掉助手回合的同一个请求。通过 Anthropic Messages 调用时，请求原样到达 Claude，需要自己加 [`cache_control`](https://platform.claude.com/docs/en/build-with-claude/prompt-caching)。Claude Code 会加，并在每个请求里带上会话 ID，开箱即用。
