@theia/ai-openai 1.55.1 → 1.57.0-next.112
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/README.md +56 -1
- 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 +93 -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 +25 -1
- package/lib/browser/openai-preferences.js.map +1 -1
- package/lib/common/openai-language-models-manager.d.ts +23 -0
- package/lib/common/openai-language-models-manager.d.ts.map +1 -1
- package/lib/node/openai-backend-module.d.ts.map +1 -1
- package/lib/node/openai-backend-module.js +6 -1
- package/lib/node/openai-backend-module.js.map +1 -1
- package/lib/node/openai-language-model.d.ts +23 -6
- package/lib/node/openai-language-model.d.ts.map +1 -1
- package/lib/node/openai-language-model.js +83 -46
- package/lib/node/openai-language-model.js.map +1 -1
- package/lib/node/openai-language-models-manager-impl.d.ts +3 -0
- package/lib/node/openai-language-models-manager-impl.d.ts.map +1 -1
- package/lib/node/openai-language-models-manager-impl.js +31 -8
- package/lib/node/openai-language-models-manager-impl.js.map +1 -1
- package/package.json +8 -8
- package/src/browser/openai-frontend-application-contribution.ts +116 -43
- package/src/browser/openai-preferences.ts +25 -1
- package/src/common/openai-language-models-manager.ts +21 -0
- package/src/node/openai-backend-module.ts +7 -1
- package/src/node/openai-language-model.ts +93 -50
- package/src/node/openai-language-models-manager-impl.ts +43 -8
|
@@ -18,61 +18,66 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
18
18
|
exports.OpenAiModel = exports.OpenAiModelIdentifier = void 0;
|
|
19
19
|
const openai_1 = require("openai");
|
|
20
20
|
exports.OpenAiModelIdentifier = Symbol('OpenAiModelIdentifier');
|
|
21
|
-
function toOpenAIMessage(message) {
|
|
22
|
-
return {
|
|
23
|
-
role: toOpenAiRole(message),
|
|
24
|
-
content: message.query || ''
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
function toOpenAiRole(message) {
|
|
28
|
-
switch (message.actor) {
|
|
29
|
-
case 'system':
|
|
30
|
-
return 'system';
|
|
31
|
-
case 'ai':
|
|
32
|
-
return 'assistant';
|
|
33
|
-
default:
|
|
34
|
-
return 'user';
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
21
|
class OpenAiModel {
|
|
38
22
|
/**
|
|
39
23
|
* @param id the unique id for this language model. It will be used to identify the model in the UI.
|
|
40
24
|
* @param model the model id as it is used by the OpenAI API
|
|
41
|
-
* @param
|
|
25
|
+
* @param enableStreaming whether the streaming API shall be used
|
|
26
|
+
* @param apiKey a function that returns the API key to use for this model, called on each request
|
|
27
|
+
* @param apiVersion a function that returns the OpenAPI version to use for this model, called on each request
|
|
28
|
+
* @param supportsDeveloperMessage whether the model supports the `developer` role
|
|
29
|
+
* @param url the OpenAI API compatible endpoint where the model is hosted. If not provided the default OpenAI endpoint will be used.
|
|
30
|
+
* @param defaultRequestSettings optional default settings for requests made using this model.
|
|
42
31
|
*/
|
|
43
|
-
constructor(id, model, apiKey, url) {
|
|
32
|
+
constructor(id, model, enableStreaming, apiKey, apiVersion, supportsDeveloperMessage, supportsStructuredOutput, url, defaultRequestSettings) {
|
|
44
33
|
this.id = id;
|
|
45
34
|
this.model = model;
|
|
35
|
+
this.enableStreaming = enableStreaming;
|
|
46
36
|
this.apiKey = apiKey;
|
|
37
|
+
this.apiVersion = apiVersion;
|
|
38
|
+
this.supportsDeveloperMessage = supportsDeveloperMessage;
|
|
39
|
+
this.supportsStructuredOutput = supportsStructuredOutput;
|
|
47
40
|
this.url = url;
|
|
41
|
+
this.defaultRequestSettings = defaultRequestSettings;
|
|
42
|
+
}
|
|
43
|
+
getSettings(request) {
|
|
44
|
+
const settings = request.settings ? request.settings : this.defaultRequestSettings;
|
|
45
|
+
if (!settings) {
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
return settings;
|
|
48
49
|
}
|
|
49
50
|
async request(request, cancellationToken) {
|
|
50
51
|
var _a;
|
|
52
|
+
const settings = this.getSettings(request);
|
|
51
53
|
const openai = this.initializeOpenAi();
|
|
52
|
-
if (
|
|
54
|
+
if (((_a = request.response_format) === null || _a === void 0 ? void 0 : _a.type) === 'json_schema' && this.supportsStructuredOutput) {
|
|
55
|
+
return this.handleStructuredOutputRequest(openai, request);
|
|
56
|
+
}
|
|
57
|
+
if (this.isNonStreamingModel(this.model) || (typeof settings.stream === 'boolean' && !settings.stream)) {
|
|
53
58
|
return this.handleNonStreamingRequest(openai, request);
|
|
54
59
|
}
|
|
55
|
-
if (
|
|
56
|
-
return
|
|
60
|
+
if (cancellationToken === null || cancellationToken === void 0 ? void 0 : cancellationToken.isCancellationRequested) {
|
|
61
|
+
return { text: '' };
|
|
57
62
|
}
|
|
58
63
|
let runner;
|
|
59
64
|
const tools = this.createTools(request);
|
|
60
65
|
if (tools) {
|
|
61
66
|
runner = openai.beta.chat.completions.runTools({
|
|
62
67
|
model: this.model,
|
|
63
|
-
messages: request.messages.map(toOpenAIMessage),
|
|
68
|
+
messages: request.messages.map(this.toOpenAIMessage.bind(this)),
|
|
64
69
|
stream: true,
|
|
65
70
|
tools: tools,
|
|
66
71
|
tool_choice: 'auto',
|
|
67
|
-
...
|
|
72
|
+
...settings
|
|
68
73
|
});
|
|
69
74
|
}
|
|
70
75
|
else {
|
|
71
76
|
runner = openai.beta.chat.completions.stream({
|
|
72
77
|
model: this.model,
|
|
73
|
-
messages: request.messages.map(toOpenAIMessage),
|
|
78
|
+
messages: request.messages.map(this.toOpenAIMessage.bind(this)),
|
|
74
79
|
stream: true,
|
|
75
|
-
...
|
|
80
|
+
...settings
|
|
76
81
|
});
|
|
77
82
|
}
|
|
78
83
|
cancellationToken === null || cancellationToken === void 0 ? void 0 : cancellationToken.onCancellationRequested(() => {
|
|
@@ -83,39 +88,54 @@ class OpenAiModel {
|
|
|
83
88
|
runner.on('error', error => {
|
|
84
89
|
console.error('Error in OpenAI chat completion stream:', error);
|
|
85
90
|
runnerEnd = true;
|
|
86
|
-
resolve({ content: error.message });
|
|
91
|
+
resolve === null || resolve === void 0 ? void 0 : resolve({ content: error.message });
|
|
87
92
|
});
|
|
88
93
|
// we need to also listen for the emitted errors, as otherwise any error actually thrown by the API will not be caught
|
|
89
94
|
runner.emitted('error').then(error => {
|
|
90
95
|
console.error('Error in OpenAI chat completion stream:', error);
|
|
91
96
|
runnerEnd = true;
|
|
92
|
-
resolve({ content: error.message });
|
|
97
|
+
resolve === null || resolve === void 0 ? void 0 : resolve({ content: error.message });
|
|
93
98
|
});
|
|
94
99
|
runner.emitted('abort').then(() => {
|
|
95
|
-
//
|
|
100
|
+
// cancel async iterator
|
|
101
|
+
runnerEnd = true;
|
|
96
102
|
});
|
|
97
103
|
runner.on('message', message => {
|
|
98
104
|
if (message.role === 'tool') {
|
|
99
|
-
resolve({ tool_calls: [{ id: message.tool_call_id, finished: true, result: this.getCompletionContent(message) }] });
|
|
105
|
+
resolve === null || resolve === void 0 ? void 0 : resolve({ tool_calls: [{ id: message.tool_call_id, finished: true, result: this.getCompletionContent(message) }] });
|
|
100
106
|
}
|
|
101
107
|
console.debug('Received Open AI message', JSON.stringify(message));
|
|
102
108
|
});
|
|
103
109
|
runner.once('end', () => {
|
|
104
110
|
runnerEnd = true;
|
|
105
111
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
106
|
-
resolve(runner.finalChatCompletion);
|
|
112
|
+
resolve === null || resolve === void 0 ? void 0 : resolve(runner.finalChatCompletion);
|
|
107
113
|
});
|
|
114
|
+
if (cancellationToken === null || cancellationToken === void 0 ? void 0 : cancellationToken.isCancellationRequested) {
|
|
115
|
+
return { text: '' };
|
|
116
|
+
}
|
|
108
117
|
const asyncIterator = {
|
|
109
118
|
async *[Symbol.asyncIterator]() {
|
|
110
119
|
runner.on('chunk', chunk => {
|
|
111
120
|
var _a, _b;
|
|
112
|
-
if (
|
|
121
|
+
if (cancellationToken === null || cancellationToken === void 0 ? void 0 : cancellationToken.isCancellationRequested) {
|
|
122
|
+
resolve = undefined;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (resolve && ((_a = chunk.choices[0]) === null || _a === void 0 ? void 0 : _a.delta)) {
|
|
113
126
|
resolve({ ...(_b = chunk.choices[0]) === null || _b === void 0 ? void 0 : _b.delta });
|
|
114
127
|
}
|
|
115
128
|
});
|
|
116
129
|
while (!runnerEnd) {
|
|
130
|
+
if (cancellationToken === null || cancellationToken === void 0 ? void 0 : cancellationToken.isCancellationRequested) {
|
|
131
|
+
throw new Error('Iterator canceled');
|
|
132
|
+
}
|
|
117
133
|
const promise = new Promise((res, rej) => {
|
|
118
134
|
resolve = res;
|
|
135
|
+
cancellationToken === null || cancellationToken === void 0 ? void 0 : cancellationToken.onCancellationRequested(() => {
|
|
136
|
+
rej(new Error('Canceled'));
|
|
137
|
+
runnerEnd = true; // Stop the iterator
|
|
138
|
+
});
|
|
119
139
|
});
|
|
120
140
|
yield promise;
|
|
121
141
|
}
|
|
@@ -125,35 +145,45 @@ class OpenAiModel {
|
|
|
125
145
|
}
|
|
126
146
|
async handleNonStreamingRequest(openai, request) {
|
|
127
147
|
var _a;
|
|
148
|
+
const settings = this.getSettings(request);
|
|
128
149
|
const response = await openai.chat.completions.create({
|
|
129
150
|
model: this.model,
|
|
130
|
-
messages: request.messages.map(toOpenAIMessage),
|
|
131
|
-
...
|
|
151
|
+
messages: request.messages.map(this.toOpenAIMessage.bind(this)),
|
|
152
|
+
...settings
|
|
132
153
|
});
|
|
133
154
|
const message = response.choices[0].message;
|
|
134
155
|
return {
|
|
135
156
|
text: (_a = message.content) !== null && _a !== void 0 ? _a : ''
|
|
136
157
|
};
|
|
137
158
|
}
|
|
138
|
-
|
|
139
|
-
return
|
|
159
|
+
toOpenAIMessage(message) {
|
|
160
|
+
return {
|
|
161
|
+
role: this.toOpenAiRole(message),
|
|
162
|
+
content: message.query || ''
|
|
163
|
+
};
|
|
140
164
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
'
|
|
146
|
-
|
|
147
|
-
|
|
165
|
+
toOpenAiRole(message) {
|
|
166
|
+
switch (message.actor) {
|
|
167
|
+
case 'system':
|
|
168
|
+
return this.supportsDeveloperMessage ? 'developer' : 'user';
|
|
169
|
+
case 'ai':
|
|
170
|
+
return 'assistant';
|
|
171
|
+
default:
|
|
172
|
+
return 'user';
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
isNonStreamingModel(_model) {
|
|
176
|
+
return !this.enableStreaming;
|
|
148
177
|
}
|
|
149
178
|
async handleStructuredOutputRequest(openai, request) {
|
|
150
179
|
var _a;
|
|
180
|
+
const settings = this.getSettings(request);
|
|
151
181
|
// TODO implement tool support for structured output (parse() seems to require different tool format)
|
|
152
182
|
const result = await openai.beta.chat.completions.parse({
|
|
153
183
|
model: this.model,
|
|
154
|
-
messages: request.messages.map(toOpenAIMessage),
|
|
184
|
+
messages: request.messages.map(this.toOpenAIMessage.bind(this)),
|
|
155
185
|
response_format: request.response_format,
|
|
156
|
-
...
|
|
186
|
+
...settings
|
|
157
187
|
});
|
|
158
188
|
const message = result.choices[0].message;
|
|
159
189
|
if (message.refusal || message.parsed === undefined) {
|
|
@@ -187,8 +217,15 @@ class OpenAiModel {
|
|
|
187
217
|
if (!apiKey && !(this.url)) {
|
|
188
218
|
throw new Error('Please provide OPENAI_API_KEY in preferences or via environment variable');
|
|
189
219
|
}
|
|
190
|
-
|
|
191
|
-
|
|
220
|
+
const apiVersion = this.apiVersion();
|
|
221
|
+
if (apiVersion) {
|
|
222
|
+
// We need to hand over "some" key, even if a custom url is not key protected as otherwise the OpenAI client will throw an error
|
|
223
|
+
return new openai_1.AzureOpenAI({ apiKey: apiKey !== null && apiKey !== void 0 ? apiKey : 'no-key', baseURL: this.url, apiVersion: apiVersion });
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
// We need to hand over "some" key, even if a custom url is not key protected as otherwise the OpenAI client will throw an error
|
|
227
|
+
return new openai_1.OpenAI({ apiKey: apiKey !== null && apiKey !== void 0 ? apiKey : 'no-key', baseURL: this.url });
|
|
228
|
+
}
|
|
192
229
|
}
|
|
193
230
|
}
|
|
194
231
|
exports.OpenAiModel = OpenAiModel;
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"openai-language-model.js","sourceRoot":"","sources":["../../src/node/openai-language-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,13 @@ import { LanguageModelRegistry } from '@theia/ai-core';
|
|
|
2
2
|
import { OpenAiLanguageModelsManager, OpenAiModelDescription } from '../common';
|
|
3
3
|
export declare class OpenAiLanguageModelsManagerImpl implements OpenAiLanguageModelsManager {
|
|
4
4
|
protected _apiKey: string | undefined;
|
|
5
|
+
protected _apiVersion: string | undefined;
|
|
5
6
|
protected readonly languageModelRegistry: LanguageModelRegistry;
|
|
6
7
|
get apiKey(): string | undefined;
|
|
8
|
+
get apiVersion(): string | undefined;
|
|
7
9
|
createOrUpdateLanguageModels(...modelDescriptions: OpenAiModelDescription[]): Promise<void>;
|
|
8
10
|
removeLanguageModels(...modelIds: string[]): void;
|
|
9
11
|
setApiKey(apiKey: string | undefined): void;
|
|
12
|
+
setApiVersion(apiVersion: string | undefined): void;
|
|
10
13
|
}
|
|
11
14
|
//# sourceMappingURL=openai-language-models-manager-impl.d.ts.map
|
|
@@ -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;
|
|
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;IACtC,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAG1C,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAEhE,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAIK,4BAA4B,CAAC,GAAG,iBAAiB,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDjG,oBAAoB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAIjD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAQ3C,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAOtD"}
|
|
@@ -25,6 +25,10 @@ let OpenAiLanguageModelsManagerImpl = class OpenAiLanguageModelsManagerImpl {
|
|
|
25
25
|
var _a;
|
|
26
26
|
return (_a = this._apiKey) !== null && _a !== void 0 ? _a : process.env.OPENAI_API_KEY;
|
|
27
27
|
}
|
|
28
|
+
get apiVersion() {
|
|
29
|
+
var _a;
|
|
30
|
+
return (_a = this._apiVersion) !== null && _a !== void 0 ? _a : process.env.OPENAI_API_VERSION;
|
|
31
|
+
}
|
|
28
32
|
// Triggered from frontend. In case you want to use the models on the backend
|
|
29
33
|
// without a frontend then call this yourself
|
|
30
34
|
async createOrUpdateLanguageModels(...modelDescriptions) {
|
|
@@ -39,22 +43,33 @@ let OpenAiLanguageModelsManagerImpl = class OpenAiLanguageModelsManagerImpl {
|
|
|
39
43
|
}
|
|
40
44
|
return undefined;
|
|
41
45
|
};
|
|
46
|
+
const apiVersionProvider = () => {
|
|
47
|
+
if (modelDescription.apiVersion === true) {
|
|
48
|
+
return this.apiVersion;
|
|
49
|
+
}
|
|
50
|
+
if (modelDescription.apiVersion) {
|
|
51
|
+
return modelDescription.apiVersion;
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
};
|
|
42
55
|
if (model) {
|
|
43
56
|
if (!(model instanceof openai_language_model_1.OpenAiModel)) {
|
|
44
|
-
console.warn(`
|
|
45
|
-
continue;
|
|
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`);
|
|
57
|
+
console.warn(`OpenAI: model ${modelDescription.id} is not an OpenAI model`);
|
|
50
58
|
continue;
|
|
51
59
|
}
|
|
52
|
-
model.url = modelDescription.url;
|
|
53
60
|
model.model = modelDescription.model;
|
|
61
|
+
model.enableStreaming = modelDescription.enableStreaming;
|
|
62
|
+
model.url = modelDescription.url;
|
|
54
63
|
model.apiKey = apiKeyProvider;
|
|
64
|
+
model.apiVersion = apiVersionProvider;
|
|
65
|
+
model.supportsDeveloperMessage = modelDescription.supportsDeveloperMessage;
|
|
66
|
+
model.supportsStructuredOutput = modelDescription.supportsStructuredOutput;
|
|
67
|
+
model.defaultRequestSettings = modelDescription.defaultRequestSettings;
|
|
55
68
|
}
|
|
56
69
|
else {
|
|
57
|
-
this.languageModelRegistry.addLanguageModels([
|
|
70
|
+
this.languageModelRegistry.addLanguageModels([
|
|
71
|
+
new openai_language_model_1.OpenAiModel(modelDescription.id, modelDescription.model, modelDescription.enableStreaming, apiKeyProvider, apiVersionProvider, modelDescription.supportsDeveloperMessage, modelDescription.supportsStructuredOutput, modelDescription.url, modelDescription.defaultRequestSettings)
|
|
72
|
+
]);
|
|
58
73
|
}
|
|
59
74
|
}
|
|
60
75
|
}
|
|
@@ -69,6 +84,14 @@ let OpenAiLanguageModelsManagerImpl = class OpenAiLanguageModelsManagerImpl {
|
|
|
69
84
|
this._apiKey = undefined;
|
|
70
85
|
}
|
|
71
86
|
}
|
|
87
|
+
setApiVersion(apiVersion) {
|
|
88
|
+
if (apiVersion) {
|
|
89
|
+
this._apiVersion = apiVersion;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this._apiVersion = undefined;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
72
95
|
};
|
|
73
96
|
exports.OpenAiLanguageModelsManagerImpl = OpenAiLanguageModelsManagerImpl;
|
|
74
97
|
tslib_1.__decorate([
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"openai-language-models-manager-impl.js","sourceRoot":"","sources":["../../src/node/openai-language-models-manager-impl.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-openai",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.57.0-next.112+f4778c273",
|
|
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.57.0-next.112+f4778c273",
|
|
7
|
+
"@theia/core": "1.57.0-next.112+f4778c273",
|
|
8
|
+
"@theia/filesystem": "1.57.0-next.112+f4778c273",
|
|
9
|
+
"@theia/workspace": "1.57.0-next.112+f4778c273",
|
|
10
10
|
"minimatch": "^5.1.0",
|
|
11
|
-
"openai": "^4.
|
|
11
|
+
"openai": "^4.77.0",
|
|
12
12
|
"tslib": "^2.6.2"
|
|
13
13
|
},
|
|
14
14
|
"publishConfig": {
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
"watch": "theiaext watch"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@theia/ext-scripts": "1.
|
|
48
|
+
"@theia/ext-scripts": "1.58.0"
|
|
49
49
|
},
|
|
50
50
|
"nyc": {
|
|
51
51
|
"extends": "../../configs/nyc.json"
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "f4778c2737bb75613f0e1f99da8996bad91f6e17"
|
|
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,134 @@ 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.apiVersion === newModel.apiVersion &&
|
|
95
|
+
model.supportsDeveloperMessage === newModel.supportsDeveloperMessage &&
|
|
96
|
+
model.supportsStructuredOutput === newModel.supportsStructuredOutput &&
|
|
97
|
+
model.enableStreaming === newModel.enableStreaming));
|
|
98
|
+
|
|
99
|
+
this.manager.removeLanguageModels(...modelsToRemove.map(model => model.id));
|
|
100
|
+
this.manager.createOrUpdateLanguageModels(...modelsToAddOrUpdate);
|
|
101
|
+
this.prevCustomModels = [...newCustomModels];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
protected handleRequestSettingsChanges(newSettings: RequestSetting[]): void {
|
|
105
|
+
const models = this.preferenceService.get<string[]>(MODELS_PREF, []);
|
|
106
|
+
this.manager.createOrUpdateLanguageModels(...models.map(modelId => this.createOpenAIModelDescription(modelId, newSettings)));
|
|
107
|
+
|
|
108
|
+
const customModels = this.preferenceService.get<Partial<OpenAiModelDescription>[]>(CUSTOM_ENDPOINTS_PREF, []);
|
|
109
|
+
this.manager.createOrUpdateLanguageModels(...this.createCustomModelDescriptionsFromPreferences(customModels, newSettings));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
protected createOpenAIModelDescription(modelId: string, requestSettings: RequestSetting[]): OpenAiModelDescription {
|
|
113
|
+
const id = `${OPENAI_PROVIDER_ID}/${modelId}`;
|
|
114
|
+
const modelRequestSetting = this.getMatchingRequestSetting(modelId, OPENAI_PROVIDER_ID, requestSettings);
|
|
115
|
+
return {
|
|
116
|
+
id: id,
|
|
117
|
+
model: modelId,
|
|
118
|
+
apiKey: true,
|
|
119
|
+
apiVersion: true,
|
|
120
|
+
supportsDeveloperMessage: !openAIModelsNotSupportingDeveloperMessages.includes(modelId),
|
|
121
|
+
enableStreaming: !openAIModelsWithDisabledStreaming.includes(modelId),
|
|
122
|
+
supportsStructuredOutput: !openAIModelsWithoutStructuredOutput.includes(modelId),
|
|
123
|
+
defaultRequestSettings: modelRequestSetting?.requestSettings
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
protected createCustomModelDescriptionsFromPreferences(
|
|
128
|
+
preferences: Partial<OpenAiModelDescription>[],
|
|
129
|
+
requestSettings: RequestSetting[]
|
|
130
|
+
): OpenAiModelDescription[] {
|
|
131
|
+
return preferences.reduce((acc, pref) => {
|
|
132
|
+
if (!pref.model || !pref.url || typeof pref.model !== 'string' || typeof pref.url !== 'string') {
|
|
133
|
+
return acc;
|
|
97
134
|
}
|
|
98
|
-
|
|
99
|
-
|
|
135
|
+
|
|
136
|
+
const modelRequestSetting = this.getMatchingRequestSetting(pref.model, OPENAI_PROVIDER_ID, requestSettings);
|
|
137
|
+
|
|
138
|
+
return [
|
|
139
|
+
...acc,
|
|
140
|
+
{
|
|
141
|
+
id: pref.id && typeof pref.id === 'string' ? pref.id : pref.model,
|
|
142
|
+
model: pref.model,
|
|
143
|
+
url: pref.url,
|
|
144
|
+
apiKey: typeof pref.apiKey === 'string' || pref.apiKey === true ? pref.apiKey : undefined,
|
|
145
|
+
apiVersion: typeof pref.apiVersion === 'string' || pref.apiVersion === true ? pref.apiVersion : undefined,
|
|
146
|
+
supportsDeveloperMessage: pref.supportsDeveloperMessage ?? true,
|
|
147
|
+
supportsStructuredOutput: pref.supportsStructuredOutput ?? true,
|
|
148
|
+
enableStreaming: pref.enableStreaming ?? true,
|
|
149
|
+
defaultRequestSettings: modelRequestSetting?.requestSettings
|
|
150
|
+
}
|
|
151
|
+
];
|
|
152
|
+
}, []);
|
|
153
|
+
}
|
|
154
|
+
protected getMatchingRequestSetting(
|
|
155
|
+
modelId: string,
|
|
156
|
+
providerId: string,
|
|
157
|
+
requestSettings: RequestSetting[]
|
|
158
|
+
): RequestSetting | undefined {
|
|
159
|
+
const matchingSettings = requestSettings.filter(
|
|
160
|
+
setting => (!setting.providerId || setting.providerId === providerId) && setting.modelId === modelId
|
|
161
|
+
);
|
|
162
|
+
if (matchingSettings.length > 1) {
|
|
163
|
+
console.warn(
|
|
164
|
+
`Multiple entries found for provider "${providerId}" and model "${modelId}". Using the first match.`
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
return matchingSettings[0];
|
|
168
|
+
}
|
|
100
169
|
}
|
|
170
|
+
|
|
171
|
+
const openAIModelsWithDisabledStreaming = ['o1'];
|
|
172
|
+
const openAIModelsNotSupportingDeveloperMessages = ['o1-preview', 'o1-mini'];
|
|
173
|
+
const openAIModelsWithoutStructuredOutput = ['o1-preview', 'gpt-4-turbo', 'gpt-4', 'gpt-3.5-turbo', 'o1-mini', 'gpt-4o-2024-05-13'];
|