Skip to content

Commit d3b67ff

Browse files
feat: knowledge
1 parent 87d64b8 commit d3b67ff

76 files changed

Lines changed: 690 additions & 274 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎ui/src/api/API_README.md‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ v3 编辑表单提交 `{ name, description }`,标题上限 64、更新说明
149149
`source: 'shared'` 与 `source: 'workspace'`。`SelectModel` 的接口选项统一通过此方法查询,
150150
工作流通过 Store 同名方法使用缓存或强制刷新。模型管理列表继续使用 `getModelList`。
151151

152+
`system/shared-resources/model.ts` 同样提供 `getModelListWithShared(query)`,沿用
153+
`/system/shared/model` 查询共享模型,为每项标记 `source: 'shared'`;不查询工作空间模型。
154+
共享工作流、代码生成和默认模型设置统一调用此方法,模型管理继续使用 `getModelList`。
155+
152156
### 工具列表查询
153157

154158
`workspace/tool/tool.ts` 的 `getAllTool(query)` 查询支持 `folder_id` 筛选的工作空间工具
@@ -189,6 +193,13 @@ Application API,直接转发生成请求,不使用查询缓存或请求去
189193

190194
### 知识库维护
191195

196+
关联问题生成按资源归属提交:`putGenerateKnowledgeQuestions` PUT 到
197+
`/<knowledgeId>/generate_related`;`putGenerateDocumentQuestions` PUT 到
198+
`/<knowledgeId>/document/batch_generate_related`,单项也使用单元素 `document_id_list`。
199+
`RelatedQuestionsConfig` 共用模型、模型参数及提示词,`KnowledgeGeneratePayload` 增加
200+
`state_list`,`DocumentGeneratePayload` 再增加 `document_id_list`,类型从 `@/api/types` 导入。
201+
公共配置弹窗只返回表单与状态,各 Action 调用各自完整业务 API。
202+
192203
`getKnowledgeMcpConfig(knowledgeId)` 与 `postKnowledgeKeywordIndex(knowledgeId)` 为预留接口方法,
193204
目前不发送 HTTP 请求:前者返回空配置文本,后者模拟成功。后续确认后端协议后替换方法内部实现。
194205
MCP 入口加载配置后打开只读及复制弹窗;分词索引入口仅调用方法并在成功后提示“操作成功”。
@@ -214,6 +225,10 @@ MCP 入口加载配置后打开只读及复制弹窗;分词索引入口仅调
214225
设置页更换向量模型时先确认、保存,再调用该接口;Web、飞书配置通过 `meta` 提交,保留未编辑的
215226
已有配置,文件数量与大小限制仍作为知识库顶层字段提交。
216227

228+
`putSyncWebKnowledge(knowledgeId, syncType)` 使用 PUT 请求 `/<knowledgeId>/sync`,
229+
查询参数 `sync_type` 为 `replace`(替换同步)或 `complete`(整体同步),不传请求体。
230+
仅用于 Web 知识库;页面负责方式选择、覆盖提示、loading 与任务提交成功提示。
231+
217232
知识库创建通过 `postKnowledge`、`postWebKnowledge` 分别提交到 `/base`、`/web`;
218233
`postLarkKnowledge` 沿用飞书扩展接口 `/lark/save`,当前开源后端未包含该实现。
219234
基础创建字段由 `KnowledgeCreatePayload` 统一维护,Web、飞书请求扩展对应类型;工作流创建
@@ -509,6 +524,9 @@ System 接口由资源管理服务提供;本地开源后端没有对应扩展
509524
单项向量化使用 `putDocumentRefresh(knowledgeId, documentId, stateList)` 请求 `/<documentId>/refresh`;
510525
单项取消使用 `putCancelTask(knowledgeId, documentId, taskType)` 请求 `/<documentId>/cancel_task`,提交 `{ type }`。
511526
批量向量化与取消分别沿用 `batch_refresh` 和 `batch_cancel_task`,不以单元素批量请求代替单项接口。
527+
单项分词使用 `putDocumentTokenize(knowledgeId, documentId, stateList)` 请求 `/<documentId>/tokenize`,
528+
提交 `{ state_list }`;批量分词使用 `putBatchTokenizeDocuments` 请求 `batch_tokenize`,
529+
提交 `{ id_list, state_list }`。两者均包含全部七种分段状态;单项取消分词复用 `putCancelTask`,任务类型为 `TOKENIZE`。
512530
文档设置的共享载荷为 `DocumentSettingPayload`,生成问题使用 `DocumentGeneratePayload`;
513531
单项设置通过 `meta` 保留来源数据,批量设置将 `allow_download` 放在顶层。
514532
飞书同步沿用 v2 扩展接口 `/knowledge/lark/<knowledgeId>/_batch`,需部署环境支持。

