webml-kit 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -0
- package/package.json +17 -5
- package/dist/cache.d.ts +0 -46
- package/dist/cache.d.ts.map +0 -1
- package/dist/cache.js +0 -160
- package/dist/cache.js.map +0 -1
- package/dist/device.d.ts +0 -86
- package/dist/device.d.ts.map +0 -1
- package/dist/device.js +0 -195
- package/dist/device.js.map +0 -1
- package/dist/gpu-recovery.d.ts +0 -61
- package/dist/gpu-recovery.d.ts.map +0 -1
- package/dist/gpu-recovery.js +0 -105
- package/dist/gpu-recovery.js.map +0 -1
- package/dist/hub.d.ts +0 -97
- package/dist/hub.d.ts.map +0 -1
- package/dist/hub.js +0 -142
- package/dist/hub.js.map +0 -1
- package/dist/index.d.ts +0 -61
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -63
- package/dist/index.js.map +0 -1
- package/dist/inputs.d.ts +0 -27
- package/dist/inputs.d.ts.map +0 -1
- package/dist/inputs.js +0 -123
- package/dist/inputs.js.map +0 -1
- package/dist/loader.d.ts +0 -87
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -156
- package/dist/loader.js.map +0 -1
- package/dist/model-client.d.ts +0 -149
- package/dist/model-client.d.ts.map +0 -1
- package/dist/model-client.js +0 -318
- package/dist/model-client.js.map +0 -1
- package/dist/model-worker.d.ts +0 -16
- package/dist/model-worker.d.ts.map +0 -1
- package/dist/model-worker.js +0 -340
- package/dist/model-worker.js.map +0 -1
- package/dist/onnx-pipeline.d.ts +0 -20
- package/dist/onnx-pipeline.d.ts.map +0 -1
- package/dist/onnx-pipeline.js +0 -385
- package/dist/onnx-pipeline.js.map +0 -1
- package/dist/pipelines/index.d.ts +0 -28
- package/dist/pipelines/index.d.ts.map +0 -1
- package/dist/pipelines/index.js +0 -134
- package/dist/pipelines/index.js.map +0 -1
- package/dist/streaming.d.ts +0 -55
- package/dist/streaming.d.ts.map +0 -1
- package/dist/streaming.js +0 -142
- package/dist/streaming.js.map +0 -1
- package/dist/types.d.ts +0 -196
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
package/dist/inputs.js
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Universal input coercion and browser media helpers.
|
|
3
|
-
*
|
|
4
|
-
* Automatically converts URLs, Blobs, Files, AudioBuffers, and arrays
|
|
5
|
-
* into the exact formats expected by ML models.
|
|
6
|
-
*/
|
|
7
|
-
import { decodeWavToFloat32 } from './onnx-pipeline.js';
|
|
8
|
-
/**
|
|
9
|
-
* Coerces various audio formats (URL, File, Blob, AudioBuffer, ArrayBuffer, Array)
|
|
10
|
-
* into a standardized 16kHz Float32Array PCM buffer.
|
|
11
|
-
*/
|
|
12
|
-
export async function coerceAudio(input) {
|
|
13
|
-
if (input instanceof Float32Array) {
|
|
14
|
-
return input;
|
|
15
|
-
}
|
|
16
|
-
if (Array.isArray(input)) {
|
|
17
|
-
return new Float32Array(input);
|
|
18
|
-
}
|
|
19
|
-
if (input instanceof ArrayBuffer) {
|
|
20
|
-
return decodeWavToFloat32(input);
|
|
21
|
-
}
|
|
22
|
-
if (ArrayBuffer.isView(input)) {
|
|
23
|
-
if (input instanceof Uint8Array) {
|
|
24
|
-
const copy = new Uint8Array(input.byteLength);
|
|
25
|
-
copy.set(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));
|
|
26
|
-
return decodeWavToFloat32(copy.buffer);
|
|
27
|
-
}
|
|
28
|
-
return new Float32Array(input.buffer, input.byteOffset, Math.floor(input.byteLength / 4));
|
|
29
|
-
}
|
|
30
|
-
// Handle Blob / File
|
|
31
|
-
if (typeof Blob !== 'undefined' && input instanceof Blob) {
|
|
32
|
-
const buffer = await input.arrayBuffer();
|
|
33
|
-
// Try decoding via browser AudioContext if available for compressed formats (mp3/ogg/m4a)
|
|
34
|
-
if (typeof AudioContext !== 'undefined' || typeof globalThis.webkitAudioContext !== 'undefined') {
|
|
35
|
-
try {
|
|
36
|
-
const AudioCtx = globalThis.AudioContext || globalThis.webkitAudioContext;
|
|
37
|
-
const ctx = new AudioCtx({ sampleRate: 16000 });
|
|
38
|
-
const audioBuf = await ctx.decodeAudioData(buffer.slice(0));
|
|
39
|
-
ctx.close();
|
|
40
|
-
return audioBuf.getChannelData(0);
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
// Fallback to WAV parser
|
|
44
|
-
return decodeWavToFloat32(buffer);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return decodeWavToFloat32(buffer);
|
|
48
|
-
}
|
|
49
|
-
// Handle URL string
|
|
50
|
-
if (typeof input === 'string') {
|
|
51
|
-
const response = await fetch(input);
|
|
52
|
-
if (!response.ok) {
|
|
53
|
-
throw new Error(`Failed to fetch audio from ${input}: ${response.status} ${response.statusText}`);
|
|
54
|
-
}
|
|
55
|
-
const buffer = await response.arrayBuffer();
|
|
56
|
-
return decodeWavToFloat32(buffer);
|
|
57
|
-
}
|
|
58
|
-
// Handle object with .audio or .pcm property
|
|
59
|
-
if (typeof input === 'object' && input !== null) {
|
|
60
|
-
if ('audio' in input) {
|
|
61
|
-
return coerceAudio(input.audio);
|
|
62
|
-
}
|
|
63
|
-
if ('pcm' in input) {
|
|
64
|
-
return coerceAudio(input.pcm);
|
|
65
|
-
}
|
|
66
|
-
// Handle Web Audio API AudioBuffer
|
|
67
|
-
if ('getChannelData' in input && typeof input.getChannelData === 'function') {
|
|
68
|
-
return input.getChannelData(0);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
throw new Error(`Unsupported audio input type: ${typeof input}`);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Capture microphone audio from browser and invoke callback with Float32Array PCM.
|
|
75
|
-
*/
|
|
76
|
-
export async function listenMic(onChunk, options = {}) {
|
|
77
|
-
if (typeof navigator === 'undefined' || !navigator.mediaDevices?.getUserMedia) {
|
|
78
|
-
throw new Error('Microphone access is only available in browser environments with getUserMedia.');
|
|
79
|
-
}
|
|
80
|
-
const sampleRate = options.sampleRate ?? 16000;
|
|
81
|
-
const intervalSeconds = options.intervalSeconds ?? 3;
|
|
82
|
-
const stream = await navigator.mediaDevices.getUserMedia({
|
|
83
|
-
audio: {
|
|
84
|
-
sampleRate,
|
|
85
|
-
channelCount: 1,
|
|
86
|
-
echoCancellation: true,
|
|
87
|
-
noiseSuppression: true,
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
const AudioCtx = globalThis.AudioContext || globalThis.webkitAudioContext;
|
|
91
|
-
const audioCtx = new AudioCtx({ sampleRate });
|
|
92
|
-
const source = audioCtx.createMediaStreamSource(stream);
|
|
93
|
-
// ScriptProcessor or AudioWorklet for gathering PCM
|
|
94
|
-
const bufferSize = 4096;
|
|
95
|
-
const processor = audioCtx.createScriptProcessor(bufferSize, 1, 1);
|
|
96
|
-
let pcmBuffer = [];
|
|
97
|
-
const maxSamples = Math.floor(sampleRate * intervalSeconds);
|
|
98
|
-
processor.onaudioprocess = (e) => {
|
|
99
|
-
const inputData = e.inputBuffer.getChannelData(0);
|
|
100
|
-
for (let i = 0; i < inputData.length; i++) {
|
|
101
|
-
pcmBuffer.push(inputData[i]);
|
|
102
|
-
}
|
|
103
|
-
if (pcmBuffer.length >= maxSamples) {
|
|
104
|
-
const chunk = new Float32Array(pcmBuffer);
|
|
105
|
-
pcmBuffer = [];
|
|
106
|
-
onChunk(chunk);
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
source.connect(processor);
|
|
110
|
-
processor.connect(audioCtx.destination);
|
|
111
|
-
const stop = () => {
|
|
112
|
-
if (pcmBuffer.length > 0) {
|
|
113
|
-
onChunk(new Float32Array(pcmBuffer));
|
|
114
|
-
pcmBuffer = [];
|
|
115
|
-
}
|
|
116
|
-
processor.disconnect();
|
|
117
|
-
source.disconnect();
|
|
118
|
-
stream.getTracks().forEach((track) => track.stop());
|
|
119
|
-
audioCtx.close();
|
|
120
|
-
};
|
|
121
|
-
return { stop };
|
|
122
|
-
}
|
|
123
|
-
//# sourceMappingURL=inputs.js.map
|
package/dist/inputs.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inputs.js","sourceRoot":"","sources":["../src/inputs.ts"],"names":[],"mappings":"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"}
|
package/dist/loader.d.ts
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Functional, zero-ceremony model loader for webml-kit.
|
|
3
|
-
*
|
|
4
|
-
* ```ts
|
|
5
|
-
* import webml from 'webml-kit';
|
|
6
|
-
*
|
|
7
|
-
* // Speech recognition
|
|
8
|
-
* const asr = await webml('onnx-community/whisper-tiny.en');
|
|
9
|
-
* const { text } = await asr.transcribe(audioBlob);
|
|
10
|
-
*
|
|
11
|
-
* // Live mic listening
|
|
12
|
-
* const mic = await asr.listen({ onTranscript: (t) => console.log(t) });
|
|
13
|
-
*
|
|
14
|
-
* // Text generation
|
|
15
|
-
* const llm = await webml('onnx-community/Llama-3.2-1B-Instruct-ONNX');
|
|
16
|
-
* for await (const { token } of llm.stream('Tell me a joke')) {
|
|
17
|
-
* process.stdout.write(token);
|
|
18
|
-
* }
|
|
19
|
-
*
|
|
20
|
-
* // Callable invocation for any model
|
|
21
|
-
* const classifier = await webml('Xenova/vit-base-patch16-224');
|
|
22
|
-
* const labels = await classifier(imageFile);
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
import { ModelClient } from './model-client.js';
|
|
26
|
-
import { type MicListener } from './inputs.js';
|
|
27
|
-
import type { PipelineTask, QuantizationType, DeviceBackend, TranscriptionResult, ClassificationResult, DetectionResult, EmbeddingResult, TextGenerationOptions, TextGenerationResult, ChatMessage, ProgressCallback } from './types.js';
|
|
28
|
-
import { TokenStream } from './streaming.js';
|
|
29
|
-
export interface WebMLOptions {
|
|
30
|
-
/** Override pipeline task (auto-detected from HF metadata if omitted) */
|
|
31
|
-
task?: PipelineTask;
|
|
32
|
-
/** Quantization level (q4, q8, fp16, fp32, etc.) */
|
|
33
|
-
dtype?: QuantizationType;
|
|
34
|
-
/** Device backend preference ('webgpu' | 'wasm' | 'cpu') */
|
|
35
|
-
device?: DeviceBackend;
|
|
36
|
-
/** Hugging Face branch or revision */
|
|
37
|
-
revision?: string;
|
|
38
|
-
/** Custom worker script URL */
|
|
39
|
-
workerUrl?: string | URL;
|
|
40
|
-
/** Download / compilation progress callback */
|
|
41
|
-
onProgress?: ProgressCallback;
|
|
42
|
-
}
|
|
43
|
-
export interface LoadedModel {
|
|
44
|
-
/** The active pipeline task */
|
|
45
|
-
task: PipelineTask;
|
|
46
|
-
/** The model identifier or URL */
|
|
47
|
-
modelId: string;
|
|
48
|
-
/** The underlying ModelClient instance */
|
|
49
|
-
client: ModelClient;
|
|
50
|
-
/** Call the model on inputs directly */
|
|
51
|
-
(input: unknown, options?: Record<string, unknown>): Promise<unknown>;
|
|
52
|
-
/** Run inference */
|
|
53
|
-
run<T = unknown>(input: unknown, options?: Record<string, unknown>): Promise<T>;
|
|
54
|
-
/** Free memory and terminate worker */
|
|
55
|
-
dispose(): void;
|
|
56
|
-
/** Stream tokens for text generation */
|
|
57
|
-
stream(input: string | ChatMessage[], options?: TextGenerationOptions): TokenStream;
|
|
58
|
-
/** Generate full text completion */
|
|
59
|
-
generate(input: string | ChatMessage[], options?: TextGenerationOptions): Promise<TextGenerationResult>;
|
|
60
|
-
/** Transcribe audio (accepts Float32Array, Blob, File, URL, AudioBuffer) */
|
|
61
|
-
transcribe(input: unknown, options?: Record<string, unknown>): Promise<TranscriptionResult>;
|
|
62
|
-
/** Classify image */
|
|
63
|
-
classify(input: unknown, options?: Record<string, unknown>): Promise<ClassificationResult[]>;
|
|
64
|
-
/** Extract vector embeddings */
|
|
65
|
-
embed(input: string | string[], options?: Record<string, unknown>): Promise<EmbeddingResult>;
|
|
66
|
-
/** Detect objects in image */
|
|
67
|
-
detect(input: unknown, options?: Record<string, unknown>): Promise<DetectionResult[]>;
|
|
68
|
-
/** Listen to live microphone audio in browser and transcribe on the fly */
|
|
69
|
-
listen(options: {
|
|
70
|
-
onTranscript: (text: string) => void;
|
|
71
|
-
intervalSeconds?: number;
|
|
72
|
-
}): Promise<MicListener>;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Automatically infers the pipeline task from modelId, file extensions, or Hugging Face metadata.
|
|
76
|
-
*/
|
|
77
|
-
export declare function inferTask(modelId: string): Promise<PipelineTask>;
|
|
78
|
-
/**
|
|
79
|
-
* Load any ML model for in-browser execution with zero ceremony.
|
|
80
|
-
*
|
|
81
|
-
* @param modelId - Hugging Face model ID (e.g. 'onnx-community/whisper-tiny.en') or URL
|
|
82
|
-
* @param options - Configuration options
|
|
83
|
-
* @returns Ready-to-use callable model instance
|
|
84
|
-
*/
|
|
85
|
-
export declare function webml(modelId: string, options?: WebMLOptions): Promise<LoadedModel>;
|
|
86
|
-
export default webml;
|
|
87
|
-
//# sourceMappingURL=loader.d.ts.map
|
package/dist/loader.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/loader.js
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Functional, zero-ceremony model loader for webml-kit.
|
|
3
|
-
*
|
|
4
|
-
* ```ts
|
|
5
|
-
* import webml from 'webml-kit';
|
|
6
|
-
*
|
|
7
|
-
* // Speech recognition
|
|
8
|
-
* const asr = await webml('onnx-community/whisper-tiny.en');
|
|
9
|
-
* const { text } = await asr.transcribe(audioBlob);
|
|
10
|
-
*
|
|
11
|
-
* // Live mic listening
|
|
12
|
-
* const mic = await asr.listen({ onTranscript: (t) => console.log(t) });
|
|
13
|
-
*
|
|
14
|
-
* // Text generation
|
|
15
|
-
* const llm = await webml('onnx-community/Llama-3.2-1B-Instruct-ONNX');
|
|
16
|
-
* for await (const { token } of llm.stream('Tell me a joke')) {
|
|
17
|
-
* process.stdout.write(token);
|
|
18
|
-
* }
|
|
19
|
-
*
|
|
20
|
-
* // Callable invocation for any model
|
|
21
|
-
* const classifier = await webml('Xenova/vit-base-patch16-224');
|
|
22
|
-
* const labels = await classifier(imageFile);
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
import { ModelClient } from './model-client.js';
|
|
26
|
-
import { getModelInfo } from './hub.js';
|
|
27
|
-
import { coerceAudio, listenMic } from './inputs.js';
|
|
28
|
-
/**
|
|
29
|
-
* Automatically infers the pipeline task from modelId, file extensions, or Hugging Face metadata.
|
|
30
|
-
*/
|
|
31
|
-
export async function inferTask(modelId) {
|
|
32
|
-
const lower = modelId.toLowerCase();
|
|
33
|
-
// Fast heuristic matching
|
|
34
|
-
if (lower.includes('whisper') ||
|
|
35
|
-
lower.includes('asr') ||
|
|
36
|
-
lower.includes('speech') ||
|
|
37
|
-
lower.includes('sushrota') ||
|
|
38
|
-
lower.includes('parakeet')) {
|
|
39
|
-
return 'automatic-speech-recognition';
|
|
40
|
-
}
|
|
41
|
-
if (lower.includes('llama') ||
|
|
42
|
-
lower.includes('qwen') ||
|
|
43
|
-
lower.includes('gpt') ||
|
|
44
|
-
lower.includes('mistral') ||
|
|
45
|
-
lower.includes('phi') ||
|
|
46
|
-
lower.includes('gemma') ||
|
|
47
|
-
lower.includes('bonsai')) {
|
|
48
|
-
return 'text-generation';
|
|
49
|
-
}
|
|
50
|
-
if (lower.includes('detr') || lower.includes('yolo')) {
|
|
51
|
-
return 'object-detection';
|
|
52
|
-
}
|
|
53
|
-
if (lower.includes('vit') || lower.includes('resnet') || lower.includes('mobilenet')) {
|
|
54
|
-
return 'image-classification';
|
|
55
|
-
}
|
|
56
|
-
if (lower.includes('minilm') || lower.includes('bge') || lower.includes('embed')) {
|
|
57
|
-
return 'feature-extraction';
|
|
58
|
-
}
|
|
59
|
-
if (lower.endsWith('.onnx')) {
|
|
60
|
-
return 'raw-onnx';
|
|
61
|
-
}
|
|
62
|
-
// Fallback to HF Hub lookup
|
|
63
|
-
try {
|
|
64
|
-
const info = await getModelInfo(modelId);
|
|
65
|
-
if (info.task && info.task !== 'unknown') {
|
|
66
|
-
return info.task;
|
|
67
|
-
}
|
|
68
|
-
const tags = info.tags || [];
|
|
69
|
-
if (tags.includes('automatic-speech-recognition') || tags.includes('audio')) {
|
|
70
|
-
return 'automatic-speech-recognition';
|
|
71
|
-
}
|
|
72
|
-
if (tags.includes('text-generation')) {
|
|
73
|
-
return 'text-generation';
|
|
74
|
-
}
|
|
75
|
-
if (tags.includes('image-classification')) {
|
|
76
|
-
return 'image-classification';
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
// Non-fatal
|
|
81
|
-
}
|
|
82
|
-
return 'text-generation';
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Load any ML model for in-browser execution with zero ceremony.
|
|
86
|
-
*
|
|
87
|
-
* @param modelId - Hugging Face model ID (e.g. 'onnx-community/whisper-tiny.en') or URL
|
|
88
|
-
* @param options - Configuration options
|
|
89
|
-
* @returns Ready-to-use callable model instance
|
|
90
|
-
*/
|
|
91
|
-
export async function webml(modelId, options = {}) {
|
|
92
|
-
const task = options.task ?? (await inferTask(modelId));
|
|
93
|
-
const client = new ModelClient(options.workerUrl);
|
|
94
|
-
await client.load({
|
|
95
|
-
task,
|
|
96
|
-
modelId,
|
|
97
|
-
dtype: options.dtype,
|
|
98
|
-
device: options.device,
|
|
99
|
-
revision: options.revision,
|
|
100
|
-
onProgress: options.onProgress,
|
|
101
|
-
});
|
|
102
|
-
const runner = async (input, runOptions) => {
|
|
103
|
-
if (task === 'automatic-speech-recognition') {
|
|
104
|
-
const pcm = await coerceAudio(input);
|
|
105
|
-
return client.run('automatic-speech-recognition', pcm, runOptions);
|
|
106
|
-
}
|
|
107
|
-
return client.run(task, input, runOptions);
|
|
108
|
-
};
|
|
109
|
-
const model = Object.assign(runner, {
|
|
110
|
-
task,
|
|
111
|
-
modelId,
|
|
112
|
-
client,
|
|
113
|
-
run: (input, runOptions) => {
|
|
114
|
-
return runner(input, runOptions);
|
|
115
|
-
},
|
|
116
|
-
dispose: () => {
|
|
117
|
-
client.dispose();
|
|
118
|
-
client.terminate();
|
|
119
|
-
},
|
|
120
|
-
stream: (input, genOptions) => {
|
|
121
|
-
return client.stream(input, genOptions);
|
|
122
|
-
},
|
|
123
|
-
generate: (input, genOptions) => {
|
|
124
|
-
return client.generate(input, genOptions);
|
|
125
|
-
},
|
|
126
|
-
transcribe: async (input, runOptions) => {
|
|
127
|
-
const pcm = await coerceAudio(input);
|
|
128
|
-
return client.run('automatic-speech-recognition', pcm, runOptions);
|
|
129
|
-
},
|
|
130
|
-
classify: (input, runOptions) => {
|
|
131
|
-
return client.run('image-classification', input, runOptions);
|
|
132
|
-
},
|
|
133
|
-
embed: (input, runOptions) => {
|
|
134
|
-
return client.run('feature-extraction', input, runOptions);
|
|
135
|
-
},
|
|
136
|
-
detect: (input, runOptions) => {
|
|
137
|
-
return client.run('object-detection', input, runOptions);
|
|
138
|
-
},
|
|
139
|
-
listen: async (listenOptions) => {
|
|
140
|
-
return listenMic(async (pcm) => {
|
|
141
|
-
try {
|
|
142
|
-
const res = await client.run('automatic-speech-recognition', pcm);
|
|
143
|
-
if (res?.text?.trim()) {
|
|
144
|
-
listenOptions.onTranscript(res.text.trim());
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
catch (err) {
|
|
148
|
-
console.warn('Transcription error during mic listen:', err);
|
|
149
|
-
}
|
|
150
|
-
}, { intervalSeconds: listenOptions.intervalSeconds });
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
return model;
|
|
154
|
-
}
|
|
155
|
-
export default webml;
|
|
156
|
-
//# sourceMappingURL=loader.js.map
|
package/dist/loader.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/model-client.d.ts
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Main-thread client for communicating with the ML worker.
|
|
3
|
-
*
|
|
4
|
-
* Wraps the Web Worker's postMessage protocol with a promise-based API,
|
|
5
|
-
* AsyncIterable token streaming, and typed events.
|
|
6
|
-
*
|
|
7
|
-
* ```ts
|
|
8
|
-
* import { ModelClient } from 'webml-kit';
|
|
9
|
-
*
|
|
10
|
-
* const client = new ModelClient();
|
|
11
|
-
*
|
|
12
|
-
* // Check device capabilities
|
|
13
|
-
* const device = await client.detect();
|
|
14
|
-
* console.log(device.backend); // 'webgpu'
|
|
15
|
-
*
|
|
16
|
-
* // Load a model
|
|
17
|
-
* await client.load({
|
|
18
|
-
* task: 'text-generation',
|
|
19
|
-
* modelId: 'onnx-community/Bonsai-1.7B-ONNX',
|
|
20
|
-
* dtype: 'q4',
|
|
21
|
-
* onProgress: ({ percent }) => console.log(`${percent}%`),
|
|
22
|
-
* });
|
|
23
|
-
*
|
|
24
|
-
* // Stream text generation
|
|
25
|
-
* for await (const { token, tps } of client.stream('Hello!')) {
|
|
26
|
-
* process.stdout.write(token);
|
|
27
|
-
* }
|
|
28
|
-
*
|
|
29
|
-
* // One-shot inference
|
|
30
|
-
* const labels = await client.run('image-classification', imageBlob);
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
import type { DeviceInfo, ModelConfig, PipelineTask, ProgressCallback, TextGenerationOptions, TextGenerationResult, ChatMessage } from './types.js';
|
|
34
|
-
import { TokenStream } from './streaming.js';
|
|
35
|
-
export interface LoadOptions extends ModelConfig {
|
|
36
|
-
onProgress?: ProgressCallback;
|
|
37
|
-
}
|
|
38
|
-
export type ClientEventType = 'progress' | 'ready' | 'error' | 'device-lost' | 'device-recovered';
|
|
39
|
-
type Listener = (data: unknown) => void;
|
|
40
|
-
export declare class ModelClient {
|
|
41
|
-
private worker;
|
|
42
|
-
private workerUrl;
|
|
43
|
-
private listeners;
|
|
44
|
-
private pendingRequests;
|
|
45
|
-
private requestCounter;
|
|
46
|
-
private deviceInfo;
|
|
47
|
-
private loadedModels;
|
|
48
|
-
private progressCallback;
|
|
49
|
-
private gpuRecovery;
|
|
50
|
-
/**
|
|
51
|
-
* Create a new ModelClient.
|
|
52
|
-
*
|
|
53
|
-
* @param workerUrl - URL to the model-worker.js file. If omitted,
|
|
54
|
-
* creates a Blob URL from the bundled worker (requires bundler support).
|
|
55
|
-
*/
|
|
56
|
-
constructor(workerUrl?: string | URL);
|
|
57
|
-
private getWorker;
|
|
58
|
-
private send;
|
|
59
|
-
private nextId;
|
|
60
|
-
private handleMessage;
|
|
61
|
-
/** Register an event listener. */
|
|
62
|
-
on(event: ClientEventType, listener: Listener): this;
|
|
63
|
-
/** Remove an event listener. */
|
|
64
|
-
off(event: ClientEventType, listener: Listener): this;
|
|
65
|
-
private emit;
|
|
66
|
-
/**
|
|
67
|
-
* Detect the best available compute backend.
|
|
68
|
-
*
|
|
69
|
-
* ```ts
|
|
70
|
-
* const info = await client.detect();
|
|
71
|
-
* console.log(info.backend); // 'webgpu'
|
|
72
|
-
* console.log(info.gpu?.vendor); // 'apple'
|
|
73
|
-
* console.log(info.recommendedDtype); // 'q4'
|
|
74
|
-
* ```
|
|
75
|
-
*/
|
|
76
|
-
detect(): Promise<DeviceInfo>;
|
|
77
|
-
/**
|
|
78
|
-
* Load a model pipeline.
|
|
79
|
-
*
|
|
80
|
-
* ```ts
|
|
81
|
-
* await client.load({
|
|
82
|
-
* task: 'text-generation',
|
|
83
|
-
* modelId: 'onnx-community/Bonsai-1.7B-ONNX',
|
|
84
|
-
* dtype: 'q4',
|
|
85
|
-
* onProgress: ({ percent }) => updateUI(percent),
|
|
86
|
-
* });
|
|
87
|
-
* ```
|
|
88
|
-
*/
|
|
89
|
-
load(options: LoadOptions): Promise<void>;
|
|
90
|
-
/**
|
|
91
|
-
* Run one-shot inference for any pipeline task.
|
|
92
|
-
*
|
|
93
|
-
* ```ts
|
|
94
|
-
* // Image classification
|
|
95
|
-
* const labels = await client.run('image-classification', imageUrl);
|
|
96
|
-
*
|
|
97
|
-
* // Speech recognition
|
|
98
|
-
* const { text } = await client.run('automatic-speech-recognition', audioBlob);
|
|
99
|
-
*
|
|
100
|
-
* // Embeddings
|
|
101
|
-
* const vectors = await client.run('feature-extraction', 'Hello world');
|
|
102
|
-
* ```
|
|
103
|
-
*/
|
|
104
|
-
run<T = unknown>(task: PipelineTask, input: unknown, options?: Record<string, unknown>): Promise<T>;
|
|
105
|
-
/**
|
|
106
|
-
* Generate text with streaming tokens.
|
|
107
|
-
*
|
|
108
|
-
* Returns an `AsyncIterable<TokenEvent>` that yields tokens as they're generated.
|
|
109
|
-
*
|
|
110
|
-
* ```ts
|
|
111
|
-
* for await (const { token, tps } of client.stream('Tell me a joke')) {
|
|
112
|
-
* process.stdout.write(token);
|
|
113
|
-
* }
|
|
114
|
-
* ```
|
|
115
|
-
*/
|
|
116
|
-
stream(input: string | ChatMessage[], options?: TextGenerationOptions): TokenStream;
|
|
117
|
-
/**
|
|
118
|
-
* Generate text and wait for the complete result.
|
|
119
|
-
*
|
|
120
|
-
* ```ts
|
|
121
|
-
* const { text, tps, numTokens } = await client.generate('Hello!');
|
|
122
|
-
* ```
|
|
123
|
-
*/
|
|
124
|
-
generate(input: string | ChatMessage[], options?: TextGenerationOptions): Promise<TextGenerationResult>;
|
|
125
|
-
/**
|
|
126
|
-
* Interrupt an ongoing text generation.
|
|
127
|
-
*/
|
|
128
|
-
interrupt(): void;
|
|
129
|
-
/**
|
|
130
|
-
* Reset the KV cache (start a new conversation).
|
|
131
|
-
*/
|
|
132
|
-
reset(): void;
|
|
133
|
-
/**
|
|
134
|
-
* Dispose a loaded model and free memory.
|
|
135
|
-
*
|
|
136
|
-
* @param modelKey - Specific model key (task::modelId), or omit to dispose all.
|
|
137
|
-
*/
|
|
138
|
-
dispose(modelKey?: string): void;
|
|
139
|
-
/**
|
|
140
|
-
* Check if a model is currently loaded.
|
|
141
|
-
*/
|
|
142
|
-
isLoaded(task: PipelineTask, modelId: string): boolean;
|
|
143
|
-
/**
|
|
144
|
-
* Terminate the worker completely.
|
|
145
|
-
*/
|
|
146
|
-
terminate(): void;
|
|
147
|
-
}
|
|
148
|
-
export {};
|
|
149
|
-
//# sourceMappingURL=model-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model-client.d.ts","sourceRoot":"","sources":["../src/model-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EAIpB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAiB,MAAM,gBAAgB,CAAC;AAK5D,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,OAAO,GACP,OAAO,GACP,aAAa,GACb,kBAAkB,CAAC;AAEvB,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;AAIxC,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,eAAe,CAOnB;IACJ,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,WAAW,CAAc;IAEjC;;;;;OAKG;gBACS,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG;IAcpC,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,aAAa;IA8ErB,kCAAkC;IAClC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAQpD,gCAAgC;IAChC,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAKrD,OAAO,CAAC,IAAI;IAMZ;;;;;;;;;OASG;IACG,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;IASnC;;;;;;;;;;;OAWG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/C;;;;;;;;;;;;;OAaG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,CAAC,CAAC;IASb;;;;;;;;;;OAUG;IACH,MAAM,CACJ,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,EAC7B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,WAAW;IAqBd;;;;;;OAMG;IACG,QAAQ,CACZ,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,EAC7B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IAShC;;OAEG;IACH,SAAS,IAAI,IAAI;IAIjB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAShC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAItD;;OAEG;IACH,SAAS,IAAI,IAAI;CAOlB"}
|