@theia/ai-ollama 1.55.0 → 1.56.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.
- package/lib/browser/ollama-frontend-application-contribution.d.ts +5 -1
- package/lib/browser/ollama-frontend-application-contribution.d.ts.map +1 -1
- package/lib/browser/ollama-frontend-application-contribution.js +35 -8
- package/lib/browser/ollama-frontend-application-contribution.js.map +1 -1
- package/lib/common/ollama-language-models-manager.d.ts +17 -1
- package/lib/common/ollama-language-models-manager.d.ts.map +1 -1
- package/lib/common/ollama-language-models-manager.js +2 -2
- package/lib/common/ollama-language-models-manager.js.map +1 -1
- package/lib/node/ollama-language-model.d.ts +14 -3
- package/lib/node/ollama-language-model.d.ts.map +1 -1
- package/lib/node/ollama-language-model.js +21 -9
- package/lib/node/ollama-language-model.js.map +1 -1
- package/lib/node/ollama-language-models-manager-impl.d.ts +2 -2
- package/lib/node/ollama-language-models-manager-impl.d.ts.map +1 -1
- package/lib/node/ollama-language-models-manager-impl.js +14 -12
- package/lib/node/ollama-language-models-manager-impl.js.map +1 -1
- package/package.json +7 -7
- package/src/browser/ollama-frontend-application-contribution.ts +43 -11
- package/src/common/ollama-language-models-manager.ts +19 -2
- package/src/node/ollama-language-model.ts +25 -13
- package/src/node/ollama-language-models-manager-impl.ts +21 -12
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { FrontendApplicationContribution, PreferenceService } from '@theia/core/lib/browser';
|
|
2
|
-
import { OllamaLanguageModelsManager } from '../common';
|
|
2
|
+
import { OllamaLanguageModelsManager, OllamaModelDescription } from '../common';
|
|
3
|
+
import { RequestSetting } from '@theia/ai-core/lib/browser/ai-core-preferences';
|
|
3
4
|
export declare class OllamaFrontendApplicationContribution implements FrontendApplicationContribution {
|
|
4
5
|
protected preferenceService: PreferenceService;
|
|
5
6
|
protected manager: OllamaLanguageModelsManager;
|
|
6
7
|
protected prevModels: string[];
|
|
7
8
|
onStart(): void;
|
|
9
|
+
protected handleModelChanges(newModels: string[]): void;
|
|
10
|
+
protected handleRequestSettingsChange(newSettings: RequestSetting[]): void;
|
|
11
|
+
protected createOllamaModelDescription(modelId: string, requestSettings: RequestSetting[]): OllamaModelDescription;
|
|
8
12
|
}
|
|
9
13
|
//# sourceMappingURL=ollama-frontend-application-contribution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-frontend-application-contribution.d.ts","sourceRoot":"","sources":["../../src/browser/ollama-frontend-application-contribution.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE7F,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama-frontend-application-contribution.d.ts","sourceRoot":"","sources":["../../src/browser/ollama-frontend-application-contribution.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE7F,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEhF,OAAO,EAAoC,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAGlH,qBACa,qCAAsC,YAAW,+BAA+B;IAGzF,SAAS,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAG/C,SAAS,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAE/C,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAM;IAEpC,OAAO,IAAI,IAAI;IAsBf,SAAS,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAavD,SAAS,CAAC,2BAA2B,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,IAAI;IAK1E,SAAS,CAAC,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,sBAAsB;CAgBrH"}
|
|
@@ -21,6 +21,8 @@ const browser_1 = require("@theia/core/lib/browser");
|
|
|
21
21
|
const inversify_1 = require("@theia/core/shared/inversify");
|
|
22
22
|
const common_1 = require("../common");
|
|
23
23
|
const ollama_preferences_1 = require("./ollama-preferences");
|
|
24
|
+
const ai_core_preferences_1 = require("@theia/ai-core/lib/browser/ai-core-preferences");
|
|
25
|
+
const OLLAMA_PROVIDER_ID = 'ollama';
|
|
24
26
|
let OllamaFrontendApplicationContribution = class OllamaFrontendApplicationContribution {
|
|
25
27
|
constructor() {
|
|
26
28
|
this.prevModels = [];
|
|
@@ -30,24 +32,49 @@ let OllamaFrontendApplicationContribution = class OllamaFrontendApplicationContr
|
|
|
30
32
|
const host = this.preferenceService.get(ollama_preferences_1.HOST_PREF, 'http://localhost:11434');
|
|
31
33
|
this.manager.setHost(host);
|
|
32
34
|
const models = this.preferenceService.get(ollama_preferences_1.MODELS_PREF, []);
|
|
33
|
-
this.
|
|
35
|
+
const requestSettings = this.preferenceService.get(ai_core_preferences_1.PREFERENCE_NAME_REQUEST_SETTINGS, []);
|
|
36
|
+
this.manager.createOrUpdateLanguageModels(...models.map(modelId => this.createOllamaModelDescription(modelId, requestSettings)));
|
|
34
37
|
this.prevModels = [...models];
|
|
35
38
|
this.preferenceService.onPreferenceChanged(event => {
|
|
36
39
|
if (event.preferenceName === ollama_preferences_1.HOST_PREF) {
|
|
37
40
|
this.manager.setHost(event.newValue);
|
|
38
41
|
}
|
|
39
42
|
else if (event.preferenceName === ollama_preferences_1.MODELS_PREF) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
this.manager.removeLanguageModels(...modelsToRemove);
|
|
45
|
-
this.manager.createLanguageModels(...modelsToAdd);
|
|
46
|
-
this.prevModels = [...event.newValue];
|
|
43
|
+
this.handleModelChanges(event.newValue);
|
|
44
|
+
}
|
|
45
|
+
else if (event.preferenceName === ai_core_preferences_1.PREFERENCE_NAME_REQUEST_SETTINGS) {
|
|
46
|
+
this.handleRequestSettingsChange(event.newValue);
|
|
47
47
|
}
|
|
48
48
|
});
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
|
+
handleModelChanges(newModels) {
|
|
52
|
+
const oldModels = new Set(this.prevModels);
|
|
53
|
+
const updatedModels = new Set(newModels);
|
|
54
|
+
const modelsToRemove = [...oldModels].filter(model => !updatedModels.has(model));
|
|
55
|
+
const modelsToAdd = [...updatedModels].filter(model => !oldModels.has(model));
|
|
56
|
+
this.manager.removeLanguageModels(...modelsToRemove);
|
|
57
|
+
const requestSettings = this.preferenceService.get(ai_core_preferences_1.PREFERENCE_NAME_REQUEST_SETTINGS, []);
|
|
58
|
+
this.manager.createOrUpdateLanguageModels(...modelsToAdd.map(modelId => this.createOllamaModelDescription(modelId, requestSettings)));
|
|
59
|
+
this.prevModels = newModels;
|
|
60
|
+
}
|
|
61
|
+
handleRequestSettingsChange(newSettings) {
|
|
62
|
+
const models = this.preferenceService.get(ollama_preferences_1.MODELS_PREF, []);
|
|
63
|
+
this.manager.createOrUpdateLanguageModels(...models.map(modelId => this.createOllamaModelDescription(modelId, newSettings)));
|
|
64
|
+
}
|
|
65
|
+
createOllamaModelDescription(modelId, requestSettings) {
|
|
66
|
+
const id = `${OLLAMA_PROVIDER_ID}/${modelId}`;
|
|
67
|
+
const matchingSettings = requestSettings.filter(setting => (!setting.providerId || setting.providerId === OLLAMA_PROVIDER_ID) && setting.modelId === modelId);
|
|
68
|
+
if (matchingSettings.length > 1) {
|
|
69
|
+
console.warn(`Multiple entries found for modelId "${modelId}". Using the first match and ignoring the rest.`);
|
|
70
|
+
}
|
|
71
|
+
const modelRequestSetting = matchingSettings[0];
|
|
72
|
+
return {
|
|
73
|
+
id: id,
|
|
74
|
+
model: modelId,
|
|
75
|
+
defaultRequestSettings: modelRequestSetting === null || modelRequestSetting === void 0 ? void 0 : modelRequestSetting.requestSettings
|
|
76
|
+
};
|
|
77
|
+
}
|
|
51
78
|
};
|
|
52
79
|
exports.OllamaFrontendApplicationContribution = OllamaFrontendApplicationContribution;
|
|
53
80
|
tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-frontend-application-contribution.js","sourceRoot":"","sources":["../../src/browser/ollama-frontend-application-contribution.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,mCAAmC;AACnC,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;;;;AAEhF,qDAA6F;AAC7F,4DAAkE;AAClE,
|
|
1
|
+
{"version":3,"file":"ollama-frontend-application-contribution.js","sourceRoot":"","sources":["../../src/browser/ollama-frontend-application-contribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
export declare const OLLAMA_LANGUAGE_MODELS_MANAGER_PATH = "/services/ollama/language-model-manager";
|
|
2
2
|
export declare const OllamaLanguageModelsManager: unique symbol;
|
|
3
|
+
export interface OllamaModelDescription {
|
|
4
|
+
/**
|
|
5
|
+
* The identifier of the model which will be shown in the UI.
|
|
6
|
+
*/
|
|
7
|
+
id: string;
|
|
8
|
+
/**
|
|
9
|
+
* The name or ID of the model in the Ollama environment.
|
|
10
|
+
*/
|
|
11
|
+
model: string;
|
|
12
|
+
/**
|
|
13
|
+
* Default request settings for the Ollama model.
|
|
14
|
+
*/
|
|
15
|
+
defaultRequestSettings?: {
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
3
19
|
export interface OllamaLanguageModelsManager {
|
|
4
20
|
host: string | undefined;
|
|
5
21
|
setHost(host: string | undefined): void;
|
|
6
|
-
|
|
22
|
+
createOrUpdateLanguageModels(...models: OllamaModelDescription[]): Promise<void>;
|
|
7
23
|
removeLanguageModels(...modelIds: string[]): void;
|
|
8
24
|
}
|
|
9
25
|
//# sourceMappingURL=ollama-language-models-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-language-models-manager.d.ts","sourceRoot":"","sources":["../../src/common/ollama-language-models-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ollama-language-models-manager.d.ts","sourceRoot":"","sources":["../../src/common/ollama-language-models-manager.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,mCAAmC,4CAA4C,CAAC;AAC7F,eAAO,MAAM,2BAA2B,eAAwC,CAAC;AAEjF,MAAM,WAAW,sBAAsB;IACnC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,sBAAsB,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,WAAW,2BAA2B;IACxC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACxC,4BAA4B,CAAC,GAAG,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,oBAAoB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACrD"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OllamaLanguageModelsManager = exports.OLLAMA_LANGUAGE_MODELS_MANAGER_PATH = void 0;
|
|
4
2
|
// *****************************************************************************
|
|
5
3
|
// Copyright (C) 2024 TypeFox GmbH.
|
|
6
4
|
//
|
|
@@ -16,6 +14,8 @@ exports.OllamaLanguageModelsManager = exports.OLLAMA_LANGUAGE_MODELS_MANAGER_PAT
|
|
|
16
14
|
//
|
|
17
15
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
18
16
|
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.OllamaLanguageModelsManager = exports.OLLAMA_LANGUAGE_MODELS_MANAGER_PATH = void 0;
|
|
19
19
|
exports.OLLAMA_LANGUAGE_MODELS_MANAGER_PATH = '/services/ollama/language-model-manager';
|
|
20
20
|
exports.OllamaLanguageModelsManager = Symbol('OllamaLanguageModelsManager');
|
|
21
21
|
//# sourceMappingURL=ollama-language-models-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-language-models-manager.js","sourceRoot":"","sources":["../../src/common/ollama-language-models-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ollama-language-models-manager.js","sourceRoot":"","sources":["../../src/common/ollama-language-models-manager.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,mCAAmC;AACnC,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;;;AAEnE,QAAA,mCAAmC,GAAG,yCAAyC,CAAC;AAChF,QAAA,2BAA2B,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC"}
|
|
@@ -3,14 +3,25 @@ import { CancellationToken } from '@theia/core';
|
|
|
3
3
|
import { ChatRequest, Message, Ollama, Tool } from 'ollama';
|
|
4
4
|
export declare const OllamaModelIdentifier: unique symbol;
|
|
5
5
|
export declare class OllamaModel implements LanguageModel {
|
|
6
|
+
readonly id: string;
|
|
6
7
|
protected readonly model: string;
|
|
7
8
|
protected host: () => string | undefined;
|
|
9
|
+
defaultRequestSettings?: {
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
} | undefined;
|
|
8
12
|
protected readonly DEFAULT_REQUEST_SETTINGS: Partial<Omit<ChatRequest, 'stream' | 'model'>>;
|
|
9
13
|
readonly providerId = "ollama";
|
|
10
14
|
readonly vendor: string;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
/**
|
|
16
|
+
* @param id the unique id for this language model. It will be used to identify the model in the UI.
|
|
17
|
+
* @param model the unique model name as used in the Ollama environment.
|
|
18
|
+
* @param hostProvider a function to provide the host URL for the Ollama server.
|
|
19
|
+
* @param defaultRequestSettings optional default settings for requests made using this model.
|
|
20
|
+
*/
|
|
21
|
+
constructor(id: string, model: string, host: () => string | undefined, defaultRequestSettings?: {
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
} | undefined);
|
|
24
|
+
protected getSettings(request: LanguageModelRequest): Partial<ChatRequest>;
|
|
14
25
|
request(request: LanguageModelRequest, cancellationToken?: CancellationToken): Promise<LanguageModelResponse>;
|
|
15
26
|
protected handleStructuredOutputRequest(ollama: Ollama, request: LanguageModelRequest): Promise<LanguageModelParsedResponse>;
|
|
16
27
|
protected initializeOllama(): Ollama;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-language-model.d.ts","sourceRoot":"","sources":["../../src/node/ollama-language-model.ts"],"names":[],"mappings":"AAgBA,OAAO,EACH,aAAa,EACb,2BAA2B,EAC3B,oBAAoB,EACpB,2BAA2B,EAC3B,qBAAqB,EAErB,WAAW,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAgB,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ollama-language-model.d.ts","sourceRoot":"","sources":["../../src/node/ollama-language-model.ts"],"names":[],"mappings":"AAgBA,OAAO,EACH,aAAa,EACb,2BAA2B,EAC3B,oBAAoB,EACpB,2BAA2B,EAC3B,qBAAqB,EAErB,WAAW,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAgB,OAAO,EAAE,MAAM,EAAW,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnF,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAErE,qBAAa,WAAY,YAAW,aAAa;aAgBzB,EAAE,EAAE,MAAM;IAC1B,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM;IAChC,SAAS,CAAC,IAAI,EAAE,MAAM,MAAM,GAAG,SAAS;IACjC,sBAAsB,CAAC;;;IAjBlC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAEzF;IAEF,QAAQ,CAAC,UAAU,YAAY;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAY;IAEnC;;;;;OAKG;gBAEiB,EAAE,EAAE,MAAM,EACP,KAAK,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,MAAM,GAAG,SAAS,EACjC,sBAAsB,CAAC;;iBAA4B;IAG9D,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IAOpE,OAAO,CAAC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;cA6BnG,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAyBlI,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAQpC,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAiC/C,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO;CAY3E"}
|
|
@@ -19,34 +19,44 @@ exports.OllamaModel = exports.OllamaModelIdentifier = void 0;
|
|
|
19
19
|
const ollama_1 = require("ollama");
|
|
20
20
|
exports.OllamaModelIdentifier = Symbol('OllamaModelIdentifier');
|
|
21
21
|
class OllamaModel {
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* @param id the unique id for this language model. It will be used to identify the model in the UI.
|
|
24
|
+
* @param model the unique model name as used in the Ollama environment.
|
|
25
|
+
* @param hostProvider a function to provide the host URL for the Ollama server.
|
|
26
|
+
* @param defaultRequestSettings optional default settings for requests made using this model.
|
|
27
|
+
*/
|
|
28
|
+
constructor(id, model, host, defaultRequestSettings) {
|
|
29
|
+
this.id = id;
|
|
23
30
|
this.model = model;
|
|
24
31
|
this.host = host;
|
|
32
|
+
this.defaultRequestSettings = defaultRequestSettings;
|
|
25
33
|
this.DEFAULT_REQUEST_SETTINGS = {
|
|
26
34
|
keep_alive: '15m'
|
|
27
35
|
};
|
|
28
36
|
this.providerId = 'ollama';
|
|
29
37
|
this.vendor = 'Ollama';
|
|
30
38
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
getSettings(request) {
|
|
40
|
+
var _a, _b;
|
|
41
|
+
const settings = (_b = (_a = request.settings) !== null && _a !== void 0 ? _a : this.defaultRequestSettings) !== null && _b !== void 0 ? _b : {};
|
|
42
|
+
return {
|
|
43
|
+
options: settings
|
|
44
|
+
};
|
|
36
45
|
}
|
|
37
46
|
async request(request, cancellationToken) {
|
|
38
47
|
var _a, _b;
|
|
48
|
+
const settings = this.getSettings(request);
|
|
39
49
|
const ollama = this.initializeOllama();
|
|
40
50
|
if (((_a = request.response_format) === null || _a === void 0 ? void 0 : _a.type) === 'json_schema') {
|
|
41
51
|
return this.handleStructuredOutputRequest(ollama, request);
|
|
42
52
|
}
|
|
43
53
|
const response = await ollama.chat({
|
|
44
|
-
...this.DEFAULT_REQUEST_SETTINGS,
|
|
45
54
|
model: this.model,
|
|
55
|
+
...this.DEFAULT_REQUEST_SETTINGS,
|
|
56
|
+
...settings,
|
|
46
57
|
messages: request.messages.map(this.toOllamaMessage),
|
|
47
58
|
stream: true,
|
|
48
59
|
tools: (_b = request.tools) === null || _b === void 0 ? void 0 : _b.map(this.toOllamaTool),
|
|
49
|
-
...request.settings
|
|
50
60
|
});
|
|
51
61
|
cancellationToken === null || cancellationToken === void 0 ? void 0 : cancellationToken.onCancellationRequested(() => {
|
|
52
62
|
response.abort();
|
|
@@ -60,12 +70,14 @@ class OllamaModel {
|
|
|
60
70
|
return { stream: wrapAsyncIterator(response) };
|
|
61
71
|
}
|
|
62
72
|
async handleStructuredOutputRequest(ollama, request) {
|
|
73
|
+
const settings = this.getSettings(request);
|
|
63
74
|
const result = await ollama.chat({
|
|
75
|
+
...settings,
|
|
64
76
|
...this.DEFAULT_REQUEST_SETTINGS,
|
|
65
77
|
model: this.model,
|
|
66
78
|
messages: request.messages.map(this.toOllamaMessage),
|
|
67
79
|
format: 'json',
|
|
68
|
-
|
|
80
|
+
stream: false,
|
|
69
81
|
});
|
|
70
82
|
try {
|
|
71
83
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-language-model.js","sourceRoot":"","sources":["../../src/node/ollama-language-model.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,mCAAmC;AACnC,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;;;AAYhF,
|
|
1
|
+
{"version":3,"file":"ollama-language-model.js","sourceRoot":"","sources":["../../src/node/ollama-language-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { LanguageModelRegistry } from '@theia/ai-core';
|
|
2
|
-
import { OllamaLanguageModelsManager } from '../common';
|
|
2
|
+
import { OllamaLanguageModelsManager, OllamaModelDescription } from '../common';
|
|
3
3
|
export declare class OllamaLanguageModelsManagerImpl implements OllamaLanguageModelsManager {
|
|
4
4
|
protected _host: string | undefined;
|
|
5
5
|
protected readonly languageModelRegistry: LanguageModelRegistry;
|
|
6
6
|
get host(): string | undefined;
|
|
7
|
-
|
|
7
|
+
createOrUpdateLanguageModels(...models: OllamaModelDescription[]): Promise<void>;
|
|
8
8
|
removeLanguageModels(...modelIds: string[]): void;
|
|
9
9
|
setHost(host: string | undefined): void;
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-language-models-manager-impl.d.ts","sourceRoot":"","sources":["../../src/node/ollama-language-models-manager-impl.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama-language-models-manager-impl.d.ts","sourceRoot":"","sources":["../../src/node/ollama-language-models-manager-impl.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEhF,qBACa,+BAAgC,YAAW,2BAA2B;IAE/E,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAGpC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAEhE,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAIK,4BAA4B,CAAC,GAAG,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBtF,oBAAoB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAIjD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAG1C"}
|
|
@@ -27,14 +27,21 @@ let OllamaLanguageModelsManagerImpl = class OllamaLanguageModelsManagerImpl {
|
|
|
27
27
|
}
|
|
28
28
|
// Triggered from frontend. In case you want to use the models on the backend
|
|
29
29
|
// without a frontend then call this yourself
|
|
30
|
-
async
|
|
31
|
-
for (const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
async createOrUpdateLanguageModels(...models) {
|
|
31
|
+
for (const modelDescription of models) {
|
|
32
|
+
const existingModel = await this.languageModelRegistry.getLanguageModel(modelDescription.id);
|
|
33
|
+
const hostProvider = () => this.host;
|
|
34
|
+
if (existingModel) {
|
|
35
|
+
if (!(existingModel instanceof ollama_language_model_1.OllamaModel)) {
|
|
36
|
+
console.warn(`Ollama: model ${modelDescription.id} is not an Ollama model`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
existingModel.defaultRequestSettings = modelDescription.defaultRequestSettings;
|
|
35
40
|
}
|
|
36
41
|
else {
|
|
37
|
-
|
|
42
|
+
this.languageModelRegistry.addLanguageModels([
|
|
43
|
+
new ollama_language_model_1.OllamaModel(modelDescription.id, modelDescription.model, hostProvider, modelDescription.defaultRequestSettings)
|
|
44
|
+
]);
|
|
38
45
|
}
|
|
39
46
|
}
|
|
40
47
|
}
|
|
@@ -42,12 +49,7 @@ let OllamaLanguageModelsManagerImpl = class OllamaLanguageModelsManagerImpl {
|
|
|
42
49
|
this.languageModelRegistry.removeLanguageModels(modelIds.map(id => `ollama/${id}`));
|
|
43
50
|
}
|
|
44
51
|
setHost(host) {
|
|
45
|
-
|
|
46
|
-
this._host = host;
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
this._host = undefined;
|
|
50
|
-
}
|
|
52
|
+
this._host = host || undefined;
|
|
51
53
|
}
|
|
52
54
|
};
|
|
53
55
|
exports.OllamaLanguageModelsManagerImpl = OllamaLanguageModelsManagerImpl;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-language-models-manager-impl.js","sourceRoot":"","sources":["../../src/node/ollama-language-models-manager-impl.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,mCAAmC;AACnC,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;;;;AAEhF,4CAAuD;AACvD,4DAAkE;AAClE,mEAAsD;AAI/C,IAAM,+BAA+B,GAArC,MAAM,+BAA+B;IAOxC,IAAI,IAAI;;QACJ,OAAO,MAAA,IAAI,CAAC,KAAK,mCAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACjD,CAAC;IAED,6EAA6E;IAC7E,6CAA6C;IAC7C,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"ollama-language-models-manager-impl.js","sourceRoot":"","sources":["../../src/node/ollama-language-models-manager-impl.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,mCAAmC;AACnC,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;;;;AAEhF,4CAAuD;AACvD,4DAAkE;AAClE,mEAAsD;AAI/C,IAAM,+BAA+B,GAArC,MAAM,+BAA+B;IAOxC,IAAI,IAAI;;QACJ,OAAO,MAAA,IAAI,CAAC,KAAK,mCAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACjD,CAAC;IAED,6EAA6E;IAC7E,6CAA6C;IAC7C,KAAK,CAAC,4BAA4B,CAAC,GAAG,MAAgC;QAClE,KAAK,MAAM,gBAAgB,IAAI,MAAM,EAAE,CAAC;YACpC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAC7F,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YAErC,IAAI,aAAa,EAAE,CAAC;gBAChB,IAAI,CAAC,CAAC,aAAa,YAAY,mCAAW,CAAC,EAAE,CAAC;oBAC1C,OAAO,CAAC,IAAI,CAAC,iBAAiB,gBAAgB,CAAC,EAAE,yBAAyB,CAAC,CAAC;oBAC5E,SAAS;gBACb,CAAC;gBACD,aAAa,CAAC,sBAAsB,GAAG,gBAAgB,CAAC,sBAAsB,CAAC;YACnF,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC;oBACzC,IAAI,mCAAW,CACX,gBAAgB,CAAC,EAAE,EACnB,gBAAgB,CAAC,KAAK,EACtB,YAAY,EACZ,gBAAgB,CAAC,sBAAsB,CAC1C;iBACJ,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,oBAAoB,CAAC,GAAG,QAAkB;QACtC,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,CAAC,IAAwB;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,SAAS,CAAC;IACnC,CAAC;CACJ,CAAA;AA5CY,0EAA+B;AAKrB;IADlB,IAAA,kBAAM,EAAC,+BAAqB,CAAC;;8EACkC;0CALvD,+BAA+B;IAD3C,IAAA,sBAAU,GAAE;GACA,+BAA+B,CA4C3C"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-ollama",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.56.0",
|
|
4
4
|
"description": "Theia - Ollama Integration",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/ai-core": "1.
|
|
7
|
-
"@theia/core": "1.
|
|
8
|
-
"@theia/filesystem": "1.
|
|
9
|
-
"@theia/workspace": "1.
|
|
6
|
+
"@theia/ai-core": "1.56.0",
|
|
7
|
+
"@theia/core": "1.56.0",
|
|
8
|
+
"@theia/filesystem": "1.56.0",
|
|
9
|
+
"@theia/workspace": "1.56.0",
|
|
10
10
|
"minimatch": "^5.1.0",
|
|
11
11
|
"ollama": "^0.5.8",
|
|
12
12
|
"tslib": "^2.6.2"
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
"watch": "theiaext watch"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@theia/ext-scripts": "1.
|
|
48
|
+
"@theia/ext-scripts": "1.56.0"
|
|
49
49
|
},
|
|
50
50
|
"nyc": {
|
|
51
51
|
"extends": "../../configs/nyc.json"
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "3b4498f8f1c66be688847418fcc35595282671dc"
|
|
54
54
|
}
|
|
@@ -16,9 +16,11 @@
|
|
|
16
16
|
|
|
17
17
|
import { FrontendApplicationContribution, PreferenceService } from '@theia/core/lib/browser';
|
|
18
18
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
19
|
-
import { OllamaLanguageModelsManager } from '../common';
|
|
19
|
+
import { OllamaLanguageModelsManager, OllamaModelDescription } from '../common';
|
|
20
20
|
import { HOST_PREF, MODELS_PREF } from './ollama-preferences';
|
|
21
|
+
import { PREFERENCE_NAME_REQUEST_SETTINGS, RequestSetting } from '@theia/ai-core/lib/browser/ai-core-preferences';
|
|
21
22
|
|
|
23
|
+
const OLLAMA_PROVIDER_ID = 'ollama';
|
|
22
24
|
@injectable()
|
|
23
25
|
export class OllamaFrontendApplicationContribution implements FrontendApplicationContribution {
|
|
24
26
|
|
|
@@ -36,24 +38,54 @@ export class OllamaFrontendApplicationContribution implements FrontendApplicatio
|
|
|
36
38
|
this.manager.setHost(host);
|
|
37
39
|
|
|
38
40
|
const models = this.preferenceService.get<string[]>(MODELS_PREF, []);
|
|
39
|
-
this.
|
|
41
|
+
const requestSettings = this.preferenceService.get<RequestSetting[]>(PREFERENCE_NAME_REQUEST_SETTINGS, []);
|
|
42
|
+
this.manager.createOrUpdateLanguageModels(...models.map(modelId => this.createOllamaModelDescription(modelId, requestSettings)));
|
|
40
43
|
this.prevModels = [...models];
|
|
41
44
|
|
|
42
45
|
this.preferenceService.onPreferenceChanged(event => {
|
|
43
46
|
if (event.preferenceName === HOST_PREF) {
|
|
44
47
|
this.manager.setHost(event.newValue);
|
|
45
48
|
} else if (event.preferenceName === MODELS_PREF) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const modelsToRemove = [...oldModels].filter(model => !newModels.has(model));
|
|
50
|
-
const modelsToAdd = [...newModels].filter(model => !oldModels.has(model));
|
|
51
|
-
|
|
52
|
-
this.manager.removeLanguageModels(...modelsToRemove);
|
|
53
|
-
this.manager.createLanguageModels(...modelsToAdd);
|
|
54
|
-
this.prevModels = [...event.newValue];
|
|
49
|
+
this.handleModelChanges(event.newValue as string[]);
|
|
50
|
+
} else if (event.preferenceName === PREFERENCE_NAME_REQUEST_SETTINGS) {
|
|
51
|
+
this.handleRequestSettingsChange(event.newValue as RequestSetting[]);
|
|
55
52
|
}
|
|
56
53
|
});
|
|
57
54
|
});
|
|
58
55
|
}
|
|
56
|
+
|
|
57
|
+
protected handleModelChanges(newModels: string[]): void {
|
|
58
|
+
const oldModels = new Set(this.prevModels);
|
|
59
|
+
const updatedModels = new Set(newModels);
|
|
60
|
+
|
|
61
|
+
const modelsToRemove = [...oldModels].filter(model => !updatedModels.has(model));
|
|
62
|
+
const modelsToAdd = [...updatedModels].filter(model => !oldModels.has(model));
|
|
63
|
+
|
|
64
|
+
this.manager.removeLanguageModels(...modelsToRemove);
|
|
65
|
+
const requestSettings = this.preferenceService.get<RequestSetting[]>(PREFERENCE_NAME_REQUEST_SETTINGS, []);
|
|
66
|
+
this.manager.createOrUpdateLanguageModels(...modelsToAdd.map(modelId => this.createOllamaModelDescription(modelId, requestSettings)));
|
|
67
|
+
this.prevModels = newModels;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
protected handleRequestSettingsChange(newSettings: RequestSetting[]): void {
|
|
71
|
+
const models = this.preferenceService.get<string[]>(MODELS_PREF, []);
|
|
72
|
+
this.manager.createOrUpdateLanguageModels(...models.map(modelId => this.createOllamaModelDescription(modelId, newSettings)));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
protected createOllamaModelDescription(modelId: string, requestSettings: RequestSetting[]): OllamaModelDescription {
|
|
76
|
+
const id = `${OLLAMA_PROVIDER_ID}/${modelId}`;
|
|
77
|
+
const matchingSettings = requestSettings.filter(
|
|
78
|
+
setting => (!setting.providerId || setting.providerId === OLLAMA_PROVIDER_ID) && setting.modelId === modelId
|
|
79
|
+
);
|
|
80
|
+
if (matchingSettings.length > 1) {
|
|
81
|
+
console.warn(`Multiple entries found for modelId "${modelId}". Using the first match and ignoring the rest.`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const modelRequestSetting = matchingSettings[0];
|
|
85
|
+
return {
|
|
86
|
+
id: id,
|
|
87
|
+
model: modelId,
|
|
88
|
+
defaultRequestSettings: modelRequestSetting?.requestSettings
|
|
89
|
+
};
|
|
90
|
+
}
|
|
59
91
|
}
|
|
@@ -13,11 +13,28 @@
|
|
|
13
13
|
//
|
|
14
14
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
15
|
// *****************************************************************************
|
|
16
|
+
|
|
16
17
|
export const OLLAMA_LANGUAGE_MODELS_MANAGER_PATH = '/services/ollama/language-model-manager';
|
|
17
18
|
export const OllamaLanguageModelsManager = Symbol('OllamaLanguageModelsManager');
|
|
19
|
+
|
|
20
|
+
export interface OllamaModelDescription {
|
|
21
|
+
/**
|
|
22
|
+
* The identifier of the model which will be shown in the UI.
|
|
23
|
+
*/
|
|
24
|
+
id: string;
|
|
25
|
+
/**
|
|
26
|
+
* The name or ID of the model in the Ollama environment.
|
|
27
|
+
*/
|
|
28
|
+
model: string;
|
|
29
|
+
/**
|
|
30
|
+
* Default request settings for the Ollama model.
|
|
31
|
+
*/
|
|
32
|
+
defaultRequestSettings?: { [key: string]: unknown };
|
|
33
|
+
}
|
|
34
|
+
|
|
18
35
|
export interface OllamaLanguageModelsManager {
|
|
19
36
|
host: string | undefined;
|
|
20
37
|
setHost(host: string | undefined): void;
|
|
21
|
-
|
|
22
|
-
removeLanguageModels(...modelIds: string[]): void
|
|
38
|
+
createOrUpdateLanguageModels(...models: OllamaModelDescription[]): Promise<void>;
|
|
39
|
+
removeLanguageModels(...modelIds: string[]): void;
|
|
23
40
|
}
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
ToolRequest
|
|
25
25
|
} from '@theia/ai-core';
|
|
26
26
|
import { CancellationToken } from '@theia/core';
|
|
27
|
-
import { ChatRequest, ChatResponse, Message, Ollama, Tool } from 'ollama';
|
|
27
|
+
import { ChatRequest, ChatResponse, Message, Ollama, Options, Tool } from 'ollama';
|
|
28
28
|
|
|
29
29
|
export const OllamaModelIdentifier = Symbol('OllamaModelIdentifier');
|
|
30
30
|
|
|
@@ -37,30 +37,40 @@ export class OllamaModel implements LanguageModel {
|
|
|
37
37
|
readonly providerId = 'ollama';
|
|
38
38
|
readonly vendor: string = 'Ollama';
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
/**
|
|
41
|
+
* @param id the unique id for this language model. It will be used to identify the model in the UI.
|
|
42
|
+
* @param model the unique model name as used in the Ollama environment.
|
|
43
|
+
* @param hostProvider a function to provide the host URL for the Ollama server.
|
|
44
|
+
* @param defaultRequestSettings optional default settings for requests made using this model.
|
|
45
|
+
*/
|
|
46
|
+
constructor(
|
|
47
|
+
public readonly id: string,
|
|
48
|
+
protected readonly model: string,
|
|
49
|
+
protected host: () => string | undefined,
|
|
50
|
+
public defaultRequestSettings?: { [key: string]: unknown }
|
|
51
|
+
) { }
|
|
52
|
+
|
|
53
|
+
protected getSettings(request: LanguageModelRequest): Partial<ChatRequest> {
|
|
54
|
+
const settings = request.settings ?? this.defaultRequestSettings ?? {};
|
|
55
|
+
return {
|
|
56
|
+
options: settings as Partial<Options>
|
|
57
|
+
};
|
|
49
58
|
}
|
|
50
59
|
|
|
51
60
|
async request(request: LanguageModelRequest, cancellationToken?: CancellationToken): Promise<LanguageModelResponse> {
|
|
61
|
+
const settings = this.getSettings(request);
|
|
52
62
|
const ollama = this.initializeOllama();
|
|
53
63
|
|
|
54
64
|
if (request.response_format?.type === 'json_schema') {
|
|
55
65
|
return this.handleStructuredOutputRequest(ollama, request);
|
|
56
66
|
}
|
|
57
67
|
const response = await ollama.chat({
|
|
58
|
-
...this.DEFAULT_REQUEST_SETTINGS,
|
|
59
68
|
model: this.model,
|
|
69
|
+
...this.DEFAULT_REQUEST_SETTINGS,
|
|
70
|
+
...settings,
|
|
60
71
|
messages: request.messages.map(this.toOllamaMessage),
|
|
61
72
|
stream: true,
|
|
62
73
|
tools: request.tools?.map(this.toOllamaTool),
|
|
63
|
-
...request.settings
|
|
64
74
|
});
|
|
65
75
|
|
|
66
76
|
cancellationToken?.onCancellationRequested(() => {
|
|
@@ -77,12 +87,14 @@ export class OllamaModel implements LanguageModel {
|
|
|
77
87
|
}
|
|
78
88
|
|
|
79
89
|
protected async handleStructuredOutputRequest(ollama: Ollama, request: LanguageModelRequest): Promise<LanguageModelParsedResponse> {
|
|
90
|
+
const settings = this.getSettings(request);
|
|
80
91
|
const result = await ollama.chat({
|
|
92
|
+
...settings,
|
|
81
93
|
...this.DEFAULT_REQUEST_SETTINGS,
|
|
82
94
|
model: this.model,
|
|
83
95
|
messages: request.messages.map(this.toOllamaMessage),
|
|
84
96
|
format: 'json',
|
|
85
|
-
|
|
97
|
+
stream: false,
|
|
86
98
|
});
|
|
87
99
|
try {
|
|
88
100
|
return {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import { LanguageModelRegistry } from '@theia/ai-core';
|
|
18
18
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
19
19
|
import { OllamaModel } from './ollama-language-model';
|
|
20
|
-
import { OllamaLanguageModelsManager } from '../common';
|
|
20
|
+
import { OllamaLanguageModelsManager, OllamaModelDescription } from '../common';
|
|
21
21
|
|
|
22
22
|
@injectable()
|
|
23
23
|
export class OllamaLanguageModelsManagerImpl implements OllamaLanguageModelsManager {
|
|
@@ -33,13 +33,26 @@ export class OllamaLanguageModelsManagerImpl implements OllamaLanguageModelsMana
|
|
|
33
33
|
|
|
34
34
|
// Triggered from frontend. In case you want to use the models on the backend
|
|
35
35
|
// without a frontend then call this yourself
|
|
36
|
-
async
|
|
37
|
-
for (const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
async createOrUpdateLanguageModels(...models: OllamaModelDescription[]): Promise<void> {
|
|
37
|
+
for (const modelDescription of models) {
|
|
38
|
+
const existingModel = await this.languageModelRegistry.getLanguageModel(modelDescription.id);
|
|
39
|
+
const hostProvider = () => this.host;
|
|
40
|
+
|
|
41
|
+
if (existingModel) {
|
|
42
|
+
if (!(existingModel instanceof OllamaModel)) {
|
|
43
|
+
console.warn(`Ollama: model ${modelDescription.id} is not an Ollama model`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
existingModel.defaultRequestSettings = modelDescription.defaultRequestSettings;
|
|
41
47
|
} else {
|
|
42
|
-
|
|
48
|
+
this.languageModelRegistry.addLanguageModels([
|
|
49
|
+
new OllamaModel(
|
|
50
|
+
modelDescription.id,
|
|
51
|
+
modelDescription.model,
|
|
52
|
+
hostProvider,
|
|
53
|
+
modelDescription.defaultRequestSettings
|
|
54
|
+
)
|
|
55
|
+
]);
|
|
43
56
|
}
|
|
44
57
|
}
|
|
45
58
|
}
|
|
@@ -49,10 +62,6 @@ export class OllamaLanguageModelsManagerImpl implements OllamaLanguageModelsMana
|
|
|
49
62
|
}
|
|
50
63
|
|
|
51
64
|
setHost(host: string | undefined): void {
|
|
52
|
-
|
|
53
|
-
this._host = host;
|
|
54
|
-
} else {
|
|
55
|
-
this._host = undefined;
|
|
56
|
-
}
|
|
65
|
+
this._host = host || undefined;
|
|
57
66
|
}
|
|
58
67
|
}
|