包含多个会话的累积代码变更: - 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>
69 lines
2.7 KiB
Python
69 lines
2.7 KiB
Python
"""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)
|