docs/LLM_CONFIG_GUIDE.md
欢迎!无论你是刚接触 AI 的新手小白,还是精通各种 API 的高玩老手,这份指南都能帮你快速把大模型(LLM)跑起来。
本项目对外提供统一的 AI 模型接入体验,支持主流官方 API、OpenAI 兼容平台以及本地模型。底层由 LiteLLM 驱动,但大多数用户只需要理解“选服务商、填 API Key、选主模型/渠道”这条默认路径。为了照顾不同阶段的用户,我们设计了“三层优先级”配置,按需选择最适合你的方式即可。
如果你正在选择具体服务商、配置 GitHub Actions Secrets / Variables、排查 details.reason 错误或准备回滚配置,请优先查看 LLM 服务商配置指南。该文档集中维护 provider 预设、Actions 变量对照、运行时能力检测边界和常见错误处理建议。
目标: 只要记得填入 API Key 和对应的模型名就能立刻用。不需要折腾复杂概念。
如果你只打算用一种模型,这是最快捷的办法。打开项目根目录下的 .env 文件(如果没有,复制一份 .env.example 并重命名为 .env)。
💡 推荐 Anspire Open:支持中文优化的联网搜索与 OpenAI-compatible 路径一体化体验,适合只准备一个 Key 的用户。
- 以下为配置示例,模型与网关可用性以账号权限和 Anspire 控制台为准;本项目未在本次 PR 中新增可复现的线上连通性 smoke 验证。
- 建议在 Web 设置页点击“测试连接”进行实际鉴权与模型可用性检查,避免以文档默认值直接当作可用性承诺。
# Anspire Open API Keys(支持多个,逗号分隔)
# 获取: https://open.anspire.cn/?share_code=QFBC0FYC
# 满足默认优先级条件时,系统会复用该 Key 处理搜索与 LLM(仅限示例兜底路径)。
# 示例模型:Doubao-Seed-2.0-lite;示例网关:https://open-gateway.anspire.cn/v6
ANSPIRE_API_KEYS=sk-xxxxxxxxxxxxxxxx
# 可选:按控制台可用性切换模型或网关
# ANSPIRE_LLM_MODEL=Doubao-Seed-2.0-pro
# ANSPIRE_LLM_BASE_URL=https://open-gateway.anspire.ai/v6
现在市面上绝大多数第三方聚合平台(例如硅基流动、AIHubmix、阿里百炼、智谱等)都兼容 OpenAI 的接口格式。只要平台提供了 API Key 和 Base URL,你都可以按照以下格式无脑配置:
# 填入平台提供给你的 API Key
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
# 填入平台的接口地址 (非常重要:结尾通常必须带有 /v1)
OPENAI_BASE_URL=https://api.siliconflow.cn/v1
# 填入该平台上具体的模型名称(非常重要:注意前面必须加上 openai/ 前缀帮系统识别)
LITELLM_MODEL=openai/deepseek-ai/DeepSeek-V3
# 填入你在 DeepSeek 官方平台申请的 API Key
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx
兼容提示:仅填这一行时,系统仍会默认使用 deepseek/deepseek-chat 并在日志提示迁移。
deepseek-chat / deepseek-reasoner 仍可用于兼容旧配置,但 DeepSeek 官方已标记为 2026/07/24 后废弃;新配置建议通过 Web 快速渠道或显式 LITELLM_MODEL=deepseek/deepseek-v4-flash 迁移到 deepseek-v4-flash / deepseek-v4-pro。
# 填入你获取的 Google Gemini Key
GEMINI_API_KEY=AIzac...
# Ollama 无需 API Key,本地运行 ollama serve 后即可使用
OLLAMA_API_BASE=http://localhost:11434
LITELLM_MODEL=ollama/qwen3:8b
重要:Ollama 必须使用
OLLAMA_API_BASE配置,不要使用OPENAI_BASE_URL,否则系统会错误拼接 URL(如 404、api/generate/api/show)。远程 Ollama 时,将OLLAMA_API_BASE设为实际地址(如http://192.168.1.100:11434)。当前依赖要求 LiteLLM ≥1.80.10(与 requirements.txt 一致)。
恭喜!小白读到这里就可以去运行程序了! 想测测看通没通?在主目录打开命令行输入:
python test_env.py --llm
目标: 我有多个不同平台的 Key 想要混着用,如果主模型卡了/网络挂了,我希望它能自动切换到备用模型。
网页端可以直接配: 你可以启动程序后,在 Web UI 的“系统设置 -> AI 模型 -> AI 模型接入” 中非常直观地进行可视化配置!
新版编辑体验补充:对于 DeepSeek、阿里百炼(DashScope)以及其他兼容 OpenAI
/v1/models的渠道,设置页现在支持直接点击“获取模型”,从{base_url}/models拉取可用模型并多选;底层仍会保存为原来的LLM_{CHANNEL}_MODELS=model1,model2逗号格式。若渠道不支持该接口、鉴权失败或暂时不可达,仍可继续手动填写模型列表,不影响保存。
后端提供只读状态接口 GET /api/v1/system/config/setup/status,用于判断首次启动闭环中最基础的几类配置是否已经就绪:LLM 主渠道、Agent 渠道、自选股、通知渠道和本地存储。这个接口只读取已保存的 .env 与当前进程环境变量,不会重载运行时配置、写入 .env、测试真实模型或创建数据库文件;前端向导和后续 smoke run 可以基于该接口逐步接入。
LLM_{CHANNEL}_PROTOCOL、LLM_{CHANNEL}_BASE_URL、LLM_{CHANNEL}_MODELS、LLM_{CHANNEL}_API_KEY(S),不会在后台偷偷改成别的 provider 名或 URL。OpenAI Compatible / DeepSeek 渠道调用 {base_url}/models;“测试连接”默认只发一次最小聊天请求。可选的“运行时能力检测”必须由用户显式选择后触发,会额外发起 JSON / tools / stream / vision smoke 请求,结果仅代表当前账号、模型和 endpoint 的一次 best-effort 检测。上述检测返回的 stage / error_code / details / latency_ms / capability_results 仅用于结构化诊断提示,不会写回 .env,也不会阻止保存。litellm>=1.80.10,<1.82.7 下的 LiteLLM completion() / OpenAI I/O format / streaming / exception mapping,以及 OpenAI Chat Completions 的 JSON mode、tool calling、streaming 和 vision input 形状。LITELLM_MODEL、AGENT_LITELLM_MODEL、VISION_MODEL 或 LITELLM_FALLBACK_MODELS 指向了当前已启用渠道里已经不存在的模型,设置页会在保存前把这些失效引用清空/移除,避免运行时继续指向无效模型;即使当前启用渠道没有任何可选模型,也会清理缺少 legacy Key 支撑的托管 provider 旧值。cohere/*、google/*、xai/* 这类直连模型仅用于说明历史 direct-env 兼容保留语义,不等于可用性承诺,是否可用请按各厂商官方模型/API 文档再做实际验证。SystemConfigService._validate_llm_runtime_selection(src/services/system_config_service.py)中通过 _uses_direct_env_provider(src/config.py)判断运行时来源;当前仅 gemini、vertex_ai、anthropic、openai、deepseek 属于托管 key provider,cohere、google、xai 不在该白名单中,因此会保留为直连模型。.env 还原之前的 LLM_*、LITELLM_MODEL、AGENT_LITELLM_MODEL、VISION_MODEL、LLM_TEMPERATURE 即可,不需要额外跑迁移脚本。litellm>=1.80.10,<1.82.7(见 requirements.txt);回归覆盖包括 tests/test_system_config_service.py、tests/test_system_config_api.py 和 apps/dsa-web/src/components/settings/__tests__/LLMChannelEditor.test.tsx。外部 provider 示例模型说明:
cohere/*、google/*、xai/*等 provider 前缀值仅用于说明当前保存清理语义,不代表该窗口内的逐型号可用性保证。文档或测试中的具体模型名都是配置保留行为样例,不是生产推荐;实际可用性请以对应官方模型文档为准,并结合仓库依赖窗口litellm>=1.80.10,<1.82.7复核。
litellm>=1.80.10,<1.82.7 时,保存仅清理失效的 runtime 模型引用(LITELLM_MODEL、AGENT_LITELLM_MODEL、VISION_MODEL、LITELLM_FALLBACK_MODELS),cohere/*、google/*、xai/* 等非渠道直连模型会被保留。POST /api/v1/system/config/import 恢复;也可手动把 .env 中历史 LITELLM_* / AGENT_LITELLM_MODEL / VISION_MODEL / LLM_TEMPERATURE 回填后重启生效。tests/test_system_config_service.py::test_import_desktop_env_restores_runtime_models_after_cleanup 覆盖“清理后用桌面导出备份恢复 runtime 引用”。tests/test_system_config_service.py::SystemConfigServiceTestCase::test_validate_accepts_minimax_model_as_direct_env_provider、test_validate_accepts_cohere_model_as_direct_env_provider、test_validate_accepts_google_model_as_direct_env_provider、test_validate_accepts_xai_model_as_direct_env_provider 覆盖直连 provider 保留语义。cd apps/dsa-web && npm run lint && npm run build && npm run test -- src/components/settings/__tests__/LLMChannelEditor.test.tsx。POST /api/v1/system/config/import 导入后,再通过 GET /api/v1/system/config 刷新页面配置,再确认 LITELLM_MODEL / AGENT_LITELLM_MODEL / VISION_MODEL / LLM_TEMPERATURE 与模型列表一致后再继续使用。如果不方便用网页版,在 .env 文件中配置也非常丝滑,它能让你同时管理多个第三方平台。规则如下:
LLM_CHANNELS=渠道名称1,渠道名称2LLM_{渠道名}_XXX# 1. 开启渠道模式,声明这里有两个渠道:deepseek 和 aihubmix
LLM_CHANNELS=deepseek,aihubmix
# 2. 渠道一:配置 DeepSeek 官方
LLM_DEEPSEEK_BASE_URL=https://api.deepseek.com
LLM_DEEPSEEK_API_KEY=sk-1111111111111
LLM_DEEPSEEK_MODELS=deepseek-v4-flash,deepseek-v4-pro
# 3. 渠道二:配置一个常用的聚合中转 API
LLM_AIHUBMIX_BASE_URL=https://api.aihubmix.com/v1
LLM_AIHUBMIX_API_KEY=sk-2222222222222
LLM_AIHUBMIX_MODELS=gpt-5.5,claude-sonnet-4-6
# 4. 【关键】指定主模型和备用模型列表
# 平时首选用 deepseek 这款模型:
LITELLM_MODEL=deepseek/deepseek-v4-flash
# 可选:Agent 问股单独指定主模型(留空则继承主模型)
AGENT_LITELLM_MODEL=deepseek/deepseek-v4-pro
# 主模型崩了立刻挨个尝试下面这俩备用模型:
LITELLM_FALLBACK_MODELS=openai/gpt-5.4-mini,anthropic/claude-sonnet-4-6
# 1. 开启渠道模式,声明 ollama 渠道
LLM_CHANNELS=ollama
# 2. 配置 Ollama 地址(本地默认 11434 端口)
LLM_OLLAMA_BASE_URL=http://localhost:11434
LLM_OLLAMA_MODELS=qwen3:8b,llama3.2
# 3. 指定主模型
LITELLM_MODEL=ollama/qwen3:8b
minimax/<模型名>,例如 minimax/MiniMax-M1。openai/minimax/<模型名>。LITELLM_CONFIG(LiteLLM YAML)> LLM_CHANNELS > legacy provider keys。只要上层配置有效生效,下层配置就不会再参与本次请求。model_list / model_name 路由语义;渠道模式下,优先读取 AGENT_LITELLM_MODEL,留空时继承 LITELLM_MODEL,再按 LITELLM_FALLBACK_MODELS 继续 fallback。AGENT_LITELLM_MODEL 也留空,但本地仍保留 legacy 环境变量,问股 Agent 依然会继承旧配置:GEMINI_API_KEY + GEMINI_MODEL -> gemini/<model>,OPENAI_API_KEY + OPENAI_MODEL -> openai/<model>,ANTHROPIC_API_KEY + ANTHROPIC_MODEL -> anthropic/<model>。GEMINI_* / OPENAI_* / ANTHROPIC_* / LITELLM_* 配置。LITELLM_MODEL / AGENT_LITELLM_MODEL 或使用 LLM_CHANNELS;legacy provider keys 目前保留为兼容回退路径,方便旧 .env、本地 macOS 开发环境和历史部署平滑继续运行。https://api.moonshot.ai/v1:https://platform.kimi.ai/docs/guide/kimi-k2-6-quickstartopenai/ 前缀:https://docs.litellm.ai/docs/providers/openai_compatible1.0,non-thinking 模式固定 0.6;传其它值会被接口拒绝:https://platform.moonshot.ai/docs/guide/compatibility#parameters-differences-in-request-bodylitellm>=1.80.10,<1.82.7(见 requirements.txt);本次兼容逻辑按该范围回归验证了主分析、大盘复盘、Agent 直连 LiteLLM,以及系统设置页的渠道连通性测试。kimi-k2.6 及其 kimi-k2.6-* 变体:默认 / thinking 路径使用 temperature=1.0;如果你的 LiteLLM YAML 路由别名里显式写了 litellm_params.extra_body.thinking.type: disabled(或等价 non-thinking 配置),则自动切到 temperature=0.6。你在 .env 或 Web 设置里保存的 LLM_TEMPERATURE 不会被改写。SystemConfigService 在 Web 设置保存 / 桌面端 .env 导入时只更新你提交的 key,不会因为切到 Kimi 静默清空、迁移或重写已有 LLM_TEMPERATURE;渠道测试请求里临时使用的 1.0/0.6 也不会回写到配置文件。tests/test_llm_channel_config.py、tests/test_market_analyzer_generate_text.py、tests/test_agent_pipeline.py、tests/test_system_config_service.py。LLM_TEMPERATURE 配置。litellm>=1.80.10,<1.82.7(与 requirements.txt 一致)。tests/test_llm_channel_config.pytests/test_system_config_service.pytests/test_system_config_api.pyapps/dsa-web/src/components/settings/__tests__/LLMChannelEditor.test.tsx桌面端导出备份 -> /api/v1/system/config/import,或手动恢复 LLM_* / LITELLM_* / AGENT_LITELLM_MODEL / VISION_MODEL / LLM_TEMPERATURE。致命避坑说明:如果你启用了
LLM_CHANNELS,那么你直接写在外面的DEEPSEEK_API_KEY或OPENAI_API_KEY将全部失效(系统一律无视)!二者选其一即可,千万不要既写了新手模式又写了渠道模式结果产生冲突。 Docker 注意:如果你在docker compose environment:或docker run -e中显式传入LITELLM_MODEL、LLM_CHANNELS、LLM_DEEPSEEK_MODELS等变量,容器重启后这些环境变量会覆盖 Web 设置页写入的.env,需要同步修改部署配置。
目标: 我不在乎学习门槛,我要最高控制权,我要用原生规则做企业级高可用!
这一层会直接映射到底层 LiteLLM 路由能力,支持高并发、自动重试、按 RPM/TPM 负载均衡等操作。
.env 中只保留一行指向声明:
LITELLM_CONFIG=./litellm_config.yaml
litellm_config.yaml(可以参考自带的 litellm_config.example.yaml)。示例 litellm_config.yaml:
model_list:
- model_name: my-smart-model
litellm_params:
model: deepseek/deepseek-v4-flash
api_base: https://api.deepseek.com
api_key: "os.environ/MY_CUSTOM_SECRET_KEY" # 从环境变量读取 Key,安全防泄漏
# Ollama 本地模型(无需 api_key)
- model_name: ollama/qwen3:8b
litellm_params:
model: ollama/qwen3:8b
api_base: http://localhost:11434
Settings → Secrets and variables → Actions。非敏感配置(如模型名、开关、Base URL)可以放在 Secret 或 Variables;凡是 *_API_KEY / *_API_KEYS 以及 LLM_<NAME>_API_KEY / LLM_<NAME>_API_KEYS 这类密钥字段,请统一放在 Secret 标签页的 New repository secret
按下表配置,只有全部必填配置正确配置,YAML 高级配置模式才可以生效,YAML配置文件的写法,可以参考自带的 litellm_config.example.yaml
| Secret 名称 | 说明 | 必填 |
|---|---|---|
LITELLM_CONFIG | 高级模型路由配置文件路径,通常配置 ./litellm_config.yaml | 必填 |
LITELLM_MODEL | 默认主模型名称或路由别名 | 必填 |
LITELLM_CONFIG_YAML | 存放 YAML 配置文件内容,可不在仓库中提交实体文件 | 可选 |
LITELLM_API_KEY | 用于存储API Key,可在配置文件中引用(环境变量引用方式)。由于GitHub Actions必须要指定导入的环境变量,因此你不能像本地运行模式那样自由命名环境变量 | 可选,必须配置到repository secret中 |
ANTHROPIC_API_KEY | 如果要多个API Key,这个变量名称也能拿来用 | 可选,必须配置到repository secret中 |
OPENAI_API_KEY | 同上,可以用来存储API Key | 可选,必须配置到repository secret中 |
渠道模式无需上传 YAML 文件。仓库自带 daily_analysis.yml 已显式透传以下常用字段:
LLM_CHANNELS、LITELLM_MODEL、LITELLM_FALLBACK_MODELS、AGENT_LITELLM_MODEL、VISION_MODEL、VISION_PROVIDER_PRIORITY、LLM_TEMPERATUREGEMINI_API_KEYS、ANTHROPIC_API_KEYS、OPENAI_API_KEYS、DEEPSEEK_API_KEYS(当前 workflow 仅从 repository secrets 导入,不会读取同名 Variables)primary、secondary、aihubmix、deepseek、dashscope、zhipu、moonshot、minimax、volcengine、siliconflow、openrouter、gemini、anthropic、openai、ollama例如在 GitHub Actions 中配置 LLM_CHANNELS=primary,deepseek 时,需同步配置 LLM_PRIMARY_* / LLM_DEEPSEEK_*。其中 LLM_<NAME>_API_KEY / LLM_<NAME>_API_KEYS 当前也仅从 repository secrets 导入;如果你把这些值放在 Variables,运行时不会生效。若使用自定义渠道名(如 my_proxy),GitHub Actions 还必须在 workflow env: 中显式新增对应的 LLM_MY_PROXY_* 映射;本地 .env 和 Docker 不受这个限制。
三层配置互斥准则:YAML 优先级最高!只要配置了 YAML,渠道模式 和 新手极简模式 统统被忽略。系统优先级为:
YAML配置 > 渠道模式 > 极简单模型。
系统中有些特定功能(比如上传股票软件截图,让 AI 提取出截图里的股票代码并放入自选股池)必须用到具备“视觉能力”的模型。你需在 .env 单独给它指派一个懂图片的模型。
# 指定你看图专用的模型名
VISION_MODEL=openai/gpt-5.5
# 别忘了填写它对应提供商的 API KEY,如果是 OpenAI 兼容渠道就提供 OPENAI_API_KEY:
# OPENAI_API_KEY=xxx
备用看图机制: 为了防止偶尔罢工,系统内置了切换策略。如果主视觉模型调用失败,它会按照下方的顺位尝试寻找是否有其他看图模型的 Key:
# 默认的备用顺序:
VISION_PROVIDER_PRIORITY=gemini,anthropic,openai
配好了之后心惊胆战不知道对不对?在命令行(Terminal)里敲入下面代码帮你挂号问诊:
python test_env.py --config :纯检测 .env 配置文件里的逻辑写得对不对,是不是少写了什么。(秒出结果,不调用网络,纯检查本地文本拼写)python test_env.py --llm :系统会真的发一句问候语给大模型,让你亲眼看到他的回答。这能彻底测出你的网络通不通、账号有没有欠费。| 遇到了什么诡异报错? | 罪魁祸首可能是啥? | 该怎么收拾它? |
|---|---|---|
| 界面提示主模型未配置 | 系统不知道你到底想用哪家的哪个模型 | 在 .env 中写上一句明白话:LITELLM_MODEL=provider/你的模型名。比如 openai/gpt-5.5 |
| 我写了好几家的Key,为什么死活只有一个生效?修改还没用? | 你把 极简模式 和 渠道模式 混着写了! | 想好一条路走到黑——只要简单就删掉 LLM_CHANNELS 开头��;想要丰富备用切换就要全部转投到 LLM_CHANNELS 下的编制里。 |
| 错误码报 400 或 401 或 Invalid API Key | API Key 填错、少复制了一截、账号充值没到账、或者模型名字敲错(极度常见)。 | 1. 检查复制的 Key 前后是否有误填空格。 |
/v1。openai/ 之类的前缀! |
| Kimi K2.6 报 invalid temperature(可能提示只允许 1.0 或 0.6) | 该模型按 thinking / non-thinking 模式要求不同固定 temperature;旧配置或调用入口可能还在传 0.7。 | 升级后系统会对 kimi-k2.6 默认 / thinking 请求自动使用 temperature=1.0;如果你在 LiteLLM YAML 路由里显式关闭 thinking,则自动改用 0.6。模型名建议写成 openai/kimi-k2.6 并配合 Moonshot / 聚合平台的 OpenAI 兼容 Base URL 与 API Key。非 Kimi fallback 仍会继续使用你配置的 LLM_TEMPERATURE。 |
| 转圈转不停,最后报 Timeout / ConnectionRefused 等 | 1. 在国内使用国外原版(像 Google、OpenAI),没开代理被墙了。Could not get model info 或 api/generate/api/show | 误用 OPENAI_BASE_URL 配置 Ollama,系统会错误拼接 URL | 改用 OLLAMA_API_BASE=http://localhost:11434 或渠道模式(LLM_CHANNELS=ollama + LLM_OLLAMA_BASE_URL) |进阶老手的叮嘱:如果你开启了 Agent (深度思考网络搜索问股) 模式,这里有个经验之谈,推荐选用如 deepseek-v4-pro 这种逻辑推导能力更强的大模型。如果为了省钱用小微模型跑 Agent,它逻辑能力大概率跟不上,不仅达不到预期,还会白跑一堆空流程。