‎ui/src/api/admin/system/shared-resources/model.ts‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ const getModelList = (query?: Dict<unknown>) => {
1111
return get<ModelItem[]>(prefix, query)
1212
}
1313

14+
/** 获取 System 共享范围的模型选项,并标记共享来源。 */
15+
// TODO 资源共享的模型是不是都是共享的
16+
const getModelListWithShared = (query?: Dict<unknown>): Promise<ModelItem[]> =>
17+
getModelList(query).then((models) => models.map((model): ModelItem => ({ ...model, source: 'shared' })))
18+
1419
/** 创建 System 共享模型。 */
1520
const postModel = (payload: ModelPayload) => {
1621
return post<ModelPayload, ModelItem>(prefix, payload)
@@ -51,4 +56,15 @@ const putPauseModelDownload = (modelId: string) => {
5156
return put<undefined, boolean>(`${prefix}/${modelId}/pause_download`)
5257
}
5358

54-
export default { deleteModel, getModelDetail, getModelList, getModelMeta, getModelParamsForm, postModel, putModel, putModelParamsForm, putPauseModelDownload }
59+
export default {
60+
deleteModel,
61+
getModelDetail,
62+
getModelList,
63+
getModelListWithShared,
64+
getModelMeta,
65+
getModelParamsForm,
66+
postModel,
67+
putModel,
68+
putModelParamsForm,
69+
putPauseModelDownload,
70+
}

‎ui/src/api/admin/workspace/knowledge/document.ts‎

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,9 @@ const putBatchRefreshDocuments = (knowledgeId: string, documentIds: string[], st
4242
put(`${getPrefix(knowledgeId)}/batch_refresh`, { id_list: documentIds, state_list: stateList })
4343

4444
/** 单个文档分词索引。 */
45-
const putDocumentTokenize: (knowledge_id: string, document_id: string, state_list: Array<string>, loading?: Ref<boolean>) => Promise<Result<any>> = (
46-
knowledge_id,
47-
document_id,
48-
state_list,
49-
loading,
50-
) => {
51-
return put(`${getPrefix(knowledge_id)}/${document_id}/tokenize`, { state_list }, undefined, loading)
52-
}
45+
const putDocumentTokenize = (knowledgeId: string, documentId: string, stateList: DocumentTaskState[]) =>
46+
put(`${getPrefix(knowledgeId)}/${documentId}/tokenize`, { state_list: stateList })
47+
5348
/** 批量文档分词索引。 */
5449
const putBatchTokenizeDocuments = (knowledgeId: string, documentIds: string[], stateList: DocumentTaskState[]) =>
5550
put(`${getPrefix(knowledgeId)}/batch_tokenize`, { id_list: documentIds, state_list: stateList })
@@ -62,7 +57,6 @@ const putCancelTask = (knowledgeId: string, documentId: string, taskType: Docume
6257
const putBatchCancelDocumentTask = (knowledgeId: string, documentIds: string[], taskType: DocumentTaskType) =>
6358
put(`${getPrefix(knowledgeId)}/batch_cancel_task`, { id_list: documentIds, type: taskType })
6459

65-
6660
/** 保存单个文档的召回及来源设置。 */
6761
const putDocumentSetting = (knowledgeId: string, documentId: string, data: DocumentSettingPayload) =>
6862
put(`${getPrefix(knowledgeId)}/${documentId}`, data)
@@ -120,6 +114,7 @@ export default {
120114
putBatchDeleteDocuments,
121115
putDocumentRefresh,
122116
putBatchRefreshDocuments,
117+
putDocumentTokenize,
123118
putBatchTokenizeDocuments,
124119
putCancelTask,
125120
putBatchCancelDocumentTask,

‎ui/src/api/admin/workspace/knowledge/knowledge.ts‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
KnowledgeTagGroup,
66
KnowledgeDetail,
77
KnowledgeItem,
8+
KnowledgeGeneratePayload,
89
KnowledgeCreatePayload,
910
WebKnowledgeCreatePayload,
1011
LarkKnowledgeCreatePayload,
@@ -60,11 +61,21 @@ const putLarkKnowledge = (knowledgeId: string, payload: Partial<KnowledgeItem>)
6061
return put<Partial<KnowledgeItem>, KnowledgeItem>(`${getPrefix()}/lark/${knowledgeId}`, payload)
6162
}
6263

64+
/** 根据知识库中的分段生成关联问题。 */
65+
const putGenerateKnowledgeQuestions = (knowledgeId: string, payload: KnowledgeGeneratePayload) => {
66+
return put(`${getPrefix()}/${knowledgeId}/generate_related`, payload)
67+
}
68+
6369
/** 对知识库中的文档重新向量化。 */
6470
const putReEmbeddingKnowledge = (knowledgeId: string) => {
6571
return put<undefined, boolean>(`${getPrefix()}/${knowledgeId}/embedding`)
6672
}
6773

74+
/** 同步 Web 知识库。 */
75+
const putSyncWebKnowledge = (knowledgeId: string, syncType: 'replace' | 'complete') => {
76+
return put<undefined, boolean>(`${getPrefix()}/${knowledgeId}/sync`, undefined, { sync_type: syncType })
77+
}
78+
6879
/** 批量删除工作空间知识库。 */
6980
const putBatchDeleteKnowledge = (knowledgeIds: string[]) => {
7081
return put<{ id_list: string[] }, boolean>(`${getPrefix()}/batch_delete`, { id_list: knowledgeIds })
@@ -127,6 +138,8 @@ export default {
127138
putKnowledge,
128139
putLarkKnowledge,
129140
putReEmbeddingKnowledge,
141+
putGenerateKnowledgeQuestions,
142+
putSyncWebKnowledge,
130143
putBatchDeleteKnowledge,
131144
putBatchMoveKnowledge,
132145
postKnowledgeImport,

‎ui/src/api/types/document.ts‎

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { DOCUMENT_HIT_HANDLING, DOCUMENT_TASK_STATE, DOCUMENT_TASK_TYPE } from '@/api/enums'
2-
import type { KnowledgeType } from './knowledge'
2+
import type { KnowledgeGeneratePayload, KnowledgeType } from './knowledge'
33
export type DocumentHitHandling = (typeof DOCUMENT_HIT_HANDLING)[keyof typeof DOCUMENT_HIT_HANDLING]
44
export type DocumentTaskState = (typeof DOCUMENT_TASK_STATE)[keyof typeof DOCUMENT_TASK_STATE]
55
export type DocumentTaskType = (typeof DOCUMENT_TASK_TYPE)[keyof typeof DOCUMENT_TASK_TYPE]
@@ -18,12 +18,8 @@ export interface DocumentSettingPayload {
1818
}
1919

2020
/** 根据文档分段生成问题。 */
21-
export interface DocumentGeneratePayload {
21+
export interface DocumentGeneratePayload extends KnowledgeGeneratePayload {
2222
document_id_list: string[]
23-
model_id: string
24-
model_params_setting: Record<string, unknown>
25-
prompt: string
26-
state_list: DocumentTaskState[]
2723
}
2824

2925
/** 文件各任务的分段计数及状态发生时间。 */

‎ui/src/api/types/knowledge.ts‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,19 @@
33
import type LogicFlow from '@logicflow/core'
44
import { KNOWLEDGE_TYPE } from '@/api/enums'
55
import type { DefaultModelSettingPayload } from './model'
6+
import type { DocumentTaskState } from './document'
7+
8+
/** 生成关联问题共用的模型与提示词配置。 */
9+
export interface RelatedQuestionsConfig {
10+
model_id: string
11+
model_params_setting: Record<string, unknown>
12+
prompt: string
13+
}
14+
15+
/** 对知识库中指定任务状态的分段生成关联问题。 */
16+
export interface KnowledgeGeneratePayload extends RelatedQuestionsConfig {
17+
state_list: DocumentTaskState[]
18+
}
619

720
export type KnowledgeType = (typeof KNOWLEDGE_TYPE)[keyof typeof KNOWLEDGE_TYPE]
821

‎ui/src/assets/iconfont.js‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎ui/src/components/COMPONENT_README.md‎

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,20 @@ import { MkDynamicsForm, MkDynamicsFormConstructor } from '@/components/mk-dynam
6464
- `el-input-number` 设置 `controls-position="right"` 时,同时设置 `align="left"`。
6565
- Tooltip、Popover、Popconfirm、Dropdown 的触发插槽只保留一个有实际布局盒的根节点;
6666
多个元素用 `span` 或 `div` 包裹,不使用 `template` 或 `display: contents` 代替。
67-
- 名称、标题、标签及必填业务文本使用独立的 `whitespace: true` 规则拒绝纯空白,保留原有
68-
`trim()` 清理逻辑。数字、布尔、选择项、数组和允许空白的原始参数值不统一套用;自定义
69-
`validator` 需要空白检查时拆成独立规则,避免覆盖内置校验。动态表单仅文本框、文本域的
67+
- 名称、标题、标签及必填业务文本将 `whitespace: true` 与 `required` 写在同一条规则中,
68+
统一使用原有“请输入…”提示,不拆分空白校验规则或单独提示空白错误,保留原有 `trim()` 清理逻辑。
69+
数字、布尔、选择项、数组和允许空白的原始参数值不统一套用;自定义 `validator` 与内置
70+
必填、空白校验规则分开,避免覆盖内置校验。动态表单仅文本框、文本域的
7071
默认规则及构造器生成的必填规则启用该检查,密码和服务端显式校验协议保持原有行为。
71-
- 业务弹窗 `open()` 先重置再回填,关闭动画结束的 `closed` 统一清理表单、校验和临时状态。
72+
- 业务弹窗的生命周期按实际挂载方式处理,不在 `open()` 与 `closed` 两端重复重置:
73+
- 保留业务组件实例时,默认值在声明处初始化,关闭动画结束的 `closed` 统一清理表单、编辑 ID、
74+
校验和临时状态;`open()` 只回填本次数据、恢复业务缓存、发起必要查询并显示弹窗。
75+
- 所有调用方均在 `closed` 后卸载整个业务组件时,局部状态由下次挂载重新初始化,`closed` 只通知
76+
父级卸载;计时器、订阅、流式请求等资源释放仍需保留。
77+
- 同时存在常驻和按需挂载调用方时,按常驻组件保留关闭清理;`MkDialog` 的 `destroyOnClose`
78+
只销毁内部内容,不等于销毁外层业务组件,不能据此删除外层状态重置。
79+
- `close()` 只发起关闭,表单清理放在 `closed`,避免关闭动画中内容跳变;依赖本次参数的默认值、
80+
编辑快照、动态字段及每次打开必须重新查询的数据仍在 `open()` 初始化。
7281
父级负责校验或请求时,子组件提交数据后由父级成功调用 `close()`,失败保持打开。
7382
- 仅登录表单支持回车提交;其他业务表单使用 `@submit.prevent`,保存、添加由按钮触发。
7483
自定义 `submit` 事件不等于原生表单提交。
@@ -775,6 +784,30 @@ Model 配置器的默认模型也使用 `SelectModel`,仅展示已选的可选
775784

776785
业务组件显式导入,可调用固定业务 API;页面保留自身的列表查询、路由和保存编排。
777786

787+
### GenerateQuestionsDialog
788+
789+
`business/generate-questions/GenerateQuestionsDialog.vue` 共用关联问题配置,
790+
知识库和文档 Action 显式导入,打开时挂载、`closed` 后卸载,局部状态依赖重新挂载初始化。传入提交
791+
`loading`,通过 `open()` 打开、`close()` 关闭,不传 `modelApi`。
792+
弹窗通过 `isSystemResource()`、`isSystemSharedResource()` 选择 System 资源管理、System 共享资源
793+
或 Workspace Model API,统一查询当前范围的 LLM 选项和模型参数;供应商使用公共 API 查询,
794+
并为 `SelectModel` 提供模型参数查询;支持创建模型后刷新,
795+
下拉使用 `teleported`。模型选项与参数查询共用一个 `modelLoading`,通过 `finally` 释放;
796+
表单禁用状态统一为 `loading || modelLoading`,失败提示由请求层处理。
797+
提交请求状态由 Action 传入的 `loading` 管理,表单校验后再次检查状态,避免重复提交。
798+
799+
弹窗只通过资源上下文工具判断范围,不持有知识库/文档/段落 ID,也不调用生成接口。`submit(config, stateList)`
800+
返回 `RelatedQuestionsConfig` 与任务状态数组,由各 Action 补齐目标 ID、提交各自接口、提示、
801+
关闭和刷新。`showParagraphScope` 默认开启,每次打开默认仅处理未成功部分;段落场景传
802+
`false` 隐藏范围,返回空状态数组,调用方只提交配置与段落 ID,不传 `state_list`。
803+
804+
表单状态保留在 Dialog,同目录 `prompt-cache.ts` 负责按用户读取与保存模型、参数、提示词,
805+
不注册专用 Store;每次打开读取缓存,提交时保留其他用户的最新记录。
806+
沿用 v2 的 `localStorage.PROMPT_CACHE` 及 `[{ user, formValue }]` 数组结构,直接读取已有配置,
807+
保存时只替换当前用户记录,同一用户跨工作空间共用配置;不再传入工作空间 ID。
808+
不保存目标 ID 或分段范围;缓存用 `cloneDeep` 隔离,模型失效时清空模型及参数。
809+
取消不保存,提交前校验必填与纯空白提示词;提交失败保留表单,缓存不可用不阻止生成。
810+
778811
### GenerateContent
779812

780813
`business/generate-content/index.vue` 封装生成入口按钮和弹窗,供提示词与 Python
@@ -838,7 +871,7 @@ Workspace 的文件夹虚拟树业务组件。组件根据当前资源上下文
838871
手动导入 `business/select-application-dialog/index.vue` 和 `business/select-tool-dialog/index.vue`。
839872
两者沿用知识库选择弹窗的目录、名称搜索、三列卡片、悬停详情、跨目录选择和清空交互;
840873
`open()` 接收已选资源对象数组,`submit` 返回深拷贝后的资源对象数组,兼容只有 ID 的旧数据。
841-
每次打开先重置临时状态;取消不提交。
874+
打开时回填本次选择并查询资源,临时状态在 `closed` 清理;取消不提交。
842875

843876
智能体通过 `getAllApplication` 全量查询已发布资源,不展示共享目录。工具通过工作空间或共享
844877
`getAllTool` 全量查询,仅展示启用资源;`toolTypes` 默认包含自定义、工作流和内置工具,

0 commit comments

Comments
 (0)