# ===================================
# A股自选股智能分析系统 - 环境变量配置模板
# 复制此文件为 .env 并填入真实配置
# ===================================

# 自选股列表（逗号分隔，支持沪深两市代码）
# 沪市：600xxx, 601xxx, 603xxx
# 深市：000xxx, 002xxx, 300xxx
STOCK_LIST=600519,300750,002594

# Anspire Open API Keys（支持多个，逗号分隔）
# 获取: https://open.anspire.cn/?share_code=QFBC0FYC
# 在未配置更高优先级 OpenAI-compatible 来源时，满足条件可复用该 key 给 Anspire 大模型网关与新闻搜索。
# 下列网关与模型为当前项目示例配置；是否可用请以 Anspire 控制台与官方文档为准：
# 示例网关： https://open-gateway.anspire.cn/v6
# 示例模型：Doubao-Seed-2.0-lite（可覆盖为 ANSPIRE_LLM_MODEL=Doubao-Seed-2.0-pro）
# 若网关有区域/版本差异，可覆盖为 ANSPIRE_LLM_BASE_URL=https://open-gateway.anspire.ai/v6
ANSPIRE_API_KEYS=
# ANSPIRE_LLM_MODEL=Doubao-Seed-2.0-lite
# ANSPIRE_LLM_BASE_URL=https://open-gateway.anspire.cn/v6
# ANSPIRE_LLM_ENABLED=true
# 数据源配置
# Tushare Pro Token（可选，从 https://tushare.pro/weborder/#/login?reg=834638 获取）
TUSHARE_TOKEN=
# TickFlow API Key（可选，用于 A 股大盘复盘指数增强；若套餐支持标的池查询，也可增强市场统计）
# TICKFLOW_API_KEY=
# Longbridge OpenAPI（可选，美股/港股量比、换手率、PE 等字段兜底）
# 从 https://open.longbridge.com/ 获取
# LONGBRIDGE_APP_KEY=
# LONGBRIDGE_APP_SECRET=
# LONGBRIDGE_ACCESS_TOKEN=
# static_info 进程内缓存秒数，默认 86400；0=每次请求拉取
# LONGBRIDGE_STATIC_INFO_TTL_SECONDS=86400
# 连接关闭类异常后的冷却秒数，默认 15；冷却期内会临时跳过 Longbridge，避免请求级频繁重连
# LONGBRIDGE_CONNECTION_COOLDOWN_SECONDS=15
# Longbridge SDK 语言与 REPORT_LANGUAGE（zh/en）一致；SDK 日志写入 LOG_DIR/longbridge_sdk.log
# 接入点（与 REPORT_LANGUAGE 无关；留空则用下列默认值）：
# LONGBRIDGE_HTTP_URL=https://openapi.longbridge.com
# LONGBRIDGE_QUOTE_WS_URL=wss://openapi-quote.longbridge.com/v2
# LONGBRIDGE_TRADE_WS_URL=wss://openapi-trade.longbridge.com/v2
# LONGBRIDGE_REGION=hk
# 覆盖接入点；SDK 内部用 LONGPORT_REGION（不带 BRIDGE）自动选择，
# 代码会自动同步 LONGBRIDGE_REGION → LONGPORT_REGION。
# hk → *.longbridge.com  |  cn → *.longbridge.cn
# 其余见：https://open.longbridge.com/zh-CN/docs/getting-started#环境变量
# 夜盘行情 true/false，默认 false
# LONGBRIDGE_ENABLE_OVERNIGHT=false
# K 线推送 realtime 或 confirmed，默认 realtime
# LONGBRIDGE_PUSH_CANDLESTICK_MODE=realtime
# 连接时是否打印行情包（与 README / full-guide 一致：未设置时应用侧默认为关闭，等同 false）
# 设为 1 / true / yes 开启 SDK 详细行情包日志（调试长桥连接时使用）
# LONGBRIDGE_PRINT_QUOTE_PACKAGES=false

# ===================================
# AI 模型配置
# ===================================
# 完整说明：docs/LLM_CONFIG_GUIDE.md
#
# 【快速上手】填一个 API Key 即可运行，系统自动识别模型。
#   Anspire Open（一站式模型+搜索）→ 填 ANSPIRE_API_KEYS
#   Gemini（免费额度）→ 填 GEMINI_API_KEY
#   DeepSeek（性价比高）→ 填 DEEPSEEK_API_KEY
#   AIHubmix（聚合平台）→ 填 AIHUBMIX_KEY
#
# 【进阶】需要多模型 / 多平台 fallback → 配置下方「多渠道」或在 Web 设置页可视化管理。
# ===================================

# --- API Key（填一个即可）---

# Gemini（https://aistudio.google.com）
GEMINI_API_KEY=
# 多 Key 负载均衡：GEMINI_API_KEYS=key1,key2,key3

# DeepSeek（https://platform.deepseek.com）
# 兼容默认：仅填 DEEPSEEK_API_KEY 时仍使用 deepseek-chat，并在日志提示迁移到 deepseek-v4-flash
# DEEPSEEK_API_KEY=

# AIHubmix 聚合（https://aihubmix.com/?aff=CfMq）
# 一个 Key 用 GPT/Claude/Gemini/GLM/Qwen 等模型，无需科学上网
# AIHUBMIX_KEY=

# Anthropic Claude（https://console.anthropic.com）
# ANTHROPIC_API_KEY=

# OpenAI / 兼容 API
# OPENAI_API_KEY=
# OPENAI_BASE_URL=                     # 第三方 API 地址（中转站/代理），留空用官方

