@@ -315,7 +315,8 @@ async def _yield_mcp_response(chat_model, message_list, mcp_servers, mcp_output_
315315 tools = await client .get_tools ()
316316 agent = create_react_agent (chat_model , tools )
317317 recursion_limit = int (CONFIG .get ("LANGCHAIN_GRAPH_RECURSION_LIMIT" , '25' ))
318- response = agent .astream ({"messages" : message_list }, config = {"recursion_limit" : recursion_limit }, stream_mode = 'messages' )
318+ response = agent .astream ({"messages" : message_list }, config = {"recursion_limit" : recursion_limit },
319+ stream_mode = 'messages' )
319320
320321 # 用于存储工具调用信息(按 tool_id)以及按 index 聚合分片
321322 tool_calls_info = {}
@@ -396,7 +397,6 @@ def get_real_error(exc):
396397 raise RuntimeError (error_msg ) from None
397398
398399
399-
400400def mcp_response_generator (chat_model , message_list , mcp_servers , mcp_output_enable = True ):
401401 """使用全局事件循环,不创建新实例"""
402402 result_queue = queue .Queue ()
@@ -427,3 +427,82 @@ async def _run():
427427
428428async def anext_async (agen ):
429429 return await agen .__anext__ ()
430+
431+
432+ target_source_node_mapping = {
433+ 'TOOL' : {'tool-lib-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('tool_lib_id' )]},
434+ 'MODEL' : {'ai-chat-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('model_id' )],
435+ 'question-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('model_id' )],
436+ 'speech-to-text-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('stt_model_id' )],
437+ 'text-to-speech-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('tts_model_id' )],
438+ 'image-to-video-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('model_id' )],
439+ 'image-generate-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('model_id' )],
440+ 'intent-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('model_id' )],
441+ 'image-understand-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('model_id' )],
442+ 'parameter-extraction-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('model_id' )],
443+ 'video-understand-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('model_id' )]
444+ },
445+ 'KNOWLEDGE' : {'search-knowledge-node' : lambda n : n .get ('properties' ).get ('node_data' ).get ('knowledge_id_list' )},
446+ 'APPLICATION' : {
447+ 'application-node' : lambda n : [n .get ('properties' ).get ('node_data' ).get ('application_id' )]
448+ }
449+ }
450+
451+
452+ def get_node_handle_callback (source_type , source_id ):
453+ def node_handle_callback (node ):
454+ from system_manage .models .resource_mapping import ResourceMapping
455+ response = []
456+ for key , value in target_source_node_mapping .items ():
457+ if node .get ('type' ) in value :
458+ call = value .get (node .get ('type' ))
459+ target_source_id_list = call (node )
460+ for target_source_id in target_source_id_list :
461+ if target_source_id :
462+ response .append (ResourceMapping (source_type = source_type , target_type = key , source_id = source_id ,
463+ target_id = target_source_id ))
464+ return response
465+
466+ return node_handle_callback
467+
468+
469+ def get_workflow_resource (workflow , node_handle ):
470+ response = []
471+ if 'nodes' in workflow :
472+ for node in workflow .get ('nodes' ):
473+ rs = node_handle (node )
474+ if rs :
475+ for r in rs :
476+ response .append (r )
477+ if node .get ('type' ) == 'loop-node' :
478+ r = get_workflow_resource (node .get ('properties' , {}).get ('node_data' , {}).get ('loop_body' ), node_handle )
479+ for rn in r :
480+ response .append (rn )
481+ return list ({(str (item .target_type ) + str (item .target_id )): item for item in response }.values ())
482+ return []
483+
484+
485+ def get_instance_resource (instance , source_type , source_id , target_type , field_call_list ):
486+ response = []
487+ from system_manage .models .resource_mapping import ResourceMapping
488+ for field_call in field_call_list :
489+ target_id = field_call (instance )
490+ if target_id :
491+ response .append (ResourceMapping (source_type = source_type , target_type = target_type , source_id = source_id ,
492+ target_id = target_id ))
493+ return response
494+
495+
496+ def save_workflow_mapping (workflow , source_type , source_id , other_resource_mapping = None ):
497+ if not other_resource_mapping :
498+ other_resource_mapping = []
499+ from system_manage .models .resource_mapping import ResourceMapping
500+ from django .db .models import QuerySet
501+ QuerySet (ResourceMapping ).filter (source_type = source_type , source_id = source_id ).delete ()
502+ resource_mapping_list = get_workflow_resource (workflow ,
503+ get_node_handle_callback (source_type ,
504+ source_id ))
505+ if resource_mapping_list :
506+ resource_mapping_list += other_resource_mapping
507+ QuerySet (ResourceMapping ).bulk_create (
508+ {(str (item .target_type ) + str (item .target_id )): item for item in resource_mapping_list }.values ())
0 commit comments