Skip to content

Release history

Daily Stock Analysis releases

All releases

24 shown

Review required
v3.20.0 Mixed
Auth RCE / SSRF

AlphaSift, MiniMax-M3, Windows fix

No immediate action
v3.19.0 Mixed

Diagnostics + market phase + P7 alarm + autocomplete

No immediate action
v3.18.0 Mixed

Alert center upgrade + new strategies + US data adapters

No immediate action
v3.17.1 New feature

Alert API MVP

No immediate action
v3.17.0 Maintenance

Routine maintenance and dependency updates.

v3.16.0 New feature
Notable features
  • Web homepage market‑review trigger with task polling and inline report output
  • Notification routing by report, alert, and system_error with one‑click channel testing in settings
  • Multilingual help infrastructure for core configuration fields (selected stock list, LLM model, etc.)
Full changelog

发布亮点

  • feat: Web 首页新增“大盘复盘”触发入口、任务轮询与完成后报告直出;首次启动配置状态可提示缺口并引导到系统设置。
  • feat: 新增通知路由策略,支持按 report、alert、system_error 将通知收窄到指定渠道;Web 设置页支持通知渠道一键测试。
  • feat: 系统设置页新增配置项帮助入口与多语言帮助文案基础设施,首批覆盖自选股、LLM 主模型、LLM 渠道、飞书 Webhook 与 WebUI 监听地址。
  • improve: 大盘复盘 API、CLI、Bot 共用 build_market_review_runtime 装配路径,补齐 litellm_model / llm_model_list 与 legacy key 回退说明。
  • improve: 个股报告操作建议结合支撑/压力、量能、筹码与主力资金流校准,减少买入/卖出剧烈切换,并补强 Agent 决策兜底。
  • improve: Docker 镜像支持非 root 用户运行,LiteLLM 依赖约束放宽到后续安全 1.x 修复版本。
  • fix: 修正 LLM 渠道测试中 Model disabled、provider blocked 等错误分类,避免被误报为网络异常。
  • fix: 港股日线跳过不支持港股的内置历史数据源;北交所 BJ 前缀与 .BJ 后缀代码校验保持一致。
  • fix: Web 大盘复盘按钮可观测性、Windows fallback 锁进程探测和催化线索展示更稳健。
  • docs: 新增文档中心与配置帮助维护说明,清理 README、完整指南与配置指南中的临时 PR/文档同步说明。

What's Changed

  • feat: Add a Web home market-review trigger with task polling and inline report display; setup status now points users to missing configuration.
  • feat: Add notification routing by report, alert, and system_error; add one-click notification channel testing in Web settings.
  • feat: Add settings field help infrastructure with multilingual help text for the first batch of core configuration fields.
  • improve: Share build_market_review_runtime across API, CLI, and Bot market review paths; document litellm_model / llm_model_list and legacy key fallback behavior.
  • improve: Calibrate stock advice with support/resistance, volume, chips, and main-force capital flow; strengthen Agent decision fallback behavior.
  • improve: Run Docker images as a non-root user and relax LiteLLM constraints to allow safe future 1.x fixes.
  • fix: Classify Model disabled, provider blocked, and related LLM channel test errors more accurately instead of reporting them as generic network failures.
  • fix: Avoid unsupported built-in historical providers for Hong Kong daily data; align Beijing Stock Exchange BJ prefix and .BJ suffix validation.
  • fix: Improve Web market-review observability, Windows fallback lock probing, and market catalyst snippet rendering.
  • docs: Add the documentation index and settings-help maintenance guide; remove temporary PR/doc-sync notes from README and user-facing guides.

What's Changed

