编辑器请求被截断或报超上下文:怎么定位是谁把窗口撑爆的
超上下文这类报错,绝大多数时候不是模型不行,而是你不知道这一次请求里到底装了哪些东西,也没核对过客户端里那个由你手填的窗口数字填了多少。 这两件事都能查,而且查的顺序不能反:先把概念和字段对上,再去拆请求体,最后才轮到换模型。
先说清楚本篇和站内几篇相邻文章的分工:输出被截断的排查路径 讲的是”话说到一半停了”这一类现象怎么定位到停止原因,大仓库上下文不足 讲的是代码库太大时怎么挑该喂给模型的内容,API 输出长度控制 讲的是你自己写代码调 API 时怎么控制生成长度。本篇只管一件事:在编辑器 / 终端 Agent 这一层,上下文相关的那几个数字是由谁填的、填在哪、怎么和真实请求量对齐。
一、先把两组最容易混的概念拆开
上下文窗口,指一次请求里输入和输出加起来能占的 token 上限,这个上限由服务端的模型决定,客户端改不了。最大输出是另一个数,指你允许模型这一次最多生成多少 token。两者量纲一样都是 token,含义完全不同——窗口是房间大小,最大输出是你给这一次发言留的时间。很多人把”回答被砍掉”和”报超上下文”混成一件事,实际上前者常和最大输出有关,后者才和窗口有关。
OpenAI 兼容端点,指服务方按 OpenAI 的 chat completions 请求 / 响应格式对外提供接口,于是客户端只要把 base URL 和密钥换掉就能连上去。它约定的是”数据长什么样”,不保证背后模型有什么能力。
原生工具调用(function calling),指模型直接以结构化字段返回”要调哪个工具、带什么参数”,而不是靠在正文里约定一套标记再由客户端解析。关于这一点,Roo Code 官方文档写得很硬,原话是:
“Roo Code uses native tool calling exclusively. This is the only supported tool protocol — there is no XML-based fallback.”
这是该产品官方文档的说法,不是本文的判断。它还建议你先去查服务商文档,确认所选模型是否支持工具调用。为什么这条和”窗口被撑爆”有关?因为工具协议决定了请求里要不要带工具定义、带多少——这一段占位往往不小,却最容易被忽略。
接入方式和模型能力是两件事:前者是 base URL、密钥、模型 ID 这些”怎么连上”,后者是窗口多大、支不支持工具调用这些”连上之后能干什么”。报错发生时,先判断你踩的是哪一件。
二、需要你手填的那几个数字,各家叫什么、在哪一层
这一节的字段名逐字来自各产品官方文档,核对日期 2026-08-07,以官方文档最新版为准。
| 产品 | 官方文档里的字段名(逐字) | 你填进去的是什么量纲 | 出处 |
|---|---|---|---|
| Cline | Context Window size、Max Output Tokens(同在 Model Configuration 区,另有 Image Support、Computer Use、Input Price、Output Price) | 前两项按字段名是 token 数;价格两项的计价口径文档未说明,以官方文档为准 | https://docs.cline.bot/provider-config/openai-compatible |
| Roo Code | Context Window、Max Output Tokens(另有 Image Support、Computer Use、输入/输出价格) | 同上,均属该产品文档中可自定义的项 | https://roocodeinc.github.io/Roo-Code/providers/openai-compatible |
| Zed | available_models 数组每项里的 max_tokens | 文档说明它是上下文窗口上限 | https://zed.dev/docs/ai/use-api-access |
| aider | .aider.model.metadata.json 里的 max_input_tokens、max_output_tokens、max_tokens | token 数,由你注册 | https://aider.chat/docs/config/adv-model-settings.html |
有一件事必须说明白:上表里只有两处的用途是文档写明的——Zed 的 max_tokens 被说明为上下文窗口上限,aider 的 .aider.model.metadata.json 被说明为给它不认识的模型注册上下文上限与价格。Cline 与 Roo Code 那一侧,本篇依据的记录只列出了字段名,没有逐条说明客户端内部拿这些数值做什么。 所以本文不会写”某某产品会拿这个数决定何时压缩历史”之类的句子——那是按字段名反推的猜测,不是文档记载。你只需要知道:这些值由你填,具体行为以官方文档为准。这也不等于说这些产品没有别的相关设置,只是本篇依据的记录里没有出现。
还有一条跨家的坑:base URL 这一项在各家的名字不一样。Cline 和 Roo Code 的表单里叫 Base URL,Zed 的 settings.json 里叫 api_url。名字不同就是不同的东西,互相搬字段名就是编造。Cline 文档还专门提示,这里填的不会是 https://api.openai.com/v1(那是官方 OpenAI API 的地址),它文档中的 v0 Quickstart 示例是 Base URL 填 https://api.v0.dev/v1、Model ID 填 v0-1.0-md。
Zed 那一侧的形状是这样(官方文档示例,可原样对照):
{
"language_models": {
"openai_compatible": {
"my-provider": {
"api_url": "https://example.com/v1",
"available_models": [
{
"name": "my-model",
"display_name": "My Model",
"max_tokens": 128000
}
]
}
}
}
}
name 是模型标识,display_name 是界面显示名,max_tokens 是上下文窗口上限,另有 capabilities 对象控制能力开关(tools、images、parallel_tool_calls 等)。
aider 这一侧则是给它不认识的模型补一份元数据,官方文档示例:
{
"provider/model-name": {
"max_tokens": 4096,
"max_input_tokens": 32000,
"max_output_tokens": 4096,
"input_cost_per_token": 0.00000014,
"output_cost_per_token": 0.00000028,
"litellm_provider": "provider",
"mode": "chat"
}
}
其中的数字是官方文档的示例值,不是任何真实模型的报价或规格,别照抄进生产配置。另外 aider 的 .aider.model.settings.yml 可以放四个位置,按 home 目录、git 仓库根目录、启动 aider 的当前目录、--model-settings-file <filename> 指定路径的顺序加载,后加载的优先——这条在排查”我明明改了怎么没生效”时非常关键。
三、定位顺序:从哪一端报的错,一直查到请求体
第一步,确认报错来自哪一端。 服务端返回的超限错误和客户端自己的提示不是一回事。你实际看到的措辞以你的界面为准,本文不描述任何产品的报错文案。能拿到 HTTP 状态码和响应体的话,先看响应体里服务端怎么说。
第二步,把你填的数字和模型的真实上限对齐。 上一节那几个字段是由你手填的,填的值和服务端的真实上限不一致时,你的所有心算都建立在错误前提上。先去服务商文档确认该模型的窗口和最大输出,再回来核对配置里的数。
第三步,把 token 数换算成你能感知的量。 token 是个抽象单位,直接盯着”128000”很难判断”这够不够放我那三个文件”。本站的 上下文长度计算器 就干这件事:你输入 token 数与单价,它换算出大约等于多少中文字符、多少英文单词,并算出这一次调用的成本;页面上还附了上下文窗口怎么选、超长报错怎么处理、长上下文与检索怎么权衡的说明。它的边界也要说清楚——它不按文件数、对话轮次、并发量估算,也不计算占窗口的比例,更不会替你查厂商单价或算出账单。单价得你自己从服务商文档里查来填。它是个换算工具,帮你把抽象数字变成”大概几千字”这种可判断的量,判断本身还是你做。
第四步,拆请求体,看这次到底装了什么。 一次 OpenAI 兼容调用最终就是一个请求体,里面通常包含系统提示、工具定义、历史消息、以及客户端附带的文件内容或检索结果。这是协议层与 Agent 客户端的通用机制,不是上述任何一家文档的记载事实。能力允许的话,在你自己可控的网关或反向代理上把请求体落一份日志,按段落数一下各占多少——比对着界面猜准得多。工具定义那一段尤其值得单独看:工具越多,每次请求的固定开销越大,而这一段和你写了多长的提问完全无关。
第五步,最小化复现。 新开一个会话,只发一句话、不带任何文件,看还报不报。如果不报,说明问题在被带进去的那些东西上;如果照样报,说明配置层那几个数字或端点本身有问题。这一步能把排查范围砍掉一大半,别跳过。
按这个顺序走下来,“是谁把窗口撑爆的”通常在第四步就有答案了。想再往上一层做预算管理,可以看 上下文长度怎么选;想先补齐 token 本身的概念,看 token 怎么算。
四、边界与代价:这套做法放弃了什么
它不解决”该喂什么”的问题。 本篇整套排查只回答”这次装了多少、上限是多少、哪一段最占地方”,不回答”该把哪几个文件放进去”。仓库一大,后者才是主要矛盾,那属于检索和分块的范畴。
它依赖你能看到请求体。 如果你既没有自建网关,也拿不到服务端日志,第四步就只能靠删减变量倒推——把文件一个个撤掉、把工具一组组关掉,看哪一步不报了。慢,但仍然有效。
手填的数字有维护成本。 服务商换了模型、调了上限,你本地填的那个值不会自动跟着变。它是一份需要人工同步的副本,时间一长就会漂。这是”允许手填”这个设计换来的灵活性所付出的代价。
它明确不管这几件事:不管模型质量好不好、不管你的提示词写得对不对、不管账单金额(计算器只按你填的单价算单次调用成本,不接任何账单系统)、也不管各家客户端在窗口逼近上限时具体会怎么做——那属于各产品自己的实现,本篇不做断言。
五、避坑清单
把最大输出和上下文窗口当成一个数。 为什么会踩:两个字段量纲相同、名字都带 tokens,界面上还常挨着。怎么避:填之前先默念一遍——窗口是”输入+输出的总额度”,最大输出是”这次最多生成多少”。Cline 与 Roo Code 的文档里这两项是分开列的,Context Window size / Context Window 和 Max Output Tokens 不要串。
把 A 家的字段名搬到 B 家。 为什么会踩:网上的教程常混着几家写,看到”填 base URL”就以为哪里都叫这个名。怎么避:认准你当前那家文档里的逐字写法——Cline 和 Roo Code 表单里叫 Base URL,Zed 的 JSON 里是 api_url。改配置前先打开对应那一页确认。
base URL 带不带 /v1 靠猜。 为什么会踩:不同服务商的端点结构确实不一样。怎么避:以服务商文档给的地址为准。可作参照的公开事实是:Cline 文档的 v0 示例是含 /v1 的,Zed 文档示例写的是 https://example.com/v1。你自己那家怎么写,去它的 API 文档抄。
改了 aider 的设置文件却没生效。 为什么会踩:.aider.model.settings.yml 有四个可放位置,且后加载的优先,你改的很可能被另一份覆盖了。怎么避:排查时先确认这四处各有没有同名文件,必要时用 --model-settings-file <filename> 显式指定一份,去掉歧义。
排查 Zed 配置时顺手把密钥写进 settings.json。 为什么会踩:调试时图快,想着”先跑通再说”,然后这份文件就进了版本库。怎么避:Zed 文档的原话是 “Do not put API keys in settings.json.”;它给的两条路是 provider 设置界面或环境变量,命名规则为 <PROVIDER_NAME>_API_KEY(provider 名为 my-provider 时对应 MY_PROVIDER_API_KEY)。另外 configuration 页原话:“Provider keys saved through Zed are stored in the system keychain, not in settings.json.”——keychain 是操作系统提供的凭据保管服务,密钥由系统加密保存,不落在明文配置文件里。
只顾着删聊天记录,不看工具定义。 为什么会踩:历史消息看得见,工具定义看不见。怎么避:第四步拆请求体时把工具那一段单独称重;工具挂得多的场景,先关掉一批不相关的再复现一次。相关的取舍可以参考 Agent 上下文预算。
换模型当成第一手段。 为什么会踩:换个”窗口更大”的模型确实常常能让报错消失,于是问题被掩盖了。怎么避:先按上面五步定位到具体是哪一段撑爆的;如果不定位,换到更大的窗口也只是把同一个问题往后推,成本还上去了。
假定所选模型一定支持工具调用。 为什么会踩:OpenAI 兼容端点保证的是数据格式,不保证模型能力。怎么避:Roo Code 文档已经写明它只用原生工具调用、没有 XML 回退,并建议先查服务商文档确认模型是否支持工具调用——接入前查一次,比接入后对着报错猜快得多。
数据来源与核对日期
以下 URL 为本篇所用产品事实的出处,核对日期均为 2026-08-07。字段名、示例、英文原句均以这几页当天的内容为准,请以官方文档最新版为准。
- Cline(OpenAI 兼容 provider 配置,含 Base URL / API Key / Model 与 Model Configuration 区各项、v0 示例):https://docs.cline.bot/provider-config/openai-compatible
- Roo Code(OpenAI 兼容 provider 配置,含 Context Window、Max Output Tokens 与 native tool calling 原话):https://roocodeinc.github.io/Roo-Code/providers/openai-compatible
- aider(
.aider.model.settings.yml的四处加载顺序、.aider.model.metadata.json示例):https://aider.chat/docs/config/adv-model-settings.html - Zed(
settings.json中openai_compatible示例、api_url、available_models、max_tokens、API key 与 keychain 的原话):https://zed.dev/docs/ai/use-api-access 、https://zed.dev/docs/ai/configuration
本篇没有写的内容,以及原因:
- 任何产品的价格、免费额度、订阅档位、限速数字、版本号——这类信息变动频繁,本次未做核实,写进来只会误导;aider 元数据示例里的单价数字已注明是官方文档示例值,不是真实报价。
- 各家支持的完整模型清单——同上,会过时,请查各服务商文档。
- 各家界面长什么样、菜单在哪一级、报错文案怎么写、什么时候会拦住你——本篇依据的是配置层文档,不含界面记录,一律以你实际看到的界面为准。
- 客户端内部拿 Context Window size、Max Output Tokens、Input Price、Output Price 这些值做什么——文档未逐条说明,本篇不做推断。
- Cline / Roo Code / Zed / aider 之外其它工具的配置写法——不在本篇核实范围内,请以各产品官方文档为准。
延伸阅读:同一组里的 公司网络下代理与证书报错、自定义模型接入后 token 变贵;接完之后照 接完自定义模型别急着干活 逐项过一遍,才算真接通。