# Ollama 本地模型（无需 API Key，推荐）
# OLLAMA_API_BASE=http://localhost:11434
# LITELLM_MODEL=ollama/qwen3:8b
#
# 或使用渠道模式：
# LLM_CHANNELS=ollama
# LLM_OLLAMA_BASE_URL=http://localhost:11434
# LLM_OLLAMA_MODELS=qwen3:8b

# 采样温度（0.0-2.0，默认 0.7；0 确定性最高，2 随机性最高）
# Kimi K2.6 兼容来源：
# - Moonshot API / 模型文档：https://platform.kimi.ai/docs/guide/kimi-k2-6-quickstart
# - Moonshot 官方模型卡（评测默认 temperature = 1.0）：https://huggingface.co/moonshotai/Kimi-K2.6
# - LiteLLM OpenAI-Compatible 规范：https://docs.litellm.ai/docs/providers/openai_compatible
# 当前仓库运行时依赖约束：litellm>=1.80.10,!=1.82.7,!=1.82.8,<2.0.0（显式排除 PyPI 事故版本，见 requirements.txt）。
# 因此 kimi-k2.6 会自动改用 1.0，避免 API 拒绝请求；其他模型和 fallback 仍使用你配置的 LLM_TEMPERATURE。
# Web 设置页 / 桌面端导入不会静默清空或改写 LLM_TEMPERATURE；只在真正发请求前按 Kimi 要求临时归一化。
# 如果主模型切回非 Kimi，原本配置的温度会自动恢复；最小回滚方式是回退本次 Kimi 固定温度改动。
# LLM_TEMPERATURE=0.7

