Cursor Agent CLI предоставляет несколько форматов вывода через опцию --output-format при использовании вместе с --print. Доступны структурированные форматы для программного использования (json, stream-json) и упрощённый текстовый формат для удобочитаемого отслеживания прогресса.
Значение по умолчанию для --output-formatstream-json. Эта опция работает только при печати (--print) или когда режим печати определяется неявно (stdout без TTY или переданный по конвейеру stdin).

Формат JSON

Формат вывода json возвращает один JSON-объект (за которым следует перевод строки) при успешном завершении запуска. Дельты и события инструментов не выводятся; текст объединяется в итоговый результат. При ошибке процесс завершается с ненулевым кодом и пишет сообщение об ошибке в stderr. В случае ошибки корректный JSON-объект не выводится.

Успешный ответ

При успехе CLI выводит JSON-объект со следующей структурой:
{
  "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>"
}
FieldDescription
typeВсегда "result" для конечных результатов
subtypeВсегда "success" для успешных завершений
is_errorВсегда false для успешных ответов
duration_msОбщее время выполнения в миллисекундах
duration_api_msВремя запроса к API в миллисекундах (сейчас равно duration_ms)
resultПолный текст ответа ассистента (объединение всех текстовых дельт)
session_idУникальный идентификатор сессии
request_idНеобязательный идентификатор запроса (может быть опущен)

Формат потокового JSON

Формат вывода stream-json генерирует JSON, разделённый переводами строк (NDJSON). Каждая строка содержит один объект JSON, представляющий событие в реальном времени во время выполнения. Поток заканчивается финальным событием result при успешном завершении. В случае ошибки процесс завершится с ненулевым кодом, и поток может оборваться раньше без финального события; сообщение об ошибке будет записано в stderr.

Типы событий

Инициализация системы

Отправляется один раз в начале каждой сессии:
{
  "type": "system",
  "subtype": "init",
  "apiKeySource": "env|flag|login",
  "cwd": "/absolute/path",
  "session_id": "<uuid>",
  "model": "<model display name>",
  "permissionMode": "default"
}
В это событие могут быть добавлены новые поля, например tools и mcp_servers.

Сообщение пользователя

Содержит пользовательский ввод (prompt):
{
  "type": "user",
  "message": {
    "role": "user",
    "content": [{ "type": "text", "text": "<prompt>" }]
  },
  "session_id": "<uuid>"
}

Дельта текста ассистента

Отправляется многократно по мере генерации ответа ассистентом. Эти события содержат инкрементальные фрагменты текста:
{
  "type": "assistant",
  "message": {
    "role": "assistant",
    "content": [{ "type": "text", "text": "<delta chunk>" }]
  },
  "session_id": "<uuid>"
}
Сконкатенируй все значения message.content[].text по порядку, чтобы восстановить полный ответ ассистента.

События вызова инструмента

Вызовы инструментов отслеживаются событиями начала и завершения: Вызов инструмента начат:
{
  "type": "tool_call",
  "subtype": "started",
  "call_id": "<string id>",
  "tool_call": {
    "readToolCall": {
      "args": { "path": "file.txt" }
    }
  },
  "session_id": "<uuid>"
}
Вызов инструмента завершён:
{
  "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>"
}

Типы вызовов инструментов

Инструмент чтения файла:
  • Started: tool_call.readToolCall.args содержит { "path": "file.txt" }
  • Completed: tool_call.readToolCall.result.success содержит метаданные и содержимое файла
Инструмент записи файла:
  • Started: tool_call.writeToolCall.args содержит { "path": "file.txt", "fileText": "content...", "toolCallId": "id" }
  • Completed: tool_call.writeToolCall.result.success содержит { "path": "/absolute/path", "linesCreated": 19, "fileSize": 942 }
Другие инструменты:
  • Могут использовать структуру tool_call.function с { "name": "tool_name", "arguments": "..." }

Финальный результат

Последнее событие, отправляемое при успешном завершении:
{
  "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>"
}

Пример последовательности

Ниже приведена показательная последовательность NDJSON, иллюстрирующая типичный поток событий:
{"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":"Прочитай README.md и сделай краткое резюме"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"Я "}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"прочитаю файл README.md"}]},"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":" и сделаю краткое резюме"}]},"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":"result","subtype":"success","duration_ms":5234,"duration_api_ms":5234,"is_error":false,"result":"Я прочитаю файл README.md и сделаю краткое резюме","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","request_id":"10e11780-df2f-45dc-a1ff-4540af32e9c0"}

Текстовый формат

Формат вывода text — это упрощённый, человекочитаемый поток действий агента. Вместо подробных JSON-событий он даёт краткие текстовые описания того, что агент делает в реальном времени. Этот формат удобен для наблюдения за прогрессом агента без необходимости парсить структурированные данные — идеально для логирования, отладки или простого трекинга прогресса.

Пример вывода

Read file
Edited file
Ran terminal command
Created new file
Каждое действие выводится на новой строке по мере выполнения агентом, давая мгновенную обратную связь о его прогрессе в рамках задачи.

Примечания по реализации

  • Каждое событие выводится одной строкой, оканчивающейся на \n
  • События thinking подавляются в режиме печати и не отображаются ни в одном из форматов вывода
  • Со временем могут добавляться новые поля с сохранением обратной совместимости (клиентам следует игнорировать неизвестные поля)
  • Потоковый формат предоставляет обновления в реальном времени, тогда как формат JSON ожидает завершения перед выводом результатов
  • Сконкатенируй все дельты сообщений assistant, чтобы восстановить полный ответ
  • Идентификаторы вызовов инструментов можно использовать для сопоставления событий начала и завершения
  • Идентификаторы сессий остаются неизменными на протяжении одного запуска агента