# ═══════════════════════════════════════════════════════════════
#                    TrendRadar 配置文件
#                      Version: 2.0.0
# ═══════════════════════════════════════════════════════════════


# 可视化配置编辑器地址: https://sansan0.github.io/TrendRadar/


# ===============================================================
# 1. 基础设置
# ===============================================================
app:
  # 时区配置（影响所有时间显示、调度系统判断、数据存储）
  # 常用时区：
  #   - Asia/Shanghai (北京时间 UTC+8)
  #   - America/New_York (美东时间 UTC-5/-4)
  #   - Europe/London (伦敦时间 UTC+0/+1)
  # 完整时区列表: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  timezone: "Asia/Shanghai"
  show_version_update: true           # 显示版本更新提示


# ===============================================================
# 1.5 调度系统 —— 什么时间做什么事
#
# 通过 timeline.yaml 里定义的时间段来自动决定：
#   - 什么时候推送通知
#   - 什么时候做 AI 分析
#   - 用什么报告模式
#
# 快速上手：选一个预设模板，改 preset 的值就行
#
#   always_on       → 全天候，有新增即推送
#   morning_evening → 全天推送 + 晚间当日汇总（推荐）
#   office_hours    → 工作日三段式（到岗→午间→收工），周末增量自由推
#   night_owl       → 午后速览 + 深夜全天汇总
#   custom          → 完全自定义，详见 timeline.yaml
#
# 详细时间线图请查看 config/timeline.yaml
# ===============================================================
schedule:
  enabled: true                         # 是否启用调度系统
  preset: "morning_evening"             # 预设模板名称（见上方说明）


# ===============================================================
# 2. 数据源 - 热榜平台
#
# enabled: 是否启用热榜抓取（总开关）
# sources: 平台列表
#   - id: 平台唯一标识（勿修改）
#   - name: 显示名称（可自定义，修改后不影响运行）
# 参考: https://github.com/sansan0/TrendRadar/issues/95
# ===============================================================
platforms:
  enabled: true                         # 是否启用热榜平台抓取
  sources:
    - id: "toutiao"
      name: "今日头条"
    - id: "baidu"
      name: "百度热搜"
    - id: "wallstreetcn-hot"
      name: "华尔街见闻"
    - id: "thepaper"
      name: "澎湃新闻"
    - id: "bilibili-hot-search"
      name: "bilibili 热搜"
    - id: "cls-hot"
      name: "财联社热门"
    - id: "ifeng"
      name: "凤凰网"
    - id: "tieba"
      name: "贴吧"
    - id: "weibo"
      name: "微博"
    - id: "douyin"
      name: "抖音"
    - id: "zhihu"
      name: "知乎"



# ===============================================================
# 3. 数据源 - RSS 订阅
#
# 与热榜数据分开存储，按时间流展示
# 每个源配置：id(唯一标识)、name(显示名称)、url(订阅地址)
# enabled: 可选，默认 true
# max_age_days: 可选，覆盖全局 freshness_filter.max_age_days
# ===============================================================
rss:
  enabled: true                       # 是否启用 RSS 抓取

  # 文章新鲜度过滤配置（全局默认值）
  # 过滤掉发布时间超过指定天数的旧文章，避免同一篇文章重复出现在推送中
  #
  # 过滤逻辑：
  #   - 文章发布时间距当前时间（app.timezone 时区）超过 N 天则不推送
  #   - 无发布时间的文章会被保留（不过滤）
  #
  # ⚠️ 过滤时机：在推送阶段过滤
  #    - 所有文章都会存入数据库（MCP Server 的 AI 查询仍可访问）
  #    - 只有新鲜的文章会被推送到通知渠道
  freshness_filter:
    enabled: true                     # 是否启用新鲜度过滤（默认启用）

    max_age_days: 3                   # 最大文章年龄（天）
                                      # - 正整数：只推送 N 天内的文章
                                      # - 0：禁用过滤，推送所有文章

  # 单个 feed 可配置 max_age_days 覆盖全局设置：
  # - 不配置：使用全局 freshness_filter.max_age_days（默认 3 天）
  # - 正整数：覆盖全局设置，只推送此天数内的文章
  # - 0：禁用此频道的新鲜度过滤，推送所有文章
  feeds:
    - id: "hacker-news"
      name: "Hacker News"
      url: "https://hnrss.org/frontpage"
      # max_age_days: 1               # 示例：只推送1天内的文章

    - id: "ruanyifeng"
      name: "阮一峰的网络日志"
      url: "http://www.ruanyifeng.com/blog/atom.xml"
      # max_age_days: 7               # 示例：推送7天内的文章（更新较慢的博客）
    
    - id: "yahoo-finance"
      name: "雅虎财经"
      url: "https://finance.yahoo.com/news/rssindex"
      enabled: false                  # 禁用

    # 自定义源示例
    # - id: "custom-feed"
    #   name: "自定义源"
    #   url: "https://example.com/feed.xml"
    #   enabled: false
    #   max_age_days: 0               # 示例：禁用过滤，推送所有文章


