通过以下接口管理知识库中的文档:导入文档、查询状态、列出文档、更新元数据、删除文档。
支持文档格式
PDF:
.pdfWord:
.doc、.docxExcel:
.xls、.xlsxPowerPoint:
.ppt、.pptx纯文本:
.txtMarkdown:
.md
文档状态流转
文档从上传到可检索,经历以下状态:
状态 | 说明 | 可执行的操作 |
| 上传任务已接收,等待处理 | 查询状态、删除 |
| 正在解析、切片和向量化 | 查询状态、删除 |
| 索引完成,可被检索 | 检索、更新元数据、删除、查看切片 |
| 索引失败 | 查看失败原因、删除、重新上传 |
| 文档及其切片正在删除 | 等待删除完成 |
文档上传后处于 Pending 或 Indexing 状态时无法被检索到。必须等到状态变为 Completed 才能检索。
添加文档
将文档导入知识库。系统自动完成解析、切片、Embedding 向量化和索引构建。相同 ossKey 重复上传会覆盖原有文档。
SDK 提供三种导入方式:
方式 | SDK 方法 | 说明 |
上传本地文件 |
| 指定本地文件路径,SDK 自动上传至 OSS 后添加到知识库 |
添加 OSS 文件 |
| 指定已存在的 OSS 文件路径 |
OSS 目录批量导入 |
| 指定 OSS 目录路径,系统递归扫描所有文件 |
请求参数
参数 | 类型 | 说明 |
| string | 知识库名称(必填) |
| string | 子空间名称,最大 128 字符。开启 subspace 时必填 |
| list<object> | 文档列表(必填)。单次最多 10 个 |
| string | 本地文件路径。upload_documents 时必填 |
| string | OSS 文件或目录路径,长度 1–256。add_documents 时必填 |
| object | 文档元数据,必须与知识库定义的 metadata schema 一致 |
| list<string> | 包含过滤器,支持首尾 |
| list<string> | 排除过滤器,支持首尾 |
代码示例
上传本地文件
指定本地文件路径,SDK 自动完成“上传 OSS → 添加到知识库”。
使用 upload_documents 时,初始化 AgentStorageClient 需同时提供 oss_endpoint 和 oss_bucket_name,否则抛出 ValueError。
resp = client.upload_documents({
"knowledgeBaseName": "product_docs_kb",
"documents": [
{
"filePath": "/home/user/docs/product_manual.pdf",
"metadata": {"author": "张三", "category": "产品文档"}
},
{
"filePath": "/home/user/docs/faq.docx",
"metadata": {"author": "李四", "category": "FAQ"}
}
]
})添加 OSS 文件
文件已在 OSS 上时,直接指定 ossKey。
resp = client.add_documents({
"knowledgeBaseName": "product_docs_kb",
"documents": [
{
"ossKey": "oss://example-bucket/docs/product_manual.pdf",
"metadata": {"author": "张三"}
}
]
})OSS 目录批量导入
指定 OSS 目录路径,系统递归扫描目录下所有文件。通过 inclusionFilters 和 exclusionFilters 按文件名模式过滤。
resp = client.add_documents({
"knowledgeBaseName": "product_docs_kb",
"documents": [
{
"ossKey": "oss://example-bucket/docs/",
"inclusionFilters": ["*.pdf", "*.docx"],
"exclusionFilters": ["*draft*"]
}
]
})响应说明
响应字段
字段 | 类型 | 说明 |
| list<object> | 每个文档的处理结果 |
| string | 文档 ID |
| string | 文档 OSS 路径 |
| string |
|
| string | 失败原因(仅 failed 时) |
响应示例
{
"code": "SUCCESS",
"data": {
"documentDetails": [
{"docId": "fc6ed97f-...", "status": "succeed", "ossKey": "oss://example-bucket/docs/product_manual.pdf"},
{"docId": "940f2c5c-...", "status": "succeed", "ossKey": "oss://example-bucket/docs/faq.docx"}
]
},
"message": "succeed"
}部分失败响应(HTTP 仍返回 200,code 仍为 SUCCESS):
{
"code": "SUCCESS",
"data": {
"documentDetails": [
{"status": "failed", "failureReason": "Metadata field 'date' date string format is not supported", "ossKey": "oss://..."},
{"status": "succeed", "ossKey": "oss://...", "docId": "940f2c5c-..."}
]
},
"message": "succeed"
}注意事项
HTTP 200 +
code: SUCCESS不代表所有文档都处理成功。必须逐个检查documentDetails中每个文档的status字段。status: "succeed"表示上传任务已接收,并非索引完成。必须等到文档状态变为Completed才能被检索。知识库开启 subspace 后必须传
subspace参数,否则报INVALID_PARAMETER。metadata 日期格式需使用支持的格式(如
yyyy-MM-dd HH:mm:ss),不支持的格式会导致文档failed。单次请求最多 10 个文档,单文件最大 50MB。
查询索引状态
文档上传后经过异步处理才能被检索。如需确认文档是否索引完成,建议采用指数退避轮询。
import time
def wait_for_document(client, kb_name, doc_id, max_interval=30):
"""指数退避轮询文档状态,等待索引完成。"""
interval = 3
while True:
resp = client.get_document({
"knowledgeBaseName": kb_name,
"docId": doc_id
})
status = resp["data"][0]["status"]
if status == "completed":
print(f"索引完成,切片数: {resp['data'][0].get('chunkNum', 'N/A')}")
return resp
elif status == "failed":
raise Exception(f"索引失败: {resp['data'][0].get('failedDetails')}")
print(f"当前状态: {status},{interval}s 后重试...")
time.sleep(interval)
interval = min(interval * 2, max_interval)文档处理时间受文件大小、类型和数量影响,小文件通常几秒完成,大文件或批量导入可能需要数分钟。
查询文档
调用 get_document 查询指定文档的详细信息,包括处理状态、切片数量和元数据。
请求参数
参数 | 类型 | 说明 |
| string | 知识库名称(必填) |
| string | 子空间名称。开启 subspace 时必填 |
| string | 文档 ID。与 |
| string | OSS 文件路径。与 |
代码示例
resp = client.get_document({
"knowledgeBaseName": "product_docs_kb",
"docId": "fc6ed97f-..."
})
doc = resp["data"][0]
print(f"状态: {doc['status']}, 切片数: {doc.get('chunkNum', 'N/A')}")响应说明
字段 | 类型 | 说明 |
| string | 文档 ID |
| string | OSS 路径 |
| string | 子空间 |
| int | 切片数量 |
| string | 文档状态: |
| int | 创建时间戳 |
| int | 更新时间戳 |
| string | 文档 eTag |
| string | 失败原因(仅 Failed 时) |
| object | 文档元数据 |
注意事项
同一个 ossKey 经历创建→删除→创建后,get_document 可能返回多条记录(包含历史记录)。根据 status 字段判断有效文档,取 Completed 状态的记录。
列出文档
调用 list_documents 分页查询知识库下的文档列表。
请求参数
参数 | 类型 | 说明 |
| string | 知识库名称(必填) |
| list<string> | 子空间列表,最多 10 个。开启 subspace 时必填 |
| int | 返回数量。默认为 10,最大 1000 |
| string | 翻页 token |
代码示例
resp = client.list_documents({
"knowledgeBaseName": "product_docs_kb",
"maxResults": 20
})
for doc in resp["data"]["documentDetails"]:
print(f"[{doc['status']}] {doc['ossKey']} (切片数: {doc.get('chunkNum', '-')})")注意事项
subspace 参数支持多值列表,但最多 10 个,超过会报错。
更新文档元数据
调用 update_document 更新指定文档的 metadata。
仅 Completed 状态的文档可更新元数据。对其他状态的文档调用会报错。
请求参数
参数 | 类型 | 说明 |
| string | 知识库名称(必填) |
| string | 子空间名称。开启 subspace 时必填 |
| string | 文档 OSS 路径。与 |
| string | 文档 ID。与 |
| map | 新的 metadata(必填) |
代码示例
resp = client.update_document({
"knowledgeBaseName": "product_docs_kb",
"docId": "fc6ed97f-...",
"metadata": {"author": "张三", "category": "技术文档", "version": 2}
})
print(f"更新状态: {resp['data']['updateStatus']}") # UPDATED 或 NO_OP响应说明
字段 | 类型 | 说明 |
| string | 文档 ID |
| string | OSS 路径 |
| long | 更新时间戳 |
| string |
|
注意事项
metadata 采用覆盖式更新,传入的值会全量替换原有 metadata。如果只想更新一个字段,必须把所有字段都带上。
传入
"metadata": null会清空所有 metadata。不传
metadata字段则保留原值。限制:metadata 总大小(key + value)最大 4KB,字段数最多 200 个。
删除文档
调用 delete_documents 删除指定的文档及其所有切片数据。
请求参数
参数 | 类型 | 说明 |
| string | 知识库名称(必填) |
| string | 子空间名称。开启 subspace 时必填 |
| list<object> | 要删除的文档列表(必填) |
| string | 文档 ID。与 |
| string | OSS 路径。与 |
代码示例
resp = client.delete_documents({
"knowledgeBaseName": "product_docs_kb",
"documents": [
{"docId": "fc6ed97f-..."},
{"ossKey": "oss://example-bucket/docs/faq.docx"}
]
})
# 逐个检查删除结果
for detail in resp["data"]["documentDetails"]:
print(f"{detail['ossKey']}: {detail['status']}")注意事项
同 AddDocuments,删除结果也需逐个检查 documentDetails 中每个文档的 status。
相关文档
文档切片的查看和内容调整,参见切片管理