Files
HomeAgent/internal/agent/api/context_window_test.go
JianFeeeee 6ddef5e49f feat(llm): 声明真实上下文窗口 + 工作区间与窗口分离
问题: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 钉死推断值与显式声明优先级。
2026-09-19 14:24:31 +08:00

40 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}
}