@push.rocks/smartai 0.3.3 → 0.4.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 +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/package.json +1 -1
- 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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartai',
|
|
6
|
-
version: '0.
|
|
6
|
+
version: '0.4.0',
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb252ZXJzYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNvbnZlcnNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFRdEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2QixTQUFTO0lBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFzQjtRQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFO1lBQ25ELGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxDQUFBLENBQUMsa0NBQWtDO1lBQzlDLENBQUM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxhQUFzQjtRQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7WUFDbkQsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxFQUFFLENBQUEsQ0FBQyxrQ0FBa0M7WUFDOUMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLGFBQXNCO1FBQzdELElBQUks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
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zbWFydGFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBc0JoRCxNQUFNLE9BQU8sT0FBTztJQVdsQixZQUFZLFVBQTJCO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0lBQzVCLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQztnQkFDdkMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVzthQUN0QyxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQztnQkFDN0MsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYzthQUM1QyxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixDQUFDO2dCQUMvQyxlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlO2FBQzlDLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQztnQkFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUzthQUNsQyxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDO2dCQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO2FBQ2hDLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUM7Z0JBQ3ZDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDaEMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVc7YUFDN0MsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQztnQkFDakMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU87Z0JBQ3BDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNO2FBQ2hDLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLEtBQUksQ0FBQztJQUV0Qjs7T0FFRztJQUNILGtCQUFrQixDQUFDLFFBQW1CO1FBQ3BDLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDakIsS0FBSyxLQUFLO2dCQUNSLE9BQU8sWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQyxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsS0FBSyxXQUFXO2dCQUNkLE9BQU8sWUFBWSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELEtBQUssWUFBWTtnQkFDZixPQUFPLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsS0FBSyxNQUFNO2dCQUNULE9BQU8sWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
@@ -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
|
+
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 = 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuZXhvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIuZXhvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVNuRSxNQUFNLE9BQU8sV0FBWSxTQUFRLGVBQWU7SUFJOUMsWUFBWSxhQUFrQyxFQUFFO1FBQzlDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFVBQVUsRUFBRSwwQkFBMEIsRUFBRywyQkFBMkI7WUFDcEUsR0FBRyxVQUFVO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDaEQsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLFlBQVksRUFBRyx3REFBd0Q7WUFDdEcsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUksS0FBSSxDQUFDO0lBRWYsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFpQztRQUN2RCxpREFBaUQ7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxjQUFjLEdBQThDLElBQUksQ0FBQztRQUVyRSxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQXFCO1lBQ3hELEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVU7Z0JBQy9CLE1BQU0sSUFBSSxPQUFPLENB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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.0",
|
|
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",
|
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
|
+
async transform(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
|
+
}
|