快速结论:当你在 CrewAI 里给 o1 / o1-pro / o3、gpt-5 系列、Claude 1M 模型或 Bedrock 区域前缀模型设置上下文窗口时,如果发现实际生效的窗口被回退成 8192、200k 等“默认值”,通常说明命中了一份漂移过的硬编码上下文窗口表;优先排查模型 ID 与各 Provider 本地映射表是否一致。
适用环境:Issue 讨论中明确提到的工具是 CrewAI(`lib/crewai/src/crewai/` 下的核心库),涉及 LiteLLM 回退路径与 Native OpenAI / Azure / Gemini / Anthropic / Bedrock Provider。Issue 正文未给出操作系统、Python、CUDA、显卡或其它依赖版本,不要臆测。
最快修复方案:暂无确认的一步修复方案。该 Issue 属于代码级重构(单一数据源 + 最长前缀匹配 + 合并漂移表),不是环境命令类修复;Issue 关闭时合并的 PR 未在本讨论链中给出可复制的用户侧命令或配置。
注意事项:该 Issue 的定位是“改进(improvement)”,用于消除重复映射表导致的取值不一致;如果你只是想临时绕过,调大模型 ID 的显式上下文窗口配置可能有效,但这属于猜测方向,Issue 未验证。讨论中还提到 `context_window_usage_ratio` 在 #7303 期望行为里是 0.75,而本 Issue 描述为 0.85,维护者明确要求“保持 0.85”,因此不要自行改成 0.75。
问题场景
在使用 CrewAI 构建 Agent / Crew 时,框架需要根据模型 ID 推断 LLM 的上下文窗口大小,再乘以使用比例,用于上下文预算与边界校验。触发本问题的典型场景包括:
- 使用 o1、o1-pro、o3 等模型,但它们缺失于部分重复的映射表,于是回退到 8192 默认值(相关 #7303)。
- 使用 Native OpenAI,能看到 gpt-5 / gpt-5-mini / gpt-5-nano 为 1,047,576,但走 LiteLLM 的 gpt-5 却掉到 8192。
- 使用 Native Anthropic 的 1M 模型(如 claude-sonnet-4-6、claude-opus-5),这些裸 Claude ID 未列在 `llm.py` 中。
- 使用 Native Bedrock 的 `anthropic.claude-sonnet-4-6`(实际 1M),却因为前缀 `anthropic.claude-sonnet-4` 被判定为 200k。
- 使用 OpenAI 兼容路径(如 `deepseek/…`、`openrouter/…`),继承了 OpenAI 的本地表,导致只存在于 LiteLLM 的键(如 `deepseek-chat`)变成 8192。
报错原文
[IMPROVEMENT] Single source of truth for LLM context window sizes
Context window sizes are hardcoded in six places. Adding or updating a model
means editing `llm.py` and the native provider (and sometimes Azure or Bedrock
too). The copies have already drifted.
Related: #7303 (o1 / o1-pro / o3 fall back to the 8k default because they are
missing from some of the duplicated tables).
原因分析
最可能的原因是上下文窗口大小被硬编码在六处重复位置,各份副本已经发生内容漂移,且查找规则互相矛盾:Native Provider 采用“首次匹配”(键按最长优先插入),而 `llm.py` 采用“最后匹配胜出”。因此同一模型 ID 在不同调用路径下会解析出不同的窗口大小。具体漂移点包括:
- Native OpenAI 有 gpt-5 / gpt-5-mini / gpt-5-nano(1,047,576),LiteLLM 的 gpt-5 回退到 8192。
- Native Anthropic 的 1M 模型未以裸 Claude ID 形式列在 `llm.py`。
- Native Bedrock 前缀 `anthropic.claude-sonnet-4` 为 200k,导致 `anthropic.claude-sonnet-4-6`(1M)被误判。
- OpenAI 兼容路径继承 OpenAI 本地表,LiteLLM-only 键(如 `deepseek-chat`)变成 8192。
环境排查
- 确认 CrewAI 核心库路径:`lib/crewai/src/crewai/`,重点看 `llm.py` 与 `llms/providers/` 下的 `openai/completion.py`、`azure/completion.py`、`gemini/completion.py`、`anthropic/completion.py`、`bedrock/completion.py`。
- 确认你走的是 LiteLLM 回退路径还是 Native Provider 路径,因为两条路径的查找规则不同(前者 last-match-wins,后者首次匹配)。
- 确认模型 ID 的完整前缀形式,尤其是 Bedrock 的 `anthropic.` / `us.anthropic.` / `eu.anthropic.` / `apac.anthropic.` / `global.anthropic.` 区域前缀。
- 确认 `context_window_usage_ratio` 取值;按本 Issue 应为 0.85,Issue 未要求你改成 0.75。
- 确认 `base_llm.DEFAULT_CONTEXT_WINDOW_SIZE = 4096`(自定义 LLM 回退)是否被误改;这是另一个默认值,不应与 8192 默认混淆。
解决步骤
- 新增模块 `lib/crewai/src/crewai/llms/context_window.py`,集中定义 `CONTEXT_WINDOW_USAGE_RATIO`(0.85)、`DEFAULT_CONTEXT_WINDOW_SIZE`(8192)、`MIN_CONTEXT`、`MAX_CONTEXT`。
- 在该模块实现 `resolve_context_window_size(model, sizes, *, default, extra_names=())`,采用“最长前缀胜出”,再乘 0.85 比例,并只做一次边界校验。
- 把模型家族映射集中到该模块:`OPENAI_CONTEXT_WINDOWS`、`AZURE_CONTEXT_WINDOWS`、`ANTHROPIC_CONTEXT_WINDOWS`、`GEMINI_CONTEXT_WINDOWS`、`BEDROCK_CONTEXT_WINDOWS`、`LITELLM_CONTEXT_WINDOWS`。
- 从 `ANTHROPIC_CONTEXT_WINDOWS` 展开 Bedrock Claude ID(`anthropic.`、`us.anthropic.`、`eu.anthropic.`、`apac.anthropic.`、`global.anthropic.`),使新增一个 Claude 窗口只需改一处。
- 用上述映射的合并结果定义 `LLM_CONTEXT_WINDOW_SIZES`(LiteLLM + OpenAI 兼容)。
- 改造各 Provider:删除本地 `context_windows` 字典,`get_context_window_size` 改为对该 Provider 映射的一行调用;保持现有默认值——OpenAI/Azure/Bedrock 为 8192,Anthropic 为 200k,Gemini 为 1M。
- 在 `lib/crewai/src/crewai/llm.py` 中重新导出 `LLM_CONTEXT_WINDOW_SIZES`、`CONTEXT_WINDOW_USAGE_RATIO`、`DEFAULT_CONTEXT_WINDOW_SIZE`,保证现有测试(如 `patch.dict(“crewai.llm.LLM_CONTEXT_WINDOW_SIZES”, …)`)继续可用。
- 让 LiteLLM 的 `get_context_window_size` 调用共享解析器,传入合并映射与 `_context_window_model_name()`。
- 不要改动 `base_llm.DEFAULT_CONTEXT_WINDOW_SIZE = 4096`,它是自定义 LLM 的另一套默认值。
- 补充单元测试:查找行为、边界/默认值处理、Native 与 LiteLLM 的一致性。
验证方法
改动后,添加一个新模型应只需在对应家族映射里加一条:例如在 `OPENAI_CONTEXT_WINDOWS` 加入 `gpt-5.7`,Native OpenAI、Azure、LiteLLM 与 OpenAI 兼容路径应都能解析到同一窗口;在 Anthropic 加入 `claude-sonnet-4-7` 后,Bedrock 的区域 ID 应自动生成并解析到 1M 而非 200k。同时跑通 Issue 提到的既有测试(含 `patch.dict(“crewai.llm.LLM_CONTEXT_WINDOW_SIZES”, …)`),确认公开导出与默认值未被破坏,即为问题已解决。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


