toonify-mcp 0.2.2 → 0.3.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.
Files changed (51) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.es.md +270 -0
  3. package/README.id.md +270 -0
  4. package/README.ja.md +270 -0
  5. package/README.md +21 -10
  6. package/README.vi.md +270 -0
  7. package/README.zh-CN.md +270 -0
  8. package/README.zh-TW.md +27 -16
  9. package/dist/metrics/metrics-collector.d.ts +2 -0
  10. package/dist/metrics/metrics-collector.d.ts.map +1 -1
  11. package/dist/metrics/metrics-collector.js +43 -8
  12. package/dist/metrics/metrics-collector.js.map +1 -1
  13. package/dist/optimizer/caching/cache-optimizer.d.ts +53 -0
  14. package/dist/optimizer/caching/cache-optimizer.d.ts.map +1 -0
  15. package/dist/optimizer/caching/cache-optimizer.js +176 -0
  16. package/dist/optimizer/caching/cache-optimizer.js.map +1 -0
  17. package/dist/optimizer/caching/cache-strategies.d.ts +19 -0
  18. package/dist/optimizer/caching/cache-strategies.d.ts.map +1 -0
  19. package/dist/optimizer/caching/cache-strategies.js +62 -0
  20. package/dist/optimizer/caching/cache-strategies.js.map +1 -0
  21. package/dist/optimizer/caching/cache-types.d.ts +36 -0
  22. package/dist/optimizer/caching/cache-types.d.ts.map +1 -0
  23. package/dist/optimizer/caching/cache-types.js +5 -0
  24. package/dist/optimizer/caching/cache-types.js.map +1 -0
  25. package/dist/optimizer/caching/index.d.ts +7 -0
  26. package/dist/optimizer/caching/index.d.ts.map +1 -0
  27. package/dist/optimizer/caching/index.js +7 -0
  28. package/dist/optimizer/caching/index.js.map +1 -0
  29. package/dist/optimizer/multilingual/index.d.ts +7 -0
  30. package/dist/optimizer/multilingual/index.d.ts.map +1 -0
  31. package/dist/optimizer/multilingual/index.js +7 -0
  32. package/dist/optimizer/multilingual/index.js.map +1 -0
  33. package/dist/optimizer/multilingual/language-detector.d.ts +43 -0
  34. package/dist/optimizer/multilingual/language-detector.d.ts.map +1 -0
  35. package/dist/optimizer/multilingual/language-detector.js +161 -0
  36. package/dist/optimizer/multilingual/language-detector.js.map +1 -0
  37. package/dist/optimizer/multilingual/language-profiles.d.ts +34 -0
  38. package/dist/optimizer/multilingual/language-profiles.d.ts.map +1 -0
  39. package/dist/optimizer/multilingual/language-profiles.js +196 -0
  40. package/dist/optimizer/multilingual/language-profiles.js.map +1 -0
  41. package/dist/optimizer/multilingual/tokenizer-adapter.d.ts +47 -0
  42. package/dist/optimizer/multilingual/tokenizer-adapter.d.ts.map +1 -0
  43. package/dist/optimizer/multilingual/tokenizer-adapter.js +96 -0
  44. package/dist/optimizer/multilingual/tokenizer-adapter.js.map +1 -0
  45. package/dist/optimizer/token-optimizer.d.ts +11 -1
  46. package/dist/optimizer/token-optimizer.d.ts.map +1 -1
  47. package/dist/optimizer/token-optimizer.js +49 -8
  48. package/dist/optimizer/token-optimizer.js.map +1 -1
  49. package/dist/optimizer/types.d.ts +15 -0
  50. package/dist/optimizer/types.d.ts.map +1 -1
  51. package/package.json +2 -2
