Skip to content

Commit d1faec5

Browse files
authored
Merge branch 'ZhuLinsen:main' into main
2 parents 20eea25 + efd2bce commit d1faec5

217 files changed

Lines changed: 23369 additions & 2560 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/skills/fix-issue/SKILL.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
- 优先复用现有模块、配置入口、脚本和测试
3434
- 保持默认行为向后兼容,避免破坏 fallback / fail-open
3535
- 如果修复涉及用户可见行为、配置语义、CLI/API、部署、通知、报告结构,要同步更新相关文档、`docs/CHANGELOG.md``.env.example`
36+
-`docs/CHANGELOG.md` 写入条目时,在 `[Unreleased]` 段追加一行,格式为 `- [类型] 描述`,其中 `[类型]``[新功能]/[改进]/[修复]/[文档]/[测试]/[chore]` 中按本次变更内容选择;只有修复 bug 时才使用 `[修复]`**不要**`[Unreleased]` 内新增 `### 类目标题`
3637
- `README.md` 主要承载入门、运行、部署和高层能力说明;更细的模块行为、页面交互或专题说明,优先更新对应 `docs/*.md`
3738
- 如果没有更新 `README.md`,要在交付说明或 PR 描述里写清原因和实际文档落点
3839

.env.example

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,30 @@ STOCK_LIST=600519,300750,002594
1313
TUSHARE_TOKEN=
1414
# TickFlow API Key(可选,用于 A 股大盘复盘指数增强;若套餐支持标的池查询,也可增强市场统计)
1515
# TICKFLOW_API_KEY=
16-
17-
# ===================================
18-
# 定时任务配置(本地/Docker运行)
19-
# ===================================
20-
# SCHEDULE_ENABLED=true
21-
# SCHEDULE_TIME=18:00
22-
# 启动时是否立即运行一次(默认 true)
23-
# SCHEDULE_RUN_IMMEDIATELY=false
24-
# 交易日检查:默认 true,非交易日跳过执行;设为 false 或使用 --force-run 可强制执行(Issue #373)
25-
# TRADING_DAY_CHECK_ENABLED=true
16+
# Longbridge OpenAPI(可选,美股/港股量比、换手率、PE 等字段兜底)
17+
# 从 https://open.longbridge.com/ 获取
18+
# LONGBRIDGE_APP_KEY=
19+
# LONGBRIDGE_APP_SECRET=
20+
# LONGBRIDGE_ACCESS_TOKEN=
21+
# static_info 进程内缓存秒数,默认 86400;0=每次请求拉取
22+
# LONGBRIDGE_STATIC_INFO_TTL_SECONDS=86400
23+
# Longbridge SDK 语言与 REPORT_LANGUAGE(zh/en)一致;SDK 日志写入 LOG_DIR/longbridge_sdk.log
24+
# 接入点(与 REPORT_LANGUAGE 无关;留空则用下列默认值):
25+
# LONGBRIDGE_HTTP_URL=https://openapi.longbridge.com
26+
# LONGBRIDGE_QUOTE_WS_URL=wss://openapi-quote.longbridge.com/v2
27+
# LONGBRIDGE_TRADE_WS_URL=wss://openapi-trade.longbridge.com/v2
28+
# LONGBRIDGE_REGION=hk
29+
# 覆盖接入点;SDK 内部用 LONGPORT_REGION(不带 BRIDGE)自动选择,
30+
# 代码会自动同步 LONGBRIDGE_REGION → LONGPORT_REGION。
31+
# hk → *.longbridge.com | cn → *.longbridge.cn
32+
# 其余见:https://open.longbridge.com/zh-CN/docs/getting-started#环境变量
33+
# 夜盘行情 true/false,默认 false
34+
# LONGBRIDGE_ENABLE_OVERNIGHT=false
35+
# K 线推送 realtime 或 confirmed,默认 realtime
36+
# LONGBRIDGE_PUSH_CANDLESTICK_MODE=realtime
37+
# 连接时是否打印行情包(与 README / full-guide 一致:未设置时应用侧默认为关闭,等同 false)
38+
# 设为 1 / true / yes 开启 SDK 详细行情包日志(调试长桥连接时使用)
39+
# LONGBRIDGE_PRINT_QUOTE_PACKAGES=false
2640

2741
# ===================================
2842
# AI 模型配置
@@ -92,12 +106,15 @@ GEMINI_API_KEY=
92106
# LLM_OLLAMA_BASE_URL=http://localhost:11434
93107
# LLM_OLLAMA_MODELS=qwen3:8b,llama3.2
94108

95-
# 高级:YAML 配置(可选,标准 LiteLLM Router 格式,参考 litellm_config.example.yaml)
109+
# 高级:模型路由 YAML 配置(可选,参考 litellm_config.example.yaml)
96110
# LITELLM_CONFIG=./litellm_config.yaml
97111

