这份文档是自包含的。接收方看不到代码仓库、聊天记录和作品正文。请只根据本文做事。

请你做两件事，都要写成我们可以逐条核对的文字：

1. 列出业界在「长上下文 Agent、提示缓存、工具循环」上的常见优化方案。每条写清：做法、它节省的是请求次数、未缓存输入、缓存折扣价还是输出，以及它依赖什么前提（例如上游必须支持前缀缓存、模型必须能一次返回多个工具）。
2. 针对下面描述的这个程序，给出你建议采用的组合方案。说明每一步落在哪一次模型请求、上下文里留哪些块、块的顺序、相位机的哪一段执行。不要假装读过仓库。标出你不确定、需要我们核对的点。

我们会用仓库和现有规则检查你的方案。与本文第三节冲突的做法请单独标出，不要藏进推荐里。


一、这是什么程序

这是一个写作代理，分两段使用。

创作期：用户用自然语言描述想要的作品，不手动点选节点。模型决定这一轮要落实哪些「能力」，把结果写成黑板上的产物。产物是规格（舞台、规则、变量、正文如何呈现、开场），不是游玩回合的正文。聊天只做确认和追问。清空对话后产物还在，产物才是创作期的持久记忆。

游玩期：另一套 Worker 按已经写好的规格往下演。一次用户输入通常对应一次生成，不是创作那种多步工具循环。

主要渠道是 OpenRouter 上的 Gemini 与 OpenAI 兼容模型。也有直连的单一上游做对照。费用近似为：

请求次数 ×（未缓存输入 × 全价 + 缓存输入 × 折扣价 + 输出 × 输出价）

缓存命中不是免费的，只是更便宜。输出大约是 prompt 的 3% 到 9%，单价更高，但当前主账仍是输入。最近约三天（2026-09-28 10:35 到 2026-10-01 10:35，东八区）创作落盘 416 次请求、prompt 1199 万 token，游玩 29 次、prompt 80 万。创作大约是游玩的 14 倍。优化主战场是创作。


二、会有哪些上下文

下面这些块都会进模型，但不是每一次请求全有。

创作落盘，一句用户话开始时拼一次，工具循环中途只在末尾追加：

- 系统提示：身份、写入规则、推进原则。尚无本局方案时附整份能力短目录（何时用、何时不用、档位）。已有方案时改为方案进度：每个能力一行，已落或未落、档位、理由、缺口。不含产物正文。样本里系统提示 6695 字，其中方案进度 4392 字。
- 一条用户消息：全部已有产物，按相对顺序，然后全量对话。样本 25 份产物共 60518 字（约 69%），全量对话 19975 字（约 23%）。没有一份产物独大，最大的正文组成 8879 字，其次变量规则 6005、实现机制 4569，其余多为两三千字。会话中段产物已经约 5.6 万字。
- 工具定义：每次都带，约 4917 字，一轮内不变。工具有读取能力、读取库条目、准备开场、写入产物、删除、声明变量、声明映射、清空对话。
- 预设：包在系统侧的文风或格式片段。当前选用预设启用正文约 362 字，可忽略。换长预设时它变成稳定前缀，应放在易变内容之前。
- 工具结果：循环后半才出现。读取能力的返回体是该能力的任务、原则、产物规格、评分和库目录，一份约 5000 字。库条目正文同理，目录里只有摘要。这些全文一开始不在上下文里。

游玩一次生成：

- 预设与该 Worker 的系统说明（相对稳定）。
- 槽位人设。
- 静态规格投影（舞台、规则、叙事、正文组成等，开局后很少改）。
- 对话历史（每轮变长，按投影裁剪）。
- 变量当前值与本轮用户输入（每轮都变）。

总管工具循环（决定何时调用哪个 Worker）另有一套 message 历史。最近三天的账几乎不在这条上，优化时不要把它和创作落盘混成同一次请求。

能力的完整写法存放在各自的提示文件里，不在系统目录里。不把所有能力的完整提示放进第一次请求。完整写法只在已经确定本轮要写哪几项之后进入上下文。


