0

Codex CLI no Windows sem confusão

Codex CLI no Windows sem confusão

Etapas locais e remotas de uma configuração do Codex

Instalar o Codex CLI, receber uma resposta da API e salvar um arquivo são verificações diferentes. Este roteiro separa essas etapas ao conectar o cliente ao Crazyrouter. O procedimento inclui o começo no Windows, os comandos de PowerShell, o payload de uma chamada curta e a configuração do cliente. A intenção é deixar um caminho que outra pessoa consiga repetir e discutir, inclusive quando parar antes do resultado final.

1. Qual afirmação queremos conseguir sustentar?

Evidência obtidaAfirmação razoávelSalto que devemos evitar
Saída de versãoO executável foi iniciadoA API está pronta
Catálogo retornadoA operação de listagem respondeuTodo modelo pode gerar
Resposta curta concluídaUma geração específica funcionouTodo o fluxo do agente é compatível
Diálogo na CLIO cliente conseguiu responder nessa sessãoO projeto pode ser modificado
Arquivo com comportamento conferidoA tarefa local definida foi atendidaQualquer tarefa futura dará certo

Para quem está começando, vale uma definição rápida: CLI é um programa usado pelo terminal; provider é a configuração que aponta esse programa para um serviço; modelo é a identificação enviada naquela solicitação. O serviço remoto não se confunde com a instalação local do agente.

Usaremos Crazyrouter como implementação concreta do provider. Isso permite discutir endereço, autenticação e protocolo com valores específicos, mas não dispensa confirmar a conta e o modelo. Uma assinatura ChatGPT, um acesso OpenAI API e um token de outro serviço não são a mesma autorização.

2. Preparar um ambiente que outra pessoa consiga descrever

Se Node, npm e Codex já estão acessíveis, consulte as versões e preserve o ambiente existente. Para quem ainda não tem essas ferramentas, segue o caminho completo pelo Windows, incluindo os detalhes de entrada no PowerShell.

Abra o PowerShell e confira o ambiente

No menu Iniciar, procure PowerShell; no Windows Terminal, selecione esse perfil. Comece numa janela comum. Copie apenas os comandos, sem o prompt PS C:\...> e sem a saída dos exemplos. Execute uma linha por vez; blocos com if devem ser copiados inteiros.

Cole com Ctrl + V. Se aparecer >>, pode faltar uma aspa ou chave: cancele com Ctrl + C e copie novamente. Usaremos npm.cmd e codex.cmd para evitar que o PowerShell selecione um iniciador .ps1 bloqueado pela política de scripts.

node --version
npm.cmd --version

Se ambos retornarem versões, siga para a instalação da CLI. Se node não for encontrado, falta instalar o ambiente ou atualizar o PATH da janela.

PowerShell não encontra o comando node

Instale Node.js, se necessário

No download oficial do Node.js, escolha LTS, Windows e o instalador .msi. Confira a arquitetura nas configurações do Windows, em Sistema → Sobre: x64 e ARM64 usam pacotes diferentes. Não copie as instruções de Docker para esta instalação nativa.

No assistente, mantenha npm e a inclusão no PATH. Ferramentas extras de compilação não são necessárias para este exercício. Depois, feche o terminal e abra outro; se estiver dentro de um editor, reinicie-o quando necessário. Execute novamente os dois comandos de versão.

Node responde com a versão instalada

As capturas estão em chinês; use-as para reconhecer o erro e a saída de versão. Não é preciso instalar o mesmo número mostrado. Se a falha continuar, confira a instalação e seu diretório no PATH antes de mexer em API ou modelo.

Instale e localize o Codex

npm.cmd install -g @openai/codex@latest
codex.cmd --version
codex.cmd --help

Espere a instalação terminar antes de consultar versão e ajuda. -g instala um utilitário global do npm; não significa liberar todo o computador para o agente. Leia o conteúdo de WARN e notice, e investigue npm ERR! ou falhas de download. O comando de versão é a verificação local.

Se codex.cmd continuar ausente numa janela nova:

Get-Command codex.cmd -ErrorAction SilentlyContinue
npm.cmd config get prefix

O segundo comando mostra a pasta global. Procure codex.cmd nela. Se existir, adicione essa pasta ao Path do usuário, sem apagar os itens existentes; salve e reabra o terminal. Se não existir, confira o log da instalação. Não acrescente o nome do arquivo ao Path.

