feat: 企业微信机器人集成到后端服务,网页端可配置和重启
- BotManager: 后端启动时自动检测配置并拉起机器人(后台线程) - WeComBotService: 新增 start_async() 异步模式,支持嵌入事件循环 - settings API: 增加 bot 配置字段(enabled/bot_id/secret) - settings API: 增加 bot/status 和 bot/restart 端点 - 前端设置页: 增加企业微信机器人配置卡片(启用开关/ID/Secret) - 前端设置页: 增加机器人状态徽章和重启按钮 - Secret 脱敏显示,仅展示前4位
This commit is contained in:
@@ -12,6 +12,15 @@ from app.config import settings
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
def _mask_secret(value: str | None, visible: int = 4) -> str | None:
|
||||
"""对敏感字符串脱敏,保留前 visible 个字符"""
|
||||
if not value:
|
||||
return None
|
||||
if len(value) <= visible:
|
||||
return "****"
|
||||
return value[:visible] + "****"
|
||||
|
||||
|
||||
class SettingsResponse(BaseModel):
|
||||
"""设置响应(隐藏敏感信息的中间位)"""
|
||||
embedding_provider: str
|
||||
@@ -37,6 +46,10 @@ class SettingsResponse(BaseModel):
|
||||
has_dashscope_key: bool
|
||||
has_aliyun_ocr: bool
|
||||
has_tencent_ocr: bool
|
||||
# 企业微信机器人
|
||||
wework_bot_enabled: bool
|
||||
wework_bot_id: str | None
|
||||
wework_bot_secret_masked: str | None
|
||||
|
||||
|
||||
@router.get("", response_model=SettingsResponse, summary="获取当前设置")
|
||||
@@ -65,6 +78,9 @@ async def get_settings():
|
||||
has_dashscope_key=bool(settings.DASHSCOPE_API_KEY),
|
||||
has_aliyun_ocr=bool(settings.ALIYUN_OCR_ACCESS_KEY),
|
||||
has_tencent_ocr=bool(settings.TENCENT_OCR_SECRET_ID),
|
||||
wework_bot_enabled=settings.WEWORK_BOT_ENABLED,
|
||||
wework_bot_id=settings.WEWORK_BOT_ID,
|
||||
wework_bot_secret_masked=_mask_secret(settings.WEWORK_BOT_SECRET),
|
||||
)
|
||||
|
||||
|
||||
@@ -94,6 +110,10 @@ class SettingsUpdate(BaseModel):
|
||||
chunk_overlap: int | None = None
|
||||
search_limit: int | None = None
|
||||
judge_batch_size: int | None = None
|
||||
# 企业微信机器人
|
||||
wework_bot_enabled: bool | None = None
|
||||
wework_bot_id: str | None = None
|
||||
wework_bot_secret: str | None = None
|
||||
|
||||
|
||||
@router.put("", summary="更新设置")
|
||||
@@ -139,6 +159,9 @@ async def update_settings(data: SettingsUpdate):
|
||||
"chunk_overlap": "CHUNK_OVERLAP",
|
||||
"search_limit": "SEARCH_LIMIT",
|
||||
"judge_batch_size": "JUDGE_BATCH_SIZE",
|
||||
"wework_bot_enabled": "WEWORK_BOT_ENABLED",
|
||||
"wework_bot_id": "WEWORK_BOT_ID",
|
||||
"wework_bot_secret": "WEWORK_BOT_SECRET",
|
||||
}
|
||||
|
||||
for api_field, config_field in field_map.items():
|
||||
@@ -221,3 +244,18 @@ async def test_ocr():
|
||||
return {"success": True, "message": f"OCR 提供商 {provider.name} 已就绪"}
|
||||
except Exception as e:
|
||||
return {"success": False, "message": f"OCR 测试失败: {str(e)}"}
|
||||
|
||||
|
||||
@router.post("/bot/restart", summary="重启企业微信机器人")
|
||||
async def restart_bot():
|
||||
"""重启企业微信机器人服务"""
|
||||
from app.main import bot_manager
|
||||
result = await bot_manager.restart()
|
||||
return result
|
||||
|
||||
|
||||
@router.get("/bot/status", summary="获取企业微信机器人状态")
|
||||
async def get_bot_status():
|
||||
"""获取企业微信机器人运行状态"""
|
||||
from app.main import bot_manager
|
||||
return bot_manager.get_status()
|
||||
|
||||
Reference in New Issue
Block a user