Skip to content

Commit c632a09

Browse files
shaohuzhang1liuruibin
authored andcommitted
feat: knowledge workflow
1 parent cd68e89 commit c632a09

File tree

17 files changed

+338
-77
lines changed

17 files changed

+338
-77
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# Generated by Django 5.2.4 on 2025-11-04 05:54
2+
3+
import django.db.models.deletion
4+
import uuid_utils.compat
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('knowledge', '0003_tag_documenttag'),
12+
]
13+
14+
operations = [
15+
migrations.AlterField(
16+
model_name='document',
17+
name='type',
18+
field=models.IntegerField(choices=[(0, '通用类型'), (1, 'web站点类型'), (2, '飞书类型'), (3, '语雀类型'), (4, '工作流类型')], db_index=True, default=0, verbose_name='类型'),
19+
),
20+
migrations.AlterField(
21+
model_name='knowledge',
22+
name='type',
23+
field=models.IntegerField(choices=[(0, '通用类型'), (1, 'web站点类型'), (2, '飞书类型'), (3, '语雀类型'), (4, '工作流类型')], db_index=True, default=0, verbose_name='类型'),
24+
),
25+
migrations.CreateModel(
26+
name='KnowledgeWorkflow',
27+
fields=[
28+
('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')),
29+
('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')),
30+
('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')),
31+
('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')),
32+
('work_flow', models.JSONField(default=dict, verbose_name='工作流数据')),
33+
('is_publish', models.BooleanField(db_index=True, default=False, verbose_name='是否发布')),
34+
('publish_time', models.DateTimeField(blank=True, null=True, verbose_name='发布时间')),
35+
('knowledge', models.OneToOneField(db_constraint=False, on_delete=django.db.models.deletion.CASCADE, related_name='workflow', to='knowledge.knowledge', verbose_name='知识库')),
36+
],
37+
options={
38+
'db_table': 'knowledge_workflow',
39+
},
40+
),
41+
migrations.CreateModel(
42+
name='KnowledgeWorkflowVersion',
43+
fields=[
44+
('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')),
45+
('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')),
46+
('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')),
47+
('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')),
48+
('work_flow', models.JSONField(default=dict, verbose_name='工作流数据')),
49+
('publish_user_id', models.UUIDField(default=None, null=True, verbose_name='发布者id')),
50+
('publish_user_name', models.CharField(default='', max_length=128, verbose_name='发布者名称')),
51+
('knowledge', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.CASCADE, to='knowledge.knowledge', verbose_name='知识库')),
52+
('workflow', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.CASCADE, related_name='versions', to='knowledge.knowledgeworkflow', verbose_name='工作流')),
53+
],
54+
options={
55+
'db_table': 'knowledge_workflow_version',
56+
'unique_together': {('knowledge',)},
57+
},
58+
),
59+
]

apps/knowledge/models/knowledge.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ class KnowledgeWorkflowVersion(AppModelMixin):
167167

168168
class Meta:
169169
db_table = "knowledge_workflow_version"
170-
unique_together = [['knowledge', 'version']] # 同一知识库的版本号唯一
170+
unique_together = [['knowledge']] # 同一知识库的版本号唯一
171171

172172

173173
def get_default_status():

