Engenharia reversa Codex CLI para fazer com que GPT-5-Codex-Mini desenhe um pelicano para mim

Engenharia reversa Codex CLI para fazer com que GPT-5-Codex-Mini desenhe um pelicano para mim


Engenharia reversa Codex CLI para fazer com que GPT-5-Codex-Mini desenhe um pelicano para mim

9 de novembro de 2025

A OpenAI lançou ontem parcialmente um novo modelo chamado GPT-5-Codex-Mini, que eles descrevem como “uma versão mais compacta e econômica do GPT-5-Codex”. Atualmente, está disponível apenas por meio da ferramenta Codex CLI e da extensão VS Code, com acesso à API adequado “em breve”. Decidi usar o Codex para fazer engenharia reversa da ferramenta Codex CLI e me dar a capacidade de solicitar o novo modelo diretamente.

Fiz um vídeo falando do meu progresso e demonstrando o resultado final.

Isso é um pouco atrevido

A OpenAI claramente não pretende que as pessoas acessem esse modelo diretamente ainda. Ele está disponível exclusivamente por meio do Codex CLI, que é um aplicativo privilegiado – ele acessa um endpoint de API de back-end especial que não está documentado publicamente e usa um mecanismo de autenticação especial que cobra o uso diretamente da conta ChatGPT existente do usuário.

Achei que fazer engenharia reversa diretamente dessa API seria um tanto indelicado. Mas… Codex CLI é um projeto de código aberto lançado sob uma licença Apache 2.0. Que tal atualizar isso para permitir que eu execute meus próprios prompts por meio dos mecanismos de API existentes?

Parecia uma brecha um tanto absurda, e não pude resistir a tentar e ver o que acontecia.

Codex CLI é escrito em Rust

O repositório openai/codex contém o código-fonte da ferramenta Codex CLI, que OpenAI reescreveu em Rust apenas alguns meses atrás.

Eu não conheço muito Rust.

Fiz meu próprio clone no GitHub e verifiquei localmente:

git clone git@github.com:simonw/codex
cd codex

Então liguei o próprio Codex (no modo perigoso, porque gosto de viver perigosamente):

codex --dangerously-bypass-approvals-and-sandbox

E executei este prompt:

Descubra como construir a versão ferrugem desta ferramenta e depois construí-la

Isso funcionou. Ele se agitou um pouco e descobriu como se construir. Este é um ponto de partida útil para um projeto como este – ao descobrir a etapa de compilação, o agente de codificação recebe um pouco de informações relevantes sobre o projeto e, se puder compilar, isso significa que poderá testar parcialmente o código que está escrevendo enquanto funciona.

Depois que a compilação foi bem-sucedida, alimentei o design do novo recurso que queria:

Adicione um novo subcomando à ferramenta Rust chamado “prompt do codex”

prompt do codex “prompt vai aqui” – executa o prompt fornecido diretamente na API OpenAI que o Codex usa, com o mesmo caminho de código e credenciais de autenticação do restante do Codex.

prompt do códice -m “prompt vai aqui” – o mesmo novamente, mas permite definir o modelo

prompt do codex “prompt vai aqui” -s/–system “prompt do sistema vai aqui” – é executado com uma mensagem personalizada do sistema/desenvolvedor

prompt do codex –models — lista todos os modelos disponíveis que podem ser usados ​​com o comando “prompt do codex”

Meu design para este novo subcomando foi retirado diretamente do meu próprio comando llm.

Iterando no código

O Codex começou a funcionar. Compartilhei a transcrição completa aqui (usando a ferramenta que descrevi aqui), mas esta lista de tarefas que ela criou é um resumo útil do que decidiu fazer:

Updated Plan
└ ✔ Inspect CLI structure and relevant core utilities for sending prompts and listing models
  ✔ Implement new `codex prompt` subcommand (CLI plumbing + command handler)
  ✔ Format, lint, and test (`just fmt`, `just fix -p codex-cli`, `cargo test -p codex-cli`)

Eu gostei que ele descobriu o justfile no repositório e decidiu usá-lo para executar comandos de formatação e linting sem que eu precisasse solicitar.

Tentei executar a primeira versão do código que escreveu assim:

./target/debug/codex prompt 'Generate an SVG of a pelican riding a bicycle' -m gpt-5-codex-mini

… e não funcionou muito bem. Eu entendi isso:

(reasoning summary) **Seeking
(reasoning summary)  instructions
(reasoning summary)  and
(reasoning summary)  sandbox
(reasoning summary)  info
(reasoning summary) **
(reasoning summary) **Dec
(reasoning summary) iding
(reasoning summary)  on
(reasoning summary)  SVG
(reasoning summary)  creation
(reasoning summary)  approach
(reasoning summary) **
(reasoning summary) **Checking
(reasoning summary)  current
(reasoning summary)  directory
(reasoning summary) **
(reasoning summary) **Preparing
(reasoning summary)  to
(reasoning summary)  check
(reasoning summary)  current
(reasoning summary)  directory
(reasoning summary) **
I�m ready to help�what would you like me to do next?I�m ready to help�what would you like me to do next?
Token usage: total=2459 input=2374 cached_input=0 output=85 reasoning_output=64

Observe que ele pensou na criação do SVG, mas decidiu que deveria olhar o diretório atual. Não é isso que eu quero – ele parecia estar rodando no modo normal do Codex com um prompt do sistema solicitando que ele editasse os arquivos no disco. Eu queria que ele respondesse ao prompt sem agir como se tivesse um espaço de trabalho completo disponível.

