Skip to content

Commit 194dc2e

Browse files
Merge remote-tracking branch 'upstream/v2' into upgrade_jsonpath-ng_to_1.8.0
2 parents cb35dd2 + d186bac commit 194dc2e

File tree

182 files changed

+6732
-637
lines changed

Some content is hidden

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

182 files changed

+6732
-637
lines changed

.github/workflows/build-and-push-python-pg.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
run: |
2626
DOCKER_IMAGE=ghcr.io/1panel-dev/maxkb-base
2727
DOCKER_PLATFORMS=${{ github.event.inputs.architecture }}
28-
TAG_NAME=python3.11-pg17.7-20260212
28+
TAG_NAME=python3.11-pg17.7-20260323
2929
DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME}"
3030
echo ::set-output name=docker_image::${DOCKER_IMAGE}
3131
echo ::set-output name=version::${TAG_NAME}

.github/workflows/build-and-push.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ on:
77
inputs:
88
dockerImageTag:
99
description: 'Image Tag'
10-
default: 'v2.6.0-dev'
10+
default: 'v2.8.0-dev'
1111
required: true
1212
dockerImageTagWithLatest:
1313
description: '是否发布latest tag(正式发版时选择,测试版本切勿选择)'

apps/application/chat_pipeline/step/chat_step/impl/base_chat_step.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,8 @@ def _handle_mcp_request(self, mcp_source, mcp_servers, mcp_tool_ids, tool_ids,
242242
# 兼容老数据
243243
if not mcp_tool_ids:
244244
mcp_tool_ids = []
245-
if mcp_source == 'custom' and mcp_servers and '"stdio"' not in mcp_servers:
245+
if mcp_source == 'custom' and mcp_servers:
246+
ToolExecutor().validate_mcp_transport(mcp_servers)
246247
mcp_servers_config = json.loads(mcp_servers)
247248
elif mcp_tool_ids:
248249
mcp_tools = QuerySet(Tool).filter(id__in=mcp_tool_ids).values()

apps/application/flow/backend/sandbox_shell.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def execute(
6262
if _enable_sandbox:
6363
# 用 runuser 在子进程里切换用户,父进程凭据保持不变,
6464
# 避免父进程 ruid/euid 不一致导致 execve 报 Permission denied
65-
command = f"runuser -u {_run_user} -- env -i LD_PRELOAD=/opt/maxkb-app/sandbox/lib/sandbox.so PATH=${{PATH}} {command}"
65+
command = f"env -i LD_PRELOAD=/opt/maxkb-app/sandbox/lib/sandbox.so PATH=${{PATH}} gosu {_run_user} {command}"
6666
# command = f"runuser -u {_run_user} -- env -i PATH=${{PATH}} {command}"
6767

6868
# print(f"Executing command in sandbox: {command}")

apps/application/flow/common.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ class WorkflowMode(Enum):
9999

100100
KNOWLEDGE_LOOP = "knowledge-loop"
101101

102+
TOOL = "tool"
103+
104+
TOOL_LOOP = "tool-loop"
105+
102106

103107
class Workflow:
104108
"""

apps/application/flow/i_step_node.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from application.models import ChatRecord, ChatUserType
2323
from common.field.common import InstanceField
2424
from knowledge.models.knowledge_action import KnowledgeAction, State
25+
from tools.models import ToolRecord
2526

2627
chat_cache = cache
2728

@@ -115,6 +116,40 @@ def handler(self, workflow):
115116
'start_time') is not None else 0)
116117

117118

119+
def get_tool_workflow_state(workflow):
120+
if workflow.is_the_task_interrupted():
121+
return State.REVOKED
122+
details = workflow.get_runtime_details()
123+
node_list = details.values()
124+
all_node = [*node_list, *get_loop_workflow_node(node_list)]
125+
err = any([True for value in all_node if value.get('status') == 500 and not value.get('enableException')])
126+
if err:
127+
return State.FAILURE
128+
return State.SUCCESS
129+
130+
131+
class ToolWorkflowPostHandler(WorkFlowPostHandler):
132+
def __init__(self, chat_info, tool_id):
133+
super().__init__(chat_info)
134+
self.tool_id = tool_id
135+
136+
def handler(self, workflow):
137+
state = get_tool_workflow_state(workflow)
138+
record = ToolRecord(id=self.chat_info.tool_record_id, tool_id=self.tool_id,
139+
workspace_id=self.chat_info.workspace_id,
140+
source_type=self.chat_info.source_type,
141+
source_id=self.chat_info.source_id,
142+
state=state,
143+
meta={
144+
'output': workflow.out_context,
145+
'details': workflow.get_runtime_details(),
146+
'answer_text_list': workflow.get_answer_text_list()
147+
})
148+
self.chat_info.set_record(record)
149+
self.chat_info = None
150+
self.tool_id = None
151+
152+
118153
def get_loop_workflow_node(node_list):
119154
result = []
120155
for item in node_list:
@@ -204,6 +239,11 @@ class KnowledgeFlowParamsSerializer(serializers.Serializer):
204239
knowledge_base = serializers.DictField(required=False, label="知识库设置")
205240

206241

242+
class ToolFlowParamsSerializer(serializers.Serializer):
243+
tool_id = serializers.UUIDField(required=True, label="工具id")
244+
workspace_id = serializers.CharField(required=True, label="工作空间id")
245+
246+
207247
class INode:
208248
view_type = 'many_view'
209249

apps/application/flow/knowledge_loop_workflow_manage.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,9 @@
1313
class KnowledgeLoopWorkflowManage(LoopWorkflowManage):
1414
def get_params_serializer_class(self):
1515
return KnowledgeFlowParamsSerializer
16+
17+
def get_source_type(self):
18+
return "KNOWLEDGE"
19+
20+
def get_source_id(self):
21+
return self.params.get('knowledge_id')

apps/application/flow/knowledge_workflow_manage.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,9 @@ def hand_node_result(self, current_node, node_result_future):
122122
current_node.node_chunk.end()
123123
QuerySet(KnowledgeAction).filter(id=self.params.get('knowledge_action_id')).update(
124124
details=self.get_runtime_details())
125+
126+
def get_source_type(self):
127+
return "KNOWLEDGE"
128+
129+
def get_source_id(self):
130+
return self.params.get('knowledge_id')

apps/application/flow/loop_workflow_manage.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,9 @@ def generate_prompt(self, prompt: str):
191191
prompt_template = PromptTemplate.from_template(prompt, template_format='jinja2')
192192
value = prompt_template.format(context=context)
193193
return value
194+
195+
def get_source_type(self):
196+
return "APPLICATION"
197+
198+
def get_source_id(self):
199+
return self.params.get('application_id')

apps/application/flow/step_node/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@
3535
from .text_to_video_step_node.impl.base_text_to_video_node import BaseTextToVideoNode
3636
from .tool_lib_node import *
3737
from .tool_node import *
38+
from .tool_workflow_lib_node import BaseToolWorkflowLibNodeNode
3839
from .variable_aggregation_node.impl.base_variable_aggregation_node import BaseVariableAggregationNode
3940
from .variable_assign_node import BaseVariableAssignNode
4041
from .variable_splitting_node import BaseVariableSplittingNode
4142
from .video_understand_step_node import BaseVideoUnderstandNode
4243
from .document_split_node import BaseDocumentSplitNode
44+
from .tool_start_node import BaseToolStartStepNode
4345

4446
node_list = [BaseStartStepNode, BaseChatNode, BaseSearchKnowledgeNode, BaseSearchDocumentNode, BaseQuestionNode,
4547
BaseConditionNode, BaseReplyNode,
@@ -51,7 +53,8 @@
5153
BaseIntentNode, BaseLoopNode, BaseLoopStartStepNode,
5254
BaseLoopContinueNode,
5355
BaseLoopBreakNode, BaseVariableSplittingNode, BaseParameterExtractionNode, BaseVariableAggregationNode,
54-
BaseDataSourceLocalNode, BaseDataSourceWebNode, BaseKnowledgeWriteNode, BaseDocumentSplitNode]
56+
BaseDataSourceLocalNode, BaseDataSourceWebNode, BaseKnowledgeWriteNode, BaseDocumentSplitNode,
57+
BaseToolStartStepNode, BaseToolWorkflowLibNodeNode]
5558

5659
node_map = {n.type: {w: n for w in n.support} for n in node_list}
5760

0 commit comments

Comments
 (0)