feat: restore core chat and observability

This commit is contained in:
2026-06-22 02:24:10 +08:00
parent 524c027a4a
commit 705cfe47e8
43 changed files with 12301 additions and 11 deletions
+151 -1
View File
@@ -17,7 +17,7 @@ from core.menu.schema import MenuCreate, MenuUpdate
menu_cache = CacheManager(prefix="menu:")
# 缓存key
AI_AGENT_ADMIN_MENU_CACHE_VERSION = "v19"
AI_AGENT_ADMIN_MENU_CACHE_VERSION = "v20"
MENU_TREE_CACHE_KEY = f"tree:ai_agent_admin:{AI_AGENT_ADMIN_MENU_CACHE_VERSION}"
USER_ROUTE_CACHE_PREFIX = f"user_route:ai_agent_admin:{AI_AGENT_ADMIN_MENU_CACHE_VERSION}:"
@@ -32,7 +32,12 @@ AI_AGENT_ADMIN_MENU_NAMES = {
"AIWorkflowRuns",
"CodexAgentChat",
"KnowledgeBase",
"StartChat",
"SystemManagement",
"SystemMonitoring",
"ServerMonitor",
"RedisMonitor",
"DatabaseMonitor",
"SystemPermission",
"UserManagement",
"SystemDept",
@@ -63,7 +68,12 @@ AI_AGENT_ADMIN_VISIBLE_MENU_NAMES = {
"AIWorkflowRuns",
"CodexAgentChat",
"KnowledgeBase",
"StartChat",
"SystemManagement",
"SystemMonitoring",
"ServerMonitor",
"RedisMonitor",
"DatabaseMonitor",
"SystemPermission",
"UserManagement",
"SystemDept",
@@ -115,7 +125,43 @@ AI_AGENT_ADMIN_MESSAGE_CHILD_MENU_NAMES = {
"MessageList",
}
AI_AGENT_ADMIN_MONITOR_CHILD_MENU_NAMES = {
"DatabaseMonitor",
"RedisMonitor",
"ServerMonitor",
}
AI_AGENT_ADMIN_MENU_OVERRIDES = {
"StartChat": {
"component": "/_core/chat/index",
"hideInMenu": False,
"noBasicLayout": True,
"path": "/chat",
"title": "menu-title.startChat",
},
"SystemMonitoring": {
"hideInMenu": False,
"path": "/monitor",
"title": "menu-title.systemMonitoring",
},
"ServerMonitor": {
"component": "/_core/server-monitor/index",
"hideInMenu": False,
"path": "/monitor/server",
"title": "menu-title.serverMonitoring",
},
"RedisMonitor": {
"component": "/_core/redis-monitor/index",
"hideInMenu": False,
"path": "/monitor/redis",
"title": "menu-title.redisMonitoring",
},
"DatabaseMonitor": {
"component": "/_core/database-monitor/index",
"hideInMenu": False,
"path": "/monitor/database",
"title": "menu-title.databaseMonitoring",
},
"SystemConfigManager": {
"component": "/_core/system-config/index",
"path": "/system-config",
@@ -145,10 +191,107 @@ AI_AGENT_ADMIN_MENU_OVERRIDES = {
},
}
AI_AGENT_ADMIN_SYNTHETIC_MENUS = [
{
"id": "aiadm-chat",
"name": "StartChat",
"title": "menu-title.startChat",
"path": "/chat",
"type": "menu",
"component": "/_core/chat/index",
"icon": "lucide:align-center-vertical",
"order": 20,
"noBasicLayout": True,
},
{
"id": "aiadm-monitor",
"name": "SystemMonitoring",
"title": "menu-title.systemMonitoring",
"path": "/monitor",
"type": "catalog",
"component": None,
"icon": "lucide:activity",
"order": 80,
},
{
"id": "aiadm-server",
"name": "ServerMonitor",
"title": "menu-title.serverMonitoring",
"path": "/monitor/server",
"type": "menu",
"component": "/_core/server-monitor/index",
"icon": "carbon:bare-metal-server",
"order": 10,
},
{
"id": "aiadm-redis",
"name": "RedisMonitor",
"title": "menu-title.redisMonitoring",
"path": "/monitor/redis",
"type": "menu",
"component": "/_core/redis-monitor/index",
"icon": "logos:redis",
"order": 20,
},
{
"id": "aiadm-dbmon",
"name": "DatabaseMonitor",
"title": "menu-title.databaseMonitoring",
"path": "/monitor/database",
"type": "menu",
"component": "/_core/database-monitor/index",
"icon": "carbon:db2-database",
"order": 30,
},
]
def _make_ai_agent_admin_menu(spec: Dict[str, Any]) -> Menu:
menu = Menu()
menu.id = spec["id"]
menu.application_id = None
menu.is_system = False
menu.parent_id = None
menu.name = spec["name"]
menu.title = spec["title"]
menu.authCode = None
menu.path = spec["path"]
menu.type = spec["type"]
menu.component = spec.get("component")
menu.redirect = None
menu.activePath = None
menu.query = None
menu.noBasicLayout = bool(spec.get("noBasicLayout", False))
menu.icon = spec.get("icon")
menu.activeIcon = None
menu.order = spec["order"]
menu.hideInMenu = False
menu.hideChildrenInMenu = False
menu.hideInBreadcrumb = False
menu.hideInTab = False
menu.affixTab = False
menu.affixTabOrder = None
menu.keepAlive = False
menu.maxNumOfOpenTab = None
menu.fullPathKey = True
menu.link = None
menu.iframeSrc = None
menu.openInNewWindow = False
menu.badge = None
menu.badgeType = None
menu.badgeVariants = None
return menu
def _filter_ai_agent_admin_menus(menus: List[Menu]) -> List[Menu]:
"""Keep only the lightweight admin and AI modules for this product."""
filtered = [menu for menu in menus if menu.name in AI_AGENT_ADMIN_MENU_NAMES]
existing_names = {menu.name for menu in filtered}
filtered.extend(
_make_ai_agent_admin_menu(spec)
for spec in AI_AGENT_ADMIN_SYNTHETIC_MENUS
if spec["name"] not in existing_names
)
for menu in filtered:
_normalize_ai_agent_admin_menu(menu)
_normalize_ai_agent_admin_parentage(filtered)
@@ -184,6 +327,10 @@ def _normalize_ai_agent_admin_parentage(menus: List[Menu]) -> None:
(menu for menu in menus if menu.name == "Message"),
None,
)
monitor_menu = next(
(menu for menu in menus if menu.name == "SystemMonitoring"),
None,
)
for menu in menus:
if system_menu and menu.name in AI_AGENT_ADMIN_SYSTEM_CHILD_MENU_NAMES:
menu.parent_id = system_menu.id
@@ -194,6 +341,9 @@ def _normalize_ai_agent_admin_parentage(menus: List[Menu]) -> None:
if message_menu and menu.name in AI_AGENT_ADMIN_MESSAGE_CHILD_MENU_NAMES:
menu.parent_id = message_menu.id
continue
if monitor_menu and menu.name in AI_AGENT_ADMIN_MONITOR_CHILD_MENU_NAMES:
menu.parent_id = monitor_menu.id
continue
if not menu.parent_id or menu.parent_id in retained_ids:
continue
menu.parent_id = None
+10
View File
@@ -7,8 +7,11 @@ from core.application.api import router as application_router
from core.api_token.api import router as api_token_router
from core.auth.api import router as auth_router
from core.chat.api import router as chat_router
from core.database_monitor.api import router as database_monitor_router
from core.dept.api import router as dept_router
from core.device.api import router as device_router
from core.dict.api import router as dict_router
from core.dict_item.api import router as dict_item_router
from core.file_manager.router import router as file_manager_router
from core.login_log.api import router as login_log_router
from core.menu.api import router as menu_router
@@ -18,10 +21,12 @@ from core.oauth.api import router as oauth_router
from core.page_manager.api import router as page_manager_router
from core.permission.api import router as permission_router
from core.post.api import router as post_router
from core.redis_monitor.api import router as redis_monitor_router
from core.resource_scope.field_permission.api import router as field_permission_router
from core.resource_scope.scope_permission.api import router as resource_scope_router
from core.role.api import router as role_router
from core.server_monitor.api import router as server_monitor_router
from core.system_config.api import router as system_config_router
from core.ui_config.api import router as ui_config_router
from core.user.api import router as user_router
@@ -31,11 +36,15 @@ router = APIRouter()
router.include_router(application_router)
router.include_router(auth_router)
router.include_router(chat_router)
router.include_router(database_monitor_router)
router.include_router(dept_router)
router.include_router(device_router)
router.include_router(dict_router)
router.include_router(dict_item_router)
router.include_router(menu_router)
router.include_router(permission_router)
router.include_router(post_router)
router.include_router(redis_monitor_router)
router.include_router(resource_scope_router)
router.include_router(field_permission_router)
router.include_router(role_router)
@@ -47,5 +56,6 @@ router.include_router(announcement_router)
router.include_router(oauth_router)
router.include_router(page_manager_router)
router.include_router(server_monitor_router)
router.include_router(system_config_router)
router.include_router(ui_config_router)
router.include_router(api_token_router)