@opensumi/ide-ai-native 3.8.1-next-1741091353.0 → 3.8.1-next-1741092802.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 (112) hide show
  1. package/lib/browser/ai-core.contribution.d.ts +3 -0
  2. package/lib/browser/ai-core.contribution.d.ts.map +1 -1
  3. package/lib/browser/ai-core.contribution.js +45 -1
  4. package/lib/browser/ai-core.contribution.js.map +1 -1
  5. package/lib/browser/chat/chat-manager.service.d.ts.map +1 -1
  6. package/lib/browser/chat/chat-manager.service.js +0 -4
  7. package/lib/browser/chat/chat-manager.service.js.map +1 -1
  8. package/lib/browser/chat/chat-proxy.service.d.ts.map +1 -1
  9. package/lib/browser/chat/chat-proxy.service.js +8 -2
  10. package/lib/browser/chat/chat-proxy.service.js.map +1 -1
  11. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  12. package/lib/browser/chat/chat.view.js +1 -7
  13. package/lib/browser/chat/chat.view.js.map +1 -1
  14. package/lib/browser/components/chat-history.module.less +0 -1
  15. package/lib/browser/mcp/base-apply.service.d.ts +7 -18
  16. package/lib/browser/mcp/base-apply.service.d.ts.map +1 -1
  17. package/lib/browser/mcp/base-apply.service.js +65 -185
  18. package/lib/browser/mcp/base-apply.service.js.map +1 -1
  19. package/lib/browser/mcp/tools/components/EditFile.d.ts.map +1 -1
  20. package/lib/browser/mcp/tools/components/EditFile.js +9 -15
  21. package/lib/browser/mcp/tools/components/EditFile.js.map +1 -1
  22. package/lib/browser/mcp/tools/components/index.module.less +0 -3
  23. package/lib/browser/mcp/tools/createNewFileWithText.d.ts +0 -1
  24. package/lib/browser/mcp/tools/createNewFileWithText.d.ts.map +1 -1
  25. package/lib/browser/mcp/tools/createNewFileWithText.js +11 -18
  26. package/lib/browser/mcp/tools/createNewFileWithText.js.map +1 -1
  27. package/lib/browser/mcp/tools/handlers/EditFile.js +1 -1
  28. package/lib/browser/mcp/tools/handlers/EditFile.js.map +1 -1
  29. package/lib/browser/model/msg-history-manager.d.ts +0 -1
  30. package/lib/browser/model/msg-history-manager.d.ts.map +1 -1
  31. package/lib/browser/model/msg-history-manager.js +0 -3
  32. package/lib/browser/model/msg-history-manager.js.map +1 -1
  33. package/lib/browser/preferences/schema.d.ts.map +1 -1
  34. package/lib/browser/preferences/schema.js +6 -1
  35. package/lib/browser/preferences/schema.js.map +1 -1
  36. package/lib/browser/widget/inline-diff/inline-diff-manager.d.ts.map +1 -1
  37. package/lib/browser/widget/inline-diff/inline-diff-manager.js +8 -68
  38. package/lib/browser/widget/inline-diff/inline-diff-manager.js.map +1 -1
  39. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts +4 -10
  40. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts.map +1 -1
  41. package/lib/browser/widget/inline-diff/inline-diff-previewer.js +3 -14
  42. package/lib/browser/widget/inline-diff/inline-diff-previewer.js.map +1 -1
  43. package/lib/browser/widget/inline-diff/inline-diff-widget.module.less +4 -25
  44. package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts +3 -3
  45. package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts.map +1 -1
  46. package/lib/browser/widget/inline-diff/inline-diff.controller.js +5 -10
  47. package/lib/browser/widget/inline-diff/inline-diff.controller.js.map +1 -1
  48. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts +17 -46
  49. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts.map +1 -1
  50. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js +53 -110
  51. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js.map +1 -1
  52. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts +0 -4
  53. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts.map +1 -1
  54. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js +1 -26
  55. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js.map +1 -1
  56. package/lib/common/index.d.ts +1 -0
  57. package/lib/common/index.d.ts.map +1 -1
  58. package/lib/common/index.js +2 -0
  59. package/lib/common/index.js.map +1 -1
  60. package/lib/common/model.d.ts +12 -0
  61. package/lib/common/model.d.ts.map +1 -0
  62. package/lib/common/model.js +83 -0
  63. package/lib/common/model.js.map +1 -0
  64. package/lib/common/types.d.ts +0 -1
  65. package/lib/common/types.d.ts.map +1 -1
  66. package/lib/node/anthropic/anthropic-language-model.d.ts +3 -1
  67. package/lib/node/anthropic/anthropic-language-model.d.ts.map +1 -1
  68. package/lib/node/anthropic/anthropic-language-model.js +6 -2
  69. package/lib/node/anthropic/anthropic-language-model.js.map +1 -1
  70. package/lib/node/base-language-model.d.ts +4 -1
  71. package/lib/node/base-language-model.d.ts.map +1 -1
  72. package/lib/node/base-language-model.js +6 -5
  73. package/lib/node/base-language-model.js.map +1 -1
  74. package/lib/node/deepseek/deepseek-language-model.d.ts +3 -1
  75. package/lib/node/deepseek/deepseek-language-model.d.ts.map +1 -1
  76. package/lib/node/deepseek/deepseek-language-model.js +6 -2
  77. package/lib/node/deepseek/deepseek-language-model.js.map +1 -1
  78. package/lib/node/openai/openai-language-model.d.ts +5 -4
  79. package/lib/node/openai/openai-language-model.d.ts.map +1 -1
  80. package/lib/node/openai/openai-language-model.js +8 -7
  81. package/lib/node/openai/openai-language-model.js.map +1 -1
  82. package/lib/node/openai-compatible/openai-compatible-language-model.d.ts +10 -0
  83. package/lib/node/openai-compatible/openai-compatible-language-model.d.ts.map +1 -0
  84. package/lib/node/openai-compatible/openai-compatible-language-model.js +32 -0
  85. package/lib/node/openai-compatible/openai-compatible-language-model.js.map +1 -0
  86. package/package.json +24 -23
  87. package/src/browser/ai-core.contribution.ts +57 -1
  88. package/src/browser/chat/chat-manager.service.ts +0 -6
  89. package/src/browser/chat/chat-proxy.service.ts +7 -2
  90. package/src/browser/chat/chat.view.tsx +2 -7
  91. package/src/browser/components/chat-history.module.less +0 -1
  92. package/src/browser/mcp/base-apply.service.ts +67 -222
  93. package/src/browser/mcp/tools/components/EditFile.tsx +9 -16
  94. package/src/browser/mcp/tools/components/index.module.less +0 -3
  95. package/src/browser/mcp/tools/createNewFileWithText.ts +12 -20
  96. package/src/browser/mcp/tools/handlers/EditFile.ts +1 -1
  97. package/src/browser/model/msg-history-manager.ts +0 -4
  98. package/src/browser/preferences/schema.ts +6 -1
  99. package/src/browser/widget/inline-diff/inline-diff-manager.tsx +21 -143
  100. package/src/browser/widget/inline-diff/inline-diff-previewer.ts +7 -25
  101. package/src/browser/widget/inline-diff/inline-diff-widget.module.less +4 -25
  102. package/src/browser/widget/inline-diff/inline-diff.controller.ts +8 -16
  103. package/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +68 -139
  104. package/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +1 -30
  105. package/src/common/index.ts +2 -0
  106. package/src/common/model.ts +90 -0
  107. package/src/common/types.ts +0 -1
  108. package/src/node/anthropic/anthropic-language-model.ts +7 -2
  109. package/src/node/base-language-model.ts +9 -9
  110. package/src/node/deepseek/deepseek-language-model.ts +7 -2
  111. package/src/node/openai/openai-language-model.ts +10 -9
  112. package/src/node/openai-compatible/openai-compatible-language-model.ts +30 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensumi/ide-ai-native",
