消息转换
为了帮助解决超出模型最大上下文提示词,OpenRouter 支持一个名为 transforms
的自定义参数:
{
transforms: ["middle-out"],// Compress prompts that are > context size.
messages: [...],
model // Works with any model
}
这对于不需要完美记忆的情况非常有用。转换的工作原理是删除或截断提示词中间的消息,直到提示词适合模型的上下文窗口。
在某些情况下,问题不在于Token上下文的长度,而在于实际的消息数量。转换也解决了这个问题:例如,Anthropic 的 Claude 模型强制执行 {anthropicMaxMessagesCount}
消息的最大值。当在启用 middle-out
的情况下超过此限制时,转换将保留对话开头和结尾各一半的消息。
启用 middle-out
压缩后,OpenRouter 将首先尝试查找上下文长度至少为所需Token总数(提示词输入 + 生成输出)一半的模型。例如,如果您的提示词总共需要 10,000 个Token,则将考虑上下文长度至少为 5,000 的模型。如果没有模型符合此条件,OpenRouter 将回退到使用上下文长度最长的模型。
然后,压缩将尝试通过从提示词中间移除或截断内容,将您的内容放入所选模型的上下文窗口。如果禁用了 middle-out
压缩,并且您的总Token数超过了模型的上下文长度,则请求会失败并显示一条错误消息,建议您缩短长度或启用 middle-out
压缩。
信息
所有 OpenRouter 端点 的上下文长度不超过 8k(8,192 个Token)时,将默认使用middle-out
。如需禁用此功能,请在请求正文中设置 transforms: []
。
提示词的中间部分被压缩,因为 LLM 较少关注 序列的中间部分。