@theia/ai-llamafile 1.67.0-next.59 → 1.67.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.
|
@@ -1,14 +1,21 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
import { LanguageModelRegistry, LanguageModelStatus } from '@theia/ai-core';
|
|
3
|
+
import { ChildProcessWithoutNullStreams } from 'child_process';
|
|
4
|
+
import { LlamafileLanguageModel } from '../common/llamafile-language-model';
|
|
2
5
|
import { LlamafileManager, LlamafileModelDescription, LlamafileServerManagerClient } from '../common/llamafile-manager';
|
|
3
6
|
export declare class LlamafileManagerImpl implements LlamafileManager {
|
|
4
7
|
protected languageModelRegistry: LanguageModelRegistry;
|
|
5
|
-
protected calculateStatus(started: boolean, message?: string): LanguageModelStatus;
|
|
6
8
|
private processMap;
|
|
7
9
|
private client;
|
|
8
10
|
addLanguageModels(LlamafileModelDescriptions: LlamafileModelDescription[]): Promise<void>;
|
|
9
11
|
removeLanguageModels(modelIds: string[]): void;
|
|
10
12
|
getStartedLlamafiles(): Promise<string[]>;
|
|
11
13
|
startServer(name: string): Promise<void>;
|
|
14
|
+
protected getLlamafileModel(name: string): Promise<LlamafileLanguageModel | undefined>;
|
|
15
|
+
protected spawnLlamafileProcess(llm: LlamafileLanguageModel): ChildProcessWithoutNullStreams;
|
|
16
|
+
protected attachProcessHandlers(name: string, currentProcess: ChildProcessWithoutNullStreams): void;
|
|
17
|
+
protected updateLanguageModelStatus(modelId: string, hasStarted: boolean, message?: string): Promise<void>;
|
|
18
|
+
protected calculateStatus(started: boolean, message?: string): LanguageModelStatus;
|
|
12
19
|
stopServer(name: string): void;
|
|
13
20
|
isStarted(name: string): boolean;
|
|
14
21
|
setClient(client: LlamafileServerManagerClient): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llamafile-manager-impl.d.ts","sourceRoot":"","sources":["../../src/node/llamafile-manager-impl.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"llamafile-manager-impl.d.ts","sourceRoot":"","sources":["../../src/node/llamafile-manager-impl.ts"],"names":[],"mappings":";AAeA,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,8BAA8B,EAAS,MAAM,eAAe,CAAC;AAGtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAExH,qBACa,oBAAqB,YAAW,gBAAgB;IAGzD,SAAS,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAEvD,OAAO,CAAC,UAAU,CAA0D;IAC5E,OAAO,CAAC,MAAM,CAA+B;IAEvC,iBAAiB,CAAC,0BAA0B,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB/F,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAKxC,oBAAoB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAgB9B,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC;IAK5F,SAAS,CAAC,qBAAqB,CAAC,GAAG,EAAE,sBAAsB,GAAG,8BAA8B;IAO5F,SAAS,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,8BAA8B,GAAG,IAAI;cAwBnF,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhH,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAQlF,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAU9B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,SAAS,CAAC,MAAM,EAAE,4BAA4B,GAAG,IAAI;CAIxD"}
|
|
@@ -27,14 +27,6 @@ let LlamafileManagerImpl = class LlamafileManagerImpl {
|
|
|
27
27
|
constructor() {
|
|
28
28
|
this.processMap = new Map();
|
|
29
29
|
}
|
|
30
|
-
calculateStatus(started, message) {
|
|
31
|
-
if (started) {
|
|
32
|
-
return { status: 'ready' };
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
return { status: 'unavailable', message: message || 'Llamafile server is not running' };
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
30
|
async addLanguageModels(LlamafileModelDescriptions) {
|
|
39
31
|
for (const llamafile of LlamafileModelDescriptions) {
|
|
40
32
|
const model = await this.languageModelRegistry.getLanguageModel(llamafile.name);
|
|
@@ -64,40 +56,60 @@ let LlamafileManagerImpl = class LlamafileManagerImpl {
|
|
|
64
56
|
return models.filter(model => model instanceof llamafile_language_model_1.LlamafileLanguageModel && this.isStarted(model.name)).map(model => model.id);
|
|
65
57
|
}
|
|
66
58
|
async startServer(name) {
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
59
|
+
if (this.processMap.has(name)) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const llm = await this.getLlamafileModel(name);
|
|
63
|
+
if (!llm) {
|
|
64
|
+
return Promise.reject(`Llamafile ${name} not found`);
|
|
65
|
+
}
|
|
66
|
+
const currentProcess = this.spawnLlamafileProcess(llm);
|
|
67
|
+
this.processMap.set(name, currentProcess);
|
|
68
|
+
await this.updateLanguageModelStatus(name, true);
|
|
69
|
+
this.attachProcessHandlers(name, currentProcess);
|
|
70
|
+
}
|
|
71
|
+
async getLlamafileModel(name) {
|
|
72
|
+
const models = await this.languageModelRegistry.getLanguageModels();
|
|
73
|
+
return models.find(model => model.id === name && model instanceof llamafile_language_model_1.LlamafileLanguageModel);
|
|
74
|
+
}
|
|
75
|
+
spawnLlamafileProcess(llm) {
|
|
76
|
+
const filePath = (0, url_1.fileURLToPath)(llm.uri);
|
|
77
|
+
const dir = (0, path_1.dirname)(filePath);
|
|
78
|
+
const fileName = (0, path_1.basename)(filePath);
|
|
79
|
+
return (0, child_process_1.spawn)(`./${fileName}`, ['--port', '' + llm.port, '--server', '--nobrowser'], { cwd: dir });
|
|
80
|
+
}
|
|
81
|
+
attachProcessHandlers(name, currentProcess) {
|
|
82
|
+
currentProcess.stdout.on('data', (data) => {
|
|
83
|
+
this.client.log(name, data.toString());
|
|
84
|
+
});
|
|
85
|
+
currentProcess.stderr.on('data', (data) => {
|
|
86
|
+
this.client.error(name, data.toString());
|
|
87
|
+
});
|
|
88
|
+
currentProcess.on('close', code => {
|
|
89
|
+
this.client.log(name, `LlamaFile process for file ${name} exited with code ${code}`);
|
|
90
|
+
this.processMap.delete(name);
|
|
91
|
+
// Set status to 'unavailable' when server stops
|
|
92
|
+
this.updateLanguageModelStatus(name, false);
|
|
93
|
+
});
|
|
94
|
+
currentProcess.on('error', error => {
|
|
95
|
+
this.client.error(name, `Error starting LlamaFile process for file ${name}: ${error.message}`);
|
|
96
|
+
this.processMap.delete(name);
|
|
97
|
+
// Set status to 'unavailable' on error
|
|
98
|
+
this.updateLanguageModelStatus(name, false, error.message);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async updateLanguageModelStatus(modelId, hasStarted, message) {
|
|
102
|
+
const status = this.calculateStatus(hasStarted, message);
|
|
103
|
+
await this.languageModelRegistry.patchLanguageModel(modelId, {
|
|
104
|
+
status
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
calculateStatus(started, message) {
|
|
108
|
+
if (started) {
|
|
109
|
+
return { status: 'ready' };
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
return { status: 'unavailable', message: message || 'Llamafile server is not running' };
|
|
101
113
|
}
|
|
102
114
|
}
|
|
103
115
|
stopServer(name) {
|
|
@@ -106,11 +118,7 @@ let LlamafileManagerImpl = class LlamafileManagerImpl {
|
|
|
106
118
|
currentProcess.kill();
|
|
107
119
|
this.processMap.delete(name);
|
|
108
120
|
// Set status to 'unavailable' when server is stopped
|
|
109
|
-
this.
|
|
110
|
-
if (model && model instanceof llamafile_language_model_1.LlamafileLanguageModel) {
|
|
111
|
-
model.status = { status: 'unavailable' };
|
|
112
|
-
}
|
|
113
|
-
});
|
|
121
|
+
this.updateLanguageModelStatus(name, false);
|
|
114
122
|
}
|
|
115
123
|
}
|
|
116
124
|
isStarted(name) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llamafile-manager-impl.js","sourceRoot":"","sources":["../../src/node/llamafile-manager-impl.ts"],"names":[],"mappings":";;;;AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,4CAA4E;AAC5E,4DAAkE;AAClE,iDAAsE;AACtE,+BAAyC;AACzC,6BAAoC;AACpC,iFAA4E;AAIrE,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAA1B;
|
|
1
|
+
{"version":3,"file":"llamafile-manager-impl.js","sourceRoot":"","sources":["../../src/node/llamafile-manager-impl.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-llamafile",
|
|
3
|
-
"version": "1.67.0
|
|
3
|
+
"version": "1.67.0",
|
|
4
4
|
"description": "Theia - Llamafile Integration",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/ai-core": "1.67.0
|
|
7
|
-
"@theia/core": "1.67.0
|
|
8
|
-
"@theia/output": "1.67.0
|
|
6
|
+
"@theia/ai-core": "1.67.0",
|
|
7
|
+
"@theia/core": "1.67.0",
|
|
8
|
+
"@theia/output": "1.67.0",
|
|
9
9
|
"tslib": "^2.6.2"
|
|
10
10
|
},
|
|
11
11
|
"publishConfig": {
|
|
@@ -42,10 +42,10 @@
|
|
|
42
42
|
"watch": "theiaext watch"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@theia/ext-scripts": "1.
|
|
45
|
+
"@theia/ext-scripts": "1.67.0"
|
|
46
46
|
},
|
|
47
47
|
"nyc": {
|
|
48
48
|
"extends": "../../configs/nyc.json"
|
|
49
49
|
},
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "541860e34f1351442be3a1c998fb618472afcefd"
|
|
51
51
|
}
|
|
@@ -27,14 +27,6 @@ export class LlamafileManagerImpl implements LlamafileManager {
|
|
|
27
27
|
@inject(LanguageModelRegistry)
|
|
28
28
|
protected languageModelRegistry: LanguageModelRegistry;
|
|
29
29
|
|
|
30
|
-
protected calculateStatus(started: boolean, message?: string): LanguageModelStatus {
|
|
31
|
-
if (started) {
|
|
32
|
-
return { status: 'ready' };
|
|
33
|
-
} else {
|
|
34
|
-
return { status: 'unavailable', message: message || 'Llamafile server is not running' };
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
30
|
private processMap: Map<string, ChildProcessWithoutNullStreams> = new Map();
|
|
39
31
|
private client: LlamafileServerManagerClient;
|
|
40
32
|
|
|
@@ -73,43 +65,69 @@ export class LlamafileManagerImpl implements LlamafileManager {
|
|
|
73
65
|
}
|
|
74
66
|
|
|
75
67
|
async startServer(name: string): Promise<void> {
|
|
76
|
-
if (
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
68
|
+
if (this.processMap.has(name)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const llm = await this.getLlamafileModel(name);
|
|
73
|
+
if (!llm) {
|
|
74
|
+
return Promise.reject(`Llamafile ${name} not found`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const currentProcess = this.spawnLlamafileProcess(llm);
|
|
78
|
+
this.processMap.set(name, currentProcess);
|
|
79
|
+
await this.updateLanguageModelStatus(name, true);
|
|
80
|
+
this.attachProcessHandlers(name, currentProcess);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
protected async getLlamafileModel(name: string): Promise<LlamafileLanguageModel | undefined> {
|
|
84
|
+
const models = await this.languageModelRegistry.getLanguageModels();
|
|
85
|
+
return models.find(model => model.id === name && model instanceof LlamafileLanguageModel) as LlamafileLanguageModel | undefined;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
protected spawnLlamafileProcess(llm: LlamafileLanguageModel): ChildProcessWithoutNullStreams {
|
|
89
|
+
const filePath = fileURLToPath(llm.uri);
|
|
90
|
+
const dir = dirname(filePath);
|
|
91
|
+
const fileName = basename(filePath);
|
|
92
|
+
return spawn(`./${fileName}`, ['--port', '' + llm.port, '--server', '--nobrowser'], { cwd: dir });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
protected attachProcessHandlers(name: string, currentProcess: ChildProcessWithoutNullStreams): void {
|
|
96
|
+
currentProcess.stdout.on('data', (data: Buffer) => {
|
|
97
|
+
this.client.log(name, data.toString());
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
currentProcess.stderr.on('data', (data: Buffer) => {
|
|
101
|
+
this.client.error(name, data.toString());
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
currentProcess.on('close', code => {
|
|
105
|
+
this.client.log(name, `LlamaFile process for file ${name} exited with code ${code}`);
|
|
106
|
+
this.processMap.delete(name);
|
|
107
|
+
// Set status to 'unavailable' when server stops
|
|
108
|
+
this.updateLanguageModelStatus(name, false);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
currentProcess.on('error', error => {
|
|
112
|
+
this.client.error(name, `Error starting LlamaFile process for file ${name}: ${error.message}`);
|
|
113
|
+
this.processMap.delete(name);
|
|
114
|
+
// Set status to 'unavailable' on error
|
|
115
|
+
this.updateLanguageModelStatus(name, false, error.message);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
protected async updateLanguageModelStatus(modelId: string, hasStarted: boolean, message?: string): Promise<void> {
|
|
120
|
+
const status: LanguageModelStatus = this.calculateStatus(hasStarted, message);
|
|
121
|
+
await this.languageModelRegistry.patchLanguageModel<LlamafileLanguageModel>(modelId, {
|
|
122
|
+
status
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
protected calculateStatus(started: boolean, message?: string): LanguageModelStatus {
|
|
127
|
+
if (started) {
|
|
128
|
+
return { status: 'ready' };
|
|
129
|
+
} else {
|
|
130
|
+
return { status: 'unavailable', message: message || 'Llamafile server is not running' };
|
|
113
131
|
}
|
|
114
132
|
}
|
|
115
133
|
|
|
@@ -119,11 +137,7 @@ export class LlamafileManagerImpl implements LlamafileManager {
|
|
|
119
137
|
currentProcess!.kill();
|
|
120
138
|
this.processMap.delete(name);
|
|
121
139
|
// Set status to 'unavailable' when server is stopped
|
|
122
|
-
this.
|
|
123
|
-
if (model && model instanceof LlamafileLanguageModel) {
|
|
124
|
-
model.status = { status: 'unavailable' };
|
|
125
|
-
}
|
|
126
|
-
});
|
|
140
|
+
this.updateLanguageModelStatus(name, false);
|
|
127
141
|
}
|
|
128
142
|
}
|
|
129
143
|
|