@@ -0,0 +1,270 @@
1
+ # 🎯 Toonify MCP
2
+
3
+ **[English](README.md) | [繁體中文](README.zh-TW.md) | [简体中文](README.zh-CN.md) | [日本語](README.ja.md) | [Español](README.es.md) | [Tiếng Việt](README.vi.md) | [Bahasa Indonesia](README.id.md)**
4
+
5
+ MCP 服务器 + Claude Code 插件,提供结构化数据的自动 token 优化。
6
+ 通过透明的 TOON 格式转换,**根据数据结构减少 30-65% 的 Claude API token 使用量**,结构化数据的典型节省率为 **50-55%**。
7
+
8
+ ## v0.3.0 新功能
9
+
10
+ ✨ **多语言 Token 优化!**
11
+ - ✅ 精确计算 15+ 种语言的 token(中文、日文、韩文、西班牙文、阿拉伯文等)
12
+ - ✅ 语言感知的 token 倍数(中文 2 倍、日文 2.5 倍、阿拉伯文 3 倍)
13
+ - ✅ 支持混合语言文本的自动检测
14
+ - ✅ 基于真实基准测试改进优化准确性
15
+ - ✅ 数据支持的 token 节省声明(30-65% 范围,通常 50-55%)
16
+
17
+ ## 功能特色
18
+
19
+ - **30-65% Token 减少**(通常 50-55%)适用于 JSON、CSV、YAML 数据
20
+ - **多语言支持** - 精确计算 15+ 种语言的 token
21
+ - **完全自动** - PostToolUse hook 拦截工具结果
22
+ - **零配置** - 开箱即用,采用合理预设值
23
+ - **双模式** - 作为插件(自动)或 MCP 服务器(手动)
24
+ - **内建指标** - 在本地追踪 token 节省
25
+ - **静默回退** - 永不中断您的工作流程
26
+
27
+ ## 安装
28
+
29
+ ### 选项 A:Claude Code 插件(推荐)⭐
30
+
31
+ **零手动调用的自动 token 优化:**
32
+
33
+ ```bash
34
+ # 1. 全局安装
35
+ npm install -g toonify-mcp
36
+
37
+ # 2. 添加为插件(自动模式)
38
+ claude plugin add toonify-mcp
39
+
40
+ # 3. 验证安装
41
+ claude plugin list
42
+ # 应显示:toonify-mcp ✓
43
+ ```
44
+
45
+ **完成!** PostToolUse hook 现在会自动拦截并优化来自 Read、Grep 和其他文件工具的结构化数据。
46
+
47
+ ### 选项 B:MCP 服务器(手动模式)
48
+
49
+ **用于明确控制或非 Claude Code MCP 客户端:**
50
+
51
+ ```bash
52
+ # 1. 全局安装
53
+ npm install -g toonify-mcp
54
+
55
+ # 2. 注册为 MCP 服务器
56
+ claude mcp add toonify -- toonify-mcp
57
+
58
+ # 3. 验证
59
+ claude mcp list
60
+ # 应显示:toonify: toonify-mcp - ✓ Connected
61
+ ```
62
+
63
+ 然后明确调用工具:
64
+ ```bash
65
+ claude mcp call toonify optimize_content '{"content": "..."}'
66
+ claude mcp call toonify get_stats '{}'
67
+ ```
68
+
69
+ ## 运作原理
70
+
71
+ ### 插件模式(自动)
72
+
73
+ ```
74
+ 用户:读取大型 JSON 文件
75
+
76
+ Claude Code 调用 Read 工具
77
+
78
+ PostToolUse hook 拦截结果
79
+
80
+ Hook 检测 JSON,转换为 TOON
81
+
82
+ 优化后的内容发送到 Claude API
83
+
84
+ 达成 50-55% 典型 token 减少 ✨
85
+ ```
86
+
87
+ ### MCP 服务器模式(手动)
88
+
89
+ ```
90
+ 用户:明确调用 mcp__toonify__optimize_content
91
+
92
+ 内容转换为 TOON 格式
93
+
94
+ 返回优化结果
95
+ ```
96
+
97
+ ## 配置
98
+
99
+ 创建 `~/.claude/toonify-config.json`(可选):
100
+
101
+ ```json
102
+ {
103
+ "enabled": true,
104
+ "minTokensThreshold": 50,
105
+ "minSavingsThreshold": 30,
106
+ "skipToolPatterns": ["Bash", "Write", "Edit"]
107
+ }
108
+ ```
109
+
110
+ ### 选项
111
+
112
+ - **enabled**:启用/停用自动优化(预设:`true`)
113
+ - **minTokensThreshold**:优化前的最小 token 数(预设:`50`)
114
+ - **minSavingsThreshold**:所需的最小节省百分比(预设:`30%`)
115
+ - **skipToolPatterns**:永不优化的工具(预设:`["Bash", "Write", "Edit"]`)
116
+
117
+ ### 环境变量
118
+
119
+ ```bash
120
+ export TOONIFY_ENABLED=true
121
+ export TOONIFY_MIN_TOKENS=50
122
+ export TOONIFY_MIN_SAVINGS=30
123
+ export TOONIFY_SKIP_TOOLS="Bash,Write"
124
+ export TOONIFY_SHOW_STATS=true # 在输出中显示优化统计
125
+ ```
126
+
127
+ ## 示例
128
+
129
+ ### 优化前(142 tokens)
130
+
131
+ ```json
132
+ {
133
+ "products": [
134
+ {"id": 101, "name": "Laptop Pro", "price": 1299},
135
+ {"id": 102, "name": "Magic Mouse", "price": 79}
136
+ ]
137
+ }
138
+ ```
139
+
140
+ ### 优化后(57 tokens,-60%)
141
+
142
+ ```
143
+ [TOON-JSON]
144
+ products[2]{id,name,price}:
145
+ 101,Laptop Pro,1299
146
+ 102,Magic Mouse,79
147
+ ```
148
+
149
+ **在插件模式下自动应用 - 无需手动调用!**
150
+
151
+ ## 使用技巧
152
+
153
+ ### 何时触发自动优化?
154
+
155
+ PostToolUse hook 在以下情况下自动优化:
156
+ - ✅ 内容是有效的 JSON、CSV 或 YAML
157
+ - ✅ 内容大小 ≥ `minTokensThreshold`(预设:50 tokens)
158
+ - ✅ 预估节省 ≥ `minSavingsThreshold`(预设:30%)
159
+ - ✅ 工具不在 `skipToolPatterns` 中(例如,不是 Bash/Write/Edit)
160
+
161
+ ### 查看优化统计
162
+
163
+ ```bash
164
+ # 在插件模式下
165
+ claude mcp call toonify get_stats '{}'
166
+
167
+ # 或检查 Claude Code 输出的统计(如果 TOONIFY_SHOW_STATS=true)
168
+ ```
169
+
170
+ ## 故障排除
171
+
172
+ ### Hook 未触发
173
+
174
+ ```bash
175
+ # 1. 检查插件是否已安装
176
+ claude plugin list | grep toonify
177
+
178
+ # 2. 检查配置
179
+ cat ~/.claude/toonify-config.json
180
+
181
+ # 3. 启用统计以查看优化尝试
182
+ export TOONIFY_SHOW_STATS=true
183
+ ```
184
+
185
+ ### 未应用优化
186
+
187
+ - 检查 `minTokensThreshold` - 内容可能太小
188
+ - 检查 `minSavingsThreshold` - 节省可能 < 30%
189
+ - 检查 `skipToolPatterns` - 工具可能在跳过列表中
190
+ - 验证内容是有效的 JSON/CSV/YAML
191
+
192
+ ### 性能问题
193
+
194
+ - 降低 `minTokensThreshold` 以更积极地优化
195
+ - 提高 `minSavingsThreshold` 以跳过边际优化
196
+ - 如需要,将更多工具添加到 `skipToolPatterns`
197
+
198
+ ## 比较:插件 vs MCP 服务器
199
+
200
+ | 功能 | 插件模式 | MCP 服务器模式 |
201
+ |------|---------|--------------|
202
+ | **激活** | 自动(PostToolUse) | 手动(调用工具) |
203
+ | **兼容性** | 仅 Claude Code | 任何 MCP 客户端 |
204
+ | **配置** | 插件配置文件 | MCP 工具 |
205
+ | **性能** | 零开销 | 调用开销 |
206
+ | **使用情境** | 日常工作流程 | 明确控制 |
207
+
208
+ **建议**:使用插件模式进行自动优化。使用 MCP 服务器模式进行明确控制或其他 MCP 客户端。
209
+
210
+ ## 卸载
211
+
212
+ ### 插件模式
213
+ ```bash
214
+ claude plugin remove toonify-mcp
215
+ rm ~/.claude/toonify-config.json
216
+ ```
217
+
218
+ ### MCP 服务器模式
219
+ ```bash
220
+ claude mcp remove toonify
221
+ ```
222
+
223
+ ### 包
224
+ ```bash
225
+ npm uninstall -g toonify-mcp
226
+ ```
227
+
228
+ ## 链接
229
+
230
+ - **GitHub**:https://github.com/kevintseng/toonify-mcp
231
+ - **Issues**:https://github.com/kevintseng/toonify-mcp/issues
232
+ - **NPM**:https://www.npmjs.com/package/toonify-mcp
233
+ - **MCP 文档**:https://code.claude.com/docs/mcp
234
+ - **TOON 格式**:https://github.com/toon-format/toon
235
+
236
+ ## 贡献
237
+
238
+ 欢迎贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解指南。
239
+
240
+ ## 授权
241
+
242
+ MIT 授权 - 请参阅 [LICENSE](LICENSE)
243
+
244
+ ## 更新日志
245
+
246
+ ### v0.3.0(2025-12-26)
247
+ - ✨ **多语言 token 优化** - 精确计算 15+ 种语言
248
+ - ✨ 语言感知的 token 倍数(中文 2 倍、日文 2.5 倍、阿拉伯文 3 倍等)
249
+ - ✨ 混合语言文本检测和优化
250
+ - ✨ 使用真实统计数据进行全面基准测试
251
+ - 📊 数据支持的 token 节省声明(30-65% 范围,通常 50-55%)
252
+ - ✅ 75+ 测试通过,包括多语言边缘情况
253
+ - 📝 多语言 README 版本
254
+
255
+ ### v0.2.0 (2025-12-25)
256
+ - ✨ 添加 Claude Code 插件支持和 PostToolUse hook
257
+ - ✨ 自动 token 优化(无需手动调用)
258
+ - ✨ 插件配置系统
259
+ - ✨ 双模式:插件(自动)+ MCP 服务器(手动)
260
+ - 📝 全面文档更新
261
+
262
+ ### v0.1.1 (2024-12-24)
263
+ - 🐛 错误修复和改进
264
+ - 📝 文档更新
265
+
266
+ ### v0.1.0 (2024-12-24)
267
+ - 🎉 初始发布
268
+ - ✨ MCP 服务器实现
269
+ - ✨ TOON 格式优化
270
+ - ✨ 内建指标追踪
package/README.zh-TW.md CHANGED
@@ -1,26 +1,28 @@
1
1
  # 🎯 Toonify MCP
