Claude Code 第三方大模型 1M 长上下文配置指南(GLM-5.2 / DeepSeek v4-pro)
> 让 Claude Code(CLI,v2.1.217)通过 Anthropic 兼容端点接入的第三方大模型用上真实的 1M 上下文,而不是被默认回退到 200K、在 ~180K 就自动压缩。
>
> 本文基于对 claude.exe 源码的实证分析,非臆测。文末附「自动化 Agent 执行清单」,AI 读本文档即可自动完成本地配置。
一、目标与适用范围
把 GLM-5.2(智谱)、DeepSeek v4-pro(DeepSeek 官方)在 Claude Code 里的上下文窗口从默认 200K 抬到真实的 1M,使自动压缩阈值从 ~167K 提升到 ~967K。
方法通用:任何模型名不以 claude- 开头的第三方模型都适用,只需把 CLAUDE_CODE_MAX_CONTEXT_TOKENS 设成该模型的真实上限。
二、根因:Claude Code 怎么判断上下文窗口
Claude Code 内置一张「模型 → 上下文窗口」注册表,只收录原生 Claude 模型。对注册表里没有的模型 ID(glm-5.2、deepseek-v4-pro 等),查表函数 vWc 最终回退到默认 200K:
function vWc(e, t) {
if (xb(e)) return 1e6; // 已知 1M 模型
if (t?.includes("context-1m-2025-08-07") && MV(e)) return 1e6; // 1M beta,firstParty 门控
if (tO(e)) return 1e6;
let r = e7n(e); if (r !== null) return r; // 注册表查表
let n = CLAUDE_CODE_MAX_CONTEXT_TOKENS; // ★ 环境变量
if (n > 0 && !modelName.startsWith("claude-")) return n; // ★ 非 claude 模型用它
return 200000; // 默认回退
}
后果链:窗口被当成 200K → effectiveWindow ≈ 180K → 压缩阈值 ≈ 167K、阻塞上限 ≈ 197K。对话到 ~167K 就被压缩,1M 的真实容量完全用不上。
三、唯一有效杠杆:CLAUDE_CODE_MAX_CONTEXT_TOKENS
由 vWc 可见:模型名不以 claude- 开头(第三方模型都满足)时,设置环境变量
CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000
vWc 就直接返回 1M 作为该模型的上下文窗口。于是全部自动跟着到 1M:
| 量 | 公式 | ≈ 值 |
|---|---|---|
模型窗口 kv |
CLAUDE_CODE_MAX_CONTEXT_TOKENS |
1,000,000 |
有效窗口 effectiveWindow |
kv − min(maxOutput, 20000) |
~980,000 |
| 自动压缩阈值 | effectiveWindow − 13000 |
~967,000 |
| 阻塞上限(默认) | kv − 预留 − 3000 |
~977,000 |
对话堆到 ~967K 才压缩。它是环境变量,可以只在某个模型的启动脚本里设,不影响其它模型。
四、这些杠杆对代理模型无效(别再试)
| 杠杆 | 为什么无效 |
|---|---|
settings.json 的 autoCompactWindow |
源码 TK 里 window = min(kv, autoCompactWindow),只能把窗口往下压,抬不过 kv=200K |
模型名加 [1m] 后缀 |
1M beta 路径有 if(Cn()!=="firstParty")return null 门控,只对 Anthropic 官方 API 生效;走第三方代理被忽略。可保留但纯摆设 |
CLAUDE_CODE_BLOCKING_LIMIT_OVERRIDE |
阻塞上限默认随 kv 走,抬高了 kv 就不用单独设 |
五、配置步骤
为每个模型建一个包装脚本,把 CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000 连同该模型的 base_url / token / model 一起 exec env 进 claude。
5.1 GLM-5.2(智谱)
~/bin/claude-glm:
#!/bin/bash
# Claude Code — GLM-5.2(智谱 Anthropic 兼容端点),1M 上下文
exec env \
ANTHROPIC_BASE_URL=https://open.bigmodel.cn/api/anthropic \
ANTHROPIC_AUTH_TOKEN=<your_zhipu_token> \
ANTHROPIC_MODEL=glm-5.2 \
CLAUDE_CODE_SUBAGENT_MODEL=glm-5.2 \
CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000 \
ENABLE_TOOL_SEARCH=false \
claude "$@"
5.2 DeepSeek v4-pro
~/bin/claude-ds:
#!/bin/bash
# Claude Code — DeepSeek v4-pro(官方 Anthropic 兼容端点),1M 上下文
exec env \
ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic \
ANTHROPIC_AUTH_TOKEN=<your_deepseek_token> \
ANTHROPIC_MODEL=deepseek-v4-pro \
CLAUDE_CODE_SUBAGENT_MODEL=deepseek-v4-pro \
CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000 \
ENABLE_TOOL_SEARCH=false \
claude "$@"
chmod +x ~/bin/claude-glm ~/bin/claude-ds
# 确认 ~/bin 在 PATH 里:echo $PATH | grep -o "$HOME/bin"
> 要点:
> - CLAUDE_CODE_MAX_CONTEXT_TOKENS 是核心,其余是常规接入参数。
> - CLAUDE_CODE_SUBAGENT_MODEL 让子 agent 也用同一模型(否则子 agent 可能回退到默认)。
> - [1m] 后缀可加可不加(对代理无效)。
> - ANTHROPIC_AUTH_TOKEN 是敏感信息,切勿提交到公开仓库或写进本文档的发布版本。
六、验证
- 新开会话(让 env 生效,不要 resume 旧会话):
claude-glm或claude-ds - 会话内输入
/context,窗口上限应显示 1M(不再是 200K) echo $CLAUDE_CODE_MAX_CONTEXT_TOKENS应为1000000- 让对话自然增长,到 ~967K 才触发自动压缩
七、排错速查
| 现象 | 原因 | 处理 |
|---|---|---|
/context 仍显示 200K |
env 没生效 | 确认是新开会话;echo $CLAUDE_CODE_MAX_CONTEXT_TOKENS 应为 1000000 |
| 长对话到某点批量报错 | 模型真实上限 < 设置值 | 把 CLAUDE_CODE_MAX_CONTEXT_TOKENS 下调到模型官方真实上限 |
状态栏百分比与 /context 不符 |
状态栏脚本用了 Claude Code 预计算值(对代理模型按 200K 算) | 状态栏脚本里对第三方模型硬编码 1M 分母、自己重算百分比 |
| 子 agent 仍按 200K 行为 | 没设 CLAUDE_CODE_SUBAGENT_MODEL |
在包装脚本里补上 |
八、自动化 Agent 执行清单
若由 AI agent 读本文档自动配置本地环境,按以下步骤执行:
- 确认目标模型及其真实上下文上限(必须 ≤ 模型官方上限,否则长会话在供应侧报错)。已知:GLM-5.2 = 1M、DeepSeek v4-pro = 1M。
- 为每个模型创建/编辑
~/bin/claude-<name>包装脚本,须包含:ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL、CLAUDE_CODE_SUBAGENT_MODEL、CLAUDE_CODE_MAX_CONTEXT_TOKENS=<真实上限>,末尾exec env ... claude "$@"。 chmod +x脚本,确认~/bin在PATH。- 不要改
~/.claude/settings.json的autoCompactWindow(对代理模型无效,只能下压)。 - 新开会话,
/context验证窗口 = 真实上限。 - 敏感信息处理:
ANTHROPIC_AUTH_TOKEN等不得写入任何会被提交或公开发布的文件;发布文档中一律用占位符<your_..._token>。
九、源码依据(Claude Code v2.1.217)
- 模型窗口查表
vWc:非claude-模型走CLAUDE_CODE_MAX_CONTEXT_TOKENS kv(e,t)=EWc()(仅DISABLE_COMPACT时)否则vWc(e,t)TK(e,t):window = min(kv, autoCompactWindow)—— autoCompactWindow 只能下压$_e=TK.window − min(maxOutputTokens, 20000)- 自动压缩阈值
jzr = bso($_e) = $_e − 13000 - 阻塞上限默认
Ijg − 3000 = (kv − 预留) − 3000,在Awu中先于压缩判断 - 1M beta 门控:
if(Cn()!=="firstParty")return null