不完整,也很难说“正确”。

从设计角度看,这个 _OPENAI_CONTEXT_WINDOWS 本质上是一个 ContextPolicy 的启发式配置表(heuristic),而不是权威数据源。

主要有几个问题:

1. OpenAI 官方并没有稳定保证这些数字

例如:

"gpt-4.1": 1_000_000,
"gpt-4.1-mini": 1_000_000,
"gpt-4.1-nano": 1_000_000,

这些数字曾经出现在 OpenAI 文档和发布材料中。

但实际上:

都可能限制得更小。

因此:

model == "gpt-4.1"

并不一定意味着:

context_window == 1_000_000

2. GPT-5 系列不准确

例如:

"gpt-5": 400_000,
"gpt-5-mini": 400_000,

截至目前 OpenAI 并没有公开一个非常稳定的:

GPT-5 = 400k

保证。

很多 SDK 或项目里写:

400_000

其实是:

conservative guess

而不是官方承诺。

3. OpenAI Compatible 模型根本不适用

你这个 Provider 明显支持:

DeepSeek
Qwen
Kimi
vLLM
Ollama
LM Studio

但表里完全没有:

DeepSeek

deepseek-chat
deepseek-reasoner

Qwen

qwen3-235b-a22b
qwen3-30b-a3b
qwen3-14b
qwen3-8b

Kimi

kimi-k2
kimi-thinking

Llama

meta-llama/Llama-4-Maverick
meta-llama/Llama-4-Scout

Gemma

gemma-3-27b

Mistral

mistral-large
magistral

Claude (如果接 OpenRouter)

claude-sonnet-4
claude-opus-4

所以对于 OpenAI Compatible Endpoint:

provider.context_window(model)

大量返回:

None

4. vLLM 场景尤其容易出错

假设:

vllm serve DeepSeek-V4

启动参数:

--max-model-len 65536

而模型原生支持:

128k

此时:

deepseek-v4

实际 Context:

65k

不是:

128k

更不是代码里写死的数字。

5. 最致命的问题:模型名 ≠ Context Window

例如:

同一个模型:

Qwen3-32B

可能部署成:

--max-model-len 32768

或者:

--max-model-len 65536

或者:

--max-model-len 131072

所以:

{
    "Qwen3-32B": 131072
}

严格来说就是错的。

更好的方案

很多 Agent Framework 现在采用:

第一层:动态探测

优先读取:

GET /models

例如 OpenAI Compatible API:

{
  "id": "deepseek-v4",
  "context_length": 131072
}

或者:

{
  "max_context_length": 131072
}

有些网关会返回。

第二层:Provider 特殊实现

例如:

class VLLMProvider:
    async def context_window():
        ...

读取:

GET /models

返回:

{
  "max_model_len": 65536
}

第三层:静态表兜底

最后才:

_OPENAI_CONTEXT_WINDOWS = {
    ...
}

作为 fallback。

如果我要维护这个项目

我会改成:

async def context_window(model):
    # 1. runtime discover
    discovered = await discover_context_window()

    if discovered:
        return discovered

    # 2. static fallback
    return STATIC_CONTEXT_WINDOWS.get(model)

而不是完全依赖:

_OPENAI_CONTEXT_WINDOWS

因为对于你代码支持的场景(OpenAI、DeepSeek、Qwen、Kimi、vLLM、Ollama、LM Studio),运行时探测才是真正可靠的方案,静态表只能作为保底机制。

所以结论是: