# 更新分段

更新指定分段的内容。版本基线用于避免覆盖较新的修改。

```text
PATCH https://moi.matrixorigin.cn/newmoi/semantic-models/{model_id}/sources/{source_row_id}/segments/{segment_id}
```

## 调用前准备

先[查询文档详情](get-document.md)，取得当前分段版本 ID 和索引版本作为基线。准备有目标工作区访问权限的个人访问令牌和目标工作区 ID。

下方示例使用：

- `$AI_STUDIO_API_KEY`：实际个人访问令牌，通过 `X-API-Key` Header 传递。
- `$WORKSPACE_ID`：目标工作区 ID，通过 `X-Workspace-ID` Header 传递。
- `$MODEL_ID`：知识库 ID。
- `$SOURCE_ROW_ID`：来源记录 ID。
- `$SEGMENT_ID`：要更新的分段 ID。

## 路径参数

| 参数 | 类型 | 说明 |
| --- | --- | --- |
| `model_id` | integer | 知识库 ID。 |
| `source_row_id` | string | 来源记录 ID。 |
| `segment_id` | string | 要更新的分段 ID。 |

## 请求体

提交来源当前的版本基线，以及要更新的文本、OCR 文本或图片描述。

| 字段 | 类型 | 是否必填 | 说明 |
| --- | --- | --- | --- |
| `base_segment_version_id` | string | 是 | 调用前读取到的当前分段版本 ID。 |
| `base_index_version` | integer | 是 | 调用前读取到的当前索引版本。 |
| `content` | string | 否 | 更新后的文本内容。 |
| `ocr_text` | string | 否 | 更新后的 OCR 文本。 |
| `image_description` | string | 否 | 更新后的图片描述。 |

## 请求示例

```bash
curl -X PATCH "https://moi.matrixorigin.cn/newmoi/semantic-models/$MODEL_ID/sources/$SOURCE_ROW_ID/segments/$SEGMENT_ID" \
  -H "X-API-Key: $AI_STUDIO_API_KEY" \
  -H "X-Workspace-ID: $WORKSPACE_ID" \
  -H 'Content-Type: application/json' \
  -d '{
    "base_segment_version_id": "<SEGMENT_VERSION_ID>",
    "base_index_version": <INDEX_VERSION>,
    "content": "<SEGMENT_CONTENT>"
  }'
```

## 成功响应

成功时返回 `200` 和更新后的来源文档快照。

```json
{
  "code": "OK",
  "msg": "OK",
  "data": {
    "document": {
      "source": {
        "row_id": "src_01",
        "model_id": 401
      },
      "segment_status": {
        "available": true,
        "total": 2
      },
      "segment_versions": [
        {
          "version_id": "ver_02",
          "current": true,
          "chunk_count": 2
        }
      ],
      "segments": [
        {
          "segment_id": "seg_01",
          "segment_type": "text",
          "level": "chunk",
          "content": "更新后的文本",
          "enabled": true
        }
      ]
    }
  }
}
```

响应字段如下。

字段路径中的 `[]` 表示数组中的每一项。例如，`data.document.segment_versions[].version_id` 表示 `data.document.segment_versions` 数组中每一项的 `version_id` 字段。

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | string | 成功时为 `OK`。 |
| `msg` | string | 成功时为 `OK`。 |
| `data.document` | object | 更新后的来源文档快照。 |
| `data.document.source.row_id` | string | 来源记录 ID。 |
| `data.document.segment_status` | object | 当前分段可用状态和总数。 |
| `data.document.segment_versions[].version_id` | string | 更新后的分段版本 ID。 |
| `data.document.segment_versions[].current` | boolean | 是否为当前分段版本。 |
| `data.document.segments[].segment_id` | string | 分段 ID。 |
| `data.document.segments[].content` | string | 更新后的分段文本；内容未返回时可能省略。 |
| `data.document.segments[].enabled` | boolean | 分段是否参与检索。 |

## 错误响应

```json
{
  "code": "ErrConflict",
  "msg": "segment version conflict",
  "data": null
}
```

### 常见 HTTP 错误

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

* - HTTP 状态码
  - 错误代码
  - 常见原因
  - 建议操作
* - `400`
  - `ErrParamInvalid`
  - 路径 ID、请求体或分段版本基线无效。
  - 重新读取文档后使用当前版本信息提交。
* - `401`
  - `ErrUnauthorized`
  - API Key 无效或已失效。
  - 检查 API Key。
* - `403`
  - `ErrForbidden`
  - 调用者没有更新该来源的权限。
  - 检查工作区和对象授权。
* - `404`
  - `ErrNotFound`
  - 知识库、来源或分段不存在，或当前调用者不可见。
  - 重新读取文档确认 ID。
* - `409`
  - `ErrConflict`
  - 当前版本已变化，服务拒绝写入。
  - 读取最新文档后合并修改并重试。
* - `500`
  - `ErrServer`
  - 服务未能更新分段。
  - 保留脱敏后的响应信息后重试。
```

## 后续操作

[查询文档详情](get-document.md)确认更新结果。
