@theia/ai-llamafile 1.67.0-next.59 → 1.67.0-next.86

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;AAM5E,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAExH,qBACa,oBAAqB,YAAW,gBAAgB;IAGzD,SAAS,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAEvD,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAQlF,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;IAyC9C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAc9B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,SAAS,CAAC,MAAM,EAAE,4BAA4B,GAAG,IAAI;CAIxD"}
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 (!this.processMap.has(name)) {
68
- const models = await this.languageModelRegistry.getLanguageModels();
69
- const llm = models.find(model => model.id === name && model instanceof llamafile_language_model_1.LlamafileLanguageModel);
70
- if (llm === undefined) {
71
- return Promise.reject(`Llamafile ${name} not found`);
72
- }
73
- const filePath = (0, url_1.fileURLToPath)(llm.uri);
74
- // Extract the directory and file name
75
- const dir = (0, path_1.dirname)(filePath);
76
- const fileName = (0, path_1.basename)(filePath);
77
- const currentProcess = (0, child_process_1.spawn)(`./${fileName}`, ['--port', '' + llm.port, '--server', '--nobrowser'], { cwd: dir });
78
- this.processMap.set(name, currentProcess);
79
- // Set status to 'ready' when server is started
80
- llm.status = this.calculateStatus(true);
81
- currentProcess.stdout.on('data', (data) => {
82
- const output = data.toString();
83
- this.client.log(name, output);
84
- });
85
- currentProcess.stderr.on('data', (data) => {
86
- const output = data.toString();
87
- this.client.error(name, output);
88
- });
89
- currentProcess.on('close', code => {
90
- this.client.log(name, `LlamaFile process for file ${name} exited with code ${code}`);
91
- this.processMap.delete(name);
92
- // Set status to 'unavailable' when server stops
93
- llm.status = this.calculateStatus(false);
94
- });
95
- currentProcess.on('error', error => {
96
- this.client.error(name, `Error starting LlamaFile process for file ${name}: ${error.message}`);
97
- this.processMap.delete(name);
98
- // Set status to 'unavailable' on error
99
- llm.status = this.calculateStatus(false, error.message);
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.languageModelRegistry.getLanguageModel(name).then(model => {
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":"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"}
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-next.59+3f14297ea",
3
+ "version": "1.67.0-next.86+03f92ff1d",
4
4
  "description": "Theia - Llamafile Integration",
5
5
  "dependencies": {
6
- "@theia/ai-core": "1.67.0-next.59+3f14297ea",
7
- "@theia/core": "1.67.0-next.59+3f14297ea",
8
- "@theia/output": "1.67.0-next.59+3f14297ea",
6
+ "@theia/ai-core": "1.67.0-next.86+03f92ff1d",
7
+ "@theia/core": "1.67.0-next.86+03f92ff1d",
8
+ "@theia/output": "1.67.0-next.86+03f92ff1d",
9
9
  "tslib": "^2.6.2"
10
10
  },
11
11
  "publishConfig": {
@@ -47,5 +47,5 @@
47
47
  "nyc": {
48
48
  "extends": "../../configs/nyc.json"
49
49
  },
50
- "gitHead": "3f14297ea2edcdb1fffd74afee0613e70b43e125"
50
+ "gitHead": "03f92ff1d97dcb199de39b48e60a53535de22808"
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 (!this.processMap.has(name)) {
77
- const models = await this.languageModelRegistry.getLanguageModels();
78
- const llm = models.find(model => model.id === name && model instanceof LlamafileLanguageModel) as LlamafileLanguageModel | undefined;
79
- if (llm === undefined) {
80
- return Promise.reject(`Llamafile ${name} not found`);
81
- }
82
- const filePath = fileURLToPath(llm.uri);
83
-
84
- // Extract the directory and file name
85
- const dir = dirname(filePath);
86
- const fileName = basename(filePath);
87
- const currentProcess = spawn(`./${fileName}`, ['--port', '' + llm.port, '--server', '--nobrowser'], { cwd: dir });
88
- this.processMap.set(name, currentProcess);
89
-
90
- // Set status to 'ready' when server is started
91
- llm.status = this.calculateStatus(true);
92
-
93
- currentProcess.stdout.on('data', (data: Buffer) => {
94
- const output = data.toString();
95
- this.client.log(name, output);
96
- });
97
- currentProcess.stderr.on('data', (data: Buffer) => {
98
- const output = data.toString();
99
- this.client.error(name, output);
100
- });
101
- currentProcess.on('close', code => {
102
- this.client.log(name, `LlamaFile process for file ${name} exited with code ${code}`);
103
- this.processMap.delete(name);
104
- // Set status to 'unavailable' when server stops
105
- llm.status = this.calculateStatus(false);
106
- });
107
- currentProcess.on('error', error => {
108
- this.client.error(name, `Error starting LlamaFile process for file ${name}: ${error.message}`);
109
- this.processMap.delete(name);
110
- // Set status to 'unavailable' on error
111
- llm.status = this.calculateStatus(false, error.message);
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.languageModelRegistry.getLanguageModel(name).then(model => {
123
- if (model && model instanceof LlamafileLanguageModel) {
124
- model.status = { status: 'unavailable' };
125
- }
126
- });
140
+ this.updateLanguageModelStatus(name, false);
127
141
  }
128
142
  }
129
143