2828from common .exception .app_exception import AppApiException
2929from common .utils .logger import maxkb_logger
3030from common .utils .rsa_util import rsa_long_decrypt
31+ from common .utils .shared_resource_auth import filter_authorized_ids
3132from common .utils .tool_code import ToolExecutor
3233from models_provider .tools import get_model_instance_by_model_workspace_id
3334from tools .models import Tool
@@ -192,6 +193,7 @@ def execute(self, message_list: List[BaseMessage],
192193 mcp_tool_ids , mcp_servers , mcp_source , tool_ids ,
193194 application_ids ,
194195 skill_tool_ids ,
196+ workspace_id ,
195197 mcp_output_enable )
196198 else :
197199 return self .execute_block (message_list , chat_id , problem_text , post_response_handler , chat_model ,
@@ -201,6 +203,7 @@ def execute(self, message_list: List[BaseMessage],
201203 mcp_tool_ids , mcp_servers , mcp_source , tool_ids ,
202204 application_ids ,
203205 skill_tool_ids ,
206+ workspace_id ,
204207 mcp_output_enable )
205208
206209 def get_details (self , manage , ** kwargs ):
@@ -211,9 +214,9 @@ def get_details(self, manage, **kwargs):
211214 'run_time' : self .context .get ('run_time' ) or 0 ,
212215 'model_id' : str (manage .context ['model_id' ]),
213216 'message_list' : self .reset_message_list (self .context ['step_args' ].get ('message_list' ),
214- self .context [ 'answer_text' ] ),
215- 'message_tokens' : self .context [ 'message_tokens' ] ,
216- 'answer_tokens' : self .context [ 'answer_tokens' ] ,
217+ self .context . get ( 'answer_text' ) ),
218+ 'message_tokens' : self .context . get ( 'message_tokens' ) ,
219+ 'answer_tokens' : self .context . get ( 'answer_tokens' ) ,
217220 'cost' : 0 ,
218221 }
219222
@@ -228,7 +231,8 @@ def reset_message_list(message_list: List[BaseMessage], answer_text):
228231 return result
229232
230233 def _handle_mcp_request (self , mcp_source , mcp_servers , mcp_tool_ids , tool_ids ,
231- application_ids , skill_tool_ids , mcp_output_enable , chat_model , message_list , agent_id ):
234+ application_ids , skill_tool_ids , mcp_output_enable , chat_model , message_list , agent_id ,
235+ chat_id ):
232236
233237 mcp_servers_config = {}
234238
@@ -298,11 +302,11 @@ def _handle_mcp_request(self, mcp_source, mcp_servers, mcp_tool_ids, tool_ids,
298302 tool = QuerySet (Tool ).filter (id = tool_id , is_active = True ).first ()
299303 if tool is None or tool .is_active is False :
300304 continue
305+ init_params_default_value = {i ["field" ]: i .get ('default_value' ) for i in tool .init_field_list }
301306 if tool .init_params is not None :
302- params = json .loads (rsa_long_decrypt (tool .init_params ))
303- tool_init_params = json .loads (rsa_long_decrypt (tool .init_params ))
307+ params = init_params_default_value | json .loads (rsa_long_decrypt (tool .init_params ))
304308 else :
305- params = {}
309+ params = init_params_default_value
306310
307311 skill_file_items .append ({
308312 'tool_id' : str (tool .id ),
@@ -314,8 +318,10 @@ def _handle_mcp_request(self, mcp_source, mcp_servers, mcp_tool_ids, tool_ids,
314318 if len (mcp_servers_config ) > 0 :
315319 source_id = agent_id
316320 source_type = 'APPLICATION'
317- return mcp_response_generator (chat_model , message_list , json .dumps (mcp_servers_config ), mcp_output_enable ,
318- tool_init_params , source_id , source_type )
321+ return mcp_response_generator (
322+ chat_model , message_list , json .dumps (mcp_servers_config ), mcp_output_enable ,
323+ tool_init_params , source_id , source_type , chat_id
324+ )
319325
320326 return None
321327
@@ -330,8 +336,10 @@ def get_stream_result(self, message_list: List[BaseMessage],
330336 tool_ids = None ,
331337 application_ids = None ,
332338 skill_tool_ids = None ,
339+ workspace_id = None ,
333340 mcp_output_enable = True ,
334- agent_id = None
341+ agent_id = None ,
342+ chat_id = None
335343 ):
336344 if paragraph_list is None :
337345 paragraph_list = []
@@ -348,11 +356,22 @@ def get_stream_result(self, message_list: List[BaseMessage],
348356 return iter ([AIMessageChunk (
349357 _ ('Sorry, the AI model is not configured. Please go to the application to set up the AI model first.' ))]), False
350358 else :
359+ # 过滤tool_id
360+ all_tool_ids = list (set (
361+ (mcp_tool_ids or []) +
362+ (tool_ids or []) +
363+ (skill_tool_ids or [])
364+ ))
365+ authorized_set = set (filter_authorized_ids ('tool' , all_tool_ids , workspace_id ))
366+
367+ mcp_tool_ids = [i for i in (mcp_tool_ids or []) if i in authorized_set ]
368+ tool_ids = [i for i in (tool_ids or []) if i in authorized_set ]
369+ skill_tool_ids = [i for i in (skill_tool_ids or []) if i in authorized_set ]
351370 # 处理 MCP 请求
352371 mcp_result = self ._handle_mcp_request (
353372 mcp_source , mcp_servers , mcp_tool_ids , tool_ids ,
354373 application_ids , skill_tool_ids , mcp_output_enable , chat_model ,
355- message_list , agent_id
374+ message_list , agent_id , chat_id
356375 )
357376 if mcp_result :
358377 return mcp_result , True
@@ -375,12 +394,14 @@ def execute_stream(self, message_list: List[BaseMessage],
375394 tool_ids = None ,
376395 application_ids = None ,
377396 skill_tool_ids = None ,
397+ workspace_id = None ,
378398 mcp_output_enable = True ):
379399 chat_result , is_ai_chat = self .get_stream_result (message_list , chat_model , paragraph_list ,
380400 no_references_setting , problem_text , mcp_tool_ids ,
381401 mcp_servers , mcp_source , tool_ids ,
382- application_ids , skill_tool_ids ,
383- mcp_output_enable , manage .context .get ('application_id' ))
402+ application_ids , skill_tool_ids , workspace_id ,
403+ mcp_output_enable , manage .context .get ('application_id' ),
404+ chat_id )
384405 chat_record_id = self .context .get ('step_args' , {}).get ('chat_record_id' ) if self .context .get ('step_args' ,
385406 {}).get (
386407 'chat_record_id' ) else uuid .uuid7 ()
@@ -405,8 +426,10 @@ def get_block_result(self, message_list: List[BaseMessage],
405426 tool_ids = None ,
406427 application_ids = None ,
407428 skill_tool_ids = None ,
429+ workspace_id = None ,
408430 mcp_output_enable = True ,
409- application_id = None
431+ application_id = None ,
432+ chat_id = None
410433 ):
411434 if paragraph_list is None :
412435 paragraph_list = []
@@ -422,11 +445,22 @@ def get_block_result(self, message_list: List[BaseMessage],
422445 return AIMessage (
423446 _ ('Sorry, the AI model is not configured. Please go to the application to set up the AI model first.' )), False
424447 else :
448+ # 过滤tool_id
449+ all_tool_ids = list (set (
450+ (mcp_tool_ids or []) +
451+ (tool_ids or []) +
452+ (skill_tool_ids or [])
453+ ))
454+ authorized_set = set (filter_authorized_ids ('tool' , all_tool_ids , workspace_id ))
455+
456+ mcp_tool_ids = [i for i in (mcp_tool_ids or []) if i in authorized_set ]
457+ tool_ids = [i for i in (tool_ids or []) if i in authorized_set ]
458+ skill_tool_ids = [i for i in (skill_tool_ids or []) if i in authorized_set ]
425459 # 处理 MCP 请求
426460 mcp_result = self ._handle_mcp_request (
427461 mcp_source , mcp_servers , mcp_tool_ids , tool_ids ,
428462 application_ids , skill_tool_ids , mcp_output_enable ,
429- chat_model , message_list , application_id
463+ chat_model , message_list , application_id , chat_id
430464 )
431465 if mcp_result :
432466 return mcp_result , True
@@ -448,6 +482,7 @@ def execute_block(self, message_list: List[BaseMessage],
448482 tool_ids = None ,
449483 application_ids = None ,
450484 skill_tool_ids = None ,
485+ workspace_id = None ,
451486 mcp_output_enable = True ):
452487 reasoning_content_enable = model_setting .get ('reasoning_content_enable' , False )
453488 reasoning_content_start = model_setting .get ('reasoning_content_start' , '<think>' )
@@ -460,8 +495,9 @@ def execute_block(self, message_list: List[BaseMessage],
460495 chat_result , is_ai_chat = self .get_block_result (message_list , chat_model , paragraph_list ,
461496 no_references_setting , problem_text ,
462497 mcp_tool_ids , mcp_servers , mcp_source ,
463- tool_ids , application_ids , skill_tool_ids ,
464- mcp_output_enable , manage .context .get ('application_id' ))
498+ tool_ids , application_ids , skill_tool_ids ,workspace_id ,
499+ mcp_output_enable , manage .context .get ('application_id' ),
500+ chat_id )
465501 if is_ai_chat :
466502 request_token = chat_model .get_num_tokens_from_messages (message_list )
467503 response_token = chat_model .get_num_tokens (chat_result .content )
0 commit comments