Skip to content

[Bug]: config.toml 中的 model_context_window 对自定义供应商不生效 #1260

Description

@sekiwhat

影响范围

供应商切换 / 配置写入

当前行为

config.toml 中的 model_context_window 对自定义供应商不生效

Codex CLI 版本: 0.142.2

问题描述

使用自定义模型供应商(如本地代理转发的 mimo-v2.5-pro、deepseek-v4-pro 等)时,在 config.toml 中设置 model_context_window = 1000000 无效。Codex 会忽略该值,回退到默认上下文窗口 "context_window": 272000。

根本原因

Codex 的实际上下文窗口从 ModelInfo.context_window(模型目录中的字段)解析,而非 config.toml 的 model_context_window。解析链路如下:

models_cache.json(远程模型目录)
    ↓ 按 slug 查找
    ↓ 失败 — "mimo-v2.5" 不在 OpenAI 官方目录中
    ↓ 回退到默认上下文窗口
config.toml 中的 model_context_window 未被使用

运行时限制变量(full_context_window_limitauto_compact_scope_limit,定义于 core/src/session/turn.rs)完全由 ModelInfo.context_window 计算得出。model_context_window 虽然存在于 ConfigToml 结构体中,但对于目录中不存在的模型,它不会覆盖目录解析结果。

这可以通过 config lockfile 中的 save_fields_resolved_from_model_catalog 机制确认——模型目录解析出的字段作为最终生效值被保存。

当前的 Workaround

创建自定义模型目录文件 ~/.codex/model_catalog_custom.json,显式定义模型的 context_window 以及必填的 base_instructions 字段,然后在 config 中指向它:

# config.toml
model_catalog_json = "~/.codex/model_catalog_custom.json"
// model_catalog_custom.json
{
  "models": [
    {
      "slug": "mimo-v2.5",
      "display_name": "Mimo v2.5",
      "base_instructions": "You are Codex, a coding agent...",
      "context_window": 1000000,
      "max_context_window": 1000000,
      "effective_context_window_percent": 95
    }
  ]
}

补充信息

  • 自定义目录 JSON 中 base_instructions 为必填字段,缺失时会报 missing field 'base_instructions' 解析错误,但文档中未提及此要求
  • 官方目录(models_cache.json)包含完整的 ModelInfo 定义(含 context_window),但自定义/本地模型除非通过 model_catalog_json 手动提供,否则没有等价定义

预期行为

以下任一方案均可:

  1. model_context_window 应作为硬覆盖,无论模型是否存在于目录中都生效
  2. 当模型 slug 在所有目录中都找不到时,Codex 应回退使用 config.toml 中的 model_context_window,而非静默使用默认值
  3. 至少在 model_context_window 被设置但因目录解析优先级而被忽略时,输出一条警告日志

复现步骤

  1. ~/.codex/config.toml 中配置自定义供应商和非 OpenAI 模型:
    model = "mimo-v2.5"
    model_provider = "custom"
    model_context_window = 1000000
    
    [model_providers.custom]
    name = "custom"
    wire_api = "responses"
    requires_openai_auth = true
    base_url = "http://127.0.0.1:57321/v1"
  2. 启动 Codex 会话
  3. 观察到上下文窗口只有258k

日志 / 配置片段

Codex++ 版本

1.2.24

系统

macOS

提交前确认

  • 我已经脱敏了 API Key、Token、账号等敏感信息。
  • 我已经确认这是当前最新版仍然存在的问题。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions