@theia/ai-openai 1.60.0-next.47 → 1.60.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 +2 -6
- package/lib/browser/openai-frontend-application-contribution.d.ts.map +1 -1
- package/lib/browser/openai-frontend-application-contribution.js +9 -36
- package/lib/browser/openai-frontend-application-contribution.js.map +1 -1
- package/lib/common/openai-language-models-manager.d.ts +0 -6
- package/lib/common/openai-language-models-manager.d.ts.map +1 -1
- package/lib/node/openai-language-model.d.ts +7 -13
- package/lib/node/openai-language-model.d.ts.map +1 -1
- package/lib/node/openai-language-model.js +28 -14
- 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 +1 -2
- package/lib/node/openai-language-models-manager-impl.js.map +1 -1
- package/lib/node/openai-model-utils.spec.js +30 -30
- package/lib/node/openai-model-utils.spec.js.map +1 -1
- package/lib/node/openai-streaming-iterator.js.map +1 -1
- package/lib/node/openai-streaming-iterator.spec.js +4 -5
- package/lib/node/openai-streaming-iterator.spec.js.map +1 -1
- package/package.json +7 -7
- package/src/browser/openai-frontend-application-contribution.ts +9 -48
- package/src/common/openai-language-models-manager.ts +0 -4
- package/src/node/openai-language-model.ts +36 -23
- package/src/node/openai-language-models-manager-impl.ts +0 -2
- package/src/node/openai-model-utils.spec.ts +30 -30
- package/src/node/openai-streaming-iterator.spec.ts +4 -4
- package/src/node/openai-streaming-iterator.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-streaming-iterator.js","sourceRoot":"","sources":["../../src/node/openai-streaming-iterator.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,sCAAqG;AACrG,sEAA+D;AAK/D,MAAa,sBAAsB;IAM/B,YAA+B,MAA4B,EAAE,iBAAqC;QAAnE,WAAM,GAAN,MAAM,CAAsB;QALxC,iBAAY,GAAG,IAAI,KAAK,EAAwB,CAAC;QACjD,iBAAY,GAAG,IAAI,KAAK,EAAmC,CAAC;QACrE,SAAI,GAAG,KAAK,CAAC;QACb,kBAAa,GAAsB,SAAS,CAAC;QACpC,cAAS,GAAG,IAAI,2BAAoB,EAAE,CAAC;QAEtD,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;YACzC,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YAChE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,GAAG,EAAE;YACtC,IAAI,CAAC,aAAa,GAAG,IAAI,wBAAiB,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;YAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,cAAc,CAAC;oBAChB,UAAU,EAAE,CAAC;4BACT,EAAE,EAAE,OAAO,CAAC,YAAY;4BACxB,QAAQ,EAAE,IAAI;4BACd,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO;yBACtF,CAAC;iBACL,CAAC,CAAC;YACP,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,GAAG,EAAE;YACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;;YACzC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0CAAE,
|
|
1
|
+
{"version":3,"file":"openai-streaming-iterator.js","sourceRoot":"","sources":["../../src/node/openai-streaming-iterator.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ const chai_1 = require("chai");
|
|
|
19
19
|
const sinon = require("sinon");
|
|
20
20
|
const openai_streaming_iterator_1 = require("./openai-streaming-iterator");
|
|
21
21
|
const core_1 = require("@theia/core");
|
|
22
|
+
const ai_core_1 = require("@theia/ai-core");
|
|
22
23
|
const events_1 = require("events");
|
|
23
24
|
describe('StreamingAsyncIterator', () => {
|
|
24
25
|
let mockStream;
|
|
@@ -63,7 +64,6 @@ describe('StreamingAsyncIterator', () => {
|
|
|
63
64
|
]);
|
|
64
65
|
});
|
|
65
66
|
it('should buffer messages if consumer is slower (messages arrive before .next() is called)', async () => {
|
|
66
|
-
var _a;
|
|
67
67
|
iterator = createIterator();
|
|
68
68
|
mockStream.emit('chunk', { choices: [{ delta: { content: 'A' } }] });
|
|
69
69
|
mockStream.emit('chunk', { choices: [{ delta: { content: 'B' } }] });
|
|
@@ -75,7 +75,7 @@ describe('StreamingAsyncIterator', () => {
|
|
|
75
75
|
if (done) {
|
|
76
76
|
break;
|
|
77
77
|
}
|
|
78
|
-
results.push((
|
|
78
|
+
results.push(((0, ai_core_1.isTextResponsePart)(value) && value.content) || '');
|
|
79
79
|
}
|
|
80
80
|
(0, chai_1.expect)(results).to.deep.equal(['A', 'B', 'C']);
|
|
81
81
|
});
|
|
@@ -94,7 +94,6 @@ describe('StreamingAsyncIterator', () => {
|
|
|
94
94
|
(0, chai_1.expect)(second.value).to.be.undefined;
|
|
95
95
|
});
|
|
96
96
|
it('should handle the end event correctly', async () => {
|
|
97
|
-
var _a;
|
|
98
97
|
iterator = createIterator();
|
|
99
98
|
mockStream.emit('chunk', { choices: [{ delta: { content: 'EndTest1' } }] });
|
|
100
99
|
mockStream.emit('chunk', { choices: [{ delta: { content: 'EndTest2' } }] });
|
|
@@ -105,7 +104,7 @@ describe('StreamingAsyncIterator', () => {
|
|
|
105
104
|
if (done) {
|
|
106
105
|
break;
|
|
107
106
|
}
|
|
108
|
-
results.push((
|
|
107
|
+
results.push(((0, ai_core_1.isTextResponsePart)(value) && value.content) || '');
|
|
109
108
|
}
|
|
110
109
|
(0, chai_1.expect)(results).to.deep.equal(['EndTest1', 'EndTest2']);
|
|
111
110
|
});
|
|
@@ -196,7 +195,7 @@ describe('StreamingAsyncIterator', () => {
|
|
|
196
195
|
results.push(part);
|
|
197
196
|
}
|
|
198
197
|
(0, chai_1.expect)(results).to.have.lengthOf(1);
|
|
199
|
-
(0, chai_1.expect)(results[0].tool_calls).to.deep.equal([
|
|
198
|
+
(0, chai_1.expect)((0, ai_core_1.isToolCallResponsePart)(results[0]) && results[0].tool_calls).to.deep.equal([
|
|
200
199
|
{
|
|
201
200
|
id: 'tool-123',
|
|
202
201
|
finished: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-streaming-iterator.spec.js","sourceRoot":"","sources":["../../src/node/openai-streaming-iterator.spec.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,+BAA8B;AAC9B,+BAA+B;AAC/B,2EAAqE;AAErE,sCAAyE;
|
|
1
|
+
{"version":3,"file":"openai-streaming-iterator.spec.js","sourceRoot":"","sources":["../../src/node/openai-streaming-iterator.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-openai",
|
|
3
|
-
"version": "1.60.0
|
|
3
|
+
"version": "1.60.0",
|
|
4
4
|
"description": "Theia - OpenAI Integration",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/ai-core": "1.60.0
|
|
7
|
-
"@theia/core": "1.60.0
|
|
8
|
-
"@theia/filesystem": "1.60.0
|
|
9
|
-
"@theia/workspace": "1.60.0
|
|
6
|
+
"@theia/ai-core": "1.60.0",
|
|
7
|
+
"@theia/core": "1.60.0",
|
|
8
|
+
"@theia/filesystem": "1.60.0",
|
|
9
|
+
"@theia/workspace": "1.60.0",
|
|
10
10
|
"minimatch": "^5.1.0",
|
|
11
11
|
"openai": "^4.77.0",
|
|
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.60.0"
|
|
49
49
|
},
|
|
50
50
|
"nyc": {
|
|
51
51
|
"extends": "../../configs/nyc.json"
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "193fa55d7e26aa9dc8acba3ae3b99b0182f3603f"
|
|
54
54
|
}
|
|
@@ -18,7 +18,6 @@ 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
21
|
|
|
23
22
|
const OPENAI_PROVIDER_ID = 'openai';
|
|
24
23
|
|
|
@@ -40,12 +39,11 @@ export class OpenAiFrontendApplicationContribution implements FrontendApplicatio
|
|
|
40
39
|
this.manager.setApiKey(apiKey);
|
|
41
40
|
|
|
42
41
|
const models = this.preferenceService.get<string[]>(MODELS_PREF, []);
|
|
43
|
-
|
|
44
|
-
this.manager.createOrUpdateLanguageModels(...models.map(modelId => this.createOpenAIModelDescription(modelId, requestSettings)));
|
|
42
|
+
this.manager.createOrUpdateLanguageModels(...models.map(modelId => this.createOpenAIModelDescription(modelId)));
|
|
45
43
|
this.prevModels = [...models];
|
|
46
44
|
|
|
47
45
|
const customModels = this.preferenceService.get<Partial<OpenAiModelDescription>[]>(CUSTOM_ENDPOINTS_PREF, []);
|
|
48
|
-
this.manager.createOrUpdateLanguageModels(...this.createCustomModelDescriptionsFromPreferences(customModels
|
|
46
|
+
this.manager.createOrUpdateLanguageModels(...this.createCustomModelDescriptionsFromPreferences(customModels));
|
|
49
47
|
this.prevCustomModels = [...customModels];
|
|
50
48
|
|
|
51
49
|
this.preferenceService.onPreferenceChanged(event => {
|
|
@@ -55,8 +53,6 @@ export class OpenAiFrontendApplicationContribution implements FrontendApplicatio
|
|
|
55
53
|
this.handleModelChanges(event.newValue as string[]);
|
|
56
54
|
} else if (event.preferenceName === CUSTOM_ENDPOINTS_PREF) {
|
|
57
55
|
this.handleCustomModelChanges(event.newValue as Partial<OpenAiModelDescription>[]);
|
|
58
|
-
} else if (event.preferenceName === PREFERENCE_NAME_REQUEST_SETTINGS) {
|
|
59
|
-
this.handleRequestSettingsChanges(event.newValue as RequestSetting[]);
|
|
60
56
|
}
|
|
61
57
|
});
|
|
62
58
|
});
|
|
@@ -70,19 +66,13 @@ export class OpenAiFrontendApplicationContribution implements FrontendApplicatio
|
|
|
70
66
|
const modelsToAdd = [...updatedModels].filter(model => !oldModels.has(model));
|
|
71
67
|
|
|
72
68
|
this.manager.removeLanguageModels(...modelsToRemove.map(model => `openai/${model}`));
|
|
73
|
-
|
|
74
|
-
this.manager.createOrUpdateLanguageModels(...modelsToAdd.map(modelId => this.createOpenAIModelDescription(modelId, requestSettings)));
|
|
69
|
+
this.manager.createOrUpdateLanguageModels(...modelsToAdd.map(modelId => this.createOpenAIModelDescription(modelId)));
|
|
75
70
|
this.prevModels = newModels;
|
|
76
71
|
}
|
|
77
72
|
|
|
78
|
-
private getRequestSettingsPref(): RequestSetting[] {
|
|
79
|
-
return this.preferenceService.get<RequestSetting[]>(PREFERENCE_NAME_REQUEST_SETTINGS, []);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
73
|
protected handleCustomModelChanges(newCustomModels: Partial<OpenAiModelDescription>[]): void {
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
const newModels = this.createCustomModelDescriptionsFromPreferences(newCustomModels, requestSettings);
|
|
74
|
+
const oldModels = this.createCustomModelDescriptionsFromPreferences(this.prevCustomModels);
|
|
75
|
+
const newModels = this.createCustomModelDescriptionsFromPreferences(newCustomModels);
|
|
86
76
|
|
|
87
77
|
const modelsToRemove = oldModels.filter(model => !newModels.some(newModel => newModel.id === model.id));
|
|
88
78
|
const modelsToAddOrUpdate = newModels.filter(newModel =>
|
|
@@ -101,17 +91,8 @@ export class OpenAiFrontendApplicationContribution implements FrontendApplicatio
|
|
|
101
91
|
this.prevCustomModels = [...newCustomModels];
|
|
102
92
|
}
|
|
103
93
|
|
|
104
|
-
protected
|
|
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 {
|
|
94
|
+
protected createOpenAIModelDescription(modelId: string): OpenAiModelDescription {
|
|
113
95
|
const id = `${OPENAI_PROVIDER_ID}/${modelId}`;
|
|
114
|
-
const modelRequestSetting = this.getMatchingRequestSetting(modelId, OPENAI_PROVIDER_ID, requestSettings);
|
|
115
96
|
return {
|
|
116
97
|
id: id,
|
|
117
98
|
model: modelId,
|
|
@@ -119,22 +100,18 @@ export class OpenAiFrontendApplicationContribution implements FrontendApplicatio
|
|
|
119
100
|
apiVersion: true,
|
|
120
101
|
developerMessageSettings: openAIModelsNotSupportingDeveloperMessages.includes(modelId) ? 'user' : 'developer',
|
|
121
102
|
enableStreaming: !openAIModelsWithDisabledStreaming.includes(modelId),
|
|
122
|
-
supportsStructuredOutput: !openAIModelsWithoutStructuredOutput.includes(modelId)
|
|
123
|
-
defaultRequestSettings: modelRequestSetting?.requestSettings
|
|
103
|
+
supportsStructuredOutput: !openAIModelsWithoutStructuredOutput.includes(modelId)
|
|
124
104
|
};
|
|
125
105
|
}
|
|
126
106
|
|
|
127
107
|
protected createCustomModelDescriptionsFromPreferences(
|
|
128
|
-
preferences: Partial<OpenAiModelDescription>[]
|
|
129
|
-
requestSettings: RequestSetting[]
|
|
108
|
+
preferences: Partial<OpenAiModelDescription>[]
|
|
130
109
|
): OpenAiModelDescription[] {
|
|
131
110
|
return preferences.reduce((acc, pref) => {
|
|
132
111
|
if (!pref.model || !pref.url || typeof pref.model !== 'string' || typeof pref.url !== 'string') {
|
|
133
112
|
return acc;
|
|
134
113
|
}
|
|
135
114
|
|
|
136
|
-
const modelRequestSetting = this.getMatchingRequestSetting(pref.model, OPENAI_PROVIDER_ID, requestSettings);
|
|
137
|
-
|
|
138
115
|
return [
|
|
139
116
|
...acc,
|
|
140
117
|
{
|
|
@@ -145,27 +122,11 @@ export class OpenAiFrontendApplicationContribution implements FrontendApplicatio
|
|
|
145
122
|
apiVersion: typeof pref.apiVersion === 'string' || pref.apiVersion === true ? pref.apiVersion : undefined,
|
|
146
123
|
developerMessageSettings: pref.developerMessageSettings ?? 'developer',
|
|
147
124
|
supportsStructuredOutput: pref.supportsStructuredOutput ?? true,
|
|
148
|
-
enableStreaming: pref.enableStreaming ?? true
|
|
149
|
-
defaultRequestSettings: modelRequestSetting?.requestSettings
|
|
125
|
+
enableStreaming: pref.enableStreaming ?? true
|
|
150
126
|
}
|
|
151
127
|
];
|
|
152
128
|
}, []);
|
|
153
129
|
}
|
|
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
|
-
}
|
|
169
130
|
}
|
|
170
131
|
|
|
171
132
|
const openAIModelsWithDisabledStreaming: string[] = [];
|
|
@@ -52,10 +52,6 @@ export interface OpenAiModelDescription {
|
|
|
52
52
|
* Flag to configure whether the OpenAPI model supports structured output. Default is `true`.
|
|
53
53
|
*/
|
|
54
54
|
supportsStructuredOutput: boolean;
|
|
55
|
-
/**
|
|
56
|
-
* Default request settings for the OpenAI model.
|
|
57
|
-
*/
|
|
58
|
-
defaultRequestSettings?: { [key: string]: unknown };
|
|
59
55
|
}
|
|
60
56
|
export interface OpenAiLanguageModelsManager {
|
|
61
57
|
apiKey: string | undefined;
|
|
@@ -18,9 +18,10 @@ import {
|
|
|
18
18
|
LanguageModel,
|
|
19
19
|
LanguageModelParsedResponse,
|
|
20
20
|
LanguageModelRequest,
|
|
21
|
-
|
|
21
|
+
LanguageModelMessage,
|
|
22
22
|
LanguageModelResponse,
|
|
23
|
-
LanguageModelTextResponse
|
|
23
|
+
LanguageModelTextResponse,
|
|
24
|
+
TextMessage
|
|
24
25
|
} from '@theia/ai-core';
|
|
25
26
|
import { CancellationToken } from '@theia/core';
|
|
26
27
|
import { injectable } from '@theia/core/shared/inversify';
|
|
@@ -44,7 +45,6 @@ export class OpenAiModel implements LanguageModel {
|
|
|
44
45
|
* @param apiVersion a function that returns the OpenAPI version to use for this model, called on each request
|
|
45
46
|
* @param developerMessageSettings how to handle system messages
|
|
46
47
|
* @param url the OpenAI API compatible endpoint where the model is hosted. If not provided the default OpenAI endpoint will be used.
|
|
47
|
-
* @param defaultRequestSettings optional default settings for requests made using this model.
|
|
48
48
|
*/
|
|
49
49
|
constructor(
|
|
50
50
|
public readonly id: string,
|
|
@@ -55,16 +55,11 @@ export class OpenAiModel implements LanguageModel {
|
|
|
55
55
|
public supportsStructuredOutput: boolean,
|
|
56
56
|
public url: string | undefined,
|
|
57
57
|
public openAiModelUtils: OpenAiModelUtils,
|
|
58
|
-
public developerMessageSettings: DeveloperMessageSettings = 'developer'
|
|
59
|
-
public defaultRequestSettings?: { [key: string]: unknown },
|
|
58
|
+
public developerMessageSettings: DeveloperMessageSettings = 'developer'
|
|
60
59
|
) { }
|
|
61
60
|
|
|
62
61
|
protected getSettings(request: LanguageModelRequest): Record<string, unknown> {
|
|
63
|
-
|
|
64
|
-
if (!settings) {
|
|
65
|
-
return {};
|
|
66
|
-
}
|
|
67
|
-
return settings;
|
|
62
|
+
return request.settings ?? {};
|
|
68
63
|
}
|
|
69
64
|
|
|
70
65
|
async request(request: LanguageModelRequest, cancellationToken?: CancellationToken): Promise<LanguageModelResponse> {
|
|
@@ -171,7 +166,7 @@ export class OpenAiModel implements LanguageModel {
|
|
|
171
166
|
}
|
|
172
167
|
}
|
|
173
168
|
|
|
174
|
-
protected processMessages(messages:
|
|
169
|
+
protected processMessages(messages: LanguageModelMessage[]): ChatCompletionMessageParam[] {
|
|
175
170
|
return this.openAiModelUtils.processMessages(messages, this.developerMessageSettings, this.model);
|
|
176
171
|
}
|
|
177
172
|
}
|
|
@@ -185,25 +180,27 @@ export class OpenAiModel implements LanguageModel {
|
|
|
185
180
|
export class OpenAiModelUtils {
|
|
186
181
|
|
|
187
182
|
protected processSystemMessages(
|
|
188
|
-
messages:
|
|
183
|
+
messages: LanguageModelMessage[],
|
|
189
184
|
developerMessageSettings: DeveloperMessageSettings
|
|
190
|
-
):
|
|
185
|
+
): LanguageModelMessage[] {
|
|
191
186
|
if (developerMessageSettings === 'skip') {
|
|
192
187
|
return messages.filter(message => message.actor !== 'system');
|
|
193
188
|
} else if (developerMessageSettings === 'mergeWithFollowingUserMessage') {
|
|
194
189
|
const updated = messages.slice();
|
|
195
190
|
for (let i = updated.length - 1; i >= 0; i--) {
|
|
196
191
|
if (updated[i].actor === 'system') {
|
|
192
|
+
const systemMessage = updated[i] as TextMessage;
|
|
197
193
|
if (i + 1 < updated.length && updated[i + 1].actor === 'user') {
|
|
198
194
|
// Merge system message with the next user message
|
|
195
|
+
const userMessage = updated[i + 1] as TextMessage;
|
|
199
196
|
updated[i + 1] = {
|
|
200
197
|
...updated[i + 1],
|
|
201
|
-
|
|
202
|
-
};
|
|
198
|
+
text: systemMessage.text + '\n' + userMessage.text
|
|
199
|
+
} as TextMessage;
|
|
203
200
|
updated.splice(i, 1);
|
|
204
201
|
} else {
|
|
205
202
|
// The message directly after is not a user message (or none exists), so create a new user message right after
|
|
206
|
-
updated.splice(i + 1, 0, { actor: 'user', type: 'text',
|
|
203
|
+
updated.splice(i + 1, 0, { actor: 'user', type: 'text', text: systemMessage.text });
|
|
207
204
|
updated.splice(i, 1);
|
|
208
205
|
}
|
|
209
206
|
}
|
|
@@ -214,7 +211,7 @@ export class OpenAiModelUtils {
|
|
|
214
211
|
}
|
|
215
212
|
|
|
216
213
|
protected toOpenAiRole(
|
|
217
|
-
message:
|
|
214
|
+
message: LanguageModelMessage,
|
|
218
215
|
developerMessageSettings: DeveloperMessageSettings
|
|
219
216
|
): 'developer' | 'user' | 'assistant' | 'system' {
|
|
220
217
|
if (message.actor === 'system') {
|
|
@@ -230,13 +227,29 @@ export class OpenAiModelUtils {
|
|
|
230
227
|
}
|
|
231
228
|
|
|
232
229
|
protected toOpenAIMessage(
|
|
233
|
-
message:
|
|
230
|
+
message: LanguageModelMessage,
|
|
234
231
|
developerMessageSettings: DeveloperMessageSettings
|
|
235
232
|
): ChatCompletionMessageParam {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
233
|
+
if (LanguageModelMessage.isTextMessage(message)) {
|
|
234
|
+
return {
|
|
235
|
+
role: this.toOpenAiRole(message, developerMessageSettings),
|
|
236
|
+
content: message.text
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
if (LanguageModelMessage.isToolUseMessage(message)) {
|
|
240
|
+
return {
|
|
241
|
+
role: 'assistant',
|
|
242
|
+
tool_calls: [{ id: message.id, function: { name: message.name, arguments: JSON.stringify(message.input) }, type: 'function' }]
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
if (LanguageModelMessage.isToolResultMessage(message)) {
|
|
246
|
+
return {
|
|
247
|
+
role: 'tool',
|
|
248
|
+
tool_call_id: message.tool_use_id,
|
|
249
|
+
content: ''
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
throw new Error(`Unknown message type:'${JSON.stringify(message)}'`);
|
|
240
253
|
}
|
|
241
254
|
|
|
242
255
|
/**
|
|
@@ -251,7 +264,7 @@ export class OpenAiModelUtils {
|
|
|
251
264
|
* @returns an array of messages formatted for the OpenAI API.
|
|
252
265
|
*/
|
|
253
266
|
processMessages(
|
|
254
|
-
messages:
|
|
267
|
+
messages: LanguageModelMessage[],
|
|
255
268
|
developerMessageSettings: DeveloperMessageSettings,
|
|
256
269
|
model: string
|
|
257
270
|
): ChatCompletionMessageParam[] {
|
|
@@ -75,7 +75,6 @@ export class OpenAiLanguageModelsManagerImpl implements OpenAiLanguageModelsMana
|
|
|
75
75
|
model.apiVersion = apiVersionProvider;
|
|
76
76
|
model.developerMessageSettings = modelDescription.developerMessageSettings || 'developer';
|
|
77
77
|
model.supportsStructuredOutput = modelDescription.supportsStructuredOutput;
|
|
78
|
-
model.defaultRequestSettings = modelDescription.defaultRequestSettings;
|
|
79
78
|
} else {
|
|
80
79
|
this.languageModelRegistry.addLanguageModels([
|
|
81
80
|
new OpenAiModel(
|
|
@@ -88,7 +87,6 @@ export class OpenAiLanguageModelsManagerImpl implements OpenAiLanguageModelsMana
|
|
|
88
87
|
modelDescription.url,
|
|
89
88
|
this.openAiModelUtils,
|
|
90
89
|
modelDescription.developerMessageSettings,
|
|
91
|
-
modelDescription.defaultRequestSettings
|
|
92
90
|
)
|
|
93
91
|
]);
|
|
94
92
|
}
|
|
@@ -21,9 +21,9 @@ describe('OpenAiModelUtils - processMessages', () => {
|
|
|
21
21
|
describe("when developerMessageSettings is 'skip'", () => {
|
|
22
22
|
it('should remove all system messages', () => {
|
|
23
23
|
const messages = [
|
|
24
|
-
{ actor: 'system', type: 'text',
|
|
25
|
-
{ actor: 'user', type: 'text',
|
|
26
|
-
{ actor: 'system', type: 'text',
|
|
24
|
+
{ actor: 'system', type: 'text', text: 'system message' },
|
|
25
|
+
{ actor: 'user', type: 'text', text: 'user message' },
|
|
26
|
+
{ actor: 'system', type: 'text', text: 'another system message' },
|
|
27
27
|
];
|
|
28
28
|
const result = utils.processMessages(messages, 'skip');
|
|
29
29
|
expect(result).to.deep.equal([
|
|
@@ -33,9 +33,9 @@ describe('OpenAiModelUtils - processMessages', () => {
|
|
|
33
33
|
|
|
34
34
|
it('should do nothing if there is no system message', () => {
|
|
35
35
|
const messages = [
|
|
36
|
-
{ actor: 'user', type: 'text',
|
|
37
|
-
{ actor: 'user', type: 'text',
|
|
38
|
-
{ actor: 'ai', type: 'text',
|
|
36
|
+
{ actor: 'user', type: 'text', text: 'user message' },
|
|
37
|
+
{ actor: 'user', type: 'text', text: 'another user message' },
|
|
38
|
+
{ actor: 'ai', type: 'text', text: 'ai message' }
|
|
39
39
|
];
|
|
40
40
|
const result = utils.processMessages(messages, 'skip');
|
|
41
41
|
expect(result).to.deep.equal([
|
|
@@ -49,9 +49,9 @@ describe('OpenAiModelUtils - processMessages', () => {
|
|
|
49
49
|
describe("when developerMessageSettings is 'mergeWithFollowingUserMessage'", () => {
|
|
50
50
|
it('should merge the system message with the next user message, assign role user, and remove the system message', () => {
|
|
51
51
|
const messages = [
|
|
52
|
-
{ actor: 'system', type: 'text',
|
|
53
|
-
{ actor: 'user', type: 'text',
|
|
54
|
-
{ actor: 'ai', type: 'text',
|
|
52
|
+
{ actor: 'system', type: 'text', text: 'system msg' },
|
|
53
|
+
{ actor: 'user', type: 'text', text: 'user msg' },
|
|
54
|
+
{ actor: 'ai', type: 'text', text: 'ai message' }
|
|
55
55
|
];
|
|
56
56
|
const result = utils.processMessages(messages, 'mergeWithFollowingUserMessage');
|
|
57
57
|
expect(result).to.deep.equal([
|
|
@@ -62,8 +62,8 @@ describe('OpenAiModelUtils - processMessages', () => {
|
|
|
62
62
|
|
|
63
63
|
it('should create a new user message if no user message exists, and remove the system message', () => {
|
|
64
64
|
const messages = [
|
|
65
|
-
{ actor: 'system', type: 'text',
|
|
66
|
-
{ actor: 'ai', type: 'text',
|
|
65
|
+
{ actor: 'system', type: 'text', text: 'system only msg' },
|
|
66
|
+
{ actor: 'ai', type: 'text', text: 'ai message' }
|
|
67
67
|
];
|
|
68
68
|
const result = utils.processMessages(messages, 'mergeWithFollowingUserMessage');
|
|
69
69
|
expect(result).to.deep.equal([
|
|
@@ -74,11 +74,11 @@ describe('OpenAiModelUtils - processMessages', () => {
|
|
|
74
74
|
|
|
75
75
|
it('should create a merge multiple system message with the next user message', () => {
|
|
76
76
|
const messages = [
|
|
77
|
-
{ actor: 'user', type: 'text',
|
|
78
|
-
{ actor: 'system', type: 'text',
|
|
79
|
-
{ actor: 'system', type: 'text',
|
|
80
|
-
{ actor: 'user', type: 'text',
|
|
81
|
-
{ actor: 'ai', type: 'text',
|
|
77
|
+
{ actor: 'user', type: 'text', text: 'user message' },
|
|
78
|
+
{ actor: 'system', type: 'text', text: 'system message' },
|
|
79
|
+
{ actor: 'system', type: 'text', text: 'system message2' },
|
|
80
|
+
{ actor: 'user', type: 'text', text: 'user message2' },
|
|
81
|
+
{ actor: 'ai', type: 'text', text: 'ai message' }
|
|
82
82
|
];
|
|
83
83
|
const result = utils.processMessages(messages, 'mergeWithFollowingUserMessage');
|
|
84
84
|
expect(result).to.deep.equal([
|
|
@@ -90,10 +90,10 @@ describe('OpenAiModelUtils - processMessages', () => {
|
|
|
90
90
|
|
|
91
91
|
it('should create a new user message from several system messages if the next message is not a user message', () => {
|
|
92
92
|
const messages = [
|
|
93
|
-
{ actor: 'user', type: 'text',
|
|
94
|
-
{ actor: 'system', type: 'text',
|
|
95
|
-
{ actor: 'system', type: 'text',
|
|
96
|
-
{ actor: 'ai', type: 'text',
|
|
93
|
+
{ actor: 'user', type: 'text', text: 'user message' },
|
|
94
|
+
{ actor: 'system', type: 'text', text: 'system message' },
|
|
95
|
+
{ actor: 'system', type: 'text', text: 'system message2' },
|
|
96
|
+
{ actor: 'ai', type: 'text', text: 'ai message' }
|
|
97
97
|
];
|
|
98
98
|
const result = utils.processMessages(messages, 'mergeWithFollowingUserMessage');
|
|
99
99
|
expect(result).to.deep.equal([
|
|
@@ -107,9 +107,9 @@ describe('OpenAiModelUtils - processMessages', () => {
|
|
|
107
107
|
describe('when no special merging or skipping is needed', () => {
|
|
108
108
|
it('should leave messages unchanged in ordering and assign roles based on developerMessageSettings', () => {
|
|
109
109
|
const messages = [
|
|
110
|
-
{ actor: 'user', type: 'text',
|
|
111
|
-
{ actor: 'system', type: 'text',
|
|
112
|
-
{ actor: 'ai', type: 'text',
|
|
110
|
+
{ actor: 'user', type: 'text', text: 'user message' },
|
|
111
|
+
{ actor: 'system', type: 'text', text: 'system message' },
|
|
112
|
+
{ actor: 'ai', type: 'text', text: 'ai message' }
|
|
113
113
|
];
|
|
114
114
|
// Using a developerMessageSettings that is not merge/skip, e.g., 'developer'
|
|
115
115
|
const result = utils.processMessages(messages, 'developer');
|
|
@@ -124,8 +124,8 @@ describe('OpenAiModelUtils - processMessages', () => {
|
|
|
124
124
|
describe('role assignment for system messages when developerMessageSettings is one of the role strings', () => {
|
|
125
125
|
it('should assign role as specified for a system message when developerMessageSettings is "user"', () => {
|
|
126
126
|
const messages = [
|
|
127
|
-
{ actor: 'system', type: 'text',
|
|
128
|
-
{ actor: 'ai', type: 'text',
|
|
127
|
+
{ actor: 'system', type: 'text', text: 'system msg' },
|
|
128
|
+
{ actor: 'ai', type: 'text', text: 'ai msg' }
|
|
129
129
|
];
|
|
130
130
|
// Since the first message is system and developerMessageSettings is not merge/skip, ordering is not adjusted
|
|
131
131
|
const result = utils.processMessages(messages, 'user');
|
|
@@ -137,8 +137,8 @@ describe('OpenAiModelUtils - processMessages', () => {
|
|
|
137
137
|
|
|
138
138
|
it('should assign role as specified for a system message when developerMessageSettings is "system"', () => {
|
|
139
139
|
const messages = [
|
|
140
|
-
{ actor: 'system', type: 'text',
|
|
141
|
-
{ actor: 'ai', type: 'text',
|
|
140
|
+
{ actor: 'system', type: 'text', text: 'system msg' },
|
|
141
|
+
{ actor: 'ai', type: 'text', text: 'ai msg' }
|
|
142
142
|
];
|
|
143
143
|
const result = utils.processMessages(messages, 'system');
|
|
144
144
|
expect(result).to.deep.equal([
|
|
@@ -149,9 +149,9 @@ describe('OpenAiModelUtils - processMessages', () => {
|
|
|
149
149
|
|
|
150
150
|
it('should assign role as specified for a system message when developerMessageSettings is "developer"', () => {
|
|
151
151
|
const messages = [
|
|
152
|
-
{ actor: 'system', type: 'text',
|
|
153
|
-
{ actor: 'user', type: 'text',
|
|
154
|
-
{ actor: 'ai', type: 'text',
|
|
152
|
+
{ actor: 'system', type: 'text', text: 'system msg' },
|
|
153
|
+
{ actor: 'user', type: 'text', text: 'user msg' },
|
|
154
|
+
{ actor: 'ai', type: 'text', text: 'ai msg' }
|
|
155
155
|
];
|
|
156
156
|
const result = utils.processMessages(messages, 'developer');
|
|
157
157
|
expect(result).to.deep.equal([
|
|
@@ -19,7 +19,7 @@ import * as sinon from 'sinon';
|
|
|
19
19
|
import { StreamingAsyncIterator } from './openai-streaming-iterator';
|
|
20
20
|
import { ChatCompletionStream } from 'openai/lib/ChatCompletionStream';
|
|
21
21
|
import { CancellationTokenSource, CancellationError } from '@theia/core';
|
|
22
|
-
import { LanguageModelStreamResponsePart } from '@theia/ai-core';
|
|
22
|
+
import { LanguageModelStreamResponsePart, isTextResponsePart, isToolCallResponsePart } from '@theia/ai-core';
|
|
23
23
|
import { EventEmitter } from 'events';
|
|
24
24
|
|
|
25
25
|
describe('StreamingAsyncIterator', () => {
|
|
@@ -88,7 +88,7 @@ describe('StreamingAsyncIterator', () => {
|
|
|
88
88
|
if (done) {
|
|
89
89
|
break;
|
|
90
90
|
}
|
|
91
|
-
results.push(value.content
|
|
91
|
+
results.push((isTextResponsePart(value) && value.content) || '');
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
expect(results).to.deep.equal(['A', 'B', 'C']);
|
|
@@ -126,7 +126,7 @@ describe('StreamingAsyncIterator', () => {
|
|
|
126
126
|
if (done) {
|
|
127
127
|
break;
|
|
128
128
|
}
|
|
129
|
-
results.push(value.content
|
|
129
|
+
results.push((isTextResponsePart(value) && value.content) || '');
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
expect(results).to.deep.equal(['EndTest1', 'EndTest2']);
|
|
@@ -243,7 +243,7 @@ describe('StreamingAsyncIterator', () => {
|
|
|
243
243
|
}
|
|
244
244
|
|
|
245
245
|
expect(results).to.have.lengthOf(1);
|
|
246
|
-
expect(results[0].tool_calls).to.deep.equal([
|
|
246
|
+
expect(isToolCallResponsePart(results[0]) && results[0].tool_calls).to.deep.equal([
|
|
247
247
|
{
|
|
248
248
|
id: 'tool-123',
|
|
249
249
|
finished: true,
|
|
@@ -53,7 +53,7 @@ export class StreamingAsyncIterator implements AsyncIterableIterator<LanguageMod
|
|
|
53
53
|
this.dispose();
|
|
54
54
|
}, true);
|
|
55
55
|
this.registerStreamListener('chunk', chunk => {
|
|
56
|
-
this.handleIncoming({ ...chunk.choices[0]?.delta });
|
|
56
|
+
this.handleIncoming({ ...chunk.choices[0]?.delta as LanguageModelStreamResponsePart });
|
|
57
57
|
});
|
|
58
58
|
if (cancellationToken) {
|
|
59
59
|
this.toDispose.push(cancellationToken.onCancellationRequested(() => stream.abort()));
|