Registre os números realmente mostrados na sua máquina. Na preparação deste material, foram observados Node.js v24.21.0, npm 11.19.0 e Codex CLI 0.158.0; isso descreve um ambiente, não uma exigência para procurar precisamente essas versões.

3. Fixar o que pode mudar durante o experimento

Antes de conectar, escolha um diretório pequeno e saiba de onde a CLI será iniciada:

$projectDir = Join-Path $env:USERPROFILE 'CodexProjects\crazyrouter-demo'
New-Item -ItemType Directory -Path $projectDir -Force | Out-Null
Set-Location -LiteralPath $projectDir
Get-Location

O último comando confirma a posição atual. O nome da pasta não configura o serviço; serve para identificar o exercício. Se já houver arquivos ali, veja o que pode ser alterado antes de pedir qualquer gravação. Uma página antiga pode passar em um teste manual e mascarar uma tentativa nova que não salvou nada.

Mantenha o mesmo PowerShell durante o roteiro. Variáveis comuns, como $projectDir, pertencem à sessão. O token também será colocado apenas no ambiente desse processo. Mudar de janela sem refazer a preparação acrescenta uma diferença que não tem relação com o modelo.

4. Consultar o catálogo com uma credencial própria

Crie um token no acesso Crazyrouter que você tem autorização para usar. A documentação de início orienta a localização da administração de tokens. Não use uma chave encontrada num exemplo público.

$crazySecret = Read-Host 'Crazyrouter API Key' -AsSecureString
$env:CRAZYROUTER_API_KEY = [System.Net.NetworkCredential]::new('', $crazySecret).Password
$crazySecret.Dispose()
Remove-Variable crazySecret
[bool]$env:CRAZYROUTER_API_KEY

A entrada protegida evita inserir o segredo como texto explícito da linha de comando. O True final informa somente que existe valor no processo. Não consulta o serviço e não diz se a chave expirou, se possui créditos ou se permite um modelo.

$crazyBase = 'https://api.crazyrouter.com/v1'
$crazyHeaders = @{ Authorization = "Bearer $env:CRAZYROUTER_API_KEY" }
$crazyModels = Invoke-RestMethod -Method Get -Uri "$crazyBase/models" -Headers $crazyHeaders
$crazyModels.data | Select-Object -ExpandProperty id
$crazyModel = Read-Host 'Model ID'

A resposta do catálogo fornece os identificadores para a escolha. Em Model ID, indique exatamente uma opção com permissão e comportamento apropriado ao uso de Responses pelo Codex. Não confunda o rótulo apresentado numa página com o campo id da API.

Guarde a identificação escolhida e preserve a URL usada na consulta. Se mudar o token depois, refaça também a criação de $crazyHeaders: esse objeto guarda o valor usado quando foi montado, não uma referência que se atualiza sozinha a cada alteração do ambiente.

5. Separar transporte HTTP de conclusão da geração

Antes de envolver a configuração interna da CLI, envie uma chamada pequena. Ela consome recursos reais da conta conforme as regras do serviço:

$crazyPayload = @{
    model = $crazyModel
    input = 'Reply with OK.'
    stream = $false
} | ConvertTo-Json -Depth 6

$crazyResponse = Invoke-RestMethod -Method Post -Uri "$crazyBase/responses" -Headers $crazyHeaders -ContentType 'application/json' -Body $crazyPayload
$crazyResponse | Select-Object id, status, error
$crazyResponse.output | ConvertTo-Json -Depth 8

O payload tem três escolhas explícitas: o modelo de $crazyModel, uma entrada curta e a resposta sem streaming. A rota é /v1/responses. A base já contém /v1, então não acrescente esse trecho novamente.

Observe o identificador, o estado, o erro e o conteúdo efetivo de output. Um retorno HTTP sem exceção pode conter uma falha de negócio. Também pode haver diferenças no envelope da resposta que precisam ser interpretadas pela documentação atual, em vez de tratadas como sucesso por falta de uma mensagem vermelha.

O teste tem uma limitação deliberada: stream = false não verifica o caminho de streaming do agente. Também não aciona ferramentas. Ele reduz o problema para uma geração simples, permitindo observar uma parte antes de montar o restante. Depois, a CLI ainda precisa ser exercitada.

6. Fazer a CLI usar a mesma combinação de parâmetros

Agora levamos a configuração testada para o cliente. O risco aqui é comparar duas coisas que parecem iguais, mas usam endereços ou modelos diferentes.

