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>
159 lines
3.1 KiB
Python
159 lines
3.1 KiB
Python
"""AI 集成层 Pydantic 模型定义。
|
||
|
||
覆盖请求/响应体、缓存类型枚举、线索模型、各应用结果模型。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import enum
|
||
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
# ── 请求/响应 ──
|
||
|
||
|
||
class ChatStreamRequest(BaseModel):
|
||
"""SSE 流式对话请求体"""
|
||
|
||
message: str
|
||
source_page: str | None = None
|
||
page_context: dict | None = None
|
||
screen_content: str | None = None
|
||
|
||
|
||
class SSEEvent(BaseModel):
|
||
"""SSE 事件"""
|
||
|
||
type: str # chunk / done / error
|
||
content: str | None = None
|
||
conversation_id: int | None = None
|
||
tokens_used: int | None = None
|
||
message: str | None = None
|
||
|
||
|
||
# ── 缓存类型枚举 ──
|
||
|
||
|
||
class CacheTypeEnum(str, enum.Enum):
|
||
APP2_FINANCE = "app2_finance"
|
||
APP2A_FINANCE_AREA = "app2a_finance_area" # 2026-04-23 新增:区域财务洞察(64 组合)
|
||
APP3_CLUE = "app3_clue"
|
||
APP4_ANALYSIS = "app4_analysis"
|
||
APP5_TACTICS = "app5_tactics"
|
||
APP6_NOTE_ANALYSIS = "app6_note_analysis"
|
||
APP7_CUSTOMER_ANALYSIS = "app7_customer_analysis"
|
||
APP8_CLUE_CONSOLIDATED = "app8_clue_consolidated"
|
||
|
||
|
||
# ── 线索相关 ──
|
||
|
||
|
||
class App3CategoryEnum(str, enum.Enum):
|
||
"""App3 线索分类(3 个枚举值)"""
|
||
|
||
CUSTOMER_BASIC = "客户基础"
|
||
CONSUMPTION_HABIT = "消费习惯"
|
||
PLAY_PREFERENCE = "玩法偏好"
|
||
|
||
|
||
class App6CategoryEnum(str, enum.Enum):
|
||
"""App6/8 线索分类(6 个枚举值)"""
|
||
|
||
CUSTOMER_BASIC = "客户基础"
|
||
CONSUMPTION_HABIT = "消费习惯"
|
||
PLAY_PREFERENCE = "玩法偏好"
|
||
PROMO_PREFERENCE = "促销偏好"
|
||
SOCIAL_RELATION = "社交关系"
|
||
IMPORTANT_FEEDBACK = "重要反馈"
|
||
|
||
|
||
class ClueItem(BaseModel):
|
||
"""单条线索(App3/App6 共用)"""
|
||
|
||
category: str
|
||
summary: str
|
||
detail: str
|
||
emoji: str
|
||
|
||
|
||
class ConsolidatedClueItem(BaseModel):
|
||
"""整合后线索(App8,含 providers)"""
|
||
|
||
category: str
|
||
summary: str
|
||
detail: str
|
||
emoji: str
|
||
providers: str
|
||
|
||
|
||
# ── 各应用结果模型 ──
|
||
|
||
|
||
class App2InsightItem(BaseModel):
|
||
"""App2 财务洞察单条"""
|
||
|
||
seq: int
|
||
title: str
|
||
body: str
|
||
|
||
|
||
class App2Result(BaseModel):
|
||
"""App2 财务洞察结果"""
|
||
|
||
insights: list[App2InsightItem]
|
||
|
||
|
||
class App3Result(BaseModel):
|
||
"""App3 客户数据维客线索结果"""
|
||
|
||
clues: list[ClueItem]
|
||
|
||
|
||
class App4Result(BaseModel):
|
||
"""App4 关系分析结果"""
|
||
|
||
task_description: str
|
||
action_suggestions: list[str]
|
||
one_line_summary: str
|
||
|
||
|
||
class App5TacticsItem(BaseModel):
|
||
"""App5 话术单条"""
|
||
|
||
scenario: str
|
||
script: str
|
||
|
||
|
||
class App5Result(BaseModel):
|
||
"""App5 话术参考结果"""
|
||
|
||
tactics: list[App5TacticsItem]
|
||
|
||
|
||
class App6Result(BaseModel):
|
||
"""App6 备注分析结果"""
|
||
|
||
score: int = Field(ge=1, le=10)
|
||
clues: list[ClueItem]
|
||
|
||
|
||
class App7StrategyItem(BaseModel):
|
||
"""App7 客户分析策略单条"""
|
||
|
||
title: str
|
||
content: str
|
||
|
||
|
||
class App7Result(BaseModel):
|
||
"""App7 客户分析结果"""
|
||
|
||
strategies: list[App7StrategyItem]
|
||
summary: str
|
||
|
||
|
||
class App8Result(BaseModel):
|
||
"""App8 维客线索整理结果"""
|
||
|
||
clues: list[ConsolidatedClueItem]
|