Affected area
Model providers
Problem statement (what should this solve)
LiveAgent 会在上下文占用约 50% 时自动触发压缩(compaction),但触发阈值无法配置,且部分模型会被过早压缩。排查发现两个相关根因:
-
压缩阈值硬编码:阈值由 crates/agent-gui/src/lib/chat/compaction/policy.ts 的公式计算——阈值 = contextWindow − maxOutputToken × factor,其中 factor 固定为 1.5(发送前优化)/ 1.2(回合中途保护),没有任何设置项可调。当 maxOutputToken ≈ contextWindow / 3(很多模型的典型配比)时,优化阈值约为窗口的 50%。
-
带日期后缀的模型 ID 匹配不到内置目录:用第三方中转接入官方模型时,模型 ID 常带厂商前缀与日期后缀(例如 deepseek-ai/deepseek-v4-pro-0813)。内置模型目录 crates/agent-ui/src/lib/models/catalog.generated.ts 里只有不带后缀的 deepseek-v4-pro(contextWindow=1,000,000 / maxOutputToken=384,000)。按 ID 精确匹配失败后,normalizeProviderModelConfig 会落到供应商 fallback 兜底值(实测被记成 contextWindow=400,000 / maxOutputToken=142,000),使上下文窗口被低估到真实值的一半左右,进一步导致自动压缩过早触发。
Proposed behavior
-
为自动压缩触发阈值提供可配置项(阈值系数或百分比),让用户能调整压缩时机。
-
模型目录匹配时对模型 ID 做归一化:去掉日期/版本后缀(如 -0813、-0731)与厂商前缀(如 deepseek-ai/),再回退匹配内置目录,而不是直接落到 fallback 兜底值。这样 deepseek-ai/deepseek-v4-pro-0813 就能正确匹配到 deepseek-v4-pro 的 contextWindow=1,000,000 / maxOutputToken=384,000。
Estimated change scope
crates/agent-gui/src/lib/chat/compaction/policy.ts(阈值常量与 resolveCompactionThreshold)
crates/agent-ui/src/lib/settings/index.ts(normalizeProviderModelConfig / getProviderModelDefaults 的模型 ID 归一化匹配)
crates/agent-ui/src/lib/models/catalog.generated.ts(目录匹配的候选来源)
Alternatives considered
临时 workaround:用户在设置里手动把每个带后缀模型的 contextWindow / maxOutputToken 改成正确值(limitsSource 会变为 user)。但每个中转、每个模型都要手动改一遍,且带后缀 ID 无法随目录更新自动修复,所以希望从匹配逻辑层面根治。
Pre-submit checklist
Affected area
Model providers
Problem statement (what should this solve)
LiveAgent 会在上下文占用约 50% 时自动触发压缩(compaction),但触发阈值无法配置,且部分模型会被过早压缩。排查发现两个相关根因:
压缩阈值硬编码:阈值由
crates/agent-gui/src/lib/chat/compaction/policy.ts的公式计算——阈值 = contextWindow − maxOutputToken × factor,其中 factor 固定为 1.5(发送前优化)/ 1.2(回合中途保护),没有任何设置项可调。当maxOutputToken ≈ contextWindow / 3(很多模型的典型配比)时,优化阈值约为窗口的 50%。带日期后缀的模型 ID 匹配不到内置目录:用第三方中转接入官方模型时,模型 ID 常带厂商前缀与日期后缀(例如
deepseek-ai/deepseek-v4-pro-0813)。内置模型目录crates/agent-ui/src/lib/models/catalog.generated.ts里只有不带后缀的deepseek-v4-pro(contextWindow=1,000,000 / maxOutputToken=384,000)。按 ID 精确匹配失败后,normalizeProviderModelConfig会落到供应商 fallback 兜底值(实测被记成 contextWindow=400,000 / maxOutputToken=142,000),使上下文窗口被低估到真实值的一半左右,进一步导致自动压缩过早触发。Proposed behavior
为自动压缩触发阈值提供可配置项(阈值系数或百分比),让用户能调整压缩时机。
模型目录匹配时对模型 ID 做归一化:去掉日期/版本后缀(如
-0813、-0731)与厂商前缀(如deepseek-ai/),再回退匹配内置目录,而不是直接落到 fallback 兜底值。这样deepseek-ai/deepseek-v4-pro-0813就能正确匹配到deepseek-v4-pro的 contextWindow=1,000,000 / maxOutputToken=384,000。Estimated change scope
crates/agent-gui/src/lib/chat/compaction/policy.ts(阈值常量与resolveCompactionThreshold)crates/agent-ui/src/lib/settings/index.ts(normalizeProviderModelConfig/getProviderModelDefaults的模型 ID 归一化匹配)crates/agent-ui/src/lib/models/catalog.generated.ts(目录匹配的候选来源)Alternatives considered
临时 workaround:用户在设置里手动把每个带后缀模型的 contextWindow / maxOutputToken 改成正确值(
limitsSource会变为user)。但每个中转、每个模型都要手动改一遍,且带后缀 ID 无法随目录更新自动修复,所以希望从匹配逻辑层面根治。Pre-submit checklist