@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,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming response support for RuvLLM
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Async generator for streaming responses
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { RuvLLM, StreamingGenerator } from '@ruvector/ruvllm';
|
|
10
|
+
*
|
|
11
|
+
* const llm = new RuvLLM();
|
|
12
|
+
* const streamer = new StreamingGenerator(llm);
|
|
13
|
+
*
|
|
14
|
+
* // Stream with async iterator
|
|
15
|
+
* for await (const chunk of streamer.stream('Write a story')) {
|
|
16
|
+
* process.stdout.write(chunk.text);
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* // Stream with callbacks
|
|
20
|
+
* await streamer.streamWithCallbacks('Write a poem', {
|
|
21
|
+
* onChunk: (chunk) => console.log(chunk.text),
|
|
22
|
+
* onComplete: (response) => console.log('Done!', response.latencyMs),
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export class StreamingGenerator {
|
|
27
|
+
constructor(llm) {
|
|
28
|
+
this.llm = llm;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Stream response as async generator
|
|
32
|
+
*
|
|
33
|
+
* Note: This simulates streaming by chunking the full response.
|
|
34
|
+
* Native streaming requires native module support.
|
|
35
|
+
*/
|
|
36
|
+
async *stream(prompt, config) {
|
|
37
|
+
const start = Date.now();
|
|
38
|
+
// Generate full response (native streaming would yield real chunks)
|
|
39
|
+
const fullText = this.llm.generate(prompt, config);
|
|
40
|
+
// Simulate streaming by yielding words
|
|
41
|
+
const words = fullText.split(/(\s+)/);
|
|
42
|
+
let accumulated = '';
|
|
43
|
+
let tokenCount = 0;
|
|
44
|
+
for (let i = 0; i < words.length; i++) {
|
|
45
|
+
accumulated += words[i];
|
|
46
|
+
tokenCount++;
|
|
47
|
+
// Yield every few tokens or at end
|
|
48
|
+
if (tokenCount % 3 === 0 || i === words.length - 1) {
|
|
49
|
+
yield {
|
|
50
|
+
text: words.slice(Math.max(0, i - 2), i + 1).join(''),
|
|
51
|
+
done: i === words.length - 1,
|
|
52
|
+
tokenCount,
|
|
53
|
+
latencyMs: Date.now() - start,
|
|
54
|
+
};
|
|
55
|
+
// Small delay to simulate streaming
|
|
56
|
+
await this.delay(10);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Stream with callback handlers
|
|
62
|
+
*/
|
|
63
|
+
async streamWithCallbacks(prompt, options) {
|
|
64
|
+
const start = Date.now();
|
|
65
|
+
let fullText = '';
|
|
66
|
+
let tokenCount = 0;
|
|
67
|
+
try {
|
|
68
|
+
for await (const chunk of this.stream(prompt, options)) {
|
|
69
|
+
fullText += chunk.text;
|
|
70
|
+
tokenCount = chunk.tokenCount;
|
|
71
|
+
if (options.onChunk) {
|
|
72
|
+
options.onChunk(chunk);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const response = {
|
|
76
|
+
text: fullText.trim(),
|
|
77
|
+
confidence: 0.8,
|
|
78
|
+
model: 'streaming',
|
|
79
|
+
contextSize: tokenCount,
|
|
80
|
+
latencyMs: Date.now() - start,
|
|
81
|
+
requestId: `stream-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
82
|
+
};
|
|
83
|
+
if (options.onComplete) {
|
|
84
|
+
options.onComplete(response);
|
|
85
|
+
}
|
|
86
|
+
return response;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (options.onError) {
|
|
90
|
+
options.onError(error);
|
|
91
|
+
}
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Collect stream into single response
|
|
97
|
+
*/
|
|
98
|
+
async collect(prompt, config) {
|
|
99
|
+
let result = '';
|
|
100
|
+
for await (const chunk of this.stream(prompt, config)) {
|
|
101
|
+
result = chunk.text; // Each chunk is cumulative
|
|
102
|
+
}
|
|
103
|
+
return result.trim();
|
|
104
|
+
}
|
|
105
|
+
delay(ms) {
|
|
106
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Create a readable stream from response
|
|
111
|
+
* (For Node.js stream compatibility)
|
|
112
|
+
*/
|
|
113
|
+
export function createReadableStream(generator) {
|
|
114
|
+
return new ReadableStream({
|
|
115
|
+
async pull(controller) {
|
|
116
|
+
const { value, done } = await generator.next();
|
|
117
|
+
if (done) {
|
|
118
|
+
controller.close();
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
controller.enqueue(value.text);
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbWluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQVNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBTTdCLFlBQVksR0FHWDtRQUNDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FDWCxNQUFjLEVBQ2QsTUFBeUI7UUFFekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXpCLG9FQUFvRTtRQUNwRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbkQsdUNBQXVDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUVuQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLFdBQVcsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsVUFBVSxFQUFFLENBQUM7WUFFYixtQ0FBbUM7WUFDbkMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsTUFBTTtvQkFDSixJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FB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QUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0MsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RyZWFtaW5nIHJlc3BvbnNlIHN1cHBvcnQgZm9yIFJ1dkxMTVxuICovXG5cbmltcG9ydCB7XG4gIFN0cmVhbUNodW5rLFxuICBTdHJlYW1PcHRpb25zLFxuICBRdWVyeVJlc3BvbnNlLFxuICBHZW5lcmF0aW9uQ29uZmlnLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBBc3luYyBnZW5lcmF0b3IgZm9yIHN0cmVhbWluZyByZXNwb25zZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgUnV2TExNLCBTdHJlYW1pbmdHZW5lcmF0b3IgfSBmcm9tICdAcnV2ZWN0b3IvcnV2bGxtJztcbiAqXG4gKiBjb25zdCBsbG0gPSBuZXcgUnV2TExNKCk7XG4gKiBjb25zdCBzdHJlYW1lciA9IG5ldyBTdHJlYW1pbmdHZW5lcmF0b3IobGxtKTtcbiAqXG4gKiAvLyBTdHJlYW0gd2l0aCBhc3luYyBpdGVyYXRvclxuICogZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBzdHJlYW1lci5zdHJlYW0oJ1dyaXRlIGEgc3RvcnknKSkge1xuICogICBwcm9jZXNzLnN0ZG91dC53cml0ZShjaHVuay50ZXh0KTtcbiAqIH1cbiAqXG4gKiAvLyBTdHJlYW0gd2l0aCBjYWxsYmFja3NcbiAqIGF3YWl0IHN0cmVhbWVyLnN0cmVhbVdpdGhDYWxsYmFja3MoJ1dyaXRlIGEgcG9lbScsIHtcbiAqICAgb25DaHVuazogKGNodW5rKSA9PiBjb25zb2xlLmxvZyhjaHVuay50ZXh0KSxcbiAqICAgb25Db21wbGV0ZTogKHJlc3BvbnNlKSA9PiBjb25zb2xlLmxvZygnRG9uZSEnLCByZXNwb25zZS5sYXRlbmN5TXMpLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmVhbWluZ0dlbmVyYXRvciB7XG4gIHByaXZhdGUgbGxtOiB7XG4gICAgZ2VuZXJhdGU6IChwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZykgPT4gc3RyaW5nO1xuICAgIHF1ZXJ5OiAodGV4dDogc3RyaW5nLCBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKSA9PiBRdWVyeVJlc3BvbnNlO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGxsbToge1xuICAgIGdlbmVyYXRlOiAocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpID0+IHN0cmluZztcbiAgICBxdWVyeTogKHRleHQ6IHN0cmluZywgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZykgPT4gUXVlcnlSZXNwb25zZTtcbiAgfSkge1xuICAgIHRoaXMubGxtID0gbGxtO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSByZXNwb25zZSBhcyBhc3luYyBnZW5lcmF0b3JcbiAgICpcbiAgICogTm90ZTogVGhpcyBzaW11bGF0ZXMgc3RyZWFtaW5nIGJ5IGNodW5raW5nIHRoZSBmdWxsIHJlc3BvbnNlLlxuICAgKiBOYXRpdmUgc3RyZWFtaW5nIHJlcXVpcmVzIG5hdGl2ZSBtb2R1bGUgc3VwcG9ydC5cbiAgICovXG4gIGFzeW5jICpzdHJlYW0oXG4gICAgcHJvbXB0OiBzdHJpbmcsXG4gICAgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZ1xuICApOiBBc3luY0dlbmVyYXRvcjxTdHJlYW1DaHVuaz4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIEdlbmVyYXRlIGZ1bGwgcmVzcG9uc2UgKG5hdGl2ZSBzdHJlYW1pbmcgd291bGQgeWllbGQgcmVhbCBjaHVua3MpXG4gICAgY29uc3QgZnVsbFRleHQgPSB0aGlzLmxsbS5nZW5lcmF0ZShwcm9tcHQsIGNvbmZpZyk7XG5cbiAgICAvLyBTaW11bGF0ZSBzdHJlYW1pbmcgYnkgeWllbGRpbmcgd29yZHNcbiAgICBjb25zdCB3b3JkcyA9IGZ1bGxUZXh0LnNwbGl0KC8oXFxzKykvKTtcbiAgICBsZXQgYWNjdW11bGF0ZWQgPSAnJztcbiAgICBsZXQgdG9rZW5Db3VudCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhY2N1bXVsYXRlZCArPSB3b3Jkc1tpXTtcbiAgICAgIHRva2VuQ291bnQrKztcblxuICAgICAgLy8gWWllbGQgZXZlcnkgZmV3IHRva2VucyBvciBhdCBlbmRcbiAgICAgIGlmICh0b2tlbkNvdW50ICUgMyA9PT0gMCB8fCBpID09PSB3b3Jkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHlpZWxkIHtcbiAgICAgICAgICB0ZXh0OiB3b3Jkcy5zbGljZShNYXRoLm1heCgwLCBpIC0gMiksIGkgKyAxKS5qb2luKCcnKSxcbiAgICAgICAgICBkb25lOiBpID09PSB3b3Jkcy5sZW5ndGggLSAxLFxuICAgICAgICAgIHRva2VuQ291bnQsXG4gICAgICAgICAgbGF0ZW5jeU1zOiBEYXRlLm5vdygpIC0gc3RhcnQsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU21hbGwgZGVsYXkgdG8gc2ltdWxhdGUgc3RyZWFtaW5nXG4gICAgICAgIGF3YWl0IHRoaXMuZGVsYXkoMTApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gd2l0aCBjYWxsYmFjayBoYW5kbGVyc1xuICAgKi9cbiAgYXN5bmMgc3RyZWFtV2l0aENhbGxiYWNrcyhcbiAgICBwcm9tcHQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBTdHJlYW1PcHRpb25zXG4gICk6IFByb21pc2U8UXVlcnlSZXNwb25zZT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZnVsbFRleHQgPSAnJztcbiAgICBsZXQgdG9rZW5Db3VudCA9IDA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiB0aGlzLnN0cmVhbShwcm9tcHQsIG9wdGlvbnMpKSB7XG4gICAgICAgIGZ1bGxUZXh0ICs9IGNodW5rLnRleHQ7XG4gICAgICAgIHRva2VuQ291bnQgPSBjaHVuay50b2tlbkNvdW50O1xuXG4gICAgICAgIGlmIChvcHRpb25zLm9uQ2h1bmspIHtcbiAgICAgICAgICBvcHRpb25zLm9uQ2h1bmsoY2h1bmspO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBRdWVyeVJlc3BvbnNlID0ge1xuICAgICAgICB0ZXh0OiBmdWxsVGV4dC50cmltKCksXG4gICAgICAgIGNvbmZpZGVuY2U6IDAuOCxcbiAgICAgICAgbW9kZWw6ICdzdHJlYW1pbmcnLFxuICAgICAgICBjb250ZXh0U2l6ZTogdG9rZW5Db3VudCxcbiAgICAgICAgbGF0ZW5jeU1zOiBEYXRlLm5vdygpIC0gc3RhcnQsXG4gICAgICAgIHJlcXVlc3RJZDogYHN0cmVhbS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YCxcbiAgICAgIH07XG5cbiAgICAgIGlmIChvcHRpb25zLm9uQ29tcGxldGUpIHtcbiAgICAgICAgb3B0aW9ucy5vbkNvbXBsZXRlKHJlc3BvbnNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAob3B0aW9ucy5vbkVycm9yKSB7XG4gICAgICAgIG9wdGlvbnMub25FcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdCBzdHJlYW0gaW50byBzaW5nbGUgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGNvbGxlY3QocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHRoaXMuc3RyZWFtKHByb21wdCwgY29uZmlnKSkge1xuICAgICAgcmVzdWx0ID0gY2h1bmsudGV4dDsgLy8gRWFjaCBjaHVuayBpcyBjdW11bGF0aXZlXG4gICAgfVxuICAgIHJldHVybiByZXN1bHQudHJpbSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVhZGFibGUgc3RyZWFtIGZyb20gcmVzcG9uc2VcbiAqIChGb3IgTm9kZS5qcyBzdHJlYW0gY29tcGF0aWJpbGl0eSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlYWRhYmxlU3RyZWFtKFxuICBnZW5lcmF0b3I6IEFzeW5jR2VuZXJhdG9yPFN0cmVhbUNodW5rPlxuKTogUmVhZGFibGVTdHJlYW08c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgZ2VuZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh2YWx1ZS50ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Training Pipeline for SONA
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive training infrastructure with metrics tracking,
|
|
5
|
+
* learning rate scheduling, and checkpoint management.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { TrainingPipeline, TrainingConfig } from '@ruvector/ruvllm';
|
|
10
|
+
*
|
|
11
|
+
* const pipeline = new TrainingPipeline({
|
|
12
|
+
* learningRate: 0.001,
|
|
13
|
+
* batchSize: 32,
|
|
14
|
+
* epochs: 10,
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* // Add training data
|
|
18
|
+
* pipeline.addBatch(inputs, targets, qualities);
|
|
19
|
+
*
|
|
20
|
+
* // Run training
|
|
21
|
+
* const result = pipeline.train();
|
|
22
|
+
* console.log(`Final loss: ${result.finalLoss}`);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import { Embedding, TrainingConfig, TrainingResult } from './types';
|
|
26
|
+
import { LoraAdapter } from './lora';
|
|
27
|
+
import { EwcManager } from './sona';
|
|
28
|
+
/**
|
|
29
|
+
* Training metrics
|
|
30
|
+
*/
|
|
31
|
+
export interface TrainingMetrics {
|
|
32
|
+
/** Current epoch */
|
|
33
|
+
epoch: number;
|
|
34
|
+
/** Current step */
|
|
35
|
+
step: number;
|
|
36
|
+
/** Training loss */
|
|
37
|
+
trainLoss: number;
|
|
38
|
+
/** Validation loss */
|
|
39
|
+
valLoss: number;
|
|
40
|
+
/** Learning rate */
|
|
41
|
+
learningRate: number;
|
|
42
|
+
/** Gradient norm */
|
|
43
|
+
gradNorm: number;
|
|
44
|
+
/** Steps per second */
|
|
45
|
+
stepsPerSecond: number;
|
|
46
|
+
/** ETA in seconds */
|
|
47
|
+
etaSeconds: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Training data batch
|
|
51
|
+
*/
|
|
52
|
+
export interface TrainingBatch {
|
|
53
|
+
/** Input embeddings */
|
|
54
|
+
inputs: Embedding[];
|
|
55
|
+
/** Target outputs */
|
|
56
|
+
targets: Embedding[];
|
|
57
|
+
/** Quality scores */
|
|
58
|
+
qualities: number[];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Checkpoint data
|
|
62
|
+
*/
|
|
63
|
+
export interface Checkpoint {
|
|
64
|
+
/** Epoch number */
|
|
65
|
+
epoch: number;
|
|
66
|
+
/** Step number */
|
|
67
|
+
step: number;
|
|
68
|
+
/** Training loss at checkpoint */
|
|
69
|
+
loss: number;
|
|
70
|
+
/** Model weights (serialized) */
|
|
71
|
+
weights: string;
|
|
72
|
+
/** Timestamp */
|
|
73
|
+
timestamp: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Learning Rate Scheduler
|
|
77
|
+
*/
|
|
78
|
+
export declare class LRScheduler {
|
|
79
|
+
private config;
|
|
80
|
+
private initialLR;
|
|
81
|
+
private currentStep;
|
|
82
|
+
private totalSteps;
|
|
83
|
+
constructor(config: Required<TrainingConfig>, totalSteps: number);
|
|
84
|
+
/**
|
|
85
|
+
* Get learning rate for current step
|
|
86
|
+
*/
|
|
87
|
+
getLR(): number;
|
|
88
|
+
/**
|
|
89
|
+
* Step the scheduler
|
|
90
|
+
*/
|
|
91
|
+
step(): void;
|
|
92
|
+
/**
|
|
93
|
+
* Reset scheduler
|
|
94
|
+
*/
|
|
95
|
+
reset(): void;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Training Metrics Tracker
|
|
99
|
+
*/
|
|
100
|
+
export declare class MetricsTracker {
|
|
101
|
+
private lossHistory;
|
|
102
|
+
private valLossHistory;
|
|
103
|
+
private gradNormHistory;
|
|
104
|
+
private startTime;
|
|
105
|
+
private stepTimes;
|
|
106
|
+
/**
|
|
107
|
+
* Record training loss
|
|
108
|
+
*/
|
|
109
|
+
recordLoss(loss: number): void;
|
|
110
|
+
/**
|
|
111
|
+
* Record validation loss
|
|
112
|
+
*/
|
|
113
|
+
recordValLoss(loss: number): void;
|
|
114
|
+
/**
|
|
115
|
+
* Record gradient norm
|
|
116
|
+
*/
|
|
117
|
+
recordGradNorm(norm: number): void;
|
|
118
|
+
/**
|
|
119
|
+
* Record step time
|
|
120
|
+
*/
|
|
121
|
+
recordStepTime(ms: number): void;
|
|
122
|
+
/**
|
|
123
|
+
* Get average loss over last N steps
|
|
124
|
+
*/
|
|
125
|
+
avgLoss(n?: number): number;
|
|
126
|
+
/**
|
|
127
|
+
* Get average validation loss
|
|
128
|
+
*/
|
|
129
|
+
avgValLoss(n?: number): number;
|
|
130
|
+
/**
|
|
131
|
+
* Get steps per second
|
|
132
|
+
*/
|
|
133
|
+
stepsPerSecond(): number;
|
|
134
|
+
/**
|
|
135
|
+
* Get ETA in seconds
|
|
136
|
+
*/
|
|
137
|
+
eta(remainingSteps: number): number;
|
|
138
|
+
/**
|
|
139
|
+
* Get best validation loss
|
|
140
|
+
*/
|
|
141
|
+
bestValLoss(): number;
|
|
142
|
+
/**
|
|
143
|
+
* Get total duration
|
|
144
|
+
*/
|
|
145
|
+
duration(): number;
|
|
146
|
+
/**
|
|
147
|
+
* Get all loss history
|
|
148
|
+
*/
|
|
149
|
+
getLossHistory(): number[];
|
|
150
|
+
/**
|
|
151
|
+
* Get all validation loss history
|
|
152
|
+
*/
|
|
153
|
+
getValLossHistory(): number[];
|
|
154
|
+
/**
|
|
155
|
+
* Reset tracker
|
|
156
|
+
*/
|
|
157
|
+
reset(): void;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Training Pipeline
|
|
161
|
+
*
|
|
162
|
+
* Full training infrastructure for SONA models.
|
|
163
|
+
*/
|
|
164
|
+
export declare class TrainingPipeline {
|
|
165
|
+
private config;
|
|
166
|
+
private adapter;
|
|
167
|
+
private ewcManager;
|
|
168
|
+
private metrics;
|
|
169
|
+
private scheduler;
|
|
170
|
+
private batches;
|
|
171
|
+
private checkpoints;
|
|
172
|
+
private currentEpoch;
|
|
173
|
+
private currentStep;
|
|
174
|
+
private bestValLoss;
|
|
175
|
+
private patienceCounter;
|
|
176
|
+
constructor(config?: TrainingConfig, adapter?: LoraAdapter);
|
|
177
|
+
/**
|
|
178
|
+
* Add training batch
|
|
179
|
+
*/
|
|
180
|
+
addBatch(inputs: Embedding[], targets: Embedding[], qualities: number[]): void;
|
|
181
|
+
/**
|
|
182
|
+
* Add training data
|
|
183
|
+
*/
|
|
184
|
+
addData(data: Array<{
|
|
185
|
+
input: Embedding;
|
|
186
|
+
target: Embedding;
|
|
187
|
+
quality: number;
|
|
188
|
+
}>): void;
|
|
189
|
+
/**
|
|
190
|
+
* Run training
|
|
191
|
+
*/
|
|
192
|
+
train(): TrainingResult;
|
|
193
|
+
/**
|
|
194
|
+
* Single training step
|
|
195
|
+
*/
|
|
196
|
+
private trainStep;
|
|
197
|
+
/**
|
|
198
|
+
* Validation pass
|
|
199
|
+
*/
|
|
200
|
+
private validate;
|
|
201
|
+
/**
|
|
202
|
+
* Save checkpoint
|
|
203
|
+
*/
|
|
204
|
+
private saveCheckpoint;
|
|
205
|
+
/**
|
|
206
|
+
* Load checkpoint
|
|
207
|
+
*/
|
|
208
|
+
loadCheckpoint(index: number): boolean;
|
|
209
|
+
/**
|
|
210
|
+
* Get current metrics
|
|
211
|
+
*/
|
|
212
|
+
getMetrics(): TrainingMetrics;
|
|
213
|
+
/**
|
|
214
|
+
* Get adapter
|
|
215
|
+
*/
|
|
216
|
+
getAdapter(): LoraAdapter;
|
|
217
|
+
/**
|
|
218
|
+
* Get EWC manager
|
|
219
|
+
*/
|
|
220
|
+
getEwcManager(): EwcManager;
|
|
221
|
+
/**
|
|
222
|
+
* Get checkpoints
|
|
223
|
+
*/
|
|
224
|
+
getCheckpoints(): Checkpoint[];
|
|
225
|
+
/**
|
|
226
|
+
* Reset pipeline
|
|
227
|
+
*/
|
|
228
|
+
reset(): void;
|
|
229
|
+
private shuffleBatches;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Training Factory
|
|
233
|
+
*
|
|
234
|
+
* Create pre-configured training pipelines for common scenarios.
|
|
235
|
+
*/
|
|
236
|
+
export declare class TrainingFactory {
|
|
237
|
+
/**
|
|
238
|
+
* Create pipeline for quick fine-tuning
|
|
239
|
+
*/
|
|
240
|
+
static quickFinetune(): TrainingPipeline;
|
|
241
|
+
/**
|
|
242
|
+
* Create pipeline for deep training
|
|
243
|
+
*/
|
|
244
|
+
static deepTraining(): TrainingPipeline;
|
|
245
|
+
/**
|
|
246
|
+
* Create pipeline for continual learning
|
|
247
|
+
*/
|
|
248
|
+
static continualLearning(ewcLambda?: number): TrainingPipeline;
|
|
249
|
+
/**
|
|
250
|
+
* Create pipeline for federated aggregation
|
|
251
|
+
*/
|
|
252
|
+
static federatedAggregation(): TrainingPipeline;
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=training.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"training.d.ts","sourceRoot":"","sources":["../../src/training.ts"],"names":[],"mappings":"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"}
|