Skip to content

Commit 0a9a1de

Browse files
authored
Merge branch 'ZhuLinsen:main' into main
2 parents dddd243 + 8816421 commit 0a9a1de

112 files changed

Lines changed: 10902 additions & 1212 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.

.codex

Whitespace-only changes.

.env.example

Lines changed: 143 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,17 @@
88
# 深市:000xxx, 002xxx, 300xxx
99
STOCK_LIST=600519,300750,002594
1010

11+
# Anspire Open API Keys(支持多个,逗号分隔)
12+
# 获取: https://open.anspire.cn/?share_code=QFBC0FYC
13+
# 在未配置更高优先级 OpenAI-compatible 来源时,满足条件可复用该 key 给 Anspire 大模型网关与新闻搜索。
14+
# 下列网关与模型为当前项目示例配置;是否可用请以 Anspire 控制台与官方文档为准:
15+
# 示例网关: https://open-gateway.anspire.cn/v6
16+
# 示例模型:Doubao-Seed-2.0-lite(可覆盖为 ANSPIRE_LLM_MODEL=Doubao-Seed-2.0-pro)
17+
# 若网关有区域/版本差异,可覆盖为 ANSPIRE_LLM_BASE_URL=https://open-gateway.anspire.ai/v6
18+
ANSPIRE_API_KEYS=
19+
# ANSPIRE_LLM_MODEL=Doubao-Seed-2.0-lite
20+
# ANSPIRE_LLM_BASE_URL=https://open-gateway.anspire.cn/v6
21+
# ANSPIRE_LLM_ENABLED=true
1122
# 数据源配置
1223
# Tushare Pro Token(可选,从 https://tushare.pro/weborder/#/login?reg=834638 获取)
1324
TUSHARE_TOKEN=
@@ -44,6 +55,7 @@ TUSHARE_TOKEN=
4455
# 完整说明:docs/LLM_CONFIG_GUIDE.md
4556
#
4657
# 【快速上手】填一个 API Key 即可运行,系统自动识别模型。
58+
# Anspire Open(一站式模型+搜索)→ 填 ANSPIRE_API_KEYS
4759
# Gemini(免费额度)→ 填 GEMINI_API_KEY
4860
# DeepSeek(性价比高)→ 填 DEEPSEEK_API_KEY
4961
# AIHubmix(聚合平台)→ 填 AIHUBMIX_KEY
@@ -86,7 +98,7 @@ GEMINI_API_KEY=
8698
# - Moonshot API / 模型文档:https://platform.kimi.ai/docs/guide/kimi-k2-6-quickstart
8799
# - Moonshot 官方模型卡(评测默认 temperature = 1.0):https://huggingface.co/moonshotai/Kimi-K2.6
88100
# - LiteLLM OpenAI-Compatible 规范:https://docs.litellm.ai/docs/providers/openai_compatible
89-
# 当前仓库运行时依赖窗口:litellm>=1.80.10,<1.82.7见 requirements.txt),本次兼容修复按该范围验证
101+
# 当前仓库运行时依赖约束:litellm>=1.80.10,!=1.82.7,!=1.82.8,<2.0.0(显式排除 PyPI 事故版本,见 requirements.txt)。
90102
# 因此 kimi-k2.6 会自动改用 1.0,避免 API 拒绝请求;其他模型和 fallback 仍使用你配置的 LLM_TEMPERATURE。
91103
# Web 设置页 / 桌面端导入不会静默清空或改写 LLM_TEMPERATURE;只在真正发请求前按 Kimi 要求临时归一化。
92104
# 如果主模型切回非 Kimi,原本配置的温度会自动恢复;最小回滚方式是回退本次 Kimi 固定温度改动。
@@ -101,34 +113,141 @@ GEMINI_API_KEY=
101113
# LLM_DEEPSEEK_BASE_URL=https://api.deepseek.com
102114
# LLM_DEEPSEEK_MODELS=deepseek-v4-flash,deepseek-v4-pro
103115
# LLM_GEMINI_API_KEYS=key1,key2
104-
# LLM_GEMINI_MODELS=gemini-2.5-flash
116+
# LLM_GEMINI_MODELS=gemini-3.1-pro-preview
105117
#
106118
# 示例:自定义 API 端点(第三方代理 / 聚合平台 / 转发站)
107119
# LLM_CHANNELS=my_proxy
108120
# LLM_MY_PROXY_BASE_URL=https://your-proxy.example.com/v1
109121
# LLM_MY_PROXY_API_KEY=sk-xxx
110-
# LLM_MY_PROXY_MODELS=gpt-4o-mini,claude-3-5-sonnet
122+
# LLM_MY_PROXY_MODELS=gpt-5.5,claude-sonnet-4-6
111123
# LLM_MY_PROXY_PROTOCOL=openai
112124
#
113125
# 示例:Ollama 本地模型(无需 API Key)
114126
# LLM_CHANNELS=ollama
115127
# LLM_OLLAMA_BASE_URL=http://localhost:11434
116128
# LLM_OLLAMA_MODELS=qwen3:8b,llama3.2
117-
118-
# 高级:模型路由 YAML 配置(可选,参考 litellm_config.example.yaml)
129+
#
130+
# 常用厂商模板(任选其一复制到 .env;完整说明见 docs/llm-providers.md)
131+
#
132+
# Anspire Open(共享搜索与 LLM Key,OpenAI Compatible)
133+
# LLM_CHANNELS=anspire
134+
# LLM_ANSPIRE_PROTOCOL=openai
135+
# LLM_ANSPIRE_BASE_URL=https://open-gateway.anspire.cn/v6(示例)
136+
# LLM_ANSPIRE_API_KEY=sk-xxx
137+
# LLM_ANSPIRE_MODELS=Doubao-Seed-2.0-lite,Doubao-Seed-2.0-pro(示例模型)
138+
# LITELLM_MODEL=openai/Doubao-Seed-2.0-lite(示例)
139+
#
140+
# AIHubmix 聚合平台(OpenAI Compatible)
141+
# LLM_CHANNELS=aihubmix
142+
# LLM_AIHUBMIX_PROTOCOL=openai
143+
# LLM_AIHUBMIX_BASE_URL=https://aihubmix.com/v1
144+
# LLM_AIHUBMIX_API_KEY=sk-xxx
145+
# LLM_AIHUBMIX_MODELS=gpt-5.5,claude-sonnet-4-6,gemini-3.1-pro-preview
146+
# LITELLM_MODEL=openai/gpt-5.5
147+
#
148+
# OpenAI 官方
149+
# LLM_CHANNELS=openai
150+
# LLM_OPENAI_PROTOCOL=openai
151+
# LLM_OPENAI_BASE_URL=https://api.openai.com/v1
152+
# LLM_OPENAI_API_KEY=sk-xxx
153+
# LLM_OPENAI_MODELS=gpt-5.5,gpt-5.4-mini
154+
# LITELLM_MODEL=openai/gpt-5.5
155+
#
156+
# DeepSeek 官方
157+
# LLM_CHANNELS=deepseek
158+
# LLM_DEEPSEEK_PROTOCOL=deepseek
159+
# LLM_DEEPSEEK_BASE_URL=https://api.deepseek.com
160+
# LLM_DEEPSEEK_API_KEY=sk-xxx
161+
# LLM_DEEPSEEK_MODELS=deepseek-v4-flash,deepseek-v4-pro
162+
# LITELLM_MODEL=deepseek/deepseek-v4-flash
163+
#
164+
# Gemini 官方(官方协议,Base URL 留空)
165+
# LLM_CHANNELS=gemini
166+
# LLM_GEMINI_PROTOCOL=gemini
167+
# LLM_GEMINI_API_KEY=xxx
168+
# LLM_GEMINI_MODELS=gemini-3.1-pro-preview,gemini-3-flash-preview
169+
# LITELLM_MODEL=gemini/gemini-3.1-pro-preview
170+
#
171+
# Anthropic Claude 官方(官方协议,Base URL 留空)
172+
# LLM_CHANNELS=anthropic
173+
# LLM_ANTHROPIC_PROTOCOL=anthropic
174+
# LLM_ANTHROPIC_API_KEY=sk-ant-xxx
175+
# LLM_ANTHROPIC_MODELS=claude-sonnet-4-6,claude-opus-4-7
176+
# LITELLM_MODEL=anthropic/claude-sonnet-4-6
177+
#
178+
# Kimi / Moonshot(OpenAI Compatible)
179+
# LLM_CHANNELS=moonshot
180+
# LLM_MOONSHOT_PROTOCOL=openai
181+
# LLM_MOONSHOT_BASE_URL=https://api.moonshot.cn/v1
182+
# LLM_MOONSHOT_API_KEY=sk-xxx
183+
# LLM_MOONSHOT_MODELS=kimi-k2.6,kimi-k2.5
184+
# LITELLM_MODEL=openai/kimi-k2.6
185+
#
186+
# 通义千问 DashScope(OpenAI Compatible)
187+
# LLM_CHANNELS=dashscope
188+
# LLM_DASHSCOPE_PROTOCOL=openai
189+
# LLM_DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
190+
# LLM_DASHSCOPE_API_KEY=sk-xxx
191+
# LLM_DASHSCOPE_MODELS=qwen3.6-plus,qwen3.6-flash
192+
# LITELLM_MODEL=openai/qwen3.6-plus
193+
#
194+
# 智谱 GLM(OpenAI Compatible)
195+
# LLM_CHANNELS=zhipu
196+
# LLM_ZHIPU_PROTOCOL=openai
197+
# LLM_ZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4
198+
# LLM_ZHIPU_API_KEY=xxx
199+
# LLM_ZHIPU_MODELS=glm-5.1,glm-4.7-flash
200+
# LITELLM_MODEL=openai/glm-5.1
201+
#
202+
# MiniMax(OpenAI Compatible)
203+
# 来源:官方 OpenAI API 兼容文档 https://platform.minimax.io/docs/api-reference/text-chat
204+
# LiteLLM 通过 openai/<model> 路由到兼容 Chat Completions 的 Base URL。
205+
# LLM_CHANNELS=minimax
206+
# LLM_MINIMAX_PROTOCOL=openai
207+
# LLM_MINIMAX_BASE_URL=https://api.minimax.io/v1
208+
# LLM_MINIMAX_API_KEY=xxx
209+
# LLM_MINIMAX_MODELS=MiniMax-M2.7,MiniMax-M2.7-highspeed
210+
# LITELLM_MODEL=openai/MiniMax-M2.7
211+
#
212+
# 火山方舟 / 豆包(OpenAI Compatible,按实际开通地域调整 endpoint)
213+
# 来源:火山方舟在线推理 / Responses API 文档 https://www.volcengine.com/docs/82379/2121998
214+
# LiteLLM 通过 openai/<model> 路由到兼容 Chat Completions 的 Base URL。
215+
# LLM_CHANNELS=volcengine
216+
# LLM_VOLCENGINE_PROTOCOL=openai
217+
# LLM_VOLCENGINE_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
218+
# LLM_VOLCENGINE_API_KEY=xxx
219+
# LLM_VOLCENGINE_MODELS=doubao-seed-1-6-251015,doubao-seed-1-6-thinking-251015
220+
# LITELLM_MODEL=openai/doubao-seed-1-6-251015
221+
#
222+
# 硅基流动 SiliconFlow(OpenAI Compatible)
223+
# 来源:官方模型列表 https://docs.siliconflow.cn/quickstart/models
224+
# LLM_CHANNELS=siliconflow
225+
# LLM_SILICONFLOW_PROTOCOL=openai
226+
# LLM_SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1
227+
# LLM_SILICONFLOW_API_KEY=sk-xxx
228+
# LLM_SILICONFLOW_MODELS=deepseek-ai/DeepSeek-V3.2,Qwen/Qwen3-235B-A22B-Thinking-2507
229+
# LITELLM_MODEL=openai/deepseek-ai/DeepSeek-V3.2
230+
#
231+
# OpenRouter(OpenAI Compatible)
232+
# 来源:官方 Models API https://openrouter.ai/docs/api/api-reference/models/get-models
233+
# LLM_CHANNELS=openrouter
234+
# LLM_OPENROUTER_PROTOCOL=openai
235+
# LLM_OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
236+
# LLM_OPENROUTER_API_KEY=sk-or-xxx
237+
# LLM_OPENROUTER_MODELS=~anthropic/claude-sonnet-latest,~openai/gpt-latest
238+
# LITELLM_MODEL=openai/~anthropic/claude-sonnet-latest
239+
240+
# 高级:模型路由 YAML 配置(可选,参考 docs/examples/litellm_config.example.yaml)
119241
# LITELLM_CONFIG=./litellm_config.yaml
120242