# --- 多渠道配置（可选，也可在 Web 设置页配置）---
# 每个渠道独立配置 base_url / api_key / models，支持多 Key 轮询与自动 fallback。
#
# 示例：DeepSeek + Gemini 双渠道
# LLM_CHANNELS=deepseek,gemini
# LLM_DEEPSEEK_API_KEY=sk-xxx
# LLM_DEEPSEEK_BASE_URL=https://api.deepseek.com
# LLM_DEEPSEEK_MODELS=deepseek-v4-flash,deepseek-v4-pro
# LLM_GEMINI_API_KEYS=key1,key2
# LLM_GEMINI_MODELS=gemini-3.1-pro-preview
#
# 示例：自定义 API 端点（第三方代理 / 聚合平台 / 转发站）
# LLM_CHANNELS=my_proxy
# LLM_MY_PROXY_BASE_URL=https://your-proxy.example.com/v1
# LLM_MY_PROXY_API_KEY=sk-xxx
# LLM_MY_PROXY_MODELS=gpt-5.5,claude-sonnet-4-6
# LLM_MY_PROXY_PROTOCOL=openai
#
# 示例：Ollama 本地模型（无需 API Key）
# LLM_CHANNELS=ollama
# LLM_OLLAMA_BASE_URL=http://localhost:11434
# LLM_OLLAMA_MODELS=qwen3:8b,llama3.2
#
# 常用厂商模板（任选其一复制到 .env；完整说明见 docs/llm-providers.md）
#
# Anspire Open（共享搜索与 LLM Key，OpenAI Compatible）
# LLM_CHANNELS=anspire
# LLM_ANSPIRE_PROTOCOL=openai
# LLM_ANSPIRE_BASE_URL=https://open-gateway.anspire.cn/v6（示例）
# LLM_ANSPIRE_API_KEY=sk-xxx
# LLM_ANSPIRE_MODELS=Doubao-Seed-2.0-lite,Doubao-Seed-2.0-pro（示例模型）
# LITELLM_MODEL=openai/Doubao-Seed-2.0-lite（示例）
#
# AIHubmix 聚合平台（OpenAI Compatible）
# LLM_CHANNELS=aihubmix
# LLM_AIHUBMIX_PROTOCOL=openai
# LLM_AIHUBMIX_BASE_URL=https://aihubmix.com/v1
# LLM_AIHUBMIX_API_KEY=sk-xxx
# LLM_AIHUBMIX_MODELS=gpt-5.5,claude-sonnet-4-6,gemini-3.1-pro-preview
# LITELLM_MODEL=openai/gpt-5.5
#
# OpenAI 官方
# LLM_CHANNELS=openai
# LLM_OPENAI_PROTOCOL=openai
# LLM_OPENAI_BASE_URL=https://api.openai.com/v1
# LLM_OPENAI_API_KEY=sk-xxx
# LLM_OPENAI_MODELS=gpt-5.5,gpt-5.4-mini
# LITELLM_MODEL=openai/gpt-5.5
#
# DeepSeek 官方
# LLM_CHANNELS=deepseek
# LLM_DEEPSEEK_PROTOCOL=deepseek
# LLM_DEEPSEEK_BASE_URL=https://api.deepseek.com
# LLM_DEEPSEEK_API_KEY=sk-xxx
# LLM_DEEPSEEK_MODELS=deepseek-v4-flash,deepseek-v4-pro
# LITELLM_MODEL=deepseek/deepseek-v4-flash
#
# Gemini 官方（官方协议，Base URL 留空）
# LLM_CHANNELS=gemini
# LLM_GEMINI_PROTOCOL=gemini
# LLM_GEMINI_API_KEY=xxx
# LLM_GEMINI_MODELS=gemini-3.1-pro-preview,gemini-3-flash-preview
# LITELLM_MODEL=gemini/gemini-3.1-pro-preview
#
# Anthropic Claude 官方（官方协议，Base URL 留空）
# LLM_CHANNELS=anthropic
# LLM_ANTHROPIC_PROTOCOL=anthropic
# LLM_ANTHROPIC_API_KEY=sk-ant-xxx
# LLM_ANTHROPIC_MODELS=claude-sonnet-4-6,claude-opus-4-7
# LITELLM_MODEL=anthropic/claude-sonnet-4-6
#
# Kimi / Moonshot（OpenAI Compatible）
# LLM_CHANNELS=moonshot
# LLM_MOONSHOT_PROTOCOL=openai
# LLM_MOONSHOT_BASE_URL=https://api.moonshot.cn/v1
# LLM_MOONSHOT_API_KEY=sk-xxx
# LLM_MOONSHOT_MODELS=kimi-k2.6,kimi-k2.5
# LITELLM_MODEL=openai/kimi-k2.6
#
# 通义千问 DashScope（OpenAI Compatible）
# LLM_CHANNELS=dashscope
# LLM_DASHSCOPE_PROTOCOL=openai
# LLM_DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
# LLM_DASHSCOPE_API_KEY=sk-xxx
# LLM_DASHSCOPE_MODELS=qwen3.6-plus,qwen3.6-flash
# LITELLM_MODEL=openai/qwen3.6-plus
#
# 智谱 GLM（OpenAI Compatible）
# LLM_CHANNELS=zhipu
# LLM_ZHIPU_PROTOCOL=openai
# LLM_ZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4
# LLM_ZHIPU_API_KEY=xxx
# LLM_ZHIPU_MODELS=glm-5.1,glm-4.7-flash
# LITELLM_MODEL=openai/glm-5.1
#
# MiniMax（OpenAI Compatible）
# 来源：官方 OpenAI API 兼容文档 https://platform.minimax.io/docs/api-reference/text-chat
# LiteLLM 通过 openai/<model> 路由到兼容 Chat Completions 的 Base URL。
# LLM_CHANNELS=minimax
# LLM_MINIMAX_PROTOCOL=openai
# LLM_MINIMAX_BASE_URL=https://api.minimax.io/v1
# LLM_MINIMAX_API_KEY=xxx
# LLM_MINIMAX_MODELS=MiniMax-M2.7,MiniMax-M2.7-highspeed
# LITELLM_MODEL=openai/MiniMax-M2.7
#
# 火山方舟 / 豆包（OpenAI Compatible，按实际开通地域调整 endpoint）
# 来源：火山方舟在线推理 / Responses API 文档 https://www.volcengine.com/docs/82379/2121998
# LiteLLM 通过 openai/<model> 路由到兼容 Chat Completions 的 Base URL。
# LLM_CHANNELS=volcengine
# LLM_VOLCENGINE_PROTOCOL=openai
# LLM_VOLCENGINE_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
# LLM_VOLCENGINE_API_KEY=xxx
# LLM_VOLCENGINE_MODELS=doubao-seed-1-6-251015,doubao-seed-1-6-thinking-251015
# LITELLM_MODEL=openai/doubao-seed-1-6-251015
#
# 硅基流动 SiliconFlow（OpenAI Compatible）
# 来源：官方模型列表 https://docs.siliconflow.cn/quickstart/models
# LLM_CHANNELS=siliconflow
# LLM_SILICONFLOW_PROTOCOL=openai
# LLM_SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1
# LLM_SILICONFLOW_API_KEY=sk-xxx
# LLM_SILICONFLOW_MODELS=deepseek-ai/DeepSeek-V3.2,Qwen/Qwen3-235B-A22B-Thinking-2507
# LITELLM_MODEL=openai/deepseek-ai/DeepSeek-V3.2
#
# OpenRouter（OpenAI Compatible）
# 来源：官方 Models API https://openrouter.ai/docs/api/api-reference/models/get-models
# LLM_CHANNELS=openrouter
# LLM_OPENROUTER_PROTOCOL=openai
# LLM_OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
# LLM_OPENROUTER_API_KEY=sk-or-xxx
# LLM_OPENROUTER_MODELS=~anthropic/claude-sonnet-latest,~openai/gpt-latest
# LITELLM_MODEL=openai/~anthropic/claude-sonnet-latest

# 高级：模型路由 YAML 配置（可选，参考 docs/examples/litellm_config.example.yaml）
# LITELLM_CONFIG=./litellm_config.yaml

# ===================================
# 搜索引擎配置（用于获取股票新闻）
# ===================================
# Bocha API Keys（中文搜索优化，支持AI摘要，支持多个，逗号分隔）
# 获取: https://open.bocha.cn/
# BOCHA_API_KEYS=your_bocha_key_here
# MiniMax API Key（Coding Plan Web Search，支持多个，逗号分隔）
# 获取: https://platform.minimax.io/
# MINIMAX_API_KEYS=your_minimax_key_here
# Tavily API Keys（支持多个，逗号分隔）
TAVILY_API_KEYS=
# SerpAPI Keys（支持多个，逗号分隔）
SERPAPI_API_KEYS=
# Brave Search API Keys（支持多个，逗号分隔）
# 获取: https://brave.com/search/api/
BRAVE_API_KEYS=
# SearXNG 实例地址（逗号分隔，私有部署无配额，需在 settings.yml 启用 format: json）
# 留空时默认自动从 searx.space 拉取公共实例；若不希望访问公共实例，可将下方开关设为 false
SEARXNG_BASE_URLS=
SEARXNG_PUBLIC_INSTANCES_ENABLED=true

