modular-voice-agent-sdk 1.0.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 (125) hide show
  1. package/README.md +102 -0
  2. package/USAGE.md +567 -0
  3. package/dist/backends/cloud/index.d.ts +7 -0
  4. package/dist/backends/cloud/index.d.ts.map +1 -0
  5. package/dist/backends/cloud/index.js +6 -0
  6. package/dist/backends/cloud/index.js.map +1 -0
  7. package/dist/backends/cloud/llm.d.ts +22 -0
  8. package/dist/backends/cloud/llm.d.ts.map +1 -0
  9. package/dist/backends/cloud/llm.js +234 -0
  10. package/dist/backends/cloud/llm.js.map +1 -0
  11. package/dist/backends/index.d.ts +2 -0
  12. package/dist/backends/index.d.ts.map +1 -0
  13. package/dist/backends/index.js +6 -0
  14. package/dist/backends/index.js.map +1 -0
  15. package/dist/backends/native/index.d.ts +5 -0
  16. package/dist/backends/native/index.d.ts.map +1 -0
  17. package/dist/backends/native/index.js +6 -0
  18. package/dist/backends/native/index.js.map +1 -0
  19. package/dist/backends/native/llm.d.ts +71 -0
  20. package/dist/backends/native/llm.d.ts.map +1 -0
  21. package/dist/backends/native/llm.js +435 -0
  22. package/dist/backends/native/llm.js.map +1 -0
  23. package/dist/backends/native/stt.d.ts +15 -0
  24. package/dist/backends/native/stt.d.ts.map +1 -0
  25. package/dist/backends/native/stt.js +94 -0
  26. package/dist/backends/native/stt.js.map +1 -0
  27. package/dist/backends/native/tts.d.ts +21 -0
  28. package/dist/backends/native/tts.d.ts.map +1 -0
  29. package/dist/backends/native/tts.js +105 -0
  30. package/dist/backends/native/tts.js.map +1 -0
  31. package/dist/backends/transformers/index.d.ts +4 -0
  32. package/dist/backends/transformers/index.d.ts.map +1 -0
  33. package/dist/backends/transformers/index.js +4 -0
  34. package/dist/backends/transformers/index.js.map +1 -0
  35. package/dist/backends/transformers/llm.d.ts +29 -0
  36. package/dist/backends/transformers/llm.d.ts.map +1 -0
  37. package/dist/backends/transformers/llm.js +117 -0
  38. package/dist/backends/transformers/llm.js.map +1 -0
  39. package/dist/backends/transformers/stt.d.ts +17 -0
  40. package/dist/backends/transformers/stt.d.ts.map +1 -0
  41. package/dist/backends/transformers/stt.js +43 -0
  42. package/dist/backends/transformers/stt.js.map +1 -0
  43. package/dist/backends/transformers/tts.d.ts +17 -0
  44. package/dist/backends/transformers/tts.d.ts.map +1 -0
  45. package/dist/backends/transformers/tts.js +40 -0
  46. package/dist/backends/transformers/tts.js.map +1 -0
  47. package/dist/cache.d.ts +37 -0
  48. package/dist/cache.d.ts.map +1 -0
  49. package/dist/cache.js +49 -0
  50. package/dist/cache.js.map +1 -0
  51. package/dist/cli.d.ts +11 -0
  52. package/dist/cli.d.ts.map +1 -0
  53. package/dist/cli.js +392 -0
  54. package/dist/cli.js.map +1 -0
  55. package/dist/client/audio-player.d.ts +45 -0
  56. package/dist/client/audio-player.d.ts.map +1 -0
  57. package/dist/client/audio-player.js +90 -0
  58. package/dist/client/audio-player.js.map +1 -0
  59. package/dist/client/audio-recorder.d.ts +42 -0
  60. package/dist/client/audio-recorder.d.ts.map +1 -0
  61. package/dist/client/audio-recorder.js +128 -0
  62. package/dist/client/audio-recorder.js.map +1 -0
  63. package/dist/client/index.d.ts +34 -0
  64. package/dist/client/index.d.ts.map +1 -0
  65. package/dist/client/index.js +33 -0
  66. package/dist/client/index.js.map +1 -0
  67. package/dist/client/protocol.d.ts +80 -0
  68. package/dist/client/protocol.d.ts.map +1 -0
  69. package/dist/client/protocol.js +29 -0
  70. package/dist/client/protocol.js.map +1 -0
  71. package/dist/client/voice-client.d.ts +249 -0
  72. package/dist/client/voice-client.d.ts.map +1 -0
  73. package/dist/client/voice-client.js +826 -0
  74. package/dist/client/voice-client.js.map +1 -0
  75. package/dist/client/web-speech-stt.d.ts +65 -0
  76. package/dist/client/web-speech-stt.d.ts.map +1 -0
  77. package/dist/client/web-speech-stt.js +122 -0
  78. package/dist/client/web-speech-stt.js.map +1 -0
  79. package/dist/client/web-speech-tts.d.ts +59 -0
  80. package/dist/client/web-speech-tts.d.ts.map +1 -0
  81. package/dist/client/web-speech-tts.js +145 -0
  82. package/dist/client/web-speech-tts.js.map +1 -0
  83. package/dist/index.d.ts +10 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +13 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/server/encoding.d.ts +18 -0
  88. package/dist/server/encoding.d.ts.map +1 -0
  89. package/dist/server/encoding.js +41 -0
  90. package/dist/server/encoding.js.map +1 -0
  91. package/dist/server/handler.d.ts +86 -0
  92. package/dist/server/handler.d.ts.map +1 -0
  93. package/dist/server/handler.js +224 -0
  94. package/dist/server/handler.js.map +1 -0
  95. package/dist/server/index.d.ts +31 -0
  96. package/dist/server/index.d.ts.map +1 -0
  97. package/dist/server/index.js +32 -0
  98. package/dist/server/index.js.map +1 -0
  99. package/dist/services/function-service.d.ts +17 -0
  100. package/dist/services/function-service.d.ts.map +1 -0
  101. package/dist/services/function-service.js +82 -0
  102. package/dist/services/function-service.js.map +1 -0
  103. package/dist/services/index.d.ts +4 -0
  104. package/dist/services/index.d.ts.map +1 -0
  105. package/dist/services/index.js +3 -0
  106. package/dist/services/index.js.map +1 -0
  107. package/dist/services/llm-logger.d.ts +136 -0
  108. package/dist/services/llm-logger.d.ts.map +1 -0
  109. package/dist/services/llm-logger.js +275 -0
  110. package/dist/services/llm-logger.js.map +1 -0
  111. package/dist/services/text-normalizer.d.ts +17 -0
  112. package/dist/services/text-normalizer.d.ts.map +1 -0
  113. package/dist/services/text-normalizer.js +100 -0
  114. package/dist/services/text-normalizer.js.map +1 -0
  115. package/dist/types.d.ts +195 -0
  116. package/dist/types.d.ts.map +1 -0
  117. package/dist/types.js +48 -0
  118. package/dist/types.js.map +1 -0
  119. package/dist/voice-pipeline.d.ts +125 -0
  120. package/dist/voice-pipeline.d.ts.map +1 -0
  121. package/dist/voice-pipeline.js +390 -0
  122. package/dist/voice-pipeline.js.map +1 -0
  123. package/package.json +96 -0
  124. package/scripts/setup-binaries.sh +159 -0
  125. package/scripts/setup.sh +201 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8FH;;;GAGG;AACH,MAAM,OAAO,qBAAqB;IAKtB;IACA;IALF,YAAY,GAAwB,IAAI,CAAC;IACzC,UAAU,GAAiC,IAAI,CAAC;IAExD,YACU,KAAmB,EACnB,UAAkB;QADlB,UAAK,GAAL,KAAK,CAAc;QACnB,eAAU,GAAV,UAAU,CAAQ;IACzB,CAAC;IAEJ,WAAW;QACT,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEpC,oEAAoE;QACpE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,gDAAgD;QAChD,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC5C,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1F,sEAAsE;QACtE,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAClD,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAEvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,UAAW,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAW,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Voice Pipeline