# ===============================================================
# 4. 报告模式
#
# 🔸 daily（当日汇总模式）
#    • 推送时机：按时推送(默认每小时推送一次)
#    • 显示内容：当日所有匹配新闻 + 新增新闻区域
#    • 适用场景：日报总结、全面了解当日热点趋势
#
# 🔸 current（当前榜单模式）
#    • 推送时机：按时推送(默认每小时推送一次)
#    • 显示内容：当前榜单匹配新闻 + 新增新闻区域
#    • 适用场景：实时热点追踪、了解当前最火的内容
#
# 🔸 incremental（增量监控模式）
#    • 推送时机：有新增才推送
#    • 显示内容：新出现的匹配频率词新闻
#    • 适用场景：避免重复信息干扰
# ===============================================================
report:
  mode: "current"                     # 可选: daily | current | incremental
                                      # ⚠️ 开启调度系统后，此值会被当前时间段的 report_mode 覆盖


  display_mode: "keyword"             # 分组维度: keyword | platform
                                      # keyword: 按关键词分组显示（默认）
                                      # platform: 按平台/来源分组显示

  # 关键词组排序方式（仅 display_mode: keyword 时生效）
  # true: 按 frequency_words.txt 中的定义顺序排列
  # false: 按匹配到的热点条数排序（条数多的在前）
  sort_by_position_first: false

  rank_threshold: 5                   # 排名高亮阈值

  max_news_per_keyword: 0             # 每个关键词最大显示数量（0=不限制）


# ===============================================================
# 5. 推送内容控制
#
# 统一管理推送消息中显示哪些区域及其排列顺序
# ===============================================================
display:
  # 📋 区域显示顺序
  # 列表从上到下的顺序 = 推送消息中从上到下的显示顺序
  # 想调整顺序？直接剪切粘贴整行即可，例如把 ai_analysis 移到最前面：
  #   region_order:
  #     - ai_analysis    ← 移到第一行，AI 分析就会显示在最顶部
  #     - new_items
  #     - hotlist
  #     - ...
  # 注意：区域需同时满足两个条件才会显示：
  #   1. 在此列表中
  #   2. 下方 regions 中对应开关为 true
  region_order:
    - new_items                       # 1️⃣ 新增热点区域
    - hotlist                         # 2️⃣ 热榜区域（关键词匹配）
    - rss                             # 3️⃣ RSS 订阅区域
    - standalone                      # 4️⃣ 独立展示区
    - ai_analysis                     # 5️⃣ AI 分析区域

  # 推送区域开关
  # 控制各区域是否启用（配合 region_order 使用）
  regions:
    hotlist: true                     # 热榜区域（关键词匹配的热点新闻）
    new_items: false                   # 新增热点区域（含热榜新增 + RSS 新增）
                                      # 注：热点词汇统计中的新增标记🆕不受此配置影响

    rss: true                         # RSS 订阅区域
                                      # 开启后将对 RSS 进行关键词分析并在通知中展示
                                      # 关闭后跳过分析，但独立展示区不受影响

    standalone: false                 # 独立展示区（完整热榜/RSS，不受关键词过滤）
    ai_analysis: true                 # AI 分析区域

  # 📋 独立展示区配置
  # 用途：将指定平台的完整热榜/RSS 数据独立提取，不受关键词过滤影响
  # 两个独立用途：
  #   - 推送展示：由 regions.standalone 开关控制，在推送中单独展示完整热榜
  #   - AI 分析：由 ai.include_standalone 开关控制，将完整数据送入 AI 做深度分析
  # 两者共享此处的平台/RSS 配置，但开关互相独立（可只开 AI 分析、不推送展示）
  standalone:
    platforms: ["zhihu", "wallstreetcn-hot"]     # 热榜平台 ID 列表（如 ["zhihu", "weibo"]）
    rss_feeds: []                     # RSS 源 ID 列表（如 ["hacker-news"]）
    max_items: 20                     # 每个源最多展示条数（0=不限制）


