# Google ADK 模型回调缓存：命中完整问题时跳过模型，问题变化必须重新生成

已运行作者完整请求键与漏历史碰撞反例；未执行ADK Runner、回调短路或真实模型请求。

## 运行

在本目录使用独立虚拟环境并安装requirements.txt；脚本结果写入results。

```sh
python reference/audit.py
python reference/run_sdk.py
```

fixtures是原创输入与故意失败样本；作者真值、离线合成provider和实际SDK记录各自标明，不是模型正确率。需要真实模型/账号/GPU的步骤按正文另行授权运行。

## 1. 保留完整请求上下文

input.json四条请求只改变日期或north/south历史范围。C1/C2应同键，C3/C4必须重新生成。缓存答案只能来自已授权范围。

## 2. 运行漏历史反例

audit.py用question+history生成完整键，再故意只用question；后者会把C1与C4错误合并。输出是作者缓存策略验证，不是ADK模型调用日志。

## 3. 核对回调返回协议

before_model_callback接收本轮LlmRequest，命中时返回LlmResponse；未命中返回None让框架正常调用模型。不要把回调错误也当作命中。

## 4. 选择可稳定序列化的键

把模型、系统指令、历史消息和会影响答案的工具结果纳入真实键；本包只演示question/history两个维度，其余维度需按应用补齐。

## 5. 在ADK中挂载回调

在独立Agent上设置before_model_callback，先用离线固定回答测试命中跳过请求，再配置真实provider。包内没有启动Runner。

## 6. 记录真正的跳过与生成

实跑日志同时记缓存hit/miss和实际provider请求数。第二次更快不证明回调跳过，前缀Token缓存也不等于整次响应缓存。

## 7. 更改历史后重复验收

按C1到C4顺序运行，只有C2允许命中；模型或权限变化时清除旧响应。交付键字段、命中记录和失败反例，不得复用跨范围答案。

## 官方依据

- Google ADK 官方文档或源码：https://google.github.io/adk-docs/callbacks/types-of-callbacks/
