Skip to content

Commit bd9e742

Browse files
authored
Merge pull request #1171 from ModelEngine-Group/bwq/0904_re
♻️ Refactor: Partial constant extraction in the backend
2 parents 6ac77df + 487355f commit bd9e742

20 files changed

+514
-104
lines changed

backend/agents/create_agent_info.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@
1717
from database.tool_db import search_tools_for_sub_agent
1818
from utils.prompt_template_utils import get_agent_prompt_template
1919
from utils.config_utils import tenant_config_manager, get_model_name_from_config
20-
from consts.const import LOCAL_MCP_SERVER
20+
from consts.const import LOCAL_MCP_SERVER, MODEL_CONFIG_MAPPING, LANGUAGE
2121

2222
logger = logging.getLogger("create_agent_info")
2323
logger.setLevel(logging.DEBUG)
2424

2525

2626
async def create_model_config_list(tenant_id):
2727
main_model_config = tenant_config_manager.get_model_config(
28-
key="LLM_ID", tenant_id=tenant_id)
28+
key=MODEL_CONFIG_MAPPING["llm"], tenant_id=tenant_id)
2929
sub_model_config = tenant_config_manager.get_model_config(
30-
key="LLM_SECONDARY_ID", tenant_id=tenant_id)
30+
key=MODEL_CONFIG_MAPPING["llmSecondary"], tenant_id=tenant_id)
3131

