feat: adiciona provider Codex via SDK Python oficial - #111
Open
bdcdo wants to merge 9 commits into
Open
Conversation
bdcdo
marked this pull request as ready for review
July 15, 2026 19:56
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O que mudou
provider="codex"usando o SDK Python oficial, fora do caminho LangChain;all;dataframeit[codex]fixaopenai-codex==0.1.0b3, que por sua vez fixa o runtime compatívelopenai-codex-cli-bin==0.137.0a4;auth.jsonfile-backed;codex app-serverpor execução do DataFrame e cria uma thread efêmera por linha, inclusive comparallel_requests;model_validate_json;_cached_input_tokens, e preserva respostas válidas quando o SDK não fornece telemetria.Simplificações e correções
O backend é selecionado e vinculado uma única vez antes do processamento. O loop por linha recebe apenas
invoke(text): não há novo despacho entre Codex, Claude Code, LangChain ou os três modos de busca, nem cache multimodelo,prepare()ou lookup de schema por linha.O preflight de dependência, configuração, schema e autenticação termina antes de
_setup_columns, portanto uma falha não deixa o DataFrame parcialmente modificado. DataFrames vazios criam as colunas esperadas; checkpoints concluídos retornam sem importar o SDK, exigir login ou iniciar o app-server.Ao retomar um checkpoint, cada linha marcada como processada é validada contra o modelo Pydantic atual antes de qualquer mutação ou abertura do provider. Campos obrigatórios ausentes, nulos ou inválidos precisam ser cobertos por
reprocess_columns; campos opcionais e defaults continuam válidos, e defaults ausentes são materializados depois do preflight. A validação usa a posição da linha — portanto aceita índices duplicados — e lê o nome canônico salvo no checkpoint mesmo quando o modelo aceita somente um alias na entrada.O conversor de schema remove defaults, torna objetos estritos, converte somente uniões compatíveis e rejeita cedo estruturas fora do subconjunto aceito. Falhas do próprio Pydantic ao gerar JSON Schema são classificadas como erro de configuração do provider, com a causa original preservada.
A autenticação file-backed tem uma única instrução canônica e o runtime fixa explicitamente
cli_auth_credentials_store="file". Cada execução cria o runtime temporário no mesmo filesystem da credencial e compartilhaauth.jsonpor hard link, preservando refresh sem exigir privilégio de symlink no Windows; falhas de diretório, link e exclusão têm diagnósticos distintos e cleanup explícito.O runtime pinado salva a credencial com truncate + write e coordena refresh apenas dentro do próprio processo. Para impedir que dois app-servers do DataFrameIt corrompam ou sobrescrevam a mesma credencial, o extra
codexusa um lock interprocessual porauth.json, adquirido antes do runtime e liberado somente depois declient.close()e do cleanup. A aquisição é fail-fast: uma segunda execução com a mesma credencial falha antes de iniciar o cliente ou alterar o DataFrame; credenciais distintas não contendem eparallel_requestscontinua concorrente dentro da execução ativa.Erros de provider usam uma taxonomia compartilhada. HTTP 429 e
serverOverloadedrecebem retry e reduzem o paralelismo; erros internos, rollback e falhas transitórias de conexão recebem retry sem serem confundidos com rate limit; demais 4xx permanecem definitivos. A classificação usa o erro tipado registrado no turno pelo SDK, em vez de procurar texto em mensagens.A telemetria LangChain agora preserva
input_token_details.cache_readtanto em metadados dict quanto objeto, nos caminhos normal e com busca. Uma única estrutura inicializa os acumuladores de tokens, eliminando quatro cópias divergentes e preservando tambémreasoning_tokensnas agregações por campo, grupo, lista e modelo aninhado.cache_creationnão entra em_cached_input_tokens, pois representa consumo de entrada ainda não lido do cache.O pin exato do runtime deixou de ser declarado duas vezes:
openai-codexé a única fonte da versão exata; o extra mantém somente um limite inferior com marcador pré-release para que checkouts limpos douvresolvam sem--prerelease=allow. A descrição das colunas de tokens também tem uma única referência canônica por idioma.Isolamento
Cada execução usa
CODEX_HOME,CODEX_SQLITE_HOMEe workspace temporários.auth.jsoné o único arquivo do estado persistente do Codex vinculado ao runtime; como todo subprocesso, o app-server ainda herda as variáveis de ambiente do processo. Busca web, shell, execução unificada e servidores MCP ficam desativados, aprovações são negadas e o sandbox somente leitura bloqueia escrita.O lock coordena apenas instâncias do DataFrameIt. Codex CLI, login/logout e outros programas não respeitam esse sidecar; por isso, não devem usar a mesma credencial enquanto um processamento estiver ativo. A gravação upstream por truncamento também continua sujeita a falha se o processo morrer exatamente durante o save — a correção integral desses dois limites pertence ao runtime upstream.
Testes e CI
[dev,codex]:440 passed, 5 skippedem cada execução;[dev]sem o SDK Codex:408 passed, 37 skipped;uv buildetwine checkaprovam wheel e sdist;Não há bump de versão; a mudança está registrada em
[Unreleased].