@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,215 +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 PerplexityProvider extends MultiModalModel {
|
|
5
|
-
constructor(optionsArg) {
|
|
6
|
-
super();
|
|
7
|
-
this.options = optionsArg;
|
|
8
|
-
}
|
|
9
|
-
async start() {
|
|
10
|
-
// Initialize any necessary clients or resources
|
|
11
|
-
}
|
|
12
|
-
async stop() { }
|
|
13
|
-
async chatStream(input) {
|
|
14
|
-
// Create a TextDecoder to handle incoming chunks
|
|
15
|
-
const decoder = new TextDecoder();
|
|
16
|
-
let buffer = '';
|
|
17
|
-
let currentMessage = null;
|
|
18
|
-
// Create a TransformStream to process the input
|
|
19
|
-
const transform = new TransformStream({
|
|
20
|
-
async transform(chunk, controller) {
|
|
21
|
-
buffer += decoder.decode(chunk, { stream: true });
|
|
22
|
-
// Try to parse complete JSON messages from the buffer
|
|
23
|
-
while (true) {
|
|
24
|
-
const newlineIndex = buffer.indexOf('\n');
|
|
25
|
-
if (newlineIndex === -1)
|
|
26
|
-
break;
|
|
27
|
-
const line = buffer.slice(0, newlineIndex);
|
|
28
|
-
buffer = buffer.slice(newlineIndex + 1);
|
|
29
|
-
if (line.trim()) {
|
|
30
|
-
try {
|
|
31
|
-
const message = JSON.parse(line);
|
|
32
|
-
currentMessage = {
|
|
33
|
-
role: message.role || 'user',
|
|
34
|
-
content: message.content || '',
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
catch (e) {
|
|
38
|
-
console.error('Failed to parse message:', e);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// If we have a complete message, send it to Perplexity
|
|
43
|
-
if (currentMessage) {
|
|
44
|
-
const response = await fetch('https://api.perplexity.ai/chat/completions', {
|
|
45
|
-
method: 'POST',
|
|
46
|
-
headers: {
|
|
47
|
-
'Authorization': `Bearer ${this.options.perplexityToken}`,
|
|
48
|
-
'Content-Type': 'application/json',
|
|
49
|
-
},
|
|
50
|
-
body: JSON.stringify({
|
|
51
|
-
model: 'mixtral-8x7b-instruct',
|
|
52
|
-
messages: [{ role: currentMessage.role, content: currentMessage.content }],
|
|
53
|
-
stream: true,
|
|
54
|
-
}),
|
|
55
|
-
});
|
|
56
|
-
// Process each chunk from Perplexity
|
|
57
|
-
const reader = response.body?.getReader();
|
|
58
|
-
if (reader) {
|
|
59
|
-
try {
|
|
60
|
-
while (true) {
|
|
61
|
-
const { done, value } = await reader.read();
|
|
62
|
-
if (done)
|
|
63
|
-
break;
|
|
64
|
-
const chunk = new TextDecoder().decode(value);
|
|
65
|
-
const lines = chunk.split('\n');
|
|
66
|
-
for (const line of lines) {
|
|
67
|
-
if (line.startsWith('data: ')) {
|
|
68
|
-
const data = line.slice(6);
|
|
69
|
-
if (data === '[DONE]')
|
|
70
|
-
break;
|
|
71
|
-
try {
|
|
72
|
-
const parsed = JSON.parse(data);
|
|
73
|
-
const content = parsed.choices[0]?.delta?.content;
|
|
74
|
-
if (content) {
|
|
75
|
-
controller.enqueue(content);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
catch (e) {
|
|
79
|
-
console.error('Failed to parse SSE data:', e);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
finally {
|
|
86
|
-
reader.releaseLock();
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
currentMessage = null;
|
|
90
|
-
}
|
|
91
|
-
},
|
|
92
|
-
flush(controller) {
|
|
93
|
-
if (buffer) {
|
|
94
|
-
try {
|
|
95
|
-
const message = JSON.parse(buffer);
|
|
96
|
-
controller.enqueue(message.content || '');
|
|
97
|
-
}
|
|
98
|
-
catch (e) {
|
|
99
|
-
console.error('Failed to parse remaining buffer:', e);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
// Connect the input to our transform stream
|
|
105
|
-
return input.pipeThrough(transform);
|
|
106
|
-
}
|
|
107
|
-
// Implementing the synchronous chat interaction
|
|
108
|
-
async chat(optionsArg) {
|
|
109
|
-
// Make API call to Perplexity
|
|
110
|
-
const response = await fetch('https://api.perplexity.ai/chat/completions', {
|
|
111
|
-
method: 'POST',
|
|
112
|
-
headers: {
|
|
113
|
-
'Authorization': `Bearer ${this.options.perplexityToken}`,
|
|
114
|
-
'Content-Type': 'application/json',
|
|
115
|
-
},
|
|
116
|
-
body: JSON.stringify({
|
|
117
|
-
model: 'mixtral-8x7b-instruct', // Using Mixtral model
|
|
118
|
-
messages: [
|
|
119
|
-
{ role: 'system', content: optionsArg.systemMessage },
|
|
120
|
-
...optionsArg.messageHistory,
|
|
121
|
-
{ role: 'user', content: optionsArg.userMessage }
|
|
122
|
-
],
|
|
123
|
-
}),
|
|
124
|
-
});
|
|
125
|
-
if (!response.ok) {
|
|
126
|
-
throw new Error(`Perplexity API error: ${response.statusText}`);
|
|
127
|
-
}
|
|
128
|
-
const result = await response.json();
|
|
129
|
-
return {
|
|
130
|
-
role: 'assistant',
|
|
131
|
-
message: result.choices[0].message.content,
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
async audio(optionsArg) {
|
|
135
|
-
throw new Error('Audio generation is not supported by Perplexity.');
|
|
136
|
-
}
|
|
137
|
-
async vision(optionsArg) {
|
|
138
|
-
throw new Error('Vision tasks are not supported by Perplexity.');
|
|
139
|
-
}
|
|
140
|
-
async document(optionsArg) {
|
|
141
|
-
throw new Error('Document processing is not supported by Perplexity.');
|
|
142
|
-
}
|
|
143
|
-
async research(optionsArg) {
|
|
144
|
-
// Perplexity has Sonar models that are optimized for search
|
|
145
|
-
// sonar models: sonar, sonar-pro
|
|
146
|
-
const model = optionsArg.searchDepth === 'deep' ? 'sonar-pro' : 'sonar';
|
|
147
|
-
try {
|
|
148
|
-
const response = await fetch('https://api.perplexity.ai/chat/completions', {
|
|
149
|
-
method: 'POST',
|
|
150
|
-
headers: {
|
|
151
|
-
'Authorization': `Bearer ${this.options.perplexityToken}`,
|
|
152
|
-
'Content-Type': 'application/json',
|
|
153
|
-
},
|
|
154
|
-
body: JSON.stringify({
|
|
155
|
-
model,
|
|
156
|
-
messages: [
|
|
157
|
-
{
|
|
158
|
-
role: 'system',
|
|
159
|
-
content: 'You are a helpful research assistant. Provide accurate information with sources.'
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
role: 'user',
|
|
163
|
-
content: optionsArg.query
|
|
164
|
-
}
|
|
165
|
-
],
|
|
166
|
-
temperature: 0.7,
|
|
167
|
-
max_tokens: 4000
|
|
168
|
-
}),
|
|
169
|
-
});
|
|
170
|
-
if (!response.ok) {
|
|
171
|
-
throw new Error(`Perplexity API error: ${response.statusText}`);
|
|
172
|
-
}
|
|
173
|
-
const result = await response.json();
|
|
174
|
-
const answer = result.choices[0].message.content;
|
|
175
|
-
// Parse citations from the response
|
|
176
|
-
const sources = [];
|
|
177
|
-
// Perplexity includes citations in the format [1], [2], etc. with sources listed
|
|
178
|
-
// This is a simplified parser - could be enhanced based on actual Perplexity response format
|
|
179
|
-
if (result.citations) {
|
|
180
|
-
for (const citation of result.citations) {
|
|
181
|
-
sources.push({
|
|
182
|
-
url: citation.url || '',
|
|
183
|
-
title: citation.title || '',
|
|
184
|
-
snippet: citation.snippet || ''
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
return {
|
|
189
|
-
answer,
|
|
190
|
-
sources,
|
|
191
|
-
metadata: {
|
|
192
|
-
model,
|
|
193
|
-
searchDepth: optionsArg.searchDepth || 'basic'
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
console.error('Perplexity research error:', error);
|
|
199
|
-
throw new Error(`Failed to perform research: ${error.message}`);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Image generation is not supported by Perplexity
|
|
204
|
-
*/
|
|
205
|
-
async imageGenerate(optionsArg) {
|
|
206
|
-
throw new Error('Image generation is not supported by Perplexity. Please use OpenAI provider for image generation.');
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Image editing is not supported by Perplexity
|
|
210
|
-
*/
|
|
211
|
-
async imageEdit(optionsArg) {
|
|
212
|
-
throw new Error('Image editing is not supported by Perplexity. Please use OpenAI provider for image editing.');
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIucGVycGxleGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Byb3ZpZGVyLnBlcnBsZXhpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBZ0JuRSxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsZUFBZTtJQUdyRCxZQUFZLFVBQXNDO1FBQ2hELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7SUFDNUIsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsZ0RBQWdEO0lBQ2xELENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxLQUFJLENBQUM7SUFFUixLQUFLLENBQUMsVUFBVSxDQUFDLEtBQWlDO1FBQ3ZELGlEQUFpRDtRQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLGNBQWMsR0FBOEMsSUFBSSxDQUFDO1FBRXJFLGdEQUFnRDtRQUNoRCxNQUFNLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBcUI7WUFDeEQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVTtnQkFDL0IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBRWxELHNEQUFzRDtnQkFDdEQsT0FBTyxJQUFJLEVBQUUsQ0FBQztvQkFDWixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMxQyxJQUFJLFlBQVksS0FBSyxDQUFDLENBQUM7d0JBQUUsTUFBTTtvQkFFL0Is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
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import * as plugins from './plugins.js';
|
|
2
|
-
import { MultiModalModel } from './abstract.classes.multimodal.js';
|
|
3
|
-
import type { ResearchOptions, ResearchResponse, ImageGenerateOptions, ImageEditOptions, ImageResponse } from './abstract.classes.multimodal.js';
|
|
4
|
-
export interface IXAIProviderOptions {
|
|
5
|
-
xaiToken: string;
|
|
6
|
-
}
|
|
7
|
-
export declare class XAIProvider extends MultiModalModel {
|
|
8
|
-
private options;
|
|
9
|
-
openAiApiClient: plugins.openai.default;
|
|
10
|
-
constructor(optionsArg: IXAIProviderOptions);
|
|
11
|
-
start(): Promise<void>;
|
|
12
|
-
stop(): Promise<void>;
|
|
13
|
-
chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>>;
|
|
14
|
-
chat(optionsArg: {
|
|
15
|
-
systemMessage: string;
|
|
16
|
-
userMessage: string;
|
|
17
|
-
messageHistory: {
|
|
18
|
-
role: string;
|
|
19
|
-
content: string;
|
|
20
|
-
}[];
|
|
21
|
-
}): Promise<{
|
|
22
|
-
role: 'assistant';
|
|
23
|
-
message: string;
|
|
24
|
-
}>;
|
|
25
|
-
audio(optionsArg: {
|
|
26
|
-
message: string;
|
|
27
|
-
}): Promise<NodeJS.ReadableStream>;
|
|
28
|
-
vision(optionsArg: {
|
|
29
|
-
image: Buffer;
|
|
30
|
-
prompt: string;
|
|
31
|
-
}): Promise<string>;
|
|
32
|
-
document(optionsArg: {
|
|
33
|
-
systemMessage: string;
|
|
34
|
-
userMessage: string;
|
|
35
|
-
pdfDocuments: Uint8Array[];
|
|
36
|
-
messageHistory: {
|
|
37
|
-
role: string;
|
|
38
|
-
content: string;
|
|
39
|
-
}[];
|
|
40
|
-
}): Promise<{
|
|
41
|
-
message: any;
|
|
42
|
-
}>;
|
|
43
|
-
research(optionsArg: ResearchOptions): Promise<ResearchResponse>;
|
|
44
|
-
/**
|
|
45
|
-
* Image generation is not supported by xAI
|
|
46
|
-
*/
|
|
47
|
-
imageGenerate(optionsArg: ImageGenerateOptions): Promise<ImageResponse>;
|
|
48
|
-
/**
|
|
49
|
-
* Image editing is not supported by xAI
|
|
50
|
-
*/
|
|
51
|
-
imageEdit(optionsArg: ImageEditOptions): Promise<ImageResponse>;
|
|
52
|
-
}
|
package/dist_ts/provider.xai.js
DELETED
|
@@ -1,160 +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 XAIProvider extends MultiModalModel {
|
|
5
|
-
constructor(optionsArg) {
|
|
6
|
-
super();
|
|
7
|
-
this.options = optionsArg;
|
|
8
|
-
}
|
|
9
|
-
async start() {
|
|
10
|
-
await super.start();
|
|
11
|
-
this.openAiApiClient = new plugins.openai.default({
|
|
12
|
-
apiKey: this.options.xaiToken,
|
|
13
|
-
baseURL: 'https://api.x.ai/v1',
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
async stop() {
|
|
17
|
-
await super.stop();
|
|
18
|
-
}
|
|
19
|
-
async chatStream(input) {
|
|
20
|
-
// Create a TextDecoder to handle incoming chunks
|
|
21
|
-
const decoder = new TextDecoder();
|
|
22
|
-
let buffer = '';
|
|
23
|
-
let currentMessage = null;
|
|
24
|
-
// Create a TransformStream to process the input
|
|
25
|
-
const transform = new TransformStream({
|
|
26
|
-
async transform(chunk, controller) {
|
|
27
|
-
buffer += decoder.decode(chunk, { stream: true });
|
|
28
|
-
// Try to parse complete JSON messages from the buffer
|
|
29
|
-
while (true) {
|
|
30
|
-
const newlineIndex = buffer.indexOf('\n');
|
|
31
|
-
if (newlineIndex === -1)
|
|
32
|
-
break;
|
|
33
|
-
const line = buffer.slice(0, newlineIndex);
|
|
34
|
-
buffer = buffer.slice(newlineIndex + 1);
|
|
35
|
-
if (line.trim()) {
|
|
36
|
-
try {
|
|
37
|
-
const message = JSON.parse(line);
|
|
38
|
-
currentMessage = {
|
|
39
|
-
role: message.role || 'user',
|
|
40
|
-
content: message.content || '',
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
catch (e) {
|
|
44
|
-
console.error('Failed to parse message:', e);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
// If we have a complete message, send it to X.AI
|
|
49
|
-
if (currentMessage) {
|
|
50
|
-
const stream = await this.openAiApiClient.chat.completions.create({
|
|
51
|
-
model: 'grok-2-latest',
|
|
52
|
-
messages: [{ role: currentMessage.role, content: currentMessage.content }],
|
|
53
|
-
stream: true,
|
|
54
|
-
});
|
|
55
|
-
// Process each chunk from X.AI
|
|
56
|
-
for await (const chunk of stream) {
|
|
57
|
-
const content = chunk.choices[0]?.delta?.content;
|
|
58
|
-
if (content) {
|
|
59
|
-
controller.enqueue(content);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
currentMessage = null;
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
flush(controller) {
|
|
66
|
-
if (buffer) {
|
|
67
|
-
try {
|
|
68
|
-
const message = JSON.parse(buffer);
|
|
69
|
-
controller.enqueue(message.content || '');
|
|
70
|
-
}
|
|
71
|
-
catch (e) {
|
|
72
|
-
console.error('Failed to parse remaining buffer:', e);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
// Connect the input to our transform stream
|
|
78
|
-
return input.pipeThrough(transform);
|
|
79
|
-
}
|
|
80
|
-
async chat(optionsArg) {
|
|
81
|
-
// Prepare messages array with system message, history, and user message
|
|
82
|
-
const messages = [
|
|
83
|
-
{ role: 'system', content: optionsArg.systemMessage },
|
|
84
|
-
...optionsArg.messageHistory.map(msg => ({
|
|
85
|
-
role: msg.role,
|
|
86
|
-
content: msg.content
|
|
87
|
-
})),
|
|
88
|
-
{ role: 'user', content: optionsArg.userMessage }
|
|
89
|
-
];
|
|
90
|
-
// Call X.AI's chat completion API
|
|
91
|
-
const completion = await this.openAiApiClient.chat.completions.create({
|
|
92
|
-
model: 'grok-2-latest',
|
|
93
|
-
messages: messages,
|
|
94
|
-
stream: false,
|
|
95
|
-
});
|
|
96
|
-
// Return the assistant's response
|
|
97
|
-
return {
|
|
98
|
-
role: 'assistant',
|
|
99
|
-
message: completion.choices[0]?.message?.content || ''
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
async audio(optionsArg) {
|
|
103
|
-
throw new Error('Audio generation is not supported by X.AI');
|
|
104
|
-
}
|
|
105
|
-
async vision(optionsArg) {
|
|
106
|
-
throw new Error('Vision tasks are not supported by X.AI');
|
|
107
|
-
}
|
|
108
|
-
async document(optionsArg) {
|
|
109
|
-
// Ensure SmartPdf is initialized before processing documents
|
|
110
|
-
await this.ensureSmartpdfReady();
|
|
111
|
-
// First convert PDF documents to images
|
|
112
|
-
let pdfDocumentImageBytesArray = [];
|
|
113
|
-
for (const pdfDocument of optionsArg.pdfDocuments) {
|
|
114
|
-
const documentImageArray = await this.smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
115
|
-
pdfDocumentImageBytesArray = pdfDocumentImageBytesArray.concat(documentImageArray);
|
|
116
|
-
}
|
|
117
|
-
// Convert images to base64 for inclusion in the message
|
|
118
|
-
const imageBase64Array = pdfDocumentImageBytesArray.map(bytes => Buffer.from(bytes).toString('base64'));
|
|
119
|
-
// Combine document images into the user message
|
|
120
|
-
const enhancedUserMessage = `
|
|
121
|
-
${optionsArg.userMessage}
|
|
122
|
-
|
|
123
|
-
Document contents (as images):
|
|
124
|
-
${imageBase64Array.map((img, i) => `Image ${i + 1}: <image data>`).join('\n')}
|
|
125
|
-
`;
|
|
126
|
-
// Use chat completion to analyze the documents
|
|
127
|
-
const messages = [
|
|
128
|
-
{ role: 'system', content: optionsArg.systemMessage },
|
|
129
|
-
...optionsArg.messageHistory.map(msg => ({
|
|
130
|
-
role: msg.role,
|
|
131
|
-
content: msg.content
|
|
132
|
-
})),
|
|
133
|
-
{ role: 'user', content: enhancedUserMessage }
|
|
134
|
-
];
|
|
135
|
-
const completion = await this.openAiApiClient.chat.completions.create({
|
|
136
|
-
model: 'grok-2-latest',
|
|
137
|
-
messages: messages,
|
|
138
|
-
stream: false,
|
|
139
|
-
});
|
|
140
|
-
return {
|
|
141
|
-
message: completion.choices[0]?.message?.content || ''
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
async research(optionsArg) {
|
|
145
|
-
throw new Error('Research capabilities are not yet supported by xAI provider.');
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Image generation is not supported by xAI
|
|
149
|
-
*/
|
|
150
|
-
async imageGenerate(optionsArg) {
|
|
151
|
-
throw new Error('Image generation is not supported by xAI. Please use OpenAI provider for image generation.');
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Image editing is not supported by xAI
|
|
155
|
-
*/
|
|
156
|
-
async imageEdit(optionsArg) {
|
|
157
|
-
throw new Error('Image editing is not supported by xAI. Please use OpenAI provider for image editing.');
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIueGFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIueGFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQWlCbkUsTUFBTSxPQUFPLFdBQVksU0FBUSxlQUFlO0lBSTlDLFlBQVksVUFBK0I7UUFDekMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUM1QixDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ2hELE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDN0IsT0FBTyxFQUFFLHFCQUFxQjtTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDZixNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFpQztRQUN2RCxpREFBaUQ7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxjQUFjLEdBQThDLElBQUksQ0FBQztRQUVyRSxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQXFCO1lBQ3hELEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVU7Z0JBQy9CLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFB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
|