Templates de referência. Adapte modelo, chaves e limites à documentação oficial vigente.
Marque o bloco estático com cache_control: ephemeral. Na primeira chamada ocorre escrita no cache; nas seguintes, leitura (hit), se o bloco permanecer idêntico.
cache_read_tokens / campos de usage equivalentesimport os
import anthropic
client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
REGRAS_SISTEMA_LONGAS = """
Você é um assistente especializado.
Sua base de regras e documentação interna permanece fixa entre as chamadas.
[Insira aqui um bloco longo e estável — políticas, docs, guidelines...]
"""
response = client.messages.create(
model="claude-3-5-sonnet-20240620", # ajuste para o modelo disponível na sua conta
max_tokens=1024,
system=[
{
"type": "text",
"text": REGRAS_SISTEMA_LONGAS,
"cache_control": {"type": "ephemeral"}
}
],
messages=[
{
"role": "user",
"content": "Faça a pergunta dinâmica aqui."
}
],
)
print(response.content[0].text)
# print(response.usage) # confira campos de cache na versão da API
Use o código com cuidado. Modelo, campos de usage e preços mudam — valide na doc oficial.
Não há tag obrigatória: o que importa é um prefixo estável e suficientemente longo no início das mensagens. Conteúdo dinâmico sempre por último.
prompt_tokens_details.cached_tokens quando disponívelimport os
import time
from openai import OpenAI
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
# Prefixo estável e longo (candidato a cache automático)
CONTEXTO_ESTATICO = (
"Você é um assistente da empresa X com as seguintes políticas e FAQs...\n"
+ ("[Trecho estável de documentação] " * 200)
)
def fazer_pergunta(pergunta_usuario: str) -> str:
inicio = time.time()
response = client.chat.completions.create(
model="gpt-4o-mini", # ajuste conforme sua conta
messages=[
{"role": "system", "content": CONTEXTO_ESTATICO}, # estático PRIMEIRO
{"role": "user", "content": pergunta_usuario}, # dinâmico POR ÚLTIMO
],
)
print(f"Tempo: {time.time() - inicio:.2f}s")
usage = response.usage
print(f"prompt_tokens={usage.prompt_tokens}")
details = getattr(usage, "prompt_tokens_details", None)
if details is not None:
print(f"cached_tokens={getattr(details, 'cached_tokens', None)}")
return response.choices[0].message.content
print("--- Chamada 1 (possível miss/write) ---")
fazer_pergunta("Como redefino minha senha?")
print("--- Chamada 2 (mesmo prefixo, pergunta nova) ---")
fazer_pergunta("Qual o horário de atendimento?")
Use o código com cuidado. Qualquer variação no início do prefixo invalida o cache.