ForcePilot/backend/package/yuxi/channels/adapters/yuanbao/yb_accounts.py
Kris 1f78c44b03 refactor: 整理并清理项目中的冗余代码与格式问题
这是一个批量整理提交,包含以下主要改动:
1.  删除多处冗余的空行和未使用的导入
2.  修复文件末尾缺少换行符的问题
3.  调整部分模块的导入顺序与代码排版
4.  修复部分配置默认值与策略逻辑
5.  新增多个功能模块与辅助工具
6.  完善异常处理与日志记录
7.  修复速率限制、消息缓存、权限校验等逻辑bug
8.  废弃部分旧有API与配置项并添加警告提示
2026-05-12 14:51:53 +08:00

138 lines
4.7 KiB
Python

from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any
from yuxi.utils.logging_config import logger
@dataclass
class YuanbaoAccount:
account_id: str
app_key: str
app_secret: str
name: str = ""
enabled: bool = True
bot_app_id: str | None = None
token: str | None = None
api_domain: str = ""
ws_url: str = ""
log_upload_api_url: str = ""
route_env: str = ""
token_manager: Any = field(default=None, init=False)
monitor: Any = field(default=None, init=False)
@property
def display_name(self) -> str:
return self.name or self.account_id
@dataclass
class YuanbaoAccountManager:
accounts: dict[str, YuanbaoAccount] = field(default_factory=dict)
default_account_id: str = ""
def add_account(
self,
account_id: str,
app_key: str,
app_secret: str,
name: str = "",
enabled: bool = True,
bot_app_id: str | None = None,
token: str | None = None,
api_domain: str = "",
ws_url: str = "",
log_upload_api_url: str = "",
route_env: str = "",
) -> YuanbaoAccount:
account = YuanbaoAccount(
account_id=account_id,
app_key=app_key,
app_secret=app_secret,
name=name,
enabled=enabled,
bot_app_id=bot_app_id or account_id,
token=token,
api_domain=api_domain,
ws_url=ws_url,
log_upload_api_url=log_upload_api_url,
route_env=route_env,
)
self.accounts[account_id] = account
if not self.default_account_id:
self.default_account_id = account_id
return account
def get_account(self, account_id: str | None = None) -> YuanbaoAccount | None:
target = account_id or self.default_account_id
account = self.accounts.get(target)
if account and account.enabled:
return account
return None
def get_default_account(self) -> YuanbaoAccount | None:
return self.get_account(self.default_account_id)
def remove_account(self, account_id: str) -> None:
self.accounts.pop(account_id, None)
if self.default_account_id == account_id:
remaining = [a for a in self.accounts if self.accounts[a].enabled]
if remaining:
self.default_account_id = remaining[0]
else:
self.default_account_id = ""
logger.warning("[Yuanbao] All accounts removed, no default account available")
@property
def enabled_accounts(self) -> list[YuanbaoAccount]:
return [a for a in self.accounts.values() if a.enabled]
@property
def account_count(self) -> int:
return len(self.enabled_accounts)
def load_accounts_from_config(config: dict[str, Any]) -> YuanbaoAccountManager:
manager = YuanbaoAccountManager()
accounts_config = config.get("accounts", {})
default_account = config.get("defaultAccount", "")
if accounts_config:
for acc_id, acc_cfg in accounts_config.items():
if isinstance(acc_cfg, dict):
manager.add_account(
account_id=acc_id,
app_key=acc_cfg.get("appKey", acc_cfg.get("app_key", "")),
app_secret=acc_cfg.get("appSecret", acc_cfg.get("app_secret", "")),
name=acc_cfg.get("name", acc_id),
enabled=acc_cfg.get("enabled", True),
bot_app_id=acc_cfg.get("botAppId", acc_cfg.get("bot_app_id")),
token=acc_cfg.get("token"),
api_domain=acc_cfg.get("apiDomain", acc_cfg.get("api_domain", "")),
ws_url=acc_cfg.get("wsUrl", acc_cfg.get("ws_url", "")),
log_upload_api_url=acc_cfg.get("logUploadApiUrl", acc_cfg.get("log_upload_api_url", "")),
route_env=acc_cfg.get("routeEnv", acc_cfg.get("route_env", "")),
)
if default_account and default_account in manager.accounts:
manager.default_account_id = default_account
elif manager.enabled_accounts:
manager.default_account_id = manager.enabled_accounts[0].account_id
else:
manager.add_account(
account_id=config.get("bot_app_id", "default"),
app_key=config.get("app_key", ""),
app_secret=config.get("app_secret", ""),
name=config.get("account_name", "元宝"),
enabled=True,
bot_app_id=config.get("bot_app_id"),
)
manager.default_account_id = config.get("bot_app_id", "default")
logger.info(f"[Yuanbao] Loaded {manager.account_count} account(s), default={manager.default_account_id}")
return manager