@jupyterlite/ai 0.8.1 → 0.9.0-a1

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.
Files changed (162) hide show
  1. package/lib/agent.d.ts +243 -0
  2. package/lib/agent.js +627 -0
  3. package/lib/chat-model.d.ts +195 -0
  4. package/lib/chat-model.js +591 -0
  5. package/lib/completion/completion-provider.d.ts +93 -0
  6. package/lib/completion/completion-provider.js +235 -0
  7. package/lib/completion/index.d.ts +1 -0
  8. package/lib/completion/index.js +1 -0
  9. package/lib/components/clear-button.d.ts +18 -0
  10. package/lib/components/clear-button.js +31 -0
  11. package/lib/components/index.d.ts +3 -0
  12. package/lib/components/index.js +3 -0
  13. package/lib/components/model-select.d.ts +19 -0
  14. package/lib/components/model-select.js +154 -0
  15. package/lib/components/stop-button.d.ts +3 -3
  16. package/lib/components/stop-button.js +8 -9
  17. package/lib/components/token-usage-display.d.ts +45 -0
  18. package/lib/components/token-usage-display.js +74 -0
  19. package/lib/components/tool-select.d.ts +27 -0
  20. package/lib/components/tool-select.js +130 -0
  21. package/lib/icons.d.ts +3 -1
  22. package/lib/icons.js +10 -13
  23. package/lib/index.d.ts +5 -5
  24. package/lib/index.js +341 -169
  25. package/lib/mcp/browser.d.ts +68 -0
  26. package/lib/mcp/browser.js +132 -0
  27. package/lib/models/settings-model.d.ts +70 -0
  28. package/lib/models/settings-model.js +296 -0
  29. package/lib/providers/built-in-providers.d.ts +9 -0
  30. package/lib/providers/built-in-providers.js +266 -0
  31. package/lib/providers/models.d.ts +37 -0
  32. package/lib/providers/models.js +28 -0
  33. package/lib/providers/provider-registry.d.ts +94 -0
  34. package/lib/providers/provider-registry.js +155 -0
  35. package/lib/tokens.d.ts +167 -86
  36. package/lib/tokens.js +25 -12
  37. package/lib/tools/commands.d.ts +11 -0
  38. package/lib/tools/commands.js +126 -0
  39. package/lib/tools/file.d.ts +27 -0
  40. package/lib/tools/file.js +262 -0
  41. package/lib/tools/notebook.d.ts +41 -0
  42. package/lib/tools/notebook.js +779 -0
  43. package/lib/tools/tool-registry.d.ts +35 -0
  44. package/lib/tools/tool-registry.js +55 -0
  45. package/lib/widgets/ai-settings.d.ts +49 -0
  46. package/lib/widgets/ai-settings.js +580 -0
  47. package/lib/widgets/chat-wrapper.d.ts +144 -0
  48. package/lib/widgets/chat-wrapper.js +390 -0
  49. package/lib/widgets/provider-config-dialog.d.ts +14 -0
  50. package/lib/widgets/provider-config-dialog.js +112 -0
  51. package/package.json +151 -40
  52. package/schema/settings-model.json +159 -0
  53. package/src/agent.ts +836 -0
  54. package/src/chat-model.ts +771 -0
  55. package/src/completion/completion-provider.ts +346 -0
  56. package/src/completion/index.ts +1 -0
  57. package/src/components/clear-button.tsx +56 -0
  58. package/src/components/index.ts +3 -0
  59. package/src/components/model-select.tsx +245 -0
  60. package/src/components/stop-button.tsx +11 -11
  61. package/src/components/token-usage-display.tsx +130 -0
  62. package/src/components/tool-select.tsx +218 -0
  63. package/src/icons.ts +12 -14
  64. package/src/index.ts +485 -232
  65. package/src/mcp/browser.ts +213 -0
  66. package/src/models/settings-model.ts +413 -0
  67. package/src/providers/built-in-providers.ts +294 -0
  68. package/src/providers/models.ts +79 -0
  69. package/src/providers/provider-registry.ts +189 -0
  70. package/src/tokens.ts +217 -90
  71. package/src/tools/commands.ts +151 -0
  72. package/src/tools/file.ts +307 -0
  73. package/src/tools/notebook.ts +987 -0
  74. package/src/tools/tool-registry.ts +63 -0
  75. package/src/types.d.ts +4 -0
  76. package/src/widgets/ai-settings.tsx +1233 -0
  77. package/src/widgets/chat-wrapper.tsx +543 -0
  78. package/src/widgets/provider-config-dialog.tsx +272 -0
  79. package/style/base.css +335 -14
  80. package/style/icons/jupyternaut-lite.svg +1 -1
  81. package/lib/base-completer.d.ts +0 -49
  82. package/lib/base-completer.js +0 -14
  83. package/lib/chat-handler.d.ts +0 -56
  84. package/lib/chat-handler.js +0 -201
  85. package/lib/completion-provider.d.ts +0 -34
  86. package/lib/completion-provider.js +0 -32
  87. package/lib/default-prompts.d.ts +0 -2
  88. package/lib/default-prompts.js +0 -31
  89. package/lib/default-providers/Anthropic/completer.d.ts +0 -12
  90. package/lib/default-providers/Anthropic/completer.js +0 -46
  91. package/lib/default-providers/Anthropic/settings-schema.json +0 -70
  92. package/lib/default-providers/ChromeAI/completer.d.ts +0 -12
  93. package/lib/default-providers/ChromeAI/completer.js +0 -56
  94. package/lib/default-providers/ChromeAI/instructions.d.ts +0 -6
  95. package/lib/default-providers/ChromeAI/instructions.js +0 -42
  96. package/lib/default-providers/ChromeAI/settings-schema.json +0 -18
  97. package/lib/default-providers/Gemini/completer.d.ts +0 -12
  98. package/lib/default-providers/Gemini/completer.js +0 -48
  99. package/lib/default-providers/Gemini/instructions.d.ts +0 -2
  100. package/lib/default-providers/Gemini/instructions.js +0 -9
  101. package/lib/default-providers/Gemini/settings-schema.json +0 -64
  102. package/lib/default-providers/MistralAI/completer.d.ts +0 -13
  103. package/lib/default-providers/MistralAI/completer.js +0 -52
  104. package/lib/default-providers/MistralAI/instructions.d.ts +0 -2
  105. package/lib/default-providers/MistralAI/instructions.js +0 -18
  106. package/lib/default-providers/MistralAI/settings-schema.json +0 -75
  107. package/lib/default-providers/Ollama/completer.d.ts +0 -12
  108. package/lib/default-providers/Ollama/completer.js +0 -43
  109. package/lib/default-providers/Ollama/instructions.d.ts +0 -2
  110. package/lib/default-providers/Ollama/instructions.js +0 -70
  111. package/lib/default-providers/Ollama/settings-schema.json +0 -143
  112. package/lib/default-providers/OpenAI/completer.d.ts +0 -12
  113. package/lib/default-providers/OpenAI/completer.js +0 -43
  114. package/lib/default-providers/OpenAI/settings-schema.json +0 -628
  115. package/lib/default-providers/WebLLM/completer.d.ts +0 -21
  116. package/lib/default-providers/WebLLM/completer.js +0 -127
  117. package/lib/default-providers/WebLLM/instructions.d.ts +0 -6
  118. package/lib/default-providers/WebLLM/instructions.js +0 -32
  119. package/lib/default-providers/WebLLM/settings-schema.json +0 -19
  120. package/lib/default-providers/index.d.ts +0 -2
  121. package/lib/default-providers/index.js +0 -179
  122. package/lib/provider.d.ts +0 -144
  123. package/lib/provider.js +0 -412
  124. package/lib/settings/base.json +0 -7
  125. package/lib/settings/index.d.ts +0 -3
  126. package/lib/settings/index.js +0 -3
  127. package/lib/settings/panel.d.ts +0 -226
  128. package/lib/settings/panel.js +0 -510
  129. package/lib/settings/textarea.d.ts +0 -2
  130. package/lib/settings/textarea.js +0 -18
  131. package/lib/settings/utils.d.ts +0 -2
  132. package/lib/settings/utils.js +0 -4
  133. package/lib/types/ai-model.d.ts +0 -24
  134. package/lib/types/ai-model.js +0 -5
  135. package/schema/chat.json +0 -28
  136. package/schema/provider-registry.json +0 -29
  137. package/schema/system-prompts.json +0 -22
  138. package/src/base-completer.ts +0 -75
  139. package/src/chat-handler.ts +0 -262
  140. package/src/completion-provider.ts +0 -64
  141. package/src/default-prompts.ts +0 -33
  142. package/src/default-providers/Anthropic/completer.ts +0 -59
  143. package/src/default-providers/ChromeAI/completer.ts +0 -73
  144. package/src/default-providers/ChromeAI/instructions.ts +0 -45
  145. package/src/default-providers/Gemini/completer.ts +0 -61
  146. package/src/default-providers/Gemini/instructions.ts +0 -9
  147. package/src/default-providers/MistralAI/completer.ts +0 -69
  148. package/src/default-providers/MistralAI/instructions.ts +0 -18
  149. package/src/default-providers/Ollama/completer.ts +0 -54
  150. package/src/default-providers/Ollama/instructions.ts +0 -70
  151. package/src/default-providers/OpenAI/completer.ts +0 -54
  152. package/src/default-providers/WebLLM/completer.ts +0 -151
  153. package/src/default-providers/WebLLM/instructions.ts +0 -33
  154. package/src/default-providers/index.ts +0 -211
  155. package/src/global.d.ts +0 -9
  156. package/src/provider.ts +0 -514
  157. package/src/settings/index.ts +0 -3
  158. package/src/settings/panel.tsx +0 -773
  159. package/src/settings/textarea.tsx +0 -33
  160. package/src/settings/utils.ts +0 -5
  161. package/src/types/ai-model.ts +0 -37
  162. package/src/types/service-worker.d.ts +0 -6
