View a markdown version of this page

Use a amostragem com seu gateway AgentCore - Base da Amazônia AgentCore

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Use a amostragem com seu gateway AgentCore

A amostragem é um recurso do MCP que permite que um servidor MCP solicite a conclusão do LLM do cliente durante uma chamada de ferramenta. Isso permite que os servidores aproveitem os recursos de IA sem precisar de acesso direto a um modelo de linguagem — o cliente lida com a invocação do modelo e retorna o resultado. AgentCore O Gateway encaminha solicitações de amostragem dos alvos do servidor MCP para seus clientes, substituindo a solicitação por um identificador id gerado pelo gateway.

Pré-requisitos

Para usar a amostragem com seu gateway:

  • Sessões habilitadas (versão 2025-11-25 e anterior) — A amostragem requer suporte de sessão. Consulte Usar sessões MCP com seu gateway. Para versões 2026-07-28 posteriores, você não precisa adicionar sessionConfiguration ao seu gateway, pois essas versões não têm estado.

  • Streaming de resposta ativado (versão 2025-11-25 e anterior) — As solicitações de amostragem são enviadas como blocos SSE durante uma conexão aberta. streamingConfiguration.enableResponseStreamingDefina como true no seu gatewayprotocolConfiguration.mcp. Para a versão 2026-07-28 e posterior, você não precisa ativar o streaming de respostas. Essas versões fornecem amostragem por meio do padrão de várias solicitações de ida e volta (MRTR) em vez de uma solicitação iniciada pelo servidor no fluxo de resposta. Para obter mais informações, consulte Várias solicitações de ida e volta na documentação do Model Context Protocol.

  • Tipo de alvo do servidor MCP — As solicitações de amostragem são originadas dos alvos do servidor MCP.

  • O cliente declara a capacidade de amostragem — O cliente deve declarar suporte à amostragem para que o gateway encaminhe as solicitações de amostragem. Para a versão 2025-11-25 e versões anteriores, o cliente declara esse suporte na initialize solicitação. Para a versão 2026-07-28 e posterior, o cliente a declara para cada solicitação no _meta campo (io.modelcontextprotocol/clientCapabilities).

Como funciona a amostragem

Quando um alvo do servidor MCP precisa de uma conclusão do LLM durante a execução da ferramenta, ele envia uma sampling/createMessage solicitação. O gateway encaminha essa solicitação ao cliente como um evento SSE, substituindo a solicitaçãoid. O cliente invoca seu modelo de linguagem e envia o resultado de volta ao gateway, que o encaminha para o destino.

nota

O fluxo descrito aqui se aplica à versão 2025-11-25 e anteriores, em que o servidor envia sampling/createMessage como uma solicitação iniciada pelo servidor no fluxo SSE aberto. Para a versão 2026-07-28 e versões posteriores, a amostragem usa o padrão de várias solicitações de ida e volta (MRTR). O servidor retorna um resultado provisório com resultType definido como. input_required Em seguida, o cliente fornece a conclusão em uma nova tentativa da solicitação original. Para obter mais informações, consulte Várias solicitações de ida e volta na documentação do Model Context Protocol.

A solicitação de amostragem inclui:

  • messages— As mensagens de conversa a serem enviadas à modelo.

  • modelPreferences— Dicas opcionais sobre os recursos desejados do modelo (inteligência, velocidade, custo).

  • systemPrompt— Solicitação opcional do sistema para o modelo.

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

O cliente responde com:

  • model— O modelo que foi usado.

  • role— Sempreassistant.

  • content— O conteúdo gerado (texto ou imagem).

nota

O cliente tem controle total sobre qual modelo usar e como lidar com a solicitação. Os servidores modelPreferences são dicas, não requisitos. O cliente também pode modificar ou rejeitar a solicitação com base em suas próprias políticas.

Fluxo de amostragem

  1. O cliente envia uma tools/call solicitação com o Mcp-Session-Id cabeçalho.

  2. O gateway encaminha a chamada da ferramenta para o alvo do servidor MCP.

  3. O alvo abre um fluxo SSE e envia uma sampling/createMessage solicitação.

  4. O Gateway encaminha a solicitação de amostragem para o cliente como um evento SSE, substituindo a solicitação. id

  5. O cliente invoca seu modelo de linguagem com as mensagens fornecidas.

  6. O cliente envia uma nova solicitação com o resultado da amostragem usando a mesma Mcp-Session-Id e a id da solicitação do gateway.

  7. O gateway encaminha o resultado para o destino do servidor MCP.

  8. O alvo continua processando e retorna o resultado final da ferramenta.

  9. O gateway encaminha o resultado final para o cliente e fecha o stream.