98112
# ===================================
99113
# 搜索引擎配置(用于获取股票新闻)
100114
# ===================================
115+
#Anspire Search API Keys (支持多个,逗号分隔)
116+
# 获取: https://aisearch.anspire.cn/
117+
ANSPIRE_API_KEYS=
101118
# Bocha API Keys(中文搜索优化,支持AI摘要,支持多个,逗号分隔)
102119
# 获取: https://open.bocha.cn/
103120
# BOCHA_API_KEYS=your_bocha_key_here
@@ -141,9 +158,9 @@ SEARXNG_PUBLIC_INSTANCES_ENABLED=true
141158
# ===================================
142159
# 启用 Agent 策略对话(默认 false,内部统一命名为 skill)
143160
# AGENT_MODE=true
144-
# Agent 主模型(可选):留空时继承 LITELLM_MODEL;无 provider 前缀会按 openai/<model> 解析
161+
# Agent 主模型(可选):留空时继承主模型;无 provider 前缀会按 openai/<model> 解析
145162
# AGENT_LITELLM_MODEL=
146-
# Agent 最多推理步数
163+
# Agent 最大推理步数上限(默认 10 时各子 Agent 按自身预设运行;高于默认 10 时所有子 Agent 统一采用该值;低于某子 Agent 默认值时会作为上限进行封顶)
147164
# AGENT_MAX_STEPS=10
148165
# 默认启用策略(逗号分隔),不配置时使用以下内置默认值
149166
#
@@ -212,6 +229,11 @@ AGENT_SKILLS=
212229
# 在飞书群 -> 设置 -> 群机器人 -> 添加机器人 -> 自定义机器人 -> 复制 Webhook 地址
213230
#
214231
# FEISHU_WEBHOOK_URL=https://open.feishu.cn/open-apis/bot/v2/hook/your_key_here
232+
# 如果机器人安全设置开启了“签名校验”,需同步填写 secret
233+
# FEISHU_WEBHOOK_SECRET=your_feishu_webhook_secret
234+
# 如果机器人安全设置开启了“关键词”,需填写同一个关键词;系统会自动在每条消息前补上
235+
# FEISHU_WEBHOOK_KEYWORD=股票日报
236+
# 注意:FEISHU_APP_ID / FEISHU_APP_SECRET 用于飞书应用、云文档或 Stream 模式,不会直接启用群 Webhook 推送
215237
#
216238
# 【方式三】Telegram 机器人(需同时配置两项)
217239
# 1. 在 Telegram 找 @BotFather -> /newbot -> 获取 Bot Token
@@ -232,7 +254,10 @@ AGENT_SKILLS=
232254
# EMAIL_RECEIVERS=receiver@example.com # 可选,留空则发给自己
233255
#
234256
# 【方式四扩展】股票分组发往不同邮箱(Issue #268,可选)
235-
# 配置后,不同股票组的报告发送到对应邮箱;大盘复盘发往所有配置邮箱
257+
# STOCK_LIST 决定实际分析范围;STOCK_GROUP_N 仅决定邮件发给谁,建议始终写成 STOCK_LIST 的子集
258+
# Telegram / 企业微信 / Webhook 等其他渠道仍会按完整 STOCK_LIST 推送,不会因为分组而拆分
259+
# 当前仓库默认 GitHub Actions daily_analysis workflow 不会自动注入任意编号的 STOCK_GROUP_N / EMAIL_GROUP_N
260+
# 因此该能力适用于本地 .env、Docker,或其他已显式注入这些变量的运行环境
236261
# STOCK_GROUP_1=600519,300750
237262
# EMAIL_GROUP_1=user1@example.com
238263
# STOCK_GROUP_2=002594,AAPL
@@ -271,6 +296,9 @@ AGENT_SKILLS=
271296
# DISCORD_BOT_TOKEN=
272297
# DISCORD_MAIN_CHANNEL_ID=
273298
# DISCORD_CHANNEL_ID= # 兼容旧变量名,推荐改用 DISCORD_MAIN_CHANNEL_ID
299+
# 如果你要接收 Discord Interaction / Webhook 回调,必须配置公钥用于验签
300+
# 获取方式:Discord Developer Portal -> General Information -> Public Key
301+
# DISCORD_INTERACTIONS_PUBLIC_KEY=
274302
#
275303
# 【方式九】Slack 配置
276304
# 支持两种方式:Bot API(推荐)和 Incoming Webhook
@@ -346,14 +374,25 @@ DINGTALK_APP_SECRET=xxxx
346374
# 启用 Stream 模式
347375
DINGTALK_STREAM_ENABLED=false
348376

