@push.rocks/smartai 0.13.2 → 2.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 (98) hide show
  1. package/dist_ts/00_commitinfo_data.js +3 -3
  2. package/dist_ts/index.d.ts +6 -11
  3. package/dist_ts/index.js +6 -12
  4. package/dist_ts/plugins.d.ts +10 -15
  5. package/dist_ts/plugins.js +13 -19
  6. package/dist_ts/smartai.classes.smartai.d.ts +7 -0
  7. package/dist_ts/smartai.classes.smartai.js +51 -0
  8. package/dist_ts/smartai.interfaces.d.ts +41 -0
  9. package/dist_ts/smartai.interfaces.js +2 -0
  10. package/dist_ts/smartai.middleware.anthropic.d.ts +7 -0
  11. package/dist_ts/smartai.middleware.anthropic.js +36 -0
  12. package/dist_ts/smartai.provider.ollama.d.ts +8 -0
  13. package/dist_ts/smartai.provider.ollama.js +378 -0
  14. package/dist_ts_audio/index.d.ts +9 -0
  15. package/dist_ts_audio/index.js +15 -0
  16. package/dist_ts_audio/plugins.d.ts +2 -0
  17. package/dist_ts_audio/plugins.js +3 -0
  18. package/dist_ts_document/index.d.ts +11 -0
  19. package/dist_ts_document/index.js +45 -0
  20. package/dist_ts_document/plugins.d.ts +3 -0
  21. package/dist_ts_document/plugins.js +4 -0
  22. package/dist_ts_image/index.d.ts +46 -0
  23. package/dist_ts_image/index.js +110 -0
  24. package/dist_ts_image/plugins.d.ts +3 -0
  25. package/dist_ts_image/plugins.js +4 -0
  26. package/dist_ts_research/index.d.ts +19 -0
  27. package/dist_ts_research/index.js +98 -0
  28. package/dist_ts_research/plugins.d.ts +2 -0
  29. package/dist_ts_research/plugins.js +3 -0
  30. package/dist_ts_vision/index.d.ts +8 -0
  31. package/dist_ts_vision/index.js +21 -0
  32. package/dist_ts_vision/plugins.d.ts +2 -0
  33. package/dist_ts_vision/plugins.js +3 -0
  34. package/package.json +50 -22
  35. package/readme.hints.md +34 -88
  36. package/readme.md +284 -547
  37. package/ts/00_commitinfo_data.ts +2 -2
  38. package/ts/index.ts +8 -11
  39. package/ts/plugins.ts +19 -35
  40. package/ts/smartai.classes.smartai.ts +51 -0
  41. package/ts/smartai.interfaces.ts +53 -0
  42. package/ts/smartai.middleware.anthropic.ts +38 -0
  43. package/ts/smartai.provider.ollama.ts +426 -0
  44. package/ts_audio/index.ts +24 -0
  45. package/ts_audio/plugins.ts +2 -0
  46. package/ts_document/index.ts +61 -0
  47. package/ts_document/plugins.ts +3 -0
  48. package/ts_image/index.ts +147 -0
  49. package/ts_image/plugins.ts +3 -0
  50. package/ts_research/index.ts +120 -0
  51. package/ts_research/plugins.ts +2 -0
  52. package/ts_vision/index.ts +29 -0
  53. package/ts_vision/plugins.ts +2 -0
  54. package/dist_ts/abstract.classes.multimodal.d.ts +0 -212
  55. package/dist_ts/abstract.classes.multimodal.js +0 -43
  56. package/dist_ts/classes.conversation.d.ts +0 -31
  57. package/dist_ts/classes.conversation.js +0 -150
  58. package/dist_ts/classes.smartai.d.ts +0 -59
  59. package/dist_ts/classes.smartai.js +0 -139
  60. package/dist_ts/classes.tts.d.ts +0 -6
  61. package/dist_ts/classes.tts.js +0 -10
  62. package/dist_ts/interfaces.d.ts +0 -1
  63. package/dist_ts/interfaces.js +0 -2
  64. package/dist_ts/paths.d.ts +0 -2
  65. package/dist_ts/paths.js +0 -4
  66. package/dist_ts/provider.anthropic.d.ts +0 -48
  67. package/dist_ts/provider.anthropic.js +0 -369
  68. package/dist_ts/provider.elevenlabs.d.ts +0 -43
  69. package/dist_ts/provider.elevenlabs.js +0 -64
  70. package/dist_ts/provider.exo.d.ts +0 -40
  71. package/dist_ts/provider.exo.js +0 -116
  72. package/dist_ts/provider.groq.d.ts +0 -39
  73. package/dist_ts/provider.groq.js +0 -178
  74. package/dist_ts/provider.mistral.d.ts +0 -61
  75. package/dist_ts/provider.mistral.js +0 -288
  76. package/dist_ts/provider.ollama.d.ts +0 -141
  77. package/dist_ts/provider.ollama.js +0 -519
  78. package/dist_ts/provider.openai.d.ts +0 -62
  79. package/dist_ts/provider.openai.js +0 -403
  80. package/dist_ts/provider.perplexity.d.ts +0 -37
  81. package/dist_ts/provider.perplexity.js +0 -215
  82. package/dist_ts/provider.xai.d.ts +0 -52
  83. package/dist_ts/provider.xai.js +0 -160
  84. package/ts/abstract.classes.multimodal.ts +0 -240
  85. package/ts/classes.conversation.ts +0 -176
  86. package/ts/classes.smartai.ts +0 -187
  87. package/ts/classes.tts.ts +0 -15
  88. package/ts/interfaces.ts +0 -0
  89. package/ts/paths.ts +0 -4
  90. package/ts/provider.anthropic.ts +0 -446
  91. package/ts/provider.elevenlabs.ts +0 -116
  92. package/ts/provider.exo.ts +0 -155
  93. package/ts/provider.groq.ts +0 -219
  94. package/ts/provider.mistral.ts +0 -352
  95. package/ts/provider.ollama.ts +0 -695
  96. package/ts/provider.openai.ts +0 -462
  97. package/ts/provider.perplexity.ts +0 -259
  98. package/ts/provider.xai.ts +0 -214
