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 nativochat.completions.parse(response_format=Modelo)→.message.parsed. - Vision (
images=): imagens viramimage_urlcom 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 dedicadoaudio.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 temtop_k(é descartado). - Perfil de modelo (
profiles.py): a famíliagpt-5rejeitatemperaturee usamax_completion_tokensem vez demax_tokens— a jangada normaliza isso automaticamente. Veja Parâmetros e perfis. - Resposta (
Completion):text,usage(input_tokens/output_tokensderivados deprompt_tokens/completion_tokens),rawcom 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()oucomputer_use()emtools=, 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) recusamtools=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
parseviraTruncatedError; recusa (refusal) viraOutputValidationError. - Usage:
cache_read_tokens(prompt caching) ereasoning_tokens(modelos de raciocínio) nousage; 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_tokense 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.