feat: 增强 Web LLM 配置检测与错误分类 P3 (#1180) (#1196)

* feat: enhance LLM channel diagnostics

* fix: harden LLM diagnostics edge cases

* docs: clarify LLM capability smoke boundaries
This commit is contained in:
Alfred
2026-05-05 14:41:11 +08:00
committed by GitHub
parent 695365b3d8
commit fa1e00eb8a
15 changed files with 1481 additions and 61 deletions

View File

@@ -95,7 +95,9 @@ LITELLM_MODEL=ollama/qwen3:8b
### Web 渠道编辑器的兼容性 / 迁移 / 回退规则
- 预设里的 provider / Base URL / 示例模型只用于**初始化表单**;真正落盘时仍是你当前输入的 `LLM_{CHANNEL}_PROTOCOL``LLM_{CHANNEL}_BASE_URL``LLM_{CHANNEL}_MODELS``LLM_{CHANNEL}_API_KEY(S)`,不会在后台偷偷改成别的 provider 名或 URL。
- 设置页的“获取模型”只对 `OpenAI Compatible` / `DeepSeek` 渠道调用 `{base_url}/models`;“测试连接”只发一次最小聊天请求。两者返回的 `stage / error_code / details / latency_ms` 仅用于结构化诊断提示,**不会写回** `.env`
- 设置页的“获取模型”只对 `OpenAI Compatible` / `DeepSeek` 渠道调用 `{base_url}/models`;“测试连接”默认只发一次最小聊天请求。可选的“运行时能力检测”必须由用户显式选择后触发,会额外发起 JSON / tools / stream / vision smoke 请求,结果仅代表当前账号、模型和 endpoint 的一次 best-effort 检测。上述检测返回的 `stage / error_code / details / latency_ms / capability_results` 仅用于结构化诊断提示,**不会写回** `.env`,也不会阻止保存
- 运行时能力检测会产生真实 LLM 请求,可能带来 token / 图像输入费用、RPM/TPM 限流、余额不足或超时。检测失败可能来自账号权限、模型未开通、endpoint 区域、余额、服务商兼容层或 LiteLLM 转换路径,不等于该 provider 全局不支持对应能力。P3 未对所有真实 provider 做在线 smoke兼容依据来自当前依赖窗口 `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 Python SDK / OpenAI I/O format / streaming / exception mapping<https://docs.litellm.ai/>LiteLLM OpenAI-compatible 路由:<https://docs.litellm.ai/docs/providers/openai_compatible>OpenAI Chat Completions<https://platform.openai.com/docs/api-reference/chat/create>JSON mode<https://platform.openai.com/docs/guides/structured-outputs?api-mode=chat>tool calling<https://platform.openai.com/docs/guides/function-calling?api-mode=chat>streaming<https://platform.openai.com/docs/guides/streaming-responses?api-mode=chat>vision input<https://platform.openai.com/docs/guides/images-vision?api-mode=chat>
- 保存渠道时,只会更新这次提交的 key不会因为切换渠道模式而静默迁移整个旧配置。唯一会被**同步清理**的是运行时模型引用:如果 `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` 不在该白名单中,因此会保留为直连模型。
- 回退方式也保持最小:把对应渠道模型列表改回去后重新选择主模型 / fallback或直接用桌面端导出备份 / 手动 `.env` 还原之前的 `LLM_*``LITELLM_MODEL``AGENT_LITELLM_MODEL``VISION_MODEL``LLM_TEMPERATURE` 即可,不需要额外跑迁移脚本。