@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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartai',
6
- version: '0.3.3',
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb252ZXJzYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNvbnZlcnNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFRdEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2QixTQUFTO0lBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFzQjtRQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFO1lBQ25ELGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxDQUFBLENBQUMsa0NBQWtDO1lBQzlDLENBQUM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxhQUFzQjtRQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7WUFDbkQsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxFQUFFLENBQUEsQ0FBQyxrQ0FBa0M7WUFDOUMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLGFBQXNCO1FBQzdELElBQUks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
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 type { OllamaProvider } from './provider.ollama.js';
3
+ import { OllamaProvider } from './provider.ollama.js';
4
4
  import { OpenAiProvider } from './provider.openai.js';
5
- import type { PerplexityProvider } from './provider.perplexity.js';
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zbWFydGFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFZdEQsTUFBTSxPQUFPLE9BQU87SUFRbEIsWUFBWSxVQUEyQjtRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUM1QixDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUM7Z0JBQ3ZDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7YUFDdEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksaUJBQWlCLENBQUM7Z0JBQzdDLGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWM7YUFDNUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSSxLQUFJLENBQUM7SUFFdEI7O09BRUc7SUFDSCxrQkFBa0IsQ0FBQyxRQUFtQjtRQUNwQyxRQUFRLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLEtBQUssUUFBUTtnQkFDWCxPQUFPLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxLQUFLLFdBQVc7Z0JBQ2QsT0FBTyxZQUFZLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEQsS0FBSyxZQUFZO2dCQUNmLE9BQU8sWUFBWSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pELEtBQUssUUFBUTtnQkFDWCxPQUFPLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QztnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7Q0FDRiJ9
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.3",
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
 
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartai',
6
- version: '0.3.3',
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
  }
@@ -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;
@@ -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 type { OllamaProvider } from './provider.ollama.js';
4
+ import { OllamaProvider } from './provider.ollama.js';
5
5
  import { OpenAiProvider } from './provider.openai.js';
6
- import type { PerplexityProvider } from './provider.perplexity.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';
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
+ }