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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.es.md +270 -0
- package/README.id.md +270 -0
- package/README.ja.md +270 -0
- package/README.md +21 -10
- package/README.vi.md +270 -0
- package/README.zh-CN.md +270 -0
- package/README.zh-TW.md +27 -16
- package/dist/metrics/metrics-collector.d.ts +2 -0
- package/dist/metrics/metrics-collector.d.ts.map +1 -1
- package/dist/metrics/metrics-collector.js +43 -8
- package/dist/metrics/metrics-collector.js.map +1 -1
- package/dist/optimizer/caching/cache-optimizer.d.ts +53 -0
- package/dist/optimizer/caching/cache-optimizer.d.ts.map +1 -0
- package/dist/optimizer/caching/cache-optimizer.js +176 -0
- package/dist/optimizer/caching/cache-optimizer.js.map +1 -0
- package/dist/optimizer/caching/cache-strategies.d.ts +19 -0
- package/dist/optimizer/caching/cache-strategies.d.ts.map +1 -0
- package/dist/optimizer/caching/cache-strategies.js +62 -0
- package/dist/optimizer/caching/cache-strategies.js.map +1 -0
- package/dist/optimizer/caching/cache-types.d.ts +36 -0
- package/dist/optimizer/caching/cache-types.d.ts.map +1 -0
- package/dist/optimizer/caching/cache-types.js +5 -0
- package/dist/optimizer/caching/cache-types.js.map +1 -0
- package/dist/optimizer/caching/index.d.ts +7 -0
- package/dist/optimizer/caching/index.d.ts.map +1 -0
- package/dist/optimizer/caching/index.js +7 -0
- package/dist/optimizer/caching/index.js.map +1 -0
- package/dist/optimizer/multilingual/index.d.ts +7 -0
- package/dist/optimizer/multilingual/index.d.ts.map +1 -0
- package/dist/optimizer/multilingual/index.js +7 -0
- package/dist/optimizer/multilingual/index.js.map +1 -0
- package/dist/optimizer/multilingual/language-detector.d.ts +43 -0
- package/dist/optimizer/multilingual/language-detector.d.ts.map +1 -0
- package/dist/optimizer/multilingual/language-detector.js +161 -0
- package/dist/optimizer/multilingual/language-detector.js.map +1 -0
- package/dist/optimizer/multilingual/language-profiles.d.ts +34 -0
- package/dist/optimizer/multilingual/language-profiles.d.ts.map +1 -0
- package/dist/optimizer/multilingual/language-profiles.js +196 -0
- package/dist/optimizer/multilingual/language-profiles.js.map +1 -0
- package/dist/optimizer/multilingual/tokenizer-adapter.d.ts +47 -0
- package/dist/optimizer/multilingual/tokenizer-adapter.d.ts.map +1 -0
- package/dist/optimizer/multilingual/tokenizer-adapter.js +96 -0
- package/dist/optimizer/multilingual/tokenizer-adapter.js.map +1 -0
- package/dist/optimizer/token-optimizer.d.ts +11 -1
- package/dist/optimizer/token-optimizer.d.ts.map +1 -1
- package/dist/optimizer/token-optimizer.js +49 -8
- package/dist/optimizer/token-optimizer.js.map +1 -1
- package/dist/optimizer/types.d.ts +15 -0
- package/dist/optimizer/types.d.ts.map +1 -1
- package/package.json +2 -2
package/README.zh-CN.md
ADDED
|
@@ -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
|
|
6
|
-
透過透明的 TOON
|
|
5
|
+
MCP 伺服器 + Claude Code 外掛程式,提供結構化數據的自動 token 優化。
|
|
6
|
+
透過透明的 TOON 格式轉換,**根據數據結構減少 30-65% 的 Claude API token 使用量**,結構化數據的典型節省率為 **50-55%**。
|
|
7
7
|
|
|
8
|
-
## v0.
|
|
8
|
+
## v0.3.0 新功能
|
|
9
9
|
|
|
10
|
-
✨
|
|
11
|
-
- ✅
|
|
12
|
-
- ✅
|
|
13
|
-
- ✅
|
|
14
|
-
- ✅
|
|
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
|
-
- **
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
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
|
-
|
|
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 優化(無需手動調用)
|
|
@@ -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;
|
|
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
|
-
|
|
79
|
-
|
|
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} (${
|
|
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
|
-
$${
|
|
90
|
-
|
|
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":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
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
|