Skip to content

Commit f60b2ca

Browse files
authored
feat: add a batch clean function to batch set agent log clean strategy (#6255)
1 parent 2b73c7a commit f60b2ca

12 files changed

Lines changed: 245 additions & 3 deletions

File tree

apps/application/api/application_api.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
from rest_framework import serializers
1313

1414
from application.serializers.application import ApplicationCreateSerializer, ApplicationListResponse, \
15-
ApplicationImportRequest, ApplicationEditSerializer, TextToSpeechRequest, SpeechToTextRequest, PlayDemoTextRequest
15+
ApplicationImportRequest, ApplicationEditSerializer, TextToSpeechRequest, SpeechToTextRequest, PlayDemoTextRequest, \
16+
BatchCleanTimeSerializer
1617
from common.mixins.api_mixin import APIMixin
1718
from common.result import ResultSerializer, ResultPageSerializer, DefaultResultSerializer
1819
from knowledge.serializers.common import BatchSerializer, BatchMoveSerializer
@@ -181,6 +182,10 @@ def get_request():
181182
def get_move_request():
182183
return BatchMoveSerializer
183184

185+
@staticmethod
186+
def get_clean_time_request():
187+
return BatchCleanTimeSerializer
188+
184189

185190
class ApplicationExportAPI(APIMixin):
186191
@staticmethod

apps/application/serializers/application.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1634,3 +1634,36 @@ def batch_move(self, instance: Dict, with_valid=True):
16341634

16351635
QuerySet(Application).filter(id__in=id_list, workspace_id=workspace_id).update(folder_id=folder_id)
16361636
return True
1637+
1638+
@transaction.atomic
1639+
def batch_clean_time(self, instance: Dict, with_valid=True):
1640+
if with_valid:
1641+
BatchCleanTimeSerializer(data=instance).is_valid(model=Application, raise_exception=True)
1642+
self.is_valid(raise_exception=True)
1643+
id_list = instance.get("id_list")
1644+
workspace_id = self.data.get("workspace_id")
1645+
clean_time = instance.get("clean_time")
1646+
file_clean_time = instance.get("file_clean_time")
1647+
application_count = QuerySet(Application).filter(id__in=id_list, workspace_id=workspace_id).count()
1648+
if application_count != len(id_list):
1649+
raise AppApiException(500, _("Application does not exist"))
1650+
1651+
QuerySet(Application).filter(id__in=id_list, workspace_id=workspace_id).update(
1652+
clean_time=clean_time,
1653+
file_clean_time=file_clean_time,
1654+
)
1655+
return True
1656+
1657+
1658+
class BatchCleanTimeSerializer(BatchSerializer):
1659+
clean_time = serializers.IntegerField(required=True, min_value=1, max_value=100000, label=_("Clean time"))
1660+
file_clean_time = serializers.IntegerField(
1661+
required=True, min_value=1, max_value=100000, label=_("File clean time")
1662+
)
1663+
1664+
def is_valid(self, *, model=None, raise_exception=False):
1665+
super().is_valid(model=model, raise_exception=True)
1666+
if not self.data.get("id_list"):
1667+
raise AppApiException(500, _("id list cannot be empty"))
1668+
if self.data.get("file_clean_time") > self.data.get("clean_time"):
1669+
raise AppApiException(500, _("File clean time cannot exceed clean time"))

apps/application/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
path('workspace/<str:workspace_id>/application/<int:current_page>/<int:page_size>', views.ApplicationAPI.Page.as_view(), name='application_page'),
1313
path('workspace/<str:workspace_id>/application/batch_delete', views.ApplicationAPI.BatchDelete.as_view()),
1414
path('workspace/<str:workspace_id>/application/batch_move', views.ApplicationAPI.BatchMove.as_view()),
15+
path('workspace/<str:workspace_id>/application/batch_clean_time', views.ApplicationAPI.BatchCleanTime.as_view()),
1516
path('workspace/<str:workspace_id>/application/<str:application_id>', views.ApplicationAPI.Operate.as_view()),
1617
path('workspace/<str:workspace_id>/application/<str:application_id>/publish', views.ApplicationAPI.Publish.as_view()),
1718
path('workspace/<str:workspace_id>/application/<str:application_id>/move/<str:folder_id>', views.ApplicationAPI.Move.as_view()),

apps/application/views/application.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,49 @@ def inner(view,r, **kwargs):
384384

385385
return result.success(inner(self,request, workspace_id=workspace_id))
386386

387+
class BatchCleanTime(APIView):
388+
authentication_classes = [TokenAuth]
389+
390+
@extend_schema(
391+
methods=['PUT'],
392+
description=_("Batch update application chat log clear policy"),
393+
summary=_("Batch update application chat log clear policy"),
394+
operation_id=_("Batch update application chat log clear policy"),
395+
parameters=ApplicationBatchOperateAPI.get_parameters(),
396+
request=ApplicationBatchOperateAPI.get_clean_time_request(),
397+
responses=result.DefaultResultSerializer,
398+
tags=[_('Application')]
399+
)
400+
@has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_permission(),
401+
RoleConstants.USER.get_workspace_role(),
402+
RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
403+
)
404+
def put(self, request: Request, workspace_id: str):
405+
id_list = request.data.get('id_list', [])
406+
permitted_ids = check_batch_permissions(
407+
request, id_list, 'application_id',
408+
(PermissionConstants.APPLICATION_CHAT_LOG_CLEAR_POLICY.get_workspace_application_permission(),
409+
PermissionConstants.APPLICATION_CHAT_LOG_CLEAR_POLICY.get_workspace_permission_workspace_manage_role(),
410+
ViewPermission([RoleConstants.USER.get_workspace_role()],
411+
[PermissionConstants.APPLICATION.get_workspace_application_permission()],
412+
CompareConstants.AND),
413+
RoleConstants.WORKSPACE_MANAGE.get_workspace_role()),
414+
workspace_id=workspace_id
415+
)
416+
417+
@log(menu='Application', operate='Batch update application chat log clear policy',
418+
get_operation_object=lambda r, k: get_application_operation_object_batch(permitted_ids))
419+
def inner(view,r, **kwargs):
420+
return ApplicationBatchOperateSerializer(
421+
data={'workspace_id': workspace_id, 'user_id': request.user.id}
422+
).batch_clean_time({
423+
'id_list': permitted_ids,
424+
'clean_time': request.data.get('clean_time'),
425+
'file_clean_time': request.data.get('file_clean_time')
426+
})
427+
428+
return result.success(inner(self,request, workspace_id=workspace_id))
429+
387430
class McpServers(APIView):
388431
authentication_classes = [TokenAuth]
389432