2
2
 
3
- **[English](README.md) | [繁體中文](README.zh-TW.md)**
3
+ **[English](README.md) | [繁體中文](README.zh-TW.md) | [简体中文](README.zh-CN.md) | [日本語](README.ja.md) | [Español](README.es.md) | [Tiếng Việt](README.vi.md) | [Bahasa Indonesia](README.id.md)**
4
4
 
5
- MCP 伺服器 + Claude Code 插件,提供結構化數據的自動 token 優化。
6
- 透過透明的 TOON 格式轉換,**平均減少 60%+ 的 Claude API token 使用**。
5
+ MCP 伺服器 + Claude Code 外掛程式,提供結構化數據的自動 token 優化。
6
+ 透過透明的 TOON 格式轉換,**根據數據結構減少 30-65% 的 Claude API token 使用量**,結構化數據的典型節省率為 **50-55%**。
7
7
 
8
- ## v0.2.0 新功能
8
+ ## v0.3.0 新功能
9
9
 
10
- **現在是完整的 Claude Code 插件!**
11
- - ✅ 自動 PostToolUse hook 攔截
12
- - ✅ 無需手動調用
13
- - ✅ 透明優化
14
- - ✅ 仍可作為獨立 MCP 伺服器使用
10
+ **多語言 Token 優化!**
11
+ - ✅ 精確計算 15+ 種語言的 token(中文、日文、韓文、西班牙文、阿拉伯文等)
12
+ - ✅ 語言感知的 token 倍數(中文 2 倍、日文 2.5 倍、阿拉伯文 3 倍)
13
+ - ✅ 支援混合語言文本的自動偵測
14
+ - ✅ 基於真實基準測試改進優化準確性
15
+ - ✅ 數據支持的 token 節省聲明(30-65% 範圍,通常 50-55%)
15
16
 
