View a markdown version of this page

Gunakan sampling dengan AgentCore gateway Anda - Batu Dasar Amazon AgentCore

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Gunakan sampling dengan AgentCore gateway Anda

Sampling adalah fitur MCP yang memungkinkan server MCP untuk meminta penyelesaian LLM dari klien selama panggilan alat. Hal ini memungkinkan server untuk memanfaatkan kemampuan AI tanpa memerlukan akses langsung ke model bahasa — klien menangani pemanggilan model dan mengembalikan hasilnya. AgentCore Gateway meneruskan permintaan sampling dari target server MCP ke klien Anda, mengganti permintaan id dengan pengenal yang dihasilkan gateway.

Prasyarat

Untuk menggunakan sampling dengan gateway Anda:

  • Sesi diaktifkan (versi 2025-11-25 dan sebelumnya) - Pengambilan sampel memerlukan dukungan sesi. Lihat Menggunakan sesi MCP dengan gateway Anda. Untuk versi 2026-07-28 dan yang lebih baru, Anda tidak perlu menambahkan sessionConfiguration ke gateway Anda, karena versi ini bersifat stateless.

  • Streaming respons diaktifkan (versi 2025-11-25 dan sebelumnya) - Permintaan pengambilan sampel dikirim sebagai potongan SSE selama koneksi terbuka. Set streamingConfiguration.enableResponseStreaming el ke true dalam gateway AndaprotocolConfiguration.mcp. Untuk versi 2026-07-28 dan yang lebih baru, Anda tidak perlu mengaktifkan streaming respons. Versi ini memberikan sampling melalui pola permintaan multi pulang pergi (MRTR) alih-alih permintaan yang diprakarsai server pada aliran respons. Untuk informasi selengkapnya, lihat Per mintaan multi pulang- pergi dalam dokumentasi Model Context Protocol.

  • Jenis target server MCP — Permintaan pengambilan sampel berasal dari target server MCP.

  • Klien menyatakan kemampuan pengambilan sampel — Klien harus menyatakan dukungan untuk pengambilan sampel untuk gateway untuk meneruskan permintaan pengambilan sampel. Untuk versi 2025-11-25 dan sebelumnya, klien menyatakan dukungan ini dalam initialize permintaan. Untuk versi 2026-07-28 dan yang lebih baru, klien mendeklarasikannya untuk setiap permintaan di _meta bidang (io.modelcontextprotocol/clientCapabilities).

Cara kerja sampling

Ketika target server MCP membutuhkan penyelesaian LLM selama eksekusi alat, itu mengirimkan permintaansampling/createMessage. Gateway meneruskan permintaan ini ke klien sebagai peristiwa SSE, menggantikan permintaanid. Klien memanggil model bahasanya dan mengirimkan hasilnya kembali ke gateway, yang meneruskannya ke target.

catatan

Alur yang dijelaskan di sini berlaku untuk versi 2025-11-25 dan sebelumnya, di mana server mengirim sampling/createMessage sebagai permintaan yang diprakarsai server pada aliran SSE terbuka. Untuk versi 2026-07-28 dan yang lebih baru, sampling malah menggunakan pola permintaan multi pulang pergi (MRTR). Server mengembalikan hasil sementara dengan diset resultType el keinput_required. Klien kemudian memberikan penyelesaian pada percobaan ulang permintaan asli. Untuk informasi selengkapnya, lihat Per mintaan multi pulang- pergi dalam dokumentasi Model Context Protocol.

Permintaan pengambilan sampel meliputi:

  • messages— Pesan percakapan untuk dikirim ke model.

  • modelPreferences— Petunjuk opsional tentang kemampuan model yang diinginkan (kecerdasan, kecepatan, biaya).

  • systemPrompt- Prompt sistem opsional untuk model.

  • maxTokens— Jumlah maksimum token yang akan dihasilkan.

Klien merespons dengan:

  • modelModel yang digunakan.

  • role— Selaluassistant.

  • content— Konten yang dihasilkan (teks atau gambar).

catatan

Klien memiliki kontrol penuh atas model mana yang akan digunakan dan bagaimana menangani permintaan. Server modelPreferences adalah petunjuk, bukan persyaratan. Klien juga dapat memodifikasi atau menolak permintaan berdasarkan kebijakannya sendiri.

Aliran pengambilan sampel

  1. Klien mengirim tools/call permintaan dengan Mcp-Session-Id header.

  2. Gateway meneruskan panggilan alat ke target server MCP.

  3. Target membuka aliran SSE dan mengirim sampling/createMessage permintaan.

  4. Gateway meneruskan permintaan sampling ke klien sebagai peristiwa SSE, menggantikan permintaanid.

  5. Klien memanggil model bahasanya dengan pesan yang disediakan.

  6. Klien mengirimkan permintaan baru dengan hasil pengambilan sampel menggunakan permintaan yang sama Mcp-Session-Id dan id dari permintaan gateway.

  7. Gateway meneruskan hasilnya ke target server MCP.

  8. Target melanjutkan pemrosesan dan mengembalikan hasil alat akhir.

  9. Gateway meneruskan hasil akhir ke klien dan menutup aliran.

