# 查询产物处理节点详情

读取一个产物关联处理节点的配置和运行快照。

```text
GET https://moi.matrixorigin.cn/newmoi/lineage/artifacts/{artifact_id}/nodes/{node_id}
```

## 调用前准备

先[查询产物处理链路](get-artifact-lineage.md)，从响应取得产物 ID 和节点 ID。准备有目标工作区访问权限的个人访问令牌、目标工作区 ID、产物 ID 和节点 ID。

下方示例使用：

- `$AI_STUDIO_API_KEY`：实际个人访问令牌，通过 `X-API-Key` Header 传递。
- `$WORKSPACE_ID`：目标工作区 ID，通过 `X-Workspace-ID` Header 传递。
- `$ARTIFACT_ID`：工作流产物 ID，取自处理链路响应的 `data.artifact.artifact_id`。
- `$NODE_ID`：产物处理拓扑中的节点 ID，取自 `data.topology.producer_node_id` 或 `data.topology.nodes[].node_id`。

节点 ID 不能使用节点显示名称替代。

本文中，字段路径中的 `[]` 表示数组中的每一项。例如，`data.topology.nodes[].node_id` 表示 `data.topology.nodes` 数组中每一项的 `node_id` 字段。

## 路径参数

| 参数 | 类型 | 说明 |
| --- | --- | --- |
| `artifact_id` | string | 工作流产物 ID，取自处理链路响应的 `data.artifact.artifact_id`。 |
| `node_id` | string | 产物处理拓扑中的节点 ID，取自 `data.topology.producer_node_id` 或 `data.topology.nodes[].node_id`。不能使用节点显示名称替代。 |

## 请求示例

```bash
curl "https://moi.matrixorigin.cn/newmoi/lineage/artifacts/$ARTIFACT_ID/nodes/$NODE_ID" \
  -H "X-API-Key: $AI_STUDIO_API_KEY" \
  -H "X-Workspace-ID: $WORKSPACE_ID"
```

## 成功响应

`data` 返回节点身份、选定运行记录和运行快照。中间节点没有持久化输出时，空输出不能单独证明节点未运行。

```json
{
  "code": "OK",
  "msg": "OK",
  "data": {
    "workflow": {
      "workflow_id": "wf-001",
      "workflow_version_id": "ver-001"
    },
    "node": {
      "node_id": "node-001",
      "label": "解析文件",
      "selected_run_id": "run-001",
      "candidate_runs": 1
    },
    "run": {
      "config": {},
      "runtime_input": {},
      "runtime_output": {},
      "status": "success",
      "duration_ms": 10
    }
  }
}
```

响应字段如下。

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | string | 成功时为 `OK`。 |
| `msg` | string | 成功时为 `OK`。 |
| `data.workflow.workflow_id` | string | 工作流 ID；仅在有值时返回。 |
| `data.workflow.workflow_version_id` | string | 工作流版本 ID；仅在有值时返回。 |
| `data.node.node_id` | string | 节点 ID。 |
| `data.node.label` | string | 节点显示标签；仅在有值时返回。 |
| `data.node.workitem_type_id` | string | 工作项类型 ID；仅在有值时返回。 |
| `data.node.selected_run_id` | string | 选定的节点运行记录 ID；仅在有值时返回。 |
| `data.node.parallel_index` | integer | 并行索引；仅在有值时返回。 |
| `data.node.candidate_runs` | integer | 可选运行记录数；仅在有值时返回。 |
| `data.run.config` | object | 节点配置。 |
| `data.run.runtime_input` | object | 节点运行输入。 |
| `data.run.runtime_vars` | object | 节点运行变量。 |
| `data.run.runtime_output` | object | 节点运行输出。 |
| `data.run.status` | string | 节点运行状态；仅在有值时返回。 |
| `data.run.error` | string | 节点运行错误；仅在有错误时返回。 |
| `data.run.duration_ms` | integer | 节点运行耗时（毫秒）；仅在有值时返回。 |

## 错误响应

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

### 常见 HTTP 错误

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

* - HTTP 状态码
  - 错误代码
  - 常见原因
  - 建议操作
* - `400`
  - `ErrParamInvalid`
  - 产物或节点 ID 为空或无效。
  - 检查路径参数。
* - `401`
  - `ErrUnauthorized`
  - 凭据缺失或无效。
  - 检查 API Key。
* - `403`
  - `ErrPermissionDenied`
  - 当前身份没有读取权限。
  - 使用有权限的凭据，或联系管理员授权。
* - `404`
  - `ErrNotFound`
  - 产物不存在、节点不属于该产物，或没有可读取的运行快照。
  - 先读取产物链路，并使用其中的节点 ID。
* - `409`
  - `ErrConflict`
  - 无法从多个节点运行记录中唯一选择一个快照。
  - 按产物链路中的选定运行信息重新确认对象。
* - `500`
  - `ErrServer`
  - 服务端无法读取节点快照。
  - 记录请求时间和错误信息后重试。
* - `503`
  - `ErrServer`
  - 血缘依赖服务不可用。
  - 稍后重试。
```

## 后续操作

本接口返回节点详情。若还要查看产物级关系，返回[查询产物处理链路](get-artifact-lineage.md)。
