mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-24 19:08:10 +00:00
问题:core.llm.model=AUTO,而 ModelContextWindow("auto") 匹配不到任何分支、
掉进 default 32768 —— 该源真实窗口是 1M(实测 990,034 token 的 prompt 通过),
内核却按小 30 倍的窗口算全部预算。
三处改动:
1. ModelContextWindow 补 deepseek-v4/v3 → 1M;推断不出时打日志(静默降级是
这次问题的成因,不能再默默退回一个小值)。
2. sourceFieldDefs 补 context_window 声明:它早已被 readInt 读进 LLMSource
并透传到 provider,但没进这张表 ⇒ WebUI 里看不见也改不了。
3. ComputeTokenBudget 新增 maxTargetTokens=600000:窗口 1M 不等于按 838K
(80%)干活。标称窗口≠有效窗口,600K 是该源最优工作区间,所以把
「窗口上限」(会不会被上游拒)与「工作区间」(预算分配)分开。
配套 core.llm.max_tokens 4096→32768(实测长输出样本达 18,272 token,
16384 仍会截断;上限是 cap 不是目标,短问答零成本)。
测试:tokenbudget_test.go 钉死封顶生效且小窗口不受影响;
context_window_test.go 钉死推断值与显式声明优先级。
40 lines
1.7 KiB
Go
40 lines
1.7 KiB
Go
package api
|
||
|
||
import "testing"
|
||
|
||
// 回归(2026-09-19):模型名推断不出窗口时,此前会静默退回 32768。
|
||
// 生产实际配的是 core.llm.model="AUTO",于是整个预算按 32768 算,
|
||
// 而该源真实窗口是 1M(实测 990,034 token 的 prompt 通过)—— 小 30 倍。
|
||
//
|
||
// 这里钉死两点:① deepseek-v4 系能推断出真实窗口;② AUTO 仍走兜底
|
||
// (兜底值本身不猜大:猜大会让请求直接撞上游 400)。
|
||
func TestModelContextWindow(t *testing.T) {
|
||
cases := map[string]int{
|
||
"deepseek/deepseek-v4.1-flash": 1048576,
|
||
"deepseek-v4-flash": 1048576,
|
||
"deepseek-chat": 65536,
|
||
"claude-opus-5": 100000,
|
||
"gpt-4-turbo": 128000,
|
||
"llama-3-70b": 8192,
|
||
"AUTO": 32768, // 推断不出 → 兜底,靠 context_window 覆盖
|
||
}
|
||
for model, want := range cases {
|
||
if got := ModelContextWindow(model); got != want {
|
||
t.Errorf("ModelContextWindow(%q) = %d, want %d", model, got, want)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 显式声明的 context_window 必须覆盖模型名推断 —— 这是部署方绕开
|
||
// “AUTO 推断不出窗口”的唯一手段,不能反过来被推断值盖掉。
|
||
func TestExplicitContextWindowWinsOverInference(t *testing.T) {
|
||
p := &LuaAdaptedProvider{cfg: BaseConfig{Model: "AUTO", ContextWindow: 1048576}}
|
||
if got := p.MaxContextTokens(); got != 1048576 {
|
||
t.Errorf("显式 context_window 未生效:got %d, want 1048576", got)
|
||
}
|
||
p2 := &LuaAdaptedProvider{cfg: BaseConfig{Model: "AUTO"}}
|
||
if got := p2.MaxContextTokens(); got != 32768 {
|
||
t.Errorf("未声明时应走推断兜底:got %d, want 32768", got)
|
||
}
|
||
}
|