omp-cache-optimizer 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/index.ts +6374 -0
- package/package.json +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 freescheme
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
# OMP Cache Optimizer
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/omp-cache-optimizer)
|
|
4
|
+
[](https://www.npmjs.com/package/omp-cache-optimizer)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
|
|
7
|
+
> 本项目是基于 [pi-cache-optimizer](https://github.com/jiangge/pi-cache-optimizer) 的二次开发(fork),适配 OMP(Oh My Pi)运行时。原项目由 [freescheme](https://github.com/jiangge) 开发,在此致谢。
|
|
8
|
+
|
|
9
|
+
用于提升 OMP 中 provider 侧 KV Cache / Prompt Cache 命中率的扩展:把稳定 prompt 内容前置,给 OpenAI-compatible 请求补保守的 `prompt_cache_key`,提示代理渠道常见缓存路由兼容问题,并在底部显示只读缓存统计。
|
|
10
|
+
|
|
11
|
+
> 本包从 `pi-cache-optimizer` fork 而来。已有底部统计会自动从 `~/.pi/agent/` 迁移到 `~/.omp/agent/`。正常运行时扩展不会触碰你的 `~/.omp/agent/models.yml`;`/cache-optimizer fix` 当前显示可复制的 YAML compat 片段供手动编辑(自动写入的外科 YAML 编辑器计划在后续版本实现)。
|
|
12
|
+
|
|
13
|
+
## 与原项目的关键差异
|
|
14
|
+
|
|
15
|
+
本 fork 针对 OMP 运行时做了以下适配:
|
|
16
|
+
|
|
17
|
+
- **状态目录**:`~/.pi/agent/` → `~/.omp/agent/`
|
|
18
|
+
- **模型配置**:`models.json` (JSONC) → `models.yml` (YAML)
|
|
19
|
+
- **包作用域**:`@earendil-works/pi-coding-agent` → `@oh-my-pi/pi-coding-agent`
|
|
20
|
+
- **扩展清单**:`package.json` 的 `pi.extensions` → `omp.extensions`(`pi.extensions` 仍兼容)
|
|
21
|
+
- **prompt 重写位置**:从 `before_agent_start`(直接改 systemPrompt)迁移到 `before_provider_request`(在 provider payload 层面修改),因为 OMP 的 `before_agent_start` 只支持注入消息,不支持修改 system prompt
|
|
22
|
+
- **compat 字段重映射**:
|
|
23
|
+
- `forceAdaptiveThinking` → 移除(OMP 内置 catalog 自动设置)
|
|
24
|
+
- `sendSessionAffinityHeaders` / `sendSessionIdHeader` → 移除(OMP 用多凭据 auth + `agent.db` 实现会话亲和性)
|
|
25
|
+
- `supportsLongCacheRetention` → `supportsLongPromptCacheRetention`
|
|
26
|
+
- `requiresReasoningContentOnAssistantMessages` → `requiresReasoningContentForToolCalls`
|
|
27
|
+
- `thinkingFormat: "deepseek"` → 不再标记(OMP 自动检测 DeepSeek reasoning 格式)
|
|
28
|
+
- **事件适配**:`model_select` → `turn_start` + 模型变更检测(OMP 可能不支持 `model_select` 事件)
|
|
29
|
+
- **协议符号**:`Symbol.for("pi.routing.registry.v1")` → `Symbol.for("omp.routing.registry.v1")`,`Symbol.for("pi.cache.hints.v1")` → `Symbol.for("omp.cache.hints.v1")`
|
|
30
|
+
- **`/cache-optimizer fix` 当前状态**:降级为手动建议模式(显示可复制的 YAML compat 片段),自动写入的 YAML 外科编辑器待后续 PR 实现
|
|
31
|
+
|
|
32
|
+
## 目录
|
|
33
|
+
|
|
34
|
+
- [功能](#功能)
|
|
35
|
+
- [安装](#安装)
|
|
36
|
+
- [命令](#命令)
|
|
37
|
+
- [持久 Opt-out](#持久-opt-out)
|
|
38
|
+
- [OpenAI-compatible 代理配置](#openai-compatible-代理配置)
|
|
39
|
+
- [Anthropic adaptive thinking 模型](#anthropic-adaptive-thinking-模型)
|
|
40
|
+
- [使用 `/cache-optimizer fix` 手动修复](#使用-cache-optimizer-fix-手动修复)
|
|
41
|
+
- [Footer 统计](#footer-统计)
|
|
42
|
+
- [Router / Virtual-channel 扩展作者指南](#router--virtual-channel-扩展作者指南)
|
|
43
|
+
- [卸载](#卸载)
|
|
44
|
+
- [验证效果](#验证效果)
|
|
45
|
+
- [License](#license)
|
|
46
|
+
|
|
47
|
+
## 功能
|
|
48
|
+
|
|
49
|
+
- 将稳定的 system prompt 内容移动到动态上下文之前(在 `before_provider_request` 中对 provider payload 应用)。
|
|
50
|
+
- 压缩 OMP skill 列表,并移除 session-overview 中的易变字段。
|
|
51
|
+
- 通过 `PI_CACHE_RETENTION=long` 请求长缓存保留(OMP 沿用同一环境变量)。
|
|
52
|
+
- 对 `openai-completions` / `openai-responses` 请求,在没有有效 key 时使用 OMP session id 补 `prompt_cache_key`。
|
|
53
|
+
- 对缺少长缓存保留 compat 的第三方 OpenAI-compatible 代理给出一次性提醒。
|
|
54
|
+
- 检测 Anthropic adaptive thinking 模型(opus-4.6+、sonnet-4.6+、fable-5+)—— OMP 内置 catalog 已自动处理,此处仅作信息性提示。
|
|
55
|
+
- 为支持的模型家族显示按 session 隔离的底部缓存统计。
|
|
56
|
+
- 通过版本化全局协议(`Symbol.for("omp.routing.registry.v1")` 与 `Symbol.for("omp.cache.hints.v1")`)支持可选的 router extension 集成,而不导入任何 router 包。
|
|
57
|
+
|
|
58
|
+
缓存是 provider 侧的 best-effort 行为。第三方代理和 router extension 仍可能隐藏缓存 usage、拒绝不支持的参数,或把请求路由到多个上游。
|
|
59
|
+
|
|
60
|
+
## 安装
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
omp install npm:omp-cache-optimizer
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
如果之前安装过 Pi 版本:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
omp remove npm:pi-cache-optimizer && omp install npm:omp-cache-optimizer
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
安装、更新或移除后,在 OMP 中运行 `/reload`,让 extension hooks 刷新。
|
|
73
|
+
|
|
74
|
+
OMP 0.79.7 及之后,`omp update` 默认只更新 OMP 本体。若要更新已安装的 OMP package(包括本扩展),请运行 `omp update --extensions`(只更新 packages)或 `omp update --all`(OMP 与 packages 一起更新)。
|
|
75
|
+
|
|
76
|
+
## 命令
|
|
77
|
+
|
|
78
|
+
| 命令 | 作用 |
|
|
79
|
+
|---|---|
|
|
80
|
+
| `/cache-optimizer` | UI 支持时打开交互菜单;否则打印帮助和当前状态。 |
|
|
81
|
+
| `/cache-optimizer enable` | 在当前 OMP 进程中开启运行时优化,清零当前 session 统计,并开始新的"开启状态"测量。 |
|
|
82
|
+
| `/cache-optimizer disable` | 在当前 OMP 进程中关闭优化,清零当前 session 统计,并继续以 disabled 对比模式采集 footer 统计。运行 `/reload` 或重启 OMP 后回到启动时行为。 |
|
|
83
|
+
| `/cache-optimizer doctor` | 显示当前模型 / provider / API / base URL / compat 与低命中诊断。 |
|
|
84
|
+
| `/cache-optimizer compat` | 对当前模型显示可复制的 compat 建议(如适用)。 |
|
|
85
|
+
| `/cache-optimizer stats` | 显示当前模型今天的 session-scoped 统计和近期趋势。 |
|
|
86
|
+
| `/cache-optimizer reset` | 只重置当前 session + 当前模型的本地统计;不会修改上游 provider 缓存。 |
|
|
87
|
+
| `/cache-optimizer fix` | **当前为手动建议模式**:显示可复制的 YAML compat 片段 + 手动编辑步骤。自动写入的 YAML 外科编辑器待后续实现。 |
|
|
88
|
+
|
|
89
|
+
`enable` / `disable` 是当前进程内开关。若要持久关闭某些能力,请使用下面的环境变量。
|
|
90
|
+
|
|
91
|
+
## 持久 Opt-out
|
|
92
|
+
|
|
93
|
+
| 环境变量 | 作用 |
|
|
94
|
+
|---|---|
|
|
95
|
+
| `PI_CACHE_OPTIMIZER_NO_PROMPT_REWRITE=1` | 只关闭 prompt 改写;footer 统计和 cache-key fallback 仍启用。 |
|
|
96
|
+
| `PI_CACHE_OPTIMIZER_NO_SKILL_COMPRESSION=1` | 保留 OMP 原始 verbose skill XML。 |
|
|
97
|
+
| `PI_CACHE_OPTIMIZER_NO_OPENAI_CACHE_KEY=1` | 关闭 OpenAI-compatible `prompt_cache_key` fallback。推荐使用这个显式 opt-out。 |
|
|
98
|
+
|
|
99
|
+
> OMP 会自动将 `OMP_CACHE_OPTIMIZER_*` 镜像为 `PI_CACHE_OPTIMIZER_*`,因此两个前缀都可使用。
|
|
100
|
+
|
|
101
|
+
## OpenAI-compatible 代理配置
|
|
102
|
+
|
|
103
|
+
LiteLLM / OneAPI / NewAPI / 类 OpenRouter 渠道等第三方 `openai-completions` 代理,常会把同一个 session 分散到多个上游后端,导致 provider 侧 prompt cache 被拆散。
|
|
104
|
+
|
|
105
|
+
**OMP 差异**:OMP 不再使用 `sendSessionAffinityHeaders` compat 字段(Pi 时代的字段),而是通过多凭据 auth + `agent.db` 中的会话亲和性实现上游粘性。长缓存保留改用 `supportsLongPromptCacheRetention` 字段。
|
|
106
|
+
|
|
107
|
+
`models.yml` 示例:
|
|
108
|
+
|
|
109
|
+
```yaml
|
|
110
|
+
providers:
|
|
111
|
+
your-provider-id:
|
|
112
|
+
api: openai-completions
|
|
113
|
+
baseUrl: https://example.com/v1
|
|
114
|
+
apiKey: YOUR_API_KEY
|
|
115
|
+
compat:
|
|
116
|
+
supportsLongPromptCacheRetention: true
|
|
117
|
+
models:
|
|
118
|
+
- id: gpt-5.5
|
|
119
|
+
name: GPT-5.5
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
说明:
|
|
123
|
+
|
|
124
|
+
- `supportsLongPromptCacheRetention: true` 是可选项。只有 endpoint 明确支持 OpenAI long prompt cache retention 时才添加。
|
|
125
|
+
- 如果出现 `400 Unsupported parameter: prompt_cache_retention`,请为该渠道移除 / 避免 `supportsLongPromptCacheRetention`。
|
|
126
|
+
- 使用 `/cache-optimizer compat` 或 `/cache-optimizer doctor` 查看当前模型的具体建议。
|
|
127
|
+
- 对 DeepSeek 模型,OMP 自动检测 reasoning 格式,无需手动设置 `thinkingFormat`。
|
|
128
|
+
- 本扩展的 `doctor` 和 `compat` 命令只给建议,不会修改 `models.yml`。
|
|
129
|
+
|
|
130
|
+
## Anthropic adaptive thinking 模型
|
|
131
|
+
|
|
132
|
+
**OMP 差异**:OMP 的内置 model catalog 已为官方 Claude 模型自动设置 adaptive thinking(通过 `disableAdaptiveThinking` 字段,语义与 Pi 的 `forceAdaptiveThinking` 相反),且不可从 `models.yml` 用户配置。因此本扩展对 adaptive thinking 的检测改为信息性提示,不再提供自动修复。
|
|
133
|
+
|
|
134
|
+
`/cache-optimizer doctor` 和 `/cache-optimizer compat` 会检测 adaptive thinking 模型并显示信息性说明。自定义渠道 fronting Anthropic 时,请确保模型 id 匹配官方发布版本,以便 OMP catalog 正确识别。
|
|
135
|
+
|
|
136
|
+
## 使用 `/cache-optimizer fix` 手动修复
|
|
137
|
+
|
|
138
|
+
**OMP 差异**:当前 `/cache-optimizer fix` 降级为手动建议模式。原 Pi 版本的自动写入安全协议(backup → 预览 + 确认 → 原子 temp+rename → 写入后自检 → 失败回滚)将在后续 PR 中为 YAML 重新实现。
|
|
139
|
+
|
|
140
|
+
当前行为:
|
|
141
|
+
|
|
142
|
+
1. 检测当前 active model 的 compat 缺失项
|
|
143
|
+
2. 显示可复制的 YAML compat 片段
|
|
144
|
+
3. 显示手动编辑步骤(文件路径、provider/model 位置、需添加的键值对)
|
|
145
|
+
4. 提示编辑后运行 `/reload`
|
|
146
|
+
|
|
147
|
+
可修复的 compat 问题:
|
|
148
|
+
|
|
149
|
+
- DeepSeek reasoning compat(`requiresReasoningContentForToolCalls: true` + `supportsLongPromptCacheRetention: true`)
|
|
150
|
+
- OpenAI-compatible proxy 长缓存保留(`supportsLongPromptCacheRetention: true`)
|
|
151
|
+
|
|
152
|
+
**范围:** 仅当前 active model。其他渠道需切换模型后再次运行 `fix`。
|
|
153
|
+
|
|
154
|
+
**运行:** 当 active model 检测到 compat 问题时执行 `/cache-optimizer fix`。compat 已完整时,命令显示"无需修复"。
|
|
155
|
+
|
|
156
|
+
### 没有 `models.yml` provider entry 的渠道
|
|
157
|
+
|
|
158
|
+
有些 OMP 渠道可用时,`~/.omp/agent/models.yml` 里可能还没有对应 provider block。保留现有认证方式,不要复制 credential、token 或 API key。只在 `models.yml` 里添加缓存兼容覆盖。
|
|
159
|
+
|
|
160
|
+
Provider 级最小 override:
|
|
161
|
+
|
|
162
|
+
```yaml
|
|
163
|
+
providers:
|
|
164
|
+
your-provider-id:
|
|
165
|
+
compat:
|
|
166
|
+
supportsLongPromptCacheRetention: true
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
如果只想影响单个模型,用 `modelOverrides`:
|
|
170
|
+
|
|
171
|
+
```yaml
|
|
172
|
+
providers:
|
|
173
|
+
your-provider-id:
|
|
174
|
+
modelOverrides:
|
|
175
|
+
gpt-5.5:
|
|
176
|
+
compat:
|
|
177
|
+
supportsLongPromptCacheRetention: true
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Footer 统计
|
|
181
|
+
|
|
182
|
+
统计是只读本地计数,保存在 `~/.omp/agent/omp-cache-optimizer-stats.json`,按 OMP session + provider/model 隔离。文件只包含日期和数字计数,不包含 API key、prompt、payload、headers、响应或模型输出。
|
|
183
|
+
|
|
184
|
+
OMP 0.79+ 已内置 footer `CH` 标记,用于显示最近一次 prompt cache hit rate。本扩展在此基础上补充持久化的 provider/model/session-scoped 计数,以及代理 compat 诊断。
|
|
185
|
+
|
|
186
|
+
示例 footer:
|
|
187
|
+
|
|
188
|
+
```text
|
|
189
|
+
OpenAI cache 3/10 · 0.002M/0.005M tok (40%) ⚠️ compat
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
格式:`<label> <命中请求数>/<总请求数> · <cached input tokens>/<total input tokens> tok (<token 命中率>)`。部分 adapter 还可能追加 `· write <tokens> tok`,运行时诊断可能追加 `⚠️ compat` 或 `⚠️ integrity`。
|
|
193
|
+
|
|
194
|
+
支持的 footer label 包括:DS、Claude、OpenAI、Gemini、Kimi、Qwen、GLM、MiniMax、Mimo、Hunyuan、Mistral、Grok、Llama、Nemotron、Cohere、Yi、Doubao、ERNIE、Baichuan、StepFun、Spark、InternLM、Gemma、Phi、Jamba、Solar、Sonar、Nova、Reka、Falcon、DBRX、MPT、StableLM、Aquila、EXAONE、HyperCLOVA、Luminous、Hermes、Granite、Arctic、Pangu、SenseNova、Zhinao、MiniCPM、XVERSE、Orion、OpenChat、Vicuna、Wizard、Zephyr、Dolphin、OpenOrca、Starling、BLOOM、RWKV、Aya。
|
|
195
|
+
|
|
196
|
+
Adapter 选择只看模型 id/name(以及 message_end 时 assistant message 的 model/name)。仅使用 OpenAI-shaped API 不会被当作 OpenAI-family,除非模型 id/name 匹配受支持的家族。
|
|
197
|
+
|
|
198
|
+
## Router / Virtual-channel 扩展作者指南
|
|
199
|
+
|
|
200
|
+
如果你的 OMP 扩展提供虚拟 routing provider(例如 `router/auto`、`router/smart`,或会转发到真实上游的 profile/channel),本扩展可以为真实上游 provider/model 显示缓存统计,而不是把统计记到虚拟外壳上。集成是可选、版本化的,并且**不需要导入本包**。
|
|
201
|
+
|
|
202
|
+
### 最小集成:最终 assistant message metadata
|
|
203
|
+
|
|
204
|
+
要无缝获得最终缓存统计归因,请在完成的 assistant message 上透传真实上游身份:
|
|
205
|
+
|
|
206
|
+
```ts
|
|
207
|
+
{
|
|
208
|
+
role: "assistant",
|
|
209
|
+
provider: "anthropic", // 真实上游 provider
|
|
210
|
+
responseModel: "claude-opus-4-8", // 或 model: "..."
|
|
211
|
+
api: "anthropic-messages", // 已知时填写上游 OMP API id
|
|
212
|
+
usage: {
|
|
213
|
+
input: 1200, // OMP-normalized 未缓存 input tokens,如可用
|
|
214
|
+
cacheRead: 8000, // 从 provider prompt cache 读取的 tokens
|
|
215
|
+
cacheWrite: 500, // 本次新写入 provider prompt cache 的 tokens
|
|
216
|
+
},
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
`message_end` 会把这些 assistant-message 字段视为权威来源。只要存在 `provider` + `model`/`responseModel` + cache usage,即使 active model 仍是 `router/auto`,统计也会更新真实上游桶。如果上游 usage 没有 cache 字段,请保持缺失或为 0;本扩展不会伪造 cache hit。
|
|
221
|
+
|
|
222
|
+
### 可选:用于预响应 UX 的实时路由注册表
|
|
223
|
+
|
|
224
|
+
最终 message metadata 足以支持响应后的统计。若要支持响应前流程——首次响应前的 footer 显示、`/cache-optimizer doctor`、`/cache-optimizer compat`、`/cache-optimizer reset` 和 OpenAI-compatible `prompt_cache_key` fallback——请在 `Symbol.for("omp.routing.registry.v1")` 下注册 live route adapter。
|
|
225
|
+
|
|
226
|
+
协议形状:
|
|
227
|
+
|
|
228
|
+
```ts
|
|
229
|
+
type OmpRouteSnapshot = {
|
|
230
|
+
virtualProvider: string;
|
|
231
|
+
virtualModelId: string;
|
|
232
|
+
provider: string;
|
|
233
|
+
modelId: string;
|
|
234
|
+
api?: string;
|
|
235
|
+
canonicalModelId?: string;
|
|
236
|
+
routeLabel?: string;
|
|
237
|
+
status?: "planned" | "trying" | "selected" | "success" | "failed";
|
|
238
|
+
sessionIdHash?: string;
|
|
239
|
+
requestId?: string;
|
|
240
|
+
timestamp: number;
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
type OmpRouterAdapterV1 = {
|
|
244
|
+
virtualProvider: string;
|
|
245
|
+
resolveActiveRoute(
|
|
246
|
+
virtualModelId: string,
|
|
247
|
+
hint?: { sessionIdHash?: string; requestId?: string },
|
|
248
|
+
): OmpRouteSnapshot | undefined;
|
|
249
|
+
resolveCandidateRoutes?(virtualModelId: string): OmpRouteSnapshot[];
|
|
250
|
+
subscribe?(listener: (event: OmpRouteSnapshot) => void): () => void;
|
|
251
|
+
};
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
注册模式:
|
|
255
|
+
|
|
256
|
+
```ts
|
|
257
|
+
const ROUTING = Symbol.for("omp.routing.registry.v1");
|
|
258
|
+
const registry = (globalThis as Record<symbol, unknown>)[ROUTING] as
|
|
259
|
+
| { version: 1; registerRouter(adapter: OmpRouterAdapterV1): () => void }
|
|
260
|
+
| undefined;
|
|
261
|
+
|
|
262
|
+
registry?.registerRouter({
|
|
263
|
+
virtualProvider: "router",
|
|
264
|
+
resolveActiveRoute(virtualModelId, hint) {
|
|
265
|
+
return {
|
|
266
|
+
virtualProvider: "router",
|
|
267
|
+
virtualModelId,
|
|
268
|
+
provider: "anthropic",
|
|
269
|
+
modelId: "claude-opus-4-8",
|
|
270
|
+
api: "anthropic-messages",
|
|
271
|
+
timestamp: Date.now(),
|
|
272
|
+
};
|
|
273
|
+
},
|
|
274
|
+
});
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
cache hints 协议(`Symbol.for("omp.cache.hints.v1")`)形状与 Pi 版本一致,用于预响应阶段透传优化后的 system prompt / prompt cache key / cache retention hint。
|
|
278
|
+
|
|
279
|
+
## 卸载
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
omp remove npm:omp-cache-optimizer
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
卸载后运行 `/reload`。本地统计文件 `~/.omp/agent/omp-cache-optimizer-stats.json` 不会自动删除,可手动清理。
|
|
286
|
+
|
|
287
|
+
## 验证效果
|
|
288
|
+
|
|
289
|
+
1. 安装后运行 `/cache-optimizer doctor`,确认当前模型 / provider / API / compat 状态
|
|
290
|
+
2. 正常使用 OMP 几轮对话后,运行 `/cache-optimizer stats` 查看 session-scoped 命中率
|
|
291
|
+
3. 底部 footer 会显示实时 cache 统计(如 `OpenAI cache 3/10 · 0.002M/0.005M tok (40%)`)
|
|
292
|
+
4. 如命中率低,`/cache-optimizer doctor` 会给出低命中诊断和 compat 建议
|
|
293
|
+
|
|
294
|
+
## 致谢
|
|
295
|
+
|
|
296
|
+
本项目基于 [pi-cache-optimizer](https://github.com/jiangge/pi-cache-optimizer) 二次开发,感谢原作者 [freescheme](https://github.com/jiangge) 的工作。
|
|
297
|
+
|
|
298
|
+
## License
|
|
299
|
+
|
|
300
|
+
[MIT](./LICENSE)
|