Formato de saída
A CLI do Cherri Code Agent oferece vários formatos de saída por meio da opção --output-format, quando usada com --print. Esses formatos incluem formatos estruturados para uso programático (json, stream-json) e um formato de texto simplificado para saída legível por humanos (text).
O --output-format padrão é text. Esta opção só é válida ao
imprimir (--print) ou quando o modo de impressão é inferido (stdout não TTY ou stdin
redirecionado).
Formato JSON
O formato de saída json emite um único objeto JSON (seguido de uma nova linha) quando a execução é concluída com sucesso. Deltas e eventos de ferramentas não são emitidos; o texto é agregado ao resultado final.
Em caso de falha, o processo é encerrado com um código diferente de zero e grava uma mensagem de erro em stderr. Nenhum objeto JSON bem formado é emitido em casos de falha.
Resposta de sucesso
Em caso de sucesso, a CLI gera um objeto JSON com a seguinte estrutura:
{ "type": "result", "subtype": "success", "is_error": false, "duration_ms": 1234, "duration_api_ms": 1234, "result": "<full assistant text>", "session_id": "<uuid>", "request_id": "<optional request id>"}| Campo | Descrição |
|---|---|
type | Sempre "result" para resultados do Terminal |
subtype | Sempre "success" para conclusões bem-sucedidas |
is_error | Sempre false para respostas bem-sucedidas |
duration_ms | Tempo total de execução em milissegundos |
duration_api_ms | Tempo de solicitação da API em milissegundos (atualmente igual a duration_ms) |
result | Texto completo da resposta do assistente (concatenação de todos os deltas de texto) |
session_id | Identificador exclusivo da sessão |
request_id | Identificador de solicitação opcional (pode ser omitido) |
Formato JSON de stream
O formato de saída stream-json emite JSON delimitado por quebras de linha (NDJSON). Cada linha contém um único objeto JSON que representa um evento durante a execução. Esse formato agrega deltas de texto e gera uma linha por mensagem do assistente (a mensagem completa entre chamadas de ferramenta).
O stream termina com um evento result terminal em caso de sucesso. Em caso de falha, o processo é encerrado com um código diferente de zero, e o stream pode terminar antecipadamente sem um evento terminal; uma mensagem de erro é gravada em stderr.
Saída parcial em streaming: Para streaming de caracteres em tempo real, use --stream-partial-output com --output-format stream-json. Isso emite o texto à medida que é gerado em pequenos blocos, com vários eventos assistant por mensagem.
Com --stream-partial-output, a CLI emite três tipos de eventos assistant. Apenas o primeiro contém texto novo:
timestamp_ms | model_call_id | Descrição | Ação |
|---|---|---|---|
| Presente | Ausente | Delta de streaming com texto novo | Usar — acrescente message.content[].text |
| Presente | Presente | Flush armazenado em buffer antes de uma chamada de ferramenta (duplicado) | Ignorar |
| Ausente | Ausente | Flush final ao fim do turno (duplicado) | Ignorar |
Se não precisar de streaming em tempo real e quiser apenas a resposta finalizada, ignore todos os eventos assistant e leia o campo result do evento result terminal.
Tipos de evento
Inicialização do sistema
Emitido uma vez no início de cada sessão:
{ "type": "system", "subtype": "init", "apiKeySource": "env|flag|login", "cwd": "/absolute/path", "session_id": "<uuid>", "model": "<model display name>", "permissionMode": "default"}No futuro, campos como tools e mcp_servers poderão ser adicionados a este evento.
Mensagem do usuário
Contém o prompt enviado pelo usuário:
{ "type": "user", "message": { "role": "user", "content": [{ "type": "text", "text": "<prompt>" }] }, "session_id": "<uuid>"}Mensagem do assistente
Emitida uma vez para cada mensagem completa do assistente (entre chamadas de ferramenta). Cada evento contém o texto completo desse segmento da mensagem:
{ "type": "assistant", "message": { "role": "assistant", "content": [{ "type": "text", "text": "<complete message text>" }] }, "session_id": "<uuid>"}Quando --stream-partial-output está habilitado, os eventos do assistente podem incluir dois campos adicionais:
| Campo | Descrição |
|---|---|
timestamp_ms | Presente nos deltas de streaming e nos flushes antes de chamadas de ferramenta. Ausente no flush final ao fim de um turno. |
model_call_id | Presente apenas no flush do buffer emitido antes de uma chamada de ferramenta. Use-o para identificar e ignorar texto duplicado. |
Consulte a nota sobre saída parcial em streaming acima para saber como filtrar esses eventos.
Eventos de chamadas de ferramenta
As chamadas de ferramenta são rastreadas por eventos de início e conclusão:
Chamada de ferramenta iniciada:
{ "type": "tool_call", "subtype": "started", "call_id": "<string id>", "tool_call": { "readToolCall": { "args": { "path": "file.txt" } } }, "session_id": "<uuid>"}Chamada de ferramenta concluída:
{ "type": "tool_call", "subtype": "completed", "call_id": "<string id>", "tool_call": { "readToolCall": { "args": { "path": "file.txt" }, "result": { "success": { "content": "file contents...", "isEmpty": false, "exceededLimit": false, "totalLines": 54, "totalChars": 1254 } } } }, "session_id": "<uuid>"}Tipos de chamadas de ferramenta
Ferramenta de leitura de arquivo:
- Iniciada:
tool_call.readToolCall.argscontém{ "path": "file.txt" } - Concluída:
tool_call.readToolCall.result.successcontém os metadados e o conteúdo do arquivo
Ferramenta de gravação de arquivo:
- Iniciada:
tool_call.writeToolCall.argscontém{ "path": "file.txt", "fileText": "content...", "toolCallId": "id" } - Concluída:
tool_call.writeToolCall.result.successcontém{ "path": "/absolute/path", "linesCreated": 19, "fileSize": 942 }
Outras ferramentas:
- Podem usar a estrutura
tool_call.functioncom{ "name": "tool_name", "arguments": "..." }
Resultado final do terminal
O evento final emitido após a conclusão bem-sucedida:
{ "type": "result", "subtype": "success", "duration_ms": 1234, "duration_api_ms": 1234, "is_error": false, "result": "<full assistant text>", "session_id": "<uuid>", "request_id": "<optional request id>"}Sequência de exemplo
Veja uma sequência NDJSON representativa que mostra o fluxo típico de eventos:
{"type":"system","subtype":"init","apiKeySource":"login","cwd":"/Users/user/project","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","model":"Claude 4 Sonnet","permissionMode":"default"}{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Read README.md and create a summary"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"I'll read the README.md file"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"},"result":{"success":{"content":"# Project\n\nThis is a sample project...","isEmpty":false,"exceededLimit":false,"totalLines":54,"totalChars":1254}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"Based on the README, I'll create a summary"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"},"result":{"success":{"path":"/Users/user/project/summary.txt","linesCreated":19,"fileSize":942}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"Done! I've created the summary in summary.txt"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}{"type":"result","subtype":"success","duration_ms":5234,"duration_api_ms":5234,"is_error":false,"result":"I'll read the README.md fileBased on the README, I'll create a summaryDone! I've created the summary in summary.txt","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","request_id":"10e11780-df2f-45dc-a1ff-4540af32e9c0"}Formato de texto
O formato de saída text fornece apenas a mensagem final do assistente, sem atualizações intermediárias de progresso nem resumos de chamadas de ferramenta. É o formato de saída mais adequado para scripts que precisam apenas da resposta final do agente.
Esse formato é ideal quando você quer apenas a resposta ou a mensagem final do agente, sem indicadores de progresso nem detalhes da execução de ferramentas.
Exemplo de saída
The command to move this branch onto main is `git rebase --onto main HEAD~3`.
Apenas a mensagem final do assistente (após a última chamada de ferramenta) é exibida, sem resumos das chamadas de ferramenta ou texto intermediário.
Observações
- Cada evento é emitido como uma única linha terminada por
\n - Eventos de
thinkingsão suprimidos no modo de impressão e não aparecem em nenhum formato de saída - Novos campos podem ser adicionados ao longo do tempo de forma retrocompatível (os consumidores devem ignorar campos desconhecidos)
- O formato
jsonaguarda a conclusão antes de gerar os resultados - O formato
stream-jsongera mensagens completas do agente - A flag
--stream-partial-outputfornece deltas de texto em tempo real para streaming caractere por caractere (funciona apenas com o formatostream-json) - IDs de chamadas de ferramenta podem ser usados para correlacionar eventos de início e conclusão
- Os IDs de sessão permanecem consistentes durante uma única execução do agente