# ===================================
# Social Sentiment Intelligence (US stocks only)
# ===================================
# Reddit / X (Twitter) / Polymarket sentiment data from api.adanos.org
# Only activates for US stock tickers (AAPL, TSLA, etc.), ignored for A-shares/HK stocks
# Free tier: 250 requests/month | Register: https://api.adanos.org
# SOCIAL_SENTIMENT_API_KEY=sk_live_your_key_here
# SOCIAL_SENTIMENT_API_URL=https://api.adanos.org

# ===================================
# 新闻时效与分析筛选配置
# ===================================
# 新闻策略窗口档位：ultra_short(1天) / short(3天) / medium(7天) / long(30天)
# 实际窗口 = min(策略窗口, NEWS_MAX_AGE_DAYS)
# NEWS_STRATEGY_PROFILE=short
# 新闻最大时效（天），搜索时限制结果在近期内，避免使用过时信息
# NEWS_MAX_AGE_DAYS=3
# 乖离率阈值（%），偏离 MA5 超过此值提示不追高；强势趋势股自动放宽到 1.5 倍
# BIAS_THRESHOLD=5.0

# ===================================
# Agent 策略对话配置（Web 对话页）
# ===================================
# 启用 Agent 策略对话（默认 false，内部统一命名为 skill）
# AGENT_MODE=true
# Agent 主模型（可选）：留空时继承主模型；无 provider 前缀会按 openai/<model> 解析
# AGENT_LITELLM_MODEL=
# Agent 最大推理步数上限（默认 10 时各子 Agent 按自身预设运行；高于默认 10 时所有子 Agent 统一采用该值；低于某子 Agent 默认值时会作为上限进行封顶）
# AGENT_MAX_STEPS=10
# 默认启用策略（逗号分隔），不配置时使用以下内置默认值
#
# 内置策略技能列表（可任意组合）：
#   bull_trend          — 多头趋势（MA5>MA10>MA20 排列 + 低乖离率）
#   ma_golden_cross     — 均线金叉（MA5 上穿 MA10/MA20）
#   volume_breakout     — 放量突破（价格突破近期高点 + 成交量放大）
#   shrink_pullback     — 缩量回踩（回踩均线 + 量能萎缩，低吸点）
#   bottom_volume       — 底部放量（地量见地价，底部反转信号）
#   dragon_head         — 龙头策略（强势龙头，趋势延续追涨）
#   one_yang_three_yin  — 一阳夹三阴（主力洗盘后强势反包形态）
#   box_oscillation     — 箱体震荡（区间高抛低吸）
#   chan_theory          — 缠论（缠中说禅理论：笔/线段/中枢）
#   wave_theory         — 波浪理论（艾略特波浪计数）
#   emotion_cycle       — 情绪周期（市场情绪高低点轮动）
#
# 留空时，系统会使用 metadata 里声明的主默认策略 skill（内置默认是 bull_trend）
# AGENT_SKILLS=
#
# 也可以手动指定一组策略：
# AGENT_SKILLS=bull_trend,ma_golden_cross,shrink_pullback
#
# 完整启用所有内置策略（两种写法等效）：
# AGENT_SKILLS=all
# AGENT_SKILLS=bull_trend,ma_golden_cross,volume_breakout,shrink_pullback,bottom_volume,dragon_head,one_yang_three_yin,box_oscillation,chan_theory,wave_theory,emotion_cycle
#
AGENT_SKILLS=
# 自定义策略目录（可选，放置自定义 YAML 策略文件；环境变量名沿用内部 skill 命名）
# AGENT_SKILL_DIR=./strategies

# Agent 架构模式（默认 single；multi 为多 Agent 编排模式）
# AGENT_ARCH=single

# Multi-Agent 编排模式（仅 AGENT_ARCH=multi 时有效）
# quick: 技术分析→决策（最快，约 2 次 LLM 调用）
# standard: 技术→情报→决策（默认）
# full: 技术→情报→风控→决策
# specialist: 技术→情报→风控→策略专家评估→决策
# AGENT_ORCHESTRATOR_MODE=standard

# Agent 执行超时预算（秒，0 表示关闭；single-agent 用作整体循环预算，multi-agent 用作协作编排预算；默认 600）
# AGENT_ORCHESTRATOR_TIMEOUT_S=600

# 风控 Agent 是否可以否决买入信号（默认开启）
# AGENT_RISK_OVERRIDE=true

# 记忆与校准系统（追踪历史准确率，自动调节置信度）
# AGENT_MEMORY_ENABLED=false

# 自动按回测表现加权策略意见
# AGENT_SKILL_AUTOWEIGHT=true

# 策略路由模式（auto=根据市场状态自动选择 / manual=使用 AGENT_SKILLS 列表）
# AGENT_SKILL_ROUTING=auto

# 事件告警监控（schedule 模式后台轮询；触发后复用已配置通知渠道）
# 兼容性说明：本节仅新增告警规则配置，不会修改模型名、provider、Base URL、LiteLLM 或 LLM 配置语义；回退只需关闭/移除事件监控配置。
# 支持规则：
#   price_cross          — 价格突破阈值，direction: above / below，字段: price
#   price_change_percent — 涨跌幅阈值，direction: up / down，字段: change_pct（单位：%）
#   volume_spike         — 成交量放大，字段: multiplier（相对近 20 日均量倍数）
# AGENT_EVENT_MONITOR_ENABLED=false
# AGENT_EVENT_MONITOR_INTERVAL_MINUTES=5
# AGENT_EVENT_ALERT_RULES_JSON=[{"stock_code":"600519","alert_type":"price_cross","direction":"above","price":1800},{"stock_code":"300750","alert_type":"price_change_percent","direction":"down","change_pct":3.0},{"stock_code":"000858","alert_type":"volume_spike","multiplier":2.5}]

