View a markdown version of this page

Usa il campionamento con il tuo gateway AgentCore - Fondamento Amazon AgentCore

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Usa il campionamento con il tuo gateway AgentCore

Il campionamento è una funzionalità MCP che consente a un server MCP di richiedere il completamento di un LLM dal client durante una chiamata allo strumento. Ciò consente ai server di sfruttare le funzionalità di intelligenza artificiale senza la necessità di accedere direttamente a un modello linguistico: il client gestisce l'invocazione del modello e restituisce il risultato. AgentCore Gateway inoltra le richieste di campionamento dalle destinazioni dei server MCP ai tuoi clienti, sostituendo la richiesta con un identificatore generato dal gateway. id

Prerequisiti

Per utilizzare il campionamento con il gateway:

  • Sessioni abilitate (versione 2025-11-25 e precedenti): il campionamento richiede il supporto della sessione. Vedi Usare le sessioni MCP con il tuo gateway. Per 2026-07-28 le versioni successive, non è necessario aggiungerle sessionConfiguration al gateway, poiché queste versioni sono stateless.

  • Streaming di risposta abilitato (versione 2025-11-25 e precedenti): le richieste di campionamento vengono inviate come blocchi SSE durante una connessione aperta. streamingConfiguration.enableResponseStreamingtrueImposta su protocolConfiguration.mcp in quello del tuo gateway. Per 2026-07-28 le versioni successive, non è necessario abilitare lo streaming delle risposte. Queste versioni forniscono il campionamento tramite il modello MRTR (Multi Round-Trip Request) anziché una richiesta avviata dal server nel flusso di risposta. Per ulteriori informazioni, consulta Richieste multiple di andata e ritorno nella documentazione del Model Context Protocol.

  • Tipo di destinazione del server MCP: le richieste di campionamento provengono da destinazioni del server MCP.

  • Il client dichiara la capacità di campionamento: il client deve dichiarare il supporto per il campionamento affinché il gateway inoltri le richieste di campionamento. Per le versioni precedenti 2025-11-25 e precedenti, il client dichiara questo supporto nella richiesta. initialize Per 2026-07-28 le versioni successive, il client lo dichiara per ogni richiesta nel _meta campo ()io.modelcontextprotocol/clientCapabilities.

Come funziona il campionamento

Quando un server di destinazione MCP necessita di un completamento LLM durante l'esecuzione dello strumento, invia una richiesta. sampling/createMessage Il gateway inoltra questa richiesta al client come evento SSE, sostituendo la richiesta. id Il client richiama il proprio modello linguistico e invia il risultato al gateway, che lo inoltra alla destinazione.

Nota

Il flusso qui descritto si applica alle versioni precedenti 2025-11-25 e alle versioni precedenti, in cui il server invia sampling/createMessage una richiesta avviata dal server sullo stream SSE aperto. Per le versioni 2026-07-28 successive, il campionamento utilizza invece il pattern MRTR (Multi Round-Trip Requests). Il server restituisce un risultato provvisorio con set to. resultType input_required Il client fornisce quindi il completamento in caso di nuovo tentativo della richiesta originale. Per ulteriori informazioni, vedere Richieste multiple di andata e ritorno nella documentazione del Model Context Protocol.

La richiesta di campionamento include:

  • messages— I messaggi di conversazione da inviare al modello.

  • modelPreferences— Suggerimenti opzionali sulle funzionalità desiderate del modello (intelligenza, velocità, costi).

  • systemPrompt— Richiesta di sistema opzionale per il modello.

  • maxTokens— Numero massimo di token da generare.

Il cliente risponde con:

  • model— Il modello utilizzato.

  • role— Sempreassistant.

  • content— Il contenuto generato (testo o immagine).

Nota

Il cliente ha il pieno controllo sul modello da utilizzare e su come gestire la richiesta. I server modelPreferences sono suggerimenti, non requisiti. Il client può anche modificare o rifiutare la richiesta in base alle proprie politiche.

Flusso di campionamento

  1. Il cliente invia una tools/call richiesta con l'Mcp-Session-Idintestazione.

  2. Il gateway inoltra la chiamata allo strumento alla destinazione del server MCP.

  3. Il target apre un flusso SSE e invia una richiesta. sampling/createMessage

  4. Il gateway inoltra la richiesta di campionamento al client come evento SSE, sostituendo la richiesta. id

  5. Il client richiama il proprio modello linguistico con i messaggi forniti.

  6. Il client invia una nuova richiesta con il risultato del campionamento utilizzando la stessa Mcp-Session-Id e la richiesta id del gateway.

  7. Il gateway inoltra il risultato alla destinazione del server MCP.

  8. La destinazione continua l'elaborazione e restituisce il risultato finale dello strumento.

  9. Gateway inoltra il risultato finale al client e chiude lo stream.