3
+ * Main orchestrator: STT → LLM → TTS
4
+ *
5
+ * STT and TTS are optional - omit them if the client handles them locally.
6
+ * Supports tool registration for function calling with any LLM backend.
7
+ *
8
+ * The pipeline is stateless - callers manage conversation history via ConversationContext.
9
+ */
10
+ import type { STTPipeline, LLMPipeline, TTSPipeline, Message, ProgressCallback, AudioPlayable, Tool, ToolDefinition, ToolCall } from './types';
11
+ export interface VoicePipelineConfig {
12
+ /** STT backend (optional if client does local STT) */
13
+ stt?: STTPipeline | null;
14
+ /** LLM backend (required) */
15
+ llm: LLMPipeline;
16
+ /** TTS backend (optional if client does local TTS) */
17
+ tts?: TTSPipeline | null;
18
+ /** System prompt for the LLM */
19
+ systemPrompt: string;
20
+ /** Registered tools for function calling */
21
+ tools?: Tool[];
22
+ /**
23
+ * Filler phrases to say while executing tools.
24
+ * Set to empty array to disable filler phrases.
25
+ * @default ["Let me check that for you.", "One moment please.", "Let me look that up."]
26
+ */
27
+ toolFillerPhrases?: string[];
28
+ }
29
+ export interface VoicePipelineCallbacks {
30
+ onTranscript: (text: string) => void;
31
+ onResponseChunk: (text: string) => void;
32
+ onAudio: (playable: AudioPlayable) => void;
33
+ onComplete: () => void;
34
+ onError: (error: Error) => void;
35
+ /** Called when a tool is being executed */
36
+ onToolCall?: (toolCall: ToolCall) => void;
37
+ /** Called when a tool execution completes */
38
+ onToolResult?: (toolCallId: string, result: unknown) => void;
39
+ }
40
+ /**
41
+ * Conversation context - callers manage history externally
42
+ */
43
+ export interface ConversationContext {
44
+ /** Unique conversation ID for tracking/logging */
45
+ conversationId: string;
46
+ /** Conversation history (managed by caller) */
47
+ history: Message[];
48
+ }
49
+ export declare class VoicePipeline {
50
+ private stt;
51
+ private llm;
52
+ private tts;
53
+ private systemPrompt;
54
+ private textNormalizer;
55
+ private tools;
56
+ private toolDefinitions;
57
+ private toolFillerPhrases;
58
+ private fillerPhraseIndex;
59
+ constructor(config: VoicePipelineConfig);
60
+ /**
61
+ * Register a tool for function calling
62
+ */
63
+ registerTool(tool: Tool): void;
64
+ /**
65
+ * Unregister a tool
66
+ */
67
+ unregisterTool(name: string): void;
68
+ /**
69
+ * Get registered tools
70
+ */
71
+ getTools(): ToolDefinition[];
72
+ /**
73
+ * Get the system prompt (for initializing conversation history)
74
+ */
75
+ getSystemPrompt(): string;
76
+ /**
77
+ * Create initial history with system prompt
78
+ */
79
+ createInitialHistory(): Message[];
80
+ initialize(onProgress?: ProgressCallback): Promise<void>;
81
+ isReady(): boolean;
82
+ /**
83
+ * Check if pipeline has STT configured
84
+ */
85
+ hasSTT(): boolean;
86
+ /**
87
+ * Check if pipeline has TTS configured
88
+ */
89
+ hasTTS(): boolean;
90
+ /**
91
+ * Process text input through LLM (and optionally TTS)
92
+ * Returns new messages to append to history
93
+ */
94
+ processText(text: string, context: ConversationContext, callbacks: Omit<VoicePipelineCallbacks, 'onTranscript'>): Promise<Message[]>;
95
+ /**
96
+ * Process audio input through STT → LLM → TTS
97
+ * Returns new messages to append to history
98
+ */
99
+ processAudio(audio: Float32Array, context: ConversationContext, callbacks: VoicePipelineCallbacks): Promise<Message[]>;
100
+ /**
101
+ * Internal: Process transcript through LLM
102
+ */
103
+ private processTranscript;
104
+ /**
105
+ * Internal: Generate LLM response (with tool loop)
106
+ */
107
+ private generateResponse;
108
+ /**
109
+ * Stream a response to the client with optional TTS
110
+ */
111
+ private streamResponse;
112
+ /**
113
+ * Generate LLM response
114
+ */
115
+ private generateLLMResponse;
116
+ /**
117
+ * Generate with streaming TTS (sentence by sentence)
118
+ */
119
+ private generateWithStreamingTTS;
120
+ /**
121
+ * Parse tool calls from LLM output (for non-native tool backends)
122
+ */
123
+ private parsePromptBasedToolCalls;
124
+ }
125
+ //# sourceMappingURL=voice-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-pipeline.d.ts","sourceRoot":"","sources":["../src/voice-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,390 @@
1
+ /**
2
+ * Voice Pipeline
3
+ * Main orchestrator: STT → LLM → TTS
4
+ *
5
+ * STT and TTS are optional - omit them if the client handles them locally.
6
+ * Supports tool registration for function calling with any LLM backend.
7
+ *
8
+ * The pipeline is stateless - callers manage conversation history via ConversationContext.
9
+ */
10
+ import { TextNormalizer } from './services/text-normalizer';
11
+ /** Maximum number of tool call iterations to prevent infinite loops */
12
+ const MAX_TOOL_ITERATIONS = 10;
13
+ /** Default filler phrases while executing tools */
14
+ const DEFAULT_TOOL_FILLER_PHRASES = [
15
+ 'Let me check that for you.',
16
+ 'One moment please.',
17
+ 'Let me look that up.',
18
+ ];
19
+ export class VoicePipeline {
20
+ stt;
21
+ llm;
22
+ tts;
23
+ systemPrompt;
24
+ textNormalizer = new TextNormalizer();
25
+ tools = new Map();
26
+ toolDefinitions = [];
27
+ toolFillerPhrases;
28
+ fillerPhraseIndex = 0;
29
+ constructor(config) {
30
+ this.stt = config.stt ?? null;
31
+ this.llm = config.llm;
32
+ this.tts = config.tts ?? null;
33
+ this.systemPrompt = config.systemPrompt;
34
+ this.toolFillerPhrases = config.toolFillerPhrases ?? DEFAULT_TOOL_FILLER_PHRASES;
35
+ // Register tools
36
+ if (config.tools) {
37
+ for (const tool of config.tools) {
38
+ this.registerTool(tool);
39
+ }
40
+ }
41
+ }
42
+ /**
43
+ * Register a tool for function calling
44
+ */
45
+ registerTool(tool) {
46
+ this.tools.set(tool.name, tool);
47
+ this.toolDefinitions.push({
48
+ name: tool.name,
49
+ description: tool.description,
50
+ parameters: tool.parameters,
51
+ });
52
+ }
53
+ /**
54
+ * Unregister a tool
55
+ */
56
+ unregisterTool(name) {
57
+ this.tools.delete(name);
58
+ this.toolDefinitions = this.toolDefinitions.filter(t => t.name !== name);
59
+ }
60
+ /**
61
+ * Get registered tools
62
+ */
63
+ getTools() {
64
+ return [...this.toolDefinitions];
65
+ }
66
+ /**
67
+ * Get the system prompt (for initializing conversation history)
68
+ */
69
+ getSystemPrompt() {
70
+ return this.systemPrompt;
71
+ }
72
+ /**
73
+ * Create initial history with system prompt
74
+ */
75
+ createInitialHistory() {
76
+ return [{ role: 'system', content: this.systemPrompt }];
77
+ }
78
+ async initialize(onProgress) {
79
+ const promises = [this.llm.initialize(onProgress)];
80
+ if (this.stt) {
81
+ promises.push(this.stt.initialize(onProgress));
82
+ }
83
+ if (this.tts) {
84
+ promises.push(this.tts.initialize(onProgress));
85
+ }
86
+ await Promise.all(promises);
87
+ }
88
+ isReady() {
89
+ const sttReady = this.stt ? this.stt.isReady() : true;
90
+ const ttsReady = this.tts ? this.tts.isReady() : true;
91
+ return sttReady && this.llm.isReady() && ttsReady;
92
+ }
93
+ /**
94
+ * Check if pipeline has STT configured
95
+ */
96
+ hasSTT() {
97
+ return this.stt !== null;
98
+ }
99
+ /**
100
+ * Check if pipeline has TTS configured
101
+ */
102
+ hasTTS() {
103
+ return this.tts !== null;
104
+ }
105
+ /**
106
+ * Process text input through LLM (and optionally TTS)
107
+ * Returns new messages to append to history
108
+ */
109
+ async processText(text, context, callbacks) {
110
+ try {
111
+ const newMessages = await this.processTranscript(text, context, {
112
+ ...callbacks,
113
+ onTranscript: () => { },
114
+ });
115
+ callbacks.onComplete();
116
+ return newMessages;
117
+ }
118
+ catch (error) {
119
+ callbacks.onError(error instanceof Error ? error : new Error(String(error)));
120
+ return [];
121
+ }
122
+ }
123
+ /**
124
+ * Process audio input through STT → LLM → TTS
125
+ * Returns new messages to append to history
126
+ */
127
+ async processAudio(audio, context, callbacks) {
128
+ if (!this.stt) {
129
+ callbacks.onError(new Error('No STT backend configured. Use processText() instead.'));
130
+ return [];
131
+ }
132
+ try {
133
+ const transcript = await this.stt.transcribe(audio);
134
+ if (!transcript.trim()) {
135
+ callbacks.onError(new Error('Could not transcribe audio'));
136
+ return [];
137
+ }
138
+ callbacks.onTranscript(transcript);
139
+ const newMessages = await this.processTranscript(transcript, context, callbacks);
140
+ callbacks.onComplete();
141
+ return newMessages;
142
+ }
143
+ catch (error) {
144
+ callbacks.onError(error instanceof Error ? error : new Error(String(error)));
145
+ return [];
146
+ }
147
+ }
148
+ /**
149
+ * Internal: Process transcript through LLM
150
+ */
151
+ async processTranscript(transcript, context, callbacks) {
152
+ const newMessages = [];
153
+ // Add user message to context history
154
+ const userMessage = { role: 'user', content: transcript };
155
+ context.history.push(userMessage);
156
+ newMessages.push(userMessage);
157
+ // Generate response with context
158
+ const responseMessages = await this.generateResponse(context, callbacks);
159
+ newMessages.push(...responseMessages);
160
+ return newMessages;
161
+ }
162
+ /**
163
+ * Internal: Generate LLM response (with tool loop)
164
+ */
165
+ async generateResponse(context, callbacks) {
166
+ const newMessages = [];
167
+ const useNativeTools = (this.llm.supportsTools?.() ?? false) && this.toolDefinitions.length > 0;
168
+ const hasTools = this.toolDefinitions.length > 0;
169
+ // Tool execution loop
170
+ for (let iteration = 0; iteration < MAX_TOOL_ITERATIONS; iteration++) {
171
+ const isToolCheckTurn = hasTools && iteration === 0;
172
+ // Native tools now support streaming (via <text_response> format)
173
+ // So we can stream whenever it's appropriate
174
+ const shouldStream = !isToolCheckTurn || useNativeTools;
175
+ const result = await this.generateLLMResponse(context, callbacks, useNativeTools, shouldStream // Enable streaming for native tools too
176
+ );
177
+ const toolCalls = useNativeTools
178
+ ? result.toolCalls
179
+ : this.parsePromptBasedToolCalls(result.content);
180
+ if (!toolCalls || toolCalls.length === 0) {
181
+ // Only call streamResponse if we didn't stream during generation
182
+ // Native tools stream during generation, so skip here
183
+ if (!shouldStream) {
184
+ await this.streamResponse(result.content, callbacks);
185
+ }
186
+ const assistantMsg = { role: 'assistant', content: result.content };
187
+ context.history.push(assistantMsg);
188
+ newMessages.push(assistantMsg);
189
+ return newMessages;
190
+ }
191
+ // Tool call - say filler phrase
192
+ if (this.toolFillerPhrases.length > 0) {
193
+ const fillerPhrase = this.toolFillerPhrases[this.fillerPhraseIndex % this.toolFillerPhrases.length];
194
+ this.fillerPhraseIndex++;
195
+ await this.streamResponse(fillerPhrase + ' ', callbacks);
196
+ }
197
+ const assistantContent = useNativeTools ? result.content : '';
198
+ const assistantMsg = {
199
+ role: 'assistant',
200
+ content: assistantContent,
201
+ toolCalls,
202
+ };
203
+ context.history.push(assistantMsg);
204
+ newMessages.push(assistantMsg);
205
+ // Execute tools
206
+ for (const toolCall of toolCalls) {
207
+ callbacks.onToolCall?.(toolCall);
208
+ const tool = this.tools.get(toolCall.name);
209
+ if (!tool) {
210
+ const errorMsg = {
211
+ role: 'tool',
212
+ toolCallId: toolCall.id,
213
+ content: JSON.stringify({ error: `Unknown tool: ${toolCall.name}` }),
214
+ };
215
+ context.history.push(errorMsg);
216
+ newMessages.push(errorMsg);
217
+ callbacks.onToolResult?.(toolCall.id, { error: `Unknown tool: ${toolCall.name}` });
218
+ continue;
219
+ }
220
+ try {
221
+ const toolResult = await tool.execute(toolCall.arguments);
222
+ const resultMsg = {
223
+ role: 'tool',
224
+ toolCallId: toolCall.id,
225
+ content: JSON.stringify(toolResult),
226
+ };
227
+ context.history.push(resultMsg);
228
+ newMessages.push(resultMsg);
229
+ callbacks.onToolResult?.(toolCall.id, toolResult);
230
+ }
231
+ catch (error) {
232
+ const errorResult = { error: error instanceof Error ? error.message : String(error) };
233
+ const errorMsg = {
234
+ role: 'tool',
235
+ toolCallId: toolCall.id,
236
+ content: JSON.stringify(errorResult),
237
+ };
238
+ context.history.push(errorMsg);
239
+ newMessages.push(errorMsg);
240
+ callbacks.onToolResult?.(toolCall.id, errorResult);
241
+ }
242
+ }
243
+ }
244
+ console.warn('VoicePipeline: Max tool iterations reached');
245
+ return newMessages;
246
+ }
247
+ /**
248
+ * Stream a response to the client with optional TTS
249
+ */
250
+ async streamResponse(content, callbacks) {
251
+ if (!content)
252
+ return;
253
+ // Stream text chunks
254
+ callbacks.onResponseChunk(content);
255
+ // TTS if available
256
+ if (this.tts) {
257
+ const normalizedText = this.textNormalizer.normalize(content);
258
+ if (normalizedText) {
259
+ const playable = await this.tts.synthesize(normalizedText);
260
+ callbacks.onAudio(playable);
261
+ }
262
+ }
263
+ }
264
+ /**
265
+ * Generate LLM response
266
+ */
267
+ async generateLLMResponse(context, callbacks, useNativeTools, shouldStream) {
268
+ const tools = this.toolDefinitions.length > 0 ? this.toolDefinitions : undefined;
269
+ if (shouldStream && this.tts) {
270
+ return this.generateWithStreamingTTS(context, callbacks, useNativeTools);
271
+ }
272
+ if (shouldStream) {
273
+ const result = await this.llm.generate(context.history, {
274
+ tools,
275
+ conversationId: context.conversationId,
276
+ onToken: (token) => callbacks.onResponseChunk(token),
277
+ });
278
+ return { content: result.content, toolCalls: result.toolCalls };
279
+ }
280
+ const result = await this.llm.generate(context.history, {
281
+ tools,
282
+ conversationId: context.conversationId,
283
+ });
284
+ return { content: result.content, toolCalls: result.toolCalls };
285
+ }
286
+ /**
287
+ * Generate with streaming TTS (sentence by sentence)
288
+ */
289
+ async generateWithStreamingTTS(context, callbacks, _useNativeTools) {
290
+ const tools = this.toolDefinitions.length > 0 ? this.toolDefinitions : undefined;
291
+ let sentenceBuffer = '';
292
+ const sentenceEnders = /[.!?]/;
293
+ const playableQueue = new Map();
294
+ let nextSentenceIndex = 0;
295
+ let nextToSend = 0;
296
+ const ttsPromises = [];
297
+ const flushPlayableQueue = () => {
298
+ while (playableQueue.has(nextToSend)) {
299
+ const playable = playableQueue.get(nextToSend);
300
+ callbacks.onAudio(playable);
301
+ playableQueue.delete(nextToSend);
302
+ nextToSend++;
303
+ }
304
+ };
305
+ const queueTTS = (sentence, index) => {
306
+ const normalizedText = this.textNormalizer.normalize(sentence);
307
+ const promise = this.tts
308
+ .synthesize(normalizedText)
309
+ .then((playable) => {
310
+ playableQueue.set(index, playable);
311
+ flushPlayableQueue();
312
+ })
313
+ .catch(() => {
314
+ nextToSend = Math.max(nextToSend, index + 1);
315
+ flushPlayableQueue();
316
+ });
317
+ ttsPromises.push(promise);
318
+ };
319
+ const result = await this.llm.generate(context.history, {
320
+ tools,
321
+ conversationId: context.conversationId,
322
+ onToken: (token) => {
323
+ callbacks.onResponseChunk(token);
324
+ sentenceBuffer += token;
325
+ const match = sentenceBuffer.match(sentenceEnders);
326
+ if (match && match.index !== undefined) {
327
+ const sentence = sentenceBuffer.slice(0, match.index + 1).trim();
328
+ sentenceBuffer = sentenceBuffer.slice(match.index + 1);
329
+ if (sentence) {
330
+ queueTTS(sentence, nextSentenceIndex++);
331
+ }
332
+ }
333
+ },
334
+ });
335
+ if (sentenceBuffer.trim()) {
336
+ queueTTS(sentenceBuffer.trim(), nextSentenceIndex++);
337
+ }
338
+ if (ttsPromises.length > 0) {
339
+ await Promise.all(ttsPromises);
340
+ }
341
+ return { content: result.content, toolCalls: result.toolCalls };
342
+ }
343
+ /**
344
+ * Parse tool calls from LLM output (for non-native tool backends)
345
+ */
346
+ parsePromptBasedToolCalls(content) {
347
+ if (this.toolDefinitions.length === 0) {
348
+ return undefined;
349
+ }
350
+ // Check if the content looks like a tool call (starts with { and contains "tool_call")
351
+ const trimmed = content.trim();
352
+ if (!trimmed.startsWith('{') || !trimmed.includes('"tool_call"')) {
353
+ return undefined;
354
+ }
355
+ // Try to parse the entire content as a tool call JSON
356
+ try {
357
+ const parsed = JSON.parse(trimmed);
358
+ if (parsed.tool_call?.name) {
359
+ return [{
360
+ id: `prompt-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
361
+ name: parsed.tool_call.name,
362
+ arguments: parsed.tool_call.arguments || {},
363
+ }];
364
+ }
365
+ }
366
+ catch {
367
+ // Not valid JSON, try to extract tool call with regex
368
+ }
369
+ // Fallback: try to extract JSON object from content
370
+ // This handles cases where there's extra text around the JSON
371
+ const jsonMatch = content.match(/\{[\s\S]*"tool_call"[\s\S]*\}/);
372
+ if (jsonMatch) {
373
+ try {
374
+ const parsed = JSON.parse(jsonMatch[0]);
375
+ if (parsed.tool_call?.name) {
376
+ return [{
377
+ id: `prompt-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
378
+ name: parsed.tool_call.name,
379
+ arguments: parsed.tool_call.arguments || {},
380
+ }];
381
+ }
382
+ }
383
+ catch {
384
+ // Skip malformed JSON
385
+ }
386
+ }
387
+ return undefined;
388
+ }
389
+ }
390
+ //# sourceMappingURL=voice-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-pipeline.js","sourceRoot":"","sources":["../src/voice-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,uEAAuE;AACvE,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,mDAAmD;AACnD,MAAM,2BAA2B,GAAG;IAClC,4BAA4B;IAC5B,oBAAoB;IACpB,sBAAsB;CACvB,CAAC;AA2CF,MAAM,OAAO,aAAa;IAChB,GAAG,CAAqB;IACxB,GAAG,CAAc;IACjB,GAAG,CAAqB;IACxB,YAAY,CAAS;IACrB,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,KAAK,GAAsB,IAAI,GAAG,EAAE,CAAC;IACrC,eAAe,GAAqB,EAAE,CAAC;IACvC,iBAAiB,CAAW;IAC5B,iBAAiB,GAAG,CAAC,CAAC;IAE9B,YAAY,MAA2B;QACrC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC;QAC9B,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,2BAA2B,CAAC;QAEjF,iBAAiB;QACjB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAU;QACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YACxB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,IAAY;QACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA6B;QAC5C,MAAM,QAAQ,GAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QAEpE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,OAAO,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,QAAQ,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,OAA4B,EAC5B,SAAuD;QAEvD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE;gBAC9D,GAAG,SAAS;gBACZ,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;aACvB,CAAC,CAAC;YACH,SAAS,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,CAAC,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7E,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAChB,KAAmB,EACnB,OAA4B,EAC5B,SAAiC;QAEjC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;YACtF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;gBACvB,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBAC3D,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAEnC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YACjF,SAAS,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,CAAC,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7E,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAC7B,UAAkB,EAClB,OAA4B,EAC5B,SAAiC;QAEjC,MAAM,WAAW,GAAc,EAAE,CAAC;QAElC,sCAAsC;QACtC,MAAM,WAAW,GAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QACnE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE9B,iCAAiC;QACjC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzE,WAAW,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAEtC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAC5B,OAA4B,EAC5B,SAAiC;QAEjC,MAAM,WAAW,GAAc,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAChG,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAEjD,sBAAsB;QACtB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,mBAAmB,EAAE,SAAS,EAAE,EAAE,CAAC;YACrE,MAAM,eAAe,GAAG,QAAQ,IAAI,SAAS,KAAK,CAAC,CAAC;YACpD,kEAAkE;YAClE,6CAA6C;YAC7C,MAAM,YAAY,GAAG,CAAC,eAAe,IAAI,cAAc,CAAC;YAExD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAC3C,OAAO,EACP,SAAS,EACT,cAAc,EACd,YAAY,CAAE,wCAAwC;aACvD,CAAC;YAEF,MAAM,SAAS,GAAG,cAAc;gBAC9B,CAAC,CAAC,MAAM,CAAC,SAAS;gBAClB,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAEnD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,iEAAiE;gBACjE,sDAAsD;gBACtD,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACvD,CAAC;gBAED,MAAM,YAAY,GAAY,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC7E,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACnC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC/B,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,gCAAgC;YAChC,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBACpG,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,GAAG,GAAG,EAAE,SAAS,CAAC,CAAC;YAC3D,CAAC;YAED,MAAM,gBAAgB,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,YAAY,GAAqB;gBACrC,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,gBAAgB;gBACzB,SAAS;aACV,CAAC;YACF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE/B,gBAAgB;YAChB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,SAAS,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;gBAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,MAAM,QAAQ,GAAgB;wBAC5B,IAAI,EAAE,MAAM;wBACZ,UAAU,EAAE,QAAQ,CAAC,EAAE;wBACvB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;qBACrE,CAAC;oBACF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC/B,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC3B,SAAS,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACnF,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;oBAC1D,MAAM,SAAS,GAAgB;wBAC7B,IAAI,EAAE,MAAM;wBACZ,UAAU,EAAE,QAAQ,CAAC,EAAE;wBACvB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;qBACpC,CAAC;oBACF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAChC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC5B,SAAS,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;gBACpD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtF,MAAM,QAAQ,GAAgB;wBAC5B,IAAI,EAAE,MAAM;wBACZ,UAAU,EAAE,QAAQ,CAAC,EAAE;wBACvB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;qBACrC,CAAC;oBACF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC/B,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC3B,SAAS,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC3D,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,SAAiC;QAC7E,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,qBAAqB;QACrB,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEnC,mBAAmB;QACnB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;gBAC3D,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC/B,OAA4B,EAC5B,SAAiC,EACjC,cAAuB,EACvB,YAAqB;QAErB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;QAEjF,IAAI,YAAY,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;gBACtD,KAAK;gBACL,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC;aACrD,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QAClE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;YACtD,KAAK;YACL,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IAClE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,wBAAwB,CACpC,OAA4B,EAC5B,SAAiC,EACjC,eAAwB;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,MAAM,cAAc,GAAG,OAAO,CAAC;QAC/B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAyB,CAAC;QACvD,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,WAAW,GAAoB,EAAE,CAAC;QAExC,MAAM,kBAAkB,GAAG,GAAG,EAAE;YAC9B,OAAO,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;gBAChD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC5B,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACjC,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAE,EAAE;YACnD,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAI;iBACtB,UAAU,CAAC,cAAc,CAAC;iBAC1B,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACjB,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACnC,kBAAkB,EAAE,CAAC;YACvB,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC7C,kBAAkB,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;YACL,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;YACtD,KAAK;YACL,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;gBACjC,cAAc,IAAI,KAAK,CAAC;gBAExB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBACnD,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACjE,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBACvD,IAAI,QAAQ,EAAE,CAAC;wBACb,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1B,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IAClE,CAAC;IAED;;OAEG;IACK,yBAAyB,CAAC,OAAe;QAC/C,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,uFAAuF;QACvF,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACjE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;gBAC3B,OAAO,CAAC;wBACN,EAAE,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;wBACpE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI;wBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE;qBAC5C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;QACxD,CAAC;QAED,oDAAoD;QACpD,8DAA8D;QAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACjE,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;oBAC3B,OAAO,CAAC;4BACN,EAAE,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;4BACpE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI;4BAC3B,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE;yBAC5C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "modular-voice-agent-sdk",
3
+ "version": "1.0.0",
4
+ "description": "Modular isomorphic STT → LLM → TTS pipeline library for AI voice agents and voice assistants",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ },
14
+ "./native": {
15
+ "import": "./dist/backends/native/index.js",
16
+ "types": "./dist/backends/native/index.d.ts"
17
+ },
18
+ "./cloud": {
19
+ "import": "./dist/backends/cloud/index.js",
20
+ "types": "./dist/backends/cloud/index.d.ts"
21
+ },
22
+ "./client": {
23
+ "import": "./dist/client/index.js",
24
+ "types": "./dist/client/index.d.ts"
25
+ },
26
+ "./server": {
27
+ "import": "./dist/server/index.js",
28
+ "types": "./dist/server/index.d.ts"
29
+ }
30
+ },
31
+ "bin": {
32
+ "mvas": "./dist/cli.js"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "scripts",
37
+ "README.md",
38
+ "USAGE.md"
39
+ ],
40
+ "scripts": {
41
+ "build": "tsc -p tsconfig.build.json",
42
+ "dev": "tsc -p tsconfig.build.json --watch",
43
+ "prepublishOnly": "npm run build"
44
+ },
45
+ "workspaces": [
46
+ "examples"
47
+ ],
48
+ "dependencies": {
49
+ "@huggingface/transformers": "^3.8.1",
50
+ "number-to-words": "^1.2.4"
51
+ },
52
+ "peerDependencies": {
53
+ "ws": "^8.0.0"
54
+ },
55
+ "peerDependenciesMeta": {
56
+ "ws": {
57
+ "optional": true
58
+ }
59
+ },
60
+ "devDependencies": {
61
+ "@types/node": "^20.10.0",
62
+ "@types/number-to-words": "^1.2.3",
63
+ "@types/ws": "^8.5.10",
64
+ "typescript": "^5.3.0"
65
+ },
66
+ "keywords": [
67
+ "voice",
68
+ "voice-agent",
69
+ "voice-assistant",
70
+ "speech-to-text",
71
+ "text-to-speech",
72
+ "speech-to-speech",
73
+ "stt",
74
+ "tts",
75
+ "llm",
76
+ "conversational-ai",
77
+ "voice-ai",
78
+ "realtime",
79
+ "streaming",
80
+ "audio",
81
+ "ai-assistant",
82
+ "modular",
83
+ "MVAS",
84
+ "modular-voice-agent-sdk"
85
+ ],
86
+ "license": "MIT",
87
+ "repository": {
88
+ "type": "git",
89
+ "url": "https://github.com/bigfive/modular-voice-agent-sdk.git"
90
+ },
91
+ "author": "Jonathan Williams <bigfive@users.noreply.github.com>",
92
+ "homepage": "https://github.com/bigfive/modular-voice-agent-sdk#readme",
93
+ "bugs": {
94
+ "url": "https://github.com/bigfive/modular-voice-agent-sdk/issues"
95
+ }
96
+ }