@push.rocks/smartai 0.5.4 → 0.5.8
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/abstract.classes.multimodal.d.ts +8 -2
- package/dist_ts/abstract.classes.multimodal.js +19 -1
- package/dist_ts/classes.smartai.js +24 -2
- package/dist_ts/provider.anthropic.js +6 -4
- package/dist_ts/provider.ollama.js +6 -4
- package/dist_ts/provider.openai.d.ts +1 -2
- package/dist_ts/provider.openai.js +9 -8
- package/dist_ts/provider.xai.d.ts +0 -1
- package/dist_ts/provider.xai.js +5 -3
- package/package.json +23 -16
- package/readme.md +374 -121
- package/ts/abstract.classes.multimodal.ts +17 -2
- package/ts/classes.smartai.ts +23 -1
- package/ts/provider.anthropic.ts +5 -3
- package/ts/provider.ollama.ts +5 -3
- package/ts/provider.openai.ts +8 -8
- package/ts/provider.xai.ts +4 -3
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
1
2
|
/**
|
|
2
3
|
* Message format for chat interactions
|
|
3
4
|
*/
|
|
@@ -25,16 +26,21 @@ export interface ChatResponse {
|
|
|
25
26
|
* Provides a common interface for different AI providers (OpenAI, Anthropic, Perplexity, Ollama)
|
|
26
27
|
*/
|
|
27
28
|
export declare abstract class MultiModalModel {
|
|
29
|
+
/**
|
|
30
|
+
* SmartPdf instance for document processing
|
|
31
|
+
* Shared across all methods that need PDF functionality
|
|
32
|
+
*/
|
|
33
|
+
protected smartpdfInstance: plugins.smartpdf.SmartPdf;
|
|
28
34
|
/**
|
|
29
35
|
* Initializes the model and any necessary resources
|
|
30
36
|
* Should be called before using any other methods
|
|
31
37
|
*/
|
|
32
|
-
|
|
38
|
+
start(): Promise<void>;
|
|
33
39
|
/**
|
|
34
40
|
* Cleans up any resources used by the model
|
|
35
41
|
* Should be called when the model is no longer needed
|
|
36
42
|
*/
|
|
37
|
-
|
|
43
|
+
stop(): Promise<void>;
|
|
38
44
|
/**
|
|
39
45
|
* Synchronous chat interaction with the model
|
|
40
46
|
* @param optionsArg Options containing system message, user message, and message history
|
|
@@ -1,7 +1,25 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
1
2
|
/**
|
|
2
3
|
* Abstract base class for multi-modal AI models.
|
|
3
4
|
* Provides a common interface for different AI providers (OpenAI, Anthropic, Perplexity, Ollama)
|
|
4
5
|
*/
|
|
5
6
|
export class MultiModalModel {
|
|
7
|
+
/**
|
|
8
|
+
* Initializes the model and any necessary resources
|
|
9
|
+
* Should be called before using any other methods
|
|
10
|
+
*/
|
|
11
|
+
async start() {
|
|
12
|
+
this.smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
13
|
+
await this.smartpdfInstance.start();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Cleans up any resources used by the model
|
|
17
|
+
* Should be called when the model is no longer needed
|
|
18
|
+
*/
|
|
19
|
+
async stop() {
|
|
20
|
+
if (this.smartpdfInstance) {
|
|
21
|
+
await this.smartpdfInstance.stop();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
6
24
|
}
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QuY2xhc3Nlcy5tdWx0aW1vZGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvYWJzdHJhY3QuY2xhc3Nlcy5tdWx0aW1vZGFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBMkJ4Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQWdCLGVBQWU7SUFPbkM7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN4RCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0NBNkNGIn0=
|
|
@@ -58,7 +58,29 @@ export class SmartAi {
|
|
|
58
58
|
await this.exoProvider.start();
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
-
async stop() {
|
|
61
|
+
async stop() {
|
|
62
|
+
if (this.openaiProvider) {
|
|
63
|
+
await this.openaiProvider.stop();
|
|
64
|
+
}
|
|
65
|
+
if (this.anthropicProvider) {
|
|
66
|
+
await this.anthropicProvider.stop();
|
|
67
|
+
}
|
|
68
|
+
if (this.perplexityProvider) {
|
|
69
|
+
await this.perplexityProvider.stop();
|
|
70
|
+
}
|
|
71
|
+
if (this.groqProvider) {
|
|
72
|
+
await this.groqProvider.stop();
|
|
73
|
+
}
|
|
74
|
+
if (this.xaiProvider) {
|
|
75
|
+
await this.xaiProvider.stop();
|
|
76
|
+
}
|
|
77
|
+
if (this.ollamaProvider) {
|
|
78
|
+
await this.ollamaProvider.stop();
|
|
79
|
+
}
|
|
80
|
+
if (this.exoProvider) {
|
|
81
|
+
await this.exoProvider.stop();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
62
84
|
/**
|
|
63
85
|
* create a new conversation
|
|
64
86
|
*/
|
|
@@ -83,4 +105,4 @@ export class SmartAi {
|
|
|
83
105
|
}
|
|
84
106
|
}
|
|
85
107
|
}
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zbWFydGFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBc0JoRCxNQUFNLE9BQU8sT0FBTztJQVdsQixZQUFZLFVBQTJCO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0lBQzVCLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQztnQkFDdkMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVzthQUN0QyxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQztnQkFDN0MsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYzthQUM1QyxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixDQUFDO2dCQUMvQyxlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlO2FBQzlDLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQztnQkFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUzthQUNsQyxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDO2dCQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO2FBQ2hDLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUM7Z0JBQ3ZDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDaEMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVc7YUFDN0MsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQztnQkFDakMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU87Z0JBQ3BDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNO2FBQ2hDLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUFDLFFBQW1CO1FBQ3BDLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDakIsS0FBSyxLQUFLO2dCQUNSLE9BQU8sWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQyxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsS0FBSyxXQUFXO2dCQUNkLE9BQU8sWUFBWSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELEtBQUssWUFBWTtnQkFDZixPQUFPLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsS0FBSyxNQUFNO2dCQUNULE9BQU8sWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
@@ -7,11 +7,14 @@ export class AnthropicProvider extends MultiModalModel {
|
|
|
7
7
|
this.options = optionsArg; // Ensure the token is stored
|
|
8
8
|
}
|
|
9
9
|
async start() {
|
|
10
|
+
await super.start();
|
|
10
11
|
this.anthropicApiClient = new plugins.anthropic.default({
|
|
11
12
|
apiKey: this.options.anthropicToken,
|
|
12
13
|
});
|
|
13
14
|
}
|
|
14
|
-
async stop() {
|
|
15
|
+
async stop() {
|
|
16
|
+
await super.stop();
|
|
17
|
+
}
|
|
15
18
|
async chatStream(input) {
|
|
16
19
|
// Create a TextDecoder to handle incoming chunks
|
|
17
20
|
const decoder = new TextDecoder();
|
|
@@ -142,10 +145,9 @@ export class AnthropicProvider extends MultiModalModel {
|
|
|
142
145
|
}
|
|
143
146
|
async document(optionsArg) {
|
|
144
147
|
// Convert PDF documents to images using SmartPDF
|
|
145
|
-
const smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
146
148
|
let documentImageBytesArray = [];
|
|
147
149
|
for (const pdfDocument of optionsArg.pdfDocuments) {
|
|
148
|
-
const documentImageArray = await smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
150
|
+
const documentImageArray = await this.smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
149
151
|
documentImageBytesArray = documentImageBytesArray.concat(documentImageArray);
|
|
150
152
|
}
|
|
151
153
|
// Convert message history to Anthropic format
|
|
@@ -195,4 +197,4 @@ export class AnthropicProvider extends MultiModalModel {
|
|
|
195
197
|
};
|
|
196
198
|
}
|
|
197
199
|
}
|
|
198
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuYW50aHJvcGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIuYW50aHJvcGljLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVVuRSxNQUFNLE9BQU8saUJBQWtCLFNBQVEsZUFBZTtJQUlwRCxZQUFZLFVBQXFDO1FBQy9DLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUEsQ0FBQyw2QkFBNkI7SUFDekQsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDdEQsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYztTQUNwQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFpQztRQUN2RCxpREFBaUQ7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxjQUFjLEdBQThDLElBQUksQ0FBQztRQUVyRSxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQXFCO1lBQ3hELEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVU7Z0JBQy9CLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUss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
|
|
@@ -10,6 +10,7 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
10
10
|
this.visionModel = optionsArg.visionModel || 'llava';
|
|
11
11
|
}
|
|
12
12
|
async start() {
|
|
13
|
+
await super.start();
|
|
13
14
|
// Verify Ollama is running
|
|
14
15
|
try {
|
|
15
16
|
const response = await fetch(`${this.baseUrl}/api/tags`);
|
|
@@ -21,7 +22,9 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
21
22
|
throw new Error(`Failed to connect to Ollama server at ${this.baseUrl}: ${error.message}`);
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
|
-
async stop() {
|
|
25
|
+
async stop() {
|
|
26
|
+
await super.stop();
|
|
27
|
+
}
|
|
25
28
|
async chatStream(input) {
|
|
26
29
|
// Create a TextDecoder to handle incoming chunks
|
|
27
30
|
const decoder = new TextDecoder();
|
|
@@ -169,10 +172,9 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
169
172
|
}
|
|
170
173
|
async document(optionsArg) {
|
|
171
174
|
// Convert PDF documents to images using SmartPDF
|
|
172
|
-
const smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
173
175
|
let documentImageBytesArray = [];
|
|
174
176
|
for (const pdfDocument of optionsArg.pdfDocuments) {
|
|
175
|
-
const documentImageArray = await smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
177
|
+
const documentImageArray = await this.smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
176
178
|
documentImageBytesArray = documentImageBytesArray.concat(documentImageArray);
|
|
177
179
|
}
|
|
178
180
|
// Convert images to base64
|
|
@@ -209,4 +211,4 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
209
211
|
};
|
|
210
212
|
}
|
|
211
213
|
}
|
|
212
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIub2xsYW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIub2xsYW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVNuRSxNQUFNLE9BQU8sY0FBZSxTQUFRLGVBQWU7SUFNakQsWUFBWSxhQUFxQyxFQUFFO1FBQ2pELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxJQUFJLHdCQUF3QixDQUFDO1FBQzlELElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQztJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQiwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxXQUFXLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3RixDQUFD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
|
|
@@ -13,7 +13,6 @@ export interface IOpenaiProviderOptions {
|
|
|
13
13
|
export declare class OpenAiProvider extends MultiModalModel {
|
|
14
14
|
private options;
|
|
15
15
|
openAiApiClient: plugins.openai.default;
|
|
16
|
-
smartpdfInstance: plugins.smartpdf.SmartPdf;
|
|
17
16
|
constructor(optionsArg: IOpenaiProviderOptions);
|
|
18
17
|
start(): Promise<void>;
|
|
19
18
|
stop(): Promise<void>;
|
|
@@ -41,7 +40,7 @@ export declare class OpenAiProvider extends MultiModalModel {
|
|
|
41
40
|
content: any;
|
|
42
41
|
}[];
|
|
43
42
|
}): Promise<{
|
|
44
|
-
message:
|
|
43
|
+
message: plugins.openai.OpenAI.Chat.Completions.ChatCompletionMessage;
|
|
45
44
|
}>;
|
|
46
45
|
vision(optionsArg: {
|
|
47
46
|
image: Buffer;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import * as paths from './paths.js';
|
|
3
|
+
import { Readable } from 'stream';
|
|
3
4
|
import { MultiModalModel } from './abstract.classes.multimodal.js';
|
|
4
5
|
export class OpenAiProvider extends MultiModalModel {
|
|
5
6
|
constructor(optionsArg) {
|
|
@@ -7,13 +8,15 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
7
8
|
this.options = optionsArg;
|
|
8
9
|
}
|
|
9
10
|
async start() {
|
|
11
|
+
await super.start();
|
|
10
12
|
this.openAiApiClient = new plugins.openai.default({
|
|
11
13
|
apiKey: this.options.openaiToken,
|
|
12
14
|
dangerouslyAllowBrowser: true,
|
|
13
15
|
});
|
|
14
|
-
this.smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
15
16
|
}
|
|
16
|
-
async stop() {
|
|
17
|
+
async stop() {
|
|
18
|
+
await super.stop();
|
|
19
|
+
}
|
|
17
20
|
async chatStream(input) {
|
|
18
21
|
// Create a TextDecoder to handle incoming chunks
|
|
19
22
|
const decoder = new TextDecoder();
|
|
@@ -109,19 +112,17 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
109
112
|
speed: 1,
|
|
110
113
|
});
|
|
111
114
|
const stream = result.body;
|
|
112
|
-
|
|
115
|
+
const nodeStream = Readable.fromWeb(stream);
|
|
116
|
+
done.resolve(nodeStream);
|
|
113
117
|
return done.promise;
|
|
114
118
|
}
|
|
115
119
|
async document(optionsArg) {
|
|
116
120
|
let pdfDocumentImageBytesArray = [];
|
|
117
121
|
// Convert each PDF into one or more image byte arrays.
|
|
118
|
-
const smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
119
|
-
await smartpdfInstance.start();
|
|
120
122
|
for (const pdfDocument of optionsArg.pdfDocuments) {
|
|
121
|
-
const documentImageArray = await smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
123
|
+
const documentImageArray = await this.smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
122
124
|
pdfDocumentImageBytesArray = pdfDocumentImageBytesArray.concat(documentImageArray);
|
|
123
125
|
}
|
|
124
|
-
await smartpdfInstance.stop();
|
|
125
126
|
console.log(`image smartfile array`);
|
|
126
127
|
console.log(pdfDocumentImageBytesArray.map((smartfile) => smartfile.length));
|
|
127
128
|
// Filter out any empty buffers to avoid sending invalid image URLs.
|
|
@@ -177,4 +178,4 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
177
178
|
return result.choices[0].message.content || '';
|
|
178
179
|
}
|
|
179
180
|
}
|
|
180
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIub3BlbmFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIub3BlbmFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFRbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBVW5FLE1BQU0sT0FBTyxjQUFlLFNBQVEsZUFBZTtJQUlqRCxZQUFZLFVBQWtDO1FBQzVDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7SUFDNUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNoRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ2hDLHVCQUF1QixFQUFFLElBQUk7U0FDOUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVNLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBaUM7UUFDdkQsaURBQWlEO1FBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbEMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksY0FBYyxHQUdQLElBQUksQ0FBQztRQUVoQixnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQXFCO1lBQ3hELFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUs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
|
|
@@ -6,7 +6,6 @@ export interface IXAIProviderOptions {
|
|
|
6
6
|
export declare class XAIProvider extends MultiModalModel {
|
|
7
7
|
private options;
|
|
8
8
|
openAiApiClient: plugins.openai.default;
|
|
9
|
-
smartpdfInstance: plugins.smartpdf.SmartPdf;
|
|
10
9
|
constructor(optionsArg: IXAIProviderOptions);
|
|
11
10
|
start(): Promise<void>;
|
|
12
11
|
stop(): Promise<void>;
|
package/dist_ts/provider.xai.js
CHANGED
|
@@ -7,13 +7,15 @@ export class XAIProvider extends MultiModalModel {
|
|
|
7
7
|
this.options = optionsArg;
|
|
8
8
|
}
|
|
9
9
|
async start() {
|
|
10
|
+
await super.start();
|
|
10
11
|
this.openAiApiClient = new plugins.openai.default({
|
|
11
12
|
apiKey: this.options.xaiToken,
|
|
12
13
|
baseURL: 'https://api.x.ai/v1',
|
|
13
14
|
});
|
|
14
|
-
this.smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
15
15
|
}
|
|
16
|
-
async stop() {
|
|
16
|
+
async stop() {
|
|
17
|
+
await super.stop();
|
|
18
|
+
}
|
|
17
19
|
async chatStream(input) {
|
|
18
20
|
// Create a TextDecoder to handle incoming chunks
|
|
19
21
|
const decoder = new TextDecoder();
|
|
@@ -138,4 +140,4 @@ export class XAIProvider extends MultiModalModel {
|
|
|
138
140
|
};
|
|
139
141
|
}
|
|
140
142
|
}
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIueGFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIueGFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVFuRSxNQUFNLE9BQU8sV0FBWSxTQUFRLGVBQWU7SUFJOUMsWUFBWSxVQUErQjtRQUN6QyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0lBQzVCLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDaEQsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtZQUM3QixPQUFPLEVBQUUscUJBQXFCO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSTtRQUNmLE1BQU0sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQWlDO1FBQ3ZELGlEQUFpRDtRQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLGNBQWMsR0FBOEMsSUFBSSxDQUFDO1FBRXJFLGdEQUFnRDtRQUNoRCxNQUFNLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBcUI7WUFDeEQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVTtnQkFDL0IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFF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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartai",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.8",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -8,25 +8,30 @@
|
|
|
8
8
|
"type": "module",
|
|
9
9
|
"author": "Task Venture Capital GmbH",
|
|
10
10
|
"license": "MIT",
|
|
11
|
+
"scripts": {
|
|
12
|
+
"test": "(tstest test/ --web --verbose)",
|
|
13
|
+
"build": "(tsbuild --web --allowimplicitany)",
|
|
14
|
+
"buildDocs": "(tsdoc)"
|
|
15
|
+
},
|
|
11
16
|
"devDependencies": {
|
|
12
|
-
"@git.zone/tsbuild": "^2.
|
|
13
|
-
"@git.zone/tsbundle": "^2.
|
|
17
|
+
"@git.zone/tsbuild": "^2.6.4",
|
|
18
|
+
"@git.zone/tsbundle": "^2.5.1",
|
|
14
19
|
"@git.zone/tsrun": "^1.3.3",
|
|
15
|
-
"@git.zone/tstest": "^
|
|
20
|
+
"@git.zone/tstest": "^2.3.2",
|
|
16
21
|
"@push.rocks/qenv": "^6.1.0",
|
|
17
22
|
"@push.rocks/tapbundle": "^6.0.3",
|
|
18
23
|
"@types/node": "^22.15.17"
|
|
19
24
|
},
|
|
20
25
|
"dependencies": {
|
|
21
|
-
"@anthropic-ai/sdk": "^0.
|
|
26
|
+
"@anthropic-ai/sdk": "^0.57.0",
|
|
22
27
|
"@push.rocks/smartarray": "^1.1.0",
|
|
23
|
-
"@push.rocks/smartfile": "^11.2.
|
|
24
|
-
"@push.rocks/smartpath": "^
|
|
25
|
-
"@push.rocks/smartpdf": "^3.
|
|
28
|
+
"@push.rocks/smartfile": "^11.2.5",
|
|
29
|
+
"@push.rocks/smartpath": "^6.0.0",
|
|
30
|
+
"@push.rocks/smartpdf": "^3.3.0",
|
|
26
31
|
"@push.rocks/smartpromise": "^4.2.3",
|
|
27
|
-
"@push.rocks/smartrequest": "^2.1
|
|
32
|
+
"@push.rocks/smartrequest": "^4.2.1",
|
|
28
33
|
"@push.rocks/webstream": "^1.0.10",
|
|
29
|
-
"openai": "^
|
|
34
|
+
"openai": "^5.11.0"
|
|
30
35
|
},
|
|
31
36
|
"repository": {
|
|
32
37
|
"type": "git",
|
|
@@ -75,9 +80,11 @@
|
|
|
75
80
|
"AI toolkit",
|
|
76
81
|
"provider switching"
|
|
77
82
|
],
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
83
|
+
"pnpm": {
|
|
84
|
+
"onlyBuiltDependencies": [
|
|
85
|
+
"esbuild",
|
|
86
|
+
"puppeteer"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
"packageManager": "pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6"
|
|
90
|
+
}
|
package/readme.md
CHANGED
|
@@ -1,189 +1,269 @@
|
|
|
1
1
|
# @push.rocks/smartai
|
|
2
|
+
**One API to rule them all** 🚀
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
[](https://www.npmjs.com/package/@push.rocks/smartai)
|
|
5
|
+
[](https://www.typescriptlang.org/)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
SmartAI unifies the world's leading AI providers - OpenAI, Anthropic, Perplexity, Ollama, Groq, XAI, and Exo - under a single, elegant TypeScript interface. Build AI applications at lightning speed without vendor lock-in.
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
## 🎯 Why SmartAI?
|
|
11
|
+
|
|
12
|
+
- **🔌 Universal Interface**: Write once, run with any AI provider. Switch between GPT-4, Claude, Llama, or Grok with a single line change.
|
|
13
|
+
- **🛡️ Type-Safe**: Full TypeScript support with comprehensive type definitions for all operations
|
|
14
|
+
- **🌊 Streaming First**: Built for real-time applications with native streaming support
|
|
15
|
+
- **🎨 Multi-Modal**: Seamlessly work with text, images, audio, and documents
|
|
16
|
+
- **🏠 Local & Cloud**: Support for both cloud providers and local models via Ollama
|
|
17
|
+
- **⚡ Zero Lock-In**: Your code remains portable across all AI providers
|
|
18
|
+
|
|
19
|
+
## 🚀 Quick Start
|
|
8
20
|
|
|
9
21
|
```bash
|
|
10
22
|
npm install @push.rocks/smartai
|
|
11
23
|
```
|
|
12
24
|
|
|
13
|
-
This command will add the SmartAi library to your project's dependencies, making it available for use in your TypeScript application.
|
|
14
|
-
|
|
15
|
-
## Usage
|
|
16
|
-
|
|
17
|
-
SmartAi is designed to provide a comprehensive and unified API for working seamlessly with multiple AI providers like OpenAI, Anthropic, Perplexity, and others. Below we will delve into how to make the most out of this library, illustrating the setup and functionality with in-depth examples. Our scenarios will explore synchronous and streaming interactions, audio generation, document handling, and vision tasks with different AI providers.
|
|
18
|
-
|
|
19
|
-
### Initialization
|
|
20
|
-
|
|
21
|
-
Initialization is the first step before using any AI functionalities. You should provide API tokens for each provider you plan to utilize.
|
|
22
|
-
|
|
23
25
|
```typescript
|
|
24
26
|
import { SmartAi } from '@push.rocks/smartai';
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
xaiToken: 'your-xai-token',
|
|
31
|
-
groqToken: 'your-groq-token',
|
|
32
|
-
ollama: {
|
|
33
|
-
baseUrl: 'http://localhost:11434',
|
|
34
|
-
model: 'llama2',
|
|
35
|
-
visionModel: 'llava'
|
|
36
|
-
},
|
|
37
|
-
exo: {
|
|
38
|
-
baseUrl: 'http://localhost:8080/v1',
|
|
39
|
-
apiKey: 'your-api-key'
|
|
40
|
-
}
|
|
28
|
+
// Initialize with your favorite providers
|
|
29
|
+
const ai = new SmartAi({
|
|
30
|
+
openaiToken: 'sk-...',
|
|
31
|
+
anthropicToken: 'sk-ant-...'
|
|
41
32
|
});
|
|
42
33
|
|
|
43
|
-
await
|
|
34
|
+
await ai.start();
|
|
35
|
+
|
|
36
|
+
// Same API, multiple providers
|
|
37
|
+
const response = await ai.openaiProvider.chat({
|
|
38
|
+
systemMessage: 'You are a helpful assistant.',
|
|
39
|
+
userMessage: 'Explain quantum computing in simple terms',
|
|
40
|
+
messageHistory: []
|
|
41
|
+
});
|
|
44
42
|
```
|
|
45
43
|
|
|
46
|
-
|
|
44
|
+
## 📊 Provider Capabilities Matrix
|
|
45
|
+
|
|
46
|
+
Choose the right provider for your use case:
|
|
47
|
+
|
|
48
|
+
| Provider | Chat | Streaming | TTS | Vision | Documents | Highlights |
|
|
49
|
+
|----------|:----:|:---------:|:---:|:------:|:---------:|------------|
|
|
50
|
+
| **OpenAI** | ✅ | ✅ | ✅ | ✅ | ✅ | • GPT-4, DALL-E 3<br>• Industry standard<br>• Most features |
|
|
51
|
+
| **Anthropic** | ✅ | ✅ | ❌ | ✅ | ✅ | • Claude 3 Opus<br>• Superior reasoning<br>• 200k context |
|
|
52
|
+
| **Ollama** | ✅ | ✅ | ❌ | ✅ | ✅ | • 100% local<br>• Privacy-first<br>• No API costs |
|
|
53
|
+
| **XAI** | ✅ | ✅ | ❌ | ❌ | ✅ | • Grok models<br>• Real-time data<br>• Uncensored |
|
|
54
|
+
| **Perplexity** | ✅ | ✅ | ❌ | ❌ | ❌ | • Web-aware<br>• Research-focused<br>• Citations |
|
|
55
|
+
| **Groq** | ✅ | ✅ | ❌ | ❌ | ❌ | • 10x faster<br>• LPU inference<br>• Low latency |
|
|
56
|
+
| **Exo** | ✅ | ✅ | ❌ | ❌ | ❌ | • Distributed<br>• P2P compute<br>• Decentralized |
|
|
47
57
|
|
|
48
|
-
|
|
58
|
+
## 🎮 Core Features
|
|
49
59
|
|
|
50
|
-
|
|
60
|
+
### 💬 Universal Chat Interface
|
|
51
61
|
|
|
52
|
-
|
|
62
|
+
Works identically across all providers:
|
|
53
63
|
|
|
54
64
|
```typescript
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
65
|
+
// Use GPT-4 for complex reasoning
|
|
66
|
+
const gptResponse = await ai.openaiProvider.chat({
|
|
67
|
+
systemMessage: 'You are a expert physicist.',
|
|
68
|
+
userMessage: 'Explain the implications of quantum entanglement',
|
|
69
|
+
messageHistory: []
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Use Claude for safety-critical applications
|
|
73
|
+
const claudeResponse = await ai.anthropicProvider.chat({
|
|
74
|
+
systemMessage: 'You are a medical advisor.',
|
|
75
|
+
userMessage: 'Review this patient data for concerns',
|
|
76
|
+
messageHistory: []
|
|
59
77
|
});
|
|
60
78
|
|
|
61
|
-
|
|
79
|
+
// Use Groq for lightning-fast responses
|
|
80
|
+
const groqResponse = await ai.groqProvider.chat({
|
|
81
|
+
systemMessage: 'You are a code reviewer.',
|
|
82
|
+
userMessage: 'Quick! Find the bug in this code: ...',
|
|
83
|
+
messageHistory: []
|
|
84
|
+
});
|
|
62
85
|
```
|
|
63
86
|
|
|
64
|
-
|
|
87
|
+
### 🌊 Real-Time Streaming
|
|
65
88
|
|
|
66
|
-
|
|
89
|
+
Build responsive chat interfaces with token-by-token streaming:
|
|
67
90
|
|
|
68
91
|
```typescript
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
// Establish a transform stream
|
|
73
|
-
const { writable, readable } = new TransformStream();
|
|
74
|
-
const writer = writable.getWriter();
|
|
75
|
-
|
|
76
|
-
const message = {
|
|
77
|
-
role: 'user',
|
|
78
|
-
content: 'Tell me a story about a brave knight'
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
writer.write(textEncoder.encode(JSON.stringify(message) + '\n'));
|
|
82
|
-
|
|
83
|
-
// Initiate streaming
|
|
84
|
-
const stream = await smartAi.openaiProvider.chatStream(readable);
|
|
92
|
+
// Create a chat stream
|
|
93
|
+
const stream = await ai.openaiProvider.chatStream(inputStream);
|
|
85
94
|
const reader = stream.getReader();
|
|
86
95
|
|
|
96
|
+
// Display responses as they arrive
|
|
87
97
|
while (true) {
|
|
88
98
|
const { done, value } = await reader.read();
|
|
89
99
|
if (done) break;
|
|
90
|
-
|
|
100
|
+
|
|
101
|
+
// Update UI in real-time
|
|
102
|
+
process.stdout.write(value);
|
|
91
103
|
}
|
|
92
104
|
```
|
|
93
105
|
|
|
94
|
-
###
|
|
106
|
+
### 🎙️ Text-to-Speech
|
|
95
107
|
|
|
96
|
-
|
|
108
|
+
Generate natural voices with OpenAI:
|
|
97
109
|
|
|
98
110
|
```typescript
|
|
99
|
-
const audioStream = await
|
|
100
|
-
message: '
|
|
111
|
+
const audioStream = await ai.openaiProvider.audio({
|
|
112
|
+
message: 'Welcome to the future of AI development!'
|
|
101
113
|
});
|
|
102
114
|
|
|
103
|
-
//
|
|
115
|
+
// Stream directly to speakers
|
|
116
|
+
audioStream.pipe(speakerOutput);
|
|
117
|
+
|
|
118
|
+
// Or save to file
|
|
119
|
+
audioStream.pipe(fs.createWriteStream('welcome.mp3'));
|
|
104
120
|
```
|
|
105
121
|
|
|
106
|
-
###
|
|
122
|
+
### 👁️ Vision Analysis
|
|
107
123
|
|
|
108
|
-
|
|
124
|
+
Understand images with multiple providers:
|
|
109
125
|
|
|
110
126
|
```typescript
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
127
|
+
const image = fs.readFileSync('product-photo.jpg');
|
|
128
|
+
|
|
129
|
+
// OpenAI: General purpose vision
|
|
130
|
+
const gptVision = await ai.openaiProvider.vision({
|
|
131
|
+
image,
|
|
132
|
+
prompt: 'Describe this product and suggest marketing angles'
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// Anthropic: Detailed analysis
|
|
136
|
+
const claudeVision = await ai.anthropicProvider.vision({
|
|
137
|
+
image,
|
|
138
|
+
prompt: 'Identify any safety concerns or defects'
|
|
117
139
|
});
|
|
118
140
|
|
|
119
|
-
|
|
141
|
+
// Ollama: Private, local analysis
|
|
142
|
+
const ollamaVision = await ai.ollamaProvider.vision({
|
|
143
|
+
image,
|
|
144
|
+
prompt: 'Extract all text and categorize the content'
|
|
145
|
+
});
|
|
120
146
|
```
|
|
121
147
|
|
|
122
|
-
|
|
148
|
+
### 📄 Document Intelligence
|
|
149
|
+
|
|
150
|
+
Extract insights from PDFs with AI:
|
|
123
151
|
|
|
124
152
|
```typescript
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
153
|
+
const contract = fs.readFileSync('contract.pdf');
|
|
154
|
+
const invoice = fs.readFileSync('invoice.pdf');
|
|
155
|
+
|
|
156
|
+
// Analyze documents
|
|
157
|
+
const analysis = await ai.openaiProvider.document({
|
|
158
|
+
systemMessage: 'You are a legal expert.',
|
|
159
|
+
userMessage: 'Compare these documents and highlight key differences',
|
|
128
160
|
messageHistory: [],
|
|
129
|
-
pdfDocuments: [
|
|
161
|
+
pdfDocuments: [contract, invoice]
|
|
130
162
|
});
|
|
131
163
|
|
|
132
|
-
|
|
164
|
+
// Multi-document analysis
|
|
165
|
+
const taxDocs = [form1099, w2, receipts];
|
|
166
|
+
const taxAnalysis = await ai.anthropicProvider.document({
|
|
167
|
+
systemMessage: 'You are a tax advisor.',
|
|
168
|
+
userMessage: 'Prepare a tax summary from these documents',
|
|
169
|
+
messageHistory: [],
|
|
170
|
+
pdfDocuments: taxDocs
|
|
171
|
+
});
|
|
133
172
|
```
|
|
134
173
|
|
|
135
|
-
###
|
|
174
|
+
### 🔄 Persistent Conversations
|
|
136
175
|
|
|
137
|
-
|
|
176
|
+
Maintain context across interactions:
|
|
138
177
|
|
|
139
178
|
```typescript
|
|
140
|
-
|
|
179
|
+
// Create a coding assistant conversation
|
|
180
|
+
const assistant = ai.createConversation('openai');
|
|
181
|
+
await assistant.setSystemMessage('You are an expert TypeScript developer.');
|
|
141
182
|
|
|
142
|
-
//
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
prompt: 'Describe the image.'
|
|
146
|
-
});
|
|
183
|
+
// First question
|
|
184
|
+
const inputWriter = assistant.getInputStreamWriter();
|
|
185
|
+
await inputWriter.write('How do I implement a singleton pattern?');
|
|
147
186
|
|
|
148
|
-
|
|
187
|
+
// Continue the conversation
|
|
188
|
+
await inputWriter.write('Now show me how to make it thread-safe');
|
|
189
|
+
|
|
190
|
+
// The assistant remembers the entire context
|
|
149
191
|
```
|
|
150
192
|
|
|
151
|
-
|
|
193
|
+
## 🚀 Real-World Examples
|
|
194
|
+
|
|
195
|
+
### Build a Customer Support Bot
|
|
152
196
|
|
|
153
197
|
```typescript
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
prompt: 'Detailed analysis required.'
|
|
198
|
+
const supportBot = new SmartAi({
|
|
199
|
+
anthropicToken: process.env.ANTHROPIC_KEY // Claude for empathetic responses
|
|
157
200
|
});
|
|
158
201
|
|
|
159
|
-
|
|
202
|
+
async function handleCustomerQuery(query: string, history: ChatMessage[]) {
|
|
203
|
+
try {
|
|
204
|
+
const response = await supportBot.anthropicProvider.chat({
|
|
205
|
+
systemMessage: `You are a helpful customer support agent.
|
|
206
|
+
Be empathetic, professional, and solution-oriented.`,
|
|
207
|
+
userMessage: query,
|
|
208
|
+
messageHistory: history
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
return response.message;
|
|
212
|
+
} catch (error) {
|
|
213
|
+
// Fallback to another provider if needed
|
|
214
|
+
return await supportBot.openaiProvider.chat({...});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
160
217
|
```
|
|
161
218
|
|
|
162
|
-
###
|
|
163
|
-
|
|
164
|
-
Due to the nature of external integrations, ensure to wrap AI calls within try-catch blocks.
|
|
219
|
+
### Create a Code Review Assistant
|
|
165
220
|
|
|
166
221
|
```typescript
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
222
|
+
const codeReviewer = new SmartAi({
|
|
223
|
+
groqToken: process.env.GROQ_KEY // Groq for speed
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
async function reviewCode(code: string, language: string) {
|
|
227
|
+
const startTime = Date.now();
|
|
228
|
+
|
|
229
|
+
const review = await codeReviewer.groqProvider.chat({
|
|
230
|
+
systemMessage: `You are a ${language} expert. Review code for:
|
|
231
|
+
- Security vulnerabilities
|
|
232
|
+
- Performance issues
|
|
233
|
+
- Best practices
|
|
234
|
+
- Potential bugs`,
|
|
235
|
+
userMessage: `Review this code:\n\n${code}`,
|
|
171
236
|
messageHistory: []
|
|
172
237
|
});
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
238
|
+
|
|
239
|
+
console.log(`Review completed in ${Date.now() - startTime}ms`);
|
|
240
|
+
return review.message;
|
|
176
241
|
}
|
|
177
242
|
```
|
|
178
243
|
|
|
179
|
-
###
|
|
244
|
+
### Build a Research Assistant
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
const researcher = new SmartAi({
|
|
248
|
+
perplexityToken: process.env.PERPLEXITY_KEY
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
async function research(topic: string) {
|
|
252
|
+
// Perplexity excels at web-aware research
|
|
253
|
+
const findings = await researcher.perplexityProvider.chat({
|
|
254
|
+
systemMessage: 'You are a research assistant. Provide factual, cited information.',
|
|
255
|
+
userMessage: `Research the latest developments in ${topic}`,
|
|
256
|
+
messageHistory: []
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
return findings.message;
|
|
260
|
+
}
|
|
261
|
+
```
|
|
180
262
|
|
|
181
|
-
|
|
263
|
+
### Local AI for Sensitive Data
|
|
182
264
|
|
|
183
265
|
```typescript
|
|
184
|
-
const
|
|
185
|
-
openaiToken: 'your-openai-token',
|
|
186
|
-
anthropicToken: 'your-anthropic-token',
|
|
266
|
+
const localAI = new SmartAi({
|
|
187
267
|
ollama: {
|
|
188
268
|
baseUrl: 'http://localhost:11434',
|
|
189
269
|
model: 'llama2',
|
|
@@ -191,32 +271,205 @@ const smartAi = new SmartAi({
|
|
|
191
271
|
}
|
|
192
272
|
});
|
|
193
273
|
|
|
194
|
-
|
|
274
|
+
// Process sensitive documents without leaving your infrastructure
|
|
275
|
+
async function analyzeSensitiveDoc(pdfBuffer: Buffer) {
|
|
276
|
+
const analysis = await localAI.ollamaProvider.document({
|
|
277
|
+
systemMessage: 'Extract and summarize key information.',
|
|
278
|
+
userMessage: 'Analyze this confidential document',
|
|
279
|
+
messageHistory: [],
|
|
280
|
+
pdfDocuments: [pdfBuffer]
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
// Data never leaves your servers
|
|
284
|
+
return analysis.message;
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## ⚡ Performance Tips
|
|
289
|
+
|
|
290
|
+
### 1. Provider Selection Strategy
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
class SmartAIRouter {
|
|
294
|
+
constructor(private ai: SmartAi) {}
|
|
295
|
+
|
|
296
|
+
async query(message: string, requirements: {
|
|
297
|
+
speed?: boolean;
|
|
298
|
+
accuracy?: boolean;
|
|
299
|
+
cost?: boolean;
|
|
300
|
+
privacy?: boolean;
|
|
301
|
+
}) {
|
|
302
|
+
if (requirements.privacy) {
|
|
303
|
+
return this.ai.ollamaProvider.chat({...}); // Local only
|
|
304
|
+
}
|
|
305
|
+
if (requirements.speed) {
|
|
306
|
+
return this.ai.groqProvider.chat({...}); // 10x faster
|
|
307
|
+
}
|
|
308
|
+
if (requirements.accuracy) {
|
|
309
|
+
return this.ai.anthropicProvider.chat({...}); // Best reasoning
|
|
310
|
+
}
|
|
311
|
+
// Default fallback
|
|
312
|
+
return this.ai.openaiProvider.chat({...});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### 2. Streaming for Large Responses
|
|
318
|
+
|
|
319
|
+
```typescript
|
|
320
|
+
// Don't wait for the entire response
|
|
321
|
+
async function streamResponse(userQuery: string) {
|
|
322
|
+
const stream = await ai.openaiProvider.chatStream(createInputStream(userQuery));
|
|
323
|
+
|
|
324
|
+
// Process tokens as they arrive
|
|
325
|
+
for await (const chunk of stream) {
|
|
326
|
+
updateUI(chunk); // Immediate feedback
|
|
327
|
+
await processChunk(chunk); // Parallel processing
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### 3. Parallel Multi-Provider Queries
|
|
333
|
+
|
|
334
|
+
```typescript
|
|
335
|
+
// Get the best answer from multiple AIs
|
|
336
|
+
async function consensusQuery(question: string) {
|
|
337
|
+
const providers = [
|
|
338
|
+
ai.openaiProvider.chat({...}),
|
|
339
|
+
ai.anthropicProvider.chat({...}),
|
|
340
|
+
ai.perplexityProvider.chat({...})
|
|
341
|
+
];
|
|
342
|
+
|
|
343
|
+
const responses = await Promise.all(providers);
|
|
344
|
+
return synthesizeResponses(responses);
|
|
345
|
+
}
|
|
195
346
|
```
|
|
196
347
|
|
|
197
|
-
|
|
348
|
+
## 🛠️ Advanced Features
|
|
198
349
|
|
|
199
|
-
|
|
350
|
+
### Custom Streaming Transformations
|
|
200
351
|
|
|
201
352
|
```typescript
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
353
|
+
// Add real-time translation
|
|
354
|
+
const translationStream = new TransformStream({
|
|
355
|
+
async transform(chunk, controller) {
|
|
356
|
+
const translated = await translateChunk(chunk);
|
|
357
|
+
controller.enqueue(translated);
|
|
206
358
|
}
|
|
207
359
|
});
|
|
208
360
|
|
|
209
|
-
const
|
|
210
|
-
const
|
|
361
|
+
const responseStream = await ai.openaiProvider.chatStream(input);
|
|
362
|
+
const translatedStream = responseStream.pipeThrough(translationStream);
|
|
363
|
+
```
|
|
211
364
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
365
|
+
### Error Handling & Fallbacks
|
|
366
|
+
|
|
367
|
+
```typescript
|
|
368
|
+
class ResilientAI {
|
|
369
|
+
private providers = ['openai', 'anthropic', 'groq'];
|
|
370
|
+
|
|
371
|
+
async query(opts: ChatOptions): Promise<ChatResponse> {
|
|
372
|
+
for (const provider of this.providers) {
|
|
373
|
+
try {
|
|
374
|
+
return await this.ai[`${provider}Provider`].chat(opts);
|
|
375
|
+
} catch (error) {
|
|
376
|
+
console.warn(`${provider} failed, trying next...`);
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
throw new Error('All providers failed');
|
|
381
|
+
}
|
|
216
382
|
}
|
|
217
383
|
```
|
|
218
384
|
|
|
219
|
-
|
|
385
|
+
### Token Counting & Cost Management
|
|
386
|
+
|
|
387
|
+
```typescript
|
|
388
|
+
// Track usage across providers
|
|
389
|
+
class UsageTracker {
|
|
390
|
+
async trackedChat(provider: string, options: ChatOptions) {
|
|
391
|
+
const start = Date.now();
|
|
392
|
+
const response = await ai[`${provider}Provider`].chat(options);
|
|
393
|
+
|
|
394
|
+
const usage = {
|
|
395
|
+
provider,
|
|
396
|
+
duration: Date.now() - start,
|
|
397
|
+
inputTokens: estimateTokens(options),
|
|
398
|
+
outputTokens: estimateTokens(response.message)
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
await this.logUsage(usage);
|
|
402
|
+
return response;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
## 📦 Installation & Setup
|
|
408
|
+
|
|
409
|
+
### Prerequisites
|
|
410
|
+
|
|
411
|
+
- Node.js 16+
|
|
412
|
+
- TypeScript 4.5+
|
|
413
|
+
- API keys for your chosen providers
|
|
414
|
+
|
|
415
|
+
### Environment Setup
|
|
416
|
+
|
|
417
|
+
```bash
|
|
418
|
+
# Install
|
|
419
|
+
npm install @push.rocks/smartai
|
|
420
|
+
|
|
421
|
+
# Set up environment variables
|
|
422
|
+
export OPENAI_API_KEY=sk-...
|
|
423
|
+
export ANTHROPIC_API_KEY=sk-ant-...
|
|
424
|
+
export PERPLEXITY_API_KEY=pplx-...
|
|
425
|
+
# ... etc
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### TypeScript Configuration
|
|
429
|
+
|
|
430
|
+
```json
|
|
431
|
+
{
|
|
432
|
+
"compilerOptions": {
|
|
433
|
+
"target": "ES2022",
|
|
434
|
+
"module": "NodeNext",
|
|
435
|
+
"lib": ["ES2022"],
|
|
436
|
+
"strict": true,
|
|
437
|
+
"esModuleInterop": true,
|
|
438
|
+
"skipLibCheck": true
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
## 🎯 Choosing the Right Provider
|
|
444
|
+
|
|
445
|
+
| Use Case | Recommended Provider | Why |
|
|
446
|
+
|----------|---------------------|-----|
|
|
447
|
+
| **General Purpose** | OpenAI | Most features, stable, well-documented |
|
|
448
|
+
| **Complex Reasoning** | Anthropic | Superior logical thinking, safer outputs |
|
|
449
|
+
| **Research & Facts** | Perplexity | Web-aware, provides citations |
|
|
450
|
+
| **Speed Critical** | Groq | 10x faster inference, sub-second responses |
|
|
451
|
+
| **Privacy Critical** | Ollama | 100% local, no data leaves your servers |
|
|
452
|
+
| **Real-time Data** | XAI | Access to current information |
|
|
453
|
+
| **Cost Sensitive** | Ollama/Exo | Free (local) or distributed compute |
|
|
454
|
+
|
|
455
|
+
## 🤝 Contributing
|
|
456
|
+
|
|
457
|
+
SmartAI is open source and welcomes contributions! Visit our [GitHub repository](https://code.foss.global/push.rocks/smartai) to:
|
|
458
|
+
|
|
459
|
+
- Report issues
|
|
460
|
+
- Submit pull requests
|
|
461
|
+
- Request features
|
|
462
|
+
- Join discussions
|
|
463
|
+
|
|
464
|
+
## 📈 Roadmap
|
|
465
|
+
|
|
466
|
+
- [ ] Streaming function calls
|
|
467
|
+
- [ ] Image generation support
|
|
468
|
+
- [ ] Voice input processing
|
|
469
|
+
- [ ] Fine-tuning integration
|
|
470
|
+
- [ ] Embedding support
|
|
471
|
+
- [ ] Agent framework
|
|
472
|
+
- [ ] More providers (Cohere, AI21, etc.)
|
|
220
473
|
|
|
221
474
|
## License and Legal Information
|
|
222
475
|
|
|
@@ -235,4 +488,4 @@ Registered at District court Bremen HRB 35230 HB, Germany
|
|
|
235
488
|
|
|
236
489
|
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
|
|
237
490
|
|
|
238
|
-
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.
|
|
491
|
+
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.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Message format for chat interactions
|
|
3
5
|
*/
|
|
@@ -28,17 +30,30 @@ export interface ChatResponse {
|
|
|
28
30
|
* Provides a common interface for different AI providers (OpenAI, Anthropic, Perplexity, Ollama)
|
|
29
31
|
*/
|
|
30
32
|
export abstract class MultiModalModel {
|
|
33
|
+
/**
|
|
34
|
+
* SmartPdf instance for document processing
|
|
35
|
+
* Shared across all methods that need PDF functionality
|
|
36
|
+
*/
|
|
37
|
+
protected smartpdfInstance: plugins.smartpdf.SmartPdf;
|
|
38
|
+
|
|
31
39
|
/**
|
|
32
40
|
* Initializes the model and any necessary resources
|
|
33
41
|
* Should be called before using any other methods
|
|
34
42
|
*/
|
|
35
|
-
|
|
43
|
+
public async start(): Promise<void> {
|
|
44
|
+
this.smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
45
|
+
await this.smartpdfInstance.start();
|
|
46
|
+
}
|
|
36
47
|
|
|
37
48
|
/**
|
|
38
49
|
* Cleans up any resources used by the model
|
|
39
50
|
* Should be called when the model is no longer needed
|
|
40
51
|
*/
|
|
41
|
-
|
|
52
|
+
public async stop(): Promise<void> {
|
|
53
|
+
if (this.smartpdfInstance) {
|
|
54
|
+
await this.smartpdfInstance.stop();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
42
57
|
|
|
43
58
|
/**
|
|
44
59
|
* Synchronous chat interaction with the model
|
package/ts/classes.smartai.ts
CHANGED
|
@@ -91,7 +91,29 @@ export class SmartAi {
|
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
public async stop() {
|
|
94
|
+
public async stop() {
|
|
95
|
+
if (this.openaiProvider) {
|
|
96
|
+
await this.openaiProvider.stop();
|
|
97
|
+
}
|
|
98
|
+
if (this.anthropicProvider) {
|
|
99
|
+
await this.anthropicProvider.stop();
|
|
100
|
+
}
|
|
101
|
+
if (this.perplexityProvider) {
|
|
102
|
+
await this.perplexityProvider.stop();
|
|
103
|
+
}
|
|
104
|
+
if (this.groqProvider) {
|
|
105
|
+
await this.groqProvider.stop();
|
|
106
|
+
}
|
|
107
|
+
if (this.xaiProvider) {
|
|
108
|
+
await this.xaiProvider.stop();
|
|
109
|
+
}
|
|
110
|
+
if (this.ollamaProvider) {
|
|
111
|
+
await this.ollamaProvider.stop();
|
|
112
|
+
}
|
|
113
|
+
if (this.exoProvider) {
|
|
114
|
+
await this.exoProvider.stop();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
95
117
|
|
|
96
118
|
/**
|
|
97
119
|
* create a new conversation
|
package/ts/provider.anthropic.ts
CHANGED
|
@@ -20,12 +20,15 @@ export class AnthropicProvider extends MultiModalModel {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
async start() {
|
|
23
|
+
await super.start();
|
|
23
24
|
this.anthropicApiClient = new plugins.anthropic.default({
|
|
24
25
|
apiKey: this.options.anthropicToken,
|
|
25
26
|
});
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
async stop() {
|
|
29
|
+
async stop() {
|
|
30
|
+
await super.stop();
|
|
31
|
+
}
|
|
29
32
|
|
|
30
33
|
public async chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>> {
|
|
31
34
|
// Create a TextDecoder to handle incoming chunks
|
|
@@ -178,11 +181,10 @@ export class AnthropicProvider extends MultiModalModel {
|
|
|
178
181
|
messageHistory: ChatMessage[];
|
|
179
182
|
}): Promise<{ message: any }> {
|
|
180
183
|
// Convert PDF documents to images using SmartPDF
|
|
181
|
-
const smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
182
184
|
let documentImageBytesArray: Uint8Array[] = [];
|
|
183
185
|
|
|
184
186
|
for (const pdfDocument of optionsArg.pdfDocuments) {
|
|
185
|
-
const documentImageArray = await smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
187
|
+
const documentImageArray = await this.smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
186
188
|
documentImageBytesArray = documentImageBytesArray.concat(documentImageArray);
|
|
187
189
|
}
|
|
188
190
|
|
package/ts/provider.ollama.ts
CHANGED
|
@@ -24,6 +24,7 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
async start() {
|
|
27
|
+
await super.start();
|
|
27
28
|
// Verify Ollama is running
|
|
28
29
|
try {
|
|
29
30
|
const response = await fetch(`${this.baseUrl}/api/tags`);
|
|
@@ -35,7 +36,9 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
async stop() {
|
|
39
|
+
async stop() {
|
|
40
|
+
await super.stop();
|
|
41
|
+
}
|
|
39
42
|
|
|
40
43
|
public async chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>> {
|
|
41
44
|
// Create a TextDecoder to handle incoming chunks
|
|
@@ -205,11 +208,10 @@ export class OllamaProvider extends MultiModalModel {
|
|
|
205
208
|
messageHistory: ChatMessage[];
|
|
206
209
|
}): Promise<{ message: any }> {
|
|
207
210
|
// Convert PDF documents to images using SmartPDF
|
|
208
|
-
const smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
209
211
|
let documentImageBytesArray: Uint8Array[] = [];
|
|
210
212
|
|
|
211
213
|
for (const pdfDocument of optionsArg.pdfDocuments) {
|
|
212
|
-
const documentImageArray = await smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
214
|
+
const documentImageArray = await this.smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
213
215
|
documentImageBytesArray = documentImageBytesArray.concat(documentImageArray);
|
|
214
216
|
}
|
|
215
217
|
|
package/ts/provider.openai.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import * as paths from './paths.js';
|
|
3
|
+
import { Readable } from 'stream';
|
|
3
4
|
|
|
4
5
|
// Custom type definition for chat completion messages
|
|
5
6
|
export type TChatCompletionRequestMessage = {
|
|
@@ -20,7 +21,6 @@ export interface IOpenaiProviderOptions {
|
|
|
20
21
|
export class OpenAiProvider extends MultiModalModel {
|
|
21
22
|
private options: IOpenaiProviderOptions;
|
|
22
23
|
public openAiApiClient: plugins.openai.default;
|
|
23
|
-
public smartpdfInstance: plugins.smartpdf.SmartPdf;
|
|
24
24
|
|
|
25
25
|
constructor(optionsArg: IOpenaiProviderOptions) {
|
|
26
26
|
super();
|
|
@@ -28,14 +28,16 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
public async start() {
|
|
31
|
+
await super.start();
|
|
31
32
|
this.openAiApiClient = new plugins.openai.default({
|
|
32
33
|
apiKey: this.options.openaiToken,
|
|
33
34
|
dangerouslyAllowBrowser: true,
|
|
34
35
|
});
|
|
35
|
-
this.smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
public async stop() {
|
|
38
|
+
public async stop() {
|
|
39
|
+
await super.stop();
|
|
40
|
+
}
|
|
39
41
|
|
|
40
42
|
public async chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>> {
|
|
41
43
|
// Create a TextDecoder to handle incoming chunks
|
|
@@ -148,7 +150,8 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
148
150
|
speed: 1,
|
|
149
151
|
});
|
|
150
152
|
const stream = result.body;
|
|
151
|
-
|
|
153
|
+
const nodeStream = Readable.fromWeb(stream as any);
|
|
154
|
+
done.resolve(nodeStream);
|
|
152
155
|
return done.promise;
|
|
153
156
|
}
|
|
154
157
|
|
|
@@ -164,13 +167,10 @@ export class OpenAiProvider extends MultiModalModel {
|
|
|
164
167
|
let pdfDocumentImageBytesArray: Uint8Array[] = [];
|
|
165
168
|
|
|
166
169
|
// Convert each PDF into one or more image byte arrays.
|
|
167
|
-
const smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
168
|
-
await smartpdfInstance.start();
|
|
169
170
|
for (const pdfDocument of optionsArg.pdfDocuments) {
|
|
170
|
-
const documentImageArray = await smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
171
|
+
const documentImageArray = await this.smartpdfInstance.convertPDFToPngBytes(pdfDocument);
|
|
171
172
|
pdfDocumentImageBytesArray = pdfDocumentImageBytesArray.concat(documentImageArray);
|
|
172
173
|
}
|
|
173
|
-
await smartpdfInstance.stop();
|
|
174
174
|
|
|
175
175
|
console.log(`image smartfile array`);
|
|
176
176
|
console.log(pdfDocumentImageBytesArray.map((smartfile) => smartfile.length));
|
package/ts/provider.xai.ts
CHANGED
|
@@ -11,7 +11,6 @@ export interface IXAIProviderOptions {
|
|
|
11
11
|
export class XAIProvider extends MultiModalModel {
|
|
12
12
|
private options: IXAIProviderOptions;
|
|
13
13
|
public openAiApiClient: plugins.openai.default;
|
|
14
|
-
public smartpdfInstance: plugins.smartpdf.SmartPdf;
|
|
15
14
|
|
|
16
15
|
constructor(optionsArg: IXAIProviderOptions) {
|
|
17
16
|
super();
|
|
@@ -19,14 +18,16 @@ export class XAIProvider extends MultiModalModel {
|
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
public async start() {
|
|
21
|
+
await super.start();
|
|
22
22
|
this.openAiApiClient = new plugins.openai.default({
|
|
23
23
|
apiKey: this.options.xaiToken,
|
|
24
24
|
baseURL: 'https://api.x.ai/v1',
|
|
25
25
|
});
|
|
26
|
-
this.smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
public async stop() {
|
|
28
|
+
public async stop() {
|
|
29
|
+
await super.stop();
|
|
30
|
+
}
|
|
30
31
|
|
|
31
32
|
public async chatStream(input: ReadableStream<Uint8Array>): Promise<ReadableStream<string>> {
|
|
32
33
|
// Create a TextDecoder to handle incoming chunks
|