@theia/ai-openai 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/openai-frontend-application-contribution.d.ts +8 -0
- package/lib/browser/openai-frontend-application-contribution.d.ts.map +1 -1
- package/lib/browser/openai-frontend-application-contribution.js +82 -39
- package/lib/browser/openai-frontend-application-contribution.js.map +1 -1
- package/lib/browser/openai-preferences.d.ts.map +1 -1
- package/lib/browser/openai-preferences.js +6 -0
- package/lib/browser/openai-preferences.js.map +1 -1
- package/lib/common/openai-language-models-manager.d.ts +10 -0
- package/lib/common/openai-language-models-manager.d.ts.map +1 -1
- package/lib/node/openai-language-model.d.ts +13 -3
- package/lib/node/openai-language-model.d.ts.map +1 -1
- package/lib/node/openai-language-model.js +23 -8
- package/lib/node/openai-language-model.js.map +1 -1
- package/lib/node/openai-language-models-manager-impl.d.ts.map +1 -1
- package/lib/node/openai-language-models-manager-impl.js +7 -8
- package/lib/node/openai-language-models-manager-impl.js.map +1 -1
- package/package.json +7 -7
- package/src/browser/openai-frontend-application-contribution.ts +105 -43
- package/src/browser/openai-preferences.ts +6 -0
- package/src/common/openai-language-models-manager.ts +8 -0
- package/src/node/openai-language-model.ts +29 -8
- package/src/node/openai-language-models-manager-impl.ts +15 -8
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { FrontendApplicationContribution, PreferenceService } from '@theia/core/lib/browser';
|
|
2
2
|
import { OpenAiLanguageModelsManager, OpenAiModelDescription } from '../common';
|
|
3
|
+
import { RequestSetting } from '@theia/ai-core/lib/browser/ai-core-preferences';
|
|
3
4
|
export declare class OpenAiFrontendApplicationContribution implements FrontendApplicationContribution {
|
|
4
5
|
protected preferenceService: PreferenceService;
|
|
5
6
|
protected manager: OpenAiLanguageModelsManager;
|
|
6
7
|
protected prevModels: string[];
|
|
7
8
|
protected prevCustomModels: Partial<OpenAiModelDescription>[];
|
|
8
9
|
onStart(): void;
|
|
10
|
+
protected handleModelChanges(newModels: string[]): void;
|
|
11
|
+
private getRequestSettingsPref;
|
|
12
|
+
protected handleCustomModelChanges(newCustomModels: Partial<OpenAiModelDescription>[]): void;
|
|
13
|
+
protected handleRequestSettingsChanges(newSettings: RequestSetting[]): void;
|
|
14
|
+
protected createOpenAIModelDescription(modelId: string, requestSettings: RequestSetting[]): OpenAiModelDescription;
|
|
15
|
+
protected createCustomModelDescriptionsFromPreferences(preferences: Partial<OpenAiModelDescription>[], requestSettings: RequestSetting[]): OpenAiModelDescription[];
|
|
16
|
+
protected getMatchingRequestSetting(modelId: string, providerId: string, requestSettings: RequestSetting[]): RequestSetting | undefined;
|
|
9
17
|
}
|
|
10
18
|
//# sourceMappingURL=openai-frontend-application-contribution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-frontend-application-contribution.d.ts","sourceRoot":"","sources":["../../src/browser/openai-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;
|
|
1
|
+
{"version":3,"file":"openai-frontend-application-contribution.d.ts","sourceRoot":"","sources":["../../src/browser/openai-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;AAIlH,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;IACpC,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,sBAAsB,CAAC,EAAE,CAAM;IAEnE,OAAO,IAAI,IAAI;IA4Bf,SAAS,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAavD,OAAO,CAAC,sBAAsB;IAI9B,SAAS,CAAC,wBAAwB,CAAC,eAAe,EAAE,OAAO,CAAC,sBAAsB,CAAC,EAAE,GAAG,IAAI;IAmB5F,SAAS,CAAC,4BAA4B,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,IAAI;IAQ3E,SAAS,CAAC,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,sBAAsB;IAYlH,SAAS,CAAC,4CAA4C,CAClD,WAAW,EAAE,OAAO,CAAC,sBAAsB,CAAC,EAAE,EAC9C,eAAe,EAAE,cAAc,EAAE,GAClC,sBAAsB,EAAE;IAqB3B,SAAS,CAAC,yBAAyB,CAC/B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,cAAc,EAAE,GAClC,cAAc,GAAG,SAAS;CAWhC"}
|
|
@@ -21,9 +21,10 @@ 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 openai_preferences_1 = require("./openai-preferences");
|
|
24
|
+
const ai_core_preferences_1 = require("@theia/ai-core/lib/browser/ai-core-preferences");
|
|
25
|
+
const OPENAI_PROVIDER_ID = 'openai';
|
|
24
26
|
let OpenAiFrontendApplicationContribution = class OpenAiFrontendApplicationContribution {
|
|
25
27
|
constructor() {
|
|
26
|
-
// The preferenceChange.oldValue is always undefined for some reason
|
|
27
28
|
this.prevModels = [];
|
|
28
29
|
this.prevCustomModels = [];
|
|
29
30
|
}
|
|
@@ -32,35 +33,99 @@ let OpenAiFrontendApplicationContribution = class OpenAiFrontendApplicationContr
|
|
|
32
33
|
const apiKey = this.preferenceService.get(openai_preferences_1.API_KEY_PREF, undefined);
|
|
33
34
|
this.manager.setApiKey(apiKey);
|
|
34
35
|
const models = this.preferenceService.get(openai_preferences_1.MODELS_PREF, []);
|
|
35
|
-
this.
|
|
36
|
+
const requestSettings = this.getRequestSettingsPref();
|
|
37
|
+
this.manager.createOrUpdateLanguageModels(...models.map(modelId => this.createOpenAIModelDescription(modelId, requestSettings)));
|
|
36
38
|
this.prevModels = [...models];
|
|
37
39
|
const customModels = this.preferenceService.get(openai_preferences_1.CUSTOM_ENDPOINTS_PREF, []);
|
|
38
|
-
this.manager.createOrUpdateLanguageModels(...createCustomModelDescriptionsFromPreferences(customModels));
|
|
40
|
+
this.manager.createOrUpdateLanguageModels(...this.createCustomModelDescriptionsFromPreferences(customModels, this.getRequestSettingsPref()));
|
|
39
41
|
this.prevCustomModels = [...customModels];
|
|
40
42
|
this.preferenceService.onPreferenceChanged(event => {
|
|
41
43
|
if (event.preferenceName === openai_preferences_1.API_KEY_PREF) {
|
|
42
44
|
this.manager.setApiKey(event.newValue);
|
|
43
45
|
}
|
|
44
46
|
else if (event.preferenceName === openai_preferences_1.MODELS_PREF) {
|
|
45
|
-
|
|
46
|
-
const newModels = new Set(event.newValue);
|
|
47
|
-
const modelsToRemove = [...oldModels].filter(model => !newModels.has(model));
|
|
48
|
-
const modelsToAdd = [...newModels].filter(model => !oldModels.has(model));
|
|
49
|
-
this.manager.removeLanguageModels(...modelsToRemove.map(model => `openai/${model}`));
|
|
50
|
-
this.manager.createOrUpdateLanguageModels(...modelsToAdd.map(createOpenAIModelDescription));
|
|
51
|
-
this.prevModels = [...event.newValue];
|
|
47
|
+
this.handleModelChanges(event.newValue);
|
|
52
48
|
}
|
|
53
49
|
else if (event.preferenceName === openai_preferences_1.CUSTOM_ENDPOINTS_PREF) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
this.manager.removeLanguageModels(...modelsToRemove.map(model => model.id));
|
|
59
|
-
this.manager.createOrUpdateLanguageModels(...modelsToAddOrUpdate);
|
|
50
|
+
this.handleCustomModelChanges(event.newValue);
|
|
51
|
+
}
|
|
52
|
+
else if (event.preferenceName === ai_core_preferences_1.PREFERENCE_NAME_REQUEST_SETTINGS) {
|
|
53
|
+
this.handleRequestSettingsChanges(event.newValue);
|
|
60
54
|
}
|
|
61
55
|
});
|
|
62
56
|
});
|
|
63
57
|
}
|
|
58
|
+
handleModelChanges(newModels) {
|
|
59
|
+
const oldModels = new Set(this.prevModels);
|
|
60
|
+
const updatedModels = new Set(newModels);
|
|
61
|
+
const modelsToRemove = [...oldModels].filter(model => !updatedModels.has(model));
|
|
62
|
+
const modelsToAdd = [...updatedModels].filter(model => !oldModels.has(model));
|
|
63
|
+
this.manager.removeLanguageModels(...modelsToRemove.map(model => `openai/${model}`));
|
|
64
|
+
const requestSettings = this.getRequestSettingsPref();
|
|
65
|
+
this.manager.createOrUpdateLanguageModels(...modelsToAdd.map(modelId => this.createOpenAIModelDescription(modelId, requestSettings)));
|
|
66
|
+
this.prevModels = newModels;
|
|
67
|
+
}
|
|
68
|
+
getRequestSettingsPref() {
|
|
69
|
+
return this.preferenceService.get(ai_core_preferences_1.PREFERENCE_NAME_REQUEST_SETTINGS, []);
|
|
70
|
+
}
|
|
71
|
+
handleCustomModelChanges(newCustomModels) {
|
|
72
|
+
const requestSettings = this.getRequestSettingsPref();
|
|
73
|
+
const oldModels = this.createCustomModelDescriptionsFromPreferences(this.prevCustomModels, requestSettings);
|
|
74
|
+
const newModels = this.createCustomModelDescriptionsFromPreferences(newCustomModels, requestSettings);
|
|
75
|
+
const modelsToRemove = oldModels.filter(model => !newModels.some(newModel => newModel.id === model.id));
|
|
76
|
+
const modelsToAddOrUpdate = newModels.filter(newModel => !oldModels.some(model => model.id === newModel.id &&
|
|
77
|
+
model.model === newModel.model &&
|
|
78
|
+
model.url === newModel.url &&
|
|
79
|
+
model.apiKey === newModel.apiKey &&
|
|
80
|
+
model.enableStreaming === newModel.enableStreaming));
|
|
81
|
+
this.manager.removeLanguageModels(...modelsToRemove.map(model => model.id));
|
|
82
|
+
this.manager.createOrUpdateLanguageModels(...modelsToAddOrUpdate);
|
|
83
|
+
this.prevCustomModels = [...newCustomModels];
|
|
84
|
+
}
|
|
85
|
+
handleRequestSettingsChanges(newSettings) {
|
|
86
|
+
const models = this.preferenceService.get(openai_preferences_1.MODELS_PREF, []);
|
|
87
|
+
this.manager.createOrUpdateLanguageModels(...models.map(modelId => this.createOpenAIModelDescription(modelId, newSettings)));
|
|
88
|
+
const customModels = this.preferenceService.get(openai_preferences_1.CUSTOM_ENDPOINTS_PREF, []);
|
|
89
|
+
this.manager.createOrUpdateLanguageModels(...this.createCustomModelDescriptionsFromPreferences(customModels, newSettings));
|
|
90
|
+
}
|
|
91
|
+
createOpenAIModelDescription(modelId, requestSettings) {
|
|
92
|
+
const id = `${OPENAI_PROVIDER_ID}/${modelId}`;
|
|
93
|
+
const modelRequestSetting = this.getMatchingRequestSetting(modelId, OPENAI_PROVIDER_ID, requestSettings);
|
|
94
|
+
return {
|
|
95
|
+
id: id,
|
|
96
|
+
model: modelId,
|
|
97
|
+
apiKey: true,
|
|
98
|
+
enableStreaming: !openAIModelsWithDisabledStreaming.includes(modelId),
|
|
99
|
+
defaultRequestSettings: modelRequestSetting === null || modelRequestSetting === void 0 ? void 0 : modelRequestSetting.requestSettings
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
createCustomModelDescriptionsFromPreferences(preferences, requestSettings) {
|
|
103
|
+
return preferences.reduce((acc, pref) => {
|
|
104
|
+
var _a;
|
|
105
|
+
if (!pref.model || !pref.url || typeof pref.model !== 'string' || typeof pref.url !== 'string') {
|
|
106
|
+
return acc;
|
|
107
|
+
}
|
|
108
|
+
const modelRequestSetting = this.getMatchingRequestSetting(pref.model, OPENAI_PROVIDER_ID, requestSettings);
|
|
109
|
+
return [
|
|
110
|
+
...acc,
|
|
111
|
+
{
|
|
112
|
+
id: pref.id && typeof pref.id === 'string' ? pref.id : pref.model,
|
|
113
|
+
model: pref.model,
|
|
114
|
+
url: pref.url,
|
|
115
|
+
apiKey: typeof pref.apiKey === 'string' || pref.apiKey === true ? pref.apiKey : undefined,
|
|
116
|
+
enableStreaming: (_a = pref.enableStreaming) !== null && _a !== void 0 ? _a : true,
|
|
117
|
+
defaultRequestSettings: modelRequestSetting === null || modelRequestSetting === void 0 ? void 0 : modelRequestSetting.requestSettings
|
|
118
|
+
}
|
|
119
|
+
];
|
|
120
|
+
}, []);
|
|
121
|
+
}
|
|
122
|
+
getMatchingRequestSetting(modelId, providerId, requestSettings) {
|
|
123
|
+
const matchingSettings = requestSettings.filter(setting => (!setting.providerId || setting.providerId === providerId) && setting.modelId === modelId);
|
|
124
|
+
if (matchingSettings.length > 1) {
|
|
125
|
+
console.warn(`Multiple entries found for provider "${providerId}" and model "${modelId}". Using the first match.`);
|
|
126
|
+
}
|
|
127
|
+
return matchingSettings[0];
|
|
128
|
+
}
|
|
64
129
|
};
|
|
65
130
|
exports.OpenAiFrontendApplicationContribution = OpenAiFrontendApplicationContribution;
|
|
66
131
|
tslib_1.__decorate([
|
|
@@ -74,27 +139,5 @@ tslib_1.__decorate([
|
|
|
74
139
|
exports.OpenAiFrontendApplicationContribution = OpenAiFrontendApplicationContribution = tslib_1.__decorate([
|
|
75
140
|
(0, inversify_1.injectable)()
|
|
76
141
|
], OpenAiFrontendApplicationContribution);
|
|
77
|
-
|
|
78
|
-
return {
|
|
79
|
-
id: `openai/${modelId}`,
|
|
80
|
-
model: modelId,
|
|
81
|
-
apiKey: true
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
function createCustomModelDescriptionsFromPreferences(preferences) {
|
|
85
|
-
return preferences.reduce((acc, pref) => {
|
|
86
|
-
if (!pref.model || !pref.url || typeof pref.model !== 'string' || typeof pref.url !== 'string') {
|
|
87
|
-
return acc;
|
|
88
|
-
}
|
|
89
|
-
return [
|
|
90
|
-
...acc,
|
|
91
|
-
{
|
|
92
|
-
id: pref.id && typeof pref.id === 'string' ? pref.id : pref.model,
|
|
93
|
-
model: pref.model,
|
|
94
|
-
url: pref.url,
|
|
95
|
-
apiKey: typeof pref.apiKey === 'string' || pref.apiKey === true ? pref.apiKey : undefined
|
|
96
|
-
}
|
|
97
|
-
];
|
|
98
|
-
}, []);
|
|
99
|
-
}
|
|
142
|
+
const openAIModelsWithDisabledStreaming = ['o1-preview'];
|
|
100
143
|
//# sourceMappingURL=openai-frontend-application-contribution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-frontend-application-contribution.js","sourceRoot":"","sources":["../../src/browser/openai-frontend-application-contribution.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,qDAA6F;AAC7F,4DAAkE;AAClE,sCAAgF;AAChF,6DAAwF;
|
|
1
|
+
{"version":3,"file":"openai-frontend-application-contribution.js","sourceRoot":"","sources":["../../src/browser/openai-frontend-application-contribution.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,qDAA6F;AAC7F,4DAAkE;AAClE,sCAAgF;AAChF,6DAAwF;AACxF,wFAAkH;AAElH,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AAG7B,IAAM,qCAAqC,GAA3C,MAAM,qCAAqC;IAA3C;QAQO,eAAU,GAAa,EAAE,CAAC;QAC1B,qBAAgB,GAAsC,EAAE,CAAC;IA6HvE,CAAC;IA3HG,OAAO;QACH,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAS,iCAAY,EAAE,SAAS,CAAC,CAAC;YAC3E,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAE/B,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAW,gCAAW,EAAE,EAAE,CAAC,CAAC;YACrE,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACtD,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;YACjI,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;YAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAoC,0CAAqB,EAAE,EAAE,CAAC,CAAC;YAC9G,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,GAAG,IAAI,CAAC,4CAA4C,CAAC,YAAY,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;YAC7I,IAAI,CAAC,gBAAgB,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;YAE1C,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE;gBAC/C,IAAI,KAAK,CAAC,cAAc,KAAK,iCAAY,EAAE,CAAC;oBACxC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC;qBAAM,IAAI,KAAK,CAAC,cAAc,KAAK,gCAAW,EAAE,CAAC;oBAC9C,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,QAAoB,CAAC,CAAC;gBACxD,CAAC;qBAAM,IAAI,KAAK,CAAC,cAAc,KAAK,0CAAqB,EAAE,CAAC;oBACxD,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,QAA6C,CAAC,CAAC;gBACvF,CAAC;qBAAM,IAAI,KAAK,CAAC,cAAc,KAAK,sDAAgC,EAAE,CAAC;oBACnE,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,QAA4B,CAAC,CAAC;gBAC1E,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAES,kBAAkB,CAAC,SAAmB;QAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAEzC,MAAM,cAAc,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACjF,MAAM,WAAW,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAE9E,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC;QACrF,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;QACtI,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAChC,CAAC;IAEO,sBAAsB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAmB,sDAAgC,EAAE,EAAE,CAAC,CAAC;IAC9F,CAAC;IAES,wBAAwB,CAAC,eAAkD;QACjF,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,4CAA4C,CAAC,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QAC5G,MAAM,SAAS,GAAG,IAAI,CAAC,4CAA4C,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;QAEtG,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACxG,MAAM,mBAAmB,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CACpD,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACpB,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE;YACxB,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK;YAC9B,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;YAC1B,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;YAChC,KAAK,CAAC,eAAe,KAAK,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;QAE7D,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,GAAG,mBAAmB,CAAC,CAAC;QAClE,IAAI,CAAC,gBAAgB,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC;IACjD,CAAC;IAES,4BAA4B,CAAC,WAA6B;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAW,gCAAW,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QAE7H,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAoC,0CAAqB,EAAE,EAAE,CAAC,CAAC;QAC9G,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,GAAG,IAAI,CAAC,4CAA4C,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IAC/H,CAAC;IAES,4BAA4B,CAAC,OAAe,EAAE,eAAiC;QACrF,MAAM,EAAE,GAAG,GAAG,kBAAkB,IAAI,OAAO,EAAE,CAAC;QAC9C,MAAM,mBAAmB,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC;QACzG,OAAO;YACH,EAAE,EAAE,EAAE;YACN,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,CAAC,iCAAiC,CAAC,QAAQ,CAAC,OAAO,CAAC;YACrE,sBAAsB,EAAE,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,eAAe;SAC/D,CAAC;IACN,CAAC;IAES,4CAA4C,CAClD,WAA8C,EAC9C,eAAiC;QAEjC,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;;YACpC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC7F,OAAO,GAAG,CAAC;YACf,CAAC;YAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC;YAE5G,OAAO;gBACH,GAAG,GAAG;gBACN;oBACI,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;oBACjE,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;oBACzF,eAAe,EAAE,MAAA,IAAI,CAAC,eAAe,mCAAI,IAAI;oBAC7C,sBAAsB,EAAE,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,eAAe;iBAC/D;aACJ,CAAC;QACN,CAAC,EAAE,EAAE,CAAC,CAAC;IACX,CAAC;IACS,yBAAyB,CAC/B,OAAe,EACf,UAAkB,EAClB,eAAiC;QAEjC,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAC3C,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CACvG,CAAC;QACF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CACR,wCAAwC,UAAU,gBAAgB,OAAO,2BAA2B,CACvG,CAAC;QACN,CAAC;QACD,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;CACJ,CAAA;AAtIY,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,CAsIjD;AAED,MAAM,iCAAiC,GAAG,CAAC,YAAY,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-preferences.d.ts","sourceRoot":"","sources":["../../src/browser/openai-preferences.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6DAA6D,CAAC;AAG/F,eAAO,MAAM,YAAY,4CAA4C,CAAC;AACtE,eAAO,MAAM,WAAW,oDAAoD,CAAC;AAC7E,eAAO,MAAM,qBAAqB,gDAAgD,CAAC;AAEnF,eAAO,MAAM,uBAAuB,EAAE,
|
|
1
|
+
{"version":3,"file":"openai-preferences.d.ts","sourceRoot":"","sources":["../../src/browser/openai-preferences.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6DAA6D,CAAC;AAG/F,eAAO,MAAM,YAAY,4CAA4C,CAAC;AACtE,eAAO,MAAM,WAAW,oDAAoD,CAAC;AAC7E,eAAO,MAAM,qBAAqB,gDAAgD,CAAC;AAEnF,eAAO,MAAM,uBAAuB,EAAE,gBA4DrC,CAAC"}
|
|
@@ -49,6 +49,8 @@ exports.OpenAiPreferencesSchema = {
|
|
|
49
49
|
\n\
|
|
50
50
|
- provide an `apiKey` to access the API served at the given url. Use `true` to indicate the use of the global OpenAI API key.\
|
|
51
51
|
\n\
|
|
52
|
+
- specify `enableStreaming: false` to indicate that streaming shall not be used.\
|
|
53
|
+
\n\
|
|
52
54
|
Refer to [our documentation](https://theia-ide.org/docs/user_ai/#openai-compatible-models-eg-via-vllm) for more information.',
|
|
53
55
|
default: [],
|
|
54
56
|
items: {
|
|
@@ -70,6 +72,10 @@ exports.OpenAiPreferencesSchema = {
|
|
|
70
72
|
type: ['string', 'boolean'],
|
|
71
73
|
title: 'Either the key to access the API served at the given url or `true` to use the global OpenAI API key',
|
|
72
74
|
},
|
|
75
|
+
enableStreaming: {
|
|
76
|
+
type: 'boolean',
|
|
77
|
+
title: 'Indicates whether the streaming API shall be used. `true` by default.',
|
|
78
|
+
}
|
|
73
79
|
}
|
|
74
80
|
}
|
|
75
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-preferences.js","sourceRoot":"","sources":["../../src/browser/openai-preferences.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAGhF,wFAA2F;AAE9E,QAAA,YAAY,GAAG,yCAAyC,CAAC;AACzD,QAAA,WAAW,GAAG,iDAAiD,CAAC;AAChE,QAAA,qBAAqB,GAAG,6CAA6C,CAAC;AAEtE,QAAA,uBAAuB,GAAqB;IACrD,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACR,CAAC,oBAAY,CAAC,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,mBAAmB,EAAE;iHACgF;YACrG,KAAK,EAAE,+CAAyB;SACnC;QACD,CAAC,mBAAW,CAAC,EAAE;YACX,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,+BAA+B;YAC5C,KAAK,EAAE,+CAAyB;YAChC,OAAO,EAAE,CAAC,QAAQ,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,CAAC;YACnI,KAAK,EAAE;gBACH,IAAI,EAAE,QAAQ;aACjB;SACJ;QACD,CAAC,6BAAqB,CAAC,EAAE;YACrB,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,+CAAyB;YAChC,mBAAmB,EAAE
|
|
1
|
+
{"version":3,"file":"openai-preferences.js","sourceRoot":"","sources":["../../src/browser/openai-preferences.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAGhF,wFAA2F;AAE9E,QAAA,YAAY,GAAG,yCAAyC,CAAC;AACzD,QAAA,WAAW,GAAG,iDAAiD,CAAC;AAChE,QAAA,qBAAqB,GAAG,6CAA6C,CAAC;AAEtE,QAAA,uBAAuB,GAAqB;IACrD,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACR,CAAC,oBAAY,CAAC,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,mBAAmB,EAAE;iHACgF;YACrG,KAAK,EAAE,+CAAyB;SACnC;QACD,CAAC,mBAAW,CAAC,EAAE;YACX,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,+BAA+B;YAC5C,KAAK,EAAE,+CAAyB;YAChC,OAAO,EAAE,CAAC,QAAQ,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,CAAC;YACnI,KAAK,EAAE;gBACH,IAAI,EAAE,QAAQ;aACjB;SACJ;QACD,CAAC,6BAAqB,CAAC,EAAE;YACrB,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,+CAAyB;YAChC,mBAAmB,EAAE;;;;;;;;;;yIAUwG;YAC7H,OAAO,EAAE,EAAE;YACX,KAAK,EAAE;gBACH,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,KAAK,EAAE;wBACH,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,UAAU;qBACpB;oBACD,GAAG,EAAE;wBACD,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,+DAA+D;qBACzE;oBACD,EAAE,EAAE;wBACA,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,0EAA0E;qBACpF;oBACD,MAAM,EAAE;wBACJ,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;wBAC3B,KAAK,EAAE,qGAAqG;qBAC/G;oBACD,eAAe,EAAE;wBACb,IAAI,EAAE,SAAS;wBACf,KAAK,EAAE,uEAAuE;qBACjF;iBACJ;aACJ;SACJ;KACJ;CACJ,CAAC"}
|
|
@@ -17,6 +17,16 @@ export interface OpenAiModelDescription {
|
|
|
17
17
|
* The key for the model. If 'true' is provided the global OpenAI API key will be used.
|
|
18
18
|
*/
|
|
19
19
|
apiKey: string | true | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Indicate whether the streaming API shall be used.
|
|
22
|
+
*/
|
|
23
|
+
enableStreaming: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Default request settings for the OpenAI model.
|
|
26
|
+
*/
|
|
27
|
+
defaultRequestSettings?: {
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
};
|
|
20
30
|
}
|
|
21
31
|
export interface OpenAiLanguageModelsManager {
|
|
22
32
|
apiKey: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-language-models-manager.d.ts","sourceRoot":"","sources":["../../src/common/openai-language-models-manager.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,mCAAmC,6CAA6C,CAAC;AAC9F,eAAO,MAAM,2BAA2B,eAAwC,CAAC;AACjF,MAAM,WAAW,sBAAsB;IACnC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-language-models-manager.d.ts","sourceRoot":"","sources":["../../src/common/openai-language-models-manager.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,mCAAmC,6CAA6C,CAAC;AAC9F,eAAO,MAAM,2BAA2B,eAAwC,CAAC;AACjF,MAAM,WAAW,sBAAsB;IACnC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,sBAAsB,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CACvD;AACD,MAAM,WAAW,2BAA2B;IACxC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACzC,4BAA4B,CAAC,GAAG,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,oBAAoB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;CACpD"}
|
|
@@ -6,17 +6,27 @@ export declare const OpenAiModelIdentifier: unique symbol;
|
|
|
6
6
|
export declare class OpenAiModel implements LanguageModel {
|
|
7
7
|
readonly id: string;
|
|
8
8
|
model: string;
|
|
9
|
+
enableStreaming: boolean;
|
|
9
10
|
apiKey: () => string | undefined;
|
|
10
11
|
url: string | undefined;
|
|
12
|
+
defaultRequestSettings?: {
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
} | undefined;
|
|
11
15
|
/**
|
|
12
16
|
* @param id the unique id for this language model. It will be used to identify the model in the UI.
|
|
13
17
|
* @param model the model id as it is used by the OpenAI API
|
|
14
|
-
* @param
|
|
18
|
+
* @param enableStreaming whether the streaming API shall be used
|
|
19
|
+
* @param apiKey a function that returns the API key to use for this model, called on each request
|
|
20
|
+
* @param url the OpenAI API compatible endpoint where the model is hosted. If not provided the default OpenAI endpoint will be used.
|
|
21
|
+
* @param defaultRequestSettings optional default settings for requests made using this model.
|
|
15
22
|
*/
|
|
16
|
-
constructor(id: string, model: string, apiKey: () => string | undefined, url: string | undefined
|
|
23
|
+
constructor(id: string, model: string, enableStreaming: boolean, apiKey: () => string | undefined, url: string | undefined, defaultRequestSettings?: {
|
|
24
|
+
[key: string]: unknown;
|
|
25
|
+
} | undefined);
|
|
26
|
+
protected getSettings(request: LanguageModelRequest): Record<string, unknown>;
|
|
17
27
|
request(request: LanguageModelRequest, cancellationToken?: CancellationToken): Promise<LanguageModelResponse>;
|
|
18
28
|
protected handleNonStreamingRequest(openai: OpenAI, request: LanguageModelRequest): Promise<LanguageModelTextResponse>;
|
|
19
|
-
protected isNonStreamingModel(
|
|
29
|
+
protected isNonStreamingModel(_model: string): boolean;
|
|
20
30
|
protected supportsStructuredOutput(): boolean;
|
|
21
31
|
protected handleStructuredOutputRequest(openai: OpenAI, request: LanguageModelRequest): Promise<LanguageModelParsedResponse>;
|
|
22
32
|
private getCompletionContent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-language-model.d.ts","sourceRoot":"","sources":["../../src/node/openai-language-model.ts"],"names":[],"mappings":"AAgBA,OAAO,EACH,aAAa,EACb,2BAA2B,EAC3B,oBAAoB,EAEpB,qBAAqB,EAErB,yBAAyB,EAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAG/E,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAoBrE,qBAAa,WAAY,YAAW,aAAa;
|
|
1
|
+
{"version":3,"file":"openai-language-model.d.ts","sourceRoot":"","sources":["../../src/node/openai-language-model.ts"],"names":[],"mappings":"AAgBA,OAAO,EACH,aAAa,EACb,2BAA2B,EAC3B,oBAAoB,EAEpB,qBAAqB,EAErB,yBAAyB,EAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAG/E,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAoBrE,qBAAa,WAAY,YAAW,aAAa;aAWzB,EAAE,EAAE,MAAM;IACnB,KAAK,EAAE,MAAM;IACb,eAAe,EAAE,OAAO;IACxB,MAAM,EAAE,MAAM,MAAM,GAAG,SAAS;IAChC,GAAG,EAAE,MAAM,GAAG,SAAS;IACvB,sBAAsB,CAAC;;;IAdlC;;;;;;;OAOG;gBAEiB,EAAE,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,OAAO,EACxB,MAAM,EAAE,MAAM,MAAM,GAAG,SAAS,EAChC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,sBAAsB,CAAC;;iBAA4B;IAG9D,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQvE,OAAO,CAAC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;cAiFnG,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAe5H,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItD,SAAS,CAAC,wBAAwB,IAAI,OAAO;cAS7B,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAmBlI,OAAO,CAAC,oBAAoB;IAO5B,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,gCAAgC,EAAE,GAAG,SAAS;IAYpG,SAAS,CAAC,gBAAgB,IAAI,MAAM;CAQvC"}
|
|
@@ -38,16 +38,29 @@ class OpenAiModel {
|
|
|
38
38
|
/**
|
|
39
39
|
* @param id the unique id for this language model. It will be used to identify the model in the UI.
|
|
40
40
|
* @param model the model id as it is used by the OpenAI API
|
|
41
|
-
* @param
|
|
41
|
+
* @param enableStreaming whether the streaming API shall be used
|
|
42
|
+
* @param apiKey a function that returns the API key to use for this model, called on each request
|
|
43
|
+
* @param url the OpenAI API compatible endpoint where the model is hosted. If not provided the default OpenAI endpoint will be used.
|
|
44
|
+
* @param defaultRequestSettings optional default settings for requests made using this model.
|
|
42
45
|
*/
|
|
43
|
-
constructor(id, model, apiKey, url) {
|
|
46
|
+
constructor(id, model, enableStreaming, apiKey, url, defaultRequestSettings) {
|
|
44
47
|
this.id = id;
|
|
45
48
|
this.model = model;
|
|
49
|
+
this.enableStreaming = enableStreaming;
|
|
46
50
|
this.apiKey = apiKey;
|
|
47
51
|
this.url = url;
|
|
52
|
+
this.defaultRequestSettings = defaultRequestSettings;
|
|
53
|
+
}
|
|
54
|
+
getSettings(request) {
|
|
55
|
+
const settings = request.settings ? request.settings : this.defaultRequestSettings;
|
|
56
|
+
if (!settings) {
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
return settings;
|
|
48
60
|
}
|
|
49
61
|
async request(request, cancellationToken) {
|
|
50
62
|
var _a;
|
|
63
|
+
const settings = this.getSettings(request);
|
|
51
64
|
const openai = this.initializeOpenAi();
|
|
52
65
|
if (this.isNonStreamingModel(this.model)) {
|
|
53
66
|
return this.handleNonStreamingRequest(openai, request);
|
|
@@ -64,7 +77,7 @@ class OpenAiModel {
|
|
|
64
77
|
stream: true,
|
|
65
78
|
tools: tools,
|
|
66
79
|
tool_choice: 'auto',
|
|
67
|
-
...
|
|
80
|
+
...settings
|
|
68
81
|
});
|
|
69
82
|
}
|
|
70
83
|
else {
|
|
@@ -72,7 +85,7 @@ class OpenAiModel {
|
|
|
72
85
|
model: this.model,
|
|
73
86
|
messages: request.messages.map(toOpenAIMessage),
|
|
74
87
|
stream: true,
|
|
75
|
-
...
|
|
88
|
+
...settings
|
|
76
89
|
});
|
|
77
90
|
}
|
|
78
91
|
cancellationToken === null || cancellationToken === void 0 ? void 0 : cancellationToken.onCancellationRequested(() => {
|
|
@@ -125,18 +138,19 @@ class OpenAiModel {
|
|
|
125
138
|
}
|
|
126
139
|
async handleNonStreamingRequest(openai, request) {
|
|
127
140
|
var _a;
|
|
141
|
+
const settings = this.getSettings(request);
|
|
128
142
|
const response = await openai.chat.completions.create({
|
|
129
143
|
model: this.model,
|
|
130
144
|
messages: request.messages.map(toOpenAIMessage),
|
|
131
|
-
...
|
|
145
|
+
...settings
|
|
132
146
|
});
|
|
133
147
|
const message = response.choices[0].message;
|
|
134
148
|
return {
|
|
135
149
|
text: (_a = message.content) !== null && _a !== void 0 ? _a : ''
|
|
136
150
|
};
|
|
137
151
|
}
|
|
138
|
-
isNonStreamingModel(
|
|
139
|
-
return
|
|
152
|
+
isNonStreamingModel(_model) {
|
|
153
|
+
return !this.enableStreaming;
|
|
140
154
|
}
|
|
141
155
|
supportsStructuredOutput() {
|
|
142
156
|
// see https://platform.openai.com/docs/models/gpt-4o
|
|
@@ -148,12 +162,13 @@ class OpenAiModel {
|
|
|
148
162
|
}
|
|
149
163
|
async handleStructuredOutputRequest(openai, request) {
|
|
150
164
|
var _a;
|
|
165
|
+
const settings = this.getSettings(request);
|
|
151
166
|
// TODO implement tool support for structured output (parse() seems to require different tool format)
|
|
152
167
|
const result = await openai.beta.chat.completions.parse({
|
|
153
168
|
model: this.model,
|
|
154
169
|
messages: request.messages.map(toOpenAIMessage),
|
|
155
170
|
response_format: request.response_format,
|
|
156
|
-
...
|
|
171
|
+
...settings
|
|
157
172
|
});
|
|
158
173
|
const message = result.choices[0].message;
|
|
159
174
|
if (message.refusal || message.parsed === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-language-model.js","sourceRoot":"","sources":["../../src/node/openai-language-model.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAYhF,mCAA4B;AAKf,QAAA,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAErE,SAAS,eAAe,CAAC,OAAoC;IACzD,OAAO;QACH,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC;QAC3B,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;KAC/B,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,OAAoC;IACtD,QAAQ,OAAO,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC;QACpB,KAAK,IAAI;YACL,OAAO,WAAW,CAAC;QACvB;YACI,OAAO,MAAM,CAAC;IACtB,CAAC;AACL,CAAC;AAED,MAAa,WAAW;IAEpB
|
|
1
|
+
{"version":3,"file":"openai-language-model.js","sourceRoot":"","sources":["../../src/node/openai-language-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-language-models-manager-impl.d.ts","sourceRoot":"","sources":["../../src/node/openai-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,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAGtC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAEhE,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAIK,4BAA4B,CAAC,GAAG,iBAAiB,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-language-models-manager-impl.d.ts","sourceRoot":"","sources":["../../src/node/openai-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,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAGtC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAEhE,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAIK,4BAA4B,CAAC,GAAG,iBAAiB,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCjG,oBAAoB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAIjD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAO9C"}
|
|
@@ -41,20 +41,19 @@ let OpenAiLanguageModelsManagerImpl = class OpenAiLanguageModelsManagerImpl {
|
|
|
41
41
|
};
|
|
42
42
|
if (model) {
|
|
43
43
|
if (!(model instanceof openai_language_model_1.OpenAiModel)) {
|
|
44
|
-
console.warn(`
|
|
44
|
+
console.warn(`OpenAI: model ${modelDescription.id} is not an OpenAI model`);
|
|
45
45
|
continue;
|
|
46
46
|
}
|
|
47
|
-
if (!modelDescription.url) {
|
|
48
|
-
// This seems to be an official model, but it was already created. This can happen during the initializing of more than one frontend.
|
|
49
|
-
console.info(`Open AI: skip creating model ${modelDescription.id} because it already exists`);
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
model.url = modelDescription.url;
|
|
53
47
|
model.model = modelDescription.model;
|
|
48
|
+
model.enableStreaming = modelDescription.enableStreaming;
|
|
49
|
+
model.url = modelDescription.url;
|
|
54
50
|
model.apiKey = apiKeyProvider;
|
|
51
|
+
model.defaultRequestSettings = modelDescription.defaultRequestSettings;
|
|
55
52
|
}
|
|
56
53
|
else {
|
|
57
|
-
this.languageModelRegistry.addLanguageModels([
|
|
54
|
+
this.languageModelRegistry.addLanguageModels([
|
|
55
|
+
new openai_language_model_1.OpenAiModel(modelDescription.id, modelDescription.model, modelDescription.enableStreaming, apiKeyProvider, modelDescription.url, modelDescription.defaultRequestSettings)
|
|
56
|
+
]);
|
|
58
57
|
}
|
|
59
58
|
}
|
|
60
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-language-models-manager-impl.js","sourceRoot":"","sources":["../../src/node/openai-language-models-manager-impl.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4CAAuD;AACvD,4DAAkE;AAClE,mEAAsD;AAI/C,IAAM,+BAA+B,GAArC,MAAM,+BAA+B;IAOxC,IAAI,MAAM;;QACN,OAAO,MAAA,IAAI,CAAC,OAAO,mCAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACtD,CAAC;IAED,6EAA6E;IAC7E,6CAA6C;IAC7C,KAAK,CAAC,4BAA4B,CAAC,GAAG,iBAA2C;QAC7E,KAAK,MAAM,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrF,MAAM,cAAc,GAAG,GAAG,EAAE;gBACxB,IAAI,gBAAgB,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;oBACnC,OAAO,IAAI,CAAC,MAAM,CAAC;gBACvB,CAAC;gBACD,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC;oBAC1B,OAAO,gBAAgB,CAAC,MAAM,CAAC;gBACnC,CAAC;gBACD,OAAO,SAAS,CAAC;YACrB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-language-models-manager-impl.js","sourceRoot":"","sources":["../../src/node/openai-language-models-manager-impl.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4CAAuD;AACvD,4DAAkE;AAClE,mEAAsD;AAI/C,IAAM,+BAA+B,GAArC,MAAM,+BAA+B;IAOxC,IAAI,MAAM;;QACN,OAAO,MAAA,IAAI,CAAC,OAAO,mCAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACtD,CAAC;IAED,6EAA6E;IAC7E,6CAA6C;IAC7C,KAAK,CAAC,4BAA4B,CAAC,GAAG,iBAA2C;QAC7E,KAAK,MAAM,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrF,MAAM,cAAc,GAAG,GAAG,EAAE;gBACxB,IAAI,gBAAgB,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;oBACnC,OAAO,IAAI,CAAC,MAAM,CAAC;gBACvB,CAAC;gBACD,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC;oBAC1B,OAAO,gBAAgB,CAAC,MAAM,CAAC;gBACnC,CAAC;gBACD,OAAO,SAAS,CAAC;YACrB,CAAC,CAAC;YAEF,IAAI,KAAK,EAAE,CAAC;gBACR,IAAI,CAAC,CAAC,KAAK,YAAY,mCAAW,CAAC,EAAE,CAAC;oBAClC,OAAO,CAAC,IAAI,CAAC,iBAAiB,gBAAgB,CAAC,EAAE,yBAAyB,CAAC,CAAC;oBAC5E,SAAS;gBACb,CAAC;gBACD,KAAK,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC;gBACrC,KAAK,CAAC,eAAe,GAAG,gBAAgB,CAAC,eAAe,CAAC;gBACzD,KAAK,CAAC,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC;gBACjC,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC;gBAC9B,KAAK,CAAC,sBAAsB,GAAG,gBAAgB,CAAC,sBAAsB,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC;oBACzC,IAAI,mCAAW,CACX,gBAAgB,CAAC,EAAE,EACnB,gBAAgB,CAAC,KAAK,EACtB,gBAAgB,CAAC,eAAe,EAChC,cAAc,EACd,gBAAgB,CAAC,GAAG,EACpB,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,CAAC;IAC9D,CAAC;IAED,SAAS,CAAC,MAA0B;QAChC,IAAI,MAAM,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QAC1B,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAC7B,CAAC;IACL,CAAC;CACJ,CAAA;AA9DY,0EAA+B;AAKrB;IADlB,IAAA,kBAAM,EAAC,+BAAqB,CAAC;;8EACkC;0CALvD,+BAA+B;IAD3C,IAAA,sBAAU,GAAE;GACA,+BAA+B,CA8D3C"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-openai",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.56.0",
|
|
4
4
|
"description": "Theia - OpenAI 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
|
"openai": "^4.55.7",
|
|
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
|
}
|
|
@@ -18,6 +18,9 @@ import { FrontendApplicationContribution, PreferenceService } from '@theia/core/
|
|
|
18
18
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
19
19
|
import { OpenAiLanguageModelsManager, OpenAiModelDescription } from '../common';
|
|
20
20
|
import { API_KEY_PREF, CUSTOM_ENDPOINTS_PREF, MODELS_PREF } from './openai-preferences';
|
|
21
|
+
import { PREFERENCE_NAME_REQUEST_SETTINGS, RequestSetting } from '@theia/ai-core/lib/browser/ai-core-preferences';
|
|
22
|
+
|
|
23
|
+
const OPENAI_PROVIDER_ID = 'openai';
|
|
21
24
|
|
|
22
25
|
@injectable()
|
|
23
26
|
export class OpenAiFrontendApplicationContribution implements FrontendApplicationContribution {
|
|
@@ -28,7 +31,6 @@ export class OpenAiFrontendApplicationContribution implements FrontendApplicatio
|
|
|
28
31
|
@inject(OpenAiLanguageModelsManager)
|
|
29
32
|
protected manager: OpenAiLanguageModelsManager;
|
|
30
33
|
|
|
31
|
-
// The preferenceChange.oldValue is always undefined for some reason
|
|
32
34
|
protected prevModels: string[] = [];
|
|
33
35
|
protected prevCustomModels: Partial<OpenAiModelDescription>[] = [];
|
|
34
36
|
|
|
@@ -38,63 +40,123 @@ export class OpenAiFrontendApplicationContribution implements FrontendApplicatio
|
|
|
38
40
|
this.manager.setApiKey(apiKey);
|
|
39
41
|
|
|
40
42
|
const models = this.preferenceService.get<string[]>(MODELS_PREF, []);
|
|
41
|
-
this.
|
|
43
|
+
const requestSettings = this.getRequestSettingsPref();
|
|
44
|
+
this.manager.createOrUpdateLanguageModels(...models.map(modelId => this.createOpenAIModelDescription(modelId, requestSettings)));
|
|
42
45
|
this.prevModels = [...models];
|
|
43
46
|
|
|
44
47
|
const customModels = this.preferenceService.get<Partial<OpenAiModelDescription>[]>(CUSTOM_ENDPOINTS_PREF, []);
|
|
45
|
-
this.manager.createOrUpdateLanguageModels(...createCustomModelDescriptionsFromPreferences(customModels));
|
|
48
|
+
this.manager.createOrUpdateLanguageModels(...this.createCustomModelDescriptionsFromPreferences(customModels, this.getRequestSettingsPref()));
|
|
46
49
|
this.prevCustomModels = [...customModels];
|
|
47
50
|
|
|
48
51
|
this.preferenceService.onPreferenceChanged(event => {
|
|
49
52
|
if (event.preferenceName === API_KEY_PREF) {
|
|
50
53
|
this.manager.setApiKey(event.newValue);
|
|
51
54
|
} else if (event.preferenceName === MODELS_PREF) {
|
|
52
|
-
|
|
53
|
-
const newModels = new Set(event.newValue as string[]);
|
|
54
|
-
|
|
55
|
-
const modelsToRemove = [...oldModels].filter(model => !newModels.has(model));
|
|
56
|
-
const modelsToAdd = [...newModels].filter(model => !oldModels.has(model));
|
|
57
|
-
|
|
58
|
-
this.manager.removeLanguageModels(...modelsToRemove.map(model => `openai/${model}`));
|
|
59
|
-
this.manager.createOrUpdateLanguageModels(...modelsToAdd.map(createOpenAIModelDescription));
|
|
60
|
-
this.prevModels = [...event.newValue];
|
|
55
|
+
this.handleModelChanges(event.newValue as string[]);
|
|
61
56
|
} else if (event.preferenceName === CUSTOM_ENDPOINTS_PREF) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const modelsToRemove = oldModels.filter(model => !newModels.some(newModel => newModel.id === model.id));
|
|
66
|
-
const modelsToAddOrUpdate = newModels.filter(newModel => !oldModels.some(model =>
|
|
67
|
-
model.id === newModel.id && model.model === newModel.model && model.url === newModel.url && model.apiKey === newModel.apiKey));
|
|
68
|
-
|
|
69
|
-
this.manager.removeLanguageModels(...modelsToRemove.map(model => model.id));
|
|
70
|
-
this.manager.createOrUpdateLanguageModels(...modelsToAddOrUpdate);
|
|
57
|
+
this.handleCustomModelChanges(event.newValue as Partial<OpenAiModelDescription>[]);
|
|
58
|
+
} else if (event.preferenceName === PREFERENCE_NAME_REQUEST_SETTINGS) {
|
|
59
|
+
this.handleRequestSettingsChanges(event.newValue as RequestSetting[]);
|
|
71
60
|
}
|
|
72
61
|
});
|
|
73
62
|
});
|
|
74
63
|
}
|
|
75
|
-
}
|
|
76
64
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
model: modelId,
|
|
81
|
-
apiKey: true
|
|
82
|
-
};
|
|
83
|
-
}
|
|
65
|
+
protected handleModelChanges(newModels: string[]): void {
|
|
66
|
+
const oldModels = new Set(this.prevModels);
|
|
67
|
+
const updatedModels = new Set(newModels);
|
|
84
68
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
69
|
+
const modelsToRemove = [...oldModels].filter(model => !updatedModels.has(model));
|
|
70
|
+
const modelsToAdd = [...updatedModels].filter(model => !oldModels.has(model));
|
|
71
|
+
|
|
72
|
+
this.manager.removeLanguageModels(...modelsToRemove.map(model => `openai/${model}`));
|
|
73
|
+
const requestSettings = this.getRequestSettingsPref();
|
|
74
|
+
this.manager.createOrUpdateLanguageModels(...modelsToAdd.map(modelId => this.createOpenAIModelDescription(modelId, requestSettings)));
|
|
75
|
+
this.prevModels = newModels;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private getRequestSettingsPref(): RequestSetting[] {
|
|
79
|
+
return this.preferenceService.get<RequestSetting[]>(PREFERENCE_NAME_REQUEST_SETTINGS, []);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
protected handleCustomModelChanges(newCustomModels: Partial<OpenAiModelDescription>[]): void {
|
|
83
|
+
const requestSettings = this.getRequestSettingsPref();
|
|
84
|
+
const oldModels = this.createCustomModelDescriptionsFromPreferences(this.prevCustomModels, requestSettings);
|
|
85
|
+
const newModels = this.createCustomModelDescriptionsFromPreferences(newCustomModels, requestSettings);
|
|
86
|
+
|
|
87
|
+
const modelsToRemove = oldModels.filter(model => !newModels.some(newModel => newModel.id === model.id));
|
|
88
|
+
const modelsToAddOrUpdate = newModels.filter(newModel =>
|
|
89
|
+
!oldModels.some(model =>
|
|
90
|
+
model.id === newModel.id &&
|
|
91
|
+
model.model === newModel.model &&
|
|
92
|
+
model.url === newModel.url &&
|
|
93
|
+
model.apiKey === newModel.apiKey &&
|
|
94
|
+
model.enableStreaming === newModel.enableStreaming));
|
|
95
|
+
|
|
96
|
+
this.manager.removeLanguageModels(...modelsToRemove.map(model => model.id));
|
|
97
|
+
this.manager.createOrUpdateLanguageModels(...modelsToAddOrUpdate);
|
|
98
|
+
this.prevCustomModels = [...newCustomModels];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
protected handleRequestSettingsChanges(newSettings: RequestSetting[]): void {
|
|
102
|
+
const models = this.preferenceService.get<string[]>(MODELS_PREF, []);
|
|
103
|
+
this.manager.createOrUpdateLanguageModels(...models.map(modelId => this.createOpenAIModelDescription(modelId, newSettings)));
|
|
104
|
+
|
|
105
|
+
const customModels = this.preferenceService.get<Partial<OpenAiModelDescription>[]>(CUSTOM_ENDPOINTS_PREF, []);
|
|
106
|
+
this.manager.createOrUpdateLanguageModels(...this.createCustomModelDescriptionsFromPreferences(customModels, newSettings));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
protected createOpenAIModelDescription(modelId: string, requestSettings: RequestSetting[]): OpenAiModelDescription {
|
|
110
|
+
const id = `${OPENAI_PROVIDER_ID}/${modelId}`;
|
|
111
|
+
const modelRequestSetting = this.getMatchingRequestSetting(modelId, OPENAI_PROVIDER_ID, requestSettings);
|
|
112
|
+
return {
|
|
113
|
+
id: id,
|
|
114
|
+
model: modelId,
|
|
115
|
+
apiKey: true,
|
|
116
|
+
enableStreaming: !openAIModelsWithDisabledStreaming.includes(modelId),
|
|
117
|
+
defaultRequestSettings: modelRequestSetting?.requestSettings
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
protected createCustomModelDescriptionsFromPreferences(
|
|
122
|
+
preferences: Partial<OpenAiModelDescription>[],
|
|
123
|
+
requestSettings: RequestSetting[]
|
|
124
|
+
): OpenAiModelDescription[] {
|
|
125
|
+
return preferences.reduce((acc, pref) => {
|
|
126
|
+
if (!pref.model || !pref.url || typeof pref.model !== 'string' || typeof pref.url !== 'string') {
|
|
127
|
+
return acc;
|
|
97
128
|
}
|
|
98
|
-
|
|
99
|
-
|
|
129
|
+
|
|
130
|
+
const modelRequestSetting = this.getMatchingRequestSetting(pref.model, OPENAI_PROVIDER_ID, requestSettings);
|
|
131
|
+
|
|
132
|
+
return [
|
|
133
|
+
...acc,
|
|
134
|
+
{
|
|
135
|
+
id: pref.id && typeof pref.id === 'string' ? pref.id : pref.model,
|
|
136
|
+
model: pref.model,
|
|
137
|
+
url: pref.url,
|
|
138
|
+
apiKey: typeof pref.apiKey === 'string' || pref.apiKey === true ? pref.apiKey : undefined,
|
|
139
|
+
enableStreaming: pref.enableStreaming ?? true,
|
|
140
|
+
defaultRequestSettings: modelRequestSetting?.requestSettings
|
|
141
|
+
}
|
|
142
|
+
];
|
|
143
|
+
}, []);
|
|
144
|
+
}
|
|
145
|
+
protected getMatchingRequestSetting(
|
|
146
|
+
modelId: string,
|
|
147
|
+
providerId: string,
|
|
148
|
+
requestSettings: RequestSetting[]
|
|
149
|
+
): RequestSetting | undefined {
|
|
150
|
+
const matchingSettings = requestSettings.filter(
|
|
151
|
+
setting => (!setting.providerId || setting.providerId === providerId) && setting.modelId === modelId
|
|
152
|
+
);
|
|
153
|
+
if (matchingSettings.length > 1) {
|
|
154
|
+
console.warn(
|
|
155
|
+
`Multiple entries found for provider "${providerId}" and model "${modelId}". Using the first match.`
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
return matchingSettings[0];
|
|
159
|
+
}
|
|
100
160
|
}
|
|
161
|
+
|
|
162
|
+
const openAIModelsWithDisabledStreaming = ['o1-preview'];
|
|
@@ -50,6 +50,8 @@ export const OpenAiPreferencesSchema: PreferenceSchema = {
|
|
|
50
50
|
\n\
|
|
51
51
|
- provide an `apiKey` to access the API served at the given url. Use `true` to indicate the use of the global OpenAI API key.\
|
|
52
52
|
\n\
|
|
53
|
+
- specify `enableStreaming: false` to indicate that streaming shall not be used.\
|
|
54
|
+
\n\
|
|
53
55
|
Refer to [our documentation](https://theia-ide.org/docs/user_ai/#openai-compatible-models-eg-via-vllm) for more information.',
|
|
54
56
|
default: [],
|
|
55
57
|
items: {
|
|
@@ -71,6 +73,10 @@ export const OpenAiPreferencesSchema: PreferenceSchema = {
|
|
|
71
73
|
type: ['string', 'boolean'],
|
|
72
74
|
title: 'Either the key to access the API served at the given url or `true` to use the global OpenAI API key',
|
|
73
75
|
},
|
|
76
|
+
enableStreaming: {
|
|
77
|
+
type: 'boolean',
|
|
78
|
+
title: 'Indicates whether the streaming API shall be used. `true` by default.',
|
|
79
|
+
}
|
|
74
80
|
}
|
|
75
81
|
}
|
|
76
82
|
}
|
|
@@ -32,6 +32,14 @@ export interface OpenAiModelDescription {
|
|
|
32
32
|
* The key for the model. If 'true' is provided the global OpenAI API key will be used.
|
|
33
33
|
*/
|
|
34
34
|
apiKey: string | true | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Indicate whether the streaming API shall be used.
|
|
37
|
+
*/
|
|
38
|
+
enableStreaming: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Default request settings for the OpenAI model.
|
|
41
|
+
*/
|
|
42
|
+
defaultRequestSettings?: { [key: string]: unknown };
|
|
35
43
|
}
|
|
36
44
|
export interface OpenAiLanguageModelsManager {
|
|
37
45
|
apiKey: string | undefined;
|
|
@@ -54,11 +54,30 @@ export class OpenAiModel implements LanguageModel {
|
|
|
54
54
|
/**
|
|
55
55
|
* @param id the unique id for this language model. It will be used to identify the model in the UI.
|
|
56
56
|
* @param model the model id as it is used by the OpenAI API
|
|
57
|
-
* @param
|
|
57
|
+
* @param enableStreaming whether the streaming API shall be used
|
|
58
|
+
* @param apiKey a function that returns the API key to use for this model, called on each request
|
|
59
|
+
* @param url the OpenAI API compatible endpoint where the model is hosted. If not provided the default OpenAI endpoint will be used.
|
|
60
|
+
* @param defaultRequestSettings optional default settings for requests made using this model.
|
|
58
61
|
*/
|
|
59
|
-
constructor(
|
|
62
|
+
constructor(
|
|
63
|
+
public readonly id: string,
|
|
64
|
+
public model: string,
|
|
65
|
+
public enableStreaming: boolean,
|
|
66
|
+
public apiKey: () => string | undefined,
|
|
67
|
+
public url: string | undefined,
|
|
68
|
+
public defaultRequestSettings?: { [key: string]: unknown }
|
|
69
|
+
) { }
|
|
70
|
+
|
|
71
|
+
protected getSettings(request: LanguageModelRequest): Record<string, unknown> {
|
|
72
|
+
const settings = request.settings ? request.settings : this.defaultRequestSettings;
|
|
73
|
+
if (!settings) {
|
|
74
|
+
return {};
|
|
75
|
+
}
|
|
76
|
+
return settings;
|
|
77
|
+
}
|
|
60
78
|
|
|
61
79
|
async request(request: LanguageModelRequest, cancellationToken?: CancellationToken): Promise<LanguageModelResponse> {
|
|
80
|
+
const settings = this.getSettings(request);
|
|
62
81
|
const openai = this.initializeOpenAi();
|
|
63
82
|
|
|
64
83
|
if (this.isNonStreamingModel(this.model)) {
|
|
@@ -78,14 +97,14 @@ export class OpenAiModel implements LanguageModel {
|
|
|
78
97
|
stream: true,
|
|
79
98
|
tools: tools,
|
|
80
99
|
tool_choice: 'auto',
|
|
81
|
-
...
|
|
100
|
+
...settings
|
|
82
101
|
});
|
|
83
102
|
} else {
|
|
84
103
|
runner = openai.beta.chat.completions.stream({
|
|
85
104
|
model: this.model,
|
|
86
105
|
messages: request.messages.map(toOpenAIMessage),
|
|
87
106
|
stream: true,
|
|
88
|
-
...
|
|
107
|
+
...settings
|
|
89
108
|
});
|
|
90
109
|
}
|
|
91
110
|
cancellationToken?.onCancellationRequested(() => {
|
|
@@ -139,10 +158,11 @@ export class OpenAiModel implements LanguageModel {
|
|
|
139
158
|
}
|
|
140
159
|
|
|
141
160
|
protected async handleNonStreamingRequest(openai: OpenAI, request: LanguageModelRequest): Promise<LanguageModelTextResponse> {
|
|
161
|
+
const settings = this.getSettings(request);
|
|
142
162
|
const response = await openai.chat.completions.create({
|
|
143
163
|
model: this.model,
|
|
144
164
|
messages: request.messages.map(toOpenAIMessage),
|
|
145
|
-
...
|
|
165
|
+
...settings
|
|
146
166
|
});
|
|
147
167
|
|
|
148
168
|
const message = response.choices[0].message;
|
|
@@ -152,8 +172,8 @@ export class OpenAiModel implements LanguageModel {
|
|
|
152
172
|
};
|
|
153
173
|
}
|
|
154
174
|
|
|
155
|
-
protected isNonStreamingModel(
|
|
156
|
-
return
|
|
175
|
+
protected isNonStreamingModel(_model: string): boolean {
|
|
176
|
+
return !this.enableStreaming;
|
|
157
177
|
}
|
|
158
178
|
|
|
159
179
|
protected supportsStructuredOutput(): boolean {
|
|
@@ -166,12 +186,13 @@ export class OpenAiModel implements LanguageModel {
|
|
|
166
186
|
}
|
|
167
187
|
|
|
168
188
|
protected async handleStructuredOutputRequest(openai: OpenAI, request: LanguageModelRequest): Promise<LanguageModelParsedResponse> {
|
|
189
|
+
const settings = this.getSettings(request);
|
|
169
190
|
// TODO implement tool support for structured output (parse() seems to require different tool format)
|
|
170
191
|
const result = await openai.beta.chat.completions.parse({
|
|
171
192
|
model: this.model,
|
|
172
193
|
messages: request.messages.map(toOpenAIMessage),
|
|
173
194
|
response_format: request.response_format,
|
|
174
|
-
...
|
|
195
|
+
...settings
|
|
175
196
|
});
|
|
176
197
|
const message = result.choices[0].message;
|
|
177
198
|
if (message.refusal || message.parsed === undefined) {
|
|
@@ -45,21 +45,28 @@ export class OpenAiLanguageModelsManagerImpl implements OpenAiLanguageModelsMana
|
|
|
45
45
|
}
|
|
46
46
|
return undefined;
|
|
47
47
|
};
|
|
48
|
+
|
|
48
49
|
if (model) {
|
|
49
50
|
if (!(model instanceof OpenAiModel)) {
|
|
50
|
-
console.warn(`
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
if (!modelDescription.url) {
|
|
54
|
-
// This seems to be an official model, but it was already created. This can happen during the initializing of more than one frontend.
|
|
55
|
-
console.info(`Open AI: skip creating model ${modelDescription.id} because it already exists`);
|
|
51
|
+
console.warn(`OpenAI: model ${modelDescription.id} is not an OpenAI model`);
|
|
56
52
|
continue;
|
|
57
53
|
}
|
|
58
|
-
model.url = modelDescription.url;
|
|
59
54
|
model.model = modelDescription.model;
|
|
55
|
+
model.enableStreaming = modelDescription.enableStreaming;
|
|
56
|
+
model.url = modelDescription.url;
|
|
60
57
|
model.apiKey = apiKeyProvider;
|
|
58
|
+
model.defaultRequestSettings = modelDescription.defaultRequestSettings;
|
|
61
59
|
} else {
|
|
62
|
-
this.languageModelRegistry.addLanguageModels([
|
|
60
|
+
this.languageModelRegistry.addLanguageModels([
|
|
61
|
+
new OpenAiModel(
|
|
62
|
+
modelDescription.id,
|
|
63
|
+
modelDescription.model,
|
|
64
|
+
modelDescription.enableStreaming,
|
|
65
|
+
apiKeyProvider,
|
|
66
|
+
modelDescription.url,
|
|
67
|
+
modelDescription.defaultRequestSettings
|
|
68
|
+
)
|
|
69
|
+
]);
|
|
63
70
|
}
|
|
64
71
|
}
|
|
65
72
|
}
|