@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
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Convert AI SDK V3 prompt messages to Ollama's message format.
3
+ */
4
+ function convertPromptToOllamaMessages(prompt) {
5
+ const messages = [];
6
+ for (const msg of prompt) {
7
+ if (msg.role === 'system') {
8
+ // System message content is a plain string in V3
9
+ messages.push({ role: 'system', content: msg.content });
10
+ }
11
+ else if (msg.role === 'user') {
12
+ let text = '';
13
+ const images = [];
14
+ for (const part of msg.content) {
15
+ if (part.type === 'text') {
16
+ text += part.text;
17
+ }
18
+ else if (part.type === 'file' && part.mediaType?.startsWith('image/')) {
19
+ // Handle image files — Ollama expects base64 images
20
+ if (typeof part.data === 'string') {
21
+ images.push(part.data);
22
+ }
23
+ else if (part.data instanceof Uint8Array) {
24
+ images.push(Buffer.from(part.data).toString('base64'));
25
+ }
26
+ }
27
+ }
28
+ const m = { role: 'user', content: text };
29
+ if (images.length > 0)
30
+ m.images = images;
31
+ messages.push(m);
32
+ }
33
+ else if (msg.role === 'assistant') {
34
+ let text = '';
35
+ let thinking = '';
36
+ const toolCalls = [];
37
+ for (const part of msg.content) {
38
+ if (part.type === 'text') {
39
+ text += part.text;
40
+ }
41
+ else if (part.type === 'reasoning') {
42
+ thinking += part.text;
43
+ }
44
+ else if (part.type === 'tool-call') {
45
+ const args = typeof part.input === 'string'
46
+ ? JSON.parse(part.input)
47
+ : part.input;
48
+ toolCalls.push({
49
+ function: {
50
+ name: part.toolName,
51
+ arguments: args,
52
+ },
53
+ });
54
+ }
55
+ }
56
+ const m = { role: 'assistant', content: text };
57
+ if (toolCalls.length > 0)
58
+ m.tool_calls = toolCalls;
59
+ if (thinking)
60
+ m.thinking = thinking;
61
+ messages.push(m);
62
+ }
63
+ else if (msg.role === 'tool') {
64
+ for (const part of msg.content) {
65
+ if (part.type === 'tool-result') {
66
+ let resultContent = '';
67
+ if (part.output) {
68
+ if (part.output.type === 'text') {
69
+ resultContent = part.output.value;
70
+ }
71
+ else if (part.output.type === 'json') {
72
+ resultContent = JSON.stringify(part.output.value);
73
+ }
74
+ }
75
+ messages.push({ role: 'tool', content: resultContent });
76
+ }
77
+ }
78
+ }
79
+ }
80
+ return messages;
81
+ }
82
+ /**
83
+ * Convert AI SDK V3 tools to Ollama's tool format.
84
+ */
85
+ function convertToolsToOllamaTools(tools) {
86
+ if (!tools || tools.length === 0)
87
+ return undefined;
88
+ return tools
89
+ .filter((t) => t.type === 'function')
90
+ .map(t => ({
91
+ type: 'function',
92
+ function: {
93
+ name: t.name,
94
+ description: t.description ?? '',
95
+ parameters: t.inputSchema,
96
+ },
97
+ }));
98
+ }
99
+ function makeUsage(promptTokens, completionTokens) {
100
+ return {
101
+ inputTokens: {
102
+ total: promptTokens,
103
+ noCache: undefined,
104
+ cacheRead: undefined,
105
+ cacheWrite: undefined,
106
+ },
107
+ outputTokens: {
108
+ total: completionTokens,
109
+ text: completionTokens,
110
+ reasoning: undefined,
111
+ },
112
+ };
113
+ }
114
+ function makeFinishReason(reason) {
115
+ if (reason === 'tool_calls' || reason === 'tool-calls') {
116
+ return { unified: 'tool-calls', raw: reason };
117
+ }
118
+ return { unified: 'stop', raw: reason ?? 'stop' };
119
+ }
120
+ let idCounter = 0;
121
+ function generateId() {
122
+ return `ollama-${Date.now()}-${idCounter++}`;
123
+ }
124
+ /**
125
+ * Custom LanguageModelV3 implementation for Ollama.
126
+ * Calls Ollama's native /api/chat endpoint directly to support
127
+ * think, num_ctx, temperature, and other model options.
128
+ */
129
+ export function createOllamaModel(options) {
130
+ const baseUrl = options.baseUrl ?? 'http://localhost:11434';
131
+ const modelId = options.model;
132
+ const ollamaOpts = { ...options.ollamaOptions };
133
+ // Apply default temperature of 0.55 for Qwen models
134
+ if (modelId.toLowerCase().includes('qwen') && ollamaOpts.temperature === undefined) {
135
+ ollamaOpts.temperature = 0.55;
136
+ }
137
+ const model = {
138
+ specificationVersion: 'v3',
139
+ provider: 'ollama',
140
+ modelId,
141
+ supportedUrls: {},
142
+ async doGenerate(callOptions) {
143
+ const messages = convertPromptToOllamaMessages(callOptions.prompt);
144
+ const tools = convertToolsToOllamaTools(callOptions.tools);
145
+ const ollamaModelOptions = { ...ollamaOpts };
146
+ // Override with call-level options if provided
147
+ if (callOptions.temperature !== undefined)
148
+ ollamaModelOptions.temperature = callOptions.temperature;
149
+ if (callOptions.topP !== undefined)
150
+ ollamaModelOptions.top_p = callOptions.topP;
151
+ if (callOptions.topK !== undefined)
152
+ ollamaModelOptions.top_k = callOptions.topK;
153
+ if (callOptions.maxOutputTokens !== undefined)
154
+ ollamaModelOptions.num_predict = callOptions.maxOutputTokens;
155
+ if (callOptions.seed !== undefined)
156
+ ollamaModelOptions.seed = callOptions.seed;
157
+ if (callOptions.stopSequences)
158
+ ollamaModelOptions.stop = callOptions.stopSequences;
159
+ // Remove think from options — it goes at the top level
160
+ const { think, ...modelOpts } = ollamaModelOptions;
161
+ const requestBody = {
162
+ model: modelId,
163
+ messages,
164
+ stream: false,
165
+ options: modelOpts,
166
+ };
167
+ // Add think parameter at the top level (Ollama API requirement)
168
+ if (ollamaOpts.think !== undefined) {
169
+ requestBody.think = ollamaOpts.think;
170
+ }
171
+ if (tools)
172
+ requestBody.tools = tools;
173
+ const response = await fetch(`${baseUrl}/api/chat`, {
174
+ method: 'POST',
175
+ headers: { 'Content-Type': 'application/json' },
176
+ body: JSON.stringify(requestBody),
177
+ signal: callOptions.abortSignal,
178
+ });
179
+ if (!response.ok) {
180
+ const body = await response.text();
181
+ throw new Error(`Ollama API error ${response.status}: ${body}`);
182
+ }
183
+ const result = await response.json();
184
+ const message = result.message;
185
+ // Build content array
186
+ const content = [];
187
+ // Add reasoning if present
188
+ if (message.thinking && typeof message.thinking === 'string') {
189
+ content.push({ type: 'reasoning', text: message.thinking });
190
+ }
191
+ // Add text content
192
+ if (message.content && typeof message.content === 'string') {
193
+ content.push({ type: 'text', text: message.content });
194
+ }
195
+ // Add tool calls if present
196
+ if (Array.isArray(message.tool_calls)) {
197
+ for (const tc of message.tool_calls) {
198
+ const fn = tc.function;
199
+ content.push({
200
+ type: 'tool-call',
201
+ toolCallId: generateId(),
202
+ toolName: fn.name,
203
+ input: JSON.stringify(fn.arguments),
204
+ });
205
+ }
206
+ }
207
+ const finishReason = Array.isArray(message.tool_calls) && message.tool_calls.length > 0
208
+ ? makeFinishReason('tool_calls')
209
+ : makeFinishReason('stop');
210
+ return {
211
+ content,
212
+ finishReason,
213
+ usage: makeUsage(result.prompt_eval_count ?? undefined, result.eval_count ?? undefined),
214
+ warnings: [],
215
+ request: { body: requestBody },
216
+ };
217
+ },
218
+ async doStream(callOptions) {
219
+ const messages = convertPromptToOllamaMessages(callOptions.prompt);
220
+ const tools = convertToolsToOllamaTools(callOptions.tools);
221
+ const ollamaModelOptions = { ...ollamaOpts };
222
+ if (callOptions.temperature !== undefined)
223
+ ollamaModelOptions.temperature = callOptions.temperature;
224
+ if (callOptions.topP !== undefined)
225
+ ollamaModelOptions.top_p = callOptions.topP;
226
+ if (callOptions.topK !== undefined)
227
+ ollamaModelOptions.top_k = callOptions.topK;
228
+ if (callOptions.maxOutputTokens !== undefined)
229
+ ollamaModelOptions.num_predict = callOptions.maxOutputTokens;
230
+ if (callOptions.seed !== undefined)
231
+ ollamaModelOptions.seed = callOptions.seed;
232
+ if (callOptions.stopSequences)
233
+ ollamaModelOptions.stop = callOptions.stopSequences;
234
+ const { think, ...modelOpts } = ollamaModelOptions;
235
+ const requestBody = {
236
+ model: modelId,
237
+ messages,
238
+ stream: true,
239
+ options: modelOpts,
240
+ };
241
+ if (ollamaOpts.think !== undefined) {
242
+ requestBody.think = ollamaOpts.think;
243
+ }
244
+ if (tools)
245
+ requestBody.tools = tools;
246
+ const response = await fetch(`${baseUrl}/api/chat`, {
247
+ method: 'POST',
248
+ headers: { 'Content-Type': 'application/json' },
249
+ body: JSON.stringify(requestBody),
250
+ signal: callOptions.abortSignal,
251
+ });
252
+ if (!response.ok) {
253
+ const body = await response.text();
254
+ throw new Error(`Ollama API error ${response.status}: ${body}`);
255
+ }
256
+ const reader = response.body.getReader();
257
+ const decoder = new TextDecoder();
258
+ const textId = generateId();
259
+ const reasoningId = generateId();
260
+ let textStarted = false;
261
+ let reasoningStarted = false;
262
+ let hasToolCalls = false;
263
+ let closed = false;
264
+ const stream = new ReadableStream({
265
+ async pull(controller) {
266
+ if (closed)
267
+ return;
268
+ const processLine = (line) => {
269
+ if (!line.trim())
270
+ return;
271
+ let json;
272
+ try {
273
+ json = JSON.parse(line);
274
+ }
275
+ catch {
276
+ return;
277
+ }
278
+ const msg = json.message;
279
+ // Handle thinking/reasoning content
280
+ if (msg?.thinking && typeof msg.thinking === 'string') {
281
+ if (!reasoningStarted) {
282
+ reasoningStarted = true;
283
+ controller.enqueue({ type: 'reasoning-start', id: reasoningId });
284
+ }
285
+ controller.enqueue({ type: 'reasoning-delta', id: reasoningId, delta: msg.thinking });
286
+ }
287
+ // Handle text content
288
+ if (msg?.content && typeof msg.content === 'string') {
289
+ if (reasoningStarted && !textStarted) {
290
+ controller.enqueue({ type: 'reasoning-end', id: reasoningId });
291
+ }
292
+ if (!textStarted) {
293
+ textStarted = true;
294
+ controller.enqueue({ type: 'text-start', id: textId });
295
+ }
296
+ controller.enqueue({ type: 'text-delta', id: textId, delta: msg.content });
297
+ }
298
+ // Handle tool calls
299
+ if (Array.isArray(msg?.tool_calls)) {
300
+ hasToolCalls = true;
301
+ for (const tc of msg.tool_calls) {
302
+ const fn = tc.function;
303
+ const callId = generateId();
304
+ controller.enqueue({
305
+ type: 'tool-call',
306
+ toolCallId: callId,
307
+ toolName: fn.name,
308
+ input: JSON.stringify(fn.arguments),
309
+ });
310
+ }
311
+ }
312
+ // Handle done
313
+ if (json.done) {
314
+ if (reasoningStarted && !textStarted) {
315
+ controller.enqueue({ type: 'reasoning-end', id: reasoningId });
316
+ }
317
+ if (textStarted) {
318
+ controller.enqueue({ type: 'text-end', id: textId });
319
+ }
320
+ controller.enqueue({
321
+ type: 'finish',
322
+ finishReason: hasToolCalls
323
+ ? makeFinishReason('tool_calls')
324
+ : makeFinishReason('stop'),
325
+ usage: makeUsage(json.prompt_eval_count ?? undefined, json.eval_count ?? undefined),
326
+ });
327
+ closed = true;
328
+ controller.close();
329
+ }
330
+ };
331
+ try {
332
+ let buffer = '';
333
+ while (true) {
334
+ const { done, value } = await reader.read();
335
+ if (done) {
336
+ if (buffer.trim())
337
+ processLine(buffer);
338
+ if (!closed) {
339
+ controller.enqueue({
340
+ type: 'finish',
341
+ finishReason: makeFinishReason('stop'),
342
+ usage: makeUsage(undefined, undefined),
343
+ });
344
+ closed = true;
345
+ controller.close();
346
+ }
347
+ return;
348
+ }
349
+ buffer += decoder.decode(value, { stream: true });
350
+ const lines = buffer.split('\n');
351
+ buffer = lines.pop() || '';
352
+ for (const line of lines) {
353
+ processLine(line);
354
+ if (closed)
355
+ return;
356
+ }
357
+ }
358
+ }
359
+ catch (error) {
360
+ if (!closed) {
361
+ controller.error(error);
362
+ closed = true;
363
+ }
364
+ }
365
+ finally {
366
+ reader.releaseLock();
367
+ }
368
+ },
369
+ });
370
+ return {
371
+ stream,
372
+ request: { body: requestBody },
373
+ };
374
+ },
375
+ };
376
+ return model;
377
+ }
378
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5wcm92aWRlci5vbGxhbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFpLnByb3ZpZGVyLm9sbGFtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFnQ0E7O0dBRUc7QUFDSCxTQUFTLDZCQUE2QixDQUFDLE1BQTZCO0lBQ2xFLE1BQU0sUUFBUSxHQUFxQixFQUFFLENBQUM7SUFFdEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN6QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDMUIsaURBQWlEO1lBQ2pELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO2FBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQy9CLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNkLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztZQUM1QixLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO29CQUN6QixJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDcEIsQ0FBQztxQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQ3hFLG9EQUFvRDtvQkFDcEQsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN6QixDQUFDO3lCQUFNLElBQUksSUFBSSxD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
@@ -0,0 +1,9 @@
1
+ export interface IOpenAiTtsOptions {
2
+ apiKey: string;
3
+ text: string;
4
+ voice?: 'alloy' | 'echo' | 'fable' | 'onyx' | 'nova' | 'shimmer';
5
+ model?: 'tts-1' | 'tts-1-hd';
6
+ responseFormat?: 'mp3' | 'opus' | 'aac' | 'flac';
7
+ speed?: number;
8
+ }
9
+ export declare function textToSpeech(options: IOpenAiTtsOptions): Promise<NodeJS.ReadableStream>;
@@ -0,0 +1,15 @@
1
+ import * as plugins from './plugins.js';
2
+ import { Readable } from 'stream';
3
+ export async function textToSpeech(options) {
4
+ const client = new plugins.OpenAI({ apiKey: options.apiKey });
5
+ const result = await client.audio.speech.create({
6
+ model: options.model ?? 'tts-1',
7
+ voice: options.voice ?? 'alloy',
8
+ input: options.text,
9
+ response_format: options.responseFormat ?? 'mp3',
10
+ speed: options.speed ?? 1,
11
+ });
12
+ const stream = result.body;
13
+ return Readable.fromWeb(stream);
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19hdWRpby9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBV2xDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUFDLE9BQTBCO0lBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5RCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM5QyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPO1FBQy9CLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU87UUFDL0IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ25CLGVBQWUsRUFBRSxPQUFPLENBQUMsY0FBYyxJQUFJLEtBQUs7UUFDaEQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQztLQUMxQixDQUFDLENBQUM7SUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzNCLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFhLENBQUMsQ0FBQztBQUN6QyxDQUFDIn0=
@@ -0,0 +1,2 @@
1
+ import OpenAI from 'openai';
2
+ export { OpenAI };
@@ -0,0 +1,3 @@
1
+ import OpenAI from 'openai';
2
+ export { OpenAI };
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2F1ZGlvL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyJ9
@@ -0,0 +1,11 @@
1
+ import type { LanguageModelV3 } from '@ai-sdk/provider';
2
+ import type { ModelMessage } from 'ai';
3
+ export interface IDocumentOptions {
4
+ model: LanguageModelV3;
5
+ systemMessage?: string;
6
+ userMessage: string;
7
+ pdfDocuments: Uint8Array[];
8
+ messageHistory?: ModelMessage[];
9
+ }
10
+ export declare function analyzeDocuments(options: IDocumentOptions): Promise<string>;
11
+ export declare function stopSmartpdf(): Promise<void>;
@@ -0,0 +1,45 @@
1
+ import * as plugins from './plugins.js';
2
+ let smartpdfInstance = null;
3
+ async function ensureSmartpdf() {
4
+ if (!smartpdfInstance) {
5
+ smartpdfInstance = new plugins.smartpdf.SmartPdf();
6
+ await smartpdfInstance.start();
7
+ }
8
+ return smartpdfInstance;
9
+ }
10
+ export async function analyzeDocuments(options) {
11
+ const pdf = await ensureSmartpdf();
12
+ const imagePages = [];
13
+ for (const doc of options.pdfDocuments) {
14
+ const pages = await pdf.convertPDFToPngBytes(doc);
15
+ imagePages.push(...pages);
16
+ }
17
+ // Filter out empty buffers
18
+ const validPages = imagePages.filter(page => page && page.length > 0);
19
+ const result = await plugins.generateText({
20
+ model: options.model,
21
+ system: options.systemMessage,
22
+ messages: [
23
+ ...(options.messageHistory ?? []),
24
+ {
25
+ role: 'user',
26
+ content: [
27
+ { type: 'text', text: options.userMessage },
28
+ ...validPages.map(page => ({
29
+ type: 'image',
30
+ image: page,
31
+ mimeType: 'image/png',
32
+ })),
33
+ ],
34
+ },
35
+ ],
36
+ });
37
+ return result.text;
38
+ }
39
+ export async function stopSmartpdf() {
40
+ if (smartpdfInstance) {
41
+ await smartpdfInstance.stop();
42
+ smartpdfInstance = null;
43
+ }
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19kb2N1bWVudC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUl4QyxJQUFJLGdCQUFnQixHQUEwRCxJQUFJLENBQUM7QUFFbkYsS0FBSyxVQUFVLGNBQWM7SUFDM0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdEIsZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25ELE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUNELE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQztBQVVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsT0FBeUI7SUFDOUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxjQUFjLEVBQUUsQ0FBQztJQUVuQyxNQUFNLFVBQVUsR0FBaUIsRUFBRSxDQUFDO0lBQ3BDLEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV0RSxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDeEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsYUFBYTtRQUM3QixRQUFRLEVBQUU7WUFDUixHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7WUFDakM7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osT0FBTyxFQUFFO29CQUNQLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRTtvQkFDM0MsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDekIsSUFBSSxFQUFFLE9BQWdCO3dCQUN0QixLQUFLLEVBQUUsSUFBSTt3QkFDWCxRQUFRLEVBQUUsV0FBb0I7cUJBQy9CLENBQUMsQ0FBQztpQkFDSjthQUNGO1NBQ0Y7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWTtJQUNoQyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDckIsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztBQUNILENBQUMifQ==
@@ -0,0 +1,3 @@
1
+ import { generateText } from 'ai';
2
+ import * as smartpdf from '@push.rocks/smartpdf';
3
+ export { generateText, smartpdf };
@@ -0,0 +1,4 @@
1
+ import { generateText } from 'ai';
2
+ import * as smartpdf from '@push.rocks/smartpdf';
3
+ export { generateText, smartpdf };
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2RvY3VtZW50L3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQztBQUNsQyxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLENBQUMifQ==
@@ -0,0 +1,46 @@
1
+ export interface IImageGenerateOptions {
2
+ apiKey: string;
3
+ prompt: string;
4
+ model?: 'gpt-image-1' | 'dall-e-3' | 'dall-e-2';
5
+ quality?: 'low' | 'medium' | 'high' | 'standard' | 'hd' | 'auto';
6
+ size?: '256x256' | '512x512' | '1024x1024' | '1536x1024' | '1024x1536' | '1792x1024' | '1024x1792' | 'auto';
7
+ style?: 'vivid' | 'natural';
8
+ background?: 'transparent' | 'opaque' | 'auto';
9
+ outputFormat?: 'png' | 'jpeg' | 'webp';
10
+ outputCompression?: number;
11
+ moderation?: 'low' | 'auto';
12
+ n?: number;
13
+ stream?: boolean;
14
+ partialImages?: number;
15
+ }
16
+ export interface IImageEditOptions {
17
+ apiKey: string;
18
+ image: Buffer;
19
+ prompt: string;
20
+ mask?: Buffer;
21
+ model?: 'gpt-image-1' | 'dall-e-2';
22
+ quality?: 'low' | 'medium' | 'high' | 'standard' | 'auto';
23
+ size?: '256x256' | '512x512' | '1024x1024' | '1536x1024' | '1024x1536' | 'auto';
24
+ background?: 'transparent' | 'opaque' | 'auto';
25
+ outputFormat?: 'png' | 'jpeg' | 'webp';
26
+ outputCompression?: number;
27
+ n?: number;
28
+ stream?: boolean;
29
+ partialImages?: number;
30
+ }
31
+ export interface IImageResponse {
32
+ images: Array<{
33
+ b64_json?: string;
34
+ url?: string;
35
+ revisedPrompt?: string;
36
+ }>;
37
+ metadata?: {
38
+ model: string;
39
+ quality?: string;
40
+ size?: string;
41
+ outputFormat?: string;
42
+ tokensUsed?: number;
43
+ };
44
+ }
45
+ export declare function generateImage(options: IImageGenerateOptions): Promise<IImageResponse>;
46
+ export declare function editImage(options: IImageEditOptions): Promise<IImageResponse>;