Прочитать выполнение и его трассировку

Читайте статус выполнения, пока оно идёт, и его трассировку по узлам, когда оно продвинулось.

Выполнение — это один запрос, пройденный через флоу. Его открывает запрос к флоу — POST /v1/operations/execute, — и оно сохраняет версию флоу, на которой началось. Операции этой страницы его читают: его статус, которого ждёт клиент, и его трассировку по узлам. Консоль показывает ту же трассировку на странице выполнения, которую открывают с вкладки Выполнения флоу.

Статус и трассировка

  • GET /v1/executions/{id}/status отвечает полями ответа на запрос: status, output, error_code, error_message, cost, cache, waiting_on и trace_url. Пока выполнение не закончилось, он добавляет retry_after_seconds — паузу, которую Slen советует сделать перед следующим чтением. Читайте его, чтобы дождаться выполнения.

  • GET /v1/executions/{id} отвечает трассировкой: выполнение с его флоу — flow_name — это имя флоу, каким оно стало сейчас, — его версией, временем начала и конца и двумя списками — nodes и events.

Обе операции требуют разрешения read. Ключ читает выполнения своего проекта. Выполнение другого проекта или несуществующее отвечает 404 с кодом flow_execution_not_found. Выполнения одного флоу перечислены в статье Флоу.

Что содержит трассировка

  • В nodes есть строка для каждого узла, который выполнение прошло: порт, через который он вышел, в output_port, его стоимость, сколько он занял. Узел записывается, когда он закончен, поэтому узла, у которого выполнение ждёт, там ещё нет. У узла, который завершает путь, — Вернуть ответ, Отклонить запрос — порта нет, и output_port равен null.

  • Строка ещё называет узел и то, что он решил. label — имя, которое автор дал узлу в этой версии, null, если его нет. code — собственное решение узла — отказ Проверка бюджета, код Отклонить запрос, approved у согласования — и может отличаться от error_code выполнения: тот код получил вызывающий. model — модель последней попытки узла AI-модель или модель, для которой Проверка бюджета прочитал бюджет узла.

  • Вызов модели перечисляет свои попытки в строке своего узла AI-модель: одна попытка на каждое подключение провайдера, которое он пробовал, с подключением, пулом, отправленной моделью (model_code) и тем, чем она закончилась.

  • events рассказывает о проходе по порядку, с номерами в seq: оценки и холды, ответы и сбои провайдеров, паузы и решения. Событие несёт суммы, id и решения — никогда не промпт, не вход флоу и не ответ модели.

События трассировки хранятся 30 дней, а выполнение с его узлами — 90 дней, если сервис не настроен иначе.

Чем закончилось выполнение

status говорит, чем закончился запрос, а статья Что говорит ответ перечисляет все статусы. error_code и error_message говорят, почему выполнение не завершилось успешно. Кроме кодов API, среда выполнения закрывает выполнение, которое больше не может пройти, собственным кодом — Коды ошибок показывают, как такое выполнение выглядит.

  • uncertain — неизвестно, чем закончился вызов модели этого выполнения: провайдер не ответил вовремя, или о вызове, который он выполнял в фоне, больше нельзя было спросить. error_code равен operation_uncertain. Холд вызова остаётся, пока не истечёт, потому что провайдеру могли заплатить, и Slen вызов не повторяет. Статья Когда исход неизвестен говорит, что делать.

  • failed с background_hold_expired — вызов модели шёл в фоне, и его холд закрыло другое списание, пока он ждал. Вызов закончился, не спросив у провайдера ответ, и провайдер всё ещё может выставить за него счёт.

  • failed с execution_timeout — у прохода вышло время. Если модель уже ответила, её вызов оплачен, и cost.actual всё равно придёт.

Стоимость выполнения

cost.estimated — сумма оценок, по которым авторизованы вызовы моделей этого выполнения. cost.actual — то, на что они списаны, и оно приходит после ответа: вызовы рассчитываются в фоне, обычно в течение минуты-двух.

  • cost.actual остаётся null, пока выполнение идёт и пока хотя бы один его вызов ждёт списания, поэтому выполнение с двумя вызовами модели никогда не показывает стоимость одного.

  • Оно остаётся null навсегда, когда ничего не списано: отказ, ответ из кеша, сбой у провайдера.

  • Когда оно задано, оно больше не меняется.

Чтение трассировки догоняет стоимость, расчёт которой был пропущен, поэтому трассировка, прочитанная после расчёта, её показывает.

Операции

Описания операций и полей приведены на английском.

Трассировка одного запуска флоу

GET /v1/executions/{id}

  • Разрешение: read
  • Доступно в SDK для PHP и Node.js

Node by node, event by event, with the cost on each.

Параметры

ПараметрОписание
id обязательно

pathId

Snowflake identifier, as a string.

  • Шаблон: ^\d+$
  • Пример: 74438200973594624

Ответы

200

The execution trace