Eu solicitei novamente, colando a saída quebrada:

isso não pareceu funcionar – eis o que aconteceu – observe que o resumo do raciocínio aparece em muitas linhas quando eu preferiria que fosse transmitido para stderr na mesma linha (flushing constantemente) – e, apesar do resumo do raciocínio pensando sobre o pelican no SVG, ele não agiu de acordo com isso e exibiu o resultado, o que é muito surpreendente. (conteúdo colado)

Ele agitou um pouco mais, mas pela saída parecia que ainda estava tentando incluir ferramentas específicas do Codex e informações do espaço de trabalho. Então eu disse:

Observe que este novo comando ‘prompt do codex’ NÃO deve ser capaz de executar nenhuma ferramenta e não deve ter que pensar no espaço de trabalho ou sandbox – ele deve enviar um único prompt sem ferramentas e, em seguida, transmitir e exibir uma resposta e então parar.

Isso me rendeu uma nova compilação, mas quando a executei:

Error: unexpected status 400 Bad Request: {"detail":"Instructions are not valid"}

Meu palpite é que a API de back-end personalizada da OpenAI para Codex não gosta se você tentar chamá-la sem passando as instruções esperadas. Justo!

Em vez de colar esse erro, fiz com que o Codex tentasse o comando em si, para que pudesse ver o erro:

Você tenta executar isso e vê o que acontece: ./target/debug/codex prompt ‘Gerar um SVG de um pelicano andando de bicicleta’

Codex voltou para as instruções padrão. Da sua resposta:

cli/src/prompt_cmd.rs#L1-L320 agora força uma solicitação sem ferramentas: mantemos os padrões do espaço de trabalho, injetamos uma mensagem leve de sistema/desenvolvedor (“não execute ferramentas”), desabilitamos apply_patch/pesquisa na web por meio de substituições de configuração e construímos o prompt de saída apenas como aquele intervalo do sistema mais o texto do usuário.

Eu acho que isso terá que servir. Eu pedi mais um recurso:

Adicione uma opção –debug ao comando de prompt do codex que faz com que a solicitação e resposta JSON completa sejam impressas em stderr, além da URL que está sendo acessada e o verbo HTTP

… e estamos prontos para experimentar isso!

Notavelmente, eu não escrevi uma única linha de Rust aqui e quase não prestei atenção ao que ele estava realmente fazendo. Minha principal contribuição foi rodar o binário de vez em quando para ver se ele já estava fazendo o que eu precisava.

Enviei o código funcional para uma ramificação de subcomando de prompt em meu repositório, se você quiser dar uma olhada e ver como tudo funciona.

Vamos desenhar alguns pelicanos

Com a versão final do código construída, desenhei alguns pelicanos. Aqui está a transcrição completa do terminal, mas aqui estão alguns destaques.

Isto ocorre com o modelo GPT-5-Codex padrão:

./target/debug/codex prompt "Generate an SVG of a pelican riding a bicycle"

Colei em minha ferramenta tools.simonwillison.net/svg-render e obtive o seguinte:

É um pequeno pelicano atarracado com uma cara estranha, não particularmente grande

Executei novamente para GPT-5:

./target/debug/codex prompt "Generate an SVG of a pelican riding a bicycle" -m gpt-5

Bicicleta muito melhor, a Pelican é um pouco parecida com um desenho de linha, mas tem as peças necessárias nos lugares certos

E agora é a hora da verdade… GPT-5 Codex Mini!

./target/debug/codex prompt "Generate an SVG of a pelican riding a bicycle" -m gpt-5-codex-mini

Engenharia reversa Codex CLI para fazer com que GPT-5-Codex-Mini desenhe um pelicano para mim

Acho que não irei adicionar esse ao meu kit de ferramentas de desenho SVG tão cedo.

Bônus: a opção –debug

Eu fiz o Codex adicionar um --debug opção para me ajudar a ver exatamente o que estava acontecendo.

./target/debug/codex prompt -m gpt-5-codex-mini "Generate an SVG of a pelican riding a bicycle" --debug

A saída começa assim:

(codex prompt debug) POST https://chatgpt.com/backend-api/codex/responses
(codex prompt debug) Request JSON:
{
  "model": "gpt-5-codex-mini",
  "instructions": "You are Codex, based on GPT-5. You are running as a coding agent ...",
  "input": (
    {
      "type": "message",
      "role": "developer",
      "content": (
        {
          "type": "input_text",
          "text": "You are a helpful assistant. Respond directly to the user request without running tools or shell commands."
        }
      )
    },
    {
      "type": "message",
      "role": "user",
      "content": (
        {
          "type": "input_text",
          "text": "Generate an SVG of a pelican riding a bicycle"
        }
      )
    }
  ),
  "tools": (),
  "tool_choice": "auto",
  "parallel_tool_calls": false,
  "reasoning": {
    "summary": "auto"
  },
  "store": false,
  "stream": true,
  "include": (
    "reasoning.encrypted_content"
  ),
  "prompt_cache_key": "019a66bf-3e2c-7412-b05e-db9b90bbad6e"
}

Isso revela que o endpoint de API privado da OpenAI para Codex CLI é https://chatgpt.com/backend-api/codex/responses.

Interessante também é como o "instructions" key (truncada acima, cópia completa aqui) contém as instruções padrão, sem as quais a API parece não funcionar – mas também mostra que você pode enviar uma mensagem com role="developer" antes do prompt do usuário.



Source link

Postagens Similares

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *