modular-voice-agent-sdk 1.2.0 → 1.3.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.
Files changed (37) hide show
  1. package/README.md +6 -4
  2. package/dist/backends/transformers/llm.d.ts +8 -1
  3. package/dist/backends/transformers/llm.d.ts.map +1 -1
  4. package/dist/backends/transformers/llm.js +15 -7
  5. package/dist/backends/transformers/llm.js.map +1 -1
  6. package/dist/backends/transformers/stt.d.ts +8 -1
  7. package/dist/backends/transformers/stt.d.ts.map +1 -1
  8. package/dist/backends/transformers/stt.js +15 -7
  9. package/dist/backends/transformers/stt.js.map +1 -1
  10. package/dist/backends/transformers/tts.d.ts +8 -1
  11. package/dist/backends/transformers/tts.d.ts.map +1 -1
  12. package/dist/backends/transformers/tts.js +15 -7
  13. package/dist/backends/transformers/tts.js.map +1 -1
  14. package/dist/cache-runtime.d.ts +29 -0
  15. package/dist/cache-runtime.d.ts.map +1 -0
  16. package/dist/cache-runtime.js +43 -0
  17. package/dist/cache-runtime.js.map +1 -0
  18. package/dist/cache.d.ts +3 -19
  19. package/dist/cache.d.ts.map +1 -1
  20. package/dist/cache.js +3 -39
  21. package/dist/cache.js.map +1 -1
  22. package/dist/client/index.d.ts +2 -1
  23. package/dist/client/index.d.ts.map +1 -1
  24. package/dist/client/index.js.map +1 -1
  25. package/dist/client/voice-client.d.ts +76 -13
  26. package/dist/client/voice-client.d.ts.map +1 -1
  27. package/dist/client/voice-client.js +54 -30
  28. package/dist/client/voice-client.js.map +1 -1
  29. package/dist/index.d.ts +2 -2
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/voice-pipeline.d.ts +122 -20
  34. package/dist/voice-pipeline.d.ts.map +1 -1
  35. package/dist/voice-pipeline.js +106 -64
  36. package/dist/voice-pipeline.js.map +1 -1
  37. package/package.json +1 -1
package/README.md CHANGED
@@ -9,10 +9,12 @@ import { createVoiceClient, WebSpeechSTT, WebSpeechTTS } from 'modular-voice-age
9
9
  import { TransformersLLM } from 'modular-voice-agent-sdk';
10
10
 
11
11
  const client = createVoiceClient({
12
- stt: new WebSpeechSTT(),
13
- llm: new TransformersLLM({ model: 'HuggingFaceTB/SmolLM2-360M-Instruct' }),
14
- tts: new WebSpeechTTS(),
15
- systemPrompt: 'You are a helpful assistant.',
12
+ create: (modelStore) => ({
13
+ stt: new WebSpeechSTT(),
14
+ llm: new TransformersLLM({ model: 'HuggingFaceTB/SmolLM2-360M-Instruct' }, modelStore),
15
+ tts: new WebSpeechTTS(),
16
+ systemPrompt: 'You are a helpful assistant.',
17
+ }),
16
18
  });
17
19
 
18
20
  await client.connect();
@@ -10,12 +10,19 @@
10
10
  * for JSON-based tool calling, parsed by VoicePipeline.
11
11
  */
12
12
  import type { LLMPipeline, TransformersLLMConfig, ProgressCallback, Message, LLMGenerateOptions, LLMGenerateResult } from '../../types';