application/json
{
  "data": {
    "execution_id": "74438200973594624",
    "flow_id": "74438200973594624",
    "flow_version_id": "74438200973594624",
    "operation": "generate_email",
    "operation_id": "74438200973594624",
    "status": "running",
    "error_code": "string",
    "error_message": "string",
    "cost": {
      "estimated": "0.02700000",
      "actual": "0.02700000"
    },
    "cache": {
      "hit": true,
      "cached_at": "2026-10-02T09:30:00Z"
    },
    "started_at": "2026-10-02T09:30:00Z",
    "finished_at": "2026-10-02T09:30:00Z",
    "duration_ms": 1,
    "flow_name": "string",
    "nodes": [
      {
        "node_key": "string",
        "node_type": "sdk_request",
        "status": "completed",
        "output_port": "string",
        "cost": "0.02700000",
        "duration_ms": 1,
        "started_at": "2026-10-02T09:30:00Z",
        "finished_at": "2026-10-02T09:30:00Z",
        "metadata": {},
        "attempts": [
          {
            "attempt_id": "74438200973594624",
            "attempt_number": 1,
            "connection_id": "74438200973594624",
            "pool_id": "74438200973594624",
            "status": "string",
            "error_code": "string",
            "latency_ms": 1,
            "cost": "0.02700000",
            "provider_request_id": "74438200973594624",
            "model_code": "gpt-4o-mini"
          }
        ],
        "label": "string",
        "model": "gpt-4o-mini",
        "code": "string"
      }
    ],
    "events": [
      {
        "seq": 1,
        "type": "accepted",
        "node_key": "string",
        "occurred_at": "2026-10-02T09:30:00Z",
        "payload": {}
      }
    ]
  }
}

Ошибки

СтатусКодыКогда
401

No credential, or one that is not valid

403

Authenticated, but not allowed: scope (insufficient_scope), policy or tenant (not_a_member); a blocked end customer (customer_blocked); an act only a signed-in person may take (session_required); the role rule on members and invitations (member_forbidden, invite_forbidden); a write to the organization's own rows, or a read of the audit journal, by a caller that does not reach every project (project_access_restricted)

404

No such resource for this tenant. Somebody else's resource — and a resource of a project the caller does not reach — answers the same way on purpose: the two must not be distinguishable.

Заголовки

  • X-Request-Id

Тело каждой ошибки — конверт ошибки.

Статус запуска флоу для опроса

GET /v1/executions/{id}/status

  • Разрешение: read
  • Доступно в SDK для PHP и Node.js

Status, cost, what the run waits on, and the answer once there is one — the endpoint an SDK polls. Answered from a Redis snapshot when there is one and from the row otherwise, byte for byte the same either way. A run of a project the caller does not reach is 404 either way — the snapshot carries its project. Use GET /v1/executions/{id} for the node-by-node trace.

Параметры

ПараметрОписание
id обязательно

pathId

Snowflake identifier, as a string.

  • Шаблон: ^\d+$
  • Пример: 74438200973594624

Ответы

200

The current state of the execution

application/json
{
  "data": {
    "execution_id": "74438200973594624",
    "status": "running",
    "operation": "generate_email",
    "output": {},
    "error_code": "string",
    "error_message": "string",
    "cost": {
      "estimated": "0.02700000",
      "actual": "0.02700000"
    },
    "cache": {
      "hit": true,
      "cached_at": "2026-10-02T09:30:00Z"
    },
    "waiting_on": {
      "node_key": "string",
      "type": "queue_node",
      "resume_at": "2026-10-02T09:30:00Z"
    },
    "trace_url": "string",
    "retry_after_seconds": 1
  }
}

Ошибки

СтатусКодыКогда
401

No credential, or one that is not valid

403

Authenticated, but not allowed: scope (insufficient_scope), policy or tenant (not_a_member); a blocked end customer (customer_blocked); an act only a signed-in person may take (session_required); the role rule on members and invitations (member_forbidden, invite_forbidden); a write to the organization's own rows, or a read of the audit journal, by a caller that does not reach every project (project_access_restricted)

404

No such resource for this tenant. Somebody else's resource — and a resource of a project the caller does not reach — answers the same way on purpose: the two must not be distinguishable.

Заголовки

  • X-Request-Id

Тело каждой ошибки — конверт ошибки.

Примеры

Прочитать трассировку

id — это execution_id ответа на запрос. Ответ — выполнение с его nodes и events в форме, которую описывает блок выше.

Terminal
curl https://api.slen.ai/api/v1/executions/74438200973594700 \
  -H "Authorization: Bearer $SLEN_API_KEY"

Прочитать статус

Выполнение ждёт у своего узла review решения человека. resume_at нет, а retry_after_seconds советует, когда прочитать снова.

Terminal
curl https://api.slen.ai/api/v1/executions/74443028719599616/status \
  -H "Authorization: Bearer $SLEN_API_KEY"
200 OK
{
  "data": {
    "execution_id": "74443028719599616",
    "status": "waiting",
    "operation": "generate_email",
    "output": null,
    "error_code": null,
    "error_message": null,
    "cost": {
      "estimated": null,
      "actual": null
    },
    "cache": {
      "hit": false,
      "cached_at": null
    },
    "waiting_on": {
      "node_key": "review",
      "type": "approval",
      "resume_at": null
    },
    "trace_url": "/v1/executions/74443028719599616",
    "retry_after_seconds": 30
  }
}

Что читать дальше

Собрано из openapi b070e1f, sdk contract 5cc7055, php ae4a53b, node 84bc62d