121243
# ===================================
122244
# 搜索引擎配置(用于获取股票新闻)
123245
# ===================================
124-
#Anspire Search API Keys (支持多个,逗号分隔)
125-
# 获取: https://aisearch.anspire.cn/
126-
ANSPIRE_API_KEYS=
127246
# Bocha API Keys(中文搜索优化,支持AI摘要,支持多个,逗号分隔)
128247
# 获取: https://open.bocha.cn/
129248
# BOCHA_API_KEYS=your_bocha_key_here
130249
# MiniMax API Key(Coding Plan Web Search,支持多个,逗号分隔)
131-
# 获取: https://platform.minimaxi.com/
250+
# 获取: https://platform.minimax.io/
132251
# MINIMAX_API_KEYS=your_minimax_key_here
133252
# Tavily API Keys(支持多个,逗号分隔)
134253
TAVILY_API_KEYS=
@@ -225,6 +344,16 @@ AGENT_SKILLS=
225344
# 策略路由模式(auto=根据市场状态自动选择 / manual=使用 AGENT_SKILLS 列表)
226345
# AGENT_SKILL_ROUTING=auto
227346

347+
# 事件告警监控(schedule 模式后台轮询;触发后复用已配置通知渠道)
348+
# 兼容性说明:本节仅新增告警规则配置,不会修改模型名、provider、Base URL、LiteLLM 或 LLM 配置语义;回退只需关闭/移除事件监控配置。
349+
# 支持规则:
350+
# price_cross — 价格突破阈值,direction: above / below,字段: price
351+
# price_change_percent — 涨跌幅阈值,direction: up / down,字段: change_pct(单位:%)
352+
# volume_spike — 成交量放大,字段: multiplier(相对近 20 日均量倍数)
353+
# AGENT_EVENT_MONITOR_ENABLED=false
354+
# AGENT_EVENT_MONITOR_INTERVAL_MINUTES=5
355+
# AGENT_EVENT_ALERT_RULES_JSON=[{"stock_code":"600519","alert_type":"price_cross","direction":"above","price":1800},{"stock_code":"300750","alert_type":"price_change_percent","direction":"down","change_pct":3.0},{"stock_code":"000858","alert_type":"volume_spike","multiplier":2.5}]
356+
228357
# ===================================
229358
# 通知渠道配置(可同时配置多个,全部推送)
230359
# ===================================
@@ -278,6 +407,7 @@ AGENT_SKILLS=
278407
#
279408
# CUSTOM_WEBHOOK_URLS=https://oapi.dingtalk.com/robot/send?access_token=xxx,https://hooks.slack.com/services/xxx
280409
# CUSTOM_WEBHOOK_BEARER_TOKEN= # 可选,用于需要认证的 Webhook (Header Authorization: Bearer <token>)
410+
# CUSTOM_WEBHOOK_BODY_TEMPLATE= # 可选,JSON body 模板;支持 $content_json/$content/$title_json/$title
281411
# WEBHOOK_VERIFY_SSL=true # 默认校验。设为 false 可支持自签名证书。警告:禁用后存在 MITM 劫持风险,仅限可信内网
282412
#
283413
# 【方式六】Pushover 配置
@@ -329,6 +459,10 @@ AGENT_SKILLS=
329459
# 注册Server酱3账号并获取SendKey https://sc3.ft07.com/
330460
# SERVERCHAN3_SENDKEY=
331461
#
462+
# 【方式十一】AstrBot 配置
463+
# ASTRBOT_URL=
464+
# ASTRBOT_TOKEN= # 可选,用于需要 Bearer Token 的 AstrBot Webhook
465+
#
332466
# 【高级配置】消息长度限制(字节)
333467
# 超过限制会自动分批发送,一般无需修改
334468
# FEISHU_MAX_BYTES=20000 # 飞书限制约 20KB,默认 20000 字节

