← Voltar ao Hub
Implementação

Provedores: OpenAI & Anthropic

Templates de referência. Adapte modelo, chaves e limites à documentação oficial vigente.

Anthropic / Claude — cache explícito

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.

  • Ideal para system prompts longos e documentos fixos
  • Inspecione cache_read_tokens / campos de usage equivalentes
import 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.

OpenAI — cache automático por prefixo

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.

  • Referência comum de mínimo: ~1024 tokens no prefixo (confirme na doc atual)
  • Monitore prompt_tokens_details.cached_tokens quando disponível
import 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.