From 5995591296d7464afa2c041fe5ae873f16ac346a Mon Sep 17 00:00:00 2001 From: vrtnis <123119434+vrtnis@users.noreply.github.com> Date: Tue, 20 May 2025 01:36:16 +0000 Subject: [PATCH 1/2] feat(void): add Bedrock provider in onboarding + type updates --- .../src/void-onboarding/VoidOnboarding.tsx | 2 +- .../contrib/void/common/modelCapabilities.ts | 20 +++++++++++++ .../contrib/void/common/voidSettingsTypes.ts | 20 +++++++++++-- .../llmMessage/sendLLMMessage.impl.ts | 29 +++++++++++++++++++ 4 files changed, 67 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index d16ebefd..9ac3645c 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -100,7 +100,7 @@ const tabNames = ['Free', 'Paid', 'Local'] as const; type TabName = typeof tabNames[number] | 'Cloud/Other'; // Data for cloud providers tab -const cloudProviders: ProviderName[] = ['googleVertex', 'liteLLM', 'microsoftAzure', 'openAICompatible']; +const cloudProviders: ProviderName[] = ['googleVertex', 'liteLLM', 'microsoftAzure', 'awsBedrock', 'openAICompatible']; // Data structures for provider tabs const providerNamesOfTab: Record = { diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index 49b38b84..a1785022 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -60,6 +60,12 @@ export const defaultProviderSettings = { apiKey: '', azureApiVersion: '2024-05-01-preview', }, + awsBedrock: { + apiKey: '', + region: 'us-east-1', // add region setting + endpoint: '', // optionally allow overriding default + }, + } as const @@ -136,6 +142,7 @@ export const defaultModelsOfProvider = { openAICompatible: [], // fallback googleVertex: [], microsoftAzure: [], + awsBedrock: [], liteLLM: [], @@ -1028,6 +1035,18 @@ const microsoftAzureSettings: VoidStaticProviderInfo = { }, } +// ---------------- AWS BEDROCK ---------------- +const awsBedrockModelOptions = { +} as const satisfies Record + +const awsBedrockSettings: VoidStaticProviderInfo = { + modelOptions: awsBedrockModelOptions, + modelOptionsFallback: (modelName) => { return null }, + providerReasoningIOSettings: { + input: { includeInPayload: openAICompatIncludeInPayloadReasoning }, + }, +} + // ---------------- VLLM, OLLAMA, OPENAICOMPAT (self-hosted / local) ---------------- const ollamaModelOptions = { @@ -1333,6 +1352,7 @@ const modelSettingsOfProvider: { [providerName in ProviderName]: VoidStaticProvi googleVertex: googleVertexSettings, microsoftAzure: microsoftAzureSettings, + awsBedrock: awsBedrockSettings, } as const diff --git a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts index a911dfe6..55c4f81e 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts @@ -103,6 +103,9 @@ export const displayInfoOfProviderName = (providerName: ProviderName): DisplayIn else if (providerName === 'microsoftAzure') { return { title: 'Microsoft Azure OpenAI', } } + else if (providerName === 'awsBedrock') { + return { title: 'AWS Bedrock', } + } throw new Error(`descOfProviderName: Unknown provider name: "${providerName}"`) } @@ -120,6 +123,7 @@ export const subTextMdOfProviderName = (providerName: ProviderName): string => { if (providerName === 'openAICompatible') return `Use any provider that's OpenAI-compatible (use this for llama.cpp and more).` if (providerName === 'googleVertex') return 'You must authenticate before using Vertex with Void. Read more about endpoints [here](https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/call-vertex-using-openai-library), and regions [here](https://cloud.google.com/vertex-ai/docs/general/locations#available-regions).' if (providerName === 'microsoftAzure') return 'Read more about endpoints [here](https://learn.microsoft.com/en-us/rest/api/aifoundry/model-inference/get-chat-completions/get-chat-completions?view=rest-aifoundry-model-inference-2024-05-01-preview&tabs=HTTP), and get your API key [here](https://learn.microsoft.com/en-us/azure/search/search-security-api-keys?tabs=rest-use%2Cportal-find%2Cportal-query#find-existing-keys).' + if (providerName === 'awsBedrock') return 'Connect via a LiteLLM proxy or the AWS [Bedrock-Access-Gateway](https://github.com/aws-samples/bedrock-access-gateway). LiteLLM Bedrock setup docs are [here](https://docs.litellm.ai/docs/providers/bedrock).' if (providerName === 'ollama') return 'Read more about custom [Endpoints here](https://github.com/ollama/ollama/blob/main/docs/faq.md#how-can-i-expose-ollama-on-my-network).' if (providerName === 'vLLM') return 'Read more about custom [Endpoints here](https://docs.vllm.ai/en/latest/getting_started/quickstart.html#openai-compatible-server).' if (providerName === 'lmStudio') return 'Read more about custom [Endpoints here](https://lmstudio.ai/docs/app/api/endpoints/openai).' @@ -165,14 +169,16 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName providerName === 'googleVertex' ? 'baseURL' : providerName === 'microsoftAzure' ? 'baseURL' : providerName === 'liteLLM' ? 'baseURL' : - '(never)', + providerName === 'awsBedrock' ? 'Endpoint' : + '(never)', placeholder: providerName === 'ollama' ? defaultProviderSettings.ollama.endpoint : providerName === 'vLLM' ? defaultProviderSettings.vLLM.endpoint : providerName === 'openAICompatible' ? 'https://my-website.com/v1' : providerName === 'lmStudio' ? defaultProviderSettings.lmStudio.endpoint : providerName === 'liteLLM' ? 'http://localhost:4000' - : '(never)', + : providerName === 'awsBedrock' ? 'http://localhost:4000/v1' + : '(never)', } @@ -185,7 +191,9 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName return { title: 'Region', placeholder: providerName === 'googleVertex' ? defaultProviderSettings.googleVertex.region - : '' + : providerName === 'awsBedrock' + ? defaultProviderSettings.awsBedrock.region + : '' } } else if (settingName === 'azureApiVersion') { @@ -340,6 +348,12 @@ export const defaultSettingsOfProvider: SettingsOfProvider = { ...modelInfoOfDefaultModelNames(defaultModelsOfProvider.microsoftAzure), _didFillInProviderSettings: undefined, }, + awsBedrock: { // aggregator (serves models from multiple providers) + ...defaultCustomSettings, + ...defaultProviderSettings.awsBedrock, + ...modelInfoOfDefaultModelNames(defaultModelsOfProvider.awsBedrock), + _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 1190b283..89fb5a87 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,6 +121,29 @@ const newOpenAICompatibleSDK = async ({ settingsOfProvider, providerName, includ const options = { endpoint, apiKey: thisConfig.apiKey, apiVersion }; return new AzureOpenAI({ ...options, ...commonPayloadOpts }); } + else if (providerName === 'awsBedrock') { + /** + * We treat Bedrock as *OpenAI-compatible only through a proxy*: + * • LiteLLM default → http://localhost:4000/v1 + * • Bedrock-Access-Gateway → https://.execute-api..amazonaws.com/openai/ + * + * The native Bedrock runtime endpoint + * https://bedrock-runtime..amazonaws.com + * is **NOT** OpenAI-compatible, so we do *not* fall back to it here. + */ + const { endpoint, apiKey } = settingsOfProvider.awsBedrock + + // ① use the user-supplied proxy if present + // ② otherwise default to local LiteLLM + let baseURL = endpoint || 'http://localhost:4000/v1' + + // Normalize: make sure we end with “/v1” + if (!baseURL.endsWith('/v1')) + baseURL = baseURL.replace(/\/+$/, '') + '/v1' + + return new OpenAI({ baseURL, apiKey, ...commonPayloadOpts }) + } + else if (providerName === 'deepseek') { const thisConfig = settingsOfProvider[providerName] @@ -907,6 +930,12 @@ export const sendLLMMessageToProviderImplementation = { sendFIM: null, list: null, }, + awsBedrock: { + sendChat: (params) => _sendOpenAICompatibleChat(params), + sendFIM: null, + list: null, + }, + } satisfies CallFnOfProvider From 27c40d84288dd3d08de213e26b0208cf74e4d938 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Fri, 30 May 2025 00:28:22 -0700 Subject: [PATCH 2/2] key --- src/vs/workbench/contrib/void/common/voidSettingsTypes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts index 55c4f81e..778887a8 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts @@ -155,7 +155,8 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName providerName === 'mistral' ? 'api-key...' : providerName === 'googleVertex' ? 'AIzaSy...' : providerName === 'microsoftAzure' ? 'key-...' : - '', + providerName === 'awsBedrock' ? 'key-...' : + '', isPasswordField: true, }