@push.rocks/smartai 0.13.3 → 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 -529
  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 -705
  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,403 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- import * as paths from './paths.js';
3
- import { Readable } from 'stream';
4
- import { toFile } from 'openai';
5
- import { MultiModalModel } from './abstract.classes.multimodal.js';
6
- export class OpenAiProvider extends MultiModalModel {
7
- constructor(optionsArg) {
8
- super();
9
- this.options = optionsArg;
10
- }
11
- async start() {
12
- await super.start();
13
- this.openAiApiClient = new plugins.openai.default({
14
- apiKey: this.options.openaiToken,
15
- dangerouslyAllowBrowser: true,
16
- });
17
- }
18
- async stop() {
19
- await super.stop();
20
- }
21
- async chatStream(input) {
22
- // Create a TextDecoder to handle incoming chunks
23
- const decoder = new TextDecoder();
24
- let buffer = '';
25
- let currentMessage = null;
26
- // Create a TransformStream to process the input
27
- const transform = new TransformStream({
28
- transform: async (chunk, controller) => {
29
- buffer += decoder.decode(chunk, { stream: true });
30
- // Try to parse complete JSON messages from the buffer
31
- while (true) {
32
- const newlineIndex = buffer.indexOf('\n');
33
- if (newlineIndex === -1)
34
- break;
35
- const line = buffer.slice(0, newlineIndex);
36
- buffer = buffer.slice(newlineIndex + 1);
37
- if (line.trim()) {
38
- try {
39
- const message = JSON.parse(line);
40
- currentMessage = {
41
- role: (message.role || 'user'),
42
- content: message.content || '',
43
- };
44
- }
45
- catch (e) {
46
- console.error('Failed to parse message:', e);
47
- }
48
- }
49
- }
50
- // If we have a complete message, send it to OpenAI
51
- if (currentMessage) {
52
- const messageToSend = { role: "user", content: currentMessage.content };
53
- const chatModel = this.options.chatModel ?? 'gpt-5-mini';
54
- const requestParams = {
55
- model: chatModel,
56
- messages: [messageToSend],
57
- stream: true,
58
- };
59
- // Temperature is omitted since the model does not support it.
60
- const stream = await this.openAiApiClient.chat.completions.create(requestParams);
61
- // Explicitly cast the stream as an async iterable to satisfy TypeScript.
62
- const streamAsyncIterable = stream;
63
- // Process each chunk from OpenAI
64
- for await (const chunk of streamAsyncIterable) {
65
- const content = chunk.choices[0]?.delta?.content;
66
- if (content) {
67
- controller.enqueue(content);
68
- }
69
- }
70
- currentMessage = null;
71
- }
72
- },
73
- flush(controller) {
74
- if (buffer) {
75
- try {
76
- const message = JSON.parse(buffer);
77
- controller.enqueue(message.content || '');
78
- }
79
- catch (e) {
80
- console.error('Failed to parse remaining buffer:', e);
81
- }
82
- }
83
- }
84
- });
85
- // Connect the input to our transform stream
86
- return input.pipeThrough(transform);
87
- }
88
- // Implementing the synchronous chat interaction
89
- async chat(optionsArg) {
90
- const chatModel = this.options.chatModel ?? 'gpt-5-mini';
91
- const requestParams = {
92
- model: chatModel,
93
- messages: [
94
- { role: 'system', content: optionsArg.systemMessage },
95
- ...optionsArg.messageHistory,
96
- { role: 'user', content: optionsArg.userMessage },
97
- ],
98
- };
99
- // Temperature parameter removed to avoid unsupported error.
100
- const result = await this.openAiApiClient.chat.completions.create(requestParams);
101
- return {
102
- role: result.choices[0].message.role,
103
- message: result.choices[0].message.content,
104
- };
105
- }
106
- async audio(optionsArg) {
107
- const done = plugins.smartpromise.defer();
108
- const result = await this.openAiApiClient.audio.speech.create({
109
- model: this.options.audioModel ?? 'tts-1-hd',
110
- input: optionsArg.message,
111
- voice: 'nova',
112
- response_format: 'mp3',
113
- speed: 1,
114
- });
115
- const stream = result.body;
116
- const nodeStream = Readable.fromWeb(stream);
117
- done.resolve(nodeStream);
118
- return done.promise;
119
- }
120
- async document(optionsArg) {
121
- // Ensure SmartPdf is initialized before processing documents
122
- await this.ensureSmartpdfReady();
123
- let pdfDocumentImageBytesArray = [];
124
- // Convert each PDF into one or more image byte arrays.
125
- for (const pdfDocument of optionsArg.pdfDocuments) {
126
- const documentImageArray = await this.smartpdfInstance.convertPDFToPngBytes(pdfDocument);
127
- pdfDocumentImageBytesArray = pdfDocumentImageBytesArray.concat(documentImageArray);
128
- }
129
- console.log(`image smartfile array`);
130
- console.log(pdfDocumentImageBytesArray.map((smartfile) => smartfile.length));
131
- // Filter out any empty buffers to avoid sending invalid image URLs.
132
- const validImageBytesArray = pdfDocumentImageBytesArray.filter(imageBytes => imageBytes && imageBytes.length > 0);
133
- const imageAttachments = validImageBytesArray.map(imageBytes => ({
134
- type: 'image_url',
135
- image_url: {
136
- url: 'data:image/png;base64,' + Buffer.from(imageBytes).toString('base64'),
137
- },
138
- }));
139
- const chatModel = this.options.chatModel ?? 'gpt-5-mini';
140
- const requestParams = {
141
- model: chatModel,
142
- messages: [
143
- { role: 'system', content: optionsArg.systemMessage },
144
- ...optionsArg.messageHistory,
145
- {
146
- role: 'user',
147
- content: [
148
- { type: 'text', text: optionsArg.userMessage },
149
- ...imageAttachments,
150
- ],
151
- },
152
- ],
153
- };
154
- // Temperature parameter removed.
155
- const result = await this.openAiApiClient.chat.completions.create(requestParams);
156
- return {
157
- message: result.choices[0].message,
158
- };
159
- }
160
- async vision(optionsArg) {
161
- const visionModel = this.options.visionModel ?? '04-mini';
162
- const requestParams = {
163
- model: visionModel,
164
- messages: [
165
- {
166
- role: 'user',
167
- content: [
168
- { type: 'text', text: optionsArg.prompt },
169
- {
170
- type: 'image_url',
171
- image_url: {
172
- url: `data:image/jpeg;base64,${optionsArg.image.toString('base64')}`
173
- }
174
- }
175
- ]
176
- }
177
- ],
178
- max_tokens: 300
179
- };
180
- const result = await this.openAiApiClient.chat.completions.create(requestParams);
181
- return result.choices[0].message.content || '';
182
- }
183
- async research(optionsArg) {
184
- // Determine which model to use - Deep Research API requires specific models
185
- let model;
186
- if (optionsArg.searchDepth === 'deep') {
187
- model = this.options.researchModel || 'o4-mini-deep-research-2025-06-26';
188
- }
189
- else {
190
- // For basic/advanced, still use deep research models if web search is needed
191
- if (optionsArg.includeWebSearch) {
192
- model = this.options.researchModel || 'o4-mini-deep-research-2025-06-26';
193
- }
194
- else {
195
- model = this.options.chatModel || 'gpt-5-mini';
196
- }
197
- }
198
- const systemMessage = 'You are a research assistant. Provide comprehensive answers with citations and sources when available.';
199
- // Prepare request parameters using Deep Research API format
200
- const requestParams = {
201
- model,
202
- instructions: systemMessage,
203
- input: optionsArg.query
204
- };
205
- // Add web search tool if requested
206
- if (optionsArg.includeWebSearch || optionsArg.searchDepth === 'deep') {
207
- requestParams.tools = [
208
- {
209
- type: 'web_search_preview',
210
- search_context_size: optionsArg.searchDepth === 'deep' ? 'high' :
211
- optionsArg.searchDepth === 'advanced' ? 'medium' : 'low'
212
- }
213
- ];
214
- }
215
- // Add background flag for deep research
216
- if (optionsArg.background && optionsArg.searchDepth === 'deep') {
217
- requestParams.background = true;
218
- }
219
- try {
220
- // Execute the research request using Deep Research API
221
- const result = await this.openAiApiClient.responses.create(requestParams);
222
- // Extract the answer from output items
223
- let answer = '';
224
- const sources = [];
225
- const searchQueries = [];
226
- // Process output items
227
- for (const item of result.output || []) {
228
- // Extract message content
229
- if (item.type === 'message' && 'content' in item) {
230
- const messageItem = item;
231
- for (const contentItem of messageItem.content || []) {
232
- if (contentItem.type === 'output_text' && 'text' in contentItem) {
233
- answer += contentItem.text;
234
- }
235
- }
236
- }
237
- // Extract web search queries
238
- if (item.type === 'web_search_call' && 'action' in item) {
239
- const searchItem = item;
240
- if (searchItem.action && searchItem.action.type === 'search' && 'query' in searchItem.action) {
241
- searchQueries.push(searchItem.action.query);
242
- }
243
- }
244
- }
245
- // Parse sources from markdown links in the answer
246
- const urlRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
247
- let match;
248
- while ((match = urlRegex.exec(answer)) !== null) {
249
- sources.push({
250
- title: match[1],
251
- url: match[2],
252
- snippet: ''
253
- });
254
- }
255
- return {
256
- answer,
257
- sources,
258
- searchQueries: searchQueries.length > 0 ? searchQueries : undefined,
259
- metadata: {
260
- model,
261
- searchDepth: optionsArg.searchDepth || 'basic',
262
- tokensUsed: result.usage?.total_tokens
263
- }
264
- };
265
- }
266
- catch (error) {
267
- console.error('Research API error:', error);
268
- throw new Error(`Failed to perform research: ${error.message}`);
269
- }
270
- }
271
- /**
272
- * Image generation using OpenAI's gpt-image-1 or DALL-E models
273
- */
274
- async imageGenerate(optionsArg) {
275
- const model = optionsArg.model || this.options.imageModel || 'gpt-image-1';
276
- try {
277
- const requestParams = {
278
- model,
279
- prompt: optionsArg.prompt,
280
- n: optionsArg.n || 1,
281
- };
282
- // Add gpt-image-1 specific parameters
283
- if (model === 'gpt-image-1') {
284
- if (optionsArg.quality)
285
- requestParams.quality = optionsArg.quality;
286
- if (optionsArg.size)
287
- requestParams.size = optionsArg.size;
288
- if (optionsArg.background)
289
- requestParams.background = optionsArg.background;
290
- if (optionsArg.outputFormat)
291
- requestParams.output_format = optionsArg.outputFormat;
292
- if (optionsArg.outputCompression !== undefined)
293
- requestParams.output_compression = optionsArg.outputCompression;
294
- if (optionsArg.moderation)
295
- requestParams.moderation = optionsArg.moderation;
296
- if (optionsArg.stream !== undefined)
297
- requestParams.stream = optionsArg.stream;
298
- if (optionsArg.partialImages !== undefined)
299
- requestParams.partial_images = optionsArg.partialImages;
300
- }
301
- else if (model === 'dall-e-3') {
302
- // DALL-E 3 specific parameters
303
- if (optionsArg.quality)
304
- requestParams.quality = optionsArg.quality;
305
- if (optionsArg.size)
306
- requestParams.size = optionsArg.size;
307
- if (optionsArg.style)
308
- requestParams.style = optionsArg.style;
309
- requestParams.response_format = 'b64_json'; // Always use base64 for consistency
310
- }
311
- else if (model === 'dall-e-2') {
312
- // DALL-E 2 specific parameters
313
- if (optionsArg.size)
314
- requestParams.size = optionsArg.size;
315
- requestParams.response_format = 'b64_json';
316
- }
317
- const result = await this.openAiApiClient.images.generate(requestParams);
318
- const images = (result.data || []).map(img => ({
319
- b64_json: img.b64_json,
320
- url: img.url,
321
- revisedPrompt: img.revised_prompt
322
- }));
323
- return {
324
- images,
325
- metadata: {
326
- model,
327
- quality: result.quality,
328
- size: result.size,
329
- outputFormat: result.output_format,
330
- tokensUsed: result.usage?.total_tokens
331
- }
332
- };
333
- }
334
- catch (error) {
335
- console.error('Image generation error:', error);
336
- throw new Error(`Failed to generate image: ${error.message}`);
337
- }
338
- }
339
- /**
340
- * Image editing using OpenAI's gpt-image-1 or DALL-E 2 models
341
- */
342
- async imageEdit(optionsArg) {
343
- const model = optionsArg.model || this.options.imageModel || 'gpt-image-1';
344
- try {
345
- // Convert Buffer to uploadable file format for OpenAI API
346
- const imageFile = await toFile(optionsArg.image, 'image.png', { type: 'image/png' });
347
- const requestParams = {
348
- model,
349
- image: imageFile,
350
- prompt: optionsArg.prompt,
351
- n: optionsArg.n || 1,
352
- };
353
- // Add mask if provided (also convert to file format)
354
- if (optionsArg.mask) {
355
- requestParams.mask = await toFile(optionsArg.mask, 'mask.png', { type: 'image/png' });
356
- }
357
- // Add gpt-image-1 specific parameters
358
- if (model === 'gpt-image-1') {
359
- if (optionsArg.quality)
360
- requestParams.quality = optionsArg.quality;
361
- if (optionsArg.size)
362
- requestParams.size = optionsArg.size;
363
- if (optionsArg.background)
364
- requestParams.background = optionsArg.background;
365
- if (optionsArg.outputFormat)
366
- requestParams.output_format = optionsArg.outputFormat;
367
- if (optionsArg.outputCompression !== undefined)
368
- requestParams.output_compression = optionsArg.outputCompression;
369
- if (optionsArg.stream !== undefined)
370
- requestParams.stream = optionsArg.stream;
371
- if (optionsArg.partialImages !== undefined)
372
- requestParams.partial_images = optionsArg.partialImages;
373
- }
374
- else if (model === 'dall-e-2') {
375
- // DALL-E 2 specific parameters
376
- if (optionsArg.size)
377
- requestParams.size = optionsArg.size;
378
- requestParams.response_format = 'b64_json';
379
- }
380
- const result = await this.openAiApiClient.images.edit(requestParams);
381
- const images = (result.data || []).map(img => ({
382
- b64_json: img.b64_json,
383
- url: img.url,
384
- revisedPrompt: img.revised_prompt
385
- }));
386
- return {
387
- images,
388
- metadata: {
389
- model,
390
- quality: result.quality,
391
- size: result.size,
392
- outputFormat: result.output_format,
393
- tokensUsed: result.usage?.total_tokens
394
- }
395
- };
396
- }
397
- catch (error) {
398
- console.error('Image edit error:', error);
399
- throw new Error(`Failed to edit image: ${error.message}`);
400
- }
401
- }
402
- }
403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIub3BlbmFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIub3BlbmFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQVFoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFtQm5FLE1BQU0sT0FBTyxjQUFlLFNBQVEsZUFBZTtJQUlqRCxZQUFZLFVBQWtDO1FBQzVDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7SUFDNUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNoRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ2hDLHVCQUF1QixFQUFFLElBQUk7U0FDOUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVNLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBaUM7UUFDdkQsaURBQWlEO1FBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbEMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksY0FBYyxHQUdQLElBQUksQ0FBQztRQUVoQixnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQXFC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
@@ -1,37 +0,0 @@
1
- import { MultiModalModel } from './abstract.classes.multimodal.js';
2
- import type { ChatOptions, ChatResponse, ChatMessage, ResearchOptions, ResearchResponse, ImageGenerateOptions, ImageEditOptions, ImageResponse } from './abstract.classes.multimodal.js';
3
- export interface IPerplexityProviderOptions {
4
- perplexityToken: string;
5
- }
6
- export declare class PerplexityProvider extends MultiModalModel {
7
- private options;
8
- constructor(optionsArg: IPerplexityProviderOptions);
9
- start(): Promise<void>;
10
- stop(): Promise<void>;
11
- chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>>;
12
- chat(optionsArg: ChatOptions): Promise<ChatResponse>;
13
- audio(optionsArg: {
14
- message: string;
15
- }): Promise<NodeJS.ReadableStream>;
16
- vision(optionsArg: {
17
- image: Buffer;
18
- prompt: string;
19
- }): Promise<string>;
20
- document(optionsArg: {
21
- systemMessage: string;
22
- userMessage: string;
23
- pdfDocuments: Uint8Array[];
24
- messageHistory: ChatMessage[];
25
- }): Promise<{
26
- message: any;
27
- }>;
28
- research(optionsArg: ResearchOptions): Promise<ResearchResponse>;
29
- /**
30
- * Image generation is not supported by Perplexity
31
- */
32
- imageGenerate(optionsArg: ImageGenerateOptions): Promise<ImageResponse>;
33
- /**
34
- * Image editing is not supported by Perplexity
35
- */
36
- imageEdit(optionsArg: ImageEditOptions): Promise<ImageResponse>;
37
- }