@push.rocks/smartai 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/abstract.classes.multimodal.d.ts +18 -0
- package/dist_ts/abstract.classes.multimodal.js +1 -1
- package/dist_ts/provider.ollama.d.ts +6 -1
- package/dist_ts/provider.ollama.js +88 -7
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/abstract.classes.multimodal.ts +21 -1
- package/ts/provider.ollama.ts +100 -7
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartai',
|
|
6
|
-
version: '0.
|
|
6
|
+
version: '0.12.0',
|
|
7
7
|
description: 'SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLGtOQUFrTjtDQUNoTyxDQUFBIn0=
|
|
@@ -5,6 +5,8 @@ import * as plugins from './plugins.js';
|
|
|
5
5
|
export interface ChatMessage {
|
|
6
6
|
role: 'assistant' | 'user' | 'system';
|
|
7
7
|
content: string;
|
|
8
|
+
/** Base64-encoded images for vision-capable models */
|
|
9
|
+
images?: string[];
|
|
8
10
|
}
|
|
9
11
|
/**
|
|
10
12
|
* Options for chat interactions
|
|
@@ -13,6 +15,15 @@ export interface ChatOptions {
|
|
|
13
15
|
systemMessage: string;
|
|
14
16
|
userMessage: string;
|
|
15
17
|
messageHistory: ChatMessage[];
|
|
18
|
+
/** Base64-encoded images for the current message (vision-capable models) */
|
|
19
|
+
images?: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Options for streaming chat interactions
|
|
23
|
+
*/
|
|
24
|
+
export interface StreamingChatOptions extends ChatOptions {
|
|
25
|
+
/** Callback fired for each token during generation */
|
|
26
|
+
onToken?: (token: string) => void;
|
|
16
27
|
}
|
|
17
28
|
/**
|
|
18
29
|
* Response format for chat interactions
|
|
@@ -133,6 +144,13 @@ export declare abstract class MultiModalModel {
|
|
|
133
144
|
* @returns Stream of model responses
|
|
134
145
|
*/
|
|
135
146
|
abstract chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>>;
|
|
147
|
+
/**
|
|
148
|
+
* Streaming chat with token callback
|
|
149
|
+
* Calls onToken for each token generated, returns final response
|
|
150
|
+
* @param optionsArg Options containing system message, user message, message history, and onToken callback
|
|
151
|
+
* @returns Promise resolving to the assistant's response
|
|
152
|
+
*/
|
|
153
|
+
chatStreaming?(optionsArg: StreamingChatOptions): Promise<ChatResponse>;
|
|
136
154
|
/**
|
|
137
155
|
* Text-to-speech conversion
|
|
138
156
|
* @param optionsArg Options containing the message to convert to speech
|
|
@@ -40,4 +40,4 @@ export class MultiModalModel {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QuY2xhc3Nlcy5tdWx0aW1vZGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvYWJzdHJhY3QuY2xhc3Nlcy5tdWx0aW1vZGFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBc0h4Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQWdCLGVBQWU7SUFBckM7UUFDRTs7O1dBR0c7UUFDTyxxQkFBZ0IsR0FBcUMsSUFBSSxDQUFDO0lBNEd0RSxDQUFDO0lBMUdDOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxtQkFBbUI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEQsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQixrRUFBa0U7UUFDbEUsMkVBQTJFO0lBQzdFLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsSUFBSTtRQUNmLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztDQTZFRiJ9
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MultiModalModel } from './abstract.classes.multimodal.js';
|
|
2
|
-
import type { ChatOptions, ChatResponse, ChatMessage, ResearchOptions, ResearchResponse, ImageGenerateOptions, ImageEditOptions, ImageResponse } from './abstract.classes.multimodal.js';
|
|
2
|
+
import type { ChatOptions, ChatResponse, ChatMessage, ResearchOptions, ResearchResponse, ImageGenerateOptions, ImageEditOptions, ImageResponse, StreamingChatOptions } from './abstract.classes.multimodal.js';
|
|
3
3
|
/**
|
|
4
4
|
* Ollama model runtime options
|
|
5
5
|
* @see https://github.com/ollama/ollama/blob/main/docs/modelfile.md
|
|
@@ -63,6 +63,11 @@ export declare class OllamaProvider extends MultiModalModel {
|
|
|
63
63
|
stop(): Promise<void>;
|
|
64
64
|
chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>>;
|
|
65
65
|
chat(optionsArg: ChatOptions): Promise<ChatResponse>;
|
|
66
|
+
/**
|
|
67
|
+
* Streaming chat with token callback (implements MultiModalModel interface)
|
|
68
|
+
* Calls onToken for each token generated during the response
|
|
69
|
+
*/
|
|
70
|
+
chatStreaming(optionsArg: StreamingChatOptions): Promise<ChatResponse>;
|
|
66
71
|
/**
|
|
67
72
|
* Streaming chat with async iteration and options support
|
|
68
73
|
*/
|
|
@@ -120,10 +120,28 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
120
120
|
// Implementing the synchronous chat interaction
|
|
121
121
|
async chat(optionsArg) {
|
|
122
122
|
// Format messages for Ollama
|
|
123
|
+
const historyMessages = optionsArg.messageHistory.map((msg) => {
|
|
124
|
+
const formatted = {
|
|
125
|
+
role: msg.role,
|
|
126
|
+
content: msg.content,
|
|
127
|
+
};
|
|
128
|
+
if (msg.images && msg.images.length > 0) {
|
|
129
|
+
formatted.images = msg.images;
|
|
130
|
+
}
|
|
131
|
+
return formatted;
|
|
132
|
+
});
|
|
133
|
+
// Build user message with optional images
|
|
134
|
+
const userMessage = {
|
|
135
|
+
role: 'user',
|
|
136
|
+
content: optionsArg.userMessage,
|
|
137
|
+
};
|
|
138
|
+
if (optionsArg.images && optionsArg.images.length > 0) {
|
|
139
|
+
userMessage.images = optionsArg.images;
|
|
140
|
+
}
|
|
123
141
|
const messages = [
|
|
124
142
|
{ role: 'system', content: optionsArg.systemMessage },
|
|
125
|
-
...
|
|
126
|
-
|
|
143
|
+
...historyMessages,
|
|
144
|
+
userMessage,
|
|
127
145
|
];
|
|
128
146
|
// Make API call to Ollama with defaultOptions and timeout
|
|
129
147
|
const response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
@@ -148,6 +166,31 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
148
166
|
message: result.message.content,
|
|
149
167
|
};
|
|
150
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Streaming chat with token callback (implements MultiModalModel interface)
|
|
171
|
+
* Calls onToken for each token generated during the response
|
|
172
|
+
*/
|
|
173
|
+
async chatStreaming(optionsArg) {
|
|
174
|
+
const onToken = optionsArg.onToken;
|
|
175
|
+
// Use existing collectStreamResponse with callback, including images
|
|
176
|
+
const response = await this.collectStreamResponse({
|
|
177
|
+
systemMessage: optionsArg.systemMessage,
|
|
178
|
+
userMessage: optionsArg.userMessage,
|
|
179
|
+
messageHistory: optionsArg.messageHistory,
|
|
180
|
+
images: optionsArg.images,
|
|
181
|
+
}, (chunk) => {
|
|
182
|
+
if (onToken) {
|
|
183
|
+
if (chunk.thinking)
|
|
184
|
+
onToken(chunk.thinking);
|
|
185
|
+
if (chunk.content)
|
|
186
|
+
onToken(chunk.content);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
return {
|
|
190
|
+
role: 'assistant',
|
|
191
|
+
message: response.message,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
151
194
|
/**
|
|
152
195
|
* Streaming chat with async iteration and options support
|
|
153
196
|
*/
|
|
@@ -155,10 +198,29 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
155
198
|
const model = optionsArg.model || this.model;
|
|
156
199
|
const timeout = optionsArg.timeout || this.defaultTimeout;
|
|
157
200
|
const modelOptions = { ...this.defaultOptions, ...optionsArg.options };
|
|
201
|
+
// Format history messages with optional images
|
|
202
|
+
const historyMessages = optionsArg.messageHistory.map((msg) => {
|
|
203
|
+
const formatted = {
|
|
204
|
+
role: msg.role,
|
|
205
|
+
content: msg.content,
|
|
206
|
+
};
|
|
207
|
+
if (msg.images && msg.images.length > 0) {
|
|
208
|
+
formatted.images = msg.images;
|
|
209
|
+
}
|
|
210
|
+
return formatted;
|
|
211
|
+
});
|
|
212
|
+
// Build user message with optional images
|
|
213
|
+
const userMessage = {
|
|
214
|
+
role: 'user',
|
|
215
|
+
content: optionsArg.userMessage,
|
|
216
|
+
};
|
|
217
|
+
if (optionsArg.images && optionsArg.images.length > 0) {
|
|
218
|
+
userMessage.images = optionsArg.images;
|
|
219
|
+
}
|
|
158
220
|
const messages = [
|
|
159
221
|
{ role: 'system', content: optionsArg.systemMessage },
|
|
160
|
-
...
|
|
161
|
-
|
|
222
|
+
...historyMessages,
|
|
223
|
+
userMessage,
|
|
162
224
|
];
|
|
163
225
|
const response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
164
226
|
method: 'POST',
|
|
@@ -244,10 +306,29 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
244
306
|
const model = optionsArg.model || this.model;
|
|
245
307
|
const timeout = optionsArg.timeout || this.defaultTimeout;
|
|
246
308
|
const modelOptions = { ...this.defaultOptions, ...optionsArg.options };
|
|
309
|
+
// Format history messages with optional images
|
|
310
|
+
const historyMessages = optionsArg.messageHistory.map((msg) => {
|
|
311
|
+
const formatted = {
|
|
312
|
+
role: msg.role,
|
|
313
|
+
content: msg.content,
|
|
314
|
+
};
|
|
315
|
+
if (msg.images && msg.images.length > 0) {
|
|
316
|
+
formatted.images = msg.images;
|
|
317
|
+
}
|
|
318
|
+
return formatted;
|
|
319
|
+
});
|
|
320
|
+
// Build user message with optional images
|
|
321
|
+
const userMessage = {
|
|
322
|
+
role: 'user',
|
|
323
|
+
content: optionsArg.userMessage,
|
|
324
|
+
};
|
|
325
|
+
if (optionsArg.images && optionsArg.images.length > 0) {
|
|
326
|
+
userMessage.images = optionsArg.images;
|
|
327
|
+
}
|
|
247
328
|
const messages = [
|
|
248
329
|
{ role: 'system', content: optionsArg.systemMessage },
|
|
249
|
-
...
|
|
250
|
-
|
|
330
|
+
...historyMessages,
|
|
331
|
+
userMessage,
|
|
251
332
|
];
|
|
252
333
|
const response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
253
334
|
method: 'POST',
|
|
@@ -358,4 +439,4 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
358
439
|
throw new Error('Image editing is not supported by Ollama. Please use OpenAI provider for image editing.');
|
|
359
440
|
}
|
|
360
441
|
}
|
|
361
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIub2xsYW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIub2xsYW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQW9FbkUsTUFBTSxPQUFPLGNBQWUsU0FBUSxlQUFlO0lBUWpELFlBQVksYUFBcUMsRUFBRTtRQUNqRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSx3QkFBd0IsQ0FBQztRQUM5RCxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDO0lBQzVELENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLDJCQUEyQjtRQUMzQixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLFdBQVcsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUN4RCxDQUFDO1FBQ0gsQ0FBQztRQUFD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
|
|
442
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIub2xsYW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIub2xsYW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQXNFbkUsTUFBTSxPQUFPLGNBQWUsU0FBUSxlQUFlO0lBUWpELFlBQVksYUFBcUMsRUFBRTtRQUNqRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSx3QkFBd0IsQ0FBQztRQUM5RCxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDO0lBQzVELENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLDJCQUEyQjtRQUMzQixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLFdBQVcsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUN4RCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFpQztRQUN2RCxpREFBaUQ7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxjQUFjLEdBQThDLElBQUksQ0FBQztRQUVyRSxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQXFCO1lBQ3hELFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUNyQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFbEQsc0RBQXNEO2dCQUN0RCxPQUFPLElBQUksRUFBRSxDQUFDO29CQUNaLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzFDLElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQzt3QkFBRSxNQUFNO29CQUUvQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDM0MsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUV4QyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO3dCQUNoQixJQUFJLENBQUM7NEJBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDakMsY0FBYyxHQUFHO2dDQUNmLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLE1BQU07Z0NBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUU7NkJBQy9CLENBQUM7d0JBQ0osQ0FBQzt3QkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDOzRCQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUVELG1EQUFtRDtnQkFDbkQsSUFBSSxjQUFjLEVBQUUsQ0FBQztvQkFDbkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxXQUFXLEVBQUU7d0JBQ3ZELE1BQU0sRUFBRSxNQUFNO3dCQUNkLE9BQU8sRUFBRTs0QkFDUCxjQUFjLEVBQUUsa0JBQWtCO3lCQUNuQzt3QkFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLOzRCQUNqQixRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7NEJBQzFFLE1BQU0sRUFBRSxJQUFJO3lCQUNiLENBQUM7cUJBQ0gsQ0FBQyxDQUFDO29CQUVILGlDQUFpQztvQkFDakMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztvQkFDMUMsSUFBSSxNQUFNLEVBQUUsQ0FBQzt3QkFDWCxJQUFJLENBQUM7NEJBQ0gsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQ0FDWixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dDQUM1QyxJQUFJLElBQUk7b0NBQUUsTUFBTTtnQ0FFaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0NBQzlDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBRWhDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7b0NBQ3pCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7d0NBQ2hCLElBQUksQ0FBQzs0Q0FDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDOzRDQUNoQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQzs0Q0FDeEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnREFDWixVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRDQUM5QixDQUFDO3dDQUNILENBQUM7d0NBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzs0Q0FDWCxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dDQUN2RCxDQUFDO29DQUNILENBQUM7Z0NBQ0gsQ0FBQzs0QkFDSCxDQUFDO3dCQUNILENBQUM7Z0NBQVMsQ0FBQzs0QkFDVCxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ3ZCLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQztZQUVELEtBQUssQ0FBQyxVQUFVO2dCQUNkLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsSUFBSSxDQUFDO3dCQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ25DLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDNUMsQ0FBQztvQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3hELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7UUFFSCw0Q0FBNEM7UUFDNUMsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxnREFBZ0Q7SUFDekMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUF1QjtRQUN2Qyw2QkFBNkI7UUFDN0IsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1RCxNQUFNLFNBQVMsR0FBeUQ7Z0JBQ3RFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtnQkFDZCxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87YUFDckIsQ0FBQztZQUNGLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsU0FBUyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQ2hDLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUVILDBDQUEwQztRQUMxQyxNQUFNLFdBQVcsR0FBeUQ7WUFDeEUsSUFBSSxFQUFFLE1BQU07WUFDWixPQUFPLEVBQUUsVUFBVSxDQUFDLFdBQVc7U0FDaEMsQ0FBQztRQUNGLElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxXQUFXLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDekMsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHO1lBQ2YsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsYUFBYSxFQUFFO1lBQ3JELEdBQUcsZUFBZTtZQUNsQixXQUFXO1NBQ1osQ0FBQztRQUVGLDBEQUEwRDtRQUMxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLFdBQVcsRUFBRTtZQUN2RCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYzthQUM3QixDQUFDO1lBQ0YsTUFBTSxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztTQUNqRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVyQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFdBQW9CO1lBQzFCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU87U0FDaEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQWdDO1FBQ3pELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFFbkMscUVBQXFFO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUMvQztZQUNFLGFBQWEsRUFBRSxVQUFVLENBQUMsYUFBYTtZQUN2QyxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7WUFDbkMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjO1lBQ3pDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtTQUMxQixFQUNELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLElBQUksS0FBSyxDQUFDLFFBQVE7b0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxLQUFLLENBQUMsT0FBTztvQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztRQUVGLE9BQU87WUFDTCxJQUFJLEVBQUUsV0FBb0I7WUFDMUIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1NBQzFCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQzdCLFVBQThCO1FBRTlCLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM3QyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDMUQsTUFBTSxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFdkUsK0NBQStDO1FBQy9DLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDNUQsTUFBTSxTQUFTLEdBQXlEO2dCQUN0RSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7Z0JBQ2QsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO2FBQ3JCLENBQUM7WUFDRixJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUNoQyxDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFFSCwwQ0FBMEM7UUFDMUMsTUFBTSxXQUFXLEdBQXlEO1lBQ3hFLElBQUksRUFBRSxNQUFNO1lBQ1osT0FBTyxFQUFFLFVBQVUsQ0FBQyxXQUFXO1NBQ2hDLENBQUM7UUFDRixJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsV0FBVyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRztZQUNmLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRTtZQUNyRCxHQUFHLGVBQWU7WUFDbEIsV0FBVztTQUNaLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLFdBQVcsRUFBRTtZQUN2RCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtZQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsS0FBSztnQkFDTCxRQUFRO2dCQUNSLE1BQU0sRUFBRSxJQUFJO2dCQUNaLE9BQU8sRUFBRSxZQUFZO2FBQ3RCLENBQUM7WUFDRixNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7U0FDckMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBRWxDLE9BQU87WUFDTCxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQztnQkFDckMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUM7b0JBQ0gsT0FBTyxJQUFJLEVBQUUsQ0FBQzt3QkFDWixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUM1QyxJQUFJLElBQUk7NEJBQUUsTUFBTTt3QkFDaEIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ2xELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2pDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO3dCQUMzQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDOzRCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtnQ0FBRSxTQUFTOzRCQUMzQixJQUFJLENBQUM7Z0NBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDOUIsTUFBTTtvQ0FDSixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRTtvQ0FDcEMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUTtvQ0FDaEMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSztvQ0FDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dDQUNqQixhQUFhLEVBQUUsSUFBSSxDQUFDLGNBQWM7d0NBQ2xDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtxQ0FDM0IsQ0FBQyxDQUFDLENBQUMsU0FBUztpQ0FDUSxDQUFDOzRCQUMxQixDQUFDOzRCQUFDLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7d0JBQ2xDLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO3dCQUFTLENBQUM7b0JBQ1QsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN2QixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMscUJBQXFCLENBQ2hDLFVBQThCLEVBQzlCLE9BQTZDO1FBRTdDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxLQUFtQyxDQUFDO1FBRXhDLElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLElBQUksS0FBSyxDQUFDLE9BQU87Z0JBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDNUMsSUFBSSxLQUFLLENBQUMsUUFBUTtnQkFBRSxRQUFRLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUMvQyxJQUFJLEtBQUssQ0FBQyxLQUFLO2dCQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3JDLElBQUksT0FBTztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU87WUFDTCxJQUFJLEVBQUUsV0FBb0I7WUFDMUIsT0FBTyxFQUFFLE9BQU87WUFDaEIsUUFBUSxFQUFFLFFBQVEsSUFBSSxTQUFTO1lBQy9CLEtBQUs7U0FDTixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUE4QjtRQUN6RCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzFELE1BQU0sWUFBWSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXZFLCtDQUErQztRQUMvQyxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzVELE1BQU0sU0FBUyxHQUF5RDtnQkFDdEUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2dCQUNkLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTzthQUNyQixDQUFDO1lBQ0YsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxTQUFTLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDaEMsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsMENBQTBDO1FBQzFDLE1BQU0sV0FBVyxHQUF5RDtZQUN4RSxJQUFJLEVBQUUsTUFBTTtZQUNaLE9BQU8sRUFBRSxVQUFVLENBQUMsV0FBVztTQUNoQyxDQUFDO1FBQ0YsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELFdBQVcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUc7WUFDZixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxhQUFhLEVBQUU7WUFDckQsR0FBRyxlQUFlO1lBQ2xCLFdBQVc7U0FDWixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxXQUFXLEVBQUU7WUFDdkQsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7WUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ25CLEtBQUs7Z0JBQ0wsUUFBUTtnQkFDUixNQUFNLEVBQUUsS0FBSztnQkFDYixPQUFPLEVBQUUsWUFBWTthQUN0QixDQUFDO1lBQ0YsTUFBTSxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1NBQ3JDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JDLE9BQU87WUFDTCxJQUFJLEVBQUUsV0FBb0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTztZQUMvQixRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQ2pDLEtBQUssRUFBRTtnQkFDTCxhQUFhLEVBQUUsTUFBTSxDQUFDLGNBQWM7Z0JBQ3BDLFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVTthQUM3QjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUErQjtRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBNkM7UUFDL0QsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxXQUFXLEVBQUU7WUFDdkQsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjthQUNuQztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQ3ZCLFFBQVEsRUFBRSxDQUFDO3dCQUNULElBQUksRUFBRSxNQUFNO3dCQUNaLE9BQU8sRUFBRSxVQUFVLENBQUMsTUFBTTt3QkFDMUIsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDO3FCQUN0QixDQUFDO2dCQUNGLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFLckI7UUFDQyw2REFBNkQ7UUFDN0QsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVqQyxpREFBaUQ7UUFDakQsSUFBSSx1QkFBdUIsR0FBaUIsRUFBRSxDQUFDO1FBRS9DLEtBQUssTUFBTSxXQUFXLElBQUksVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWlCLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUYsdUJBQXVCLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixNQUFNLFlBQVksR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRWpHLHFDQUFxQztRQUNyQyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLFdBQVcsRUFBRTtZQUN2RCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDdkIsUUFBUSxFQUFFO29CQUNSLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRTtvQkFDckQsR0FBRyxVQUFVLENBQUMsY0FBYztvQkFDNUI7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osT0FBTyxFQUFFLFVBQVUsQ0FBQyxXQUFXO3dCQUMvQixNQUFNLEVBQUUsWUFBWTtxQkFDckI7aUJBQ0Y7Z0JBQ0QsTUFBTSxFQUFFLEtBQUs7YUFDZCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckMsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsV0FBVztnQkFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTzthQUNoQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUEyQjtRQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFnQztRQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLCtGQUErRixDQUFDLENBQUM7SUFDbkgsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUE0QjtRQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLHlGQUF5RixDQUFDLENBQUM7SUFDN0csQ0FBQztDQUNGIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartai',
|
|
6
|
-
version: '0.
|
|
6
|
+
version: '0.12.0',
|
|
7
7
|
description: 'SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.'
|
|
8
8
|
}
|
|
@@ -6,6 +6,8 @@ import * as plugins from './plugins.js';
|
|
|
6
6
|
export interface ChatMessage {
|
|
7
7
|
role: 'assistant' | 'user' | 'system';
|
|
8
8
|
content: string;
|
|
9
|
+
/** Base64-encoded images for vision-capable models */
|
|
10
|
+
images?: string[];
|
|
9
11
|
}
|
|
10
12
|
|
|
11
13
|
/**
|
|
@@ -15,6 +17,16 @@ export interface ChatOptions {
|
|
|
15
17
|
systemMessage: string;
|
|
16
18
|
userMessage: string;
|
|
17
19
|
messageHistory: ChatMessage[];
|
|
20
|
+
/** Base64-encoded images for the current message (vision-capable models) */
|
|
21
|
+
images?: string[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Options for streaming chat interactions
|
|
26
|
+
*/
|
|
27
|
+
export interface StreamingChatOptions extends ChatOptions {
|
|
28
|
+
/** Callback fired for each token during generation */
|
|
29
|
+
onToken?: (token: string) => void;
|
|
18
30
|
}
|
|
19
31
|
|
|
20
32
|
/**
|
|
@@ -152,7 +164,7 @@ export abstract class MultiModalModel {
|
|
|
152
164
|
* @returns Promise resolving to the assistant's response
|
|
153
165
|
*/
|
|
154
166
|
public abstract chat(optionsArg: ChatOptions): Promise<ChatResponse>;
|
|
155
|
-
|
|
167
|
+
|
|
156
168
|
/**
|
|
157
169
|
* Streaming interface for chat interactions
|
|
158
170
|
* Allows for real-time responses from the model
|
|
@@ -161,6 +173,14 @@ export abstract class MultiModalModel {
|
|
|
161
173
|
*/
|
|
162
174
|
public abstract chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>>;
|
|
163
175
|
|
|
176
|
+
/**
|
|
177
|
+
* Streaming chat with token callback
|
|
178
|
+
* Calls onToken for each token generated, returns final response
|
|
179
|
+
* @param optionsArg Options containing system message, user message, message history, and onToken callback
|
|
180
|
+
* @returns Promise resolving to the assistant's response
|
|
181
|
+
*/
|
|
182
|
+
public chatStreaming?(optionsArg: StreamingChatOptions): Promise<ChatResponse>;
|
|
183
|
+
|
|
164
184
|
/**
|
|
165
185
|
* Text-to-speech conversion
|
|
166
186
|
* @param optionsArg Options containing the message to convert to speech
|
package/ts/provider.ollama.ts
CHANGED
|
@@ -9,7 +9,8 @@ import type {
|
|
|
9
9
|
ResearchResponse,
|
|
10
10
|
ImageGenerateOptions,
|
|
11
11
|
ImageEditOptions,
|
|
12
|
-
ImageResponse
|
|
12
|
+
ImageResponse,
|
|
13
|
+
StreamingChatOptions
|
|
13
14
|
} from './abstract.classes.multimodal.js';
|
|
14
15
|
|
|
15
16
|
/**
|
|
@@ -42,6 +43,7 @@ export interface IOllamaChatOptions extends ChatOptions {
|
|
|
42
43
|
options?: IOllamaModelOptions; // Per-request model options
|
|
43
44
|
timeout?: number; // Per-request timeout in ms
|
|
44
45
|
model?: string; // Per-request model override
|
|
46
|
+
// images is inherited from ChatOptions
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
/**
|
|
@@ -202,10 +204,30 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
202
204
|
// Implementing the synchronous chat interaction
|
|
203
205
|
public async chat(optionsArg: ChatOptions): Promise<ChatResponse> {
|
|
204
206
|
// Format messages for Ollama
|
|
207
|
+
const historyMessages = optionsArg.messageHistory.map((msg) => {
|
|
208
|
+
const formatted: { role: string; content: string; images?: string[] } = {
|
|
209
|
+
role: msg.role,
|
|
210
|
+
content: msg.content,
|
|
211
|
+
};
|
|
212
|
+
if (msg.images && msg.images.length > 0) {
|
|
213
|
+
formatted.images = msg.images;
|
|
214
|
+
}
|
|
215
|
+
return formatted;
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// Build user message with optional images
|
|
219
|
+
const userMessage: { role: string; content: string; images?: string[] } = {
|
|
220
|
+
role: 'user',
|
|
221
|
+
content: optionsArg.userMessage,
|
|
222
|
+
};
|
|
223
|
+
if (optionsArg.images && optionsArg.images.length > 0) {
|
|
224
|
+
userMessage.images = optionsArg.images;
|
|
225
|
+
}
|
|
226
|
+
|
|
205
227
|
const messages = [
|
|
206
228
|
{ role: 'system', content: optionsArg.systemMessage },
|
|
207
|
-
...
|
|
208
|
-
|
|
229
|
+
...historyMessages,
|
|
230
|
+
userMessage,
|
|
209
231
|
];
|
|
210
232
|
|
|
211
233
|
// Make API call to Ollama with defaultOptions and timeout
|
|
@@ -235,6 +257,35 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
235
257
|
};
|
|
236
258
|
}
|
|
237
259
|
|
|
260
|
+
/**
|
|
261
|
+
* Streaming chat with token callback (implements MultiModalModel interface)
|
|
262
|
+
* Calls onToken for each token generated during the response
|
|
263
|
+
*/
|
|
264
|
+
public async chatStreaming(optionsArg: StreamingChatOptions): Promise<ChatResponse> {
|
|
265
|
+
const onToken = optionsArg.onToken;
|
|
266
|
+
|
|
267
|
+
// Use existing collectStreamResponse with callback, including images
|
|
268
|
+
const response = await this.collectStreamResponse(
|
|
269
|
+
{
|
|
270
|
+
systemMessage: optionsArg.systemMessage,
|
|
271
|
+
userMessage: optionsArg.userMessage,
|
|
272
|
+
messageHistory: optionsArg.messageHistory,
|
|
273
|
+
images: optionsArg.images,
|
|
274
|
+
},
|
|
275
|
+
(chunk) => {
|
|
276
|
+
if (onToken) {
|
|
277
|
+
if (chunk.thinking) onToken(chunk.thinking);
|
|
278
|
+
if (chunk.content) onToken(chunk.content);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
);
|
|
282
|
+
|
|
283
|
+
return {
|
|
284
|
+
role: 'assistant' as const,
|
|
285
|
+
message: response.message,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
238
289
|
/**
|
|
239
290
|
* Streaming chat with async iteration and options support
|
|
240
291
|
*/
|
|
@@ -245,10 +296,31 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
245
296
|
const timeout = optionsArg.timeout || this.defaultTimeout;
|
|
246
297
|
const modelOptions = { ...this.defaultOptions, ...optionsArg.options };
|
|
247
298
|
|
|
299
|
+
// Format history messages with optional images
|
|
300
|
+
const historyMessages = optionsArg.messageHistory.map((msg) => {
|
|
301
|
+
const formatted: { role: string; content: string; images?: string[] } = {
|
|
302
|
+
role: msg.role,
|
|
303
|
+
content: msg.content,
|
|
304
|
+
};
|
|
305
|
+
if (msg.images && msg.images.length > 0) {
|
|
306
|
+
formatted.images = msg.images;
|
|
307
|
+
}
|
|
308
|
+
return formatted;
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
// Build user message with optional images
|
|
312
|
+
const userMessage: { role: string; content: string; images?: string[] } = {
|
|
313
|
+
role: 'user',
|
|
314
|
+
content: optionsArg.userMessage,
|
|
315
|
+
};
|
|
316
|
+
if (optionsArg.images && optionsArg.images.length > 0) {
|
|
317
|
+
userMessage.images = optionsArg.images;
|
|
318
|
+
}
|
|
319
|
+
|
|
248
320
|
const messages = [
|
|
249
321
|
{ role: 'system', content: optionsArg.systemMessage },
|
|
250
|
-
...
|
|
251
|
-
|
|
322
|
+
...historyMessages,
|
|
323
|
+
userMessage,
|
|
252
324
|
];
|
|
253
325
|
|
|
254
326
|
const response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
@@ -338,10 +410,31 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
338
410
|
const timeout = optionsArg.timeout || this.defaultTimeout;
|
|
339
411
|
const modelOptions = { ...this.defaultOptions, ...optionsArg.options };
|
|
340
412
|
|
|
413
|
+
// Format history messages with optional images
|
|
414
|
+
const historyMessages = optionsArg.messageHistory.map((msg) => {
|
|
415
|
+
const formatted: { role: string; content: string; images?: string[] } = {
|
|
416
|
+
role: msg.role,
|
|
417
|
+
content: msg.content,
|
|
418
|
+
};
|
|
419
|
+
if (msg.images && msg.images.length > 0) {
|
|
420
|
+
formatted.images = msg.images;
|
|
421
|
+
}
|
|
422
|
+
return formatted;
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
// Build user message with optional images
|
|
426
|
+
const userMessage: { role: string; content: string; images?: string[] } = {
|
|
427
|
+
role: 'user',
|
|
428
|
+
content: optionsArg.userMessage,
|
|
429
|
+
};
|
|
430
|
+
if (optionsArg.images && optionsArg.images.length > 0) {
|
|
431
|
+
userMessage.images = optionsArg.images;
|
|
432
|
+
}
|
|
433
|
+
|
|
341
434
|
const messages = [
|
|
342
435
|
{ role: 'system', content: optionsArg.systemMessage },
|
|
343
|
-
...
|
|
344
|
-
|
|
436
|
+
...historyMessages,
|
|
437
|
+
userMessage,
|
|
345
438
|
];
|
|
346
439
|
|
|
347
440
|
const response = await fetch(`${this.baseUrl}/api/chat`, {
|