$codexConfigDir = if ($env:CODEX_HOME) { $env:CODEX_HOME } else { Join-Path $env:USERPROFILE '.codex' }
New-Item -ItemType Directory -Path $codexConfigDir -Force | Out-Null
$codexConfigFile = Join-Path $codexConfigDir 'config.toml'
if (Test-Path -LiteralPath $codexConfigFile) {
    $backupFile = $codexConfigFile + '.' + (Get-Date -Format 'yyyyMMdd-HHmmss') + '.bak'
    Copy-Item -LiteralPath $codexConfigFile -Destination $backupFile
}
notepad.exe $codexConfigFile

O script usa CODEX_HOME quando existe e, na ausência dele, a pasta .codex do usuário. Antes de editar um arquivo existente, cria uma cópia com horário. Integre as opções ao arquivo atual sem remover preferências que não fazem parte da conexão.

model = "MODEL_ID_FROM_YOUR_ACCOUNT"
model_provider = "crazyrouter"

[model_providers.crazyrouter]
name = "Crazyrouter"
base_url = "https://api.crazyrouter.com/v1"
env_key = "CRAZYROUTER_API_KEY"
wire_api = "responses"
requires_openai_auth = false

Troque MODEL_ID_FROM_YOUR_ACCOUNT pelo identificador selecionado. A variável do script e o campo no arquivo não são sincronizados. O mesmo vale para $crazyBase e base_url: confira os dois pares antes de comparar resultados.

Parte do arquivoDecisão que representa
modelIdentidade do modelo chamado
model_providerTabela de conexão selecionada
nameNome de apresentação, sem poder de roteamento
base_urlPrefixo real da API
env_keyNome da variável de onde vem o segredo
wire_apiForma de comunicação escolhida
requires_openai_authSe o cliente deve usar autenticação OpenAI

Para o método de variável próprio deste roteiro, a última opção é false. Com true, a autenticação OpenAI é usada e env_key é ignorado. Misturar exemplos de duas estratégias pode criar uma configuração aparentemente completa que lê a credencial errada.

As duas primeiras linhas são de nível superior. Coloque-as antes das tabelas entre colchetes; depois de uma tabela, um campo pode passar a pertencer a ela. Altere chaves que já existem em vez de duplicar o nome ou repetir a mesma tabela de provider.

Salve a extensão correta, config.toml, e confira que não virou um documento .txt. Não use a homepage no lugar da API nem coloque UTM no endpoint. Autenticação e provider pertencem ao escopo do usuário; um arquivo local no projeto não substitui indiscriminadamente essas decisões.

7. Observar o comportamento do cliente, não só do script

Set-Location -LiteralPath $projectDir
codex.cmd

Peça uma explicação de HTML em uma frase, sem uso de arquivos ou comandos. Veja se a sessão usa o provider e o modelo esperados. Uma sessão antiga pode carregar escolhas anteriores; depois de mudar a configuração, encerre e abra novamente a partir do PowerShell preparado.

Configuração de permissões do Codex no Windows

A captura está em chinês. Use-a para identificar o tipo de decisão, não a posição de uma opção ou a disponibilidade do modelo mostrado.

Confiança no diretório e sandbox são controles locais. Eles não são uma segunda cobrança de autenticação pela API. O caminho informado deve corresponder à pasta de exercício; caso contrário, ajuste o local antes de aceitar operações.

8. Usar as falhas como informação, sem inventar uma causa

Um diagnóstico começa pela diferença entre o que esperávamos e o que vimos. O código HTTP é uma pista, mas o corpo da resposta e a operação que o gerou continuam necessários.

Resultado observadoPergunta seguinteConclusão que ainda não cabe
Variável ausenteO processo de origem tinha o valor?A chave foi recusada pelo serviço
401A credencial é válida para esse destino?Todo o serviço está fora do ar
403Qual motivo de recusa foi informado?Alterar uma linha resolverá qualquer caso
404A rota e o modelo estão corretos?Reinstalar Node reparará a API
429Foi indicada frequência ou cota?Basta repetir mais rápido
Texto recebido, escrita bloqueadaQual limite local impediu a ação?A geração remota falhou

9. Produzir um arquivo que forneça uma evidência independente

Após uma resposta normal pela CLI, peça uma página local de acompanhamento do exercício. Ela não será um monitor da API; seus controles servem para verificar a interação gerada.

