@jupyterlite/ai 0.14.0 → 0.16.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.
Files changed (64) hide show
  1. package/lib/agent.d.ts +33 -115
  2. package/lib/agent.js +192 -106
  3. package/lib/chat-model-handler.d.ts +9 -11
  4. package/lib/chat-model-handler.js +9 -4
  5. package/lib/chat-model.d.ts +84 -13
  6. package/lib/chat-model.js +214 -136
  7. package/lib/completion/completion-provider.d.ts +2 -3
  8. package/lib/components/completion-status.d.ts +2 -2
  9. package/lib/components/index.d.ts +1 -1
  10. package/lib/components/index.js +1 -1
  11. package/lib/components/model-select.d.ts +3 -3
  12. package/lib/components/save-button.d.ts +31 -0
  13. package/lib/components/save-button.js +41 -0
  14. package/lib/components/tool-select.d.ts +3 -4
  15. package/lib/components/{token-usage-display.d.ts → usage-display.d.ts} +13 -14
  16. package/lib/components/usage-display.js +109 -0
  17. package/lib/diff-manager.d.ts +2 -3
  18. package/lib/index.d.ts +2 -4
  19. package/lib/index.js +186 -28
  20. package/lib/models/settings-model.d.ts +11 -53
  21. package/lib/models/settings-model.js +38 -22
  22. package/lib/providers/built-in-providers.js +22 -36
  23. package/lib/providers/generated-context-windows.d.ts +8 -0
  24. package/lib/providers/generated-context-windows.js +96 -0
  25. package/lib/providers/model-info.d.ts +3 -0
  26. package/lib/providers/model-info.js +58 -0
  27. package/lib/tokens.d.ts +361 -36
  28. package/lib/tokens.js +18 -13
  29. package/lib/tools/commands.d.ts +2 -3
  30. package/lib/widgets/ai-settings.d.ts +3 -5
  31. package/lib/widgets/ai-settings.js +12 -0
  32. package/lib/widgets/main-area-chat.d.ts +2 -3
  33. package/lib/widgets/main-area-chat.js +12 -12
  34. package/lib/widgets/provider-config-dialog.d.ts +1 -2
  35. package/lib/widgets/provider-config-dialog.js +34 -34
  36. package/package.json +17 -10
  37. package/schema/settings-model.json +18 -1
  38. package/src/agent.ts +275 -248
  39. package/src/chat-model-handler.ts +25 -21
  40. package/src/chat-model.ts +307 -196
  41. package/src/completion/completion-provider.ts +7 -4
  42. package/src/components/completion-status.tsx +3 -3
  43. package/src/components/index.ts +1 -1
  44. package/src/components/model-select.tsx +4 -3
  45. package/src/components/save-button.tsx +84 -0
  46. package/src/components/tool-select.tsx +10 -4
  47. package/src/components/usage-display.tsx +208 -0
  48. package/src/diff-manager.ts +4 -4
  49. package/src/index.ts +250 -58
  50. package/src/models/settings-model.ts +46 -88
  51. package/src/providers/built-in-providers.ts +22 -36
  52. package/src/providers/generated-context-windows.ts +102 -0
  53. package/src/providers/model-info.ts +88 -0
  54. package/src/tokens.ts +438 -58
  55. package/src/tools/commands.ts +2 -3
  56. package/src/widgets/ai-settings.tsx +69 -15
  57. package/src/widgets/main-area-chat.ts +18 -15
  58. package/src/widgets/provider-config-dialog.tsx +96 -61
  59. package/style/base.css +17 -195
  60. package/lib/approval-buttons.d.ts +0 -49
  61. package/lib/approval-buttons.js +0 -79
  62. package/lib/components/token-usage-display.js +0 -72
  63. package/src/approval-buttons.ts +0 -115
  64. package/src/components/token-usage-display.tsx +0 -138
@@ -3,6 +3,7 @@ import { createGoogleGenerativeAI } from '@ai-sdk/google';
3
3
  import { createMistral } from '@ai-sdk/mistral';
4
4
  import { createOpenAI } from '@ai-sdk/openai';
5
5
  import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
