View a markdown version of this page

Utilisez l'échantillonnage avec votre AgentCore passerelle - Base rocheuse de l'Amazonie AgentCore

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisez l'échantillonnage avec votre AgentCore passerelle

L'échantillonnage est une fonctionnalité MCP qui permet à un serveur MCP de demander une complétion LLM au client lors d'un appel à l'outil. Cela permet aux serveurs de tirer parti des fonctionnalités d'IA sans avoir besoin d'accéder directement à un modèle de langage : le client gère l'appel du modèle et renvoie le résultat. AgentCore Gateway transmet les demandes d'échantillonnage provenant de cibles de serveurs MCP à vos clients, en les remplaçant par un id identifiant généré par la passerelle.

Conditions préalables

Pour utiliser l'échantillonnage avec votre passerelle :

  • Sessions activées (version 2025-11-25 et antérieures) — L'échantillonnage nécessite la prise en charge des sessions. Consultez la section Utiliser des sessions MCP avec votre passerelle. Pour les versions 2026-07-28 et les versions ultérieures, vous n'avez pas besoin sessionConfiguration d'ajouter à votre passerelle, car ces versions sont sans état.

  • Streaming de réponses activé (version 2025-11-25 et antérieures)  : les demandes d'échantillonnage sont envoyées sous forme de segments SSE lors d'une connexion ouverte. streamingConfiguration.enableResponseStreamingRéglez-le true sur celui de votre passerelleprotocolConfiguration.mcp. Pour les versions 2026-07-28 et les versions ultérieures, il n'est pas nécessaire d'activer le streaming des réponses. Ces versions fournissent un échantillonnage via le modèle de requêtes multi-aller-retour (MRTR) au lieu d'une demande initiée par le serveur sur le flux de réponse. Pour plus d'informations, consultez la section Demandes aller-retour multiples dans la documentation du Model Context Protocol.

  • Type de cible du serveur MCP  : les demandes d'échantillonnage proviennent des cibles du serveur MCP.

  • Le client déclare sa capacité d'échantillonnage — Le client doit déclarer qu'il prend en charge l'échantillonnage pour que la passerelle puisse transmettre les demandes d'échantillonnage. Pour la version 2025-11-25 et les versions antérieures, le client déclare cette prise en charge dans la initialize demande. Pour les versions 2026-07-28 et les versions ultérieures, le client le déclare pour chaque requête dans le _meta champ (io.modelcontextprotocol/clientCapabilities).

Comment fonctionne l'échantillonnage

Lorsqu'une cible de serveur MCP a besoin d'être complétée par un LLM pendant l'exécution de l'outil, elle envoie une sampling/createMessage requête. La passerelle transmet cette demande au client sous la forme d'un événement SSE, en remplacement de la demandeid. Le client invoque son modèle de langage et renvoie le résultat à la passerelle, qui le transmet à la cible.

Note

Le flux décrit ici s'applique à la version 2025-11-25 et aux versions antérieures, où le serveur envoie sampling/createMessage une requête initiée par le serveur sur le flux SSE ouvert. Pour les versions 2026-07-28 et les versions ultérieures, l'échantillonnage utilise plutôt le modèle MRTR (multi-demandes aller-retour). Le serveur renvoie un résultat provisoire avec resultType défini surinput_required. Le client fournit ensuite l'achèvement de la demande initiale lors d'une nouvelle tentative. Pour plus d'informations, consultez la section Demandes aller-retour multiples dans la documentation du Model Context Protocol.

La demande d'échantillonnage comprend :

  • messages— Les messages de conversation à envoyer au modèle.

  • modelPreferences— Conseils facultatifs sur les fonctionnalités souhaitées du modèle (intelligence, vitesse, coût).

  • systemPrompt— Invite système optionnelle pour le modèle.

  • maxTokens— Nombre maximum de jetons à générer.

Le client répond par :

  • model— Le modèle qui a été utilisé.

  • role— Toujoursassistant.

  • content— Le contenu généré (texte ou image).

Note

Le client a le contrôle total du modèle à utiliser et de la manière de traiter la demande. Les serveurs modelPreferences sont des conseils, pas des exigences. Le client peut également modifier ou rejeter la demande en fonction de ses propres politiques.

Flux d'échantillonnage

  1. Le client envoie une tools/call demande avec l'Mcp-Session-Iden-tête.

  2. Gateway transmet l'appel d'outil à la cible du serveur MCP.

  3. La cible ouvre un flux SSE et envoie une sampling/createMessage demande.

  4. Gateway transmet la demande d'échantillonnage au client sous la forme d'un événement SSE, en remplacement de la demandeid.

  5. Le client invoque son modèle de langage avec les messages fournis.

  6. Le client envoie une nouvelle demande avec le résultat de l'échantillonnage en utilisant la même requête Mcp-Session-Id et celle id de la passerelle.

  7. Gateway transmet le résultat à la cible du serveur MCP.

  8. La cible poursuit le traitement et renvoie le résultat final de l'outil.

  9. Gateway transmet le résultat final au client et ferme le flux.

Conseils pour les développeurs de cibles de serveurs MCP

Important

