Jangada AIJangada AI

OpenAI

Provider openai. Adapter sobre o SDK openai (dialeto chat.completions).

pip install "jangada-ai[openai]"
  • provider=: "openai"
  • Variável de ambiente: OPENAI_API_KEY
  • Base do adapter: _OpenAICompatible (compartilhado com Groq)
from jangada_ai import LLM
llm = LLM("openai", "gpt-4o-mini")

O que faz

  • Texto (complete/acomplete) e streaming (stream/astream).
  • Structured output (parse): usa o helper nativo chat.completions.parse(response_format=Modelo) → .message.parsed.
  • Vision (images=): imagens viram image_url com data URI.
  • Documentos (files=): extração de texto local (comum a todos).
  • Detecção de objetos (detect_objects): via vision + structured.
  • Transcrição de áudio (transcribe): endpoint dedicado audio.transcriptions.create. Modelos: gpt-4o-transcribe, gpt-4o-mini-transcribe, whisper-1.

Estrutura e quirks

  • Parâmetros: aceita temperature, max_tokens, top_p, stop, seed. Não tem top_k (é descartado).
  • Perfil de modelo (profiles.py): a família gpt-5 rejeita temperature e usa max_completion_tokens em vez de max_tokens — a jangada normaliza isso automaticamente. Veja Parâmetros e perfis.
  • Resposta (Completion): text, usage (input_tokens/output_tokens derivados de prompt_tokens/completion_tokens), raw com o objeto nativo.
  • Erros: traduzidos por errors.classify() para a hierarquia normalizada.

O que mudou na 1.9.0

  • Tools nativas → Responses API. Com web_search(), file_search(), code_execution() (code interpreter), image_generation() ou computer_use() em tools=, a chamada vai pela Responses API (veja Tools nativas). Sem tools nativas, continua no chat.completions.
  • Modelo que recusa function tools no chat.completions → Responses API. Alguns modelos novos (ex.: gpt-5.6-luna) recusam tools= no chat.completions e pedem a Responses API. A jangada troca de rota sozinha na primeira recusa e lembra do modelo — as próximas chamadas com tools já vão direto. Você não muda nada.
  • Structured output strict: o schema passa a listar todas as propriedades em required (exigência do modo strict), e o fallback para JSON mode cobre mais mensagens de "schema não suportado".
  • Saída cortada no parse vira TruncatedError; recusa (refusal) vira OutputValidationError.
  • Usage: cache_read_tokens (prompt caching) e reasoning_tokens (modelos de raciocínio) no usage; o custo aplica o desconto de cache.
  • Embeddings em lote: listas grandes são fatiadas em várias requisições (llm.embed(textos, batch_size=...)).
  • Série o (o1/o3/o4) tem regra de perfil: max_completion_tokens e sem sampling.

Exemplo de structured

from pydantic import BaseModel
class Pessoa(BaseModel):
    nome: str; idade: int

llm.parse("Extraia: João, 30 anos.", Pessoa).parsed   # Pessoa(nome='João', idade=30)

Relacionado: Matriz de capacidades, Groq (mesmo dialeto), Transcrição de áudio.

On this page