Linee guida per gli sviluppatori target di server MCP

Importante

I server target MCP che inviano richieste di campionamento devono racchiudere le chiamate di campionamento in blocchi try-catch e gestire il caso in cui il client non supporti il campionamento. Se il client del gateway non dichiara la capacità di campionamento, il gateway non la dichiara alla destinazione. Se il target invia comunque una richiesta di campionamento, il gateway restituisce un errore -32601 (Method not found) al target.

I server devono implementare un percorso alternativo (ad esempio utilizzando un modello integrato o saltando il AI-assisted passaggio) quando il campionamento non è disponibile.

Protezione dello stato della richiesta (versione 2026-07-28 e successive)

Nelle versioni 2026-07-28 successive, il campionamento utilizza lo schema MRTR (Multi Round-Trip Request), che comporta una separazione opaca tra il client e la destinazione del server MCP. requestState La protezione di tale valore è una responsabilità condivisa: il gateway lo autorizza e lo inoltra senza memorizzarlo, mentre la destinazione del server MCP deve convalidarlo e impedire a un utente di riprodurre lo stato della richiesta di un altro utente. Per il modello completo di responsabilità condivisa e le linee guida di protezione che il server MCP deve seguire, vedete Proteggere lo stato della richiesta per l'elicitazione e il campionamento nelle considerazioni sulla destinazione del server MCP.

Gestione degli errori

Scenario Errore Description

Il client invia una risposta di campionamento quando nessuna richiesta di campionamento è in sospeso

JSON-RPC -32600(Richiesta non valida)

Nessuna richiesta di campionamento corrispondente trovata per questa sessione.

Il cliente invia una risposta di campionamento con una risposta id che non corrisponde a una richiesta in sospeso

JSON-RPC -32600(Richiesta non valida)

idDeve corrispondere a quello inviato dal gateway nella sampling/createMessage richiesta.

Il server MCP invia una richiesta di campionamento ma il gateway non ha dichiarato il supporto

JSON-RPC -32601(Metodo non trovato)

Ritornato alla destinazione del server MCP. Vedere Risoluzione dei problemi.

Risoluzione dei problemi

Errore: «Errore durante la chiamata allo strumento 'sample_tool': metodo non trovato:" sampling/createMessage

Questo errore si verifica quando una destinazione del server MCP invia una richiesta di campionamento ma il client del gateway non ha dichiarato la capacità di campionamento. Per le versioni precedenti 2025-11-25 e precedenti, il client dichiara questa funzionalità durante. initialize Per 2026-07-28 le versioni successive, il client la dichiara per ogni richiesta nel _meta campo. Il gateway restituisce un errore -32601 (Metodo non trovato) alla destinazione. La destinazione potrebbe restituirlo al client come errore di esecuzione dello strumento.

Per risolvere:

  • Se sei lo sviluppatore del server MCP: aggiungi la gestione degli errori nelle chiamate di campionamento. Implementa un percorso alternativo quando il campionamento non è supportato:

    Importante

    È necessario includere related_request_id=ctx.request_context.request_id nella chiamata. create_message Ciò è necessario affinché il gateway associ correttamente la richiesta di campionamento alla chiamata allo strumento di origine. Senza di esso, il campionamento non funzionerà.

    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)
  • Se sei lo sviluppatore del client gateway: per le versioni precedenti 2025-11-25 e precedenti, assicurati che il client dichiari la capacità di campionamento durante. initialize Per la versione 2026-07-28 e le successive, dichiarala per ogni richiesta nel _meta campo (). io.modelcontextprotocol/clientCapabilities L'esempio seguente mostra la initialize dichiarazione:

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

Esempi di codice

Nota

LangGraph MCP Client (langchain-mcp-adapters) e Strands MCP Client non supportano attualmente il campionamento. Utilizzate l'approccio MCP Client mostrato di seguito per gestire le richieste di campionamento dal vostro gateway.

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

In queste versioni, il client dichiara la capacità di campionamento durante initialize e la richiesta di campionamento arriva come sampling/createMessage richiesta sullo stream SSE aperto. Imposta l'MCP-Protocol-Versionintestazione su una versione supportata dal tuo gateway.

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)

Nella versione2026-07-28, il campionamento utilizza il modello di richieste multiple di andata e ritorno anziché una richiesta avviata dal server sullo stream SSE. Il client dichiara la capacità di campionamento su ogni richiesta. _meta Se lo strumento deve essere completato, la risposta è un input_required risultato contenente una sampling/createMessage richiesta in formato inputRequests opaco. requestState Il client richiama il proprio modello e ritenta la richiesta originale con una nuova idinputResponses, la e la non modificata. requestState Le sessioni e l'initializehandshake non vengono utilizzati. Il tuo gateway supportedVersions deve includere2026-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" ))