Skip to content

Commit daad039

Browse files
committed
✨ Agent duplicate name handling logic improvement #1622
[Specification Details] 1.Fix test cases.
1 parent 0ef4c32 commit daad039

File tree

3 files changed

+54
-24
lines changed

3 files changed

+54
-24
lines changed

backend/services/prompt_service.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,15 @@
1313
query_sub_agents_id_list
1414
from database.model_management_db import get_model_by_model_id
1515
from database.tool_db import query_tools_by_ids
16-
from services.agent_service import get_enable_tool_id_by_agent_id
16+
from services.agent_service import (
17+
get_enable_tool_id_by_agent_id,
18+
_check_agent_name_duplicate,
19+
_check_agent_display_name_duplicate,
20+
_regenerate_agent_name_with_llm,
21+
_regenerate_agent_display_name_with_llm,
22+
_generate_unique_agent_name_with_suffix,
23+
_generate_unique_display_name_with_suffix
24+
)
1725
from utils.config_utils import get_model_name_from_config
1826
from utils.prompt_template_utils import get_prompt_generate_prompt_template
1927

@@ -158,16 +166,6 @@ def generate_and_save_system_prompt_impl(agent_id: int,
158166
final_results = {"duty": "", "constraint": "", "few_shots": "", "agent_var_name": "", "agent_display_name": "",
159167
"agent_description": ""}
160168

161-
# Import functions locally to avoid circular import
162-
from services.agent_service import (
163-
_check_agent_name_duplicate,
164-
_check_agent_display_name_duplicate,
165-
_regenerate_agent_name_with_llm,
166-
_regenerate_agent_display_name_with_llm,
167-
_generate_unique_agent_name_with_suffix,
168-
_generate_unique_display_name_with_suffix
169-
)
170-
171169
# Get all existing agent names and display names for duplicate checking (only if not in create mode)
172170
all_agents = query_all_agent_info_by_tenant_id(tenant_id)
173171
existing_names = [

test/backend/services/test_agent_service.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2378,7 +2378,8 @@ async def test_import_agent_impl_success_with_mcp(mock_get_current_user_info, mo
23782378
mock_import_agent.assert_called_once_with(
23792379
import_agent_info=agent_info,
23802380
tenant_id="test_tenant",
2381-
user_id="test_user"
2381+
user_id="test_user",
2382+
skip_duplicate_regeneration=False,
23822383
)
23832384

23842385

@@ -2685,7 +2686,8 @@ async def test_import_agent_impl_no_mcp_info(mock_get_current_user_info, mock_up
26852686
mock_import_agent.assert_called_once_with(
26862687
import_agent_info=agent_info,
26872688
tenant_id="test_tenant",
2688-
user_id="test_user"
2689+
user_id="test_user",
2690+
skip_duplicate_regeneration=False,
26892691
)
26902692

26912693

@@ -3722,15 +3724,15 @@ async def test_generate_stream_with_memory_emits_tokens_and_unregisters(monkeypa
37223724
)
37233725
http_request = Request(scope={"type": "http", "headers": []})
37243726

3725-
# Enable memory switch in preview
3727+
# Enable memory switch in preview (memory enabled)
37263728
monkeypatch.setattr(
37273729
"backend.services.agent_service.build_memory_context",
37283730
MagicMock(return_value=MagicMock(
37293731
user_config=MagicMock(memory_switch=True))),
37303732
raising=False,
37313733
)
37323734

3733-
# Prepare run returned values
3735+
# Prepare run returned values (agent_run_info, memory_context)
37343736
monkeypatch.setattr(
37353737
"backend.services.agent_service.prepare_agent_run",
37363738
AsyncMock(return_value=(MagicMock(), MagicMock())),
@@ -3776,8 +3778,10 @@ def fake_unregister(task_id):
37763778
out.append(d)
37773779

37783780
# Expect start and done memory tokens then body chunks
3779-
assert any("memory_search" in s and "<MEM_START>" in s for s in out)
3780-
assert any("memory_search" in s and "<MEM_DONE>" in s for s in out)
3781+
from consts.const import MEMORY_SEARCH_START_MSG, MEMORY_SEARCH_DONE_MSG
3782+
3783+
assert any("memory_search" in s and MEMORY_SEARCH_START_MSG in s for s in out)
3784+
assert any("memory_search" in s and MEMORY_SEARCH_DONE_MSG in s for s in out)
37813785
assert "data: bodyA\n\n" in out and "data: bodyB\n\n" in out
37823786
# Unregister must be called
37833787
assert calls["registered"] is not None
@@ -3843,7 +3847,9 @@ def fake_unregister(task_id):
38433847
):
38443848
out.append(d)
38453849

3846-
assert any("memory_search" in s and "<MEM_FAILED>" in s for s in out)
3850+
from consts.const import MEMORY_SEARCH_FAIL_MSG
3851+
3852+
assert any("memory_search" in s and MEMORY_SEARCH_FAIL_MSG in s for s in out)
38473853
assert "data: fb1\n\n" in out
38483854
assert called["unregistered"]
38493855

test/backend/services/test_prompt_service.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,24 @@ def test_call_llm_for_system_prompt(self, mock_get_model_name, mock_openai, mock
9191
@patch('backend.services.prompt_service.generate_system_prompt')
9292
@patch('backend.services.prompt_service.query_tools_by_ids')
9393
@patch('backend.services.prompt_service.search_agent_info_by_agent_id')
94+
@patch('backend.services.prompt_service.query_all_agent_info_by_tenant_id')
9495
@patch('backend.services.prompt_service.update_agent')
95-
def test_generate_and_save_system_prompt_impl(self, mock_update_agent, mock_search_agent_info,
96-
mock_query_tools, mock_generate_system_prompt):
96+
def test_generate_and_save_system_prompt_impl(
97+
self,
98+
mock_update_agent,
99+
mock_query_all_agents,
100+
mock_search_agent_info,
101+
mock_query_tools,
102+
mock_generate_system_prompt,
103+
):
97104
# Setup
98105
mock_tool1 = {"name": "tool1", "description": "Tool 1 desc",
99106
"inputs": "input1", "output_type": "output1"}
100107
mock_tool2 = {"name": "tool2", "description": "Tool 2 desc",
101108
"inputs": "input2", "output_type": "output2"}
102109
mock_query_tools.return_value = [mock_tool1, mock_tool2]
110+
# No existing agents so that duplicate detection path is not triggered
111+
mock_query_all_agents.return_value = []
103112

104113
mock_agent1 = {"name": "agent1", "description": "Agent 1 desc"}
105114
mock_agent2 = {"name": "agent2", "description": "Agent 2 desc"}
@@ -161,8 +170,18 @@ def mock_generator(*args, **kwargs):
161170
self.assertEqual(agent_info.business_description, "Test task")
162171

163172
@patch('backend.services.prompt_service.generate_system_prompt')
173+
@patch('backend.services.prompt_service.query_all_agent_info_by_tenant_id')
174+
@patch('backend.services.prompt_service.get_enabled_sub_agent_description_for_generate_prompt')
175+
@patch('backend.services.prompt_service.get_enabled_tool_description_for_generate_prompt')
164176
@patch('backend.services.prompt_service.update_agent')
165-
def test_generate_and_save_system_prompt_impl_create_mode(self, mock_update_agent, mock_generate_system_prompt):
177+
def test_generate_and_save_system_prompt_impl_create_mode(
178+
self,
179+
mock_update_agent,
180+
mock_get_enabled_tools,
181+
mock_get_enabled_sub_agents,
182+
mock_query_all_agents,
183+
mock_generate_system_prompt,
184+
):
166185
"""Test generate_and_save_system_prompt_impl in create mode (agent_id=0)"""
167186
# Setup - Mock the generator to return the expected data structure
168187
def mock_generator(*args, **kwargs):
@@ -177,6 +196,13 @@ def mock_generator(*args, **kwargs):
177196
yield {"type": "few_shots", "content": "Final few shots prompt", "is_complete": True}
178197

179198
mock_generate_system_prompt.side_effect = mock_generator
199+
# Simulate no existing agents (no duplicates)
200+
mock_query_all_agents.return_value = []
201+
# Simulate back-end enabled tools / sub-agents when IDs are empty
202+
enabled_tools = [{"name": "db_tool", "description": "DB tool"}]
203+
enabled_sub_agents = [{"name": "db_agent", "description": "DB agent"}]
204+
mock_get_enabled_tools.return_value = enabled_tools
205+
mock_get_enabled_sub_agents.return_value = enabled_sub_agents
180206

181207
# Execute - test as a generator with agent_id=0 (create mode) and empty tool/sub-agent IDs
182208
result_gen = generate_and_save_system_prompt_impl(
@@ -194,11 +220,11 @@ def mock_generator(*args, **kwargs):
194220
# Assert
195221
self.assertGreater(len(result), 0)
196222

197-
# Should call generate_system_prompt with empty lists for tools and sub-agents
223+
# Should call generate_system_prompt with back-end enabled tools and sub-agents
198224
mock_generate_system_prompt.assert_called_once_with(
199-
[], # Empty sub_agent_info_list
225+
enabled_sub_agents, # sub_agent_info_list from helper
200226
"Test task",
201-
[], # Empty tool_info_list
227+
enabled_tools, # tool_info_list from helper
202228
"tenant456",
203229
self.test_model_id,
204230
"zh"

0 commit comments

Comments
 (0)