@jupyterlite/ai 0.8.0 → 0.9.0-a0
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/agent.d.ts +233 -0
- package/lib/agent.js +604 -0
- package/lib/chat-model.d.ts +195 -0
- package/lib/chat-model.js +590 -0
- package/lib/completion/completion-provider.d.ts +83 -0
- package/lib/completion/completion-provider.js +209 -0
- package/lib/completion/index.d.ts +1 -0
- package/lib/completion/index.js +1 -0
- package/lib/components/clear-button.d.ts +18 -0
- package/lib/components/clear-button.js +31 -0
- package/lib/components/index.d.ts +3 -0
- package/lib/components/index.js +3 -0
- package/lib/components/model-select.d.ts +19 -0
- package/lib/components/model-select.js +154 -0
- package/lib/components/stop-button.d.ts +3 -3
- package/lib/components/stop-button.js +8 -9
- package/lib/components/token-usage-display.d.ts +45 -0
- package/lib/components/token-usage-display.js +74 -0
- package/lib/components/tool-select.d.ts +27 -0
- package/lib/components/tool-select.js +130 -0
- package/lib/icons.d.ts +3 -1
- package/lib/icons.js +10 -13
- package/lib/index.d.ts +4 -5
- package/lib/index.js +322 -167
- package/lib/mcp/browser.d.ts +68 -0
- package/lib/mcp/browser.js +132 -0
- package/lib/models/settings-model.d.ts +69 -0
- package/lib/models/settings-model.js +295 -0
- package/lib/providers/built-in-providers.d.ts +9 -0
- package/lib/providers/built-in-providers.js +192 -0
- package/lib/providers/models.d.ts +37 -0
- package/lib/providers/models.js +28 -0
- package/lib/providers/provider-registry.d.ts +94 -0
- package/lib/providers/provider-registry.js +155 -0
- package/lib/tokens.d.ts +157 -86
- package/lib/tokens.js +16 -12
- package/lib/tools/commands.d.ts +11 -0
- package/lib/tools/commands.js +126 -0
- package/lib/tools/file.d.ts +27 -0
- package/lib/tools/file.js +262 -0
- package/lib/tools/notebook.d.ts +40 -0
- package/lib/tools/notebook.js +762 -0
- package/lib/tools/tool-registry.d.ts +35 -0
- package/lib/tools/tool-registry.js +55 -0
- package/lib/widgets/ai-settings.d.ts +39 -0
- package/lib/widgets/ai-settings.js +506 -0
- package/lib/widgets/chat-wrapper.d.ts +144 -0
- package/lib/widgets/chat-wrapper.js +390 -0
- package/lib/widgets/provider-config-dialog.d.ts +13 -0
- package/lib/widgets/provider-config-dialog.js +104 -0
- package/package.json +150 -41
- package/schema/settings-model.json +153 -0
- package/src/agent.ts +800 -0
- package/src/chat-model.ts +770 -0
- package/src/completion/completion-provider.ts +308 -0
- package/src/completion/index.ts +1 -0
- package/src/components/clear-button.tsx +56 -0
- package/src/components/index.ts +3 -0
- package/src/components/model-select.tsx +245 -0
- package/src/components/stop-button.tsx +11 -11
- package/src/components/token-usage-display.tsx +130 -0
- package/src/components/tool-select.tsx +218 -0
- package/src/icons.ts +12 -14
- package/src/index.ts +468 -238
- package/src/mcp/browser.ts +213 -0
- package/src/models/settings-model.ts +409 -0
- package/src/providers/built-in-providers.ts +216 -0
- package/src/providers/models.ts +79 -0
- package/src/providers/provider-registry.ts +189 -0
- package/src/tokens.ts +203 -90
- package/src/tools/commands.ts +151 -0
- package/src/tools/file.ts +307 -0
- package/src/tools/notebook.ts +964 -0
- package/src/tools/tool-registry.ts +63 -0
- package/src/types.d.ts +4 -0
- package/src/widgets/ai-settings.tsx +1100 -0
- package/src/widgets/chat-wrapper.tsx +543 -0
- package/src/widgets/provider-config-dialog.tsx +256 -0
- package/style/base.css +335 -14
- package/style/icons/jupyternaut-lite.svg +1 -1
- package/lib/base-completer.d.ts +0 -49
- package/lib/base-completer.js +0 -14
- package/lib/chat-handler.d.ts +0 -56
- package/lib/chat-handler.js +0 -201
- package/lib/completion-provider.d.ts +0 -34
- package/lib/completion-provider.js +0 -32
- package/lib/default-prompts.d.ts +0 -2
- package/lib/default-prompts.js +0 -31
- package/lib/default-providers/Anthropic/completer.d.ts +0 -12
- package/lib/default-providers/Anthropic/completer.js +0 -46
- package/lib/default-providers/Anthropic/settings-schema.json +0 -70
- package/lib/default-providers/ChromeAI/completer.d.ts +0 -12
- package/lib/default-providers/ChromeAI/completer.js +0 -56
- package/lib/default-providers/ChromeAI/instructions.d.ts +0 -6
- package/lib/default-providers/ChromeAI/instructions.js +0 -42
- package/lib/default-providers/ChromeAI/settings-schema.json +0 -18
- package/lib/default-providers/Gemini/completer.d.ts +0 -12
- package/lib/default-providers/Gemini/completer.js +0 -48
- package/lib/default-providers/Gemini/instructions.d.ts +0 -2
- package/lib/default-providers/Gemini/instructions.js +0 -9
- package/lib/default-providers/Gemini/settings-schema.json +0 -64
- package/lib/default-providers/MistralAI/completer.d.ts +0 -13
- package/lib/default-providers/MistralAI/completer.js +0 -52
- package/lib/default-providers/MistralAI/instructions.d.ts +0 -2
- package/lib/default-providers/MistralAI/instructions.js +0 -18
- package/lib/default-providers/MistralAI/settings-schema.json +0 -75
- package/lib/default-providers/Ollama/completer.d.ts +0 -12
- package/lib/default-providers/Ollama/completer.js +0 -43
- package/lib/default-providers/Ollama/instructions.d.ts +0 -2
- package/lib/default-providers/Ollama/instructions.js +0 -70
- package/lib/default-providers/Ollama/settings-schema.json +0 -143
- package/lib/default-providers/OpenAI/completer.d.ts +0 -12
- package/lib/default-providers/OpenAI/completer.js +0 -43
- package/lib/default-providers/OpenAI/settings-schema.json +0 -628
- package/lib/default-providers/WebLLM/completer.d.ts +0 -21
- package/lib/default-providers/WebLLM/completer.js +0 -127
- package/lib/default-providers/WebLLM/instructions.d.ts +0 -6
- package/lib/default-providers/WebLLM/instructions.js +0 -32
- package/lib/default-providers/WebLLM/settings-schema.json +0 -19
- package/lib/default-providers/index.d.ts +0 -2
- package/lib/default-providers/index.js +0 -179
- package/lib/provider.d.ts +0 -144
- package/lib/provider.js +0 -412
- package/lib/settings/base.json +0 -7
- package/lib/settings/index.d.ts +0 -3
- package/lib/settings/index.js +0 -3
- package/lib/settings/panel.d.ts +0 -226
- package/lib/settings/panel.js +0 -510
- package/lib/settings/textarea.d.ts +0 -2
- package/lib/settings/textarea.js +0 -18
- package/lib/settings/utils.d.ts +0 -2
- package/lib/settings/utils.js +0 -4
- package/lib/types/ai-model.d.ts +0 -24
- package/lib/types/ai-model.js +0 -5
- package/schema/chat.json +0 -28
- package/schema/provider-registry.json +0 -29
- package/schema/system-prompts.json +0 -22
- package/src/base-completer.ts +0 -75
- package/src/chat-handler.ts +0 -262
- package/src/completion-provider.ts +0 -64
- package/src/default-prompts.ts +0 -33
- package/src/default-providers/Anthropic/completer.ts +0 -59
- package/src/default-providers/ChromeAI/completer.ts +0 -73
- package/src/default-providers/ChromeAI/instructions.ts +0 -45
- package/src/default-providers/Gemini/completer.ts +0 -61
- package/src/default-providers/Gemini/instructions.ts +0 -9
- package/src/default-providers/MistralAI/completer.ts +0 -69
- package/src/default-providers/MistralAI/instructions.ts +0 -18
- package/src/default-providers/Ollama/completer.ts +0 -54
- package/src/default-providers/Ollama/instructions.ts +0 -70
- package/src/default-providers/OpenAI/completer.ts +0 -54
- package/src/default-providers/WebLLM/completer.ts +0 -151
- package/src/default-providers/WebLLM/instructions.ts +0 -33
- package/src/default-providers/index.ts +0 -211
- package/src/global.d.ts +0 -9
- package/src/provider.ts +0 -514
- package/src/settings/index.ts +0 -3
- package/src/settings/panel.tsx +0 -773
- package/src/settings/textarea.tsx +0 -33
- package/src/settings/utils.ts +0 -5
- package/src/types/ai-model.ts +0 -37
- package/src/types/service-worker.d.ts +0 -6
package/src/provider.ts
DELETED
|
@@ -1,514 +0,0 @@
|
|
|
1
|
-
import { Notification } from '@jupyterlab/apputils';
|
|
2
|
-
import {
|
|
3
|
-
CompletionHandler,
|
|
4
|
-
IInlineCompletionContext
|
|
5
|
-
} from '@jupyterlab/completer';
|
|
6
|
-
import { BaseLanguageModel } from '@langchain/core/language_models/base';
|
|
7
|
-
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
8
|
-
import { ReadonlyPartialJSONObject } from '@lumino/coreutils';
|
|
9
|
-
import { Debouncer } from '@lumino/polling';
|
|
10
|
-
import { ISignal, Signal } from '@lumino/signaling';
|
|
11
|
-
import { JSONSchema7 } from 'json-schema';
|
|
12
|
-
import { ISecretsManager } from 'jupyter-secrets-manager';
|
|
13
|
-
|
|
14
|
-
import { IBaseCompleter } from './base-completer';
|
|
15
|
-
import { getSecretId, SECRETS_REPLACEMENT } from './settings';
|
|
16
|
-
import {
|
|
17
|
-
IAIProvider,
|
|
18
|
-
IAIProviderRegistry,
|
|
19
|
-
IDict,
|
|
20
|
-
ModelRole,
|
|
21
|
-
PLUGIN_IDS
|
|
22
|
-
} from './tokens';
|
|
23
|
-
import { AIChatModel, AICompleter } from './types/ai-model';
|
|
24
|
-
|
|
25
|
-
const SECRETS_NAMESPACE = PLUGIN_IDS.providerRegistry;
|
|
26
|
-
const NOTIFICATION_DELAY = 2000;
|
|
27
|
-
|
|
28
|
-
export class AIProviderRegistry implements IAIProviderRegistry {
|
|
29
|
-
/**
|
|
30
|
-
* The constructor of the provider registry.
|
|
31
|
-
*/
|
|
32
|
-
constructor(options: AIProviderRegistry.IOptions) {
|
|
33
|
-
this._secretsManager = options.secretsManager || null;
|
|
34
|
-
Private.setToken(options.token);
|
|
35
|
-
|
|
36
|
-
this._notifications = {
|
|
37
|
-
chat: new Debouncer(this._emitErrorNotification, NOTIFICATION_DELAY),
|
|
38
|
-
completer: new Debouncer(this._emitErrorNotification, NOTIFICATION_DELAY)
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Get the list of provider names.
|
|
44
|
-
*/
|
|
45
|
-
get providers(): string[] {
|
|
46
|
-
return Array.from(Private.providers.keys());
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Add a new provider.
|
|
51
|
-
*/
|
|
52
|
-
add(provider: IAIProvider): void {
|
|
53
|
-
if (Private.providers.has(provider.name)) {
|
|
54
|
-
throw new Error(
|
|
55
|
-
`A AI provider named '${provider.name}' is already registered`
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
Private.providers.set(provider.name, provider);
|
|
59
|
-
|
|
60
|
-
// Set the providers if the loading has been deferred.
|
|
61
|
-
if (provider.name === this._deferredProvider.completer?.name) {
|
|
62
|
-
this.setCompleterProvider(this._deferredProvider.completer);
|
|
63
|
-
}
|
|
64
|
-
if (provider.name === this._deferredProvider.chat?.name) {
|
|
65
|
-
this.setChatProvider(this._deferredProvider.chat);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Get the current provider name.
|
|
71
|
-
*/
|
|
72
|
-
currentName(role: ModelRole): string {
|
|
73
|
-
return Private.getName(role);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Get the current AICompleter.
|
|
78
|
-
*/
|
|
79
|
-
get currentCompleter(): AICompleter | null {
|
|
80
|
-
if (Private.getName('completer') === 'None') {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
const completer = Private.getCompleter();
|
|
84
|
-
if (completer === null) {
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
return {
|
|
88
|
-
fetch: (
|
|
89
|
-
request: CompletionHandler.IRequest,
|
|
90
|
-
context: IInlineCompletionContext
|
|
91
|
-
) => completer.fetch(request, context)
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Getter/setter for the completer system prompt.
|
|
97
|
-
*/
|
|
98
|
-
get completerSystemPrompt(): string {
|
|
99
|
-
return this._completerPrompt.replaceAll(
|
|
100
|
-
'$provider_name$',
|
|
101
|
-
this.currentName('completer')
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
set completerSystemPrompt(value: string) {
|
|
105
|
-
this._completerPrompt = value;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Get the current AIChatModel.
|
|
110
|
-
*/
|
|
111
|
-
get currentChatModel(): AIChatModel | null {
|
|
112
|
-
if (Private.getName('chat') === 'None') {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
const currentProvider =
|
|
116
|
-
Private.providers.get(Private.getName('chat')) ?? null;
|
|
117
|
-
|
|
118
|
-
const chatModel = Private.getChatModel();
|
|
119
|
-
if (chatModel === null) {
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
if (currentProvider?.exposeChatModel ?? false) {
|
|
123
|
-
// Expose the full chat model if expected.
|
|
124
|
-
return chatModel as AIChatModel;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Otherwise, we create a reduced AIChatModel interface.
|
|
128
|
-
return {
|
|
129
|
-
stream: (input: any, options?: any) => chatModel.stream(input, options)
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Getter/setter for the chat system prompt.
|
|
135
|
-
*/
|
|
136
|
-
get chatSystemPrompt(): string {
|
|
137
|
-
return this._chatPrompt.replaceAll(
|
|
138
|
-
'$provider_name$',
|
|
139
|
-
this.currentName('chat')
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
set chatSystemPrompt(value: string) {
|
|
143
|
-
this._chatPrompt = value;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Get the settings schema of a given provider.
|
|
148
|
-
*/
|
|
149
|
-
getSettingsSchema(provider: string): JSONSchema7 {
|
|
150
|
-
return (Private.providers.get(provider)?.settingsSchema?.properties ||
|
|
151
|
-
{}) as JSONSchema7;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Get the instructions of a given provider.
|
|
156
|
-
*/
|
|
157
|
-
getInstructions(provider: string): string | undefined {
|
|
158
|
-
return Private.providers.get(provider)?.instructions;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Get the compatibility check function of a given provider.
|
|
163
|
-
*/
|
|
164
|
-
getCompatibilityCheck(
|
|
165
|
-
provider: string
|
|
166
|
-
): (() => Promise<string | null>) | undefined {
|
|
167
|
-
return Private.providers.get(provider)?.compatibilityCheck;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Format an error message from the current provider.
|
|
172
|
-
*/
|
|
173
|
-
formatErrorMessage(error: any): string {
|
|
174
|
-
const currentProvider =
|
|
175
|
-
Private.providers.get(Private.getName('chat')) ?? null;
|
|
176
|
-
if (currentProvider?.errorMessage) {
|
|
177
|
-
return currentProvider?.errorMessage(error);
|
|
178
|
-
}
|
|
179
|
-
if (error.message) {
|
|
180
|
-
return error.message;
|
|
181
|
-
}
|
|
182
|
-
return error;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Get/set the current chat error;
|
|
187
|
-
*/
|
|
188
|
-
get chatError(): string {
|
|
189
|
-
return this._chatError;
|
|
190
|
-
}
|
|
191
|
-
private set chatError(error: string) {
|
|
192
|
-
this._chatError = error;
|
|
193
|
-
if (error !== '') {
|
|
194
|
-
this._notifications.chat.invoke(`Chat: ${error}`);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Get/set the current completer error.
|
|
200
|
-
*/
|
|
201
|
-
get completerError(): string {
|
|
202
|
-
return this._completerError;
|
|
203
|
-
}
|
|
204
|
-
private set completerError(error: string) {
|
|
205
|
-
this._completerError = error;
|
|
206
|
-
if (error !== '') {
|
|
207
|
-
this._notifications.completer.invoke(`Completer: ${error}`);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* A function to emit a notification error.
|
|
213
|
-
*/
|
|
214
|
-
private _emitErrorNotification(error: string) {
|
|
215
|
-
Notification.emit(error, 'error', {
|
|
216
|
-
autoClose: NOTIFICATION_DELAY
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Set the completer provider.
|
|
222
|
-
* Creates the provider if the name has changed, otherwise only updates its config.
|
|
223
|
-
*
|
|
224
|
-
* @param options - An object with the name and the settings of the provider to use.
|
|
225
|
-
*/
|
|
226
|
-
async setCompleterProvider(
|
|
227
|
-
settings: ReadonlyPartialJSONObject
|
|
228
|
-
): Promise<void> {
|
|
229
|
-
this.completerError = '';
|
|
230
|
-
if (!Object.keys(settings).includes('provider')) {
|
|
231
|
-
Private.setName('completer', 'None');
|
|
232
|
-
Private.setCompleter(null);
|
|
233
|
-
this.completerError =
|
|
234
|
-
'The provider is missing from the completer settings';
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
const provider = settings['provider'] as string;
|
|
238
|
-
const currentProvider = Private.providers.get(provider) ?? null;
|
|
239
|
-
if (currentProvider === null) {
|
|
240
|
-
// The current provider may not be loaded when the settings are first loaded.
|
|
241
|
-
// Let's defer the provider loading.
|
|
242
|
-
this._deferredProvider.completer = settings;
|
|
243
|
-
Private.setName('completer', provider);
|
|
244
|
-
Private.setCompleter(null);
|
|
245
|
-
return;
|
|
246
|
-
} else {
|
|
247
|
-
this._deferredProvider.completer = null;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
const compatibilityCheck = this.getCompatibilityCheck(provider);
|
|
251
|
-
if (compatibilityCheck !== undefined) {
|
|
252
|
-
const error = await compatibilityCheck();
|
|
253
|
-
if (error !== null) {
|
|
254
|
-
this.completerError = error.trim();
|
|
255
|
-
Private.setName('completer', 'None');
|
|
256
|
-
this._providerChanged.emit('completer');
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// Get the settings including the secrets.
|
|
262
|
-
const fullSettings = await this._buildFullSettings(provider, settings);
|
|
263
|
-
|
|
264
|
-
if (currentProvider?.completer !== undefined) {
|
|
265
|
-
try {
|
|
266
|
-
Private.setCompleter(
|
|
267
|
-
new currentProvider.completer({
|
|
268
|
-
providerRegistry: this,
|
|
269
|
-
settings: fullSettings
|
|
270
|
-
})
|
|
271
|
-
);
|
|
272
|
-
} catch (e: any) {
|
|
273
|
-
this.completerError = e.message;
|
|
274
|
-
}
|
|
275
|
-
} else {
|
|
276
|
-
Private.setCompleter(null);
|
|
277
|
-
}
|
|
278
|
-
Private.setName('completer', provider);
|
|
279
|
-
this._providerChanged.emit('completer');
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Set the chat provider.
|
|
284
|
-
* Creates the provider if the name has changed, otherwise only updates its config.
|
|
285
|
-
*
|
|
286
|
-
* @param options - An object with the name and the settings of the provider to use.
|
|
287
|
-
*/
|
|
288
|
-
async setChatProvider(settings: ReadonlyPartialJSONObject): Promise<void> {
|
|
289
|
-
this.chatError = '';
|
|
290
|
-
if (!Object.keys(settings).includes('provider')) {
|
|
291
|
-
Private.setName('chat', 'None');
|
|
292
|
-
Private.setChatModel(null);
|
|
293
|
-
this.chatError = 'The provider is missing from the chat settings';
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
const provider = settings['provider'] as string;
|
|
297
|
-
const currentProvider = Private.providers.get(provider) ?? null;
|
|
298
|
-
if (currentProvider === null) {
|
|
299
|
-
// The current provider may not be loaded when the settings are first loaded.
|
|
300
|
-
// Let's defer the provider loading.
|
|
301
|
-
this._deferredProvider.chat = settings;
|
|
302
|
-
Private.setName('chat', provider);
|
|
303
|
-
Private.setChatModel(null);
|
|
304
|
-
return;
|
|
305
|
-
} else {
|
|
306
|
-
this._deferredProvider.chat = null;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
const compatibilityCheck = this.getCompatibilityCheck(provider);
|
|
310
|
-
if (compatibilityCheck !== undefined) {
|
|
311
|
-
const error = await compatibilityCheck();
|
|
312
|
-
if (error !== null) {
|
|
313
|
-
this.chatError = error.trim();
|
|
314
|
-
Private.setName('chat', 'None');
|
|
315
|
-
this._providerChanged.emit('chat');
|
|
316
|
-
return;
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Get the settings including the secrets.
|
|
321
|
-
const fullSettings = await this._buildFullSettings(provider, settings);
|
|
322
|
-
|
|
323
|
-
if (currentProvider?.chat !== undefined) {
|
|
324
|
-
try {
|
|
325
|
-
Private.setChatModel(
|
|
326
|
-
new currentProvider.chat({
|
|
327
|
-
...fullSettings
|
|
328
|
-
})
|
|
329
|
-
);
|
|
330
|
-
} catch (e: any) {
|
|
331
|
-
this.chatError = e.message;
|
|
332
|
-
Private.setChatModel(null);
|
|
333
|
-
}
|
|
334
|
-
} else {
|
|
335
|
-
Private.setChatModel(null);
|
|
336
|
-
}
|
|
337
|
-
Private.setName('chat', provider);
|
|
338
|
-
this._providerChanged.emit('chat');
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
/**
|
|
342
|
-
* A signal emitting when the provider or its settings has changed.
|
|
343
|
-
*/
|
|
344
|
-
get providerChanged(): ISignal<IAIProviderRegistry, ModelRole> {
|
|
345
|
-
return this._providerChanged;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
/**
|
|
349
|
-
* Build a new settings object containing the secrets.
|
|
350
|
-
*/
|
|
351
|
-
private async _buildFullSettings(
|
|
352
|
-
name: string,
|
|
353
|
-
settings: IDict<any>
|
|
354
|
-
): Promise<IDict<any>> {
|
|
355
|
-
// Build a new settings object containing the secrets.
|
|
356
|
-
const fullSettings: IDict = {};
|
|
357
|
-
for (const key of Object.keys(settings)) {
|
|
358
|
-
if (settings[key] === SECRETS_REPLACEMENT) {
|
|
359
|
-
const id = getSecretId(name, key);
|
|
360
|
-
const secrets = await this._secretsManager?.get(
|
|
361
|
-
Private.getToken(),
|
|
362
|
-
SECRETS_NAMESPACE,
|
|
363
|
-
id
|
|
364
|
-
);
|
|
365
|
-
if (secrets !== undefined) {
|
|
366
|
-
fullSettings[key] = secrets.value;
|
|
367
|
-
}
|
|
368
|
-
continue;
|
|
369
|
-
}
|
|
370
|
-
fullSettings[key] = settings[key];
|
|
371
|
-
}
|
|
372
|
-
return fullSettings;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
private _secretsManager: ISecretsManager | null;
|
|
376
|
-
private _providerChanged = new Signal<IAIProviderRegistry, ModelRole>(this);
|
|
377
|
-
private _chatError: string = '';
|
|
378
|
-
private _completerError: string = '';
|
|
379
|
-
private _notifications: {
|
|
380
|
-
[key in ModelRole]: Debouncer;
|
|
381
|
-
};
|
|
382
|
-
private _deferredProvider: {
|
|
383
|
-
[key in ModelRole]: ReadonlyPartialJSONObject | null;
|
|
384
|
-
} = {
|
|
385
|
-
chat: null,
|
|
386
|
-
completer: null
|
|
387
|
-
};
|
|
388
|
-
private _chatPrompt: string = '';
|
|
389
|
-
private _completerPrompt: string = '';
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
export namespace AIProviderRegistry {
|
|
393
|
-
/**
|
|
394
|
-
* The options for the LLM provider.
|
|
395
|
-
*/
|
|
396
|
-
export interface IOptions {
|
|
397
|
-
/**
|
|
398
|
-
* The secrets manager used in the application.
|
|
399
|
-
*/
|
|
400
|
-
secretsManager?: ISecretsManager;
|
|
401
|
-
/**
|
|
402
|
-
* The token used to request the secrets manager.
|
|
403
|
-
*/
|
|
404
|
-
token: symbol;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
/**
|
|
408
|
-
* The options for the Chat system prompt.
|
|
409
|
-
*/
|
|
410
|
-
export interface IPromptOptions {
|
|
411
|
-
/**
|
|
412
|
-
* The provider name.
|
|
413
|
-
*/
|
|
414
|
-
provider_name: string;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
/**
|
|
418
|
-
* This function indicates whether a key is writable in an object.
|
|
419
|
-
* https://stackoverflow.com/questions/54724875/can-we-check-whether-property-is-readonly-in-typescript
|
|
420
|
-
*
|
|
421
|
-
* @param obj - An object extending the BaseLanguageModel interface.
|
|
422
|
-
* @param key - A string as a key of the object.
|
|
423
|
-
* @returns a boolean whether the key is writable or not.
|
|
424
|
-
*/
|
|
425
|
-
export function isWritable<T extends BaseLanguageModel>(
|
|
426
|
-
obj: T,
|
|
427
|
-
key: keyof T
|
|
428
|
-
) {
|
|
429
|
-
const desc =
|
|
430
|
-
Object.getOwnPropertyDescriptor(obj, key) ||
|
|
431
|
-
Object.getOwnPropertyDescriptor(Object.getPrototypeOf(obj), key) ||
|
|
432
|
-
{};
|
|
433
|
-
return Boolean(desc.writable);
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
/**
|
|
437
|
-
* Update the config of a language model.
|
|
438
|
-
* It only updates the writable attributes of the model.
|
|
439
|
-
*
|
|
440
|
-
* @param model - the model to update.
|
|
441
|
-
* @param settings - the configuration s a JSON object.
|
|
442
|
-
*/
|
|
443
|
-
export function updateConfig<T extends BaseLanguageModel>(
|
|
444
|
-
model: T,
|
|
445
|
-
settings: ReadonlyPartialJSONObject
|
|
446
|
-
) {
|
|
447
|
-
Object.entries(settings).forEach(([key, value], index) => {
|
|
448
|
-
if (key in model) {
|
|
449
|
-
const modelKey = key as keyof typeof model;
|
|
450
|
-
if (isWritable(model, modelKey)) {
|
|
451
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
452
|
-
// @ts-ignore
|
|
453
|
-
model[modelKey] = value;
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
});
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
namespace Private {
|
|
461
|
-
/**
|
|
462
|
-
* The token to use with the secrets manager, setter and getter.
|
|
463
|
-
*/
|
|
464
|
-
let secretsToken: symbol;
|
|
465
|
-
export function setToken(value: symbol): void {
|
|
466
|
-
secretsToken = value;
|
|
467
|
-
}
|
|
468
|
-
export function getToken(): symbol {
|
|
469
|
-
return secretsToken;
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
/**
|
|
473
|
-
* The providers map, in private namespace to prevent updating the 'exposeChatModel'
|
|
474
|
-
* flag.
|
|
475
|
-
*/
|
|
476
|
-
export const providers = new Map<string, IAIProvider>();
|
|
477
|
-
|
|
478
|
-
/**
|
|
479
|
-
* The name of the current provider, setter and getter.
|
|
480
|
-
* It is in a private namespace to prevent updating it without updating the models.
|
|
481
|
-
*/
|
|
482
|
-
const names: { [key in ModelRole]: string } = {
|
|
483
|
-
chat: 'None',
|
|
484
|
-
completer: 'None'
|
|
485
|
-
};
|
|
486
|
-
export function setName(role: ModelRole, value: string): void {
|
|
487
|
-
names[role] = value;
|
|
488
|
-
}
|
|
489
|
-
export function getName(role: ModelRole): string {
|
|
490
|
-
return names[role];
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
/**
|
|
494
|
-
* The chat model setter and getter.
|
|
495
|
-
*/
|
|
496
|
-
let chatModel: BaseChatModel | null = null;
|
|
497
|
-
export function setChatModel(model: BaseChatModel | null): void {
|
|
498
|
-
chatModel = model;
|
|
499
|
-
}
|
|
500
|
-
export function getChatModel(): BaseChatModel | null {
|
|
501
|
-
return chatModel;
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
/**
|
|
505
|
-
* The completer setter and getter.
|
|
506
|
-
*/
|
|
507
|
-
let completer: IBaseCompleter | null = null;
|
|
508
|
-
export function setCompleter(model: IBaseCompleter | null): void {
|
|
509
|
-
completer = model;
|
|
510
|
-
}
|
|
511
|
-
export function getCompleter(): IBaseCompleter | null {
|
|
512
|
-
return completer;
|
|
513
|
-
}
|
|
514
|
-
}
|
package/src/settings/index.ts
DELETED