.github/workflows/daily_analysis.yml

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,14 @@ jobs:
140140
LLM_AIHUBMIX_ENABLED: ${{ vars.LLM_AIHUBMIX_ENABLED || secrets.LLM_AIHUBMIX_ENABLED }}
141141
LLM_AIHUBMIX_EXTRA_HEADERS: ${{ vars.LLM_AIHUBMIX_EXTRA_HEADERS || secrets.LLM_AIHUBMIX_EXTRA_HEADERS }}
142142

143+
LLM_ANSPIRE_PROTOCOL: ${{ vars.LLM_ANSPIRE_PROTOCOL || secrets.LLM_ANSPIRE_PROTOCOL }}
144+
LLM_ANSPIRE_BASE_URL: ${{ vars.LLM_ANSPIRE_BASE_URL || secrets.LLM_ANSPIRE_BASE_URL }}
145+
LLM_ANSPIRE_API_KEY: ${{ secrets.LLM_ANSPIRE_API_KEY }}
146+
LLM_ANSPIRE_API_KEYS: ${{ secrets.LLM_ANSPIRE_API_KEYS }}
147+
LLM_ANSPIRE_MODELS: ${{ vars.LLM_ANSPIRE_MODELS || secrets.LLM_ANSPIRE_MODELS }}
148+
LLM_ANSPIRE_ENABLED: ${{ vars.LLM_ANSPIRE_ENABLED || secrets.LLM_ANSPIRE_ENABLED }}
149+
LLM_ANSPIRE_EXTRA_HEADERS: ${{ vars.LLM_ANSPIRE_EXTRA_HEADERS || secrets.LLM_ANSPIRE_EXTRA_HEADERS }}
150+
143151
LLM_OPENAI_PROTOCOL: ${{ vars.LLM_OPENAI_PROTOCOL || secrets.LLM_OPENAI_PROTOCOL }}
144152
LLM_OPENAI_BASE_URL: ${{ vars.LLM_OPENAI_BASE_URL || secrets.LLM_OPENAI_BASE_URL }}
145153
LLM_OPENAI_API_KEY: ${{ secrets.LLM_OPENAI_API_KEY }}
@@ -164,6 +172,54 @@ jobs:
164172
LLM_MOONSHOT_ENABLED: ${{ vars.LLM_MOONSHOT_ENABLED || secrets.LLM_MOONSHOT_ENABLED }}
165173
LLM_MOONSHOT_EXTRA_HEADERS: ${{ vars.LLM_MOONSHOT_EXTRA_HEADERS || secrets.LLM_MOONSHOT_EXTRA_HEADERS }}
166174

