feat: 接入 DeepSeek AI 分析公告是否为中国电信可承接项目
- 新增 ai_enabled/ai_api_key/ai_base_url/ai_model 等配置项,通过 .env 管理 - 新增 app/services/ai_analyzer.py — DeepSeek API 调用 + 详情页正文提取 - 新增 extract_page_content() 从详情页抓取正文供 AI 分析 - Announcement 模型新增 ai_relevant / ai_analysis 字段 - 流水线集成 AI 分析步骤(关键词匹配后、通知前) - AI 标记为可承接的项目额外发送 markdown 着重通知 - 创建 alembic 迁移版本 6e8f4c2d1b0a
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
|
||||
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||
from pydantic import field_validator
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
@@ -38,6 +39,40 @@ class Settings(BaseSettings):
|
||||
loghive_project: str = "gx-gp-notify"
|
||||
loghive_api_key: str = ""
|
||||
|
||||
# AI 分析 (DeepSeek)
|
||||
ai_enabled: bool = False
|
||||
ai_api_key: str = ""
|
||||
ai_base_url: str = "https://api.deepseek.com/v1"
|
||||
ai_model: str = "deepseek-chat"
|
||||
ai_timeout: int = 30
|
||||
ai_analysis_title: str = "🔔 中国电信可承接项目"
|
||||
ai_prompt_template: str = (
|
||||
"你是一个政府采购项目分析师,专门帮助中国电信识别可以承接的项目。\n\n"
|
||||
"可承接范围包括但不限于:\n"
|
||||
"- 通信工程、光缆建设、基站建设\n"
|
||||
"- 信息化系统建设、系统集成\n"
|
||||
"- 云计算、大数据、政务云\n"
|
||||
"- 物联网、智慧城市、智慧园区\n"
|
||||
"- 安防监控、视频会议、应急通信\n"
|
||||
"- 网络运维、网络优化、IDC 服务\n"
|
||||
"- 5G 应用、专线服务\n\n"
|
||||
"--- 公告信息 ---\n"
|
||||
"标题:{title}\n"
|
||||
"采购人:{purchase_name}\n"
|
||||
"公告类型:{announcement_type}\n\n"
|
||||
"--- 公告正文 ---\n"
|
||||
"{content}\n\n"
|
||||
"请用 JSON 格式回答:\n"
|
||||
'{{"is_relevant": true/false, "reason": "简要判断理由", "business_type": "业务分类"}}'
|
||||
)
|
||||
|
||||
@field_validator("ai_prompt_template", mode="before")
|
||||
@classmethod
|
||||
def convert_newlines(cls, v: str) -> str:
|
||||
"""将 .env 中字面 \\n 转换为真实换行"""
|
||||
if isinstance(v, str) and "\\n" in v:
|
||||
return v.replace("\\n", "\n")
|
||||
return v
|
||||
|
||||
# 公告来源(JSON 字符串,从环境变量读取)
|
||||
announcement_sources: str = '{"ZcyAnnouncement1":{"category_id":66485,"name":"采购公告","type":"purchase"},"ZcyAnnouncement2":{"category_id":66485,"name":"结果公告","type":"result"},"ZcyAnnouncement3":{"category_id":66485,"name":"合同公告","type":"contract"},"ZcyAnnouncement4":{"category_id":66485,"name":"更正公告","type":"correction"},"ZcyAnnouncement5":{"category_id":66485,"name":"招标文件预公示","type":"pre_announcement"},"ZcyAnnouncement6":{"category_id":66485,"name":"单一来源公示","type":"single_source"},"ZcyAnnouncement7":{"category_id":66485,"name":"电子卖场公示","type":"electronic_market"},"ZcyAnnouncement10":{"category_id":66485,"name":"履约验收公示","type":"acceptance"},"ZcyAnnouncement11":{"category_id":66485,"name":"工程类公告","type":"engineering"},"ZcyAnnouncement20":{"category_id":66485,"name":"框架协议征集公告","type":"framework_agreement"},"ZcyAnnouncement21":{"category_id":66485,"name":"框架协议入围结果公告","type":"framework_result"},"ZcyAnnouncement23":{"category_id":66485,"name":"框架协议成交结果汇总公告","type":"framework_summary"},"61-266648":{"category_id":66485,"name":"采购意向公开","type":"intention"}}' # noqa: E501
|
||||
|
||||
Reference in New Issue
Block a user