fix: 修正 LLM Model disabled 诊断 (#1208) - #1211
Conversation
🤖 自动审查报告
📁 修改的文件
🧠 AI 代码审查意见结论Ready to Merge 结构化审查结果
审查细节
综上,本次 PR 经过了充分的考虑、详尽的描述和全面的验证,代码质量高,文档同步到位,且风险控制良好,具备合入条件。
|
…disabled-diagnostic
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
|
已按最新 Process blocker 补齐外部 LLM/API 兼容证据,并把证据写入入库文档。 新增 commit: 补充内容:
本次本地验证:
|
ZhuLinsen
left a comment
There was a problem hiding this comment.
评审结论
- 必要性:通过;修正
Model disabled被误归类为网络异常的问题,能直接改善 LLM 渠道测试的用户排障方向。 - 是否有对应 issue:有,Fixes #1208。
- PR 类型:fix/docs/test;包含后端错误分类修复、前端提示调整、回归测试和 LLM 配置文档更新。
- description 完整性:完整;已覆盖背景、改动范围、官方/线上 provider 证据、兼容性边界、验证结果和最小回滚方案,且符合 AGENTS.md 对用户可见变更同步
docs/CHANGELOG.md与专题文档的要求。 - 是否可直接合入:可;当前 CI 全部通过,diff 未引入配置迁移或静默清理行为,
mergeable_state=blocked仅反映受保护分支策略,不构成代码层阻断。
🤖 此回复由 OpenReview Bot 自动生成,仅供参考。如有疑问请 @维护者。
ZhuLinsen
left a comment
There was a problem hiding this comment.
跟进结论
- 结论:接受 + 已补齐 provider 官方排查依据、线上复核记录,并把
Model disabled明确收敛为基于已观测文案的 best-effort 模型可用性诊断,之前“外部语义依据不足”的阻断可以关闭。 - 是否仍有阻断:无 + 当前 CI 全部通过,改动未新增 schema/顶层错误码/配置迁移,
mergeable_state=blocked在本仓库保护规则下不单独构成合入阻断。
说明
docs/llm-providers.md已说明model_access_denied不是跨 provider 官方错误码映射,并补充 SiliconFlow 官方错误处理文档、Issue #1208 脱敏样例和 LiteLLM 在线复核记录;这已覆盖此前要求的外部/API 兼容证据缺口。src/services/system_config_service.py的方向是继续复用既有model_not_found,用details.reason=model_access_denied表达细分原因,且匹配条件要求同时出现model和权限/禁用/不可用信号,风险已收敛。tests/test_system_config_service.py、apps/dsa-web/src/components/settings/__tests__/LLMChannelEditor.test.tsx覆盖了Model disabled分类、非模型错误不提示调整模型顺序、前端展示本次测试模型和首项模型范围,回归证据充分。docs/LLM_CONFIG_GUIDE.md与英文版已同步说明测试连接只测模型列表首项、resolved_model展示和 best-effort 边界;当前 diff 没有实际静默清空或迁移用户运行时配置的代码改动。
🤖 此回复由 OpenReview Bot 自动生成,仅供参考。如有疑问请 @维护者。
ZhuLinsen
left a comment
There was a problem hiding this comment.
跟进结论
- 结论:部分接受 + “仍然报错”这个现象成立,但当前 PR 修的是诊断归类和提示,不是让服务商已禁用/未开通的模型连接成功。
- 是否仍有阻断:无 + 当前代码、测试和 CI 已覆盖
Model disabled归入模型不可用诊断;除非实际界面仍显示为网络异常或缺少本次测试模型提示,否则不能据“仍报错”判定修复失败。
说明
src/services/system_config_service.py:本 PR 的行为是把包含Model disabled的错误归到既有model_not_found,并通过details.reason=model_access_denied表达账号/模型可用性问题;该场景仍应返回失败,不会把禁用模型变成可用。apps/dsa-web/src/components/settings/LLMChannelEditor.tsx:前端已把model_not_found展示为“模型不可用”,并提示“本次测试模型”和“基础连接测试默认只测试模型列表中的第一个模型”;如果首项模型仍是禁用模型,继续失败是预期结果。tests/test_system_config_service.py与LLMChannelEditor.test.tsx:已补充Model disabled后端归类、前端模型可用性提示,以及 auth/network/quota 不误提示模型顺序调整的回归覆盖。- 最新回复需要进一步区分“仍失败”和“仍误诊断”:如果截图中的错误标题已经是“模型不可用”,这是 PR 预期行为;如果仍显示“网络异常”或继续引导检查 Base URL/代理/TLS,则需要补充后端响应 JSON 或浏览器控制台/API 返回内容后再重开阻断。
🤖 此回复由 OpenReview Bot 自动生成,仅供参考。如有疑问请 @维护者。
|
@massif-01 佬帮忙看下? |
ZhuLinsen
left a comment
There was a problem hiding this comment.
跟进结论
- 结论:部分接受 + “仍然报错”成立,但这不等于本 PR 修复失败;当前改动目标是把
Model disabled从网络异常改为模型不可用诊断,并提示本次测试模型。 - 是否仍有阻断:无 + 当前代码、测试与 CI 均显示诊断归类和前端提示已覆盖,
mergeable_state=blocked不单独构成阻断。
说明
src/services/system_config_service.py:已将包含Model disabled且匹配模型/权限/禁用语义的错误归入既有model_not_found,并设置details.reason=model_access_denied;不会让服务商已禁用或账号未开通的模型连接成功。apps/dsa-web/src/components/settings/LLMChannelEditor.tsx:失败提示会展示“本次测试模型”和“基础连接测试默认只测试模型列表首项”,并仅在模型相关错误时建议调整模型顺序或移除不可用模型。tests/test_system_config_service.py与LLMChannelEditor.test.tsx:已覆盖Model disabled、模型不可用提示、首项模型提示,以及 auth/network/quota 场景不展示模型调整建议。- 如果实际截图里仍显示为“网络异常”、仍引导检查 Base URL/代理/TLS,或没有展示本次测试模型,那才是本 PR 的剩余问题;仅服务商继续返回
Model disabled不构成阻断。
🤖 此回复由 OpenReview Bot 自动生成,仅供参考。如有疑问请 @维护者。
looking |
又暴露了一个新的诊断缺口。 核心链路是:
所以,“还是报错”本身是正常的:被服务商或中转网关拦截的请求不会因为这个分支变成功。真正不对的是诊断标签仍然显示成“网络异常”。 我建议把它判断为一个相邻的新问题: 当前截图不能证明 #1208 的 |
ZhuLinsen
left a comment
There was a problem hiding this comment.
跟进结论
- 结论:部分接受 + 最新反馈中“服务商仍返回错误”成立,但这符合本 PR 的修复边界:本次修的是诊断归类与提示,不是让已禁用/未开通模型连接成功。
- 是否仍有阻断:无 + 当前 CI 成功,代码与测试已覆盖
Model disabled归入模型不可用诊断,未看到新的代码行为风险或文档错误。
说明
src/services/system_config_service.py:当前实现将包含模型与禁用/权限/不可用信号的错误归入既有model_not_found,并用details.reason=model_access_denied表达具体原因;这不会改变服务商实际拒绝请求的事实。apps/dsa-web/src/components/settings/LLMChannelEditor.tsx:前端已把model_not_found展示为“模型不可用”,并在失败 hint 中展示本次测试模型、模型列表首项和调整模型顺序/移除不可用模型的建议;这比原先误导到 Base URL、代理、TLS 更贴合当前错误。tests/test_system_config_service.py与LLMChannelEditor.test.tsx:已覆盖Model disabled分类、resolved_model展示、模型错误提示,以及网络/鉴权/配额错误不显示模型列表调整建议。docs/llm-providers.md与双语 LLM 配置指南已收窄说明:model_access_denied是基于已观测 provider 文案的 best-effort 诊断,不是跨 provider 官方错误码映射。当前无需继续维持“外部语义依据不足”的阻断。
🤖 此回复由 OpenReview Bot 自动生成,仅供参考。如有疑问请 @维护者。
|
测完了,结论比较明确: OpenAI 官方 /v1/models 可以访问,Key 是有效的。 测试连接功能本身不是完全坏的。它确实发出了请求,并且能把 OpenAI 官方的 quota 类错误归到 quota,没有误报成“网络异常”。 |
ZhuLinsen
left a comment
There was a problem hiding this comment.
跟进结论
- 结论:部分接受 + “仍然报错”这个现象成立,但它说明当前服务商/账号下测试模型仍不可用,不等于本 PR 的诊断归类修复失败。
- 是否仍有阻断:无 + 当前 CI 全部成功,代码和测试已覆盖
Model disabled归入模型不可用诊断,未看到新的行为风险或文档错误。
说明
src/services/system_config_service.py:当前修复点是识别包含model与禁用/权限/不可用信号的异常,将其归入既有model_not_found,并通过details.reason=model_access_denied表达;这不会让已禁用或未开通的模型连接成功。apps/dsa-web/src/components/settings/LLMChannelEditor.tsx:失败提示会展示本次测试模型,并说明基础连接测试默认只测模型列表首项;因此用户仍需根据提示调整模型顺序、移除不可用模型或在服务商控制台确认模型权限。tests/test_system_config_service.py与apps/dsa-web/src/components/settings/__tests__/LLMChannelEditor.test.tsx:已覆盖Model disabled分类、非网络错误提示、非模型错误不展示模型调整建议等回归场景。docs/llm-providers.md与中英文 LLM 配置指南:已把该语义收敛为基于已观测 provider 文案的 best-effort 诊断,并说明不是跨 provider 官方错误码映射;外部兼容性说明目前足够支撑本 PR 范围。
🤖 此回复由 OpenReview Bot 自动生成,仅供参考。如有疑问请 @维护者。
* fix: improve LLM model-disabled diagnostics (ZhuLinsen#1208) * docs: clarify model disabled diagnostic scope (ZhuLinsen#1208) * docs: add SiliconFlow model disabled evidence (ZhuLinsen#1208)
* fix: improve LLM model-disabled diagnostics (ZhuLinsen#1208) * docs: clarify model disabled diagnostic scope (ZhuLinsen#1208) * docs: add SiliconFlow model disabled evidence (ZhuLinsen#1208)
* fix: improve LLM model-disabled diagnostics (ZhuLinsen#1208) * docs: clarify model disabled diagnostic scope (ZhuLinsen#1208) * docs: add SiliconFlow model disabled evidence (ZhuLinsen#1208)



PR Type
Background And Problem
桌面端 3.15 的 AI 模型配置中,LLM 渠道测试遇到服务商返回
Model disabled时,会被归类为网络异常,导致用户排障方向转向 Base URL、代理或 TLS,而不是检查模型是否可用。该问题还暴露了另一个诊断缺口:基础连接测试实际只测试模型列表首项,但失败提示没有说明本次测试的 resolved model,用户无法判断失败是否由首项模型不可用触发。
Scope Of Change
src/services/system_config_service.pyModel disabled等错误归入既有model_not_found,并通过details.reason=model_access_denied表达具体原因。apps/dsa-web/src/components/settings/LLMChannelEditor.tsxmodel_not_found展示为“模型不可用”。docs/CHANGELOG.md、docs/llm-providers.md、docs/LLM_CONFIG_GUIDE.md、docs/LLM_CONFIG_GUIDE_EN.md。Issue Link
Fixes #1208
Evidence And Compatibility Basis
message,说明 403 表示余额不足或权限不够,其他情况参考报错message,并建议换一个模型确认问题是否仍存在。https://api.siliconflow.cn/v1,原始错误片段为:3.13.12,LiteLLM1.82.3,项目约束litellm>=1.80.10,!=1.82.7,!=1.82.8,<2.0.0。https://api.siliconflow.cn/v1。Qwen/Qwen3-235B-A22B-Thinking-2507;LiteLLM 路由模型:openai/Qwen/Qwen3-235B-A22B-Thinking-2507。403,脱敏响应体{"code":30003,"message":"Model disabled.","data":null}。completion():抛出APIError,脱敏 message 为litellm.APIError: APIError: OpenAIException - Model disabled.。Model disabled的官方错误码文档来源;该映射不声称是跨 provider 的官方语义。它是基于 Issue [Bug] AI 模型配置中 Model disabled 被误报为网络异常且测试模型不明确 #1208 已观测 provider 文案的 best-effort 归类:该返回明确包含Model disabled,且发生在已指定测试模型的litellm.completion()路径中,因此比 Base URL、代理、TLS 或本地网络策略更适合引导用户先排查当前测试模型的账号可用性。litellm>=1.80.10,!=1.82.7,!=1.82.8,<2.0.0(见requirements.txt),本地验证环境中pip show litellm为1.82.3。disabled归类为模型问题;错误文本必须同时包含model和明确的权限/禁用/不可用信号,才会返回既有error_code=model_not_found与details.reason=model_access_denied。未覆盖或语义不同的 provider 文案会继续走既有兜底诊断。Verification Commands And Results
关键输出/结论:
PATH=/opt/homebrew/Caskroom/miniconda/base/bin:$PATH ./scripts/ci_gate.sh:通过,1721 passed, 2 deselected, 141 subtests passed。python -m pytest tests/test_system_config_service.py -q:通过,96 passed。python -m py_compile src/services/system_config_service.py:通过。npm ci:通过。npm run test -- LLMChannelEditor.test.tsx:通过,36 passed。npm run lint:通过。npm run build:通过,Vite 仅输出既有 chunk size warning。Compatibility And Risk
error_code继续使用既有model_not_found,避免扩展前端/客户端需要识别的新枚举;具体原因通过既有details.reason=model_access_denied表达。model和明确权限/禁用/不可用信号,以降低误判;未命中的变体、以及语义不同但未命中保守规则的 provider 文案,仍会走既有兜底诊断。Rollback Plan
EXTRACT_PROMPT Change (if applicable)
未修改
src/services/image_stock_extractor.py中的EXTRACT_PROMPT。展开 / Expand: Full EXTRACT_PROMPT
Checklist
docs/CHANGELOG.md;README.md仅在首页级信息变化时更新,细节优先写入docs/*.md/ If user-visible changes are included, relevant docs anddocs/CHANGELOG.mdare updated;README.mdis updated only for homepage-level changes, with details kept indocs/*.md