Build lightweight AI agent admin

This commit is contained in:
Codex
2026-06-08 18:14:59 +08:00
commit e164840f43
2530 changed files with 435693 additions and 0 deletions
+162
View File
@@ -0,0 +1,162 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
UI Config Service - UI配置服务层
"""
import json
from typing import Optional, List, Dict, Any
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.base_service import BaseService
from core.ui_config.model import UIConfig
from core.ui_config.schema import UIConfigCreate, UIConfigUpdate
class UIConfigService(BaseService[UIConfig, UIConfigCreate, UIConfigUpdate]):
"""
UI配置服务层
继承BaseService,自动获得增删改查功能
"""
model = UIConfig
@classmethod
async def get_by_key(
cls,
db: AsyncSession,
config_key: str,
application_id: Optional[str] = None
) -> Optional[UIConfig]:
"""
根据配置键获取配置
:param db: 数据库会话
:param config_key: 配置键
:param application_id: 应用IDNone表示主应用配置
"""
query = select(UIConfig).where(
UIConfig.config_key == config_key,
UIConfig.is_deleted == False # noqa: E712
)
if application_id:
query = query.where(UIConfig.application_id == application_id)
else:
query = query.where(UIConfig.application_id.is_(None))
result = await db.execute(query)
return result.scalar_one_or_none()
@classmethod
async def get_by_type(cls, db: AsyncSession, config_type: str) -> List[UIConfig]:
"""根据配置类型获取配置列表"""
result = await db.execute(
select(UIConfig).where(
UIConfig.config_type == config_type,
UIConfig.status == True, # noqa: E712
UIConfig.is_deleted == False # noqa: E712
).order_by(UIConfig.sort)
)
return list(result.scalars().all())
@classmethod
async def get_all_active(cls, db: AsyncSession) -> List[UIConfig]:
"""获取所有启用的配置"""
result = await db.execute(
select(UIConfig).where(
UIConfig.status == True, # noqa: E712
UIConfig.is_deleted == False # noqa: E712
).order_by(UIConfig.sort)
)
return list(result.scalars().all())
@classmethod
async def get_preferences_config(
cls,
db: AsyncSession,
application_id: Optional[str] = None
) -> Optional[Dict[str, Any]]:
"""
获取前端偏好配置
返回格式与前端 Preferences 类型一致
:param db: 数据库会话
:param application_id: 应用IDNone表示主应用配置
"""
config = await cls.get_by_key(db, "frontend_preferences", application_id)
if config and config.config_value and config.status:
try:
return json.loads(config.config_value)
except json.JSONDecodeError:
return None
# 如果子应用没有配置,回退到主应用配置
if application_id:
return await cls.get_preferences_config(db, None)
return None
@classmethod
async def update_preferences_config(
cls,
db: AsyncSession,
preferences: Dict[str, Any],
application_id: Optional[str] = None
) -> UIConfig:
"""
更新前端偏好配置
如果不存在则创建
:param db: 数据库会话
:param preferences: 偏好配置
:param application_id: 应用IDNone表示主应用配置
"""
config = await cls.get_by_key(db, "frontend_preferences", application_id)
config_value = json.dumps(preferences, ensure_ascii=False)
if config:
config.config_value = config_value
await db.commit()
await db.refresh(config)
return config
else:
new_config = UIConfig(
application_id=application_id,
config_key="frontend_preferences",
config_value=config_value,
config_type="preferences",
description="前端UI偏好配置" if not application_id else f"子应用UI偏好配置",
status=True
)
db.add(new_config)
await db.commit()
await db.refresh(new_config)
return new_config
@classmethod
async def update_value_by_key(
cls,
db: AsyncSession,
config_key: str,
config_value: str
) -> Optional[UIConfig]:
"""根据配置键更新配置值"""
config = await cls.get_by_key(db, config_key)
if config:
config.config_value = config_value
await db.commit()
await db.refresh(config)
return config
return None
@classmethod
async def get_config_value(cls, db: AsyncSession, config_key: str) -> Optional[Any]:
"""获取配置值(解析JSON"""
config = await cls.get_by_key(db, config_key)
if config and config.config_value:
try:
return json.loads(config.config_value)
except json.JSONDecodeError:
return config.config_value
return None