三、相位机之内，程序可以动哪里

运行分两层。

业务阶段：创作（设计规格）然后游玩。这是作品生命周期，不是每一次模型调用。

运行相位：idle、running、waiting_user、done、error。相位机是纯函数：给定会话和事件，决定谁在场、哪些工具可用、何时必须等用户、产物何时算数。它不决定「下一步叫哪个能力」。下一步由 running 里的模型工具循环决定。

一句用户话是硬事件：相位进入 running，这一轮的模型调用次数从零计。创作落盘在这次 running 里跑工具循环，上限大约三十多步。循环开始时拼好开头，之后只追加助手工具调用和工具结果。模型不再欠请求、或写出给用户的回复之后，相位回到 waiting_user，等待下一句。

因此：

- 减少「读一份、写一份、再读下一份」必须发生在同一次 running 里，也就是两次用户话之间。
- 不能把相位机改成按固定工序自动跑完全部节点。用户不手选节点，方案也不是执行顺序。
- Worker 执行时总管暂停。游玩的那一次生成是 Worker 自己的请求，上下文按该 Worker 的投影拼，不复用创作工具循环的消息历史。
- 程序可以在两次模型请求之间插入确定性步骤：注入选中能力的当前提示、核对版本哈希、逐条校验、只重试失败的那一条。这些不是相位变化。


四、缓存优化

目标是稳定前缀留在同一上游的提示缓存里。不追求两次请求的整包字节相同。Agent 每一轮消息都会变。

已经接上：OpenRouter 请求体带本局 session_id（最长 256 字）。直连其它渠道不带，避免未知字段被拒绝。有 session_id 后，粘滞从该会话第一次成功请求就开始，不必先看到缓存命中，也不再因为第一条用户消息被重写就换上游。不要发送 provider.order，它会关掉粘滞。

接上之前的测量（不要把「再做一遍粘滞」当成主体）：

- 创作工具循环间隔约 7 到 15 秒。Gemini 上同一次循环内缓存从约 3800 token 按大约 4000 一块爬到 7600、11500、15000，整段 prompt 约 50% 到 68% 命中。每个 burst 的第一下经常是 0。中途偶尔整段掉回 0，是换了上游。
- 游玩在 OpenRouter 上 28 次、prompt 1.8 万到 3.4 万，间隔约 5 到 22 分钟，缓存为 0。直连单一上游时，间隔 8 到 30 分钟仍常见命中 80% 到 91%。有一轮从约 1.1 万掉到 6656 并停住，说明前缀中段改过，只保住开头。
- Gemini 隐式缓存大约 4000 token 一块记账。前缀差几百 token，账单上可以差一整块。

session_id 只保证落到同一上游。命中到第几个 token，取决于前缀从哪一字开始和上一次不同。


五、上下文编排顺序

原则：越少改的越靠前，每轮都变的放在最后。一处改动只作废它后面的缓存。

游玩已按此排列：人设与静态规格、对话历史、变量与本轮输入。排序本身在直连上游上有效；OpenRouter 上曾经是 0，是因为当时没有粘住上游，不是因为顺序反了。

创作当前顺序是：系统提示（含会随落盘改写的方案进度）、然后一条用户消息里先全部产物再全量对话、工具定义在消息之外、工具结果接在末尾。产物任何一份被覆盖，如果它不在整包的末尾，它后面的产物和对话都会离开缓存。工具定义一轮内稳定，适合留在前缀可缓存的区域。方案进度放在系统提示里，方案一改，系统提示之后全部重计。

选择与填写若拆成两次请求，稳定的能力目录应在选择请求的前部，方案进度、上一问和本轮用户输入在末尾。填写请求里，少改的产物在前，本轮新注入的节点提示和最近对话在后。节点提示每轮都会换，不能放在全部产物之前，否则一换节点，后面整包产物都按未缓存计。


六、上下文发送哪些

