@push.rocks/smartai 0.3.2 → 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 +24 -10
- 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
|
|
|
@@ -308,24 +325,21 @@ Contributions are welcome! Please follow these steps:
|
|
|
308
325
|
```
|
|
309
326
|
5. Open a Pull Request with a detailed description of your changes.
|
|
310
327
|
|
|
311
|
-
## License
|
|
328
|
+
## License and Legal Information
|
|
312
329
|
|
|
313
|
-
This
|
|
330
|
+
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
|
|
314
331
|
|
|
315
|
-
|
|
332
|
+
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
|
|
316
333
|
|
|
317
334
|
### Trademarks
|
|
318
335
|
|
|
319
|
-
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and
|
|
336
|
+
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
|
|
320
337
|
|
|
321
338
|
### Company Information
|
|
322
339
|
|
|
323
340
|
Task Venture Capital GmbH
|
|
324
|
-
Registered at District
|
|
325
|
-
Contact: hello@task.vc
|
|
326
|
-
|
|
327
|
-
By using this repository, you agree to the terms outlined in this section.
|
|
341
|
+
Registered at District court Bremen HRB 35230 HB, Germany
|
|
328
342
|
|
|
329
|
-
|
|
343
|
+
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
|
|
330
344
|
|
|
331
|
-
|
|
345
|
+
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|
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
|
+
}
|