Skip to content

Commit 4e309a1

Browse files
committed
♻️ Fix: Move the logic of renaming the duplicate agents to frontend
1 parent dee544d commit 4e309a1

File tree

7 files changed

+298
-63
lines changed

7 files changed

+298
-63
lines changed

backend/apps/agent_app.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ async def import_agent_api(request: AgentImportRequest, authorization: Optional[
148148
status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail="Agent import error.")
149149

150150

151-
@agent_config_router.post("/check_name/batch")
151+
@agent_config_router.post("/check_name")
152152
async def check_agent_name_batch_api(request: AgentNameBatchCheckRequest, authorization: Optional[str] = Header(None)):
153153
"""
154154
Batch check whether agent name/display_name conflicts exist in the tenant.
@@ -163,7 +163,7 @@ async def check_agent_name_batch_api(request: AgentNameBatchCheckRequest, author
163163
status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail="Agent name batch check error.")
164164

165165

166-
@agent_config_router.post("/regenerate_name/batch")
166+
@agent_config_router.post("/regenerate_name")
167167
async def regenerate_agent_name_batch_api(request: AgentNameBatchRegenerateRequest, authorization: Optional[str] = Header(None)):
168168
"""
169169
Batch regenerate agent name/display_name using LLM or suffix fallback.

frontend/components/agent/AgentImportWizard.tsx

Lines changed: 272 additions & 45 deletions
Large diffs are not rendered by default.

frontend/hooks/useAgentImport.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ export interface UseAgentImportOptions {
2020
onError?: (error: Error) => void;
2121
forceImport?: boolean;
2222
/**
23-
* Optional: handle name/display_name conflicts before导入
24-
* Caller can resolve by returning新名称或选择继续/终止
23+
* Optional: handle name/display_name conflicts before import
24+
* Caller can resolve by returning new name or choosing to continue/terminate
2525
*/
2626
onNameConflictResolve?: (payload: {
2727
name: string;
@@ -128,7 +128,7 @@ export function useAgentImport(
128128
* Core import logic - calls backend API
129129
*/
130130
const importAgentData = async (data: ImportAgentData): Promise<void> => {
131-
// Step 1: 前置重名检查(仅检查主 Agent 名称与展示名)
131+
// Step 1: check name/display name conflicts before import (only check main agent name and display name)
132132
const mainAgent = data.agent_info?.[String(data.agent_id)];
133133
if (mainAgent?.name) {
134134
const conflictHandled = await ensureNameNotDuplicated(
@@ -143,7 +143,7 @@ export function useAgentImport(
143143
);
144144
}
145145

146-
// 如果用户选择修改名称,写回导入数据
146+
// if user chooses to modify name, write back to import data
147147
if (conflictHandled.name) {
148148
mainAgent.name = conflictHandled.name;
149149
}
@@ -184,7 +184,7 @@ export function useAgentImport(
184184
};
185185

186186
/**
187-
* 前端侧重名校验逻辑
187+
* Frontend side name conflict validation logic
188188
*/
189189
const ensureNameNotDuplicated = async (
190190
name: string,
@@ -232,7 +232,7 @@ export function useAgentImport(
232232
};
233233
};
234234

235-
// 交给调用方决定如何处理冲突(例如弹窗让用户选择是否让大模型改名)
235+
// let caller decide how to handle conflicts (e.g. show a dialog to let user choose whether to let LLM rename)
236236
if (options.onNameConflictResolve) {
237237
return await options.onNameConflictResolve({
238238
name,
@@ -246,11 +246,11 @@ export function useAgentImport(
246246
});
247247
}
248248

249-
// 默认行为:直接调用后端重命名以保持导入可用
249+
// default behavior: directly call backend to rename to keep import available
250250
const regenerated = await regenerateWithLLM();
251251
return { proceed: true, ...regenerated };
252252
} catch (error) {
253-
// 若回调抛错,则阻止导入
253+
// if callback throws an error, prevent import
254254
throw error instanceof Error
255255
? error
256256
: new Error("Name conflict handling failed");

frontend/public/locales/en/common.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,8 +1223,12 @@
12231223
"market.install.rename.note": "Note: If you proceed without renaming, the agent will be created but marked as unavailable due to name conflicts. You can rename it later in the agent list.",
12241224
"market.install.rename.oneClickDesc": "You can edit names manually, or use one-click rename to let the LLM generate new names for all conflicted agents.",
12251225
"market.install.rename.oneClick": "One-click Rename",
1226+
"market.install.rename.success": "All agent name conflicts have been resolved. You can proceed to the next step.",
1227+
"market.install.rename.partialSuccess": "Some agents have been successfully renamed.",
1228+
"market.install.rename.agentResolved": "This agent's name conflict has been resolved.",
12261229
"market.install.success.mcpInstalled": "MCP server installed successfully",
12271230
"market.install.success.nameRegenerated": "Agent name regenerated successfully",
1231+
"market.install.success.nameRegeneratedAndResolved": "Agent names regenerated successfully and all conflicts resolved",
12281232
"market.install.info.notImplemented": "Installation will be implemented in next phase",
12291233
"market.install.success": "Agent installed successfully!",
12301234
"market.error.fetchDetailFailed": "Failed to load agent details",

frontend/public/locales/zh/common.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,8 +1202,12 @@
12021202
"market.install.rename.note": "注意:如果您不重命名就继续,智能体将被创建但由于名称冲突会被标记为不可用。您可以在智能体列表中稍后重命名。",
12031203
"market.install.rename.oneClickDesc": "可手动修改名称,或一键重命名使用大模型为所有冲突智能体生成新名称。",
12041204
"market.install.rename.oneClick": "一键重命名",
1205+
"market.install.rename.success": "所有智能体名称冲突已解决。您可以继续下一步。",
1206+
"market.install.rename.partialSuccess": "部分智能体已成功重命名。",
1207+
"market.install.rename.agentResolved": "此智能体的名称冲突已解决。",
12051208
"market.install.success.mcpInstalled": "MCP 服务器安装成功",
12061209
"market.install.success.nameRegenerated": "智能体名称重新生成成功",
1210+
"market.install.success.nameRegeneratedAndResolved": "智能体名称重新生成成功,且所有冲突已解决",
12071211
"market.install.info.notImplemented": "安装功能将在下一阶段实现",
12081212
"market.install.success": "智能体安装成功!",
12091213
"market.error.fetchDetailFailed": "加载智能体详情失败",

frontend/services/api.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ export const API_ENDPOINTS = {
3737
`${API_BASE_URL}/agent/stop/${conversationId}`,
3838
export: `${API_BASE_URL}/agent/export`,
3939
import: `${API_BASE_URL}/agent/import`,
40-
checkNameBatch: `${API_BASE_URL}/agent/check_name/batch`,
41-
regenerateNameBatch: `${API_BASE_URL}/agent/regenerate_name/batch`,
40+
checkNameBatch: `${API_BASE_URL}/agent/check_name`,
41+
regenerateNameBatch: `${API_BASE_URL}/agent/regenerate_name`,
4242
searchInfo: `${API_BASE_URL}/agent/search_info`,
4343
callRelationship: `${API_BASE_URL}/agent/call_relationship`,
4444
},

test/backend/app/test_agent_app.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ def test_check_agent_name_batch_api_success(mocker, mock_auth_header):
705705
}
706706

707707
resp = config_client.post(
708-
"/agent/check_name/batch", json=payload, headers=mock_auth_header
708+
"/agent/check_name", json=payload, headers=mock_auth_header
709709
)
710710

711711
assert resp.status_code == 200
@@ -721,7 +721,7 @@ def test_check_agent_name_batch_api_bad_request(mocker, mock_auth_header):
721721
mock_impl.side_effect = ValueError("bad payload")
722722

723723
resp = config_client.post(
724-
"/agent/check_name/batch",
724+
"/agent/check_name",
725725
json={"items": [{"agent_id": 1, "name": "AgentA"}]},
726726
headers=mock_auth_header,
727727
)
@@ -738,7 +738,7 @@ def test_check_agent_name_batch_api_error(mocker, mock_auth_header):
738738
mock_impl.side_effect = Exception("unexpected")
739739

740740
resp = config_client.post(
741-
"/agent/check_name/batch",
741+
"/agent/check_name",
742742
json={"items": [{"agent_id": 1, "name": "AgentA"}]},
743743
headers=mock_auth_header,
744744
)
@@ -766,7 +766,7 @@ def test_regenerate_agent_name_batch_api_success(mocker, mock_auth_header):
766766
}
767767

768768
resp = config_client.post(
769-
"/agent/regenerate_name/batch", json=payload, headers=mock_auth_header
769+
"/agent/regenerate_name", json=payload, headers=mock_auth_header
770770
)
771771

772772
assert resp.status_code == 200
@@ -782,7 +782,7 @@ def test_regenerate_agent_name_batch_api_bad_request(mocker, mock_auth_header):
782782
mock_impl.side_effect = ValueError("invalid")
783783

784784
resp = config_client.post(
785-
"/agent/regenerate_name/batch",
785+
"/agent/regenerate_name",
786786
json={"items": [{"agent_id": 1, "name": "AgentA"}]},
787787
headers=mock_auth_header,
788788
)
@@ -799,7 +799,7 @@ def test_regenerate_agent_name_batch_api_error(mocker, mock_auth_header):
799799
mock_impl.side_effect = Exception("boom")
800800

801801
resp = config_client.post(
802-
"/agent/regenerate_name/batch",
802+
"/agent/regenerate_name",
803803
json={"items": [{"agent_id": 1, "name": "AgentA"}]},
804804
headers=mock_auth_header,
805805
)

0 commit comments

Comments
 (0)