@@ -0,0 +1,266 @@
1
+ import { createAnthropic } from '@ai-sdk/anthropic';
2
+ import { createMistral } from '@ai-sdk/mistral';
3
+ import { createOpenAI } from '@ai-sdk/openai';
4
+ import { aisdk } from '@openai/agents-extensions';
5
+ import { createOllama } from 'ollama-ai-provider-v2';
6
+ /**
7
+ * Register all built-in chat providers
8
+ */
9
+ export function registerBuiltInChatProviders(registry) {
10
+ // Anthropic provider
11
+ const anthropicInfo = {
12
+ id: 'anthropic',
13
+ name: 'Anthropic Claude',
14
+ requiresApiKey: true,
15
+ defaultModels: [
16
+ 'claude-sonnet-4-20250514',
17
+ 'claude-opus-4-20250514',
18
+ 'claude-opus-4-1-20250805',
19
+ 'claude-3-5-haiku-latest'
20
+ ],
21
+ supportsBaseURL: true,
22
+ supportsHeaders: true,
23
+ factory: (options) => {
24
+ if (!options.apiKey) {
25
+ throw new Error('API key required for Anthropic');
26
+ }
27
+ const anthropic = createAnthropic({
28
+ apiKey: options.apiKey,
29
+ headers: {
30
+ 'anthropic-dangerous-direct-browser-access': 'true',
31
+ ...options.headers
32
+ },
33
+ ...(options.baseURL && { baseURL: options.baseURL })
34
+ });
35
+ const modelName = options.model ?? '';
36
+ return aisdk(anthropic(modelName));
37
+ }
38
+ };
39
+ registry.registerProvider(anthropicInfo);
40
+ // Mistral provider
41
+ const mistralInfo = {
42
+ id: 'mistral',
43
+ name: 'Mistral AI',
44
+ requiresApiKey: true,
45
+ defaultModels: [
46
+ 'mistral-medium-latest',
47
+ 'mistral-large-latest',
48
+ 'mistral-small-latest',
49
+ 'codestral-latest'
50
+ ],
51
+ supportsBaseURL: true,
52
+ factory: (options) => {
53
+ if (!options.apiKey) {
54
+ throw new Error('API key required for Mistral');
55
+ }
56
+ const mistral = createMistral({
57
+ apiKey: options.apiKey,
58
+ ...(options.baseURL && { baseURL: options.baseURL })
59
+ });
60
+ const modelName = options.model || 'mistral-large-latest';
61
+ return aisdk(mistral(modelName));
62
+ }
63
+ };
64
+ registry.registerProvider(mistralInfo);
65
+ // OpenAI provider
66
+ const openaiInfo = {
67
+ id: 'openai',
68
+ name: 'OpenAI',
69
+ requiresApiKey: true,
70
+ defaultModels: [
71
+ 'gpt-4o',
72
+ 'gpt-4o-mini',
73
+ 'gpt-4o-audio-preview',
74
+ 'gpt-4-turbo',
75
+ 'gpt-4',
76
+ 'gpt-3.5-turbo',
77
+ 'o1',
78
+ 'o3-mini',
79
+ 'chatgpt-4o-latest',
80
+ 'gpt-5',
81
+ 'gpt-5-mini'
82
+ ],
83
+ supportsBaseURL: true,
84
+ supportsHeaders: true,
85
+ factory: (options) => {
86
+ if (!options.apiKey) {
87
+ throw new Error('API key required for OpenAI');
88
+ }
89
+ const openai = createOpenAI({
90
+ apiKey: options.apiKey,
91
+ ...(options.baseURL && { baseURL: options.baseURL }),
92
+ ...(options.headers && { headers: options.headers })
93
+ });
94
+ const modelName = options.model || 'gpt-4o';
95
+ return aisdk(openai(modelName));
96
+ }
97
+ };
98
+ registry.registerProvider(openaiInfo);
99
+ // Ollama provider
100
+ const ollamaInfo = {
101
+ id: 'ollama',
102
+ name: 'Ollama',
103
+ requiresApiKey: false,
104
+ defaultModels: [],
105
+ supportsBaseURL: true,
106
+ supportsHeaders: true,
107
+ factory: (options) => {
108
+ const ollama = createOllama({
109
+ baseURL: options.baseURL || 'http://localhost:11434/api',
110
+ ...(options.headers && { headers: options.headers })
111
+ });
112
+ const modelName = options.model || 'phi3';
113
+ return aisdk(ollama(modelName));
114
+ }
115
+ };
116
+ registry.registerProvider(ollamaInfo);
117
+ }
118
+ /**
119
+ * Register all built-in completion providers
120
+ */
121
+ export function registerBuiltInCompletionProviders(registry) {
122
+ // Anthropic provider
123
+ const anthropicInfo = {
124
+ id: 'anthropic',
125
+ name: 'Anthropic Claude',
126
+ requiresApiKey: true,
127
+ defaultModels: [
128
+ 'claude-sonnet-4-20250514',
129
+ 'claude-opus-4-20250514',
130
+ 'claude-opus-4-1-20250805',
131
+ 'claude-3-5-haiku-latest'
132
+ ],
133
+ supportsBaseURL: true,
134
+ supportsHeaders: true,
135
+ customSettings: {
136
+ completionConfig: {
137
+ temperature: 0.3,
138
+ supportsFillInMiddle: false,
139
+ useFilterText: true
140
+ }
141
+ },
142
+ factory: (options) => {
143
+ if (!options.apiKey) {
144
+ throw new Error('API key required for Anthropic');
145
+ }
146
+ const anthropic = createAnthropic({
147
+ apiKey: options.apiKey,
148
+ headers: {
149
+ 'anthropic-dangerous-direct-browser-access': 'true',
150
+ ...options.headers
151
+ },
152
+ ...(options.baseURL && { baseURL: options.baseURL })
153
+ });
154
+ const modelName = options.model ?? '';
155
+ return anthropic(modelName);
156
+ }
157
+ };
158
+ registry.registerProvider(anthropicInfo);
159
+ // Mistral provider
160
+ const mistralInfo = {
161
+ id: 'mistral',
162
+ name: 'Mistral AI',
163
+ requiresApiKey: true,
164
+ defaultModels: [
165
+ 'mistral-medium-latest',
166
+ 'mistral-large-latest',
167
+ 'mistral-small-latest',
168
+ 'codestral-latest'
169
+ ],
170
+ supportsBaseURL: true,
171
+ customSettings: {
172
+ completionConfig: {
173
+ temperature: 0.2,
174
+ supportsFillInMiddle: true,
175
+ customPromptFormat: (prompt, suffix) => {
176
+ return suffix.trim() ? `<PRE>${prompt}<SUF>${suffix}<MID>` : prompt;
177
+ },
178
+ cleanupCompletion: (completion) => {
179
+ return completion
180
+ .replace(/<PRE>/g, '')
181
+ .replace(/<SUF>/g, '')
182
+ .replace(/<MID>/g, '')
183
+ .replace(/```[\s\S]*?```/g, '')
184
+ .trim();
185
+ },
186
+ useFilterText: false
187
+ }
188
+ },
189
+ factory: (options) => {
190
+ if (!options.apiKey) {
191
+ throw new Error('API key required for Mistral');
192
+ }
193
+ const mistral = createMistral({
194
+ apiKey: options.apiKey,
195
+ ...(options.baseURL && { baseURL: options.baseURL })
196
+ });
197
+ const modelName = options.model || 'mistral-large-latest';
198
+ return mistral(modelName);
199
+ }
200
+ };
201
+ registry.registerProvider(mistralInfo);
202
+ // OpenAI provider
203
+ const openaiInfo = {
204
+ id: 'openai',
205
+ name: 'OpenAI',
206
+ requiresApiKey: true,
207
+ defaultModels: [
208
+ 'gpt-4o',
209
+ 'gpt-4o-mini',
210
+ 'gpt-4o-audio-preview',
211
+ 'gpt-4-turbo',
212
+ 'gpt-4',
213
+ 'gpt-3.5-turbo',
214
+ 'o1',
215
+ 'o3-mini',
216
+ 'chatgpt-4o-latest',
217
+ 'gpt-5',
218
+ 'gpt-5-mini'
219
+ ],
220
+ supportsBaseURL: true,
221
+ supportsHeaders: true,
222
+ customSettings: {
223
+ completionConfig: {
224
+ useFilterText: true
225
+ }
226
+ },
227
+ factory: (options) => {
228
+ if (!options.apiKey) {
229
+ throw new Error('API key required for OpenAI');
230
+ }
231
+ const openai = createOpenAI({
232
+ apiKey: options.apiKey,
233
+ ...(options.baseURL && { baseURL: options.baseURL }),
234
+ ...(options.headers && { headers: options.headers })
235
+ });
236
+ const modelName = options.model || 'gpt-4o';
237
+ return openai(modelName);
238
+ }
239
+ };
240
+ registry.registerProvider(openaiInfo);
241
+ // Ollama provider
242
+ const ollamaInfo = {
243
+ id: 'ollama',
244
+ name: 'Ollama',
245
+ requiresApiKey: false,
246
+ defaultModels: ['phi3'],
247
+ supportsBaseURL: true,
248
+ supportsHeaders: true,
249
+ customSettings: {
250
+ completionConfig: {
251
+ temperature: 0.3,
252
+ supportsFillInMiddle: false,
253
+ useFilterText: false
254
+ }
255
+ },
256
+ factory: (options) => {
257
+ const ollama = createOllama({
258
+ baseURL: options.baseURL || 'http://localhost:11434/api',
259
+ ...(options.headers && { headers: options.headers })
260
+ });
261
+ const modelName = options.model || 'phi3';
262
+ return ollama(modelName);
263
+ }
264
+ };
265
+ registry.registerProvider(ollamaInfo);
266
+ }
@@ -0,0 +1,37 @@
1
+ import type { LanguageModel } from 'ai';
2
+ import type { IChatProviderRegistry, ICompletionProviderRegistry } from '../tokens';
3
+ /**
4
+ * Configuration options for creating language models.
5
+ */
6
+ export interface IModelOptions {
7
+ /**
8
+ * The provider name (e.g., 'openai', 'anthropic', 'huggingface')
9
+ */
10
+ provider: string;
11
+ /**
12
+ * The specific model name. If not provided, uses provider's default model
13
+ */
14
+ model?: string;
15
+ /**
16
+ * API key for authentication with the provider
17
+ */
18
+ apiKey?: string;
19
+ /**
20
+ * Additional HTTP headers to send with requests
21
+ */
22
+ headers?: Record<string, string>;
23
+ /**
24
+ * Custom base URL for the provider's API endpoint
25
+ */
26
+ baseURL?: string;
27
+ }
28
+ /**
29
+ * Create a completion model using the provider registry.
30
+ * Built-in providers are automatically registered during extension initialization.
31
+ */
32
+ export declare function createCompletionModel(options: IModelOptions, registry?: ICompletionProviderRegistry): LanguageModel;
33
+ /**
34
+ * Create a chat model using the provider registry.
35
+ * Built-in providers are automatically registered during extension initialization.
36
+ */
37
+ export declare function createModel(options: IModelOptions, registry?: IChatProviderRegistry): any;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Create a completion model using the provider registry.
3
+ * Built-in providers are automatically registered during extension initialization.
4
+ */
5
+ export function createCompletionModel(options, registry) {
6
+ if (!registry) {
7
+ throw new Error('Completion provider registry not available');
8
+ }
9
+ const model = registry.createCompletionModel(options.provider, options);
10
+ if (!model) {
11
+ throw new Error(`Provider ${options.provider} not found or failed to create model`);
12
+ }
13
+ return model;
14
+ }
15
+ /**
16
+ * Create a chat model using the provider registry.
17
+ * Built-in providers are automatically registered during extension initialization.
18
+ */
19
+ export function createModel(options, registry) {
20
+ if (!registry) {
21
+ throw new Error('Chat provider registry not available');
22
+ }
23
+ const model = registry.createChatModel(options.provider, options);
24
+ if (!model) {
25
+ throw new Error(`Provider ${options.provider} not found or failed to create model`);
26
+ }
27
+ return model;
28
+ }
@@ -0,0 +1,94 @@
1
+ import { ISignal } from '@lumino/signaling';
2
+ import type { LanguageModel } from 'ai';
3
+ import type { IModelOptions } from './models';
4
+ import { IChatProviderInfo, IChatProviderRegistry, ICompletionProviderInfo, ICompletionProviderRegistry } from '../tokens';
5
+ /**
6
+ * Implementation of the chat provider registry
7
+ */
8
+ export declare class ChatProviderRegistry implements IChatProviderRegistry {
9
+ /**
10
+ * Get a copy of all registered providers
11
+ */
12
+ get providers(): Record<string, IChatProviderInfo>;
13
+ /**
14
+ * Signal emitted when providers are added or removed
15
+ */
16
+ get providersChanged(): ISignal<IChatProviderRegistry, void>;
17
+ /**
18
+ * Register a new chat provider
19
+ * @param info Provider information including factory
20
+ */
21
+ registerProvider(info: IChatProviderInfo): void;
22
+ /**
23
+ * Unregister a chat provider by ID
24
+ * @param id Provider ID to remove
25
+ * @returns true if provider was found and removed, false otherwise
26
+ */
27
+ unregisterProvider(id: string): boolean;
28
+ /**
29
+ * Get provider information by ID
30
+ * @param id Provider ID
31
+ * @returns Provider info or null if not found
32
+ */
33
+ getProviderInfo(id: string): IChatProviderInfo | null;
34
+ /**
35
+ * Create a chat model instance using the specified provider
36
+ * @param id Provider ID
37
+ * @param options Model configuration options
38
+ * @returns Chat model instance or null if creation fails
39
+ */
40
+ createChatModel(id: string, options: IModelOptions): any | null;
41
+ /**
42
+ * Get list of all available provider IDs
43
+ * @returns Array of provider IDs
44
+ */
45
+ getAvailableProviders(): string[];
46
+ private _providers;
47
+ private _factories;
48
+ private _providersChanged;
49
+ }
50
+ /**
51
+ * Implementation of the completion provider registry
52
+ */
53
+ export declare class CompletionProviderRegistry implements ICompletionProviderRegistry {
54
+ /**
55
+ * Get a copy of all registered providers
56
+ */
57
+ get providers(): Record<string, ICompletionProviderInfo>;
58
+ /**
59
+ * Signal emitted when providers are added or removed
60
+ */
61
+ get providersChanged(): ISignal<ICompletionProviderRegistry, void>;
62
+ /**
63
+ * Register a new completion provider
64
+ * @param info Provider information including factory
65
+ */
66
+ registerProvider(info: ICompletionProviderInfo): void;
67
+ /**
68
+ * Unregister a completion provider by ID
69
+ * @param id Provider ID to remove
70
+ * @returns true if provider was found and removed, false otherwise
71
+ */
72
+ unregisterProvider(id: string): boolean;
73
+ /**
74
+ * Get provider information by ID
75
+ * @param id Provider ID
76
+ * @returns Provider info or null if not found
77
+ */
78
+ getProviderInfo(id: string): ICompletionProviderInfo | null;
79
+ /**
80
+ * Create a completion model instance using the specified provider
81
+ * @param id Provider ID
82
+ * @param options Model configuration options
83
+ * @returns Language model instance or null if creation fails
84
+ */
85
+ createCompletionModel(id: string, options: IModelOptions): LanguageModel | null;
86
+ /**
87
+ * Get list of all available provider IDs
88
+ * @returns Array of provider IDs
89
+ */
90
+ getAvailableProviders(): string[];
91
+ private _providers;
92
+ private _factories;
93
+ private _providersChanged;
94
+ }
@@ -0,0 +1,155 @@
1
+ import { Signal } from '@lumino/signaling';
2
+ /**
3
+ * Implementation of the chat provider registry
4
+ */
5
+ export class ChatProviderRegistry {
6
+ /**
7
+ * Get a copy of all registered providers
8
+ */
9
+ get providers() {
10
+ return { ...this._providers };
11
+ }
12
+ /**
13
+ * Signal emitted when providers are added or removed
14
+ */
15
+ get providersChanged() {
16
+ return this._providersChanged;
17
+ }
18
+ /**
19
+ * Register a new chat provider
20
+ * @param info Provider information including factory
21
+ */
22
+ registerProvider(info) {
23
+ this._providers[info.id] = { ...info };
24
+ this._factories[info.id] = info.factory;
25
+ this._providersChanged.emit();
26
+ }
27
+ /**
28
+ * Unregister a chat provider by ID
29
+ * @param id Provider ID to remove
30
+ * @returns true if provider was found and removed, false otherwise
31
+ */
32
+ unregisterProvider(id) {
33
+ if (id in this._providers) {
34
+ delete this._providers[id];
35
+ delete this._factories[id];
36
+ this._providersChanged.emit();
37
+ return true;
38
+ }
39
+ return false;
40
+ }
41
+ /**
42
+ * Get provider information by ID
43
+ * @param id Provider ID
44
+ * @returns Provider info or null if not found
45
+ */
46
+ getProviderInfo(id) {
47
+ return this._providers[id] || null;
48
+ }
49
+ /**
50
+ * Create a chat model instance using the specified provider
51
+ * @param id Provider ID
52
+ * @param options Model configuration options
53
+ * @returns Chat model instance or null if creation fails
54
+ */
55
+ createChatModel(id, options) {
56
+ const factory = this._factories[id];
57
+ if (!factory) {
58
+ return null;
59
+ }
60
+ try {
61
+ return factory(options);
62
+ }
63
+ catch (error) {
64
+ console.error(`Failed to create chat model for provider ${id}:`, error);
65
+ return null;
66
+ }
67
+ }
68
+ /**
69
+ * Get list of all available provider IDs
70
+ * @returns Array of provider IDs
71
+ */
72
+ getAvailableProviders() {
73
+ return Object.keys(this._providers);
74
+ }
75
+ _providers = {};
76
+ _factories = {};
77
+ _providersChanged = new Signal(this);
78
+ }
79
+ /**
80
+ * Implementation of the completion provider registry
81
+ */
82
+ export class CompletionProviderRegistry {
83
+ /**
84
+ * Get a copy of all registered providers
85
+ */
86
+ get providers() {
87
+ return { ...this._providers };
88
+ }
89
+ /**
90
+ * Signal emitted when providers are added or removed
91
+ */
92
+ get providersChanged() {
93
+ return this._providersChanged;
94
+ }
95
+ /**
96
+ * Register a new completion provider
97
+ * @param info Provider information including factory
98
+ */
99
+ registerProvider(info) {
100
+ this._providers[info.id] = { ...info };
101
+ this._factories[info.id] = info.factory;
102
+ this._providersChanged.emit();
103
+ }
104
+ /**
105
+ * Unregister a completion provider by ID
106
+ * @param id Provider ID to remove
107
+ * @returns true if provider was found and removed, false otherwise
108
+ */
109
+ unregisterProvider(id) {
110
+ if (id in this._providers) {
111
+ delete this._providers[id];
112
+ delete this._factories[id];
113
+ this._providersChanged.emit();
114
+ return true;
115
+ }
116
+ return false;
117
+ }
118
+ /**
119
+ * Get provider information by ID
120
+ * @param id Provider ID
121
+ * @returns Provider info or null if not found
122
+ */
123
+ getProviderInfo(id) {
124
+ return this._providers[id] || null;
125
+ }
126
+ /**
127
+ * Create a completion model instance using the specified provider
128
+ * @param id Provider ID
129
+ * @param options Model configuration options
130
+ * @returns Language model instance or null if creation fails
131
+ */
132
+ createCompletionModel(id, options) {
133
+ const factory = this._factories[id];
134
+ if (!factory) {
135
+ return null;
136
+ }
137
+ try {
138
+ return factory(options);
139
+ }
140
+ catch (error) {
141
+ console.error(`Failed to create completion model for provider ${id}:`, error);
142
+ return null;
143
+ }
144
+ }
145
+ /**
146
+ * Get list of all available provider IDs
147
+ * @returns Array of provider IDs
148
+ */
149
+ getAvailableProviders() {
150
+ return Object.keys(this._providers);
151
+ }
152
+ _providers = {};
153
+ _factories = {};
154
+ _providersChanged = new Signal(this);
155
+ }