# ===================================
# 通知渠道配置（可同时配置多个，全部推送）
# ===================================
#
# 【方式一】企业微信机器人
# 在企业微信群 -> 设置 -> 群机器人 -> 添加 -> 复制 Webhook 地址
#
# WECHAT_WEBHOOK_URL=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key_here
#
# 【方式二】飞书机器人
# 在飞书群 -> 设置 -> 群机器人 -> 添加机器人 -> 自定义机器人 -> 复制 Webhook 地址
#
# FEISHU_WEBHOOK_URL=https://open.feishu.cn/open-apis/bot/v2/hook/your_key_here
# 如果机器人安全设置开启了“签名校验”，需同步填写 secret
# FEISHU_WEBHOOK_SECRET=your_feishu_webhook_secret
# 如果机器人安全设置开启了“关键词”，需填写同一个关键词；系统会自动在每条消息前补上
# FEISHU_WEBHOOK_KEYWORD=股票日报
# 注意：FEISHU_APP_ID / FEISHU_APP_SECRET 用于飞书应用、云文档或 Stream 模式，不会直接启用群 Webhook 推送
#
# 【方式三】Telegram 机器人（需同时配置两项）
# 1. 在 Telegram 找 @BotFather -> /newbot -> 获取 Bot Token
# 2. 获取 Chat ID：发消息给 @userinfobot 或访问 https://api.telegram.org/bot<token>/getUpdates
#
# TELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz
# TELEGRAM_CHAT_ID=123456789
# TELEGRAM_MESSAGE_THREAD_ID=2780
#
# 【方式四】邮件推送（只需 2 项配置，SMTP 自动识别）
# 支持 QQ邮箱、163邮箱、Gmail 等支持 SMTP 授权码/基础认证的邮箱
# Outlook / Exchange 若租户强制 OAuth2，当前版本暂不支持
# 1. 获取授权码（以QQ邮箱为例）：设置 -> 账户 -> POP3/SMTP服务 -> 开启 -> 获取授权码
# 2. 填写下面两项即可：
#
# EMAIL_SENDER=
# EMAIL_PASSWORD=
# EMAIL_RECEIVERS=receiver@example.com  # 可选，留空则发给自己
#
# 【方式四扩展】股票分组发往不同邮箱（Issue #268，可选）
# STOCK_LIST 决定实际分析范围；STOCK_GROUP_N 仅决定邮件发给谁，建议始终写成 STOCK_LIST 的子集
# Telegram / 企业微信 / Webhook 等其他渠道仍会按完整 STOCK_LIST 推送，不会因为分组而拆分
# 当前仓库默认 GitHub Actions daily_analysis workflow 不会自动注入任意编号的 STOCK_GROUP_N / EMAIL_GROUP_N
# 因此该能力适用于本地 .env、Docker，或其他已显式注入这些变量的运行环境
# STOCK_GROUP_1=600519,300750
# EMAIL_GROUP_1=user1@example.com
# STOCK_GROUP_2=002594,AAPL
# EMAIL_GROUP_2=user2@example.com
#
# 【方式五】自定义 Webhook（支持多个，逗号分隔）
# 适用于：钉钉、Discord、Slack、Bark、自建服务等任意支持 POST JSON 的 Webhook
# 系统会自动识别常见服务并使用对应格式
#
# CUSTOM_WEBHOOK_URLS=https://oapi.dingtalk.com/robot/send?access_token=xxx,https://hooks.slack.com/services/xxx
# CUSTOM_WEBHOOK_BEARER_TOKEN=  # 可选，用于需要认证的 Webhook (Header Authorization: Bearer <token>)
# CUSTOM_WEBHOOK_BODY_TEMPLATE=  # 可选，全局 JSON body 模板，会覆盖 Bark/Slack/Discord 等自动 payload；推荐 $content_json/$title_json
# WEBHOOK_VERIFY_SSL=true   # 默认校验；影响读取该配置的 webhook-style HTTPS 通知请求。设为 false 可支持自签名证书。警告：禁用后存在 MITM 劫持风险，仅限可信内网
#
# 【方式六】Pushover 配置
# 注册Pushover账号，并创建应用Token https://pushover.net/apps/build
# PUSHOVER_USER_KEY=
# PUSHOVER_API_TOKEN=
#
# 【方式六扩展】ntfy 配置
# NTFY_URL 必须包含 topic path，例如 https://ntfy.sh/my-topic 或 https://self-hosted:port/my-topic
# 系统会解析 topic，并使用 ntfy JSON publish API 发送 Markdown 文本。
# NTFY_URL=
# NTFY_TOKEN=  # 可选，用于需要 Bearer Token 的 topic 或自建 ntfy server
#
# 【方式六扩展】Gotify 配置
# GOTIFY_URL 是 Gotify server base URL，不包含 /message；系统会拼接 /message 并用 X-Gotify-Key Header 发送 token。
# GOTIFY_URL=
# GOTIFY_TOKEN=  # Gotify application token
#
# 【方式七】PushPlus 配置（国内推送服务，推荐）
# 注册PushPlus账号并获取Token https://www.pushplus.plus
# PUSHPLUS_TOKEN=
# 群组推送：填写群组编码后，消息推送给群组所有订阅用户（一对多）
# PUSHPLUS_TOPIC=
#
# 【方式八】Discord 配置
# 支持两种方式：Webhook（推荐，配置简单）和 Bot API（权限高）
# 
# 方式1：Discord Webhook（推荐，无需 Bot 账号）
# 在 Discord 频道设置 -> 集成 -> Webhook -> 新建 Webhook -> 复制 URL
# DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/your_webhook_id/your_webhook_token
# 
# 方式2：Discord Bot API（需要 Bot 账号和频道 ID）
# 1. 创建 Bot：https://discord.com/developers/applications -> 新建应用 -> Bot -> 创建 Bot
# 2. 获取 Bot Token：Bot 页面 -> 重置 Token
# 3. 获取频道 ID：Discord 开启开发者模式 -> 右键频道 -> 复制 ID
# DISCORD_BOT_TOKEN=
# DISCORD_MAIN_CHANNEL_ID=
# DISCORD_CHANNEL_ID=   # 兼容旧变量名，推荐改用 DISCORD_MAIN_CHANNEL_ID
# 如果你要接收 Discord Interaction / Webhook 回调，必须配置公钥用于验签
# 获取方式：Discord Developer Portal -> General Information -> Public Key
# DISCORD_INTERACTIONS_PUBLIC_KEY=
# 
# 【方式九】Slack 配置
# 支持两种方式：Bot API（推荐）和 Incoming Webhook
# 同时配置时优先使用 Bot API，确保文本与图片发送到同一频道。
#
# 方式1：Slack Bot API（推荐，支持图片上传）
# 1. 创建 Slack App：https://api.slack.com/apps -> Create New App
# 2. 添加 Bot Token Scopes：chat:write, files:write
# 3. 安装到工作区并获取 Bot Token (xoxb-...)
# 4. 获取频道 ID：频道详情 -> 底部复制频道 ID
# SLACK_BOT_TOKEN=xoxb-...
# SLACK_CHANNEL_ID=C01234567
#
# 方式2：Slack Incoming Webhook（配置简单，不支持图片上传）
# 在 Slack App 管理页面创建 Incoming Webhook -> 复制 URL
# SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T.../B.../xxx
#
# 【方式十】Server酱3 配置（国内推送服务，支持微信推送）
# 注册Server酱3账号并获取SendKey https://sc3.ft07.com/
# SERVERCHAN3_SENDKEY=
#
# 【方式十一】AstrBot 配置
# ASTRBOT_URL=
# ASTRBOT_TOKEN=  # 可选，用于需要 Bearer Token 的 AstrBot Webhook
#
# 【高级配置】消息长度限制（字节）
# 超过限制会自动分批发送，一般无需修改
# FEISHU_MAX_BYTES=20000    # 飞书限制约 20KB，默认 20000 字节
# WECHAT_MAX_BYTES=4000     # 企业微信限制 4096 字节，默认 4000 字节
#
# 【Markdown 转图片】(Issue #455)
# 对不支持 Markdown 的渠道，将报告转为图片发送，提升可读性
# 单股推送 + 图片：需同时配置 MARKDOWN_TO_IMAGE_CHANNELS 且安装转图工具
# MARKDOWN_TO_IMAGE_CHANNELS=telegram,wechat,custom,email,slack   # 逗号分隔
# MARKDOWN_TO_IMAGE_MAX_CHARS=15000   # 超过此长度不转换，避免超大图片
# MD2IMG_ENGINE=wkhtmltoimage   # wkhtmltoimage(默认) | markdown-to-file(emoji 更好，需 npm i -g markdown-to-file)
# 转图工具：wkhtmltopdf (apt install wkhtmltopdf / brew install wkhtmltopdf)，或 markdown-to-file
#
# 【通知路由策略】(Issue #1200 P3)
# 默认留空：该类型通知发送到所有已配置渠道。填写后仅发送到列出的已配置渠道。
# 允许值：wechat,feishu,telegram,email,pushover,ntfy,gotify,pushplus,serverchan3,custom,discord,slack,astrbot
# NOTIFICATION_REPORT_CHANNELS=
# NOTIFICATION_ALERT_CHANNELS=
# NOTIFICATION_SYSTEM_ERROR_CHANNELS=
#
# 【通知降噪机制】(Issue #1200 P4)
# 默认全部关闭；仅影响静态通知渠道，不影响机器人触发会话回执。
# NOTIFICATION_DEDUP_TTL_SECONDS=0      # 同一稳定去重 key 在 TTL 内只发送一次；0 关闭
# NOTIFICATION_COOLDOWN_SECONDS=0       # 同一冷却 key 在窗口内限频；0 关闭
# NOTIFICATION_QUIET_HOURS=             # 静默时段，格式 HH:MM-HH:MM，支持跨午夜
# NOTIFICATION_TIMEZONE=                # 静默时段时区，如 Asia/Shanghai；留空跟随 TZ/系统本地时区
# NOTIFICATION_MIN_SEVERITY=            # info,warning,error,critical；留空保持现状
# NOTIFICATION_DAILY_DIGEST_ENABLED=false  # 预留配置；当前不会发送每日摘要
#
# 【实时行情预取】(Issue #455)
# PREFETCH_REALTIME_QUOTES=true   # 设为 false 可禁用，避免 efinance/akshare_em 全市场拉取；tushare 为单股接口，预取仅拉首股

