# 更新计算实例

更新当前工作区中一个计算实例的可修改配置。Serverless 实例不会因配置更新立即部署 Worker；Worker 按后续工作负载需求激活。

```text
PUT https://moi.matrixorigin.cn/newmoi/compute-resources/{resource_id}
```

## 调用前准备

先[查询计算实例详情](get-compute-resource.md)，确认要更新的实例。准备有目标工作区访问权限的个人访问令牌、目标工作区 ID 和计算实例 ID。

下方示例使用：

- `$AI_STUDIO_API_KEY`：实际个人访问令牌，通过 `X-API-Key` Header 传递。
- `$WORKSPACE_ID`：目标工作区 ID，通过 `X-Workspace-ID` Header 传递。
- `$RESOURCE_ID`：要更新的计算实例 ID。

## 路径参数

| 参数 | 类型 | 是否必填 | 说明 |
| --- | --- | --- | --- |
| `resource_id` | string | 是 | 计算实例 ID。 |

## 请求体

字段路径中的 `[]` 表示数组中的每一项。例如，`worker_images[].worker_type` 表示 `worker_images` 数组中每一项的 `worker_type` 字段。

只提交要修改的字段。

| 字段 | 类型 | 是否必填 | 说明 |
| --- | --- | --- | --- |
| `name` | string | 否 | 实例名称。 |
| `description` | string | 否 | 实例说明。 |
| `kind` | string | 否 | 兼容性提示。 |
| `spec_id` | string | 否 | 计算规格 ID。 |
| `cpu` | integer | 否 | CPU 配置。 |
| `memory_gib` | integer | 否 | 内存 GiB 配置。 |
| `gpu` | integer | 否 | GPU 配置。 |
| `min_replicas` | integer | 否 | 仅接受 `0`。 |
| `max_replicas` | integer | 否 | 副本上限，必须大于 `0`。 |
| `auto_suspend_minutes` | integer | 否 | 自动暂停等待时间。 |
| `worker_images` | object（对象数组） | 否 | Worker 镜像选择。提交此字段时必须用完整列表替换原配置，并覆盖当前所有活跃的 `worker_type`。 |
| `worker_images[].worker_type` | string | 提交 `worker_images` 时是 | Worker 类型。 |
| `worker_images[].kind` | string | 否 | 兼容别名；传入时应与 `worker_type` 一致。 |
| `worker_images[].image_id` | string | 提交 `worker_images` 时是 | 镜像 ID。 |
| `worker_images[].platform` | string | 提交 `worker_images` 时是 | 镜像运行平台。 |
| `go_worker_image_id` | string | 否 | 兼容的 Go Worker 镜像 ID。 |
| `python_worker_image_id` | string | 否 | 兼容的 Python Worker 镜像 ID。 |
| `platform` | string | 否 | 兼容的运行平台。 |

## 请求示例

```bash
curl -X PUT "https://moi.matrixorigin.cn/newmoi/compute-resources/$RESOURCE_ID" \
  -H "X-API-Key: $AI_STUDIO_API_KEY" \
  -H "X-Workspace-ID: $WORKSPACE_ID" \
  -H 'Content-Type: application/json' \
  -d '{
    "description": "updated",
    "max_replicas": 3,
    "auto_suspend_minutes": 30
  }'
```

## 成功响应

成功时返回 `200`，`data` 为更新后的实例对象。保存成功不会立即部署 Worker。

```json
{
  "code": "OK",
  "msg": "OK",
  "data": {
    "id": "cr-001",
    "name": "data-processing",
    "description": "updated",
    "spec_id": "task-standard-small",
    "status": "IDLE",
    "status_message": "",
    "min_replicas": 0,
    "max_replicas": 3,
    "current_replicas": 0
  }
}
```

响应字段如下。

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | string | 成功时为 `OK`。 |
| `msg` | string | 成功时为 `OK`。 |
| `data.id` | string | 计算实例 ID。 |
| `data.workspace_id` | string | 所属工作区 ID。 |
| `data.name` | string | 计算实例名称。 |
| `data.description` | string | 实例说明；有值时返回。 |
| `data.spec_id` | string | 当前计算规格 ID。 |
| `data.kind` | string | 实例类型。 |
| `data.cpu` | integer | CPU 配置值。 |
| `data.memory_gib` | integer | 以内存 GiB 表示的配置值。 |
| `data.gpu` | integer | GPU 配置值。 |
| `data.cpu_milli` | integer | 以毫核表示的 CPU 配置值。 |
| `data.memory_mib` | integer | 以内存 MiB 表示的配置值。 |
| `data.gpu_count` | integer | GPU 数量。 |
| `data.gpu_memory_mib` | integer | 单个 GPU 的显存 MiB。 |
| `data.gpu_cores` | integer | GPU 核心数。 |
| `data.min_replicas` | integer | Serverless 实例固定为 `0`。 |
| `data.max_replicas` | integer | 最大副本数。 |
| `data.desired_replicas` | integer | 目标副本数。 |
| `data.current_replicas` | integer | 当前副本数。 |
| `data.go_worker_image_id` | string | Go Worker 镜像 ID；有值时返回。 |
| `data.python_worker_image_id` | string | Python Worker 镜像 ID；有值时返回。 |
| `data.worker_images` | object（对象数组） | Worker 镜像选择；有值时返回。 |
| `data.worker_images[].worker_type` | string | Worker 类型。 |
| `data.worker_images[].image_id` | string | 镜像 ID。 |
| `data.worker_images[].platform` | string | 运行平台。 |
| `data.platform` | string | 实例运行平台；有值时返回。 |
| `data.auto_suspend_minutes` | integer | 自动暂停等待时间。 |
| `data.is_default` | boolean | 是否为工作区默认计算实例。 |
| `data.status` | string | 更新后的当前生命周期状态。 |
| `data.status_message` | string | 状态补充信息；有值时返回。 |
| `data.scale_reason` | string | 服务端提供的缩放原因；有值时返回。 |
| `data.last_activation_at` | string | 最近一次激活时间；有值时返回。 |
| `data.last_active_at` | string | 最近一次活跃时间；有值时返回。 |
| `data.created_by` | string | 创建者标识；有值时返回。 |
| `data.created_at` | string | 创建时间；有值时返回。 |
| `data.updated_at` | string | 最后更新时间；有值时返回。 |

## 错误响应

```json
{
  "code": "UPDATE_FAILED",
  "msg": "服务器内部错误",
  "data": null
}
```

### 常见 HTTP 错误

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

* - HTTP 状态码
  - 错误代码
  - 常见原因
  - 建议操作
* - `400`
  - `INVALID_PARAMS`
  - 请求体无法解析或字段组合无效。
  - 检查字段类型、规格和副本范围。
* - `401`
  - —
  - 缺少或无效的访问凭据。
  - 检查 API Key 和工作区 Header。
* - `403`
  - `ErrForbidden`
  - 当前身份没有实例更新权限。
  - 请求授予 `compute_resource.update` 权限。
* - `404`
  - `NOT_FOUND`
  - 实例不存在或不属于当前工作区。
  - 核对 `resource_id` 和工作区。
* - `409`
  - `COMPUTE_RESOURCE_NAME_EXISTS`
  - 新名称与工作区中的已有实例冲突。
  - 修改 `name` 后重试。
* - `500`
  - `UPDATE_FAILED`
  - 服务端未能更新实例。
  - 稍后重试。
```

## 后续操作

[查询计算实例详情](get-compute-resource.md)或[查询 Worker 运行时](get-worker-runtime.md)确认变更进度。
