From 005871d71dc8fbad316dd4795d95067fefbc488a Mon Sep 17 00:00:00 2001 From: Yufeng He <40085740+he-yufeng@users.noreply.github.com> Date: Tue, 23 Jun 2026 04:07:52 +0800 Subject: [PATCH] fix: skip empty tool entries in agent_chat config validation Signed-off-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com> --- .../app/apps/agent_chat/app_config_manager.py | 5 +++++ .../test_agent_chat_app_config_manager.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/api/core/app/apps/agent_chat/app_config_manager.py b/api/core/app/apps/agent_chat/app_config_manager.py index e269b98bad9..b55321ed82d 100644 --- a/api/core/app/apps/agent_chat/app_config_manager.py +++ b/api/core/app/apps/agent_chat/app_config_manager.py @@ -200,6 +200,11 @@ class AgentChatAppConfigManager(BaseAppConfigManager): raise ValueError("tools in agent_mode must be a list of objects") for tool in agent_mode["tools"]: + if not tool: + # Skip malformed empty tool entries; list(tool.keys())[0] + # would otherwise raise IndexError (same guard as the sibling + # dataset/manager.py and variables/manager.py). + continue key = list(tool.keys())[0] if key in OLD_TOOLS: # old style, use tool name as key diff --git a/api/tests/unit_tests/core/app/apps/agent_chat/test_agent_chat_app_config_manager.py b/api/tests/unit_tests/core/app/apps/agent_chat/test_agent_chat_app_config_manager.py index d47b70e9502..48d723b7501 100644 --- a/api/tests/unit_tests/core/app/apps/agent_chat/test_agent_chat_app_config_manager.py +++ b/api/tests/unit_tests/core/app/apps/agent_chat/test_agent_chat_app_config_manager.py @@ -301,3 +301,18 @@ class TestValidateAgentModeAndSetDefaults: updated, _ = AgentChatAppConfigManager.validate_agent_mode_and_set_defaults("tenant", config) assert updated["agent_mode"]["tools"][0]["dataset"]["enabled"] is False assert updated["agent_mode"]["tools"][1]["enabled"] is False + + def test_empty_tool_entry_is_skipped(self): + # A malformed empty `{}` tool entry must be skipped, not crash with + # IndexError on list(tool.keys())[0] — same guard as the sibling + # dataset/manager.py (#37669) and variables/manager.py (#37671). + config = { + "agent_mode": { + "enabled": True, + "strategy": PlanningStrategy.ROUTER.value, + "tools": [{}], + } + } + updated, keys = AgentChatAppConfigManager.validate_agent_mode_and_set_defaults("tenant", config) + assert keys == ["agent_mode"] + assert updated["agent_mode"]["tools"] == [{}]