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,22 @@
1
+ /**
2
+ * Cloud LLM Pipeline (OpenAI-compatible API)
3
+ * Works with: OpenAI, Ollama, vLLM, LMStudio, and any OpenAI-compatible endpoint
4
+ *
5
+ * Uses native fetch with streaming - no external dependencies required.
6
+ * Supports native tool calling via the OpenAI function calling API.
7
+ */
8
+ import type { LLMPipeline, CloudLLMConfig, ProgressCallback, Message, LLMGenerateOptions, LLMGenerateResult } from '../../types';
9
+ export declare class CloudLLM implements LLMPipeline {
10
+ private config;
11
+ private ready;
12
+ private tracker;
13
+ constructor(config: CloudLLMConfig);
14
+ initialize(_onProgress?: ProgressCallback): Promise<void>;
15
+ supportsTools(): boolean;
16
+ generate(messages: Message[], options?: LLMGenerateOptions): Promise<LLMGenerateResult>;
17
+ private convertMessages;
18
+ private convertTools;
19
+ private getHeaders;
20
+ isReady(): boolean;
21
+ }
22
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/backends/cloud/llm.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,kBAAkB,EAClB,iBAAiB,EAKlB,MAAM,aAAa,CAAC;AAuBrB,qBAAa,QAAS,YAAW,WAAW;IAC1C,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAyB;gBAE5B,MAAM,EAAE,cAAc;IAS5B,UAAU,CAAC,WAAW,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B/D,aAAa,IAAI,OAAO;IAIlB,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+J7F,OAAO,CAAC,eAAe;IAuCvB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,UAAU;IAUlB,OAAO,IAAI,OAAO;CAGnB"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Cloud LLM Pipeline (OpenAI-compatible API)
3
+ * Works with: OpenAI, Ollama, vLLM, LMStudio, and any OpenAI-compatible endpoint
4
+ *
5
+ * Uses native fetch with streaming - no external dependencies required.
6
+ * Supports native tool calling via the OpenAI function calling API.
7
+ */
8
+ import { LLMLogger, LLMConversationTracker } from '../../services';
9
+ export class CloudLLM {
10
+ config;
11
+ ready = false;
12
+ tracker;
13
+ constructor(config) {
14
+ this.config = {
15
+ maxTokens: 256,
16
+ temperature: 0.7,
17
+ ...config,
18
+ };
19
+ this.tracker = new LLMConversationTracker(new LLMLogger());
20
+ }
21
+ async initialize(_onProgress) {
22
+ console.log(`Initializing Cloud LLM (${this.config.baseUrl})...`);
23
+ console.log(` Model: ${this.config.model}`);
24
+ // Validate the endpoint is reachable (optional health check)
25
+ try {
26
+ const modelsUrl = `${this.config.baseUrl}/models`;
27
+ const response = await fetch(modelsUrl, {
28
+ method: 'GET',
29
+ headers: this.getHeaders(),
30
+ });
31
+ if (!response.ok) {
32
+ // Some endpoints don't have /models, that's okay
33
+ console.log(' Note: /models endpoint not available (this is fine for some providers)');
34
+ }
35
+ else {
36
+ console.log(' API endpoint verified.');
37
+ }
38
+ }
39
+ catch {
40
+ // Connection errors are fine during init - we'll fail at generate time if needed
41
+ console.log(' Note: Could not verify API endpoint (will retry on first request)');
42
+ }
43
+ this.ready = true;
44
+ console.log('Cloud LLM ready.');
45
+ }
46
+ supportsTools() {
47
+ return true;
48
+ }
49
+ async generate(messages, options) {
50
+ if (!this.ready) {
51
+ throw new Error('LLM pipeline not initialized');
52
+ }
53
+ // Use conversation ID if provided, else default
54
+ const conversationId = options?.conversationId ?? 'default';
55
+ // Log the input messages
56
+ this.tracker.logInput(conversationId, messages);
57
+ const url = `${this.config.baseUrl}/chat/completions`;
58
+ // Convert messages to OpenAI format
59
+ const openaiMessages = this.convertMessages(messages);
60
+ // Build request body
61
+ const body = {
62
+ model: this.config.model,
63
+ messages: openaiMessages,
64
+ max_tokens: this.config.maxTokens,
65
+ temperature: this.config.temperature,
66
+ stream: true,
67
+ };
68
+ // Add tools if provided
69
+ if (options?.tools && options.tools.length > 0) {
70
+ body.tools = this.convertTools(options.tools);
71
+ }
72
+ const response = await fetch(url, {
73
+ method: 'POST',
74
+ headers: {
75
+ ...this.getHeaders(),
76
+ 'Content-Type': 'application/json',
77
+ },
78
+ body: JSON.stringify(body),
79
+ });
80
+ if (!response.ok) {
81
+ const errorText = await response.text();
82
+ throw new Error(`Cloud LLM API error (${response.status}): ${errorText}`);
83
+ }
84
+ if (!response.body) {
85
+ throw new Error('No response body received');
86
+ }
87
+ // Parse SSE stream
88
+ const reader = response.body.getReader();
89
+ const decoder = new TextDecoder();
90
+ let fullContent = '';
91
+ let buffer = '';
92
+ const toolCalls = new Map();
93
+ let finishReason = 'stop';
94
+ while (true) {
95
+ const { done, value } = await reader.read();
96
+ if (done) {
97
+ break;
98
+ }
99
+ buffer += decoder.decode(value, { stream: true });
100
+ // Process complete SSE lines
101
+ const lines = buffer.split('\n');
102
+ buffer = lines.pop() || ''; // Keep incomplete line in buffer
103
+ for (const line of lines) {
104
+ const trimmed = line.trim();
105
+ if (!trimmed || trimmed === 'data: [DONE]') {
106
+ continue;
107
+ }
108
+ if (trimmed.startsWith('data: ')) {
109
+ const jsonStr = trimmed.slice(6);
110
+ try {
111
+ const parsed = JSON.parse(jsonStr);
112
+ const choice = parsed.choices?.[0];
113
+ const delta = choice?.delta;
114
+ // Handle text content
115
+ if (delta?.content) {
116
+ fullContent += delta.content;
117
+ options?.onToken?.(delta.content);
118
+ }
119
+ // Handle tool calls (streamed incrementally)
120
+ if (delta?.tool_calls) {
121
+ for (const tc of delta.tool_calls) {
122
+ const index = tc.index ?? 0;
123
+ if (!toolCalls.has(index)) {
124
+ toolCalls.set(index, { id: '', name: '', arguments: '' });
125
+ }
126
+ const existing = toolCalls.get(index);
127
+ if (tc.id) {
128
+ existing.id = tc.id;
129
+ }
130
+ if (tc.function?.name) {
131
+ existing.name = tc.function.name;
132
+ }
133
+ if (tc.function?.arguments) {
134
+ existing.arguments += tc.function.arguments;
135
+ }
136
+ }
137
+ }
138
+ // Check finish reason
139
+ if (choice?.finish_reason === 'tool_calls') {
140
+ finishReason = 'tool_calls';
141
+ }
142
+ }
143
+ catch {
144
+ // Skip malformed JSON lines (can happen with some providers)
145
+ }
146
+ }
147
+ }
148
+ }
149
+ // Convert collected tool calls to our format
150
+ const resultToolCalls = [];
151
+ for (const [, tc] of toolCalls) {
152
+ if (tc.id && tc.name) {
153
+ let args = {};
154
+ try {
155
+ args = JSON.parse(tc.arguments || '{}');
156
+ }
157
+ catch {
158
+ // Use empty args if parsing fails
159
+ }
160
+ const toolCall = {
161
+ id: tc.id,
162
+ name: tc.name,
163
+ arguments: args,
164
+ };
165
+ resultToolCalls.push(toolCall);
166
+ options?.onToolCall?.(toolCall);
167
+ }
168
+ }
169
+ // Log the response
170
+ this.tracker.logOutput(conversationId, fullContent, resultToolCalls.length > 0 ? resultToolCalls : undefined);
171
+ return {
172
+ content: fullContent,
173
+ toolCalls: resultToolCalls.length > 0 ? resultToolCalls : undefined,
174
+ finishReason: resultToolCalls.length > 0 ? 'tool_calls' : finishReason,
175
+ };
176
+ }
177
+ convertMessages(messages) {
178
+ return messages.map((m) => {
179
+ // Handle tool messages
180
+ if (m.role === 'tool') {
181
+ const toolMsg = m;
182
+ return {
183
+ role: 'tool',
184
+ content: toolMsg.content,
185
+ tool_call_id: toolMsg.toolCallId,
186
+ };
187
+ }
188
+ // Handle assistant messages with tool calls
189
+ if (m.role === 'assistant') {
190
+ const assistantMsg = m;
191
+ if (assistantMsg.toolCalls && assistantMsg.toolCalls.length > 0) {
192
+ return {
193
+ role: 'assistant',
194
+ content: assistantMsg.content || null,
195
+ tool_calls: assistantMsg.toolCalls.map((tc) => ({
196
+ id: tc.id,
197
+ type: 'function',
198
+ function: {
199
+ name: tc.name,
200
+ arguments: JSON.stringify(tc.arguments),
201
+ },
202
+ })),
203
+ };
204
+ }
205
+ }
206
+ // Regular messages
207
+ return {
208
+ role: m.role,
209
+ content: m.content,
210
+ };
211
+ });
212
+ }
213
+ convertTools(tools) {
214
+ return tools.map((tool) => ({
215
+ type: 'function',
216
+ function: {
217
+ name: tool.name,
218
+ description: tool.description,
219
+ parameters: tool.parameters,
220
+ },
221
+ }));
222
+ }
223
+ getHeaders() {
224
+ const headers = {};
225
+ if (this.config.apiKey) {
226
+ headers['Authorization'] = `Bearer ${this.config.apiKey}`;
227
+ }
228
+ return headers;
229
+ }
230
+ isReady() {
231
+ return this.ready;
232
+ }
233
+ }
234
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/backends/cloud/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './transformers';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ // Export transformers (browser + Node.js compatible) from main index
2
+ // Native backends must be imported directly: import { ... } from 'modular-voice-agent-sdk/native'
3
+ // Cloud backends must be imported directly: import { CloudLLM } from 'modular-voice-agent-sdk/cloud'
4
+ // Web Speech APIs are in the client module: import { WebSpeechSTT, WebSpeechTTS } from 'modular-voice-agent-sdk/client'
5
+ export * from './transformers';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,kGAAkG;AAClG,qGAAqG;AACrG,wHAAwH;AACxH,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { NativeSTT } from './stt';
2
+ export { NativeLLM } from './llm';
3
+ export { NativeTTS } from './tts';
4
+ export { getCacheDir, getModelsDir, getBinDir, getModelPath, getBinaryPath, defaultBinaries, } from '../../cache';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backends/native/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { NativeSTT } from './stt';
2
+ export { NativeLLM } from './llm';
3
+ export { NativeTTS } from './tts';
4
+ // Cache utilities (Node.js only)
5
+ export { getCacheDir, getModelsDir, getBinDir, getModelPath, getBinaryPath, defaultBinaries, } from '../../cache';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/native/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,iCAAiC;AACjC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Native LLM Pipeline (llama.cpp)
3
+ * Server-only - requires native binary (llama-completion)
4
+ *
5
+ * When tools are provided, uses GBNF grammar that allows either:
6
+ * - TOOL: [{"name": "...", "arguments": {...}}] for tool invocations
7
+ * - SAY: natural language for direct responses (streamable!)
8
+ *
9
+ * This allows real token streaming for text responses while maintaining
10
+ * structured tool calling when needed.
11
+ */
12
+ import type { LLMPipeline, NativeLLMConfig, ProgressCallback, Message, LLMGenerateOptions, LLMGenerateResult } from '../../types';
13
+ export declare class NativeLLM implements LLMPipeline {
14
+ private config;
15
+ private ready;
16
+ private tracker;
17
+ constructor(config: NativeLLMConfig);
18
+ initialize(_onProgress?: ProgressCallback): Promise<void>;
19
+ supportsTools(): boolean;
20
+ generate(messages: Message[], options?: LLMGenerateOptions): Promise<LLMGenerateResult>;
21
+ /**
22
+ * Build the tool system prompt
23
+ */
24
+ private buildToolSystemPrompt;
25
+ /**
26
+ * Generate with GBNF grammar constraint
27
+ * Allows either:
28
+ * - TOOL: [{...}] for tool invocations
29
+ * - SAY: text for streamable text responses
30
+ */
31
+ private generateWithGrammar;
32
+ /**
33
+ * Parse tool call output
34
+ * TOOL: [{"name": "...", "arguments": {...}}]
35
+ */
36
+ private parseToolCallOutput;
37
+ /**
38
+ * Build GBNF grammar that allows either:
39
+ * - TOOL: [{"name": "...", "arguments": {...}}]
40
+ * - SAY: free text
41
+ */
42
+ private buildToolGrammar;
43
+ /**
44
+ * Format chat prompt with tool definitions (for grammar mode)
45
+ * Uses ChatML format with tool instructions
46
+ */
47
+ private formatChatPromptWithTools;
48
+ /** Special tokens to filter from output */
49
+ private static readonly SPECIAL_TOKENS;
50
+ /**
51
+ * Run llama-completion and capture output
52
+ * Output goes to stdout, debug/timing info goes to stderr (ignored)
53
+ */
54
+ private runLlamaCompletion;
55
+ /**
56
+ * Run llama-completion with smart streaming
57
+ * - SAY: streams tokens as they arrive
58
+ * - TOOL: buffers until complete, then parses
59
+ */
60
+ private runLlamaCompletionWithStreaming;
61
+ /**
62
+ * Freeform generation (no grammar) - used when no tools are provided
63
+ */
64
+ private generateFreeform;
65
+ /**
66
+ * Format basic chat prompt (for non-tool mode)
67
+ */
68
+ private formatChatPrompt;
69
+ isReady(): boolean;
70
+ }
71
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/backends/native/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,OAAO,EACP,kBAAkB,EAClB,iBAAiB,EAGlB,MAAM,aAAa,CAAC;AAGrB,qBAAa,SAAU,YAAW,WAAW;IAC3C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAyB;gBAE5B,MAAM,EAAE,eAAe;IAK7B,UAAU,CAAC,WAAW,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/D,aAAa,IAAI,OAAO;IAIlB,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAe7F;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;;;;OAKG;YACW,mBAAmB;IA8CjC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAyCxB;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAwCjC,2CAA2C;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAmE;IAEzG;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA8C1B;;;;OAIG;IACH,OAAO,CAAC,+BAA+B;IAyHvC;;OAEG;YACW,gBAAgB;IA6B9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,IAAI,OAAO;CAGnB"}