# ===================================
# 单股推送配置（可选）
# ===================================
# 单股推送模式：每分析完一只股票立即推送，而不是汇总后推送
# SINGLE_STOCK_NOTIFY=false
#
# 报告类型：simple(精简)、full(完整)、brief(3-5句概括)
# Docker环境下如果推送内容不完整，可以设置为 full
# REPORT_TYPE=simple
# 报告输出语言：zh(中文，默认) / en(英文)
# REPORT_LANGUAGE=zh
# 仅分析结果摘要：设为 true 时只推送汇总，不含个股详情
# REPORT_SUMMARY_ONLY=false
#
# Report Engine P0 (Jinja2 / 完整性校验 / 历史对比)
# REPORT_TEMPLATES_DIR=templates
# REPORT_RENDERER_ENABLED=false
# REPORT_INTEGRITY_ENABLED=true
# REPORT_INTEGRITY_RETRY=1
# REPORT_HISTORY_COMPARE_N=0

# 个股分析与大盘复盘合并推送（默认 false），减少邮件数量、降低垃圾邮件风险
# MERGE_EMAIL_NOTIFICATION=false

# ===================================
# 分析间隔配置（可选）
# ===================================
# 个股分析和大盘分析之间的延迟时间（秒）
# 用于避免触发 Gemini 等 AI API 的限流
# ANALYSIS_DELAY=0

