View a markdown version of this page

Usa el muestreo con tu AgentCore pasarela - Base amazónica AgentCore

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Usa el muestreo con tu AgentCore pasarela

El muestreo es una función de MCP que permite a un servidor de MCP solicitar al cliente que complete un LLM durante una llamada a una herramienta. Esto permite a los servidores aprovechar las capacidades de la IA sin necesidad de acceder directamente a un modelo lingüístico: el cliente gestiona la invocación del modelo y devuelve el resultado. AgentCore Gateway reenvía las solicitudes de muestreo de los destinos del servidor MCP a sus clientes, sustituyendo la solicitud por un identificador generado por la puerta id de enlace.

Requisitos previos

Para usar el muestreo con su puerta de enlace:

  • Sesiones habilitadas (versión 2025-11-25 y anteriores): el muestreo requiere soporte de sesión. Consulte Usar sesiones de MCP con su puerta de enlace. Para la versión 2026-07-28 y las versiones posteriores, no es necesario que las añada sessionConfiguration a su puerta de enlace, ya que estas versiones no tienen estado.

  • Transmisión de respuestas habilitada (versión 2025-11-25 y anteriores): las solicitudes de muestreo se envían como fragmentos de SSE durante una conexión abierta. Configúralo en el de tu puerta streamingConfiguration.enableResponseStreaming de enlace. true protocolConfiguration.mcp Para la versión 2026-07-28 y posteriores, no es necesario que habilites la transmisión de respuestas. Estas versiones ofrecen el muestreo mediante el patrón de solicitudes de ida y vuelta múltiples (MRTR), en lugar de mediante una solicitud iniciada por el servidor en el flujo de respuestas. Para obtener más información, consulte las solicitudes de ida y vuelta múltiples en la documentación del Model Context Protocol.

  • Tipo de destino del servidor MCP: las solicitudes de muestreo se originan en los destinos del servidor MCP.

  • El cliente declara su capacidad de muestreo: el cliente debe declarar que admite el muestreo para que la pasarela pueda reenviar las solicitudes de muestreo. Para la versión 2025-11-25 y las anteriores, el cliente declara esta compatibilidad en la initialize solicitud. Para la versión 2026-07-28 y versiones posteriores, el cliente la declara para cada solicitud en el _meta campo (io.modelcontextprotocol/clientCapabilities).

Cómo funciona el muestreo

Cuando un servidor MCP objetivo necesita completar un LLM durante la ejecución de la herramienta, envía una sampling/createMessage solicitud. La puerta de enlace reenvía esta solicitud al cliente como un evento de SSE y reemplaza la solicitud. id El cliente invoca su modelo de lenguaje y envía el resultado a la puerta de enlace, que lo reenvía al destino.

nota

El flujo que se describe aquí se aplica a la versión 2025-11-25 y a las anteriores, en las que el servidor envía sampling/createMessage una solicitud iniciada por el servidor en la transmisión SSE abierta. Para la versión 2026-07-28 y versiones posteriores, el muestreo utiliza, en cambio, el patrón de solicitudes de ida y vuelta múltiples (MRTR). El servidor devuelve un resultado provisional con el valor resultType establecido en. input_required A continuación, el cliente proporciona la finalización de la solicitud original al volver a intentarlo. Para obtener más información, consulte las solicitudes de ida y vuelta múltiples en la documentación del Model Context Protocol.

La solicitud de muestreo incluye:

  • messages— Los mensajes de conversación que se enviarán a la modelo.

  • modelPreferences— Consejos opcionales sobre las capacidades deseadas del modelo (inteligencia, velocidad, coste).

  • systemPrompt— Indicador de sistema opcional para el modelo.

  • maxTokens— Número máximo de tokens a generar.

El cliente responde con:

  • model— El modelo que se utilizó.

  • role— Siempreassistant.

  • content— El contenido generado (texto o imagen).

nota

El cliente tiene el control total sobre qué modelo utilizar y cómo gestionar la solicitud. Los del servidor modelPreferences son sugerencias, no requisitos. El cliente también puede modificar o rechazar la solicitud en función de sus propias políticas.

Flujo de muestreo

  1. El cliente envía una tools/call solicitud con el Mcp-Session-Id encabezado.

  2. Gateway reenvía la llamada a la herramienta al servidor MCP de destino.

  3. El objetivo abre una transmisión de SSE y envía una sampling/createMessage solicitud.

  4. Gateway reenvía la solicitud de muestreo al cliente como un evento de SSE y reemplaza la solicitudid.

  5. El cliente invoca su modelo lingüístico con los mensajes proporcionados.

  6. El cliente envía una nueva solicitud con el resultado del muestreo utilizando la misma solicitud Mcp-Session-Id y la id de la pasarela.

  7. Gateway reenvía el resultado al servidor MCP de destino.

  8. El objetivo continúa procesándose y devuelve el resultado final de la herramienta.

  9. Gateway reenvía el resultado final al cliente y cierra la transmisión.

