Skip to content

Commit 4b57107

Browse files
committed
query_all_tools♻️ Backend code cleanup and import organization (apps/, consts/) #1037
1 parent 3c89e5a commit 4b57107

27 files changed

+416
-307
lines changed

backend/agents/agent_run_manager.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import logging
22
import threading
33
from typing import Dict
4+
45
from nexent.core.agents.agent_model import AgentRunInfo
56

67
logger = logging.getLogger("agent_run_manager")
78

9+
810
class AgentRunManager:
911
_instance = None
1012
_lock = threading.Lock()
@@ -52,4 +54,4 @@ def stop_agent_run(self, conversation_id: int) -> bool:
5254

5355

5456
# create singleton instance
55-
agent_run_manager = AgentRunManager()
57+
agent_run_manager = AgentRunManager()

backend/agents/create_agent_info.py

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
import threading
22
import logging
33
from urllib.parse import urljoin
4+
from datetime import datetime
5+
6+
from jinja2 import Template, StrictUndefined
7+
from smolagents.utils import BASE_BUILTIN_MODULES
48
from nexent.core.utils.observer import MessageObserver
59
from nexent.core.agents.agent_model import AgentRunInfo, ModelConfig, AgentConfig, ToolConfig
6-
from services.remote_mcp_service import get_remote_mcp_server_list
7-
from utils.auth_utils import get_current_user_id
10+
from nexent.memory.memory_service import search_memory_in_levels
811

9-
from database.agent_db import search_agent_info_by_agent_id, query_sub_agents_id_list
10-
from database.tool_db import search_tools_for_sub_agent
1112
from services.elasticsearch_service import ElasticSearchService, elastic_core, get_embedding_model
1213
from services.tenant_config_service import get_selected_knowledge_list
14+
from services.remote_mcp_service import get_remote_mcp_server_list
15+
from services.memory_config_service import build_memory_context
16+
from database.agent_db import search_agent_info_by_agent_id, query_sub_agents_id_list
17+
from database.tool_db import search_tools_for_sub_agent
1318
from utils.prompt_template_utils import get_agent_prompt_template
1419
from utils.config_utils import config_manager, tenant_config_manager, get_model_name_from_config
15-
from smolagents.utils import BASE_BUILTIN_MODULES
16-
from services.memory_config_service import build_memory_context
17-
from jinja2 import Template, StrictUndefined
18-
from datetime import datetime
19-
20-
from nexent.memory.memory_service import search_memory_in_levels
21-
20+
from utils.auth_utils import get_current_user_id
2221

2322
logger = logging.getLogger("create_agent_info")
2423
logger.setLevel(logging.DEBUG)
2524

