@push.rocks/smartai 0.0.5 → 0.0.6
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/abstract.classes.multimodal.d.ts +5 -0
- package/dist_ts/abstract.classes.multimodal.js +3 -0
- package/dist_ts/index.d.ts +2 -0
- package/dist_ts/index.js +3 -1
- package/dist_ts/paths.d.ts +2 -0
- package/dist_ts/paths.js +4 -0
- package/dist_ts/plugins.d.ts +10 -0
- package/dist_ts/plugins.js +13 -0
- package/dist_ts/provider.openai.d.ts +17 -0
- package/dist_ts/provider.openai.js +70 -0
- package/package.json +8 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/abstract.classes.multimodal.ts +8 -0
- package/ts/index.ts +3 -1
- package/ts/paths.ts +4 -0
- package/ts/plugins.ts +26 -0
- package/ts/provider.openai.ts +88 -0
- package/ts/smartai.plugins.ts +0 -4
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartai',
|
|
6
|
-
version: '0.0.
|
|
6
|
+
version: '0.0.6',
|
|
7
7
|
description: 'a standardaized interface to talk to AI models'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLGdEQUFnRDtDQUM5RCxDQUFBIn0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export class MultiModal {
|
|
2
|
+
}
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QuY2xhc3Nlcy5tdWx0aW1vZGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvYWJzdHJhY3QuY2xhc3Nlcy5tdWx0aW1vZGFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBZ0IsVUFBVTtDQU8vQiJ9
|
package/dist_ts/index.d.ts
CHANGED
package/dist_ts/index.js
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export * from './smartai.classes.smartai.js';
|
|
2
|
-
|
|
2
|
+
export * from './abstract.classes.multimodal.js';
|
|
3
|
+
export * from './provider.openai.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxzQkFBc0IsQ0FBQyJ9
|
package/dist_ts/paths.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
|
|
3
|
+
export const nogitDir = plugins.path.join(packageDir, './.nogit');
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwSCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
export { path, };
|
|
4
|
+
import * as qenv from '@push.rocks/qenv';
|
|
5
|
+
import * as smartpath from '@push.rocks/smartpath';
|
|
6
|
+
import * as smartpromise from '@push.rocks/smartpromise';
|
|
7
|
+
import * as smartfile from '@push.rocks/smartfile';
|
|
8
|
+
export { qenv, smartpath, smartpromise, smartfile, };
|
|
9
|
+
import * as openai from 'openai';
|
|
10
|
+
export { openai, };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// node native
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
export { path, };
|
|
4
|
+
// @push.rocks scope
|
|
5
|
+
import * as qenv from '@push.rocks/qenv';
|
|
6
|
+
import * as smartpath from '@push.rocks/smartpath';
|
|
7
|
+
import * as smartpromise from '@push.rocks/smartpromise';
|
|
8
|
+
import * as smartfile from '@push.rocks/smartfile';
|
|
9
|
+
export { qenv, smartpath, smartpromise, smartfile, };
|
|
10
|
+
// third party
|
|
11
|
+
import * as openai from 'openai';
|
|
12
|
+
export { openai, };
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxJQUFJLEdBQ0wsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFDTCxJQUFJLEVBQ0osU0FBUyxFQUNULFlBQVksRUFDWixTQUFTLEdBQ1YsQ0FBQTtBQUVELGNBQWM7QUFDZCxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUVqQyxPQUFPLEVBQ0wsTUFBTSxHQUNQLENBQUEifQ==
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { MultiModal } from './abstract.classes.multimodal.js';
|
|
3
|
+
export declare class OpenAiProvider extends MultiModal {
|
|
4
|
+
private openAiToken;
|
|
5
|
+
openAiApiClient: plugins.openai.default;
|
|
6
|
+
constructor(openaiToken: string);
|
|
7
|
+
start(): Promise<void>;
|
|
8
|
+
stop(): Promise<void>;
|
|
9
|
+
chatStream(input: ReadableStream<string>): ReadableStream<string>;
|
|
10
|
+
chat(systemMessage: string, userMessage: string, messageHistory: {
|
|
11
|
+
role: 'assistant' | 'user';
|
|
12
|
+
content: string;
|
|
13
|
+
}[]): Promise<{
|
|
14
|
+
message: import("openai/resources/index.mjs").ChatCompletionMessage;
|
|
15
|
+
}>;
|
|
16
|
+
audio(messageArg: string): Promise<unknown>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as paths from './paths.js';
|
|
3
|
+
import { MultiModal } from './abstract.classes.multimodal.js';
|
|
4
|
+
export class OpenAiProvider extends MultiModal {
|
|
5
|
+
constructor(openaiToken) {
|
|
6
|
+
super();
|
|
7
|
+
this.openAiToken = openaiToken; // Ensure the token is stored
|
|
8
|
+
}
|
|
9
|
+
async start() {
|
|
10
|
+
this.openAiApiClient = new plugins.openai.default({
|
|
11
|
+
apiKey: this.openAiToken,
|
|
12
|
+
dangerouslyAllowBrowser: true,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
async stop() { }
|
|
16
|
+
chatStream(input) {
|
|
17
|
+
const decoder = new TextDecoder();
|
|
18
|
+
let messageHistory = [];
|
|
19
|
+
return new ReadableStream({
|
|
20
|
+
async start(controller) {
|
|
21
|
+
const reader = input.getReader();
|
|
22
|
+
try {
|
|
23
|
+
let done, value;
|
|
24
|
+
while ((({ done, value } = await reader.read()), !done)) {
|
|
25
|
+
const userMessage = decoder.decode(value, { stream: true });
|
|
26
|
+
messageHistory.push({ role: 'user', content: userMessage });
|
|
27
|
+
const aiResponse = await this.chat('', userMessage, messageHistory);
|
|
28
|
+
messageHistory.push({ role: 'assistant', content: aiResponse.message });
|
|
29
|
+
// Directly enqueue the string response instead of encoding it first
|
|
30
|
+
controller.enqueue(aiResponse.message);
|
|
31
|
+
}
|
|
32
|
+
controller.close();
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
controller.error(err);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
// Implementing the synchronous chat interaction
|
|
41
|
+
async chat(systemMessage, userMessage, messageHistory) {
|
|
42
|
+
const result = await this.openAiApiClient.chat.completions.create({
|
|
43
|
+
model: 'gpt-3.5-turbo-16k-0613',
|
|
44
|
+
messages: [
|
|
45
|
+
{ role: 'system', content: systemMessage },
|
|
46
|
+
...messageHistory,
|
|
47
|
+
{ role: 'user', content: userMessage },
|
|
48
|
+
],
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
message: result.choices[0].message,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async audio(messageArg) {
|
|
55
|
+
const done = plugins.smartpromise.defer();
|
|
56
|
+
const result = await this.openAiApiClient.audio.speech.create({
|
|
57
|
+
model: 'tts-1-hd',
|
|
58
|
+
input: messageArg,
|
|
59
|
+
voice: 'nova',
|
|
60
|
+
response_format: 'mp3',
|
|
61
|
+
speed: 1,
|
|
62
|
+
});
|
|
63
|
+
const stream = result.body.pipe(plugins.smartfile.fsStream.createWriteStream(plugins.path.join(paths.nogitDir, 'output.mp3')));
|
|
64
|
+
stream.on('finish', () => {
|
|
65
|
+
done.resolve();
|
|
66
|
+
});
|
|
67
|
+
return done.promise;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIub3BlbmFpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcHJvdmlkZXIub3BlbmFpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUU5RCxNQUFNLE9BQU8sY0FBZSxTQUFRLFVBQVU7SUFJNUMsWUFBWSxXQUFtQjtRQUM3QixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUMsNkJBQTZCO0lBQy9ELENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNoRCxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDeEIsdUJBQXVCLEVBQUUsSUFBSTtTQUM5QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksS0FBSSxDQUFDO0lBRWYsVUFBVSxDQUFDLEtBQTZCO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbEMsSUFBSSxjQUFjLEdBQXNELEVBQUUsQ0FBQztRQUUzRSxPQUFPLElBQUksY0FBYyxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVTtnQkFDcEIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUM7b0JBQ0gsSUFBSSxJQUFJLEVBQUUsS0FBSyxDQUFDO29CQUNoQixPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartai",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "a standardaized interface to talk to AI models",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -16,7 +16,13 @@
|
|
|
16
16
|
"@push.rocks/tapbundle": "^5.0.15",
|
|
17
17
|
"@types/node": "^20.8.7"
|
|
18
18
|
},
|
|
19
|
-
"dependencies": {
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@push.rocks/qenv": "^6.0.5",
|
|
21
|
+
"@push.rocks/smartfile": "^11.0.4",
|
|
22
|
+
"@push.rocks/smartpath": "^5.0.11",
|
|
23
|
+
"@push.rocks/smartpromise": "^4.0.3",
|
|
24
|
+
"openai": "^4.31.0"
|
|
25
|
+
},
|
|
20
26
|
"repository": {
|
|
21
27
|
"type": "git",
|
|
22
28
|
"url": "git+https://code.foss.global/push.rocks/smartai.git"
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export abstract class MultiModal {
|
|
2
|
+
abstract start(): Promise<void>;
|
|
3
|
+
abstract stop(): Promise<void>;
|
|
4
|
+
|
|
5
|
+
// Defines a streaming interface for chat interactions.
|
|
6
|
+
// The implementation will vary based on the specific AI model.
|
|
7
|
+
abstract chatStream(input: ReadableStream<string>): ReadableStream<string>;
|
|
8
|
+
}
|
package/ts/index.ts
CHANGED
package/ts/paths.ts
ADDED
package/ts/plugins.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// node native
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
|
|
4
|
+
export {
|
|
5
|
+
path,
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// @push.rocks scope
|
|
9
|
+
import * as qenv from '@push.rocks/qenv';
|
|
10
|
+
import * as smartpath from '@push.rocks/smartpath';
|
|
11
|
+
import * as smartpromise from '@push.rocks/smartpromise';
|
|
12
|
+
import * as smartfile from '@push.rocks/smartfile';
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
qenv,
|
|
16
|
+
smartpath,
|
|
17
|
+
smartpromise,
|
|
18
|
+
smartfile,
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// third party
|
|
22
|
+
import * as openai from 'openai';
|
|
23
|
+
|
|
24
|
+
export {
|
|
25
|
+
openai,
|
|
26
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as paths from './paths.js';
|
|
3
|
+
|
|
4
|
+
import { MultiModal } from './abstract.classes.multimodal.js';
|
|
5
|
+
|
|
6
|
+
export class OpenAiProvider extends MultiModal {
|
|
7
|
+
private openAiToken: string;
|
|
8
|
+
public openAiApiClient: plugins.openai.default;
|
|
9
|
+
|
|
10
|
+
constructor(openaiToken: string) {
|
|
11
|
+
super();
|
|
12
|
+
this.openAiToken = openaiToken; // Ensure the token is stored
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async start() {
|
|
16
|
+
this.openAiApiClient = new plugins.openai.default({
|
|
17
|
+
apiKey: this.openAiToken,
|
|
18
|
+
dangerouslyAllowBrowser: true,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async stop() {}
|
|
23
|
+
|
|
24
|
+
chatStream(input: ReadableStream<string>): ReadableStream<string> {
|
|
25
|
+
const decoder = new TextDecoder();
|
|
26
|
+
let messageHistory: { role: 'assistant' | 'user'; content: string }[] = [];
|
|
27
|
+
|
|
28
|
+
return new ReadableStream({
|
|
29
|
+
async start(controller) {
|
|
30
|
+
const reader = input.getReader();
|
|
31
|
+
try {
|
|
32
|
+
let done, value;
|
|
33
|
+
while ((({ done, value } = await reader.read()), !done)) {
|
|
34
|
+
const userMessage = decoder.decode(value, { stream: true });
|
|
35
|
+
messageHistory.push({ role: 'user', content: userMessage });
|
|
36
|
+
|
|
37
|
+
const aiResponse = await this.chat('', userMessage, messageHistory);
|
|
38
|
+
messageHistory.push({ role: 'assistant', content: aiResponse.message });
|
|
39
|
+
|
|
40
|
+
// Directly enqueue the string response instead of encoding it first
|
|
41
|
+
controller.enqueue(aiResponse.message);
|
|
42
|
+
}
|
|
43
|
+
controller.close();
|
|
44
|
+
} catch (err) {
|
|
45
|
+
controller.error(err);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Implementing the synchronous chat interaction
|
|
52
|
+
public async chat(
|
|
53
|
+
systemMessage: string,
|
|
54
|
+
userMessage: string,
|
|
55
|
+
messageHistory: {
|
|
56
|
+
role: 'assistant' | 'user';
|
|
57
|
+
content: string;
|
|
58
|
+
}[]
|
|
59
|
+
) {
|
|
60
|
+
const result = await this.openAiApiClient.chat.completions.create({
|
|
61
|
+
model: 'gpt-3.5-turbo-16k-0613',
|
|
62
|
+
messages: [
|
|
63
|
+
{ role: 'system', content: systemMessage },
|
|
64
|
+
...messageHistory,
|
|
65
|
+
{ role: 'user', content: userMessage },
|
|
66
|
+
],
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
message: result.choices[0].message,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public async audio(messageArg: string) {
|
|
74
|
+
const done = plugins.smartpromise.defer();
|
|
75
|
+
const result = await this.openAiApiClient.audio.speech.create({
|
|
76
|
+
model: 'tts-1-hd',
|
|
77
|
+
input: messageArg,
|
|
78
|
+
voice: 'nova',
|
|
79
|
+
response_format: 'mp3',
|
|
80
|
+
speed: 1,
|
|
81
|
+
});
|
|
82
|
+
const stream = result.body.pipe(plugins.smartfile.fsStream.createWriteStream(plugins.path.join(paths.nogitDir, 'output.mp3')));
|
|
83
|
+
stream.on('finish', () => {
|
|
84
|
+
done.resolve();
|
|
85
|
+
});
|
|
86
|
+
return done.promise;
|
|
87
|
+
}
|
|
88
|
+
}
|
package/ts/smartai.plugins.ts
DELETED