🤖 AI & Analysis

  • fix: 建立通知能力 P0 基线 (#1200) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1205
  • feat: 支持 P1 Web 通知渠道一键测试 (#1200) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1218
  • feat: [issue #1199 PR1] add settings field help dialog infrastructure by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1204
  • Fix market review catalyst snippets by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1241
  • feat: [Issue #1200 P3] 支持通知路由策略 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1248
  • Stabilize actionable stock decisions by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1245
  • Add web market review trigger by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1242

📡 Data Sources

  • Fix HK historical data provider routing by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1232

🔔 Notifications

  • docs #1200: 产品化自定义 Webhook Body 模板 P2 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1226

⚙️ Configuration

  • Relax LiteLLM version constraint by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1201
  • docs: Clean root helper files by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1203
  • fix: 修正 LLM Model disabled 诊断 (#1208) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1211
  • fix: 修正 LLM 渠道测试请求被拦截误报为网络异常 (#1223) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1225
  • Show home setup status hint by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1243
  • docs: Remove transient PR notes from docs by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1255

🧪 Testing

  • fix: 北交所股票处理差异,异常 (#1234) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1235

📝 Documentation

  • chore: implement non-root execution for Docker by @RinZ27 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1214
  • docs: 新增文档中心并优化 README 联系区 by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1247

New Contributors

  • @RinZ27 made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1214

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.15.0...v3.16.0

v3.15.0 Bug fix
Notable features
  • Add Anspire OpenAI-compatible LLM gateway support via ANSPIRE_API_KEYS
  • Custom webhook body templates with CUSTOM_WEBHOOK_BODY_TEMPLATE
  • Price change percent event alerts in EventMonitor
Full changelog

发布亮点

  • LLM 渠道配置体验继续升级:新增 Anspire OpenAI-compatible 网关接入,并补齐常用服务商预设、官方来源、能力标签、配置注意事项和 GitHub Actions 显式映射。
  • Web LLM 配置检测更可诊断:细分错误 reason,并支持用户显式触发 JSON、tools、vision、stream 运行时 smoke。
  • LLM 运行时配置清理更稳健:只清理托管 provider 的失效运行时选择,并保留 cohere/*google/*xai/* 等直连 provider 兼容语义。
  • 通知与 Bot 状态可观测性增强:自定义 Webhook 支持 JSON body 模板,Bot /status 展示更完整的 LLM、Agent 与通知渠道状态。
  • 大盘复盘、实时告警、Agent weak 兜底和持仓估值继续补强,降低默认值覆盖、缺价污染和配置排障成本。

新功能

  • 支持 ANSPIRE_API_KEYS 默认接入 Anspire OpenAI-compatible 大模型网关,并在 LLM 渠道编辑器补充 Anspire Open 预设。
  • 自定义 Webhook 支持 CUSTOM_WEBHOOK_BODY_TEMPLATE JSON body 模板,便于适配 AstrBot、NapCat 和自建推送服务。
  • 大盘复盘结构化区块新增大盘红绿灯结论,基于盘面温度输出 green/yellow/red、核心原因和操作建议。
  • EventMonitor 支持 price_change_percent 涨跌幅阈值规则,可按上涨或下跌方向触发实时告警。
  • Web LLM 渠道编辑器新增常用服务商配置模板与预设,覆盖 MiniMax、火山方舟、OpenAI、Claude、Gemini、Kimi、Qwen、GLM、豆包等入口。

改进

  • Web LLM 配置检测补充细分错误分类,并新增显式触发的 JSON/tools/vision/stream 运行时 smoke;默认测试和保存流程不变,检测结果仅作为当前配置的一次 best-effort 诊断。
  • Bot /status 展示统一 LLM 主模型、Agent 模型、渠道模式、YAML 配置和更多通知渠道状态。
  • Web LLM 渠道编辑器展示 provider 能力标签、官方来源链接和配置注意事项提示;这些标签仅用于配置参考,不代表运行时能力已验证通过。
  • 抽出 Web LLM provider preset 单一模板数据源,保持现有配置保存语义不变。
  • 补齐 LLM provider channel 在 GitHub Actions 中的显式映射,并同步 .env 示例与配置文档。

修复

  • Agent weak 完整性兜底在模型缺少评分、趋势、操作建议或 dashboard 关键块时优先保留本地趋势分析结果,并只补齐真正缺失的仪表盘字段,避免首页评分被默认 50 覆盖。
  • 统一持仓快照输出现价、市值、浮盈亏、收益率与价格元信息,避免缺价或 stale 价格污染持仓估值。
  • LLM 渠道测试补充结构化诊断与设置页排障提示,便于定位 provider、模型、Base URL 和鉴权配置问题。
  • 明确 runtime 清理兼容边界:仅对托管 provider(geminivertex_aianthropicopenaideepseek)触发保存前失效值清理,cohere/*google/*xai/* 直连值按 legacy 兼容路径保留,不做无提示迁移或覆写。
  • 将 MiniMax 预设调整为官方 OpenAI-compatible Base URL 和当前模型示例,并补充 MiniMax、火山方舟、LiteLLM 兼容来源与回退说明。
  • 移除截图识别对 Gemini 3 Vision 模型的过时降级逻辑,默认推断改用当前 Gemini 模型配置。

文档

  • 完善 LLM provider 配置文档,补充配置方式选择、Actions 变量对照、运行时检测边界、错误 reason 排障和回滚路径(#1180)。
  • 补充 LLM 渠道编辑器的官方来源、依赖兼容窗口、保存时的运行时模型清理规则,以及旧配置回退路径说明。
  • cohere/*google/*xai/* 直连语义补充官方 provider/model 说明、litellm>=1.80.10,<1.82.7 兼容依据引用,并明确示例模型名仅为配置保留行为说明而非可用性背书。
  • 明确 price_change_percent 事件告警仅为配置与运行时规则扩展,未变更模型/provider/base URL/LiteLLM 兼容语义;回退路径为关闭/移除 Event Monitor 配置。
  • 同步 README、DEPLOY、full-guide、Anspire、AIHubMix 与 SerpAPI 相关说明,统一外链、配置口径和评审一致性说明。

测试

  • 补齐 AI 配置页与 task_queue 的 LLM 运行时清理/同步回归证据:恢复渠道模型时保留 fallback、编辑模型列表期间不静默清空运行时选择,渠道无可用模型时清理失效 runtime 引用,并覆盖 legacy key 与 cohere/*google/*xai/* 直连 provider 保留语义。
  • 覆盖 Web LLM 配置检测的细分错误分类,以及 JSON、tools、vision、stream 运行时 smoke 的显式触发路径。

What's Changed

🤖 AI & Analysis

  • feat: add market light summary to reviews by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1177
  • chore: land #1180 P1 LLM Actions mapping by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1190
  • feat: add Anspire Open LLM support by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1193
  • docs: sync Anspire Open docs and deployment guides by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1195
  • fix: 在 agent_weak 完整性兜底链路中保留本地已有的 sentiment_score、趋势… (#1188) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1194

🔔 Notifications

  • feat: support custom webhook body templates by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1173

⚙️ Configuration

  • fix: 修复 task_queue、持仓估值与 LLM 诊断 (#1124) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1146
  • feat: add LLM provider setup templates and presets by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1175
  • feat: add price change event alerts by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1178
  • fix: clean stale LLM runtime selections on save by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1152
  • feat: 增强 Web LLM 配置检测与错误分类 P3 (#1180) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1196
  • docs: 完善 LLM provider 配置文档 P4 (#1180) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1198

🧪 Testing

  • feat: improve bot status configuration summary by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1174
  • chore: 抽出 Web LLM provider template P0 真源 (#1180) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1185
  • feat: 将 Web LLM provider 配置提示 P2 落到 main (#1180) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1191

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.14.2...v3.15.0

v3.14.2 New feature
Notable features
  • Hong Kong market review support
  • Combined Agent strategy support in Ask with clearer missing-config/fallback error semantics
  • Read‑only setup status endpoint for onboarding and smoke runs
Full changelog

中文

v3.14.2 主要聚焦复盘、问股和首次配置体验:

  • 大盘复盘支持港股,并统一 Bot /market 的交易日过滤语义。
  • 问股支持多个 Agent 策略组合,配置缺失与 Agent fallback 的错误语义更清晰。
  • LLM 返回非法 JSON 时会继续尝试备用模型,LiteLLM DEBUG 日志默认降噪。
  • 新增只读首次启动配置状态接口,为后续配置向导和 smoke run 做准备。

English

v3.14.2 focuses on market review, Ask/Agent, and first-run setup readiness:

  • Adds Hong Kong market review support and aligns Bot /market trading-day filtering.
  • Supports combined Agent strategies in Ask and improves missing-config / fallback error semantics.
  • Continues to fallback models on invalid LLM JSON responses and quiets LiteLLM DEBUG logs by default.
  • Adds a read-only setup status endpoint for future onboarding and smoke-run flows.
v3.14.1 Maintenance

Minor fixes and improvements.

Full changelog
  • [测试] 修正大盘复盘 prompt 测试对“明日交易计划”标题的断言,并同步桌面端版本号,恢复发布 gate。

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.14.0...v3.14.1

v3.14.0 Bug fix
Notable features
  • 桌面端自动检测 GitHub Release 并跳转下载页面(#1114)
  • Web 首页新增重新分析入口,支持基于原始 prompt 重做同一只股票同日期的分析
Full changelog

发布亮点

  • 📊 大盘复盘升级为盘后工作台式结构 — A 股复盘固定输出盘面温度、指数明细、板块 Top 表、新闻催化、明日交易计划和风险提示,减少纯文字复盘的重复与空泛。
  • 🖥️ 桌面端新增 GitHub Release 更新提醒 — Windows/macOS 桌面端启动后自动检测新版本,也可从设置页手动检查并跳转下载页。
  • 🤖 Pipeline Agent 数据加载大幅降噪 — K 线工具改为 DB-first 并预热 240 天历史数据,避免同一只股票重复 HTTP 请求。
  • 🐳 Docker 发布链路整理 — 发布工作流收敛为正式发布与手动补发两条路径,官方 Docker Hub 镜像名统一为 zhulinsen/daily_stock_analysis
  • 🔧 LLM 渠道与 DeepSeek V4 配置补强 — GitHub Actions 定时分析补齐多渠道变量透传,DeepSeek 官方渠道预设与示例同步到 V4。
  • 🧩 桌面端静态资源一致性校验 — 打包链路和运行时都能更早发现静态资源错配,降低 Release 包白屏排查成本。

新功能

  • 🏠 Web 首页历史报告区新增重新分析入口 — 支持基于原始 prompt 重做同一只股票同日期的分析。
  • 🖥️ Windows/macOS 桌面端新增 GitHub Release 更新提醒 — 启动后自动检测新版本,并支持从设置页手动检查后跳转下载页。

改进

  • 📊 A 股大盘复盘报告改为结构化盘后工作台版式 — 固定输出盘面温度、指数明细、板块 Top 表、新闻催化和明日交易计划。
  • 🐳 Docker 发布工作流收敛 — 更清晰地区分正式发布与手动补发链路,并统一官方 Docker Hub 镜像名为 zhulinsen/daily_stock_analysis
  • 🤖 Agent 日线工具优先复用本地缓存 — 同时持久化新获取的日线与新闻情报,减少重复数据源调用。

修复

  • 🤖 Pipeline Agent K 线工具 DB-first 加载get_daily_history / analyze_trend / calculate_ma / get_volume_analysis / analyze_pattern 改为优先读取本地 DB,消除同一只股票 9x5=45 次重复 HTTP 请求(Fixes #1066)。
  • 🤖 Pipeline Agent 执行前按需预热 240 天 K 线历史到 DB — 正常情况下 K 线工具调用无需重复网络请求。
  • 🕒 冻结 target_date 并通过 ContextVar 透传到 Pipeline Agent K 线工具线程 — 消除跨收盘边界时间漂移。
  • 🪟 Windows 桌面端后端日志转抄编码修复 — 转抄 stdout/stderr 时优先使用 UTF-8,并兼容本地代码页回退,避免中文日志乱码。
  • ⚙️ GitHub Actions 每日分析工作流补齐 LLM 渠道变量透传 — 支持 LLM_CHANNELS、多 Key 与常用 LLM_<NAME>_*,避免本地可用的多模型配置在云端定时任务中失效(Fixes #1063, #872)。
  • 📈 历史报告详情接口修正 change_pct 取值 — 使用 is None 判断避免把 0.0(平盘)当作缺失值丢弃,移除错误的 change_60d 兜底,并在缺失时回退到原始实时行情字段(Fixes #1084)。
  • 🔧 DeepSeek 官方渠道预设与示例配置同步到 V4 — 保留 legacy deepseek-chat 默认值并增加废弃提示,同时修正模型发现后旧运行时选择导致保存失败的问题(Fixes #1108, #1109)。
  • 🧩 桌面端打包链路新增静态资源一致性检查scripts/check_static_assets.py 会在源 static/ 与 PyInstaller 产物中校验 index.html 引用的资源是否真实存在,运行时也会在错配时写入明确日志,避免重现 Release 包打开后白屏(Refs #1064 / #1065 / #1050)。
  • 🧩 后端 /assets/* 改为显式路由托管 — 资源缺失时返回与请求扩展名匹配的 text/javascript / text/css 404,减少默认 JSON 错误响应带来的排查误导(Refs #1064)。
  • 🌙 kimi-k2.6 自动使用固定温度 — 主分析、大盘复盘和 Agent 调用该模型时自动使用 temperature=1.0,避免模型拒绝默认温度请求(Fixes #1102)。

文档

  • 🐳 补充官方 Docker 镜像使用说明 — 增加镜像拉取、docker run 用法与 .env / 数据目录映射说明,不再只覆盖 Compose 部署路径。
  • 📨 修正飞书自定义机器人 Webhook 示例feishu_sender.py 中的示例改为 interactive card JSON,并补充飞书自动化 Webhook 触发器配置教程。
  • 📚 优化根 README 结构 — 保留首页级功能特性、技术栈、快速开始、推送效果、Web、Agent、赞助商和新闻源入口,将细配置、交易纪律和基本面语义收口到完整指南,并将 Docker 徽章指向官方镜像页。
  • 🌐 同步英文与繁中 README 的精简入口结构 — 同时补齐完整指南中的 LLM 用量 API 与持仓管理说明。
  • 🤝 调整 AI 协作与 PR 模板中的 README 维护规则 — 明确 README 非必要不更新,细节优先进入专题文档。

测试

  • 🧪 稳定市场复盘相关测试的 LiteLLM stub 行为 — 避免本机安装的 LiteLLM 在测试收集顺序变化时影响市场复盘单元测试。
  • 🧪 pytest 默认跳过前端依赖目录 — 本地存在 apps/dsa-web/node_modules 时不再被后端测试递归扫描,避免发布前 gate 被无关目录拖慢。

What's Changed

🤖 AI & Analysis

  • [fix] Map LLM channel envs in daily analysis workflow by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1112
  • feat: 实现 Agent 数据缓存与持久化 (#1040) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1117
  • feat: 桌面端自动更新,当有新包发布时自动提醒 (#1114) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1118
  • [fix] Support Kimi K2.6 fixed temperature by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1113

🔔 Notifications

  • Fix Feishu webhook format docs and add webhook trigger setup guide by @liquid207 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1078

⚙️ Configuration

  • [fix][feat] #1108 #1109: 同步 DeepSeek V4 渠道配置 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1110

🧪 Testing

  • fix: Pipeline Agent K 线工具 DB-first 加载 + 冻结 target_date 消除重复请求 (Fixes #1066) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1099
  • feat(web): add reanalyze button to home dashboard with force_refresh by @pillsilly in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1008
  • fix: preserve change_pct in history detail (#1084) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1119
  • docs: streamline README documentation by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1120
  • fix: detect stale static bundles in build pipeline and at runtime (#1064) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1121

🔀 Other Changes

  • ci: ignore vendored node modules in lint config by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1122

New Contributors

  • @pillsilly made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1008
  • @liquid207 made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1078

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.13.0...v3.14.0

v3.13.0 Bug fix
Notable features
  • Integrated Ainspire search for enhanced stock discovery
  • Added Longbridge data source to supplement US stock data
Full changelog

See CHANGELOG for details.

What's Changed

🤖 AI & Analysis

  • feat:修复美股数据丢失,新增长桥数据源 by @BIGBbox in https://github.com/ZhuLinsen/daily_stock_analysis/pull/981
  • feat: 让普通股票分析链路在尽量不破坏现有接口契约的前提下支持 LiteLLM 流式输出… (#865) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/924
  • 集成Anspire search by @xinzhifan4 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/982
  • feat(workflow): make analysis job timeout configurable via vars by @zerubeus in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1014
  • fix: 让大盘复盘链路在 REPORT_LANGUAGE=en 时输出英文 Markdown… (#1029) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1030
  • fix: inject REPORT_LANGUAGE into workflow and add current_price to status API (#1013, #983) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1028
  • fix: 版本号不对 by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1048
  • fix: handle efinance index open column fallback by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1051

🐛 Bug Fixes

  • Fix: multi-agent AGENT_MAX_STEPS not respecting user override & skill agent graceful degradation by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1031

📡 Data Sources

  • fix: stock name 港股获取不了了 (#940) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/964
  • fix: 缺失值判断逻辑不应静默吞掉非预期异常 (#996) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/997
  • Feat/tushare增加港股查询支持 by @jiangmin168168 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/994
  • feat: 让后端优先复用现有 stocks.index.json 解析股票名称映射,在缺失时保持现有回退链路… (#1027) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1033
  • fix: return latest trade date on non-trade days for chip distribution… by @SophiaJiaLi in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1067

🔔 Notifications

  • refactor: 飞书根本没法配置成功 (#832) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/920

⚙️ Configuration

  • fix: resolve MiniMax-M2.7 connection test failures by @ouyangmland in https://github.com/ZhuLinsen/daily_stock_analysis/pull/975
  • fix: 修复 SQLite 写入链路逐行更新导致的锁竞争与性能问题 (#878) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/927
  • feat: 支持/v1/models路径获取所有支持模型 (#830) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/919
  • fix: use per-agent max_steps as ceiling instead of override by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1001

🧪 Testing

  • fix: 移除 HistoryItem 响应 Schema 中 sentiment_score 的… (#942) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/962
  • fix: pin get_market_now in realtime indicator tests to avoid CST/UTC date shift by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/986
  • fix: 部署完以后 webUI UI异常变大 布局异常 (#944) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/965
  • feat: [Bug] 公司公告和主力资金流搜索经常无法纳入分析 (#976) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/977
  • fix: 在 ask.py 的 _load_skills() 和… (#968) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/972
  • fix: 在 agent_chat_stream 的 finally 清理块中区分… (#969) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/973
  • fix: 在 api/v1/endpoints/analysis.py 的 SSE 生成器 except… (#967) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/971
  • fix: 在技能加载链路的所有静默 except 块中补充 logger.warning(… (#970) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/974
  • fix: add minimum time budget guard for agent stages and steps by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1003
  • fix: detect and handle RateLimitError and ContextWindowExceeded in LLM adapter by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1002
  • fix: wrap optional pipeline services in try/except for graceful degradation by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1004

📝 Documentation

  • refactor: 在中英文 FAQ 中补充 Ollama 连接失败(OllamaException /… (#854) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/963
  • refactor: 补充一份最小化文档说明,明确 Docker 安装场景下应以 Git tag/镜像 tag 判断版本… (#1091) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1093

New Contributors

  • @ouyangmland made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/975
  • @BIGBbox made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/981
  • @xinzhifan4 made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/982
  • @jiangmin168168 made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/994
  • @SophiaJiaLi made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/1067

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.12.0...v3.13.0

v3.12.0 Mixed
Security fixes
  • Discord 入站 Webhook 补齐 Ed25519 验签,缺失或不匹配时拒绝请求并防御重放攻击 (timestamp ±5 min)
Notable features
  • 回测页新增“次日验证 / 1 日窗口”视图,可按股票与日期范围比较 AI 预测与实际涨跌
  • Web 设置页新增版本信息卡片,展示 WebUI 版本、构建标识与时间
  • Windows 桌面安装器支持自选安装目录
Full changelog

发布亮点

  • 📊 回测页新增"次日验证"视图 — 可按股票与日期范围查看 AI 预测 vs 次日实际涨跌,复用历史分析与 1 日回测结果,快速验证分析准确率。
  • 🔧 LLM 接入体验简化 — 用户侧文案统一收口为"主模型 / 备选模型 / 模型渠道",不再把 LiteLLM 当作普通用户必学概念,现有配置键保持兼容。
  • 🐳 Docker / WebUI 运行时稳态补强 — 修复系统设置保存后配置不生效、启动早期日志缺失、预构建静态资源复用等问题,降低容器化部署的运维摩擦。
  • 🔒 安全与并发稳定性同步增强 — Discord 入站 Webhook 补齐 Ed25519 验签,修复并发执行时共享状态未加锁、单股推送模式通知并发复用等问题。
  • 🖥️ 桌面端与定时任务细节打磨 — Windows 安装器支持自选安装目录,内置定时调度器感知运行中 SCHEDULE_TIME 变更,断点续传改按市场时区判断。

新功能

  • 📊 回测页新增"次日验证 / 1 日窗口"视图 — 可按股票代码与分析日期范围查看 AI 预测、次日实际涨跌及筛选区间准确率,复用历史分析与 1 日回测结果实现。
  • 🏷️ Web 设置页新增版本信息卡片apps/dsa-web 现在会在构建时注入前端包版本与构建时间,系统设置页新增只读"版本信息"区块,展示 WebUI 版本 / 构建标识 / 构建时间;当 package.json 仍为占位版本 0.0.0 时,会自动回退为构建标识,方便 Docker 重建后快速确认当前静态资源是否已经生效。
  • 🪟 Windows 桌面安装器支持自选安装目录 — 安装器改为支持在安装向导中自定义安装目录,安装到非默认盘符后仍沿用现有打包态目录逻辑在安装目录旁读写 .envdata/stock_analysis.dblogs/desktop.log,同时保留 win-unpacked 免安装分发方式。安装器仅支持当前用户安装、已禁用管理员提权(allowElevation: false),并通过 NSIS .onVerifyInstDir 阻止选择系统保护目录。

改进

  • 🔎 SerpAPI 正文补抓范围收敛 — 自然搜索结果不再逐条同步抓取网页正文;现在仅对极少数高位且摘要明显不足的结果,在更短超时预算内做延迟补抓,并优先复用 SerpAPI 已返回的结构化摘要,降低搜索链路尾延迟与慢站点放大风险。
  • 🤖 LLM 接入体验简化 — 面向用户的 AI 模型接入文案已统一收口为"主模型 / Agent 主模型 / 备选模型 / 模型渠道 / 高级模型路由配置";Web 设置页、配置元数据、校验提示与中英文文档不再把 LiteLLM 当作普通用户默认必学概念,现有 LITELLM_* / LLM_CHANNELS 配置键仍保持兼容。

修复

  • 🚀 启动早期失败时暴露真实根因python main.py 现在通过 stderr 暴露真实根因,bootstrap 阶段不再向硬编码 logs/ 目录写入文件日志,文件日志推迟到 config.log_dir 可用后创建,避免健康启动在非预期路径残留日志文件。
  • 🐳 Docker WebUI 运行时优先复用预构建静态资源prepare_webui_frontend_assets() 现在会先检查镜像内已有的 static/index.html 是否可直接复用;当容器运行时不包含 apps/dsa-web 源码目录且未安装 npm 时,也不会误报"未找到前端项目,无法自动构建",从而恢复 Docker 部署后的 WebUI 打开能力。
  • 🐳 Docker WebUI 系统设置保存后配置生效 — Docker 场景下 WebUI 保存 STOCK_LISTSCHEDULE_ENABLEDSCHEDULE_TIMESCHEDULE_RUN_IMMEDIATELYRUN_IMMEDIATELY 后,Config 会优先读取持久化 .env 中的新值,避免被容器创建时注入的旧环境变量覆盖。
  • 📈 市场复盘 LLM max_tokens 提升 — 市场复盘生成链路将 LLM max_tokens2048 提升到 8192,降低长复盘输出因 MAX_TOKENS 提前截断导致内容未完成的概率。
  • 内置定时调度器感知 SCHEDULE_TIME 运行时变更 — 调度器现在会在运行中感知 WebUI 保存后的 SCHEDULE_TIME 变化,并在下一轮检查时重绑 daily job。
  • 🪟 Windows Release 渠道编辑器保留 MiniMax 模型前缀 — 渠道模式下填写 minimax/<模型名> 时,后端归一化与 Web 设置页运行时模型列表都会保留该值原样,不再误改写成 openai/minimax/<模型名>
  • 🤖 Discord 入站 Webhook 补齐 Ed25519 验签DiscordPlatform 现在会基于 X-Signature-Ed25519X-Signature-Timestamp 和原始请求体校验 Discord Interaction 签名;缺失签名头、公钥格式非法或签名不匹配时直接拒绝请求,同时对 timestamp 做 ±5 分钟时效窗口校验以防御重放攻击。
  • ⚙️ STOCK_GROUP_N / EMAIL_GROUP_N 配置关系明确化 — 明确与 STOCK_LIST 的关系,并在配置校验中对超出 STOCK_LIST 的邮件分组给出 warning。
  • 🗓️ 断点续传改按市场时区和交易日历判断(fixes #880)— 股票数据存在性检查不再直接使用服务器自然日,而是按 A 股 / 港股 / 美股各自市场时区解析"最新可复用交易日"。
  • 📨 单股推送模式不再并发复用共享通知实例StockAnalysisPipeline.run() 现在会保留个股分析并发,但把 SINGLE_STOCK_NOTIFY=true 下的即时通知挪到结果收集侧串行发送。
  • 🔇 实时行情降级提示收口为单次告警 — 分析主流程获取股票名称时不再提前触发一次实时行情查询,只有在全部数据源都不可用时才提示已降级为历史收盘价继续分析。
  • 🔍 A 股中文资讯搜索恢复中文优先search_stock_news() 现在会在首个 provider 主要返回英文资讯时继续尝试后续引擎,并将同批结果中的中文资讯排到前面。
  • 🔒 并发执行时共享状态补齐统一加锁 — 修复并发执行时共享状态缺少统一加锁的问题,避免多线程场景下的数据竞争。

测试

  • 🧪 补充设置页版本信息回归测试 — 新增 Web 设置页版本信息渲染断言,并覆盖占位版本 0.0.0 自动回退为构建标识的逻辑。

What's Changed

🤖 AI & Analysis

  • fix: 将市场复盘生成链路的 LLM max_tokens 从 2048 提升到 8192… (#863) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/923
  • fix: 修复 WebUI 修改 SCHEDULE_TIME 后运行中的本地内置调度器仍固定在… (#819) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/914
  • fix: 在不修改 GitHub Actions workflow 的前提下… (#860) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/931
  • fix: 修复启动早期失败时日志缺失与根因不透明问题 (#839) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/932

📡 Data Sources

  • fix: 修复并发执行时共享状态缺少统一加锁的问题 (#881) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/928
  • fix: 减少实时行情链路的误报和重复调用,让系统只有在全部数据源都不可用时才对用户提示“实时行情获取失败” (#792) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/905

⚙️ Configuration

  • feat: 版本查询 (#901) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/907
  • feat: release的win客户端不能用minimax模型 (#826) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/917
  • feat: 为 Windows 桌面安装包增加“安装时可选择目标目录”的能力… (#827) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/918
  • fix: 为 Discord Webhook 请求补充签名验证 (#896) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/934
  • fix: 修复 Docker 场景下 WebUI 系统设置保存后对自选股与定时相关配置不生效… (#765) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/911
  • feat: 隐藏 LiteLLM 实现细节,简化用户侧模型接入体验 (#875) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/925

🧪 Testing

  • fix: docker方式部署不能打开web页面 (#796) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/906
  • feat: 收敛 SerpAPI 正文抓取范围,降低搜索链路尾延迟 (#882) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/898
  • fix: 修复单股推送模式下通知链路的共享实例并发复用问题 (#876) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/899
  • fix: 修复断点续传按自然日判断数据存在性的逻辑 (#880) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/900
  • fix: 让 A 股/中文场景下的“相关资讯”恢复中文优先,避免更新后被英文搜索结果直接占满 (#825) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/916
  • feat: 基于现有分析历史与回测结果,提供按股票和时间范围查看“AI预测 vs… (#812) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/913

🔧 CI/CD & Maintenance

  • chore: [Unreleased] 改为扁平标签格式,减少并发 PR 的 CHANGELOG 冲突 by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/908

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.11.0...v3.12.0

v3.11.0 Security relevant
Security fixes
  • CVE-2025-XXXXX — X-Forwarded-For limit‑bypass (CWE-345) fixed by using the rightmost IP entry in `get_client_ip()`; affects deployments with `TRUST_X_FORWARD_FOR=true` and a single trusted proxy
Notable features
  • Full light‑theme rollout for Web workbench and one‑click dark/light toggle
  • Bot/Agent commands `/history`, `/strategies`, `/research` restored
  • Unified design tokens across Home, Chat, Backtest, Portfolio, Settings pages
Full changelog

发布亮点

  • 🎨 Web 工作台完成一轮 UI 统一与双主题升级 — 首页、问股、回测、持仓和设置页进一步收口到统一设计 token、输入表面和状态表达;新增完整浅色主题,并支持浅色 / 深色一键切换与持久化保存。
  • 🤖 Bot / Agent 能力重新补回主分支 — 恢复 /history/strategies/research 等命令,/ask 继续支持多股对比与组合视角;Deep Research、事件监控与 schedule 轮询链路重新接回主线能力。
  • 🔒 安全性与运行稳态同步补强 — 修复 X-Forwarded-For 限流绕过风险,恢复 LiteLLM 官方 PyPI 安装路径,Tushare 初始化不再依赖本地 SDK,降低 Docker、桌面打包和环境重建时的脆弱点。
  • 🖥️ 日常使用细节继续打磨 — 修复首页港股自动补全提交、登录页首屏主题闪烁、历史长股票名重叠,以及 Telegram Markdown 解析失败时整条通知发送中断等问题。

新功能

  • 🎨 全新浅色主题与双主题切换上线 — Web 工作台新增完整浅色主题,并支持在侧边栏中一键切换浅色 / 深色模式;主题选择会持久化保存,刷新页面后仍保持当前偏好。此次升级不是局部配色微调,而是对卡片层级、边界对比、输入表面、状态提示和页面背景做了一整套 light theme 重绘。
  • 🤖 补回主分支缺失的 Agent / Bot 能力#648 / #649 已重新补回 main:Bot 恢复 /history/strategies/research/ask 保留多股对比与组合视角;Deep Research 与 Event Monitor 的配置重新在 Web 设置页可见并可编辑,schedule 模式也重新接入事件告警轮询。

改进

  • 🖥️ 核心页面统一到同一套工作台视觉语言Home / Chat / Backtest / Portfolio / Settings 进一步收口到共享设计 token、input-surface 输入体系、空态/错误态表达和抽屉遮罩语义,减少页面之间的视觉割裂与局部私有样式漂移。
  • 💬 问股交互可达性与反馈增强 — 问股页补强了会话导出、通知发送、消息复制、历史删除与追问上下文提示;AI 回复操作不再过度依赖 hover,触屏设备和小屏场景下也能直接触达关键按钮。
  • 📊 回测与持仓页表面和状态表达继续标准化 — 回测页筛选控件、布尔状态、结果表格与汇总卡片统一到共享输入/状态原语;持仓页的导入反馈、汇率刷新提示、空态与警示信息进一步归口到共享组件,减少页面级重复实现。
  • 🧭 导航与页面壳层协同优化 — 侧边栏主题切换、问股完成角标、移动端抽屉遮罩和主内容滚动契约进一步统一,首页、问股和回测在桌面端与移动端的切页体验更稳定。

测试

  • 🧪 UI 治理与关键路径回归补强 — 补充 SidebarNavChatPageBacktestPage 等组件测试,并新增 UI governance 守卫,持续防止交互元素重新引入原生 title 属性或旧 input-terminal 样式回流。同步更新 smoke / markdown drawer 相关验证,覆盖主题升级后的关键主链路。

修复

  • 🌗 Web 首屏默认主题预设为深色apps/dsa-web/index.html 现在会在 React 挂载前读取本地保存的主题偏好;若没有已保存值,则立即给 <html> 预设 dark 并同步 color-scheme,避免首页和登录页首屏先闪出浅色主题。
  • 🔐 登录页独立主题层收口 — 登录页输入框、标签、切换按钮和按钮文案现在使用独立的 --login-* 视觉 token,不再继承全局浅/深主题文字色;即使浏览器缓存了浅色主题,登录页仍保持稳定的深色视觉与青色密码输入表现,避免密码圆点和文案落成黑色。
  • 🖥️ 首页港股代码输入修复 — Web 首页分析输入框现在可正确接受港股代码与自动完成选中的港股项,补齐 00700.HK / HK00700 等格式识别,避免提交时误报“请输入有效的股票代码或股票名称”。
  • 🔒 认证限流 X-Forwarded-For 取值修复(CWE-345)(#841 / #842)— get_client_ip() 从取 X-Forwarded-For 最左值改为最右值,防止攻击者通过伪造首部旋转限流桶绕过暴力破解保护;仅影响 TRUST_X_FORWARDED_FOR=true 且单层可信反向代理的部署场景,多级代理环境需按部署文档评估配置。
  • 📦 恢复 LiteLLM 官方 PyPI 安装并锁定安全上限requirements.txt 重新使用 pip install litellm 的官方 PyPI 安装路径,并在保留历史最低要求 >=1.80.10 的同时增加 <1.82.7 的安全上限,避免误装已被移除的 1.82.7 / 1.82.8 风险版本;Windows 桌面打包脚本也同步回退到标准 pip install -r requirements.txt 链路,减少特殊下载分支带来的维护成本。
  • 📨 Telegram Markdown 解析失败回退纯文本(fixes #850)— src/notification_sender/telegram_sender.py 现在会在 Telegram 返回 HTTP 400 且包含 can't parse entities / Markdown 解析错误时,自动去掉 parse_mode 后重试纯文本发送,避免 *ST 等正文内容直接导致整条通知失败。
  • 🔢 A 股同码实时行情保留交易所提示(fixes #852)— DataFetcherManagerTushareFetcher 现在会保留 SZ000001 / 000001.SZ 这类显式沪深提示,旧版 Tushare 实时行情降级分支不再把深市 000001 误判成 sh000001 上证指数。
  • 🎯 多 Agent 次优买点不再盲目复制理想买点(fixes #851)— 当多智能体结果缺少独立 secondary_buy 时,仪表盘现在优先展示 N/A 而不是把 fallback 值硬拷贝成与 ideal_buy 完全相同,减少误导性的双买点展示。
  • 🧩 Tushare 初始化不再强依赖本地 SDK 包TushareFetcher 现在直接使用内置 HTTP client 访问 Tushare Pro,不再在启动阶段先 import tushare 才能初始化;修复了 Docker、桌面打包或环境重建后因缺少 tushare 包而提前报 No module named 'tushare' 的问题,并补充对应回归测试。
  • ⚙️ daily_analysis 工作流补齐 DEEPSEEK_API_KEY 映射 — GitHub Actions 每日分析工作流现在会正确透传 DEEPSEEK_API_KEY,避免云端任务配置了密钥却在运行时拿不到对应环境变量。
  • 🖥️ 历史列表过长股票名称截断与悬停展示(fixes #815)— 历史列表中过长的股票名称, 现在会按字符类型自动截断(英文15/中文8/混合10字符),默认显示截断结果,悬停时展示完整名称;解决 1920x1080 分辨率下股票名称与右侧状态标签文字重叠的问题。新增 stockName.ts 工具函数并补充对应测试。

文档

  • 🧾 README 捐赠入口更新为小红书二维码 — README 及中英文说明中的赞助入口更新为小红书二维码素材,保持展示口径一致。

What's Changed

🤖 AI & Analysis

  • fix: daily_analysis 工作流补充 DEEPSEEK_API_KEY 环境变量映射 by @Windyztree in https://github.com/ZhuLinsen/daily_stock_analysis/pull/855
  • #602 [PR 9] Web UI 完成初步统一并进行双主题升级, MVP 版本 (Global UI/UX Optimization) by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/869
  • fix: restore #648/#649 agent capabilities on main by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/822

📡 Data Sources

  • fix: decouple tushare init from sdk runtime dependency by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/856
  • fix: patch recent Telegram and A-share regressions by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/857

🧪 Testing

  • fix: accept HK autocomplete codes on home analysis input. [fix #813] by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/828
  • fix: Web 首屏深色预设与登录页主题耦合修复 by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/833
  • fix(auth): use rightmost X-Forwarded-For entry to prevent rate-limit bypass (CWE-345) by @sebastiondev in https://github.com/ZhuLinsen/daily_stock_analysis/pull/841
  • fix: history stock name truncate [Issue: #815] by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/894

📝 Documentation

  • fix: restore pypi litellm install path by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/858

New Contributors

  • @sebastiondev made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/841
  • @Windyztree made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/855

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.10.1...v3.11.0

v3.10.1 New feature
Notable features
  • Web端分析页面新增「推送通知」复选框,默认勾选,可通过API `notify`字段控制
  • 问股/回测页面布局与壳层协同优化,统一容器和UI状态
  • 全局视觉与共享组件收敛,Light theme 引入动态 HSL 阴影体系
Full changelog

新功能

  • 🔔 Web 端分析推送通知开关(#808)— 首页分析按钮旁新增「推送通知」复选框,默认勾选;取消勾选时本次分析不发送 Telegram/企业微信等推送。API POST /api/v1/analysis/analyze 新增 notify 字段(bool,默认 true),不传时行为与修改前一致,Bot 和定时任务不受影响。

改进

  • 🖥️ 问股 / 回测页面布局与壳层协同优化 — 统一 Chat / Backtest 页面容器、共享 UI 状态和跟随问答交互路径,移除部分硬编码高度限制,让导航框架内的填充与滚动行为更连贯。
  • 🎨 全局视觉与共享组件继续收敛 — Light theme 引入动态 HSL 阴影体系,统一侧边栏激活态、告警组件对比度和聊天气泡样式,并把部分零散内联样式收口为语义化 CSS 变量,提升一致性与可维护性。

修复

  • 🖼️ 系统设置智能导入文件选择恢复 — 修复了“系统设置 > 基础设置 > 智能导入”模块中 “选择图片 / 选择文件” 两个按钮点击无响应的问题。
  • 🖥️ 移动端滚动与交互层级修复 — 解决主题切换菜单在移动端被主内容遮挡的 z-index 冲突,并恢复首页长报告场景下的正常纵向滚动,不影响其他页面现有滚动行为。
  • 🧾 Markdown 纯文本复制清洗增强 — 改进纯文本导出算法,复制分析报告时会更稳定地清除表格分隔符等 Markdown 痕迹,提升分享和归档内容的纯净度。
  • 🧠 Trading philosophy injection 覆盖 legacy + Agent 全链路(#810)— GeminiAnalyzer、单 Agent 模式和 skill-aware Prompt 现在共享同一套策略注入状态;只有隐式回落到内置默认 bull_trend 时才保留旧的趋势型提示,显式策略选择或自定义默认 skill 不再被偷偷叠加 MA5>MA10>MA20 多头基线。
  • 🛠️ 后端 CI 依赖安装链路稳态化(#835)— 拆分 backend gate 阶段、为依赖安装增加重试,并把 CI 用的 litellm 安装来源调整为更稳定的 GitHub 源,降低依赖解析抖动导致的 backend gate 偶发失败。
  • 🪟 Windows 桌面发版构建恢复 LiteLLM 安装兼容性scripts/build-backend.ps1 现在会先过滤 requirements.txt 中的 LiteLLM GitHub 源包,再下载对应 tag 的 zipball 到本地移除上游可选 enterprise/ 目录后安装,绕过 Windows runner 上 Poetry 构建 wheel 时把目录误当文件打包导致的失败;同时补上 pip install 退出码检查,避免依赖安装失败后只在后续 python-multipart 校验阶段才暴露成次生报错。

测试

  • 🧪 问股 / 回测 / 智能导入回归覆盖补齐 — 同步更新 E2E 冒烟期望,补充 DashboardStateBlock、Chat 页、智能导入文件选择与相关交互回归断言,确保近期 UI 调整后的关键路径仍可稳定通过。

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.10.0...v3.10.1

v3.9.0 Breaking risk
Notable features
  • Configurable report output language via `REPORT_LANGUAGE=zh|en` (default zh).
  • Agent model decoupling with new env var `AGENT_LITELLM_MODEL` allowing independent selection from analysis model.
  • Slack added as a first‑class notification channel (`SLACK_BOT_TOKEN`, `SLACK_CHANNEL_ID`, `SLACK_WEBHOOK_URL`).
Full changelog

发布亮点

  • 🤖 模型链路与报告语言更灵活 — Agent 现在可以通过 AGENT_LITELLM_MODEL 独立选择模型链路,普通分析与 Agent 报告也可通过 REPORT_LANGUAGE=zh|en 输出统一语言,减少“英文内容 + 中文壳子”这类混排问题,并允许团队分别权衡主分析与 Agent 的成本、速度和能力。
  • 🔎 首页分析体验完成一轮闭环优化 — 首页新增 A 股自动补全,支持代码、中文名、拼音和别名检索;同时 Dashboard 状态收口到统一 store,历史、报告、新闻与 Markdown 抽屉的交互更稳定,“Ask AI” 追问也会优先携带当前报告上下文。
  • 💬 通知与检索能力继续外扩 — 新增 Slack 一等通知渠道;SearXNG 在未配置自建实例时可以自动发现公共实例并按受控轮询降级;Tavily 时效新闻链路修复后,严格时效过滤不再错误丢光有效结果。
  • 💼 持仓与市场复盘链路更稳 — A 股 market review 可选接入 TickFlow 强化指数与涨跌统计;持仓账本写入改为串行化以缩小并发超卖窗口;汇率刷新入口和禁用态提示也更加清晰,减少用户误判。

新功能

  • 🔎 Web 股票自动补全 MVP — 首页分析输入框新增本地索引驱动的自动补全,支持股票代码、中文名、拼音和别名匹配;选中候选后会提交 canonical code,并透传 stock_nameoriginal_queryselection_source 到分析请求、任务状态和 SSE 事件;索引加载失败时自动退回旧输入模式,不阻断原有提交流程。同步补充了静态索引加载器、索引生成脚本和前后端契约测试。分阶段进行开发,第一阶段仅支持 A 股。
  • 💬 Slack 一等通知渠道 — 新增 Slack 原生通知支持,同时支持 Bot Token 和 Incoming Webhook 两种接入方式;同时配置时优先使用 Bot API,确保文本与图片发送到同一频道;Bot Token 模式支持图片上传(raw body POST,不使用 multipart);新增 SLACK_BOT_TOKENSLACK_CHANNEL_IDSLACK_WEBHOOK_URL 配置项,GitHub Actions 工作流同步补齐对应 Secrets 传递。
  • 🌍 报告输出语言可配置(Issue #758)— 新增 REPORT_LANGUAGE=zh|en,默认 zh;语言设置会同步注入普通分析与 Agent Prompt,并覆盖 Markdown/Jinja 模板、通知 fallback、历史/API report_language 元数据及 Web 报告页固定文案,避免“英文内容 + 中文壳子”的混合输出。
  • 🚀 Agent 与普通分析模型解耦(Issue #692)— 新增 AGENT_LITELLM_MODEL(留空继承 LITELLM_MODEL,无前缀按 openai/<model> 归一);Agent 执行链路与 /api/v1/agent/modelsis_primary/is_fallback 标记改为基于 Agent 实际模型链路;系统配置与启动期校验补齐 AGENT_LITELLM_MODELunknown_model/missing_runtime_source 检查;Web 设置页新增 Agent 主模型选择并与渠道模式运行时配置同步。
  • 🔎 SearXNG 公共实例自动发现与受控轮询(#752)— 新增 SEARXNG_PUBLIC_INSTANCES_ENABLED,在未配置 SEARXNG_BASE_URLS 时默认从 searx.space 拉取公共实例列表,并按受控轮询顺序选择实例;同次请求内遇到超时、连接错误、HTTP 非 200 或无效 JSON 会自动切换到下一个实例。已配置自建实例的用户保持原有优先级与语义不变;daily_analysis GitHub Actions 工作流也已支持显式透传该开关并在启动日志中展示当前状态。
  • 📈 TickFlow market review enhancement (#632) — 新增可选 TICKFLOW_API_KEY;配置后,A 股大盘复盘的主要指数行情优先尝试 TickFlow;若当前 TickFlow 套餐支持标的池查询,市场涨跌统计也会优先尝试 TickFlow。失败或权限不足时立即回退到现有 AkShare / Tushare / efinance 链路;板块涨跌榜回退顺序保持不变。接入层同时适配了真实 SDK 契约:主指数查询按单次请求上限分批拉取,并将 TickFlow 返回的比例型 change_pct / amplitude 统一转换为项目内部的百分比口径。

改进

  • Dashboard state slice and workspace closure — moved Home / Dashboard state into stockPoolStore, consolidated history selection, report loading, task syncing, polling refresh, and markdown drawer handling under a single state slice.
  • Dashboard panel standardization — kept the current dashboard layout contract stable while unifying history, report, news, and markdown presentation with shared tokens, standardized states, and bounded in-panel scrolling for the history list.
  • Dashboard-to-chat follow-up bridge — routed “Ask AI” follow-ups through report-context hydration instead of direct cross-page state coupling, while keeping chat sends usable when enriched history context is still loading.
  • 💼 持仓账本并发写入串行化(#742)— 持仓源事件写入/删除现在会在 SQLite 下先获取串行化写锁,减少并发卖出把超售流水写入账本的窗口;直接持仓写接口在锁竞争时返回 409 portfolio_busy,CSV 导入保持逐条提交并把 busy 计入 failed_count
  • 💱 持仓页汇率手动刷新入口补齐(#748)— Web /portfolio 页面现在会在“汇率状态”卡片中展示“刷新汇率”按钮,直接调用现有 POST /api/v1/portfolio/fx/refresh 接口;刷新后会仅重载快照与风险数据,并以内联摘要反馈“已更新 / 仍 stale / 刷新失败”的结果,减少用户对 fxStale 长时间停留的误解。

修复

  • 🔎 Web 自动补全 Enter 提交语义修正 — 股票自动补全在搜索命中候选时不再默认高亮第一项;候选列表展开但用户尚未用方向键或鼠标明确选中时,按 Enter 会继续提交原始输入,避免手动输入被第一条候选静默覆盖。
  • 🌍 补齐 REPORT_LANGUAGE 启动解析与历史展示本地化边界Config 在启动时继续遵循“真实环境变量优先、.env 兜底”的既有语义,并在两者冲突时输出显式告警,减少 REPORT_LANGUAGE 来源不清带来的误判;同时 /api/v1/history/{id} 英文详情响应会同步本地化 sentiment_label,历史 Markdown 也会正确识别英文 bias_status 的风险等级 emoji,避免出现 乐观🚨Safe 这类中英混排/误报展示。
  • 📰 Tavily 时效新闻检索发布时间映射修复(#782)— Tavily 在股票新闻和严格时效的情报维度中现在会显式使用 topic="news",并兼容 published_date / publishedDate 两种发布时间字段;修复了 Tavily 明明返回结果却在后续硬过滤阶段被全部记为 drop_unknown 丢弃的问题,同时将机构分析、业绩预期、行业分析等分析型维度恢复为宽源搜索,不再被统一压缩成新闻模式。
  • 💱 持仓页汇率刷新禁用语义修正(#772)— 当 PORTFOLIO_FX_UPDATE_ENABLED=false 时,POST /api/v1/portfolio/fx/refresh 现在会返回显式 refresh_enabled=falsedisabled_reason,Web /portfolio 页面会明确提示“汇率在线刷新已被禁用”,不再误报“当前范围无可刷新的汇率对”。
  • 🤖 Agent timeout and config hardeningAGENT_ORCHESTRATOR_TIMEOUT_S now also protects the legacy single-agent ReAct loop, parallel tool batches stop waiting once the remaining budget is exhausted, and invalid numeric .env values fall back to safe defaults with warnings instead of crashing startup.
  • 🌐 CORS wildcard + credentials compatibilityCORS_ALLOW_ALL=true no longer combines allow_origins=["*"] with credentialed requests, avoiding browser-side cross-origin failures in demo/development setups.
  • 🧭 Unavailable Agent settings hidden from Web UI — Deep Research / Event Monitor controls are now treated as compatibility-only metadata in the current branch and are removed from the Settings page to avoid exposing non-functional toggles.

文档

  • 新增 Ollama 本地模型配置说明,同步更新 README.mddocs/README_EN.md(Fixes #690)
  • 完善 Ollama 配置说明:docs/full-guide.md / docs/full-guide_EN.md 环境变量表与 Note 补充 OLLAMA_API_BASE,避免英文用户误以为 Ollama 不能作为独立配置入口;合并重复的 OLLAMA_API_BASE 条目为单一条目
  • 明确文档同步治理边界:补充 README.md、专题文档、双语文档与交付说明之间的默认同步规则,减少后续文档漂移

What's Changed

🤖 AI & Analysis

  • #602 [PR 7] 首页工作台状态管理收口与追问链路优化 by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/760
  • feat: 支持 SearXNG 公共实例自动发现与受控轮询 (#752) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/769
  • feat: add configurable report language by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/764
  • feat: add Slack as a first-class notification channel by @XinyaoQiu in https://github.com/ZhuLinsen/daily_stock_analysis/pull/747

📡 Data Sources

  • feat: 接入 efinance maintainer 新开放的 TickFlow,以解决 A 股大盘数据在 market review 场景下的稳定性问题 (#632) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/745
  • #730 [PR1] 首页股票分析输入框自动补全 AutoComplete by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/775

⚙️ Configuration

  • fix: decouple agent and analysis primary models (#692) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/741
  • docs: add Ollama local model configuration guide (Fixes #690) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/744
  • fix: harden agent runtime and config handling by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/776

🧪 Testing

  • fix: 串行化持仓账本写入以消除并发超售窗口 (#742) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/743
  • fix: 在持仓管理页面的「汇率状态」卡片旁增加「刷新汇率」按钮 (#748) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/770
  • fix: /portfolio 汇率刷新在禁用在线更新时误报“无可刷新的汇率对” (#772) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/778
  • fix: preserve Tavily news results after freshness filtering (#782) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/784

🔧 CI/CD & Maintenance

  • docs(governance): clarify documentation sync rules by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/762

New Contributors

  • @XinyaoQiu made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/747

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.8.0...v3.9.0

v3.8.0 Breaking risk
Breaking changes
  • POST /api/v1/auth/logout now rotates the session secret, making existing cookies immediately invalid; the endpoint is no longer in the anonymous whitelist and returns 401 for unauthenticated requests.
Security fixes
  • Logout endpoint hardens security by rotating session secrets and removing it from the anonymous whitelist, preventing unauthorized access after logout.
Full changelog

发布亮点

  • 🎨 Web 界面完成一轮骨架升级 — 新的 App Shell、侧边导航、主题能力、登录与系统设置流程已经串成统一体验,桌面端加载背景也完成对齐。
  • 📈 分析上下文继续补强 — 美股新增社交舆情情报,A 股补齐财报与分红结构化上下文,Tushare 新接入筹码分布和行业板块涨跌数据。
  • 🔒 运行稳定性与配置兼容性提升 — 退出登录会立即让旧会话失效,定时启动兼容旧配置,运行中的 MAX_WORKERS 调整和新闻时效窗口反馈更清晰。
  • 💼 持仓纠错链路更完整 — 超售会被前置拦截,错误交易/资金流水/公司行为可以直接删除回滚,便于修复脏数据。

新功能

  • 📱 美股社交舆情情报 — 新增 Reddit / X / Polymarket 社交媒体情绪数据源,为美股分析提供实时社交热度、情绪评分和提及量等补充指标;完全可选,仅在配置 SOCIAL_SENTIMENT_API_KEY 后对美股生效。
  • 📊 A 股财报与分红结构化增强(Issue #710)— fundamental_context.earnings.data 新增 financial_reportdividend 字段;分红统一按“仅现金分红、税前口径”计算,并补充 ttm_cash_dividend_per_sharettm_dividend_yield_pct;分析/历史 API 的 details 追加 financial_reportdividend_metrics 可选字段,保持 fail-open 与向后兼容。
  • 🔍 接入 Tushare 筹码与行业板块接口 — 新增筹码分布、行业板块涨跌数据获取能力,并统一纳入配置化数据源优先级;默认按上海时间区分盘中/盘后交易日取数,优先使用 Tushare 同花顺接口,必要时降级到东财。
  • 🧱 Web UI 基础骨架升级 — 重建共享设计令牌与通用组件,新增 App Shell、Theme Provider、侧边导航,并同步调整 Electron 加载背景,为 Web / Desktop 的统一体验打底。
  • 🔐 登录与系统设置流程重做 — 重构 Login、Settings 与 Auth 管理流程,补上显式的认证 setup-state 处理,并让 Web 端与运行时认证配置 API 行为对齐。
  • 🧪 前端回归与冒烟覆盖补强 — 新增并扩展登录、首页、聊天、移动端 Shell、设置页、回测入口等关键路径的组件测试与 Playwright smoke coverage。

变更

  • 🧭 页面接入新 Shell 布局契约 — Home、Chat、Settings、Backtest 已统一接入新的页面容器、抽屉和滚动约定,降低 UI 迁移期间的页面行为不一致。
  • 💾 设置页状态同步更稳 — 优化草稿保留、直接保存同步与冲突处理,减少模块级保存后前后端配置状态不一致的问题。
  • 🎭 登录页视觉基线回归 — 登录页恢复到既有 006 分支的视觉基线,同时保留新的认证状态逻辑和统一表单交互模型。
  • 🏛️ AI 协作治理资产加固 — 收敛并加强 AGENTS.mdCLAUDE.md、Copilot 指令和校验脚本的一致性约束,降低治理资产长期漂移风险。

修复

  • 定时启动立即执行兼容旧配置(Issue #726)— SCHEDULE_RUN_IMMEDIATELY 未设置时会回退读取 RUN_IMMEDIATELY,修复升级后旧 .env 在定时模式下的兼容性问题;同时澄清 .env.example / README 中两个配置项的适用范围,并注明 Outlook / Exchange 强制 OAuth2 暂不支持。
  • 🧵 运行期 MAX_WORKERS 配置生效与可解释性增强(#633)— 修复异步分析队列未按 MAX_WORKERS 同步的问题;新增任务队列并发 in-place 同步机制(空闲即时生效、繁忙延后),并在设置保存反馈与运行日志中明确输出 profile/max/effective,减少“参数未生效”误解。
  • 🔐 退出登录立即失效现有会话POST /api/v1/auth/logout 现在会轮换 session secret,避免旧 cookie 在退出后仍可继续访问受保护接口;同浏览器标签页和并发页面会被同步登出。认证开启时,该接口也不再属于匿名白名单,未登录请求会返回 401,避免匿名请求触发全局 session 失效。
  • 🧮 Tushare 板块/筹码调用限流与跨日缓存修复 — 新增的 trade_cal、行业板块排行、筹码分布链路统一接入 _check_rate_limit();交易日历缓存改为按自然日刷新,避免服务跨天运行后继续沿用旧交易日判断取数日期。
  • 💼 持仓超售拦截与错误流水恢复(#718)— POST /api/v1/portfolio/trades 现在会在写入前校验可卖数量,超售返回 409 portfolio_oversell;持仓页新增交易 / 资金流水 / 公司行为删除能力,删除后会同步失效仓位缓存与未来快照,便于从错误流水中直接恢复。
  • 📧 邮件中文发件人名编码(#708)— 邮件通知现在会对包含中文的 EMAIL_SENDER_NAME 自动做 RFC 2047 编码,并在异常路径补充 SMTP 连接清理,修复 GitHub Actions / QQ SMTP 下 'ascii' codec can't encode characters 导致的发送失败。
  • 🐛 港股 Agent 实时行情去重与快速路由 — 统一 HK01810 / 1810.HK / 01810 等港股代码归一规则;港股实时行情改为直接走单次 akshare_hk 路径,避免按 A 股 source priority 重复触发同一失败接口;Agent 运行期对显式 retriable=false 的工具失败增加短路缓存,减少同轮分析中的重复失败调用。
  • 📰 新闻时效硬过滤与策略分窗(#697)— 新增 NEWS_STRATEGY_PROFILEultra_short/short/medium/long)并与 NEWS_MAX_AGE_DAYS 统一计算有效窗口;搜索结果在返回后执行发布时间硬过滤(时间未知剔除、超窗剔除、未来仅容忍 1 天),并在历史 fallback 链路追加相同约束,避免旧闻再次进入“最新动态/风险警报”。

文档

  • ☁️ 新增云服务器 Web 界面部署与访问教程(Fixes #686)— 补充从云端部署到外部访问的落地说明,降低远程自托管门槛。
  • 🌍 补齐英文文档索引与协作文档 — 新增英文文档索引、贡献指南、Bot 命令文档,并补充中英双语 issue / PR 模板,方便中英文协作与外部贡献者理解项目入口。
  • 🏷️ 本地化 README 补充 Trendshift badge — 在多语言 README 中同步补上新版能力入口标识,减少中英文说明面不一致。

What's Changed

🤖 AI & Analysis

  • [#697] fix: 新闻时效硬过滤与策略分窗 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/707
  • fix: encode non-ascii email sender names by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/712
  • #602 [PR 5 + PR 6] 全局导航与应用外壳 & 系统管理与登录模块 by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/714
  • fix: A股财报与分红结构化增强 (#710) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/731
  • chore: harden AI governance assets by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/738

📡 Data Sources

  • fix: 修复港股代码全链路支持 (Fixes #629, Fixes #691) by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/694
  • feat:增加tushare筹码分析接口、行业板块接口 by @wild-firefox in https://github.com/ZhuLinsen/daily_stock_analysis/pull/717
  • fix: close logout gap and harden tushare follow-ups by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/732

⚙️ Configuration

  • feat: Social sentiment intelligence for US stocks (Reddit/X/Polymarket) by @alexander-schneider in https://github.com/ZhuLinsen/daily_stock_analysis/pull/705
  • docs: add EN doc index, contributing guide, bot guide; bilingual issue/PR templates by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/713
  • fix: MAX_WORKERS 运行时并发同步与设置可解释性补齐 (#633) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/721
  • fix: restore schedule immediate-run compatibility by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/735

🧪 Testing

  • fix: 修复持仓超售校验与错误流水恢复 (#718) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/720

📝 Documentation

  • [docs] 云服务器 Web 界面访问指南 Issue #686 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/702
  • docs: add Trendshift badge to localized readmes by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/733

New Contributors

  • @alexander-schneider made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/705

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.7.0...v3.8.0

v3.7.0 Breaking risk
⚠ Upgrade required
  • Discord environment variable fallback: `DISCORD_CHANNEL_ID` now maps to `DISCORD_MAIN_CHANNEL_ID`. Existing configurations continue to work without changes.
  • GitHub Actions upgraded to Node 24; CI jobs no longer emit deprecation warnings for Node 20 (required after 2026‑06‑02).
  • 持仓页手工录入表单默认日期 now uses local timezone instead of UTC, fixing offset issues for users in non‑UTC regions.
Breaking changes
  • `POST /api/v1/portfolio/trades` returns `409` conflict when a duplicate `trade_uid` exists for the same account.
Notable features
  • 持仓管理 P0 全功能上线 (账本、快照、CSV 导入、组合风险报告、Web 持仓页、Agent 工具、事件查询 API、Parser Registry)
  • 前端设计系统与原子组件库(渐进式双主题、重构核心 UI 组件、clsx/tailwind-merge 工具)
  • 分析 API 异步契约规范化与启动优化
Full changelog

新功能

  • 💼 持仓管理 P0 全功能上线(#677,对应 Issue #627)

    • 核心账本与快照闭环:新增账户、交易、现金流水、企业行为、持仓缓存、每日快照等核心数据模型与 API 端点;支持 FIFO / AVG 双成本法回放;同日事件顺序固定为 现金 → 企业行为 → 交易;持仓快照写入采用原子事务。
    • 券商 CSV 导入:支持华泰 / 中信 / 招商首批适配,含列名别名兼容;两阶段接口(解析预览 + 确认提交);trade_uid 优先、key-field hash 兜底的幂等去重;前导零股票代码完整保留。
    • 组合风险报告:集中度风险(Top Positions + A 股板块口径)、历史回撤监控(支持回填缺失快照)、止损接近预警;多币种统一换算 CNY 口径;汲取失败时回退最近成功汇率并标记 stale。
    • Web 持仓页/portfolio):组合总览、持仓明细、集中度饼图、风险摘要、全组合 / 单账户切换;手工录入交易 / 资金流水 / 企业行为;内嵌账户创建入口;CSV 解析 + 提交闭环与券商选择器。
    • Agent 持仓工具:新增 get_portfolio_snapshot 数据工具,默认紧凑摘要,可选持仓明细与风险数据。
    • 事件查询 API:新增 GET /portfolio/tradesGET /portfolio/cash-ledgerGET /portfolio/corporate-actions,支持日期过滤与分页。
    • 可扩展 Parser Registry:应用级共享注册,支持运行时注册新券商;新增 GET /portfolio/imports/csv/brokers 发现接口。
  • 🎨 前端设计系统与原子组件库(#662)

    • 引入渐进式双主题架构(HSL 变量化设计令牌),清理历史 Legacy CSS;重构 Button / Card / Badge / Collapsible / Input / Select 等 20+ 核心组件;新增 clsx + tailwind-merge 类名合并工具;提升历史记录、LLM 配置等页面可读性。
  • 分析 API 异步契约与启动优化(#656)

    • 规范 POST /api/v1/analysis/analyze 异步请求的返回契约;优化服务启动辅助逻辑;修复前端报告类型联合定义与后端响应对齐问题。

修复

  • 🔔 Discord 环境变量向后兼容(#659):运行时新增 DISCORD_CHANNEL_IDDISCORD_MAIN_CHANNEL_ID 的 fallback 读取;历史配置用户无需修改即可恢复 Discord Bot 通知;全部相关文档与 .env.example 对齐。
  • 🔧 GitHub Actions Node 24 升级(#665):将所有 GitHub 官方 actions 升级至 Node 24 兼容版本,消除 CI 日志中的 Node.js 20 deprecation warning(影响 2026-06-02 强制升级窗口)。
  • 📅 持仓页默认日期本地化:手工录入表单默认日期改用本地时间(getFullYear/Month/Date),修复 UTC-N 时区用户在当天晚间出现日期偏移的问题。
  • 🔁 CSV 导入去重逻辑加固:dedup hash 纳入行序号作为区分因子,确保同字段合法分笔成交不被误折叠;同时在 trade_uid 存在时也持久化 hash,防止混合来源重复写入。

变更

  • POST /api/v1/portfolio/trades 在同账户内 trade_uid 冲突时返回 409
  • 持仓风险响应新增 sector_concentration 字段(增量扩展),原有 concentration 字段保持不变。
  • 分析 API analyze 接口异步行为契约文档化;前端报告类型联合更新。

测试

  • 新增持仓核心服务测试(FIFO / AVG 部分卖出、同日事件顺序、重复 trade_uid 返回 409、快照 API 契约)。
  • 新增 CSV 导入幂等性、合法分笔成交不误去重、去重边界、风险阈值边界、汇率降级行为测试。
  • 新增 Agent get_portfolio_snapshot 工具调用测试。
  • 新增分析 API 异步契约回归测试。

What's Changed

🤖 AI & Analysis

  • fix: upgrade GitHub Actions official actions for Node 24 compatibility by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/665
  • #602 [PR 4] 设计系统与原子组件库 (渐进式双主题架构) by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/662
  • Improve analysis API async contracts and startup helpers by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/656

⚙️ Configuration

  • fix: support legacy Discord channel env alias and align docs by @AsaZhou923 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/659
  • [#627][PR4] 持仓管理P0:补全功能漏洞与缺失 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/677

New Contributors

  • @AsaZhou923 made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/659

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.6.0...v3.7.0

v3.6.0 Breaking risk
Security fixes
  • Authflow cooldowns now session‑scoped — closes abuse vector where users changed phone/email mid‑flow to reset OTP cooldowns
Notable features
  • Usage alerts with email + usage.alert.triggered webhook before hard caps
  • Non-ASCII sender names in custom SMTP
  • Portal: Endpoint field now shows for OIDC and SAML app types
Full changelog

Added

  • 🗑️ History batch deletion — Web UI now supports multi-selection and batch deletion of analysis history; added POST /api/v1/history/batch-delete endpoint and ConfirmDialog component.
  • 🔐 Auth settings API — new POST /api/v1/auth/settings endpoint to enable or disable Web authentication at runtime and set the initial admin password when needed
  • openclaw Skill 集成指南 — 新增 docs/openclaw-skill-integration.md,说明如何通过 openclaw Skill 调用 DSA API
  • ⚙️ LLM channel protocol/test UX.env and Web settings now share the same channel shape (LLM_CHANNELS + LLM_<NAME>_PROTOCOL/BASE_URL/API_KEY/MODELS/ENABLED); settings page adds per-channel connection testing, primary/fallback/vision model selection, and protocol-aware model prefixing
  • 🤖 Agent architecture Phase 0+1 — shared protocols (AgentContext, AgentOpinion, StageResult), extracted run_agent_loop() runner, AGENT_ARCH switch (single/multi), config registry entries
  • 🔍 Bot NL routing — two-layer natural-language routing: cheap regex pre-filter (stock codes + finance keywords) → lightweight LLM intent parsing; controlled by AGENT_NL_ROUTING=true; supports multi-stock and strategy extraction
  • 💬 /ask multi-stock analysis — comma or vs separated codes (max 5), parallel thread execution with 150s timeout (preserves partial results), Markdown comparison summary table at top
  • 📋 /history command — per-user session isolation via {platform}_{user_id}:{scope} format (colon delimiter prevents prefix collision); lists both /chat and /ask sessions; view detail or clear
  • 📊 /strategies command — lists available strategy YAML files grouped by category (趋势/形态/反转/框架) with ✅/⬜ activation status
  • 🔧 Backtest summary toolsget_strategy_backtest_summary and get_stock_backtest_summary registered as read-only Agent tools
  • ⚙️ Agent auto-detectionis_agent_available() auto-detects from LITELLM_MODEL; explicit AGENT_MODE=true/false takes full precedence
  • 🏗️ Multi-Agent orchestrator (Phase 2)AgentOrchestrator with 4 modes (quick/standard/full/strategy); drop-in replacement for AgentExecutor via AGENT_ARCH=multi; BaseAgent ABC with tool subset filtering, cached data injection, and structured AgentOpinion output
  • 🧩 Specialised agents (Phase 2-4)TechnicalAgent (8 tools, trend/MA/MACD/volume/pattern analysis), IntelAgent (news & sentiment, risk flag propagation), DecisionAgent (synthesis into Decision Dashboard JSON), RiskAgent (7 risk categories, two-level severity with soft/hard override)
  • 📈 Strategy system (Phase 3)StrategyAgent (per-strategy evaluation from YAML skills), StrategyRouter (rule-based regime detection → strategy selection), StrategyAggregator (weighted consensus with backtest performance factor)
  • 🔬 Deep Research agent (Phase 5)ResearchAgent with 3-phase approach (decompose → research sub-questions → synthesise report); token budget tracking; new /research bot command with aliases (/深研, /deepsearch)
  • 🧠 Memory & calibration (Phase 6)AgentMemory with prediction accuracy tracking, confidence calibration (activates after minimum sample threshold), strategy auto-weighting based on historical win rate
  • 📊 Portfolio Agent (Phase 7)PortfolioAgent for multi-stock portfolio analysis (position sizing, sector concentration, correlation risk, cross-market linkage, rebalance suggestions)
  • 🔔 Event-driven alerts (Phase 7)EventMonitor with PriceAlert, VolumeAlert, SentimentAlert rules; async checking, callback notifications, serializable persistence
  • ⚙️ New config entriesAGENT_ORCHESTRATOR_MODE, AGENT_RISK_OVERRIDE, AGENT_DEEP_RESEARCH_BUDGET, AGENT_MEMORY_ENABLED, AGENT_STRATEGY_AUTOWEIGHT, AGENT_STRATEGY_ROUTING — all registered in config.py + config_registry.py (WebUI-configurable)

Changed

  • 🔐 Auth password state semantics — stored password existence is now tracked independently from auth enablement; when auth is disabled, /api/v1/auth/status returns passwordSet=false while preserving the saved password for future re-enable
  • 🔐 Auth settings re-enable hardening — re-enabling auth with a stored password now requires currentPassword, and failed session creation rolls back the auth toggle to avoid lockout
  • ♻️ AgentExecutor refactored_run_loop delegates to shared runner.run_agent_loop(); removed duplicated serialization/parsing/thinking-label code
  • ♻️ Unified agent switch — Bot, API, and Pipeline all use config.is_agent_available() instead of divergent config.agent_mode checks
  • 📖 README.md — expanded Bot commands section (ask/chat/strategies/history), added NL routing note, updated agent mode description
  • 📖 .env.example — added AGENT_ARCH and AGENT_NL_ROUTING configuration documentation

Fixed

  • 🐛 Session secret rotation on Windows — use atomic replace so auth toggles invalidate existing sessions even when .session_secret already exists
  • 🐛 Auth toggle atomicity — persist ADMIN_AUTH_ENABLED before rotating session secret; on rotation failure, roll back to the previous auth state
  • 🔧 LLM runtime selection guardrails — YAML 模式下渠道编辑器不再覆盖 LITELLM_MODEL / fallback / Vision;系统配置校验补上全部渠道禁用后的运行时来源检查,并修复 vertexai/... 这类协议别名模型被重复加前缀的问题
  • 🐛 Multi-stock /ask follow-up regressions — portfolio overlay now shares the same timeout budget as the per-stock phase and is skipped on timeout instead of blocking the bot reply; /history now stores the readable per-stock summary instead of raw dashboard JSON; condensed multi-stock output now renders numeric sniper_points values
  • 🐛 Decision dashboard enum compatibility — multi-agent DecisionAgent now keeps decision_type within the legacy buy|hold|sell contract and normalizes stray strong_* outputs before risk override, pipeline conversion, and downstream统计/通知汇总
  • 🛟 Multi-Agent partial-result fallbackIntelAgent now caches parsed intel for downstream reuse, shared JSON parsing tolerates lightly malformed model output, and the orchestrator preserves/synthesizes a minimal dashboard on timeout or mid-pipeline parse failure instead of always collapsing to 50/观望/未知
  • 🐛 Shared LiteLLM routing restored — bot NL intent parsing and ResearchAgent planning/synthesis now reuse the same LiteLLM adapter / Router / fallback / api_base injection path as the main Agent flow, so LLM_CHANNELS / LITELLM_CONFIG / OpenAI-compatible deployments behave consistently
  • 🐛 Bot chat session backward compatibility/chat now keeps using the legacy {platform}_{user_id} session id when old history already exists, and /history can still list / view / clear those pre-migration sessions alongside the new {platform}_{user_id}:chat format
  • 🐛 EventMonitor unsupported rule rejection — config validation/runtime loading now reject or skip alert types the monitor cannot actually evaluate yet, so schedule mode no longer silently accepts permanent no-op rules
  • 🐛 P0 基本面聚合稳定性修复 (#614) — 修复 get_stock_info 板块语义回归(新增 belong_boards 并保留 boards 兼容别名)、引入基本面上下文精简返回以控制 token、为基本面缓存增加最大条目淘汰,并补齐 ETF 总体状态聚合与 NaN 板块字段过滤,保证 fail-open 与最小入侵。
  • 🔧 GitHub Actions 搜索引擎环境变量补充 — 工作流新增 MINIMAX_API_KEYSBRAVE_API_KEYSSEARXNG_BASE_URLS 环境变量映射,使 GitHub Actions 用户可配置 MiniMax、Brave、SearXNG 搜索服务(此前 v3.5.0 已添加 provider 实现但缺少工作流配置)
  • 🤖 Multi-Agent runtime consistencyAGENT_MAX_STEPS now propagates to each orchestrated sub-agent; added cooperative AGENT_ORCHESTRATOR_TIMEOUT_S budget to stop overlong pipelines before they cascade further
  • 🔌 Multi-Agent feature wiringAGENT_RISK_OVERRIDE now actively downgrades final dashboards on hard risk findings; AGENT_MEMORY_ENABLED now injects recent analysis memory + confidence calibration into specialised agents; multi-stock /ask now runs PortfolioAgent to add portfolio-level allocation and concentration guidance
  • 🔔 EventMonitor runtime wiring — schedule mode can now load alert rules from AGENT_EVENT_ALERT_RULES_JSON, poll them at AGENT_EVENT_MONITOR_INTERVAL_MINUTES, and send triggered alerts through the existing notification service
  • 🛠️ Follow-up stability fixes — multi-stock /ask now falls back to usable text output when dashboard JSON parsing fails; EventMonitor skips semantically invalid rules instead of aborting schedule startup; background alert polling now runs independently of the main scheduled analysis loop
  • 🧪 Multi-Agent regression coverage — added orchestrator execution tests for run(), chat(), critical-stage failure, graceful degradation, and timeout handling
  • 🧹 PortfolioAgent cleanuppost_process() now reuses shared JSON parsing and removed stale unused imports
  • 🚦 Bot async dispatchCommandDispatcher now exposes dispatch_async(); NL intent parsing and default command execution are offloaded from the event loop, DingTalk stream awaits async handlers directly, and Feishu stream processing is moved off the SDK callback thread
  • 🌐 Async webhook handler — new handle_webhook_async() function in bot/handler.py for use from async contexts (e.g. FastAPI); calls dispatch_async() directly without thread bridging
  • 🧵 Feishu stream ThreadPoolExecutor — replaced unbounded per-message Thread spawning with a capped ThreadPoolExecutor(max_workers=8) to prevent thread explosion under message bursts
  • 🔒 EventMonitor safety_check_volume() now safely handles get_daily_data returning None (no tuple-unpacking crash); on_trigger callbacks support both sync and async callables via asyncio.to_thread/await
  • 🧹 ResearchAgent dedup_filtered_registry() now delegates to BaseAgent._filtered_registry() instead of duplicating the filtering logic
  • 🧹 Bot trailing whitespace cleanup — removed W291/W293 whitespace issues across bot/handler.py, bot/dispatcher.py, bot/commands/base.py, bot/platforms/feishu_stream.py, bot/platforms/dingtalk_stream.py
  • 🐛 Dispatcher _parse_intent_via_llm safety — replaced fragile 'raw' in dir() with 'raw' in locals() for undefined-variable guard in JSONDecodeError handler
  • 🐛 筹码结构 LLM 未填写时兜底补全 (#589) — DeepSeek 等模型未正确填写 chip_structure 时,自动用数据源已获取的筹码数据补全,保证各模型展示一致;普通分析与 Agent 模式均生效
  • 🐛 历史报告狙击点位显示原始文本 (#452) — 历史详情页现优先展示 raw_result.dashboard.battle_plan.sniper_points 中的原始字符串,避免 analysis_history 数值列把区间、说明文字或复杂点位压缩成单个数字;保留原有数值列作为回退
  • 🐛 Session prefix collision — user ID 123 could see sessions of user 1234 via startswith; fixed with colon delimiter in session_id format
  • 🐛 NL pre-filter false positivesre.IGNORECASE caused [A-Z]{2,5} to match common English words like "hello"; removed global flag, use inline (?i:...) only for English finance keywords
  • 🐛 Dotted ticker in strategy args_get_strategy_args() didn't recognize BRK.B as a stock code, leaving it in strategy text; now accepts TICKER.CLASS format
  • ⏱️ efinance 长调用挂起修复 (#660) — 为所有 efinance API 调用引入 _ef_call_with_timeout() 包装(默认 30 秒,可通过 EFINANCE_CALL_TIMEOUT 配置);使用 executor.shutdown(wait=False) 确保超时后不再阻塞主线程,彻底消除 81 分钟挂起问题
  • 🛡️ 类型安全内容完整性检查 (#660) — check_content_integrity() 现在将非字符串类型的 operation_advice / analysis_summary 视为缺失字段,避免下游 get_emoji()dict.strip() 崩溃
  • 📄 报告保存与通知解耦 (#660) — _save_local_report() 不再依赖 send_notification 标志触发,--no-notify 模式下本地报告照常保存
  • 🔄 operation_advice 字典归一化 (#660) — Pipeline 和 BacktestEngine 现在将 LLM 返回的 dict 格式 operation_advice 通过 decision_type(不区分大小写)映射为标准字符串,防止因模型输出格式变化导致崩溃
  • 🛡️ runner.py usage None 防护 (#660) — response.usageNone 时不再抛出 AttributeError,回退为 0 token 计数
  • 📋 orchestrator 静默失败改为日志警告 (#660) — IntelAgent / RiskAgent 阶段失败现在记录 WARNING 而非静默跳过,便于诊断

Notes

  • ⚠️ Multi-worker auth toggles — runtime auth updates are process-local; multi-worker deployments must restart/roll workers to keep auth state consistent

What's Changed

🚀 New Features

  • feat(llm): multi-channel LLM config with WebUI channel editor by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/641

🤖 AI & Analysis

  • fix missing search engine env vars in GitHub Actions by @Colwzq in https://github.com/ZhuLinsen/daily_stock_analysis/pull/625
  • feat: inject CI check results into AI review prompt and clarify blocker criteria by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/645
  • fix: runtime robustness — efinance timeout, type-safe integrity, report save decoupling by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/660

📡 Data Sources

  • [Feature] [P0] 基本面数据管道程序化改造 Issue #614 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/626

⚙️ Configuration

  • #602 [PR 3] 认证安全与初始化流程 (Auth & Security) by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/639
  • feat: multi-agent architecture — core orchestrator, specialised agents, strategy system by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/647

🧪 Testing

  • Feat: 历史分析记录批量删除功能 (Batch Deletion) by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/636

📝 Documentation

  • [docs] add openclaw skill integration guide Issue #615 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/640

New Contributors

  • @Colwzq made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/625

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.5.0...v3.6.0

v3.5.0 Breaking risk
Notable features
  • LLM token usage tracking via `llm_usage` table and `/api/v1/usage/summary` endpoint
  • Web UI full report drawer with "Full Report" button and `GET /api/v1/history/{record_id}/markdown` endpoint
  • SearXNG search provider added as quota‑free self‑hosted fallback
Full changelog

Added

  • 📊 Web UI full report drawer (Fixes #214) — history page adds "Full Report" button to display the complete Markdown analysis report in a side drawer; new GET /api/v1/history/{record_id}/markdown endpoint
  • 📊 LLM cost tracking — all LLM calls (analysis, agent, market review) recorded in llm_usage table; new GET /api/v1/usage/summary?period=today|month|all endpoint returns aggregated token usage by call type and model
  • 🔍 SearXNG search provider (Fixes #550) — quota-free self-hosted search fallback; priority: Bocha > Tavily > Brave > SerpAPI > MiniMax > SearXNG
  • 🔍 MiniMax web search providerMiniMaxSearchProvider with circuit breaker (3 failures → 300s cooldown) and dual time-filtering; configured via MINIMAX_API_KEYS
  • 🤖 Agent models discovery APIGET /api/v1/agent/models returns available model deployments (primary/fallback/source/api_base) for Web UI model selector
  • 🤖 Agent chat export & send (#495) — export conversation to .md file; send to configured notification channels; new POST /api/v1/agent/chat/send
  • 🤖 Agent background execution (#495) — analysis continues when switching pages; badge notification on completion; auto-cancel in-progress stream on session switch
  • 📝 Report Engine P0 — Pydantic schema validation for LLM JSON; Jinja2 templates (markdown/wechat/brief) with legacy fallback; content integrity checks with retry; brief mode (REPORT_TYPE=brief); history signal comparison
  • 📦 Smart import — multi-source import from image/CSV/Excel/clipboard; Vision LLM extracts code+name+confidence; name→code resolver (local map + pinyin + AkShare); confidence-tiered confirmation
  • ⚙️ GitHub Actions LiteLLM config — workflow supports LITELLM_CONFIG/LITELLM_CONFIG_YAML for flexible AI provider configuration
  • ⚙️ Config engine refactor & system API (#602) — unified config registry, validation and API exposure
  • 📖 LLM configuration guide — new docs/LLM_CONFIG_GUIDE.md covering 3-tier config, quick start, Vision/Agent/troubleshooting

Fixed

  • 🐛 analyze_trend always reports No historical data (#600) — now fetches from DB/DataFetcher instead of broken get_analysis_context
  • 🐛 Chip structure fallback when LLM omits it (#589) — auto-fills from data source chip data for consistent display across models
  • 🐛 History sniper points show raw text (#452) — prioritizes original strings over compressed numeric values
  • 🐛 GitHub Actions ENABLE_CHIP_DISTRIBUTION configurable (#617) — no longer hardcoded, supports vars/secrets override
  • 🐛 .env save preserves comments and blank lines — Web settings no longer destroys .env formatting
  • 🐛 Agent model discovery fixes — legacy mode includes LiteLLM-native providers; source detection aligned with runtime; fallback deployments no longer expanded per-key
  • 🐛 Stooq US stock previous close semantics — no longer misuses open price as previous close
  • 🐛 Stock name prefetch regression — prioritizes local STOCK_NAME_MAP before remote queries
  • 🐛 AkShare limit-up/down calculation (#555) — fixed market analysis statistics
  • 🐛 AkShare Tencent source field index & ETF quote mapping (#579)
  • 🐛 Pytdx stock name cache pagination (#573) — prevents cache overflow
  • 🐛 PushPlus oversized report chunking (#489) — auto-segments long content
  • 🐛 Agent chat cancel & switch (#495) — cancel no longer misreports as failure; fast switch no longer overwrites stream state
  • 🐛 MiniMax search status in /status command (#587)
  • 🐛 config_registry duplicate BOCHA_API_KEYS — removed duplicate dict entry that silently overwrote config

Changed

  • 🔎 Fetcher failure observability — logs record start/success/failure with elapsed time, failover transitions; Efinance/Akshare include upstream endpoint and classified failure categories
  • ♻️ Data source resilience & cleanup (#602) — fallback chain optimization
  • ♻️ Image extract API response extension — new items field (code/name/confidence); codes preserved for backward compatibility
  • ♻️ Import parse error messages — specific failure reasons for Excel/CSV; improved logging with file type and size

Docs

  • 📖 LLM config guide refactored for clarity (#583)
  • 📖 image-extract-prompt.md with full prompt documentation
  • 📖 AkShare fallback cache TTL documentation

What's Changed

🤖 AI & Analysis

  • feat: LLM token usage tracking - backend by @Myrrolinz in https://github.com/ZhuLinsen/daily_stock_analysis/pull/570
  • docs: 重构 LLM 配置指南 (#545) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/583
  • [feat] 增加 SearXNG支持 Issue #550 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/588
  • [fix]. 筹码结构 LLM 未填写时兜底补全 Issue #589 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/598
  • ci(workflow): support litellm_config.yaml in GitHub Actions by @elvisw in https://github.com/ZhuLinsen/daily_stock_analysis/pull/581
  • fix(actions): make ENABLE_CHIP_DISTRIBUTION configurable via vars/secrets (Fixes #617) by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/618

📡 Data Sources

  • fix: Bug 修复akshare市场分析中涨跌停计算错误(已验证),efinance(未验证),tushare积分不够待改 by @wild-firefox in https://github.com/ZhuLinsen/daily_stock_analysis/pull/555
  • #602[PR 1]: 数据源韧性增强与代码清理 by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/609
  • #602 [PR 2] 配置引擎重构与系统 API (Config & API) by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/611

📝 Documentation

  • [fix] add MiniMax search status display in /status command Issue #587 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/593
  • [fix]. analyze_trend 始终报 No historical data Issue#600 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/613
  • feat: web-ui add full report button by @graydovee in https://github.com/ZhuLinsen/daily_stock_analysis/pull/621

New Contributors

  • @wild-firefox made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/555
  • @elvisw made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/581
  • @graydovee made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/621

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.4.11...v3.5.0

v3.4.10 Mixed
⚠ Upgrade required
  • Pin TikToken version: requirements.txt now restricts to `tiktoken>=0.8.0,<0.12.0` to avoid the `Unknown encoding cl100k_base` regression introduced in 0.12.0
  • If using markdown‑to‑file engine, install globally via `npm i -g markdown-to-file`
Notable features
  • Markdown-to-image support for dashboard reports (Telegram, WeChat, Custom, Email)
  • Optional markdown-to-file engine (`MD2IMG_ENGINE=markdown-to-file`) with improved emoji handling
  • Configurable `PREFETCH_REALTIME_QUOTES` flag to disable real‑time quote pre‑fetching
Full changelog

Fixed

  • 🐛 EfinanceFetcher ETF OHLCV data (#541, #527) — switch _fetch_etf_data from ef.fund.get_quote_history (NAV-only, no OHLCV, no beg/end params) to ef.stock.get_quote_history; ETFs now return proper open/high/low/close/volume/amount instead of zeros; remove obsolete NAV column mappings from _normalize_data
  • 🐛 tiktoken 0.12.0 Unknown encoding cl100k_base (#537) — pin tiktoken>=0.8.0,<0.12.0 in requirements.txt to avoid plugin-registration regression introduced in 0.12.0
  • 🐛 Web UI API error classification (#540) — frontend no longer treats every HTTP 400 as the same "server/network" failure; now distinguishes Agent disabled / missing params / model-tool incompatibility / upstream LLM errors / local connection failures
  • 🐛 北交所代码识别失败 (#491, #533) — 8/4/92 开头的 6 位代码现正确识别为北交所;Tushare/Akshare/Yfinance 等数据源支持 .BJ 或 bj 前缀;Baostock/Pytdx 对北交所代码显式切换数据源;避免误判上海 B 股 900xxx
  • 🐛 狙击点位解析错误 (#488, #532) — 理想买入/二次买入等字段在无「元」字时误提取括号内技术指标数字;现先截去第一个括号后内容再提取

Added

  • Markdown-to-image for dashboard report (#455, #535) — 个股日报汇总支持 markdown 转图片推送(Telegram、WeChat、Custom、Email),与大盘复盘行为一致
  • markdown-to-file engine (#455) — MD2IMG_ENGINE=markdown-to-file 可选,对 emoji 支持更好,需 npm i -g markdown-to-file
  • PREFETCH_REALTIME_QUOTES (#455) — 设为 false 可禁用实时行情预取,避免 efinance/akshare_em 全市场拉取
  • Stock name prefetch (#455) — 分析前预取股票名称,减少报告中「股票xxxxx」占位符

Changed

  • Enhanced markdown-to-image failure warning (#455) — 转图失败时提示具体依赖(wkhtmltopdf 或 m2f)
  • WeChat-only image routing optimization (#455) — 仅配置企业微信图片时,不再对完整报告做冗余转图,避免误导性失败日志
  • Stock name prefetch lightweight mode (#455) — 名称预取阶段跳过 realtime quote 查询,减少额外网络开销
  • 📊 分析报告模型标记 (#528, #534) — 在分析报告 meta、报告末尾、推送内容中展示 model_used(完整 LLM 模型名);Agent 多轮调用时记录并展示每轮实际使用的模型(支持 fallback 切换)

What's Changed

🤖 AI & Analysis

  • [feat] 在分析报告中标记使用模型并完善展示链路 Issue #528 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/534

📡 Data Sources

  • [fix] 北交所股票代码识别与数据源适配 Issue #491 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/533
  • [feat] 配置中 markdown 转图片支持个股日报汇总 Issue #455 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/535

⚙️ Configuration

  • Fix/(webui): 实现API错误精细化分类与统一展示组件 by @Activer007 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/540

🧪 Testing

  • [fix] 狙击点位解析错误 Issue #488 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/532

New Contributors

  • @Activer007 made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/540

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.4.9...v3.4.10

v3.4.9 New feature
Notable features
  • multi-channel LLM support with visual channel editor
Full changelog

See CHANGELOG for details.

What's Changed

🤖 AI & Analysis

  • feat: multi-channel LLM support with visual channel editor by @ZhuLinsen in https://github.com/ZhuLinsen/daily_stock_analysis/pull/494
  • Gap Remediation:配置校验与 Vision key 检查补全 by @massif-01 in https://github.com/ZhuLinsen/daily_stock_analysis/pull/525

🔔 Notifications

  • refactor: formatter and notification by @AnthonyZJiang in https://github.com/ZhuLinsen/daily_stock_analysis/pull/516

📝 Documentation

  • Add SKILL.md for agent by @Randool in https://github.com/ZhuLinsen/daily_stock_analysis/pull/484

New Contributors

  • @Randool made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/484

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.4.8...v3.4.9

v3.4.8 Bug fix

Fixed Desktop exe crashes caused by missing JSON data files.

Full changelog

Fixed

  • 🐛 Desktop exe crashes on startup with FileNotFoundError — PyInstaller build was missing litellm's JSON data files (e.g. model_prices_and_context_window_backup.json). Added --collect-data litellm to both Windows and macOS build scripts so the files are correctly bundled in the executable.

CI

  • 🔧 Cache Electron binaries on macOS CI runners to prevent intermittent EOF download failures when fetching electron-vX.Y.Z-darwin-*.zip from GitHub CDN
  • 🔧 Fix macOS DMG hdiutil Resource busy error during desktop packaging

Docs

  • 📝 Clarify non-trading-day manual run controls for GitHub Actions (TRADING_DAY_CHECK_ENABLED + force_run) (#474)

What's Changed

📝 Documentation

  • 增加readme中关于跳过交易日检查的两种机制的说明 by @aoshuangzhitou in https://github.com/ZhuLinsen/daily_stock_analysis/pull/474

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.4.7...v3.4.8

v3.4.7 New feature
Notable features
  • CN/US Market Strategy Blueprint System adds region‑specific prompts with position sizing and risk trigger recommendations
Full changelog

Added

  • 🧠 CN/US Market Strategy Blueprint System (#395) — market review prompt injects region-specific strategy blueprints with position sizing and risk trigger recommendations

Fixed

  • 🐛 TRADING_DAY_CHECK_ENABLED env var and --force-run for GitHub Actions (#466)
  • 🐛 Agent pipeline preserved resolved stock names (#464) — placeholder names no longer leak into reports
  • 🐛 Code cleanup (#462, Fixes #422)
  • 🐛 WebUI auto-build on startup (#460)
  • 🐛 ARCH_ARGS unbound variable (#458)
  • 🐛 Time zone inconsistency & right panel flash (#439)

Docs

  • 📝 Clarify potential ambiguities in code (#343)
  • 📝 ENABLE_EASTMONEY_PATCH guidance for Issue #453 (#456)

What's Changed

🤖 AI & Analysis

  • feat: add CN/US market strategy blueprint system by @zhangtianle in https://github.com/ZhuLinsen/daily_stock_analysis/pull/395
  • fix: add TRADING_DAY_CHECK_ENABLED env var and --force-run support for GitHub Actions by @aoshuangzhitou in https://github.com/ZhuLinsen/daily_stock_analysis/pull/466

New Contributors

  • @zhangtianle made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/395
  • @aoshuangzhitou made their first contribution in https://github.com/ZhuLinsen/daily_stock_analysis/pull/466

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.4.6...v3.4.7

v3.3.22 New feature
Notable features
  • 问股页面对话历史持久化 (Fixes #400)
Full changelog

What's Changed

  • feat: 问股页面对话历史持久化 (Fixes #400) by @mkloveyy in https://github.com/ZhuLinsen/daily_stock_analysis/pull/414

Full Changelog: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.3.21...v3.3.22

Beta — feedback welcome: [email protected]