feat: 累积功能变更 — 聊天集成、租户管理、小程序更新、ETL 增强、迁移脚本
包含多个会话的累积代码变更: - backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔 - admin-web: ETL 状态页、任务管理、调度配置、登录优化 - miniprogram: 看板页面、聊天集成、UI 组件、导航更新 - etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强 - tenant-admin: 项目初始化 - db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8) - packages/shared: 枚举和工具函数更新 - tools: 数据库工具、报表生成、健康检查 - docs: PRD/架构/部署/合约文档更新 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
68
apps/backend/app/ai/config.py
Normal file
68
apps/backend/app/ai/config.py
Normal file
@@ -0,0 +1,68 @@
|
||||
"""AI 模块配置 — 从环境变量加载 DashScope 相关参数。
|
||||
|
||||
所有 DASHSCOPE_* 环境变量和 INTERNAL_API_TOKEN 统一在此管理,
|
||||
启动时通过 from_env() 校验必需变量,缺失立即报错。
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
from dataclasses import dataclass
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class AIConfig:
|
||||
"""AI 模块配置,从环境变量加载。不可变(frozen)。"""
|
||||
|
||||
api_key: str # DASHSCOPE_API_KEY
|
||||
workspace_id: str | None # DASHSCOPE_WORKSPACE_ID(可选)
|
||||
app_id_1_chat: str # DASHSCOPE_APP_ID_1_CHAT
|
||||
app_id_2_finance: str # DASHSCOPE_APP_ID_2_FINANCE
|
||||
app_id_3_clue: str # DASHSCOPE_APP_ID_3_CLUE
|
||||
app_id_4_analysis: str # DASHSCOPE_APP_ID_4_ANALYSIS
|
||||
app_id_5_tactics: str # DASHSCOPE_APP_ID_5_TACTICS
|
||||
app_id_6_note: str # DASHSCOPE_APP_ID_6_NOTE
|
||||
app_id_7_customer: str # DASHSCOPE_APP_ID_7_CUSTOMER
|
||||
app_id_8_consolidate: str # DASHSCOPE_APP_ID_8_CONSOLIDATE
|
||||
internal_api_token: str # INTERNAL_API_TOKEN
|
||||
|
||||
@classmethod
|
||||
def from_env(cls) -> AIConfig:
|
||||
"""从环境变量加载配置。
|
||||
|
||||
必需变量缺失时立即抛出 ValueError,禁止静默回退空字符串。
|
||||
可选变量(DASHSCOPE_WORKSPACE_ID)缺失时为 None。
|
||||
"""
|
||||
required_mapping: dict[str, str] = {
|
||||
"DASHSCOPE_API_KEY": "api_key",
|
||||
"DASHSCOPE_APP_ID_1_CHAT": "app_id_1_chat",
|
||||
"DASHSCOPE_APP_ID_2_FINANCE": "app_id_2_finance",
|
||||
"DASHSCOPE_APP_ID_3_CLUE": "app_id_3_clue",
|
||||
"DASHSCOPE_APP_ID_4_ANALYSIS": "app_id_4_analysis",
|
||||
"DASHSCOPE_APP_ID_5_TACTICS": "app_id_5_tactics",
|
||||
"DASHSCOPE_APP_ID_6_NOTE": "app_id_6_note",
|
||||
"DASHSCOPE_APP_ID_7_CUSTOMER": "app_id_7_customer",
|
||||
"DASHSCOPE_APP_ID_8_CONSOLIDATE": "app_id_8_consolidate",
|
||||
"INTERNAL_API_TOKEN": "internal_api_token",
|
||||
}
|
||||
|
||||
# 收集所有缺失的必需变量,一次性报错
|
||||
missing: list[str] = []
|
||||
values: dict[str, str] = {}
|
||||
|
||||
for env_name, field_name in required_mapping.items():
|
||||
val = os.environ.get(env_name)
|
||||
if not val: # None 或空字符串均视为缺失
|
||||
missing.append(env_name)
|
||||
else:
|
||||
values[field_name] = val
|
||||
|
||||
if missing:
|
||||
raise ValueError(
|
||||
f"AI 配置缺失必需环境变量: {', '.join(missing)}"
|
||||
)
|
||||
|
||||
# 可选变量
|
||||
workspace_id = os.environ.get("DASHSCOPE_WORKSPACE_ID") or None
|
||||
|
||||
return cls(workspace_id=workspace_id, **values)
|
||||
Reference in New Issue
Block a user