@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.
@@ -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;AAGxD,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;CA0BlB"}
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.manager.createLanguageModels(...models);
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
- const oldModels = new Set(this.prevModels);
41
- const newModels = new Set(event.newValue);
42
- const modelsToRemove = [...oldModels].filter(model => !newModels.has(model));
43
- const modelsToAdd = [...newModels].filter(model => !oldModels.has(model));
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,sCAAwD;AACxD,6DAA8D;AAGvD,IAAM,qCAAqC,GAA3C,MAAM,qCAAqC;IAA3C;QAQO,eAAU,GAAa,EAAE,CAAC;IA4BxC,CAAC;IA1BG,OAAO;QACH,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAS,8BAAS,EAAE,wBAAwB,CAAC,CAAC;YACrF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAW,gCAAW,EAAE,EAAE,CAAC,CAAC;YACrE,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;YAE9B,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE;gBAC/C,IAAI,KAAK,CAAC,cAAc,KAAK,8BAAS,EAAE,CAAC;oBACrC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACzC,CAAC;qBAAM,IAAI,KAAK,CAAC,cAAc,KAAK,gCAAW,EAAE,CAAC;oBAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAoB,CAAC,CAAC;oBAEtD,MAAM,cAAc,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC7E,MAAM,WAAW,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;oBAE1E,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,cAAc,CAAC,CAAC;oBACrD,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,WAAW,CAAC,CAAC;oBAClD,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC1C,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AApCY,sFAAqC;AAGpC;IADT,IAAA,kBAAM,EAAC,2BAAiB,CAAC;;gFACqB;AAGrC;IADT,IAAA,kBAAM,EAAC,oCAA2B,CAAC;;sEACW;gDANtC,qCAAqC;IADjD,IAAA,sBAAU,GAAE;GACA,qCAAqC,CAoCjD"}
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
- createLanguageModels(...modelIds: string[]): Promise<void>;
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":"AAeA,eAAO,MAAM,mCAAmC,4CAA4C,CAAC;AAC7F,eAAO,MAAM,2BAA2B,eAAwC,CAAC;AACjF,MAAM,WAAW,2BAA2B;IACxC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACxC,oBAAoB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,oBAAoB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;CACpD"}
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":";;;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;AACnE,QAAA,mCAAmC,GAAG,yCAAyC,CAAC;AAChF,QAAA,2BAA2B,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC"}
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
- constructor(model: string, host: () => string | undefined);
12
- get id(): string;
13
- get name(): string;
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,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE1E,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAErE,qBAAa,WAAY,YAAW,aAAa;IASjC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM;IAAE,SAAS,CAAC,IAAI,EAAE,MAAM,MAAM,GAAG,SAAS;IAPtF,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;gBAEJ,KAAK,EAAE,MAAM,EAAY,IAAI,EAAE,MAAM,MAAM,GAAG,SAAS;IAGtF,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,OAAO,CAAC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;cA4BnG,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAuBlI,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"}
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
- constructor(model, host) {
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
- get id() {
32
- return this.providerId + '/' + this.model;
33
- }
34
- get name() {
35
- return this.model;
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
- ...request.settings
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,mCAA0E;AAE7D,QAAA,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAErE,MAAa,WAAW;IASpB,YAA+B,KAAa,EAAY,IAA8B;QAAvD,UAAK,GAAL,KAAK,CAAQ;QAAY,SAAI,GAAJ,IAAI,CAA0B;QAPnE,6BAAwB,GAAmD;YAC1F,UAAU,EAAE,KAAK;SACpB,CAAC;QAEO,eAAU,GAAG,QAAQ,CAAC;QACtB,WAAM,GAAW,QAAQ,CAAC;IAGnC,CAAC;IAED,IAAI,EAAE;QACF,OAAO,IAAI,CAAC,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;IAC9C,CAAC;IAED,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA6B,EAAE,iBAAqC;;QAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEvC,IAAI,CAAA,MAAA,OAAO,CAAC,eAAe,0CAAE,IAAI,MAAK,aAAa,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC/B,GAAG,IAAI,CAAC,wBAAwB;YAChC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;YACpD,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAC5C,GAAG,OAAO,CAAC,QAAQ;SACtB,CAAC,CAAC;QAEH,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,uBAAuB,CAAC,GAAG,EAAE;YAC5C,QAAQ,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,KAAK,SAAS,CAAC,CAAC,iBAAiB,CAAI,aAA0C;YAC3E,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACrC,yBAAyB;gBACzB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC5C,CAAC;QACL,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACnD,CAAC;IAES,KAAK,CAAC,6BAA6B,CAAC,MAAc,EAAE,OAA6B;QACvF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC7B,GAAG,IAAI,CAAC,wBAAwB;YAChC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;YACpD,MAAM,EAAE,MAAM;YACd,GAAG,OAAO,CAAC,QAAQ;SACtB,CAAC,CAAC;QACH,IAAI,CAAC;YACD,OAAO;gBACH,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;gBAC/B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aAC7C,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,mBAAmB;YACnB,OAAO,CAAC,GAAG,CAAC,8DAA8D,EAAE,KAAK,CAAC,CAAC;YACnF,OAAO;gBACH,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;gBAC/B,MAAM,EAAE,EAAE;aACb,CAAC;QACN,CAAC;IACL,CAAC;IAES,gBAAgB;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAES,YAAY,CAAC,IAAiB;;QACpC,MAAM,SAAS,GAAG,CAAC,KAGL,EAAE,EAAE;YACd,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO,SAAS,CAAC;YACrB,CAAC;YACD,MAAM,MAAM,GAA0D,EAAE,CAAC;YACzE,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;gBACtB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;oBACnD,MAAM,CAAC,GAAG,CAAC,GAAG;wBACV,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI;wBACrB,WAAW,EAAE,GAAG;qBACnB,CAAC;gBACN,CAAC;YACL,CAAC;YACD,OAAO,MAAM,CAAC;QAClB,CAAC,CAAC;QACF,OAAO;YACH,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,MAAA,IAAI,CAAC,WAAW,mCAAI,aAAa,GAAG,IAAI,CAAC,IAAI;gBAC1D,UAAU,EAAE;oBACR,IAAI,EAAE,MAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,IAAI,mCAAI,QAAQ;oBACvC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,UAAU,mCAAI,EAAE,CAAC;oBACxD,UAAU,EAAE,MAAA,SAAS,CAAC,MAAA,IAAI,CAAC,UAAU,0CAAE,UAAU,CAAC,mCAAI,EAAE;iBAC3D;aACJ;SACJ,CAAC;IACN,CAAC;IAES,eAAe,CAAC,OAAoC;QAC1D,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QAC/D,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QAC1D,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;CACJ;AA5HD,kCA4HC"}
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
- createLanguageModels(...modelIds: string[]): Promise<void>;
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;AAExD,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,oBAAoB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhE,oBAAoB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAIjD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAO1C"}
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 createLanguageModels(...modelIds) {
31
- for (const id of modelIds) {
32
- // TODO check that the model exists in Ollama using `list`. Ask and trigger download if not.
33
- if (!(await this.languageModelRegistry.getLanguageModel(`ollama/${id}`))) {
34
- this.languageModelRegistry.addLanguageModels([new ollama_language_model_1.OllamaModel(id, () => this.host)]);
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
- console.info(`Ollama: skip creating model ${id} because it already exists`);
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
- if (host) {
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,oBAAoB,CAAC,GAAG,QAAkB;QAC5C,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YACxB,4FAA4F;YAC5F,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;gBACvE,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC,IAAI,mCAAW,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzF,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,4BAA4B,CAAC,CAAC;YAChF,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,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QAC3B,CAAC;IACL,CAAC;CACJ,CAAA;AAnCY,0EAA+B;AAKrB;IADlB,IAAA,kBAAM,EAAC,+BAAqB,CAAC;;8EACkC;0CALvD,+BAA+B;IAD3C,IAAA,sBAAU,GAAE;GACA,+BAA+B,CAmC3C"}
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.55.0",
3
+ "version": "1.56.0",
4
4
  "description": "Theia - Ollama Integration",
5
5
  "dependencies": {
6
- "@theia/ai-core": "1.55.0",
7
- "@theia/core": "1.55.0",
8
- "@theia/filesystem": "1.55.0",
9
- "@theia/workspace": "1.55.0",
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.55.0"
48
+ "@theia/ext-scripts": "1.56.0"
49
49
  },
50
50
  "nyc": {
51
51
  "extends": "../../configs/nyc.json"
52
52
  },
53
- "gitHead": "0e7a523b8e798679d2e098709c63bd7060e54c8a"
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.manager.createLanguageModels(...models);
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
- const oldModels = new Set(this.prevModels);
47
- const newModels = new Set(event.newValue as string[]);
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
- createLanguageModels(...modelIds: string[]): Promise<void>;
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
- constructor(protected readonly model: string, protected host: () => string | undefined) {
41
- }
42
-
43
- get id(): string {
44
- return this.providerId + '/' + this.model;
45
- }
46
-
47
- get name(): string {
48
- return this.model;
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
- ...request.settings
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 createLanguageModels(...modelIds: string[]): Promise<void> {
37
- for (const id of modelIds) {
38
- // TODO check that the model exists in Ollama using `list`. Ask and trigger download if not.
39
- if (!(await this.languageModelRegistry.getLanguageModel(`ollama/${id}`))) {
40
- this.languageModelRegistry.addLanguageModels([new OllamaModel(id, () => this.host)]);
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
- console.info(`Ollama: skip creating model ${id} because it already exists`);
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
- if (host) {
53
- this._host = host;
54
- } else {
55
- this._host = undefined;
56
- }
65
+ this._host = host || undefined;
57
66
  }
58
67
  }