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 控制。
正式環境前驗證獲權請求、無權請求、不支援設定、完整串流以及模擬依賴故障,交付脫敏證據、用量觀察和回退設定。本文基於文件,不宣稱完成真實帳號或雲端端到端驗收。