Les cibles de serveur MCP qui envoient des demandes d'échantillonnage doivent encapsuler les appels d'échantillonnage dans des blocs trycatch et gérer le cas où le client ne prend pas en charge l'échantillonnage. Si le client de la passerelle n'a pas déclaré de capacité d'échantillonnage, la passerelle ne la déclare pas à la cible. Si la cible envoie quand même une demande d'échantillonnage, la passerelle renvoie une erreur -32601 (Méthode introuvable) à la cible.

Les serveurs doivent implémenter un chemin de secours (par exemple en utilisant un modèle intégré ou en sautant l' AI-assisted étape) lorsque l'échantillonnage n'est pas disponible.

Sécurisation de l'état de la demande (version 2026-07-28 et versions ultérieures)

Sur les versions 2026-07-28 et les versions ultérieures, l'échantillonnage utilise le modèle de requêtes multi-aller-retour (MRTR), qui crée une opacité requestState entre votre client et la cible de votre serveur MCP. La sécurisation de cette valeur est une responsabilité partagée : la passerelle l'autorise et la transmet sans la stocker, tandis que la cible de votre serveur MCP doit la valider et empêcher un utilisateur de rejouer l'état de la demande d'un autre utilisateur. Pour connaître le modèle de responsabilité partagée complet et les directives de protection que votre serveur MCP doit suivre, consultez la section Sécurisation de l'état de la demande pour l'élicitation et l'échantillonnage dans les considérations relatives à la cible du serveur MCP.

Gestion des erreurs

Scénario Erreur Description

Le client envoie une réponse d'échantillonnage lorsqu'aucune demande d'échantillonnage n'est en attente

JSON-RPC -32600(Demande non valide)

Aucune demande d'échantillonnage correspondante n'a été trouvée pour cette session.

Le client envoie une réponse d'échantillonnage avec une réponse id qui ne correspond pas à une demande en attente

JSON-RPC -32600(Demande non valide)

idIl doit correspondre à celui envoyé par la passerelle dans la sampling/createMessage demande.

Le serveur MCP envoie une demande d'échantillonnage mais la passerelle n'a pas déclaré le support

JSON-RPC -32601(Méthode introuvable)

Retourné à la cible du serveur MCP. Consultez la section Résolution des problèmes.

Résolution des problèmes

Erreur : « Erreur lors de l'appel de l'outil 'sample_tool' : méthode introuvable : » sampling/createMessage

Cette erreur se produit lorsqu'une cible de serveur MCP envoie une demande d'échantillonnage mais que le client de la passerelle n'a pas déclaré de capacité d'échantillonnage. Pour la version 2025-11-25 et les versions antérieures, le client déclare cette fonctionnalité pendantinitialize. Pour les versions 2026-07-28 et les versions ultérieures, le client le déclare pour chaque demande dans le _meta champ. La passerelle renvoie une erreur -32601 (Méthode introuvable) à la cible. La cible peut renvoyer cette erreur au client sous la forme d'une erreur d'exécution de l'outil.

Pour résoudre le problème :

  • Si vous êtes le développeur du serveur MCP  : ajoutez la gestion des erreurs lors de vos appels d'échantillonnage. Implémentez un chemin de repli lorsque l'échantillonnage n'est pas pris en charge :

    Important

    Vous devez inclure related_request_id=ctx.request_context.request_id dans votre create_message appel. Cela est nécessaire pour que la passerelle associe correctement la demande d'échantillonnage à l'appel d'outil d'origine. Sans cela, l'échantillonnage ne fonctionnera pas.

    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)
  • Si vous êtes le développeur du client Gateway  : pour la version 2025-11-25 et les versions antérieures, assurez-vous que votre client déclare la capacité d'échantillonnage pendantinitialize. Pour la version 2026-07-28 et les versions ultérieures, déclarez-la pour chaque requête dans le _meta champ (io.modelcontextprotocol/clientCapabilities). L'exemple suivant montre la initialize déclaration :

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

Exemples de code

Note

Le client LangGraph MCP (langchain-mcp-adapters) et le client Strands MCP ne prennent pas actuellement en charge l'échantillonnage. Utilisez l'approche MCP Client illustrée ci-dessous pour gérer les demandes d'échantillonnage provenant de votre passerelle.

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

Sur ces versions, le client déclare la capacité d'échantillonnage pendantinitialize, et la demande d'échantillonnage arrive en tant que sampling/createMessage requête sur le flux SSE ouvert. Définissez l'MCP-Protocol-Versionen-tête sur une version prise en charge par votre passerelle.

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)

Dans la version2026-07-28, l'échantillonnage utilise le modèle de demandes aller-retour multiples au lieu d'une demande initiée par le serveur sur le flux SSE. Le client déclare la capacité d'échantillonnage _meta à chaque demande. Si l'outil doit être complété, la réponse est un input_required résultat contenant une sampling/createMessage requête inputRequests et un opaquerequestState. Le client invoque son modèle et tente à nouveau la demande d'origine avec un nouveau idinputResponses, le et le non modifié. requestState Les sessions et la initialize poignée de main ne sont pas utilisées. Votre passerelle supportedVersions doit inclure2026-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" ))