Panduan untuk pengembang target server MCP

penting

Target server MCP yang mengirim permintaan pengambilan sampel harus membungkus panggilan pengambilan sampel dalam blok try-catch dan menangani kasus di mana klien tidak mendukung pengambilan sampel. Jika klien gateway tidak mendeklarasikan kemampuan sampling, gateway tidak mendeklarasikannya ke target. Jika target tetap mengirimkan permintaan pengambilan sampel, gateway mengembalikan kesalahan -32601 (Metode tidak ditemukan) ke target.

Server harus menerapkan jalur fallback (seperti menggunakan model bawaan atau melewatkan AI-assisted langkah) saat sampling tidak tersedia.

Mengamankan status permintaan (versi 2026-07-28 dan yang lebih baru)

Pada versi 2026-07-28 dan yang lebih baru, sampling menggunakan pola permintaan multi pulang pergi (MRTR), yang membawa buram requestState antara klien Anda dan target server MCP Anda. Mengamankan nilai itu adalah tanggung jawab bersama: gateway mengotorisasi dan meneruskannya tanpa menyimpannya, sementara target server MCP Anda harus memvalidasinya dan mencegah satu pengguna memutar ulang status permintaan pengguna lain. Untuk model tanggung jawab bersama penuh dan panduan perlindungan yang harus diikuti server MCP Anda, lihat Mengam ankan status permintaan untuk elisitasi dan pengambilan sampel dalam pertimbangan target server MCP.

Penanganan kesalahan

Skenario Kesalahan Deskripsi

Klien mengirimkan respons pengambilan sampel ketika tidak ada permintaan pengambilan sampel yang tertunda

JSON-RPC -32600(Permintaan Tidak Valid)

Tidak ada permintaan sampling yang cocok ditemukan untuk sesi ini.

Klien mengirimkan respon sampling dengan id yang tidak cocok dengan permintaan yang tertunda

JSON-RPC -32600(Permintaan Tidak Valid)

idHarus cocok dengan yang dikirim oleh gateway dalam sampling/createMessage permintaan.

Server MCP mengirimkan permintaan sampling tetapi gateway tidak mendeklarasikan dukungan

JSON-RPC -32601(Metode tidak ditemukan)

Kembali ke target server MCP. Lihat Pem ecahan Masalah.

Pemecahan masalah

Kesalahan: “Kesalahan memanggil alat 'sample_tool': Metode tidak ditemukan:" sampling/createMessage

Kesalahan ini terjadi ketika target server MCP mengirimkan permintaan sampling tetapi klien gateway tidak mendeklarasikan kemampuan sampling. Untuk versi 2025-11-25 dan sebelumnya, klien menyatakan kemampuan ini selamainitialize. Untuk versi 2026-07-28 dan yang lebih baru, klien mendeklarasikannya untuk setiap permintaan di _meta lapangan. Gateway mengembalikan kesalahan -32601 (Metode tidak ditemukan) ke target. Target mungkin mengembalikan ini sebagai kesalahan eksekusi alat ke klien.

Untuk menyelesaikan:

  • Jika Anda adalah pengembang server MCP: Tambahkan penanganan kesalahan di sekitar panggilan sampling Anda. Terapkan jalur fallback saat sampling tidak didukung:

    penting

    Anda harus menyertakan related_request_id=ctx.request_context.request_id dalam create_message panggilan Anda. Ini diperlukan agar gateway mengaitkan permintaan pengambilan sampel dengan benar dengan panggilan alat asal. Tanpa itu, sampling tidak akan berfungsi.

    try: result = await ctx.session.create_message( messages=[{"role": "user", "content": {"type": "text", "text": "Summarize this document"}}], max_tokens=500, related_request_id=ctx.request_context.request_id, ) except Exception as e: # Fallback when client doesn't support sampling logger.warning(f"Sampling not supported: {e}") result = fallback_summarization(document)
  • Jika Anda adalah pengembang klien gateway: Untuk versi 2025-11-25 dan yang lebih lama, pastikan klien Anda menyatakan kemampuan pengambilan sampel selamainitialize. Untuk versi 2026-07-28 dan yang lebih baru, deklarasikan untuk setiap permintaan di _meta bidang (io.modelcontextprotocol/clientCapabilities). Contoh berikut menunjukkan initialize deklarasi:

    { "capabilities": { "sampling": {} } }

Sampel Kode

catatan

Klien LangGraph MCP (langchain-mcp-adapters) dan Klien MCP Strands saat ini tidak mendukung pengambilan sampel. Gunakan pendekatan Klien MCP yang ditunjukkan di bawah ini untuk menangani permintaan sampling dari gateway Anda.

contoh
Python requests package (2025-11-25 and earlier)