25+
2626
async def create_model_config_list(tenant_id):
2727
main_model_config = tenant_config_manager.get_model_config(key="LLM_ID", tenant_id=tenant_id)
2828
sub_model_config = tenant_config_manager.get_model_config(key="LLM_SECONDARY_ID", tenant_id=tenant_id)
@@ -117,7 +117,7 @@ async def create_agent_config(agent_id, tenant_id, user_id, language: str = 'zh'
117117
logger.error(f"Failed to build knowledge base summary: {e}")
118118

119119
# Assemble system_prompt
120-
if (duty_prompt or constraint_prompt or few_shots_prompt):
120+
if duty_prompt or constraint_prompt or few_shots_prompt:
121121
system_prompt = Template(prompt_template["system_prompt"], undefined=StrictUndefined).render({
122122
"duty": duty_prompt,
123123
"constraint": constraint_prompt,
@@ -129,15 +129,19 @@ async def create_agent_config(agent_id, tenant_id, user_id, language: str = 'zh'
129129
"APP_DESCRIPTION": app_description,
130130
"memory_list": memory_list,
131131
"knowledge_base_summary": knowledge_base_summary,
132-
"time" : datetime.now().strftime("%Y-%m-%d %H:%M:%S")
132+
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
133133
})
134134
else:
135135
system_prompt = agent_info.get("prompt", "")
136136

137137
agent_config = AgentConfig(
138138
name="undefined" if agent_info["name"] is None else agent_info["name"],
139139
description="undefined" if agent_info["description"] is None else agent_info["description"],
140-
prompt_templates=await prepare_prompt_templates(is_manager=len(managed_agents)>0, system_prompt=system_prompt, language=language),
140+
prompt_templates=await prepare_prompt_templates(
141+
is_manager=len(managed_agents) > 0,
142+
system_prompt=system_prompt,
143+
language=language
144+
),
141145
tools=tool_list,
142146
max_steps=agent_info.get("max_steps", 10),
143147
model_name=agent_info.get("model_name"),
@@ -253,7 +257,7 @@ async def join_minio_file_description_to_query(minio_files, query):
253257
return final_query
254258

255259

256-
def filter_mcp_servers_and_tools(input_agent_config: AgentConfig, mcp_info_dict)->list:
260+
def filter_mcp_servers_and_tools(input_agent_config: AgentConfig, mcp_info_dict) -> list:
257261
"""
258262
Filter mcp servers and tools, only keep the actual used mcp servers
259263
Support multi-level agent, recursively check all sub-agent tools
@@ -282,8 +286,13 @@ async def create_agent_run_info(agent_id, minio_files, query, history, authoriza
282286

283287
final_query = await join_minio_file_description_to_query(minio_files=minio_files, query=query)
284288
model_list = await create_model_config_list(tenant_id)
285-
agent_config = await create_agent_config(agent_id=agent_id, tenant_id=tenant_id, user_id=user_id,
286-
language=language, last_user_query=final_query)
289+
agent_config = await create_agent_config(
290+
agent_id=agent_id,
291+
tenant_id=tenant_id,
292+
user_id=user_id,
293+
language=language,
294+
last_user_query=final_query
295+
)
287296

288297
remote_mcp_list = await get_remote_mcp_server_list(tenant_id=tenant_id)
289298
default_mcp_url = urljoin(config_manager.get_config("NEXENT_MCP_SERVER"), "sse")
@@ -297,7 +306,6 @@ async def create_agent_run_info(agent_id, minio_files, query, history, authoriza
297306
# Filter MCP servers and tools
298307
mcp_host = filter_mcp_servers_and_tools(agent_config, remote_mcp_dict)
299308

300-
301309
agent_run_info = AgentRunInfo(
302310
query=final_query,
303311
model_config_list=model_list,

backend/agents/preprocess_manager.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
logger = logging.getLogger("preprocess_manager")
88

9+
910
class PreprocessTask:
1011
def __init__(self, task_id: str, conversation_id: int):
1112
self.task_id = task_id
@@ -14,6 +15,7 @@ def __init__(self, task_id: str, conversation_id: int):
1415
self.is_running = True
1516
self.task = None # asyncio.Task reference
1617

18+
1719
class PreprocessManager:
1820
_instance = None
1921
_lock = threading.Lock()
@@ -124,5 +126,6 @@ def get_preprocess_status(self, conversation_id: int) -> Dict:
124126
"tasks": running_tasks
125127
}
126128

129+
127130
# Create singleton instance
128-
preprocess_manager = PreprocessManager()
131+
preprocess_manager = PreprocessManager()

backend/apps/agent_app.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,27 @@
22
from http import HTTPStatus
33
from typing import Optional
44

5-
from fastapi import HTTPException, APIRouter, Header, Request, Body
5+
from fastapi import APIRouter, Body, Header, HTTPException, Request
66
from fastapi.responses import JSONResponse
77

88
from consts.model import AgentRequest, AgentInfoRequest, AgentIDRequest, ConversationResponse, AgentImportRequest
9-
from services.agent_service import get_agent_info_impl, \
10-
get_creating_sub_agent_info_impl, update_agent_info_impl, delete_agent_impl, export_agent_impl, import_agent_impl, \
11-
list_all_agent_info_impl, insert_related_agent_impl, run_agent_stream, stop_agent_tasks, \
12-
get_agent_call_relationship_impl, delete_related_agent_impl
9+
from services.agent_service import (
10+
get_agent_info_impl,
11+
get_creating_sub_agent_info_impl,
12+
update_agent_info_impl,
13+
delete_agent_impl,
14+
export_agent_impl,
15+
import_agent_impl,
16+
list_all_agent_info_impl,
17+
insert_related_agent_impl,
18+
run_agent_stream,
19+
stop_agent_tasks,
20+
get_agent_call_relationship_impl,
21+
delete_related_agent_impl
22+
)
1323
from utils.auth_utils import get_current_user_info, get_current_user_id
1424

1525
router = APIRouter(prefix="/agent")
16-
# Configure logging
1726
logger = logging.getLogger("agent_app")
1827

1928

@@ -130,6 +139,7 @@ async def import_agent_api(request: AgentImportRequest, authorization: Optional[
130139
status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail="Agent import error.")
131140

132141

142+
133143
@router.get("/list")
134144
async def list_all_agent_info_api(authorization: Optional[str] = Header(None), request: Request = None):
135145
"""

backend/apps/base_app.py

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,30 @@
11
import logging
22

33
from fastapi import FastAPI, HTTPException
4-
from fastapi.responses import JSONResponse
54
from fastapi.middleware.cors import CORSMiddleware
5+
from fastapi.responses import JSONResponse
66

7-
from .agent_app import router as agent_router
8-
from .config_sync_app import router as config_sync_router
9-
from .conversation_management_app import router as conversation_management_router
10-
from .elasticsearch_app import router as elasticsearch_router
11-
from .memory_config_app import router as memory_router
12-
from .me_model_managment_app import router as me_model_manager_router
13-
from .model_managment_app import router as model_manager_router
14-
from .image_app import router as proxy_router
15-
from .file_management_app import router as file_manager_router
16-
from .voice_app import router as voice_router
17-
from .tool_config_app import router as tool_config_router
18-
from .user_management_app import router as user_management_router
19-
from .mock_user_management_app import router as mock_user_management_router
20-
from .prompt_app import router as prompt_router
21-
from .knowledge_summary_app import router as summary_router
22-
from .tenant_config_app import router as tenant_config_router
23-
from .remote_mcp_app import router as remote_mcp_router
7+
from apps.agent_app import router as agent_router
8+
from apps.config_sync_app import router as config_sync_router
9+
from apps.conversation_management_app import router as conversation_management_router
10+
from apps.elasticsearch_app import router as elasticsearch_router
11+
from apps.file_management_app import router as file_manager_router
12+
from apps.image_app import router as proxy_router
13+
from apps.knowledge_summary_app import router as summary_router
14+
from apps.memory_config_app import router as memory_router
15+
from apps.me_model_managment_app import router as me_model_manager_router
16+
from apps.mock_user_management_app import router as mock_user_management_router
17+
from apps.model_managment_app import router as model_manager_router
18+
from apps.prompt_app import router as prompt_router
19+
from apps.remote_mcp_app import router as remote_mcp_router
20+
from apps.tenant_config_app import router as tenant_config_router
21+
from apps.tool_config_app import router as tool_config_router
22+
from apps.user_management_app import router as user_management_router
23+
from apps.voice_app import router as voice_router
2424
from consts.const import IS_SPEED_MODE
2525

2626
# Create logger instance
2727
logger = logging.getLogger("base_app")
28-
2928
app = FastAPI(root_path="/api")
3029

3130
# Add CORS middleware

backend/apps/config_sync_app.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
11
import logging
2+
from typing import Optional
23

34
from fastapi import APIRouter, Header, Request
45
from fastapi.responses import JSONResponse
5-
from typing import Optional
66

7+
from consts.const import (
8+
DEFAULT_APP_DESCRIPTION_ZH,
9+
DEFAULT_APP_DESCRIPTION_EN,
10+
DEFAULT_APP_NAME_EN,
11+
DEFAULT_APP_NAME_ZH,
12+
DEFAULT_APP_ICON_URL
13+
)
714
from consts.model import GlobalConfig
8-
from consts.const import DEFAULT_APP_DESCRIPTION_ZH, DEFAULT_APP_DESCRIPTION_EN, DEFAULT_APP_NAME_EN, DEFAULT_APP_NAME_ZH, DEFAULT_APP_ICON_URL
9-
from utils.config_utils import config_manager, get_env_key, safe_value, tenant_config_manager, \
10-
get_model_name_from_config
11-
from utils.auth_utils import get_current_user_id, get_current_user_info
1215
from database.model_management_db import get_model_id_by_display_name
16+
from utils.auth_utils import get_current_user_id, get_current_user_info
17+
from utils.config_utils import (
18+
config_manager,
19+
get_env_key,
20+
safe_value,
21+
tenant_config_manager,
22+
get_model_name_from_config
23+
)
1324

1425
router = APIRouter(prefix="/config")
15-
16-
# Get logger instance
1726
logger = logging.getLogger("config_sync_app")
1827

28+
1929
def handle_model_config(tenant_id: str, user_id: str, config_key: str, model_id: int, tenant_config_dict: dict) -> None:
2030
"""
2131
Handle model configuration updates, deletions, and settings operations
@@ -80,10 +90,10 @@ async def save_config(config: GlobalConfig, authorization: Optional[str] = Heade
8090
continue
8191

8292
model_name = model_config.get("modelName")
83-
model_displayName = model_config.get("displayName")
93+
model_display_name = model_config.get("displayName")
8494

8595
config_key = get_env_key(model_type) + "_ID"
86-
model_id = get_model_id_by_display_name(model_displayName, tenant_id)
96+
model_id = get_model_id_by_display_name(model_display_name, tenant_id)
8797

8898
if not model_name:
8999
continue
@@ -95,8 +105,8 @@ async def save_config(config: GlobalConfig, authorization: Optional[str] = Heade
95105
# Still keep EMBEDDING_API_KEY in env
96106
if model_type == "embedding":
97107
if model_config and "apiConfig" in model_config:
98-
embedding_apiCongig = model_config.get("apiConfig",{})
99-
env_config[f"{model_prefix}_API_KEY"] = safe_value(embedding_apiCongig.get("apiKey"))
108+
embedding_api_config = model_config.get("apiConfig", {})
109+
env_config[f"{model_prefix}_API_KEY"] = safe_value(embedding_api_config.get("apiKey"))
100110

101111
# Batch update environment variables
102112
for key, value in env_config.items():
@@ -228,4 +238,3 @@ async def load_config(authorization: Optional[str] = Header(None), request: Requ
228238
status_code=400,
229239
content={"message": f"Failed to load configuration: {str(e)}", "status": "error"}
230240
)
231-

0 commit comments

Comments
 (0)