3
- "version": "3.8.1-next-1741091353.0",
3
+ "version": "3.8.1-next-1741092802.0",
4
4
  "files": [
5
5
  "lib",
6
6
  "src"
@@ -21,28 +21,29 @@
21
21
  "dependencies": {
22
22
  "@ai-sdk/anthropic": "^1.1.9",
23
23
  "@ai-sdk/deepseek": "^0.1.11",
24
+ "@ai-sdk/openai": "^1.1.9",
24
25
  "@ai-sdk/openai-compatible": "^0.1.11",
25
26
  "@modelcontextprotocol/sdk": "^1.3.1",
26
- "@opensumi/ide-addons": "3.8.1-next-1741091353.0",
27
- "@opensumi/ide-components": "3.8.1-next-1741091353.0",
28
- "@opensumi/ide-connection": "3.8.1-next-1741091353.0",
29
- "@opensumi/ide-core-common": "3.8.1-next-1741091353.0",
30
- "@opensumi/ide-core-node": "3.8.1-next-1741091353.0",
31
- "@opensumi/ide-debug": "3.8.1-next-1741091353.0",
32
- "@opensumi/ide-design": "3.8.1-next-1741091353.0",
33
- "@opensumi/ide-editor": "3.8.1-next-1741091353.0",
34
- "@opensumi/ide-file-search": "3.8.1-next-1741091353.0",
35
- "@opensumi/ide-file-service": "3.8.1-next-1741091353.0",
36
- "@opensumi/ide-main-layout": "3.8.1-next-1741091353.0",
37
- "@opensumi/ide-markers": "3.8.1-next-1741091353.0",
38
- "@opensumi/ide-monaco": "3.8.1-next-1741091353.0",
39
- "@opensumi/ide-overlay": "3.8.1-next-1741091353.0",
40
- "@opensumi/ide-preferences": "3.8.1-next-1741091353.0",
41
- "@opensumi/ide-search": "3.8.1-next-1741091353.0",
42
- "@opensumi/ide-terminal-next": "3.8.1-next-1741091353.0",
43
- "@opensumi/ide-theme": "3.8.1-next-1741091353.0",
44
- "@opensumi/ide-utils": "3.8.1-next-1741091353.0",
45
- "@opensumi/ide-workspace": "3.8.1-next-1741091353.0",
27
+ "@opensumi/ide-addons": "3.8.1-next-1741092802.0",
28
+ "@opensumi/ide-components": "3.8.1-next-1741092802.0",
29
+ "@opensumi/ide-connection": "3.8.1-next-1741092802.0",
30
+ "@opensumi/ide-core-common": "3.8.1-next-1741092802.0",
31
+ "@opensumi/ide-core-node": "3.8.1-next-1741092802.0",
32
+ "@opensumi/ide-debug": "3.8.1-next-1741092802.0",
33
+ "@opensumi/ide-design": "3.8.1-next-1741092802.0",
34
+ "@opensumi/ide-editor": "3.8.1-next-1741092802.0",
35
+ "@opensumi/ide-file-search": "3.8.1-next-1741092802.0",
36
+ "@opensumi/ide-file-service": "3.8.1-next-1741092802.0",
37
+ "@opensumi/ide-main-layout": "3.8.1-next-1741092802.0",
38
+ "@opensumi/ide-markers": "3.8.1-next-1741092802.0",
39
+ "@opensumi/ide-monaco": "3.8.1-next-1741092802.0",
40
+ "@opensumi/ide-overlay": "3.8.1-next-1741092802.0",
41
+ "@opensumi/ide-preferences": "3.8.1-next-1741092802.0",
42
+ "@opensumi/ide-search": "3.8.1-next-1741092802.0",
43
+ "@opensumi/ide-terminal-next": "3.8.1-next-1741092802.0",
44
+ "@opensumi/ide-theme": "3.8.1-next-1741092802.0",
45
+ "@opensumi/ide-utils": "3.8.1-next-1741092802.0",
46
+ "@opensumi/ide-workspace": "3.8.1-next-1741092802.0",
46
47
  "@xterm/xterm": "5.5.0",
47
48
  "ai": "^4.1.45",
48
49
  "ansi-regex": "^2.0.0",
@@ -57,7 +58,7 @@
57
58
  "zod-to-json-schema": "^3.24.1"
58
59
  },
59
60
  "devDependencies": {
60
- "@opensumi/ide-core-browser": "3.8.1-next-1741091353.0"
61
+ "@opensumi/ide-core-browser": "3.8.1-next-1741092802.0"
61
62
  },
62
- "gitHead": "4134fdda0b299adad482b64b0dbabad013e36dc3"
63
+ "gitHead": "7dc1c6d485b184de145a648f66959aa243447ea3"
63
64
  }