Crie apenas index.html na pasta atual, em português brasileiro.
Use o título “Meu teste local” e três caixas de seleção inicialmente desmarcadas.
Os rótulos são “Página aberta”, “Controles conferidos” e “Repetição feita”.
Mostre quantas caixas estão marcadas, atualizando o número ao marcar ou desmarcar.
Esclareça na página que essas marcações são manuais, não testes automáticos de API.
Inclua CSS e JavaScript no mesmo arquivo, sem dependências externas ou instalação.
Não faça chamadas de rede nem altere outros arquivos.
Informe o caminho efetivamente salvo; se a escrita for recusada, reporte a limitação.

Saia do diálogo usando /quit ou a opção disponível. Confira o arquivo e, somente depois de True, abra-o:

Test-Path .\index.html
Start-Process .\index.html

Marque uma caixa, depois outra, desmarque a primeira e observe se a contagem acompanha o estado real. Ao recarregar, as caixas devem voltar ao estado inicial, já que não foi solicitada persistência. Compare também os textos e a existência do aviso sobre marcação manual.

Se houver erro, reproduza a sequência e peça a correção nesse arquivo. Não basta o agente afirmar que testou: abra a versão salva e repita. Caso haja arquivos homônimos, confira a URL local no navegador para não avaliar uma cópia antiga.

10. Dúvidas práticas ao repetir em outra máquina

A instalação precisa usar a mesma versão da captura?

Não por causa da captura. Confira os requisitos atuais e registre a versão usada. A imagem documenta um formato de tela, não impõe um número que permanecerá obrigatório.

É preciso mudar a política de scripts?

Comece pelos iniciadores .cmd apresentados. Se houver necessidade adicional de scripts, trate a política especificamente, respeitando a administração da máquina. Não é uma etapa geral de liberação irrestrita.

Qual registry está sendo usado no download?

npm.cmd config get registry

Leia o resultado antes de alterar uma origem que pode ser intencional. O download do pacote é independente da URL que receberá a geração. Não desligue a validação de certificados como correção genérica.

A chave foi salva no TOML?

[bool]$env:CRAZYROUTER_API_KEY

Não: env_key contém o nome, e a consulta acima mostra apenas a presença do valor no processo. Preparar outra janela ou fechar a original muda essa condição.

Posso colar comandos de CMD no mesmo lugar?

Não assuma equivalência. Aqui usamos $env:USERPROFILE e Set-Location. A expansão por %USERPROFILE% e cd /d pertencem a outra sintaxe. Preserve também as aspas em caminhos com espaços.

Como atualizar e identificar duas instalações?

npm.cmd install -g @openai/codex@latest
codex.cmd --version
Get-Command codex* -All

Consulte as localizações retornadas. Uma atualização pode atingir um prefixo enquanto o Windows encontra primeiro outro iniciador. Resolver isso exige saber qual arquivo está rodando.

Um endpoint Chat Completions já comprova uso no Codex?

Não. Protocolo, streaming e ferramentas fazem parte do comportamento necessário. Este roteiro usa Responses e depois uma tarefa na CLI justamente para não substituir o segundo teste pelo primeiro.

Quanto do erro posso compartilhar?

O suficiente para reproduzir a operação: comando, versão, modelo, horário, resposta sem segredos e último resultado confirmado. Evite tokens, códigos de dispositivo e dados particulares do projeto. Uma identificação de resposta costuma ser mais útil do que o diretório inteiro de configuração.

11. Registrar o resultado e os limites

Na preparação do material, a instalação local foi verificada, mas não havia uma credencial Crazyrouter válida para concluir a integração. Portanto, este roteiro não apresenta um response ID, um modelo confirmado ou uma tarefa remota bem-sucedida. Os testes de API e de criação da página acima são etapas para executar com sua conta, não resultados já obtidos.

Ao reproduzir, anote versão, model ID, método e endpoint, horário, status HTTP, response ID e estado final quando disponíveis. Registre também o texto retornado e se o arquivo foi realmente salvo e conferido. O HTTP 200 sozinho não comprova conclusão; omita credenciais do registro. Se catálogo e geração tiverem resultados diferentes, relate cada um separadamente.

Para repetir após uma mudança, recupere a anotação de versão e seleção. Se o modelo mudou, confira seu ID e refaça a chamada pequena. Se a URL mudou, mantenha script e configuração consistentes. Se só mudou de projeto, revise a pasta e suas permissões, sem reinstalar tudo por reflexo.

Consulte também a documentação do Codex para as opções da versão em uso.

Carregando publicação patrocinada...