16
17
  ## 功能特色
17
18
 
18
- - **60%+ Token 減少** - 針對 JSON、CSV、YAML 數據
19
- - **完全自動** - PostToolUse hook 自動攔截工具結果
20
- - **零配置** - 開箱即用,預設值合理
21
- - **雙模式** - 插件模式(自動)+ MCP 伺服器模式(手動)
22
- - **內建指標** - 本地追蹤 token 節省
23
- - **靜默降級** - 永不中斷工作流程
19
+ - **30-65% Token 減少**(通常 50-55%)適用於 JSON、CSV、YAML 數據
20
+ - **多語言支援** - 精確計算 15+ 種語言的 token
21
+ - **完全自動** - PostToolUse hook 攔截工具結果
22
+ - **零配置** - 開箱即用,採用合理預設值
23
+ - **雙模式** - 作為外掛程式(自動)或 MCP 伺服器(手動)
24
+ - **內建指標** - 在本地追蹤 token 節省
25
+ - **靜默回退** - 永不中斷您的工作流程
24
26
 
25
27
  ## 安裝方式
26
28
 
@@ -79,7 +81,7 @@ Hook 偵測 JSON,轉換為 TOON
79
81
 
80
82
  優化後的內容發送到 Claude API
81
83
 
82
- 實現 60% token 減少 ✨
84
+ 達成 50-55% 典型 token 減少 ✨
83
85
  ```
84
86
 
85
87
  ### MCP 伺服器模式(手動)
@@ -241,6 +243,15 @@ MIT License - 請參閱 [LICENSE](LICENSE)
241
243
 
242
244
  ## 更新日誌
243
245
 
246
+ ### v0.3.0(2025-12-26)
247
+ - ✨ **多語言 token 優化** - 精確計算 15+ 種語言
248
+ - ✨ 語言感知的 token 倍數(中文 2 倍、日文 2.5 倍、阿拉伯文 3 倍等)
249
+ - ✨ 混合語言文本偵測和優化
250
+ - ✨ 使用真實統計數據進行全面基準測試
251
+ - 📊 數據支持的 token 節省聲明(30-65% 範圍,通常 50-55%)
252
+ - ✅ 75+ 測試通過,包括多語言邊緣情況
253
+ - 📝 多語言 README 版本
254
+
244
255
  ### v0.2.0 (2025-12-25)
245
256
  - ✨ 新增 Claude Code 插件支援與 PostToolUse hook
246
257
  - ✨ 自動 token 優化(無需手動調用)
@@ -12,6 +12,8 @@ export interface OptimizationMetric {
12
12
  wasOptimized: boolean;
13
13
  format?: string;
14
14
  reason?: string;
15
+ wasCached?: boolean;
16
+ cacheSavings?: number;
15
17
  }
16
18
  export declare class MetricsCollector {
17
19
  private statsPath;
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-collector.d.ts","sourceRoot":"","sources":["../../src/metrics/metrics-collector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAS;;IAW1B;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BvD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAIrC;;OAEG;YACW,SAAS;IAoBvB;;OAEG;YACW,SAAS;IAQvB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;CAiBzC"}
1
+ {"version":3,"file":"metrics-collector.d.ts","sourceRoot":"","sources":["../../src/metrics/metrics-collector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAS;;IAW1B;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCvD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAIrC;;OAEG;YACW,SAAS;IAyBvB;;OAEG;YACW,SAAS;IAQvB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;CAyCzC"}
@@ -24,6 +24,17 @@ export class MetricsCollector {
24
24
  stats.tokensBeforeOptimization += metric.originalTokens;
25
25
  stats.tokensAfterOptimization += metric.optimizedTokens;
26
26
  stats.totalSavings += metric.savings;
27
+ // v0.3.0: Track cache metrics
28
+ if (metric.wasCached) {
29
+ stats.cacheHits = (stats.cacheHits || 0) + 1;
30
+ stats.estimatedCacheSavings = (stats.estimatedCacheSavings || 0) + (metric.cacheSavings || 0);
31
+ }
32
+ else if (metric.wasOptimized) {
33
+ stats.cacheMisses = (stats.cacheMisses || 0) + 1;
34
+ }
35
+ // Calculate cache hit rate
36
+ const totalCacheAttempts = (stats.cacheHits || 0) + (stats.cacheMisses || 0);
37
+ stats.cacheHitRate = totalCacheAttempts > 0 ? (stats.cacheHits || 0) / totalCacheAttempts : 0;
27
38
  // Recalculate average
28
39
  stats.averageSavingsPercentage =
29
40
  stats.optimizedRequests > 0
@@ -61,6 +72,11 @@ export class MetricsCollector {
61
72
  tokensAfterOptimization: 0,
62
73
  totalSavings: 0,
63
74
  averageSavingsPercentage: 0,
75
+ // v0.3.0: Cache stats
76
+ cacheHits: 0,
77
+ cacheMisses: 0,
78
+ cacheHitRate: 0,
79
+ estimatedCacheSavings: 0,
64
80
  };
65
81
  }
66
82
  }
@@ -75,19 +91,38 @@ export class MetricsCollector {
75
91
  */
76
92
  async formatDashboard() {
77
93
  const stats = await this.getStats();
78
- return `
79
- 📊 Token Optimization Stats
80
- ━━━━━━━━━━━━━━━━━━━━━━━━
94
+ const optimizationRate = stats.totalRequests > 0
95
+ ? ((stats.optimizedRequests / stats.totalRequests) * 100).toFixed(1)
96
+ : '0.0';
97
+ // v0.3.0: Calculate total savings including cache
98
+ const totalSavingsWithCache = stats.totalSavings + (stats.estimatedCacheSavings || 0);
99
+ const costSavings = ((totalSavingsWithCache / 1_000_000) * 3).toFixed(2);
100
+ let dashboard = `
101
+ 📊 Token Optimization Stats (v0.3.0)
102
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
81
103
  Total Requests: ${stats.totalRequests}
82
- Optimized: ${stats.optimizedRequests} (${((stats.optimizedRequests / stats.totalRequests) * 100).toFixed(1)}%)
104
+ Optimized: ${stats.optimizedRequests} (${optimizationRate}%)
83
105
 
84
106
  Tokens Before: ${stats.tokensBeforeOptimization.toLocaleString()}
85
107
  Tokens After: ${stats.tokensAfterOptimization.toLocaleString()}
86
- Total Savings: ${stats.totalSavings.toLocaleString()} (${stats.averageSavingsPercentage.toFixed(1)}%)
108
+ Total Savings: ${stats.totalSavings.toLocaleString()} (${stats.averageSavingsPercentage.toFixed(1)}%)`;
109
+ // Add cache stats if available
110
+ if (stats.cacheHits || stats.cacheMisses) {
111
+ const cacheHitRate = (stats.cacheHitRate * 100).toFixed(1);
112
+ dashboard += `
113
+
114
+ 🚀 Prompt Caching Stats
115
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
116
+ Cache Hits: ${stats.cacheHits}
117
+ Cache Misses: ${stats.cacheMisses}
118
+ Hit Rate: ${cacheHitRate}%
119
+ Additional Cache Savings: ${(stats.estimatedCacheSavings || 0).toLocaleString()} tokens`;
120
+ }
121
+ dashboard += `
87
122
 
88
- 💰 Cost Savings (at $3/1M input tokens):
89
- $${((stats.totalSavings / 1_000_000) * 3).toFixed(2)} saved
90
- `.trim();
123
+ 💰 Total Cost Savings (at $3/1M input tokens):
124
+ $${costSavings} saved`;
125
+ return dashboard.trim();
91
126
  }
92
127
  }
93
128
  //# sourceMappingURL=metrics-collector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-collector.js","sourceRoot":"","sources":["../../src/metrics/metrics-collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics-collector.js","sourceRoot":"","sources":["../../src/metrics/metrics-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Cache Optimizer: Structures content for prompt caching
3
+ */
4
+ import type { CacheConfig, CachedContent, CacheMetrics } from './cache-types.js';
5
+ export declare class CacheOptimizer {
6
+ private config;
7
+ private metrics;
8
+ constructor(config?: Partial<CacheConfig>);
9
+ /**
10
+ * Wrap optimized TOON content with cache-friendly structure
11
+ */
12
+ wrapWithCaching(toonContent: string, toolName: string, format: 'json' | 'csv' | 'yaml', originalTokens: number, optimizedTokens: number): CachedContent;
13
+ /**
14
+ * Create cacheable static prefix with TOON format instructions
15
+ */
16
+ private createStaticPrefix;
17
+ /**
18
+ * Format TOON output with metadata
19
+ */
20
+ private formatTOONOutput;
21
+ /**
22
+ * Format for Anthropic cache_control API
23
+ */
24
+ formatForAnthropic(cached: CachedContent): any[];
25
+ /**
26
+ * Format for OpenAI (structured but no explicit cache control)
27
+ */
28
+ formatForOpenAI(cached: CachedContent): {
29
+ system: string;
30
+ user: string;
31
+ };
32
+ /**
33
+ * Get current cache metrics
34
+ */
35
+ getMetrics(): CacheMetrics;
36
+ /**
37
+ * Record a cache hit (when static prefix is reused)
38
+ */
39
+ recordCacheHit(savedTokens: number): void;
40
+ /**
41
+ * Record a cache miss (when static prefix is not cached)
42
+ */
43
+ recordCacheMiss(): void;
44
+ /**
45
+ * Update cache hit rate
46
+ */
47
+ private updateHitRate;
48
+ /**
49
+ * Reset metrics
50
+ */
51
+ resetMetrics(): void;
52
+ }
53
+ //# sourceMappingURL=cache-optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-optimizer.d.ts","sourceRoot":"","sources":["../../../src/optimizer/caching/cache-optimizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAiB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhG,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAe;gBAElB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAoB7C;;OAEG;IACH,eAAe,CACb,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,EAC/B,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,GACtB,aAAa;IAgDhB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,GAAG,EAAE;IAkBhD;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAOxE;;OAEG;IACH,UAAU,IAAI,YAAY;IAI1B;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMzC;;OAEG;IACH,eAAe,IAAI,IAAI;IAKvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,YAAY,IAAI,IAAI;CAUrB"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Cache Optimizer: Structures content for prompt caching
3
+ */
4
+ import { getStrategy } from './cache-strategies.js';
5
+ export class CacheOptimizer {
6
+ config;
7
+ metrics;
8
+ constructor(config = {}) {
9
+ this.config = {
10
+ enabled: true,
11
+ provider: 'auto',
12
+ ttl: '1hour',
13
+ cacheStaticPrompts: true,
14
+ minCacheableTokens: 1024,
15
+ ...config
16
+ };
17
+ this.metrics = {
18
+ cacheHits: 0,
19
+ cacheMisses: 0,
20
+ cacheHitRate: 0,
21
+ estimatedCacheSavings: 0,
22
+ totalCacheableTokens: 0,
23
+ averageCacheReuseCount: 0
24
+ };
25
+ }
26
+ /**
27
+ * Wrap optimized TOON content with cache-friendly structure
28
+ */
29
+ wrapWithCaching(toonContent, toolName, format, originalTokens, optimizedTokens) {
30
+ if (!this.config.enabled || !this.config.cacheStaticPrompts) {
31
+ // Return non-cached structure
32
+ return {
33
+ staticPrefix: '',
34
+ dynamicContent: this.formatTOONOutput(toonContent, toolName, format),
35
+ cacheBreakpoint: false
36
+ };
37
+ }
38
+ // Check if content is large enough for caching
39
+ const strategy = getStrategy(this.config.provider);
40
+ if (!strategy.shouldCache(toonContent, optimizedTokens)) {
41
+ return {
42
+ staticPrefix: '',
43
+ dynamicContent: this.formatTOONOutput(toonContent, toolName, format),
44
+ cacheBreakpoint: false
45
+ };
46
+ }
47
+ // Create cacheable static prefix
48
+ const staticPrefix = this.createStaticPrefix(toolName, format);
49
+ // Dynamic content (cache breakpoint here)
50
+ const dynamicContent = `\n[DATA]\n${toonContent}`;
51
+ // Estimate cache size
52
+ const estimatedCacheSize = staticPrefix.length / 4; // Rough estimate
53
+ const metadata = {
54
+ provider: this.config.provider === 'auto' ?
55
+ (process.env.ANTHROPIC_API_KEY ? 'anthropic' : 'openai') :
56
+ this.config.provider,
57
+ estimatedCacheSize,
58
+ ttl: this.config.ttl
59
+ };
60
+ // Update metrics
61
+ this.metrics.totalCacheableTokens += estimatedCacheSize;
62
+ return {
63
+ staticPrefix,
64
+ dynamicContent,
65
+ cacheBreakpoint: true,
66
+ cacheMetadata: metadata
67
+ };
68
+ }
69
+ /**
70
+ * Create cacheable static prefix with TOON format instructions
71
+ */
72
+ createStaticPrefix(toolName, format) {
73
+ return `[SYSTEM] Token-Optimized Data from ${toolName}
74
+
75
+ The following data has been converted to TOON format for token efficiency.
76
+
77
+ TOON Format Specification:
78
+ - Arrays: name[size]{fields}: value1,value2
79
+ Example: users[2]{id,name}: 1,Alice 2,Bob
80
+
81
+ - Objects: key: value
82
+ Example: config.port: 8080
83
+
84
+ - Nested structures: parent.child: value
85
+ Example: server.config.timeout: 30
86
+
87
+ - Mixed types supported: strings, numbers, booleans, null
88
+
89
+ Source Format: ${format.toUpperCase()}
90
+ Optimization: ~60-95% token reduction
91
+
92
+ Instructions:
93
+ 1. Parse the TOON-formatted data below
94
+ 2. Interpret field names from the schema
95
+ 3. Reconstruct the original data structure if needed
96
+ 4. Use the data to answer the user's request
97
+
98
+ ---`;
99
+ }
100
+ /**
101
+ * Format TOON output with metadata
102
+ */
103
+ formatTOONOutput(toonContent, toolName, format) {
104
+ return `[TOON-${format.toUpperCase()}]\n${toonContent}`;
105
+ }
106
+ /**
107
+ * Format for Anthropic cache_control API
108
+ */
109
+ formatForAnthropic(cached) {
110
+ if (!cached.cacheBreakpoint) {
111
+ return [{ type: 'text', text: cached.dynamicContent }];
112
+ }
113
+ return [
114
+ {
115
+ type: 'text',
116
+ text: cached.staticPrefix,
117
+ cache_control: { type: 'ephemeral' }
118
+ },
119
+ {
120
+ type: 'text',
121
+ text: cached.dynamicContent
122
+ }
123
+ ];
124
+ }
125
+ /**
126
+ * Format for OpenAI (structured but no explicit cache control)
127
+ */
128
+ formatForOpenAI(cached) {
129
+ return {
130
+ system: cached.staticPrefix || 'Process the following TOON-formatted data:',
131
+ user: cached.dynamicContent
132
+ };
133
+ }
134
+ /**
135
+ * Get current cache metrics
136
+ */
137
+ getMetrics() {
138
+ return { ...this.metrics };
139
+ }
140
+ /**
141
+ * Record a cache hit (when static prefix is reused)
142
+ */
143
+ recordCacheHit(savedTokens) {
144
+ this.metrics.cacheHits++;
145
+ this.metrics.estimatedCacheSavings += savedTokens;
146
+ this.updateHitRate();
147
+ }
148
+ /**
149
+ * Record a cache miss (when static prefix is not cached)
150
+ */
151
+ recordCacheMiss() {
152
+ this.metrics.cacheMisses++;
153
+ this.updateHitRate();
154
+ }
155
+ /**
156
+ * Update cache hit rate
157
+ */
158
+ updateHitRate() {
159
+ const total = this.metrics.cacheHits + this.metrics.cacheMisses;
160
+ this.metrics.cacheHitRate = total > 0 ? this.metrics.cacheHits / total : 0;
161
+ }
162
+ /**
163
+ * Reset metrics
164
+ */
165
+ resetMetrics() {
166
+ this.metrics = {
167
+ cacheHits: 0,
168
+ cacheMisses: 0,
169
+ cacheHitRate: 0,
170
+ estimatedCacheSavings: 0,
171
+ totalCacheableTokens: 0,
172
+ averageCacheReuseCount: 0
173
+ };
174
+ }
175
+ }
176
+ //# sourceMappingURL=cache-optimizer.js.map