@cmdoss/memwal-sdk 0.6.2 → 0.7.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/ARCHITECTURE.md +547 -547
- package/BENCHMARKS.md +238 -238
- package/README.md +181 -181
- package/dist/ai-sdk/tools.d.ts +2 -2
- package/dist/ai-sdk/tools.js +2 -2
- package/dist/client/PersonalDataWallet.d.ts.map +1 -1
- package/dist/client/SimplePDWClient.d.ts +1 -1
- package/dist/client/SimplePDWClient.d.ts.map +1 -1
- package/dist/client/SimplePDWClient.js +16 -7
- package/dist/client/SimplePDWClient.js.map +1 -1
- package/dist/client/namespaces/EmbeddingsNamespace.d.ts +1 -1
- package/dist/client/namespaces/EmbeddingsNamespace.js +1 -1
- package/dist/client/namespaces/MemoryNamespace.d.ts +27 -0
- package/dist/client/namespaces/MemoryNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/MemoryNamespace.js +104 -0
- package/dist/client/namespaces/MemoryNamespace.js.map +1 -1
- package/dist/client/namespaces/consolidated/AINamespace.d.ts +2 -2
- package/dist/client/namespaces/consolidated/AINamespace.js +2 -2
- package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/consolidated/BlockchainNamespace.js +22 -2
- package/dist/client/namespaces/consolidated/BlockchainNamespace.js.map +1 -1
- package/dist/graph/GraphService.js +1 -1
- package/dist/graph/GraphService.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/retrieval/MemoryRetrievalService.d.ts +31 -0
- package/dist/retrieval/MemoryRetrievalService.d.ts.map +1 -1
- package/dist/retrieval/MemoryRetrievalService.js +44 -4
- package/dist/retrieval/MemoryRetrievalService.js.map +1 -1
- package/dist/services/EmbeddingService.d.ts +28 -1
- package/dist/services/EmbeddingService.d.ts.map +1 -1
- package/dist/services/EmbeddingService.js +54 -0
- package/dist/services/EmbeddingService.js.map +1 -1
- package/dist/services/IndexManager.d.ts +5 -1
- package/dist/services/IndexManager.d.ts.map +1 -1
- package/dist/services/IndexManager.js +17 -40
- package/dist/services/IndexManager.js.map +1 -1
- package/dist/services/QueryService.js +1 -1
- package/dist/services/QueryService.js.map +1 -1
- package/dist/services/StorageService.d.ts +10 -0
- package/dist/services/StorageService.d.ts.map +1 -1
- package/dist/services/StorageService.js +13 -0
- package/dist/services/StorageService.js.map +1 -1
- package/dist/services/storage/QuiltBatchManager.d.ts +101 -1
- package/dist/services/storage/QuiltBatchManager.d.ts.map +1 -1
- package/dist/services/storage/QuiltBatchManager.js +410 -20
- package/dist/services/storage/QuiltBatchManager.js.map +1 -1
- package/dist/services/storage/index.d.ts +1 -1
- package/dist/services/storage/index.d.ts.map +1 -1
- package/dist/services/storage/index.js.map +1 -1
- package/dist/utils/LRUCache.d.ts +106 -0
- package/dist/utils/LRUCache.d.ts.map +1 -0
- package/dist/utils/LRUCache.js +281 -0
- package/dist/utils/LRUCache.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/memoryIndexOnChain.d.ts +212 -0
- package/dist/utils/memoryIndexOnChain.d.ts.map +1 -0
- package/dist/utils/memoryIndexOnChain.js +312 -0
- package/dist/utils/memoryIndexOnChain.js.map +1 -0
- package/dist/utils/rebuildIndexNode.d.ts +29 -0
- package/dist/utils/rebuildIndexNode.d.ts.map +1 -1
- package/dist/utils/rebuildIndexNode.js +366 -98
- package/dist/utils/rebuildIndexNode.js.map +1 -1
- package/dist/vector/HnswWasmService.d.ts +20 -5
- package/dist/vector/HnswWasmService.d.ts.map +1 -1
- package/dist/vector/HnswWasmService.js +73 -40
- package/dist/vector/HnswWasmService.js.map +1 -1
- package/dist/vector/IHnswService.d.ts +10 -1
- package/dist/vector/IHnswService.d.ts.map +1 -1
- package/dist/vector/IHnswService.js.map +1 -1
- package/dist/vector/NodeHnswService.d.ts +16 -0
- package/dist/vector/NodeHnswService.d.ts.map +1 -1
- package/dist/vector/NodeHnswService.js +84 -5
- package/dist/vector/NodeHnswService.js.map +1 -1
- package/dist/vector/createHnswService.d.ts +1 -1
- package/dist/vector/createHnswService.js +1 -1
- package/dist/vector/index.d.ts +1 -1
- package/dist/vector/index.js +1 -1
- package/package.json +157 -157
- package/src/access/index.ts +8 -8
- package/src/aggregation/index.ts +8 -8
- package/src/ai-sdk/tools.ts +2 -2
- package/src/client/SimplePDWClient.ts +23 -8
- package/src/client/namespaces/EmbeddingsNamespace.ts +1 -1
- package/src/client/namespaces/MemoryNamespace.ts +137 -0
- package/src/client/namespaces/consolidated/AINamespace.ts +2 -2
- package/src/client/namespaces/consolidated/BlockchainNamespace.ts +20 -2
- package/src/client/signers/DappKitSigner.ts +207 -207
- package/src/core/types/index.ts +1 -1
- package/src/generated/pdw/deps/sui/object.ts +12 -12
- package/src/generated/pdw/deps/sui/vec_map.ts +32 -32
- package/src/generated/pdw/memory.ts +1087 -1087
- package/src/generated/pdw/wallet.ts +123 -123
- package/src/generated/utils/index.ts +159 -159
- package/src/graph/GraphService.ts +1 -1
- package/src/index.ts +25 -1
- package/src/permissions/index.ts +9 -9
- package/src/retrieval/MemoryRetrievalService.ts +78 -4
- package/src/services/EmbeddingService.ts +66 -1
- package/src/services/IndexManager.ts +18 -45
- package/src/services/QueryService.ts +1 -1
- package/src/services/StorageService.ts +15 -0
- package/src/services/storage/QuiltBatchManager.ts +492 -22
- package/src/services/storage/index.ts +6 -1
- package/src/utils/LRUCache.ts +378 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/memoryIndexOnChain.ts +507 -0
- package/src/utils/rebuildIndexNode.ts +453 -106
- package/src/vector/HnswWasmService.ts +95 -43
- package/src/vector/IHnswService.ts +10 -1
- package/src/vector/NodeHnswService.ts +103 -5
- package/src/vector/createHnswService.ts +1 -1
- package/src/vector/index.ts +1 -1
- package/src/wallet/index.ts +17 -17
package/BENCHMARKS.md
CHANGED
|
@@ -1,238 +1,238 @@
|
|
|
1
|
-
# MemWal SDK Performance Benchmarks
|
|
2
|
-
|
|
3
|
-
Benchmark results for `@cmdoss/memwal-sdk` measured on Sui testnet.
|
|
4
|
-
|
|
5
|
-
## Quick Summary
|
|
6
|
-
|
|
7
|
-
| Operation | Latency | Notes |
|
|
8
|
-
|-----------|---------|-------|
|
|
9
|
-
| Vector Search + RAG | ~2.3s | With content retrieval |
|
|
10
|
-
| Create Memory | ~2.3s | Classify + embed + upload + index |
|
|
11
|
-
| AI Classification | ~2.3s | OpenRouter API |
|
|
12
|
-
| Batch Upload (2 items) | ~2.3s | Quilt batching |
|
|
13
|
-
| HNSW Search | <100ms | 3072-dim vectors, local |
|
|
14
|
-
| Blockchain Query | ~2.3s | List memories from Sui |
|
|
15
|
-
|
|
16
|
-
**Average query time: ~2.3s** (with OpenRouter API latency)
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## Speed Metrics
|
|
21
|
-
|
|
22
|
-
### AI Operations
|
|
23
|
-
|
|
24
|
-
| Operation | Avg Latency | Notes |
|
|
25
|
-
|-----------|-------------|-------|
|
|
26
|
-
| **Embedding (single)** | ~300ms | OpenRouter text-embedding-3-large |
|
|
27
|
-
| **Embedding (batch 5)** | ~400ms | 12.5 texts/sec |
|
|
28
|
-
| **Embedding (batch 10)** | ~500ms | 20 texts/sec |
|
|
29
|
-
| **shouldSave** | ~200ms | Cached after first call |
|
|
30
|
-
| **classify** | ~200ms | Cached responses |
|
|
31
|
-
| **Knowledge Graph** | ~3-6s | Entity extraction (Gemini) |
|
|
32
|
-
|
|
33
|
-
### Storage Operations
|
|
34
|
-
|
|
35
|
-
| Operation | Latency | Notes |
|
|
36
|
-
|-----------|---------|-------|
|
|
37
|
-
| **Walrus Upload (single)** | ~2,000ms | Single memory package |
|
|
38
|
-
| **Walrus Upload (Quilt batch)** | ~2,500ms | Multiple memories, single tx |
|
|
39
|
-
| **Walrus Download** | ~500-1,000ms | Depends on size |
|
|
40
|
-
| **Content Cache Hit** | <10ms | Local cache |
|
|
41
|
-
|
|
42
|
-
### Search Operations
|
|
43
|
-
|
|
44
|
-
| Operation | Avg Latency | Notes |
|
|
45
|
-
|-----------|-------------|-------|
|
|
46
|
-
| **HNSW Search (Node.js)** | <50ms | hnswlib-node, 3072-dim |
|
|
47
|
-
| **HNSW Search (Browser)** | ~100ms | hnswlib-wasm, 3072-dim |
|
|
48
|
-
| **Similarity Calculation** | 0.001ms | 909K calculations/sec |
|
|
49
|
-
| **Vector + Content Fetch** | ~2.3s | Search + Walrus retrieval |
|
|
50
|
-
|
|
51
|
-
### Blockchain Operations
|
|
52
|
-
|
|
53
|
-
| Operation | Latency | Notes |
|
|
54
|
-
|-----------|---------|-------|
|
|
55
|
-
| **Memory Create (on-chain)** | ~7,000ms | Includes gas estimation |
|
|
56
|
-
| **Memory Update** | ~5,000ms | |
|
|
57
|
-
| **Memory Delete** | ~3,000ms | |
|
|
58
|
-
| **Batch Create (Quilt)** | ~8,000ms | Multiple memories, single tx |
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## Full Pipeline Breakdown
|
|
63
|
-
|
|
64
|
-
Complete memory creation pipeline:
|
|
65
|
-
|
|
66
|
-
```text
|
|
67
|
-
┌────────────────────────────────────────────────────────────────┐
|
|
68
|
-
│ Memory Creation Pipeline │
|
|
69
|
-
├────────────────────────────────────────────────────────────────┤
|
|
70
|
-
│ Step │ Latency │ % of Total │
|
|
71
|
-
├─────────────────────────┼──────────────┼───────────────────────┤
|
|
72
|
-
│ 1. shouldSave check │ ~200ms │ 2% │
|
|
73
|
-
│ 2. Classification │ ~200ms │ 2% │
|
|
74
|
-
│ 3. Embedding (3072-dim) │ ~300ms │ 3% │
|
|
75
|
-
│ 4. Walrus Upload │ ~2,000ms │ 20% │
|
|
76
|
-
│ 5. On-chain Transaction │ ~7,000ms │ 70% │
|
|
77
|
-
│ 6. HNSW Indexing │ ~50ms │ <1% │
|
|
78
|
-
├─────────────────────────┼──────────────┼───────────────────────┤
|
|
79
|
-
│ TOTAL │ ~10,000ms │ 100% │
|
|
80
|
-
└─────────────────────────┴──────────────┴───────────────────────┘
|
|
81
|
-
|
|
82
|
-
With Knowledge Graph extraction: +3-6s
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### Optimization Tips
|
|
86
|
-
|
|
87
|
-
1. **Skip Knowledge Graph** - Disable if not needed (saves 3-6s)
|
|
88
|
-
2. **Batch Operations** - Use `pdw.memory.createBatch()` with Quilt (~90% gas savings)
|
|
89
|
-
3. **Use hnswlib-node** - Native C++ is 2x faster than WASM
|
|
90
|
-
4. **Cache embeddings** - Reuse embeddings for duplicate content
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## Size Metrics
|
|
95
|
-
|
|
96
|
-
### Data Sizes
|
|
97
|
-
|
|
98
|
-
| Component | Size | Notes |
|
|
99
|
-
|-----------|------|-------|
|
|
100
|
-
| **Embedding Vector** | 12,288 bytes | 3072 dimensions × 4 bytes (Float32) |
|
|
101
|
-
| **Memory Package** | ~15-20 KB | Content + metadata + embedding |
|
|
102
|
-
| **Knowledge Graph** | ~1-5 KB | Entities + relationships JSON |
|
|
103
|
-
| **HNSW Index Entry** | ~50 bytes | Per vector (plus metadata) |
|
|
104
|
-
|
|
105
|
-
### Bundle Sizes
|
|
106
|
-
|
|
107
|
-
| Build | Size | Notes |
|
|
108
|
-
|-------|------|-------|
|
|
109
|
-
| **Browser Bundle** | ~2.5 MB | Includes hnswlib-wasm |
|
|
110
|
-
| **Node.js Bundle** | ~1.8 MB | Uses hnswlib-node |
|
|
111
|
-
| **Minified** | ~800 KB | Gzipped |
|
|
112
|
-
|
|
113
|
-
### Index Capacity
|
|
114
|
-
|
|
115
|
-
| Parameter | Value |
|
|
116
|
-
|-----------|-------|
|
|
117
|
-
| Max Elements | 10,000 |
|
|
118
|
-
| Dimensions | 3072 |
|
|
119
|
-
| M (connections) | 16 |
|
|
120
|
-
| efConstruction | 200 |
|
|
121
|
-
| Memory per 1K vectors | ~120 KB |
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## Batch Upload (Quilt) Performance
|
|
126
|
-
|
|
127
|
-
Walrus Quilt batching provides significant gas savings:
|
|
128
|
-
|
|
129
|
-
| Batch Size | Individual Gas | Quilt Gas | Savings |
|
|
130
|
-
|------------|----------------|-----------|---------|
|
|
131
|
-
| 2 memories | 0.006 SUI | 0.004 SUI | ~33% |
|
|
132
|
-
| 5 memories | 0.015 SUI | 0.005 SUI | ~67% |
|
|
133
|
-
| 10 memories | 0.030 SUI | 0.006 SUI | ~80% |
|
|
134
|
-
| 20 memories | 0.060 SUI | 0.008 SUI | ~87% |
|
|
135
|
-
|
|
136
|
-
**Recommendation**: Always use `createBatch()` for multiple memories.
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## Cost Estimates
|
|
141
|
-
|
|
142
|
-
### Sui Testnet Gas Costs
|
|
143
|
-
|
|
144
|
-
| Operation | Gas Cost | USD Estimate* |
|
|
145
|
-
|-----------|----------|---------------|
|
|
146
|
-
| **Create Memory** | ~0.003 SUI | ~$0.01 |
|
|
147
|
-
| **Create Batch (Quilt)** | ~0.005 SUI | ~$0.02 |
|
|
148
|
-
| **Update Memory** | ~0.002 SUI | ~$0.007 |
|
|
149
|
-
| **Delete Memory** | ~0.001 SUI | ~$0.003 |
|
|
150
|
-
|
|
151
|
-
*Estimated at SUI = $3.50 (Dec 2024)
|
|
152
|
-
|
|
153
|
-
### AI API Costs
|
|
154
|
-
|
|
155
|
-
| Provider | Operation | Cost |
|
|
156
|
-
|----------|-----------|------|
|
|
157
|
-
| **OpenRouter** | text-embedding-3-large | ~$0.00013/1K tokens |
|
|
158
|
-
| **OpenRouter** | Classification (GPT-4) | ~$0.03/1K tokens |
|
|
159
|
-
| **Gemini** | Knowledge Graph | ~$0.001/request |
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## HNSW Performance Comparison
|
|
164
|
-
|
|
165
|
-
| Implementation | Search (10K vectors) | Add Vector | Memory |
|
|
166
|
-
|----------------|---------------------|------------|--------|
|
|
167
|
-
| **hnswlib-node** | ~20ms | ~0.5ms | ~120MB |
|
|
168
|
-
| **hnswlib-wasm** | ~50ms | ~1ms | ~120MB |
|
|
169
|
-
|
|
170
|
-
**Recommendation**: Use Node.js for production workloads.
|
|
171
|
-
|
|
172
|
-
---
|
|
173
|
-
|
|
174
|
-
## Running Benchmarks
|
|
175
|
-
|
|
176
|
-
### Quick Run
|
|
177
|
-
|
|
178
|
-
```bash
|
|
179
|
-
# Run all benchmarks
|
|
180
|
-
npm run test:e2e -- benchmark.spec.ts
|
|
181
|
-
|
|
182
|
-
# With verbose output
|
|
183
|
-
npx playwright test benchmark.spec.ts --reporter=list
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### Custom Benchmarks
|
|
187
|
-
|
|
188
|
-
```typescript
|
|
189
|
-
import { SimplePDWClient } from '@cmdoss/memwal-sdk';
|
|
190
|
-
|
|
191
|
-
const pdw = new SimplePDWClient({
|
|
192
|
-
signer: keypair,
|
|
193
|
-
network: 'testnet',
|
|
194
|
-
packageId: '0x...',
|
|
195
|
-
embedding: { provider: 'openrouter', apiKey: '...' }
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
await pdw.ready();
|
|
199
|
-
|
|
200
|
-
// Measure embedding latency
|
|
201
|
-
const start = performance.now();
|
|
202
|
-
const embedding = await pdw.ai.embed('Test text');
|
|
203
|
-
console.log(`Embedding: ${(performance.now() - start).toFixed(0)}ms`);
|
|
204
|
-
console.log(`Dimensions: ${embedding.length}`); // 3072
|
|
205
|
-
|
|
206
|
-
// Measure search latency
|
|
207
|
-
const searchStart = performance.now();
|
|
208
|
-
const results = await pdw.search.vector('query', { limit: 5 });
|
|
209
|
-
console.log(`Search: ${(performance.now() - searchStart).toFixed(0)}ms`);
|
|
210
|
-
|
|
211
|
-
// Measure batch create
|
|
212
|
-
const batchStart = performance.now();
|
|
213
|
-
const memories = await pdw.memory.createBatch([
|
|
214
|
-
'Memory 1', 'Memory 2', 'Memory 3'
|
|
215
|
-
]);
|
|
216
|
-
console.log(`Batch create: ${(performance.now() - batchStart).toFixed(0)}ms`);
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
## Environment
|
|
222
|
-
|
|
223
|
-
Benchmarks were run with:
|
|
224
|
-
|
|
225
|
-
- **Runtime**: Node.js 20 / Chromium (Playwright)
|
|
226
|
-
- **Network**: Sui Testnet
|
|
227
|
-
- **Embedding**: OpenRouter (text-embedding-3-large, 3072 dims)
|
|
228
|
-
- **Storage**: Walrus Testnet
|
|
229
|
-
- **HNSW**: hnswlib-node (Node.js) / hnswlib-wasm (Browser)
|
|
230
|
-
- **Machine**: Windows 11
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## Related Documentation
|
|
235
|
-
|
|
236
|
-
- [README.md](./README.md) - Quick start guide
|
|
237
|
-
- [ARCHITECTURE.md](./ARCHITECTURE.md) - System architecture
|
|
238
|
-
- [CHANGELOG.md](./CHANGELOG.md) - Version history
|
|
1
|
+
# MemWal SDK Performance Benchmarks
|
|
2
|
+
|
|
3
|
+
Benchmark results for `@cmdoss/memwal-sdk` measured on Sui testnet.
|
|
4
|
+
|
|
5
|
+
## Quick Summary
|
|
6
|
+
|
|
7
|
+
| Operation | Latency | Notes |
|
|
8
|
+
|-----------|---------|-------|
|
|
9
|
+
| Vector Search + RAG | ~2.3s | With content retrieval |
|
|
10
|
+
| Create Memory | ~2.3s | Classify + embed + upload + index |
|
|
11
|
+
| AI Classification | ~2.3s | OpenRouter API |
|
|
12
|
+
| Batch Upload (2 items) | ~2.3s | Quilt batching |
|
|
13
|
+
| HNSW Search | <100ms | 3072-dim vectors, local |
|
|
14
|
+
| Blockchain Query | ~2.3s | List memories from Sui |
|
|
15
|
+
|
|
16
|
+
**Average query time: ~2.3s** (with OpenRouter API latency)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Speed Metrics
|
|
21
|
+
|
|
22
|
+
### AI Operations
|
|
23
|
+
|
|
24
|
+
| Operation | Avg Latency | Notes |
|
|
25
|
+
|-----------|-------------|-------|
|
|
26
|
+
| **Embedding (single)** | ~300ms | OpenRouter text-embedding-3-large |
|
|
27
|
+
| **Embedding (batch 5)** | ~400ms | 12.5 texts/sec |
|
|
28
|
+
| **Embedding (batch 10)** | ~500ms | 20 texts/sec |
|
|
29
|
+
| **shouldSave** | ~200ms | Cached after first call |
|
|
30
|
+
| **classify** | ~200ms | Cached responses |
|
|
31
|
+
| **Knowledge Graph** | ~3-6s | Entity extraction (Gemini) |
|
|
32
|
+
|
|
33
|
+
### Storage Operations
|
|
34
|
+
|
|
35
|
+
| Operation | Latency | Notes |
|
|
36
|
+
|-----------|---------|-------|
|
|
37
|
+
| **Walrus Upload (single)** | ~2,000ms | Single memory package |
|
|
38
|
+
| **Walrus Upload (Quilt batch)** | ~2,500ms | Multiple memories, single tx |
|
|
39
|
+
| **Walrus Download** | ~500-1,000ms | Depends on size |
|
|
40
|
+
| **Content Cache Hit** | <10ms | Local cache |
|
|
41
|
+
|
|
42
|
+
### Search Operations
|
|
43
|
+
|
|
44
|
+
| Operation | Avg Latency | Notes |
|
|
45
|
+
|-----------|-------------|-------|
|
|
46
|
+
| **HNSW Search (Node.js)** | <50ms | hnswlib-node, 3072-dim |
|
|
47
|
+
| **HNSW Search (Browser)** | ~100ms | hnswlib-wasm, 3072-dim |
|
|
48
|
+
| **Similarity Calculation** | 0.001ms | 909K calculations/sec |
|
|
49
|
+
| **Vector + Content Fetch** | ~2.3s | Search + Walrus retrieval |
|
|
50
|
+
|
|
51
|
+
### Blockchain Operations
|
|
52
|
+
|
|
53
|
+
| Operation | Latency | Notes |
|
|
54
|
+
|-----------|---------|-------|
|
|
55
|
+
| **Memory Create (on-chain)** | ~7,000ms | Includes gas estimation |
|
|
56
|
+
| **Memory Update** | ~5,000ms | |
|
|
57
|
+
| **Memory Delete** | ~3,000ms | |
|
|
58
|
+
| **Batch Create (Quilt)** | ~8,000ms | Multiple memories, single tx |
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Full Pipeline Breakdown
|
|
63
|
+
|
|
64
|
+
Complete memory creation pipeline:
|
|
65
|
+
|
|
66
|
+
```text
|
|
67
|
+
┌────────────────────────────────────────────────────────────────┐
|
|
68
|
+
│ Memory Creation Pipeline │
|
|
69
|
+
├────────────────────────────────────────────────────────────────┤
|
|
70
|
+
│ Step │ Latency │ % of Total │
|
|
71
|
+
├─────────────────────────┼──────────────┼───────────────────────┤
|
|
72
|
+
│ 1. shouldSave check │ ~200ms │ 2% │
|
|
73
|
+
│ 2. Classification │ ~200ms │ 2% │
|
|
74
|
+
│ 3. Embedding (3072-dim) │ ~300ms │ 3% │
|
|
75
|
+
│ 4. Walrus Upload │ ~2,000ms │ 20% │
|
|
76
|
+
│ 5. On-chain Transaction │ ~7,000ms │ 70% │
|
|
77
|
+
│ 6. HNSW Indexing │ ~50ms │ <1% │
|
|
78
|
+
├─────────────────────────┼──────────────┼───────────────────────┤
|
|
79
|
+
│ TOTAL │ ~10,000ms │ 100% │
|
|
80
|
+
└─────────────────────────┴──────────────┴───────────────────────┘
|
|
81
|
+
|
|
82
|
+
With Knowledge Graph extraction: +3-6s
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Optimization Tips
|
|
86
|
+
|
|
87
|
+
1. **Skip Knowledge Graph** - Disable if not needed (saves 3-6s)
|
|
88
|
+
2. **Batch Operations** - Use `pdw.memory.createBatch()` with Quilt (~90% gas savings)
|
|
89
|
+
3. **Use hnswlib-node** - Native C++ is 2x faster than WASM
|
|
90
|
+
4. **Cache embeddings** - Reuse embeddings for duplicate content
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Size Metrics
|
|
95
|
+
|
|
96
|
+
### Data Sizes
|
|
97
|
+
|
|
98
|
+
| Component | Size | Notes |
|
|
99
|
+
|-----------|------|-------|
|
|
100
|
+
| **Embedding Vector** | 12,288 bytes | 3072 dimensions × 4 bytes (Float32) |
|
|
101
|
+
| **Memory Package** | ~15-20 KB | Content + metadata + embedding |
|
|
102
|
+
| **Knowledge Graph** | ~1-5 KB | Entities + relationships JSON |
|
|
103
|
+
| **HNSW Index Entry** | ~50 bytes | Per vector (plus metadata) |
|
|
104
|
+
|
|
105
|
+
### Bundle Sizes
|
|
106
|
+
|
|
107
|
+
| Build | Size | Notes |
|
|
108
|
+
|-------|------|-------|
|
|
109
|
+
| **Browser Bundle** | ~2.5 MB | Includes hnswlib-wasm |
|
|
110
|
+
| **Node.js Bundle** | ~1.8 MB | Uses hnswlib-node |
|
|
111
|
+
| **Minified** | ~800 KB | Gzipped |
|
|
112
|
+
|
|
113
|
+
### Index Capacity
|
|
114
|
+
|
|
115
|
+
| Parameter | Value |
|
|
116
|
+
|-----------|-------|
|
|
117
|
+
| Max Elements | 10,000 |
|
|
118
|
+
| Dimensions | 3072 |
|
|
119
|
+
| M (connections) | 16 |
|
|
120
|
+
| efConstruction | 200 |
|
|
121
|
+
| Memory per 1K vectors | ~120 KB |
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Batch Upload (Quilt) Performance
|
|
126
|
+
|
|
127
|
+
Walrus Quilt batching provides significant gas savings:
|
|
128
|
+
|
|
129
|
+
| Batch Size | Individual Gas | Quilt Gas | Savings |
|
|
130
|
+
|------------|----------------|-----------|---------|
|
|
131
|
+
| 2 memories | 0.006 SUI | 0.004 SUI | ~33% |
|
|
132
|
+
| 5 memories | 0.015 SUI | 0.005 SUI | ~67% |
|
|
133
|
+
| 10 memories | 0.030 SUI | 0.006 SUI | ~80% |
|
|
134
|
+
| 20 memories | 0.060 SUI | 0.008 SUI | ~87% |
|
|
135
|
+
|
|
136
|
+
**Recommendation**: Always use `createBatch()` for multiple memories.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Cost Estimates
|
|
141
|
+
|
|
142
|
+
### Sui Testnet Gas Costs
|
|
143
|
+
|
|
144
|
+
| Operation | Gas Cost | USD Estimate* |
|
|
145
|
+
|-----------|----------|---------------|
|
|
146
|
+
| **Create Memory** | ~0.003 SUI | ~$0.01 |
|
|
147
|
+
| **Create Batch (Quilt)** | ~0.005 SUI | ~$0.02 |
|
|
148
|
+
| **Update Memory** | ~0.002 SUI | ~$0.007 |
|
|
149
|
+
| **Delete Memory** | ~0.001 SUI | ~$0.003 |
|
|
150
|
+
|
|
151
|
+
*Estimated at SUI = $3.50 (Dec 2024)
|
|
152
|
+
|
|
153
|
+
### AI API Costs
|
|
154
|
+
|
|
155
|
+
| Provider | Operation | Cost |
|
|
156
|
+
|----------|-----------|------|
|
|
157
|
+
| **OpenRouter** | text-embedding-3-large | ~$0.00013/1K tokens |
|
|
158
|
+
| **OpenRouter** | Classification (GPT-4) | ~$0.03/1K tokens |
|
|
159
|
+
| **Gemini** | Knowledge Graph | ~$0.001/request |
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## HNSW Performance Comparison
|
|
164
|
+
|
|
165
|
+
| Implementation | Search (10K vectors) | Add Vector | Memory |
|
|
166
|
+
|----------------|---------------------|------------|--------|
|
|
167
|
+
| **hnswlib-node** | ~20ms | ~0.5ms | ~120MB |
|
|
168
|
+
| **hnswlib-wasm** | ~50ms | ~1ms | ~120MB |
|
|
169
|
+
|
|
170
|
+
**Recommendation**: Use Node.js for production workloads.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Running Benchmarks
|
|
175
|
+
|
|
176
|
+
### Quick Run
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
# Run all benchmarks
|
|
180
|
+
npm run test:e2e -- benchmark.spec.ts
|
|
181
|
+
|
|
182
|
+
# With verbose output
|
|
183
|
+
npx playwright test benchmark.spec.ts --reporter=list
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Custom Benchmarks
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
import { SimplePDWClient } from '@cmdoss/memwal-sdk';
|
|
190
|
+
|
|
191
|
+
const pdw = new SimplePDWClient({
|
|
192
|
+
signer: keypair,
|
|
193
|
+
network: 'testnet',
|
|
194
|
+
packageId: '0x...',
|
|
195
|
+
embedding: { provider: 'openrouter', apiKey: '...' }
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
await pdw.ready();
|
|
199
|
+
|
|
200
|
+
// Measure embedding latency
|
|
201
|
+
const start = performance.now();
|
|
202
|
+
const embedding = await pdw.ai.embed('Test text');
|
|
203
|
+
console.log(`Embedding: ${(performance.now() - start).toFixed(0)}ms`);
|
|
204
|
+
console.log(`Dimensions: ${embedding.length}`); // 3072
|
|
205
|
+
|
|
206
|
+
// Measure search latency
|
|
207
|
+
const searchStart = performance.now();
|
|
208
|
+
const results = await pdw.search.vector('query', { limit: 5 });
|
|
209
|
+
console.log(`Search: ${(performance.now() - searchStart).toFixed(0)}ms`);
|
|
210
|
+
|
|
211
|
+
// Measure batch create
|
|
212
|
+
const batchStart = performance.now();
|
|
213
|
+
const memories = await pdw.memory.createBatch([
|
|
214
|
+
'Memory 1', 'Memory 2', 'Memory 3'
|
|
215
|
+
]);
|
|
216
|
+
console.log(`Batch create: ${(performance.now() - batchStart).toFixed(0)}ms`);
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Environment
|
|
222
|
+
|
|
223
|
+
Benchmarks were run with:
|
|
224
|
+
|
|
225
|
+
- **Runtime**: Node.js 20 / Chromium (Playwright)
|
|
226
|
+
- **Network**: Sui Testnet
|
|
227
|
+
- **Embedding**: OpenRouter (text-embedding-3-large, 3072 dims)
|
|
228
|
+
- **Storage**: Walrus Testnet
|
|
229
|
+
- **HNSW**: hnswlib-node (Node.js) / hnswlib-wasm (Browser)
|
|
230
|
+
- **Machine**: Windows 11
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Related Documentation
|
|
235
|
+
|
|
236
|
+
- [README.md](./README.md) - Quick start guide
|
|
237
|
+
- [ARCHITECTURE.md](./ARCHITECTURE.md) - System architecture
|
|
238
|
+
- [CHANGELOG.md](./CHANGELOG.md) - Version history
|