← 返回文档中心

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 控制。

生产前验证获权请求、无权请求、不支持配置、完整流式以及模拟依赖故障,交付脱敏证据、用量观察和回退配置。本文基于文档,不宣称完成真实账号或云端端到端验收。

官方资料:2026 年 10 月 17 日核验