Cache explícito do Gemini (cachedContents)
O Gemini oferece dois tipos de cache:
- Cache implícito (automático) — o modelo detecta e reutiliza automaticamente prefixos de prompt repetidos, sem nenhuma configuração. Esse é o comportamento padrão descrito em Cache de prompt; os acertos são best-effort, e qualquer pequena alteração no prefixo pode causar um miss.
- Cache explícito (esta página) — você ativamente cria um grande bloco de contexto como um objeto de cache, recebe um handle
cachedContents/{id}e o referencia nas requisiçõesgenerateContentseguintes. Os acertos são determinísticos: enquanto o cache não expirar, uma referência sempre acerta.
Use o cache explícito quando você tem um contexto grande e estável reutilizado repetidamente (documentos longos, bases de código, bases de conhecimento, instruções de system fixas) e quer taxas de acerto controláveis e faturamento previsível.
O OfoxAI suporta criação / referência / consulta / exclusão do cachedContents nativo do Gemini, compatível com o Google GenAI SDK. Para a referência no nível de endpoint, veja a API cachedContents.
Quando usar o cache explícito
| Cenário | Recomendação |
|---|---|
| Perguntas e respostas repetidas sobre um grande contexto fixo (QA de documentos, assistente de código) | ✅ Cache explícito |
| Você precisa de acertos garantidos e não pode tolerar misses ocasionais | ✅ Cache explícito |
| Requisições curtas, pouco frequentes e com prefixos variáveis | ❌ O cache implícito já basta; sem objeto de cache para gerenciar |
| O contexto muda a cada vez | ❌ O cache não tem valor |
O cache explícito exige que o conteúdo em cache atinja um limite mínimo de tokens (aproximadamente 2.048 a 4.096 tokens, dependendo do modelo). Conteúdo pequeno demais falhará ao ser criado ou não trará benefício.
Endpoints
O OfoxAI fornece os endpoints completos de cachedContents sob o protocolo nativo do Gemini:
POST https://api.ofox.ai/gemini/v1beta/cachedContents # Criar
GET https://api.ofox.ai/gemini/v1beta/cachedContents/{id} # Consultar
DELETE https://api.ofox.ai/gemini/v1beta/cachedContents/{id} # ExcluirPara referenciar um cache na geração de conteúdo, use o endpoint padrão generateContent e adicione cachedContent ao corpo da requisição:
POST https://api.ofox.ai/gemini/v1beta/models/{model}:generateContentAutenticação
Como nos demais endpoints do Gemini, use o header x-goog-api-key:
x-goog-api-key: <Sua OFOXAI_API_KEY>Fluxo completo
O exemplo a seguir demonstra um fluxo completo: criar cache → referenciar o cache para gerar → excluir o cache.
1. Criar um cache
Coloque o grande contexto que você quer reutilizar em contents e especifique model e ttl (tempo de vida):
Python
from google import genai
from google.genai import types
client = genai.Client(
api_key="<Sua OFOXAI_API_KEY>",
http_options={"api_version": "v1beta", "base_url": "https://api.ofox.ai/gemini"},
)
# Um documento grande reutilizado repetidamente (deve atingir o limite mínimo de tokens)
LONG_DOCUMENT = open("knowledge_base.txt").read()
cache = client.caches.create(
model="google/gemini-3.1-pro-preview",
config=types.CreateCachedContentConfig(
contents=[LONG_DOCUMENT],
ttl="600s", # o cache vive por 10 minutos
),
)
print(cache.name) # cachedContents/xxxxxxxx — o handle para referências futurasO name retornado (no formato cachedContents/xxxxxxxx) é o handle do cache. Salve-o para referências e gerenciamento futuros.
2. Referenciar o cache para gerar
Referencie o handle do cache via cachedContent em uma requisição generateContent; contents só precisa conter a nova pergunta desta vez:
Python
response = client.models.generate_content(
model="google/gemini-3.1-pro-preview",
contents="Com base no documento acima, resuma três pontos principais",
config=types.GenerateContentConfig(
cached_content=cache.name, # referencia o cache
),
)
print(response.text)
# Cache hit: a parte em cache é cobrada pela tarifa de "leitura" mais baixa
print(response.usage_metadata.cached_content_token_count)No acerto, o usageMetadata.cachedContentTokenCount da resposta mostra quantos tokens vieram do cache. O mesmo cache pode ser referenciado qualquer número de vezes, cada uma com acerto determinístico, até expirar.
3. Consultar e excluir
Consulte os metadados do cache ou exclua-o proativamente quando não for mais necessário (sem precisar esperar o TTL expirar):
Python
# Consultar
info = client.caches.get(name=cache.name)
print(info.expire_time)
# Excluir
client.caches.delete(name=cache.name)Consultar / excluir não exige passar model novamente. O OfoxAI localiza o cache apenas pelo handle.
Ciclo de vida e TTL
Especifique o tempo de vida via ttl na criação, como uma string de segundos terminada em s (por exemplo, "600s").
| Parâmetro | Valor |
|---|---|
| TTL mínimo / padrão | 600s (10 minutos) |
| TTL máximo | 3600s (1 hora) |
- Dentro do TTL, o cache pode ser referenciado repetidamente com acertos determinísticos.
- Após o TTL expirar, o cache é invalidado automaticamente, e referenciá-lo gerará erro (o cache não existe mais).
- Você pode
deletea qualquer momento para liberá-lo antecipadamente.
Referenciar um cache expirado ou excluído falha. Trate o caso de “cache invalidado” no lado do cliente (capture o erro e recrie o cache, ou recorra a uma requisição normal).
Faturamento
O cache explícito é cobrado de forma transparente por token, em três partes:
| Etapa | Fórmula | Observação |
|---|---|---|
| Criar cache | totalTokenCount × tarifa de cache_write | Cobrado pela tarifa de “escrita no cache”; totalTokenCount vem do usageMetadata da resposta de criação — ou seja, o número de tokens em cache |
| Acerto na referência | cachedContentTokenCount × tarifa de cache_read | A parte em cache é cobrada pela tarifa de “leitura do cache”, cerca de 0,10x do preço de entrada padrão, muito mais barato do que reenviar tudo |
| Novo conteúdo por referência | O novo prompt / saída de cada vez é cobrado pelas tarifas padrão | Ou seja, cada nova pergunta que você faz e a nova resposta do modelo |
O modelo de economia: pague uma taxa de “escrita” na criação e, depois, cada referência cobra o conteúdo em cache pela tarifa de “leitura” mais baixa, economizando o custo de “reenviar todo o contexto pelo preço cheio”. Quanto mais referências, mais você economiza. Os preços unitários de cache_write / cache_read de cada modelo são definidos no catálogo de modelos e nas estatísticas de uso do painel.
Aprimoramento no OfoxAI: roteamento determinístico
O OfoxAI faz balanceamento de carga entre várias regiões GCP / projetos Vertex. Os caches explícitos são region-scoped (vinculados à região): um cache criado em um projeto GCP deve ser referenciado no mesmo projeto, caso contrário retorna 404.
O OfoxAI trata isso automaticamente: na criação, registra a instância upstream à qual o cache está vinculado e, depois, busca essa instância pelo handle do cache e trava (hard-lock) as referências de volta ao mesmo upstream. Independentemente de a requisição de referência levar ou não um identificador de user, e de como a carga é distribuída, as referências são roteadas com precisão para o projeto que criou o cache, com zero drift. Você não precisa se preocupar com a distribuição de regiões subjacente.
A propriedade do cache é protegida: um handle de cache só pode ser referenciado / consultado / excluído pela API Key (e mesmo proprietário) que o criou; o acesso entre contas é rejeitado (403).
Cache explícito vs cache implícito
| Dimensão | Cache implícito (automático) | Cache explícito (cachedContents) |
|---|---|---|
| Forma de acionamento | Detecta prefixos repetidos automaticamente | Cria ativamente um objeto de cache e o referencia |
| Determinismo do acerto | Best-effort; uma pequena alteração no prefixo pode dar miss | Determinístico; sempre acerta enquanto não expirar |
| Necessita gerenciamento | Não | Criar / referenciar / excluir o handle |
| Indicado para | Conteúdo curto com prefixos ocasionalmente repetidos | Contexto grande, estável e reutilizado repetidamente |
| Faturamento | Desconto de tarifa de leitura no acerto | Taxa de escrita na criação + desconto de tarifa de leitura na referência |
Os dois podem ser combinados. Para requisições do dia a dia, deixe o cache implícito agir automaticamente; para contexto que você definitivamente reutiliza repetidamente, use o cache explícito para garantir os acertos. Veja os detalhes do cache implícito em Cache de prompt.