# ===============================================================
# 6. 推送通知
#
# ⚠️ 重要安全警告 ⚠️
#
# 🔴 请务必妥善保管好 webhooks，不要公开!!!
# 🔴 如果你以 fork 的方式部署在 GitHub 上，请勿在此填写
# 🔴 而是将 webhooks 填入 GitHub Secrets
#    (Settings → Secrets and variables → Actions)
# 🔴 否则：
#    - 轻则：手机上收到大量垃圾广告推送
#    - 重则：webhook 被滥用造成严重安全隐患
#
# 📌 多账号支持说明
#
# • 使用分号(;)分隔多个账号，如："url1;url2;url3"
# • 需要配对的配置（如 Telegram 的 token 和 chat_id）数量必须一致
# • 每个渠道最多支持 max_accounts_per_channel 个账号
# • 邮箱已支持多收件人（逗号分隔）
# ===============================================================
notification:
  enabled: true                       # 是否启用通知功能（总开关）
                                      # ⚠️ 开启调度系统后，此项仍为总开关：
                                      #   false → 永远不推送（无论调度怎么设置）
                                      #   true  → 由调度的 push 字段控制何时推送

  # 推送渠道配置
  channels:
    feishu:
      webhook_url: ""                 # 飞书机器人 webhook URL

    dingtalk:
      webhook_url: ""                 # 钉钉机器人 webhook URL

    wework:
      webhook_url: ""                 # 企业微信机器人 webhook URL
      msg_type: "markdown"            # 消息类型：markdown(群机器人) | text(个人微信应用)

    telegram:
      bot_token: ""                   # Telegram Bot Token
      chat_id: ""                     # Telegram Chat ID

    email:
      from: ""                        # 发件人邮箱地址
      password: ""                    # 发件人邮箱密码或授权码
      to: ""                          # 收件人邮箱，多个用逗号分隔
      smtp_server: ""                 # SMTP 服务器（可选，留空自动识别）
      smtp_port: ""                   # SMTP 端口（可选，留空自动识别）

    ntfy:
      server_url: "https://ntfy.sh"   # ntfy 服务器地址（可改为自托管）
      topic: ""                       # ntfy 主题名称
      token: ""                       # ntfy 访问令牌（可选，用于私有主题）

    bark:
      url: ""                         # Bark 推送 URL（格式：https://api.day.app/your_device_key）

    slack:
      webhook_url: ""                 # Slack Incoming Webhook URL

    generic_webhook:
      webhook_url: ""                 # 通用 Webhook URL（支持 Discord、Matrix、IFTTT 等）
      payload_template: ""            # JSON 模板，支持 {title} 和 {content} 占位符
                                      # 示例：{"content": "{content}"}
                                      # 留空则使用默认格式：{"title": "{title}", "content": "{content}"}


# ===============================================================
# 7. 存储配置
# ===============================================================
storage:
  # 存储后端选择
  # - auto: 自动选择（GitHub Actions 且配置了远程存储 → remote，否则 → local）
  # - local: 本地 SQLite + TXT/HTML 文件
  # - remote: 远程云存储（S3 兼容协议，支持 R2/OSS/COS 等）
  backend: "auto"

  # 数据格式选项
  formats:
    sqlite: true                      # 主存储（必须启用）
    txt: false                        # 是否生成 TXT 快照
    html: true                       # 是否生成 HTML 报告（⚠️ 邮件推送或者需要看网页版报告必须设为 true）

  # 本地存储配置
  local:
    data_dir: "output"                # 数据目录
    retention_days: 0                 # 保留天数（0=永久保留）

  # 远程存储配置（S3 兼容协议）
  # 支持: Cloudflare R2, 阿里云 OSS, 腾讯云 COS, AWS S3, MinIO 等
  # 建议将敏感信息配置在 GitHub Secrets 或环境变量中
  remote:
    retention_days: 0                 # 保留天数（0=永久保留）

    # S3 兼容配置（或使用环境变量 S3_ENDPOINT_URL 等）
    endpoint_url: ""                  # 服务端点
                                      # Cloudflare R2: https://<account_id>.r2.cloudflarestorage.com
                                      # 阿里云 OSS: https://oss-cn-hangzhou.aliyuncs.com
                                      # 腾讯云 COS: https://cos.ap-guangzhou.myqcloud.com
    bucket_name: ""                   # 存储桶名称
    access_key_id: ""                 # 访问密钥 ID
    secret_access_key: ""             # 访问密钥
    region: ""                        # 区域（可选，部分服务商需要）

  # 数据拉取配置（从远程同步到本地）
  # 用于 MCP Server 等场景：爬虫存到远程，MCP 拉取到本地分析
  pull:
    enabled: false                    # 是否启用启动时自动拉取
    days: 7                           # 拉取最近 N 天的数据