175+
LLM_DASHSCOPE_PROTOCOL: ${{ vars.LLM_DASHSCOPE_PROTOCOL || secrets.LLM_DASHSCOPE_PROTOCOL }}
176+
LLM_DASHSCOPE_BASE_URL: ${{ vars.LLM_DASHSCOPE_BASE_URL || secrets.LLM_DASHSCOPE_BASE_URL }}
177+
LLM_DASHSCOPE_API_KEY: ${{ secrets.LLM_DASHSCOPE_API_KEY }}
178+
LLM_DASHSCOPE_API_KEYS: ${{ secrets.LLM_DASHSCOPE_API_KEYS }}
179+
LLM_DASHSCOPE_MODELS: ${{ vars.LLM_DASHSCOPE_MODELS || secrets.LLM_DASHSCOPE_MODELS }}
180+
LLM_DASHSCOPE_ENABLED: ${{ vars.LLM_DASHSCOPE_ENABLED || secrets.LLM_DASHSCOPE_ENABLED }}
181+
LLM_DASHSCOPE_EXTRA_HEADERS: ${{ vars.LLM_DASHSCOPE_EXTRA_HEADERS || secrets.LLM_DASHSCOPE_EXTRA_HEADERS }}
182+
183+
LLM_ZHIPU_PROTOCOL: ${{ vars.LLM_ZHIPU_PROTOCOL || secrets.LLM_ZHIPU_PROTOCOL }}
184+
LLM_ZHIPU_BASE_URL: ${{ vars.LLM_ZHIPU_BASE_URL || secrets.LLM_ZHIPU_BASE_URL }}
185+
LLM_ZHIPU_API_KEY: ${{ secrets.LLM_ZHIPU_API_KEY }}
186+
LLM_ZHIPU_API_KEYS: ${{ secrets.LLM_ZHIPU_API_KEYS }}
187+
LLM_ZHIPU_MODELS: ${{ vars.LLM_ZHIPU_MODELS || secrets.LLM_ZHIPU_MODELS }}
188+
LLM_ZHIPU_ENABLED: ${{ vars.LLM_ZHIPU_ENABLED || secrets.LLM_ZHIPU_ENABLED }}
189+
LLM_ZHIPU_EXTRA_HEADERS: ${{ vars.LLM_ZHIPU_EXTRA_HEADERS || secrets.LLM_ZHIPU_EXTRA_HEADERS }}
190+
191+
LLM_MINIMAX_PROTOCOL: ${{ vars.LLM_MINIMAX_PROTOCOL || secrets.LLM_MINIMAX_PROTOCOL }}
192+
LLM_MINIMAX_BASE_URL: ${{ vars.LLM_MINIMAX_BASE_URL || secrets.LLM_MINIMAX_BASE_URL }}
193+
LLM_MINIMAX_API_KEY: ${{ secrets.LLM_MINIMAX_API_KEY }}
194+
LLM_MINIMAX_API_KEYS: ${{ secrets.LLM_MINIMAX_API_KEYS }}
195+
LLM_MINIMAX_MODELS: ${{ vars.LLM_MINIMAX_MODELS || secrets.LLM_MINIMAX_MODELS }}
196+
LLM_MINIMAX_ENABLED: ${{ vars.LLM_MINIMAX_ENABLED || secrets.LLM_MINIMAX_ENABLED }}
197+
LLM_MINIMAX_EXTRA_HEADERS: ${{ vars.LLM_MINIMAX_EXTRA_HEADERS || secrets.LLM_MINIMAX_EXTRA_HEADERS }}
198+
199+
LLM_VOLCENGINE_PROTOCOL: ${{ vars.LLM_VOLCENGINE_PROTOCOL || secrets.LLM_VOLCENGINE_PROTOCOL }}
200+
LLM_VOLCENGINE_BASE_URL: ${{ vars.LLM_VOLCENGINE_BASE_URL || secrets.LLM_VOLCENGINE_BASE_URL }}
201+
LLM_VOLCENGINE_API_KEY: ${{ secrets.LLM_VOLCENGINE_API_KEY }}
202+
LLM_VOLCENGINE_API_KEYS: ${{ secrets.LLM_VOLCENGINE_API_KEYS }}
203+
LLM_VOLCENGINE_MODELS: ${{ vars.LLM_VOLCENGINE_MODELS || secrets.LLM_VOLCENGINE_MODELS }}
204+
LLM_VOLCENGINE_ENABLED: ${{ vars.LLM_VOLCENGINE_ENABLED || secrets.LLM_VOLCENGINE_ENABLED }}
205+
LLM_VOLCENGINE_EXTRA_HEADERS: ${{ vars.LLM_VOLCENGINE_EXTRA_HEADERS || secrets.LLM_VOLCENGINE_EXTRA_HEADERS }}
206+
207+
LLM_SILICONFLOW_PROTOCOL: ${{ vars.LLM_SILICONFLOW_PROTOCOL || secrets.LLM_SILICONFLOW_PROTOCOL }}
208+
LLM_SILICONFLOW_BASE_URL: ${{ vars.LLM_SILICONFLOW_BASE_URL || secrets.LLM_SILICONFLOW_BASE_URL }}
209+
LLM_SILICONFLOW_API_KEY: ${{ secrets.LLM_SILICONFLOW_API_KEY }}
210+
LLM_SILICONFLOW_API_KEYS: ${{ secrets.LLM_SILICONFLOW_API_KEYS }}
211+
LLM_SILICONFLOW_MODELS: ${{ vars.LLM_SILICONFLOW_MODELS || secrets.LLM_SILICONFLOW_MODELS }}
212+
LLM_SILICONFLOW_ENABLED: ${{ vars.LLM_SILICONFLOW_ENABLED || secrets.LLM_SILICONFLOW_ENABLED }}
213+
LLM_SILICONFLOW_EXTRA_HEADERS: ${{ vars.LLM_SILICONFLOW_EXTRA_HEADERS || secrets.LLM_SILICONFLOW_EXTRA_HEADERS }}
214+
215+
LLM_OPENROUTER_PROTOCOL: ${{ vars.LLM_OPENROUTER_PROTOCOL || secrets.LLM_OPENROUTER_PROTOCOL }}
216+
LLM_OPENROUTER_BASE_URL: ${{ vars.LLM_OPENROUTER_BASE_URL || secrets.LLM_OPENROUTER_BASE_URL }}
217+
LLM_OPENROUTER_API_KEY: ${{ secrets.LLM_OPENROUTER_API_KEY }}
218+
LLM_OPENROUTER_API_KEYS: ${{ secrets.LLM_OPENROUTER_API_KEYS }}
219+
LLM_OPENROUTER_MODELS: ${{ vars.LLM_OPENROUTER_MODELS || secrets.LLM_OPENROUTER_MODELS }}
220+
LLM_OPENROUTER_ENABLED: ${{ vars.LLM_OPENROUTER_ENABLED || secrets.LLM_OPENROUTER_ENABLED }}
221+
LLM_OPENROUTER_EXTRA_HEADERS: ${{ vars.LLM_OPENROUTER_EXTRA_HEADERS || secrets.LLM_OPENROUTER_EXTRA_HEADERS }}
222+
167223
LLM_OLLAMA_PROTOCOL: ${{ vars.LLM_OLLAMA_PROTOCOL || secrets.LLM_OLLAMA_PROTOCOL }}
168224
LLM_OLLAMA_BASE_URL: ${{ vars.LLM_OLLAMA_BASE_URL || secrets.LLM_OLLAMA_BASE_URL }}
169225
LLM_OLLAMA_API_KEY: ${{ secrets.LLM_OLLAMA_API_KEY }}
@@ -193,6 +249,9 @@ jobs:
193249
# 搜索服务
194250
# ==========================================
195251
ANSPIRE_API_KEYS: ${{ secrets.ANSPIRE_API_KEYS }}
252+
ANSPIRE_LLM_MODEL: ${{ vars.ANSPIRE_LLM_MODEL || secrets.ANSPIRE_LLM_MODEL }}
253+
ANSPIRE_LLM_BASE_URL: ${{ vars.ANSPIRE_LLM_BASE_URL || secrets.ANSPIRE_LLM_BASE_URL }}
254+
ANSPIRE_LLM_ENABLED: ${{ vars.ANSPIRE_LLM_ENABLED || secrets.ANSPIRE_LLM_ENABLED }}
196255
BOCHA_API_KEYS: ${{ secrets.BOCHA_API_KEYS }}
197256
TAVILY_API_KEYS: ${{ secrets.TAVILY_API_KEYS }}
198257
SERPAPI_API_KEYS: ${{ secrets.SERPAPI_API_KEYS }}
@@ -211,6 +270,8 @@ jobs:
211270