apps/knowledge/serializers/knowledge.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,8 +342,15 @@ def one(self):
342342
)
343343
)
344344
), with_search_one=True)
345+
workflow = {}
346+
if knowledge_dict.get('type') == 4:
347+
from knowledge.models import KnowledgeWorkflow
348+
k = QuerySet(KnowledgeWorkflow).filter(knowledge_id=knowledge_dict.get('id')).first()
349+
if k:
350+
workflow = k.work_flow
345351
return {
346352
**knowledge_dict,
353+
'workflow': workflow,
347354
'meta': json.loads(knowledge_dict.get('meta', '{}')),
348355
'application_id_list': list(filter(
349356
lambda application_id: all_application_list.__contains__(application_id),

apps/knowledge/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
path('workspace/knowledge/document/table_template/export', views.TableTemplate.as_view()),
1010
path('workspace/<str:workspace_id>/knowledge', views.KnowledgeView.as_view()),
1111
path('workspace/<str:workspace_id>/knowledge/base', views.KnowledgeBaseView.as_view()),
12+
path('workspace/<str:workspace_id>/knowledge/workflow', views.KnowledgeWorkflowView.as_view()),
1213
path('workspace/<str:workspace_id>/knowledge/web', views.KnowledgeWebView.as_view()),
1314
path('workspace/<str:workspace_id>/knowledge/model', views.KnowledgeView.Model.as_view()),
1415
path('workspace/<str:workspace_id>/knowledge/embedding_model', views.KnowledgeView.EmbeddingModel.as_view()),
@@ -67,5 +68,5 @@
6768
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/problem/<int:current_page>/<int:page_size>', views.ProblemView.Page.as_view()),
6869
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/document/<int:current_page>/<int:page_size>', views.DocumentView.Page.as_view()),
6970
path('workspace/<str:workspace_id>/knowledge/<int:current_page>/<int:page_size>', views.KnowledgeView.Page.as_view()),
70-
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/workflow', views.KnowledgeWorkflowView.as_view()),
71+
7172
]

ui/src/api/knowledge/knowledge.ts

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,18 @@ const postKnowledge: (data: knowledgeData, loading?: Ref<boolean>) => Promise<Re
196196
return post(`${prefix.value}/base`, data, undefined, loading, 1000 * 60 * 5)
197197
}
198198

199+
/**
200+
* 创建工作流知识库
201+
* @param data
202+
* @param loading
203+
* @returns
204+
*/
205+
const createWorkflowKnowledge: (data: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
206+
data,
207+
loading,
208+
) => {
209+
return post(`${prefix.value}/workflow`, data, undefined, loading)
210+
}
199211
/**
200212
* 获取当前用户可使用的向量化模型列表 (没用到)
201213
* @param application_id
@@ -250,7 +262,7 @@ const postLarkKnowledge: (data: any, loading?: Ref<boolean>) => Promise<Result<A
250262
const putLarkKnowledge: (
251263
knowledge_id: string,
252264
data: any,
253-
loading?: Ref<boolean>
265+
loading?: Ref<boolean>,
254266
) => Promise<Result<any>> = (knowledge_id, data, loading) => {
255267
return put(`${prefix.value}/lark/${knowledge_id}`, data, undefined, loading)
256268
}
@@ -262,45 +274,45 @@ const getAllTags: (params: any, loading?: Ref<boolean>) => Promise<Result<any>>
262274
return get(`${prefix.value}/tags`, params, loading)
263275
}
264276

265-
const getTags: (knowledge_id: string, params: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
266-
knowledge_id,
267-
params,
268-
loading,
269-
) => {
277+
const getTags: (
278+
knowledge_id: string,
279+
params: any,
280+
loading?: Ref<boolean>,
281+
) => Promise<Result<any>> = (knowledge_id, params, loading) => {
270282
return get(`${prefix.value}/${knowledge_id}/tags`, params, loading)
271283
}
272284

273-
const postTags: (knowledge_id: string, tags: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
274-
knowledge_id,
275-
tags,
276-
loading,
277-
) => {
285+
const postTags: (
286+
knowledge_id: string,
287+
tags: any,
288+
loading?: Ref<boolean>,
289+
) => Promise<Result<any>> = (knowledge_id, tags, loading) => {
278290
return post(`${prefix.value}/${knowledge_id}/tags`, tags, null, loading)
279291
}
280292

281-
const putTag: (knowledge_id: string, tag_id: string, tag: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
282-
knowledge_id,
283-
tag_id,
284-
tag,
285-
loading,
286-
) => {
293+
const putTag: (
294+
knowledge_id: string,
295+
tag_id: string,
296+
tag: any,
297+
loading?: Ref<boolean>,
298+
) => Promise<Result<any>> = (knowledge_id, tag_id, tag, loading) => {
287299
return put(`${prefix.value}/${knowledge_id}/tags/${tag_id}`, tag, null, loading)
288300
}
289301

290-
const delTag: (knowledge_id: string, tag_id: string, type: string, loading?: Ref<boolean>) => Promise<Result<any>> = (
291-
knowledge_id,
292-
tag_id,
293-
type,
294-
loading,
295-
) => {
302+
const delTag: (
303+
knowledge_id: string,
304+
tag_id: string,
305+
type: string,
306+
loading?: Ref<boolean>,
307+
) => Promise<Result<any>> = (knowledge_id, tag_id, type, loading) => {
296308
return del(`${prefix.value}/${knowledge_id}/tags/${tag_id}/${type}`, null, loading)
297309
}
298310

299-
const delMulTag: (knowledge_id: string, tags: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
300-
knowledge_id,
301-
tags,
302-
loading,
303-
) => {
311+
const delMulTag: (
312+
knowledge_id: string,
313+
tags: any,
314+
loading?: Ref<boolean>,
315+
) => Promise<Result<any>> = (knowledge_id, tags, loading) => {
304316
return put(`${prefix.value}/${knowledge_id}/tags/batch_delete`, tags, null, loading)
305317
}
306318

@@ -326,5 +338,6 @@ export default {
326338
postTags,
327339
putTag,
328340
delTag,
329-
delMulTag
341+
delMulTag,
342+
createWorkflowKnowledge,
330343
}
Lines changed: 15 additions & 0 deletions
Loading

ui/src/enums/application.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,8 @@ export enum WorkflowMode {
4343
Application = 'application',
4444
// 应用工作流循环
4545
ApplicationLoop = 'application-loop',
46+
// 知识库工作流
47+
Knowledge = 'knowledge',
48+
// 知识库工作流循环体
49+
KnowledgeLoop = 'knowledge-loop',
4650
}

ui/src/locales/lang/en-US/views/knowledge.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export default {
3030
generalKnowledge: 'General Knowledge',
3131
webKnowledge: 'Web Knowledge',
3232
larkKnowledge: 'Lark Knowledge',
33+
workflowKnowledge: 'Workflow Knowledge',
3334
yuqueKnowledge: 'Yuque Knowledge',
3435
generalInfo: 'Upload local documents',
3536
webInfo: 'Sync text data from a web site',
@@ -39,6 +40,8 @@ export default {
3940
createWebKnowledge: 'Create Web Knowledge',
4041
createLarkKnowledge: 'Create Lark Knowledge',
4142
createYuqueKnowledge: 'Create Yuque Knowledge',
43+
createWorkflowKnowledge: 'Create Workflow Knowledge',
44+
workflowInfo: 'Building a knowledge base through custom workflow methods',
4245
},
4346
form: {
4447
knowledgeName: {

ui/src/locales/lang/zh-CN/views/knowledge.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export default {
2424
generalKnowledge: '通用知识库',
2525
webKnowledge: 'web知识库',
2626
larkKnowledge: '飞书知识库',
27+
workflowKnowledge: '工作流知识库',
2728
yuqueKnowledge: '语雀知识库',
2829
generalInfo: '通过上传文件或手动录入构建知识库',
2930
webInfo: '通过网站链接构建知识库',
@@ -33,6 +34,8 @@ export default {
3334
createWebKnowledge: '创建 web 知识库',
3435
createLarkKnowledge: '创建飞书知识库',
3536
createYuqueKnowledge: '创建语雀知识库',
37+
createWorkflowKnowledge: '创建工作流知识库',
38+
workflowInfo: '通过自定义工作流方式构建知识库',
3639
},
3740
form: {
3841
knowledgeName: {

ui/src/locales/lang/zh-Hant/views/knowledge.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,14 @@ export default {
2828
generalKnowledge: '通用知識庫',
2929
webKnowledge: 'Web 知識庫',
3030
larkKnowledge: '飛書知識庫',
31+
workflowKnowledge: '工作流知識庫',
3132
yuqueKnowledge: '語雀知識庫',
3233
generalInfo: '上傳本地檔案',
3334
webInfo: '同步Web網站文字資料',
3435
larkInfo: '通過飛書文檔構建知識庫',
3536
yuqueInfo: '通過語雀文檔構建知識庫',
37+
createWorkflowKnowledge: '建立工作流知識庫',
38+
workflowInfo: '通過自定義工作流管道構建知識庫',
3639
},
3740
form: {
3841
knowledgeName: {

0 commit comments

Comments
 (0)