- 增加test:journey脚本,覆盖知识库跨命令全链路用户旅程测试 - 在文档中新增Journey E2E章节,详细说明用户旅程测试定位及断言机制 - 完善commands模块,新增知识库相关命令包括知识库列表、信息、创建、更新、删除 - 新增知识库文档相关命令,如文档列表、状态、上传、删除、打标签及OSS导入 - 添加知识服务管理命令,支持列表、创建、更新、部署、删除及复制 - 支持知识块增删查改命令,完善知识点的灵活操作能力 - 实现数据中心分类管理命令,支持分类增删查操作 - 优化knowledge chat命令,增加workspace-id统一解析及agent-version版本控制 - 重构与知识库相关命令的导出与注册,完善CLI整体能力覆盖 - 新增命令详尽的帮助文档,包含参数说明、使用示例及错误边界 - 实现批量删除知识块的自动分批处理逻辑,易于操作大规模数据 - 添加必要的输入校验与安全提示,确保操作安全且符合规范
13 KiB
迭代一设计 · doc 组命令
命令:
doc upload/doc list/doc status/doc delete/doc tag/doc import-oss公共约定见 README.md。
doc upload — 上传本地文件入库(编排命令)
说明:本迭代最复杂命令。把"本地文件 → 数据中心 →(可选)导入知识库"封装为一条命令,替代构建期最高频的控制台操作(S2.2 痛点:高)。对标竞品 add-file。
编排四步:
| 步 | API | 输入 | 输出 |
|---|---|---|---|
| 1 申请租约 | POST /api/v1/connector/dash/applyFileUploadLease |
category(类目ID) + fileName + sizeBytes(字符串!) + contentMd5(Base64) |
leaseId + param.url/method/headers |
| 2 OSS 上传 | PUT {param.url} |
文件二进制 + param.headers(含 x-bailian-extra、Content-Type) |
HTTP 200 |
| 3 注册文件 | POST /api/v1/connector/dash/addFile |
leaseId + category + parser: "AUTO_SELECT" + tags? |
fileId |
4 导入(可选,传 --index-id 时) |
POST /api/v1/indices/rag/index/job/create |
indexId + dataSource: { sourceType: "DATA_CENTER_FILE", fileIds } |
ingestionId |
坑位(实现注释必须标注):
sizeBytes必须字符串;contentMd5=crypto.createHash("md5").update(buf).digest("base64")- 租约/注册的类目参数名是
category,不是categoryId - 第 4 步 body 是嵌套
dataSource: { sourceType, fileIds }(实测;公开文档的平铺documentIds会报Index.InvalidParameter) - 第 4 步必须显式传
sourceType,不传会导入整个数据中心(API 文档明示的默认行为) - 步骤 2 走 OSS 域名不走 DashScope 网关,用原生 fetch 而非 ctx.client(无 Bearer 头);失败归类 NETWORK
Flags:
| flag | 类型 | 必填 | 说明 |
|---|---|---|---|
--file <path> |
array | 是 | 本地文件路径,可重复;扩展名与大小按产品支持范围预校验(见下方格式白名单) |
--index-id <id> |
string | 否 | 注册后立即导入该知识库(触发第 4 步,多文件合并为一个 job) |
--category-id <id> |
string | 否 | 目标类目;缺省自动解析默认类目(listCategory 取 isDefault: true),解析失败报 GENERAL + hint 显式传 --category-id |
--tag <text> |
array | 否 | addFile tags,可重复 |
--wait / --poll-interval <s> / --timeout <s> |
— | 否 | 与 --index-id 联用,轮询 job status 至终态 |
validate:--wait 无 --index-id → USAGE;文件不存在/不可读 → GENERAL + errno hint(沿用错误边界规范)。
格式白名单与大小预校验(依据 data/documents.md「支持的格式」,读文件前拦截,避免白传 OSS):
| 类型 | 扩展名 | 硬限(超限 USAGE) |
|---|---|---|
| 文档 | .doc .docx .ppt .pptx .pdf | 150 MB |
| 表格 | .xls .xlsx | 10 MB(产品为“建议值”,超限降级为 stderr 警告不拦截) |
| 图片 | .png .jpg .jpeg .bmp .gif | 20 MB(尺寸约束不做客户端校验,留服务端) |
| 纯文本 | .md .txt .html | 10 MB(同表格,警告不拦截) |
- 扩展名不在白名单 → USAGE,错误信息列出支持格式;白名单常量独立导出便于后续随产品更新
- 开放问题:create-kb.md 提及 .csv 但 documents.md 格式表未列——文档口径不一致,实现前向产品确认;确认前 .csv 暂入白名单(服务端拒绝会透传)
输出:
- text:每文件一行
<fileName> <fileId> registered;有导入时追加job: <ingestionId>;--wait 结束追加终态 - json:
{ files: [{path, fileId}], index_id?, ingestion_id?, final_status? }(编排命令无单一响应可透传,输出自定义稳定结构) - quiet:仅 fileId 每行一个
实现方案:
- 文件
doc-upload.ts;多文件串行执行 1-3 步(首版不并发,避免 OSS 限流复杂化),全部注册成功后合并执行第 4 步 - 部分失败语义:任一文件步骤 1-3 失败即中止并报错,已成功的 fileId 列入错误 hint(幂等重传代价低)
- 默认类目解析结果进程内缓存(多文件只查一次)
- dry-run:不读文件内容(size/md5 以占位符表示),输出四步编排计划
{ steps: [{step, endpoint, request}] }
测试方案:
- help / 缺
--fileexitCode 2 /--wait无--index-idexitCode 2 - 文件不存在 → 非零退出 + ENOENT hint;
.zip扩展名 → USAGE 列出支持格式 - dry-run:断言 steps 长度(带/不带 --index-id 为 4/3)、lease 请求
sizeBytes为字符串类型、job 请求含sourceType: "DATA_CENTER_FILE" - live:上传 1KB 临时 md 文件 → 断言 fileId 前缀
file_→ afterAll doc delete + 数据中心 deleteFile 清理
doc list — 查询知识库文档列表
说明:列出库内文档及解析/索引状态,含 FAILED 发现(S2.3 / S5.2)。
API:GET /api/v1/indices/rag/index/files,query string:index_id + page_num(注意本接口是 page_num)+ page_size(默认 10,最大 100)。
Flags:--index-id 必填;--page-number / --page-size。
输出:
- text:每行
doc_id status doc_name doc_type size;status=FAILED 行红色高亮(TTY);尾行total: N - json 透传;quiet 仅 doc_id
实现/测试:单 API 直映射(doc-list.ts);dry-run 断言 query 参数名为 page_num;live 断言 rows 结构与 doc_id 前缀。
doc status — 查询导入任务状态
说明:查导入任务进度,--wait 阻塞至终态供脚本串行(S2.3 痛点:高,L3 验收:FAILED 时非零 exit code)。
API:GET /api/v1/indices/rag/index_job/status,query string:index_id + job_id(双必填,仅传其一服务端返回 SystemError,客户端前置双校验拦截)+ 分页参数。
Flags:
| flag | 必填 | 说明 |
|---|---|---|
--index-id <id> |
是 | 知识库 ID |
--job-id <id> |
是 | 导入任务 ID(kb create / doc upload 返回的 ingestionId;也见 doc list 的 ingestion_id) |
--page-number / --page-size |
否 | 任务含大量文档时分页 |
--wait / --poll-interval <s>(默认 5) / --timeout <s>(默认 600) |
否 | 轮询至终态 |
行为:
- 终态 FINISH → exit 0;FAILED →
BailianError(GENERAL)透传服务端 message(含文档级失败明细摘要),exit 1 --wait超时 → TIMEOUT(5)- 已知行为:库无进行中任务时接口可能返回 SystemError——hint 引导 "check ingestion_id via doc list"
输出:text 顶部任务总状态 + 文档级状态列表(FAILED 高亮);json 透传。
测试方案:help / 缺任一必填(两条用例)/ dry-run 断言 query 含两个 id / live:配合 upload 用例拿真实 job 轮询到 FINISH;--wait --timeout 1 对慢任务断言 exitCode 5(若不稳定则仅静态覆盖超时路径,live 标记 skip 原因)。
doc delete — 删除文档【危险操作】
说明:从知识库删除文档及其全部切片(S5.1 内容更新循环)。
API:POST /api/v1/indices/rag/index/delete_file,body { index_id, doc_ids }(snake_case)。响应 data.deleted[] 为实际删除列表。
Flags:--index-id 必填;--doc-id array 必填(可重复);--yes。
实现方案:doc-delete.ts;确认摘要含 index_id + doc_id 列表(≤5 个全列,超出显示前 5 + 总数);输出以 data.deleted 为准(与入参数量不一致时 text 模式警告差异)。
测试方案:help / 缺参×2 / dry-run 断言 doc_ids 数组 / 非 TTY 无 --yes exitCode 2 / live 配合 upload 清理链。
doc tag — 批量更新文档标签
说明:批量打标,支撑标签过滤检索(S2.4)。
API:POST /api/v1/connector/dash/batchUpdateFileTag。fileInfos(1-20 项,每项 fileId + tags,单标签 ≤32 字符、单文件 ≤100 个、总长 ≤700)+ updateMode(OVERWRITE/APPEND)。
Flags:
| flag | 必填 | 说明 |
|---|---|---|
--doc-id <id> |
是 | 可重复,1-20 个(客户端预校验),映射 fileInfos[].fileId |
--tag <text> |
是 | 可重复,应用到所有 --doc-id(首版同一组标签批量打;异构标签用多次调用) |
--mode <m> |
否 | choices: overwrite/append,默认 append(追加比覆盖安全,作为缺省) |
实现/测试:doc-tag.ts 单 API 直映射;客户端预校验标签长度约束(USAGE 前置拦截);dry-run 断言 updateMode: "APPEND" 大写映射与 fileInfos 结构;live 打标后 listFile/describeFile 验证回读。
doc import-oss — 从授权 OSS 批量导入
说明:从已 SLR 授权的 OSS Bucket 批量导入数据中心(大客户批量场景)。
API:POST /api/v1/connector/dash/addFilesFromAuthorizedOss。必填 categoryId/categoryType/ossBucket/ossRegionId/fileDetails(1-10 项,每项 fileName+ossKey)。返回 data.fileIds。
Flags:
| flag | 必填 | 说明 |
|---|---|---|
--bucket <name> |
是 | 映射 ossBucket |
--region <id> |
是 | 映射 ossRegionId(如 cn-beijing) |
--oss-key <key> |
是 | 可重复,1-10 个;fileName 取 key 的 basename |
--category-id <id> |
否 | 缺省走默认类目解析(复用 upload 的解析函数) |
--tag <text> |
否 | 可重复,≤10 |
--overwrite |
否 | switch,映射 overWriteFileByOssKey |
固定值:categoryType: "UNSTRUCTURED";parser 不暴露(默认 AUTO_SELECT,审慎原则——DASH_QWEN_VL_PARSER 等需配 parserConfig,使用方式未验证)。
错误边界:SLR 未授权的服务端权限错误原样透传,hint 附 RAM 控制台确认 AliyunServiceRoleForBailian 的指引(该指引来自 API 文档 Note,属可权威解释范围)。
实现/测试:doc-import-oss.ts 单 API 直映射;dry-run 断言 fileDetails 结构与 fileName 派生逻辑;live 依赖 OSS 授权环境,gating 追加 BAILIAN_E2E_OSS_BUCKET 环境变量,无则 skip。