@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.
- package/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/index.d.ts +6 -11
- package/dist_ts/index.js +6 -12
- package/dist_ts/plugins.d.ts +10 -15
- package/dist_ts/plugins.js +13 -19
- package/dist_ts/smartai.classes.smartai.d.ts +7 -0
- package/dist_ts/smartai.classes.smartai.js +51 -0
- package/dist_ts/smartai.interfaces.d.ts +41 -0
- package/dist_ts/smartai.interfaces.js +2 -0
- package/dist_ts/smartai.middleware.anthropic.d.ts +7 -0
- package/dist_ts/smartai.middleware.anthropic.js +36 -0
- package/dist_ts/smartai.provider.ollama.d.ts +8 -0
- package/dist_ts/smartai.provider.ollama.js +378 -0
- package/dist_ts_audio/index.d.ts +9 -0
- package/dist_ts_audio/index.js +15 -0
- package/dist_ts_audio/plugins.d.ts +2 -0
- package/dist_ts_audio/plugins.js +3 -0
- package/dist_ts_document/index.d.ts +11 -0
- package/dist_ts_document/index.js +45 -0
- package/dist_ts_document/plugins.d.ts +3 -0
- package/dist_ts_document/plugins.js +4 -0
- package/dist_ts_image/index.d.ts +46 -0
- package/dist_ts_image/index.js +110 -0
- package/dist_ts_image/plugins.d.ts +3 -0
- package/dist_ts_image/plugins.js +4 -0
- package/dist_ts_research/index.d.ts +19 -0
- package/dist_ts_research/index.js +98 -0
- package/dist_ts_research/plugins.d.ts +2 -0
- package/dist_ts_research/plugins.js +3 -0
- package/dist_ts_vision/index.d.ts +8 -0
- package/dist_ts_vision/index.js +21 -0
- package/dist_ts_vision/plugins.d.ts +2 -0
- package/dist_ts_vision/plugins.js +3 -0
- package/package.json +50 -22
- package/readme.hints.md +34 -88
- package/readme.md +284 -547
- package/ts/00_commitinfo_data.ts +2 -2
- package/ts/index.ts +8 -11
- package/ts/plugins.ts +19 -35
- package/ts/smartai.classes.smartai.ts +51 -0
- package/ts/smartai.interfaces.ts +53 -0
- package/ts/smartai.middleware.anthropic.ts +38 -0
- package/ts/smartai.provider.ollama.ts +426 -0
- package/ts_audio/index.ts +24 -0
- package/ts_audio/plugins.ts +2 -0
- package/ts_document/index.ts +61 -0
- package/ts_document/plugins.ts +3 -0
- package/ts_image/index.ts +147 -0
- package/ts_image/plugins.ts +3 -0
- package/ts_research/index.ts +120 -0
- package/ts_research/plugins.ts +2 -0
- package/ts_vision/index.ts +29 -0
- package/ts_vision/plugins.ts +2 -0
- package/dist_ts/abstract.classes.multimodal.d.ts +0 -212
- package/dist_ts/abstract.classes.multimodal.js +0 -43
- package/dist_ts/classes.conversation.d.ts +0 -31
- package/dist_ts/classes.conversation.js +0 -150
- package/dist_ts/classes.smartai.d.ts +0 -59
- package/dist_ts/classes.smartai.js +0 -139
- package/dist_ts/classes.tts.d.ts +0 -6
- package/dist_ts/classes.tts.js +0 -10
- package/dist_ts/interfaces.d.ts +0 -1
- package/dist_ts/interfaces.js +0 -2
- package/dist_ts/paths.d.ts +0 -2
- package/dist_ts/paths.js +0 -4
- package/dist_ts/provider.anthropic.d.ts +0 -48
- package/dist_ts/provider.anthropic.js +0 -369
- package/dist_ts/provider.elevenlabs.d.ts +0 -43
- package/dist_ts/provider.elevenlabs.js +0 -64
- package/dist_ts/provider.exo.d.ts +0 -40
- package/dist_ts/provider.exo.js +0 -116
- package/dist_ts/provider.groq.d.ts +0 -39
- package/dist_ts/provider.groq.js +0 -178
- package/dist_ts/provider.mistral.d.ts +0 -61
- package/dist_ts/provider.mistral.js +0 -288
- package/dist_ts/provider.ollama.d.ts +0 -141
- package/dist_ts/provider.ollama.js +0 -519
- package/dist_ts/provider.openai.d.ts +0 -62
- package/dist_ts/provider.openai.js +0 -403
- package/dist_ts/provider.perplexity.d.ts +0 -37
- package/dist_ts/provider.perplexity.js +0 -215
- package/dist_ts/provider.xai.d.ts +0 -52
- package/dist_ts/provider.xai.js +0 -160
- package/ts/abstract.classes.multimodal.ts +0 -240
- package/ts/classes.conversation.ts +0 -176
- package/ts/classes.smartai.ts +0 -187
- package/ts/classes.tts.ts +0 -15
- package/ts/interfaces.ts +0 -0
- package/ts/paths.ts +0 -4
- package/ts/provider.anthropic.ts +0 -446
- package/ts/provider.elevenlabs.ts +0 -116
- package/ts/provider.exo.ts +0 -155
- package/ts/provider.groq.ts +0 -219
- package/ts/provider.mistral.ts +0 -352
- package/ts/provider.ollama.ts +0 -695
- package/ts/provider.openai.ts +0 -462
- package/ts/provider.perplexity.ts +0 -259
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIub2xsYW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIub2xsYW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQTBHbkUsTUFBTSxPQUFPLGNBQWUsU0FBUSxlQUFlO0lBUWpELFlBQVksYUFBcUMsRUFBRTtRQUNqRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSx3QkFBd0IsQ0FBQztRQUM5RCxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDO0lBQzVELENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLDJCQUEyQjtRQUMzQixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLFdBQVcsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUN4RCxDQUFDO1FBQ0gsQ0FBQztRQUFD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
|
|
@@ -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
|
-
}
|