zai-org / zai-org/feedback

[Bug] 自定义 OpenAI-Compatible 模型:新任务首页将思考档位设为「中」后,进入回答即回落到「低」,第一轮实际请求也是 low

Open
#564 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

priority: P2
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_settingreasoningLevel 也是 "medium"。三者都挡不住新任务第一轮掉回 variants[0]low)。

与已有 issue 的区别:

  • #463 是分叉后 UI 显示低、实际请求仍是 max(GLM 官方模型)。
  • 本 issue 是新任务首页路径:UI 掉到低,model_usage.variant 第一轮就是 low
  • #389 / #339 / #507 是自定义模型出站不带 reasoning_effort(相关、可一并看,但本单只跟「默认档位没有进第一轮会话」)。
复现步骤 · Steps to reproduce
  1. 添加自定义 OpenAI-Compatible 供应商,模型 ID 不命中 glm/gpt/claude/deepseek/kimi 家族正则(例如 text-main)。

  2. ~/.zcode/v2/config.json 为该模型配置:

    "reasoning": {
      "enabled": true,
      "variants": ["low", "medium", "high"],
      "defaultVariant": "medium"
    }
    
  3. 打开新任务首页,选择该模型,把思考档位设为「中」。

  4. 发送任意一条消息,进入回答过程。

  5. 观察会话底部思考档位下拉框,并核对该轮 model_usage.variant / 出站请求。

期望表现 · Expected behavior
  • 首页选的「中」应带到新会话,下拉框保持「中」。
  • 至少应落到模型配置的 defaultVariant / defaultLevel(medium),或全局 reasoningLevel(medium),而不是 variants[0]
  • 第一轮 model_usage.variant 应为 medium
实际表现 · Actual behavior
  • 进入回答后下拉框显示「低」。
  • 第一轮 model_usage.variant = low
  • 在会话内手动再选「中」后,后续轮次变为 medium,并写入 session_entryruntime/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_settingnamespace=model, key=reasoningLevel, value={"level":"medium"}sess_cc382961 创建前已写入)。
  • 用户消息 data.model 只有 {providerID, modelID},没有档位字段。
  • 该模型 rollout 出站 body 无 reasoning_effort(与 #389 同类;自定义模型档位目前是 UI 空壳)。
逆向定位线索(3.11.2 随包 zcode.cjs / host,仅供参考)
  1. 新任务首页草稿 createSession 只带 model/mode,不带 thoughtLevel;换模型时会 delete n.defaultThoughtLevel
  2. 会话档位解析 _nt(e)defaultLevel && levels.includes(defaultLevel) ? defaultLevel : levels[0]。用户配置写的是 defaultVariant,内核认 defaultLevel;转换链到不了这次请求用的 catalog 时,就落到 variants[0] = low
  3. getThoughtLevel() / Th() 用当前 providerOptions 去对 providerOptionsByLevel。自定义模型经 host 转换后每档是空对象 {}stripModelProviderReasoningPatches),多档对不上时返回 undefined → UI 按 available[0] 显示「低」。
  4. setModel 虽会读全局 reasoningLevelGae),但本机在全局已是 medium 时,新任务第一轮仍记录 low,说明这条路径没有真正套上。
  5. 会话内手动 setThoughtLevel("medium") 会写 modelRef.variant 和全局设置,所以当前会话能保住;下一个新任务再走 1–4。
修复建议
  1. 新任务首页 / 草稿开答时,把 composer 当前档位作为 thoughtLevel 传入 session/create(或草稿 setThoughtLevel),不要只传 model。
  2. 选择器与第一轮请求的兜底改为 current ?? 全局 reasoningLevel ?? defaultVariant/defaultLevel ?? available[0],不要直接 variants[0]
  3. 用户配置的 defaultVariant 必须进入会话 runtime 的 defaultLevel;换模型时不要无条件丢掉工作区默认档。
  4. 自定义 OpenAI-Compatible 模型:UI 档位应有通用 reasoning_effort 映射(见 #389),不要只给空壳选择器。

相关:#463(分叉 UI 回落 variants[0],请求仍正确)· #389 #339 #507(自定义模型不发 reasoning_effort

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.