# 调用算子 API 服务

调用已发布且已启用的算子 API 服务。`payload` 的字段必须符合该服务的输入定义；先[查看服务配置](get-operator-api-service.md)确认服务可调用并获取输入定义。

```text
POST https://moi.matrixorigin.cn/newmoi/workflow/v2/workitems/catalog/$NODE_ID/api-service/invoke
```

## 调用前准备

先[查看服务配置](get-operator-api-service.md)，确认服务已启用，并取得要调用服务的算子 ID、版本和服务名称。准备有目标工作区访问权限的个人访问令牌、目标工作区 ID、算子 ID、版本和服务名称。

下方示例使用：

- `$AI_STUDIO_API_KEY`：实际个人访问令牌，通过 `X-API-Key` Header 传递。
- `$WORKSPACE_ID`：目标工作区 ID，通过 `X-Workspace-ID` Header 传递。
- `$NODE_ID`：要调用服务对应的算子 ID。
- `$VERSION`：要调用服务对应的算子版本。
- `$SERVICE_NAME`：服务名称，填写查看服务配置响应中的 `service_name` 值，并在请求体的 `service_name` 字段中传递。

## 路径参数

| 参数 | 类型 | 是否必填 | 说明 |
| --- | --- | --- | --- |
| `node_id` | string | 是 | 要调用的算子 ID。 |

## 请求体

| 字段 | 类型 | 是否必填 | 说明 |
| --- | --- | --- | --- |
| `service_name` | string | 是 | 服务名称，使用服务配置响应中的 `data.service.service_name`。 |
| `type` | string | 是 | 固定为 `operator`。 |
| `version` | string | 是 | 已发布的算子版本。 |
| `payload` | object | 是 | 服务的输入数据；字段和类型以 `data.service.input_schema` 为准。 |

## 请求示例

```bash
curl -X POST "https://moi.matrixorigin.cn/newmoi/workflow/v2/workitems/catalog/$NODE_ID/api-service/invoke" \
  -H "X-API-Key: $AI_STUDIO_API_KEY" \
  -H "X-Workspace-ID: $WORKSPACE_ID" \
  -H 'Content-Type: application/json' \
  -d "{
    \"service_name\": \"$SERVICE_NAME\",
    \"type\": \"operator\",
    \"version\": \"$VERSION\",
    \"payload\": {
      \"sql\": \"SELECT now()\"
    }
  }"
```

## 成功响应

`data.result` 返回本次调用的状态和算子输出。`result` 以 JSON 格式字符串返回；解析该字符串后再读取算子输出。响应中出现 `error` 时，按错误信息处理。

```json
{
  "code": "OK",
  "msg": "OK",
  "data": {
    "result": {
      "case_id": "case_01JEX4A1M2",
      "status": "COMPLETED",
      "result": "{\"count\":9}"
    }
  }
}
```

响应字段如下。

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | string | 成功时为 `OK`。 |
| `msg` | string | 成功时为 `OK`。 |
| `data.result.case_id` | string | 本次调用 ID；响应提供时可用于关联本次结果。 |
| `data.result.status` | string | 服务返回的状态；响应提供时出现。 |
| `data.result.result` | string | 服务返回的 JSON 格式字符串；解析后的结构由算子决定。 |
| `data.result.error` | string | 服务返回的错误信息；有错误时出现。 |

## 错误响应

```json
{
  "code": "api_service_unavailable",
  "msg": "服务暂不可用",
  "data": null
}
```

### 常见 HTTP 错误

```{list-table}
:header-rows: 1
:widths: 12 24 36 28

* - HTTP 状态码
  - 错误代码
  - 常见原因
  - 建议操作
* - `400`
  - `ErrParamInvalid`
  - 算子 ID、`version`、`service_name` 或 `payload` 无效；`type` 不是 `operator` 也会失败。
  - 检查请求字段，并按服务输入定义填写 `payload`。
* - `401`
  - `ErrUnauthorized`
  - 个人访问令牌缺失或无效。
  - 检查个人访问令牌和工作区 ID。
* - `403`
  - `ErrForbidden`
  - 当前访问凭据没有调用权限。
  - 使用有权限的访问凭据，或联系管理员授权。
* - `404`
  - `ErrNotFound`
  - 算子、版本或服务不存在。
  - 检查算子 ID、版本和服务名称是否来自同一份服务配置。
* - `500`
  - `ErrServer`
  - 服务端无法处理调用。
  - 记录请求时间和错误信息后重试。
* - `503`
  - `api_service_unavailable`
  - 服务或其依赖暂不可用。
  - 稍后重试。
```

## 后续操作

调用完成后，需要核对配置时[查看算子 API 服务配置](get-operator-api-service.md)。