# 应用 AppKey（与 Webhook 模式共用）
DINGTALK_APP_KEY=xxxx
# 应用 AppSecret（与 Webhook 模式共用）
DINGTALK_APP_SECRET=xxxx
# 启用 Stream 模式
DINGTALK_STREAM_ENABLED=false

# 飞书应用机器人配置（用于 Stream Bot / 云文档模式，不会直接开启群 Webhook 推送）
FEISHU_APP_ID=xxxx
FEISHU_APP_SECRET=xxxx  # 飞书应用 Secret，仅应用/Stream Bot/云文档模式使用；群通知推送请使用 FEISHU_WEBHOOK_URL
# 启用长连接模式
FEISHU_STREAM_ENABLED=false
# 飞书群机器人 Webhook 安全配置（仅 Webhook 推送模式使用）
# FEISHU_WEBHOOK_SECRET=your_feishu_webhook_secret
# FEISHU_WEBHOOK_KEYWORD=股票日报

# 数据库路径
DATABASE_PATH=./data/stock_analysis.db
# SQLite 写入优化：文件库默认启用 WAL，降低批量写入和并发回写时的锁竞争
SQLITE_WAL_ENABLED=true
# SQLite 等锁超时（毫秒）
SQLITE_BUSY_TIMEOUT_MS=5000
# SQLite 遇到 database is locked / database table is locked 时的最大重试次数
SQLITE_WRITE_RETRY_MAX=3
# SQLite 写入重试基础退避时间（秒，按指数退避递增）
SQLITE_WRITE_RETRY_BASE_DELAY=0.1

# ===================================
# 回测配置（可选）
# ===================================
# 是否启用回测（true/false）
BACKTEST_ENABLED=true
# 回测评估窗口（交易日数）
BACKTEST_EVAL_WINDOW_DAYS=10
# 仅回测 N 天前的分析记录（避免当天/最近数据不完整）
BACKTEST_MIN_AGE_DAYS=14
# 回测引擎版本（当回测逻辑升级时用于区分结果）
BACKTEST_ENGINE_VERSION=v1
# 中性区间阈值（%），例如 2 表示 -2%~+2% 视为震荡
BACKTEST_NEUTRAL_BAND_PCT=2.0

# === 定时任务配置 ===
# 是否启用定时任务（true/false）
SCHEDULE_ENABLED=false
# 每日执行时间（HH:MM 格式，24小时制）
SCHEDULE_TIME=18:00
# 定时模式启动时是否立即执行一次分析（true/false）
# 若未显式设置，定时模式会沿用 RUN_IMMEDIATELY 的运行时覆盖语义以兼容旧配置
SCHEDULE_RUN_IMMEDIATELY=true
# 非定时模式启动时是否立即执行一次分析（true/false）
RUN_IMMEDIATELY=true
# 是否启用大盘复盘（true/false）
MARKET_REVIEW_ENABLED=true
# 大盘复盘市场区域：cn(A股)、hk(港股)、us(美股)、both(全部市场)，hk/us 适合仅关注港股/美股的用户
# MARKET_REVIEW_REGION=cn

# ===================================
# 代理配置（可选）
# ===================================
# 是否启用代理（true/false，默认 false）
# 仅在本地开发环境生效，GitHub Actions 环境自动跳过
USE_PROXY=false
# 代理服务器地址（默认 127.0.0.1）
PROXY_HOST=127.0.0.1
# 代理服务器端口（默认 10809）
PROXY_PORT=10809

# 系统配置
# 日志目录
LOG_DIR=./logs
# 日志级别（DEBUG/INFO/WARNING/ERROR）
LOG_LEVEL=INFO
# LiteLLM 内部日志级别（DEBUG/INFO/WARNING/ERROR/CRITICAL；默认 WARNING；排查内部流式/路由细节时可临时设为 DEBUG）
# LITELLM_LOG_LEVEL=WARNING
# 最大并发线程数（建议保持低并发防封禁）
MAX_WORKERS=3
# 是否启用调试日志
DEBUG=false

