Feat: bedrock iam authentication (#12020)

### What problem does this PR solve?

Feat: bedrock iam authentication #12008 

### Type of change

- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
Magicbook1108
2025-12-18 17:13:09 +08:00
committed by GitHub
parent 151480dc85
commit e84d5412bc
7 changed files with 28 additions and 25 deletions

View File

@ -1626,11 +1626,13 @@ class LiteLLMBase(ABC):
elif self.provider == SupportedLiteLLMProvider.Bedrock: elif self.provider == SupportedLiteLLMProvider.Bedrock:
completion_args.pop("api_key", None) completion_args.pop("api_key", None)
completion_args.pop("api_base", None) completion_args.pop("api_base", None)
bedrock_credentials = { "aws_region_name": self.bedrock_region }
if self.bedrock_ak and self.bedrock_sk:
bedrock_credentials["aws_access_key_id"] = self.bedrock_ak
bedrock_credentials["aws_secret_access_key"] = self.bedrock_sk
completion_args.update( completion_args.update(
{ {
"aws_access_key_id": self.bedrock_ak, "bedrock_credentials": bedrock_credentials,
"aws_secret_access_key": self.bedrock_sk,
"aws_region_name": self.bedrock_region,
} }
) )
elif self.provider == SupportedLiteLLMProvider.OpenRouter: elif self.provider == SupportedLiteLLMProvider.OpenRouter:

View File

@ -471,9 +471,10 @@ class BedrockEmbed(Base):
self.is_amazon = self.model_name.split(".")[0] == "amazon" self.is_amazon = self.model_name.split(".")[0] == "amazon"
self.is_cohere = self.model_name.split(".")[0] == "cohere" self.is_cohere = self.model_name.split(".")[0] == "cohere"
if self.bedrock_ak == "" or self.bedrock_sk == "" or self.bedrock_region == "": if self.bedrock_ak == "" or self.bedrock_sk == "":
# Try to create a client using the default credentials (AWS_PROFILE, AWS_DEFAULT_REGION, etc.) # Try to create a client using the default credentials if ak/sk are not provided.
self.client = boto3.client("bedrock-runtime") # Must provide a region.
self.client = boto3.client("bedrock-runtime", region_name=self.bedrock_region)
else: else:
self.client = boto3.client(service_name="bedrock-runtime", region_name=self.bedrock_region, aws_access_key_id=self.bedrock_ak, aws_secret_access_key=self.bedrock_sk) self.client = boto3.client(service_name="bedrock-runtime", region_name=self.bedrock_region, aws_access_key_id=self.bedrock_ak, aws_secret_access_key=self.bedrock_sk)

View File

@ -144,7 +144,7 @@ export const APIMapUrl = {
[LLMFactory.BaiduYiYan]: 'https://wenxin.baidu.com/user/key', [LLMFactory.BaiduYiYan]: 'https://wenxin.baidu.com/user/key',
[LLMFactory.Meituan]: 'https://longcat.chat/platform/api_keys', [LLMFactory.Meituan]: 'https://longcat.chat/platform/api_keys',
[LLMFactory.Bedrock]: [LLMFactory.Bedrock]:
'https://us-east-2.console.aws.amazon.com/bedrock/home#/api-keys', 'https://us-east-1.console.aws.amazon.com/iam/home?region=us-east-2#/users',
[LLMFactory.AzureOpenAI]: [LLMFactory.AzureOpenAI]:
'https://portal.azure.com/#create/Microsoft.CognitiveServicesOpenAI', 'https://portal.azure.com/#create/Microsoft.CognitiveServicesOpenAI',
[LLMFactory.OpenRouter]: 'https://openrouter.ai/keys', [LLMFactory.OpenRouter]: 'https://openrouter.ai/keys',

View File

@ -785,6 +785,8 @@ This auto-tagging feature enhances retrieval by adding another layer of domain-s
}, },
setting: { setting: {
deleteModel: 'Delete model', deleteModel: 'Delete model',
bedrockCredentialsHint:
'Tip: Leave Access Key / Secret Key blank to use AWS IAM authentication.',
modelEmptyTip: modelEmptyTip:
'No models available. <br>Please add models from the panel on the right.', 'No models available. <br>Please add models from the panel on the right.',
sourceEmptyTip: 'No data sources added yet. Select one below to connect.', sourceEmptyTip: 'No data sources added yet. Select one below to connect.',

View File

@ -544,6 +544,8 @@ export default {
avatar: '头像', avatar: '头像',
avatarTip: '這會在你的個人主頁展示', avatarTip: '這會在你的個人主頁展示',
profileDescription: '在此更新您的照片和個人詳細信息。', profileDescription: '在此更新您的照片和個人詳細信息。',
bedrockCredentialsHint:
'提示Access Key / Secret Key 可留空,以啟用 AWS IAM 自動驗證。',
maxTokens: '最大token數', maxTokens: '最大token數',
maxTokensMessage: '最大token數是必填項', maxTokensMessage: '最大token數是必填項',
maxTokensTip: maxTokensTip:

View File

@ -51,6 +51,8 @@ export default {
search: '搜索', search: '搜索',
noDataFound: '没有找到数据。', noDataFound: '没有找到数据。',
noData: '暂无数据', noData: '暂无数据',
bedrockCredentialsHint:
'提示Access Key / Secret Key 可留空,以启用 AWS IAM 自动验证。',
promptPlaceholder: '请输入或使用 / 快速插入变量。', promptPlaceholder: '请输入或使用 / 快速插入变量。',
selected: '已选择', selected: '已选择',
}, },

View File

@ -1,7 +1,7 @@
import { useTranslate } from '@/hooks/common-hooks'; import { useTranslate } from '@/hooks/common-hooks';
import { IModalProps } from '@/interfaces/common'; import { IModalProps } from '@/interfaces/common';
import { IAddLlmRequestBody } from '@/interfaces/request/llm'; import { IAddLlmRequestBody } from '@/interfaces/request/llm';
import { Flex, Form, Input, InputNumber, Modal, Select, Space } from 'antd'; import { Form, Input, InputNumber, Modal, Select, Typography } from 'antd';
import { useMemo } from 'react'; import { useMemo } from 'react';
import { LLMHeader } from '../../components/llm-header'; import { LLMHeader } from '../../components/llm-header';
import { BedrockRegionList } from '../../constant'; import { BedrockRegionList } from '../../constant';
@ -13,6 +13,7 @@ type FieldType = IAddLlmRequestBody & {
}; };
const { Option } = Select; const { Option } = Select;
const { Text } = Typography;
const BedrockModal = ({ const BedrockModal = ({
visible, visible,
@ -43,25 +44,18 @@ const BedrockModal = ({
return ( return (
<Modal <Modal
title={<LLMHeader name={llmFactory} />} title={
<div>
<LLMHeader name={llmFactory} />
<Text type="secondary" style={{ display: 'block', marginTop: 4 }}>
{t('bedrockCredentialsHint')}
</Text>
</div>
}
open={visible} open={visible}
onOk={handleOk} onOk={handleOk}
onCancel={hideModal} onCancel={hideModal}
okButtonProps={{ loading }} okButtonProps={{ loading }}
footer={(originNode: React.ReactNode) => {
return (
<Flex justify={'space-between'}>
<a
href="https://console.aws.amazon.com/"
target="_blank"
rel="noreferrer"
>
{t('ollamaLink', { name: llmFactory })}
</a>
<Space>{originNode}</Space>
</Flex>
);
}}
> >
<Form <Form
name="basic" name="basic"
@ -91,14 +85,14 @@ const BedrockModal = ({
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addBedrockEngineAK')} label={t('addBedrockEngineAK')}
name="bedrock_ak" name="bedrock_ak"
rules={[{ required: true, message: t('bedrockAKMessage') }]} rules={[{ message: t('bedrockAKMessage') }]}
> >
<Input placeholder={t('bedrockAKMessage')} /> <Input placeholder={t('bedrockAKMessage')} />
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addBedrockSK')} label={t('addBedrockSK')}
name="bedrock_sk" name="bedrock_sk"
rules={[{ required: true, message: t('bedrockSKMessage') }]} rules={[{ message: t('bedrockSKMessage') }]}
> >
<Input placeholder={t('bedrockSKMessage')} /> <Input placeholder={t('bedrockSKMessage')} />
</Form.Item> </Form.Item>