[Bug] 自定义 OpenAI-Compatible 模型:新任务首页将思考档位设为「中」后,进入回答即回落到「低」,第一轮实际请求也是 low
Nobody has claimed this yet.
- Dominant language
- No language data
- Stars
- 22
- Forks
- 1
- PR merge metrics
- No merged PRs in 30d
Description
提交前确认 · Pre-submission checklist
- 我已搜索现有 issues,确认这不是重复 / I searched existing issues and confirmed this isn't a duplicate.
- 我已阅读 CONTRIBUTING.md / I've read CONTRIBUTING.md.
问题类别 · Category
模型设置 / 切换 · Model config
涉及的 Agent 框架 · Agent framework
ZCode Agent(自研)
严重程度 · Severity
功能受损 · Major (功能可用但体验受损 / works but degraded)
复现频率 · Reproducibility
必现 · Always
问题描述 · Description
新任务首页为自定义 OpenAI-Compatible 模型(本机 text-main)把思考档位设为「中 / medium」后,一旦进入回答过程,会话输入框旁的思考档位下拉框会回到「低 / low」。除非在会话里手动再选一次「中」,否则第一轮实际请求也按 low 发出。
这不是配置没写:config.json 里该模型已是 defaultVariant: "medium",全局 local_setting 的 reasoningLevel 也是 "medium"。三者都挡不住新任务第一轮掉回 variants[0](low)。
与已有 issue 的区别:
- #463 是分叉后 UI 显示低、实际请求仍是 max(GLM 官方模型)。
- 本 issue 是新任务首页路径:UI 掉到低,且
model_usage.variant第一轮就是low。 - #389 / #339 / #507 是自定义模型出站不带
reasoning_effort(相关、可一并看,但本单只跟「默认档位没有进第一轮会话」)。
复现步骤 · Steps to reproduce
-
添加自定义 OpenAI-Compatible 供应商,模型 ID 不命中 glm/gpt/claude/deepseek/kimi 家族正则(例如
text-main)。 -
在
~/.zcode/v2/config.json为该模型配置:"reasoning": { "enabled": true, "variants": ["low", "medium", "high"], "defaultVariant": "medium" } -
打开新任务首页,选择该模型,把思考档位设为「中」。
-
发送任意一条消息,进入回答过程。
-
观察会话底部思考档位下拉框,并核对该轮
model_usage.variant/ 出站请求。
期望表现 · Expected behavior
- 首页选的「中」应带到新会话,下拉框保持「中」。
- 至少应落到模型配置的
defaultVariant/defaultLevel(medium),或全局reasoningLevel(medium),而不是variants[0]。 - 第一轮
model_usage.variant应为medium。
实际表现 · Actual behavior
- 进入回答后下拉框显示「低」。
- 第一轮
model_usage.variant = low。 - 在会话内手动再选「中」后,后续轮次变为
medium,并写入session_entry(runtime/model_selection)和全局reasoningLevel。 - 再开一个新任务,第一轮又回到
low。 - GLM-5.3 不易察觉:家族默认就是 max,掉档也掉不出来。
ZCode 版本 · ZCode version
3.11.2.6792(Windows x64 Desktop)
设备 / 系统 / 浏览器 · Device / OS / Browser
Windows 11(NT 10.0.26200)x64 Desktop
证据 / 截图 / 日志 · Screenshots / Recordings / Logs
2026-09-08 本机 ~/.zcode/cli/db/db.sqlite 只读核验(自定义供应商 cc5bf163-… / text-main):
| 会话 | 第一轮 model_usage.variant |
之后 |
|---|---|---|
sess_b7f12727-202d-4235-9846-a1c04a7173bd |
low |
约 11s 后才写入 thoughtLevel: medium |
sess_4c57ea79-8d88-4af1-bdd2-9053e55c6f82 |
low |
手动再选「中」后下一轮 medium |
sess_cc382961-5669-43e0-9668-4ec9bbb31a8d |
low |
此时全局已是 medium,新任务第一轮仍是 low,无 runtime/model_selection |
同时:
local_setting:namespace=model, key=reasoningLevel, value={"level":"medium"}(sess_cc382961创建前已写入)。- 用户消息
data.model只有{providerID, modelID},没有档位字段。 - 该模型
rollout出站 body 无reasoning_effort(与 #389 同类;自定义模型档位目前是 UI 空壳)。
逆向定位线索(3.11.2 随包 zcode.cjs / host,仅供参考)
- 新任务首页草稿
createSession只带 model/mode,不带thoughtLevel;换模型时会delete n.defaultThoughtLevel。 - 会话档位解析
_nt(e):defaultLevel && levels.includes(defaultLevel) ? defaultLevel : levels[0]。用户配置写的是defaultVariant,内核认defaultLevel;转换链到不了这次请求用的 catalog 时,就落到variants[0] = low。 getThoughtLevel()/Th()用当前providerOptions去对providerOptionsByLevel。自定义模型经 host 转换后每档是空对象{}(stripModelProviderReasoningPatches),多档对不上时返回undefined→ UI 按available[0]显示「低」。setModel虽会读全局reasoningLevel(Gae),但本机在全局已是 medium 时,新任务第一轮仍记录low,说明这条路径没有真正套上。- 会话内手动
setThoughtLevel("medium")会写modelRef.variant和全局设置,所以当前会话能保住;下一个新任务再走 1–4。
修复建议
- 新任务首页 / 草稿开答时,把 composer 当前档位作为
thoughtLevel传入session/create(或草稿setThoughtLevel),不要只传 model。 - 选择器与第一轮请求的兜底改为
current ?? 全局 reasoningLevel ?? defaultVariant/defaultLevel ?? available[0],不要直接variants[0]。 - 用户配置的
defaultVariant必须进入会话 runtime 的defaultLevel;换模型时不要无条件丢掉工作区默认档。 - 自定义 OpenAI-Compatible 模型:UI 档位应有通用
reasoning_effort映射(见 #389),不要只给空壳选择器。
相关:#463(分叉 UI 回落 variants[0],请求仍正确)· #389 #339 #507(自定义模型不发 reasoning_effort)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the new-task createSession path in the packaged zcode.cjs/host, then trace _nt, getThoughtLevel()/Th(), setModel, and setThoughtLevel. Reproduce the custom OpenAI-Compatible model case and inspect the first model_usage.variant plus the session runtime state. Done means the homepage's medium selection reaches the new session and the first request records medium rather than low.
Written by the indexing model from the issue text.
Assessment
- Domain
- ai, backend-api-design
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100