在 Linux 上用 google-genai 1.8 给一份 30 页产品手册建 cachedContents,模型写 gemini-2.5-flash,请求回 400 INVALID_ARGUMENT,原文是 Cached content is too small. total_token_count=612, min_total_token_count=1024。手册转成纯 txt 再传结果一样,改回不建缓存直接调用就能通。

一开始怀疑是「只把 system 指令放进了缓存,正文没进 contents」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。显式缓存对内容有最小 token 门槛,短文档会被直接拒。另一种情况是按字符估的 token 和接口算的差一倍,实际没到门槛。

少数情况下是模型档位不同门槛不同,flash 与 pro 的阈值并不一样。

数清内容真实 token,再判断差多少

python -c "from google import genai;c=genai.Client();print(c.models.count_tokens(model='gemini-2.5-flash',contents=open('manual.txt').read()))"

随后把多次请求共用的长前置内容合成一个缓存对象

python build_cache.py --file manual.txt --ttl 3600 --model gemini-2.5-flash

缓存建好后只引用 name,不要再把原文贴进请求

python -c "print(open('cache_name.txt').read().strip())"

内容确实太短就改用隐式缓存,省掉建缓存这一步

python call_gemini.py --no-explicit-cache --model gemini-2.5-flash

恢复的判定其实很直接。cachedContents.create 返回带 name 的对象,后续 generateContent 的用量里 cached_content_token_count 大于零。

缓存按时长计费而不是按命中次数,TTL 给太长在低频任务上反而更贵。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189