fix(agent): include core settings in AI agent group (#6272)

This commit is contained in:
InfinityPacer
2026-08-12 00:13:53 +08:00
committed by GitHub
parent 3f1b0cdb05
commit b018646f61
3 changed files with 85 additions and 6 deletions

View File

@@ -226,13 +226,36 @@ GROUP_ALIASES = {
}
# 这些前缀共同组成可启动、推理和扩展 AI Agent 的同一业务配置域。
AI_AGENT_CORE_SETTING_PREFIXES = (
"AI_AGENT_",
"LLM_",
"AUDIO_INPUT_",
"AUDIO_OUTPUT_",
"AI_RECOMMEND_",
)
def _normalize_token(value: str) -> str:
return str(value).strip().lower().replace("-", "_")
def _resolve_core_setting_group(key: str) -> str:
"""根据基础设置的业务归属返回 Agent 可查询的分类。"""
if key.startswith(AI_AGENT_CORE_SETTING_PREFIXES):
return "ai_agent"
return "settings"
def _build_specs() -> tuple[dict[str, SettingSpec], dict[str, SettingSpec]]:
core_specs = {
key: SettingSpec(key=key, source="settings", group="settings", label=key)
key: SettingSpec(
key=key,
source="settings",
group=_resolve_core_setting_group(key),
label=key,
)
for key in Settings.model_fields.keys()
}
system_specs = {}
@@ -263,7 +286,7 @@ SINGLE_KEY_GROUP_ALIASES = {
_normalize_token(alias): next(
(
spec.key
for spec in SYSTEMCONFIG_SETTING_SPECS.values()
for spec in ALL_SETTING_SPECS.values()
if spec.group == canonical_group
),
None,
@@ -273,7 +296,7 @@ SINGLE_KEY_GROUP_ALIASES = {
and len(
[
spec.key
for spec in SYSTEMCONFIG_SETTING_SPECS.values()
for spec in ALL_SETTING_SPECS.values()
if spec.group == canonical_group
]
)
@@ -324,7 +347,7 @@ def list_setting_specs(
else:
specs = [
spec
for spec in SYSTEMCONFIG_SETTING_SPECS.values()
for spec in ALL_SETTING_SPECS.values()
if spec.group == normalized_group
]

View File

@@ -28,7 +28,7 @@ class QuerySystemSettingsInput(BaseModel):
description=(
"Exact setting key to query. Supports Settings field names like 'APP_DOMAIN' or 'TMDB_API_KEY', "
"SystemConfigKey values like 'Downloaders' or 'MediaServers', enum names, and some single-key aliases "
"such as 'downloaders', 'directories', 'search_sites', 'subscribe_sites', 'site_auth', 'ai_agent', "
"such as 'downloaders', 'directories', 'search_sites', 'subscribe_sites', 'site_auth', "
"and 'custom_identifiers'."
),
)

View File

@@ -3,10 +3,11 @@ import json
import unittest
from unittest.mock import AsyncMock, MagicMock, patch
from app.agent.tools.impl._system_setting_utils import list_setting_specs
from app.agent.tools.impl.query_system_settings import QuerySystemSettingsTool
from app.agent.tools.impl.update_system_settings import UpdateSystemSettingsTool
from app.agent.tools.manager import MoviePilotToolsManager
from app.core.config import settings
from app.core.config import Settings, settings
from app.schemas.types import SystemConfigKey
@@ -97,6 +98,61 @@ class TestAgentSystemSettingsTools(unittest.TestCase):
self.assertFalse(payload["include_values"])
self.assertGreater(payload["matched_count"], 1)
def test_settings_group_retains_all_basic_settings(self):
"""settings 分组应继续完整列出基础 Settings 字段。"""
specs = list_setting_specs(group="settings")
self.assertSetEqual(
{spec.key for spec in specs},
set(Settings.model_fields),
)
self.assertTrue(all(spec.source == "settings" for spec in specs))
def test_query_system_settings_ai_agent_group_spans_both_setting_sources(self):
"""AI Agent 分组应同时返回基础运行配置和 SystemConfig 扩展配置。"""
tool = QuerySystemSettingsTool(session_id="session-1", user_id="10001")
expected_values = {
"AI_AGENT_ENABLE": True,
"LLM_PROVIDER": "openai",
"LLM_MODEL": "gpt-test",
"LLM_THINKING_LEVEL": "high",
"LLM_API_KEY": "llm-secret",
"AUDIO_INPUT_PROVIDER": "openai",
"AUDIO_OUTPUT_PROVIDER": "openai",
"AI_RECOMMEND_ENABLED": True,
"AIAgentConfig": {"chatgpt": {"enabled": True}},
"AIAgentMcpServers": [],
}
with patch.object(
QuerySystemSettingsTool,
"_load_setting_value",
side_effect=lambda spec: expected_values.get(spec.key),
):
result = asyncio.run(
tool.run(group="ai_agent", include_values=True)
)
payload = json.loads(result)
items = {
item["setting_key"]: item
for item in payload["settings"]
}
self.assertTrue(payload["success"])
self.assertEqual(items["AI_AGENT_ENABLE"]["source"], "settings")
self.assertIs(items["AI_AGENT_ENABLE"]["value"], True)
self.assertEqual(items["LLM_PROVIDER"]["value"], "openai")
self.assertEqual(items["LLM_MODEL"]["value"], "gpt-test")
self.assertEqual(items["LLM_THINKING_LEVEL"]["value"], "high")
self.assertTrue(items["LLM_API_KEY"]["redacted"])
self.assertEqual(items["LLM_API_KEY"]["value"], "***")
self.assertEqual(items["AUDIO_INPUT_PROVIDER"]["value"], "openai")
self.assertEqual(items["AUDIO_OUTPUT_PROVIDER"]["value"], "openai")
self.assertIs(items["AI_RECOMMEND_ENABLED"]["value"], True)
self.assertEqual(items["AIAgentConfig"]["source"], "systemconfig")
self.assertEqual(items["AIAgentMcpServers"]["source"], "systemconfig")
def test_update_system_settings_merges_dict_and_emits_event(self):
tool = UpdateSystemSettingsTool(session_id="session-1", user_id="10001")
config_oper = MagicMock()