@@ -14,10 +14,12 @@ import {
14
14
  Domain,
15
15
  IAIInlineChatService,
16
16
  IEditorExtensionContribution,
17
+ IPreferenceSettingsService,
17
18
  KeybindingContribution,
18
19
  KeybindingRegistry,
19
20
  KeybindingScope,
20
21
  MonacoContribution,
22
+ PreferenceSchemaProvider,
21
23
  PreferenceService,
22
24
  SlotLocation,
23
25
  SlotRendererContribution,
@@ -82,6 +84,9 @@ import {
82
84
  IChatManagerService,
83
85
  ISumiMCPServerBackend,
84
86
  SumiMCPServerProxyServicePath,
87
+ anthropicModels,
88
+ deepSeekModels,
89
+ openAiNativeModels,
85
90
  } from '../common';
86
91
  import { MCPServerDescription } from '../common/mcp-server-manager';
87
92
 
@@ -209,6 +214,12 @@ export class AINativeBrowserContribution
209
214
  @Autowired(CommandService)
210
215
  private readonly commandService: CommandService;
211
216
 
217
+ @Autowired(PreferenceSchemaProvider)
218
+ private preferenceSchemaProvider: PreferenceSchemaProvider;
219
+
220
+ @Autowired(IPreferenceSettingsService)
221
+ private preferenceSettings: IPreferenceSettingsService;
222
+
212
223
  @Autowired(PreferenceService)
213
224
  private readonly preferenceService: PreferenceService;
214
225
 
@@ -328,7 +339,8 @@ export class AINativeBrowserContribution
328
339
 
329
340
  onDidStart() {
330
341
  runWhenIdle(() => {
331
- const { supportsRenameSuggestions, supportsInlineChat, supportsMCP } = this.aiNativeConfigService.capabilities;
342
+ const { supportsRenameSuggestions, supportsInlineChat, supportsMCP, supportsCustomLLMSettings } =
343
+ this.aiNativeConfigService.capabilities;
332
344
  const prefChatVisibleType = this.preferenceService.getValid(AINativeSettingSectionsId.ChatVisibleType);
333
345
 
334
346
  if (prefChatVisibleType === 'always') {
@@ -345,6 +357,33 @@ export class AINativeBrowserContribution
345
357
  this.codeActionSingleHandler.load();
346
358
  }
347
359
 
360
+ if (supportsCustomLLMSettings) {
361
+ this.preferenceService.onSpecificPreferenceChange(AINativeSettingSectionsId.LLMModelSelection, (change) => {
362
+ const model = this.getModelByName(change.newValue);
363
+ const modelIds = model ? Object.keys(model) : [];
364
+ const defaultModelId = modelIds.length ? modelIds[0] : '';
365
+ const currentSchemas = this.preferenceSchemaProvider.getPreferenceProperty(AINativeSettingSectionsId.ModelID);
366
+ this.preferenceSchemaProvider.setSchema(
367
+ {
368
+ properties: {
369
+ [AINativeSettingSectionsId.ModelID]: {
370
+ ...currentSchemas,
371
+ default: defaultModelId,
372
+ defaultValue: defaultModelId,
373
+ enum: modelIds.length ? modelIds : undefined,
374
+ },
375
+ },
376
+ },
377
+ true,
378
+ );
379
+ this.preferenceService.set(AINativeSettingSectionsId.ModelID, defaultModelId, change.scope);
380
+ this.preferenceSettings.setEnumLabels(
381
+ AINativeSettingSectionsId.ModelID,
382
+ modelIds.reduce((obj, item) => ({ ...obj, [item]: item }), {}),
383
+ );
384
+ });
385
+ }
386
+
348
387
  if (supportsMCP) {
349
388
  this.initMCPServers();
350
389
  }
@@ -370,6 +409,19 @@ export class AINativeBrowserContribution
370
409
  }
371
410
  }
372
411
 
412
+ private getModelByName(modelName: string) {
413
+ switch (modelName) {
414
+ case 'deepseek':
415
+ return deepSeekModels;
416
+ case 'anthropic':
417
+ return anthropicModels;
418
+ case 'openai':
419
+ return openAiNativeModels;
420
+ default:
421
+ return undefined;
422
+ }
423
+ }
424
+
373
425
  private registerFeature() {
374
426
  this.contributions.getContributions().forEach((contribution) => {
375
427
  contribution.registerInlineChatFeature?.(this.inlineChatFeatureRegistry);
@@ -474,6 +526,10 @@ export class AINativeBrowserContribution
474
526
  id: AINativeSettingSectionsId.LLMModelSelection,
475
527
  localized: 'preference.ai.native.llm.model.selection',
476
528
  },
529
+ {
530
+ id: AINativeSettingSectionsId.ModelID,
531
+ localized: 'preference.ai.native.llm.model.id',
532
+ },
477
533
  {
478
534
  id: AINativeSettingSectionsId.DeepseekApiKey,
479
535
  localized: 'preference.ai.native.deepseek.apiKey',
@@ -10,7 +10,6 @@ import {
10
10
  STORAGE_NAMESPACE,
11
11
  StorageProvider,
12
12
  debounce,
13
- formatLocalize,
14
13
  } from '@opensumi/ide-core-common';
15
14
  import { ChatMessageRole, IChatMessage, IHistoryChatMessage } from '@opensumi/ide-core-common/lib/types/ai-native';
16
15
 
@@ -35,8 +34,6 @@ interface ISessionModel {
35
34
  }[];
36
35
  }
37
36
 
38
- const MAX_SESSION_COUNT = 20;
39
-
40
37
  @Injectable()
41
38
  export class ChatManagerService extends Disposable {
42
39
  #sessionModels = this.registerDispose(new DisposableMap<string, ChatModel>());
@@ -103,9 +100,6 @@ export class ChatManagerService extends Disposable {
103
100
  }
104
101
 
105
102
  startSession() {
106
- if (this.#sessionModels.size >= MAX_SESSION_COUNT) {
107
- throw new Error(formatLocalize('aiNative.chat.session.max', MAX_SESSION_COUNT.toString()));
108
- }
109
103
  const model = new ChatModel();
110
104
  this.#sessionModels.set(model.sessionId, model);
111
105
  this.listenSession(model);
@@ -115,15 +115,19 @@ export class ChatProxyService extends Disposable {
115
115
  }
116
116
 
117
117
  const model = this.preferenceService.get<string>(AINativeSettingSectionsId.LLMModelSelection);
118
+ const modelId = this.preferenceService.get<string>(AINativeSettingSectionsId.ModelID);
118
119
  let apiKey: string = '';
119
120
  let baseURL: string = '';
120
121
  if (model === 'deepseek') {
121
122
  apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.DeepseekApiKey, '');
122
123
  } else if (model === 'openai') {
123
124
  apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiApiKey, '');
124
- baseURL = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiBaseURL, '');
125
- } else {
125
+ } else if (model === 'anthropic') {
126
126
  apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.AnthropicApiKey, '');
127
+ } else {
128
+ // openai-compatible 为兜底
129
+ apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiApiKey, '');
130
+ baseURL = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiBaseURL, '');
127
131
  }
