Exemplo: Escritor IA
Um auxiliar de escrita que reescreve textos em tons diferentes, traduz e resume. O destaque é o cache de respostas (exato e semântico): chamadas repetidas (ou parafraseadas) não pagam o LLM de novo.
Pasta: pocs/escritor-ia · Porta sugerida: 8000
Recursos da jangada
LLM.complete()com templates{{ }}ExactCache— cache para prompts idênticosSemanticCache— cache por similaridade (embeddings), pega paráfrasesCompletion.cost— custo na resposta
Núcleo do exemplo
Montagem do LLM com cache, com fallback de SemanticCache → ExactCache
(app/routers/escritor.py):
from jangada_ai import LLM, ExactCache, SemanticCache, UnsupportedError
def _cached_llm() -> LLM:
embed_key = s.api_key_for(s.embed_provider)
if embed_key:
embedder = LLM(s.embed_provider, s.embed_model, api_key=embed_key)
try:
cache = SemanticCache(embedder, threshold=0.45)
except UnsupportedError:
cache = ExactCache(max_size=512, ttl=3600)
else:
cache = ExactCache(max_size=512, ttl=3600)
return LLM(..., cache=cache, name="escritor-cache")Uso com template:
_TPL_REESCREVER = (
"Reescreva o texto abaixo em tom {{tom}}, preservando o sentido. "
"Responda APENAS com o texto reescrito, em português.\n\nTexto:\n{{texto}}"
)
@router.post("/reescrever", response_model=Resultado)
async def reescrever(req: ReescreverRequest) -> Resultado:
llm = _cached_llm()
with observability_session(name="reescrever", metadata={"tom": req.tom}):
comp = await anyio.to_thread.run_sync(
lambda: llm.complete(_TPL_REESCREVER, tom=req.tom, texto=req.texto)
)
return Resultado(resultado=comp.text, custo_usd=comp.cost)Pontos de atenção
- O
SemanticCacheprecisa de um LLM embedder e de umthreshold. Comece em~0.45; se vier resposta "parecida demais" mas errada, suba o limiar. - Mantenha o fallback para
ExactCache: nem todo provider de embeddings está disponível em todo ambiente.
Como rodar
cd pocs/escritor-ia
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000 # http://localhost:8000/docs