Skip to content

知识库 API

知识库系统 REST API,提供节点管理、向量操作、边操作、标签管理和搜索功能。知识库作为数据库和存储的"索引层",通过分片和向量化实现语义搜索。

基础路径

/projects/:projectId/kb

认证方式

所有端点均需要 JWT Bearer TokenAPI Key 认证(combinedAuth 中间件)。

权限说明

请求者必须是项目所有者或项目所属团队的活跃成员。

错误码约定

知识库使用结构化错误码(如 KB_NODE_NOT_FOUND),便于前端国际化处理。

标签稳定 ID 机制(重要)

自 2026-06-14(issue #741)起,知识库标签的身份是稳定 id(key),不再是显示名(label

标签存储在 projects.config.kbFolder 树中,每个 file 类型节点有两个属性:

  • key:稳定 id(形如 tag-xxx),节点创建后永不改变,是标签的真实身份;
  • label:显示名,可随时重命名,仅用于展示。

为什么这样改:标签身份过去全链路以 label 字符串落地(kb_nodes.metadata.tag、KB Search 块、Schema 字段的 knowledgeBaseTag),重命名标签后已选 / 已入库的内容就和新名字失配。改用稳定 id 后,重命名只改 label,所有引用仍指向同一个 key,不再失配。

落地要点:

  • 标签端点统一返回 { key, label }[]GET / POST / PATCH / DELETE /kb/tags),不再返回 label[]
  • 重命名走 PATCH /kb/tags/:key(按 keylabelkey 不变);
  • 删除优先按 keyDELETE /kb/tags/:tagName 先当 key 命中删除,未命中再回落按 label 删,兼容旧客户端);
  • 入库链路写双字段:节点 metadata{ tag: <label 快照>, tagId: <key> }(保留 tag 作 label 快照不删,新增 tagId 承载稳定 key);
  • 搜索三字段兜底kb_search_similar RPC 对标签过滤做 metadata.tagId / metadata.tag / metadata.knowledgeBaseTag 三字段 OR 匹配——传 key 命中新数据的 tagId,迁移期传旧 label 仍能命中漏网旧节点的 tag / knowledgeBaseTag
  • fail-loud:入库链路解析标签时,若传入值在项目 kbFolder 中既不是合法 key 也不是已知 label(孤儿 / 死引用)返回 KB_TAG_NOT_FOUND;若同名多 key(重名歧义)返回 KB_TAG_AMBIGUOUS。两者都同步返回 4xx,不静默吞。

一、节点管理

1. 创建单个节点

POST /projects/:projectId/kb/nodes

创建一个知识库节点。

Path 参数

参数类型必填说明
projectIdstring项目 ID

Body 参数(JSON)

