Files
Mofox-Core/docs/integrations/Bedrock.md
Eric-Terminal 2348dc1082 feat: 集成 AWS Bedrock 支持
- 新增 BedrockClient 客户端实现,支持 Converse API
- 支持两种认证方式:IAM 凭证和 IAM 角色
- 支持对话生成、流式输出、工具调用、多模态、文本嵌入
- 添加配置模板和完整文档
- 更新依赖:aioboto3, botocore
2025-12-06 17:26:40 +08:00

261 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AWS Bedrock 集成指南
## 概述
MoFox-Bot 已完全集成 AWS Bedrock支持使用 **Converse API** 统一调用所有 Bedrock 模型,包括:
- Amazon Nova 系列
- Anthropic Claude 3/3.5
- Meta Llama 2/3
- Mistral AI
- Cohere Command
- AI21 Jamba
- Stability AI SDXL
## 配置示例
### 1. 配置 API Provider
`config/model_config.toml` 中添加 Bedrock Provider
```toml
[[api_providers]]
name = "bedrock_us_east"
base_url = "" # Bedrock 不需要 base_url留空即可
api_key = "YOUR_AWS_ACCESS_KEY_ID" # AWS Access Key ID
client_type = "bedrock"
max_retry = 2
timeout = 60
retry_interval = 10
[api_providers.extra_params]
aws_secret_key = "YOUR_AWS_SECRET_ACCESS_KEY" # AWS Secret Access Key
region = "us-east-1" # AWS 区域,默认 us-east-1
```
### 2. 配置模型
在同一文件中添加模型配置:
```toml
# Claude 3.5 Sonnet (Bedrock 跨区推理配置文件)
[[models]]
model_identifier = "us.anthropic.claude-3-5-sonnet-20240620-v1:0"
name = "claude-3.5-sonnet-bedrock"
api_provider = "bedrock_us_east"
price_in = 3.0 # 每百万输入 token 价格USD
price_out = 15.0 # 每百万输出 token 价格USD
force_stream_mode = false
# Amazon Nova Pro
[[models]]
model_identifier = "us.amazon.nova-pro-v1:0"
name = "nova-pro"
api_provider = "bedrock_us_east"
price_in = 0.8
price_out = 3.2
force_stream_mode = false
# Llama 3.1 405B
[[models]]
model_identifier = "us.meta.llama3-2-90b-instruct-v1:0"
name = "llama-3.1-405b-bedrock"
api_provider = "bedrock_us_east"
price_in = 0.00532
price_out = 0.016
force_stream_mode = false
```
## 支持的功能
### ✅ 已实现
- **对话生成**:支持多轮对话,自动处理 system prompt
- **流式输出**:支持流式响应(`force_stream_mode = true`
- **工具调用**:完整支持 Tool Use函数调用
- **多模态**支持图片输入PNG、JPEG、GIF、WebP
- **文本嵌入**:支持 Titan Embeddings 等嵌入模型
- **跨区推理**:支持 Inference Profile`us.anthropic.claude-3-5-sonnet-20240620-v1:0`
### ⚠️ 限制
- **音频转录**Bedrock 不直接支持语音转文字,建议使用 AWS Transcribe
- **System 角色**Bedrock Converse API 将 system 消息单独处理,不计入 messages 列表
- **Tool 角色**:暂不支持 Tool 消息回传(需要用 User 角色模拟)
## 模型 ID 参考
### 推理配置文件(跨区)
| 模型 | Model ID | 区域覆盖 |
|------|----------|----------|
| Claude 3.5 Sonnet | `us.anthropic.claude-3-5-sonnet-20240620-v1:0` | us-east-1, us-west-2 |
| Claude 3 Opus | `us.anthropic.claude-3-opus-20240229-v1:0` | 多区 |
| Nova Pro | `us.amazon.nova-pro-v1:0` | 多区 |
| Llama 3.1 405B | `us.meta.llama3-2-90b-instruct-v1:0` | 多区 |
### 单区基础模型
| 模型 | Model ID | 区域 |
|------|----------|------|
| Claude 3.5 Sonnet | `anthropic.claude-3-5-sonnet-20240620-v1:0` | 单区 |
| Nova Micro | `amazon.nova-micro-v1:0` | us-east-1 |
| Nova Lite | `amazon.nova-lite-v1:0` | us-east-1 |
| Titan Embeddings G1 | `amazon.titan-embed-text-v1` | 多区 |
完整模型列表https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html
## 使用示例
### Python 调用示例
```python
from src.llm_models import get_llm_client
from src.llm_models.payload_content.message import MessageBuilder
# 获取客户端
client = get_llm_client("bedrock_us_east")
# 构建消息
builder = MessageBuilder()
builder.add_user_message("你好,请介绍一下 AWS Bedrock")
# 调用模型
response = await client.get_response(
model_info=get_model_info("claude-3.5-sonnet-bedrock"),
message_list=[builder.build()],
max_tokens=1024,
temperature=0.7
)
print(response.content)
```
### 多模态示例(图片输入)
```python
import base64
builder = MessageBuilder()
builder.add_text_content("这张图片里有什么?")
# 添加图片(支持 JPEG、PNG、GIF、WebP
with open("image.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode()
builder.add_image_content("jpeg", image_data)
builder.set_role_user()
response = await client.get_response(
model_info=get_model_info("claude-3.5-sonnet-bedrock"),
message_list=[builder.build()],
max_tokens=1024
)
```
### 工具调用示例
```python
from src.llm_models.payload_content.tool_option import ToolOption, ToolParam, ParamType
# 定义工具
tool = ToolOption(
name="get_weather",
description="获取指定城市的天气信息",
params=[
ToolParam(
name="city",
param_type=ParamType.String,
description="城市名称",
required=True
)
]
)
# 调用
response = await client.get_response(
model_info=get_model_info("claude-3.5-sonnet-bedrock"),
message_list=messages,
tool_options=[tool],
max_tokens=1024
)
# 检查工具调用
if response.tool_calls:
for call in response.tool_calls:
print(f"工具: {call.name}, 参数: {call.arguments}")
```
## 权限配置
### IAM 策略示例
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream",
"bedrock:Converse",
"bedrock:ConverseStream"
],
"Resource": [
"arn:aws:bedrock:*::foundation-model/*",
"arn:aws:bedrock:*:*:inference-profile/*"
]
}
]
}
```
## 费用优化建议
1. **使用推理配置文件Inference Profile**:自动路由到低成本区域
2. **启用缓存**:对于重复的 system promptBedrock 支持提示词缓存
3. **批量处理**:嵌入任务可批量调用,减少请求次数
4. **监控用量**:通过 `LLMUsageRecorder` 自动记录 token 消耗和费用
## 故障排查
### 常见错误
| 错误 | 原因 | 解决方案 |
|------|------|----------|
| `AccessDeniedException` | IAM 权限不足 | 检查 IAM 策略是否包含 `bedrock:InvokeModel` |
| `ResourceNotFoundException` | 模型 ID 错误或区域不支持 | 验证 model_identifier 和 region 配置 |
| `ThrottlingException` | 超过配额限制 | 增加 retry_interval 或申请提额 |
| `ValidationException` | 请求参数错误 | 检查 messages 格式和 max_tokens 范围 |
### 调试模式
启用详细日志:
```python
from src.common.logger import get_logger
logger = get_logger("Bedrock客户端")
logger.setLevel("DEBUG")
```
## 依赖安装
```bash
pip install aioboto3 botocore
```
或使用项目的 `requirements.txt`
## 参考资料
- [AWS Bedrock 官方文档](https://docs.aws.amazon.com/bedrock/)
- [Converse API 参考](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html)
- [支持的模型列表](https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html)
- [定价计算器](https://aws.amazon.com/bedrock/pricing/)
---
**集成日期**: 2025年12月6日
**状态**: ✅ 生产就绪