Gemini
Provider gemini. Adapter sobre o SDK google-genai. Tem um único Client; o
async fica em client.aio.
pip install "jangada-ai[gemini]"provider=:"gemini"- Variável de ambiente:
GEMINI_API_KEY(ouGOOGLE_API_KEY)
from jangada_ai import LLM
llm = LLM("gemini", "gemini-2.5-flash")O que faz
- Texto e streaming (
generate_content/generate_content_stream). - Structured output (
parse):config.response_schema=Modelo+response_mime_type="application/json"→resp.parsed. - Vision (
images=): imagens viramtypes.Part.from_bytes. - Documentos (
files=): extração de texto local. - Detecção de objetos (
detect_objects): o mais preciso — o formato de bounding box 0–1000 é nativo do treino do Gemini. - Transcrição de áudio (
transcribe): multimodal — o áudio entra comoPart.from_bytesjunto de uma instrução; não é endpoint dedicado.
Estrutura e quirks
- Mensagens: o papel
systemvirasystem_instructionnoGenerateContentConfig(não é uma mensagem comum);assistantviramodel. - Parâmetros canônicos → config:
max_tokens→max_output_tokens,stop→stop_sequences;temperature/top_p/top_k/seedpassam direto. É o único provider comtop_k. - Perfil de modelo (
profiles.py):gemini-3.xdescarta sampling (temperature/top_p/top_k). Veja Parâmetros e perfis. - Function calling multi-turno no 3.x — thought signatures (resolvido pela
lib): o Gemini 3.x anexa um
thought_signatureopaco a cada function call e o exige de volta, inalterado, ao reenviar o histórico. A jangada preserva isso automaticamente — o valor viaja no campo opacometadata: dictdeToolCall/ToolCallParte o adapter o reanexa ao remontar o histórico. Assimtools=,AgenteMCPClientfuncionam em multi-turno sem você tocar em nada.gemini-2.5não usa esse campo. (corrigido em 1.3.1) - Resposta (
Completion):usagevem deusage_metadata(prompt_token_count/candidates_token_count).
Thinking (raciocínio) — você passa só thinking_budget
O Gemini tem duas convenções incompatíveis: o 2.5 só aceita thinking_budget
(em tokens) e o 3.x só aceita thinking_level (LOW/HIGH) — misturar dá
HTTP 400. A jangada resolve isso por você: passe thinking_budget (ou
thinking_level) e a lib adapta ao modelo, empacotando no thinking_config
nativo por baixo dos panos.
# Funciona igual nas duas versões — você não muda nada:
LLM("gemini", "gemini-2.5-flash").complete("...", params={"thinking_budget": 1024})
LLM("gemini", "gemini-3-pro").complete("...", params={"thinking_budget": 1024})
# no 2.5 vira thinking_config(thinking_budget=1024);
# no 3.x o perfil converte para thinking_config(thinking_level="HIGH").thinking_budget:0desliga (quando o modelo permite),-1é automático.- No 3.x, o budget é aproximado para um nível válido (
LOWse ≤0, senãoHIGH). No 2.5, umthinking_levelé convertido para budget. Você também pode passar umthinking_configpronto, que é respeitado como veio. - Níveis aceitos:
thinking_levelreconheceMINIMAL/LOW/MEDIUM/HIGH. Como entrada no 2.5 os quatro viram umthinking_budget(0/1024/8192/24576). Direto no 3.x, o Gemini só aceitaLOW/HIGHuniversalmente (MINIMALé só Flash/Lite,MEDIUMsó no 3.0 Flash; usá-los como nível em outros 3.x dá HTTP 400) — por isso a conversão budget→level usa sóLOW/HIGH.
Por que é o "canivete suíço" aqui
É o único que cobre vision, detecção e áudio sem endpoints separados —
tudo via generateContent. Veja Matriz de capacidades.
O que mudou na 1.9.0
ToolCall.idé oidque a API devolve (ou"nome#i"quando não vem) — não mais o nome da função. Duas chamadas paralelas à mesma função não colidem. O nome real continua sendo usado nofunction_response, e históricos antigos (id igual ao nome) seguem funcionando.- Parâmetro de tool chamado
titlenão some mais do schema (o limpador de schema removia a chavetitletambém dentro deproperties). - Prompt bloqueado por safety levanta
BadRequestErrorcom o motivo (prompt_feedback.block_reason), sem retry nem fallback. - Usage:
output_tokensinclui os tokens de thinking (reasoning_tokensmostra quantos) einput_tokensinclui os tokens de resultado de tools nativas — ambos são cobrados; antes o custo saía subestimado. - Tools nativas: Google Search, URL context, code execution, file search, Google Maps e computer use (veja Tools nativas). Para a Interactions API e os agentes (Deep Research), veja Interactions.
transcribehonralanguage=;parsecom resposta vazia levanta erro em vez de devolverparsed=None; system em lista de partes tem o texto extraído.