# ===============================================================
# 8. AI 模型配置（共享）
#
# ai_analysis 和 ai_translation 共用此模型配置
# 基于 LiteLLM 统一接口，支持 100+ AI 提供商
# ===============================================================
ai:
  # LiteLLM 模型格式: provider/model_name
  # 示例:
  #   - deepseek/deepseek-chat (DeepSeek)
  #   - openai/gpt-4o (OpenAI)
  #   - gemini/gemini-2.5-flash (Google Gemini)
  #   - anthropic/claude-3-5-sonnet (Anthropic)
  #   - ollama/llama3 (本地 Ollama)
  # 完整列表: https://docs.litellm.ai/docs/providers
  # 如果你对于看英文文档比较头疼，那么可以点击页面右下角的 【Ask AI】 ,用中文询问怎么配置 
  
  model: "deepseek/deepseek-chat"

  api_key: ""                       # API Key（建议使用环境变量 AI_API_KEY）
  
  api_base: ""                      # 自定义 API 端点（可选，大多数情况留空）
                                    # 示例: https://api.openai.com/v1（自建代理或兼容接口）
                                    #
                                    # 💡 超级重要：连接任意兼容 OpenAI 协议的模型商
                                    # 如果你使用的模型商不在上述支持列表中，但提供了兼容 OpenAI 的接口：
                                    #
                                    # 1. api_base 填写: 服务商提供的接口地址
                                    #    例如: https://api.example.com/v1
                                    #
                                    # 2. model 填写: "openai/" + 实际模型名称
                                    #    例如: openai/deepseek-ai/DeepSeek-V3
                                    #    (原理：前缀 openai/ 强制 LiteLLM 使用 OpenAI 协议格式进行通信)


  timeout: 120                      # 请求超时（秒）

  temperature: 1.0                  # 采样温度 (0.0-2.0)
                                    # 注意：部分模型(如 gpt-5)可能要求必须为 1.0，否则会报错
  
  max_tokens: 5000                  # 最大生成 token 数
                                    # 注意：如果 API 不支持此参数(报 HTTP 400)，请设为 0 以禁用发送
  # 高级选项
  num_retries: 1                    # 失败重试次数
  fallback_models: []               # 备用模型列表（可选）
                                    # 示例: ["openai/gpt-4o-mini", "openai/deepseek-ai/DeepSeek-V3"]

  # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  # 额外参数 (高级选项，一般无需修改)
  # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  # LiteLLM 会自动将通用参数转换为各提供商格式，无需手动适配。
  # 仅在需要传递特殊参数时启用此项。
  #
  # 提示：你可以根据模型 API 文档自行添加任何支持的字段。
  # 操作：如需启用，请删掉该行最前方的 "# "（井号和空格）。
  # 注意：如果这几行都带着井号，则代表不使用额外参数（推荐做法）。
  # -------------------------------------------------------------
  # extra_params:
  #   top_p: 1.0              # 核采样（通用）
  #   presence_penalty: 0.0   # 话题多样性（OpenAI/DeepSeek）
  #   stop: ["END"]           # 停止词列表（通用）


