Jangada AIJangada AI

Casos de uso

Esta página mostra, do problema ao código, três situações comuns resolvidas com a jangada. A ideia é menos teoria e mais "cole, troque a chave e rode". Cada caso aponta para a página da capacidade correspondente.

1. Extração estruturada de documento (visão fiscal)

Problema. Você recebe notas fiscais em PDF/imagem e precisa dos campos (fornecedor, total, itens) tipados e validados — não um texto solto que depois você faz regex.

Solução. Defina um schema Pydantic e use parse(...) com files=. A jangada manda o documento para o provider, recebe a resposta já validada no seu modelo.

from pydantic import BaseModel
from jangada_ai import LLM

class Item(BaseModel):
    descricao: str
    valor: float

class NotaFiscal(BaseModel):
    fornecedor: str
    cnpj: str
    total: float
    itens: list[Item]

llm = LLM("openai", "gpt-4o")
resp = llm.parse(
    "Extraia os dados desta nota fiscal.",
    schema=NotaFiscal,
    files=["nota.pdf"],   # pdf, imagem, docx, csv, xlsx…
)
nota = resp.parsed        # objeto NotaFiscal já validado
print(nota.fornecedor, nota.total, len(nota.itens))

Funciona igual trocando para LLM("gemini", "gemini-2.5-flash") ou LLM("anthropic", "claude-sonnet-4-5"). Veja Structured output, Vision e Documentos.

2. Fallback por erro entre providers

Problema. O provider primário tem rate limit, timeout ou cai (5xx). Você não quer que a aplicação caia junto nem reescrever a chamada.

Solução. Encadeie uma lista de fallback. Quando o erro é recuperável, a jangada tenta o próximo provider sem mudar o resto do código.

from jangada_ai import LLM

llm = LLM("anthropic", "claude-sonnet-4-5").with_fallback(
    LLM("openai", "gpt-5"),
    LLM("groq",   "llama-4-scout"),
)

# falhou no primário? failover automático
resp = llm.complete("Explique jangadas em uma frase.")
print(resp.text)

A cadeia respeita a classificação de erro normalizada (rate limit, timeout, 5xx, 404…). Veja Erros e Retry e fallback.

3. RAG de suporte (buscar antes de responder)

Problema. O modelo precisa responder com base na sua base de conhecimento (docs, tickets), não no que ele "lembra".

Solução. Indexe os documentos uma vez (chunk + embed + vector store) e, a cada pergunta, recupere os trechos relevantes e injete no prompt.

from jangada_ai import LLM, RAG

rag = RAG(
    embedder=LLM("openai", "text-embedding-3-small"),
    store="postgresql://localhost/jangada",   # pgvector
)

# 1) indexar (uma vez)
rag.add(files=["manual.pdf", "faq.md"])

# 2) responder usando o contexto recuperado
contexto = rag.search("Como faço para emitir a segunda via?", k=4)
llm = LLM("anthropic", "claude-sonnet-4-5")
resp = llm.complete(
    "Responda usando só o contexto:\n{{ contexto }}\n\nPergunta: {{ q }}",
    contexto="\n\n".join(contexto),
    q="Como faço para emitir a segunda via?",
)
print(resp.text)

Veja RAG e Step-back prompting para recuperar contexto de fundo.

Próximos passos

On this page