@@ -1,519 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- import * as paths from './paths.js';
3
- import { MultiModalModel } from './abstract.classes.multimodal.js';
4
- export class OllamaProvider extends MultiModalModel {
5
- constructor(optionsArg = {}) {
6
- super();
7
- this.options = optionsArg;
8
- this.baseUrl = optionsArg.baseUrl || 'http://localhost:11434';
9
- this.model = optionsArg.model || 'llama2';
10
- this.visionModel = optionsArg.visionModel || 'llava';
11
- this.defaultOptions = optionsArg.defaultOptions || {};
12
- this.defaultTimeout = optionsArg.defaultTimeout || 120000;
13
- }
14
- async start() {
15
- await super.start();
16
- // Verify Ollama is running
17
- try {
18
- const response = await fetch(`${this.baseUrl}/api/tags`);
19
- if (!response.ok) {
20
- throw new Error('Failed to connect to Ollama server');
21
- }
22
- }
23
- catch (error) {
24
- throw new Error(`Failed to connect to Ollama server at ${this.baseUrl}: ${error.message}`);
25
- }
26
- }
27
- async stop() {
28
- await super.stop();
29
- }
30
- async chatStream(input) {
31
- // Create a TextDecoder to handle incoming chunks
32
- const decoder = new TextDecoder();
33
- let buffer = '';
34
- let currentMessage = null;
35
- // Create a TransformStream to process the input
36
- const transform = new TransformStream({
37
- transform: async (chunk, controller) => {
38
- buffer += decoder.decode(chunk, { stream: true });
39
- // Try to parse complete JSON messages from the buffer
40
- while (true) {
41
- const newlineIndex = buffer.indexOf('\n');
42
- if (newlineIndex === -1)
43
- break;
44
- const line = buffer.slice(0, newlineIndex);
45
- buffer = buffer.slice(newlineIndex + 1);
46
- if (line.trim()) {
47
- try {
48
- const message = JSON.parse(line);
49
- currentMessage = {
50
- role: message.role || 'user',
51
- content: message.content || '',
52
- };
53
- }
54
- catch (e) {
55
- console.error('Failed to parse message:', e);
56
- }
57
- }
58
- }
59
- // If we have a complete message, send it to Ollama
60
- if (currentMessage) {
61
- const response = await fetch(`${this.baseUrl}/api/chat`, {
62
- method: 'POST',
63
- headers: {
64
- 'Content-Type': 'application/json',
65
- },
66
- body: JSON.stringify({
67
- model: this.model,
68
- messages: [{ role: currentMessage.role, content: currentMessage.content }],
69
- stream: true,
70
- }),
71
- });
72
- // Process each chunk from Ollama
73
- const reader = response.body?.getReader();
74
- if (reader) {
75
- try {
76
- while (true) {
77
- const { done, value } = await reader.read();
78
- if (done)
79
- break;
80
- const chunk = new TextDecoder().decode(value);
81
- const lines = chunk.split('\n');
82
- for (const line of lines) {
83
- if (line.trim()) {
84
- try {
85
- const parsed = JSON.parse(line);
86
- const content = parsed.message?.content;
87
- if (content) {
88
- controller.enqueue(content);
89
- }
90
- }
91
- catch (e) {
92
- console.error('Failed to parse Ollama response:', e);
93
- }
94
- }
95
- }
96
- }
97
- }
98
- finally {
99
- reader.releaseLock();
100
- }
101
- }
102
- currentMessage = null;
103
- }
104
- },
105
- flush(controller) {
106
- if (buffer) {
107
- try {
108
- const message = JSON.parse(buffer);
109
- controller.enqueue(message.content || '');
110
- }
111
- catch (e) {
112
- console.error('Failed to parse remaining buffer:', e);
113
- }
114
- }
115
- }
116
- });
117
- // Connect the input to our transform stream
118
- return input.pipeThrough(transform);
119
- }
120
- // Implementing the synchronous chat interaction
121
- async chat(optionsArg) {
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
- if (msg.reasoning) {
132
- formatted.reasoning = msg.reasoning;
133
- }
134
- return formatted;
135
- });
136
- // Build user message with optional images
137
- const userMessage = {
138
- role: 'user',
139
- content: optionsArg.userMessage,
140
- };
141
- if (optionsArg.images && optionsArg.images.length > 0) {
142
- userMessage.images = optionsArg.images;
143
- }
144
- const messages = [
145
- { role: 'system', content: optionsArg.systemMessage },
146
- ...historyMessages,
147
- userMessage,
148
- ];
149
- // Build request body - include think parameter if set
150
- const requestBody = {
151
- model: this.model,
152
- messages: messages,
153
- stream: false,
154
- options: this.defaultOptions,
155
- };
156
- // Add think parameter for reasoning models (GPT-OSS, QwQ, etc.)
157
- if (this.defaultOptions.think !== undefined) {
158
- requestBody.think = this.defaultOptions.think;
159
- }
160
- // Make API call to Ollama with defaultOptions and timeout
161
- const response = await fetch(`${this.baseUrl}/api/chat`, {
162
- method: 'POST',
163
- headers: {
164
- 'Content-Type': 'application/json',
165
- },
166
- body: JSON.stringify(requestBody),
167
- signal: AbortSignal.timeout(this.defaultTimeout),
168
- });
169
- if (!response.ok) {
170
- throw new Error(`Ollama API error: ${response.statusText}`);
171
- }
172
- const result = await response.json();
173
- return {
174
- role: 'assistant',
175
- message: result.message.content,
176
- reasoning: result.message.thinking || result.message.reasoning,
177
- };
178
- }
179
- /**
180
- * Streaming chat with token callback (implements MultiModalModel interface)
181
- * Calls onToken for each token generated during the response
182
- */
183
- async chatStreaming(optionsArg) {
184
- const onToken = optionsArg.onToken;
185
- // Use existing collectStreamResponse with callback, including images
186
- const response = await this.collectStreamResponse({
187
- systemMessage: optionsArg.systemMessage,
188
- userMessage: optionsArg.userMessage,
189
- messageHistory: optionsArg.messageHistory,
190
- images: optionsArg.images,
191
- }, (chunk) => {
192
- if (onToken) {
193
- if (chunk.thinking)
194
- onToken(chunk.thinking);
195
- if (chunk.content)
196
- onToken(chunk.content);
197
- }
198
- });
199
- return {
200
- role: 'assistant',
201
- message: response.message,
202
- reasoning: response.thinking,
203
- };
204
- }
205
- /**
206
- * Streaming chat with async iteration and options support
207
- */
208
- async chatStreamResponse(optionsArg) {
209
- const model = optionsArg.model || this.model;
210
- const timeout = optionsArg.timeout || this.defaultTimeout;
211
- const modelOptions = { ...this.defaultOptions, ...optionsArg.options };
212
- // Format history messages with optional images and reasoning
213
- const historyMessages = optionsArg.messageHistory.map((msg) => {
214
- const formatted = {
215
- role: msg.role,
216
- content: msg.content,
217
- };
218
- if (msg.images && msg.images.length > 0) {
219
- formatted.images = msg.images;
220
- }
221
- if (msg.reasoning) {
222
- formatted.reasoning = msg.reasoning;
223
- }
224
- return formatted;
225
- });
226
- // Build user message with optional images
227
- const userMessage = {
228
- role: 'user',
229
- content: optionsArg.userMessage,
230
- };
231
- if (optionsArg.images && optionsArg.images.length > 0) {
232
- userMessage.images = optionsArg.images;
233
- }
234
- const messages = [
235
- { role: 'system', content: optionsArg.systemMessage },
236
- ...historyMessages,
237
- userMessage,
238
- ];
239
- // Build request body with optional tools and think parameters
240
- const requestBody = {
241
- model,
242
- messages,
243
- stream: true,
244
- options: modelOptions,
245
- };
246
- // Add think parameter for reasoning models (GPT-OSS, QwQ, etc.)
247
- if (modelOptions.think !== undefined) {
248
- requestBody.think = modelOptions.think;
249
- }
250
- // Add tools for native function calling
251
- if (optionsArg.tools && optionsArg.tools.length > 0) {
252
- requestBody.tools = optionsArg.tools;
253
- }
254
- const response = await fetch(`${this.baseUrl}/api/chat`, {
255
- method: 'POST',
256
- headers: { 'Content-Type': 'application/json' },
257
- body: JSON.stringify(requestBody),
258
- signal: AbortSignal.timeout(timeout),
259
- });
260
- if (!response.ok) {
261
- throw new Error(`Ollama API error: ${response.status}`);
262
- }
263
- const reader = response.body.getReader();
264
- const decoder = new TextDecoder();
265
- return {
266
- [Symbol.asyncIterator]: async function* () {
267
- let buffer = '';
268
- try {
269
- while (true) {
270
- const { done, value } = await reader.read();
271
- if (done)
272
- break;
273
- buffer += decoder.decode(value, { stream: true });
274
- const lines = buffer.split('\n');
275
- buffer = lines.pop() || '';
276
- for (const line of lines) {
277
- if (!line.trim())
278
- continue;
279
- try {
280
- const json = JSON.parse(line);
281
- // Parse tool_calls from response
282
- let toolCalls;
283
- if (json.message?.tool_calls && Array.isArray(json.message.tool_calls)) {
284
- toolCalls = json.message.tool_calls.map((tc) => ({
285
- function: {
286
- name: tc.function?.name || '',
287
- arguments: typeof tc.function?.arguments === 'string'
288
- ? JSON.parse(tc.function.arguments)
289
- : tc.function?.arguments || {},
290
- index: tc.index,
291
- },
292
- }));
293
- }
294
- yield {
295
- content: json.message?.content || '',
296
- thinking: json.message?.thinking,
297
- toolCalls,
298
- done: json.done || false,
299
- stats: json.done ? {
300
- totalDuration: json.total_duration,
301
- evalCount: json.eval_count,
302
- } : undefined,
303
- };
304
- }
305
- catch { /* skip malformed */ }
306
- }
307
- }
308
- }
309
- finally {
310
- reader.releaseLock();
311
- }
312
- }
313
- };
314
- }
315
- /**
316
- * Stream and collect full response with optional progress callback
317
- */
318
- async collectStreamResponse(optionsArg, onChunk) {
319
- const stream = await this.chatStreamResponse(optionsArg);
320
- let content = '';
321
- let thinking = '';
322
- let toolCalls = [];
323
- let stats;
324
- for await (const chunk of stream) {
325
- if (chunk.content)
326
- content += chunk.content;
327
- if (chunk.thinking)
328
- thinking += chunk.thinking;
329
- if (chunk.toolCalls)
330
- toolCalls = toolCalls.concat(chunk.toolCalls);
331
- if (chunk.stats)
332
- stats = chunk.stats;
333
- if (onChunk)
334
- onChunk(chunk);
335
- }
336
- return {
337
- role: 'assistant',
338
- message: content,
339
- thinking: thinking || undefined,
340
- toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
341
- stats,
342
- };
343
- }
344
- /**
345
- * Non-streaming chat with full options support
346
- */
347
- async chatWithOptions(optionsArg) {
348
- const model = optionsArg.model || this.model;
349
- const timeout = optionsArg.timeout || this.defaultTimeout;
350
- const modelOptions = { ...this.defaultOptions, ...optionsArg.options };
351
- // Format history messages with optional images, reasoning, and tool role
352
- const historyMessages = optionsArg.messageHistory.map((msg) => {
353
- // Handle tool result messages
354
- if (msg.role === 'tool') {
355
- return {
356
- role: 'tool',
357
- content: msg.content,
358
- tool_name: msg.toolName,
359
- };
360
- }
361
- const formatted = {
362
- role: msg.role,
363
- content: msg.content,
364
- };
365
- if (msg.images && msg.images.length > 0) {
366
- formatted.images = msg.images;
367
- }
368
- if (msg.reasoning) {
369
- formatted.reasoning = msg.reasoning;
370
- }
371
- return formatted;
372
- });
373
- // Build user message with optional images
374
- const userMessage = {
375
- role: 'user',
376
- content: optionsArg.userMessage,
377
- };
378
- if (optionsArg.images && optionsArg.images.length > 0) {
379
- userMessage.images = optionsArg.images;
380
- }
381
- const messages = [
382
- { role: 'system', content: optionsArg.systemMessage },
383
- ...historyMessages,
384
- userMessage,
385
- ];
386
- // Build request body with optional tools and think parameters
387
- const requestBody = {
388
- model,
389
- messages,
390
- stream: false,
391
- options: modelOptions,
392
- };
393
- // Add think parameter for reasoning models (GPT-OSS, QwQ, etc.)
394
- if (modelOptions.think !== undefined) {
395
- requestBody.think = modelOptions.think;
396
- }
397
- // Add tools for native function calling
398
- if (optionsArg.tools && optionsArg.tools.length > 0) {
399
- requestBody.tools = optionsArg.tools;
400
- }
401
- const response = await fetch(`${this.baseUrl}/api/chat`, {
402
- method: 'POST',
403
- headers: { 'Content-Type': 'application/json' },
404
- body: JSON.stringify(requestBody),
405
- signal: AbortSignal.timeout(timeout),
406
- });
407
- if (!response.ok) {
408
- throw new Error(`Ollama API error: ${response.statusText}`);
409
- }
410
- const result = await response.json();
411
- // Parse tool_calls from response
412
- let toolCalls;
413
- if (result.message?.tool_calls && Array.isArray(result.message.tool_calls)) {
414
- toolCalls = result.message.tool_calls.map((tc) => ({
415
- function: {
416
- name: tc.function?.name || '',
417
- arguments: typeof tc.function?.arguments === 'string'
418
- ? JSON.parse(tc.function.arguments)
419
- : tc.function?.arguments || {},
420
- index: tc.index,
421
- },
422
- }));
423
- }
424
- return {
425
- role: 'assistant',
426
- message: result.message.content || '',
427
- thinking: result.message.thinking,
428
- toolCalls,
429
- stats: {
430
- totalDuration: result.total_duration,
431
- evalCount: result.eval_count,
432
- },
433
- };
434
- }
435
- async audio(optionsArg) {
436
- throw new Error('Audio generation is not supported by Ollama.');
437
- }
438
- async vision(optionsArg) {
439
- const base64Image = optionsArg.image.toString('base64');
440
- const response = await fetch(`${this.baseUrl}/api/chat`, {
441
- method: 'POST',
442
- headers: {
443
- 'Content-Type': 'application/json',
444
- },
445
- body: JSON.stringify({
446
- model: this.visionModel,
447
- messages: [{
448
- role: 'user',
449
- content: optionsArg.prompt,
450
- images: [base64Image]
451
- }],
452
- stream: false
453
- }),
454
- });
455
- if (!response.ok) {
456
- throw new Error(`Ollama API error: ${response.statusText}`);
457
- }
458
- const result = await response.json();
459
- return result.message.content;
460
- }
461
- async document(optionsArg) {
462
- // Ensure SmartPdf is initialized before processing documents
463
- await this.ensureSmartpdfReady();
464
- // Convert PDF documents to images using SmartPDF
465
- let documentImageBytesArray = [];
466
- for (const pdfDocument of optionsArg.pdfDocuments) {
467
- const documentImageArray = await this.smartpdfInstance.convertPDFToPngBytes(pdfDocument);
468
- documentImageBytesArray = documentImageBytesArray.concat(documentImageArray);
469
- }
470
- // Convert images to base64
471
- const base64Images = documentImageBytesArray.map(bytes => Buffer.from(bytes).toString('base64'));
472
- // Send request to Ollama with images
473
- const response = await fetch(`${this.baseUrl}/api/chat`, {
474
- method: 'POST',
475
- headers: {
476
- 'Content-Type': 'application/json',
477
- },
478
- body: JSON.stringify({
479
- model: this.visionModel,
480
- messages: [
481
- { role: 'system', content: optionsArg.systemMessage },
482
- ...optionsArg.messageHistory,
483
- {
484
- role: 'user',
485
- content: optionsArg.userMessage,
486
- images: base64Images
487
- }
488
- ],
489
- stream: false
490
- }),
491
- });
492
- if (!response.ok) {
493
- throw new Error(`Ollama API error: ${response.statusText}`);
494
- }
495
- const result = await response.json();
496
- return {
497
- message: {
498
- role: 'assistant',
499
- content: result.message.content
500
- }
501
- };
502
- }
503
- async research(optionsArg) {
504
- throw new Error('Research capabilities are not yet supported by Ollama provider.');
505
- }
506
- /**
507
- * Image generation is not supported by Ollama
508
- */
509
- async imageGenerate(optionsArg) {
510
- throw new Error('Image generation is not supported by Ollama. Please use OpenAI provider for image generation.');
511
- }
512
- /**
513
- * Image editing is not supported by Ollama
514
- */
515
- async imageEdit(optionsArg) {
516
- throw new Error('Image editing is not supported by Ollama. Please use OpenAI provider for image editing.');
517
- }
518
- }
519
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIub2xsYW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIub2xsYW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQTBHbkUsTUFBTSxPQUFPLGNBQWUsU0FBUSxlQUFlO0lBUWpELFlBQVksYUFBcUMsRUFBRTtRQUNqRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSx3QkFBd0IsQ0FBQztRQUM5RCxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDO0lBQzVELENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLDJCQUEyQjtRQUMzQixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLFdBQVcsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUN4RCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFpQztRQUN2RCxpREFBaUQ7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxjQUFjLEdBQThDLElBQUksQ0FBQztRQUVyRSxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQXFCO1lBQ3hELFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUNyQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFbEQsc0RBQXNEO2dCQUN0RCxPQUFPLElBQUksRUFBRSxDQUFDO29CQUNaLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzFDLElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQzt3QkFBRSxNQUFNO29CQUUvQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDM0MsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUV4QyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO3dCQUNoQixJQUFJLENBQUM7NEJBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDakMsY0FBYyxHQUFHO2dDQUNmLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLE1BQU07Z0NBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUU7NkJBQy9CLENBQUM7d0JBQ0osQ0FBQzt3QkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDOzRCQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUVELG1EQUFtRDtnQkFDbkQsSUFBSSxjQUFjLEVBQUUsQ0FBQztvQkFDbkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxXQUFXLEVBQUU7d0JBQ3ZELE1BQU0sRUFBRSxNQUFNO3dCQUNkLE9BQU8sRUFBRTs0QkFDUCxjQUFjLEVBQUUsa0JBQWtCO3lCQUNuQzt3QkFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLOzRCQUNqQixRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7NEJBQzFFLE1BQU0sRUFBRSxJQUFJO3lCQUNiLENBQUM7cUJBQ0gsQ0FBQyxDQUFDO29CQUVILGlDQUFpQztvQkFDakMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztvQkFDMUMsSUFBSSxNQUFNLEVBQUUsQ0FBQzt3QkFDWCxJQUFJLENBQUM7NEJBQ0gsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQ0FDWixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dDQUM1QyxJQUFJLElBQUk7b0NBQUUsTUFBTTtnQ0FFaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0NBQzlDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBRWhDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7b0NBQ3pCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7d0NBQ2hCLElBQUksQ0FBQzs0Q0FDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDOzRDQUNoQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQzs0Q0FDeEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnREFDWixVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRDQUM5QixDQUFDO3dDQUNILENBQUM7d0NBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzs0Q0FDWCxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dDQUN2RCxDQUFDO29DQUNILENBQUM7Z0NBQ0gsQ0FBQzs0QkFDSCxDQUFDO3dCQUNILENBQUM7Z0NBQVMsQ0FBQzs0QkFDVCxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ3ZCLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQztZQUVELEtBQUssQ0FBQyxVQUFVO2dCQUNkLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsSUFBSSxDQUFDO3dCQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ25DLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDNUMsQ0FBQztvQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3hELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7UUFFSCw0Q0FBNEM7UUFDNUMsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxnREFBZ0Q7SUFDekMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUF1QjtRQUN2Qyw2QkFBNkI7UUFDN0IsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1RCxNQUFNLFNBQVMsR0FBNkU7Z0JBQzFGLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtnQkFDZCxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87YUFDckIsQ0FBQztZQUNGLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsU0FBUyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQ2hDLENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbEIsU0FBUyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQ3RDLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUVILDBDQUEwQztRQUMxQyxNQUFNLFdBQVcsR0FBeUQ7WUFDeEUsSUFBSSxFQUFFLE1BQU07WUFDWixPQUFPLEVBQUUsVUFBVSxDQUFDLFdBQVc7U0FDaEMsQ0FBQztRQUNGLElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxXQUFXLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDekMsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHO1lBQ2YsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsYUFBYSxFQUFFO1lBQ3JELEdBQUcsZUFBZTtZQUNsQixXQUFXO1NBQ1osQ0FBQztRQUVGLHNEQUFzRDtRQUN0RCxNQUFNLFdBQVcsR0FBNEI7WUFDM0MsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjO1NBQzdCLENBQUM7UUFFRixnRUFBZ0U7UUFDaEUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1FBQ2hELENBQUM7UUFFRCwwREFBMEQ7UUFDMUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxXQUFXLEVBQUU7WUFDdkQsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjthQUNuQztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztZQUNqQyxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1NBQ2pELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXJDLE9BQU87WUFDTCxJQUFJLEVBQUUsV0FBb0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTztZQUMvQixTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTO1NBQy9ELENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFnQztRQUN6RCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBRW5DLHFFQUFxRTtRQUNyRSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FDL0M7WUFDRSxhQUFhLEVBQUUsVUFBVSxDQUFDLGFBQWE7WUFDdkMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO1lBQ25DLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYztZQUN6QyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07U0FDMUIsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLEtBQUssQ0FBQyxRQUFRO29CQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVDLElBQUksS0FBSyxDQUFDLE9BQU87b0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQyxDQUNGLENBQUM7UUFFRixPQUFPO1lBQ0wsSUFBSSxFQUFFLFdBQW9CO1lBQzFCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztZQUN6QixTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVE7U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FDN0IsVUFBOEI7UUFFOUIsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzdDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV2RSw2REFBNkQ7UUFDN0QsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1RCxNQUFNLFNBQVMsR0FBNkU7Z0JBQzFGLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtnQkFDZCxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87YUFDckIsQ0FBQztZQUNGLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsU0FBUyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQ2hDLENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbEIsU0FBUyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQ3RDLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUVILDBDQUEwQztRQUMxQyxNQUFNLFdBQVcsR0FBeUQ7WUFDeEUsSUFBSSxFQUFFLE1BQU07WUFDWixPQUFPLEVBQUUsVUFBVSxDQUFDLFdBQVc7U0FDaEMsQ0FBQztRQUNGLElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxXQUFXLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDekMsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHO1lBQ2YsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsYUFBYSxFQUFFO1lBQ3JELEdBQUcsZUFBZTtZQUNsQixXQUFXO1NBQ1osQ0FBQztRQUVGLDhEQUE4RDtRQUM5RCxNQUFNLFdBQVcsR0FBNEI7WUFDM0MsS0FBSztZQUNMLFFBQVE7WUFDUixNQUFNLEVBQUUsSUFBSTtZQUNaLE9BQU8sRUFBRSxZQUFZO1NBQ3RCLENBQUM7UUFFRixnRUFBZ0U7UUFDaEUsSUFBSSxZQUFZLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUN6QyxDQUFDO1FBRUQsd0NBQXdDO1FBQ3hDLElBQUksVUFBVSxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxXQUFXLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDdkMsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sV0FBVyxFQUFFO1lBQ3ZELE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztZQUNqQyxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7U0FDckMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBRWxDLE9BQU87WUFDTCxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQztnQkFDckMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUM7b0JBQ0gsT0FBTyxJQUFJLEVBQUUsQ0FBQzt3QkFDWixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUM1QyxJQUFJLElBQUk7NEJBQUUsTUFBTTt3QkFDaEIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ2xELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2pDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO3dCQUMzQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDOzRCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtnQ0FBRSxTQUFTOzRCQUMzQixJQUFJLENBQUM7Z0NBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FFOUIsaUNBQWlDO2dDQUNqQyxJQUFJLFNBQXdDLENBQUM7Z0NBQzdDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7b0NBQ3ZFLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7d0NBQ3BELFFBQVEsRUFBRTs0Q0FDUixJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksRUFBRTs0Q0FDN0IsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEtBQUssUUFBUTtnREFDbkQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7Z0RBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsSUFBSSxFQUFFOzRDQUNoQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7eUNBQ2hCO3FDQUNGLENBQUMsQ0FBQyxDQUFDO2dDQUNOLENBQUM7Z0NBRUQsTUFBTTtvQ0FDSixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRTtvQ0FDcEMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUTtvQ0FDaEMsU0FBUztvQ0FDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLO29DQUN4QixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0NBQ2pCLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYzt3Q0FDbEMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO3FDQUMzQixDQUFDLENBQUMsQ0FBQyxTQUFTO2lDQUNRLENBQUM7NEJBQzFCLENBQUM7NEJBQUMsTUFBTSxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQzt3QkFDbEMsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7d0JBQVMsQ0FBQztvQkFDVCxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxxQkFBcUIsQ0FDaEMsVUFBOEIsRUFDOUIsT0FBNkM7UUFFN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLFNBQVMsR0FBc0IsRUFBRSxDQUFDO1FBQ3RDLElBQUksS0FBbUMsQ0FBQztRQUV4QyxJQUFJLEtBQUssRUFBRSxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNqQyxJQUFJLEtBQUssQ0FBQyxPQUFPO2dCQUFFLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzVDLElBQUksS0FBSyxDQUFDLFFBQVE7Z0JBQUUsUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDL0MsSUFBSSxLQUFLLENBQUMsU0FBUztnQkFBRSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkUsSUFBSSxLQUFLLENBQUMsS0FBSztnQkFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQyxJQUFJLE9BQU87Z0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLFdBQW9CO1lBQzFCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFFBQVEsRUFBRSxRQUFRLElBQUksU0FBUztZQUMvQixTQUFTLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUN2RCxLQUFLO1NBQ04sQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBOEI7UUFDekQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzdDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV2RSx5RUFBeUU7UUFDekUsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1RCw4QkFBOEI7WUFDOUIsSUFBSyxHQUFXLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUNqQyxPQUFPO29CQUNMLElBQUksRUFBRSxNQUFNO29CQUNaLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztvQkFDcEIsU0FBUyxFQUFHLEdBQVcsQ0FBQyxRQUFRO2lCQUNqQyxDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sU0FBUyxHQUE2RTtnQkFDMUYsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2dCQUNkLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTzthQUNyQixDQUFDO1lBQ0YsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxTQUFTLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNsQixTQUFTLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFDdEMsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsMENBQTBDO1FBQzFDLE1BQU0sV0FBVyxHQUF5RDtZQUN4RSxJQUFJLEVBQUUsTUFBTTtZQUNaLE9BQU8sRUFBRSxVQUFVLENBQUMsV0FBVztTQUNoQyxDQUFDO1FBQ0YsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELFdBQVcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUc7WUFDZixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxhQUFhLEVBQUU7WUFDckQsR0FBRyxlQUFlO1lBQ2xCLFdBQVc7U0FDWixDQUFDO1FBRUYsOERBQThEO1FBQzlELE1BQU0sV0FBVyxHQUE0QjtZQUMzQyxLQUFLO1lBQ0wsUUFBUTtZQUNSLE1BQU0sRUFBRSxLQUFLO1lBQ2IsT0FBTyxFQUFFLFlBQVk7U0FDdEIsQ0FBQztRQUVGLGdFQUFnRTtRQUNoRSxJQUFJLFlBQVksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckMsV0FBVyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ3pDLENBQUM7UUFFRCx3Q0FBd0M7UUFDeEMsSUFBSSxVQUFVLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BELFdBQVcsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUN2QyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxXQUFXLEVBQUU7WUFDdkQsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7WUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1lBQ2pDLE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUNyQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVyQyxpQ0FBaUM7UUFDakMsSUFBSSxTQUF3QyxDQUFDO1FBQzdDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDM0UsU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdEQsUUFBUSxFQUFFO29CQUNSLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxFQUFFO29CQUM3QixTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsS0FBSyxRQUFRO3dCQUNuRCxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQzt3QkFDbkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxJQUFJLEVBQUU7b0JBQ2hDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSztpQkFDaEI7YUFDRixDQUFDLENBQUMsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLFdBQW9CO1lBQzFCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDakMsU0FBUztZQUNULEtBQUssRUFBRTtnQkFDTCxhQUFhLEVBQUUsTUFBTSxDQUFDLGNBQWM7Z0JBQ3BDLFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVTthQUM3QjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUErQjtRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBNkM7UUFDL0QsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxXQUFXLEVBQUU7WUFDdkQsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjthQUNuQztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQ3ZCLFFBQVEsRUFBRSxDQUFDO3dCQUNULElBQUksRUFBRSxNQUFNO3dCQUNaLE9BQU8sRUFBRSxVQUFVLENBQUMsTUFBTTt3QkFDMUIsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDO3FCQUN0QixDQUFDO2dCQUNGLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFLckI7UUFDQyw2REFBNkQ7UUFDN0QsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVqQyxpREFBaUQ7UUFDakQsSUFBSSx1QkFBdUIsR0FBaUIsRUFBRSxDQUFDO1FBRS9DLEtBQUssTUFBTSxXQUFXLElBQUksVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWlCLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUYsdUJBQXVCLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixNQUFNLFlBQVksR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRWpHLHFDQUFxQztRQUNyQyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLFdBQVcsRUFBRTtZQUN2RCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDdkIsUUFBUSxFQUFFO29CQUNSLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRTtvQkFDckQsR0FBRyxVQUFVLENBQUMsY0FBYztvQkFDNUI7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osT0FBTyxFQUFFLFVBQVUsQ0FBQyxXQUFXO3dCQUMvQixNQUFNLEVBQUUsWUFBWTtxQkFDckI7aUJBQ0Y7Z0JBQ0QsTUFBTSxFQUFFLEtBQUs7YUFDZCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckMsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsV0FBVztnQkFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTzthQUNoQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUEyQjtRQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFnQztRQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLCtGQUErRixDQUFDLENBQUM7SUFDbkgsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUE0QjtRQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLHlGQUF5RixDQUFDLENBQUM7SUFDN0csQ0FBQztDQUNGIn0=
@@ -1,62 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- export type TChatCompletionRequestMessage = {
3
- role: "system" | "user" | "assistant";
4
- content: string;
5
- };
6
- import { MultiModalModel } from './abstract.classes.multimodal.js';
7
- import type { ResearchOptions, ResearchResponse, ImageGenerateOptions, ImageEditOptions, ImageResponse } from './abstract.classes.multimodal.js';
8
- export interface IOpenaiProviderOptions {
9
- openaiToken: string;
10
- chatModel?: string;
11
- audioModel?: string;
12
- visionModel?: string;
13
- researchModel?: string;
14
- imageModel?: string;
15
- enableWebSearch?: boolean;
16
- }
17
- export declare class OpenAiProvider extends MultiModalModel {
18
- private options;
19
- openAiApiClient: plugins.openai.default;
20
- constructor(optionsArg: IOpenaiProviderOptions);
21
- start(): Promise<void>;
22
- stop(): Promise<void>;
23
- chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>>;
24
- chat(optionsArg: {
25
- systemMessage: string;
26
- userMessage: string;
27
- messageHistory: {
28
- role: 'assistant' | 'user';
29
- content: string;
30
- }[];
31
- }): Promise<{
32
- role: "assistant";
33
- message: string;
34
- }>;
35
- audio(optionsArg: {
36
- message: string;
37
- }): Promise<NodeJS.ReadableStream>;
38
- document(optionsArg: {
39
- systemMessage: string;
40
- userMessage: string;
41
- pdfDocuments: Uint8Array[];
42
- messageHistory: {
43
- role: 'assistant' | 'user';
44
- content: any;
45
- }[];
46
- }): Promise<{
47
- message: plugins.openai.OpenAI.Chat.Completions.ChatCompletionMessage;
48
- }>;
49
- vision(optionsArg: {
50
- image: Buffer;
51
- prompt: string;
52
- }): Promise<string>;
53
- research(optionsArg: ResearchOptions): Promise<ResearchResponse>;
54
- /**
55
- * Image generation using OpenAI's gpt-image-1 or DALL-E models
56
- */
57
- imageGenerate(optionsArg: ImageGenerateOptions): Promise<ImageResponse>;
58
- /**
59
- * Image editing using OpenAI's gpt-image-1 or DALL-E 2 models
60
- */
61
- imageEdit(optionsArg: ImageEditOptions): Promise<ImageResponse>;
62
- }