22import logging
33import queue
44import threading
5+ from typing import Optional , List
56
67from jinja2 import StrictUndefined , Template
78from smolagents import OpenAIServerModel
89
9- from consts .const import LANGUAGE , MODEL_CONFIG_MAPPING , MESSAGE_ROLE , THINK_END_PATTERN , THINK_START_PATTERN
10+ from consts .const import LANGUAGE , MESSAGE_ROLE , THINK_END_PATTERN , THINK_START_PATTERN
1011from consts .model import AgentInfoRequest
11- from database .agent_db import update_agent , query_sub_agents_id_list , search_agent_info_by_agent_id
12+ from database .agent_db import update_agent , search_agent_info_by_agent_id
1213from database .model_management_db import get_model_by_model_id
1314from database .tool_db import query_tools_by_ids
14- from services .agent_service import get_enable_tool_id_by_agent_id
15- from utils .config_utils import tenant_config_manager , get_model_name_from_config
15+ from utils .config_utils import get_model_name_from_config
1616from utils .prompt_template_utils import get_prompt_generate_prompt_template
1717
1818# Configure logging
@@ -34,7 +34,7 @@ def _process_thinking_tokens(new_token: str, is_thinking: bool, token_join: list
3434 """
3535 # Handle thinking mode
3636 if is_thinking :
37- return not ( THINK_END_PATTERN in new_token )
37+ return THINK_END_PATTERN not in new_token
3838
3939 # Handle start of thinking
4040 if THINK_START_PATTERN in new_token :
@@ -98,14 +98,16 @@ def call_llm_for_system_prompt(model_id: int, user_prompt: str, system_prompt: s
9898 raise e
9999
100100
101- def gen_system_prompt_streamable (agent_id : int , model_id : int , task_description : str , user_id : str , tenant_id : str , language : str ):
101+ def gen_system_prompt_streamable (agent_id : int , model_id : int , task_description : str , user_id : str , tenant_id : str , language : str , tool_ids : Optional [ List [ int ]] = None , sub_agent_ids : Optional [ List [ int ]] = None ):
102102 for system_prompt in generate_and_save_system_prompt_impl (
103103 agent_id = agent_id ,
104104 model_id = model_id ,
105105 task_description = task_description ,
106106 user_id = user_id ,
107107 tenant_id = tenant_id ,
108- language = language
108+ language = language ,
109+ tool_ids = tool_ids ,
110+ sub_agent_ids = sub_agent_ids
109111 ):
110112 # SSE format, each message ends with \n\n
111113 yield f"data: { json .dumps ({'success' : True , 'data' : system_prompt }, ensure_ascii = False )} \n \n "
@@ -116,17 +118,35 @@ def generate_and_save_system_prompt_impl(agent_id: int,
116118 task_description : str ,
117119 user_id : str ,
118120 tenant_id : str ,
119- language : str ):
120- # Get description of tool and agent
121- # In create mode (agent_id=0), return empty lists
122- if agent_id == 0 :
121+ language : str ,
122+ tool_ids : Optional [List [int ]] = None ,
123+ sub_agent_ids : Optional [List [int ]] = None ):
124+ # Get description of tool and agent from frontend-provided IDs
125+ # Frontend always provides tool_ids and sub_agent_ids (could be empty arrays)
126+
127+ # Handle tool IDs
128+ if tool_ids and len (tool_ids ) > 0 :
129+ tool_info_list = query_tools_by_ids (tool_ids )
130+ logger .debug (f"Using frontend-provided tool IDs: { tool_ids } " )
131+ else :
123132 tool_info_list = []
133+ logger .debug ("No tools selected (empty tool_ids list)" )
134+
135+ # Handle sub-agent IDs
136+ if sub_agent_ids and len (sub_agent_ids ) > 0 :
124137 sub_agent_info_list = []
138+ for sub_agent_id in sub_agent_ids :
139+ try :
140+ sub_agent_info = search_agent_info_by_agent_id (
141+ agent_id = sub_agent_id , tenant_id = tenant_id )
142+ sub_agent_info_list .append (sub_agent_info )
143+ except Exception as e :
144+ logger .warning (
145+ f"Failed to get sub-agent info for agent_id { sub_agent_id } : { str (e )} " )
146+ logger .debug (f"Using frontend-provided sub-agent IDs: { sub_agent_ids } " )
125147 else :
126- tool_info_list = get_enabled_tool_description_for_generate_prompt (
127- tenant_id = tenant_id , agent_id = agent_id )
128- sub_agent_info_list = get_enabled_sub_agent_description_for_generate_prompt (
129- tenant_id = tenant_id , agent_id = agent_id )
148+ sub_agent_info_list = []
149+ logger .debug ("No sub-agents selected (empty sub_agent_ids list)" )
130150
131151 # 1. Real-time streaming push
132152 final_results = {"duty" : "" , "constraint" : "" , "few_shots" : "" , "agent_var_name" : "" , "agent_display_name" : "" ,
@@ -292,27 +312,3 @@ def join_info_for_generate_system_prompt(prompt_for_generate, sub_agent_info_lis
292312 "assistant_description" : assistant_description
293313 })
294314 return content
295-
296-
297- def get_enabled_tool_description_for_generate_prompt (agent_id : int , tenant_id : str ):
298- # Get tool information
299- logger .info ("Fetching tool instances" )
300- tool_id_list = get_enable_tool_id_by_agent_id (
301- agent_id = agent_id , tenant_id = tenant_id )
302- tool_info_list = query_tools_by_ids (tool_id_list )
303- return tool_info_list
304-
305-
306- def get_enabled_sub_agent_description_for_generate_prompt (agent_id : int , tenant_id : str ):
307- logger .info ("Fetching sub-agents information" )
308-
309- sub_agent_id_list = query_sub_agents_id_list (
310- main_agent_id = agent_id , tenant_id = tenant_id )
311-
312- sub_agent_info_list = []
313- for sub_agent_id in sub_agent_id_list :
314- sub_agent_info = search_agent_info_by_agent_id (
315- agent_id = sub_agent_id , tenant_id = tenant_id )
316-
317- sub_agent_info_list .append (sub_agent_info )
318- return sub_agent_info_list
0 commit comments