212271
# 方式二:飞书 Webhook
213272
FEISHU_WEBHOOK_URL: ${{ secrets.FEISHU_WEBHOOK_URL }}
273+
FEISHU_WEBHOOK_SECRET: ${{ secrets.FEISHU_WEBHOOK_SECRET }}
274+
FEISHU_WEBHOOK_KEYWORD: ${{ vars.FEISHU_WEBHOOK_KEYWORD || secrets.FEISHU_WEBHOOK_KEYWORD }}
214275

215276
# 方式三:Telegram
216277
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
@@ -229,10 +290,13 @@ jobs:
229290

230291
# 方式六:PushPlus ⬅️ 新增!
231292
PUSHPLUS_TOKEN: ${{ secrets.PUSHPLUS_TOKEN }}
293+
PUSHPLUS_TOPIC: ${{ vars.PUSHPLUS_TOPIC || secrets.PUSHPLUS_TOPIC }}
232294

233295
# 方式七:自定义 Webhook(钉钉、Bark、自建服务等)
234296
CUSTOM_WEBHOOK_URLS: ${{ secrets.CUSTOM_WEBHOOK_URLS }}
235297
CUSTOM_WEBHOOK_BEARER_TOKEN: ${{ secrets.CUSTOM_WEBHOOK_BEARER_TOKEN }}
298+
CUSTOM_WEBHOOK_BODY_TEMPLATE: ${{ vars.CUSTOM_WEBHOOK_BODY_TEMPLATE || secrets.CUSTOM_WEBHOOK_BODY_TEMPLATE }}
299+
WEBHOOK_VERIFY_SSL: ${{ vars.WEBHOOK_VERIFY_SSL || secrets.WEBHOOK_VERIFY_SSL || 'true' }}
236300

