跳转到主要内容

先选择状态归属

缓存只复用输入计算,不增加模型上下文窗口;Responses 状态 ID 也不能绕过模型容量限制。为输出及模型所需推理预留空间,工具定义、媒体和协议开销同样需要计入。字符数、UTF-8 字节数和消息条数都不等于 token 数。本项目的计数接口边界见覆盖范围,不要假设存在可用的通用 token 计数 API。

自动截断和上下文编辑的边界

原生 Responses DTO 接收 truncation 与 context_management;上游是否支持以及具体语义由模型和渠道决定。当前 Responses → Chat 转换会拒绝 context_management、previous_response_id 等状态字段,且没有复制 truncation 的映射,不能依赖转换后自动裁剪。 Claude 的 context_management 是协议专用对象;Claude → Responses 转换不会照搬它。OpenRouter 的 transforms: ["middle-out"] 也不是本站已验证的通用接口能力。需要压缩时先使用已有的显式压缩示例,不要把不同协议的同名字段当作等价实现。

可运行:完整文本轮次的本地窗口

本例适合没有工具、媒体、推理状态的纯文本 Chat 历史。它保留 system 与最新 question,按轮数和序列化消息的 UTF-8 字节上限,移除最旧的完整 user / assistant 对。它不估算 token,不承诺一定适配模型窗口,不调用摘要模型。 创建 history.json:
沿用 REST 运行时,保存 examples/context-window.mjs 与 http-client.mjs:
输入文件最多 128 KiB;KEEP_TURNS 范围 0–20,MAX_BYTES 范围 128–65536。这些是示例的本地上限,不是服务端或模型限制。未知输入字段、非完整文本轮次、无效 UTF-8 / JSON 会在请求前失败;必需的 system 与最新问题超出预算时也直接失败,不截断字符串。 成功输出包含答案、保留 / 省略轮数及发送消息字节数。原始文件始终保留,失败不自动重试;省略历史会改变语义,应先把不能丢失的业务约束保存在受信任的长期状态中,而不是依赖旧对话仍在窗口内。

工具、摘要与推理状态

工具调用与其结果必须成组保留,不得只删除其中一条。推理密文、原生签名与压缩项是协议状态,不能用本文的文本裁剪脚本处理。通过推理模型示例验证原样回放,或使用压缩示例保留完整返回窗口。 如果应用自行生成摘要,保留事实、用户约束、未完成任务和引用来源,并让业务确认允许丢失的细节;摘要不是无损压缩。不要把用户内容或工具输出自动提升成 system 指令。压缩失败应保留原始历史,确认后再更新会话状态;超限错误也不应触发不受控的重复生成。 依据:30a6d88a4 的 Responses / Claude DTO、relaykit/relayconvert/internal/oai_responses/to_oai_chat_req.go 与 relaykit/relayconvert/internal/claude_messages/to_oai_responses_req.go。参考 OpenRouter 消息变换专题和 OpenAI 会话状态说明。 多轮对话 · 缓存 · Responses API Read in English