1. apps/backend/app/ai/prompts/app2a_finance_area_prompt.py (新建):
- payload: 业态说明 + 区域占比 + 对比口径 + 核心 KPI + 优惠构成
+ 助教成本 + 区域级单位经济 + 按星期聚合 + 日粒度异常 + 行业基线
- 5 个区域级辅助函数:_fetch_area_daily_series / _build_area_unit_economics
/ _aggregate_by_weekday_area / _detect_anomaly_days_area / _fetch_area_share
- AREA_INDUSTRY_TRAITS 字典(7 业态 trait + peer 描述)
- 复用 app2_finance_prompt 的 _build_coach_kpi / _build_discount_kpi 等公共函数
2. config.py: AIConfig 增加 app_id_2a_finance_area + DASHSCOPE_APP_ID_2A_FINANCE_AREA
3. schemas.py: CacheTypeEnum 增加 APP2A_FINANCE_AREA
4. dispatcher.py:
- APP2A_AREA_OPTIONS 常量(8 业态 · area != 'all')
- _handle_dws_completed 72 循环拆分:
area='all' 走 app2_finance · 其他 8 业态走 app2a_finance_area
- run_single_app 新增 elif 'app2a_finance_area' 分支(拒绝 area='all')
5. admin_ai.py: _SUPPORTED_APP_TYPES 加 'app2a_finance_area'
6. prompts/__init__.py: 导出 build_app2a_area_prompt
7. .env: 追加 DASHSCOPE_APP_ID_2A_FINANCE_AREA 百炼 APP ID
实测:7 项集成单测全通过(config/cache_type/router/prompts/dispatcher 常量/
4 业态 prompt 构建/拒绝 area=all)· 端到端实调 vip 组合返回 12 条高质量洞察
严格遵守 v1.2 system prompt 全部 7 项硬约束(H1-H7)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
71 lines
2.9 KiB
Python
71 lines
2.9 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_2a_finance_area: str # DASHSCOPE_APP_ID_2A_FINANCE_AREA(2026-04-23 新增,区域财务洞察)
|
||
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_2A_FINANCE_AREA": "app_id_2a_finance_area",
|
||
"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)
|