@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.
- 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 -529
- 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 -705
- package/ts/provider.openai.ts +0 -462
- package/ts/provider.perplexity.ts +0 -259
- package/ts/provider.xai.ts +0 -214
|
@@ -1,39 +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 IGroqProviderOptions {
|
|
4
|
-
groqToken: string;
|
|
5
|
-
model?: string;
|
|
6
|
-
}
|
|
7
|
-
export declare class GroqProvider extends MultiModalModel {
|
|
8
|
-
private options;
|
|
9
|
-
private baseUrl;
|
|
10
|
-
constructor(optionsArg: IGroqProviderOptions);
|
|
11
|
-
start(): Promise<void>;
|
|
12
|
-
stop(): Promise<void>;
|
|
13
|
-
chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>>;
|
|
14
|
-
chat(optionsArg: ChatOptions): Promise<ChatResponse>;
|
|
15
|
-
audio(optionsArg: {
|
|
16
|
-
message: string;
|
|
17
|
-
}): Promise<NodeJS.ReadableStream>;
|
|
18
|
-
vision(optionsArg: {
|
|
19
|
-
image: Buffer;
|
|
20
|
-
prompt: string;
|
|
21
|
-
}): Promise<string>;
|
|
22
|
-
document(optionsArg: {
|
|
23
|
-
systemMessage: string;
|
|
24
|
-
userMessage: string;
|
|
25
|
-
pdfDocuments: Uint8Array[];
|
|
26
|
-
messageHistory: ChatMessage[];
|
|
27
|
-
}): Promise<{
|
|
28
|
-
message: any;
|
|
29
|
-
}>;
|
|
30
|
-
research(optionsArg: ResearchOptions): Promise<ResearchResponse>;
|
|
31
|
-
/**
|
|
32
|
-
* Image generation is not supported by Groq
|
|
33
|
-
*/
|
|
34
|
-
imageGenerate(optionsArg: ImageGenerateOptions): Promise<ImageResponse>;
|
|
35
|
-
/**
|
|
36
|
-
* Image editing is not supported by Groq
|
|
37
|
-
*/
|
|
38
|
-
imageEdit(optionsArg: ImageEditOptions): Promise<ImageResponse>;
|
|
39
|
-
}
|
package/dist_ts/provider.groq.js
DELETED
|
@@ -1,178 +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 GroqProvider extends MultiModalModel {
|
|
5
|
-
constructor(optionsArg) {
|
|
6
|
-
super();
|
|
7
|
-
this.baseUrl = 'https://api.groq.com/v1';
|
|
8
|
-
this.options = {
|
|
9
|
-
...optionsArg,
|
|
10
|
-
model: optionsArg.model || 'llama-3.3-70b-versatile', // Default model
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
async start() { }
|
|
14
|
-
async stop() { }
|
|
15
|
-
async chatStream(input) {
|
|
16
|
-
// Create a TextDecoder to handle incoming chunks
|
|
17
|
-
const decoder = new TextDecoder();
|
|
18
|
-
let buffer = '';
|
|
19
|
-
let currentMessage = null;
|
|
20
|
-
// Create a TransformStream to process the input
|
|
21
|
-
const transform = new TransformStream({
|
|
22
|
-
transform: async (chunk, controller) => {
|
|
23
|
-
buffer += decoder.decode(chunk, { stream: true });
|
|
24
|
-
// Try to parse complete JSON messages from the buffer
|
|
25
|
-
while (true) {
|
|
26
|
-
const newlineIndex = buffer.indexOf('\n');
|
|
27
|
-
if (newlineIndex === -1)
|
|
28
|
-
break;
|
|
29
|
-
const line = buffer.slice(0, newlineIndex);
|
|
30
|
-
buffer = buffer.slice(newlineIndex + 1);
|
|
31
|
-
if (line.trim()) {
|
|
32
|
-
try {
|
|
33
|
-
const message = JSON.parse(line);
|
|
34
|
-
currentMessage = {
|
|
35
|
-
role: message.role || 'user',
|
|
36
|
-
content: message.content || '',
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
catch (e) {
|
|
40
|
-
console.error('Failed to parse message:', e);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
// If we have a complete message, send it to Groq
|
|
45
|
-
if (currentMessage) {
|
|
46
|
-
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
47
|
-
method: 'POST',
|
|
48
|
-
headers: {
|
|
49
|
-
'Authorization': `Bearer ${this.options.groqToken}`,
|
|
50
|
-
'Content-Type': 'application/json',
|
|
51
|
-
},
|
|
52
|
-
body: JSON.stringify({
|
|
53
|
-
model: this.options.model,
|
|
54
|
-
messages: [{ role: currentMessage.role, content: currentMessage.content }],
|
|
55
|
-
stream: true,
|
|
56
|
-
}),
|
|
57
|
-
});
|
|
58
|
-
// Process each chunk from Groq
|
|
59
|
-
const reader = response.body?.getReader();
|
|
60
|
-
if (reader) {
|
|
61
|
-
try {
|
|
62
|
-
while (true) {
|
|
63
|
-
const { done, value } = await reader.read();
|
|
64
|
-
if (done)
|
|
65
|
-
break;
|
|
66
|
-
const chunk = new TextDecoder().decode(value);
|
|
67
|
-
const lines = chunk.split('\n');
|
|
68
|
-
for (const line of lines) {
|
|
69
|
-
if (line.startsWith('data: ')) {
|
|
70
|
-
const data = line.slice(6);
|
|
71
|
-
if (data === '[DONE]')
|
|
72
|
-
break;
|
|
73
|
-
try {
|
|
74
|
-
const parsed = JSON.parse(data);
|
|
75
|
-
const content = parsed.choices[0]?.delta?.content;
|
|
76
|
-
if (content) {
|
|
77
|
-
controller.enqueue(content);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
catch (e) {
|
|
81
|
-
console.error('Failed to parse SSE data:', e);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
finally {
|
|
88
|
-
reader.releaseLock();
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
currentMessage = null;
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
flush(controller) {
|
|
95
|
-
if (buffer) {
|
|
96
|
-
try {
|
|
97
|
-
const message = JSON.parse(buffer);
|
|
98
|
-
controller.enqueue(message.content || '');
|
|
99
|
-
}
|
|
100
|
-
catch (e) {
|
|
101
|
-
console.error('Failed to parse remaining buffer:', e);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
// Connect the input to our transform stream
|
|
107
|
-
return input.pipeThrough(transform);
|
|
108
|
-
}
|
|
109
|
-
// Implementing the synchronous chat interaction
|
|
110
|
-
async chat(optionsArg) {
|
|
111
|
-
const messages = [
|
|
112
|
-
// System message
|
|
113
|
-
{
|
|
114
|
-
role: 'system',
|
|
115
|
-
content: optionsArg.systemMessage,
|
|
116
|
-
},
|
|
117
|
-
// Message history
|
|
118
|
-
...optionsArg.messageHistory.map(msg => ({
|
|
119
|
-
role: msg.role,
|
|
120
|
-
content: msg.content,
|
|
121
|
-
})),
|
|
122
|
-
// User message
|
|
123
|
-
{
|
|
124
|
-
role: 'user',
|
|
125
|
-
content: optionsArg.userMessage,
|
|
126
|
-
},
|
|
127
|
-
];
|
|
128
|
-
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
129
|
-
method: 'POST',
|
|
130
|
-
headers: {
|
|
131
|
-
'Authorization': `Bearer ${this.options.groqToken}`,
|
|
132
|
-
'Content-Type': 'application/json',
|
|
133
|
-
},
|
|
134
|
-
body: JSON.stringify({
|
|
135
|
-
model: this.options.model,
|
|
136
|
-
messages,
|
|
137
|
-
temperature: 0.7,
|
|
138
|
-
max_completion_tokens: 1024,
|
|
139
|
-
stream: false,
|
|
140
|
-
}),
|
|
141
|
-
});
|
|
142
|
-
if (!response.ok) {
|
|
143
|
-
const error = await response.json();
|
|
144
|
-
throw new Error(`Groq API error: ${error.message || response.statusText}`);
|
|
145
|
-
}
|
|
146
|
-
const result = await response.json();
|
|
147
|
-
return {
|
|
148
|
-
role: 'assistant',
|
|
149
|
-
message: result.choices[0].message.content,
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
async audio(optionsArg) {
|
|
153
|
-
// Groq does not provide an audio API, so this method is not implemented.
|
|
154
|
-
throw new Error('Audio generation is not yet supported by Groq.');
|
|
155
|
-
}
|
|
156
|
-
async vision(optionsArg) {
|
|
157
|
-
throw new Error('Vision tasks are not yet supported by Groq.');
|
|
158
|
-
}
|
|
159
|
-
async document(optionsArg) {
|
|
160
|
-
throw new Error('Document processing is not yet supported by Groq.');
|
|
161
|
-
}
|
|
162
|
-
async research(optionsArg) {
|
|
163
|
-
throw new Error('Research capabilities are not yet supported by Groq provider.');
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Image generation is not supported by Groq
|
|
167
|
-
*/
|
|
168
|
-
async imageGenerate(optionsArg) {
|
|
169
|
-
throw new Error('Image generation is not supported by Groq. Please use OpenAI provider for image generation.');
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Image editing is not supported by Groq
|
|
173
|
-
*/
|
|
174
|
-
async imageEdit(optionsArg) {
|
|
175
|
-
throw new Error('Image editing is not supported by Groq. Please use OpenAI provider for image editing.');
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuZ3JvcS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Byb3ZpZGVyLmdyb3EudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBaUJuRSxNQUFNLE9BQU8sWUFBYSxTQUFRLGVBQWU7SUFJL0MsWUFBWSxVQUFnQztRQUMxQyxLQUFLLEVBQUUsQ0FBQztRQUhGLFlBQU8sR0FBRyx5QkFBeUIsQ0FBQztRQUkxQyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsR0FBRyxVQUFVO1lBQ2IsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLLElBQUkseUJBQXlCLEVBQUUsZ0JBQWdCO1NBQ3ZFLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssS0FBSSxDQUFDO0lBRWhCLEtBQUssQ0FBQyxJQUFJLEtBQUksQ0FBQztJQUVSLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBaUM7UUFDdkQsaURBQWlEO1FBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbEMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksY0FBYyxHQUE4QyxJQUFJLENBQUM7UUFFckUsZ0RBQWdEO1FBQ2hELE1BQU0sU0FBUyxHQUFHLElBQUksZUFBZSxDQUFxQjtZQUN4RCxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRTtnQkFDckMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBRWxELHNEQUFzRDtnQkFDdEQsT0FBTyxJQUFJLEVBQUUsQ0FBQztvQkFDWixNQUFNLFlBQVksR0FBRyxNQUFN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
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import * as plugins from './plugins.js';
|
|
2
|
-
import { MultiModalModel } from './abstract.classes.multimodal.js';
|
|
3
|
-
import type { ChatOptions, ChatResponse, ChatMessage, ResearchOptions, ResearchResponse, ImageGenerateOptions, ImageEditOptions, ImageResponse } from './abstract.classes.multimodal.js';
|
|
4
|
-
export interface IMistralProviderOptions {
|
|
5
|
-
mistralToken: string;
|
|
6
|
-
chatModel?: string;
|
|
7
|
-
ocrModel?: string;
|
|
8
|
-
tableFormat?: 'markdown' | 'html';
|
|
9
|
-
}
|
|
10
|
-
export declare class MistralProvider extends MultiModalModel {
|
|
11
|
-
private options;
|
|
12
|
-
mistralClient: plugins.mistralai.Mistral;
|
|
13
|
-
constructor(optionsArg: IMistralProviderOptions);
|
|
14
|
-
start(): Promise<void>;
|
|
15
|
-
stop(): Promise<void>;
|
|
16
|
-
/**
|
|
17
|
-
* Synchronous chat interaction using Mistral's chat API
|
|
18
|
-
*/
|
|
19
|
-
chat(optionsArg: ChatOptions): Promise<ChatResponse>;
|
|
20
|
-
/**
|
|
21
|
-
* Streaming chat using Mistral's streaming API
|
|
22
|
-
*/
|
|
23
|
-
chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>>;
|
|
24
|
-
/**
|
|
25
|
-
* Audio generation is not supported by Mistral
|
|
26
|
-
*/
|
|
27
|
-
audio(optionsArg: {
|
|
28
|
-
message: string;
|
|
29
|
-
}): Promise<NodeJS.ReadableStream>;
|
|
30
|
-
/**
|
|
31
|
-
* Vision using Mistral's OCR API for image analysis
|
|
32
|
-
*/
|
|
33
|
-
vision(optionsArg: {
|
|
34
|
-
image: Buffer;
|
|
35
|
-
prompt: string;
|
|
36
|
-
}): Promise<string>;
|
|
37
|
-
/**
|
|
38
|
-
* Document processing using Mistral's OCR API
|
|
39
|
-
* PDFs are uploaded via Files API first, then processed with OCR
|
|
40
|
-
*/
|
|
41
|
-
document(optionsArg: {
|
|
42
|
-
systemMessage: string;
|
|
43
|
-
userMessage: string;
|
|
44
|
-
pdfDocuments: Uint8Array[];
|
|
45
|
-
messageHistory: ChatMessage[];
|
|
46
|
-
}): Promise<{
|
|
47
|
-
message: any;
|
|
48
|
-
}>;
|
|
49
|
-
/**
|
|
50
|
-
* Research is not natively supported by Mistral
|
|
51
|
-
*/
|
|
52
|
-
research(optionsArg: ResearchOptions): Promise<ResearchResponse>;
|
|
53
|
-
/**
|
|
54
|
-
* Image generation is not supported by Mistral
|
|
55
|
-
*/
|
|
56
|
-
imageGenerate(optionsArg: ImageGenerateOptions): Promise<ImageResponse>;
|
|
57
|
-
/**
|
|
58
|
-
* Image editing is not supported by Mistral
|
|
59
|
-
*/
|
|
60
|
-
imageEdit(optionsArg: ImageEditOptions): Promise<ImageResponse>;
|
|
61
|
-
}
|
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
import * as plugins from './plugins.js';
|
|
2
|
-
import { MultiModalModel } from './abstract.classes.multimodal.js';
|
|
3
|
-
export class MistralProvider extends MultiModalModel {
|
|
4
|
-
constructor(optionsArg) {
|
|
5
|
-
super();
|
|
6
|
-
this.options = optionsArg;
|
|
7
|
-
}
|
|
8
|
-
async start() {
|
|
9
|
-
await super.start();
|
|
10
|
-
this.mistralClient = new plugins.mistralai.Mistral({
|
|
11
|
-
apiKey: this.options.mistralToken,
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
async stop() {
|
|
15
|
-
await super.stop();
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Synchronous chat interaction using Mistral's chat API
|
|
19
|
-
*/
|
|
20
|
-
async chat(optionsArg) {
|
|
21
|
-
// Convert message history to Mistral format
|
|
22
|
-
const messages = [];
|
|
23
|
-
// Add system message first
|
|
24
|
-
if (optionsArg.systemMessage) {
|
|
25
|
-
messages.push({
|
|
26
|
-
role: 'system',
|
|
27
|
-
content: optionsArg.systemMessage
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
// Add message history
|
|
31
|
-
for (const msg of optionsArg.messageHistory) {
|
|
32
|
-
messages.push({
|
|
33
|
-
role: msg.role === 'system' ? 'system' : msg.role === 'assistant' ? 'assistant' : 'user',
|
|
34
|
-
content: msg.content
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
// Add current user message
|
|
38
|
-
messages.push({
|
|
39
|
-
role: 'user',
|
|
40
|
-
content: optionsArg.userMessage
|
|
41
|
-
});
|
|
42
|
-
const result = await this.mistralClient.chat.complete({
|
|
43
|
-
model: this.options.chatModel || 'mistral-large-latest',
|
|
44
|
-
messages: messages,
|
|
45
|
-
});
|
|
46
|
-
// Extract content from response
|
|
47
|
-
const choice = result.choices?.[0];
|
|
48
|
-
let content = '';
|
|
49
|
-
if (choice?.message?.content) {
|
|
50
|
-
if (typeof choice.message.content === 'string') {
|
|
51
|
-
content = choice.message.content;
|
|
52
|
-
}
|
|
53
|
-
else if (Array.isArray(choice.message.content)) {
|
|
54
|
-
// Handle array of content chunks
|
|
55
|
-
content = choice.message.content
|
|
56
|
-
.map((chunk) => {
|
|
57
|
-
if (typeof chunk === 'string')
|
|
58
|
-
return chunk;
|
|
59
|
-
if (chunk && typeof chunk === 'object' && 'text' in chunk)
|
|
60
|
-
return chunk.text;
|
|
61
|
-
return '';
|
|
62
|
-
})
|
|
63
|
-
.join('');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return {
|
|
67
|
-
role: 'assistant',
|
|
68
|
-
message: content,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Streaming chat using Mistral's streaming API
|
|
73
|
-
*/
|
|
74
|
-
async chatStream(input) {
|
|
75
|
-
const decoder = new TextDecoder();
|
|
76
|
-
let buffer = '';
|
|
77
|
-
const mistralClient = this.mistralClient;
|
|
78
|
-
const chatModel = this.options.chatModel || 'mistral-large-latest';
|
|
79
|
-
const transform = new TransformStream({
|
|
80
|
-
async transform(chunk, controller) {
|
|
81
|
-
buffer += decoder.decode(chunk, { stream: true });
|
|
82
|
-
// Try to parse complete JSON messages from the buffer
|
|
83
|
-
while (true) {
|
|
84
|
-
const newlineIndex = buffer.indexOf('\n');
|
|
85
|
-
if (newlineIndex === -1)
|
|
86
|
-
break;
|
|
87
|
-
const line = buffer.slice(0, newlineIndex);
|
|
88
|
-
buffer = buffer.slice(newlineIndex + 1);
|
|
89
|
-
if (line.trim()) {
|
|
90
|
-
try {
|
|
91
|
-
const message = JSON.parse(line);
|
|
92
|
-
// Build messages array
|
|
93
|
-
const messages = [];
|
|
94
|
-
if (message.systemMessage) {
|
|
95
|
-
messages.push({
|
|
96
|
-
role: 'system',
|
|
97
|
-
content: message.systemMessage
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
messages.push({
|
|
101
|
-
role: message.role === 'assistant' ? 'assistant' : 'user',
|
|
102
|
-
content: message.content
|
|
103
|
-
});
|
|
104
|
-
// Use Mistral streaming
|
|
105
|
-
const stream = await mistralClient.chat.stream({
|
|
106
|
-
model: chatModel,
|
|
107
|
-
messages: messages,
|
|
108
|
-
});
|
|
109
|
-
// Process streaming events
|
|
110
|
-
for await (const event of stream) {
|
|
111
|
-
const delta = event.data?.choices?.[0]?.delta;
|
|
112
|
-
if (delta?.content) {
|
|
113
|
-
if (typeof delta.content === 'string') {
|
|
114
|
-
controller.enqueue(delta.content);
|
|
115
|
-
}
|
|
116
|
-
else if (Array.isArray(delta.content)) {
|
|
117
|
-
for (const chunk of delta.content) {
|
|
118
|
-
if (typeof chunk === 'string') {
|
|
119
|
-
controller.enqueue(chunk);
|
|
120
|
-
}
|
|
121
|
-
else if (chunk && typeof chunk === 'object' && 'text' in chunk) {
|
|
122
|
-
controller.enqueue(chunk.text);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
catch (e) {
|
|
130
|
-
console.error('Failed to parse message:', e);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
},
|
|
135
|
-
flush(controller) {
|
|
136
|
-
if (buffer.trim()) {
|
|
137
|
-
try {
|
|
138
|
-
const message = JSON.parse(buffer);
|
|
139
|
-
controller.enqueue(message.content || '');
|
|
140
|
-
}
|
|
141
|
-
catch (e) {
|
|
142
|
-
console.error('Failed to parse remaining buffer:', e);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
return input.pipeThrough(transform);
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Audio generation is not supported by Mistral
|
|
151
|
-
*/
|
|
152
|
-
async audio(optionsArg) {
|
|
153
|
-
throw new Error('Audio generation is not supported by Mistral. Please use ElevenLabs or OpenAI provider for audio generation.');
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Vision using Mistral's OCR API for image analysis
|
|
157
|
-
*/
|
|
158
|
-
async vision(optionsArg) {
|
|
159
|
-
const base64Image = optionsArg.image.toString('base64');
|
|
160
|
-
// Detect image type from buffer header
|
|
161
|
-
let mimeType = 'image/jpeg';
|
|
162
|
-
if (optionsArg.image[0] === 0x89 && optionsArg.image[1] === 0x50) {
|
|
163
|
-
mimeType = 'image/png';
|
|
164
|
-
}
|
|
165
|
-
else if (optionsArg.image[0] === 0x47 && optionsArg.image[1] === 0x49) {
|
|
166
|
-
mimeType = 'image/gif';
|
|
167
|
-
}
|
|
168
|
-
else if (optionsArg.image[0] === 0x52 && optionsArg.image[1] === 0x49) {
|
|
169
|
-
mimeType = 'image/webp';
|
|
170
|
-
}
|
|
171
|
-
// Use OCR API with image data URL
|
|
172
|
-
const ocrResult = await this.mistralClient.ocr.process({
|
|
173
|
-
model: this.options.ocrModel || 'mistral-ocr-latest',
|
|
174
|
-
document: {
|
|
175
|
-
imageUrl: `data:${mimeType};base64,${base64Image}`,
|
|
176
|
-
type: 'image_url',
|
|
177
|
-
},
|
|
178
|
-
});
|
|
179
|
-
// Combine markdown from all pages
|
|
180
|
-
const extractedText = ocrResult.pages.map(page => page.markdown).join('\n\n');
|
|
181
|
-
// If a prompt is provided, use chat to analyze the extracted text
|
|
182
|
-
if (optionsArg.prompt && optionsArg.prompt.trim()) {
|
|
183
|
-
const chatResponse = await this.chat({
|
|
184
|
-
systemMessage: 'You are an assistant analyzing image content. The following is text extracted from an image using OCR.',
|
|
185
|
-
userMessage: `${optionsArg.prompt}\n\nExtracted content:\n${extractedText}`,
|
|
186
|
-
messageHistory: [],
|
|
187
|
-
});
|
|
188
|
-
return chatResponse.message;
|
|
189
|
-
}
|
|
190
|
-
return extractedText;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Document processing using Mistral's OCR API
|
|
194
|
-
* PDFs are uploaded via Files API first, then processed with OCR
|
|
195
|
-
*/
|
|
196
|
-
async document(optionsArg) {
|
|
197
|
-
const extractedTexts = [];
|
|
198
|
-
const uploadedFileIds = [];
|
|
199
|
-
try {
|
|
200
|
-
// Process each PDF document using Mistral OCR
|
|
201
|
-
for (let i = 0; i < optionsArg.pdfDocuments.length; i++) {
|
|
202
|
-
const pdfDocument = optionsArg.pdfDocuments[i];
|
|
203
|
-
// Upload the PDF to Mistral's Files API first
|
|
204
|
-
const uploadResult = await this.mistralClient.files.upload({
|
|
205
|
-
file: {
|
|
206
|
-
fileName: `document_${i + 1}.pdf`,
|
|
207
|
-
content: pdfDocument,
|
|
208
|
-
},
|
|
209
|
-
purpose: 'ocr',
|
|
210
|
-
});
|
|
211
|
-
uploadedFileIds.push(uploadResult.id);
|
|
212
|
-
// Now use OCR with the uploaded file
|
|
213
|
-
const ocrResult = await this.mistralClient.ocr.process({
|
|
214
|
-
model: this.options.ocrModel || 'mistral-ocr-latest',
|
|
215
|
-
document: {
|
|
216
|
-
type: 'file',
|
|
217
|
-
fileId: uploadResult.id,
|
|
218
|
-
},
|
|
219
|
-
tableFormat: this.options.tableFormat || 'markdown',
|
|
220
|
-
});
|
|
221
|
-
// Combine all page markdown with page separators
|
|
222
|
-
const pageTexts = ocrResult.pages.map((page, index) => {
|
|
223
|
-
let pageContent = `--- Page ${index + 1} ---\n${page.markdown}`;
|
|
224
|
-
// Include tables if present
|
|
225
|
-
if (page.tables && page.tables.length > 0) {
|
|
226
|
-
pageContent += '\n\n**Tables:**\n' + page.tables.map((t) => t.markdown || t.html || '').join('\n');
|
|
227
|
-
}
|
|
228
|
-
// Include header/footer if present
|
|
229
|
-
if (page.header) {
|
|
230
|
-
pageContent = `Header: ${page.header}\n${pageContent}`;
|
|
231
|
-
}
|
|
232
|
-
if (page.footer) {
|
|
233
|
-
pageContent += `\nFooter: ${page.footer}`;
|
|
234
|
-
}
|
|
235
|
-
return pageContent;
|
|
236
|
-
}).join('\n\n');
|
|
237
|
-
extractedTexts.push(pageTexts);
|
|
238
|
-
}
|
|
239
|
-
// Combine all document texts
|
|
240
|
-
const allDocumentText = extractedTexts.length === 1
|
|
241
|
-
? extractedTexts[0]
|
|
242
|
-
: extractedTexts.map((text, i) => `=== Document ${i + 1} ===\n${text}`).join('\n\n');
|
|
243
|
-
// Use chat API to process the extracted text with the user's query
|
|
244
|
-
const chatResponse = await this.chat({
|
|
245
|
-
systemMessage: optionsArg.systemMessage || 'You are a helpful assistant analyzing document content.',
|
|
246
|
-
userMessage: `${optionsArg.userMessage}\n\n---\nDocument Content:\n${allDocumentText}`,
|
|
247
|
-
messageHistory: optionsArg.messageHistory,
|
|
248
|
-
});
|
|
249
|
-
return {
|
|
250
|
-
message: {
|
|
251
|
-
role: 'assistant',
|
|
252
|
-
content: chatResponse.message
|
|
253
|
-
}
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
finally {
|
|
257
|
-
// Clean up uploaded files
|
|
258
|
-
for (const fileId of uploadedFileIds) {
|
|
259
|
-
try {
|
|
260
|
-
await this.mistralClient.files.delete({ fileId });
|
|
261
|
-
}
|
|
262
|
-
catch (cleanupError) {
|
|
263
|
-
// Ignore cleanup errors - files may have already been auto-deleted
|
|
264
|
-
console.warn(`Failed to delete temporary file ${fileId}:`, cleanupError);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Research is not natively supported by Mistral
|
|
271
|
-
*/
|
|
272
|
-
async research(optionsArg) {
|
|
273
|
-
throw new Error('Research/web search is not supported by Mistral. Please use Perplexity or Anthropic provider for research capabilities.');
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* Image generation is not supported by Mistral
|
|
277
|
-
*/
|
|
278
|
-
async imageGenerate(optionsArg) {
|
|
279
|
-
throw new Error('Image generation is not supported by Mistral. Please use OpenAI provider for image generation.');
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Image editing is not supported by Mistral
|
|
283
|
-
*/
|
|
284
|
-
async imageEdit(optionsArg) {
|
|
285
|
-
throw new Error('Image editing is not supported by Mistral. Please use OpenAI provider for image editing.');
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIubWlzdHJhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Byb3ZpZGVyLm1pc3RyYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBbUJuRSxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxlQUFlO0lBSWxELFlBQVksVUFBbUM7UUFDN0MsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDakQsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWTtTQUNsQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQXVCO1FBQ3ZDLDRDQUE0QztRQUM1QyxNQUFNLFFBQVEsR0FHVCxFQUFFLENBQUM7UUFFUiwyQkFBMkI7UUFDM0IsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDWixJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWE7YUFDbEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixLQUFLLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1QyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNaLElB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
|