128
132
  const MAX_INPUT_TOKENS = 30720;
129
133
  const agent = this.chatAgentService.getAgent(ChatProxyService.AGENT_ID);
@@ -136,6 +140,7 @@ export class ChatProxyService extends Disposable {
136
140
  clientId: this.applicationService.clientId,
137
141
  apiKey,
138
142
  model,
143
+ modelId,
139
144
  baseURL,
140
145
  system: agent?.metadata.systemPrompt,
141
146
  },
@@ -31,7 +31,7 @@ import {
31
31
  uuid,
32
32
  } from '@opensumi/ide-core-common';
33
33
  import { IMainLayoutService } from '@opensumi/ide-main-layout';
34
- import { IDialogService, IMessageService } from '@opensumi/ide-overlay';
34
+ import { IDialogService } from '@opensumi/ide-overlay';
35
35
 
36
36
  import 'react-chat-elements/dist/main.css';
37
37
  import {
@@ -756,18 +756,13 @@ export function DefaultChatViewHeader({
756
756
  const aiNativeConfigService = useInjectable<AINativeConfigService>(AINativeConfigService);
757
757
  const mcpServerProxyService = useInjectable<MCPServerProxyService>(TokenMCPServerProxyService);
758
758
  const aiChatService = useInjectable<ChatInternalService>(IChatInternalService);
759
- const messageService = useInjectable<IMessageService>(IMessageService);
760
759
  const commandService = useInjectable<CommandService>(CommandService);
761
760
 
762
761
  const [historyList, setHistoryList] = React.useState<IChatHistoryItem[]>([]);
763
762
  const [currentTitle, setCurrentTitle] = React.useState<string>('');
764
763
  const handleNewChat = React.useCallback(() => {
765
764
  if (aiChatService.sessionModel.history.getMessages().length > 0) {
766
- try {
767
- aiChatService.createSessionModel();
768
- } catch (error) {
769
- messageService.error(error.message);
770
- }
765
+ aiChatService.createSessionModel();
771
766
  }
772
767
  }, [aiChatService]);
773
768
  const handleHistoryItemSelect = React.useCallback(
@@ -78,7 +78,6 @@
78
78
  .dm-chat-history-list {
79
79
  overflow: auto;
80
80
  max-height: 400px;
81
- max-width: 400px;
82
81
  margin-top: 4px;
83
82
  font-size: 13px;
84
83
  }