page-action-cache 1.0.1
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/dist/actions-executor.d.ts +62 -0
- package/dist/actions-executor.d.ts.map +1 -0
- package/dist/actions-executor.js +339 -0
- package/dist/actions-executor.js.map +1 -0
- package/dist/cache-invalidator.d.ts +70 -0
- package/dist/cache-invalidator.d.ts.map +1 -0
- package/dist/cache-invalidator.js +212 -0
- package/dist/cache-invalidator.js.map +1 -0
- package/dist/cache-store.d.ts +80 -0
- package/dist/cache-store.d.ts.map +1 -0
- package/dist/cache-store.js +361 -0
- package/dist/cache-store.js.map +1 -0
- package/dist/cache-strategy.d.ts +65 -0
- package/dist/cache-strategy.d.ts.map +1 -0
- package/dist/cache-strategy.js +237 -0
- package/dist/cache-strategy.js.map +1 -0
- package/dist/hooks-entry.d.ts +18 -0
- package/dist/hooks-entry.d.ts.map +1 -0
- package/dist/hooks-entry.js +27 -0
- package/dist/hooks-entry.js.map +1 -0
- package/dist/hooks.d.ts +10 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +277 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/scenario-recognizer.d.ts +45 -0
- package/dist/scenario-recognizer.d.ts.map +1 -0
- package/dist/scenario-recognizer.js +213 -0
- package/dist/scenario-recognizer.js.map +1 -0
- package/dist/security-policy.d.ts +62 -0
- package/dist/security-policy.d.ts.map +1 -0
- package/dist/security-policy.js +219 -0
- package/dist/security-policy.js.map +1 -0
- package/dist/tools.d.ts +209 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +383 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +336 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/ux-enhancer.d.ts +60 -0
- package/dist/ux-enhancer.d.ts.map +1 -0
- package/dist/ux-enhancer.js +218 -0
- package/dist/ux-enhancer.js.map +1 -0
- package/dist/variable-resolver.d.ts +28 -0
- package/dist/variable-resolver.d.ts.map +1 -0
- package/dist/variable-resolver.js +201 -0
- package/dist/variable-resolver.js.map +1 -0
- package/docs/API.md +555 -0
- package/docs/IMPLEMENTATION.md +1792 -0
- package/docs/INTEGRATION.md +387 -0
- package/docs/README.md +183 -0
- package/index.ts +118 -0
- package/openclaw.plugin.json +208 -0
- package/package.json +76 -0
- package/skills/page-action-cache/SKILL.md +216 -0
- package/src/actions-executor.ts +441 -0
- package/src/cache-invalidator.ts +271 -0
- package/src/cache-store.ts +457 -0
- package/src/cache-strategy.ts +327 -0
- package/src/hooks-entry.ts +114 -0
- package/src/hooks.ts +332 -0
- package/src/index.ts +104 -0
- package/src/scenario-recognizer.ts +259 -0
- package/src/security-policy.ts +268 -0
- package/src/tools.ts +437 -0
- package/src/types.ts +482 -0
- package/src/ux-enhancer.ts +266 -0
- package/src/variable-resolver.ts +258 -0
package/docs/API.md
ADDED
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
# Page Action Cache API Reference
|
|
2
|
+
|
|
3
|
+
完整的 API 参考文档。
|
|
4
|
+
|
|
5
|
+
## 目录
|
|
6
|
+
|
|
7
|
+
- [缓存存储 API](#缓存存储-api-cachestore)
|
|
8
|
+
- [场景识别 API](#场景识别-api-scenariorecognizer)
|
|
9
|
+
- [变量解析 API](#变量解析-api-variableresolver)
|
|
10
|
+
- [操作执行 API](#操作执行-api-actionsexecutor)
|
|
11
|
+
- [安全策略 API](#安全策略-api-securitypolicy)
|
|
12
|
+
- [缓存失效 API](#缓存失效-api-cacheinvalidator)
|
|
13
|
+
- [用户体验 API](#用户体验-api-uxenhancer)
|
|
14
|
+
- [Hooks API](#hooks-api-hooks)
|
|
15
|
+
- [缓存策略 API](#缓存策略-api-cachestrategy)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 缓存存储 API (CacheStore)
|
|
20
|
+
|
|
21
|
+
### 初始化
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { getCacheStore } from "@openclaw/page-action-cache";
|
|
25
|
+
|
|
26
|
+
const cacheStore = getCacheStore();
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 主要方法
|
|
30
|
+
|
|
31
|
+
#### `set(url, viewport, actions, metadata): string`
|
|
32
|
+
|
|
33
|
+
保存缓存条目。
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
const key = cacheStore.set(
|
|
37
|
+
"https://example.com/login",
|
|
38
|
+
{ width: 1920, height: 1080 },
|
|
39
|
+
[
|
|
40
|
+
{ type: "click", ref: "#username", order: 1 },
|
|
41
|
+
{ type: "type", ref: "#password", text: "...", order: 2 },
|
|
42
|
+
{ type: "click", ref: "#submit", order: 3 }
|
|
43
|
+
],
|
|
44
|
+
{
|
|
45
|
+
scenario: "login",
|
|
46
|
+
cacheLevel: "L3",
|
|
47
|
+
description: "登录操作",
|
|
48
|
+
variables: { username: "user" }
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**参数:**
|
|
54
|
+
- `url: string` - 页面 URL
|
|
55
|
+
- `viewport: PageViewport` - 视口尺寸
|
|
56
|
+
- `actions: AtomicAction[]` - 操作序列
|
|
57
|
+
- `metadata: CacheEntryMetadata` - 元数据
|
|
58
|
+
|
|
59
|
+
**返回值:** 缓存键 (MD5 hash)
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
#### `get(url, viewport): PageActionCacheEntry | null`
|
|
64
|
+
|
|
65
|
+
获取缓存条目。
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
const entry = cacheStore.get(
|
|
69
|
+
"https://example.com/login",
|
|
70
|
+
{ width: 1920, height: 1080 }
|
|
71
|
+
);
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**返回值:** 缓存条目,如果不存在则返回 `null`
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
#### `listEntries(): PageActionCacheEntry[]`
|
|
79
|
+
|
|
80
|
+
列出所有缓存条目。
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
const entries = cacheStore.listEntries();
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
#### `delete(url, viewport): boolean`
|
|
89
|
+
|
|
90
|
+
删除缓存条目。
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
const deleted = cacheStore.delete(
|
|
94
|
+
"https://example.com/login",
|
|
95
|
+
{ width: 1920, height: 1080 }
|
|
96
|
+
);
|
|
97
|
+
console.log(`删除: ${deleted}`);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
#### `clear(): void`
|
|
103
|
+
|
|
104
|
+
清空所有缓存。
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
cacheStore.clear();
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
#### `getStats(): CacheStats`
|
|
113
|
+
|
|
114
|
+
获取缓存统计信息。
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
const stats = cacheStore.getStats();
|
|
118
|
+
console.log(`命中率: ${stats.hitRate}%`);
|
|
119
|
+
console.log(`节省 tokens: ${stats.savedTokens}`);
|
|
120
|
+
console.log(`节省时间: ${stats.savedTime}ms`);
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**统计字段:**
|
|
124
|
+
- `totalEntries` - 总条目数
|
|
125
|
+
- `totalHits` - 总命中数
|
|
126
|
+
- `totalMisses` - 总未命中数
|
|
127
|
+
- `hitRate` - 命中率 (0-100)
|
|
128
|
+
- `l3Hits` - L3 缓存命中数
|
|
129
|
+
- `l2Hits` - L2 缓存命中数
|
|
130
|
+
- `l1Hits` - L1 缓存命中数
|
|
131
|
+
- `scenarioMatches` - 场景识别匹配数
|
|
132
|
+
- `savedTokens` - 节省的 tokens 数量
|
|
133
|
+
- `savedTime` - 节省的时间(毫秒)
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 场景识别 API (ScenarioRecognizer)
|
|
138
|
+
|
|
139
|
+
### 初始化
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
import { getScenarioRecognizer } from "@openclaw/page-action-cache";
|
|
143
|
+
|
|
144
|
+
const recognizer = getScenarioRecognizer();
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 主要方法
|
|
148
|
+
|
|
149
|
+
#### `recognize(userInput, currentUrl): Promise<ScenarioMatch | null>`
|
|
150
|
+
|
|
151
|
+
识别用户场景。
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
const match = await recognizer.recognize(
|
|
155
|
+
"请帮我登录",
|
|
156
|
+
"https://example.com/page"
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
if (match) {
|
|
160
|
+
console.log(`场景: ${match.scenario}`);
|
|
161
|
+
console.log(`置信度: ${match.confidence}`);
|
|
162
|
+
console.log(`方法: ${match.method}`);
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**返回值:** 场景匹配结果,包含:
|
|
167
|
+
- `scenario` - 场景名称
|
|
168
|
+
- `confidence` - 置信度 (0-100)
|
|
169
|
+
- `method` - 匹配方法
|
|
170
|
+
- `matchedPattern` - 匹配的模式
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 变量解析 API (VariableResolver)
|
|
175
|
+
|
|
176
|
+
### 初始化
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
import { getVariableResolver } from "@openclaw/page-action-cache";
|
|
180
|
+
|
|
181
|
+
const resolver = getVariableResolver();
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### 主要方法
|
|
185
|
+
|
|
186
|
+
#### `resolveVariables(userInput, scenario): VariableMap`
|
|
187
|
+
|
|
188
|
+
从用户输入解析变量。
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
const variables = resolver.resolveVariables(
|
|
192
|
+
"用户名是 admin,密码是 secret123",
|
|
193
|
+
"login"
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
console.log(variables);
|
|
197
|
+
// { username: "admin", password: "secret123" }
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
#### `validateVariables(variables, scenario): boolean`
|
|
203
|
+
|
|
204
|
+
验证变量是否有效。
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
const isValid = resolver.validateVariables(variables, "login");
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
#### `mergeVariables(base, override): VariableMap`
|
|
213
|
+
|
|
214
|
+
合并变量映射。
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
const merged = resolver.mergeVariables(baseVariables, overrideVariables);
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 操作执行 API (ActionsExecutor)
|
|
223
|
+
|
|
224
|
+
### 初始化
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
import { getActionsExecutor } from "@openclaw/page-action-cache";
|
|
228
|
+
|
|
229
|
+
const executor = getActionsExecutor(cdpUrl);
|
|
230
|
+
executor.setPlaywrightClient(pwClient);
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### 主要方法
|
|
234
|
+
|
|
235
|
+
#### `execute(action, variables?): Promise<ExecutionResult>`
|
|
236
|
+
|
|
237
|
+
执行单个操作。
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
const result = await executor.execute(action, {
|
|
241
|
+
username: "...",
|
|
242
|
+
password: "..."
|
|
243
|
+
});
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
#### `executeBatch(actions, variables?, options?): Promise<ExecutionResult[]>`
|
|
249
|
+
|
|
250
|
+
批量执行操作。
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
const results = await executor.executeBatch(actions, variables, {
|
|
254
|
+
fromIndex: 0,
|
|
255
|
+
toIndex: 2,
|
|
256
|
+
atomic: true // 全部成功或全部失败
|
|
257
|
+
});
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
#### `formatActions(actions): string`
|
|
263
|
+
|
|
264
|
+
格式化操作列表为可读字符串。
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
const text = executor.formatActions(actions);
|
|
268
|
+
console.log(text);
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
#### `formatExecutionResults(results): string`
|
|
274
|
+
|
|
275
|
+
格式化执行结果。
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
const text = executor.formatExecutionResults(results);
|
|
279
|
+
console.log(text);
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 安全策略 API (SecurityPolicy)
|
|
285
|
+
|
|
286
|
+
### 初始化
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
import { getSecurityPolicy } from "@openclaw/page-action-cache";
|
|
290
|
+
|
|
291
|
+
const policy = getSecurityPolicy();
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### 主要方法
|
|
295
|
+
|
|
296
|
+
#### `isSensitiveAction(action): boolean`
|
|
297
|
+
|
|
298
|
+
检查操作是否包含敏感变量。
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
const isSensitive = policy.isSensitiveAction({
|
|
302
|
+
type: "type",
|
|
303
|
+
ref: "#password",
|
|
304
|
+
variable: "password",
|
|
305
|
+
text: "..."
|
|
306
|
+
});
|
|
307
|
+
// true - 密码字段,应该加密
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
#### `encrypt(data): string`
|
|
313
|
+
|
|
314
|
+
加密数据。
|
|
315
|
+
|
|
316
|
+
```typescript
|
|
317
|
+
const encrypted = policy.encrypt("sensitive-data");
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
#### `decrypt(encrypted): string`
|
|
323
|
+
|
|
324
|
+
解密数据。
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
const decrypted = policy.decrypt(encrypted);
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
#### `sanitizeForLogging(data): any`
|
|
333
|
+
|
|
334
|
+
脱敏数据用于日志输出。
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
const sanitized = policy.sanitizeForLogging({
|
|
338
|
+
username: "...",
|
|
339
|
+
password: "..."
|
|
340
|
+
});
|
|
341
|
+
// { username: "...", password: "***REDACTED***" }
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## 缓存失效 API (CacheInvalidator)
|
|
347
|
+
|
|
348
|
+
### 初始化
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
import { getCacheInvalidator } from "@openclaw/page-action-cache";
|
|
352
|
+
|
|
353
|
+
const invalidator = getCacheInvalidator();
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### 主要方法
|
|
357
|
+
|
|
358
|
+
#### `detectPageChange(html, url, viewport, cachedEntry?): Promise<PageChangeDetection>`
|
|
359
|
+
|
|
360
|
+
检测页面是否发生变化。
|
|
361
|
+
|
|
362
|
+
```typescript
|
|
363
|
+
const detection = await invalidator.detectPageChange(
|
|
364
|
+
html,
|
|
365
|
+
url,
|
|
366
|
+
viewport,
|
|
367
|
+
cachedEntry
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
if (detection.hasChanged) {
|
|
371
|
+
console.log(`页面已变化: ${detection.changeType}`);
|
|
372
|
+
console.log(`置信度: ${detection.confidence}`);
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## 用户体验 API (UXEnhancer)
|
|
379
|
+
|
|
380
|
+
### 初始化
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
import { getUXEnhancer } from "@openclaw/page-action-cache";
|
|
384
|
+
|
|
385
|
+
const enhancer = getUXEnhancer();
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### 主要方法
|
|
389
|
+
|
|
390
|
+
#### `generateStatsReport(): string`
|
|
391
|
+
|
|
392
|
+
生成统计报告。
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
const report = enhancer.generateStatsReport();
|
|
396
|
+
console.log(report);
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
#### `formatCacheEntry(entry): string`
|
|
402
|
+
|
|
403
|
+
格式化缓存条目。
|
|
404
|
+
|
|
405
|
+
```typescript
|
|
406
|
+
const text = enhancer.formatCacheEntry(entry);
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
## Hooks API (Hooks)
|
|
412
|
+
|
|
413
|
+
### 初始化
|
|
414
|
+
|
|
415
|
+
```typescript
|
|
416
|
+
import { registerPageActionCacheHooks } from "@openclaw/page-action-cache";
|
|
417
|
+
|
|
418
|
+
// 注册 hooks
|
|
419
|
+
registerPageActionCacheHooks(api, config);
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### 注册的 Hooks
|
|
423
|
+
|
|
424
|
+
#### `before_tool_call`
|
|
425
|
+
|
|
426
|
+
- **触发时机:** 在任何工具调用之前
|
|
427
|
+
- **用途:** 场景识别和缓存拦截
|
|
428
|
+
- **返回值:** `{ block: false, result?: { cacheInfo, stats } }`
|
|
429
|
+
|
|
430
|
+
**示例响应:**
|
|
431
|
+
|
|
432
|
+
```typescript
|
|
433
|
+
{
|
|
434
|
+
block: false,
|
|
435
|
+
result: {
|
|
436
|
+
cacheInfo: {
|
|
437
|
+
exists: true,
|
|
438
|
+
scenario: "login",
|
|
439
|
+
confidence: 90,
|
|
440
|
+
method: "keyword",
|
|
441
|
+
cacheLevel: "L3",
|
|
442
|
+
actions: [...],
|
|
443
|
+
cacheKey: "abc123..."
|
|
444
|
+
},
|
|
445
|
+
stats: {
|
|
446
|
+
hitRate: 75.5,
|
|
447
|
+
savedTokens: 15000
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
#### `after_tool_call`
|
|
456
|
+
|
|
457
|
+
- **触发时机:** 在工具调用完成之后
|
|
458
|
+
- **用途:** 保存 LLM 分析结果到缓存
|
|
459
|
+
- **返回值:** 无返回值
|
|
460
|
+
|
|
461
|
+
**功能:**
|
|
462
|
+
- 提取 LLM 返回的场景类型
|
|
463
|
+
- 解析用户输入中的变量
|
|
464
|
+
- 根据场景匹配决定缓存层级
|
|
465
|
+
- 保存到缓存存储
|
|
466
|
+
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
#### `before_prompt_build`
|
|
470
|
+
|
|
471
|
+
- **触发时机:** 在构建提示之前
|
|
472
|
+
- **用途:** 注入缓存使用指南
|
|
473
|
+
- **返回值:** `{ prependContext?: string }`
|
|
474
|
+
|
|
475
|
+
**示例响应:**
|
|
476
|
+
|
|
477
|
+
```typescript
|
|
478
|
+
{
|
|
479
|
+
prependContext: `
|
|
480
|
+
【页面操作缓存系统】
|
|
481
|
+
|
|
482
|
+
当前缓存统计:
|
|
483
|
+
- 总条目数:42
|
|
484
|
+
- 总命中:28
|
|
485
|
+
- 命中率:66.7%
|
|
486
|
+
|
|
487
|
+
已缓存的场景:
|
|
488
|
+
1. login (命中率: 85%)
|
|
489
|
+
2. search (命中率: 72%)
|
|
490
|
+
3. checkout (命中率: 68%)
|
|
491
|
+
|
|
492
|
+
使用方式:
|
|
493
|
+
1. 如果工具返回 cacheInfo 信息,优先使用缓存的操作
|
|
494
|
+
2. 执行缓存操作可以大幅降低 token 消耗和操作延迟
|
|
495
|
+
`
|
|
496
|
+
}
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
---
|
|
500
|
+
|
|
501
|
+
## 缓存策略 API (CacheStrategy)
|
|
502
|
+
|
|
503
|
+
### 策略类型
|
|
504
|
+
|
|
505
|
+
#### `AutoCacheStrategy`
|
|
506
|
+
|
|
507
|
+
自动选择缓存层级。
|
|
508
|
+
|
|
509
|
+
```typescript
|
|
510
|
+
import { AutoCacheStrategy } from "@openclaw/page-action-cache";
|
|
511
|
+
|
|
512
|
+
const strategy = new AutoCacheStrategy();
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
---
|
|
516
|
+
|
|
517
|
+
#### `L3OnlyCacheStrategy`
|
|
518
|
+
|
|
519
|
+
仅使用 L3 缓存。
|
|
520
|
+
|
|
521
|
+
```typescript
|
|
522
|
+
import { L3OnlyCacheStrategy } from "@openclaw/page-action-cache";
|
|
523
|
+
|
|
524
|
+
const strategy = new L3OnlyCacheStrategy();
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
#### `L2OnlyCacheStrategy`
|
|
530
|
+
|
|
531
|
+
仅使用 L2 和 L3 缓存。
|
|
532
|
+
|
|
533
|
+
```typescript
|
|
534
|
+
import { L2OnlyCacheStrategy } from "@openclaw/page-action-cache";
|
|
535
|
+
|
|
536
|
+
const strategy = new L2OnlyCacheStrategy();
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
#### `L1OnlyCacheStrategy`
|
|
542
|
+
|
|
543
|
+
仅使用 L1、L2 和 L3 缓存。
|
|
544
|
+
|
|
545
|
+
```typescript
|
|
546
|
+
import { L1OnlyCacheStrategy } from "@openclaw/page-action-cache";
|
|
547
|
+
|
|
548
|
+
const strategy = new L1OnlyCacheStrategy();
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
---
|
|
552
|
+
|
|
553
|
+
## 类型定义
|
|
554
|
+
|
|
555
|
+
所有 API 都使用统一的类型定义。详见 [类型定义](../src/types.ts)。
|