Esta página é uma tradução da documentação em inglês. Comandos, identificadores e exemplos permanecem iguais. Runtime 7.24.4 · SDK 2.6.7. Original em inglês
CLI sem interface (ax-code run)
Status: Ativo Escopo: estado atual Última revisão: 2026-09-22 Responsável: mantenedores do runtime do AX Code
ax-code run é o ponto de entrada de execução única e não interativo para agentes de programação com IA e para scripts. Ele envia um único prompt, imprime a resposta final do assistente e encerra — sem interface de terminal e sem prompts interativos. Este guia cobre a superfície de opções, o contrato de saída, os códigos de saída e receitas para copiar em scripts e em CI.
Invocar uma execução
Há quatro maneiras de fornecer o prompt. Elas se combinam nesta ordem: --prompt-file, depois -p/--prompt, depois a mensagem posicional e, por fim, a entrada padrão canalizada.
# Positional after -- (safest; flags after -- are never consumed as options)
ax-code run --model qwen -- "Review this change"
# Explicit prompt flag
ax-code run --model qwen --prompt "Review this change"
ax-code run --model qwen -p "Review this change"
# Prompt read from a file (not an attachment)
ax-code run --model qwen --prompt-file ./prompt.txt
# Piped stdin (used as the prompt when no positional/--prompt is given)
printf 'Review this change' | ax-code run --model qwen
Quando a entrada padrão não é um TTY, o conteúdo dela é acrescentado ao prompt composto; portanto, ela é o prompt inteiro quando nada mais é fornecido. O leitor da entrada padrão espera uma janela de 300 ms de silêncio antes de desistir de um pipe aberto, então escreva o prompt logo e feche a entrada padrão — ou use --prompt-file para prompts grandes ou produzidos aos poucos. --prompt-file - lê o prompt da entrada padrão de forma explícita (erro de uso quando a entrada padrão é um TTY); o acréscimo implícito da entrada canalizada nunca ocorre uma segunda vez nessa invocação.
-f/--file anexa arquivos à mensagem e nunca substitui o prompt; pode ser repetido:
ax-code run --model qwen --file README.md --file src/main.ts -- "Summarize these"
Um anexo precisa estar dentro do diretório do projeto: o servidor recusa anexos fora dele, quaisquer que sejam as regras de permissão, e a CLI os rejeita de imediato com um erro de uso. Copie o arquivo para o projeto ou passe o conteúdo com --prompt-file. --add-dir concede às ferramentas acesso a diretórios extras, mas não altera essa regra.
Os tipos MIME dos anexos são inferidos pela extensão: png, jpg, jpeg, gif e webp correspondem ao tipo image/*, e pdf a application/pdf, de modo que anexos binários chegam ao servidor com o tipo real, e não como text/plain. Qualquer outro arquivo — inclusive um sem extensão reconhecida — é enviado como text/plain, e um anexo de diretório é classificado como application/x-directory.
Direcionar a execução
Três flags direcionam uma execução sem alterar o texto do prompt. Todas existem apenas na forma longa e em kebab-case.
--append-system-prompt TEXT / --append-system-prompt-file PATH
Acrescenta texto extra ao prompt de sistema, depois dos prompts de sistema do agente e do ambiente — acrescenta e nunca substitui o prompt de sistema integrado. As duas formas se excluem. A variante em arquivo é conveniente para instruções mais longas; exatamente uma quebra de linha final é removida, e um texto vazio (ou um arquivo ilegível) é um erro de uso, antes de qualquer envio.
ax-code run --model qwen --append-system-prompt "Answer in English only" -- "Review this change"
--disallowed-tools a,b
Desativa ferramentas pelo ID durante a execução (separadas por vírgula e repetível). A opção passa pelos dois mecanismos do servidor: regras de negação na sessão criada cobrem execuções novas, e um mapa de ferramentas por requisição também cobre execuções retomadas de --session/--continue. Negar bash também nega o comando da ferramenta monitor, que roda pelo mesmo lançador de shell; uma chamada que esbarra em uma regra de negação falha como erro de ferramenta e conta como negação para o status de execução bloqueada. IDs desconhecidos não são um erro — os IDs de ferramentas MCP são dinâmicos — mas, no formato padrão, cada ID fora do conjunto de ferramentas integradas imprime um aviso em stderr (suprimido por --quiet).
ax-code run --model qwen --disallowed-tools bash,write -- "Audit this module without mutating anything"
--add-dir PATH
Concede ao agente acesso a um diretório adicional (repetível): uma regra de permissão allow de external_directory para <resolved-path>/* é adicionada às regras de permissão da sessão nova, cobrindo o diretório e tudo o que está abaixo dele. Cada caminho precisa existir e ser um diretório (resolvido em relação ao cwd de quem chama, como --file). A regra é aplicada quando a sessão é criada; portanto, sob --session/--continue ela não pode surtir efeito — a CLI imprime --add-dir applies only to new sessions em stderr e continua. Isso não muda o confinamento de --file: os anexos ainda precisam estar dentro do diretório do projeto. A regra cobre as ferramentas de arquivo (read, glob, grep, list, edit, write); um comando de shell que alcança o diretório por um caminho dinâmico ainda dispara o prompt de acesso a caminho, exclusivo do modo interativo, e uma execução sem interface o rejeita automaticamente. Prefira as ferramentas de arquivo ou passe o conteúdo do arquivo de forma explícita.
ax-code run --model qwen --add-dir ../design-docs -- "Read ../design-docs/spec.md and summarize it"
Escolher um modelo
Liste os IDs utilizáveis com ax-code models. Passe o valor resultante de provider/model para --model (-m):
ax-code models # one "provider/model" ID per line
ax-code models --json # one JSON document
ax-code models --json imprime um único documento na forma {"models":[{"id":"provider/model","provider":"...","model":"...","connected":true}]}.
Os nomes de família deepseek, glm e qwen resolvem para os padrões Flash correspondentes, então ax-code run --model qwen -- "..." funciona sem escrever um ID provider/model completo. Omitir --model usa o padrão configurado; o agente e o modelo efetivos são impressos em stderr como > Agent · model.
Formatos de saída
--format aceita default (o padrão), json, jsonl ou ndjson (jsonl e ndjson são aliases de json).
Padrão (texto)
O formato padrão imprime apenas o texto final do assistente em stdout. Todo o progresso, a atividade das ferramentas e os diagnósticos vão para stderr, começando por um cabeçalho > Agent · model · ses_... que inclui o ID da sessão, para que um chamador de vários turnos possa retomar com --session sem mudar para --format json (--quiet suprime o cabeçalho). As cores ANSI ficam desativadas quando stderr não é um TTY ou quando NO_COLOR está definido (com qualquer valor), de modo que uma execução canalizada nunca emite códigos de escape.
Fluxo JSON (--format json)
--format json imprime um fluxo de eventos JSON delimitado por quebras de linha (NDJSON) — um objeto JSON por linha, e não um único documento JSON. Os eventos incluem step_start, text, tool_use, reasoning (somente com --thinking), permission_denied, error e step_finish. O fluxo sempre termina com exatamente uma linha result:
{
"type": "result",
"timestamp": 1727000000000,
"sessionID": "ses_...",
"status": "completed",
"text": "...",
"permissionDenials": 0,
"usage": { "input": 1200, "output": 80, "reasoning": 0, "cacheRead": 0, "cacheWrite": 0 }
}
status é completed, blocked ou error. usage traz apenas contagens de tokens — input, output, reasoning, cacheRead e cacheWrite — e é omitido por completo quando as contagens são desconhecidas; não há campo de custo. Quando uma execução falha antes do envio (flag incorreta, modelo desconhecido etc.), o formato de fluxo imprime uma linha antes de encerrar:
{ "type": "error", "error": { "code": "usage", "message": "..." } }
error.code é um destes valores:
| Código | Quando ocorre |
|---|---|
usage |
Flags incorretas ou contraditórias, um prompt ausente ou um --output-schema ilegível. |
provider |
ID de provedor desconhecido, ou um provedor conhecido que não está conectado. |
model |
ID de modelo desconhecido em um provedor conhecido, ou um valor de --model impossível de analisar. |
session |
Um ID --session ausente ou rejeitado (pré-verificado antes de a execução ser enviada). |
attach |
Não foi possível alcançar o servidor conectado, as credenciais foram rejeitadas (401/403) ou nenhum runtime administrado está em execução para --runtime. |
internal |
Qualquer rejeição que não tenha outro tratamento. |
Códigos de saída
| Código | Significado |
|---|---|
| 0 | Concluída. |
| 1 | Erro de uso, erro de provedor ou de modelo, erro de fluxo ou falha de validação de --output-schema. |
| 3 | Bloqueada — ao menos uma negação de permissão e nenhuma chamada bem-sucedida de ferramenta que altera dados (result.status é blocked). |
| 124 | Tempo esgotado (--timeout decorrido; result.status é timeout). |
| 130 | Cancelada por SIGINT ou SIGTERM (sessão abortada no servidor; result.status é cancelled). |
Sandbox
--sandbox read-only|workspace-write|full-access seleciona o modo de isolamento (padrão full-access). Em execuções sem interface, os pedidos de permissão são rejeitados automaticamente e relatados como eventos permission_denied; assim, uma execução que precise de uma escrita não autorizada relata blocked e sai com o código 3. Isso também cobre subagentes: pedidos surgidos em sessões filhas criadas pela ferramenta task são rejeitados do mesmo modo, e os eventos permission_denied delas trazem o sessionID da sessão filha. Chamadas de ferramenta recusadas por uma regra de negação de permissão (por exemplo, a partir de --disallowed-tools) ou pelo sandbox somente leitura também contam como negações. As ferramentas interativas question e plan_exit ficam sempre desativadas em uma execução sem interface, inclusive em sessões retomadas. Use read-only somente quando nenhuma alteração for esperada; workspace-write mantém as escritas dentro do projeto.
Sob --attach, a flag também é enviada como política de isolamento por requisição em cada corpo de prompt; o servidor aplica o mais restrito entre o próprio modo e a política pedida, então só pode tornar o isolamento mais restrito. A mesma política por requisição é enviada para servidores de propriedade local, para manter o comportamento uniforme.
Saída estruturada
-o/--output-file <path> grava o texto final do assistente em um arquivo. --output-schema <file> valida o texto final como JSON em relação a um arquivo de JSON Schema; uma divergência é relatada como um evento error com result.status error e a execução termina com o código 1. O arquivo de esquema é pré-verificado antes de o modelo executar — um esquema ilegível, impossível de analisar ou que não seja um objeto é um erro de uso, antes de qualquer envio. Em caso de sucesso, o esquema analisado também é enviado ao modelo como o formato de saída json_schema da execução, e o servidor tenta outra vez uma resposta inválida até duas vezes, antes de a validação final da própria CLI servir de última barreira. A saída final é o objeto estruturado serializado (uma linha de JSON): é o que stdout, --output-file e result.text carregam:
ax-code run --model qwen --output-schema ./answer.schema.json -- "Return a JSON object with a summary field"
Sessões e retomada
-c/--continue— continua a sessão mais recente.-s/--session <id>— continua uma sessão específica pelo ID.--fork— faz um fork da sessão antes de continuar (exige--continueou--session).--show-history— imprime o histórico visível da sessão ao retomar (exige--continueou--session).--attach <url>— conecta-se a um servidor que já está em execução, em vez de iniciar um; combine com--dirpara apontar um diretório de projeto nesse servidor. Um servidor protegido comAX_CODE_SERVER_PASSWORDrecebe--password(ou a mesma variável do lado de quem chama); um runtime administrado obtém o token emAX_CODE_RUNTIME_TOKEN.--runtime— conecta-se ao runtime administrado do diretório do projeto (--dirou o cwd de quem chama) iniciado comax-code runtime start, resolvendo a URL e o token a partir do registro privado do runtime. Sem um runtime em execução, a chamada falha antes de qualquer requisição, com o código de erroattache uma mensagem que indica o comando de início.--runtimee--attachse excluem mutuamente.
Receitas
Execução única
ax-code run --model qwen -- "Fix the failing test in src/parser.ts"
Limitar uma execução com tempo máximo
ax-code run --timeout 120 --model qwen -- "Fix the failing test in src/parser.ts"
--timeout <seconds> aborta a execução no servidor e sai com 124 (result.status é timeout) quando ela ultrapassa o limite, para que um agente travado não mantenha um job de CI aberto por tempo indefinido. O limite cobre a invocação inteira — entra em vigor antes da primeira chamada ao servidor, então até um host --attach que engole a conexão, ou uma inicialização travada, termina no prazo (nesse caso inicial, a linha de resultado traz um sessionID vazio).
Esperar subagentes em segundo plano
ax-code run --await-background 300 --timeout 360 --model qwen -- \
"Delegate the independent checks, then integrate their results"
--await-background <seconds> mantém esta invocação aberta para os filhos task em segundo plano criados pela sessão e para os turnos seguintes do processo pai disparados pelos resultados deles. A opção é explícita e tem teto de 3600 segundos. A resposta final e o JSON result.text vêm do último turno concluído do pai. Se os filhos ou o acompanhamento não se estabilizarem dentro do limite de espera, a execução relata um erro e sai com 1. --timeout continua sendo o limite geral. Tarefas agendadas do projeto rodam em sessões separadas e não fazem parte desta espera. Este comando de execução única não assume agendamentos do projeto que já estejam vencidos; um backend persistente é quem despacha essas tarefas.
Analisar o fluxo JSON
result=$(ax-code run --format json --model qwen -- "..." | tail -n 1)
echo "$result" | jq -r '.status'
echo "$result" | jq -r '.text'
A linha result é sempre a última, então tail -n 1 a isola mesmo quando o fluxo termina antes do esperado.
Revisão somente leitura
ax-code run --sandbox read-only --model qwen -- "Review this diff for bugs"
Saída JSON estruturada com um esquema
cat > answer.schema.json <<'JSON'
{"type":"object","properties":{"summary":{"type":"string"}},"required":["summary"]}
JSON
ax-code run --model qwen --output-schema answer.schema.json --output-file answer.json \
-- "Return JSON with a one-sentence summary"
Retomar uma sessão
# Start a session and note the sessionID from the result line
ax-code run --format json --model qwen -- "Draft the outline" | tail -n 1
# Continue it
ax-code run --model qwen --session ses_... -- "Now write section 2"
Anexar um arquivo
ax-code run --model qwen --file docs/spec.md -- "Summarize the attached spec"
Comandos legíveis por máquina
ax-code run --format json emite um fluxo de eventos delimitado por quebras de linha (veja fluxo JSON); é a única superfície de --json que transmite em fluxo. Todo outro comando somente leitura que tenha uma flag --json segue um contrato mais estrito: em caso de sucesso, grava exatamente um documento JSON em stdout; em caso de falha, stdout permanece vazio, um único documento {"error":{"code","message"}} vai para stderr e o código de saída é 1.
Comandos com --json:
ax-code session list --jsonax-code models --jsonax-code providers list --jsonax-code agent list --jsonax-code mcp list --jsonax-code mcp auth list --jsonax-code stats --jsonax-code context --jsonax-code memory status --jsonax-code memory list --jsonax-code task list --json/ax-code task show <taskID> --jsonax-code schedule list --json/ax-code schedule show <taskID> --jsonax-code runtime list --json/ax-code runtime status --jsonax-code doctor --jsonax-code risk <sessionID> --jsonax-code wiki status --jsonax-code workflow list --json/ax-code workflow status <runID> --json
ax-code runtime status imprime o documento JSON sem condição — a flag --json é aceita por consistência, mas a ação de status sempre emite JSON em stdout.
Chamar o ax-code a partir de outro agente
Ao encapsular ax-code run em um script, em um passo de CI ou em outro agente:
- Use
--format jsone leia a última linha — o registroresulté sempre a linha final, mesmo quando o fluxo termina antes do esperado. - Capture
sessionIDdessa linha de resultado para qualquer turno seguinte; devolva esse valor com--session. - Nunca use
--continuea partir de chamadores simultâneos — ele retoma a sessão mais recente, o que cria uma condição de corrida quando vários chamadores estão ativos; passe um ID--sessionexplícito. - Passe um
--modelexplícito, para que a execução não dependa de um padrão configurado que pode mudar. - Sempre passe
--timeout, para que um agente travado não deixe quem chama preso. - Feche a entrada padrão, ou use
--prompt-file/--prompt-file -: o leitor implícito de pipe desiste após uma janela de 300 ms de silêncio e trunca um pipe lento sem aviso. - Defina
NO_COLOR=1, ou confie na detecção de ausência de TTY, para que uma execução canalizada nunca emita códigos de escape ANSI. - Execute a partir do diretório do projeto: um diretório pessoal ou um diretório pai de vários repositórios é recusado no modo não interativo. Defina
AX_CODE_ALLOW_BROAD_DIR=1para sobrepor essa proteção. - Falhas de uso não imprimem nada em stdout (a ajuda e o erro de uma linha vão para stderr), então um comando digitado de forma incorreta deixa stdout vazio e sai com 1. Sob
--format json, a falha de uso também é gravada como uma linhaerrorem stdout. - Um sinal que chega enquanto o processo ainda está carregando, antes de o comando
runestar ativo, encerra o processo com saída 130 e sem texto; quando o comando já está ativo, SIGINT e SIGTERM sempre produzem a única linha finalresultcom statuscancelled.