@push.rocks/smartai 0.3.3 → 0.4.2
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 +1 -1
- package/dist_ts/classes.conversation.d.ts +3 -0
- package/dist_ts/classes.conversation.js +34 -1
- package/dist_ts/classes.smartai.d.ts +20 -3
- package/dist_ts/classes.smartai.js +46 -1
- package/dist_ts/provider.exo.d.ts +31 -0
- package/dist_ts/provider.exo.js +101 -0
- package/dist_ts/provider.groq.js +2 -2
- package/dist_ts/provider.ollama.js +2 -2
- package/dist_ts/provider.openai.d.ts +7 -0
- package/dist_ts/provider.openai.js +46 -35
- package/package.json +15 -15
- package/readme.md +17 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.conversation.ts +36 -0
- package/ts/classes.smartai.ts +60 -3
- package/ts/provider.exo.ts +128 -0
- package/ts/provider.groq.ts +1 -1
- package/ts/provider.ollama.ts +1 -1
- package/ts/provider.openai.ts +60 -46
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartai',
|
|
6
|
-
version: '0.
|
|
6
|
+
version: '0.4.2',
|
|
7
7
|
description: 'A TypeScript library for integrating and interacting with multiple AI models, offering capabilities for chat and potentially audio responses.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLCtJQUErSTtDQUM3SixDQUFBIn0=
|
|
@@ -10,7 +10,10 @@ export declare class Conversation {
|
|
|
10
10
|
static createWithOpenAi(smartaiRefArg: SmartAi): Promise<Conversation>;
|
|
11
11
|
static createWithAnthropic(smartaiRefArg: SmartAi): Promise<Conversation>;
|
|
12
12
|
static createWithPerplexity(smartaiRefArg: SmartAi): Promise<Conversation>;
|
|
13
|
+
static createWithExo(smartaiRefArg: SmartAi): Promise<Conversation>;
|
|
13
14
|
static createWithOllama(smartaiRefArg: SmartAi): Promise<Conversation>;
|
|
15
|
+
static createWithGroq(smartaiRefArg: SmartAi): Promise<Conversation>;
|
|
16
|
+
static createWithXai(smartaiRefArg: SmartAi): Promise<Conversation>;
|
|
14
17
|
smartaiRef: SmartAi;
|
|
15
18
|
private systemMessage;
|
|
16
19
|
private processFunction;
|
|
@@ -37,6 +37,17 @@ export class Conversation {
|
|
|
37
37
|
});
|
|
38
38
|
return conversation;
|
|
39
39
|
}
|
|
40
|
+
static async createWithExo(smartaiRefArg) {
|
|
41
|
+
if (!smartaiRefArg.exoProvider) {
|
|
42
|
+
throw new Error('Exo provider not available');
|
|
43
|
+
}
|
|
44
|
+
const conversation = new Conversation(smartaiRefArg, {
|
|
45
|
+
processFunction: async (input) => {
|
|
46
|
+
return ''; // TODO implement proper streaming
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return conversation;
|
|
50
|
+
}
|
|
40
51
|
static async createWithOllama(smartaiRefArg) {
|
|
41
52
|
if (!smartaiRefArg.ollamaProvider) {
|
|
42
53
|
throw new Error('Ollama provider not available');
|
|
@@ -48,6 +59,28 @@ export class Conversation {
|
|
|
48
59
|
});
|
|
49
60
|
return conversation;
|
|
50
61
|
}
|
|
62
|
+
static async createWithGroq(smartaiRefArg) {
|
|
63
|
+
if (!smartaiRefArg.groqProvider) {
|
|
64
|
+
throw new Error('Groq provider not available');
|
|
65
|
+
}
|
|
66
|
+
const conversation = new Conversation(smartaiRefArg, {
|
|
67
|
+
processFunction: async (input) => {
|
|
68
|
+
return ''; // TODO implement proper streaming
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return conversation;
|
|
72
|
+
}
|
|
73
|
+
static async createWithXai(smartaiRefArg) {
|
|
74
|
+
if (!smartaiRefArg.xaiProvider) {
|
|
75
|
+
throw new Error('XAI provider not available');
|
|
76
|
+
}
|
|
77
|
+
const conversation = new Conversation(smartaiRefArg, {
|
|
78
|
+
processFunction: async (input) => {
|
|
79
|
+
return ''; // TODO implement proper streaming
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return conversation;
|
|
83
|
+
}
|
|
51
84
|
constructor(smartairefArg, options) {
|
|
52
85
|
this.inputStreamWriter = null;
|
|
53
86
|
this.outputStreamController = null;
|
|
@@ -92,4 +125,4 @@ export class Conversation {
|
|
|
92
125
|
return this.setupOutputStream();
|
|
93
126
|
}
|
|
94
127
|
}
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb252ZXJzYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNvbnZlcnNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFRdEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2QixTQUFTO0lBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFzQjtRQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFO1lBQ25ELGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxDQUFBLENBQUMsa0NBQWtDO1lBQzlDLENBQUM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxhQUFzQjtRQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7WUFDbkQsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxFQUFFLENBQUEsQ0FBQyxrQ0FBa0M7WUFDOUMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLGFBQXNCO1FBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLGFBQWEsRUFBRTtZQUNuRCxlQUFlLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMvQixPQUFPLEVBQUUsQ0FBQSxDQUFDLGtDQUFrQztZQUM5QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQXNCO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7WUFDbkQsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxFQUFFLENBQUEsQ0FBQyxrQ0FBa0M7WUFDOUMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGFBQXNCO1FBQ3pELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7WUFDbkQsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxFQUFFLENBQUEsQ0FBQyxrQ0FBa0M7WUFDOUMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxhQUFzQjtRQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFO1lBQ25ELGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxDQUFBLENBQUMsa0NBQWtDO1lBQzlDLENBQUM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBc0I7UUFDdEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLGFBQWEsRUFBRTtZQUNuRCxlQUFlLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMvQixPQUFPLEVBQUUsQ0FBQSxDQUFDLGtDQUFrQztZQUM5QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQVNELFlBQVksYUFBc0IsRUFBRSxPQUE2QjtRQUh6RCxzQkFBaUIsR0FBK0MsSUFBSSxDQUFDO1FBQ3JFLDJCQUFzQixHQUFtRCxJQUFJLENBQUM7UUFHcEYsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO0lBQ2pELENBQUM7SUFFTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsZ0JBQXdCO1FBQ3BELElBQUksQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7SUFDeEMsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixPQUFPLElBQUksY0FBYyxDQUFTO1lBQ2hDLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUNwQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsVUFBVSxDQUFDO1lBQzNDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFTO1lBQ2hELEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3JCLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDckQsQ0FBQztZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVNLG9CQUFvQjtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVNLGVBQWU7UUFDcEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0NBQ0YifQ==
|
|
@@ -1,20 +1,37 @@
|
|
|
1
1
|
import { Conversation } from './classes.conversation.js';
|
|
2
2
|
import { AnthropicProvider } from './provider.anthropic.js';
|
|
3
|
-
import
|
|
3
|
+
import { OllamaProvider } from './provider.ollama.js';
|
|
4
4
|
import { OpenAiProvider } from './provider.openai.js';
|
|
5
|
-
import
|
|
5
|
+
import { PerplexityProvider } from './provider.perplexity.js';
|
|
6
|
+
import { ExoProvider } from './provider.exo.js';
|
|
7
|
+
import { GroqProvider } from './provider.groq.js';
|
|
8
|
+
import { XAIProvider } from './provider.xai.js';
|
|
6
9
|
export interface ISmartAiOptions {
|
|
7
10
|
openaiToken?: string;
|
|
8
11
|
anthropicToken?: string;
|
|
9
12
|
perplexityToken?: string;
|
|
13
|
+
groqToken?: string;
|
|
14
|
+
xaiToken?: string;
|
|
15
|
+
exo?: {
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
};
|
|
19
|
+
ollama?: {
|
|
20
|
+
baseUrl?: string;
|
|
21
|
+
model?: string;
|
|
22
|
+
visionModel?: string;
|
|
23
|
+
};
|
|
10
24
|
}
|
|
11
|
-
export type TProvider = 'openai' | 'anthropic' | 'perplexity' | 'ollama';
|
|
25
|
+
export type TProvider = 'openai' | 'anthropic' | 'perplexity' | 'ollama' | 'exo' | 'groq' | 'xai';
|
|
12
26
|
export declare class SmartAi {
|
|
13
27
|
options: ISmartAiOptions;
|
|
14
28
|
openaiProvider: OpenAiProvider;
|
|
15
29
|
anthropicProvider: AnthropicProvider;
|
|
16
30
|
perplexityProvider: PerplexityProvider;
|
|
17
31
|
ollamaProvider: OllamaProvider;
|
|
32
|
+
exoProvider: ExoProvider;
|
|
33
|
+
groqProvider: GroqProvider;
|
|
34
|
+
xaiProvider: XAIProvider;
|
|
18
35
|
constructor(optionsArg: ISmartAiOptions);
|
|
19
36
|
start(): Promise<void>;
|
|
20
37
|
stop(): Promise<void>;
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { Conversation } from './classes.conversation.js';
|
|
2
2
|
import * as plugins from './plugins.js';
|
|
3
3
|
import { AnthropicProvider } from './provider.anthropic.js';
|
|
4
|
+
import { OllamaProvider } from './provider.ollama.js';
|
|
4
5
|
import { OpenAiProvider } from './provider.openai.js';
|
|
6
|
+
import { PerplexityProvider } from './provider.perplexity.js';
|
|
7
|
+
import { ExoProvider } from './provider.exo.js';
|
|
8
|
+
import { GroqProvider } from './provider.groq.js';
|
|
9
|
+
import { XAIProvider } from './provider.xai.js';
|
|
5
10
|
export class SmartAi {
|
|
6
11
|
constructor(optionsArg) {
|
|
7
12
|
this.options = optionsArg;
|
|
@@ -17,6 +22,40 @@ export class SmartAi {
|
|
|
17
22
|
this.anthropicProvider = new AnthropicProvider({
|
|
18
23
|
anthropicToken: this.options.anthropicToken,
|
|
19
24
|
});
|
|
25
|
+
await this.anthropicProvider.start();
|
|
26
|
+
}
|
|
27
|
+
if (this.options.perplexityToken) {
|
|
28
|
+
this.perplexityProvider = new PerplexityProvider({
|
|
29
|
+
perplexityToken: this.options.perplexityToken,
|
|
30
|
+
});
|
|
31
|
+
await this.perplexityProvider.start();
|
|
32
|
+
}
|
|
33
|
+
if (this.options.groqToken) {
|
|
34
|
+
this.groqProvider = new GroqProvider({
|
|
35
|
+
groqToken: this.options.groqToken,
|
|
36
|
+
});
|
|
37
|
+
await this.groqProvider.start();
|
|
38
|
+
}
|
|
39
|
+
if (this.options.xaiToken) {
|
|
40
|
+
this.xaiProvider = new XAIProvider({
|
|
41
|
+
xaiToken: this.options.xaiToken,
|
|
42
|
+
});
|
|
43
|
+
await this.xaiProvider.start();
|
|
44
|
+
}
|
|
45
|
+
if (this.options.ollama) {
|
|
46
|
+
this.ollamaProvider = new OllamaProvider({
|
|
47
|
+
baseUrl: this.options.ollama.baseUrl,
|
|
48
|
+
model: this.options.ollama.model,
|
|
49
|
+
visionModel: this.options.ollama.visionModel,
|
|
50
|
+
});
|
|
51
|
+
await this.ollamaProvider.start();
|
|
52
|
+
}
|
|
53
|
+
if (this.options.exo) {
|
|
54
|
+
this.exoProvider = new ExoProvider({
|
|
55
|
+
exoBaseUrl: this.options.exo.baseUrl,
|
|
56
|
+
apiKey: this.options.exo.apiKey,
|
|
57
|
+
});
|
|
58
|
+
await this.exoProvider.start();
|
|
20
59
|
}
|
|
21
60
|
}
|
|
22
61
|
async stop() { }
|
|
@@ -25,6 +64,8 @@ export class SmartAi {
|
|
|
25
64
|
*/
|
|
26
65
|
createConversation(provider) {
|
|
27
66
|
switch (provider) {
|
|
67
|
+
case 'exo':
|
|
68
|
+
return Conversation.createWithExo(this);
|
|
28
69
|
case 'openai':
|
|
29
70
|
return Conversation.createWithOpenAi(this);
|
|
30
71
|
case 'anthropic':
|
|
@@ -33,9 +74,13 @@ export class SmartAi {
|
|
|
33
74
|
return Conversation.createWithPerplexity(this);
|
|
34
75
|
case 'ollama':
|
|
35
76
|
return Conversation.createWithOllama(this);
|
|
77
|
+
case 'groq':
|
|
78
|
+
return Conversation.createWithGroq(this);
|
|
79
|
+
case 'xai':
|
|
80
|
+
return Conversation.createWithXai(this);
|
|
36
81
|
default:
|
|
37
82
|
throw new Error('Provider not available');
|
|
38
83
|
}
|
|
39
84
|
}
|
|
40
85
|
}
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zbWFydGFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBc0JoRCxNQUFNLE9BQU8sT0FBTztJQVdsQixZQUFZLFVBQTJCO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0lBQzVCLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQztnQkFDdkMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVzthQUN0QyxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQztn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
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { MultiModalModel } from './abstract.classes.multimodal.js';
|
|
3
|
+
import type { ChatOptions, ChatResponse, ChatMessage } from './abstract.classes.multimodal.js';
|
|
4
|
+
export interface IExoProviderOptions {
|
|
5
|
+
exoBaseUrl?: string;
|
|
6
|
+
apiKey?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class ExoProvider extends MultiModalModel {
|
|
9
|
+
private options;
|
|
10
|
+
openAiApiClient: plugins.openai.default;
|
|
11
|
+
constructor(optionsArg?: IExoProviderOptions);
|
|
12
|
+
start(): Promise<void>;
|
|
13
|
+
stop(): Promise<void>;
|
|
14
|
+
chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>>;
|
|
15
|
+
chat(options: ChatOptions): Promise<ChatResponse>;
|
|
16
|
+
audio(optionsArg: {
|
|
17
|
+
message: string;
|
|
18
|
+
}): Promise<NodeJS.ReadableStream>;
|
|
19
|
+
vision(optionsArg: {
|
|
20
|
+
image: Buffer;
|
|
21
|
+
prompt: string;
|
|
22
|
+
}): Promise<string>;
|
|
23
|
+
document(optionsArg: {
|
|
24
|
+
systemMessage: string;
|
|
25
|
+
userMessage: string;
|
|
26
|
+
pdfDocuments: Uint8Array[];
|
|
27
|
+
messageHistory: ChatMessage[];
|
|
28
|
+
}): Promise<{
|
|
29
|
+
message: any;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
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 ExoProvider extends MultiModalModel {
|
|
5
|
+
constructor(optionsArg = {}) {
|
|
6
|
+
super();
|
|
7
|
+
this.options = {
|
|
8
|
+
exoBaseUrl: 'http://localhost:8080/v1', // Default Exo API endpoint
|
|
9
|
+
...optionsArg
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
async start() {
|
|
13
|
+
this.openAiApiClient = new plugins.openai.default({
|
|
14
|
+
apiKey: this.options.apiKey || 'not-needed', // Exo might not require an API key for local deployment
|
|
15
|
+
baseURL: this.options.exoBaseUrl,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async stop() { }
|
|
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
|
+
transform: async (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 = message;
|
|
39
|
+
// Process the message based on its type
|
|
40
|
+
if (message.type === 'message') {
|
|
41
|
+
const response = await this.chat({
|
|
42
|
+
systemMessage: '',
|
|
43
|
+
userMessage: message.content,
|
|
44
|
+
messageHistory: [{ role: message.role, content: message.content }]
|
|
45
|
+
});
|
|
46
|
+
controller.enqueue(JSON.stringify(response) + '\n');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('Error processing message:', error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
flush(controller) {
|
|
56
|
+
if (buffer) {
|
|
57
|
+
try {
|
|
58
|
+
const message = JSON.parse(buffer);
|
|
59
|
+
currentMessage = message;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error('Error processing remaining buffer:', error);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return input.pipeThrough(transform);
|
|
68
|
+
}
|
|
69
|
+
async chat(options) {
|
|
70
|
+
const messages = [
|
|
71
|
+
{ role: 'system', content: options.systemMessage },
|
|
72
|
+
...options.messageHistory,
|
|
73
|
+
{ role: 'user', content: options.userMessage }
|
|
74
|
+
];
|
|
75
|
+
try {
|
|
76
|
+
const response = await this.openAiApiClient.chat.completions.create({
|
|
77
|
+
model: 'local-model', // Exo uses local models
|
|
78
|
+
messages: messages,
|
|
79
|
+
stream: false
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
role: 'assistant',
|
|
83
|
+
message: response.choices[0]?.message?.content || ''
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error('Error in chat completion:', error);
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async audio(optionsArg) {
|
|
92
|
+
throw new Error('Audio generation is not supported by Exo provider');
|
|
93
|
+
}
|
|
94
|
+
async vision(optionsArg) {
|
|
95
|
+
throw new Error('Vision processing is not supported by Exo provider');
|
|
96
|
+
}
|
|
97
|
+
async document(optionsArg) {
|
|
98
|
+
throw new Error('Document processing is not supported by Exo provider');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuZXhvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIuZXhvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVNuRSxNQUFNLE9BQU8sV0FBWSxTQUFRLGVBQWU7SUFJOUMsWUFBWSxhQUFrQyxFQUFFO1FBQzlDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFVBQVUsRUFBRSwwQkFBMEIsRUFBRywyQkFBMkI7WUFDcEUsR0FBRyxVQUFVO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDaEQsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLFlBQVksRUFBRyx3REFBd0Q7WUFDdEcsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUksS0FBSSxDQUFDO0lBRWYsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFpQztRQUN2RCxpREFBaUQ7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxjQUFjLEdBQThDLElBQUksQ0FBQztRQUVyRSxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQXFCO1lBQ3hELFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUNyQyxNQUFNLElB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
|
package/dist_ts/provider.groq.js
CHANGED
|
@@ -19,7 +19,7 @@ export class GroqProvider extends MultiModalModel {
|
|
|
19
19
|
let currentMessage = null;
|
|
20
20
|
// Create a TransformStream to process the input
|
|
21
21
|
const transform = new TransformStream({
|
|
22
|
-
async
|
|
22
|
+
transform: async (chunk, controller) => {
|
|
23
23
|
buffer += decoder.decode(chunk, { stream: true });
|
|
24
24
|
// Try to parse complete JSON messages from the buffer
|
|
25
25
|
while (true) {
|
|
@@ -160,4 +160,4 @@ export class GroqProvider extends MultiModalModel {
|
|
|
160
160
|
throw new Error('Document processing is not yet supported by Groq.');
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuZ3JvcS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Byb3ZpZGVyLmdyb3EudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBUW5FLE1BQU0sT0FBTyxZQUFhLFNBQVEsZUFBZTtJQUkvQyxZQUFZLFVBQWdDO1FBQzFDLEtBQUssRUFBRSxDQUFDO1FBSEYsWUFBTyxHQUFHLHlCQUF5QixDQUFDO1FBSTFDLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixHQUFHLFVBQVU7WUFDYixLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssSUFBSSx5QkFBeUIsRUFBRSxnQkFBZ0I7U0FDdkUsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSyxLQUFJLENBQUM7SUFFaEIsS0FBSyxDQUFDLElBQUksS0FBSSxDQUFDO0lBRVIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFpQztRQUN2RCxpREFBaUQ7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxjQUFjLEdBQThDLElBQUksQ0FBQztRQUVyRSxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQXFCO1lBQ3hELFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUNyQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFbEQsc0RBQXNEO2dCQUN0RCxPQUFPLElBQUksRUFBRSxDQUFDO29CQUNaLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzFDLElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQzt3QkFBRSxNQUFNO29CQUUvQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDM0MsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUV4QyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO3dCQUNoQixJQUFJLENBQUM7NEJBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDakMsY0FBYyxHQUFHO2dDQUNmLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLE1BQU07Z0NBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUU7NkJBQy9CLENBQUM7d0JBQ0osQ0FBQzt3QkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDOzRCQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUVELGlEQUFpRDtnQkFDakQsSUFBSSxjQUFjLEVBQUUsQ0FBQztvQkFDbkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxtQkFBbUIsRUFBRTt3QkFDL0QsTUFBTSxFQUFFLE1BQU07d0JBQ2QsT0FBTyxFQUFFOzRCQUNQLGVBQWUsRUFBRSxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFOzRCQUNuRCxjQUFjLEVBQUUsa0JBQWtCO3lCQUNuQzt3QkFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSzs0QkFDekIsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDOzRCQUMxRSxNQUFNLEVBQUUsSUFBSTt5QkFDYixDQUFDO3FCQUNILENBQUMsQ0FBQztvQkFFSCwrQkFBK0I7b0JBQy9CLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7b0JBQzFDLElBQUksTUFBTSxFQUFFLENBQUM7d0JBQ1gsSUFBSSxDQUFDOzRCQUNILE9BQU8sSUFBSSxFQUFFLENBQUM7Z0NBQ1osTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQ0FDNUMsSUFBSSxJQUFJO29DQUFFLE1BQU07Z0NBRWhCLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUM5QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUVoQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO29DQUN6QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQzt3Q0FDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3Q0FDM0IsSUFBSSxJQUFJLEtBQUssUUFBUTs0Q0FBRSxNQUFNO3dDQUU3QixJQUFJLENBQUM7NENBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzs0Q0FDaEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDOzRDQUNsRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dEQUNaLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7NENBQzlCLENBQUM7d0NBQ0gsQ0FBQzt3Q0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDOzRDQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0NBQ2hELENBQUM7b0NBQ0gsQ0FBQztnQ0FDSCxDQUFDOzRCQUNILENBQUM7d0JBQ0gsQ0FBQztnQ0FBUyxDQUFDOzRCQUNULE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDdkIsQ0FBQztvQkFDSCxDQUFDO29CQUVELGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQ3hCLENBQUM7WUFDSCxDQUFDO1lBRUQsS0FBSyxDQUFDLFVBQVU7Z0JBQ2QsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxJQUFJLENBQUM7d0JBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDbkMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUM1QyxDQUFDO29CQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDeEQsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILDRDQUE0QztRQUM1QyxPQUFPLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGdEQUFnRDtJQUN6QyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQXVCO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHO1lBQ2YsaUJBQWlCO1lBQ2pCO2dCQUNFLElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSxVQUFVLENBQUMsYUFBYTthQUNsQztZQUNELGtCQUFrQjtZQUNsQixHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2dCQUNkLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTzthQUNyQixDQUFDLENBQUM7WUFDSCxlQUFlO1lBQ2Y7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osT0FBTyxFQUFFLFVBQVUsQ0FBQyxXQUFXO2FBQ2hDO1NBQ0YsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sbUJBQW1CLEVBQUU7WUFDL0QsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ1AsZUFBZSxFQUFFLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7Z0JBQ25ELGNBQWMsRUFBRSxrQkFBa0I7YUFDbkM7WUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSztnQkFDekIsUUFBUTtnQkFDUixXQUFXLEVBQUUsR0FBRztnQkFDaEIscUJBQXFCLEVBQUUsSUFBSTtnQkFDM0IsTUFBTSxFQUFFLEtBQUs7YUFDZCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixLQUFLLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVyQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFdBQVc7WUFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU87U0FDM0MsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQStCO1FBQ2hELHlFQUF5RTtRQUN6RSxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBNkM7UUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBS3JCO1FBQ0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7Q0FDRiJ9
|
|
@@ -29,7 +29,7 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
29
29
|
let currentMessage = null;
|
|
30
30
|
// Create a TransformStream to process the input
|
|
31
31
|
const transform = new TransformStream({
|
|
32
|
-
async
|
|
32
|
+
transform: async (chunk, controller) => {
|
|
33
33
|
buffer += decoder.decode(chunk, { stream: true });
|
|
34
34
|
// Try to parse complete JSON messages from the buffer
|
|
35
35
|
while (true) {
|
|
@@ -209,4 +209,4 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
209
209
|
};
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIub2xsYW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIub2xsYW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVNuRSxNQUFNLE9BQU8sY0FBZSxTQUFRLGVBQWU7SUFNakQsWUFBWSxhQUFxQyxFQUFFO1FBQ2pELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxJQUFJLHdCQUF3QixDQUFDO1FBQzlELElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQztJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxXQUFXLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3RixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLEtBQUks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
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
+
export type TChatCompletionRequestMessage = {
|
|
3
|
+
role: "system" | "user" | "assistant";
|
|
4
|
+
content: string;
|
|
5
|
+
};
|
|
2
6
|
import { MultiModalModel } from './abstract.classes.multimodal.js';
|
|
3
7
|
export interface IOpenaiProviderOptions {
|
|
4
8
|
openaiToken: string;
|
|
9
|
+
chatModel?: string;
|
|
10
|
+
audioModel?: string;
|
|
11
|
+
visionModel?: string;
|
|
5
12
|
}
|
|
6
13
|
export declare class OpenAiProvider extends MultiModalModel {
|
|
7
14
|
private options;
|
|
@@ -21,7 +21,7 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
21
21
|
let currentMessage = null;
|
|
22
22
|
// Create a TransformStream to process the input
|
|
23
23
|
const transform = new TransformStream({
|
|
24
|
-
async
|
|
24
|
+
transform: async (chunk, controller) => {
|
|
25
25
|
buffer += decoder.decode(chunk, { stream: true });
|
|
26
26
|
// Try to parse complete JSON messages from the buffer
|
|
27
27
|
while (true) {
|
|
@@ -34,7 +34,7 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
34
34
|
try {
|
|
35
35
|
const message = JSON.parse(line);
|
|
36
36
|
currentMessage = {
|
|
37
|
-
role: message.role || 'user',
|
|
37
|
+
role: (message.role || 'user'),
|
|
38
38
|
content: message.content || '',
|
|
39
39
|
};
|
|
40
40
|
}
|
|
@@ -45,13 +45,19 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
45
45
|
}
|
|
46
46
|
// If we have a complete message, send it to OpenAI
|
|
47
47
|
if (currentMessage) {
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
const messageToSend = { role: "user", content: currentMessage.content };
|
|
49
|
+
const chatModel = this.options.chatModel ?? 'o3-mini';
|
|
50
|
+
const requestParams = {
|
|
51
|
+
model: chatModel,
|
|
52
|
+
messages: [messageToSend],
|
|
51
53
|
stream: true,
|
|
52
|
-
}
|
|
54
|
+
};
|
|
55
|
+
// Temperature is omitted since the model does not support it.
|
|
56
|
+
const stream = await this.openAiApiClient.chat.completions.create(requestParams);
|
|
57
|
+
// Explicitly cast the stream as an async iterable to satisfy TypeScript.
|
|
58
|
+
const streamAsyncIterable = stream;
|
|
53
59
|
// Process each chunk from OpenAI
|
|
54
|
-
for await (const chunk of
|
|
60
|
+
for await (const chunk of streamAsyncIterable) {
|
|
55
61
|
const content = chunk.choices[0]?.delta?.content;
|
|
56
62
|
if (content) {
|
|
57
63
|
controller.enqueue(content);
|
|
@@ -77,14 +83,17 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
77
83
|
}
|
|
78
84
|
// Implementing the synchronous chat interaction
|
|
79
85
|
async chat(optionsArg) {
|
|
80
|
-
const
|
|
81
|
-
|
|
86
|
+
const chatModel = this.options.chatModel ?? 'o3-mini';
|
|
87
|
+
const requestParams = {
|
|
88
|
+
model: chatModel,
|
|
82
89
|
messages: [
|
|
83
90
|
{ role: 'system', content: optionsArg.systemMessage },
|
|
84
91
|
...optionsArg.messageHistory,
|
|
85
92
|
{ role: 'user', content: optionsArg.userMessage },
|
|
86
93
|
],
|
|
87
|
-
}
|
|
94
|
+
};
|
|
95
|
+
// Temperature parameter removed to avoid unsupported error.
|
|
96
|
+
const result = await this.openAiApiClient.chat.completions.create(requestParams);
|
|
88
97
|
return {
|
|
89
98
|
role: result.choices[0].message.role,
|
|
90
99
|
message: result.choices[0].message.content,
|
|
@@ -93,7 +102,7 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
93
102
|
async audio(optionsArg) {
|
|
94
103
|
const done = plugins.smartpromise.defer();
|
|
95
104
|
const result = await this.openAiApiClient.audio.speech.create({
|
|
96
|
-
model: '
|
|
105
|
+
model: this.options.audioModel ?? 'o3-mini',
|
|
97
106
|
input: optionsArg.message,
|
|
98
107
|
voice: 'nova',
|
|
99
108
|
response_format: 'mp3',
|
|
@@ -105,18 +114,27 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
105
114
|
}
|
|
106
115
|
async document(optionsArg) {
|
|
107
116
|
let pdfDocumentImageBytesArray = [];
|
|
117
|
+
// Convert each PDF into one or more image byte arrays.
|
|
118
|
+
const smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
119
|
+
await smartpdfInstance.start();
|
|
108
120
|
for (const pdfDocument of optionsArg.pdfDocuments) {
|
|
109
|
-
const documentImageArray = await
|
|
121
|
+
const documentImageArray = await smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
110
122
|
pdfDocumentImageBytesArray = pdfDocumentImageBytesArray.concat(documentImageArray);
|
|
111
123
|
}
|
|
124
|
+
await smartpdfInstance.stop();
|
|
112
125
|
console.log(`image smartfile array`);
|
|
113
126
|
console.log(pdfDocumentImageBytesArray.map((smartfile) => smartfile.length));
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
127
|
+
// Filter out any empty buffers to avoid sending invalid image URLs.
|
|
128
|
+
const validImageBytesArray = pdfDocumentImageBytesArray.filter(imageBytes => imageBytes && imageBytes.length > 0);
|
|
129
|
+
const imageAttachments = validImageBytesArray.map(imageBytes => ({
|
|
130
|
+
type: 'image_url',
|
|
131
|
+
image_url: {
|
|
132
|
+
url: 'data:image/png;base64,' + Buffer.from(imageBytes).toString('base64'),
|
|
133
|
+
},
|
|
134
|
+
}));
|
|
135
|
+
const chatModel = this.options.chatModel ?? 'gpt-4o';
|
|
136
|
+
const requestParams = {
|
|
137
|
+
model: chatModel,
|
|
120
138
|
messages: [
|
|
121
139
|
{ role: 'system', content: optionsArg.systemMessage },
|
|
122
140
|
...optionsArg.messageHistory,
|
|
@@ -124,29 +142,21 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
124
142
|
role: 'user',
|
|
125
143
|
content: [
|
|
126
144
|
{ type: 'text', text: optionsArg.userMessage },
|
|
127
|
-
...
|
|
128
|
-
const returnArray = [];
|
|
129
|
-
for (const imageBytes of pdfDocumentImageBytesArray) {
|
|
130
|
-
returnArray.push({
|
|
131
|
-
type: 'image_url',
|
|
132
|
-
image_url: {
|
|
133
|
-
url: 'data:image/png;base64,' + Buffer.from(imageBytes).toString('base64'),
|
|
134
|
-
},
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
return returnArray;
|
|
138
|
-
})(),
|
|
145
|
+
...imageAttachments,
|
|
139
146
|
],
|
|
140
147
|
},
|
|
141
148
|
],
|
|
142
|
-
}
|
|
149
|
+
};
|
|
150
|
+
// Temperature parameter removed.
|
|
151
|
+
const result = await this.openAiApiClient.chat.completions.create(requestParams);
|
|
143
152
|
return {
|
|
144
153
|
message: result.choices[0].message,
|
|
145
154
|
};
|
|
146
155
|
}
|
|
147
156
|
async vision(optionsArg) {
|
|
148
|
-
const
|
|
149
|
-
|
|
157
|
+
const visionModel = this.options.visionModel ?? 'gpt-4o';
|
|
158
|
+
const requestParams = {
|
|
159
|
+
model: visionModel,
|
|
150
160
|
messages: [
|
|
151
161
|
{
|
|
152
162
|
role: 'user',
|
|
@@ -162,8 +172,9 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
162
172
|
}
|
|
163
173
|
],
|
|
164
174
|
max_tokens: 300
|
|
165
|
-
}
|
|
175
|
+
};
|
|
176
|
+
const result = await this.openAiApiClient.chat.completions.create(requestParams);
|
|
166
177
|
return result.choices[0].message.content || '';
|
|
167
178
|
}
|
|
168
179
|
}
|
|
169
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIub3BlbmFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIub3BlbmFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBUXBDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVVuRSxNQUFNLE9BQU8sY0FBZSxTQUFRLGVBQWU7SUFLakQsWUFBWSxVQUFrQztRQUM1QyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0lBQzVCLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDaEQsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNoQyx1QkFBdUIsRUFBRSxJQUFJO1NBQzlCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLEtBQUksQ0FBQztJQUVmLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBaUM7UUFDdkQsaURBQWlEO1FBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbEMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksY0FBYyxHQUdQLElBQUksQ0FBQztRQUVoQixnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQXFCO1lBQ3hELFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUNyQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A TypeScript library for integrating and interacting with multiple AI models, offering capabilities for chat and potentially audio responses.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -9,24 +9,24 @@
|
|
|
9
9
|
"author": "Task Venture Capital GmbH",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"devDependencies": {
|
|
12
|
-
"@git.zone/tsbuild": "^2.1
|
|
13
|
-
"@git.zone/tsbundle": "^2.
|
|
14
|
-
"@git.zone/tsrun": "^1.
|
|
15
|
-
"@git.zone/tstest": "^1.0.
|
|
16
|
-
"@push.rocks/qenv": "^6.0
|
|
17
|
-
"@push.rocks/tapbundle": "^5.
|
|
18
|
-
"@types/node": "^22.
|
|
12
|
+
"@git.zone/tsbuild": "^2.2.1",
|
|
13
|
+
"@git.zone/tsbundle": "^2.2.5",
|
|
14
|
+
"@git.zone/tsrun": "^1.3.3",
|
|
15
|
+
"@git.zone/tstest": "^1.0.96",
|
|
16
|
+
"@push.rocks/qenv": "^6.1.0",
|
|
17
|
+
"@push.rocks/tapbundle": "^5.5.6",
|
|
18
|
+
"@types/node": "^22.13.5"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@anthropic-ai/sdk": "^0.
|
|
22
|
-
"@push.rocks/smartarray": "^1.0
|
|
23
|
-
"@push.rocks/smartfile": "^11.0
|
|
21
|
+
"@anthropic-ai/sdk": "^0.37.0",
|
|
22
|
+
"@push.rocks/smartarray": "^1.1.0",
|
|
23
|
+
"@push.rocks/smartfile": "^11.2.0",
|
|
24
24
|
"@push.rocks/smartpath": "^5.0.18",
|
|
25
|
-
"@push.rocks/smartpdf": "^3.
|
|
26
|
-
"@push.rocks/smartpromise": "^4.
|
|
27
|
-
"@push.rocks/smartrequest": "^2.0.
|
|
25
|
+
"@push.rocks/smartpdf": "^3.2.2",
|
|
26
|
+
"@push.rocks/smartpromise": "^4.2.3",
|
|
27
|
+
"@push.rocks/smartrequest": "^2.0.23",
|
|
28
28
|
"@push.rocks/webstream": "^1.0.10",
|
|
29
|
-
"openai": "^4.
|
|
29
|
+
"openai": "^4.85.4"
|
|
30
30
|
},
|
|
31
31
|
"repository": {
|
|
32
32
|
"type": "git",
|
package/readme.md
CHANGED
|
@@ -110,6 +110,19 @@ SmartAi supports multiple AI providers. Configure each provider with its corresp
|
|
|
110
110
|
}
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
+
### Exo
|
|
114
|
+
|
|
115
|
+
- **Models:** Configurable (supports LLaMA, Mistral, LlaVA, Qwen, and Deepseek)
|
|
116
|
+
- **Features:** Chat, Streaming
|
|
117
|
+
- **Configuration Example:**
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
exo: {
|
|
121
|
+
baseUrl: 'http://localhost:8080/v1', // Optional
|
|
122
|
+
apiKey: 'your-api-key' // Optional for local deployments
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
113
126
|
## Quick Start
|
|
114
127
|
|
|
115
128
|
Initialize SmartAi with the provider configurations you plan to use:
|
|
@@ -126,6 +139,10 @@ const smartAi = new SmartAi({
|
|
|
126
139
|
ollama: {
|
|
127
140
|
baseUrl: 'http://localhost:11434',
|
|
128
141
|
model: 'llama2'
|
|
142
|
+
},
|
|
143
|
+
exo: {
|
|
144
|
+
baseUrl: 'http://localhost:8080/v1',
|
|
145
|
+
apiKey: 'your-api-key'
|
|
129
146
|
}
|
|
130
147
|
});
|
|
131
148
|
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -48,6 +48,18 @@ export class Conversation {
|
|
|
48
48
|
return conversation;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
public static async createWithExo(smartaiRefArg: SmartAi) {
|
|
52
|
+
if (!smartaiRefArg.exoProvider) {
|
|
53
|
+
throw new Error('Exo provider not available');
|
|
54
|
+
}
|
|
55
|
+
const conversation = new Conversation(smartaiRefArg, {
|
|
56
|
+
processFunction: async (input) => {
|
|
57
|
+
return '' // TODO implement proper streaming
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return conversation;
|
|
61
|
+
}
|
|
62
|
+
|
|
51
63
|
public static async createWithOllama(smartaiRefArg: SmartAi) {
|
|
52
64
|
if (!smartaiRefArg.ollamaProvider) {
|
|
53
65
|
throw new Error('Ollama provider not available');
|
|
@@ -60,6 +72,30 @@ export class Conversation {
|
|
|
60
72
|
return conversation;
|
|
61
73
|
}
|
|
62
74
|
|
|
75
|
+
public static async createWithGroq(smartaiRefArg: SmartAi) {
|
|
76
|
+
if (!smartaiRefArg.groqProvider) {
|
|
77
|
+
throw new Error('Groq provider not available');
|
|
78
|
+
}
|
|
79
|
+
const conversation = new Conversation(smartaiRefArg, {
|
|
80
|
+
processFunction: async (input) => {
|
|
81
|
+
return '' // TODO implement proper streaming
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
return conversation;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public static async createWithXai(smartaiRefArg: SmartAi) {
|
|
88
|
+
if (!smartaiRefArg.xaiProvider) {
|
|
89
|
+
throw new Error('XAI provider not available');
|
|
90
|
+
}
|
|
91
|
+
const conversation = new Conversation(smartaiRefArg, {
|
|
92
|
+
processFunction: async (input) => {
|
|
93
|
+
return '' // TODO implement proper streaming
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return conversation;
|
|
97
|
+
}
|
|
98
|
+
|
|
63
99
|
// INSTANCE
|
|
64
100
|
smartaiRef: SmartAi
|
|
65
101
|
private systemMessage: string;
|
package/ts/classes.smartai.ts
CHANGED
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
import { Conversation } from './classes.conversation.js';
|
|
2
2
|
import * as plugins from './plugins.js';
|
|
3
3
|
import { AnthropicProvider } from './provider.anthropic.js';
|
|
4
|
-
import
|
|
4
|
+
import { OllamaProvider } from './provider.ollama.js';
|
|
5
5
|
import { OpenAiProvider } from './provider.openai.js';
|
|
6
|
-
import
|
|
6
|
+
import { PerplexityProvider } from './provider.perplexity.js';
|
|
7
|
+
import { ExoProvider } from './provider.exo.js';
|
|
8
|
+
import { GroqProvider } from './provider.groq.js';
|
|
9
|
+
import { XAIProvider } from './provider.xai.js';
|
|
7
10
|
|
|
8
11
|
|
|
9
12
|
export interface ISmartAiOptions {
|
|
10
13
|
openaiToken?: string;
|
|
11
14
|
anthropicToken?: string;
|
|
12
15
|
perplexityToken?: string;
|
|
16
|
+
groqToken?: string;
|
|
17
|
+
xaiToken?: string;
|
|
18
|
+
exo?: {
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
apiKey?: string;
|
|
21
|
+
};
|
|
22
|
+
ollama?: {
|
|
23
|
+
baseUrl?: string;
|
|
24
|
+
model?: string;
|
|
25
|
+
visionModel?: string;
|
|
26
|
+
};
|
|
13
27
|
}
|
|
14
28
|
|
|
15
|
-
export type TProvider = 'openai' | 'anthropic' | 'perplexity' | 'ollama';
|
|
29
|
+
export type TProvider = 'openai' | 'anthropic' | 'perplexity' | 'ollama' | 'exo' | 'groq' | 'xai';
|
|
16
30
|
|
|
17
31
|
export class SmartAi {
|
|
18
32
|
public options: ISmartAiOptions;
|
|
@@ -21,6 +35,9 @@ export class SmartAi {
|
|
|
21
35
|
public anthropicProvider: AnthropicProvider;
|
|
22
36
|
public perplexityProvider: PerplexityProvider;
|
|
23
37
|
public ollamaProvider: OllamaProvider;
|
|
38
|
+
public exoProvider: ExoProvider;
|
|
39
|
+
public groqProvider: GroqProvider;
|
|
40
|
+
public xaiProvider: XAIProvider;
|
|
24
41
|
|
|
25
42
|
constructor(optionsArg: ISmartAiOptions) {
|
|
26
43
|
this.options = optionsArg;
|
|
@@ -37,6 +54,40 @@ export class SmartAi {
|
|
|
37
54
|
this.anthropicProvider = new AnthropicProvider({
|
|
38
55
|
anthropicToken: this.options.anthropicToken,
|
|
39
56
|
});
|
|
57
|
+
await this.anthropicProvider.start();
|
|
58
|
+
}
|
|
59
|
+
if (this.options.perplexityToken) {
|
|
60
|
+
this.perplexityProvider = new PerplexityProvider({
|
|
61
|
+
perplexityToken: this.options.perplexityToken,
|
|
62
|
+
});
|
|
63
|
+
await this.perplexityProvider.start();
|
|
64
|
+
}
|
|
65
|
+
if (this.options.groqToken) {
|
|
66
|
+
this.groqProvider = new GroqProvider({
|
|
67
|
+
groqToken: this.options.groqToken,
|
|
68
|
+
});
|
|
69
|
+
await this.groqProvider.start();
|
|
70
|
+
}
|
|
71
|
+
if (this.options.xaiToken) {
|
|
72
|
+
this.xaiProvider = new XAIProvider({
|
|
73
|
+
xaiToken: this.options.xaiToken,
|
|
74
|
+
});
|
|
75
|
+
await this.xaiProvider.start();
|
|
76
|
+
}
|
|
77
|
+
if (this.options.ollama) {
|
|
78
|
+
this.ollamaProvider = new OllamaProvider({
|
|
79
|
+
baseUrl: this.options.ollama.baseUrl,
|
|
80
|
+
model: this.options.ollama.model,
|
|
81
|
+
visionModel: this.options.ollama.visionModel,
|
|
82
|
+
});
|
|
83
|
+
await this.ollamaProvider.start();
|
|
84
|
+
}
|
|
85
|
+
if (this.options.exo) {
|
|
86
|
+
this.exoProvider = new ExoProvider({
|
|
87
|
+
exoBaseUrl: this.options.exo.baseUrl,
|
|
88
|
+
apiKey: this.options.exo.apiKey,
|
|
89
|
+
});
|
|
90
|
+
await this.exoProvider.start();
|
|
40
91
|
}
|
|
41
92
|
}
|
|
42
93
|
|
|
@@ -47,6 +98,8 @@ export class SmartAi {
|
|
|
47
98
|
*/
|
|
48
99
|
createConversation(provider: TProvider) {
|
|
49
100
|
switch (provider) {
|
|
101
|
+
case 'exo':
|
|
102
|
+
return Conversation.createWithExo(this);
|
|
50
103
|
case 'openai':
|
|
51
104
|
return Conversation.createWithOpenAi(this);
|
|
52
105
|
case 'anthropic':
|
|
@@ -55,6 +108,10 @@ export class SmartAi {
|
|
|
55
108
|
return Conversation.createWithPerplexity(this);
|
|
56
109
|
case 'ollama':
|
|
57
110
|
return Conversation.createWithOllama(this);
|
|
111
|
+
case 'groq':
|
|
112
|
+
return Conversation.createWithGroq(this);
|
|
113
|
+
case 'xai':
|
|
114
|
+
return Conversation.createWithXai(this);
|
|
58
115
|
default:
|
|
59
116
|
throw new Error('Provider not available');
|
|
60
117
|
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as paths from './paths.js';
|
|
3
|
+
import { MultiModalModel } from './abstract.classes.multimodal.js';
|
|
4
|
+
import type { ChatOptions, ChatResponse, ChatMessage } from './abstract.classes.multimodal.js';
|
|
5
|
+
import type { ChatCompletionMessageParam } from 'openai/resources/chat/completions';
|
|
6
|
+
|
|
7
|
+
export interface IExoProviderOptions {
|
|
8
|
+
exoBaseUrl?: string;
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class ExoProvider extends MultiModalModel {
|
|
13
|
+
private options: IExoProviderOptions;
|
|
14
|
+
public openAiApiClient: plugins.openai.default;
|
|
15
|
+
|
|
16
|
+
constructor(optionsArg: IExoProviderOptions = {}) {
|
|
17
|
+
super();
|
|
18
|
+
this.options = {
|
|
19
|
+
exoBaseUrl: 'http://localhost:8080/v1', // Default Exo API endpoint
|
|
20
|
+
...optionsArg
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public async start() {
|
|
25
|
+
this.openAiApiClient = new plugins.openai.default({
|
|
26
|
+
apiKey: this.options.apiKey || 'not-needed', // Exo might not require an API key for local deployment
|
|
27
|
+
baseURL: this.options.exoBaseUrl,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public async stop() {}
|
|
32
|
+
|
|
33
|
+
public async chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>> {
|
|
34
|
+
// Create a TextDecoder to handle incoming chunks
|
|
35
|
+
const decoder = new TextDecoder();
|
|
36
|
+
let buffer = '';
|
|
37
|
+
let currentMessage: { role: string; content: string; } | null = null;
|
|
38
|
+
|
|
39
|
+
// Create a TransformStream to process the input
|
|
40
|
+
const transform = new TransformStream<Uint8Array, string>({
|
|
41
|
+
transform: async (chunk, controller) => {
|
|
42
|
+
buffer += decoder.decode(chunk, { stream: true });
|
|
43
|
+
|
|
44
|
+
// Try to parse complete JSON messages from the buffer
|
|
45
|
+
while (true) {
|
|
46
|
+
const newlineIndex = buffer.indexOf('\n');
|
|
47
|
+
if (newlineIndex === -1) break;
|
|
48
|
+
|
|
49
|
+
const line = buffer.slice(0, newlineIndex);
|
|
50
|
+
buffer = buffer.slice(newlineIndex + 1);
|
|
51
|
+
|
|
52
|
+
if (line.trim()) {
|
|
53
|
+
try {
|
|
54
|
+
const message = JSON.parse(line);
|
|
55
|
+
currentMessage = message;
|
|
56
|
+
|
|
57
|
+
// Process the message based on its type
|
|
58
|
+
if (message.type === 'message') {
|
|
59
|
+
const response = await this.chat({
|
|
60
|
+
systemMessage: '',
|
|
61
|
+
userMessage: message.content,
|
|
62
|
+
messageHistory: [{ role: message.role as 'user' | 'assistant' | 'system', content: message.content }]
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
controller.enqueue(JSON.stringify(response) + '\n');
|
|
66
|
+
}
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error('Error processing message:', error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
flush(controller) {
|
|
74
|
+
if (buffer) {
|
|
75
|
+
try {
|
|
76
|
+
const message = JSON.parse(buffer);
|
|
77
|
+
currentMessage = message;
|
|
78
|
+
} catch (error) {
|
|
79
|
+
console.error('Error processing remaining buffer:', error);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
return input.pipeThrough(transform);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public async chat(options: ChatOptions): Promise<ChatResponse> {
|
|
89
|
+
const messages: ChatCompletionMessageParam[] = [
|
|
90
|
+
{ role: 'system', content: options.systemMessage },
|
|
91
|
+
...options.messageHistory,
|
|
92
|
+
{ role: 'user', content: options.userMessage }
|
|
93
|
+
];
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
const response = await this.openAiApiClient.chat.completions.create({
|
|
97
|
+
model: 'local-model', // Exo uses local models
|
|
98
|
+
messages: messages,
|
|
99
|
+
stream: false
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
return {
|
|
103
|
+
role: 'assistant',
|
|
104
|
+
message: response.choices[0]?.message?.content || ''
|
|
105
|
+
};
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error('Error in chat completion:', error);
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public async audio(optionsArg: { message: string }): Promise<NodeJS.ReadableStream> {
|
|
113
|
+
throw new Error('Audio generation is not supported by Exo provider');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
public async vision(optionsArg: { image: Buffer; prompt: string }): Promise<string> {
|
|
117
|
+
throw new Error('Vision processing is not supported by Exo provider');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
public async document(optionsArg: {
|
|
121
|
+
systemMessage: string;
|
|
122
|
+
userMessage: string;
|
|
123
|
+
pdfDocuments: Uint8Array[];
|
|
124
|
+
messageHistory: ChatMessage[];
|
|
125
|
+
}): Promise<{ message: any }> {
|
|
126
|
+
throw new Error('Document processing is not supported by Exo provider');
|
|
127
|
+
}
|
|
128
|
+
}
|
package/ts/provider.groq.ts
CHANGED
|
@@ -32,7 +32,7 @@ export class GroqProvider extends MultiModalModel {
|
|
|
32
32
|
|
|
33
33
|
// Create a TransformStream to process the input
|
|
34
34
|
const transform = new TransformStream<Uint8Array, string>({
|
|
35
|
-
async
|
|
35
|
+
transform: async (chunk, controller) => {
|
|
36
36
|
buffer += decoder.decode(chunk, { stream: true });
|
|
37
37
|
|
|
38
38
|
// Try to parse complete JSON messages from the buffer
|
package/ts/provider.ollama.ts
CHANGED
|
@@ -45,7 +45,7 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
45
45
|
|
|
46
46
|
// Create a TransformStream to process the input
|
|
47
47
|
const transform = new TransformStream<Uint8Array, string>({
|
|
48
|
-
async
|
|
48
|
+
transform: async (chunk, controller) => {
|
|
49
49
|
buffer += decoder.decode(chunk, { stream: true });
|
|
50
50
|
|
|
51
51
|
// Try to parse complete JSON messages from the buffer
|
package/ts/provider.openai.ts
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import * as paths from './paths.js';
|
|
3
3
|
|
|
4
|
+
// Custom type definition for chat completion messages
|
|
5
|
+
export type TChatCompletionRequestMessage = {
|
|
6
|
+
role: "system" | "user" | "assistant";
|
|
7
|
+
content: string;
|
|
8
|
+
};
|
|
9
|
+
|
|
4
10
|
import { MultiModalModel } from './abstract.classes.multimodal.js';
|
|
5
11
|
|
|
6
12
|
export interface IOpenaiProviderOptions {
|
|
7
13
|
openaiToken: string;
|
|
14
|
+
chatModel?: string;
|
|
15
|
+
audioModel?: string;
|
|
16
|
+
visionModel?: string;
|
|
17
|
+
// Optionally add more model options (e.g., documentModel) if needed.
|
|
8
18
|
}
|
|
9
19
|
|
|
10
20
|
export class OpenAiProvider extends MultiModalModel {
|
|
@@ -31,11 +41,14 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
31
41
|
// Create a TextDecoder to handle incoming chunks
|
|
32
42
|
const decoder = new TextDecoder();
|
|
33
43
|
let buffer = '';
|
|
34
|
-
let currentMessage: {
|
|
44
|
+
let currentMessage: {
|
|
45
|
+
role: "function" | "user" | "system" | "assistant" | "tool" | "developer";
|
|
46
|
+
content: string;
|
|
47
|
+
} | null = null;
|
|
35
48
|
|
|
36
49
|
// Create a TransformStream to process the input
|
|
37
50
|
const transform = new TransformStream<Uint8Array, string>({
|
|
38
|
-
async
|
|
51
|
+
transform: async (chunk, controller) => {
|
|
39
52
|
buffer += decoder.decode(chunk, { stream: true });
|
|
40
53
|
|
|
41
54
|
// Try to parse complete JSON messages from the buffer
|
|
@@ -50,7 +63,7 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
50
63
|
try {
|
|
51
64
|
const message = JSON.parse(line);
|
|
52
65
|
currentMessage = {
|
|
53
|
-
role: message.role || 'user',
|
|
66
|
+
role: (message.role || 'user') as "function" | "user" | "system" | "assistant" | "tool" | "developer",
|
|
54
67
|
content: message.content || '',
|
|
55
68
|
};
|
|
56
69
|
} catch (e) {
|
|
@@ -61,20 +74,24 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
61
74
|
|
|
62
75
|
// If we have a complete message, send it to OpenAI
|
|
63
76
|
if (currentMessage) {
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
77
|
+
const messageToSend = { role: "user" as const, content: currentMessage.content };
|
|
78
|
+
const chatModel = this.options.chatModel ?? 'o3-mini';
|
|
79
|
+
const requestParams: any = {
|
|
80
|
+
model: chatModel,
|
|
81
|
+
messages: [messageToSend],
|
|
67
82
|
stream: true,
|
|
68
|
-
}
|
|
69
|
-
|
|
83
|
+
};
|
|
84
|
+
// Temperature is omitted since the model does not support it.
|
|
85
|
+
const stream = await this.openAiApiClient.chat.completions.create(requestParams);
|
|
86
|
+
// Explicitly cast the stream as an async iterable to satisfy TypeScript.
|
|
87
|
+
const streamAsyncIterable = stream as unknown as AsyncIterableIterator<any>;
|
|
70
88
|
// Process each chunk from OpenAI
|
|
71
|
-
for await (const chunk of
|
|
89
|
+
for await (const chunk of streamAsyncIterable) {
|
|
72
90
|
const content = chunk.choices[0]?.delta?.content;
|
|
73
91
|
if (content) {
|
|
74
92
|
controller.enqueue(content);
|
|
75
93
|
}
|
|
76
94
|
}
|
|
77
|
-
|
|
78
95
|
currentMessage = null;
|
|
79
96
|
}
|
|
80
97
|
},
|
|
@@ -104,15 +121,17 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
104
121
|
content: string;
|
|
105
122
|
}[];
|
|
106
123
|
}) {
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
124
|
+
const chatModel = this.options.chatModel ?? 'o3-mini';
|
|
125
|
+
const requestParams: any = {
|
|
126
|
+
model: chatModel,
|
|
110
127
|
messages: [
|
|
111
128
|
{ role: 'system', content: optionsArg.systemMessage },
|
|
112
129
|
...optionsArg.messageHistory,
|
|
113
130
|
{ role: 'user', content: optionsArg.userMessage },
|
|
114
131
|
],
|
|
115
|
-
}
|
|
132
|
+
};
|
|
133
|
+
// Temperature parameter removed to avoid unsupported error.
|
|
134
|
+
const result = await this.openAiApiClient.chat.completions.create(requestParams);
|
|
116
135
|
return {
|
|
117
136
|
role: result.choices[0].message.role as 'assistant',
|
|
118
137
|
message: result.choices[0].message.content,
|
|
@@ -122,7 +141,7 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
122
141
|
public async audio(optionsArg: { message: string }): Promise<NodeJS.ReadableStream> {
|
|
123
142
|
const done = plugins.smartpromise.defer<NodeJS.ReadableStream>();
|
|
124
143
|
const result = await this.openAiApiClient.audio.speech.create({
|
|
125
|
-
model: '
|
|
144
|
+
model: this.options.audioModel ?? 'o3-mini',
|
|
126
145
|
input: optionsArg.message,
|
|
127
146
|
voice: 'nova',
|
|
128
147
|
response_format: 'mp3',
|
|
@@ -144,27 +163,30 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
144
163
|
}) {
|
|
145
164
|
let pdfDocumentImageBytesArray: Uint8Array[] = [];
|
|
146
165
|
|
|
166
|
+
// Convert each PDF into one or more image byte arrays.
|
|
167
|
+
const smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
168
|
+
await smartpdfInstance.start();
|
|
147
169
|
for (const pdfDocument of optionsArg.pdfDocuments) {
|
|
148
|
-
const documentImageArray = await
|
|
170
|
+
const documentImageArray = await smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
149
171
|
pdfDocumentImageBytesArray = pdfDocumentImageBytesArray.concat(documentImageArray);
|
|
150
172
|
}
|
|
173
|
+
await smartpdfInstance.stop();
|
|
151
174
|
|
|
152
175
|
console.log(`image smartfile array`);
|
|
153
176
|
console.log(pdfDocumentImageBytesArray.map((smartfile) => smartfile.length));
|
|
154
177
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
);
|
|
178
|
+
// Filter out any empty buffers to avoid sending invalid image URLs.
|
|
179
|
+
const validImageBytesArray = pdfDocumentImageBytesArray.filter(imageBytes => imageBytes && imageBytes.length > 0);
|
|
180
|
+
const imageAttachments = validImageBytesArray.map(imageBytes => ({
|
|
181
|
+
type: 'image_url',
|
|
182
|
+
image_url: {
|
|
183
|
+
url: 'data:image/png;base64,' + Buffer.from(imageBytes).toString('base64'),
|
|
184
|
+
},
|
|
185
|
+
}));
|
|
164
186
|
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
187
|
+
const chatModel = this.options.chatModel ?? 'gpt-4o';
|
|
188
|
+
const requestParams: any = {
|
|
189
|
+
model: chatModel,
|
|
168
190
|
messages: [
|
|
169
191
|
{ role: 'system', content: optionsArg.systemMessage },
|
|
170
192
|
...optionsArg.messageHistory,
|
|
@@ -172,30 +194,22 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
172
194
|
role: 'user',
|
|
173
195
|
content: [
|
|
174
196
|
{ type: 'text', text: optionsArg.userMessage },
|
|
175
|
-
...
|
|
176
|
-
const returnArray = [];
|
|
177
|
-
for (const imageBytes of pdfDocumentImageBytesArray) {
|
|
178
|
-
returnArray.push({
|
|
179
|
-
type: 'image_url',
|
|
180
|
-
image_url: {
|
|
181
|
-
url: 'data:image/png;base64,' + Buffer.from(imageBytes).toString('base64'),
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
return returnArray;
|
|
186
|
-
})(),
|
|
197
|
+
...imageAttachments,
|
|
187
198
|
],
|
|
188
199
|
},
|
|
189
200
|
],
|
|
190
|
-
}
|
|
201
|
+
};
|
|
202
|
+
// Temperature parameter removed.
|
|
203
|
+
const result = await this.openAiApiClient.chat.completions.create(requestParams);
|
|
191
204
|
return {
|
|
192
205
|
message: result.choices[0].message,
|
|
193
206
|
};
|
|
194
207
|
}
|
|
195
208
|
|
|
196
209
|
public async vision(optionsArg: { image: Buffer; prompt: string }): Promise<string> {
|
|
197
|
-
const
|
|
198
|
-
|
|
210
|
+
const visionModel = this.options.visionModel ?? 'gpt-4o';
|
|
211
|
+
const requestParams: any = {
|
|
212
|
+
model: visionModel,
|
|
199
213
|
messages: [
|
|
200
214
|
{
|
|
201
215
|
role: 'user',
|
|
@@ -211,8 +225,8 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
211
225
|
}
|
|
212
226
|
],
|
|
213
227
|
max_tokens: 300
|
|
214
|
-
}
|
|
215
|
-
|
|
228
|
+
};
|
|
229
|
+
const result = await this.openAiApiClient.chat.completions.create(requestParams);
|
|
216
230
|
return result.choices[0].message.content || '';
|
|
217
231
|
}
|
|
218
|
-
}
|
|
232
|
+
}
|