Files
daily_stock_analysis/.env.example
mumu e642f776c8 feat: multi-channel LLM support with visual channel editor (#494)
* feat: multi-channel LLM support with visual channel editor

- Add three-tier LLM config: LITELLM_CONFIG (YAML) > LLM_CHANNELS (env) > legacy keys
- Each channel gets independent base_url / api_key / models (no OPENAI_BASE_URL conflict)
- Support DEEPSEEK_API_KEY as standalone provider (auto-infers deepseek-chat model)
- Add LLMChannelEditor component with 9 presets (AIHubmix/DeepSeek/Dashscope/GLM/Moonshot/SiliconFlow/OpenRouter/Gemini/Custom)
- Expand config_registry with ~50 new fields for web settings coverage
- Rewrite .env.example AI section with clear quick-start guide (Scenario A vs B)
- Add litellm_config.example.yaml template
- Add PyYAML dependency for YAML config support
- Full backward compatibility: existing single-key configs work unchanged

* chore: replace placeholder key values with empty defaults in .env.example

* fix: resolve ESLint errors in LLMChannelEditor and HomePage

* refactor: use native litellm deepseek/ provider and extract shared LLM helpers

- Replace openai/deepseek-* + manual api_base with deepseek/ prefix (litellm
  natively resolves DEEPSEEK_API_KEY and base_url)
- Extract duplicated _get_api_keys_for_model and _extra_litellm_params from
  analyzer.py and llm_adapter.py into shared functions in config.py
- Update litellm_config.example.yaml to use deepseek/ prefix
- Thinking mode (deepseek-chat opt-in, deepseek-reasoner auto) unaffected:
  get_thinking_extra_body uses model short name stripped of provider prefix
2026-03-06 21:14:34 +08:00

404 lines
17 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ===================================
# A股自选股智能分析系统 - 环境变量配置模板
# 复制此文件为 .env 并填入真实配置
# ===================================
# 自选股列表(逗号分隔,支持沪深两市代码)
# 沪市600xxx, 601xxx, 603xxx
# 深市000xxx, 002xxx, 300xxx
STOCK_LIST=600519,300750,002594
# 数据源配置
# Tushare Pro Token可选从 https://tushare.pro/weborder/#/login?reg=834638 获取)
TUSHARE_TOKEN=
# ===================================
# 定时任务配置(本地/Docker运行
# ===================================
# SCHEDULE_ENABLED=true
# SCHEDULE_TIME=18:00
# 启动时是否立即运行一次(默认 true
# SCHEDULE_RUN_IMMEDIATELY=false
# 交易日检查:默认 true非交易日跳过执行设为 false 或使用 --force-run 可强制执行Issue #373
# TRADING_DAY_CHECK_ENABLED=true
# ===================================
# AI 模型配置
# ===================================
#
# 【快速上手 — 根据使用场景选一种即可】
#
# 场景 A只用一个模型最简单
# → 填对应 API Key 即可,系统自动识别模型。
# 例:只用 Gemini → 填 GEMINI_API_KEY
# 例:只用 DeepSeek → 填 DEEPSEEK_API_KEY
# 例:想用 AIHubmix 聚合 → 填 AIHUBMIX_KEY
#
# 场景 B同时使用多个模型/平台(推荐渠道模式)
# → 配置 LLM_CHANNELS每个渠道独立填 base_url / api_key / models。
# 也可在 Web 设置页 → AI 模型 → 渠道编辑器中可视化配置。
# 详见下方「多渠道配置」区域。
#
# ⚠️ 两种方式不要混用:配了渠道后,传统 API Key 区域的配置会被忽略。
#
# 高级选项(通常无需手动设置,可自动推断):
# LITELLM_MODEL 主模型,格式 provider/model-name
# LITELLM_FALLBACK_MODELS 备选模型,逗号分隔
# ===================================
# LITELLM_MODEL=gemini/gemini-3-flash-preview
# LITELLM_FALLBACK_MODELS=anthropic/claude-3-5-sonnet-20241022,openai/gpt-4o-mini
# -----------------------------------
# API Key 配置(场景 A只用一个模型
# -----------------------------------
# 【Gemini】免费额度https://aistudio.google.com
GEMINI_API_KEY=
# 多 Key 负载均衡GEMINI_API_KEYS=key1,key2,key3
GEMINI_TEMPERATURE=0.7
# 【DeepSeek】https://platform.deepseek.com
# DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx
# 【推荐】AIHubmix 聚合https://aihubmix.com/?aff=CfMq
# 一个 Key 用 GPT/Claude/Gemini/GLM/Qwen 等模型,无需科学上网
# AIHUBMIX_KEY=
# 【Anthropic Claude】https://console.anthropic.com
# ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxx
# ANTHROPIC_TEMPERATURE=0.7
# 【OpenAI 兼容】适用于 OpenAI / 任意兼容 API
# OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
# OPENAI_BASE_URL=(官方可不填;第三方填对应地址)
# OPENAI_TEMPERATURE=0.7
# OPENAI_VISION_MODEL=gpt-4o
# 【其他】https://docs.litellm.ai/docs/providers
# 设好环境变量 + provider/model 格式即可(如 COHERE_API_KEY + cohere/command-r-plus
# -----------------------------------
# 多渠道配置(场景 B同时使用多个模型/平台)
# -----------------------------------
# 每个渠道独立配置 base_url / api_key / models互不冲突。
# 任何 OpenAI 兼容 APIDeepSeek、Qwen、GLM、Moonshot 等)都可以直接作为渠道添加。
#
# 示例AIHubmix + DeepSeek + Gemini 三渠道共存
# LLM_CHANNELS=aihubmix,deepseek,gemini
#
# LLM_AIHUBMIX_BASE_URL=https://aihubmix.com/v1
# LLM_AIHUBMIX_API_KEY=
# LLM_AIHUBMIX_MODELS=gpt-4o-mini,claude-3-5-sonnet,qwen-plus
#
# LLM_DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
# LLM_DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx
# LLM_DEEPSEEK_MODELS=deepseek-chat,deepseek-reasoner
#
# LLM_GEMINI_API_KEYS=key1,key2,key3
# LLM_GEMINI_MODELS=gemini/gemini-2.5-flash
#
# 高级YAML 配置(可选,标准 LiteLLM 格式,参考 litellm_config.example.yaml
# LITELLM_CONFIG=./litellm_config.yaml
# 搜索引擎配置(用于获取股票新闻)
# Tavily API Keys支持多个逗号分隔
TAVILY_API_KEYS=
# SerpAPI Keys支持多个逗号分隔
SERPAPI_API_KEYS=
# Brave Search API Keys支持多个逗号分隔
# 获取: https://brave.com/search/api/
BRAVE_API_KEYS=
# ===================================
# 新闻时效与分析筛选配置
# ===================================
# 新闻最大时效(天),搜索时限制结果在近期内,避免使用过时信息
# NEWS_MAX_AGE_DAYS=3
# 乖离率阈值(%),偏离 MA5 超过此值提示不追高;强势趋势股自动放宽到 1.5 倍
# BIAS_THRESHOLD=5.0
# ===================================
# Agent 策略对话配置Web 对话页)
# ===================================
# 启用 Agent 对话(默认 false
# AGENT_MODE=true
# 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 — 情绪周期(市场情绪高低点轮动)
#
# 推荐:趋势 + 金叉 + 缩量回踩(兼顾多种市场形态)
# 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=bull_trend,ma_golden_cross,volume_breakout,shrink_pullback
# 自定义策略目录(可选,放置自定义 YAML 策略文件)
# AGENT_STRATEGY_DIR=./strategies
# ===================================
# 通知渠道配置(可同时配置多个,全部推送)
# ===================================
#
# 【方式一】企业微信机器人
# 在企业微信群 -> 设置 -> 群机器人 -> 添加 -> 复制 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
#
# 【方式三】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、Outlook 等主流邮箱
# 1. 获取授权码以QQ邮箱为例设置 -> 账户 -> POP3/SMTP服务 -> 开启 -> 获取授权码
# 2. 填写下面两项即可:
#
# EMAIL_SENDER=
# EMAIL_PASSWORD=
# EMAIL_RECEIVERS=receiver@example.com # 可选,留空则发给自己
#
# 【方式四扩展】股票分组发往不同邮箱Issue #268可选
# 配置后,不同股票组的报告发送到对应邮箱;大盘复盘发往所有配置邮箱
# 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>)
# WEBHOOK_VERIFY_SSL=true # 默认校验。设为 false 可支持自签名证书。警告:禁用后存在 MITM 劫持风险,仅限可信内网
#
# 【方式六】Pushover 配置
# 注册Pushover账号并创建应用Token https://pushover.net/apps/build
# PUSHOVER_USER_KEY=
# PUSHOVER_API_TOKEN=
#
# 【方式七】PushPlus 配置(国内推送服务,推荐)
# 注册PushPlus账号并获取Token https://www.pushplus.plus
# PUSHPLUS_TOKEN=
# 群组推送:填写群组编码后,消息推送给群组所有订阅用户(一对多)
# PUSHPLUS_TOPIC=
#
# 【方式八】Discord 配置
# 支持两种方式Webhook推荐配置简单和 Bot API权限高
#
# 方式1Discord Webhook推荐无需 Bot 账号)
# 在 Discord 频道设置 -> 集成 -> Webhook -> 新建 Webhook -> 复制 URL
# DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/your_webhook_id/your_webhook_token
#
# 方式2Discord Bot API需要 Bot 账号和频道 ID
# 1. 创建 Bothttps://discord.com/developers/applications -> 新建应用 -> Bot -> 创建 Bot
# 2. 获取 Bot TokenBot 页面 -> 重置 Token
# 3. 获取频道 IDDiscord 开启开发者模式 -> 右键频道 -> 复制 ID
# DISCORD_BOT_TOKEN=
# DISCORD_MAIN_CHANNEL_ID=
#
# 【方式九】Server酱3 配置(国内推送服务,支持微信推送)
# 注册Server酱3账号并获取SendKey https://sc3.ft07.com/
# SERVERCHAN3_SENDKEY=
#
# 【高级配置】消息长度限制(字节)
# 超过限制会自动分批发送,一般无需修改
# FEISHU_MAX_BYTES=20000 # 飞书限制约 20KB默认 20000 字节
# WECHAT_MAX_BYTES=4000 # 企业微信限制 4096 字节,默认 4000 字节
#
# 【Markdown 转图片】
# 对不支持 Markdown 的渠道,将报告转为图片发送,提升可读性
# 需安装 wkhtmltopdfDocker 已内置),本地运行: apt install wkhtmltopdf 或 brew install wkhtmltopdf
# MARKDOWN_TO_IMAGE_CHANNELS=telegram,wechat,custom,email # 逗号分隔
# MARKDOWN_TO_IMAGE_MAX_CHARS=15000 # 超过此长度不转换,避免超大图片
# ===================================
# 单股推送配置(可选)
# ===================================
# 单股推送模式:每分析完一只股票立即推送,而不是汇总后推送
# SINGLE_STOCK_NOTIFY=false
#
# 报告类型simple(精简) 或 full(完整)
# Docker环境下如果推送内容不完整可以设置为 full
# REPORT_TYPE=simple
# 仅分析结果摘要:设为 true 时只推送汇总,不含个股详情
# REPORT_SUMMARY_ONLY=false
# 个股分析与大盘复盘合并推送(默认 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
# 飞书应用机器人配置
FEISHU_APP_ID=xxxx
FEISHU_APP_SECRET=xxxx
# 启用长连接模式
FEISHU_STREAM_ENABLED=false
# 数据库路径
DATABASE_PATH=./data/stock_analysis.db
# ===================================
# 回测配置(可选)
# ===================================
# 是否启用回测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=true
# 是否启用大盘复盘true/false
MARKET_REVIEW_ENABLED=true
# 大盘复盘市场区域cn(A股)、us(美股)、both(两者)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
# 最大并发线程数(建议保持低并发防封禁)
MAX_WORKERS=3
# 是否启用调试日志
DEBUG=false
# ===================================
# WebUI 配置(可选)
# ===================================
# 是否默认启动 WebUItrue/false默认 false
WEBUI_ENABLED=false
# WebUI 监听地址(默认 127.0.0.1Docker/Compose 场景需要 0.0.0.0 才能从宿主机访问端口映射)
WEBUI_HOST=127.0.0.1
# WebUI 监听端口(默认 8000
WEBUI_PORT=8000
# 启动 Web 服务前是否自动构建前端npm install && npm run build默认 true
WEBUI_AUTO_BUILD=true
# 反向代理下信任 X-Forwarded-For 获取真实 IPNginx/Cloudflare 前置时设为 true直连公网时保持 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
# 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
# 东财接口补丁:东财/Efinance/Akshare 东方财富接口频繁失败RemoteDisconnected、连接被关闭时建议开启
# 开启后会注入 NID 令牌与随机 User-Agent降低被东财限流概率
# ENABLE_EASTMONEY_PATCH=false