[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 的 POST /v1/internal/model/load 时,如果 args 里用了连字符键名(如 ctx-size、cache-type、gpu-layers),这些值会被静默丢弃,接口仍返回 HTTP 200 与 "OK",模型实际按 UI 或已保存配置的默

快速结论:调用 TextGen WebUI 的 POST /v1/internal/model/load 时,如果 args 里用了连字符键名(如 ctx-size、cache-type、gpu-layers),这些值会被静默丢弃,接口仍返回 HTTP 200 与 “OK”,模型实际按 UI 或已保存配置的默认值加载。优先排查 args 的键名拼写是否与 Python 属性名一致。

适用环境:Linux(homelab 机器);NVIDIA RTX 3090 (24GB);加载器 llama.cpp;模型为任意 GGUF;已启用 OpenAI API 扩展。Issue 未提供 Python、CUDA、PyTorch 或 tg-webui 具体版本号。

最快修复方案:把 args 的键名从连字符改为下划线形式再发请求,例如用 ctx_size 而不是 ctx-size、用 cache_type 而不是 cache-type、用 gpu_layers 而不是 gpu-layers。Issue 中已验证 args.ctx_size 能生效。

注意事项:官方代码层面的一步修复(自动归一化键名或对未匹配键打警告)尚未确认合并;如果必须使用 UI 标签样式的连字符键名,只能依赖后续修复。此外,Issue 也提示 update_model_parameters(model_settings) 与 load_model(model_name) 的状态读取路径可能影响最终生效值,但该部分未被完整追踪。

问题场景

用户在 TextGen WebUI 中启用 OpenAI API 扩展后,通过 HTTP 调用 POST /v1/internal/model/load 加载 GGUF 模型,希望在请求体的 args 字典里临时指定 ctx-size、cache-type 等加载器参数,绕过 UI 逐个保存模型配置。结果接口返回 “OK”,但控制台打印的 CONTEXT LENGTH 仍是 UI 里设置的值,请求里传入的值没有生效。

报错原文

POST /v1/internal/model/load
Response: "OK" (HTTP 200)

# 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

原因分析

经提交者更正后的复测结论:这不是整个 args 通道失效,而是键名格式问题。modules/api/models.py 的 _load_model() 中会遍历 args 的键,并通过 hasattr(shared.args, k) 判断是否可设置。UI 标签形式的连字符键名(ctx-size、cache-type、gpu-layers)对应不到 shared.args 上的 Python 属性名(下划线形式),因此被静默过滤;下划线形式(ctx_size、cache_type、gpu_layers)能正常通过检查并生效。由于代码不会对未匹配的键输出警告或日志,加上接口返回 200/”OK”、/v1/internal/model/info 也不暴露 ctx_size 等加载参数,调用方很难察觉键被丢弃。提交者同时指出,_load_model() 之前的 update_model_parameters(model_settings) 可能用保存的每模型配置覆盖参数,这一路径未被完全追踪,属于可能原因。

环境排查

  • 确认 tg-webui 已启用 OpenAI API 扩展。
  • 确认加载器为 llama.cpp。
  • 确认 OS 为 Linux、GPU 为 NVIDIA RTX 3090 (24GB) 或相近环境。
  • 确认 args 键名使用的是 shared.args 上的 Python 属性名(下划线),而非 UI 标签(连字符)。
  • 确认是否保存了该模型的 per-model 配置(user_data/models/config-user.yaml),已保存的配置可能影响实际加载值。
  • 确认在控制台观察 LOADER / CONTEXT LENGTH 日志,用于判断实际生效的参数。

解决步骤

  1. 停止使用连字符键名。将请求体中的 args 键名改写为下划线形式:ctx-size → ctx_size,cache-type → cache_type,gpu-layers → gpu_layers。
  2. 重新发送加载请求,例如:curl -X POST http://localhost:5000/v1/internal/model/load -H "Content-Type: application/json" -d '{"model_name": "MODEL", "args": {"ctx_size": 32768}}'。
  3. 在控制台确认 CONTEXT LENGTH 日志是否等于请求中指定的值,以验证键名格式是否被接受。
  4. 如果确实需要在 API 侧控制加载参数而暂时无法改动键名格式,可先按 Issue 中的 workaround 在 UI 的 Model 标签设置 ctx-size、cache-type 等,点击 Save settings 写入 user_data/models/config-user.yaml,之后该模型的 API 加载会自动读取已保存配置。
  5. 如希望从根本上支持连字符键名,可参考提交者的建议:在 _load_model() 中先做 k_norm = k.replace(‘-‘, ‘_’) 再检查 allowed_keys 与 hasattr,或对未匹配任何 allowed_keys 的键输出 logger.warning 提示。这两项属于建议修复方案,尚未确认官方已合并。

验证方法

用下划线键名发送加载请求后,查看控制台日志中 CONTEXT LENGTH 的数值是否与 args.ctx_size 传入的值一致。Issue 中已验证:args.ctx_size = 24576 时控制台显示 CONTEXT LENGTH: 24576,args.ctx_size = 20480 时显示 20480。若使用连字符键名则仍显示 UI 或已保存配置的值,说明键名未被识别。可进一步通过 /v1/internal/model/info 辅助排查,但注意该接口目前不暴露 ctx_size 等加载参数,不能作为唯一验证依据。

参考来源

oobabooga/textgen #7577

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25716

发表回复

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