# ===================================
# WebUI 配置（可选）
# ===================================
# 是否默认启动 WebUI（true/false，默认 false）
WEBUI_ENABLED=false
# WebUI 监听地址（默认 127.0.0.1；Docker/云服务器需设为 0.0.0.0 才能外网访问，详见 docs/deploy-webui-cloud.md）
WEBUI_HOST=127.0.0.1
# WebUI 监听端口（默认 8000）
WEBUI_PORT=8000
# 启动 Web 服务前是否自动构建前端（npm install && npm run build，默认 true）
WEBUI_AUTO_BUILD=true
# 单层可信反向代理（如 Nginx → App）下信任 X-Forwarded-For 获取真实 IP，取最右值用于登录限流；多级代理/CDN 场景限流 key 可能退化为边缘代理 IP，需额外评估；直连公网时保持 false 防伪造
# TRUST_X_FORWARDED_FOR=false

# ===================================
# Web 登录认证（可选）
# ===================================
# 设为 true 启用密码保护；首次访问时在网页设置初始密码，可在「系统设置 > 修改密码」中修改
# 忘记密码可在服务器执行: python -m src.auth reset_password
ADMIN_AUTH_ENABLED=false
# ADMIN_SESSION_MAX_AGE_HOURS=24  # Session 有效期（小时）

# ===========================================
# 图片识别股票代码（设置页「从图片添加」）
# ===========================================
# 单次请求超时 60 秒；图片最大 5MB
# 需配置 GEMINI_API_KEY、ANTHROPIC_API_KEY 或 OPENAI_API_KEY 中至少一个（Vision 能力模型）

# ===========================================
# Data Fetcher Priority Configuration
# ===========================================
# Lower number = higher priority (tried first)
# Default priorities: efinance(0) > akshare(1) > tushare/pytdx(2) > baostock(3) > yfinance(4)
# For US stocks, set YFINANCE_PRIORITY=0 to use Yahoo Finance first

# EFINANCE_PRIORITY=0      # EastMoney (China) - default: 0
# EFINANCE_CALL_TIMEOUT=30 # Timeout (seconds) for efinance API calls; prevents indefinite hangs
#                          # when eastmoney hosts are unreachable. Default: 30
# AKSHARE_PRIORITY=1       # AkShare (China) - default: 1
# TUSHARE_PRIORITY=2       # Tushare Pro (China) - default: 2
# PYTDX_PRIORITY=2         # Tongdaxin (China) - default: 2
#
# Pytdx custom server (for intranet/deploy): use custom host instead of built-in public servers
# PYTDX_HOST=192.168.1.100
# PYTDX_PORT=7709
# Or multiple servers: PYTDX_SERVERS=ip1:port1,ip2:port2
# BAOSTOCK_PRIORITY=3      # Baostock (China) - default: 3
# YFINANCE_PRIORITY=4      # Yahoo Finance (Global) - default: 4

# Example: Prioritize Yahoo Finance for US stocks
# YFINANCE_PRIORITY=0
# EFINANCE_PRIORITY=99

# ===========================================
# 实时行情数据源优先级配置
# ===========================================
# 用于获取量比、换手率、市盈率等实时数据
# 可选数据源（逗号分隔，按顺序尝试）：
#   - tencent: 腾讯财经，有量比/换手率/PE/PB，单股查询稳定（推荐首选）
#   - akshare_sina: 新浪财经，基本行情，无量比，但非常稳定
#   - efinance: 东财(efinance库)，有量比，全量拉取易被封
#   - akshare_em: 东财(akshare库)，数据最全，全量拉取易被封
#   - tushare: Tushare Pro，需要2000积分，数据全面（付费用户推荐）
#
# 默认优先级：tencent > akshare_sina > efinance > akshare_em
# 如果有 Tushare Pro 高积分账号，可将 tushare 放在首位：
# REALTIME_SOURCE_PRIORITY=tushare,tencent,akshare_sina,efinance,akshare_em
# REALTIME_SOURCE_PRIORITY=tencent,akshare_sina,efinance,akshare_em

# 是否启用实时行情（关闭后使用历史收盘价分析）
# ENABLE_REALTIME_QUOTE=true

# 盘中实时技术面：启用时用实时价计算 MA/多头排列（Issue #234）；关闭则用昨日收盘
# ENABLE_REALTIME_TECHNICAL_INDICATORS=true

# 是否启用筹码分布（该接口不稳定，云端部署建议关闭）
# ENABLE_CHIP_DISTRIBUTION=true

# 是否启用基本面聚合（新增 P0 能力）
# ENABLE_FUNDAMENTAL_PIPELINE=true

# 基本面聚合性能与稳定性参数（单位：秒）
# FUNDAMENTAL_STAGE_TIMEOUT_SECONDS=1.5
# FUNDAMENTAL_FETCH_TIMEOUT_SECONDS=0.8
# FUNDAMENTAL_RETRY_MAX=1
# FUNDAMENTAL_CACHE_TTL_SECONDS=120
# FUNDAMENTAL_CACHE_MAX_ENTRIES=256

# ===========================================
# Portfolio P0: 导入 / 风险 / 汇率降级配置
# ===========================================
# PORTFOLIO_RISK_CONCENTRATION_ALERT_PCT=35.0
# PORTFOLIO_RISK_DRAWDOWN_ALERT_PCT=15.0
# PORTFOLIO_RISK_STOP_LOSS_ALERT_PCT=10.0
# PORTFOLIO_RISK_STOP_LOSS_NEAR_RATIO=0.8
# PORTFOLIO_RISK_LOOKBACK_DAYS=180
# PORTFOLIO_FX_UPDATE_ENABLED=true

# 东财接口补丁：东财/Efinance/Akshare 东方财富接口频繁失败（RemoteDisconnected、连接被关闭）时建议开启
# 开启后会注入 NID 令牌与随机 User-Agent，降低被东财限流概率
# ENABLE_EASTMONEY_PATCH=false
