@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,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuvLLM Engine - Main orchestrator for self-learning LLM
|
|
3
|
+
*/
|
|
4
|
+
import { RuvLLMConfig, GenerationConfig, QueryResponse, RoutingDecision, MemoryResult, RuvLLMStats, Feedback, Embedding, BatchQueryRequest, BatchQueryResponse } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* RuvLLM - Self-learning LLM orchestrator
|
|
7
|
+
*
|
|
8
|
+
* Combines SONA adaptive learning with HNSW memory,
|
|
9
|
+
* FastGRNN routing, and SIMD-optimized inference.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { RuvLLM } from '@ruvector/ruvllm';
|
|
14
|
+
*
|
|
15
|
+
* const llm = new RuvLLM({ embeddingDim: 768 });
|
|
16
|
+
*
|
|
17
|
+
* // Query with automatic routing
|
|
18
|
+
* const response = await llm.query('What is machine learning?');
|
|
19
|
+
* console.log(response.text);
|
|
20
|
+
*
|
|
21
|
+
* // Provide feedback for learning
|
|
22
|
+
* llm.feedback({ requestId: response.requestId, rating: 5 });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare class RuvLLM {
|
|
26
|
+
private native;
|
|
27
|
+
private config;
|
|
28
|
+
private fallbackState;
|
|
29
|
+
/**
|
|
30
|
+
* Create a new RuvLLM instance
|
|
31
|
+
*/
|
|
32
|
+
constructor(config?: RuvLLMConfig);
|
|
33
|
+
/**
|
|
34
|
+
* Query the LLM with automatic routing
|
|
35
|
+
*/
|
|
36
|
+
query(text: string, config?: GenerationConfig): QueryResponse;
|
|
37
|
+
/**
|
|
38
|
+
* Generate text with SIMD-optimized inference
|
|
39
|
+
*/
|
|
40
|
+
generate(prompt: string, config?: GenerationConfig): string;
|
|
41
|
+
/**
|
|
42
|
+
* Get routing decision for a query
|
|
43
|
+
*/
|
|
44
|
+
route(text: string): RoutingDecision;
|
|
45
|
+
/**
|
|
46
|
+
* Search memory for similar content
|
|
47
|
+
*/
|
|
48
|
+
searchMemory(text: string, k?: number): MemoryResult[];
|
|
49
|
+
/**
|
|
50
|
+
* Add content to memory
|
|
51
|
+
*/
|
|
52
|
+
addMemory(content: string, metadata?: Record<string, unknown>): number;
|
|
53
|
+
/**
|
|
54
|
+
* Provide feedback for learning
|
|
55
|
+
*/
|
|
56
|
+
feedback(fb: Feedback): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Get engine statistics
|
|
59
|
+
*/
|
|
60
|
+
stats(): RuvLLMStats;
|
|
61
|
+
/**
|
|
62
|
+
* Force router learning cycle
|
|
63
|
+
*/
|
|
64
|
+
forceLearn(): string;
|
|
65
|
+
/**
|
|
66
|
+
* Get embedding for text
|
|
67
|
+
*/
|
|
68
|
+
embed(text: string): Embedding;
|
|
69
|
+
/**
|
|
70
|
+
* Compute similarity between two texts
|
|
71
|
+
*/
|
|
72
|
+
similarity(text1: string, text2: string): number;
|
|
73
|
+
/**
|
|
74
|
+
* Check if SIMD is available
|
|
75
|
+
*/
|
|
76
|
+
hasSimd(): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Get SIMD capabilities
|
|
79
|
+
*/
|
|
80
|
+
simdCapabilities(): string[];
|
|
81
|
+
/**
|
|
82
|
+
* Batch query multiple prompts
|
|
83
|
+
*/
|
|
84
|
+
batchQuery(request: BatchQueryRequest): BatchQueryResponse;
|
|
85
|
+
/**
|
|
86
|
+
* Check if native module is loaded
|
|
87
|
+
*/
|
|
88
|
+
isNativeLoaded(): boolean;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AA0CjB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,MAAM,CAAe;IAG7B,OAAO,CAAC,aAAa,CAInB;IAEF;;OAEG;gBACS,MAAM,CAAC,EAAE,YAAY;IAajC;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,aAAa;IAyB7D;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,MAAM;IAS3D;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IAsBpC;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,SAAK,GAAG,YAAY,EAAE;IAsBlD;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAetE;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO;IAO/B;;OAEG;IACH,KAAK,IAAI,WAAW;IAwBpB;;OAEG;IACH,UAAU,IAAI,MAAM;IAOpB;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAmB9B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAyBhD;;OAEG;IACH,OAAO,IAAI,OAAO;IAOlB;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAO5B;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,kBAAkB;IAS1D;;OAEG;IACH,cAAc,IAAI,OAAO;CAG1B"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuvLLM Engine - Main orchestrator for self-learning LLM
|
|
3
|
+
*/
|
|
4
|
+
import { getNativeModule, } from './native';
|
|
5
|
+
/**
|
|
6
|
+
* Convert JS config to native config format
|
|
7
|
+
*/
|
|
8
|
+
function toNativeConfig(config) {
|
|
9
|
+
if (!config)
|
|
10
|
+
return undefined;
|
|
11
|
+
return {
|
|
12
|
+
embedding_dim: config.embeddingDim,
|
|
13
|
+
router_hidden_dim: config.routerHiddenDim,
|
|
14
|
+
hnsw_m: config.hnswM,
|
|
15
|
+
hnsw_ef_construction: config.hnswEfConstruction,
|
|
16
|
+
hnsw_ef_search: config.hnswEfSearch,
|
|
17
|
+
learning_enabled: config.learningEnabled,
|
|
18
|
+
quality_threshold: config.qualityThreshold,
|
|
19
|
+
ewc_lambda: config.ewcLambda,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Convert JS generation config to native format
|
|
24
|
+
*/
|
|
25
|
+
function toNativeGenConfig(config) {
|
|
26
|
+
if (!config)
|
|
27
|
+
return undefined;
|
|
28
|
+
return {
|
|
29
|
+
max_tokens: config.maxTokens,
|
|
30
|
+
temperature: config.temperature,
|
|
31
|
+
top_p: config.topP,
|
|
32
|
+
top_k: config.topK,
|
|
33
|
+
repetition_penalty: config.repetitionPenalty,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* RuvLLM - Self-learning LLM orchestrator
|
|
38
|
+
*
|
|
39
|
+
* Combines SONA adaptive learning with HNSW memory,
|
|
40
|
+
* FastGRNN routing, and SIMD-optimized inference.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* import { RuvLLM } from '@ruvector/ruvllm';
|
|
45
|
+
*
|
|
46
|
+
* const llm = new RuvLLM({ embeddingDim: 768 });
|
|
47
|
+
*
|
|
48
|
+
* // Query with automatic routing
|
|
49
|
+
* const response = await llm.query('What is machine learning?');
|
|
50
|
+
* console.log(response.text);
|
|
51
|
+
*
|
|
52
|
+
* // Provide feedback for learning
|
|
53
|
+
* llm.feedback({ requestId: response.requestId, rating: 5 });
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export class RuvLLM {
|
|
57
|
+
/**
|
|
58
|
+
* Create a new RuvLLM instance
|
|
59
|
+
*/
|
|
60
|
+
constructor(config) {
|
|
61
|
+
this.native = null;
|
|
62
|
+
// Fallback state for when native module is not available
|
|
63
|
+
this.fallbackState = {
|
|
64
|
+
memory: new Map(),
|
|
65
|
+
nextId: 1,
|
|
66
|
+
queryCount: 0,
|
|
67
|
+
};
|
|
68
|
+
this.config = config ?? {};
|
|
69
|
+
const mod = getNativeModule();
|
|
70
|
+
if (mod) {
|
|
71
|
+
try {
|
|
72
|
+
this.native = new mod.RuvLLMEngine(toNativeConfig(config));
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Silently fall back to JS implementation
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Query the LLM with automatic routing
|
|
81
|
+
*/
|
|
82
|
+
query(text, config) {
|
|
83
|
+
if (this.native) {
|
|
84
|
+
const result = this.native.query(text, toNativeGenConfig(config));
|
|
85
|
+
return {
|
|
86
|
+
text: result.text,
|
|
87
|
+
confidence: result.confidence,
|
|
88
|
+
model: result.model,
|
|
89
|
+
contextSize: result.context_size,
|
|
90
|
+
latencyMs: result.latency_ms,
|
|
91
|
+
requestId: result.request_id,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Fallback implementation
|
|
95
|
+
this.fallbackState.queryCount++;
|
|
96
|
+
return {
|
|
97
|
+
text: `[Fallback] Response to: ${text.slice(0, 50)}...`,
|
|
98
|
+
confidence: 0.5,
|
|
99
|
+
model: 'fallback',
|
|
100
|
+
contextSize: 512,
|
|
101
|
+
latencyMs: 1.0,
|
|
102
|
+
requestId: `fb-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Generate text with SIMD-optimized inference
|
|
107
|
+
*/
|
|
108
|
+
generate(prompt, config) {
|
|
109
|
+
if (this.native) {
|
|
110
|
+
return this.native.generate(prompt, toNativeGenConfig(config));
|
|
111
|
+
}
|
|
112
|
+
// Fallback
|
|
113
|
+
return `[Fallback] Generated response for: ${prompt.slice(0, 50)}...`;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get routing decision for a query
|
|
117
|
+
*/
|
|
118
|
+
route(text) {
|
|
119
|
+
if (this.native) {
|
|
120
|
+
const result = this.native.route(text);
|
|
121
|
+
return {
|
|
122
|
+
model: result.model,
|
|
123
|
+
contextSize: result.context_size,
|
|
124
|
+
temperature: result.temperature,
|
|
125
|
+
topP: result.top_p,
|
|
126
|
+
confidence: result.confidence,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Fallback
|
|
130
|
+
return {
|
|
131
|
+
model: 'M700',
|
|
132
|
+
contextSize: 512,
|
|
133
|
+
temperature: 0.7,
|
|
134
|
+
topP: 0.9,
|
|
135
|
+
confidence: 0.5,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Search memory for similar content
|
|
140
|
+
*/
|
|
141
|
+
searchMemory(text, k = 10) {
|
|
142
|
+
if (this.native) {
|
|
143
|
+
const results = this.native.searchMemory(text, k);
|
|
144
|
+
return results.map(r => ({
|
|
145
|
+
id: r.id,
|
|
146
|
+
score: r.score,
|
|
147
|
+
content: r.content,
|
|
148
|
+
metadata: JSON.parse(r.metadata || '{}'),
|
|
149
|
+
}));
|
|
150
|
+
}
|
|
151
|
+
// Fallback - simple search
|
|
152
|
+
return Array.from(this.fallbackState.memory.entries())
|
|
153
|
+
.slice(0, k)
|
|
154
|
+
.map(([id, data]) => ({
|
|
155
|
+
id,
|
|
156
|
+
score: 0.5,
|
|
157
|
+
content: data.content,
|
|
158
|
+
metadata: data.metadata,
|
|
159
|
+
}));
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Add content to memory
|
|
163
|
+
*/
|
|
164
|
+
addMemory(content, metadata) {
|
|
165
|
+
if (this.native) {
|
|
166
|
+
return this.native.addMemory(content, metadata ? JSON.stringify(metadata) : undefined);
|
|
167
|
+
}
|
|
168
|
+
// Fallback
|
|
169
|
+
const id = this.fallbackState.nextId++;
|
|
170
|
+
this.fallbackState.memory.set(id, {
|
|
171
|
+
content,
|
|
172
|
+
embedding: this.embed(content),
|
|
173
|
+
metadata: metadata ?? {},
|
|
174
|
+
});
|
|
175
|
+
return id;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Provide feedback for learning
|
|
179
|
+
*/
|
|
180
|
+
feedback(fb) {
|
|
181
|
+
if (this.native) {
|
|
182
|
+
return this.native.feedback(fb.requestId, fb.rating, fb.correction);
|
|
183
|
+
}
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get engine statistics
|
|
188
|
+
*/
|
|
189
|
+
stats() {
|
|
190
|
+
if (this.native) {
|
|
191
|
+
const s = this.native.stats();
|
|
192
|
+
return {
|
|
193
|
+
totalQueries: s.total_queries,
|
|
194
|
+
memoryNodes: s.memory_nodes,
|
|
195
|
+
patternsLearned: s.patterns_learned,
|
|
196
|
+
avgLatencyMs: s.avg_latency_ms,
|
|
197
|
+
cacheHitRate: s.cache_hit_rate,
|
|
198
|
+
routerAccuracy: s.router_accuracy,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
// Fallback
|
|
202
|
+
return {
|
|
203
|
+
totalQueries: this.fallbackState.queryCount,
|
|
204
|
+
memoryNodes: this.fallbackState.memory.size,
|
|
205
|
+
patternsLearned: 0,
|
|
206
|
+
avgLatencyMs: 1.0,
|
|
207
|
+
cacheHitRate: 0.0,
|
|
208
|
+
routerAccuracy: 0.5,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Force router learning cycle
|
|
213
|
+
*/
|
|
214
|
+
forceLearn() {
|
|
215
|
+
if (this.native) {
|
|
216
|
+
return this.native.forceLearn();
|
|
217
|
+
}
|
|
218
|
+
return 'Learning not available in fallback mode';
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get embedding for text
|
|
222
|
+
*/
|
|
223
|
+
embed(text) {
|
|
224
|
+
if (this.native) {
|
|
225
|
+
return this.native.embed(text);
|
|
226
|
+
}
|
|
227
|
+
// Fallback - simple hash-based embedding
|
|
228
|
+
const dim = this.config.embeddingDim ?? 768;
|
|
229
|
+
const embedding = new Array(dim).fill(0);
|
|
230
|
+
for (let i = 0; i < text.length; i++) {
|
|
231
|
+
const idx = (text.charCodeAt(i) * (i + 1)) % dim;
|
|
232
|
+
embedding[idx] += 0.1;
|
|
233
|
+
}
|
|
234
|
+
// Normalize
|
|
235
|
+
const norm = Math.sqrt(embedding.reduce((sum, x) => sum + x * x, 0)) || 1;
|
|
236
|
+
return embedding.map(x => x / norm);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Compute similarity between two texts
|
|
240
|
+
*/
|
|
241
|
+
similarity(text1, text2) {
|
|
242
|
+
if (this.native) {
|
|
243
|
+
return this.native.similarity(text1, text2);
|
|
244
|
+
}
|
|
245
|
+
// Fallback - cosine similarity
|
|
246
|
+
const emb1 = this.embed(text1);
|
|
247
|
+
const emb2 = this.embed(text2);
|
|
248
|
+
let dot = 0;
|
|
249
|
+
let norm1 = 0;
|
|
250
|
+
let norm2 = 0;
|
|
251
|
+
for (let i = 0; i < emb1.length; i++) {
|
|
252
|
+
dot += emb1[i] * emb2[i];
|
|
253
|
+
norm1 += emb1[i] * emb1[i];
|
|
254
|
+
norm2 += emb2[i] * emb2[i];
|
|
255
|
+
}
|
|
256
|
+
const denom = Math.sqrt(norm1) * Math.sqrt(norm2);
|
|
257
|
+
const similarity = denom > 0 ? dot / denom : 0;
|
|
258
|
+
// Clamp to [0, 1] to handle floating point errors
|
|
259
|
+
return Math.max(0, Math.min(1, similarity));
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Check if SIMD is available
|
|
263
|
+
*/
|
|
264
|
+
hasSimd() {
|
|
265
|
+
if (this.native) {
|
|
266
|
+
return this.native.hasSimd();
|
|
267
|
+
}
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Get SIMD capabilities
|
|
272
|
+
*/
|
|
273
|
+
simdCapabilities() {
|
|
274
|
+
if (this.native) {
|
|
275
|
+
return this.native.simdCapabilities();
|
|
276
|
+
}
|
|
277
|
+
return ['Scalar (fallback)'];
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Batch query multiple prompts
|
|
281
|
+
*/
|
|
282
|
+
batchQuery(request) {
|
|
283
|
+
const start = Date.now();
|
|
284
|
+
const responses = request.queries.map(q => this.query(q, request.config));
|
|
285
|
+
return {
|
|
286
|
+
responses,
|
|
287
|
+
totalLatencyMs: Date.now() - start,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Check if native module is loaded
|
|
292
|
+
*/
|
|
293
|
+
isNativeLoaded() {
|
|
294
|
+
return this.native !== null;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQWVILE9BQU8sRUFDTCxlQUFlLEdBSWhCLE1BQU0sVUFBVSxDQUFDO0FBRWxCOztHQUVHO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBcUI7SUFDM0MsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU5QixPQUFPO1FBQ0wsYUFBYSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1FBQ2xDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxlQUFlO1FBQ3pDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSztRQUNwQixvQkFBb0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCO1FBQy9DLGNBQWMsRUFBRSxNQUFNLENBQUMsWUFBWTtRQUNuQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZUFBZTtRQUN4QyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1FBQzFDLFVBQVUsRUFBRSxNQUFNLENBQUMsU0FBUztLQUM3QixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxNQUF5QjtJQUNsRCxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRTlCLE9BQU87UUFDTCxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDNUIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNsQixLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDbEIsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjtLQUM3QyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxPQUFPLE1BQU07SUFXakI7O09BRUc7SUFDSCxZQUFZLE1BQXFCO1FBYnpCLFdBQU0sR0FBd0IsSUFBSSxDQUFD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SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJ1dkxMTSBFbmdpbmUgLSBNYWluIG9yY2hlc3RyYXRvciBmb3Igc2VsZi1sZWFybmluZyBMTE1cbiAqL1xuXG5pbXBvcnQge1xuICBSdXZMTE1Db25maWcsXG4gIEdlbmVyYXRpb25Db25maWcsXG4gIFF1ZXJ5UmVzcG9uc2UsXG4gIFJvdXRpbmdEZWNpc2lvbixcbiAgTWVtb3J5UmVzdWx0LFxuICBSdXZMTE1TdGF0cyxcbiAgRmVlZGJhY2ssXG4gIEVtYmVkZGluZyxcbiAgQmF0Y2hRdWVyeVJlcXVlc3QsXG4gIEJhdGNoUXVlcnlSZXNwb25zZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7XG4gIGdldE5hdGl2ZU1vZHVsZSxcbiAgTmF0aXZlRW5naW5lLFxuICBOYXRpdmVDb25maWcsXG4gIE5hdGl2ZUdlbkNvbmZpZyxcbn0gZnJvbSAnLi9uYXRpdmUnO1xuXG4vKipcbiAqIENvbnZlcnQgSlMgY29uZmlnIHRvIG5hdGl2ZSBjb25maWcgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIHRvTmF0aXZlQ29uZmlnKGNvbmZpZz86IFJ1dkxMTUNvbmZpZyk6IE5hdGl2ZUNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgZW1iZWRkaW5nX2RpbTogY29uZmlnLmVtYmVkZGluZ0RpbSxcbiAgICByb3V0ZXJfaGlkZGVuX2RpbTogY29uZmlnLnJvdXRlckhpZGRlbkRpbSxcbiAgICBobnN3X206IGNvbmZpZy5obnN3TSxcbiAgICBobnN3X2VmX2NvbnN0cnVjdGlvbjogY29uZmlnLmhuc3dFZkNvbnN0cnVjdGlvbixcbiAgICBobnN3X2VmX3NlYXJjaDogY29uZmlnLmhuc3dFZlNlYXJjaCxcbiAgICBsZWFybmluZ19lbmFibGVkOiBjb25maWcubGVhcm5pbmdFbmFibGVkLFxuICAgIHF1YWxpdHlfdGhyZXNob2xkOiBjb25maWcucXVhbGl0eVRocmVzaG9sZCxcbiAgICBld2NfbGFtYmRhOiBjb25maWcuZXdjTGFtYmRhLFxuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnQgSlMgZ2VuZXJhdGlvbiBjb25maWcgdG8gbmF0aXZlIGZvcm1hdFxuICovXG5mdW5jdGlvbiB0b05hdGl2ZUdlbkNvbmZpZyhjb25maWc/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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"}
|