Caching
Como o Caching Funciona
Seção intitulada “Como o Caching Funciona”Toda requisicao que passa pelo gateway Floopy e verificada contra o cache antes de chegar ao provedor de LLM. Quando ocorre um cache hit, a resposta armazenada e retornada imediatamente — nenhum token e consumido e a latencia cai para milissegundos de um digito.
O caching e aplicado automaticamente com base na sua configuracao. Voce nao precisa alterar o codigo da sua aplicacao.
Niveis de Cache
Seção intitulada “Niveis de Cache”O Floopy usa tres niveis de caching, verificados em ordem:
Exact Cache
Seção intitulada “Exact Cache”O primeiro nivel realiza uma busca direta no Redis. Se a requisicao recebida for identica byte a byte a uma requisicao anterior (mesmo modelo, mensagens e parametros), a resposta em cache e retornada instantaneamente. Este e o nivel mais rapido com o menor overhead.
As entradas do exact cache expiram com base em um TTL configuravel. Este nivel esta disponivel em todos os planos.
Semantic Cache
Seção intitulada “Semantic Cache”Quando o exact cache nao encontra correspondencia, o Floopy verifica o semantic cache. Seu prompt e convertido em um embedding vetorial e comparado com prompts anteriores armazenados no banco de dados vetorial. Se um prompt armazenado for similar o suficiente — acima do limite de similaridade configurado — sua resposta e retornada.
Isso significa que pequenas reformulacoes da mesma pergunta (“Qual e a capital da Franca?” vs. “Me diga a capital da Franca”) podem ser servidas do cache em vez de chamar o provedor novamente.
Advanced Cache
Seção intitulada “Advanced Cache”O nivel avancado adiciona agrupamento por contagem de mensagens e pontuacao de similaridade com reconhecimento de tokens. As requisicoes sao agrupadas pelo comprimento da conversa antes da comparacao de similaridade, o que melhora a precisao de correspondencia para conversas com multiplos turnos e reduz falsos positivos.
O advanced cache esta disponivel no plano Pro e superiores.
Fluxo de Decisao do Cache
Seção intitulada “Fluxo de Decisao do Cache”O diagrama a seguir mostra o caminho completo de decisao para toda requisicao com caching habilitado:
graph TD
A[Request with Floopy-Cache-Enabled: true] --> B[Normalize Prompt]
B --> C[Exact Cache Lookup in Redis]
C -->|Hit + Bucket Full| D[Return Random Cached Response]
C -->|Hit + Bucket Not Full| E[Continue to Provider, Store Additional Response]
C -->|Miss| F[Semantic Cache Lookup in Qdrant]
F -->|Hit above threshold| D
F -->|Miss| G{floopy-cache-advanced: true?}
G -->|Yes| H[Advanced Cache: Embedding + Bucketed Search]
H -->|Hit| D
H -->|Miss| I[Continue to Provider]
G -->|No| I
I --> J[Provider Response]
J --> K[Store in Cache Async]O prompt e primeiro normalizado — espacos em branco sao removidos, e quaisquer chaves listadas em Floopy-Cache-Ignore-Keys sao removidas do corpo da requisicao antes de computar a chave de cache. Isso garante que campos irrelevantes como timestamps ou IDs de requisicao nao causem cache misses.
Bucket Max Size
Seção intitulada “Bucket Max Size”Quando Floopy-Cache-Bucket-Max-Size e definido (ex.: 3), cada chave de cache pode armazenar multiplas respostas distintas em vez de apenas uma. Isso proporciona variedade de respostas enquanto ainda economiza custos — particularmente util para prompts criativos ou nao-deterministicos onde voce deseja saidas diversas.
A logica de bucketing funciona da seguinte forma:
- Bucket nao cheio — Se o bucket tem menos respostas do que o tamanho maximo configurado, a requisicao continua para o provedor normalmente. A nova resposta e adicionada ao bucket junto com as respostas em cache existentes.
- Bucket cheio — Se o bucket ja contem o numero maximo de respostas, uma resposta aleatoria e selecionada do bucket e retornada imediatamente. Nenhuma chamada ao provedor e feita, economizando tanto custo quanto latencia.
Por exemplo, com Floopy-Cache-Bucket-Max-Size: 3, as tres primeiras requisicoes identicas todas vao para o provedor, e cada resposta e armazenada. A partir da quarta requisicao, uma das tres respostas armazenadas e retornada aleatoriamente.
Referencia Rapida de Headers de Cache
Seção intitulada “Referencia Rapida de Headers de Cache”| Header | Tipo | Padrao | Efeito |
|---|---|---|---|
Floopy-Cache-Enabled | "true" / "false" | Configuracao por chave | Habilita ou desabilita todos os niveis de cache para esta requisicao |
Floopy-Cache-Seed | string | nenhum | Isola entradas do exact cache por valor de seed. Requisicoes com seeds diferentes produzem chaves de exact cache diferentes. Nota: os niveis semantic e advanced cache buscam por similaridade de embedding e nao sao afetados pelo seed — um prompt semanticamente identico pode retornar uma resposta em cache de um seed diferente |
Floopy-Cache-Bucket-Max-Size | integer | 1 | Numero maximo de respostas armazenadas por chave de cache. Quando cheio, uma resposta em cache aleatoria e retornada |
Floopy-Cache-Ignore-Keys | strings separadas por virgula | nenhum | Chaves do corpo da requisicao excluidas da computacao da chave de cache (ex.: timestamp,request_id) |
floopy-cache-advanced | "true" / "false" | Configuracao por chave | Habilita ou desabilita o nivel de advanced cache (busca por embedding com buckets) para esta requisicao |
cache-control | max-age=<seconds> | TTL por chave | Sobrescreve o TTL para a entrada de cache desta requisicao. A resposta em cache expira apos o numero especificado de segundos |
Economia de Custo e Latencia
Seção intitulada “Economia de Custo e Latencia”Respostas em cache sao gratuitas — nenhum token e cobrado pelo provedor upstream. Para aplicacoes com consultas repetitivas ou similares, o caching pode reduzir custos em 30-70% dependendo dos padroes de trafego.
A latencia para um cache hit e tipicamente inferior a 10ms, comparada a 500ms-3s para uma chamada ao vivo ao provedor. Essa melhoria e especialmente perceptivel para aplicacoes voltadas ao usuario onde o tempo de resposta importa.
Metricas do Dashboard
Seção intitulada “Metricas do Dashboard”A secao de Caching do dashboard fornece visibilidade em tempo real sobre o desempenho do cache:
- Taxa de hit ao longo do tempo — um grafico mostrando a porcentagem de requisicoes servidas do cache, detalhada por nivel.
- Tokens economizados — o numero total de tokens que teriam sido consumidos sem caching.
- Latencia economizada — tempo acumulado economizado ao retornar respostas em cache em vez de chamar o provedor.
- Pares mais cacheados — os pares prompt-resposta mais frequentemente cacheados, para que voce entenda o que impulsiona a eficiencia do seu cache.
Use essas metricas para ajustar seus limites de similaridade e configuracoes de TTL para o melhor equilibrio entre frescor e economia.
Configuracao
Seção intitulada “Configuracao”Voce pode habilitar e configurar o caching por API key ou no nivel da organizacao em Settings. As opcoes principais incluem:
- Habilitar/desabilitar cada nivel de cache independentemente.
- TTL — por quanto tempo as entradas do exact cache permanecem validas.
- Limite de similaridade — a pontuacao minima de similaridade necessaria para um semantic cache hit (valores mais altos exigem correspondencias mais proximas).
Headers de Controle de Cache
Seção intitulada “Headers de Controle de Cache”Voce pode controlar o comportamento do caching por requisicao usando headers. Estes sobrescrevem a configuracao padrao da API key ou organizacao.
| Header | Valores | Descricao |
|---|---|---|
Floopy-Cache-Enabled | "true" / "false" | Habilita ou desabilita o caching para esta requisicao |
Floopy-Cache-Seed | qualquer string | Isola entradas do exact cache por valor de seed. Os niveis semantic e advanced nao sao afetados pelo seed |
Floopy-Cache-Bucket-Max-Size | integer | Numero maximo de respostas armazenadas por chave de cache. Quando cheio, uma resposta em cache aleatoria e retornada |
Floopy-Cache-Ignore-Keys | lista separada por virgula | Chaves do corpo da requisicao a ignorar ao computar a chave de cache (ex.: timestamp,request_id) |
floopy-cache-advanced | "true" / "false" | Habilita ou desabilita o nivel de semantic cache avancado para esta requisicao |
cache-control | max-age=<seconds> | Sobrescreve o TTL para a entrada de cache desta requisicao |
import { OpenAI } from "openai";
const client = new OpenAI({ baseURL: "https://api.floopy.ai/v1", apiKey: process.env.FLOOPY_API_KEY,});
const response = await client.chat.completions.create( { model: "gpt-4o", messages: [{ role: "user", content: "What is the capital of France?" }], }, { headers: { "Floopy-Cache-Enabled": "true", "Floopy-Cache-Bucket-Max-Size": "3", "Floopy-Cache-Seed": "deterministic-seed-abc", "Floopy-Cache-Ignore-Keys": "timestamp,request_id", "floopy-cache-advanced": "true", "cache-control": "max-age=3600", }, },);
console.log(response.choices[0].message.content);from openai import OpenAIimport os
client = OpenAI( base_url="https://api.floopy.ai/v1", api_key=os.environ["FLOOPY_API_KEY"],)
response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": "What is the capital of France?"}], extra_headers={ "Floopy-Cache-Enabled": "true", "Floopy-Cache-Bucket-Max-Size": "3", "Floopy-Cache-Seed": "deterministic-seed-abc", "Floopy-Cache-Ignore-Keys": "timestamp,request_id", "floopy-cache-advanced": "true", "cache-control": "max-age=3600", },)
print(response.choices[0].message.content)curl https://api.floopy.ai/v1/chat/completions \ -H "Authorization: Bearer $FLOOPY_API_KEY" \ -H "Content-Type: application/json" \ -H "Floopy-Cache-Enabled: true" \ -H "Floopy-Cache-Bucket-Max-Size: 3" \ -H "Floopy-Cache-Seed: deterministic-seed-abc" \ -H "Floopy-Cache-Ignore-Keys: timestamp,request_id" \ -H "floopy-cache-advanced: true" \ -H "cache-control: max-age=3600" \ -d '{ "model": "gpt-4o", "messages": [{"role": "user", "content": "What is the capital of France?"}] }'Requisitos de Plano
Seção intitulada “Requisitos de Plano”| Nivel | Disponibilidade |
|---|---|
| Exact Cache | Todos os planos |
| Semantic Cache | Todos os planos |
| Advanced Cache | Plano Pro e superiores |