[Bug] /v1/internal/model/load silently ignores `args` (loader flags like ctx-size, cache-type) — endpoint returns OK but model loads with UI

用户在使用 TextGen WebUI 的 OpenAI API 扩展时,通过 POST /v1/internal/model/load 接口传递 args 字典(例如设置 ctx-size 为 32768),希望覆盖 UI 默认的 loader 参数。接口返回 HTTP 200 和 "OK" ,但

[Bug] /v1/internal/model/load silently ignores `args` (loader flags like ctx-size, cache-type) — endpoint returns OK but model loads with UI

[Bug] /v1/internal/model/load silently ignores `args` (loader flags like ctx-size, cache-type) — endpoint returns OK but model loads with UI

快速结论:该报错发生在通过 TextGen WebUI 的 /v1/internal/model/load API 传递 loader 参数(如 ctx-sizecache-type)时,如果使用 UI 标签中的连字符格式(如 ctx-size),这些参数会被静默丢弃,模型仍按 UI 默认值加载。优先排查是否使用了连字符而非下划线格式(如 ctx_size)。

问题场景

用户在使用 TextGen WebUI 的 OpenAI API 扩展时,通过 POST /v1/internal/model/load 接口传递 args 字典(例如设置 ctx-size 为 32768),希望覆盖 UI 默认的 loader 参数。接口返回 HTTP 200 和 "OK",但实际模型加载时仍使用 UI 中已有的值(如 8192),导致调用者无法感知参数未生效。

报错原文

# Console output for a load request with args.ctx-size=32768:
09:09:35-396887 INFO     Loaded "MODEL" in 14.72 seconds.
09:09:35-397906 INFO     LOADER: "llama.cpp"
09:09:35-398631 INFO     CONTEXT LENGTH: 8192   # <-- expected 32768
# API 响应(无报错信息)
HTTP/1.1 200 OK
Content-Type: application/json
"OK"

原因分析

根本原因是 modules/api/models.py:_load_model() 函数中,参数键名检查使用了 hasattr(shared.args, k),其中 k 来自请求的 args 字典。UI 标签中使用的连字符格式(如 ctx-sizecache-type)与 Python 属性名的下划线格式(如 ctx_sizecache_type)不匹配,导致 hasattr 返回 False,这些参数被静默过滤掉。而使用下划线格式(如 ctx_size)则可以正常工作。此外,没有记录任何日志或错误提示,使问题难以调试。

环境排查

  • TextGen WebUI 版本:截至 2026-05-18 的当前构建版本(已验证)
  • API 扩展:OpenAI API 扩展已启用
  • Loader:llama.cpp(测试中使用 GGUF 模型)
  • 操作系统:Linux(家庭服务器环境)
  • GPU:NVIDIA RTX 3090(24GB)

解决步骤

  1. 使用正确的参数键名格式:args 字典中,使用 snake_case(下划线格式) 的 Python 属性名,而非 UI 标签中的连字符格式。例如:
    "args": {"ctx_size": 32768}(而非 "ctx-size": 32768
    "args": {"cache_type": "q4_0"}(而非 "cache-type": "q4_0"
    正确的键名可以直接从 shared.args 对象的属性名获取。
  2. 临时替代方案:如果必须使用 UI 默认值,可以通过 UI 设置并保存配置:打开 Model 选项卡,设置所需参数(如 ctx-sizecache-type),点击 Save settings(写入 user_data/models/config-user.yaml)。后续 API 调用会自动使用已保存的配置。
  3. (可优先尝试)建议的修复方案:如果涉及代码修改,可以在 _load_model() 函数中添加参数键名规范化逻辑,将连字符替换为下划线:
    k_norm = k.replace('-', '_')
    然后检查 if k_norm in allowed_keys and hasattr(shared.args, k_norm)。这样同时兼容两种格式。
  4. (可优先尝试)添加日志警告:添加日志输出,当参数键名不在允许列表中时发出警告:
    logger.warning(f"Ignoring unknown loader arg: {k}")
    这可以帮助调试并发现静默丢弃的参数。

验证方法

使用正确的 snake_case 键名重新发送 API 请求,检查控制台输出中的 CONTEXT LENGTHcache-type 等参数值是否与请求一致。例如:

curl -X POST http://localhost:5000/v1/internal/model/load \
  -H "Content-Type: application/json" \
  -d '{
    "model_name": "MODEL",
    "args": {"ctx_size": 32768}
  }'

确认控制台输出显示:INFO CONTEXT LENGTH: 32768。如果仍为 UI 默认值,则说明问题可能另有原因。

参考来源

oobabooga/textgen #7577

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 8183

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注