Skip to content

Commit ada109d

Browse files
committed
feat: tool datasource
1 parent 5922597 commit ada109d

File tree

11 files changed

+331
-30
lines changed

11 files changed

+331
-30
lines changed

apps/application/flow/step_node/tool_lib_node/i_tool_lib_node.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ def is_valid(self, *, raise_exception=False):
4141

4242
class IToolLibNode(INode):
4343
type = 'tool-lib-node'
44-
support = [WorkflowMode.APPLICATION, WorkflowMode.APPLICATION_LOOP]
44+
support = [WorkflowMode.APPLICATION, WorkflowMode.APPLICATION_LOOP, WorkflowMode.KNOWLEDGE,
45+
WorkflowMode.KNOWLEDGE_LOOP]
4546

4647
def get_node_params_serializer_class(self) -> Type[serializers.Serializer]:
4748
return FunctionLibNodeParamsSerializer

apps/application/flow/step_node/tool_lib_node/impl/base_tool_lib_node.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def execute(self, tool_lib_id, input_field_list, **kwargs) -> NodeResult:
138138
tool_lib = QuerySet(Tool).filter(id=tool_lib_id).first()
139139
valid_function(tool_lib, workspace_id)
140140
params = {
141-
field.get('name'): convert_value(
141+
field.get('name'): convert_value(
142142
field.get('name'), field.get('value'), field.get('type'),
143143
field.get('is_required'),
144144
field.get('source'), self
@@ -157,8 +157,12 @@ def execute(self, tool_lib_id, input_field_list, **kwargs) -> NodeResult:
157157
all_params = init_params_default_value | json.loads(rsa_long_decrypt(tool_lib.init_params)) | params
158158
else:
159159
all_params = init_params_default_value | params
160+
if self.node.properties.get('kind') == 'data-source':
161+
all_params = {**all_params, **self.workflow_params.get('data_source')}
160162
result = function_executor.exec_code(tool_lib.code, all_params)
161-
return NodeResult({'result': result}, {}, _write_context=write_context)
163+
return NodeResult({'result': result},
164+
(self.workflow_manage.params.get('knowledge_base') or {}) if self.node.properties.get(
165+
'kind') == 'data-source' else {}, _write_context=write_context)
162166

163167
def get_details(self, index: int, **kwargs):
164168
return {

apps/common/utils/tool_code.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,12 @@ def _createdir(self):
4747
finally:
4848
os.umask(old_mask)
4949

50-
def exec_code(self, code_str, keywords):
50+
def exec_code(self, code_str, keywords, function_name=None):
5151
self.validate_banned_keywords(code_str)
5252
_id = str(uuid.uuid7())
5353
success = '{"code":200,"msg":"成功","data":exec_result}'
5454
err = '{"code":500,"msg":str(e),"data":None}'
55+
action_function = f'({function_name !a}, locals_v.get({function_name !a}))' if function_name else 'locals_v.popitem()'
5556
result_path = f'{self.sandbox_path}/result/{_id}.result'
5657
python_paths = CONFIG.get_sandbox_python_package_paths().split(',')
5758
_exec_code = f"""
@@ -66,7 +67,7 @@ def exec_code(self, code_str, keywords):
6667
keywords={keywords}
6768
globals_v={'{}'}
6869
exec({dedent(code_str)!a}, globals_v, locals_v)
69-
f_name, f = locals_v.popitem()
70+
f_name, f = {action_function}
7071
for local in locals_v:
7172
globals_v[local] = locals_v[local]
7273
exec_result=f(**keywords)

apps/knowledge/serializers/knowledge_workflow.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# coding=utf-8
2-
2+
import json
33
from typing import Dict
44

55
import uuid_utils.compat as uuid
@@ -13,13 +13,18 @@
1313
from application.flow.knowledge_workflow_manage import KnowledgeWorkflowManage
1414
from application.flow.step_node import get_node
1515
from common.exception.app_exception import AppApiException
16+
from common.utils.rsa_util import rsa_long_decrypt
17+
from common.utils.tool_code import ToolExecutor
1618
from knowledge.models import KnowledgeScope, Knowledge, KnowledgeType, KnowledgeWorkflow
1719
from knowledge.models.knowledge_action import KnowledgeAction, State
1820
from knowledge.serializers.knowledge import KnowledgeModelSerializer
21+
from maxkb.const import CONFIG
1922
from system_manage.models import AuthTargetType
2023
from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer
2124
from tools.models import Tool
2225

26+
tool_executor = ToolExecutor(CONFIG.get('SANDBOX'))
27+
2328

2429
class KnowledgeWorkflowModelSerializer(serializers.ModelSerializer):
2530
class Meta:
@@ -62,20 +67,22 @@ def one(self, is_valid=True):
6267

6368

6469
class KnowledgeWorkflowSerializer(serializers.Serializer):
65-
class Form(serializers.Serializer):
70+
class Datasource(serializers.Serializer):
6671
type = serializers.CharField(required=True, label=_('type'))
6772
id = serializers.CharField(required=True, label=_('type'))
68-
node = serializers.DictField(required=True, label="")
73+
params = serializers.DictField(required=True, label="")
74+
function_name = serializers.CharField(required=True, label=_('function_name'))
6975

70-
def get_form_list(self):
76+
def action(self):
7177
self.is_valid(raise_exception=True)
7278
if self.data.get('type') == 'local':
7379
node = get_node(self.data.get('id'), WorkflowMode.KNOWLEDGE)
74-
return node.get_form_list(self.data.get("node"))
80+
return node.__getattribute__(node, self.data.get("function_name"))(**self.data.get("params"))
7581
elif self.data.get('type') == 'tool':
7682
tool = QuerySet(Tool).filter(id=self.data.get("id")).first()
77-
# todo 调用工具数据源的函数获取表单列表
78-
return None
83+
init_params = json.loads(rsa_long_decrypt(tool.init_params))
84+
return tool_executor.exec_code(tool.code, {**init_params, **self.data.get('params')},
85+
self.data.get('function_name'))
7986

8087
class Create(serializers.Serializer):
8188
user_id = serializers.UUIDField(required=True, label=_('user id'))

apps/knowledge/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@
6969
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/problem/<int:current_page>/<int:page_size>', views.ProblemView.Page.as_view()),
7070
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/document/<int:current_page>/<int:page_size>', views.DocumentView.Page.as_view()),
7171
path('workspace/<str:workspace_id>/knowledge/<int:current_page>/<int:page_size>', views.KnowledgeView.Page.as_view()),
72-
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/form_list/<str:type>/<str:id>', views.KnowledgeWorkflowFormView.as_view()),
72+
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/datasource/<str:type>/<str:id>/form_list', views.KnowledgeDatasourceFormListView.as_view()),
73+
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/datasource/<str:type>/<str:id>/<str:function_name>', views.KnowledgeDatasourceView.as_view()),
7374
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/action', views.KnowledgeWorkflowActionView.as_view()),
7475
path('workspace/<str:workspace_id>/knowledge/<str:knowledge_id>/action/<str:knowledge_action_id>', views.KnowledgeWorkflowActionView.Operate.as_view())
7576

apps/knowledge/views/knowledge_workflow.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,18 @@
1515
from knowledge.serializers.knowledge_workflow import KnowledgeWorkflowSerializer, KnowledgeWorkflowActionSerializer
1616

1717

18-
class KnowledgeWorkflowFormView(APIView):
18+
class KnowledgeDatasourceFormListView(APIView):
1919
authentication_classes = [TokenAuth]
2020

2121
def post(self, request: Request, workspace_id: str, knowledge_id: str, type: str, id: str):
22-
return result.success(KnowledgeWorkflowSerializer.Form(
23-
data={'type': type, 'id': id, 'node': request.data.get('node')}).get_form_list())
22+
return result.success(KnowledgeWorkflowSerializer.Datasource(
23+
data={'type': type, 'id': id, 'params': request.data, 'function_name': 'get_form_list'}).action())
24+
25+
26+
class KnowledgeDatasourceView(APIView):
27+
def post(self, request: Request, workspace_id: str, knowledge_id: str, type: str, id: str, function_name: str):
28+
return result.success(KnowledgeWorkflowSerializer.Datasource(
29+
data={'type': type, 'id': id, 'params': request.data, 'function_name': function_name}).action())
2430

2531

2632
class KnowledgeWorkflowActionView(APIView):

ui/src/api/knowledge/knowledge.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,34 @@ const getKnowledgeWorkflowFormList: (
328328
node,
329329
loading,
330330
) => {
331-
return post(`${prefix.value}/${knowledge_id}/form_list/${type}/${id}`, { node }, {}, loading)
331+
return post(
332+
`${prefix.value}/${knowledge_id}/datasource/${type}/${id}/form_list`,
333+
{ node },
334+
{},
335+
loading,
336+
)
337+
}
338+
const getKnowledgeWorkflowDatasourceDetails: (
339+
knowledge_id: string,
340+
type: 'loacl' | 'tool',
341+
id: string,
342+
params: any,
343+
function_name: string,
344+
loading?: Ref<boolean>,
345+
) => Promise<Result<any>> = (
346+
knowledge_id: string,
347+
type: 'loacl' | 'tool',
348+
id: string,
349+
params,
350+
function_name,
351+
loading,
352+
) => {
353+
return post(
354+
`${prefix.value}/${knowledge_id}/datasource/${type}/${id}/${function_name}`,
355+
params,
356+
{},
357+
loading,
358+
)
332359
}
333360
const workflowAction: (
334361
knowledge_id: string,
@@ -371,4 +398,5 @@ export default {
371398
getKnowledgeWorkflowFormList,
372399
workflowAction,
373400
getWorkflowAction,
401+
getKnowledgeWorkflowDatasourceDetails,
374402
}

ui/src/components/dynamics-form/Demo.vue

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@ import { ref } from 'vue'
2222
import type { Dict } from '@/api/type/common'
2323
2424
const damo_data: Array<FormField> = [
25+
{
26+
field: 'aaa',
27+
input_type: 'Tree',
28+
attrs: {
29+
lazy: true,
30+
url: '/workspace/${current_workspace_id}/knowledge/${current_knowledge_id}/datasource/tool/019aa0bb-552d-73a3-b0c6-1809eaedb139/get_file_list',
31+
},
32+
label: '',
33+
},
2534
{
2635
field: 'aa',
2736
input_type: 'LocalFileUpload',

0 commit comments

Comments
 (0)