237301
# 方式八:Discord
238302
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
@@ -310,9 +374,14 @@ jobs:
310374
echo "📋 配置检查"
311375
echo "=========================================="
312376
echo "【AI 配置】"
313-
echo " LiteLLM: $([ -n "$LITELLM_CONFIG" ] || [ -n "$LITELLM_API_KEY" ] || [ -n "$LITELLM_MODEL" ] && echo '✅ 已配置' || echo '❌ 未配置')"
377+
if [ -n "$LITELLM_CONFIG" ] || [ -n "$LITELLM_API_KEY" ] || [ -n "$LITELLM_MODEL" ] || [ -n "$ANSPIRE_API_KEYS" ]; then
378+
echo " LiteLLM: ✅ 已配置"
379+
else
380+
echo " LiteLLM: ❌ 未配置"
381+
fi
314382
echo " Gemini API Key: $([ -n "$GEMINI_API_KEY" ] && echo '✅ 已配置' || echo '❌ 未配置')"
315383
echo " DeepSeek Key: $([ -n "$DEEPSEEK_API_KEY" ] && echo '✅ 已配置' || echo '⚪ 未配置')"
384+
echo " Anspire Key: $([ -n "$ANSPIRE_API_KEYS" ] && echo '✅ 已配置' || echo '⚪ 未配置')"
316385
echo " AIHubMix Key: $([ -n "$AIHUBMIX_KEY" ] && echo '✅ 已配置' || echo '⚪ 未配置')"
317386
echo " OpenAI API Key: $([ -n "$OPENAI_API_KEY" ] && echo '✅ 已配置' || echo '⚪ 未配置')"
318387
echo " Anthropic Key: $([ -n "$ANTHROPIC_API_KEY" ] && echo '✅ 已配置' || echo '⚪ 未配置')"

.github/workflows/network-smoke.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ jobs:
4040
continue-on-error: true
4141
run: |
4242
set -o pipefail
43-
./test.sh quick --no-notify | tee quick-smoke.log
43+
./scripts/test.sh quick --no-notify | tee quick-smoke.log
4444
4545
- name: 📤 Upload smoke logs
4646
if: always()

.gitignore

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@
88
# 测试文件(可能包含敏感配置)
99
# 仅忽略仓库根目录下的临时 test_*.py 脚本;tests/ 目录下的单元测试需要纳入版本控制。
1010
/test_*.py
11-
!test_env.py
11+
/test.sh
12+
13+
# 本地评审与高级路由配置(可能包含敏感信息或临时分析产物)
14+
/.codex
15+
/review.md
16+
/litellm_config.yaml
17+
/litellm_config.*.yaml
1218

1319
# Python
1420
__pycache__/

0 commit comments

Comments
 (0)