用同一本书量过，不发请求。当前一次创作请求的 messages 约 88218 字，末次实际 prompt 约 46897 token（大约 2 字 1 token）。

- 选择若只带方案进度加用户最后一句：约 4522 字。再加助手上一问仍然很小。产物正文不要放进选择。只看用户这句原文不够，否则回答「第二个」或修改已有地图时会对错节点，已写过的能力会被再选。
- 填写若仍带全部产物，对话只留最近约两轮（样本 1770 字）：约 6.2 万字。砍掉全量对话大约只省两成。
- 再注入一份节点提示约 5000 字。一次注入两三份，是在产物之上加一两成，而且只发送一次。

所以「少发对话」省得有限。「少发哪些产物」才碰到大头，但填写时不带相关产物就会和已有设定冲突。哪些产物是这份能力的材料、哪些只是其它规格，本文没有一份可执行的白名单。常见的相关性裁剪、摘要、检索如果要用，必须说明误裁后怎样发现。

模型在看见该能力当前版本的任务、原则、规格、评分之前，写出来的正文不算数。程序用这些段落的哈希做版本。同一轮生成里先调用读取、同时把正文交上去，不算看见过写法。不要求先读的只有 narrative、variable-context、context-order、worker-spec、refine 和标记为自动的程序步骤。库条目正文同样要先看见再写进产物，默认 1 到 2 条。


七、程序上的优化，仍在同一次 running 里

现在的倍数来自工具循环，不是来自相位来回切换。

同一项内容能力至少两次模型请求：第一次凭短说明选定并读取，第二次看见写法之后写入。提示要求一轮通常写这句已经说清的 2 到 3 个能力。模型常一次只返回一个工具，于是变成读甲、写甲、读乙、写乙，最后再单独回用户一句。驱动程序其实会在同一步执行该次响应里的全部工具，日志里偶发一次写两份。

讨论过、尚未定案的程序形状，供你对照业界做法，不是已经同意的设计：

- 同一次 running 里两次模型请求。第一次只输出能力 id 和库条目 id。程序注入对应提示并记下版本。第二次一次交回多份产物和一段给用户的回复。某一条校验失败只重写那一条。
- 若模型一次只能调用一个工具，用一次结构化输出携带多条产物，程序在本地切开。这只去掉写入侧的重复前缀。规格说明仍须在这次生成之前就在上下文里。
- 写开场前有一次程序准备：编译信息可见范围、游玩执行方式、上下文排序和运行配置。这一步不应再变成一次让模型自由发挥的长上下文请求。

必须仍然成立的行为：用户不手选节点；方案不是执行顺序；没说清的「必须」和「有必要」本轮不写，先问 2 到 3 个选项；同轮多份产物只给一次综合回复，不把完整 JSON 贴进回复；变量和映射不走普通写入。


八、请你列出的常见方案，以及针对我们的组合

常见方案请覆盖至少这四类，每类不要只写一句口号。我们没给仓库，所以请把业界做法写全，包括你最后不推荐的。我们会删掉不适合的。

1. 缓存：粘滞路由、前缀稳定性、缓存块粒度、显式缓存断点、把变化赶出前缀。session_id 已经有了，请写它解决不了的部分。
2. 编排顺序：稳定段、历史、本轮输入的常见排序，以及中段一改、后段全失效时业界怎么处理。
3. 发送哪些：全文产物、摘要、按能力取材料、检索、滑动窗口、把目录和正文拆开。请写误删材料的后果。
4. 程序：一次多工具、结构化输出一次交多份、选择与填写拆请求、把规格预注入从而取消读取轮、限制工具循环次数。请写哪种依赖模型能力，哪种只依赖程序。

然后给出你建议我们采用的组合：一句用户话几次请求、每次上下文块的顺序、预计相对现在少发送几次大前缀、产物那约 6 万字还在不在填写请求里。故意不做的项写原因。和第三节、第六节冲突的地方单独列出，不要写进推荐步骤。