# ===============================================================
# 9. AI 分析功能
#
# 使用 AI 大模型对推送内容进行深度分析
# 模型配置见上方 ai 配置段
# ===============================================================
ai_analysis:
  enabled: true                     # 是否启用 AI 分析（总开关）
                                    # ⚠️ 开启调度系统后，此项仍为总开关：
                                    #   false → 永远不分析（无论调度怎么设置）
                                    #   true  → 由调度的 analyze 字段控制何时分析

  # 分析报告输出语言
  # 格式：自然语言描述
  # 示例: "English", "Korean", "法语"
  language: "Chinese"

  # 提示词配置文件路径（相对于 config 目录）
  prompt_file: "ai_analysis_prompt.txt"

  # AI 分析模式（独立于推送报告模式）
  # 可选值:
  #   - "follow_report": 跟随 report.mode 的设置（默认）
  #   - "daily": 强制使用当日汇总模式（分析当天所有新闻）
  #   - "current": 强制使用当前榜单模式（只分析当前在榜新闻）
  #   - "incremental": 强制使用增量模式（只分析新增新闻）
  #
  # 使用场景：
  #   - 推送 incremental（避免重复），AI 分析 current（看当前榜单变化）
  #   - 推送 current（实时热点），AI 分析 daily（全天总结）
  #
  mode: "follow_report"

  # 分析内容配置
  max_news_for_analysis: 150        # 热榜+RSS 合计参与分析的新闻数量上限（控制成本关键项）
                                    # 热榜优先占用配额，RSS 使用剩余配额；独立展示区不受此限制
                                    # 推送消息顶部会显示实际的 AI 分析数供参考

                                    # api 成本估算 (仅供参考)
                                      # 按默认模型(deepseek)
                                      # max_news_for_analysis 为 【50】 条
                                      # include_rank_timeline 为 【false】
                                    # 则
                                      # GitHub Action 部署默认推送约 20 次（每小时推送一次）， 约 0.1 元/天
                                      # Docker 部署默认推送 48 次(每半小时推送一次)， 约 0.2 元/天

  include_rss: false                # 是否包含 RSS 内容进行分析
  
  include_standalone: true          # 是否将独立展示区数据纳入 AI 分析（只需上方 display 区的 standalone 配置了平台/RSS 即可）

  include_rank_timeline: true       # 是否传递完整排名时间线
                                    # false: 使用简化格式（排名范围+时间范围+出现次数）
                                    # true: 传递完整排名变化轨迹（如 1(09:30)→2(10:00)→0(11:00)）
                                    # 启用后 AI 能更精确分析热度趋势，但会额外增加 token 消耗（0.5 倍到 1 倍）




# ===============================================================
# 10. AI 翻译功能
#
# 对推送内容进行多语言翻译，不包含 ai_analysis 分析的内容 
# 模型配置见上方 ai 配置段
# ===============================================================
ai_translation:
  enabled: false                    # 是否启用翻译功能

  # 翻译目标语言
  # 格式：自然语言描述
  # 示例: "Chinese", "Korean", "法语"
  language: "中文"

  # 提示词配置文件路径（相对于 config 目录）
  prompt_file: "ai_translation_prompt.txt"


# ===============================================================
# 11. 高级设置（一般无需修改）
# ===============================================================
advanced:
  # 调试模式
  debug: false

  # 版本检查
  version_check_url: "https://raw.githubusercontent.com/sansan0/TrendRadar/refs/heads/master/version"
  mcp_version_check_url: "https://raw.githubusercontent.com/sansan0/TrendRadar/refs/heads/master/version_mcp"
  configs_version_check_url: "https://raw.githubusercontent.com/sansan0/TrendRadar/refs/heads/master/version_configs"

  # 热榜爬虫技术参数
  crawler:
    request_interval: 2000            # 请求间隔（毫秒）
    use_proxy: false                  # 是否启用代理
    default_proxy: "http://127.0.0.1:10801"

  # RSS 设置
  rss:
    request_interval: 1000            # 请求间隔（毫秒）
    timeout: 15                       # 请求超时（秒）
    use_proxy: false                  # 是否使用代理
    proxy_url: ""                     # RSS 专属代理（留空则使用 crawler.default_proxy）

  # 排序权重（用于重新排序不同平台的热搜）
  # 合起来等于 1
  weight:
    rank: 0.6                         # 排名权重
    frequency: 0.3                    # 频次权重
    hotness: 0.1                      # 热度权重

  # 多账号限制
  max_accounts_per_channel: 3         # 每个渠道最大账号数量

  # 消息分批大小（字节）- 内部配置，请勿修改
  batch_size:
    default: 4000
    dingtalk: 20000
    feishu: 30000
    bark: 4000
    slack: 4000
  batch_send_interval: 3              # 批次发送间隔（秒）
  feishu_message_separator: "━━━━━━━━━━━━━━━━"