349-
# 飞书应用机器人配置
377+
# 飞书应用机器人配置(用于 Stream Bot / 云文档模式,不会直接开启群 Webhook 推送)
350378
FEISHU_APP_ID=xxxx
351-
FEISHU_APP_SECRET=xxxx
379+
FEISHU_APP_SECRET=xxxx # 飞书应用 Secret,仅应用/Stream Bot/云文档模式使用;群通知推送请使用 FEISHU_WEBHOOK_URL
352380
# 启用长连接模式
353381
FEISHU_STREAM_ENABLED=false
382+
# 飞书群机器人 Webhook 安全配置(仅 Webhook 推送模式使用)
383+
# FEISHU_WEBHOOK_SECRET=your_feishu_webhook_secret
384+
# FEISHU_WEBHOOK_KEYWORD=股票日报
354385

355386
# 数据库路径
356387
DATABASE_PATH=./data/stock_analysis.db
388+
# SQLite 写入优化:文件库默认启用 WAL,降低批量写入和并发回写时的锁竞争
389+
SQLITE_WAL_ENABLED=true
390+
# SQLite 等锁超时(毫秒)
391+
SQLITE_BUSY_TIMEOUT_MS=5000
392+
# SQLite 遇到 database is locked / database table is locked 时的最大重试次数
393+
SQLITE_WRITE_RETRY_MAX=3
394+
# SQLite 写入重试基础退避时间(秒,按指数退避递增)
395+
SQLITE_WRITE_RETRY_BASE_DELAY=0.1
357396

358397
# ===================================
359398
# 回测配置(可选)

.gitattributes

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# 对 changelog 使用 union 合并策略
2+
# 多个并发 PR 向 [Unreleased] 末尾追加条目时,Git 直接取两边所有行而不产生冲突标记。
3+
# 适用于 append-only 的 changelog 文件。
4+
docs/CHANGELOG.md merge=union

.github/copilot-instructions.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ If any instruction in this file conflicts with `AGENTS.md`, follow `AGENTS.md`.
1515
- Do not hardcode secrets, accounts, ports, model names, absolute environment-specific paths, or environment-specific branches.
1616
- Reuse existing modules, configuration entrypoints, scripts, and tests instead of adding parallel implementations.
1717
- For user-visible behavior changes, CLI/API changes, deployment changes, notification changes, or report-structure changes, update the relevant docs and `docs/CHANGELOG.md`.
18+
- In `docs/CHANGELOG.md`, the `[Unreleased]` section uses a **flat format**: one line per entry formatted as `- [type] description`, where type is one of `新功能`/`改进`/`修复`/`文档`/`测试`/`chore`. **Do not add `### category headers` inside `[Unreleased]`** to minimize merge conflicts in concurrent PRs. A maintainer will reorganize into the full categorized format at release time.
1819
- Use `README.md` for getting started, runtime/deployment, and high-level capability summaries; put detailed module behavior, page interaction, and troubleshooting guidance in the appropriate `docs/*.md` file.
1920
- If `README.md` is not updated, explain why and point to the document that was updated instead.
2021
- When config semantics change, sync `.env.example` and assess impact on local runs, Docker, GitHub Actions, API, Web, and Desktop.

.github/workflows/daily_analysis.yml

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
analyze:
3333
runs-on: ubuntu-latest
3434
# 添加超时限制,防止任务卡死
35-
timeout-minutes: 30
35+
timeout-minutes: ${{ fromJSON(vars.ANALYSIS_TIMEOUT_MINUTES || '30') }}
3636

3737
steps:
3838
- name: 随机延迟(避免固定时间访问)
@@ -108,6 +108,18 @@ jobs:
108108
# 数据源
109109
# ==========================================
110110
TUSHARE_TOKEN: ${{ secrets.TUSHARE_TOKEN }}
111+
# Longbridge OpenAPI(美股/港股实时行情字段补充;不设则仅 YFinance/AkShare,无 [Longbridge] 调用)
112+
LONGBRIDGE_APP_KEY: ${{ secrets.LONGBRIDGE_APP_KEY }}
113+
LONGBRIDGE_APP_SECRET: ${{ secrets.LONGBRIDGE_APP_SECRET }}
114+
LONGBRIDGE_ACCESS_TOKEN: ${{ secrets.LONGBRIDGE_ACCESS_TOKEN }}
115+
LONGBRIDGE_REGION: ${{ vars.LONGBRIDGE_REGION || secrets.LONGBRIDGE_REGION }}
116+
LONGBRIDGE_HTTP_URL: ${{ vars.LONGBRIDGE_HTTP_URL || secrets.LONGBRIDGE_HTTP_URL }}
117+
LONGBRIDGE_QUOTE_WS_URL: ${{ vars.LONGBRIDGE_QUOTE_WS_URL || secrets.LONGBRIDGE_QUOTE_WS_URL }}
118+
LONGBRIDGE_TRADE_WS_URL: ${{ vars.LONGBRIDGE_TRADE_WS_URL || secrets.LONGBRIDGE_TRADE_WS_URL }}
119+
LONGBRIDGE_STATIC_INFO_TTL_SECONDS: ${{ vars.LONGBRIDGE_STATIC_INFO_TTL_SECONDS || secrets.LONGBRIDGE_STATIC_INFO_TTL_SECONDS }}
120+
LONGBRIDGE_ENABLE_OVERNIGHT: ${{ vars.LONGBRIDGE_ENABLE_OVERNIGHT || secrets.LONGBRIDGE_ENABLE_OVERNIGHT }}
121+
LONGBRIDGE_PUSH_CANDLESTICK_MODE: ${{ vars.LONGBRIDGE_PUSH_CANDLESTICK_MODE || secrets.LONGBRIDGE_PUSH_CANDLESTICK_MODE }}
122+
LONGBRIDGE_PRINT_QUOTE_PACKAGES: ${{ vars.LONGBRIDGE_PRINT_QUOTE_PACKAGES || secrets.LONGBRIDGE_PRINT_QUOTE_PACKAGES }}
111123