参数类型必填说明
source_typestring来源类型:data / file
source_idstring来源 ID(指向 project_data 或 storage_files)
levelnumber层级(0=文档, 1=章节, 2=段落, 3=句子)
contentstring文本内容
parent_idstring父节点 ID
content_typestring内容类型标识
metadataobject附加元数据。若含标签字段(tag / tagId / knowledgeBaseTag 任一),服务端会按项目 kbFolder 规范化成 { tag: <label 快照>, tagId: <稳定 key> } 后入库(issue #741)

响应 201

返回创建的节点对象。

错误码

状态码错误码说明
400KB_SOURCE_TYPE_REQUIREDsource_type 缺失
400KB_SOURCE_ID_REQUIREDsource_id 缺失
400KB_LEVEL_REQUIREDlevel 缺失
400KB_CONTENT_REQUIREDcontent 缺失
400KB_TAG_NOT_FOUNDmetadata 标签在项目 kbFolder 中既非合法 key 也非已知 label(孤儿 / 死引用)
400KB_TAG_AMBIGUOUSmetadata 标签为同名多 key(重名歧义),无法唯一解析
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
500KB_CREATE_NODE_FAILED创建节点失败

2. 批量创建节点

POST /projects/:projectId/kb/nodes/batch

批量创建节点。逐个处理,返回成功/失败列表(不回滚)。

Path 参数

参数类型必填说明
projectIdstring项目 ID

Body 参数(JSON)

参数类型必填说明
nodesarray节点数组,每项字段同「创建单个节点」

响应 200

json
{
  "results": [
    { "index": 0, "success": true, "node": { ... } },
    { "index": 1, "success": false, "error": "KB_CONTENT_REQUIRED" }
  ],
  "summary": {
    "total": 2,
    "succeeded": 1,
    "failed": 1
  }
}

标签稳定 ID(issue #741):批量入库只读一次项目 kbFolder 建索引,逐行复用。某行 metadata 标签解析失败时,该行 errorKB_TAG_NOT_FOUND(孤儿 / 死引用)或 KB_TAG_AMBIGUOUS(重名歧义),不影响其它行。

错误码

状态码错误码说明
400KB_NODE_IDS_REQUIREDnodes 必须是非空数组
404KB_PROJECT_NOT_FOUND项目不存在或无权访问

3. 查询节点列表

GET /projects/:projectId/kb/nodes

分页查询节点列表,支持过滤条件。

Path 参数

参数类型必填说明
projectIdstring项目 ID

Query 参数

参数类型必填默认值说明
pagenumber1页码
pageSizenumber20每页条数(最大 100)
source_typestring-来源类型过滤:data / file
source_idstring-来源 ID 过滤
statusstring-状态过滤:pending / embedded / error

响应 200

返回分页节点列表。

错误码

状态码错误码说明
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
500KB_SEARCH_FAILED查询失败

4. 获取单个节点

GET /projects/:projectId/kb/nodes/:nodeId

Path 参数

参数类型必填说明
projectIdstring项目 ID
nodeIdstring节点 ID

响应 200

返回节点对象。

错误码

状态码错误码说明
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
404KB_NODE_NOT_FOUND节点不存在或不属于该项目
500KB_SEARCH_FAILED查询失败

5. 获取子节点

GET /projects/:projectId/kb/nodes/:nodeId/children

获取指定节点的直接子节点。

Path 参数

参数类型必填说明
projectIdstring项目 ID
nodeIdstring父节点 ID

响应 200

json
{
  "data": [ ... ]
}

错误码

状态码错误码说明
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
404KB_NODE_NOT_FOUND节点不存在
500KB_SEARCH_FAILED查询失败

6. 获取所有后代节点

GET /projects/:projectId/kb/nodes/:nodeId/descendants

递归获取指定节点的所有后代节点。

Path 参数

参数类型必填说明
projectIdstring项目 ID
nodeIdstring祖先节点 ID

响应 200

json
{
  "data": [ ... ]
}

错误码

状态码错误码说明
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
404KB_NODE_NOT_FOUND节点不存在
500KB_SEARCH_FAILED查询失败

7. 更新节点

PATCH /projects/:projectId/kb/nodes/:nodeId

更新节点的内容或状态。

Path 参数

参数类型必填说明
projectIdstring项目 ID
nodeIdstring节点 ID

Body 参数(JSON)

参数类型必填说明
contentstring新的文本内容
content_typestring新的内容类型
metadataobject新的元数据
statusstring新的状态:pending / embedded / error
pathstring新的路径

响应 200

返回更新后的节点对象。

错误码

状态码错误码说明
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
404KB_NODE_NOT_FOUND节点不存在
500KB_UPDATE_NODE_FAILED更新失败

8. 删除节点

DELETE /projects/:projectId/kb/nodes/:nodeId

软删除节点,级联删除所有子节点。

Path 参数

参数类型必填说明
projectIdstring项目 ID
nodeIdstring节点 ID

响应 200

json
{
  "success": true
}

错误码

状态码错误码说明
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
404KB_NODE_NOT_FOUND节点不存在
500KB_DELETE_NODE_FAILED删除失败

9. 重新触发工作流

POST /projects/:projectId/kb/nodes/:nodeId/retrigger

重新触发节点的知识库工作流。file 来源会按源文件路径重入;data 来源会回查源数据记录和字段配置,使用字段最新全文重建对应 KB 节点。

标签稳定 ID 数据安全(issue #741):重入链路是「先软删旧节点,再触发重建」。为避免标签解析失败导致「删了又抛错 = 数据丢失」,所有待触发的标签会在任何软删之前先用项目 kbFolder 预校验,孤儿 / 歧义提前返回 4xx(KB_TAG_NOT_FOUND / KB_TAG_AMBIGUOUS),绝不删。

Path 参数

参数类型必填说明
projectIdstring项目 ID
nodeIdstring节点 ID

响应 200

json
{
  "success": true
}

错误码

状态码错误码说明
400KB_TAG_NOT_FOUND待触发标签在项目 kbFolder 中既非合法 key 也非已知 label(软删前预校验拦截)
400KB_TAG_AMBIGUOUS待触发标签为同名多 key(重名歧义,软删前预校验拦截)
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
404KB_NODE_NOT_FOUND节点不存在
404KB_SOURCE_NOT_FOUND源文件或源数据不存在
409KB_RETRIGGER_FIELD_NOT_FOUND无法定位 data 节点对应的数据字段
409KB_RETRIGGER_FIELD_AMBIGUOUS无法唯一定位 data 节点对应的数据字段
409KB_RETRIGGER_UNSUPPORTED当前 fallback 节点类型无法从源数据还原全文
500KB_RETRIGGER_FAILED重新触发失败

二、向量管理

10. 设置节点向量

PUT /projects/:projectId/kb/nodes/:nodeId/vector

为节点设置 embedding 向量。

Path 参数

参数类型必填说明
projectIdstring项目 ID
nodeIdstring节点 ID

Body 参数(JSON)

参数类型必填说明
embeddingnumber[]向量数组
dimensionnumber向量维度

响应 200

json
{
  "success": true
}

错误码

状态码错误码说明
400KB_EMBEDDING_REQUIREDembedding 缺失
400KB_DIMENSION_REQUIREDdimension 缺失
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
404KB_NODE_NOT_FOUND节点不存在
500KB_UPDATE_NODE_FAILED设置向量失败

11. 删除节点向量

DELETE /projects/:projectId/kb/nodes/:nodeId/vector

删除节点的 embedding 向量。

Path 参数

参数类型必填说明
projectIdstring项目 ID
nodeIdstring节点 ID

Query 参数

参数类型必填说明
dimensionnumber向量维度

响应 200

json
{
  "success": true
}

错误码

状态码错误码说明
400KB_DIMENSION_REQUIREDdimension 缺失
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
404KB_NODE_NOT_FOUND节点不存在
500KB_DELETE_NODE_FAILED删除向量失败

三、边管理

12. 创建边

POST /projects/:projectId/kb/edges

创建两个节点之间的关系边。

Path 参数

参数类型必填说明
projectIdstring项目 ID

Body 参数(JSON)

参数类型必填说明
source_idstring源节点 ID
target_idstring目标节点 ID
relation_typestring关系类型(如 tagreference
weightnumber关系权重
metadataobject附加元数据

响应 201

返回创建的边对象。

错误码

状态码错误码说明
400KB_SOURCE_ID_REQUIREDsource_id 或 target_id 缺失
400KB_SOURCE_TYPE_REQUIREDrelation_type 缺失
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
500KB_CREATE_NODE_FAILED创建边失败

13. 获取节点的边

GET /projects/:projectId/kb/nodes/:nodeId/edges

获取指定节点的所有关联边。

Path 参数

参数类型必填说明
projectIdstring项目 ID
nodeIdstring节点 ID

响应 200

json
{
  "data": [
    {
      "id": "uuid",
      "source_id": "uuid",
      "target_id": "uuid",
      "relation_type": "tag",
      "weight": 1.0,
      "metadata": {}
    }
  ]
}

错误码

状态码错误码说明
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
404KB_NODE_NOT_FOUND节点不存在
500KB_SEARCH_FAILED查询失败

14. 删除边

DELETE /projects/:projectId/kb/edges/:edgeId

删除指定的关系边。

Path 参数

参数类型必填说明
projectIdstring项目 ID
edgeIdstring边 ID

响应 200

json
{
  "success": true
}

错误码

状态码错误码说明
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
500KB_DELETE_NODE_FAILED删除边失败

四、标签管理

标签存储在项目配置的 kbFolder 树中,以 file 类型节点表示。每个标签有稳定 id key(身份)和显示名 label,详见上文「标签稳定 ID 机制」。

返回形状变更(issue #741,2026-06-14):标签端点统一返回 { key, label }[]不再返回 label[]

15. 获取标签列表

GET /projects/:projectId/kb/tags

获取项目的所有知识库标签。

Path 参数

参数类型必填说明
projectIdstring项目 ID

响应 200

json
{
  "data": [
    { "key": "tag-a1b2c3d4", "label": "产品文档" },
    { "key": "tag-e5f6g7h8", "label": "技术资料" }
  ]
}

错误码

状态码错误码说明
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
500KB_SEARCH_FAILED获取标签失败

16. 创建标签

POST /projects/:projectId/kb/tags

创建一个新标签(在 kbFolder 根目录添加 file 节点,自动生成稳定 key)。

Path 参数

参数类型必填说明
projectIdstring项目 ID

Body 参数(JSON)

参数类型必填说明
namestring标签显示名(label)。trim 后非空、长度 ≤200、不含控制字符(C0/DEL/C1)

响应 201

json
{
  "data": [
    { "key": "tag-a1b2c3d4", "label": "产品文档" },
    { "key": "tag-x9y8z7w6", "label": "新标签" }
  ]
}

返回更新后的完整标签列表。

并发安全(issue #741):写入用 projects.updated_at 乐观锁 CAS,并发期间被改写返回 409 KB_TAG_CONFLICT_RETRY,不静默覆盖。

错误码

状态码错误码说明
400KB_TAG_NAME_REQUIREDname 缺失或为空
400KB_TAG_NAME_TOO_LONGname 超过 200 字符
400KB_TAG_NAME_INVALIDname 含控制字符
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
409KB_TAG_DUPLICATE标签名已存在
409KB_TAG_CONFLICT_RETRY并发修改冲突,请重试
500KB_CREATE_TAG_FAILED创建标签失败

17. 重命名标签

PATCH /projects/:projectId/kb/tags/:key

按稳定 key 重命名标签:只改 labelkey 不变。这是标签稳定 ID 根治的核心——重命名后已选 / 已入库内容的引用(指向 key)不失配。

Path 参数

参数类型必填说明
projectIdstring项目 ID
keystring标签稳定 id(URL 编码)

Body 参数(JSON)

参数类型必填说明
namestring新的显示名(label)。校验同「创建标签」:trim 非空、≤200、无控制字符。新名不能与其它 key 的标签同名(与自身同名是空操作,允许)

响应 200

json
{
  "data": [
    { "key": "tag-a1b2c3d4", "label": "产品文档(已改名)" }
  ]
}

返回更新后的完整标签列表。

并发安全(issue #741):同「创建标签」走 projects.updated_at 乐观锁 CAS。

错误码

状态码错误码说明
400KB_TAG_NAME_REQUIREDname 缺失或为空
400KB_TAG_NAME_TOO_LONGname 超过 200 字符
400KB_TAG_NAME_INVALIDname 含控制字符
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
404KB_TAG_NOT_FOUND指定 key 的标签不存在
409KB_TAG_DUPLICATE新名与其它标签重名
409KB_TAG_CONFLICT_RETRY并发修改冲突,请重试
500KB_RENAME_TAG_FAILED重命名失败

18. 删除标签

DELETE /projects/:projectId/kb/tags/:tagName

删除指定标签(从 kbFolder 中递归删除匹配的 file 节点)。

标签稳定 ID(issue #741):路由参数名沿用 tagName 兼容旧客户端,但优先按稳定 key 删除;当作 key 未命中时再回落按 label 删除。

Path 参数

参数类型必填说明
projectIdstring项目 ID
tagNamestring标签稳定 key(优先)或显示名 label(回落兼容),URL 编码

响应 200

json
{
  "data": [
    { "key": "tag-a1b2c3d4", "label": "产品文档" }
  ]
}

返回更新后的标签列表({ key, label }[])。

错误码

状态码错误码说明
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
500KB_DELETE_TAG_FAILED删除标签失败

五、搜索

19. 向量相似度搜索

POST /projects/:projectId/kb/search

基于 embedding 向量进行相似度搜索。

Path 参数

参数类型必填说明
projectIdstring项目 ID

Body 参数(JSON)

参数类型必填说明
query_embeddingnumber[]查询向量
dimensionnumber向量维度
limitnumber返回结果数量上限
source_typesstring[]来源类型过滤:["data"] / ["file"]
source_idsstring[]来源 ID 过滤
level_filternumber[]层级过滤
similarity_thresholdnumber相似度阈值
tagsstring[]标签过滤。issue #741 起推荐传稳定标签 key,命中节点 metadata.tagId;迁移期传旧 label 仍可命中 metadata.tag / metadata.knowledgeBaseTag(RPC 三字段 OR 兜底)。多标签 OR;不传 = 不过滤。每项自动 trim 首尾空白后参与匹配;单项 ≤128 字符,数量 ≤50,不允许空串/纯空白

响应 200

json
{
  "data": [
    {
      "id": "uuid",
      "content": "匹配的文本内容",
      "similarity": 0.92,
      "source_type": "data",
      "source_id": "uuid",
      "level": 2,
      "metadata": {}
    }
  ]
}

错误码

状态码错误码说明
400KB_QUERY_EMBEDDING_REQUIREDquery_embedding 缺失
400KB_DIMENSION_REQUIREDdimension 缺失
400KB_TAGS_INVALIDtags 非法(非字符串数组 / 含空串 / 超长 / 超量)
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
500KB_SEARCH_FAILED搜索失败

20. 文本搜索

POST /projects/:projectId/kb/text-search

基于文本的语义搜索。后端自动生成 embedding(维度 1536),然后执行向量搜索。

Path 参数

参数类型必填说明
projectIdstring项目 ID

Body 参数(JSON)

参数类型必填说明
querystring搜索文本
limitnumber返回结果数量上限
source_typesstring[]来源类型过滤
similarity_thresholdnumber相似度阈值
tagsstring[]标签过滤。issue #741 起推荐传稳定标签 key,命中节点 metadata.tagId;迁移期传旧 label 仍可命中 metadata.tag / metadata.knowledgeBaseTag(RPC 三字段 OR 兜底)。多标签 OR;不传 = 不过滤。每项自动 trim 首尾空白后参与匹配;单项 ≤128 字符,数量 ≤50,不允许空串/纯空白

响应 200

json
{
  "data": [
    {
      "id": "uuid",
      "content": "匹配的文本内容",
      "similarity": 0.89,
      "source_type": "file",
      "source_id": "uuid"
    }
  ]
}

错误码

状态码错误码说明
400KB_QUERY_REQUIREDquery 缺失或为空
400KB_TAGS_INVALIDtags 非法(非字符串数组 / 含空串 / 超长 / 超量)
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
500KB_SEARCH_FAILED搜索失败

21. Tag 扩展搜索

POST /projects/:projectId/kb/expand

基于已知节点,通过边关系扩展搜索关联节点。

Path 参数

参数类型必填说明
projectIdstring项目 ID

Body 参数(JSON)

参数类型必填说明
node_idsstring[]起始节点 ID 列表(非空数组)
relation_typesstring[]关系类型过滤
max_depthnumber最大遍历深度
limitnumber返回结果数量上限

响应 200

json
{
  "data": [ ... ]
}

错误码

状态码错误码说明
400KB_NODE_IDS_REQUIREDnode_ids 缺失或为空
404KB_PROJECT_NOT_FOUND项目不存在或无权访问
500KB_SEARCH_FAILED搜索失败

源码

  • 路由apps/backend/src/routes/knowledge-base.ts
  • 服务apps/backend/src/services/knowledge-base.ts
  • 参考文档知识库使用指南

补充端点

本节补充 plans/need-update-api.md 中尚未覆盖到 docs-site 的接口。端点标题保持严格的 METHOD /path 格式,便于后台文档覆盖率服务识别。

POST /projects/:projectId/kb/ingest

知识摄入

认证:JWT Bearer Token 或 API Key(combinedAuth)。 路径参数

参数说明
projectId项目 ID

请求:请求体为 JSON,包含创建、提交、安装、发布或业务动作所需字段。

响应:成功时返回创建或更新后的资源对象,或 { "success": true }

常见错误400 参数非法,401 未认证,403 权限不足,404 资源不存在;服务端或上游异常返回 500


PUT /projects/:projectId/kb/nodes/:nodeId

整体更新知识库节点内容或元数据。

认证:JWT Bearer Token 或 API Key(combinedAuth)。 路径参数

参数说明
projectId项目 ID
nodeId知识节点 ID

请求:请求体为 JSON,表示该资源的目标配置或完整更新内容。

响应:成功时返回创建或更新后的资源对象,或 { "success": true }

常见错误400 参数非法,401 未认证,403 权限不足,404 资源不存在;服务端或上游异常返回 500


POST /projects/:projectId/kb/process

触发知识库节点处理、解析或向量化任务。

认证:JWT Bearer Token 或 API Key(combinedAuth)。 路径参数

参数说明
projectId项目 ID

请求:请求体为 JSON,包含创建、提交、安装、发布或业务动作所需字段。

响应:成功时返回任务触发结果、运行状态或同步摘要;长任务可能只表示已入队。

常见错误400 参数非法,401 未认证,403 权限不足,404 资源不存在;服务端或上游异常返回 500

POST /projects/:projectId/kb/nodes/batch-delete

批量软删除知识库节点。请求体提供节点 ID 列表;调用方必须具有项目写权限,响应返回实际删除数量。

AI Workflow Editor