模型上下文窗口与预算
设计时间:2026-05-18 状态:已实现(已迁移自 design/)
1. 问题
改动前 ContextBudget 以全局固定值工作:
ContextConfig.max_tokens = 8000ContextConfig.reserved_tokens = 1000Application初始化 provider 时构建一次ContextBuilderSessionRunner每轮虽然会解析effective_model和ModelCapabilities,但不会用模型能力重算上下文预算
这会导致两个问题:
- 不同模型的上下文窗口无法表达,也无法在模型切换时生效。
- 默认窗口停留在 8k 级别,明显小于现代 272k / 1M 上下文模型。
2. Codex 参考
D:/Projects/codex 中相关默认值:
- 未知模型 fallback metadata:
context_window = 272_000 effective_context_window_percent = 95auto_compact_token_limit省略时从 context window 派生为 90%- 工具输出默认截断预算:
10000tokens - 部分模型声明
max_context_window = 1_000_000
3. 当前设计
上下文预算从"全局 provider 初始化值"改为"每轮按实际选中模型解析":
ModelCapabilities增加模型窗口元数据:context_windowmax_context_windoweffective_context_window_percentauto_compact_token_limit
ContextConfig/ContextBudget默认值提升到现代 fallback:max_tokens = 272000reserved_tokens = 10000
build_context_budget()支持传入ModelCapabilities:- 有模型窗口时使用模型窗口作为硬上限。
- 默认按
effective_context_window_percent派生响应/系统余量。 - 默认按 90% context window 派生软压缩阈值。
SessionRunner在每轮 resolve provider/model 之后创建本轮ContextBuilder,并传给AgentLoop。- 文档和测试同步更新,明确模型上下文在哪里声明与生效。