From b90973b195d7d533e698757b5ae641de61d1f297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 11:36:49 +0100 Subject: [PATCH 01/36] Bump: voidVersion --- package.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a4ee38bb..edf72507 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "void-dev", "productName": "Void", + "voidVersion": "1.0.1", "version": "1.94.0", "distro": "this is a commit number if we want to publish on npm", "homepage": "https://voideditor.com", @@ -75,7 +76,10 @@ "extensions-ci": "node ./node_modules/gulp/bin/gulp.js extensions-ci", "extensions-ci-pr": "node ./node_modules/gulp/bin/gulp.js extensions-ci-pr", "perf": "node scripts/code-perf.js", - "update-build-ts-version": "npm install typescript@next && tsc -p ./build/tsconfig.build.json" + "update-build-ts-version": "npm install typescript@next && tsc -p ./build/tsconfig.build.json", + "void-version-patch": "node -e \"const p=require('./package.json');p.voidVersion=require('semver').inc(p.voidVersion,'patch');require('fs').writeFileSync('./package.json',JSON.stringify(p,null,2))\" && git add package.json && git commit -m \"Bump: voidVersion\" && git tag v$(node -e \"console.log(require('./package.json').voidVersion)\") && git push && git push --tags", + "void-version-minor": "node -e \"const p=require('./package.json');p.voidVersion=require('semver').inc(p.voidVersion,'minor');require('fs').writeFileSync('./package.json',JSON.stringify(p,null,2))\" && git add package.json && git commit -m \"Bump: voidVersion minor\" && git tag v$(node -e \"console.log(require('./package.json').voidVersion)\") && git push && git push --tags", + "void-version-major": "node -e \"const p=require('./package.json');p.voidVersion=require('semver').inc(p.voidVersion,'major');require('fs').writeFileSync('./package.json',JSON.stringify(p,null,2))\" && git add package.json && git commit -m \"Bump: voidVersion major\" && git tag v$(node -e \"console.log(require('./package.json').voidVersion)\") && git push && git push --tags" }, "dependencies": { "@anthropic-ai/sdk": "^0.32.1", @@ -273,4 +277,4 @@ "optionalDependencies": { "windows-foreground-love": "0.5.0" } -} +} \ No newline at end of file From 9b7fd0927860a4f01353721005794cef65232660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 12:05:47 +0100 Subject: [PATCH 02/36] removed voidVersion from package.json --- package.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index edf72507..677a97b2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,6 @@ { "name": "void-dev", "productName": "Void", - "voidVersion": "1.0.1", "version": "1.94.0", "distro": "this is a commit number if we want to publish on npm", "homepage": "https://voideditor.com", @@ -77,9 +76,9 @@ "extensions-ci-pr": "node ./node_modules/gulp/bin/gulp.js extensions-ci-pr", "perf": "node scripts/code-perf.js", "update-build-ts-version": "npm install typescript@next && tsc -p ./build/tsconfig.build.json", - "void-version-patch": "node -e \"const p=require('./package.json');p.voidVersion=require('semver').inc(p.voidVersion,'patch');require('fs').writeFileSync('./package.json',JSON.stringify(p,null,2))\" && git add package.json && git commit -m \"Bump: voidVersion\" && git tag v$(node -e \"console.log(require('./package.json').voidVersion)\") && git push && git push --tags", - "void-version-minor": "node -e \"const p=require('./package.json');p.voidVersion=require('semver').inc(p.voidVersion,'minor');require('fs').writeFileSync('./package.json',JSON.stringify(p,null,2))\" && git add package.json && git commit -m \"Bump: voidVersion minor\" && git tag v$(node -e \"console.log(require('./package.json').voidVersion)\") && git push && git push --tags", - "void-version-major": "node -e \"const p=require('./package.json');p.voidVersion=require('semver').inc(p.voidVersion,'major');require('fs').writeFileSync('./package.json',JSON.stringify(p,null,2))\" && git add package.json && git commit -m \"Bump: voidVersion major\" && git tag v$(node -e \"console.log(require('./package.json').voidVersion)\") && git push && git push --tags" + "void-version-patch": "node -e \"const p=require('./product.json');p.voidVersion=require('semver').inc(p.voidVersion,'patch');require('fs').writeFileSync('./product.json',JSON.stringify(p,null,2))\" && git add product.json && git commit -m \"Bump: voidVersion\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags", + "void-version-minor": "node -e \"const p=require('./product.json');p.voidVersion=require('semver').inc(p.voidVersion,'minor');require('fs').writeFileSync('./product.json',JSON.stringify(p,null,2))\" && git add product.json && git commit -m \"Bump: voidVersion minor\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags", + "void-version-major": "node -e \"const p=require('./product.json');p.voidVersion=require('semver').inc(p.voidVersion,'major');require('fs').writeFileSync('./product.json',JSON.stringify(p,null,2))\" && git add product.json && git commit -m \"Bump: voidVersion major\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags" }, "dependencies": { "@anthropic-ai/sdk": "^0.32.1", @@ -277,4 +276,4 @@ "optionalDependencies": { "windows-foreground-love": "0.5.0" } -} \ No newline at end of file +} From fbb4faacbcda18e84efc099db0efc398daf68814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 12:06:24 +0100 Subject: [PATCH 03/36] added voidVersion to product.json --- product.json | 1 + 1 file changed, 1 insertion(+) diff --git a/product.json b/product.json index a79966a3..9b11879a 100644 --- a/product.json +++ b/product.json @@ -1,6 +1,7 @@ { "nameShort": "Void", "nameLong": "Void", + "voidVersion": "1.0.1", "applicationName": "void", "dataFolderName": ".void-editor", "win32MutexName": "voideditor", From ba606d229a8ce511e03c6e060a93c9e8cc985e02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 12:07:06 +0100 Subject: [PATCH 04/36] Added voidVersion to IProductConfiguration --- src/vs/base/common/product.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/base/common/product.ts b/src/vs/base/common/product.ts index 1f58ce0f..3c2301c6 100644 --- a/src/vs/base/common/product.ts +++ b/src/vs/base/common/product.ts @@ -56,6 +56,7 @@ export type ExtensionVirtualWorkspaceSupport = { export interface IProductConfiguration { readonly version: string; + readonly voidVersion: string; readonly date?: string; readonly quality?: string; readonly commit?: string; From 014c87bc3ec66423ea618da2929a2988d2beab84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 12:08:03 +0100 Subject: [PATCH 05/36] Fetch and display : voidVersion into dialog handler --- .../workbench/electron-sandbox/parts/dialogs/dialogHandler.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts b/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts index 6c61a590..4372d416 100644 --- a/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts +++ b/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts @@ -71,6 +71,7 @@ export class NativeDialogHandler extends AbstractDialogHandler { async about(): Promise { let version = this.productService.version; + let voidVersion = this.productService.voidVersion || 'Unknown'; if (this.productService.target) { version = `${version} (${this.productService.target} setup)`; } else if (this.productService.darwinUniversalAssetId) { @@ -81,7 +82,8 @@ export class NativeDialogHandler extends AbstractDialogHandler { const detailString = (useAgo: boolean): string => { return localize({ key: 'aboutDetail', comment: ['Electron, Chromium, Node.js and V8 are product names that need no translation'] }, - "Version: {0}\nCommit: {1}\nDate: {2}\nElectron: {3}\nElectronBuildId: {4}\nChromium: {5}\nNode.js: {6}\nV8: {7}\nOS: {8}", + "Void : {0}\nVSCode Version: {1}\nCommit: {2}\nDate: {3}\nElectron: {4}\nElectronBuildId: {5}\nChromium: {6}\nNode.js: {7}\nV8: {8}\nOS: {9}", + voidVersion, version, this.productService.commit || 'Unknown', this.productService.date ? `${this.productService.date}${useAgo ? ' (' + fromNow(new Date(this.productService.date), true) + ')' : ''}` : 'Unknown', From db69464ddc371b8149eb454e711ce49a9a854793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 12:08:53 +0100 Subject: [PATCH 06/36] Bump: voidVersion --- product.json | 76 ++++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/product.json b/product.json index 9b11879a..bea28466 100644 --- a/product.json +++ b/product.json @@ -1,39 +1,39 @@ { - "nameShort": "Void", - "nameLong": "Void", - "voidVersion": "1.0.1", - "applicationName": "void", - "dataFolderName": ".void-editor", - "win32MutexName": "voideditor", - "licenseName": "MIT", - "licenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", - "serverLicenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", - "serverGreeting": [], - "serverLicense": [], - "serverLicensePrompt": "", - "serverApplicationName": "void-server", - "serverDataFolderName": ".void-server", - "tunnelApplicationName": "void-tunnel", - "win32DirName": "Void", - "win32NameVersion": "Void", - "win32RegValueName": "VoidEditor", - "win32x64AppId": "{{9D394D01-1728-45A7-B997-A6C82C5452C3}", - "win32arm64AppId": "{{0668DD58-2BDE-4101-8CDA-40252DF8875D}", - "win32x64UserAppId": "{{8BED5DC1-6C55-46E6-9FE6-18F7E6F7C7F1}", - "win32arm64UserAppId": "{{F6C87466-BC82-4A8F-B0FF-18CA366BA4D8}", - "win32AppUserModelId": "Void.Editor", - "win32ShellNameShort": "V&oid", - "win32TunnelServiceMutex": "void-tunnelservice", - "win32TunnelMutex": "void-tunnel", - "darwinBundleIdentifier": "com.voideditor.code", - "linuxIconName": "void-editor", - "licenseFileName": "LICENSE.txt", - "reportIssueUrl": "https://github.com/voideditor/void/issues/new", - "nodejsRepository": "https://nodejs.org", - "urlProtocol": "void-editor", - "extensionsGallery": { - "serviceUrl": "https://open-vsx.org/vscode/gallery", - "itemUrl": "https://open-vsx.org/vscode/item" - }, - "builtInExtensions": [] -} + "nameShort": "Void", + "nameLong": "Void", + "voidVersion": "1.0.2", + "applicationName": "void", + "dataFolderName": ".void-editor", + "win32MutexName": "voideditor", + "licenseName": "MIT", + "licenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", + "serverLicenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", + "serverGreeting": [], + "serverLicense": [], + "serverLicensePrompt": "", + "serverApplicationName": "void-server", + "serverDataFolderName": ".void-server", + "tunnelApplicationName": "void-tunnel", + "win32DirName": "Void", + "win32NameVersion": "Void", + "win32RegValueName": "VoidEditor", + "win32x64AppId": "{{9D394D01-1728-45A7-B997-A6C82C5452C3}", + "win32arm64AppId": "{{0668DD58-2BDE-4101-8CDA-40252DF8875D}", + "win32x64UserAppId": "{{8BED5DC1-6C55-46E6-9FE6-18F7E6F7C7F1}", + "win32arm64UserAppId": "{{F6C87466-BC82-4A8F-B0FF-18CA366BA4D8}", + "win32AppUserModelId": "Void.Editor", + "win32ShellNameShort": "V&oid", + "win32TunnelServiceMutex": "void-tunnelservice", + "win32TunnelMutex": "void-tunnel", + "darwinBundleIdentifier": "com.voideditor.code", + "linuxIconName": "void-editor", + "licenseFileName": "LICENSE.txt", + "reportIssueUrl": "https://github.com/voideditor/void/issues/new", + "nodejsRepository": "https://nodejs.org", + "urlProtocol": "void-editor", + "extensionsGallery": { + "serviceUrl": "https://open-vsx.org/vscode/gallery", + "itemUrl": "https://open-vsx.org/vscode/item" + }, + "builtInExtensions": [] +} \ No newline at end of file From e3c826b2531c5be87f37071b0af763c5c2dd658d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 12:56:53 +0100 Subject: [PATCH 07/36] Bump: voidVersion --- product.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/product.json b/product.json index bea28466..5e730b77 100644 --- a/product.json +++ b/product.json @@ -1,7 +1,9 @@ { "nameShort": "Void", "nameLong": "Void", - "voidVersion": "1.0.2", + "voidVersion": "1.0.3", + "commit": "db69464ddc371b8149eb454e711ce49a9a854793", + "date": "2025-02-11", "applicationName": "void", "dataFolderName": ".void-editor", "win32MutexName": "voideditor", From 7482e2aa823ffde1604a9db862b30f743b9b5538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 13:00:23 +0100 Subject: [PATCH 08/36] version : tag, commit, and date from iProductConfiguration --- package.json | 6 +++--- scripts/update-version.js | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 scripts/update-version.js diff --git a/package.json b/package.json index 677a97b2..ac9d4135 100644 --- a/package.json +++ b/package.json @@ -76,9 +76,9 @@ "extensions-ci-pr": "node ./node_modules/gulp/bin/gulp.js extensions-ci-pr", "perf": "node scripts/code-perf.js", "update-build-ts-version": "npm install typescript@next && tsc -p ./build/tsconfig.build.json", - "void-version-patch": "node -e \"const p=require('./product.json');p.voidVersion=require('semver').inc(p.voidVersion,'patch');require('fs').writeFileSync('./product.json',JSON.stringify(p,null,2))\" && git add product.json && git commit -m \"Bump: voidVersion\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags", - "void-version-minor": "node -e \"const p=require('./product.json');p.voidVersion=require('semver').inc(p.voidVersion,'minor');require('fs').writeFileSync('./product.json',JSON.stringify(p,null,2))\" && git add product.json && git commit -m \"Bump: voidVersion minor\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags", - "void-version-major": "node -e \"const p=require('./product.json');p.voidVersion=require('semver').inc(p.voidVersion,'major');require('fs').writeFileSync('./product.json',JSON.stringify(p,null,2))\" && git add product.json && git commit -m \"Bump: voidVersion major\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags" + "void-version-patch": "node scripts/update-version.js patch && git add product.json && git commit -m \"Bump: voidVersion\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags", + "void-version-minor": "node scripts/update-version.js minor && git add product.json && git commit -m \"Bump: voidVersion minor\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags", + "void-version-major": "node scripts/update-version.js major && git add product.json && git commit -m \"Bump: voidVersion major\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags" }, "dependencies": { "@anthropic-ai/sdk": "^0.32.1", diff --git a/scripts/update-version.js b/scripts/update-version.js new file mode 100644 index 00000000..a8542ad3 --- /dev/null +++ b/scripts/update-version.js @@ -0,0 +1,27 @@ +const fs = require('fs'); +const { execSync } = require('child_process'); +const semver = require('semver'); + +function updateProductJson(type = 'patch') { + // Read product.json + const productJsonPath = './product.json'; + const product = require('../' + productJsonPath); + + // Update the version + product.voidVersion = semver.inc(product.voidVersion, type); + + // Update the commit hash + product.commit = execSync('git rev-parse HEAD').toString().trim(); + + // Update the date + product.date = new Date().toISOString().split('T')[0]; + + // Write the modifications + fs.writeFileSync(productJsonPath, JSON.stringify(product, null, 2)); + + return product.voidVersion; +} + +// Execute the update +const newVersion = updateProductJson(process.argv[2] || 'patch'); +console.log(`Updated version: ${newVersion}`); From 3b09174587da1aa53cc5d65e3ea5a5ef78efc175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 14:19:16 +0100 Subject: [PATCH 09/36] bad hash and date, will be updated --- product.json | 80 ++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/product.json b/product.json index 5e730b77..7361886c 100644 --- a/product.json +++ b/product.json @@ -1,41 +1,41 @@ { - "nameShort": "Void", - "nameLong": "Void", - "voidVersion": "1.0.3", - "commit": "db69464ddc371b8149eb454e711ce49a9a854793", - "date": "2025-02-11", - "applicationName": "void", - "dataFolderName": ".void-editor", - "win32MutexName": "voideditor", - "licenseName": "MIT", - "licenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", - "serverLicenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", - "serverGreeting": [], - "serverLicense": [], - "serverLicensePrompt": "", - "serverApplicationName": "void-server", - "serverDataFolderName": ".void-server", - "tunnelApplicationName": "void-tunnel", - "win32DirName": "Void", - "win32NameVersion": "Void", - "win32RegValueName": "VoidEditor", - "win32x64AppId": "{{9D394D01-1728-45A7-B997-A6C82C5452C3}", - "win32arm64AppId": "{{0668DD58-2BDE-4101-8CDA-40252DF8875D}", - "win32x64UserAppId": "{{8BED5DC1-6C55-46E6-9FE6-18F7E6F7C7F1}", - "win32arm64UserAppId": "{{F6C87466-BC82-4A8F-B0FF-18CA366BA4D8}", - "win32AppUserModelId": "Void.Editor", - "win32ShellNameShort": "V&oid", - "win32TunnelServiceMutex": "void-tunnelservice", - "win32TunnelMutex": "void-tunnel", - "darwinBundleIdentifier": "com.voideditor.code", - "linuxIconName": "void-editor", - "licenseFileName": "LICENSE.txt", - "reportIssueUrl": "https://github.com/voideditor/void/issues/new", - "nodejsRepository": "https://nodejs.org", - "urlProtocol": "void-editor", - "extensionsGallery": { - "serviceUrl": "https://open-vsx.org/vscode/gallery", - "itemUrl": "https://open-vsx.org/vscode/item" - }, - "builtInExtensions": [] -} \ No newline at end of file + "nameShort": "Void", + "nameLong": "Void", + "voidVersion": "1.0.0", + "commit": "db69464ddc371b8149 eb454e711ce49a9a854793", + "date": "2025-02-11", + "applicationName": "void", + "dataFolderName": ".void-editor", + "win32MutexName": "voideditor", + "licenseName": "MIT", + "licenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", + "serverLicenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", + "serverGreeting": [], + "serverLicense": [], + "serverLicensePrompt": "", + "serverApplicationName": "void-server", + "serverDataFolderName": ".void-server", + "tunnelApplicationName": "void-tunnel", + "win32DirName": "Void", + "win32NameVersion": "Void", + "win32RegValueName": "VoidEditor", + "win32x64AppId": "{{9D394D01-1728-45A7-B997-A6C82C5452C3}", + "win32arm64AppId": "{{0668DD58-2BDE-4101-8CDA-40252DF8875D}", + "win32x64UserAppId": "{{8BED5DC1-6C55-46E6-9FE6-18F7E6F7C7F1}", + "win32arm64UserAppId": "{{F6C87466-BC82-4A8F-B0FF-18CA366BA4D8}", + "win32AppUserModelId": "Void.Editor", + "win32ShellNameShort": "V&oid", + "win32TunnelServiceMutex": "void-tunnelservice", + "win32TunnelMutex": "void-tunnel", + "darwinBundleIdentifier": "com.voideditor.code", + "linuxIconName": "void-editor", + "licenseFileName": "LICENSE.txt", + "reportIssueUrl": "https://github.com/voideditor/void/issues/new", + "nodejsRepository": "https://nodejs.org", + "urlProtocol": "void-editor", + "extensionsGallery": { + "serviceUrl": "https://open-vsx.org/vscode/gallery", + "itemUrl": "https://open-vsx.org/vscode/item" + }, + "builtInExtensions": [] +} From ba15b3166152eeea1370573660d700210167102f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 14:19:38 +0100 Subject: [PATCH 10/36] fix --- product.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product.json b/product.json index 7361886c..6faa4ab8 100644 --- a/product.json +++ b/product.json @@ -2,7 +2,7 @@ "nameShort": "Void", "nameLong": "Void", "voidVersion": "1.0.0", - "commit": "db69464ddc371b8149 eb454e711ce49a9a854793", + "commit": "db69464ddc371b8149eb454e711ce49a9a854793", "date": "2025-02-11", "applicationName": "void", "dataFolderName": ".void-editor", From 7bceceef85f29e840f6379e7868cabdb9a8e9d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 14:21:02 +0100 Subject: [PATCH 11/36] Bump: voidVersion --- product.json | 80 ++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/product.json b/product.json index 6faa4ab8..445ee82c 100644 --- a/product.json +++ b/product.json @@ -1,41 +1,41 @@ { - "nameShort": "Void", - "nameLong": "Void", - "voidVersion": "1.0.0", - "commit": "db69464ddc371b8149eb454e711ce49a9a854793", - "date": "2025-02-11", - "applicationName": "void", - "dataFolderName": ".void-editor", - "win32MutexName": "voideditor", - "licenseName": "MIT", - "licenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", - "serverLicenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", - "serverGreeting": [], - "serverLicense": [], - "serverLicensePrompt": "", - "serverApplicationName": "void-server", - "serverDataFolderName": ".void-server", - "tunnelApplicationName": "void-tunnel", - "win32DirName": "Void", - "win32NameVersion": "Void", - "win32RegValueName": "VoidEditor", - "win32x64AppId": "{{9D394D01-1728-45A7-B997-A6C82C5452C3}", - "win32arm64AppId": "{{0668DD58-2BDE-4101-8CDA-40252DF8875D}", - "win32x64UserAppId": "{{8BED5DC1-6C55-46E6-9FE6-18F7E6F7C7F1}", - "win32arm64UserAppId": "{{F6C87466-BC82-4A8F-B0FF-18CA366BA4D8}", - "win32AppUserModelId": "Void.Editor", - "win32ShellNameShort": "V&oid", - "win32TunnelServiceMutex": "void-tunnelservice", - "win32TunnelMutex": "void-tunnel", - "darwinBundleIdentifier": "com.voideditor.code", - "linuxIconName": "void-editor", - "licenseFileName": "LICENSE.txt", - "reportIssueUrl": "https://github.com/voideditor/void/issues/new", - "nodejsRepository": "https://nodejs.org", - "urlProtocol": "void-editor", - "extensionsGallery": { - "serviceUrl": "https://open-vsx.org/vscode/gallery", - "itemUrl": "https://open-vsx.org/vscode/item" - }, - "builtInExtensions": [] -} + "nameShort": "Void", + "nameLong": "Void", + "voidVersion": "1.0.1", + "commit": "ba15b3166152eeea1370573660d700210167102f", + "date": "2025-02-11", + "applicationName": "void", + "dataFolderName": ".void-editor", + "win32MutexName": "voideditor", + "licenseName": "MIT", + "licenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", + "serverLicenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", + "serverGreeting": [], + "serverLicense": [], + "serverLicensePrompt": "", + "serverApplicationName": "void-server", + "serverDataFolderName": ".void-server", + "tunnelApplicationName": "void-tunnel", + "win32DirName": "Void", + "win32NameVersion": "Void", + "win32RegValueName": "VoidEditor", + "win32x64AppId": "{{9D394D01-1728-45A7-B997-A6C82C5452C3}", + "win32arm64AppId": "{{0668DD58-2BDE-4101-8CDA-40252DF8875D}", + "win32x64UserAppId": "{{8BED5DC1-6C55-46E6-9FE6-18F7E6F7C7F1}", + "win32arm64UserAppId": "{{F6C87466-BC82-4A8F-B0FF-18CA366BA4D8}", + "win32AppUserModelId": "Void.Editor", + "win32ShellNameShort": "V&oid", + "win32TunnelServiceMutex": "void-tunnelservice", + "win32TunnelMutex": "void-tunnel", + "darwinBundleIdentifier": "com.voideditor.code", + "linuxIconName": "void-editor", + "licenseFileName": "LICENSE.txt", + "reportIssueUrl": "https://github.com/voideditor/void/issues/new", + "nodejsRepository": "https://nodejs.org", + "urlProtocol": "void-editor", + "extensionsGallery": { + "serviceUrl": "https://open-vsx.org/vscode/gallery", + "itemUrl": "https://open-vsx.org/vscode/item" + }, + "builtInExtensions": [] +} \ No newline at end of file From 12c686c102734afae7165781d039b35a50f2d340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Feb 2025 14:43:30 +0100 Subject: [PATCH 12/36] Bump: voidVersion --- product.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/product.json b/product.json index 445ee82c..e96a1cf3 100644 --- a/product.json +++ b/product.json @@ -1,8 +1,8 @@ { "nameShort": "Void", "nameLong": "Void", - "voidVersion": "1.0.1", - "commit": "ba15b3166152eeea1370573660d700210167102f", + "voidVersion": "1.0.2", + "commit": "7bceceef85f29e840f6379e7868cabdb9a8e9d8b", "date": "2025-02-11", "applicationName": "void", "dataFolderName": ".void-editor", From ac2fb9e36de02cf3f24837df94475c6cf3adfdf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Fri, 7 Mar 2025 14:30:33 +0100 Subject: [PATCH 13/36] Mistral : Added, not fim --- .../contrib/void/common/modelCapabilities.ts | 27 +++++++++++-------- .../contrib/void/common/voidSettingsTypes.ts | 22 ++++++++++++--- .../llmMessage/sendLLMMessage.impl.ts | 9 +++++++ 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index 13173b50..a66ff08e 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -51,13 +51,12 @@ export const defaultModelsOfProvider = { 'llama-3.1-8b-instant', // 'qwen-2.5-coder-32b', // preview mode (experimental) ], - // not supporting mistral right now- it's last on Void usage, and a huge pain to set up since it's nonstandard (it supports codestral FIM but it's on v1/fim/completions, etc) - // mistral: [ // https://docs.mistral.ai/getting-started/models/models_overview/ - // 'codestral-latest', - // 'mistral-large-latest', - // 'ministral-3b-latest', - // 'ministral-8b-latest', - // ], + mistral: [ // https://docs.mistral.ai/getting-started/models/models_overview/ + 'codestral-latest', + 'mistral-large-latest', + 'ministral-3b-latest', + 'ministral-8b-latest', + ], openAICompatible: [], // fallback } as const satisfies Record @@ -135,7 +134,7 @@ const openSourceModelOptions_assumingOAICompat = { supportsTools: false, supportsReasoning: false, }, - 'codestral': { + 'mistral': { supportsFIM: true, supportsSystemMessage: 'system-role', supportsTools: 'openai-style', @@ -214,7 +213,7 @@ const extensiveModelFallback: ProviderSettings['modelOptionsFallback'] = (modelN if (modelName.includes('deepseek')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.deepseekCoderV2, contextWindow: 32_000, maxOutputTokens: 4_096, }) if (modelName.includes('llama3')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.llama3, contextWindow: 32_000, maxOutputTokens: 4_096, }) if (modelName.includes('qwen') && modelName.includes('2.5') && modelName.includes('coder')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['qwen2.5coder'], contextWindow: 32_000, maxOutputTokens: 4_096, }) - if (modelName.includes('codestral')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.codestral, contextWindow: 32_000, maxOutputTokens: 4_096, }) + if (modelName.includes('mistral')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.mistral, contextWindow: 32_000, maxOutputTokens: 4_096, }) if (/\bo1\b/.test(modelName) || /\bo3\b/.test(modelName)) return toFallback(openAIModelOptions['o1']) return toFallback(modelOptionsDefaults) } @@ -555,7 +554,7 @@ const openRouterModelOptions_assumingOpenAICompat = { supportsReasoning: false, }, 'mistralai/codestral-2501': { - ...openSourceModelOptions_assumingOAICompat.codestral, + ...openSourceModelOptions_assumingOAICompat.mistral, contextWindow: 256_000, maxOutputTokens: null, cost: { input: 0.3, output: 0.9 }, @@ -590,6 +589,12 @@ const openRouterSettings: ProviderSettings = { } +const mistralSettings: ProviderSettings = { + ...openSourceModelOptions_assumingOAICompat.mistral, + modelOptions: {}, + modelOptionsFallback: (modelName) => extensiveModelFallback(modelName), +} + // ---------------- model settings of everything above ---------------- @@ -599,7 +604,7 @@ const modelSettingsOfProvider: { [providerName in ProviderName]: ProviderSetting anthropic: anthropicSettings, xAI: xAISettings, gemini: geminiSettings, - + mistral: mistralSettings, // open source models deepseek: deepseekSettings, groq: groqSettings, diff --git a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts index bda7e3ce..c95b5ecc 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts @@ -43,6 +43,9 @@ export const defaultProviderSettings = { xAI: { apiKey: '' }, + mistral: { + apiKey: '' + }, } as const @@ -144,6 +147,11 @@ export const displayInfoOfProviderName = (providerName: ProviderName): DisplayIn title: 'Grok (xAI)', } } + else if (providerName === 'mistral') { + return { + title: 'Mistral.ai API', + } + } throw new Error(`descOfProviderName: Unknown provider name: "${providerName}"`) @@ -170,7 +178,8 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName providerName === 'groq' ? 'gsk_key...' : providerName === 'openAICompatible' ? 'sk-key...' : providerName === 'xAI' ? 'xai-key...' : - '', + providerName === 'mistral' ? 'key...' : + '', subTextMd: providerName === 'anthropic' ? 'Get your [API Key here](https://console.anthropic.com/settings/keys).' : providerName === 'openAI' ? 'Get your [API Key here](https://platform.openai.com/api-keys).' : @@ -179,8 +188,9 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName providerName === 'gemini' ? 'Get your [API Key here](https://aistudio.google.com/apikey).' : providerName === 'groq' ? 'Get your [API Key here](https://console.groq.com/keys).' : providerName === 'xAI' ? 'Get your [API Key here](https://console.x.ai).' : - providerName === 'openAICompatible' ? undefined : - '', + providerName === 'mistral' ? 'Get your [API Key here](https://console.mistral.ai/api-keys).' : + providerName === 'openAICompatible' ? undefined : + '', isPasswordField: true, } } @@ -300,6 +310,12 @@ export const defaultSettingsOfProvider: SettingsOfProvider = { ...modelInfoOfDefaultModelNames(defaultModelsOfProvider.vLLM), _didFillInProviderSettings: undefined, }, + mistral: { // aggregator + ...defaultCustomSettings, + ...defaultProviderSettings.mistral, + ...modelInfoOfDefaultModelNames(defaultModelsOfProvider.mistral), + _didFillInProviderSettings: undefined, + }, } diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index f58eae38..a9c45b76 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -112,6 +112,10 @@ const newOpenAICompatibleSDK = ({ settingsOfProvider, providerName, includeInPay const thisConfig = settingsOfProvider[providerName] return new OpenAI({ baseURL: 'https://api.x.ai/v1', apiKey: thisConfig.apiKey, ...commonPayloadOpts }) } + else if (providerName === 'mistral') { + const thisConfig = settingsOfProvider[providerName] + return new OpenAI({ baseURL: 'https://api.mistral.ai/v1', apiKey: thisConfig.apiKey, ...commonPayloadOpts }) + } else throw new Error(`Void providerName was invalid: ${providerName}.`) } @@ -524,6 +528,11 @@ export const sendLLMMessageToProviderImplementation = { sendFIM: null, list: null, }, + mistral: { + sendChat: (params) => _sendOpenAICompatibleChat(params), + sendFIM: null, + list: null, + }, } satisfies CallFnOfProvider From bccc6a64ef6ee9054916afe65aafa974a389522f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Sat, 8 Mar 2025 08:23:20 +0100 Subject: [PATCH 14/36] Mistral FIM maybe --- package.json | 1 - src/vs/workbench/contrib/void/common/modelCapabilities.ts | 1 + .../void/electron-main/llmMessage/sendLLMMessage.impl.ts | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 52387a3e..921a4a1f 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,6 @@ "@google/generative-ai": "^0.22.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@mistralai/mistralai": "^1.5.0", "@parcel/watcher": "2.5.1", "@types/semver": "^7.5.8", "@vscode/deviceid": "^0.1.1", diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index a66ff08e..d6fbd390 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -56,6 +56,7 @@ export const defaultModelsOfProvider = { 'mistral-large-latest', 'ministral-3b-latest', 'ministral-8b-latest', + '' ], openAICompatible: [], // fallback } as const satisfies Record diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index a9c45b76..9b07807e 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -530,8 +530,8 @@ export const sendLLMMessageToProviderImplementation = { }, mistral: { sendChat: (params) => _sendOpenAICompatibleChat(params), - sendFIM: null, - list: null, + sendFIM: (params) => _sendOpenAICompatibleFIM(params), + list: (params) => _openaiCompatibleList(params), }, } satisfies CallFnOfProvider From ec4c52aff9798b34f9efaa2fb796645bf3de9fc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Sat, 8 Mar 2025 08:23:40 +0100 Subject: [PATCH 15/36] remove package --- package-lock.json | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a403917..f5127fb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,6 @@ "@google/generative-ai": "^0.22.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@mistralai/mistralai": "^1.5.0", "@parcel/watcher": "2.5.1", "@types/semver": "^7.5.8", "@vscode/deviceid": "^0.1.1", @@ -2539,17 +2538,6 @@ "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.9.tgz", "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" }, - "node_modules/@mistralai/mistralai": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.5.0.tgz", - "integrity": "sha512-AIn8pwAwA/fDvEUvmkt+40zH1ZmfaG3Q7oUWl17GUEC1tU7ZPwYz8Cv9P59lyS1SisHdDSu81oknO7f1ywkz8Q==", - "dependencies": { - "zod-to-json-schema": "^3.24.1" - }, - "peerDependencies": { - "zod": ">= 3" - } - }, "node_modules/@next/env": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.0.tgz", @@ -23157,15 +23145,6 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } - }, - "node_modules/zod-to-json-schema": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.3.tgz", - "integrity": "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.24.1" - } } } } From eda11f29d948c8d462fdb437e6994067466ba03e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Sun, 9 Mar 2025 03:30:23 +0100 Subject: [PATCH 16/36] FIM : I think it works as expected --- package-lock.json | 21 ++++++ package.json | 1 + .../contrib/void/common/modelCapabilities.ts | 64 +++++++++++++++---- .../llmMessage/sendLLMMessage.impl.ts | 62 +++++++++++++++--- 4 files changed, 126 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5127fb3..8c614833 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@google/generative-ai": "^0.22.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", + "@mistralai/mistralai": "^1.5.1", "@parcel/watcher": "2.5.1", "@types/semver": "^7.5.8", "@vscode/deviceid": "^0.1.1", @@ -2538,6 +2539,17 @@ "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.9.tgz", "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" }, + "node_modules/@mistralai/mistralai": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.5.1.tgz", + "integrity": "sha512-Ie0EH4dAO11MEXR5N2kS2cgr+ycTWvqN/yP9bKrtmUEqjdcF4i7DLxtrFMUw5l2dOPhrkX93G4SziFiATPWu2w==", + "dependencies": { + "zod-to-json-schema": "^3.24.1" + }, + "peerDependencies": { + "zod": ">= 3" + } + }, "node_modules/@next/env": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.0.tgz", @@ -23145,6 +23157,15 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.3", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.3.tgz", + "integrity": "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } } } } diff --git a/package.json b/package.json index 921a4a1f..2a8f0a57 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "@google/generative-ai": "^0.22.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", + "@mistralai/mistralai": "^1.5.1", "@parcel/watcher": "2.5.1", "@types/semver": "^7.5.8", "@vscode/deviceid": "^0.1.1", diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index d6fbd390..96c745a2 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -52,11 +52,7 @@ export const defaultModelsOfProvider = { // 'qwen-2.5-coder-32b', // preview mode (experimental) ], mistral: [ // https://docs.mistral.ai/getting-started/models/models_overview/ - 'codestral-latest', - 'mistral-large-latest', - 'ministral-3b-latest', - 'ministral-8b-latest', - '' + 'codestral-latest' ], openAICompatible: [], // fallback } as const satisfies Record @@ -135,12 +131,6 @@ const openSourceModelOptions_assumingOAICompat = { supportsTools: false, supportsReasoning: false, }, - 'mistral': { - supportsFIM: true, - supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', - supportsReasoning: false, - }, // llama 'llama3': { supportsFIM: false, @@ -179,6 +169,12 @@ const openSourceModelOptions_assumingOAICompat = { supportsTools: 'openai-style', supportsReasoning: { canToggleReasoning: false, canIOReasoning: true, openSourceThinkTags: ['', ''] }, }, + 'mistral-large-latest': { + supportsFIM: false, + supportsSystemMessage: 'system-role', + supportsTools: 'openai-style', + supportsReasoning: false, + }, // FIM only 'starcoder2': { supportsFIM: true, @@ -186,6 +182,13 @@ const openSourceModelOptions_assumingOAICompat = { supportsTools: false, supportsReasoning: false, }, + // Mistral + 'codestral-latest': { + supportsFIM: true, + supportsSystemMessage: 'system-role', + supportsTools: 'openai-style', + supportsReasoning: false, + }, 'codegemma:2b': { supportsFIM: true, supportsSystemMessage: false, @@ -214,7 +217,8 @@ const extensiveModelFallback: ProviderSettings['modelOptionsFallback'] = (modelN if (modelName.includes('deepseek')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.deepseekCoderV2, contextWindow: 32_000, maxOutputTokens: 4_096, }) if (modelName.includes('llama3')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.llama3, contextWindow: 32_000, maxOutputTokens: 4_096, }) if (modelName.includes('qwen') && modelName.includes('2.5') && modelName.includes('coder')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['qwen2.5coder'], contextWindow: 32_000, maxOutputTokens: 4_096, }) - if (modelName.includes('mistral')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.mistral, contextWindow: 32_000, maxOutputTokens: 4_096, }) + if (modelName.includes('mistral-large-latest')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['mistral-large-latest'], contextWindow: 32_000, maxOutputTokens: 4_096, }) + if (modelName.includes('codestral-latest')) return toFallback(mistralModelOptions['codestral-latest']) if (/\bo1\b/.test(modelName) || /\bo3\b/.test(modelName)) return toFallback(openAIModelOptions['o1']) return toFallback(modelOptionsDefaults) } @@ -354,6 +358,33 @@ const openAISettings: ProviderSettings = { } } +const mistralModelOptions = { + 'codestral-latest': { + contextWindow: 32_000, + maxOutputTokens: 4_096, + cost: { input: 0.00, output: 0.00 }, + supportsFIM: true, + supportsSystemMessage: 'system-role', + supportsTools: 'openai-style', + supportsReasoning: false, + }, + 'mistral-large-latest': { + contextWindow: 32_000, + maxOutputTokens: 4_096, + cost: { input: 0.00, output: 0.00 }, + supportsFIM: false, + supportsSystemMessage: 'system-role', + supportsTools: 'openai-style', + supportsReasoning: false, + } +} as const satisfies { [s: string]: ModelOptions } + + + + + + + // ---------------- XAI ---------------- const xAIModelOptions = { 'grok-2': { @@ -555,13 +586,20 @@ const openRouterModelOptions_assumingOpenAICompat = { supportsReasoning: false, }, 'mistralai/codestral-2501': { - ...openSourceModelOptions_assumingOAICompat.mistral, + ...openSourceModelOptions_assumingOAICompat['codestral-latest'], contextWindow: 256_000, maxOutputTokens: null, cost: { input: 0.3, output: 0.9 }, supportsTools: 'openai-style', supportsReasoning: false, }, + 'mistralai/mistral-large-latest': { + ...openSourceModelOptions_assumingOAICompat['mistral-large-latest'], + contextWindow: 256_000, + maxOutputTokens: null, + cost: { input: 0.3, output: 0.9 }, + }, + 'qwen/qwen-2.5-coder-32b-instruct': { ...openSourceModelOptions_assumingOAICompat['qwen2.5coder'], contextWindow: 33_000, diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index 9b07807e..568e7244 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -7,6 +7,11 @@ import Anthropic from '@anthropic-ai/sdk'; import { Ollama } from 'ollama'; import OpenAI, { ClientOptions } from 'openai'; +/* Mistral standalone Fim endpoint */ +import { MistralCore } from "@mistralai/mistralai/core.js"; +import { fimComplete } from "@mistralai/mistralai/funcs/fimComplete.js"; +/* End Mistral standalone Fim endpoint */ + import { Model as OpenAIModel } from 'openai/resources/models.js'; import { extractReasoningOnFinalMessage, extractReasoningOnTextWrapper } from '../../browser/helpers/extractCodeFromResult.js'; import { LLMChatMessage, LLMFIMMessage, ModelListParams, OllamaModelResponse, OnError, OnFinalMessage, OnText } from '../../common/llmMessageTypes.js'; @@ -143,7 +148,7 @@ const _sendOpenAICompatibleFIM = ({ messages: messages_, onFinalMessage, onError max_tokens: messages.maxTokens, }) .then(async response => { - const fullText = response.choices[0]?.text + const fullText = response.choices[0]?.text || ''; onFinalMessage({ fullText, }); }) .catch(error => { @@ -153,7 +158,49 @@ const _sendOpenAICompatibleFIM = ({ messages: messages_, onFinalMessage, onError } +const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions }: SendFIMParams_Internal) => { + const { modelName, supportsFIM } = getModelCapabilities(providerName, modelName_) + if (!supportsFIM) { + if (modelName === modelName_) + onError({ message: `Model ${modelName} does not support FIM.`, fullError: null }) + else + onError({ message: `Model ${modelName_} (${modelName}) does not support FIM.`, fullError: null }) + return + } + const messages = prepareFIMMessage({ messages: messages_, aiInstructions }) + const mistral = new MistralCore({ apiKey: settingsOfProvider.mistral.apiKey }) + + // DEBUG : request params + // console.log('🔍 Sending FIM request with params:', { + // model: modelName, + // promptLength: messages.prefix.length, + // suffixLength: messages.suffix.length, + // stream: false, + // maxTokens: messages.maxTokens + //}); + + fimComplete( + mistral, { + model: modelName, + prompt: messages.prefix, + suffix: messages.suffix, + stream: false, + topP: 1, + maxTokens: messages.maxTokens, + stop: messages.stopTokens + }, + ) + .then(async response => { + const fullText = response.choices[0]?.text || ''; + onFinalMessage({ fullText, }); + // console.log('✅ Réponse FIM reçue:', fullText); + + }) + .catch(error => { + onError({ message: error + '', fullError: error }); + }) +} const _sendOpenAICompatibleChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, tools: tools_ }: SendChatParams_Internal) => { const { @@ -374,8 +421,8 @@ const sendAnthropicChat = ({ messages: messages_, providerName, onText, onFinalM // on done - (or when error/fail) - this is called AFTER last streamEvent stream.on('finalMessage', (response) => { - const toolCalls = toolCallsFrom_AnthropicContent(response.content) - onFinalMessage({ fullText, fullReasoning, toolCalls, rawAnthropicAssistantContent: response.content as any }) + const toolCalls = toolCallsFrom_AnthropicContent(response.value.choices) + onFinalMessage({ fullText, fullReasoning, toolCalls, rawAnthropicAssistantContent: response.value.choices as any }) }) // on error stream.on('error', (error) => { @@ -530,8 +577,8 @@ export const sendLLMMessageToProviderImplementation = { }, mistral: { sendChat: (params) => _sendOpenAICompatibleChat(params), - sendFIM: (params) => _sendOpenAICompatibleFIM(params), - list: (params) => _openaiCompatibleList(params), + sendFIM: (params) => _sendMistralFIM(params), + list: null }, } satisfies CallFnOfProvider @@ -545,10 +592,7 @@ qwen2.5-coder https://ollama.com/library/qwen2.5-coder/blobs/e94a8ecb9327 <|fim_prefix|>{{ .Prompt }}<|fim_suffix|>{{ .Suffix }}<|fim_middle|> codestral https://ollama.com/library/codestral/blobs/51707752a87c -[SUFFIX]{{ .Suffix }}[PREFIX] {{ .Prompt }} - -deepseek-coder-v2 https://ollama.com/library/deepseek-coder-v2/blobs/22091531faf0 -<|fim▁begin|>{{ .Prompt }}<|fim▁hole|>{{ .Suffix }}<|fim▁end|> +{{ .Prompt }} starcoder2 https://ollama.com/library/starcoder2/blobs/3b190e68fefe From 330092d0231ebf77bc444a7e980096ad0b23c91f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Sun, 9 Mar 2025 21:55:20 +0100 Subject: [PATCH 17/36] mistral npm updated --- package-lock.json | 20 ++++++++++++++++---- package.json | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc045891..5b459a12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@google/generative-ai": "^0.21.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@mistralai/mistralai": "^1.4.0", + "@mistralai/mistralai": "^1.5.1", "@parcel/watcher": "2.1.0", "@rrweb/record": "^2.0.0-alpha.17", "@rrweb/types": "^2.0.0-alpha.17", @@ -2429,9 +2429,12 @@ } }, "node_modules/@mistralai/mistralai": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.4.0.tgz", - "integrity": "sha512-xA3DAtIDh4Qgr1EoSuiGVE+2ABNrxpcTeC0kSXYbkDNUGdthalLAH7DgbG0fkKZ7TN8xdWXQq2WiIghp/O96Eg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.5.1.tgz", + "integrity": "sha512-Ie0EH4dAO11MEXR5N2kS2cgr+ycTWvqN/yP9bKrtmUEqjdcF4i7DLxtrFMUw5l2dOPhrkX93G4SziFiATPWu2w==", + "dependencies": { + "zod-to-json-schema": "^3.24.1" + }, "peerDependencies": { "zod": ">= 3" } @@ -24183,6 +24186,15 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.3", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.3.tgz", + "integrity": "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } } } } diff --git a/package.json b/package.json index a4ee38bb..ea8bc1d9 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "@google/generative-ai": "^0.21.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@mistralai/mistralai": "^1.4.0", + "@mistralai/mistralai": "^1.5.1", "@parcel/watcher": "2.1.0", "@rrweb/record": "^2.0.0-alpha.17", "@rrweb/types": "^2.0.0-alpha.17", From 4e9dc5ce4a7233e3093919d6eb50fa1fbb108122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Mar 2025 16:12:14 +0100 Subject: [PATCH 18/36] defaultProviderSettings : mistral option --- .../contrib/void/common/voidSettingsTypes.ts | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts index 5636790a..87efbaf5 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts @@ -43,6 +43,9 @@ export const defaultProviderSettings = { xAI: { apiKey: '' }, + mistral: { + apiKey: '' + }, } as const @@ -144,6 +147,11 @@ export const displayInfoOfProviderName = (providerName: ProviderName): DisplayIn title: 'Grok (xAI)', } } + else if (providerName === 'mistral') { + return { + title: 'Mistal.ai API', + } + } throw new Error(`descOfProviderName: Unknown provider name: "${providerName}"`) @@ -170,7 +178,8 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName providerName === 'groq' ? 'gsk_key...' : providerName === 'openAICompatible' ? 'sk-key...' : providerName === 'xAI' ? 'xai-key...' : - '', + providerName === 'mistral' ? 'key...' : + '', subTextMd: providerName === 'anthropic' ? 'Get your [API Key here](https://console.anthropic.com/settings/keys).' : providerName === 'openAI' ? 'Get your [API Key here](https://platform.openai.com/api-keys).' : @@ -179,8 +188,9 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName providerName === 'gemini' ? 'Get your [API Key here](https://aistudio.google.com/apikey).' : providerName === 'groq' ? 'Get your [API Key here](https://console.groq.com/keys).' : providerName === 'xAI' ? 'Get your [API Key here](https://console.x.ai).' : - providerName === 'openAICompatible' ? undefined : - '', + providerName === 'mistral' ? 'Get your [API Key here](https://console.mistral.ai/api-keys).' : + providerName === 'openAICompatible' ? undefined : + '', isPasswordField: true, } } @@ -288,6 +298,12 @@ export const defaultSettingsOfProvider: SettingsOfProvider = { ...modelInfoOfDefaultModelNames(defaultModelsOfProvider.openAICompatible), _didFillInProviderSettings: undefined, }, + mistral: { // aggregator + ...defaultCustomSettings, + ...defaultProviderSettings.mistral, + ...modelInfoOfDefaultModelNames(defaultModelsOfProvider.mistral), + _didFillInProviderSettings: undefined, + }, ollama: { // aggregator ...defaultCustomSettings, ...defaultProviderSettings.ollama, From 7aca03de5cc92fc58689d771a792d868b2712d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Mar 2025 16:19:34 +0100 Subject: [PATCH 19/36] ADD : defaultModelsOfProvider : mistral - codestral-latest --- .../contrib/void/common/modelCapabilities.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index 95de9604..c3692f05 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -51,13 +51,9 @@ export const defaultModelsOfProvider = { 'llama-3.1-8b-instant', // 'qwen-2.5-coder-32b', // preview mode (experimental) ], - // not supporting mistral right now- it's last on Void usage, and a huge pain to set up since it's nonstandard (it supports codestral FIM but it's on v1/fim/completions, etc) - // mistral: [ // https://docs.mistral.ai/getting-started/models/models_overview/ - // 'codestral-latest', - // 'mistral-large-latest', - // 'ministral-3b-latest', - // 'ministral-8b-latest', - // ], + mistral: [ // https://docs.mistral.ai/getting-started/models/models_overview/ + 'codestral-latest', + ], openAICompatible: [], // fallback } as const satisfies Record @@ -192,6 +188,12 @@ const openSourceModelOptions_assumingOAICompat = { supportsTools: false, supportsReasoning: false, }, + 'codestral-latest': { + supportsFIM: true, + supportsSystemMessage: false, + supportsTools: false, + supportsReasoning: false, + }, } as const satisfies { [s: string]: Partial } From 89ac7738e4078a16a632514711f183597fc9ef97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Tue, 11 Mar 2025 16:21:49 +0100 Subject: [PATCH 20/36] sendLLMMessageToProviverImplementation : Mistral SendChat --- .../electron-main/llmMessage/sendLLMMessage.impl.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index abb0bc17..844a8a78 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -495,11 +495,11 @@ export const sendLLMMessageToProviderImplementation = { sendFIM: null, list: null, }, - // mistral: { - // sendChat: , // TODO - // sendFIM: , // TODO // https://docs.mistral.ai/api/#tag/fim - // list: null, - // }, + mistral: { + sendChat: (params) => _sendOpenAICompatibleChat(params), + sendFIM: null, // TODO // https://docs.mistral.ai/api/#tag/fim + list: null, + }, ollama: { sendChat: (params) => _sendOpenAICompatibleChat(params), sendFIM: sendOllamaFIM, From 6e39b225b2d1c7f9f9544a9e34e524f066f2d2bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Wed, 12 Mar 2025 15:34:02 +0100 Subject: [PATCH 21/36] - FIM is seems ok but disabled (have to find where to change it) - Send Mistral chat to fix [error 422] --- .../contrib/void/common/modelCapabilities.ts | 72 ++++++++++++------- .../contrib/void/common/voidSettingsTypes.ts | 2 +- .../llmMessage/sendLLMMessage.impl.ts | 18 +++-- 3 files changed, 61 insertions(+), 31 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index c3692f05..266b2d40 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -53,6 +53,11 @@ export const defaultModelsOfProvider = { ], mistral: [ // https://docs.mistral.ai/getting-started/models/models_overview/ 'codestral-latest', + 'open-codestral-mamba', + 'mistral-small-latest', + 'mistral-large-latest', + 'ministral-3b-latest', + 'ministral-8b-latest', ], openAICompatible: [], // fallback } as const satisfies Record @@ -117,6 +122,41 @@ const modelOptionsDefaults: ModelOptions = { supportsReasoning: false, } +const mistralModelOptions = { + 'codestral-latest': { + contextWindow: 32_000, + maxOutputTokens: 4_096, + cost: { input: 0.00, output: 0.00 }, + supportsFIM: true, + supportsSystemMessage: 'system-role', + supportsTools: 'openai-style', + supportsReasoning: false, + }, + 'open-codestral-mamba': { + contextWindow: 32_000, + maxOutputTokens: 4_096, + cost: { input: 0.00, output: 0.00 }, + supportsFIM: true, + supportsSystemMessage: 'system-role', + supportsTools: 'openai-style', + supportsReasoning: false, + }, + 'mistral-large-latest': { + contextWindow: 32_000, + maxOutputTokens: 4_096, + cost: { input: 0.00, output: 0.00 }, + supportsFIM: false, + supportsSystemMessage: 'system-role', + supportsTools: 'openai-style', + supportsReasoning: false, + } +} as const satisfies { [s: string]: ModelOptions } + +const mistralSettings: ProviderSettings = { + ...mistralModelOptions, + modelOptions: {}, + modelOptionsFallback: (modelName) => extensiveModelFallback(modelName), +} const openSourceModelOptions_assumingOAICompat = { 'deepseekR1': { @@ -131,12 +171,6 @@ const openSourceModelOptions_assumingOAICompat = { supportsTools: false, supportsReasoning: false, }, - 'codestral': { - supportsFIM: true, - supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', - supportsReasoning: false, - }, // llama 'llama3': { supportsFIM: false, @@ -188,17 +222,9 @@ const openSourceModelOptions_assumingOAICompat = { supportsTools: false, supportsReasoning: false, }, - 'codestral-latest': { - supportsFIM: true, - supportsSystemMessage: false, - supportsTools: false, - supportsReasoning: false, - }, + ...mistralModelOptions, } as const satisfies { [s: string]: Partial } - - - const extensiveModelFallback: ProviderSettings['modelOptionsFallback'] = (modelName) => { const toFallback = (opts: Omit): ModelOptions & { modelName: string } => { return { @@ -216,16 +242,15 @@ const extensiveModelFallback: ProviderSettings['modelOptionsFallback'] = (modelN if (modelName.includes('deepseek')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.deepseekCoderV2, contextWindow: 32_000, maxOutputTokens: 4_096, }) if (modelName.includes('llama3')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.llama3, contextWindow: 32_000, maxOutputTokens: 4_096, }) if (modelName.includes('qwen') && modelName.includes('2.5') && modelName.includes('coder')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['qwen2.5coder'], contextWindow: 32_000, maxOutputTokens: 4_096, }) - if (modelName.includes('codestral')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.codestral, contextWindow: 32_000, maxOutputTokens: 4_096, }) + + /* Mistral Options fallback for Mistral and others providers keeping the code relatively clean for all models */ + if (modelName.includes('mistral')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['mistral-large-latest'] }) + if (modelName.includes('codestral')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['codestral-latest'] }) + if (/\bo1\b/.test(modelName) || /\bo3\b/.test(modelName)) return toFallback(openAIModelOptions['o1']) return toFallback(modelOptionsDefaults) } - - - - - // ---------------- ANTHROPIC ---------------- const anthropicModelOptions = { 'claude-3-7-sonnet-20250219': { // https://docs.anthropic.com/en/docs/about-claude/models/all-models#model-comparison-table @@ -591,9 +616,6 @@ const openRouterSettings: ProviderSettings = { modelOptionsFallback: (modelName) => extensiveModelFallback(modelName), } - - - // ---------------- model settings of everything above ---------------- const modelSettingsOfProvider: { [providerName in ProviderName]: ProviderSettings } = { @@ -611,7 +633,7 @@ const modelSettingsOfProvider: { [providerName in ProviderName]: ProviderSetting vLLM: vLLMSettings, ollama: ollamaSettings, openAICompatible: openaiCompatible, - + mistral: mistralSettings, // googleVertex: {}, // microsoftAzure: {}, } as const diff --git a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts index 87efbaf5..79d2204b 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts @@ -149,7 +149,7 @@ export const displayInfoOfProviderName = (providerName: ProviderName): DisplayIn } else if (providerName === 'mistral') { return { - title: 'Mistal.ai API', + title: 'Mistral.ai API', } } diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index 844a8a78..26af462a 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -7,6 +7,10 @@ import Anthropic from '@anthropic-ai/sdk'; import { Ollama } from 'ollama'; import OpenAI, { ClientOptions } from 'openai'; + + + + import { Model as OpenAIModel } from 'openai/resources/models.js'; import { extractReasoningOnFinalMessage, extractReasoningOnTextWrapper } from '../../common/helpers/extractCodeFromResult.js'; import { LLMChatMessage, LLMFIMMessage, ModelListParams, OllamaModelResponse, OnError, OnFinalMessage, OnText } from '../../common/sendLLMMessageTypes.js'; @@ -112,6 +116,10 @@ const newOpenAICompatibleSDK = ({ settingsOfProvider, providerName, includeInPay const thisConfig = settingsOfProvider[providerName] return new OpenAI({ baseURL: 'https://api.x.ai/v1', apiKey: thisConfig.apiKey, ...commonPayloadOpts }) } + else if (providerName === 'mistral') { + const thisConfig = settingsOfProvider[providerName] + return new OpenAI({ baseURL: 'https://api.mistral.ai/v1', apiKey: thisConfig.apiKey, ...commonPayloadOpts }) + } else throw new Error(`Void providerName was invalid: ${providerName}.`) } @@ -495,11 +503,6 @@ export const sendLLMMessageToProviderImplementation = { sendFIM: null, list: null, }, - mistral: { - sendChat: (params) => _sendOpenAICompatibleChat(params), - sendFIM: null, // TODO // https://docs.mistral.ai/api/#tag/fim - list: null, - }, ollama: { sendChat: (params) => _sendOpenAICompatibleChat(params), sendFIM: sendOllamaFIM, @@ -530,6 +533,11 @@ export const sendLLMMessageToProviderImplementation = { sendFIM: null, list: null, }, + mistral: { + sendChat: (params) => _sendMistralChat(params), + sendFIM: (params) => _sendMistralFIM(params), + list: null, + }, } satisfies CallFnOfProvider From b7f764799cc1819dba0eccf0082d2deabcf0ac86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Wed, 12 Mar 2025 15:34:35 +0100 Subject: [PATCH 22/36] stuff changed there also --- package-lock.json | 8 +-- package.json | 2 +- .../contrib/void/common/modelCapabilities.ts | 2 +- .../llmMessage/sendLLMMessage.impl.ts | 53 +++++++++++++++++-- 4 files changed, 56 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a403917..8c614833 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@google/generative-ai": "^0.22.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@mistralai/mistralai": "^1.5.0", + "@mistralai/mistralai": "^1.5.1", "@parcel/watcher": "2.5.1", "@types/semver": "^7.5.8", "@vscode/deviceid": "^0.1.1", @@ -2540,9 +2540,9 @@ "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" }, "node_modules/@mistralai/mistralai": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.5.0.tgz", - "integrity": "sha512-AIn8pwAwA/fDvEUvmkt+40zH1ZmfaG3Q7oUWl17GUEC1tU7ZPwYz8Cv9P59lyS1SisHdDSu81oknO7f1ywkz8Q==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.5.1.tgz", + "integrity": "sha512-Ie0EH4dAO11MEXR5N2kS2cgr+ycTWvqN/yP9bKrtmUEqjdcF4i7DLxtrFMUw5l2dOPhrkX93G4SziFiATPWu2w==", "dependencies": { "zod-to-json-schema": "^3.24.1" }, diff --git a/package.json b/package.json index 52387a3e..2a8f0a57 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "@google/generative-ai": "^0.22.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@mistralai/mistralai": "^1.5.0", + "@mistralai/mistralai": "^1.5.1", "@parcel/watcher": "2.5.1", "@types/semver": "^7.5.8", "@vscode/deviceid": "^0.1.1", diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index 266b2d40..7bffa921 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -582,7 +582,7 @@ const openRouterModelOptions_assumingOpenAICompat = { supportsReasoning: false, }, 'mistralai/codestral-2501': { - ...openSourceModelOptions_assumingOAICompat.codestral, + ...openSourceModelOptions_assumingOAICompat['codestral-latest'], contextWindow: 256_000, maxOutputTokens: null, cost: { input: 0.3, output: 0.9 }, diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index 26af462a..a4efefb0 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -8,7 +8,10 @@ import { Ollama } from 'ollama'; import OpenAI, { ClientOptions } from 'openai'; - +/* Mistral standalone Fim endpoint */ +import { MistralCore } from "@mistralai/mistralai/core.js"; +import { fimComplete } from "@mistralai/mistralai/funcs/fimComplete.js"; +/* End Mistral standalone Fim endpoint */ import { Model as OpenAIModel } from 'openai/resources/models.js'; @@ -118,7 +121,7 @@ const newOpenAICompatibleSDK = ({ settingsOfProvider, providerName, includeInPay } else if (providerName === 'mistral') { const thisConfig = settingsOfProvider[providerName] - return new OpenAI({ baseURL: 'https://api.mistral.ai/v1', apiKey: thisConfig.apiKey, ...commonPayloadOpts }) + return new OpenAI({ baseURL: 'https://api.mistral.ai/v1', apiKey: thisConfig.apiKey }) } else throw new Error(`Void providerName was invalid: ${providerName}.`) @@ -472,7 +475,51 @@ const sendOllamaFIM = ({ messages: messages_, onFinalMessage, onError, settingsO }) } +const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions }: SendFIMParams_Internal) => { + const { modelName, supportsFIM } = getModelCapabilities(providerName, modelName_) + if (!supportsFIM) { + if (modelName === modelName_) + onError({ message: `Model ${modelName} does not support FIM.`, fullError: null }) + else + onError({ message: `Model ${modelName_} (${modelName}) does not support FIM.`, fullError: null }) + return + } + const messages = prepareFIMMessage({ messages: messages_, aiInstructions }) + const mistral = new MistralCore({ apiKey: settingsOfProvider.mistral.apiKey }) + + // DEBUG : request params + console.log('🔍 Sending FIM request with params:', { + model: modelName, + promptLength: messages.prefix.length, + suffixLength: messages.suffix.length, + stream: false, + maxTokens: messages.maxTokens + }); + + fimComplete( + mistral, { + model: modelName, + prompt: messages.prefix, + suffix: messages.suffix, + stream: false, + topP: 1, + maxTokens: messages.maxTokens, + stop: messages.stopTokens + }, + ) + + .then(async response => { + let content = response?.ok ? response.value.choices?.[0]?.message?.content : ''; + const fullText = typeof content === 'string' ? content : + Array.isArray(content) ? content.map(chunk => chunk.type === 'text' ? chunk.text : '').join('') : ''; + onFinalMessage({ fullText, fullReasoning: '', anthropicReasoning: null }); + console.log('✅ Réponse FIM reçue:', fullText); + }) + .catch(error => { + onError({ message: error + '', fullError: error }); + }) +} type CallFnOfProvider = { [providerName in ProviderName]: { @@ -534,7 +581,7 @@ export const sendLLMMessageToProviderImplementation = { list: null, }, mistral: { - sendChat: (params) => _sendMistralChat(params), + sendChat: (params) => _sendOpenAICompatibleChat(params), sendFIM: (params) => _sendMistralFIM(params), list: null, }, From bc6f68e1051c0161c2a739be11e53c4f8aded26c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Wed, 12 Mar 2025 18:52:54 +0100 Subject: [PATCH 23/36] Hope it works --- .../llmMessage/sendLLMMessage.impl.ts | 74 ++++++++++++++----- 1 file changed, 57 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index a4efefb0..a7e98938 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -7,11 +7,8 @@ import Anthropic from '@anthropic-ai/sdk'; import { Ollama } from 'ollama'; import OpenAI, { ClientOptions } from 'openai'; - -/* Mistral standalone Fim endpoint */ -import { MistralCore } from "@mistralai/mistralai/core.js"; +import Mistral from '@mistralai/mistralai'; import { fimComplete } from "@mistralai/mistralai/funcs/fimComplete.js"; -/* End Mistral standalone Fim endpoint */ import { Model as OpenAIModel } from 'openai/resources/models.js'; @@ -121,7 +118,7 @@ const newOpenAICompatibleSDK = ({ settingsOfProvider, providerName, includeInPay } else if (providerName === 'mistral') { const thisConfig = settingsOfProvider[providerName] - return new OpenAI({ baseURL: 'https://api.mistral.ai/v1', apiKey: thisConfig.apiKey }) + return new Mistral({ apiKey: thisConfig.apiKey, ...commonPayloadOpts }) } else throw new Error(`Void providerName was invalid: ${providerName}.`) @@ -475,6 +472,59 @@ const sendOllamaFIM = ({ messages: messages_, onFinalMessage, onError, settingsO }) } +const _sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, tools: tools_ }: SendChatParams_Internal) => { + const { + modelName, + supportsReasoning, + supportsSystemMessage, + supportsTools, + // maxOutputTokens, right now we are ignoring this + } = getModelCapabilities(providerName, modelName_) + + const { + canIOReasoning, + openSourceThinkTags, + } = supportsReasoning || {} + + const { providerReasoningIOSettings } = getProviderCapabilities(providerName) + + const { messages } = prepareMessages({ messages: messages_, aiInstructions, supportsSystemMessage, supportsTools, supportsAnthropicReasoningSignature: false }) + + const thisConfig = settingsOfProvider[providerName] + const mistral = new Mistral({ apiKey: thisConfig.apiKey }) + + let fullTextSoFar = '' + let fullReasoningSoFar = '' + + const { needsManualParse: needsManualReasoningParse } = providerReasoningIOSettings?.output ?? {} + const manuallyParseReasoning = needsManualReasoningParse && canIOReasoning && openSourceThinkTags + if (manuallyParseReasoning) { + onText = extractReasoningOnTextWrapper(onText, openSourceThinkTags) + } + + mistral.chat.complete({ + model: modelName, + messages: messages, + stream: false, + }) + .then(response => { + const content = response.choices?.[0]?.message?.content + const fullText = typeof content === 'string' ? content : + Array.isArray(content) ? content.map(chunk => chunk.type === 'text' ? chunk.text : '').join('') : ''; + + onFinalMessage({ fullText, fullReasoning: '', toolCalls: [], anthropicReasoning: null }); + }) + .catch(error => { + if (error.status === 401) { + onError({ message: invalidApiKeyMessage(providerName), fullError: error }); + } else { + onError({ message: error + '', fullError: error }); + } + }) + +} + + const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions }: SendFIMParams_Internal) => { const { modelName, supportsFIM } = getModelCapabilities(providerName, modelName_) if (!supportsFIM) { @@ -486,16 +536,7 @@ const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, setting } const messages = prepareFIMMessage({ messages: messages_, aiInstructions }) - const mistral = new MistralCore({ apiKey: settingsOfProvider.mistral.apiKey }) - - // DEBUG : request params - console.log('🔍 Sending FIM request with params:', { - model: modelName, - promptLength: messages.prefix.length, - suffixLength: messages.suffix.length, - stream: false, - maxTokens: messages.maxTokens - }); + const mistral = new Mistral({ providerName, settingsOfProvider, includeInPayload }) fimComplete( mistral, { @@ -508,7 +549,6 @@ const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, setting stop: messages.stopTokens }, ) - .then(async response => { let content = response?.ok ? response.value.choices?.[0]?.message?.content : ''; const fullText = typeof content === 'string' ? content : @@ -581,7 +621,7 @@ export const sendLLMMessageToProviderImplementation = { list: null, }, mistral: { - sendChat: (params) => _sendOpenAICompatibleChat(params), + sendChat: (params) => _sendMistralChat(params), sendFIM: (params) => _sendMistralFIM(params), list: null, }, From 8dcc3bf187190f402e2aeb240cb850092de9428d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Thu, 13 Mar 2025 04:04:51 +0100 Subject: [PATCH 24/36] fix to do to types of Mistral connexion --- .../llmMessage/sendLLMMessage.impl.ts | 107 ++++++++++-------- 1 file changed, 60 insertions(+), 47 deletions(-) diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index a7e98938..0273e916 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -7,7 +7,8 @@ import Anthropic from '@anthropic-ai/sdk'; import { Ollama } from 'ollama'; import OpenAI, { ClientOptions } from 'openai'; -import Mistral from '@mistralai/mistralai'; +import Mistral from "@mistralai/mistralai"; +import { chatComplete } from "@mistralai/mistralai/funcs/chatComplete.js"; import { fimComplete } from "@mistralai/mistralai/funcs/fimComplete.js"; @@ -20,6 +21,7 @@ import { getModelSelectionState, getModelCapabilities, getProviderCapabilities } import { InternalToolInfo, ToolName, isAToolName } from '../../common/toolsServiceTypes.js'; + type InternalCommonMessageParams = { aiInstructions: string; onText: OnText; @@ -118,7 +120,7 @@ const newOpenAICompatibleSDK = ({ settingsOfProvider, providerName, includeInPay } else if (providerName === 'mistral') { const thisConfig = settingsOfProvider[providerName] - return new Mistral({ apiKey: thisConfig.apiKey, ...commonPayloadOpts }) + return new OpenAI({ apiKey: thisConfig.apiKey, ...commonPayloadOpts }) } else throw new Error(`Void providerName was invalid: ${providerName}.`) @@ -472,60 +474,70 @@ const sendOllamaFIM = ({ messages: messages_, onFinalMessage, onError, settingsO }) } -const _sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, tools: tools_ }: SendChatParams_Internal) => { +const sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions }: SendChatParams_Internal) => { const { modelName, - supportsReasoning, supportsSystemMessage, supportsTools, - // maxOutputTokens, right now we are ignoring this } = getModelCapabilities(providerName, modelName_) - const { - canIOReasoning, - openSourceThinkTags, - } = supportsReasoning || {} - - const { providerReasoningIOSettings } = getProviderCapabilities(providerName) - - const { messages } = prepareMessages({ messages: messages_, aiInstructions, supportsSystemMessage, supportsTools, supportsAnthropicReasoningSignature: false }) - - const thisConfig = settingsOfProvider[providerName] - const mistral = new Mistral({ apiKey: thisConfig.apiKey }) - - let fullTextSoFar = '' - let fullReasoningSoFar = '' - - const { needsManualParse: needsManualReasoningParse } = providerReasoningIOSettings?.output ?? {} - const manuallyParseReasoning = needsManualReasoningParse && canIOReasoning && openSourceThinkTags - if (manuallyParseReasoning) { - onText = extractReasoningOnTextWrapper(onText, openSourceThinkTags) - } - - mistral.chat.complete({ - model: modelName, - messages: messages, - stream: false, + const { messages } = prepareMessages({ + messages: messages_, + aiInstructions, + supportsSystemMessage, + supportsTools, + supportsAnthropicReasoningSignature: false }) - .then(response => { - const content = response.choices?.[0]?.message?.content - const fullText = typeof content === 'string' ? content : - Array.isArray(content) ? content.map(chunk => chunk.type === 'text' ? chunk.text : '').join('') : ''; - onFinalMessage({ fullText, fullReasoning: '', toolCalls: [], anthropicReasoning: null }); - }) - .catch(error => { - if (error.status === 401) { - onError({ message: invalidApiKeyMessage(providerName), fullError: error }); + const mistral = new Mistral({ apiKey: settingsOfProvider[providerName].apiKey }) + + let fullText = '' + + console.log('🔍 Debug - Messages envoyés:', messages) + + chatComplete( + mistral, { + model: modelName, + messages: messages.map((m: any) => ({ + role: m.role, + content: m.content + })), + stream: true, + } + ) + .then(response => { + console.log('🔍 Debug - Réponse initiale:', response) + + if (!response?.ok) { + throw new Error('Response not ok') + } + + // Traitement direct de la réponse + const content = response.value.choices?.[0]?.message?.content + if (content) { + fullText = typeof content === 'string' ? content : content.map(chunk => chunk.type === 'text' ? chunk.text : '').join('') + onText({ fullText, fullReasoning: '' }) + onFinalMessage({ + fullText, + fullReasoning: '', + toolCalls: [], + anthropicReasoning: null + }) } else { - onError({ message: error + '', fullError: error }); + onError({ message: 'Void: Response from model was empty.', fullError: null }) + } + }) + .catch(error => { + console.error('❌ Debug - Erreur capturée:', error) + if (error.status === 401) { + onError({ message: invalidApiKeyMessage(providerName), fullError: error }) + } else { + onError({ message: error + '', fullError: error }) } }) - } - -const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions }: SendFIMParams_Internal) => { +const sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions }: SendFIMParams_Internal) => { const { modelName, supportsFIM } = getModelCapabilities(providerName, modelName_) if (!supportsFIM) { if (modelName === modelName_) @@ -536,8 +548,9 @@ const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, setting } const messages = prepareFIMMessage({ messages: messages_, aiInstructions }) - const mistral = new Mistral({ providerName, settingsOfProvider, includeInPayload }) + const mistral = new Mistral({ apiKey: settingsOfProvider[providerName].apiKey }) + console.log('messages FIM', messages) fimComplete( mistral, { model: modelName, @@ -621,8 +634,8 @@ export const sendLLMMessageToProviderImplementation = { list: null, }, mistral: { - sendChat: (params) => _sendMistralChat(params), - sendFIM: (params) => _sendMistralFIM(params), + sendChat: (params) => sendMistralChat(params), + sendFIM: (params) => sendMistralFIM(params), list: null, }, } satisfies CallFnOfProvider @@ -640,7 +653,7 @@ codestral https://ollama.com/library/codestral/blobs/51707752a87c [SUFFIX]{{ .Suffix }}[PREFIX] {{ .Prompt }} deepseek-coder-v2 https://ollama.com/library/deepseek-coder-v2/blobs/22091531faf0 -<|fim▁begin|>{{ .Prompt }}<|fim▁hole|>{{ .Suffix }}<|fim▁end|> +{{ .Prompt }} starcoder2 https://ollama.com/library/starcoder2/blobs/3b190e68fefe From 654b577ce6ea04d651eb9afc0562f96188835fa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Thu, 13 Mar 2025 18:23:05 +0100 Subject: [PATCH 25/36] Looks really hacky, but working ! YES ! --- .../llmMessage/sendLLMMessage.impl.ts | 121 +++++------------- 1 file changed, 30 insertions(+), 91 deletions(-) diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index 0273e916..87507448 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -6,13 +6,14 @@ import Anthropic from '@anthropic-ai/sdk'; import { Ollama } from 'ollama'; import OpenAI, { ClientOptions } from 'openai'; - -import Mistral from "@mistralai/mistralai"; -import { chatComplete } from "@mistralai/mistralai/funcs/chatComplete.js"; -import { fimComplete } from "@mistralai/mistralai/funcs/fimComplete.js"; - - import { Model as OpenAIModel } from 'openai/resources/models.js'; + +// Mistral Core functions // +import { MistralCore } from "@mistralai/mistralai/core.js"; +import { fimComplete } from "@mistralai/mistralai/funcs/fimComplete.js"; +import { chatComplete } from "@mistralai/mistralai/funcs/chatComplete.js"; + + import { extractReasoningOnFinalMessage, extractReasoningOnTextWrapper } from '../../common/helpers/extractCodeFromResult.js'; import { LLMChatMessage, LLMFIMMessage, ModelListParams, OllamaModelResponse, OnError, OnFinalMessage, OnText } from '../../common/sendLLMMessageTypes.js'; import { defaultProviderSettings, displayInfoOfProviderName, ModelSelectionOptions, ProviderName, SettingsOfProvider } from '../../common/voidSettingsTypes.js'; @@ -21,7 +22,6 @@ import { getModelSelectionState, getModelCapabilities, getProviderCapabilities } import { InternalToolInfo, ToolName, isAToolName } from '../../common/toolsServiceTypes.js'; - type InternalCommonMessageParams = { aiInstructions: string; onText: OnText; @@ -120,7 +120,7 @@ const newOpenAICompatibleSDK = ({ settingsOfProvider, providerName, includeInPay } else if (providerName === 'mistral') { const thisConfig = settingsOfProvider[providerName] - return new OpenAI({ apiKey: thisConfig.apiKey, ...commonPayloadOpts }) + return new OpenAI({ baseURL: 'https://api.mistral.ai/v1', apiKey: thisConfig.apiKey, ...commonPayloadOpts }) } else throw new Error(`Void providerName was invalid: ${providerName}.`) @@ -474,67 +474,19 @@ const sendOllamaFIM = ({ messages: messages_, onFinalMessage, onError, settingsO }) } +//////// MISTRAL //////// const sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions }: SendChatParams_Internal) => { - const { - modelName, - supportsSystemMessage, - supportsTools, - } = getModelCapabilities(providerName, modelName_) - - const { messages } = prepareMessages({ + _sendOpenAICompatibleChat({ messages: messages_, - aiInstructions, - supportsSystemMessage, - supportsTools, - supportsAnthropicReasoningSignature: false - }) - - const mistral = new Mistral({ apiKey: settingsOfProvider[providerName].apiKey }) - - let fullText = '' - - console.log('🔍 Debug - Messages envoyés:', messages) - - chatComplete( - mistral, { - model: modelName, - messages: messages.map((m: any) => ({ - role: m.role, - content: m.content - })), - stream: true, - } - ) - .then(response => { - console.log('🔍 Debug - Réponse initiale:', response) - - if (!response?.ok) { - throw new Error('Response not ok') - } - - // Traitement direct de la réponse - const content = response.value.choices?.[0]?.message?.content - if (content) { - fullText = typeof content === 'string' ? content : content.map(chunk => chunk.type === 'text' ? chunk.text : '').join('') - onText({ fullText, fullReasoning: '' }) - onFinalMessage({ - fullText, - fullReasoning: '', - toolCalls: [], - anthropicReasoning: null - }) - } else { - onError({ message: 'Void: Response from model was empty.', fullError: null }) - } - }) - .catch(error => { - console.error('❌ Debug - Erreur capturée:', error) - if (error.status === 401) { - onError({ message: invalidApiKeyMessage(providerName), fullError: error }) - } else { - onError({ message: error + '', fullError: error }) - } - }) + onText, + onFinalMessage, + onError, + settingsOfProvider, + modelName: modelName_, + _setAborter, + providerName, + aiInstructions + }); } const sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions }: SendFIMParams_Internal) => { @@ -548,32 +500,19 @@ const sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settings } const messages = prepareFIMMessage({ messages: messages_, aiInstructions }) - const mistral = new Mistral({ apiKey: settingsOfProvider[providerName].apiKey }) - - console.log('messages FIM', messages) - fimComplete( - mistral, { - model: modelName, - prompt: messages.prefix, - suffix: messages.suffix, - stream: false, - topP: 1, - maxTokens: messages.maxTokens, - stop: messages.stopTokens - }, - ) - .then(async response => { - let content = response?.ok ? response.value.choices?.[0]?.message?.content : ''; - const fullText = typeof content === 'string' ? content : - Array.isArray(content) ? content.map(chunk => chunk.type === 'text' ? chunk.text : '').join('') : ''; - onFinalMessage({ fullText, fullReasoning: '', anthropicReasoning: null }); - console.log('✅ Réponse FIM reçue:', fullText); - }) - .catch(error => { - onError({ message: error + '', fullError: error }); - }) + _sendOpenAICompatibleFIM({ + messages: messages_, + onFinalMessage, + onError, + settingsOfProvider, + modelName: modelName_, + _setAborter, + providerName, + aiInstructions + }); } + type CallFnOfProvider = { [providerName in ProviderName]: { sendChat: (params: SendChatParams_Internal) => void; From 27b782ff320c6f5bf103fde6e45ad4f99f13ef70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Thu, 13 Mar 2025 18:24:05 +0100 Subject: [PATCH 26/36] HOURRA ! --- .../void/electron-main/llmMessage/sendLLMMessage.impl.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index 87507448..0c10e5ac 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -8,12 +8,6 @@ import { Ollama } from 'ollama'; import OpenAI, { ClientOptions } from 'openai'; import { Model as OpenAIModel } from 'openai/resources/models.js'; -// Mistral Core functions // -import { MistralCore } from "@mistralai/mistralai/core.js"; -import { fimComplete } from "@mistralai/mistralai/funcs/fimComplete.js"; -import { chatComplete } from "@mistralai/mistralai/funcs/chatComplete.js"; - - import { extractReasoningOnFinalMessage, extractReasoningOnTextWrapper } from '../../common/helpers/extractCodeFromResult.js'; import { LLMChatMessage, LLMFIMMessage, ModelListParams, OllamaModelResponse, OnError, OnFinalMessage, OnText } from '../../common/sendLLMMessageTypes.js'; import { defaultProviderSettings, displayInfoOfProviderName, ModelSelectionOptions, ProviderName, SettingsOfProvider } from '../../common/voidSettingsTypes.js'; From 136840cca4b65e1fc1ac7dcb152bfb0ee12ca357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Fri, 14 Mar 2025 11:54:43 +0100 Subject: [PATCH 27/36] =?UTF-8?q?=F0=9F=98=BB=20:=20Miaou=20!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../llmMessage/sendLLMMessage.impl.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index 0c10e5ac..8694795a 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -121,7 +121,7 @@ const newOpenAICompatibleSDK = ({ settingsOfProvider, providerName, includeInPay } -const _sendOpenAICompatibleFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, }: SendFIMParams_Internal) => { +const _sendOpenAICompatibleFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions, }: SendFIMParams_Internal) => { const { modelName, supportsFIM } = getModelCapabilities(providerName, modelName_) if (!supportsFIM) { if (modelName === modelName_) @@ -155,7 +155,7 @@ const _sendOpenAICompatibleFIM = ({ messages: messages_, onFinalMessage, onError -const _sendOpenAICompatibleChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, tools: tools_ }: SendChatParams_Internal) => { +const _sendOpenAICompatibleChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions, tools: tools_ }: SendChatParams_Internal) => { const { modelName, supportsReasoning, @@ -469,7 +469,7 @@ const sendOllamaFIM = ({ messages: messages_, onFinalMessage, onError, settingsO } //////// MISTRAL //////// -const sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions }: SendChatParams_Internal) => { +const sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions }: SendChatParams_Internal) => { _sendOpenAICompatibleChat({ messages: messages_, onText, @@ -479,11 +479,12 @@ const sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, modelName: modelName_, _setAborter, providerName, - aiInstructions + aiInstructions, + modelSelectionOptions }); } -const sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions }: SendFIMParams_Internal) => { +const sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions }: SendFIMParams_Internal) => { const { modelName, supportsFIM } = getModelCapabilities(providerName, modelName_) if (!supportsFIM) { if (modelName === modelName_) @@ -492,7 +493,8 @@ const sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settings onError({ message: `Model ${modelName_} (${modelName}) does not support FIM.`, fullError: null }) return } - const messages = prepareFIMMessage({ messages: messages_, aiInstructions }) + + prepareFIMMessage({ messages: messages_, aiInstructions }) _sendOpenAICompatibleFIM({ messages: messages_, @@ -502,7 +504,9 @@ const sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settings modelName: modelName_, _setAborter, providerName, - aiInstructions + aiInstructions, + modelSelectionOptions, + onText: () => { } }); } From c6d246f783f68af94e8aae7a1796800cbde48d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Sat, 15 Mar 2025 16:07:33 +0100 Subject: [PATCH 28/36] main branch conflicts fixed --- .../contrib/void/common/modelCapabilities.ts | 43 --------------- .../contrib/void/common/voidSettingsTypes.ts | 6 -- .../llmMessage/sendLLMMessage.impl.ts | 55 ++----------------- 3 files changed, 5 insertions(+), 99 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index fe8e8b5d..25587fc9 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -132,15 +132,6 @@ const mistralModelOptions = { supportsTools: 'openai-style', supportsReasoning: false, }, - 'open-codestral-mamba': { - contextWindow: 32_000, - maxOutputTokens: 4_096, - cost: { input: 0.00, output: 0.00 }, - supportsFIM: true, - supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', - supportsReasoning: false, - }, 'mistral-large-latest': { contextWindow: 32_000, maxOutputTokens: 4_096, @@ -209,12 +200,6 @@ const openSourceModelOptions_assumingOAICompat = { supportsTools: 'openai-style', supportsReasoning: { canToggleReasoning: false, canIOReasoning: true, openSourceThinkTags: ['', ''] }, }, - 'mistral-large-latest': { - supportsFIM: false, - supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', - supportsReasoning: false, - }, // FIM only 'starcoder2': { supportsFIM: true, @@ -222,13 +207,6 @@ const openSourceModelOptions_assumingOAICompat = { supportsTools: false, supportsReasoning: false, }, - // Mistral - 'codestral-latest': { - supportsFIM: true, - supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', - supportsReasoning: false, - }, 'codegemma:2b': { supportsFIM: true, supportsSystemMessage: false, @@ -391,26 +369,6 @@ const openAISettings: ProviderSettings = { } } -const mistralModelOptions = { - 'codestral-latest': { - contextWindow: 32_000, - maxOutputTokens: 4_096, - cost: { input: 0.00, output: 0.00 }, - supportsFIM: true, - supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', - supportsReasoning: false, - }, - 'mistral-large-latest': { - contextWindow: 32_000, - maxOutputTokens: 4_096, - cost: { input: 0.00, output: 0.00 }, - supportsFIM: false, - supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', - supportsReasoning: false, - } -} as const satisfies { [s: string]: ModelOptions } @@ -668,7 +626,6 @@ const modelSettingsOfProvider: { [providerName in ProviderName]: ProviderSetting anthropic: anthropicSettings, xAI: xAISettings, gemini: geminiSettings, - mistral: mistralSettings, // open source models deepseek: deepseekSettings, groq: groqSettings, diff --git a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts index 0f3e50e6..79d2204b 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts @@ -316,12 +316,6 @@ export const defaultSettingsOfProvider: SettingsOfProvider = { ...modelInfoOfDefaultModelNames(defaultModelsOfProvider.vLLM), _didFillInProviderSettings: undefined, }, - mistral: { // aggregator - ...defaultCustomSettings, - ...defaultProviderSettings.mistral, - ...modelInfoOfDefaultModelNames(defaultModelsOfProvider.mistral), - _didFillInProviderSettings: undefined, - }, } diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index 24afe0c5..bd4c3da4 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -153,51 +153,6 @@ const _sendOpenAICompatibleFIM = ({ messages: messages_, onFinalMessage, onError }) } - -const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions }: SendFIMParams_Internal) => { - const { modelName, supportsFIM } = getModelCapabilities(providerName, modelName_) - if (!supportsFIM) { - if (modelName === modelName_) - onError({ message: `Model ${modelName} does not support FIM.`, fullError: null }) - else - onError({ message: `Model ${modelName_} (${modelName}) does not support FIM.`, fullError: null }) - return - } - const messages = prepareFIMMessage({ messages: messages_, aiInstructions }) - - const mistral = new MistralCore({ apiKey: settingsOfProvider.mistral.apiKey }) - - // DEBUG : request params - // console.log('🔍 Sending FIM request with params:', { - // model: modelName, - // promptLength: messages.prefix.length, - // suffixLength: messages.suffix.length, - // stream: false, - // maxTokens: messages.maxTokens - //}); - - fimComplete( - mistral, { - model: modelName, - prompt: messages.prefix, - suffix: messages.suffix, - stream: false, - topP: 1, - maxTokens: messages.maxTokens, - stop: messages.stopTokens - }, - ) - .then(async response => { - const fullText = response.choices[0]?.text || ''; - onFinalMessage({ fullText, }); - // console.log('✅ Réponse FIM reçue:', fullText); - - }) - .catch(error => { - onError({ message: error + '', fullError: error }); - }) -} - const _sendOpenAICompatibleChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions, tools: tools_ }: SendChatParams_Internal) => { const { modelName, @@ -512,7 +467,7 @@ const sendOllamaFIM = ({ messages: messages_, onFinalMessage, onError, settingsO } //////// MISTRAL //////// -const sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions }: SendChatParams_Internal) => { +const _sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions }: SendChatParams_Internal) => { _sendOpenAICompatibleChat({ messages: messages_, onText, @@ -527,7 +482,7 @@ const sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, }); } -const sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions }: SendFIMParams_Internal) => { +const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions }: SendFIMParams_Internal) => { const { modelName, supportsFIM } = getModelCapabilities(providerName, modelName_) if (!supportsFIM) { if (modelName === modelName_) @@ -614,8 +569,8 @@ export const sendLLMMessageToProviderImplementation = { list: null, }, mistral: { - sendChat: (params) => sendMistralChat(params), - sendFIM: (params) => sendMistralFIM(params), + sendChat: (params) => _sendMistralChat(params), + sendFIM: (params) => _sendMistralFIM(params), list: null, }, -} satisfies CallFnOfProvider \ No newline at end of file +} satisfies CallFnOfProvider From 17ac9c081c8cfc111519dc027c840adbee263aad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Sun, 16 Mar 2025 21:07:04 +0100 Subject: [PATCH 29/36] Mistral FIM Method : seems to be the good one --- .../llmMessage/sendLLMMessage.impl.ts | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index bd4c3da4..743e2a61 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -8,6 +8,11 @@ import { Ollama } from 'ollama'; import OpenAI, { ClientOptions } from 'openai'; import { Model as OpenAIModel } from 'openai/resources/models.js'; +// Mistral FIM +import { MistralCore } from "@mistralai/mistralai/core.js"; +import { fimComplete } from "@mistralai/mistralai/funcs/fimComplete.js"; +// + import { extractReasoningOnFinalMessage, extractReasoningOnTextWrapper } from '../../common/helpers/extractCodeFromResult.js'; import { LLMChatMessage, LLMFIMMessage, ModelListParams, OllamaModelResponse, OnError, OnFinalMessage, OnText } from '../../common/sendLLMMessageTypes.js'; import { defaultProviderSettings, displayInfoOfProviderName, ModelSelectionOptions, ProviderName, SettingsOfProvider } from '../../common/voidSettingsTypes.js'; @@ -494,18 +499,28 @@ const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, setting prepareFIMMessage({ messages: messages_, aiInstructions }) - _sendOpenAICompatibleFIM({ - messages: messages_, - onFinalMessage, - onError, - settingsOfProvider, - modelName: modelName_, - _setAborter, - providerName, - aiInstructions, - modelSelectionOptions, - onText: () => { } - }); + const mistral = new MistralCore({ apiKey: settingsOfProvider.mistral.apiKey }) + + fimComplete( + mistral, { + model: modelName, + prompt: messages_.prefix, + suffix: messages_.suffix, + stream: false, + topP: 1, + stop: messages_.stopTokens + }, + ) + .then(async response => { + let content = response?.ok ? response.value.choices?.[0]?.message?.content : ''; + const fullText = typeof content === 'string' ? content : + Array.isArray(content) ? content.map(chunk => chunk.type === 'text' ? chunk.text : '').join('') : ''; + onFinalMessage({ fullText, fullReasoning: '', anthropicReasoning: null }); + console.log('✅ Réponse FIM reçue:', fullText); + }) + .catch(error => { + onError({ message: error + '', fullError: error }); + }) } From 7b3a82f1d289fa9cce134852ec4a0b72848089c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Sun, 16 Mar 2025 21:13:57 +0100 Subject: [PATCH 30/36] Removed log --- .../contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index 743e2a61..087b61b5 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -516,7 +516,6 @@ const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, setting const fullText = typeof content === 'string' ? content : Array.isArray(content) ? content.map(chunk => chunk.type === 'text' ? chunk.text : '').join('') : ''; onFinalMessage({ fullText, fullReasoning: '', anthropicReasoning: null }); - console.log('✅ Réponse FIM reçue:', fullText); }) .catch(error => { onError({ message: error + '', fullError: error }); From e08e728fc8095b2832b87883583ebda6b5a93772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Mon, 17 Mar 2025 17:34:37 +0100 Subject: [PATCH 31/36] Bump: voidVersion --- product.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/product.json b/product.json index 607b8eaf..b629f2b7 100644 --- a/product.json +++ b/product.json @@ -1,9 +1,9 @@ { "nameShort": "Void", "nameLong": "Void", - "voidVersion": "1.0.2", - "commit": "7bceceef85f29e840f6379e7868cabdb9a8e9d8b", - "date": "2025-02-11", + "voidVersion": "1.0.3", + "commit": "18d2d9f5ee4cb290bd392035680b9c6ea60eeb6b", + "date": "2025-03-17", "applicationName": "void", "dataFolderName": ".void-editor", "win32MutexName": "voideditor", @@ -38,4 +38,4 @@ "itemUrl": "https://open-vsx.org/vscode/item" }, "builtInExtensions": [] -} +} \ No newline at end of file From a96e2f9a08d0d457811920204224b12312ed9f05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Commaret?= Date: Mon, 17 Mar 2025 18:20:56 +0100 Subject: [PATCH 32/36] Update scripts/update-version.js let try this. Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- scripts/update-version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/update-version.js b/scripts/update-version.js index a8542ad3..5a528a47 100644 --- a/scripts/update-version.js +++ b/scripts/update-version.js @@ -5,7 +5,7 @@ const semver = require('semver'); function updateProductJson(type = 'patch') { // Read product.json const productJsonPath = './product.json'; - const product = require('../' + productJsonPath); + const product = JSON.parse(fs.readFileSync(productJsonPath, 'utf8')); // Update the version product.voidVersion = semver.inc(product.voidVersion, type); From 22a16974f92279273235d6143fc68eefeaf175f4 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Fri, 21 Mar 2025 15:18:29 -0700 Subject: [PATCH 33/36] keep versioning, revert mistral (will review separately) --- package-lock.json | 8 +- package.json | 9 +- product.json | 77 ++++++------- scripts/update-version.js | 27 ----- src/vs/base/common/product.ts | 2 +- .../contrib/void/common/modelCapabilities.ts | 80 +++++-------- .../contrib/void/common/voidSettingsTypes.ts | 22 +--- .../llmMessage/sendLLMMessage.impl.ts | 105 ++++++------------ .../parts/dialogs/dialogHandler.ts | 6 +- 9 files changed, 115 insertions(+), 221 deletions(-) delete mode 100644 scripts/update-version.js diff --git a/package-lock.json b/package-lock.json index 8c614833..4a403917 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@google/generative-ai": "^0.22.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@mistralai/mistralai": "^1.5.1", + "@mistralai/mistralai": "^1.5.0", "@parcel/watcher": "2.5.1", "@types/semver": "^7.5.8", "@vscode/deviceid": "^0.1.1", @@ -2540,9 +2540,9 @@ "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" }, "node_modules/@mistralai/mistralai": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.5.1.tgz", - "integrity": "sha512-Ie0EH4dAO11MEXR5N2kS2cgr+ycTWvqN/yP9bKrtmUEqjdcF4i7DLxtrFMUw5l2dOPhrkX93G4SziFiATPWu2w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.5.0.tgz", + "integrity": "sha512-AIn8pwAwA/fDvEUvmkt+40zH1ZmfaG3Q7oUWl17GUEC1tU7ZPwYz8Cv9P59lyS1SisHdDSu81oknO7f1ywkz8Q==", "dependencies": { "zod-to-json-schema": "^3.24.1" }, diff --git a/package.json b/package.json index 4e53923b..de2e014d 100644 --- a/package.json +++ b/package.json @@ -68,18 +68,15 @@ "extensions-ci": "node ./node_modules/gulp/bin/gulp.js extensions-ci", "extensions-ci-pr": "node ./node_modules/gulp/bin/gulp.js extensions-ci-pr", "perf": "node scripts/code-perf.js", - "update-build-ts-version": "npm install typescript@next && tsc -p ./build/tsconfig.build.json", - "void-version-patch": "node scripts/update-version.js patch && git add product.json && git commit -m \"Bump: voidVersion\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags", - "void-version-minor": "node scripts/update-version.js minor && git add product.json && git commit -m \"Bump: voidVersion minor\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags", - "void-version-major": "node scripts/update-version.js major && git add product.json && git commit -m \"Bump: voidVersion major\" && git tag v$(node -e \"console.log(require('./product.json').voidVersion)\") && git push && git push --tags" - }, + "update-build-ts-version": "npm install typescript@next && tsc -p ./build/tsconfig.build.json" + }, "dependencies": { "@anthropic-ai/sdk": "^0.39.0", "@floating-ui/react": "^0.27.5", "@google/generative-ai": "^0.22.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@mistralai/mistralai": "^1.5.1", + "@mistralai/mistralai": "^1.5.0", "@parcel/watcher": "2.5.1", "@types/semver": "^7.5.8", "@vscode/deviceid": "^0.1.1", diff --git a/product.json b/product.json index b629f2b7..b7b9c269 100644 --- a/product.json +++ b/product.json @@ -1,41 +1,38 @@ { - "nameShort": "Void", - "nameLong": "Void", - "voidVersion": "1.0.3", - "commit": "18d2d9f5ee4cb290bd392035680b9c6ea60eeb6b", - "date": "2025-03-17", - "applicationName": "void", - "dataFolderName": ".void-editor", - "win32MutexName": "voideditor", - "licenseName": "MIT", - "licenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", - "serverLicenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", - "serverGreeting": [], - "serverLicense": [], - "serverLicensePrompt": "", - "serverApplicationName": "void-server", - "serverDataFolderName": ".void-server", - "tunnelApplicationName": "void-tunnel", - "win32DirName": "Void", - "win32NameVersion": "Void", - "win32RegValueName": "VoidEditor", - "win32x64AppId": "{{9D394D01-1728-45A7-B997-A6C82C5452C3}", - "win32arm64AppId": "{{0668DD58-2BDE-4101-8CDA-40252DF8875D}", - "win32x64UserAppId": "{{8BED5DC1-6C55-46E6-9FE6-18F7E6F7C7F1}", - "win32arm64UserAppId": "{{F6C87466-BC82-4A8F-B0FF-18CA366BA4D8}", - "win32AppUserModelId": "Void.Editor", - "win32ShellNameShort": "V&oid", - "win32TunnelServiceMutex": "void-tunnelservice", - "win32TunnelMutex": "void-tunnel", - "darwinBundleIdentifier": "com.voideditor.code", - "linuxIconName": "void-editor", - "licenseFileName": "LICENSE.txt", - "reportIssueUrl": "https://github.com/voideditor/void/issues/new", - "nodejsRepository": "https://nodejs.org", - "urlProtocol": "void-editor", - "extensionsGallery": { - "serviceUrl": "https://open-vsx.org/vscode/gallery", - "itemUrl": "https://open-vsx.org/vscode/item" - }, - "builtInExtensions": [] -} \ No newline at end of file + "nameShort": "Void", + "nameLong": "Void", + "applicationName": "void", + "dataFolderName": ".void-editor", + "win32MutexName": "voideditor", + "licenseName": "MIT", + "licenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", + "serverLicenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt", + "serverGreeting": [], + "serverLicense": [], + "serverLicensePrompt": "", + "serverApplicationName": "void-server", + "serverDataFolderName": ".void-server", + "tunnelApplicationName": "void-tunnel", + "win32DirName": "Void", + "win32NameVersion": "Void", + "win32RegValueName": "VoidEditor", + "win32x64AppId": "{{9D394D01-1728-45A7-B997-A6C82C5452C3}", + "win32arm64AppId": "{{0668DD58-2BDE-4101-8CDA-40252DF8875D}", + "win32x64UserAppId": "{{8BED5DC1-6C55-46E6-9FE6-18F7E6F7C7F1}", + "win32arm64UserAppId": "{{F6C87466-BC82-4A8F-B0FF-18CA366BA4D8}", + "win32AppUserModelId": "Void.Editor", + "win32ShellNameShort": "V&oid", + "win32TunnelServiceMutex": "void-tunnelservice", + "win32TunnelMutex": "void-tunnel", + "darwinBundleIdentifier": "com.voideditor.code", + "linuxIconName": "void-editor", + "licenseFileName": "LICENSE.txt", + "reportIssueUrl": "https://github.com/voideditor/void/issues/new", + "nodejsRepository": "https://nodejs.org", + "urlProtocol": "void", + "extensionsGallery": { + "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery", + "itemUrl": "https://marketplace.visualstudio.com/items" + }, + "builtInExtensions": [] +} diff --git a/scripts/update-version.js b/scripts/update-version.js deleted file mode 100644 index 5a528a47..00000000 --- a/scripts/update-version.js +++ /dev/null @@ -1,27 +0,0 @@ -const fs = require('fs'); -const { execSync } = require('child_process'); -const semver = require('semver'); - -function updateProductJson(type = 'patch') { - // Read product.json - const productJsonPath = './product.json'; - const product = JSON.parse(fs.readFileSync(productJsonPath, 'utf8')); - - // Update the version - product.voidVersion = semver.inc(product.voidVersion, type); - - // Update the commit hash - product.commit = execSync('git rev-parse HEAD').toString().trim(); - - // Update the date - product.date = new Date().toISOString().split('T')[0]; - - // Write the modifications - fs.writeFileSync(productJsonPath, JSON.stringify(product, null, 2)); - - return product.voidVersion; -} - -// Execute the update -const newVersion = updateProductJson(process.argv[2] || 'patch'); -console.log(`Updated version: ${newVersion}`); diff --git a/src/vs/base/common/product.ts b/src/vs/base/common/product.ts index 7d3c2c40..c0a400d2 100644 --- a/src/vs/base/common/product.ts +++ b/src/vs/base/common/product.ts @@ -56,7 +56,7 @@ export type ExtensionVirtualWorkspaceSupport = { export interface IProductConfiguration { readonly version: string; - readonly voidVersion: string; + readonly voidVersion?: string; // Void added this readonly date?: string; readonly quality?: string; readonly commit?: string; diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index 25587fc9..95de9604 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -51,14 +51,13 @@ export const defaultModelsOfProvider = { 'llama-3.1-8b-instant', // 'qwen-2.5-coder-32b', // preview mode (experimental) ], - mistral: [ // https://docs.mistral.ai/getting-started/models/models_overview/ - 'codestral-latest', - 'open-codestral-mamba', - 'mistral-small-latest', - 'mistral-large-latest', - 'ministral-3b-latest', - 'ministral-8b-latest', - ], + // not supporting mistral right now- it's last on Void usage, and a huge pain to set up since it's nonstandard (it supports codestral FIM but it's on v1/fim/completions, etc) + // mistral: [ // https://docs.mistral.ai/getting-started/models/models_overview/ + // 'codestral-latest', + // 'mistral-large-latest', + // 'ministral-3b-latest', + // 'ministral-8b-latest', + // ], openAICompatible: [], // fallback } as const satisfies Record @@ -122,32 +121,6 @@ const modelOptionsDefaults: ModelOptions = { supportsReasoning: false, } -const mistralModelOptions = { - 'codestral-latest': { - contextWindow: 32_000, - maxOutputTokens: 4_096, - cost: { input: 0.00, output: 0.00 }, - supportsFIM: true, - supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', - supportsReasoning: false, - }, - 'mistral-large-latest': { - contextWindow: 32_000, - maxOutputTokens: 4_096, - cost: { input: 0.00, output: 0.00 }, - supportsFIM: false, - supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', - supportsReasoning: false, - } -} as const satisfies { [s: string]: ModelOptions } - -const mistralSettings: ProviderSettings = { - ...mistralModelOptions, - modelOptions: {}, - modelOptionsFallback: (modelName) => extensiveModelFallback(modelName), -} const openSourceModelOptions_assumingOAICompat = { 'deepseekR1': { @@ -162,6 +135,12 @@ const openSourceModelOptions_assumingOAICompat = { supportsTools: false, supportsReasoning: false, }, + 'codestral': { + supportsFIM: true, + supportsSystemMessage: 'system-role', + supportsTools: 'openai-style', + supportsReasoning: false, + }, // llama 'llama3': { supportsFIM: false, @@ -213,9 +192,11 @@ const openSourceModelOptions_assumingOAICompat = { supportsTools: false, supportsReasoning: false, }, - ...mistralModelOptions, } as const satisfies { [s: string]: Partial } + + + const extensiveModelFallback: ProviderSettings['modelOptionsFallback'] = (modelName) => { const toFallback = (opts: Omit): ModelOptions & { modelName: string } => { return { @@ -233,12 +214,16 @@ const extensiveModelFallback: ProviderSettings['modelOptionsFallback'] = (modelN if (modelName.includes('deepseek')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.deepseekCoderV2, contextWindow: 32_000, maxOutputTokens: 4_096, }) if (modelName.includes('llama3')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.llama3, contextWindow: 32_000, maxOutputTokens: 4_096, }) if (modelName.includes('qwen') && modelName.includes('2.5') && modelName.includes('coder')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['qwen2.5coder'], contextWindow: 32_000, maxOutputTokens: 4_096, }) - if (modelName.includes('mistral')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['mistral-large-latest'] }) - if (modelName.includes('codestral')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['codestral-latest'] }) + if (modelName.includes('codestral')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.codestral, contextWindow: 32_000, maxOutputTokens: 4_096, }) if (/\bo1\b/.test(modelName) || /\bo3\b/.test(modelName)) return toFallback(openAIModelOptions['o1']) return toFallback(modelOptionsDefaults) } + + + + + // ---------------- ANTHROPIC ---------------- const anthropicModelOptions = { 'claude-3-7-sonnet-20250219': { // https://docs.anthropic.com/en/docs/about-claude/models/all-models#model-comparison-table @@ -369,13 +354,6 @@ const openAISettings: ProviderSettings = { } } - - - - - - - // ---------------- XAI ---------------- const xAIModelOptions = { 'grok-2': { @@ -577,20 +555,13 @@ const openRouterModelOptions_assumingOpenAICompat = { supportsReasoning: false, }, 'mistralai/codestral-2501': { - ...openSourceModelOptions_assumingOAICompat['codestral-latest'], + ...openSourceModelOptions_assumingOAICompat.codestral, contextWindow: 256_000, maxOutputTokens: null, cost: { input: 0.3, output: 0.9 }, supportsTools: 'openai-style', supportsReasoning: false, }, - 'mistralai/mistral-large-latest': { - ...openSourceModelOptions_assumingOAICompat['mistral-large-latest'], - contextWindow: 256_000, - maxOutputTokens: null, - cost: { input: 0.3, output: 0.9 }, - }, - 'qwen/qwen-2.5-coder-32b-instruct': { ...openSourceModelOptions_assumingOAICompat['qwen2.5coder'], contextWindow: 33_000, @@ -619,6 +590,8 @@ const openRouterSettings: ProviderSettings = { } + + // ---------------- model settings of everything above ---------------- const modelSettingsOfProvider: { [providerName in ProviderName]: ProviderSettings } = { @@ -626,6 +599,7 @@ const modelSettingsOfProvider: { [providerName in ProviderName]: ProviderSetting anthropic: anthropicSettings, xAI: xAISettings, gemini: geminiSettings, + // open source models deepseek: deepseekSettings, groq: groqSettings, @@ -635,7 +609,7 @@ const modelSettingsOfProvider: { [providerName in ProviderName]: ProviderSetting vLLM: vLLMSettings, ollama: ollamaSettings, openAICompatible: openaiCompatible, - mistral: mistralSettings, + // googleVertex: {}, // microsoftAzure: {}, } as const diff --git a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts index 79d2204b..5636790a 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts @@ -43,9 +43,6 @@ export const defaultProviderSettings = { xAI: { apiKey: '' }, - mistral: { - apiKey: '' - }, } as const @@ -147,11 +144,6 @@ export const displayInfoOfProviderName = (providerName: ProviderName): DisplayIn title: 'Grok (xAI)', } } - else if (providerName === 'mistral') { - return { - title: 'Mistral.ai API', - } - } throw new Error(`descOfProviderName: Unknown provider name: "${providerName}"`) @@ -178,8 +170,7 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName providerName === 'groq' ? 'gsk_key...' : providerName === 'openAICompatible' ? 'sk-key...' : providerName === 'xAI' ? 'xai-key...' : - providerName === 'mistral' ? 'key...' : - '', + '', subTextMd: providerName === 'anthropic' ? 'Get your [API Key here](https://console.anthropic.com/settings/keys).' : providerName === 'openAI' ? 'Get your [API Key here](https://platform.openai.com/api-keys).' : @@ -188,9 +179,8 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName providerName === 'gemini' ? 'Get your [API Key here](https://aistudio.google.com/apikey).' : providerName === 'groq' ? 'Get your [API Key here](https://console.groq.com/keys).' : providerName === 'xAI' ? 'Get your [API Key here](https://console.x.ai).' : - providerName === 'mistral' ? 'Get your [API Key here](https://console.mistral.ai/api-keys).' : - providerName === 'openAICompatible' ? undefined : - '', + providerName === 'openAICompatible' ? undefined : + '', isPasswordField: true, } } @@ -298,12 +288,6 @@ export const defaultSettingsOfProvider: SettingsOfProvider = { ...modelInfoOfDefaultModelNames(defaultModelsOfProvider.openAICompatible), _didFillInProviderSettings: undefined, }, - mistral: { // aggregator - ...defaultCustomSettings, - ...defaultProviderSettings.mistral, - ...modelInfoOfDefaultModelNames(defaultModelsOfProvider.mistral), - _didFillInProviderSettings: undefined, - }, ollama: { // aggregator ...defaultCustomSettings, ...defaultProviderSettings.ollama, diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index 087b61b5..abb0bc17 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -6,13 +6,8 @@ import Anthropic from '@anthropic-ai/sdk'; import { Ollama } from 'ollama'; import OpenAI, { ClientOptions } from 'openai'; + import { Model as OpenAIModel } from 'openai/resources/models.js'; - -// Mistral FIM -import { MistralCore } from "@mistralai/mistralai/core.js"; -import { fimComplete } from "@mistralai/mistralai/funcs/fimComplete.js"; -// - import { extractReasoningOnFinalMessage, extractReasoningOnTextWrapper } from '../../common/helpers/extractCodeFromResult.js'; import { LLMChatMessage, LLMFIMMessage, ModelListParams, OllamaModelResponse, OnError, OnFinalMessage, OnText } from '../../common/sendLLMMessageTypes.js'; import { defaultProviderSettings, displayInfoOfProviderName, ModelSelectionOptions, ProviderName, SettingsOfProvider } from '../../common/voidSettingsTypes.js'; @@ -117,16 +112,12 @@ const newOpenAICompatibleSDK = ({ settingsOfProvider, providerName, includeInPay const thisConfig = settingsOfProvider[providerName] return new OpenAI({ baseURL: 'https://api.x.ai/v1', apiKey: thisConfig.apiKey, ...commonPayloadOpts }) } - else if (providerName === 'mistral') { - const thisConfig = settingsOfProvider[providerName] - return new OpenAI({ baseURL: 'https://api.mistral.ai/v1', apiKey: thisConfig.apiKey, ...commonPayloadOpts }) - } else throw new Error(`Void providerName was invalid: ${providerName}.`) } -const _sendOpenAICompatibleFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions, }: SendFIMParams_Internal) => { +const _sendOpenAICompatibleFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, }: SendFIMParams_Internal) => { const { modelName, supportsFIM } = getModelCapabilities(providerName, modelName_) if (!supportsFIM) { if (modelName === modelName_) @@ -148,7 +139,6 @@ const _sendOpenAICompatibleFIM = ({ messages: messages_, onFinalMessage, onError max_tokens: messages.maxTokens, }) .then(async response => { - const fullText = response.choices[0]?.text onFinalMessage({ fullText, fullReasoning: '', anthropicReasoning: null }); }) @@ -158,7 +148,10 @@ const _sendOpenAICompatibleFIM = ({ messages: messages_, onFinalMessage, onError }) } -const _sendOpenAICompatibleChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions, tools: tools_ }: SendChatParams_Internal) => { + + + +const _sendOpenAICompatibleChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, tools: tools_ }: SendChatParams_Internal) => { const { modelName, supportsReasoning, @@ -471,56 +464,6 @@ const sendOllamaFIM = ({ messages: messages_, onFinalMessage, onError, settingsO }) } -//////// MISTRAL //////// -const _sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions }: SendChatParams_Internal) => { - _sendOpenAICompatibleChat({ - messages: messages_, - onText, - onFinalMessage, - onError, - settingsOfProvider, - modelName: modelName_, - _setAborter, - providerName, - aiInstructions, - modelSelectionOptions - }); -} - -const _sendMistralFIM = ({ messages: messages_, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions }: SendFIMParams_Internal) => { - const { modelName, supportsFIM } = getModelCapabilities(providerName, modelName_) - if (!supportsFIM) { - if (modelName === modelName_) - onError({ message: `Model ${modelName} does not support FIM.`, fullError: null }) - else - onError({ message: `Model ${modelName_} (${modelName}) does not support FIM.`, fullError: null }) - return - } - - prepareFIMMessage({ messages: messages_, aiInstructions }) - - const mistral = new MistralCore({ apiKey: settingsOfProvider.mistral.apiKey }) - - fimComplete( - mistral, { - model: modelName, - prompt: messages_.prefix, - suffix: messages_.suffix, - stream: false, - topP: 1, - stop: messages_.stopTokens - }, - ) - .then(async response => { - let content = response?.ok ? response.value.choices?.[0]?.message?.content : ''; - const fullText = typeof content === 'string' ? content : - Array.isArray(content) ? content.map(chunk => chunk.type === 'text' ? chunk.text : '').join('') : ''; - onFinalMessage({ fullText, fullReasoning: '', anthropicReasoning: null }); - }) - .catch(error => { - onError({ message: error + '', fullError: error }); - }) -} type CallFnOfProvider = { @@ -552,6 +495,11 @@ export const sendLLMMessageToProviderImplementation = { sendFIM: null, list: null, }, + // mistral: { + // sendChat: , // TODO + // sendFIM: , // TODO // https://docs.mistral.ai/api/#tag/fim + // list: null, + // }, ollama: { sendChat: (params) => _sendOpenAICompatibleChat(params), sendFIM: sendOllamaFIM, @@ -582,9 +530,30 @@ export const sendLLMMessageToProviderImplementation = { sendFIM: null, list: null, }, - mistral: { - sendChat: (params) => _sendMistralChat(params), - sendFIM: (params) => _sendMistralFIM(params), - list: null, - }, } satisfies CallFnOfProvider + + + + +/* +FIM info (this may be useful in the future with vLLM, but in most cases the only way to use FIM is if the provider explicitly supports it): + +qwen2.5-coder https://ollama.com/library/qwen2.5-coder/blobs/e94a8ecb9327 +<|fim_prefix|>{{ .Prompt }}<|fim_suffix|>{{ .Suffix }}<|fim_middle|> + +codestral https://ollama.com/library/codestral/blobs/51707752a87c +[SUFFIX]{{ .Suffix }}[PREFIX] {{ .Prompt }} + +deepseek-coder-v2 https://ollama.com/library/deepseek-coder-v2/blobs/22091531faf0 +<|fim▁begin|>{{ .Prompt }}<|fim▁hole|>{{ .Suffix }}<|fim▁end|> + +starcoder2 https://ollama.com/library/starcoder2/blobs/3b190e68fefe + + +{{ .Prompt }}{{ .Suffix }} +<|end_of_text|> + +codegemma https://ollama.com/library/codegemma:2b/blobs/48d9a8140749 +<|fim_prefix|>{{ .Prompt }}<|fim_suffix|>{{ .Suffix }}<|fim_middle|> + +*/ diff --git a/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts b/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts index 4372d416..e65fade3 100644 --- a/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts +++ b/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts @@ -71,7 +71,7 @@ export class NativeDialogHandler extends AbstractDialogHandler { async about(): Promise { let version = this.productService.version; - let voidVersion = this.productService.voidVersion || 'Unknown'; + let voidVersion = this.productService.voidVersion; if (this.productService.target) { version = `${version} (${this.productService.target} setup)`; } else if (this.productService.darwinUniversalAssetId) { @@ -82,8 +82,8 @@ export class NativeDialogHandler extends AbstractDialogHandler { const detailString = (useAgo: boolean): string => { return localize({ key: 'aboutDetail', comment: ['Electron, Chromium, Node.js and V8 are product names that need no translation'] }, - "Void : {0}\nVSCode Version: {1}\nCommit: {2}\nDate: {3}\nElectron: {4}\nElectronBuildId: {5}\nChromium: {6}\nNode.js: {7}\nV8: {8}\nOS: {9}", - voidVersion, + "Void Version: {0}\nVSCode Version: {1}\nCommit: {2}\nDate: {3}\nElectron: {4}\nElectronBuildId: {5}\nChromium: {6}\nNode.js: {7}\nV8: {8}\nOS: {9}", + voidVersion || 'Unknown', version, this.productService.commit || 'Unknown', this.productService.date ? `${this.productService.date}${useAgo ? ' (' + fromNow(new Date(this.productService.date), true) + ')' : ''}` : 'Unknown', From 4ad82cff07432a6ebac81d029e8474f6e343a8e1 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Fri, 21 Mar 2025 15:19:07 -0700 Subject: [PATCH 34/36] format --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index de2e014d..d786053c 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "extensions-ci-pr": "node ./node_modules/gulp/bin/gulp.js extensions-ci-pr", "perf": "node scripts/code-perf.js", "update-build-ts-version": "npm install typescript@next && tsc -p ./build/tsconfig.build.json" - }, + }, "dependencies": { "@anthropic-ai/sdk": "^0.39.0", "@floating-ui/react": "^0.27.5", From 4301eb2bb1f52f55151530a6bd9c100abf4fa085 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Fri, 21 Mar 2025 15:21:23 -0700 Subject: [PATCH 35/36] version --- product.json | 1 + 1 file changed, 1 insertion(+) diff --git a/product.json b/product.json index b7b9c269..cea8f170 100644 --- a/product.json +++ b/product.json @@ -1,6 +1,7 @@ { "nameShort": "Void", "nameLong": "Void", + "voidVersion": "1.0.3", "applicationName": "void", "dataFolderName": ".void-editor", "win32MutexName": "voideditor", From e1d16b3de4a7ffafe89d3873555f6d6e71e44bbf Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Fri, 21 Mar 2025 15:23:40 -0700 Subject: [PATCH 36/36] + --- .../workbench/electron-sandbox/parts/dialogs/dialogHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts b/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts index e65fade3..429862fc 100644 --- a/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts +++ b/src/vs/workbench/electron-sandbox/parts/dialogs/dialogHandler.ts @@ -71,7 +71,7 @@ export class NativeDialogHandler extends AbstractDialogHandler { async about(): Promise { let version = this.productService.version; - let voidVersion = this.productService.voidVersion; + let voidVersion = this.productService.voidVersion; // Void added this if (this.productService.target) { version = `${version} (${this.productService.target} setup)`; } else if (this.productService.darwinUniversalAssetId) {