← 返回文件中心

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 日核驗