明明没超上下文,怎么报 context length exceeded?

环境: cherry-studio + claude-sonnet-5.5,长文
文档大概 18 万 token

报错全文:

{'error': {'message': "This model's maximum context length is 128000 tokens. However, your messages resulted in 135000 tokens.", 'type': 'invalid_request_error', 'code': 'context_length_exceeded'}}

{"type":"error","error":{"type":"invalid_request_error","message":"prompt is too long: 210000 tokens > 200000 maximum"}}

查了下资料,说最常见原因是「历史消息没裁剪,越聊越长」,但我这个场景……求大佬指点。

这个我们在报错百科里做过完整排查,直接给结论:

这次请求的 token 总数超过了模型窗口。 注意:输入 + 输出都算,输出还要预留 max_tokens。

修法(节选自百科,完整版见正文链接):

1. 裁剪历史

只保留最近 N 轮 + 第一条(通常第一条最重要)。中间的丢掉或摘要。

def trim(messages, keep_first=1, keep_last=10):
    if len(messages) <= keep_first + keep_last:
        return messages
    return messages[:keep_first] + messages[-keep_last:]

2. 长文档先摘要

不要把整本书塞进去。先分块摘要,再把摘要喂给主模型。

完整排查文档(含全部概率排序和责任判定):context_length_exceeded:上下文超长怎么解决 · 报错百科 · docai.cc
按这个改完基本就通了。还报错的话把你改后的完整报错贴上来,我再看。