112124
# ==========================================
113125
# 搜索服务
@@ -185,6 +197,7 @@ jobs:
185197
# 运行配置 ⬅️ 新增!
186198
# ==========================================
187199
REPORT_TYPE: ${{ vars.REPORT_TYPE || secrets.REPORT_TYPE || 'simple' }}
200+
REPORT_LANGUAGE: ${{ vars.REPORT_LANGUAGE || secrets.REPORT_LANGUAGE || '' }}
188201
SINGLE_STOCK_NOTIFY: ${{ vars.SINGLE_STOCK_NOTIFY || secrets.SINGLE_STOCK_NOTIFY || 'false' }}
189202
MARKET_REVIEW_ENABLED: ${{ vars.MARKET_REVIEW_ENABLED || secrets.MARKET_REVIEW_ENABLED || 'true' }}
190203
ANALYSIS_DELAY: ${{ vars.ANALYSIS_DELAY || secrets.ANALYSIS_DELAY || '0' }}
@@ -235,6 +248,10 @@ jobs:
235248
echo " OpenAI API Key: $([ -n "$OPENAI_API_KEY" ] && echo '✅ 已配置' || echo '⚪ 未配置')"
236249
echo " Anthropic Key: $([ -n "$ANTHROPIC_API_KEY" ] && echo '✅ 已配置' || echo '⚪ 未配置')"
237250
echo ""
251+
echo "【数据源】"
252+
echo " Tushare Token: $([ -n "$TUSHARE_TOKEN" ] && echo '✅ 已配置' || echo '⚪ 未配置')"
253+
echo " Longbridge: $([ -n "$LONGBRIDGE_APP_KEY" ] && [ -n "$LONGBRIDGE_APP_SECRET" ] && [ -n "$LONGBRIDGE_ACCESS_TOKEN" ] && echo '✅ 已配置(美股/港股行情补充)' || echo '⚪ 未配置(仅 YFinance 等,无长桥调用)')"
254+
echo ""
238255
echo "【搜索引擎】"
239256
echo " Bocha API Keys: $([ -n "$BOCHA_API_KEYS" ] && echo '✅ 已配置' || echo '⚪ 未配置')"
240257
echo " Tavily API Keys: $([ -n "$TAVILY_API_KEYS" ] && echo '✅ 已配置' || echo '⚪ 未配置')"

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
- 默认稳定性优先于“顺手优化”;非当前任务直接需要的重构、抽象和基础设施迁移一律克制。
1919
- 新增配置项时,必须同步更新 `.env.example` 和相关文档。
2020
- 涉及用户可见能力、CLI/API 行为、部署方式、通知方式、报告结构变化时,必须同步更新相关文档与 `docs/CHANGELOG.md`
21+
- `docs/CHANGELOG.md``[Unreleased]` 段使用**扁平格式**:每条独立一行,格式为 `- [类型] 描述`,类型取值:`新功能`/`改进`/`修复`/`文档`/`测试`/`chore`**禁止在 `[Unreleased]` 内新增 `### 类目标题`**,以减少并发 PR 的 merge 冲突。发版时由 maintainer 汇总整理成带标题的正式格式。
2122
- `README.md` 用于入门、运行、部署、核心能力总览;更细的模块行为、页面交互、专题配置与排障说明,优先更新对应 `docs/*.md` 或专题文档。
2223
- 若未更新 `README.md`,需在交付说明或 PR 描述中写明原因,以及本次信息实际落到的文档位置。
2324
- 变更中英双语文档之一时,需评估另一份是否需要同步;若未同步,交付说明里要写明原因。

0 commit comments

Comments
 (0)