Skip to content

Release history

Daily Stock Analysis releases

All releases

33 shown

No immediate action
v3.28.0 New feature

Multi‑agent support + Futu import

No immediate action
v3.27.0 New feature

Codex Q&A prototype + signal persistence + opinion contract

No immediate action
v3.26.1 Breaking risk

Web workspace + A-share rebuild + Feishu delivery

No immediate action
v3.25.0 New feature

Claude/OpenCode backends + TW stock enhancements

No immediate action
v3.24.1 New feature

Market expansion + TickFlow + Scheduling improvements

No immediate action
v3.23.0 New feature

DecisionSignal, compliance pool, JP/KR stock

No immediate action
v3.22.0 Mixed

DecisionSignal, AlphaSift upgrades, market context

No immediate action
v3.21.1 New feature

AI styling, notifications, testing, config, docs

No immediate action
v3.21.0 Maintenance

Routine maintenance and dependency updates.

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]