ui/src/api/application/application.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,22 @@ const putMulMoveApplication: (data: any, loading?: Ref<boolean>) => Promise<Resu
452452
return put(`${prefix.value}/batch_move`, data, undefined, loading)
453453
}
454454

455+
/**
456+
* 批量更新智能体对话日志清除策略
457+
* @param 参数
458+
* {
459+
"id_list": [String],
460+
"clean_time": number,
461+
"file_clean_time": number
462+
}
463+
*/
464+
const putMulCleanTime: (data: any, loading?: Ref<boolean>) => Promise<Result<boolean>> = (
465+
data,
466+
loading,
467+
) => {
468+
return put(`${prefix.value}/batch_clean_time`, data, undefined, loading)
469+
}
470+
455471
export default {
456472
getAllApplication,
457473
getApplication,
@@ -486,4 +502,5 @@ export default {
486502
moveApplication,
487503
delMulApplication,
488504
putMulMoveApplication,
505+
putMulCleanTime,
489506
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ export default {
44
createWorkFlowApplication: 'Create Workflow Agent',
55
importApplication: 'Import Agent',
66
copyApplication: 'Copy Agent',
7+
batchClearStrategyTip:
8+
'This operation will batch update the chat log clear policy for the selected agents.',
79
simple: 'SIMPLE',
810
senior: 'WORKFLOW',
911
simpleAgent: 'Simple Agent',

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export default {
44
createWorkFlowApplication: '创建高级智能体',
55
importApplication: '导入智能体',
66
copyApplication: '复制智能体',
7+
batchClearStrategyTip: '该操作会对选中的智能体批量调整对话日志清除策略。',
78
simple: '简易',
89
senior: '高级',
910
simpleAgent: '简易智能体',

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export default {
44
createWorkFlowApplication: '建立進階智能體',
55
importApplication: '匯入智能體',
66
copyApplication: '複製智能體',
7+
batchClearStrategyTip: '該操作會對選中的智能體批量調整對話日誌清除策略。',
78
AdvancedAgent: '進階編智能體',
89
simpleAgent: '簡易智能體',
910
simple: '簡易',

ui/src/permission/application/system-manage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const systemManage = {
66
copy: () => hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_APPLICATION_COPY], 'OR'),
77
batchDelete: () => false,
88
batchMove: () => false,
9+
batchCleanStrategy: () => false,
910
folderCreate: () => false,
1011
edit: () => hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_APPLICATION_EDIT], 'OR'),
1112
publish: () =>

ui/src/permission/application/workspace.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ const workspace = {
3333
],
3434
'OR',
3535
),
36+
batchCleanStrategy: () =>
37+
hasPermission(
38+
[
39+
RoleConst.USER.getWorkspaceRole,
40+
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
41+
PermissionConst.APPLICATION_CHAT_LOG_CLEAR_POLICY.getWorkspacePermission,
42+
PermissionConst.APPLICATION_CHAT_LOG_CLEAR_POLICY.getWorkspacePermissionWorkspaceManageRole,
43+
],
44+
'OR',
45+
),
3646
copy: (source_id: string) =>
3747
hasPermission(
3848
[

0 commit comments

Comments
 (0)