@ruvector/ruvllm 0.2.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/README.md +406 -0
- package/bin/cli.js +387 -0
- package/dist/cjs/engine.d.ts +90 -0
- package/dist/cjs/engine.d.ts.map +1 -0
- package/dist/cjs/engine.js +301 -0
- package/dist/cjs/export.d.ts +182 -0
- package/dist/cjs/export.d.ts.map +1 -0
- package/dist/cjs/export.js +422 -0
- package/dist/cjs/federated.d.ts +233 -0
- package/dist/cjs/federated.d.ts.map +1 -0
- package/dist/cjs/federated.js +525 -0
- package/dist/cjs/index.d.ts +64 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +96 -0
- package/dist/cjs/lora.d.ts +240 -0
- package/dist/cjs/lora.d.ts.map +1 -0
- package/dist/cjs/lora.js +494 -0
- package/dist/cjs/native.d.ts +83 -0
- package/dist/cjs/native.d.ts.map +1 -0
- package/dist/cjs/native.js +70 -0
- package/dist/cjs/session.d.ts +80 -0
- package/dist/cjs/session.d.ts.map +1 -0
- package/dist/cjs/session.js +203 -0
- package/dist/cjs/simd.d.ts +90 -0
- package/dist/cjs/simd.d.ts.map +1 -0
- package/dist/cjs/simd.js +209 -0
- package/dist/cjs/sona.d.ts +187 -0
- package/dist/cjs/sona.d.ts.map +1 -0
- package/dist/cjs/sona.js +500 -0
- package/dist/cjs/streaming.d.ts +55 -0
- package/dist/cjs/streaming.d.ts.map +1 -0
- package/dist/cjs/streaming.js +131 -0
- package/dist/cjs/training.d.ts +254 -0
- package/dist/cjs/training.d.ts.map +1 -0
- package/dist/cjs/training.js +480 -0
- package/dist/cjs/types.d.ts +599 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +6 -0
- package/dist/esm/engine.d.ts +90 -0
- package/dist/esm/engine.d.ts.map +1 -0
- package/dist/esm/engine.js +297 -0
- package/dist/esm/export.d.ts +182 -0
- package/dist/esm/export.d.ts.map +1 -0
- package/dist/esm/export.js +414 -0
- package/dist/esm/federated.d.ts +233 -0
- package/dist/esm/federated.d.ts.map +1 -0
- package/dist/esm/federated.js +520 -0
- package/dist/esm/index.d.ts +64 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +76 -0
- package/dist/esm/lora.d.ts +240 -0
- package/dist/esm/lora.d.ts.map +1 -0
- package/dist/esm/lora.js +489 -0
- package/dist/esm/native.d.ts +83 -0
- package/dist/esm/native.d.ts.map +1 -0
- package/dist/esm/native.js +65 -0
- package/dist/esm/session.d.ts +80 -0
- package/dist/esm/session.d.ts.map +1 -0
- package/dist/esm/session.js +199 -0
- package/dist/esm/simd.d.ts +90 -0
- package/dist/esm/simd.d.ts.map +1 -0
- package/dist/esm/simd.js +205 -0
- package/dist/esm/sona.d.ts +187 -0
- package/dist/esm/sona.d.ts.map +1 -0
- package/dist/esm/sona.js +494 -0
- package/dist/esm/streaming.d.ts +55 -0
- package/dist/esm/streaming.d.ts.map +1 -0
- package/dist/esm/streaming.js +126 -0
- package/dist/esm/training.d.ts +254 -0
- package/dist/esm/training.d.ts.map +1 -0
- package/dist/esm/training.js +473 -0
- package/dist/esm/types.d.ts +599 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +5 -0
- package/package.json +121 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RuvLLM Engine - Main orchestrator for self-learning LLM
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RuvLLM = void 0;
|
|
7
|
+
const native_1 = require("./native");
|
|
8
|
+
/**
|
|
9
|
+
* Convert JS config to native config format
|
|
10
|
+
*/
|
|
11
|
+
function toNativeConfig(config) {
|
|
12
|
+
if (!config)
|
|
13
|
+
return undefined;
|
|
14
|
+
return {
|
|
15
|
+
embedding_dim: config.embeddingDim,
|
|
16
|
+
router_hidden_dim: config.routerHiddenDim,
|
|
17
|
+
hnsw_m: config.hnswM,
|
|
18
|
+
hnsw_ef_construction: config.hnswEfConstruction,
|
|
19
|
+
hnsw_ef_search: config.hnswEfSearch,
|
|
20
|
+
learning_enabled: config.learningEnabled,
|
|
21
|
+
quality_threshold: config.qualityThreshold,
|
|
22
|
+
ewc_lambda: config.ewcLambda,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Convert JS generation config to native format
|
|
27
|
+
*/
|
|
28
|
+
function toNativeGenConfig(config) {
|
|
29
|
+
if (!config)
|
|
30
|
+
return undefined;
|
|
31
|
+
return {
|
|
32
|
+
max_tokens: config.maxTokens,
|
|
33
|
+
temperature: config.temperature,
|
|
34
|
+
top_p: config.topP,
|
|
35
|
+
top_k: config.topK,
|
|
36
|
+
repetition_penalty: config.repetitionPenalty,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* RuvLLM - Self-learning LLM orchestrator
|
|
41
|
+
*
|
|
42
|
+
* Combines SONA adaptive learning with HNSW memory,
|
|
43
|
+
* FastGRNN routing, and SIMD-optimized inference.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* import { RuvLLM } from '@ruvector/ruvllm';
|
|
48
|
+
*
|
|
49
|
+
* const llm = new RuvLLM({ embeddingDim: 768 });
|
|
50
|
+
*
|
|
51
|
+
* // Query with automatic routing
|
|
52
|
+
* const response = await llm.query('What is machine learning?');
|
|
53
|
+
* console.log(response.text);
|
|
54
|
+
*
|
|
55
|
+
* // Provide feedback for learning
|
|
56
|
+
* llm.feedback({ requestId: response.requestId, rating: 5 });
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
class RuvLLM {
|
|
60
|
+
/**
|
|
61
|
+
* Create a new RuvLLM instance
|
|
62
|
+
*/
|
|
63
|
+
constructor(config) {
|
|
64
|
+
this.native = null;
|
|
65
|
+
// Fallback state for when native module is not available
|
|
66
|
+
this.fallbackState = {
|
|
67
|
+
memory: new Map(),
|
|
68
|
+
nextId: 1,
|
|
69
|
+
queryCount: 0,
|
|
70
|
+
};
|
|
71
|
+
this.config = config ?? {};
|
|
72
|
+
const mod = (0, native_1.getNativeModule)();
|
|
73
|
+
if (mod) {
|
|
74
|
+
try {
|
|
75
|
+
this.native = new mod.RuvLLMEngine(toNativeConfig(config));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Silently fall back to JS implementation
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Query the LLM with automatic routing
|
|
84
|
+
*/
|
|
85
|
+
query(text, config) {
|
|
86
|
+
if (this.native) {
|
|
87
|
+
const result = this.native.query(text, toNativeGenConfig(config));
|
|
88
|
+
return {
|
|
89
|
+
text: result.text,
|
|
90
|
+
confidence: result.confidence,
|
|
91
|
+
model: result.model,
|
|
92
|
+
contextSize: result.context_size,
|
|
93
|
+
latencyMs: result.latency_ms,
|
|
94
|
+
requestId: result.request_id,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Fallback implementation
|
|
98
|
+
this.fallbackState.queryCount++;
|
|
99
|
+
return {
|
|
100
|
+
text: `[Fallback] Response to: ${text.slice(0, 50)}...`,
|
|
101
|
+
confidence: 0.5,
|
|
102
|
+
model: 'fallback',
|
|
103
|
+
contextSize: 512,
|
|
104
|
+
latencyMs: 1.0,
|
|
105
|
+
requestId: `fb-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Generate text with SIMD-optimized inference
|
|
110
|
+
*/
|
|
111
|
+
generate(prompt, config) {
|
|
112
|
+
if (this.native) {
|
|
113
|
+
return this.native.generate(prompt, toNativeGenConfig(config));
|
|
114
|
+
}
|
|
115
|
+
// Fallback
|
|
116
|
+
return `[Fallback] Generated response for: ${prompt.slice(0, 50)}...`;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get routing decision for a query
|
|
120
|
+
*/
|
|
121
|
+
route(text) {
|
|
122
|
+
if (this.native) {
|
|
123
|
+
const result = this.native.route(text);
|
|
124
|
+
return {
|
|
125
|
+
model: result.model,
|
|
126
|
+
contextSize: result.context_size,
|
|
127
|
+
temperature: result.temperature,
|
|
128
|
+
topP: result.top_p,
|
|
129
|
+
confidence: result.confidence,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// Fallback
|
|
133
|
+
return {
|
|
134
|
+
model: 'M700',
|
|
135
|
+
contextSize: 512,
|
|
136
|
+
temperature: 0.7,
|
|
137
|
+
topP: 0.9,
|
|
138
|
+
confidence: 0.5,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Search memory for similar content
|
|
143
|
+
*/
|
|
144
|
+
searchMemory(text, k = 10) {
|
|
145
|
+
if (this.native) {
|
|
146
|
+
const results = this.native.searchMemory(text, k);
|
|
147
|
+
return results.map(r => ({
|
|
148
|
+
id: r.id,
|
|
149
|
+
score: r.score,
|
|
150
|
+
content: r.content,
|
|
151
|
+
metadata: JSON.parse(r.metadata || '{}'),
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
// Fallback - simple search
|
|
155
|
+
return Array.from(this.fallbackState.memory.entries())
|
|
156
|
+
.slice(0, k)
|
|
157
|
+
.map(([id, data]) => ({
|
|
158
|
+
id,
|
|
159
|
+
score: 0.5,
|
|
160
|
+
content: data.content,
|
|
161
|
+
metadata: data.metadata,
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Add content to memory
|
|
166
|
+
*/
|
|
167
|
+
addMemory(content, metadata) {
|
|
168
|
+
if (this.native) {
|
|
169
|
+
return this.native.addMemory(content, metadata ? JSON.stringify(metadata) : undefined);
|
|
170
|
+
}
|
|
171
|
+
// Fallback
|
|
172
|
+
const id = this.fallbackState.nextId++;
|
|
173
|
+
this.fallbackState.memory.set(id, {
|
|
174
|
+
content,
|
|
175
|
+
embedding: this.embed(content),
|
|
176
|
+
metadata: metadata ?? {},
|
|
177
|
+
});
|
|
178
|
+
return id;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Provide feedback for learning
|
|
182
|
+
*/
|
|
183
|
+
feedback(fb) {
|
|
184
|
+
if (this.native) {
|
|
185
|
+
return this.native.feedback(fb.requestId, fb.rating, fb.correction);
|
|
186
|
+
}
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get engine statistics
|
|
191
|
+
*/
|
|
192
|
+
stats() {
|
|
193
|
+
if (this.native) {
|
|
194
|
+
const s = this.native.stats();
|
|
195
|
+
return {
|
|
196
|
+
totalQueries: s.total_queries,
|
|
197
|
+
memoryNodes: s.memory_nodes,
|
|
198
|
+
patternsLearned: s.patterns_learned,
|
|
199
|
+
avgLatencyMs: s.avg_latency_ms,
|
|
200
|
+
cacheHitRate: s.cache_hit_rate,
|
|
201
|
+
routerAccuracy: s.router_accuracy,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
// Fallback
|
|
205
|
+
return {
|
|
206
|
+
totalQueries: this.fallbackState.queryCount,
|
|
207
|
+
memoryNodes: this.fallbackState.memory.size,
|
|
208
|
+
patternsLearned: 0,
|
|
209
|
+
avgLatencyMs: 1.0,
|
|
210
|
+
cacheHitRate: 0.0,
|
|
211
|
+
routerAccuracy: 0.5,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Force router learning cycle
|
|
216
|
+
*/
|
|
217
|
+
forceLearn() {
|
|
218
|
+
if (this.native) {
|
|
219
|
+
return this.native.forceLearn();
|
|
220
|
+
}
|
|
221
|
+
return 'Learning not available in fallback mode';
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get embedding for text
|
|
225
|
+
*/
|
|
226
|
+
embed(text) {
|
|
227
|
+
if (this.native) {
|
|
228
|
+
return this.native.embed(text);
|
|
229
|
+
}
|
|
230
|
+
// Fallback - simple hash-based embedding
|
|
231
|
+
const dim = this.config.embeddingDim ?? 768;
|
|
232
|
+
const embedding = new Array(dim).fill(0);
|
|
233
|
+
for (let i = 0; i < text.length; i++) {
|
|
234
|
+
const idx = (text.charCodeAt(i) * (i + 1)) % dim;
|
|
235
|
+
embedding[idx] += 0.1;
|
|
236
|
+
}
|
|
237
|
+
// Normalize
|
|
238
|
+
const norm = Math.sqrt(embedding.reduce((sum, x) => sum + x * x, 0)) || 1;
|
|
239
|
+
return embedding.map(x => x / norm);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Compute similarity between two texts
|
|
243
|
+
*/
|
|
244
|
+
similarity(text1, text2) {
|
|
245
|
+
if (this.native) {
|
|
246
|
+
return this.native.similarity(text1, text2);
|
|
247
|
+
}
|
|
248
|
+
// Fallback - cosine similarity
|
|
249
|
+
const emb1 = this.embed(text1);
|
|
250
|
+
const emb2 = this.embed(text2);
|
|
251
|
+
let dot = 0;
|
|
252
|
+
let norm1 = 0;
|
|
253
|
+
let norm2 = 0;
|
|
254
|
+
for (let i = 0; i < emb1.length; i++) {
|
|
255
|
+
dot += emb1[i] * emb2[i];
|
|
256
|
+
norm1 += emb1[i] * emb1[i];
|
|
257
|
+
norm2 += emb2[i] * emb2[i];
|
|
258
|
+
}
|
|
259
|
+
const denom = Math.sqrt(norm1) * Math.sqrt(norm2);
|
|
260
|
+
const similarity = denom > 0 ? dot / denom : 0;
|
|
261
|
+
// Clamp to [0, 1] to handle floating point errors
|
|
262
|
+
return Math.max(0, Math.min(1, similarity));
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Check if SIMD is available
|
|
266
|
+
*/
|
|
267
|
+
hasSimd() {
|
|
268
|
+
if (this.native) {
|
|
269
|
+
return this.native.hasSimd();
|
|
270
|
+
}
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Get SIMD capabilities
|
|
275
|
+
*/
|
|
276
|
+
simdCapabilities() {
|
|
277
|
+
if (this.native) {
|
|
278
|
+
return this.native.simdCapabilities();
|
|
279
|
+
}
|
|
280
|
+
return ['Scalar (fallback)'];
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Batch query multiple prompts
|
|
284
|
+
*/
|
|
285
|
+
batchQuery(request) {
|
|
286
|
+
const start = Date.now();
|
|
287
|
+
const responses = request.queries.map(q => this.query(q, request.config));
|
|
288
|
+
return {
|
|
289
|
+
responses,
|
|
290
|
+
totalLatencyMs: Date.now() - start,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Check if native module is loaded
|
|
295
|
+
*/
|
|
296
|
+
isNativeLoaded() {
|
|
297
|
+
return this.native !== null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
exports.RuvLLM = RuvLLM;
|
|
301
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQWVILHFDQUtrQjtBQUVsQjs7R0FFRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQXFCO0lBQzNDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFOUIsT0FBTztRQUNMLGFBQWEsRUFBRSxNQUFNLENBQUMsWUFBWTtRQUNsQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsZUFBZTtRQUN6QyxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7UUFDcEIsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLGtCQUFrQjtRQUMvQyxjQUFjLEVBQUUsTUFBTSxDQUFDLFlBQVk7UUFDbkMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGVBQWU7UUFDeEMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtRQUMxQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVM7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsaUJBQWlCLENBQUMsTUFBeUI7SUFDbEQsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU5QixPQUFPO1FBQ0wsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTO1FBQzVCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztRQUMvQixLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDbEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2xCLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7S0FDN0MsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQWEsTUFBTTtJQVdqQjs7T0FFRztJQUNILFlBQVksTUFBcUI7UUFiekIsV0FBTSxHQUF3QixJQUFJLENBQUM7UUFHM0MseURBQXlEO1FBQ2pELGtCQUFhLEdBQUc7WUFDdEIsTUFBTSxFQUFFLElBQUksR0FBRyxFQUF1RjtZQUN0RyxNQUFNLEVBQUUsQ0FBQztZQUNULFVBQVUsRUFBRSxDQUFDO1NBQ2QsQ0FBQztRQU1BLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUUzQixNQUFNLEdBQUcsR0FBRyxJQUFBLHdCQUFlLEdBQUUsQ0FBQztRQUM5QixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsMENBQTBDO1lBQzVDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQVksRUFBRSxNQUF5QjtRQUMzQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNsRSxPQUFPO2dCQUNMLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUM3QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLFdBQVcsRUFBRSxNQUFNLENBQUMsWUFBWTtnQkFDaEMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUM1QixTQUFTLEVBQUUsTUFBTSxDQUFDLFVBQVU7YUFDN0IsQ0FBQztRQUNKLENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLDJCQUEyQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSztZQUN2RCxVQUFVLEVBQUUsR0FBRztZQUNmLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLFNBQVMsRUFBRSxHQUFHO1lBQ2QsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ3JFLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsTUFBYyxFQUFFLE1BQXlCO1FBQ2hELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELFdBQVc7UUFDWCxPQUFPLHNDQUFzQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxJQUFZO1FBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFZO2dCQUMxQixXQUFXLEVBQUUsTUFBTSxDQUFDLFlBQVk7Z0JBQ2hDLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztnQkFDL0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNsQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7YUFDOUIsQ0FBQztRQUNKLENBQUM7UUFFRCxXQUFXO1FBQ1gsT0FBTztZQUNMLEtBQUssRUFBRSxNQUFNO1lBQ2IsV0FBVyxFQUFFLEdBQUc7WUFDaEIsV0FBVyxFQUFFLEdBQUc7WUFDaEIsSUFBSSxFQUFFLEdBQUc7WUFDVCxVQUFVLEVBQUUsR0FBRztTQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLElBQVksRUFBRSxDQUFDLEdBQUcsRUFBRTtRQUMvQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUNSLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztnQkFDZCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87Z0JBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO2FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztRQUVELDJCQUEyQjtRQUMzQixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDbkQsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwQixFQUFFO1lBQ0YsS0FBSyxFQUFFLEdBQUc7WUFDVixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLE9BQWUsRUFBRSxRQUFrQztRQUMzRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7UUFFRCxXQUFXO1FBQ1gsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO1lBQ2hDLE9BQU87WUFDUCxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDOUIsUUFBUSxFQUFFLFFBQVEsSUFBSSxFQUFFO1NBQ3pCLENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUSxDQUFDLEVBQVk7UUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLENBQUMsQ0FBQyxhQUFhO2dCQUM3QixXQUFXLEVBQUUsQ0FBQyxDQUFDLFlBQVk7Z0JBQzNCLGVBQWUsRUFBRSxDQUFDLENBQUMsZ0JBQWdCO2dCQUNuQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLGNBQWM7Z0JBQzlCLFlBQVksRUFBRSxDQUFDLENBQUMsY0FBYztnQkFDOUIsY0FBYyxFQUFFLENBQUMsQ0FBQyxlQUFlO2FBQ2xDLENBQUM7UUFDSixDQUFDO1FBRUQsV0FBVztRQUNYLE9BQU87WUFDTCxZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVO1lBQzNDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQzNDLGVBQWUsRUFBRSxDQUFDO1lBQ2xCLFlBQVksRUFBRSxHQUFHO1lBQ2pCLFlBQVksRUFBRSxHQUFHO1lBQ2pCLGNBQWMsRUFBRSxHQUFHO1NBQ3BCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLHlDQUF5QyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxJQUFZO1FBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUVELHlDQUF5QztRQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUM7UUFDNUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2pELFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7UUFDeEIsQ0FBQztRQUVELFlBQVk7UUFDWixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRSxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQ3JDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9CLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUVkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxNQUFNLFVBQVUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0Msa0RBQWtEO1FBQ2xELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsT0FBMEI7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDMUUsT0FBTztZQUNMLFNBQVM7WUFDVCxjQUFjLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUs7U0FDbkMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQTlRRCx3QkE4UUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJ1dkxMTSBFbmdpbmUgLSBNYWluIG9yY2hlc3RyYXRvciBmb3Igc2VsZi1sZWFybmluZyBMTE1cbiAqL1xuXG5pbXBvcnQge1xuICBSdXZMTE1Db25maWcsXG4gIEdlbmVyYXRpb25Db25maWcsXG4gIFF1ZXJ5UmVzcG9uc2UsXG4gIFJvdXRpbmdEZWNpc2lvbixcbiAgTWVtb3J5UmVzdWx0LFxuICBSdXZMTE1TdGF0cyxcbiAgRmVlZGJhY2ssXG4gIEVtYmVkZGluZyxcbiAgQmF0Y2hRdWVyeVJlcXVlc3QsXG4gIEJhdGNoUXVlcnlSZXNwb25zZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7XG4gIGdldE5hdGl2ZU1vZHVsZSxcbiAgTmF0aXZlRW5naW5lLFxuICBOYXRpdmVDb25maWcsXG4gIE5hdGl2ZUdlbkNvbmZpZyxcbn0gZnJvbSAnLi9uYXRpdmUnO1xuXG4vKipcbiAqIENvbnZlcnQgSlMgY29uZmlnIHRvIG5hdGl2ZSBjb25maWcgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIHRvTmF0aXZlQ29uZmlnKGNvbmZpZz86IFJ1dkxMTUNvbmZpZyk6IE5hdGl2ZUNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgZW1iZWRkaW5nX2RpbTogY29uZmlnLmVtYmVkZGluZ0RpbSxcbiAgICByb3V0ZXJfaGlkZGVuX2RpbTogY29uZmlnLnJvdXRlckhpZGRlbkRpbSxcbiAgICBobnN3X206IGNvbmZpZy5obnN3TSxcbiAgICBobnN3X2VmX2NvbnN0cnVjdGlvbjogY29uZmlnLmhuc3dFZkNvbnN0cnVjdGlvbixcbiAgICBobnN3X2VmX3NlYXJjaDogY29uZmlnLmhuc3dFZlNlYXJjaCxcbiAgICBsZWFybmluZ19lbmFibGVkOiBjb25maWcubGVhcm5pbmdFbmFibGVkLFxuICAgIHF1YWxpdHlfdGhyZXNob2xkOiBjb25maWcucXVhbGl0eVRocmVzaG9sZCxcbiAgICBld2NfbGFtYmRhOiBjb25maWcuZXdjTGFtYmRhLFxuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnQgSlMgZ2VuZXJhdGlvbiBjb25maWcgdG8gbmF0aXZlIGZvcm1hdFxuICovXG5mdW5jdGlvbiB0b05hdGl2ZUdlbkNvbmZpZyhjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKTogTmF0aXZlR2VuQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBtYXhfdG9rZW5zOiBjb25maWcubWF4VG9rZW5zLFxuICAgIHRlbXBlcmF0dXJlOiBjb25maWcudGVtcGVyYXR1cmUsXG4gICAgdG9wX3A6IGNvbmZpZy50b3BQLFxuICAgIHRvcF9rOiBjb25maWcudG9wSyxcbiAgICByZXBldGl0aW9uX3BlbmFsdHk6IGNvbmZpZy5yZXBldGl0aW9uUGVuYWx0eSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSdXZMTE0gLSBTZWxmLWxlYXJuaW5nIExMTSBvcmNoZXN0cmF0b3JcbiAqXG4gKiBDb21iaW5lcyBTT05BIGFkYXB0aXZlIGxlYXJuaW5nIHdpdGggSE5TVyBtZW1vcnksXG4gKiBGYXN0R1JOTiByb3V0aW5nLCBhbmQgU0lNRC1vcHRpbWl6ZWQgaW5mZXJlbmNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBSdXZMTE0gfSBmcm9tICdAcnV2ZWN0b3IvcnV2bGxtJztcbiAqXG4gKiBjb25zdCBsbG0gPSBuZXcgUnV2TExNKHsgZW1iZWRkaW5nRGltOiA3NjggfSk7XG4gKlxuICogLy8gUXVlcnkgd2l0aCBhdXRvbWF0aWMgcm91dGluZ1xuICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBsbG0ucXVlcnkoJ1doYXQgaXMgbWFjaGluZSBsZWFybmluZz8nKTtcbiAqIGNvbnNvbGUubG9nKHJlc3BvbnNlLnRleHQpO1xuICpcbiAqIC8vIFByb3ZpZGUgZmVlZGJhY2sgZm9yIGxlYXJuaW5nXG4gKiBsbG0uZmVlZGJhY2soeyByZXF1ZXN0SWQ6IHJlc3BvbnNlLnJlcXVlc3RJZCwgcmF0aW5nOiA1IH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSdXZMTE0ge1xuICBwcml2YXRlIG5hdGl2ZTogTmF0aXZlRW5naW5lIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29uZmlnOiBSdXZMTE1Db25maWc7XG5cbiAgLy8gRmFsbGJhY2sgc3RhdGUgZm9yIHdoZW4gbmF0aXZlIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlXG4gIHByaXZhdGUgZmFsbGJhY2tTdGF0ZSA9IHtcbiAgICBtZW1vcnk6IG5ldyBNYXA8bnVtYmVyLCB7IGNvbnRlbnQ6IHN0cmluZzsgZW1iZWRkaW5nOiBudW1iZXJbXTsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KCksXG4gICAgbmV4dElkOiAxLFxuICAgIHF1ZXJ5Q291bnQ6IDAsXG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBSdXZMTE0gaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IFJ1dkxMTUNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnID8/IHt9O1xuXG4gICAgY29uc3QgbW9kID0gZ2V0TmF0aXZlTW9kdWxlKCk7XG4gICAgaWYgKG1vZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5uYXRpdmUgPSBuZXcgbW9kLlJ1dkxMTUVuZ2luZSh0b05hdGl2ZUNvbmZpZyhjb25maWcpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTaWxlbnRseSBmYWxsIGJhY2sgdG8gSlMgaW1wbGVtZW50YXRpb25cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUXVlcnkgdGhlIExMTSB3aXRoIGF1dG9tYXRpYyByb3V0aW5nXG4gICAqL1xuICBxdWVyeSh0ZXh0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBRdWVyeVJlc3BvbnNlIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlLnF1ZXJ5KHRleHQsIHRvTmF0aXZlR2VuQ29uZmlnKGNvbmZpZykpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgICAgIGNvbmZpZGVuY2U6IHJlc3VsdC5jb25maWRlbmNlLFxuICAgICAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgICAgICBjb250ZXh0U2l6ZTogcmVzdWx0LmNvbnRleHRfc2l6ZSxcbiAgICAgICAgbGF0ZW5jeU1zOiByZXN1bHQubGF0ZW5jeV9tcyxcbiAgICAgICAgcmVxdWVzdElkOiByZXN1bHQucmVxdWVzdF9pZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgaW1wbGVtZW50YXRpb25cbiAgICB0aGlzLmZhbGxiYWNrU3RhdGUucXVlcnlDb3VudCsrO1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiBgW0ZhbGxiYWNrXSBSZXNwb25zZSB0bzogJHt0ZXh0LnNsaWNlKDAsIDUwKX0uLi5gLFxuICAgICAgY29uZmlkZW5jZTogMC41LFxuICAgICAgbW9kZWw6ICdmYWxsYmFjaycsXG4gICAgICBjb250ZXh0U2l6ZTogNTEyLFxuICAgICAgbGF0ZW5jeU1zOiAxLjAsXG4gICAgICByZXF1ZXN0SWQ6IGBmYi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRleHQgd2l0aCBTSU1ELW9wdGltaXplZCBpbmZlcmVuY2VcbiAgICovXG4gIGdlbmVyYXRlKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5nZW5lcmF0ZShwcm9tcHQsIHRvTmF0aXZlR2VuQ29uZmlnKGNvbmZpZykpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrXG4gICAgcmV0dXJuIGBbRmFsbGJhY2tdIEdlbmVyYXRlZCByZXNwb25zZSBmb3I6ICR7cHJvbXB0LnNsaWNlKDAsIDUwKX0uLi5gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByb3V0aW5nIGRlY2lzaW9uIGZvciBhIHF1ZXJ5XG4gICAqL1xuICByb3V0ZSh0ZXh0OiBzdHJpbmcpOiBSb3V0aW5nRGVjaXNpb24ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmUucm91dGUodGV4dCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2RlbDogcmVzdWx0Lm1vZGVsIGFzIGFueSxcbiAgICAgICAgY29udGV4dFNpemU6IHJlc3VsdC5jb250ZXh0X3NpemUsXG4gICAgICAgIHRlbXBlcmF0dXJlOiByZXN1bHQudGVtcGVyYXR1cmUsXG4gICAgICAgIHRvcFA6IHJlc3VsdC50b3BfcCxcbiAgICAgICAgY29uZmlkZW5jZTogcmVzdWx0LmNvbmZpZGVuY2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsOiAnTTcwMCcsXG4gICAgICBjb250ZXh0U2l6ZTogNTEyLFxuICAgICAgdGVtcGVyYXR1cmU6IDAuNyxcbiAgICAgIHRvcFA6IDAuOSxcbiAgICAgIGNvbmZpZGVuY2U6IDAuNSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBtZW1vcnkgZm9yIHNpbWlsYXIgY29udGVudFxuICAgKi9cbiAgc2VhcmNoTWVtb3J5KHRleHQ6IHN0cmluZywgayA9IDEwKTogTWVtb3J5UmVzdWx0W10ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMubmF0aXZlLnNlYXJjaE1lbW9yeSh0ZXh0LCBrKTtcbiAgICAgIHJldHVybiByZXN1bHRzLm1hcChyID0+ICh7XG4gICAgICAgIGlkOiByLmlkLFxuICAgICAgICBzY29yZTogci5zY29yZSxcbiAgICAgICAgY29udGVudDogci5jb250ZW50LFxuICAgICAgICBtZXRhZGF0YTogSlNPTi5wYXJzZShyLm1ldGFkYXRhIHx8ICd7fScpLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIC0gc2ltcGxlIHNlYXJjaFxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZmFsbGJhY2tTdGF0ZS5tZW1vcnkuZW50cmllcygpKVxuICAgICAgLnNsaWNlKDAsIGspXG4gICAgICAubWFwKChbaWQsIGRhdGFdKSA9PiAoe1xuICAgICAgICBpZCxcbiAgICAgICAgc2NvcmU6IDAuNSxcbiAgICAgICAgY29udGVudDogZGF0YS5jb250ZW50LFxuICAgICAgICBtZXRhZGF0YTogZGF0YS5tZXRhZGF0YSxcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgY29udGVudCB0byBtZW1vcnlcbiAgICovXG4gIGFkZE1lbW9yeShjb250ZW50OiBzdHJpbmcsIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBudW1iZXIge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmFkZE1lbW9yeShjb250ZW50LCBtZXRhZGF0YSA/IEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2tcbiAgICBjb25zdCBpZCA9IHRoaXMuZmFsbGJhY2tTdGF0ZS5uZXh0SWQrKztcbiAgICB0aGlzLmZhbGxiYWNrU3RhdGUubWVtb3J5LnNldChpZCwge1xuICAgICAgY29udGVudCxcbiAgICAgIGVtYmVkZGluZzogdGhpcy5lbWJlZChjb250ZW50KSxcbiAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSA/PyB7fSxcbiAgICB9KTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBmZWVkYmFjayBmb3IgbGVhcm5pbmdcbiAgICovXG4gIGZlZWRiYWNrKGZiOiBGZWVkYmFjayk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmZlZWRiYWNrKGZiLnJlcXVlc3RJZCwgZmIucmF0aW5nLCBmYi5jb3JyZWN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbmdpbmUgc3RhdGlzdGljc1xuICAgKi9cbiAgc3RhdHMoKTogUnV2TExNU3RhdHMge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgY29uc3QgcyA9IHRoaXMubmF0aXZlLnN0YXRzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b3RhbFF1ZXJpZXM6IHMudG90YWxfcXVlcmllcyxcbiAgICAgICAgbWVtb3J5Tm9kZXM6IHMubWVtb3J5X25vZGVzLFxuICAgICAgICBwYXR0ZXJuc0xlYXJuZWQ6IHMucGF0dGVybnNfbGVhcm5lZCxcbiAgICAgICAgYXZnTGF0ZW5jeU1zOiBzLmF2Z19sYXRlbmN5X21zLFxuICAgICAgICBjYWNoZUhpdFJhdGU6IHMuY2FjaGVfaGl0X3JhdGUsXG4gICAgICAgIHJvdXRlckFjY3VyYWN5OiBzLnJvdXRlcl9hY2N1cmFjeSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2tcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxRdWVyaWVzOiB0aGlzLmZhbGxiYWNrU3RhdGUucXVlcnlDb3VudCxcbiAgICAgIG1lbW9yeU5vZGVzOiB0aGlzLmZhbGxiYWNrU3RhdGUubWVtb3J5LnNpemUsXG4gICAgICBwYXR0ZXJuc0xlYXJuZWQ6IDAsXG4gICAgICBhdmdMYXRlbmN5TXM6IDEuMCxcbiAgICAgIGNhY2hlSGl0UmF0ZTogMC4wLFxuICAgICAgcm91dGVyQWNjdXJhY3k6IDAuNSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIHJvdXRlciBsZWFybmluZyBjeWNsZVxuICAgKi9cbiAgZm9yY2VMZWFybigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmZvcmNlTGVhcm4oKTtcbiAgICB9XG4gICAgcmV0dXJuICdMZWFybmluZyBub3QgYXZhaWxhYmxlIGluIGZhbGxiYWNrIG1vZGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbWJlZGRpbmcgZm9yIHRleHRcbiAgICovXG4gIGVtYmVkKHRleHQ6IHN0cmluZyk6IEVtYmVkZGluZyB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZW1iZWQodGV4dCk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgLSBzaW1wbGUgaGFzaC1iYXNlZCBlbWJlZGRpbmdcbiAgICBjb25zdCBkaW0gPSB0aGlzLmNvbmZpZy5lbWJlZGRpbmdEaW0gPz8gNzY4O1xuICAgIGNvbnN0IGVtYmVkZGluZyA9IG5ldyBBcnJheShkaW0pLmZpbGwoMCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGlkeCA9ICh0ZXh0LmNoYXJDb2RlQXQoaSkgKiAoaSArIDEpKSAlIGRpbTtcbiAgICAgIGVtYmVkZGluZ1tpZHhdICs9IDAuMTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemVcbiAgICBjb25zdCBub3JtID0gTWF0aC5zcXJ0KGVtYmVkZGluZy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeCAqIHgsIDApKSB8fCAxO1xuICAgIHJldHVybiBlbWJlZGRpbmcubWFwKHggPT4geCAvIG5vcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgc2ltaWxhcml0eSBiZXR3ZWVuIHR3byB0ZXh0c1xuICAgKi9cbiAgc2ltaWxhcml0eSh0ZXh0MTogc3RyaW5nLCB0ZXh0Mjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5zaW1pbGFyaXR5KHRleHQxLCB0ZXh0Mik7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgLSBjb3NpbmUgc2ltaWxhcml0eVxuICAgIGNvbnN0IGVtYjEgPSB0aGlzLmVtYmVkKHRleHQxKTtcbiAgICBjb25zdCBlbWIyID0gdGhpcy5lbWJlZCh0ZXh0Mik7XG5cbiAgICBsZXQgZG90ID0gMDtcbiAgICBsZXQgbm9ybTEgPSAwO1xuICAgIGxldCBub3JtMiA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVtYjEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRvdCArPSBlbWIxW2ldICogZW1iMltpXTtcbiAgICAgIG5vcm0xICs9IGVtYjFbaV0gKiBlbWIxW2ldO1xuICAgICAgbm9ybTIgKz0gZW1iMltpXSAqIGVtYjJbaV07XG4gICAgfVxuXG4gICAgY29uc3QgZGVub20gPSBNYXRoLnNxcnQobm9ybTEpICogTWF0aC5zcXJ0KG5vcm0yKTtcbiAgICBjb25zdCBzaW1pbGFyaXR5ID0gZGVub20gPiAwID8gZG90IC8gZGVub20gOiAwO1xuICAgIC8vIENsYW1wIHRvIFswLCAxXSB0byBoYW5kbGUgZmxvYXRpbmcgcG9pbnQgZXJyb3JzXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHNpbWlsYXJpdHkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBTSU1EIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgaGFzU2ltZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5oYXNTaW1kKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgU0lNRCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIHNpbWRDYXBhYmlsaXRpZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLnNpbWRDYXBhYmlsaXRpZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIFsnU2NhbGFyIChmYWxsYmFjayknXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBxdWVyeSBtdWx0aXBsZSBwcm9tcHRzXG4gICAqL1xuICBiYXRjaFF1ZXJ5KHJlcXVlc3Q6IEJhdGNoUXVlcnlSZXF1ZXN0KTogQmF0Y2hRdWVyeVJlc3BvbnNlIHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVxdWVzdC5xdWVyaWVzLm1hcChxID0+IHRoaXMucXVlcnkocSwgcmVxdWVzdC5jb25maWcpKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzcG9uc2VzLFxuICAgICAgdG90YWxMYXRlbmN5TXM6IERhdGUubm93KCkgLSBzdGFydCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG5hdGl2ZSBtb2R1bGUgaXMgbG9hZGVkXG4gICAqL1xuICBpc05hdGl2ZUxvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYXRpdmUgIT09IG51bGw7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export/Serialization for SONA Models
|
|
3
|
+
*
|
|
4
|
+
* Support for SafeTensors, JSON, and other export formats.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { ModelExporter, SafeTensorsWriter } from '@ruvector/ruvllm';
|
|
9
|
+
*
|
|
10
|
+
* // Export model to SafeTensors format
|
|
11
|
+
* const exporter = new ModelExporter();
|
|
12
|
+
* const buffer = exporter.toSafeTensors({
|
|
13
|
+
* weights: loraAdapter.getWeights(),
|
|
14
|
+
* config: loraAdapter.getConfig(),
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* // Save to file
|
|
18
|
+
* fs.writeFileSync('model.safetensors', buffer);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { LoRAConfig, LearnedPattern, EwcStats, Embedding, ModelMetadata } from './types';
|
|
22
|
+
import { LoraWeights } from './lora';
|
|
23
|
+
/**
|
|
24
|
+
* Exportable model data
|
|
25
|
+
*/
|
|
26
|
+
export interface ExportableModel {
|
|
27
|
+
/** Model metadata */
|
|
28
|
+
metadata: ModelMetadata;
|
|
29
|
+
/** LoRA weights (if applicable) */
|
|
30
|
+
loraWeights?: LoraWeights;
|
|
31
|
+
/** LoRA config */
|
|
32
|
+
loraConfig?: LoRAConfig;
|
|
33
|
+
/** Learned patterns */
|
|
34
|
+
patterns?: LearnedPattern[];
|
|
35
|
+
/** EWC statistics */
|
|
36
|
+
ewcStats?: EwcStats;
|
|
37
|
+
/** Raw tensors */
|
|
38
|
+
tensors?: Map<string, Float32Array>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* SafeTensors Writer
|
|
42
|
+
*
|
|
43
|
+
* Writes tensors in SafeTensors format for compatibility with
|
|
44
|
+
* HuggingFace ecosystem.
|
|
45
|
+
*/
|
|
46
|
+
export declare class SafeTensorsWriter {
|
|
47
|
+
private tensors;
|
|
48
|
+
private metadata;
|
|
49
|
+
/**
|
|
50
|
+
* Add a tensor
|
|
51
|
+
*/
|
|
52
|
+
addTensor(name: string, data: Float32Array, shape: number[]): this;
|
|
53
|
+
/**
|
|
54
|
+
* Add 2D tensor from number array
|
|
55
|
+
*/
|
|
56
|
+
add2D(name: string, data: number[][]): this;
|
|
57
|
+
/**
|
|
58
|
+
* Add 1D tensor from number array
|
|
59
|
+
*/
|
|
60
|
+
add1D(name: string, data: number[]): this;
|
|
61
|
+
/**
|
|
62
|
+
* Add metadata
|
|
63
|
+
*/
|
|
64
|
+
addMetadata(key: string, value: string): this;
|
|
65
|
+
/**
|
|
66
|
+
* Build SafeTensors buffer
|
|
67
|
+
*/
|
|
68
|
+
build(): Uint8Array;
|
|
69
|
+
/**
|
|
70
|
+
* Clear all tensors and metadata
|
|
71
|
+
*/
|
|
72
|
+
clear(): void;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* SafeTensors Reader
|
|
76
|
+
*
|
|
77
|
+
* Reads tensors from SafeTensors format.
|
|
78
|
+
*/
|
|
79
|
+
export declare class SafeTensorsReader {
|
|
80
|
+
private buffer;
|
|
81
|
+
private header;
|
|
82
|
+
private dataOffset;
|
|
83
|
+
constructor(buffer: Uint8Array);
|
|
84
|
+
/**
|
|
85
|
+
* Get tensor names
|
|
86
|
+
*/
|
|
87
|
+
getTensorNames(): string[];
|
|
88
|
+
/**
|
|
89
|
+
* Get tensor by name
|
|
90
|
+
*/
|
|
91
|
+
getTensor(name: string): {
|
|
92
|
+
data: Float32Array;
|
|
93
|
+
shape: number[];
|
|
94
|
+
} | null;
|
|
95
|
+
/**
|
|
96
|
+
* Get tensor as 2D array
|
|
97
|
+
*/
|
|
98
|
+
getTensor2D(name: string): number[][] | null;
|
|
99
|
+
/**
|
|
100
|
+
* Get tensor as 1D array
|
|
101
|
+
*/
|
|
102
|
+
getTensor1D(name: string): number[] | null;
|
|
103
|
+
/**
|
|
104
|
+
* Get metadata
|
|
105
|
+
*/
|
|
106
|
+
getMetadata(): Record<string, string>;
|
|
107
|
+
private parseHeader;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Model Exporter
|
|
111
|
+
*
|
|
112
|
+
* Unified export interface for SONA models.
|
|
113
|
+
*/
|
|
114
|
+
export declare class ModelExporter {
|
|
115
|
+
/**
|
|
116
|
+
* Export to SafeTensors format
|
|
117
|
+
*/
|
|
118
|
+
toSafeTensors(model: ExportableModel): Uint8Array;
|
|
119
|
+
/**
|
|
120
|
+
* Export to JSON format
|
|
121
|
+
*/
|
|
122
|
+
toJSON(model: ExportableModel): string;
|
|
123
|
+
/**
|
|
124
|
+
* Export to compact binary format
|
|
125
|
+
*/
|
|
126
|
+
toBinary(model: ExportableModel): Uint8Array;
|
|
127
|
+
/**
|
|
128
|
+
* Export for HuggingFace Hub compatibility
|
|
129
|
+
*/
|
|
130
|
+
toHuggingFace(model: ExportableModel): {
|
|
131
|
+
safetensors: Uint8Array;
|
|
132
|
+
config: string;
|
|
133
|
+
readme: string;
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Model Importer
|
|
138
|
+
*
|
|
139
|
+
* Import models from various formats.
|
|
140
|
+
*/
|
|
141
|
+
export declare class ModelImporter {
|
|
142
|
+
/**
|
|
143
|
+
* Import from SafeTensors format
|
|
144
|
+
*/
|
|
145
|
+
fromSafeTensors(buffer: Uint8Array): Partial<ExportableModel>;
|
|
146
|
+
/**
|
|
147
|
+
* Import from JSON format
|
|
148
|
+
*/
|
|
149
|
+
fromJSON(json: string): Partial<ExportableModel>;
|
|
150
|
+
/**
|
|
151
|
+
* Import from binary format
|
|
152
|
+
*/
|
|
153
|
+
fromBinary(buffer: Uint8Array): Partial<ExportableModel>;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Dataset Exporter
|
|
157
|
+
*
|
|
158
|
+
* Export training data in various formats.
|
|
159
|
+
*/
|
|
160
|
+
export declare class DatasetExporter {
|
|
161
|
+
/**
|
|
162
|
+
* Export to JSONL format (one JSON per line)
|
|
163
|
+
*/
|
|
164
|
+
toJSONL(data: Array<{
|
|
165
|
+
input: Embedding;
|
|
166
|
+
output: Embedding;
|
|
167
|
+
quality: number;
|
|
168
|
+
}>): string;
|
|
169
|
+
/**
|
|
170
|
+
* Export to CSV format
|
|
171
|
+
*/
|
|
172
|
+
toCSV(data: Array<{
|
|
173
|
+
input: Embedding;
|
|
174
|
+
output: Embedding;
|
|
175
|
+
quality: number;
|
|
176
|
+
}>): string;
|
|
177
|
+
/**
|
|
178
|
+
* Export patterns for pre-training
|
|
179
|
+
*/
|
|
180
|
+
toPretrain(patterns: LearnedPattern[]): string;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/export.ts"],"names":[],"mappings":"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"}
|