# 查询工作流作业结果

读取一个工作流作业的执行结果、节点状态和当前可用动作。结果可能仍处于非终态；请检查响应中的结果状态，而不是仅以 HTTP 状态判断成功。

```text
GET https://moi.matrixorigin.cn/newmoi/workflow/v2/workflow-apps/{workflow_id}/executions/{execution_id}/result
```

## 调用前准备

先[查询工作流作业列表](list-workflow-jobs.md)取得工作流 ID 和执行 ID。准备有目标工作区访问权限的个人访问令牌和目标工作区 ID。

下方示例使用：

- `$AI_STUDIO_API_KEY`：实际个人访问令牌，通过 `X-API-Key` Header 传递。
- `$WORKSPACE_ID`：目标工作区 ID，通过 `X-Workspace-ID` Header 传递。
- `$WORKFLOW_ID`：作业所属的工作流 ID。
- `$EXECUTION_ID`：要查询结果的作业执行 ID。

## 路径参数

| 参数 | 类型 | 说明 |
| --- | --- | --- |
| `workflow_id` | string | 工作流 ID。 |
| `execution_id` | string | 作业 ID。 |

## 请求示例

```bash
curl "https://moi.matrixorigin.cn/newmoi/workflow/v2/workflow-apps/$WORKFLOW_ID/executions/$EXECUTION_ID/result" \
  -H "X-API-Key: $AI_STUDIO_API_KEY" \
  -H "X-Workspace-ID: $WORKSPACE_ID"
```

## 成功响应

成功时返回 `200`。根据 `data.result.status` 判断结果的当前状态。

```json
{
  "code": "OK",
  "msg": "OK",
  "data": {
    "result": {
      "execution_id": "exec-001",
      "workflow_id": "wf-001",
      "moi_task_id": "task-001",
      "moi_case_id": "case-001",
      "status": "completed",
      "case_result": "{}",
      "node_states": [
        {
          "span_id": "span-001",
          "node_name": "load",
          "status": "completed",
          "duration_ms": 1200
        }
      ],
      "available_actions": [],
      "job_summary": {
        "steps": [
          {
            "name": "load",
            "display_name": "加载数据",
            "status": "completed"
          }
        ]
      }
    }
  }
}
```

响应字段如下。

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | string | 成功时为 `OK`。 |
| `msg` | string | 成功时为 `OK`。 |
| `data.result.execution_id` | string | 执行 ID。 |
| `data.result.workflow_id` | string | 工作流 ID。 |
| `data.result.moi_task_id` | string | 任务标识；有值时返回。 |
| `data.result.moi_case_id` | string | 案例标识；有值时返回。 |
| `data.result.status` | string | 当前或最终执行状态。 |
| `data.result.case_result` | string | 服务端提供的执行结果；有值时返回。 |
| `data.result.case_error` | string | 服务端提供的执行错误；有值时返回。 |
| `data.result.node_states` | object（对象数组） | 节点追踪状态列表。每项可含 `span_id`、`parent_span_id`、`node_id`、`node_name`、`workitem_id`、`worker_id`、`kind`、`status`、`error`、时间、`duration_ms` 和 `attrs_json`。其中 `node_name` 是追踪名称，不是单独的 `node_key` 字段。 |
| `data.result.available_actions` | string（字符串数组） | 当前状态下允许的操作。 |
| `data.result.trace` | object | 追踪数据；有值时返回。 |
| `data.result.trace_error` | string | 追踪读取错误；有值时返回。 |
| `data.result.job_summary` | object | 可用时返回的作业摘要，其中可含输入、输出和步骤摘要。 |
| `data.result.rerun_context` | object | 本次作业是重新运行时返回的来源执行、节点和状态信息。 |

## 错误响应

```json
{
  "code": "ErrNotFound",
  "msg": "资源不存在",
  "data": null
}
```

### 常见 HTTP 错误

```{list-table}
:header-rows: 1
:widths: 12 22 32 34

* - HTTP 状态码
  - 错误代码
  - 常见原因
  - 建议操作
* - `400`
  - `ErrParamInvalid`
  - `execution_id` 为空或无效。
  - 使用作业列表或创建响应中的执行 ID。
* - `401`
  - `ErrUnauthorized`
  - 缺少或无效的访问凭据。
  - 检查 API Key 和工作区 Header。
* - `403`
  - `ErrForbidden`
  - 当前身份没有工作流读取权限。
  - 请求授予 `workflow.read` 权限。
* - `404`
  - `ErrNotFound`
  - 作业不存在，或不属于路径中的工作流。
  - 核对工作流 ID、执行 ID 和工作区。
* - `503`
  - `ErrServiceUnavailable`
  - 依赖服务暂不可用。
  - 稍后重试。
* - `500`
  - `ErrServer`
  - 服务端未能读取作业结果。
  - 稍后重试。
```

## 后续操作

从工作流 DSL 取得节点键后[查询工作流作业节点](get-workflow-job-node.md)。在当前追踪数据中，节点状态的 `node_name` 常显示为 `node:<NODE_KEY>`，但调用时仍应传 DSL 中的实际节点键，而不要把该展示字符串原样当作 `node_key`。
