Amazon Bedrock API:GPT 与 Claude 接入实操
核对 Runtime/Mantle 配置与权限,完成 SDK/HTTP 请求设计,处理流式、错误、费用和数据留存。
本文核验了什么
本文说明通过 Amazon Bedrock 接入 OpenAI GPT 与 Anthropic Claude。官方文档核验日期为 2026 年 10 月 17 日;示例未向真实云端 API 发送,不代表任何账号已取得模型访问、配额或部署批准。
可执行示例中的凭据、区域、模型/推理配置和账号值均由占位符或环境变量提供。使用前由账号管理员在 Bedrock 控制台及当前模型卡核对。凭据仅在服务端使用,通过获准秘密存储或工作负载身份提供,不能放入浏览器代码、截图或日志。
1. 先选完整连接配置
端点、API、模型标识和区域必须一起确定。只改 base URL 可能导致请求无效,也可能改变数据处理位置。新应用在功能满足时,AWS 建议优先使用 Runtime。
| 路径 | SDK base URL | 当前 AWS 模型卡中的标识示例 |
|---|---|---|
| GPT-6.1 Sol,Runtime Responses/Chat | https://bedrock-runtime.{region}.amazonaws.com/openai/v1 |
us.openai.gpt-6.1-sol 或 global.openai.gpt-6.1-sol,源区域须受支持 |
| GPT-6.1 Sol,Mantle Responses/Chat | https://bedrock-mantle.us-east-1.api.aws/openai/v1 |
openai.gpt-6.1-sol,弗吉尼亚北部区内调用 |
| Claude Sonnet 5,Runtime Messages | https://bedrock-runtime.{region}.amazonaws.com/anthropic |
us.anthropic.claude-sonnet-5、其他受支持地理配置或 global.anthropic.claude-sonnet-5 |
| Claude Sonnet 5,Mantle Messages | https://bedrock-mantle.{region}.api.aws/anthropic |
anthropic.claude-sonnet-5,须核对对应 Mantle 区域 |
表内是文档标识示例,不是账号可用证明。GPT-6.1 Sol 和 Claude Sonnet 5 在 Runtime 上不支持直接区内调用,应使用受支持推理配置。地理与全球路由的数据处理范围不同,必须核对源区域和目标区域,不能把接入端点所在地当成实际处理地。
Bedrock 同时支持专有 GPT 与开放权重 gpt-oss,它们并非同一模型系列,不能共用全部配置。GPT OSS 在 Runtime 支持 Chat Completions、Converse 和 Invoke,其 Responses 需要 Mantle。Mantle 路径前缀也因模型而异:GPT-6.1 Sol 使用 /openai/v1,部分模型使用 /v1,以具体模型卡的 Programmatic Access 为准。
2. 准备访问与最小权限
确认 AWS 账号、受支持区域、付款与条款前提、模型可用性。部分第三方模型启用需要 AWS Marketplace 权限,可由管理员一次启用,无须给每个运行调用者订阅权限。完成启用后,不同账号仍可能具有不同的额外访问条件。
Anthropic 首次通过 Runtime 使用需要用途表单;当前模型访问文档说明 Mantle 路径不受这一要求约束。启用成功但调用仍被拒时,应核对协议状态,不能通过切换未批准账号或地区绕过问题。
认证不等于授权。Runtime 推理需要 bedrock:InvokeModel,流式需要 bedrock:InvokeModelWithResponseStream。Runtime Responses 还会授权账号默认 Project;读取、取消和删除已存响应各有权限。Mantle 推理使用 bedrock-mantle:CreateInference。策略应限制实际目标,并检查推理配置目标地区和组织策略。
生产优先采用受支持的 AWS 凭据链签名或短期 Bedrock bearer 凭据。Bedrock API key 不是 OpenAI/Anthropic 直连密钥。短期 key 继承 IAM 权限且会过期;长期 key 面向探索且受生成区域限制。不要打印生成 token。以下示例假定已有获授权的服务端环境。
3. OpenAI SDK 的最小 GPT 请求
在应用环境安装 OpenAI SDK,通过获准配置流程提供 BEDROCK_BASE_URL、BEDROCK_MODEL_ID 和 AWS_BEARER_TOKEN_BEDROCK。Runtime 的模型值是核验过的推理配置,Mantle 则是核验过的模型 ID,不能任填 OpenAI 直连模型名。
import os
from openai import OpenAI
# Replace environment placeholders after checking the console/model card.
client = OpenAI(
base_url=os.environ["BEDROCK_BASE_URL"],
api_key=os.environ["AWS_BEARER_TOKEN_BEDROCK"],
)
response = client.responses.create(
model=os.environ["BEDROCK_MODEL_ID"],
input="Explain the difference between input and output tokens.",
max_output_tokens=512,
store=False,
)
print(response.output_text)
对应 HTTP 契约为 POST <BEDROCK_BASE_URL>/responses,请求头是 Content-Type: application/json 与 Authorization: Bearer <BEDROCK_API_KEY>,JSON 正文包含 model、input、max_output_tokens 和 store:
# Replace the model placeholder; BASE_URL/key must already be configured securely.
curl --fail-with-body "$BEDROCK_BASE_URL/responses" \
-H "Authorization: Bearer $AWS_BEARER_TOKEN_BEDROCK" \
-H "Content-Type: application/json" \
--data '{"model":"<VERIFIED_MODEL_OR_PROFILE_ID>","input":"Say hello.","max_output_tokens":512,"store":false}'
Chat Completions 使用 /chat/completions、messages 数组,并读取 choices[].message。不能把 Responses 的 input 正文直接发给 Chat。GPT-6.1 Sol 工具调用应按当前 Responses 支持设计,不能假定 Chat 契约完全相同。
4. 流式响应是事件协议
GPT Responses 设置 stream=True,文本使用 response.output_text.delta 事件,response.completed 表示完成。应处理错误、失败、未完成以及连接提前结束,收到首个 token 不代表任务成功。
# Uses the same verified client and model configuration as the previous example.
completed = False
for event in client.responses.create(
model=os.environ["BEDROCK_MODEL_ID"],
input="Explain token budgeting briefly.",
max_output_tokens=512, store=False, stream=True,
):
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
elif event.type == "response.completed":
completed = True
elif event.type in {"error", "response.failed", "response.incomplete"}:
raise RuntimeError("Generation did not complete")
if not completed:
raise RuntimeError("Stream ended without completion")
Chat Completions 是 choices[].delta 片段,Claude Messages 使用内容块事件,AWS ConverseStream 又是不同的 AWS 事件结构。解析器必须对应实际 API。原始 HTTP 流式设置 "stream":true 并使用能够解析 SSE 的客户端;curl -N 只关闭显示缓冲,不能完成故障恢复。
5. Claude:原生 Messages 或 Bedrock Invoke/Converse
Anthropic SDK 的 base URL 以 /anthropic 结尾,SDK 加上 /v1/messages。Runtime 和 Mantle 均可为受支持 Claude 提供该路由。
import os
from anthropic import Anthropic
# BASE_URL ends in /anthropic; MODEL_ID is verified for this endpoint/Region.
claude = Anthropic(
base_url=os.environ["BEDROCK_ANTHROPIC_BASE_URL"],
api_key=os.environ["AWS_BEARER_TOKEN_BEDROCK"],
)
with claude.messages.stream(
model=os.environ["BEDROCK_CLAUDE_MODEL_ID"],
max_tokens=512,
messages=[{"role":"user", "content":"Explain token budgeting briefly."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final_message = stream.get_final_message()
原生 HTTP 是 POST <.../anthropic>/v1/messages,使用 x-api-key: <BEDROCK_API_KEY>、anthropic-version: 2023-06-01,正文含 model、messages、max_tokens 和可选 stream。
若使用 boto3 invoke_model,模型/推理配置放在 modelId 参数,JSON 正文必须包含 "anthropic_version":"bedrock-2023-05-31"。这个正文字段不是原生 Messages 的 HTTP 版本头。Converse 又使用 messages[].content[].text 等格式,不能互换请求体。
import json, os, boto3
# The approved AWS credential chain supplies signing credentials; no embedded keys.
runtime = boto3.client("bedrock-runtime", region_name=os.environ["AWS_REGION"])
result = runtime.invoke_model(
modelId=os.environ["BEDROCK_CLAUDE_MODEL_ID"],
contentType="application/json", accept="application/json",
body=json.dumps({
"anthropic_version":"bedrock-2023-05-31",
"max_tokens":512,
"messages":[{"role":"user", "content":"Say hello."}],
}),
)
body = json.loads(result["body"].read())
print(body["content"])
6. 按故障层排查
| 现象 | 先核对 | 处置 |
|---|---|---|
| 400 或路由/模型不支持 | 路径前缀、API 正文、推理配置及功能支持 | 修正配置后再重试 |
| 403/AccessDenied | IAM、Project、Marketplace/协议、用途表单及账号访问 | 由管理员处理权限或启用条件 |
| 凭据无效、过期或区域范围错误 | 过期时间、凭据区域、签名上下文 | 通过获准身份路径刷新 |
| 429/限流 | 账号与模型配额、并发和合计 token 需求 | 降低负载,有限指数退避加随机抖动 |
| 503/529 容量繁忙 | 服务容量、响应头与服务状态 | 有限退避,返回 Retry-After 时遵守 |
| 超时或流提前断开 | 客户端/代理期限、网络空闲超时、终止事件 | 标记未完成,检查结果后决定重试 |
记录请求标识、时间、端点、模型/推理配置、状态和脱敏用量,默认不记录凭据或完整敏感提示词。限制重试次数与总耗时;响应丢失不能证明没有 token 消耗。工具触发的业务写入需要独立操作标识和重复保护。
7. 估算费用并评审数据处理
采用 AWS 对精确模型、路由选项和服务层级的价格。分别计算计费输入、输出、缓存读取和写入,再加入实际使用的检索、嵌入、存储、网络及工具资源。如果缓存类别已经包含在总量中,不能重复计费。GPT-6.1 Sol 有专门的长上下文阈值、缓存费率和 Standard/Ultrafast 价格,不能未经条件核对就把 OpenAI 直连价格写成 AWS 报价。
Responses 默认 store:true,保留会话输入和输出 30 天。本文示例选择 store:false,因此不能通过 previous_response_id 续接。应用日志与调用日志须另行评审。Runtime 跨区域推理的已存响应位于实际处理区域,可能不同于源区域。
Runtime Responses 每次必须给出 model,只支持默认 Project,拒绝 background:true,且不支持应用推理配置。Runtime 不提供 OpenAI 兼容 GET /models,模型发现应使用 Bedrock 控制面和模型卡。Mantle 的功能与留存行为另行核对。
具体模型限制优先于笼统兼容假设。GPT-6.1 Sol 卡说明 Responses 不支持集成 Guardrails,并列出其他不支持功能;Claude 结构化输出也因 API/端点不同而变化。不能宣称 SDK 兼容调用自动具备所有 Bedrock 控制。
生产前验证获权请求、无权请求、不支持配置、完整流式以及模拟依赖故障,交付脱敏证据、用量观察和回退配置。本文基于文档,不宣称完成真实账号或云端端到端验收。