Pada versi ini, klien menyatakan kemampuan pengambilan sampel selamainitialize, dan permintaan pengambilan sampel tiba sebagai sampling/createMessage permintaan pada aliran SSE terbuka. Atur MCP-Protocol-Version header ke versi yang didukung gateway Anda.

import requests import json import sseclient gateway_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp" headers = { "Content-Type": "application/json", "Accept": "text/event-stream", "Authorization": "Bearer YOUR_ACCESS_TOKEN" } # Step 1: Initialize with sampling capability init_response = requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": "init-request", "method": "initialize", "params": { "protocolVersion": "2025-06-18", "capabilities": {"sampling": {}}, "clientInfo": {"name": "my-agent", "version": "1.0.0"} } }) session_id = init_response.headers["Mcp-Session-Id"] headers["Mcp-Session-Id"] = session_id headers["MCP-Protocol-Version"] = "2025-06-18" # Step 2: Call tool (streaming response) response = requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": "tool-call-1", "method": "tools/call", "params": { "name": "summarizeDocument", "arguments": {"documentId": "doc-789"} } }, stream=True) # Step 3: Process SSE events client = sseclient.SSEClient(response) for event in client.events(): data = json.loads(event.data) if data.get("method") == "sampling/createMessage": sampling_id = data["id"] print(f"Sampling request: {data['params']['messages']}") # Step 4: Invoke your LLM and send result llm_result = invoke_your_model(data["params"]) # Your LLM invocation requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": sampling_id, "result": { "model": "claude-sonnet-4-20250514", "role": "assistant", "content": {"type": "text", "text": llm_result} } }) elif "result" in data: print(f"Tool result: {data['result']}") break
Python requests package (2026-07-28)

Pada versi2026-07-28, sampling menggunakan pola permintaan multi pulang-pergi alih-alih permintaan yang diprakarsai server pada aliran SSE. Klien menyatakan kemampuan pengambilan sampel _meta pada setiap permintaan. Jika alat membutuhkan penyelesaian, responsnya adalah input_required hasil yang berisi sampling/createMessage permintaan masuk inputRequests dan buramrequestState. Klien memanggil modelnya dan mencoba kembali permintaan asli dengan yang baruid, yanginputResponses, dan yang tidak dimodifikasi. requestState Sesi dan initialize jabat tangan tidak digunakan. Gateway Anda supportedVersions harus disertakan2026-07-28.

import requests gateway_url = "https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp" META = { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientInfo": {"name": "my-agent", "version": "1.0.0"}, "io.modelcontextprotocol/clientCapabilities": {"sampling": {}} } headers = { "Content-Type": "application/json", "Accept": "application/json, text/event-stream", "Authorization": "Bearer YOUR_ACCESS_TOKEN", "MCP-Protocol-Version": "2026-07-28", "Mcp-Method": "tools/call", "Mcp-Name": "summarizeDocument" } arguments = {"documentId": "doc-789"} # Step 1: Call the tool, declaring the sampling capability in _meta response = requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": "tool-call-1", "method": "tools/call", "params": {"name": "summarizeDocument", "arguments": arguments, "_meta": META} }).json() result = response["result"] if result.get("resultType") == "input_required": # Step 2: Fulfill each sampling request by invoking your model input_responses = {} for key, input_request in result.get("inputRequests", {}).items(): params = input_request["params"] print(f"Sampling request: {params['messages']}") llm_result = invoke_your_model(params) # Your LLM invocation input_responses[key] = { "model": "claude-sonnet-4-20250514", "role": "assistant", "content": {"type": "text", "text": llm_result} } # Step 3: Retry the tool call with a new id, the input responses, # and the requestState echoed back unmodified retry_params = {"name": "summarizeDocument", "arguments": arguments, "_meta": META, "inputResponses": input_responses} if "requestState" in result: retry_params["requestState"] = result["requestState"] response = requests.post(gateway_url, headers=headers, json={ "jsonrpc": "2.0", "id": "tool-call-2", "method": "tools/call", "params": retry_params }).json() result = response["result"] print(f"Tool result: {result}")
MCP Client
from mcp import ClientSession from mcp.client.streamable_http import streamablehttp_client import asyncio async def sampling_handler(request): """Handle sampling requests from the server by invoking an LLM.""" messages = request.params.messages llm_response = await invoke_your_model(messages, max_tokens=request.params.maxTokens) return { "model": "claude-sonnet-4-20250514", "role": "assistant", "content": {"type": "text", "text": llm_response} } async def use_sampling(url, token): headers = {"Authorization": f"Bearer {token}"} async with streamablehttp_client(url=url, headers=headers) as ( read_stream, write_stream, _ ): async with ClientSession( read_stream, write_stream, sampling_handler=sampling_handler ) as session: await session.initialize() result = await session.call_tool( name="summarizeDocument", arguments={"documentId": "doc-789"} ) print(f"Tool result: {result}") return result asyncio.run(use_sampling( url="https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp", token="YOUR_ACCESS_TOKEN" ))