diff --git a/src/main/presenter/llmProviderPresenter/providers/awsBedrockProvider.ts b/src/main/presenter/llmProviderPresenter/providers/awsBedrockProvider.ts index 72c500728..05a9609ae 100644 --- a/src/main/presenter/llmProviderPresenter/providers/awsBedrockProvider.ts +++ b/src/main/presenter/llmProviderPresenter/providers/awsBedrockProvider.ts @@ -23,7 +23,7 @@ import { Usage } from '@anthropic-ai/sdk/resources/messages' export class AwsBedrockProvider extends BaseLLMProvider { private bedrock!: BedrockClient private bedrockRuntime!: BedrockRuntimeClient - private defaultModel = 'claude-3-7-sonnet-20250219' + private defaultModel = 'anthropic.claude-3-5-sonnet-20240620-v1:0' constructor(provider: AWS_BEDROCK_PROVIDER, configPresenter: ConfigPresenter) { super(provider, configPresenter) @@ -43,10 +43,8 @@ export class AwsBedrockProvider extends BaseLLMProvider { provider.credential?.secretAccessKey || process.env.BEDROCK_SECRET_ACCESS_KEY const region = provider.credential?.region || process.env.BEDROCK_REGION - if (!accessKeyId || !secretAccessKey) { - throw new Error( - 'apiKey must be provided as "${ACCESS_KEY_ID}:${SECRET_ACCESS_KEY}" format.' - ) + if (!accessKeyId || !secretAccessKey || !region) { + throw new Error('Access Key Id, Secret Access Key and Region are all needed.') } this.bedrock = new BedrockClient({ @@ -68,19 +66,18 @@ export class AwsBedrockProvider extends BaseLLMProvider { protected async fetchProviderModels(): Promise { try { + const region = await this.bedrock.config.region() const command = new ListFoundationModelsCommand({}) const response = await this.bedrock.send(command) const models = response.modelSummaries return ( models - ?.filter((m) => m.modelId?.includes('anthropic.claude')) + ?.filter((m) => m.modelId && /^anthropic.claude-[a-z0-9\-]+(:\d+)$/g.test(m.modelId)) ?.filter((m) => m.modelLifecycle?.status === 'ACTIVE') + ?.filter((m) => m.inferenceTypesSupported && m.inferenceTypesSupported.length > 0) .map((m) => ({ - // id: m.modelId!, - // id: m.modelArn!, - id: `${m.inferenceTypesSupported?.includes('ON_DEMAND') ? m.modelId! : `us.${m.modelId}`}`, - // name: `${m.modelName} (${m.modelId})`, + id: `${m.inferenceTypesSupported?.includes('ON_DEMAND') ? m.modelId! : `${region.split('-')[0]}.${m.modelId}`}`, name: m.modelId?.replace('anthropic.', '') || '', providerId: this.provider.id, maxTokens: 64_000, diff --git a/src/renderer/src/components/settings/BedrockProviderSettingsDetail.vue b/src/renderer/src/components/settings/BedrockProviderSettingsDetail.vue index 79f785c72..a0408e6ac 100644 --- a/src/renderer/src/components/settings/BedrockProviderSettingsDetail.vue +++ b/src/renderer/src/components/settings/BedrockProviderSettingsDetail.vue @@ -9,6 +9,7 @@ + + + + + + +

{{ t('settings.provider.bedrockVerifyTip') }}

+
+
+
{{ t('settings.provider.bedrockLimitTip') }}
@@ -98,6 +110,7 @@ import { ScrollArea } from '@/components/ui/scroll-area' import { Label } from '@/components/ui/label' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip' import { Icon } from '@iconify/vue' import ProviderModelManager from './ProviderModelManager.vue' import ProviderDialogContainer from './ProviderDialogContainer.vue' @@ -204,27 +217,23 @@ const validateCredential = async () => { const resp = await settingsStore.checkProvider(props.provider.id) if (resp.isOk) { console.log('验证成功') - // checkResult.value = true + checkResult.value = true showCheckModelDialog.value = true // 验证成功后刷新当前provider的模型列表 await settingsStore.refreshProviderModels(props.provider.id) } else { console.log('验证失败', resp.errorMsg) - // checkResult.value = false + checkResult.value = false showCheckModelDialog.value = true } } catch (error) { console.error('Failed to validate credential:', error) - // checkResult.value = false + checkResult.value = false showCheckModelDialog.value = true } } const handleVerifyCredential = async (updates: Partial) => { - // const inputElement = document.getElementById(`${props.provider.id}-apikey`) - // if (inputElement) { - // inputElement.blur() - // } await settingsStore.updateAwsBedrockProviderConfig(props.provider.id, updates) await validateCredential() } diff --git a/src/renderer/src/components/settings/ModelProviderSettings.vue b/src/renderer/src/components/settings/ModelProviderSettings.vue index b76c84225..038ed046d 100644 --- a/src/renderer/src/components/settings/ModelProviderSettings.vue +++ b/src/renderer/src/components/settings/ModelProviderSettings.vue @@ -138,7 +138,7 @@ @auth-error="handleAnthropicAuthError" />