3232
return [ModelConfig(cite_name="main_model",
3333
api_key=main_model_config.get("api_key", ""),
@@ -45,7 +45,7 @@ async def create_agent_config(
4545
agent_id,
4646
tenant_id,
4747
user_id,
48-
language: str = "zh",
48+
language: str = LANGUAGE["ZH"],
4949
last_user_query: str = None,
5050
allow_memory_search: bool = True,
5151
):

backend/apps/memory_config_app.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from consts.const import (
3838
MEMORY_AGENT_SHARE_KEY,
3939
MEMORY_SWITCH_KEY,
40+
BOOLEAN_TRUE_VALUES,
4041
)
4142
from consts.model import MemoryAgentShareMode
4243
from consts.exceptions import UnauthorizedError
@@ -100,7 +101,7 @@ def set_single_config(
100101

101102
if key == MEMORY_SWITCH_KEY:
102103
enabled = bool(value) if isinstance(value, bool) else str(
103-
value).lower() in {"true", "1", "y", "yes", "on"}
104+
value).lower() in BOOLEAN_TRUE_VALUES
104105
ok = set_memory_switch(user_id, enabled)
105106
elif key == MEMORY_AGENT_SHARE_KEY:
106107
try:

backend/apps/mock_user_management_app.py

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,12 @@
55
from fastapi.responses import JSONResponse
66
from http import HTTPStatus
77

8-
from consts.const import DEFAULT_USER_ID
8+
from consts.const import MOCK_USER, MOCK_SESSION
99
from consts.model import UserSignInRequest, UserSignUpRequest
1010

1111
logger = logging.getLogger("mock_user_management_app")
1212
router = APIRouter(prefix="/user", tags=["user"])
1313

14-
# Mock user data
15-
MOCK_USER = {
16-
"id": DEFAULT_USER_ID,
17-
"email": "[email protected]",
18-
"role": "admin"
19-
}
20-
21-
MOCK_SESSION = {
22-
"access_token": "mock_access_token",
23-
"refresh_token": "mock_refresh_token",
24-
"expires_at": int((datetime.now() + timedelta(days=3650)).timestamp()),
25-
"expires_in_seconds": 315360000
26-
}
27-
2814

2915
@router.get("/service_health")
3016
async def service_health():
@@ -63,7 +49,7 @@ async def signup(request: UserSignUpRequest):
6349
"session": {
6450
"access_token": MOCK_SESSION["access_token"],
6551
"refresh_token": MOCK_SESSION["refresh_token"],
66-
"expires_at": MOCK_SESSION["expires_at"],
52+
"expires_at": int((datetime.now() + timedelta(days=3650)).timestamp()),
6753
"expires_in_seconds": MOCK_SESSION["expires_in_seconds"]
6854
},
6955
"registration_type": "admin" if request.is_admin else "user"
@@ -97,7 +83,7 @@ async def signin(request: UserSignInRequest):
9783
"session": {
9884
"access_token": MOCK_SESSION["access_token"],
9985
"refresh_token": MOCK_SESSION["refresh_token"],
100-
"expires_at": MOCK_SESSION["expires_at"],
86+
"expires_at": int((datetime.now() + timedelta(days=3650)).timestamp()),
10187
"expires_in_seconds": MOCK_SESSION["expires_in_seconds"]
10288
}
10389
}

backend/consts/const.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@
146146
DISABLE_USERAGENT_ID_KEY = "DISABLE_USERAGENT_ID"
147147
DEFAULT_MEMORY_SWITCH_KEY = "Y"
148148
DEFAULT_MEMORY_AGENT_SHARE_KEY = "always"
149+
# Boolean value representations for configuration parsing
150+
BOOLEAN_TRUE_VALUES = {"true", "1", "y", "yes", "on"}
149151

150152

151153
DEFAULT_LLM_MAX_TOKENS = 4096
@@ -161,6 +163,55 @@
161163
# Debug JWT expiration time (seconds), not set or 0 means not effective
162164
DEBUG_JWT_EXPIRE_SECONDS = int(os.getenv('DEBUG_JWT_EXPIRE_SECONDS', '0') or 0)
163165

166+
# Memory Search Status Messages (for i18n placeholders)
167+
MEMORY_SEARCH_START_MSG = "<MEM_START>"
168+
MEMORY_SEARCH_DONE_MSG = "<MEM_DONE>"
169+
MEMORY_SEARCH_FAIL_MSG = "<MEM_FAILED>"
170+
171+
# Tool Type Mapping (for display normalization)
172+
TOOL_TYPE_MAPPING = {
173+
"mcp": "MCP",
174+
"langchain": "LangChain",
175+
"local": "Local",
176+
}
177+
178+
# Default Language Configuration
179+
LANGUAGE = {
180+
"ZH": "zh",
181+
"EN": "en"
182+
}
183+
184+
# Message Role Constants
185+
MESSAGE_ROLE = {
186+
"USER": "user",
187+
"ASSISTANT": "assistant",
188+
"SYSTEM": "system"
189+
}
190+
191+
# Knowledge summary max token limits
192+
KNOWLEDGE_SUMMARY_MAX_TOKENS_ZH = 300
193+
KNOWLEDGE_SUMMARY_MAX_TOKENS_EN = 120
194+
195+
# Host Configuration Constants
196+
LOCALHOST_IP = "127.0.0.1"
197+
LOCALHOST_NAME = "localhost"
198+
DOCKER_INTERNAL_HOST = "host.docker.internal"
199+
200+
201+
# Mock User Management Configuration (for speed mode)
202+
MOCK_USER = {
203+
"id": DEFAULT_USER_ID,
204+
"email": "[email protected]",
205+
"role": "admin"
206+
}
207+
208+
MOCK_SESSION = {
209+
"access_token": "mock_access_token",
210+
"refresh_token": "mock_refresh_token",
211+
"expires_at": None, # Will be set dynamically
212+
"expires_in_seconds": 315360000 # 10 years
213+
}
214+
164215
MODEL_CONFIG_MAPPING = {
165216
"llm": "LLM_ID",
166217
"llmSecondary": "LLM_SECONDARY_ID",
@@ -177,3 +228,14 @@
177228
ICON_TYPE = "ICON_TYPE"
178229
AVATAR_URI = "AVATAR_URI"
179230
CUSTOM_ICON_URL = "CUSTOM_ICON_URL"
231+
232+
# Task Status Constants
233+
TASK_STATUS = {
234+
"WAIT_FOR_PROCESSING": "WAIT_FOR_PROCESSING",
235+
"WAIT_FOR_FORWARDING": "WAIT_FOR_FORWARDING",
236+
"PROCESSING": "PROCESSING",
237+
"FORWARDING": "FORWARDING",
238+
"COMPLETED": "COMPLETED",
239+
"PROCESS_FAILED": "PROCESS_FAILED",
240+
"FORWARD_FAILED": "FORWARD_FAILED",
241+
}

backend/services/agent_service.py

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from agents.agent_run_manager import agent_run_manager
1414
from agents.create_agent_info import create_agent_run_info, create_tool_config_list
1515
from agents.preprocess_manager import preprocess_manager
16+
from consts.const import MEMORY_SEARCH_START_MSG, MEMORY_SEARCH_DONE_MSG, MEMORY_SEARCH_FAIL_MSG, TOOL_TYPE_MAPPING, LANGUAGE, MESSAGE_ROLE
1617
from consts.exceptions import MemoryPreparationException
1718
from consts.model import (
1819
AgentInfoRequest,
@@ -118,7 +119,7 @@ async def _stream_agent_chunks(
118119
if not agent_request.is_debug:
119120
save_messages(
120121
agent_request,
121-
target="assistant",
122+
target=MESSAGE_ROLE["ASSISTANT"],
122123
messages=local_messages,
123124
tenant_id=tenant_id,
124125
user_id=user_id,
@@ -149,8 +150,8 @@ async def _add_memory_background():
149150
return
150151

151152
mem_messages_local = [
152-
{"role": "user", "content": agent_run_info.query},
153-
{"role": "assistant", "content": final_answer_local},
153+
{"role": MESSAGE_ROLE["USER"], "content": agent_run_info.query},
154+
{"role": MESSAGE_ROLE["ASSISTANT"], "content": final_answer_local},
154155
]
155156

156157
add_result_local = await add_memory_in_levels(
@@ -660,7 +661,7 @@ async def prepare_agent_run(
660661
agent_request: AgentRequest,
661662
user_id: str,
662663
tenant_id: str,
663-
language: str="zh",
664+
language: str=LANGUAGE["ZH"],
664665
allow_memory_search: bool = True,
665666
):
666667
"""
@@ -686,11 +687,11 @@ async def prepare_agent_run(
686687

687688
# Helper function for run_agent_stream, used to save messages for either user or assistant
688689
def save_messages(agent_request, target: str, user_id: str, tenant_id: str, messages=None):
689-
if target == "user":
690+
if target == MESSAGE_ROLE["USER"]:
690691
if messages is not None:
691692
raise ValueError("Messages should be None when saving for user.")
692693
submit(save_conversation_user, agent_request, user_id, tenant_id)
693-
elif target == "assistant":
694+
elif target == MESSAGE_ROLE["ASSISTANT"]:
694695
if messages is None:
695696
raise ValueError(
696697
"Messages cannot be None when saving for assistant.")
@@ -703,7 +704,7 @@ async def generate_stream_with_memory(
703704
agent_request: AgentRequest,
704705
user_id: str,
705706
tenant_id: str,
706-
language: str = "zh",
707+
language: str = LANGUAGE["ZH"],
707708
):
708709
# Prepare preprocess task tracking (simulate preprocess flow)
709710
task_id = str(uuid.uuid4())
@@ -723,9 +724,9 @@ def _memory_token(message_text: str) -> str:
723724
return json.dumps(payload, ensure_ascii=False)
724725

725726
# Placeholder messages handled by frontend for i18n
726-
msg_start = "<MEM_START>"
727-
msg_done = "<MEM_DONE>"
728-
msg_fail = "<MEM_FAILED>"
727+
msg_start = MEMORY_SEARCH_START_MSG
728+
msg_done = MEMORY_SEARCH_DONE_MSG
729+
msg_fail = MEMORY_SEARCH_FAIL_MSG
729730

730731
# ------------------------------------------------------------------
731732
# Note: the actual streaming happens via `_stream_agent_chunks` helper
@@ -805,7 +806,7 @@ async def generate_stream_no_memory(
805806
agent_request: AgentRequest,
806807
user_id: str,
807808
tenant_id: str,
808-
language: str="zh",
809+
language: str=LANGUAGE["ZH"],
809810
):
810811
"""Stream agent responses without any memory preprocessing tokens or fallback logic."""
811812

@@ -850,7 +851,7 @@ async def run_agent_stream(
850851

851852
# Save user message only if not in debug mode (before streaming starts)
852853
if not agent_request.is_debug:
853-
save_messages(agent_request, target="user",
854+
save_messages(agent_request, target=MESSAGE_ROLE["USER"],
854855
user_id=resolved_user_id,
855856
tenant_id=resolved_tenant_id)
856857

@@ -952,21 +953,14 @@ def get_agent_call_relationship_impl(agent_id: int, tenant_id: str) -> dict:
952953
Returns:
953954
dict: agent call relationship tree structure
954955
"""
955-
# Tool type specification: meets test expectations
956-
_TYPE_MAPPING = {
957-
"mcp": "MCP",
958-
"langchain": "LangChain",
959-
"local": "Local",
960-
}
961-
962956
def _normalize_tool_type(source: str) -> str:
963957
"""Normalize the source from database to the expected display type for testing."""
964958
if not source:
965959
return "UNKNOWN"
966960
s = str(source)
967961
ls = s.lower()
968-
if ls in _TYPE_MAPPING:
969-
return _TYPE_MAPPING[ls]
962+
if ls in TOOL_TYPE_MAPPING:
963+
return TOOL_TYPE_MAPPING[ls]
970964
# Unknown source: capitalize first letter, keep the rest unchanged (unknown_source -> Unknown_source)
971965
return s[:1].upper() + s[1:]
972966

backend/services/config_sync_service.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
DEFAULT_APP_NAME_EN,
1212
DEFAULT_APP_NAME_ZH,
1313
ICON_TYPE,
14-
MODEL_CONFIG_MAPPING
14+
MODEL_CONFIG_MAPPING,
15+
LANGUAGE
1516
)
1617
from database.model_management_db import get_model_id_by_display_name
1718
from utils.config_utils import (
@@ -126,8 +127,8 @@ async def load_config_impl(language: str, tenant_id: str):
126127

127128

128129
def build_app_config(language: str, tenant_id: str) -> dict:
129-
default_app_name = DEFAULT_APP_NAME_ZH if language == "zh" else DEFAULT_APP_NAME_EN
130-
default_app_description = DEFAULT_APP_DESCRIPTION_ZH if language == "zh" else DEFAULT_APP_DESCRIPTION_EN
130+
default_app_name = DEFAULT_APP_NAME_ZH if language == LANGUAGE["ZH"] else DEFAULT_APP_NAME_EN
131+
default_app_description = DEFAULT_APP_DESCRIPTION_ZH if language == LANGUAGE["ZH"] else DEFAULT_APP_DESCRIPTION_EN
131132

132133
return {
133134
"name": tenant_config_manager.get_app_config(APP_NAME, tenant_id=tenant_id) or default_app_name,

0 commit comments

Comments
 (0)