Orientação para desenvolvedores de destino do servidor MCP

Importante

Os alvos do servidor MCP que enviam solicitações de amostragem devem agrupar as chamadas de amostragem em blocos try-catch e tratar os casos em que o cliente não oferece suporte à amostragem. Se o cliente do gateway não declarou a capacidade de amostragem, o gateway não a declarará ao destino. Se o destino enviar uma solicitação de amostragem de qualquer maneira, o gateway retornará um erro -32601 (Método não encontrado) para o destino.

Os servidores devem implementar um caminho alternativo (como usar um modelo incorporado ou pular a AI-assisted etapa) quando a amostragem não estiver disponível.

Protegendo o estado da solicitação (versão 2026-07-28 e posterior)

Na versão 2026-07-28 e posterior, a amostragem usa o padrão de várias solicitações de ida e volta (MRTR), que transporta uma opacidade requestState entre o cliente e o destino do servidor MCP. Proteger esse valor é uma responsabilidade compartilhada: o gateway o autoriza e o encaminha sem armazená-lo, enquanto o destino do servidor MCP deve validá-lo e impedir que um usuário repita o estado de solicitação de outro usuário. Para ver o modelo completo de responsabilidade compartilhada e as diretrizes de proteção que seu servidor MCP deve seguir, consulte Protegendo o estado da solicitação para elicitação e amostragem nas considerações sobre o alvo do servidor MCP.

Tratamento de erros

Cenário Erro Description

O cliente envia uma resposta de amostragem quando nenhuma solicitação de amostragem está pendente

JSON-RPC -32600(Solicitação inválida)

Nenhuma solicitação de amostragem correspondente foi encontrada para esta sessão.

O cliente envia uma resposta de amostragem com uma id que não corresponde a uma solicitação pendente

JSON-RPC -32600(Solicitação inválida)

Eles id devem corresponder ao enviado pelo gateway na sampling/createMessage solicitação.

O servidor MCP envia a solicitação de amostragem, mas o gateway não declarou suporte

JSON-RPC -32601(Método não encontrado)

Retornado ao destino do servidor MCP. Consulte Solução de problemas.

Solução de problemas

Erro: “Erro ao chamar a ferramenta 'sample_tool': Método não encontrado:” sampling/createMessage

Esse erro ocorre quando um alvo do servidor MCP envia uma solicitação de amostragem, mas o cliente do gateway não declarou a capacidade de amostragem. Para a versão 2025-11-25 e versões anteriores, o cliente declara esse recurso duranteinitialize. Para a versão 2026-07-28 e posterior, o cliente a declara para cada solicitação no _meta campo. O gateway retorna um erro -32601 (Método não encontrado) para o destino. O alvo pode retornar isso como um erro de execução da ferramenta para o cliente.

Para resolver:

  • Se você for o desenvolvedor do servidor MCP: adicione tratamento de erros em suas chamadas de amostragem. Implemente um caminho alternativo quando a amostragem não for suportada:

    Importante

    Você deve incluir related_request_id=ctx.request_context.request_id na sua create_message chamada. Isso é necessário para que o gateway associe corretamente a solicitação de amostragem à chamada da ferramenta de origem. Sem isso, a amostragem não 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)
  • Se você for o desenvolvedor do cliente gateway: para a versão 2025-11-25 e anteriores, certifique-se de que seu cliente declare a capacidade de amostragem durante. initialize Para a versão 2026-07-28 e posterior, declare-a para cada solicitação no _meta campo (io.modelcontextprotocol/clientCapabilities). O exemplo a seguir mostra a initialize declaração:

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

Exemplos de código

nota

Atualmente, o LangGraph MCP Client (langchain-mcp-adapters) e o Strands MCP Client não oferecem suporte à amostragem. Use a abordagem do cliente MCP mostrada abaixo para lidar com solicitações de amostragem do seu gateway.

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

Nessas versões, o cliente declara a capacidade de amostragem durante initialize e a solicitação de amostragem chega como uma sampling/createMessage solicitação no fluxo SSE aberto. Defina o MCP-Protocol-Version cabeçalho para uma versão compatível com seu 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)

Na versão2026-07-28, a amostragem usa o padrão de várias solicitações de ida e volta em vez de uma solicitação iniciada pelo servidor no fluxo SSE. O cliente declara a capacidade de amostragem _meta em cada solicitação. Se a ferramenta precisar ser concluída, a resposta será um input_required resultado contendo uma sampling/createMessage solicitação em inputRequests e uma opacarequestState. O cliente invoca seu modelo e repete a solicitação original com uma nova idinputResponses, a e a não modificada. requestState As sessões e o initialize aperto de mão não são usados. Seu gateway supportedVersions deve 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" ))