Guía para los desarrolladores de servidores objetivo de MCP

importante

Los servidores MCP que envían solicitudes de muestreo deben agrupar las llamadas de muestreo en bloques de tipo try-catch y gestionar los casos en los que el cliente no admite el muestreo. Si el cliente de la puerta de enlace no declaró la capacidad de muestreo, la puerta de enlace no la declara al destino. Si el objetivo envía una solicitud de muestreo de todos modos, la puerta de enlace devuelve un error -32601 (método no encontrado) al objetivo.

Los servidores deben implementar una ruta alternativa (por ejemplo, usar un modelo integrado u omitir este AI-assisted paso) cuando el muestreo no esté disponible.

Asegurar el estado de la solicitud (versión 2026-07-28 y posteriores)

En la versión 2026-07-28 y versiones posteriores, el muestreo utiliza el patrón de solicitudes de ida y vuelta múltiples (MRTR), que muestra una opacidad requestState entre el cliente y el servidor MCP de destino. Proteger ese valor es una responsabilidad compartida: la puerta de enlace lo autoriza y lo reenvía sin almacenarlo, mientras que el servidor MCP de destino debe validarlo e impedir que un usuario vuelva a reproducir el estado de la solicitud de otro usuario. Para conocer el modelo completo de responsabilidad compartida y las directrices de protección que debe seguir su servidor MCP, consulte Consideraciones sobre cómo proteger el estado de la solicitud para su obtención y muestreo en el destino del servidor MCP.

Gestión de errores

Escenario Error Description (Descripción)

El cliente envía una respuesta de muestreo cuando no hay ninguna solicitud de muestreo pendiente

JSON-RPC -32600(Solicitud no válida)

No se encontró ninguna solicitud de muestreo coincidente para esta sesión.

El cliente envía una respuesta de muestreo con una id que no coincide con una solicitud pendiente

JSON-RPC -32600(Solicitud no válida)

idDebe coincidir con el enviado por la pasarela en la sampling/createMessage solicitud.

El servidor MCP envía una solicitud de muestreo, pero la puerta de enlace no declaró su compatibilidad

JSON-RPC -32601(No se encontró el método)

Regresó al destino del servidor MCP. Consulte Solución de problemas

Resolución de problemas

Error: «Error al llamar a la herramienta 'sample_tool': no se encontró el método:» sampling/createMessage

Este error se produce cuando un servidor MCP objetivo envía una solicitud de muestreo, pero el cliente de la puerta de enlace no declara su capacidad de muestreo. Para la versión 2025-11-25 y anteriores, el cliente declara esta capacidad duranteinitialize. Para la versión 2026-07-28 y versiones posteriores, el cliente la declara para cada solicitud del _meta campo. La puerta de enlace devuelve un error -32601 (método no encontrado) al destino. El objetivo puede devolverlo al cliente como un error de ejecución de la herramienta.

Para resolverlo:

  • Si es el desarrollador del servidor MCP: añada la gestión de errores a sus llamadas de muestreo. Implemente una ruta alternativa cuando no se admita el muestreo:

    importante

    Debe incluirlo related_request_id=ctx.request_context.request_id en su create_message llamada. Esto es necesario para que la pasarela asocie correctamente la solicitud de muestreo con la llamada a la herramienta original. Sin él, el muestreo no funcionará.

    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 es el desarrollador de clientes de Gateway: en el caso de la versión 2025-11-25 y anteriores, asegúrese de que su cliente declara la capacidad de muestreo durante el procesoinitialize. En el caso de la versión 2026-07-28 y posteriores, declárela para cada solicitud en el _meta campo (io.modelcontextprotocol/clientCapabilities). El siguiente ejemplo muestra la initialize declaración:

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

Ejemplos de código

nota

El cliente LangGraph MCP (langchain-mcp-adapters) y el cliente MCP de Strands no admiten actualmente el muestreo. Utilice el enfoque del cliente MCP que se muestra a continuación para gestionar las solicitudes de muestreo desde su puerta de enlace.

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

En estas versiones, el cliente declara la capacidad de muestreo durante initialize y la solicitud de muestreo llega como una sampling/createMessage solicitud al flujo SSE abierto. Establezca el MCP-Protocol-Version encabezado en una versión compatible con su puerta de enlace.

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)

En la versión2026-07-28, el muestreo utiliza el patrón de múltiples solicitudes de ida y vuelta en lugar de una solicitud iniciada por el servidor en la transmisión de SSE. El cliente declara la capacidad de muestreo _meta en cada solicitud. Si es necesario completar la herramienta, la respuesta es un input_required resultado que contiene una sampling/createMessage solicitud inputRequests y una opacarequestState. El cliente invoca su modelo y vuelve a intentar la solicitud original con una nueva idinputResponses, la y la no modificada. requestState No se utilizan las sesiones ni el initialize apretón de manos. Su puerta de enlace supportedVersions debe incluir2026-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" ))