6
+ import { BUILT_IN_PROVIDER_MODEL_INFO } from './generated-context-windows';
6
7
  /**
7
8
  * Anthropic provider
8
9
  */
@@ -24,9 +25,9 @@ export const anthropicProvider = {
24
25
  'claude-opus-4-0',
25
26
  'claude-opus-4-20250514',
26
27
  'claude-sonnet-4-0',
27
- 'claude-sonnet-4-20250514',
28
- 'claude-3-haiku-20240307'
28
+ 'claude-sonnet-4-20250514'
29
29
  ],
30
+ modelInfo: BUILT_IN_PROVIDER_MODEL_INFO.anthropic,
30
31
  supportsBaseURL: true,
31
32
  supportsHeaders: true,
32
33
  providerToolCapabilities: {
@@ -60,30 +61,20 @@ export const googleProvider = {
60
61
  'gemini-3.1-pro-preview',
61
62
  'gemini-3.1-pro-preview-customtools',
62
63
  'gemini-3.1-flash-image-preview',
63
- 'gemini-3-pro-preview',
64
+ 'gemini-3.1-flash-lite-preview',
64
65
  'gemini-3-pro-image-preview',
65
66
  'gemini-3-flash-preview',
66
67
  'gemini-2.5-pro',
67
68
  'gemini-2.5-flash',
68
69
  'gemini-2.5-flash-image',
69
70
  'gemini-2.5-flash-lite',
70
- 'gemini-2.5-flash-lite-preview-09-2025',
71
71
  'gemini-2.5-computer-use-preview-10-2025',
72
- 'gemini-2.0-flash',
73
- 'gemini-2.0-flash-001',
74
- 'gemini-2.0-flash-lite',
75
- 'gemini-2.0-flash-lite-001',
72
+ 'deep-research-pro-preview-12-2025',
76
73
  'gemini-pro-latest',
77
74
  'gemini-flash-latest',
78
- 'gemini-flash-lite-latest',
79
- 'deep-research-pro-preview-12-2025',
80
- 'gemma-3-27b-it',
81
- 'gemma-3-12b-it',
82
- 'gemma-3-4b-it',
83
- 'gemma-3-1b-it',
84
- 'gemma-3n-e4b-it',
85
- 'gemma-3n-e2b-it'
75
+ 'gemini-flash-lite-latest'
86
76
  ],
77
+ modelInfo: BUILT_IN_PROVIDER_MODEL_INFO.google,
87
78
  supportsBaseURL: true,
88
79
  factory: (options) => {
89
80
  if (!options.apiKey) {
@@ -105,24 +96,21 @@ export const mistralProvider = {
105
96
  name: 'Mistral AI',
106
97
  apiKeyRequirement: 'required',
107
98
  defaultModels: [
108
- 'ministral-3b-latest',
109
- 'ministral-8b-latest',
110
99
  'mistral-large-latest',
111
100
  'mistral-medium-latest',
112
101
  'mistral-medium-2508',
113
- 'mistral-medium-2505',
114
102
  'mistral-small-latest',
115
- 'codestral-latest',
103
+ 'mistral-small-2506',
104
+ 'ministral-3b-latest',
105
+ 'ministral-8b-latest',
106
+ 'ministral-14b-latest',
107
+ 'magistral-small-latest',
108
+ 'magistral-medium-latest',
116
109
  'pixtral-large-latest',
117
- 'magistral-small-2507',
118
- 'magistral-medium-2507',
119
- 'magistral-small-2506',
120
- 'magistral-medium-2506',
121
- 'pixtral-12b-2409',
122
- 'open-mistral-7b',
123
- 'open-mixtral-8x7b',
124
- 'open-mixtral-8x22b'
110
+ 'codestral-latest',
111
+ 'devstral-latest'
125
112
  ],
113
+ modelInfo: BUILT_IN_PROVIDER_MODEL_INFO.mistral,
126
114
  supportsBaseURL: true,
127
115
  factory: (options) => {
128
116
  if (!options.apiKey) {
@@ -144,6 +132,9 @@ export const openaiProvider = {
144
132
  name: 'OpenAI',
145
133
  apiKeyRequirement: 'required',
146
134
  defaultModels: [
135
+ 'gpt-5.4',
136
+ 'gpt-5.4-mini',
137
+ 'gpt-5.4-nano',
147
138
  'gpt-5.2',
148
139
  'gpt-5.2-2025-12-11',
149
140
  'gpt-5.2-chat-latest',
@@ -162,6 +153,7 @@ export const openaiProvider = {
162
153
  'gpt-5-nano-2025-08-07',
163
154
  'o4-mini',
164
155
  'o4-mini-2025-04-16',
156
+ 'o3-pro',
165
157
  'o3',
166
158
  'o3-2025-04-16',
167
159
  'o3-mini',
@@ -178,22 +170,16 @@ export const openaiProvider = {
178
170
  'gpt-4o-2024-05-13',
179
171
  'gpt-4o-2024-08-06',
180
172
  'gpt-4o-2024-11-20',
181
- 'gpt-4o-audio-preview',
182
- 'gpt-4o-audio-preview-2024-12-17',
183
- 'gpt-4o-audio-preview-2025-06-03',
184
173
  'gpt-4o-mini',
185
174
  'gpt-4o-mini-2024-07-18',
186
- 'gpt-4o-mini-audio-preview',
187
- 'gpt-4o-mini-audio-preview-2024-12-17',
188
175
  'gpt-4o-search-preview',
189
176
  'gpt-4o-search-preview-2025-03-11',
190
177
  'gpt-4o-mini-search-preview',
191
178
  'gpt-4o-mini-search-preview-2025-03-11',
192
179
  'gpt-3.5-turbo',
193
- 'gpt-3.5-turbo-0125',
194
- 'gpt-3.5-turbo-1106',
195
- 'gpt-3.5-turbo-16k'
180
+ 'gpt-3.5-turbo-0125'
196
181
  ],
182
+ modelInfo: BUILT_IN_PROVIDER_MODEL_INFO.openai,
197
183
  supportsBaseURL: true,
198
184
  supportsHeaders: true,
199
185
  providerToolCapabilities: {
@@ -0,0 +1,8 @@
1
+ /**
2
+ * This file is generated by `jlpm sync:model-context-windows`.
3
+ * Source: https://models.dev/api.json
4
+ * Backed by: https://github.com/anomalyco/models.dev
5
+ * Generated: 2026-04-08T16:23:34.080Z
6
+ */
7
+ import type { IProviderModelInfo } from '../tokens';
8
+ export declare const BUILT_IN_PROVIDER_MODEL_INFO: Record<string, Record<string, IProviderModelInfo>>;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * This file is generated by `jlpm sync:model-context-windows`.
3
+ * Source: https://models.dev/api.json
4
+ * Backed by: https://github.com/anomalyco/models.dev
5
+ * Generated: 2026-04-08T16:23:34.080Z
6
+ */
7
+ export const BUILT_IN_PROVIDER_MODEL_INFO = {
8
+ anthropic: {
9
+ 'claude-opus-4-6': { contextWindow: 1000000 },
10
+ 'claude-sonnet-4-6': { contextWindow: 1000000 },
11
+ 'claude-opus-4-5': { contextWindow: 200000 },
12
+ 'claude-opus-4-5-20251101': { contextWindow: 200000 },
13
+ 'claude-sonnet-4-5': { contextWindow: 200000 },
14
+ 'claude-sonnet-4-5-20250929': { contextWindow: 200000 },
15
+ 'claude-haiku-4-5': { contextWindow: 200000 },
16
+ 'claude-haiku-4-5-20251001': { contextWindow: 200000 },
17
+ 'claude-opus-4-1': { contextWindow: 200000 },
18
+ 'claude-opus-4-1-20250805': { contextWindow: 200000 },
19
+ 'claude-opus-4-0': { contextWindow: 200000 },
20
+ 'claude-opus-4-20250514': { contextWindow: 200000 },
21
+ 'claude-sonnet-4-0': { contextWindow: 200000 },
22
+ 'claude-sonnet-4-20250514': { contextWindow: 200000 }
23
+ },
24
+ google: {
25
+ 'gemini-3.1-pro-preview': { contextWindow: 1048576 },
26
+ 'gemini-3.1-pro-preview-customtools': { contextWindow: 1048576 },
27
+ 'gemini-3.1-flash-image-preview': { contextWindow: 131072 },
28
+ 'gemini-3.1-flash-lite-preview': { contextWindow: 1048576 },
29
+ 'gemini-3-flash-preview': { contextWindow: 1048576 },
30
+ 'gemini-2.5-pro': { contextWindow: 1048576 },
31
+ 'gemini-2.5-flash': { contextWindow: 1048576 },
32
+ 'gemini-2.5-flash-image': { contextWindow: 32768 },
33
+ 'gemini-2.5-flash-lite': { contextWindow: 1048576 },
34
+ 'gemini-flash-latest': { contextWindow: 1048576 },
35
+ 'gemini-flash-lite-latest': { contextWindow: 1048576 }
36
+ },
37
+ mistral: {
38
+ 'mistral-large-latest': { contextWindow: 262144 },
39
+ 'mistral-medium-latest': { contextWindow: 128000 },
40
+ 'mistral-medium-2508': { contextWindow: 262144 },
41
+ 'mistral-small-latest': { contextWindow: 256000 },
42
+ 'mistral-small-2506': { contextWindow: 128000 },
43
+ 'ministral-3b-latest': { contextWindow: 128000 },
44
+ 'ministral-8b-latest': { contextWindow: 128000 },
45
+ 'magistral-small-latest': { contextWindow: 128000 },
46
+ 'magistral-medium-latest': { contextWindow: 128000 },
47
+ 'pixtral-large-latest': { contextWindow: 128000 },
48
+ 'codestral-latest': { contextWindow: 256000 },
49
+ 'devstral-latest': { contextWindow: 262144 },
50
+ 'devstral-2512': { contextWindow: 262144 }
51
+ },
52
+ openai: {
53
+ 'gpt-5.4': { contextWindow: 1050000 },
54
+ 'gpt-5.4-mini': { contextWindow: 400000 },
55
+ 'gpt-5.4-nano': { contextWindow: 400000 },
56
+ 'gpt-5.2': { contextWindow: 400000 },
57
+ 'gpt-5.2-2025-12-11': { contextWindow: 400000 },
58
+ 'gpt-5.2-chat-latest': { contextWindow: 128000 },
59
+ 'gpt-5.2-pro': { contextWindow: 400000 },
60
+ 'gpt-5.2-pro-2025-12-11': { contextWindow: 400000 },
61
+ 'gpt-5.2-codex': { contextWindow: 400000 },
62
+ 'gpt-5.1': { contextWindow: 400000 },
63
+ 'gpt-5.1-2025-11-13': { contextWindow: 400000 },
64
+ 'gpt-5.1-chat-latest': { contextWindow: 128000 },
65
+ 'gpt-5': { contextWindow: 400000 },
66
+ 'gpt-5-2025-08-07': { contextWindow: 400000 },
67
+ 'gpt-5-chat-latest': { contextWindow: 400000 },
68
+ 'gpt-5-mini': { contextWindow: 400000 },
69
+ 'gpt-5-mini-2025-08-07': { contextWindow: 400000 },
70
+ 'gpt-5-nano': { contextWindow: 400000 },
71
+ 'gpt-5-nano-2025-08-07': { contextWindow: 400000 },
72
+ 'o4-mini': { contextWindow: 200000 },
73
+ 'o4-mini-2025-04-16': { contextWindow: 200000 },
74
+ 'o3-pro': { contextWindow: 200000 },
75
+ o3: { contextWindow: 200000 },
76
+ 'o3-2025-04-16': { contextWindow: 200000 },
77
+ 'o3-mini': { contextWindow: 200000 },
78
+ 'o3-mini-2025-01-31': { contextWindow: 200000 },
79
+ o1: { contextWindow: 200000 },
80
+ 'o1-2024-12-17': { contextWindow: 200000 },
81
+ 'gpt-4.1': { contextWindow: 1047576 },
82
+ 'gpt-4.1-2025-04-14': { contextWindow: 1047576 },
83
+ 'gpt-4.1-mini': { contextWindow: 1047576 },
84
+ 'gpt-4.1-mini-2025-04-14': { contextWindow: 1047576 },
85
+ 'gpt-4.1-nano': { contextWindow: 1047576 },
86
+ 'gpt-4.1-nano-2025-04-14': { contextWindow: 1047576 },
87
+ 'gpt-4o': { contextWindow: 128000 },
88
+ 'gpt-4o-2024-05-13': { contextWindow: 128000 },
89
+ 'gpt-4o-2024-08-06': { contextWindow: 128000 },
90
+ 'gpt-4o-2024-11-20': { contextWindow: 128000 },
91
+ 'gpt-4o-mini': { contextWindow: 128000 },
92
+ 'gpt-4o-mini-2024-07-18': { contextWindow: 128000 },
93
+ 'gpt-3.5-turbo': { contextWindow: 16385 },
94
+ 'gpt-3.5-turbo-0125': { contextWindow: 16385 }
95
+ }
96
+ };
@@ -0,0 +1,3 @@
1
+ import type { IProviderConfig, IProviderInfo, IProviderModelInfo, IProviderRegistry } from '../tokens';
2
+ export declare function getProviderModelInfo(providerInfo: IProviderInfo | null | undefined, model: string | undefined): IProviderModelInfo | undefined;
3
+ export declare function getEffectiveContextWindow(providerConfig: IProviderConfig | undefined, providerRegistry?: IProviderRegistry): number | undefined;
@@ -0,0 +1,58 @@
1
+ const DATE_SUFFIX = /^(.*)-\d{4}-\d{2}-\d{2}$/;
2
+ const SHORT_VERSION_SUFFIX = /^(.*)-\d{4}$/;
3
+ // Treat rolling aliases and dated releases as the same model family so they
4
+ // can share provider metadata such as context windows.
5
+ function normalizeModelId(modelId) {
6
+ if (modelId.endsWith('-latest')) {
7
+ return modelId.slice(0, -7);
8
+ }
9
+ const dateSuffixMatch = modelId.match(DATE_SUFFIX);
10
+ if (dateSuffixMatch) {
11
+ return dateSuffixMatch[1];
12
+ }
13
+ const shortVersionSuffixMatch = modelId.match(SHORT_VERSION_SUFFIX);
14
+ if (shortVersionSuffixMatch) {
15
+ return shortVersionSuffixMatch[1];
16
+ }
17
+ return modelId;
18
+ }
19
+ function getCandidateModelIds(modelId) {
20
+ const candidates = [modelId];
21
+ const normalizedModelId = normalizeModelId(modelId);
22
+ candidates.push(normalizedModelId);
23
+ if (normalizedModelId !== modelId) {
24
+ candidates.push(`${normalizedModelId}-latest`);
25
+ }
26
+ return [...new Set(candidates)];
27
+ }
28
+ export function getProviderModelInfo(providerInfo, model) {
29
+ if (!providerInfo || !model) {
30
+ return undefined;
31
+ }
32
+ const modelInfo = providerInfo.modelInfo;
33
+ if (!modelInfo) {
34
+ return undefined;
35
+ }
36
+ for (const candidateId of getCandidateModelIds(model)) {
37
+ if (modelInfo[candidateId]) {
38
+ return modelInfo[candidateId];
39
+ }
40
+ }
41
+ const normalizedModelId = normalizeModelId(model);
42
+ // As a last resort, match any known model entry that normalizes to the same
43
+ // base ID, even if the exact alias/version string differs.
44
+ return Object.entries(modelInfo).find(([candidateId]) => {
45
+ return normalizeModelId(candidateId) === normalizedModelId;
46
+ })?.[1];
47
+ }
48
+ export function getEffectiveContextWindow(providerConfig, providerRegistry) {
49
+ if (!providerConfig) {
50
+ return undefined;
51
+ }
52
+ if (providerConfig.parameters?.contextWindow !== undefined) {
53
+ return providerConfig.parameters.contextWindow;
54
+ }
55
+ const providerInfo = providerRegistry?.getProviderInfo(providerConfig.provider);
56
+ return getProviderModelInfo(providerInfo, providerConfig.model)
57
+ ?.contextWindow;
58
+ }