13
+ import type { ModelStore } from '../../voice-pipeline';
13
14
  export declare class TransformersLLM implements LLMPipeline {
14
15
  private config;
16
+ private modelStore;
15
17
  private pipe;
16
18
  private ready;
17
19
  private tracker;
18
- constructor(config: TransformersLLMConfig);
20
+ /**
21
+ * @param config - LLM configuration
22
+ * @param modelStore - Pipeline-scoped model store for caching.
23
+ * Models are cached here and shared across sessions within the same pipeline.
24
+ */
25
+ constructor(config: TransformersLLMConfig, modelStore: ModelStore);
19
26
  initialize(onProgress?: ProgressCallback): Promise<void>;
20
27
  supportsTools(): boolean;
21
28
  generate(messages: Message[], options?: LLMGenerateOptions): Promise<LLMGenerateResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,OAAO,EACP,kBAAkB,EAClB,iBAAiB,EAGlB,MAAM,aAAa,CAAC;AAIrB,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,MAAM,CAAwB;IAEtC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAyB;gBAE5B,MAAM,EAAE,qBAAqB;IAKnC,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB9D,aAAa,IAAI,OAAO;IAMlB,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkC7F;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,IAAI,OAAO;CAGnB"}
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,OAAO,EACP,kBAAkB,EAClB,iBAAiB,EAGlB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAyB;IAExC;;;;OAIG;gBACS,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU;IAM3D,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB9D,aAAa,IAAI,OAAO;IAMlB,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkC7F;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,IAAI,OAAO;CAGnB"}
@@ -11,29 +11,37 @@
11
11
  */
12
12
  import { pipeline } from '@huggingface/transformers';
13
13
  import { LLMLogger, LLMConversationTracker } from '../../services';
14
- import { getCachedOrLoad } from '../../cache';
15
14
  export class TransformersLLM {
16
15
  config;
16
+ modelStore;
17
17
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
18
  pipe = null;
19
19
  ready = false;
20
20
  tracker;
21
- constructor(config) {
21
+ /**
22
+ * @param config - LLM configuration
23
+ * @param modelStore - Pipeline-scoped model store for caching.
24
+ * Models are cached here and shared across sessions within the same pipeline.
25
+ */
26
+ constructor(config, modelStore) {
22
27
  this.config = config;
28
+ this.modelStore = modelStore;
23
29
  this.tracker = new LLMConversationTracker(new LLMLogger());
24
30
  }
25
31
  async initialize(onProgress) {
26
- const cacheKey = `transformers-llm:${this.config.model}:${this.config.dtype}:${this.config.device ?? 'default'}`;
27
- this.pipe = await getCachedOrLoad(cacheKey, async () => {
32
+ if (this.modelStore.has('llm')) {
33
+ this.pipe = this.modelStore.get('llm');
34
+ }
35
+ else {
28
36
  console.log(`Loading LLM model (${this.config.model})...`);
29
- const pipe = await pipeline('text-generation', this.config.model, {
37
+ this.pipe = await pipeline('text-generation', this.config.model, {
30
38
  dtype: this.config.dtype,
31
39
  device: this.config.device,
32
40
  progress_callback: onProgress,
33
41
  });
34
42
  console.log('LLM model loaded.');
35
- return pipe;
36
- });
43
+ this.modelStore.set('llm', this.pipe);
44
+ }
37
45
  this.ready = true;
38
46
  }
39
47
  supportsTools() {
@@ -1 +1 @@
1
- {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/backends/transformers/llm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/backends/transformers/llm.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,18 @@
5
5
  * Supports Whisper, Moonshine, Wav2Vec2, and other ASR models from Hugging Face.
6
6
  */
7
7
  import type { STTPipeline, TransformersSTTConfig, ProgressCallback, TurnContext } from '../../types';
8
+ import type { ModelStore } from '../../voice-pipeline';
8
9
  export declare class TransformersSTT implements STTPipeline {
9
10
  private config;
11
+ private modelStore;
10
12
  private pipe;
11
13
  private ready;
12
- constructor(config: TransformersSTTConfig);
14
+ /**
15
+ * @param config - STT configuration
16
+ * @param modelStore - Pipeline-scoped model store for caching.
17
+ * Models are cached here and shared across sessions within the same pipeline.
18
+ */
19
+ constructor(config: TransformersSTTConfig, modelStore: ModelStore);
13
20
  initialize(onProgress?: ProgressCallback): Promise<void>;
14
21
  transcribe(audio: Float32Array, _turn?: TurnContext): Promise<string>;
15
22
  isReady(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"stt.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/stt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGrG,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,MAAM,CAAwB;IAEtC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,qBAAqB;IAInC,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxD,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB3E,OAAO,IAAI,OAAO;CAGnB"}
1
+ {"version":3,"file":"stt.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/stt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAS;IAEtB;;;;OAIG;gBACS,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU;IAK3D,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxD,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB3E,OAAO,IAAI,OAAO;CAGnB"}
@@ -5,27 +5,35 @@
5
5
  * Supports Whisper, Moonshine, Wav2Vec2, and other ASR models from Hugging Face.
6
6
  */
7
7
  import { pipeline } from '@huggingface/transformers';
8
- import { getCachedOrLoad } from '../../cache';
9
8
  export class TransformersSTT {
10
9
  config;
10
+ modelStore;
11
11
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
12
  pipe = null;
13
13
  ready = false;
14
- constructor(config) {
14
+ /**
15
+ * @param config - STT configuration
16
+ * @param modelStore - Pipeline-scoped model store for caching.
17
+ * Models are cached here and shared across sessions within the same pipeline.
18
+ */
19
+ constructor(config, modelStore) {
15
20
  this.config = config;
21
+ this.modelStore = modelStore;
16
22
  }
17
23
  async initialize(onProgress) {
18
- const cacheKey = `transformers-stt:${this.config.model}:${this.config.dtype}:${this.config.device ?? 'default'}`;
19
- this.pipe = await getCachedOrLoad(cacheKey, async () => {
24
+ if (this.modelStore.has('stt')) {
25
+ this.pipe = this.modelStore.get('stt');
26
+ }
27
+ else {
20
28
  console.log(`Loading STT model (${this.config.model})...`);
21
- const pipe = await pipeline('automatic-speech-recognition', this.config.model, {
29
+ this.pipe = await pipeline('automatic-speech-recognition', this.config.model, {
22
30
  dtype: this.config.dtype,
23
31
  device: this.config.device,
24
32
  progress_callback: onProgress,
25
33
  });
26
34
  console.log('STT model loaded.');
27
- return pipe;
28
- });
35
+ this.modelStore.set('stt', this.pipe);
36
+ }
29
37
  this.ready = true;
30
38
  }
31
39
  async transcribe(audio, _turn) {
@@ -1 +1 @@
1
- {"version":3,"file":"stt.js","sourceRoot":"","sources":["../../../src/backends/transformers/stt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,OAAO,eAAe;IAClB,MAAM,CAAwB;IACtC,8DAA8D;IACtD,IAAI,GAAQ,IAAI,CAAC;IACjB,KAAK,GAAG,KAAK,CAAC;IAEtB,YAAY,MAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA6B;QAC5C,MAAM,QAAQ,GAAG,oBAAoB,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAEjH,IAAI,CAAC,IAAI,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACrD,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,8BAA8B,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC7E,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAsC;gBACzD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,iBAAiB,EAAE,UAAU;aAC9B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAmB,EAAE,KAAmB;QACvD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;YAClC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAqB,EAAE;YACjE,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAE/C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;QACD,OAAQ,MAA2B,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"stt.js","sourceRoot":"","sources":["../../../src/backends/transformers/stt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAIrD,MAAM,OAAO,eAAe;IAClB,MAAM,CAAwB;IAC9B,UAAU,CAAa;IAC/B,8DAA8D;IACtD,IAAI,GAAQ,IAAI,CAAC;IACjB,KAAK,GAAG,KAAK,CAAC;IAEtB;;;;OAIG;IACH,YAAY,MAA6B,EAAE,UAAsB;QAC/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA6B;QAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,GAAG,MAAM,QAAQ,CAAC,8BAA8B,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC5E,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAsC;gBACzD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,iBAAiB,EAAE,UAAU;aAC9B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAmB,EAAE,KAAmB;QACvD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;YAClC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAqB,EAAE;YACjE,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAE/C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;QACD,OAAQ,MAA2B,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
@@ -5,11 +5,18 @@
5
5
  * Supports SpeechT5 and other TTS models from Hugging Face.
6
6
  */
7
7
  import type { TTSPipeline, TransformersTTSConfig, ProgressCallback, AudioPlayable } from '../../types';
8
+ import type { ModelStore } from '../../voice-pipeline';
8
9
  export declare class TransformersTTS implements TTSPipeline {
9
10
  private config;
11
+ private modelStore;
10
12
  private pipe;
11
13
  private ready;
12
- constructor(config: TransformersTTSConfig);
14
+ /**
15
+ * @param config - TTS configuration
16
+ * @param modelStore - Pipeline-scoped model store for caching.
17
+ * Models are cached here and shared across sessions within the same pipeline.
18
+ */
19
+ constructor(config: TransformersTTSConfig, modelStore: ModelStore);
13
20
  initialize(onProgress?: ProgressCallback): Promise<void>;
14
21
  synthesize(text: string): Promise<AudioPlayable>;
15
22
  isReady(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/tts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIvG,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,MAAM,CAAwB;IAEtC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,qBAAqB;IAInC,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAYtD,OAAO,IAAI,OAAO;CAGnB"}
1
+ {"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../../../src/backends/transformers/tts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEvG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAS;IAEtB;;;;OAIG;gBACS,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU;IAK3D,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAYtD,OAAO,IAAI,OAAO;CAGnB"}
@@ -6,27 +6,35 @@
6
6
  */
7
7
  import { pipeline } from '@huggingface/transformers';
8
8
  import { BufferedAudioPlayable } from '../../types';
9
- import { getCachedOrLoad } from '../../cache';
10
9
  export class TransformersTTS {
11
10
  config;
11
+ modelStore;
12
12
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
13
  pipe = null;
14
14
  ready = false;
15
- constructor(config) {
15
+ /**
16
+ * @param config - TTS configuration
17
+ * @param modelStore - Pipeline-scoped model store for caching.
18
+ * Models are cached here and shared across sessions within the same pipeline.
19
+ */
20
+ constructor(config, modelStore) {
16
21
  this.config = config;
22
+ this.modelStore = modelStore;
17
23
  }
18
24
  async initialize(onProgress) {
19
- const cacheKey = `transformers-tts:${this.config.model}:${this.config.dtype}:${this.config.device ?? 'default'}`;
20
- this.pipe = await getCachedOrLoad(cacheKey, async () => {
25
+ if (this.modelStore.has('tts')) {
26
+ this.pipe = this.modelStore.get('tts');
27
+ }
28
+ else {
21
29
  console.log(`Loading TTS model (${this.config.model})...`);
22
- const pipe = await pipeline('text-to-speech', this.config.model, {
30
+ this.pipe = await pipeline('text-to-speech', this.config.model, {
23
31
  dtype: this.config.dtype,
24
32
  device: this.config.device,
25
33
  progress_callback: onProgress,
26
34
  });
27
35
  console.log('TTS model loaded.');
28
- return pipe;
29
- });
36
+ this.modelStore.set('tts', this.pipe);
37
+ }
30
38
  this.ready = true;
31
39
  }
32
40
  async synthesize(text) {
@@ -1 +1 @@
1
- {"version":3,"file":"tts.js","sourceRoot":"","sources":["../../../src/backends/transformers/tts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,OAAO,eAAe;IAClB,MAAM,CAAwB;IACtC,8DAA8D;IACtD,IAAI,GAAQ,IAAI,CAAC;IACjB,KAAK,GAAG,KAAK,CAAC;IAEtB,YAAY,MAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA6B;QAC5C,MAAM,QAAQ,GAAG,oBAAoB,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAEjH,IAAI,CAAC,IAAI,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACrD,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC/D,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAsC;gBACzD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,iBAAiB,EAAE,UAAU;aAC9B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACnC,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;SAClD,CAAC,CAAC;QAEH,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"tts.js","sourceRoot":"","sources":["../../../src/backends/transformers/tts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,OAAO,eAAe;IAClB,MAAM,CAAwB;IAC9B,UAAU,CAAa;IAC/B,8DAA8D;IACtD,IAAI,GAAQ,IAAI,CAAC;IACjB,KAAK,GAAG,KAAK,CAAC;IAEtB;;;;OAIG;IACH,YAAY,MAA6B,EAAE,UAAsB;QAC/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA6B;QAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,GAAG,MAAM,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC9D,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAsC;gBACzD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,iBAAiB,EAAE,UAAU;aAC9B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACnC,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;SAClD,CAAC,CAAC;QAEH,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Runtime Model Cache - Browser-safe
3
+ *
4
+ * In-memory cache for loaded models/resources.
5
+ * Backends use this to share heavy resources (models, tokenizers) across sessions.
6
+ * The cache is keyed by a unique string identifier (e.g., "transformers-llm:model-name:dtype").
7
+ *
8
+ * This module has NO Node.js dependencies and works in both browser and server.
9
+ */
10
+ /**
11
+ * Get a cached resource, or load it if not cached.
12
+ * @param key - Unique cache key
13
+ * @param loader - Async function to load the resource if not cached
14
+ * @returns The cached or newly loaded resource
15
+ */
16
+ export declare function getCachedOrLoad<T>(key: string, loader: () => Promise<T>): Promise<T>;
17
+ /**
18
+ * Check if a resource is in the cache.
19
+ */
20
+ export declare function isCached(key: string): boolean;
21
+ /**
22
+ * Clear a specific cached resource.
23
+ */
24
+ export declare function clearCached(key: string): void;
25
+ /**
26
+ * Clear all cached resources.
27
+ */
28
+ export declare function clearAllCached(): void;
29
+ //# sourceMappingURL=cache-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-runtime.d.ts","sourceRoot":"","sources":["../src/cache-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAO1F;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Runtime Model Cache - Browser-safe
3
+ *
4
+ * In-memory cache for loaded models/resources.
5
+ * Backends use this to share heavy resources (models, tokenizers) across sessions.
6
+ * The cache is keyed by a unique string identifier (e.g., "transformers-llm:model-name:dtype").
7
+ *
8
+ * This module has NO Node.js dependencies and works in both browser and server.
9
+ */
10
+ const runtimeCache = new Map();
11
+ /**
12
+ * Get a cached resource, or load it if not cached.
13
+ * @param key - Unique cache key
14
+ * @param loader - Async function to load the resource if not cached
15
+ * @returns The cached or newly loaded resource
16
+ */
17
+ export async function getCachedOrLoad(key, loader) {
18
+ if (runtimeCache.has(key)) {
19
+ return runtimeCache.get(key);
20
+ }
21
+ const resource = await loader();
22
+ runtimeCache.set(key, resource);
23
+ return resource;
24
+ }
25
+ /**
26
+ * Check if a resource is in the cache.
27
+ */
28
+ export function isCached(key) {
29
+ return runtimeCache.has(key);
30
+ }
31
+ /**
32
+ * Clear a specific cached resource.
33
+ */
34
+ export function clearCached(key) {
35
+ runtimeCache.delete(key);
36
+ }
37
+ /**
38
+ * Clear all cached resources.
39
+ */
40
+ export function clearAllCached() {
41
+ runtimeCache.clear();
42
+ }
43
+ //# sourceMappingURL=cache-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-runtime.js","sourceRoot":"","sources":["../src/cache-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAI,GAAW,EAAE,MAAwB;IAC5E,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAM,CAAC;IACpC,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,YAAY,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
package/dist/cache.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Cache utilities for modular-voice-agent-sdk
3
3
  * Models and binaries are stored in ~/.cache/mvas/ by default
4
+ *
5
+ * NOTE: This module uses Node.js APIs (os, path) and is SERVER-ONLY.
6
+ * For browser model caching, use the ModelStore passed to backend constructors.
4
7
  */
5
8
  /**
6
9
  * Get the cache directory for mvas assets.
@@ -34,23 +37,4 @@ export declare const defaultBinaries: {
34
37
  llamaCompletion: string;
35
38
  sherpaOnnxTts: string;
36
39
  };
37
- /**
38
- * Get a cached resource, or load it if not cached.
39
- * @param key - Unique cache key
40
- * @param loader - Async function to load the resource if not cached
41
- * @returns The cached or newly loaded resource
42
- */
43
- export declare function getCachedOrLoad<T>(key: string, loader: () => Promise<T>): Promise<T>;
44
- /**
45
- * Check if a resource is in the cache.
46
- */
47
- export declare function isCached(key: string): boolean;
48
- /**
49
- * Clear a specific cached resource.
50
- */
51
- export declare function clearCached(key: string): void;
52
- /**
53
- * Clear all cached resources.
54
- */
55
- export declare function clearAllCached(): void;
56
40
  //# sourceMappingURL=cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,eAAO,MAAM,eAAe;;;;CAI3B,CAAC;AAWF;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAO1F;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,eAAO,MAAM,eAAe;;;;CAI3B,CAAC"}
package/dist/cache.js CHANGED
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Cache utilities for modular-voice-agent-sdk
3
3
  * Models and binaries are stored in ~/.cache/mvas/ by default
4
+ *
5
+ * NOTE: This module uses Node.js APIs (os, path) and is SERVER-ONLY.
6
+ * For browser model caching, use the ModelStore passed to backend constructors.
4
7
  */
5
8
  import { homedir } from 'os';
6
9
  import { join } from 'path';
@@ -46,43 +49,4 @@ export const defaultBinaries = {
46
49
  llamaCompletion: 'llama-completion',
47
50
  sherpaOnnxTts: 'sherpa-onnx-offline-tts',
48
51
  };
49
- // ============ Runtime Model Cache ============
50
- /**
51
- * Runtime cache for loaded models/resources.
52
- * Backends use this to share heavy resources (models, tokenizers) across sessions.
53
- * The cache is keyed by a unique string identifier (e.g., "transformers-llm:model-name:dtype").
54
- */
55
- const runtimeCache = new Map();
56
- /**
57
- * Get a cached resource, or load it if not cached.
58
- * @param key - Unique cache key
59
- * @param loader - Async function to load the resource if not cached
60
- * @returns The cached or newly loaded resource
61
- */
62
- export async function getCachedOrLoad(key, loader) {
63
- if (runtimeCache.has(key)) {
64
- return runtimeCache.get(key);
65
- }
66
- const resource = await loader();
67
- runtimeCache.set(key, resource);
68
- return resource;
69
- }
70
- /**
71
- * Check if a resource is in the cache.
72
- */
73
- export function isCached(key) {
74
- return runtimeCache.has(key);
75
- }
76
- /**
77
- * Clear a specific cached resource.
78
- */
79
- export function clearCached(key) {
80
- runtimeCache.delete(key);
81
- }
82
- /**
83
- * Clear all cached resources.
84
- */
85
- export function clearAllCached() {
86
- runtimeCache.clear();
87
- }
88
52
  //# sourceMappingURL=cache.js.map
package/dist/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,aAAa;IACzB,eAAe,EAAE,kBAAkB;IACnC,aAAa,EAAE,yBAAyB;CACzC,CAAC;AAEF,gDAAgD;AAEhD;;;;GAIG;AACH,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAI,GAAW,EAAE,MAAwB;IAC5E,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAM,CAAC;IACpC,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,YAAY,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,aAAa;IACzB,eAAe,EAAE,kBAAkB;IACnC,aAAa,EAAE,yBAAyB;CACzC,CAAC"}
@@ -21,7 +21,8 @@
21
21
  * ```
22
22
  */
23
23
  export { VoiceClient, createVoiceClient } from './voice-client';
24
- export type { VoiceClientConfig, VoiceClientEvents, VoiceClientStatus, BrowserSupport } from './voice-client';
24
+ export type { VoiceClientConfig, VoiceClientEvents, VoiceClientStatus, BrowserSupport, ClientComponents, ClientComponentFactory, } from './voice-client';
25
+ export type { ModelStore } from '../voice-pipeline';
25
26
  export { WebSpeechSTT } from './web-speech-stt';
26
27
  export type { WebSpeechSTTConfig, WebSpeechSTTResult } from './web-speech-stt';
27
28
  export { WebSpeechTTS } from './web-speech-tts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAG9G,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EACL,eAAe,EACf,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EACL,eAAe,EACf,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGhE,0CAA0C;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,qDAAqD;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,+BAA+B;AAC/B,OAAO,EACL,eAAe,EACf,eAAe,GAYhB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAahE,0CAA0C;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,qDAAqD;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,+BAA+B;AAC/B,OAAO,EACL,eAAe,EACf,eAAe,GAYhB,MAAM,YAAY,CAAC"}
@@ -34,28 +34,31 @@ export interface BrowserSupport {
34
34
  webSpeechSTTUsable: boolean;
35
35
  }
36
36
  export type VoiceClientStatus = 'disconnected' | 'connecting' | 'initializing' | 'ready' | 'listening' | 'processing' | 'speaking';
37
- export interface VoiceClientConfig {
37
+ /**
38
+ * Components returned by the client factory
39
+ */
40
+ export interface ClientComponents {
38
41
  /**
39
42
  * STT backend - runs locally in browser
40
43
  * - Provide an STTPipeline (e.g., TransformersSTT) or WebSpeechSTT for local STT
41
44
  * - Set to null to use server-side STT (requires serverUrl)
42
45
  * @default null (server handles)
43
46
  */
44
- stt?: STTPipeline | WebSpeechSTT | null;
47
+ stt: STTPipeline | WebSpeechSTT | null;
45
48
  /**
46
49
  * LLM backend - runs locally in browser
47
50
  * - Provide an LLMPipeline (e.g., TransformersLLM) for local LLM
48
51
  * - Set to null to use server-side LLM (requires serverUrl)
49
52
  * @default null (server handles)
50
53
  */
51
- llm?: LLMPipeline | null;
54
+ llm: LLMPipeline | null;
52
55
  /**
53
56
  * TTS backend - runs locally in browser
54
57
  * - Provide a TTSPipeline (e.g., TransformersTTS) or WebSpeechTTS for local TTS
55
58
  * - Set to null to use server-side TTS (requires serverUrl)
56
59
  * @default null (server handles)
57
60
  */
58
- tts?: TTSPipeline | WebSpeechTTS | null;
61
+ tts: TTSPipeline | WebSpeechTTS | null;
59
62
  /**
60
63
  * System prompt for the LLM (required if llm is provided)
61
64
  */
@@ -64,6 +67,48 @@ export interface VoiceClientConfig {
64
67
  * WebSocket server URL (required if any component is null)
65
68
  */
66
69
  serverUrl?: string;
70
+ }
71
+ import type { ModelStore } from '../voice-pipeline';
72
+ /**
73
+ * Factory function that creates client components.
74
+ *
75
+ * @param modelStore - Pipeline-scoped cache for heavy resources.
76
+ * Backends can use this to cache models across sessions (for fully-local mode).
77
+ * Typically not needed for client-side backends like WebSpeechTTS.
78
+ */
79
+ export type ClientComponentFactory = (modelStore: ModelStore) => ClientComponents;
80
+ export interface VoiceClientConfig {
81
+ /**
82
+ * Factory that creates components.
83
+ * Called once during client construction.
84
+ *
85
+ * The factory receives a `modelStore` for caching heavy resources.
86
+ * This is mainly useful for fully-local mode with Transformers backends.
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * // Simple: server handles heavy lifting
91
+ * createVoiceClient({
92
+ * create: (modelStore) => ({
93
+ * stt: null,
94
+ * llm: null,
95
+ * tts: new WebSpeechTTS(),
96
+ * serverUrl: 'ws://localhost:3100',
97
+ * }),
98
+ * });
99
+ *
100
+ * // Fully local with Transformers (uses modelStore for caching)
101
+ * createVoiceClient({
102
+ * create: (modelStore) => ({
103
+ * stt: new TransformersSTT(sttConfig, modelStore),
104
+ * llm: new TransformersLLM(llmConfig, modelStore),
105
+ * tts: new TransformersTTS(ttsConfig, modelStore),
106
+ * systemPrompt: 'You are a helpful assistant.',
107
+ * }),
108
+ * });
109
+ * ```
110
+ */
111
+ create: ClientComponentFactory;
67
112
  /**
68
113
  * Audio sample rate for recording (default: 16000)
69
114
  */
@@ -125,6 +170,7 @@ export declare class VoiceClient {
125
170
  private config;
126
171
  private mode;
127
172
  private needsServer;
173
+ private modelStore;
128
174
  private localSTT;
129
175
  private localLLM;
130
176
  private localTTS;
@@ -223,28 +269,45 @@ export declare class VoiceClient {
223
269
  }
224
270
  /**
225
271
  * Create a VoiceClient instance
272
+ *
226
273
  * @example
274
+ * ```typescript
227
275
  * // Fully local
228
276
  * const client = createVoiceClient({
229
- * stt: new TransformersSTT({ model: '...' }),
230
- * llm: new TransformersLLM({ model: '...' }),
231
- * tts: new WebSpeechTTS(),
232
- * systemPrompt: 'You are a helpful assistant.',
277
+ * create: () => ({
278
+ * stt: new TransformersSTT({ model: '...' }),
279
+ * llm: new TransformersLLM({ model: '...' }),
280
+ * tts: new WebSpeechTTS(),
281
+ * systemPrompt: 'You are a helpful assistant.',
282
+ * }),
233
283
  * });
284
+ * ```
234
285
  *
235
286
  * @example
287
+ * ```typescript
236
288
  * // Fully remote
237
289
  * const client = createVoiceClient({
238
- * serverUrl: 'ws://localhost:3000',
290
+ * create: () => ({
291
+ * stt: null,
292
+ * llm: null,
293
+ * tts: null,
294
+ * serverUrl: 'ws://localhost:3000',
295
+ * }),
239
296
  * });
297
+ * ```
240
298
  *
241
299
  * @example
242
- * // Hybrid: local STT/TTS, server LLM
300
+ * ```typescript
301
+ * // Hybrid: local TTS, server STT/LLM
243
302
  * const client = createVoiceClient({
244
- * stt: new WebSpeechSTT(),
245
- * tts: new WebSpeechTTS(),
246
- * serverUrl: 'ws://localhost:3000',
303
+ * create: () => ({
304
+ * stt: null,
305
+ * llm: null,
306
+ * tts: new WebSpeechTTS(),
307
+ * serverUrl: 'ws://localhost:3000',
308
+ * }),
247
309
  * });
310
+ * ```
248
311
  */
249
312
  export declare function createVoiceClient(config: VoiceClientConfig): VoiceClient;
250
313
  export {};