亚马逊AWS官方博客

基于Bedrock AgentCore+Strands构建企业级智能搜索平台实践

1. Agentic AI落地面临的问题

当前,生成式 AI 技术正以破壁之势迅猛发展,大模型的能力迭代更是日新月异。在此浪潮下,Agentic AI 的应用边界持续拓宽,已深度渗透至金融、医疗、制造、教育、娱乐等多个领域,以前所未有的速度重构商业竞争格局,颠覆各行业传统生产方式 —— 它不再是简单的技术工具,更成为驱动企业业务创新、提升核心效率的 “智能引擎”。正是看到这一机遇,越来越多的企业渴望搭乘 Agentic AI 的技术快车,加速推进行业智能体或通用智能体平台的落地。

作为 AWS 核心级合作伙伴,小宿科技始终聚焦企业 AI 转型需求,凭借安全可靠、高效敏捷的技术架构,为企业提供 Agentic AI全生命周期所需的 “数据 – 模型 – AI 云” 全栈基础设施服务,助力客户打通从技术探索到业务落地的关键链路。然而,在服务数以百计各行业客户的实践中我们发现,当企业真正着手开发、测试、部署并运维一个生产级别的安全可靠 Agentic AI 项目时,仍需跨越重重挑战,具体包括:

  • 不同场景或不同任务需要不同的大模型,对接大模型种类多,对接复杂;
  • 大模型无法获取实时最新信息,目前仍存在一定程度的幻觉;
  • Agent开发框架繁多,如何选择一个合适的框架;
  • 不同应用场景,需要集成大量MCP工具,传统应用只支持REST API,非标准化MCP接口,Agent无法直接使用;
  • Agent应用开发过程中,企业希望更多聚焦于AI应用的快速迭代,Agent应用开发完成后,如何大规模、安全可靠的生产部署,如何实现企业级隔离保障的安全运行环境,基础设施如何自动扩展等;
  • AI技术日益月异,员工针对AI应用开发的技能储备不足,如何中快速上手AI Agent开发,补上技能短板

1.1 解决之道

针对Agentic智能体落地中的痛点,借助亚马逊云科技云上一站式GenAI解决方案及相关服务,包括Amazon Bedrock、Amazon Bedrock AgentCore、Strands Agents、Kiro及小宿智能搜索,通过提供实用的AI Agent 服务,从开发、构建、到大规模安全部署,端到端的赋能企业,帮助企业实现AI 项目的快速落地。

1.1.1 Amazon Bedrock 模型服务

Amazon Bedrock 集成了来自 AI21 Labs、Anthropic、Cohere、DeepSeek、Luma AI、Meta、Mistral AI、Stability AI、TwelveLabs、Writer 和 Amazon 等领先人工智能公司的100多款高性能模型,从而为Agent模型接入提供多种选择,并且无需重写代码即可轻松更换这些模型,使您能够随着需求的变化灵活地进行构建Agent

1.1.2 Amazon Bedrock AgentCore

AgentCore包括:运行时、内存、网关、身份、可观测性和工具等,提供专为动态代理工作负载构建的基础设施、可增强代理功能的强大工具,以及适用于现实部署场景的基础控件。

通过Agentcore,用户可以安全、大规模地部署和运行功能强大的Agent。

并且兼容任何框架(包括 CrewAI、LangGraph、LlamaIndex 和 Strands Agents 等),并支持 Amazon Bedrock 内外的所有基础模型,能为您带来极大的灵活性。

AgentCore 可消除用户构建专用代理基础设施时千篇一律的繁重的维护工作,专注加快代理进入量产的过程。

1.1.2.1 AgentCore Runtime

AgentCore Runtime 是一个安全的无服务器运行时,专为使用任何开源框架(包括 LangGraph、CrewAI 和Strands Agents)、任何协议和任何模型来部署和扩展动态 AI 代理和工具而构建。Runtime 专为代理工作负载而构建,具有业界领先的扩展运行时支持、快速冷启动、真正的会话隔离、内置身份以及对多模式负载的支持。开发人员可以专注于创新,而 Amazon Bedrock AgentCore Runtime 则负责处理基础设施和安全问题,从而加快产品上市时间。

1.1.2.2 AgentCore Memory

AgentCore Memory 让您的 AI 代理能够通过保存即时和长期知识,提供智能、情境感知和个性化的交互。AgentCore Memory 提供两种类型的内存:

  • 短期记忆:存储对话以追踪即时情境。

例如,假设您的编码代理正在帮助您进行调试。在会话期间,您要求它检查变量名称、纠正语法错误并查找未使用的导入语句。代理会将交互作为短期事件存储在 AgentCore Memory 中。之后,代理可以检索这些事件,以便无需您重复之前的信息即可进行对话。

短期记忆捕获原始交互事件,维护即时情境,支持实时对话,丰富长期内存系统,并支持构建高级情境解决方案,例如多步骤任务完成、会话中知识积累和情境感知决策。

  • 长期记忆:存储提取的洞察信息(例如用户偏好、语义事实和内容摘要),以便在会话之间保留知识。

用户偏好——想象一下,使用 AgentCore Memory 的编程代理是您长期的编程伙伴。经过许多天的实践,它会注意到您始终编写简洁的代码并带有注释,喜欢使用蛇形命名法 (snake_case),使用 Pandas 进行数据分析,并在最终确定函数之前进行测试。下次,即使经过多次会话后,当您要求它编写数据分析函数时,它也会自动遵循存储在 AgentCore Memory 中的这些偏好,而无需您再次告知。

语义事实——编程代理还会记住“Pandas 是一个用于数据分析和处理表格的 Python 库”。当您询问“哪个库最适合处理表格数据?”时,它会立即推荐 Pandas,因为它从语义记忆中理解了 Pandas 的含义。

内容摘要——编程代理会生成会话摘要,例如“在本次交互中,您创建了一个数据清理函数,修复了两个语法错误,并测试了您的线性回归模型”。这些摘要既能跟踪已完成的工作,又能压缩对话上下文,从而能够高效地引用过去的活动,并优化上下文窗口的使用率。

1.1.2.3 AgentCore Gateway

借助AgentCore Gateway,几行代码,即可将现有API快速转变为支持代理的MCP工具,简化agent与各类工具的连接流程,提升agent执行各种任务的能力。

Amazon Bedrock AgentCore Gateway 是 亚马逊云科技推出的全托管工具管理中枢,专为 AI 代理设计。它能将 API、Lambda 函数、第三方服务(如 Salesforce、Slack)快速转化为符合 Model Context Protocol (MCP) 的工具,同时为 AI 代理提供统一、安全的工具访问入口,解决 “工具集成难、管理杂、安全风险高” 的核心痛点。

 AgentCore Gateway主要功能:

  • 多类型工具接入:支持 OpenAPI 规范、Lambda 函数、Smithy 模型导入,及热门工具一键集成,无需重构现有资源;
  • 统一访问与智能发现:单端点管理所有工具,内置语义搜索,帮代理按任务上下文匹配工具,减少调用复杂度;
  • 全方位安全认证:覆盖入站(代理身份校验)、出站(工具凭证管理)双向 OAuth 认证,自动刷新令牌、安全存储凭证;
  • 协议翻译与框架兼容:自动转化 MCP 与工具协议,兼容 CrewAI、LangGraph 等开源框架及任意 AI 模型;
  • 全托管运维:Serverless 架构弹性扩缩容,提供调用日志、监控指标,零基础设施管理成本。

核心价值

  • 降本提效:几行代码完成工具转化,替代数月级自定义开发,缩短 AI 代理落地周期;
  • 安全可靠:企业级双向认证与合规保障,避免凭证泄露和未授权访问;
  • 灵活扩展:支持工具规模化管理(从数十到数千个),兼容多框架 / 模型,适配业务增长;
  • 零运维负担:亚马逊云科技 负责底层维护与升级,开发者聚焦代理核心能力创新。

1.1.2.4 AgentCore Identity

Amazon Bedrock AgentCore Identity 是一项专为 AI 代理和自动化工作负载设计的身份和凭证管理服务。它提供安全的身份验证、授权和凭证管理功能,使代理和工具能够代表用户访问 亚马逊云科技 资源和第三方服务,同时帮助维护严格的安全控制和审计跟踪。代理身份作为具有专用属性的工作负载身份实现,这些属性支持代理特定的功能,同时帮助保持与行业标准工作负载身份模式的兼容性。该服务与 Amazon Bedrock AgentCore 原生集成,为代理应用程序(包括主机代理或使用 Amazon Bedrock AgentCore Runtime 和 Amazon Bedrock AgentCore Gateway 的工具)提供身份和凭证管理;

1.1.3   Strands Agents

Strands Agents SDK 采用模型驱动(Model-Driven)的设计理念,充分发挥先进大模型在规划、思维链(Chain-of-Thought)、工具调用及自我反思等方面的能力,显著地简化了智能体的开发流程。开发者仅需定义核心提示词(Prompt)和可调用的工具列表(Tools),即可快速构建功能智能体(Agent),并能将本地测试成果无缝部署至云端环境。

在模型生态方面,Strands Agents SDK 展现了高度的开放性与兼容性,支持多样化的模型选择,包括 Amazon Bedrock、LiteLLM、Ollama 等主流平台。对于亚马逊云科技中国区用户,还可通过小宿科技的SKyrouter平台访问 DeepSeek 等模型,以满足不同业务场景和合规性要求。

1.1.4 Kiro

亚马逊公司推出的一款通过 “规范驱动开发”(Spec-Driven Development) 的理念,重塑软件开发流程,帮助开发者更高效地实现从概念构想到生产部署的全过程的AI 原生集成开发环境(agentic IDE),弥补用户在Agent项目开发过程的技能不足。

1.1.5 小宿智能搜索

1.1.5.1 什么是小宿智能搜索

小宿智能搜索是专为Agent设计的智能搜索与数据服务,提供多语言、多模态、多能力的数据获取与处理服务。针对Agent对信息精度、实时性和多模态处理的需求,小宿科技专门为 Agent 设计了智能搜索与数据服务,原生支持35+主流语种;网页长摘要总结,以 Markdown 等格式输出,针对Agent 友好,Agent 一次调用中获取全量信息,降低大模型幻觉;多模态搜索,一站式满足多样数据需求;智能召回 + 精准排序,内容质量远超主流搜索;提供秒级响应,高可用。

核心功能

  • 基础通用搜索:自研的基于语义的网络搜索引擎,能挖掘常规搜索引擎无法解锁的数据维度,为AI 提供了更精准的知识获取通道;
  • 全文展示搜索:针对传统搜索引擎仅返回简短摘要的问题,全文展示搜索检全网信息可直接呈现完整内容,并自动高亮关键信息,用户可在结果页一站式获取核心内容;
  • Reader读取产品:支持各类公开合规页面的抓取读取。使用便捷,输入目标url即可返回全文信息,对静态页面、动态页面均能完成读取,满足多种输出格式,性能优越;

产品优势

  • 高稳定性:专为构建高度稳定、可靠和可扩展的应用而设计,在每秒处理 100 多次查询 (QPS) 的同时,延迟低于一秒,并保证 99.9% 的服务可靠性
  • 易用性:只需两行代码即可快速集成、兼容必应标准 API 和多个搜索引擎
  • 高效率:小宿自研的搜索解决方案只需一次点击即可提供完整的网页内容、通过 AI 突出显示关键信息,消除额外页面访问或二次数据采集的麻烦
  • 全场景应用:将小宿的搜索功能与平台的大语言模型服务相结合,可快速构建各种应用程序,包括 AI 深度研究和基于 RAG 的客户服务等。
  • 全栈部署:通过灵活选择小宿提供的多种大语言模型与搜索产品,支持面向不同场景的一站式快速部署。

1.2 架构设计

1.2.1 设计原则

整体设计前后端分离,后端应用基于Strands Agents 框架,部署在AgentCore中,通过AgentCore gateway将小宿的智能搜索API转成支持大模型调用MCP工具,用户与agent的问答过程记录在AgentCore Memory中,提升用户体验;

1.2.2 架构图

1.3 集成过程

基于Amazon Bedrock AgentCore在打造强大Agentic Agent过程中可以免除繁杂的基础设施和运维基础工作,并可以灵活的框架选择及安全、可扩展且可靠的进行企业级Agent部署的优势,本次Agent Infra集成共涉及AgentCore多个模块,包括: AgentCore Runtime、AgentCore Memory、AgentCore Gateway等模块

集成过程分以下几个步骤:

  1. 项目初始化及准备;
  2. 集成AgentCore Runtime;
  3. 集成AgentCore Memory及对比效果测试;
  4. 通过Agentcore Gateway集成小宿智能搜索及对比效果测试;

1.3.1 准备工作

1、一个亚马逊云科技海外区域帐号;

2、申请小宿科技搜索API及key,具体申请方法请访问:https://www.xiaosuai.com/

1.3.2   项目初始化

首先安装uv作为Python包管理工具

curl -LsSf https://astral.sh/uv/install.sh | sh
mkdir agentcore-search-project && cd agentcore-search-project
uv init --python 3.11
uv add fastapi uvicorn[standard] pydantic httpx strands-agents

1.3.2.1 项目目录结构

agentcore-search-project/
├── agent.py                          #集成FastAPI application
├── utils.py                             #相关工具函数
├── agentcore_memory.py    #AgentCore Memory 管理器
├── mcp_client_strands.py    #MCP客户端
├── session_registry.py         #会话注册相关
├── user_session.py              #会话管理
├── Dockerfile                       # ARM64 container configuration
├── pyproject.toml               # Created by uv init
└── uv.lock                           # Created automatically by uv

1.3.2.2 Strands Agent初始化及模型定义

Strands支持多种模型接入方式,下面以使用Amazon Bedrock中的claude-sonnect-4模型为例。

from strands import Agent
from strands.models import BedrockModel
# 配置Bedrock model
bedrock_model = BedrockModel(
    model_id="us.anthropic.claude-sonnet-4-20250514-v1:0",
    region_name="us-east-1",
    max_tokens=40000,
    temperature=0.3,
)
# 创建 Agent
agent = Agent(model=model, tools=[calculator, current_time])
# 使用 Agent
response = agent("你好")

1.3.3 集成AgentCore Runtime

本次选择Strands Agents作为agent开发框架,其中Agent逻辑代码、本地tools及Agent上下文相关组件全部部署在AgentCore Runtime中。

AgentCore Runtime 是一个安全的无服务器运行时,专为代理工作负载而构建,可使用当前主流agent开源框架,具有业界领先的扩展运行时支持、快速冷启动、真正的会话隔离、内置身份以及对多模式负载的支持,开发Agent过程中只需关注业务逻辑代码的开发,无法关注基础设施的维护及扩展,大大减轻在基础设施上的准备工作。

以下为将开发好后的Agent工作负载部署到AgentCore Runtime中的详细步骤。

1.3.3.1  准备身份验证信息

Amazon Bedrock AgentCore 运行时为托管代理提供两种身份验证机制:IAM SigV4和JWT Bearer Token身份验证。

本次使用Cognito JWT Bearer Token方式提供身份验证;准备setup_cognito.sh脚本,脚本中TEMP_PASSWORD and PERMANENT_PASSWORD 更换为实际值

#!/bin/bash

# Create User Pool and capture Pool ID directly
export POOL_ID=$(aws cognito-idp create-user-pool \
  --pool-name "MyUserPool" \
  --policies '{"PasswordPolicy":{"MinimumLength":8}}' \
  --region us-east-1 | jq -r '.UserPool.Id')

# Create App Client and capture Client ID directly
export CLIENT_ID=$(aws cognito-idp create-user-pool-client \
  --user-pool-id $POOL_ID \
  --client-name "MyClient" \
  --no-generate-secret \
  --explicit-auth-flows "ALLOW_USER_PASSWORD_AUTH" "ALLOW_REFRESH_TOKEN_AUTH" \
  --region us-east-1 | jq -r '.UserPoolClient.ClientId')

# Create User
aws cognito-idp admin-create-user \
  --user-pool-id $POOL_ID \
  --username "testuser" \
  --temporary-password "TEMP_PASSWORD" \
  --region us-east-1 \
  --message-action SUPPRESS > /dev/null

# Set Permanent Password
aws cognito-idp admin-set-user-password \
  --user-pool-id $POOL_ID \
  --username "testuser" \
  --password "PERMANENT_PASSWORD" \
  --region us-east-1 \
  --permanent > /dev/null

# Authenticate User and capture Access Token
export BEARER_TOKEN=$(aws cognito-idp initiate-auth \
  --client-id "$CLIENT_ID" \
  --auth-flow USER_PASSWORD_AUTH \
  --auth-parameters USERNAME='testuser',PASSWORD='PERMANENT_PASSWORD' \
  --region us-east-1 | jq -r '.AuthenticationResult.AccessToken')

# Output the required values
echo "Pool id: $POOL_ID"
echo "Discovery URL: https://cognito-idp.us-east-1.amazonaws.com/$POOL_ID/.well-known/openid-configuration"
echo "Client ID: $CLIENT_ID"
echo "Bearer Token: $BEARER_TOKEN"

运行脚本

source setup_cognito.sh

输出结果如下:

Pool id: us-east-1_poolid
Discovery URL: https://cognito-idp.us-east-1.amazonaws.com/us-east-1_userpoolid/.well-known/openid-configuration
Client ID: clientid
Bearer Token: bearertoken

记录其中的Discovery URL、Client ID,token可以实时刷新获取,获取方式如下:

实时获取最新获取token

 export TOKEN=$(aws cognito-idp initiate-auth \
            --client-id "5d17l32agbailqae0marcut6dt" \
            --auth-flow USER_PASSWORD_AUTH \
            --auth-parameters USERNAME='adminuser',PASSWORD='agentcore2025' \
            --region us-east-1 | jq -r '.AuthenticationResult.AccessToken')

1.3.3.2  本地测试

代码调试完成后,可以先在本地测试,验证基本功能是否正常,本地测试方法如下:

#cd agentcore-search-project
# Run the application
uv run uvicorn agent:app --host 0.0.0.0 --port 8080

# Test /ping endpoint
curl http://localhost:8080/ping

# Test /invocations endpoint
curl -X POST http://localhost:8080/invocations \
  -H "Content-Type: application/json" \
  -d '{
    "input": {"prompt": "What is artificial intelligence?"}
  }'

查看响应是否正常,如测试正常后,进行打包成容器镜像。

1.3.3.3  准备制作镜像的Dockerfile

Dockerfile内容

# Use uv's ARM64 Python base image
FROM --platform=linux/arm64 ghcr.io/astral-sh/uv:python3.11-bookworm-slim
WORKDIR /app
# Copy uv files
COPY pyproject.toml uv.lock ./
# Install dependencies (including strands-agents)
RUN uv sync --frozen --no-cache
# Copy all project files
COPY . .
# Expose port
EXPOSE 8080
# Run application
CMD ["uv", "run", "uvicorn", "agent:app", "--host", "0.0.0.0", "--port", "8080"]

1.3.3.4  镜像打包并部署到ECR

通过以下命令进行镜像打包测试并推送到ECR

docker buildx create --use
docker buildx build --platform linux/arm64 -t agentcore-search-project:arm64 --load .

# Test locally with credentials
docker run --platform linux/arm64 -p 8080:8080 \
  -e AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" \
  -e AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" \
  -e AWS_SESSION_TOKEN="$AWS_SESSION_TOKEN" \
  -e AWS_REGION="$AWS_REGION" \
  agentcore-search-project:arm64
# deploy ecr
# Create ECR repository
aws ecr create-repository --repository-name agentcore-search-project --region us-east-1
# Login to ECR
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <your accountid>.dkr.ecr.us-east-1.amazonaws.com

# Build and push to ECR
docker buildx build --platform linux/arm64 -t <your accountid>.dkr.ecr.us-east-1.amazonaws.com/agentcore-search-project:latest --push .

# Verify the image
aws ecr describe-images --repository-name agentcore-search-project-agent --region us-east-1

1.3.3.5  将镜像部署到AgentCore runtime

通过脚本将镜像部署到AgentCore Runtime。需要修改的部署脚本deploy_agent.py中的配置项为环境中实际值:

  • containerUri:ecr中上传的实际镜像URL
  • discoveryUrl:配置cognito中的Discovery URL
  • allowedClients:配置cognito中的Client ID

deploy_agent.py文件

import boto3
client = boto3.client('bedrock-agentcore-control')
response = client.create_agent_runtime(
    agentRuntimeName='agentcore_search_project',
    agentRuntimeArtifact={
        'containerConfiguration': {
            'containerUri': '<your accountid>.dkr.ecr.us-east-1.amazonaws.com/agentcore-search-project:latest'
        }
    },
    authorizerConfiguration={
        "customJWTAuthorizer": {
            "discoveryUrl": '<your discoveryurl>',
            "allowedClients": ['<your client id>']
        }
    },
    networkConfiguration={"networkMode": "PUBLIC"},
    roleArn='arn:aws:iam::<your accountid>:role/agentcore_role_search'
)

print(f"Agent Runtime created successfully!")
print(f"Agent Runtime ARN: {response['agentRuntimeArn']}")
print(f"Status: {response['status']}")

#python3 deploy_agent.py 
Agent Runtime created successfully!
Agent Runtime ARN: arn:aws:bedrock-agentcore:us-east-1:<your accountid>:runtime/agentcore_search_project_agent-g32TElETyO
Status: CREATING

1.3.3.6  验证调用是否正常

流式调用验证负载部署到AgentCore Runtime后是否响应正常。

invoke_agent_stream.py

import requests
import urllib.parse
import json
import os

# Configuration Constants
REGION_NAME = "us-east-1"

# === Agent Invocation Demo ===
invoke_agent_arn = "arn:aws:bedrock-agentcore:us-east-1:<your accountid>:runtime/agentcore_search_project-g32TElETyO"
auth_token = os.environ.get('TOKEN')
print(f"Using Agent ARN from environment: {invoke_agent_arn}")

# URL encode the agent ARN
escaped_agent_arn = urllib.parse.quote(invoke_agent_arn, safe='')

# Construct the URL
url = f"https://bedrock-agentcore.{REGION_NAME}.amazonaws.com/runtimes/{escaped_agent_arn}/invocations?qualifier=DEFAULT"
print(f"url is : {url}")
# Set up headers
headers = {
    "Authorization": f"Bearer {auth_token}",
    "X-Amzn-Trace-Id": "boto3traceidv3", 
    "Content-Type": "application/json",
    "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id": "966f982f-3492-43fc-a40a-67b3c217cd65"
}

# Enable verbose logging for requests
import logging
logging.basicConfig(level=logging.DEBUG)
logging.getLogger("urllib3.connectionpool").setLevel(logging.DEBUG)

invoke_response = requests.post(
    url,
    headers=headers,
    data=json.dumps({"prompt": "Hello"}),
    stream=True
)

# Print response in a safe manner
print(f"Status Code: {invoke_response.status_code}")
print(f"Response Headers: {dict(invoke_response.headers)}")

# Handle response based on status code
if invoke_response.status_code == 200:
    # response_data = invoke_response.json()
    # print("Response JSON:")
    # print(json.dumps(response_data, indent=2))  
    # 处理流式数据
    for line in invoke_response.iter_lines():
        if line:
            decoded_line = line.decode('utf-8')
            print(f"收到数据: {decoded_line}")
            
            # 如果是JSON格式的流数据,可以尝试解析
            try:
                json_data = json.loads(decoded_line)
                print(f"解析后的JSON: {json.dumps(json_data, indent=2)}")
            except json.JSONDecodeError:
                # 不是JSON格式,直接打印原始数据
                pass
elif invoke_response.status_code >= 400:
    print(f"Error Response ({invoke_response.status_code}):")
    error_data = invoke_response.json()
    print(json.dumps(error_data, indent=2))
    
else:
    print(f"Unexpected status code: {invoke_response.status_code}")
    print("Response text:")
    print(invoke_response.text[:500])

python3 invoke_agent_stream.py

#正常会响应包括HTTP/1.1" 200 None Status Code: 200及相关流式答复

响应正常说明工作负载在AgentCore Runtime中部署成功。

1.3.4   集成AgentCore Memory

AgentCore Memory分Short-term Memory和Long-term Memory两个类型的组件。

为了维持同一个会话内的连贯性和上下文感知,让智能体记住在当前会话中刚刚发生的事,避免用户不断重复信息,因此当前会话内容存入AgentCore的Short-term memory中。

同时为了实现智能体的个性化及让智能体未来如何更懂用户,让智能体跨越不同的对话会话“记住”用户的独特偏好、习惯、风格和背景信息,下次回答用户问题时,会自动应用用户的这些个性化信息,为不同用户提供量身定制的服务,本次同时会开启Long-term memory功能。

通过Short-term memory与Long-term memory的结合,共同使得智能体从一个健忘的、一次性的工具,转变为一个持续的、有洞察力的、个性化的数字伙伴,实现真正智能、上下文感知且个性化的交互体验。

1.3.4.1   集成AgentCore Memory用例:

通过create_event()将用户会话信息写入Memory中。

from bedrock_agentcore.memory import MemoryClient
# 定义指定区域的Memory
client = MemoryClient(region_name="us-east-1")
#创建Memory
memory = client.create_memory(
    name="XiaosuSearchAgentMemory",
    description="Memory for Xiaosu Search Agent conversations",
)
# 会话信息写入Memory
client.create_event(
    memory_id=memory.get("id"), # This is the id from create_memory or list_memories
    actor_id="xiaosu",  # This is the identifier of the actor, could be an agent or end-user.
    session_id="Session1", #Unique id for a particular request/conversation.
    messages=[
        ("hello,introduce youself", "USER"),
        ("Hello! I'm Claude, an AI assistant created by Anthropic. I'm here to help you with a wide variety of tasks and questions.", "ASSISTANT")
    ],
)

1.3.4.2  是否启用Memory对比测试效果

对比测试方式:

预先与agent交流并将用户提问的问题和Agent的答复一起保存到Memory中。然后在新会话中提问与前面会话相关的问题,对比启用与不启用Memory两种情况下Agent的回复情况。

通过是否调用strands_provider.tools来确定是否开启memory;

from strands import tool, Agent
from strands_tools.agent_core_memory import AgentCoreMemoryToolProvider
import time
from bedrock_agentcore.memory import MemoryClient
strands_provider = AgentCoreMemoryToolProvider(
    memory_id="memory_long-DrxHPxGUTl",
    actor_id="xiaosu",
    session_id="session-long-memory",
    namespace="/strategies/memory_semantic_xbsge-4Zqb4dEJKA/actors/xiaosu",
    region="us-east-1"
)
#不使用long-memory tool
#agent = Agent()
#使用long-memory tool
agent = Agent(tools=strands_provider.tools)
# This will use the long-term memory tool
agent("哪里的秋天很美?")

1.3.4.2.1 历史会话一

    "问": "我觉得北京的秋天很美,秋高气爽,香山红叶,枫叶渐红",
    "答": "[{'text': '您说得非常对!北京的秋天确实是一年中最美的季节之一。秋高气爽的天气让人心旷神怡,湛蓝的天空配上清爽的微风,给人一种特别舒适的感觉。\\n\\n香山红叶更是北京秋天的经典象征,每年10月中下旬到11月初,满山的枫叶、黄栌叶逐渐变红,层林尽染,美不胜收。从山顶俯瞰,红黄相间的叶子如同大自然的调色板,格外壮观。\\n\\n除了香山,北京还有很多地方可以欣赏秋景:\\n- **钓鱼台银杏大道** - 金黄的银杏叶飘洒\\n- **地坛公园** - 银杏林海一片金黄  \\n- **奥林匹克森林公园** - 色彩斑斓的秋叶\\n- **北海公园** - 古典园林配秋色更有韵味\\n\\n北京的秋天虽然短暂,但确实是最值得珍惜和欣赏的季节。您有没有特别喜欢的赏秋地点呢?'}]"

新会话问题:

问:

哪里的秋天很美?

答复结果

开启Memory 不开启Memory

我来搜索一下关于美丽秋天地点的记忆信息。

Tool #1: agent_core_memory

根据我的记忆,北京的秋天非常美丽!特别是香山的红叶,搭配上秋天清爽干燥的天气,形成了非常迷人的景色。

除了北京,世界上还有很多地方的秋天都非常美丽,比如:

🍁 **中国**:

– **北京香山** – 红叶满山,层林尽染

– **九寨沟** – 彩林倒映在湖水中

– **新疆喀纳斯** – 金黄的白桦林

– **内蒙古额济纳** – 胡杨林金黄璀璨

🍁 **国外**:

– **日本京都** – 红枫古寺,诗情画意

– **美国新英格兰地区** – 枫叶如火,色彩斑斓

– **加拿大魁北克** – 满山红叶,如诗如画

– **德国巴伐利亚** – 金秋田园风光

每个地方的秋天都有其独特的美丽,你有特别想了解哪个地方的秋景吗?

 

有很多地方的秋天都非常美丽,比如:

**国内推荐:**

– **北京香山** – 红叶满山,层林尽染

– **新疆喀纳斯** – 金黄的白桦林倒映在湖水中

– **四川九寨沟** – 彩林与湖泊相映成趣

– **内蒙古额济纳** – 胡杨林金黄一片,非常震撼

– **安徽黄山** – 云海与秋色交相辉映

– **江南水乡** – 桂花飘香,银杏叶黄

**国外推荐:**

– **加拿大魁北克** – 枫叶大道色彩斑斓

– **美国新英格兰** – 红枫遍野,如诗如画

– **日本京都** – 红叶与古寺相得益彰

– **德国巴伐利亚** – 城堡与秋林的完美结合

每个地方都有独特的秋日魅力,你比较想了解哪个地区呢?我可以提供更详细的信息。

 

1.3.4.2.2 历史会话二

"问": "我觉strands agents是一个非常适合开发agent的框架,采用模型驱动(Model-Driven)的设计理念,充分发挥先进大模型在规划、思维链(Chain-of-Thought)、工具调用及自我反思等方面的能力,显著地简化了智能体的开发流程。开发者仅需定义核心提示词(Prompt)和可调用的工具列表(Tools),即可快速构建功能智能体(Agent),并能将本地测试成果无缝部署至云端环境",
"答": "[{'text': '您对 Strands Agents 框架的评价非常精准!确实,这个框架体现了现代 AI Agent 开发的先进理念。让我为您总结一下 Strands Agents 的核心优势:\\n\\n## 🎯 核心特色\\n\\n### 1. **模型驱动设计**\\n- 充分利用大模型的原生能力\\n- 减少人工编程逻辑,让 AI 自主决策\\n- 更符合 AI 时代的开发范式\\n\\n### 2. **强大的认知能力**\\n- **规划能力**:智能分解复杂任务\\n- **思维链推理**:逐步分析问题\\n- **工具调用**:灵活使用各种工具\\n- **自我反思**:持续优化执行策略\\n\\n### 3. **极简开发体验**\\n```\\n开发者只需关注:\\n├── 核心提示词 (Prompt) - 定义 Agent 行为\\n└── 工具列表 (Tools) - 提供功能支持\\n```\\n\\n### 4. **无缝部署**\\n- 本地开发 → 云端部署\\n- 开发测试环境一致性\\n- 生产级可扩展性\\n\\n## 🛠️ 实际应用价值\\n\\n这种设计理念特别适合:\\n- **快速原型开发**:想法到产品的快速验证\\n- **复杂业务场景**:需要多步骤推理的任务\\n- **团队协作**:降低 AI 开发门槛\\n- **企业级应用**:稳定可靠的云端部署\\n\\n您是否正在使用 Strands Agents 开发特定的 Agent 应用?我可以帮您进一步探讨技术细节或最佳实践!'}]"

新会话问题:

问:

推荐一个适合开发agnet的框架
开启Memory 不开启Memory

基于我的记忆,您之前对 **Strands Agents** 框架给予了很高的评价!我推荐您继续考虑这个框架,因为它确实非常符合现代 Agent 开发的需求。

## 推荐 Strands Agents 的理由:

### 🎯 **核心优势**

– **模型驱动设计**: 充分发挥大模型的认知能力

– **简化开发流程**: 只需定义提示词和工具列表

– **思维链支持**: 内置 Chain-of-Thought 推理能力

– **自我反思机制**: 具备自主优化和决策能力

– **无缝部署**: 本地测试到云端部署一键切换

### 💡 **开发便利性**

1. **低门槛**: 不需要复杂的架构设计

2. **高效率**: 快速原型到生产环境

3. **强扩展**: 工具调用机制灵活

4. **好维护**: 模型驱动的声明式开发

### 🚀 **适用场景**

– 智能客服系统

– 自动化工作流

– 知识问答助手

– 复杂任务规划

– 多工具协作场景

考虑到您对 AI 原生开发环境和自动化工具的兴趣,Strands Agents 的模型驱动理念应该很符合您的技术偏好。您想了解这个框架的哪个具体方面呢?

我推荐以下几个优秀的 Agent 开发框架,根据不同需求选择:

## 🔥 热门推荐

### 1. **LangChain**

– **优势**:生态最完善,文档丰富,社区活跃

– **适用场景**:快速原型开发,复杂工作流

– **特点**:

– 丰富的工具集成

– 支持多种 LLM

– 内存管理和链式调用

“`python

from langchain.agents import initialize_agent, Tool

from langchain.llms import OpenAI

tools = [Tool(name=”Calculator”, func=calculator)]

agent = initialize_agent(tools, OpenAI(), agent=”zero-shot-react”)

“`

### 2. **AutoGen** (微软)

– **优势**:多 Agent 协作能力强

– **适用场景**:需要多个 Agent 协同工作

– **特点**:

– 对话式 Agent 交互

– 角色分工明确

– 支持代码执行

### 3. **CrewAI**

– **优势**:专注团队协作,易于使用

– **适用场景**:模拟团队工作流程

– **特点**:

– 角色、目标、工具的清晰定义

– 自动任务分配

– 简洁的 API

## 🚀 新兴框架

### 4. **Semantic Kernel** (微软)

– **优势**:企业级,与 Azure 集成好

– **适用场景**:企业应用开发

### 5. **Haystack**

– **优势**:专注 RAG 和搜索

– **适用场景**:知识库问答系统

## 💡 选择建议

– **初学者**:推荐 LangChain 或 CrewAI

– **企业项目**:Semantic Kernel 或 AutoGen

– **研究实验**:LangChain + 自定义组件

 

 1.3.4.2.3 历史会话三

"问": "我觉kiro是一款非常好的代码辅助IDE工具,它通过 “规范驱动开发”(Spec-Driven Development) 的理念,重塑软件开发流程,帮助开发者更高效地实现从概念构想到生产部署的全过程的AI 原生集成开发环境(agentic IDE),弥补用户在Agent项目开发过程的技能不足",
"答": "[{'text': '您对 Kiro 的评价非常中肯!Kiro 确实代表了 AI 辅助开发工具的一个重要发展方向。让我来总结一下您提到的 Kiro 的核心特色:\\n\\n## Kiro 的核心优势\\n\\n### 1. **规范驱动开发(Spec-Driven Development)**\\n- 通过明确的规范定义来指导整个开发流程\\n- 从概念设计阶段就建立清晰的开发蓝图\\n- 确保开发过程的一致性和可预测性\\n\\n### 2. **AI 原生集成开发环境(Agentic IDE)**\\n- 深度集成 AI 能力,不只是简单的代码补全\\n- 提供智能化的开发决策支持\\n- 实现真正的 AI-人类协作开发模式\\n\\n### 3. **全流程覆盖**\\n- **概念构想** → **设计规范** → **代码实现** → **测试部署** → **生产发布**\\n- 打通开发全链路,避免各阶段间的割裂\\n\\n### 4. **技能补齐**\\n- 特别针对 Agent 项目开发的复杂性\\n- 帮助开发者克服技能瓶颈\\n- 降低 AI 应用开发的门槛\\n\\n## 这种工具的价值\\n\\n在当前 AI 快速发展的背景下,像 Kiro 这样的工具确实填补了一个重要空白:\\n- **降低学习成本**:让更多开发者能够参与 AI 项目\\n- **提升开发效率**:规范化流程减少试错成本\\n- **保证项目质量**:系统性的开发方法论\\n\\n您是否在实际项目中使用过 Kiro?或者想了解更多关于规范驱动开发在具体项目中的应用场景?'}]"

新会话问题:

推荐一个代码辅助工具
开启Memory 不开启Memory

根据我们的对话记录,我发现您之前提到Krio是一个不错的代码辅助工具,而且您对AI辅助开发工具很感兴趣。基于您的需求,我可以推荐几个优秀的代码辅助工具:

## 主流代码辅助工具推荐

### 1. **GitHub Copilot**

– Microsoft与OpenAI合作开发

– 基于GPT模型,代码补全能力强

– 支持多种编程语言

– IDE集成度高(VS Code、JetBrains等)

### 2. **Cursor**

– 新一代AI代码编辑器

– 内置Claude和GPT模型

– 支持自然语言编程对话

– 代码重构和解释能力出色

### 3. **Tabnine**

– 本地化AI代码补全

– 注重代码隐私安全

– 支持团队自定义模型训练

– 多IDE支持

我来为您推荐几个优秀的代码辅助工具:

## 🚀 顶级推荐

**GitHub Copilot**

– AI驱动的代码自动补全

– 支持多种编程语言

– 与VS Code、JetBrains等IDE深度集成

– 能理解上下文,生成高质量代码片段

## 🔥 其他优秀选择

**1. Cursor**

– 基于AI的代码编辑器

– 智能代码生成和重构

– 自然语言编程支持

**2. Tabnine**

– AI代码补全工具

– 支持本地部署,保护隐私

– 多IDE支持

**3. CodeWhisperer (Amazon)**

– 免费使用

– 实时代码建议

– 安全漏洞检测

**4. Codeium**

– 免费的AI编程助手

– 快速代码补全

– 支持70+编程语言

## 💡 选择建议

– **初学者**:推荐GitHub Copilot或Codeium

– **专业开发**:GitHub Copilot + IDE插件组合

– **注重隐私**:Tabnine本地版本

– **预算有限**:Codeium或CodeWhisperer

1.3.4.2.4 历史会话四

"问": "我觉得小宿智能搜索是专为Agent设计的智能搜索与数据服务,提供多语言、多模态、多能力的数据获取与处理服务,小宿智能搜索覆盖35种以上语言能力,是目前国内支持语种最多的AI搜索服务,小宿智能搜索支持文搜图、图搜图、视频检索等多模态内容搜索能力,全文抓取突破了以往AI搜索的摘要限制,还有Markdown格式转换、核心数据自动标注等工具,实现90%结构化输出,直接适配Agent的自动化处理需求",
"答": "[{'text': '您分享的小宿智能搜索信息确实很有价值!\\n\\n让我总结一下您提到的小宿智能搜索的主要特点:\\n\\n## 小宿智能搜索的核心优势\\n\\n### 🌍 多语言支持\\n- 覆盖35种以上语言\\n- 国内支持语种最多的AI搜索服务\\n\\n### 🎯 多模态搜索\\n- **文搜图**:通过文本描述搜索相关图片\\n- **图搜图**:以图搜图的相似度匹配\\n- **视频检索**:视频内容智能检索\\n\\n### 🔧 数据处理能力\\n- **全文抓取**:突破传统AI搜索的摘要限制\\n- **Markdown转换**:自动格式化输出\\n- **核心数据标注**:智能识别关键信息\\n- **90%结构化输出**:便于程序化处理\\n\\n### 🤖 Agent专用设计\\n- 专为自动化Agent场景优化\\n- 直接适配自动化处理需求\\n- 结构化输出减少二次处理成本\\n\\n这确实是一个很有前景的AI搜索服务,特别是对于需要多模态搜索和高度结构化输出的应用场景。您是在使用这个服务吗?还是对它的某些功能特别感兴趣?'}]"

小宿智能搜索怎么样?
开启Memory 不开启Memory

我需要先查看一下是否有关于”小宿智能搜索”的相关记忆,让我搜索一下。

Tool #1: agent_core_memory

根据我的记忆,我对小宿智能搜索印象很深刻!从我们之前的对话中,我记得你对小宿智能搜索的一些特色功能很感兴趣,特别是:

**小宿智能搜索的亮点特性:**

1. **多语言支持** – 支持35种以上语言,这在全球化时代非常实用

2. **多模态搜索** – 不仅限于文本,还支持图像、视频等多种媒体格式

3. **结构化输出** – 能够以更有组织的方式呈现搜索结果

4. **Agent适配能力** – 特别适合AI代理项目的集成使用

从技术角度来看,小宿智能搜索在AI搜索服务领域确实有其独特价值,特别是对于需要多语言、多模态搜索能力的项目来说。它的这些特性使其在传统搜索引擎基础上提供了更智能化的搜索体验。

你现在是想了解更多关于小宿智能搜索的具体应用场景,还是对其某个特定功能有新的看法想分享?

我不太熟悉”小宿智能搜索”这个具体产品。能否请您提供更多信息,比如:

– 这是什么类型的搜索工具?

– 主要用于什么场景?

– 您是想了解它的功能特点,还是在考虑是否使用?

如果您能分享更多背景信息,我会很乐意帮您分析这个产品的优缺点,或者与其他类似工具做比较。您也可以告诉我您的具体需求,我可能能推荐一些合适的替代方案。

1.3.4.3 集成AgentCore Memory对比结论

从对比测试可以发现,在集成并启用AgentCore Memory后,对于用户问题的理解更加准确,答复结果更加合理,可以达到Agent的“千人千面”。

1.3.5 通过AgentCore Gateway集成小宿智能搜索

Amazon Bedrock AgentCore Gateway 是 亚马逊云科技推出的全托管工具管理中枢,专为 AI 代理设计,它能将 API、Lambda 函数、第三方服务快速转化为符合 Model Context Protocol (MCP) 的工具,同时为 AI 代理提供统一、安全的工具访问入口。

本次通过AgentCore Gateway将小宿搜索SmartSearch和Full-Text Search两个产品的标准 API快速封装成符合MCP标准的工具,方便Strands Agents以tooluse的方式调用;

1.3.5.1  AgentCore Gateway与小宿智能搜索集成过程

设置Inbound Authorization

在创建网关(Gateway)之前,需要先配置入站授权(Inbound Authorization),以验证尝试通过 Amazon Bedrock AgentCore 网关访问目标(Targets)的调用方身份。

入站授权基于OAuth 授权机制实现:客户端应用程序必须先通过 OAuth 授权器(OAuth Authorizer)完成身份验证,才能使用网关服务。验证通过后,客户端会获取一个访问令牌(access token),并在运行时使用该令牌进行网关调用。

此实验通过 AgentCore Python SDK 配置 Cognito 简易授权(Cognito EZ Auth)。此方式可省去 OAuth 配置的繁琐流程。

#Import SDK and set up client
frombedrock_agentcore_starter_toolkit.operations.gateway.client importGatewayClient
importlogging
client= GatewayClient(region_name="us-west-2")
client.logger.setLevel(logging.DEBUG)

#Retrieve the authorization configuration from the create response.
cognito_result= client.create_oauth_authorizer_with_cognito("agentcore-gateway")
authorizer_configuration= cognito_result["authorizer_config"]

创建Gateway

设置好Inbound Authorization后,可以使用亚马逊云科技管理控制台或CreateGateway API操作创建网关,本次实验使用AgentCore SDK创建Gateway。

fulltextsearch_gateway= client.create_mcp_gateway(
    name="fulltextsearch-gateway", #the name of the Gateway 
    role_arn=None, # the role arn that theGateway will use
    authorizer_config=authorizer_configuration,
    enable_semantic_search=True, # enablesemantic search.
)

设置Outbound Authorization

出站授权(Outbound Authorization)允许 Amazon Bedrock AgentCore 网关,代表 “已通过入站授权(Inbound Auth)验证并获得授权的用户”,安全地访问网关目标(gateway targets)。与AWS资源或Lambda函数类似,可通过IAM凭证完成身份验证。对于其他类型的资源,可以使用 OAuth 2LO(OAuth 两步验证)或 API Key。

本次实验我们使用API Key,使用boto3 SDK创建API

importboto3

agentcore_client=boto3.client(service_name="bedrock-agentcore-control",region_name=”us-west-2”)

apikey_response=agentcore_client.create_api_key_credential_provider(
    name="XiaosuAIAPIKey", 
    apiKey="xxxxxxxxxxxxxxxxxxxxx", #注册小宿AI平台账号后从小宿AI控制台获取APIKey
)

上传Fulltext Search API的OpenAPI Schema

OpenAPI Target的作用是将网关与“通过OpenAPI规范定义的REST API”建立连接。网关会将接收到的 MCP(Model Context Protocol,模型上下文协议)请求,转化为发送给这些REST API的HTTP请求,并处理响应格式的转换(即将API返回的响应适配为MCP格式)。OpenAPI Schema是描述REST API的OpenAPI规范文档,定义了API的接口路径、请求参数、响应结构等核心信息。

使用OpenAPI Target时,需注意以下要求与限制条件:

  • 支持的OpenAPI版本为3.0和3.1(不支持Swagger 2.0)
  • OpenAPI文件必须无语义错误
  • server属性需包含实际端点的有效URL
  • 仅完全支持application/json这一种内容类型(content type)
  • 不支持oneOf、anyOf、allOf等复杂架构特性
  • 不支持路径参数序列化器,以及用于查询参数(query)、请求头参数(header)、Cookie 参数的参数序列化器

每个大语言模型(LLM)均有ToolSpec(工具规范)约束。若OpenAPI中的 API、属性或对象名称不符合下游对应LLM的ToolSpec要求,数据平面(data plane)将执行失败。常见错误包括属性名称超过允许长度,或名称包含不支持的字符。

小宿Fulltext Search API文档请查看:

https://docs.cloudsway.net/zh/IntelliSearch/api-reference/fulltextsearch/

本次实验的Fulltext Search API的OpenAPI Schema参考如下文件,需要将

full_text_search_openapi_schema.json上传到S3存储桶

full_text_search_openapi_schema.json
#文件内容如下:
{
  "openapi": "3.0.0",
  "info": {
    "title": "Full Text SearchAPI",
    "version": "1.0.0",
    "description": "API for fulltext search with complete web page content retrieval and advanced filteringcapabilities"
  },
  "servers": [
    {
      "url":"https://searchapi.cloudsway.net",
      "description": "Full TextSearch API Server"
    }
  ],
  "paths": {
    "/search/nKzioaqINegwNrST/full":{
      "get": {
        "summary": "Perform fulltext search",
        "description": "Searchfor web content and retrieve full text content with advanced filtering optionsincluding freshness, market, and safety filters",
        "operationId":"fullTextSearch",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "description": "Theuser's search query. This string cannot be empty. The query can containadvanced operators.",
            "required": true,
            "schema": {
              "type":"string"
            }
          },
          {
            "name":"count",
            "in": "query",
            "description":"Number of search results included in the return results",
            "required": false,
            "schema": {
              "type":"integer"
            }
          },
          {
            "name":"freshness",
            "in": "query",
            "description":"Filter search results by time values: Day, Week, Month. To get articleswithin a specific time range, specify a date range in the formatYYYY-MM-DD..YYYY-MM-DD. For example, 2019-02-01..2019-05-30.",
            "required": false,
            "schema": {
              "type":"string"
            }
          },
          {
            "name":"offset",
            "in": "query",
            "description": "Theoffset from zero, indicating the number of search results to skip beforereturning results. The default value is 0. Use this parameter with the countparameter to paginate the results.",
            "required": false,
            "schema": {
              "type": "integer",
              "format":"int16",
              "default": 0
            }
          },
          {
            "name": "mkt",
            "in": "query",
            "description": "Themarket from which the results come. Usually, mkt is the country where the usermade the request. The market must be in the language-country format. Forexample, en-US. The string is case-insensitive.",
            "required": false,
            "schema": {
              "type":"string"
            }
          },
          {
            "name": "cc",
            "in": "query",
            "description": "Atwo-character country code indicating the country from which the resultoriginated.",
            "required": false,
            "schema": {
              "type":"string",
              "maxLength": 2
            }
          },
          {
            "name":"safeSearch",
            "in": "query",
            "description": "Usedto filter adult content in web pages, images, and videos.",
            "required": false,
            "schema": {
              "type":"string",
              "enum":["Off", "Moderate", "Strict"]
            }
          },
          {
            "name":"setLang",
            "in": "query",
            "description": "Thelanguage for User Interface strings. You can use a 2-letter or 4-letter code tospecify the language. A 4-letter code is recommended in the form language-country,where language is an ISO 639-1 language code and country is an ISO 3166country/region code. For example, use en-US for US English.",
            "required": false,
            "schema": {
              "type":"string"
            }
          },
          {
            "name":"textDecorations",
            "in": "query",
            "description": "Aboolean value that determines whether the display string in the result shouldcontain decoration markers (such as hit highlighting characters). If true, thestring may contain markers. The default value is false.",
            "required": false,
            "schema": {
              "type":"boolean",
              "default": false
            }
          },
          {
            "name": "contentType",
            "in": "query",
            "description":"Enumeration value that affects the format of the full text contentreturned",
            "required": false,
            "schema": {
              "type":"string",
              "enum":["HTML", "MARKDOWN"]
            }
          }
        ],
        "responses": {
          "200": {
            "description":"Successful full text search response",
            "content": {
              "application/json": {
                "schema": {
                  "type":"object",
                  "properties": {
                    "queryContext": {
                      "type":"object",
                      "properties": {
                       "originalQuery": {
                          "type":"string",
                         "description": "The query string specified in therequest"
                        }
                      }
                    },
                    "webPages": {
                      "type": "object",
                      "properties": {
                        "value": {
                          "type":"array",
                          "items": {
                            "type":"object",
                            "properties":{
                              "name":{
                               "type": "string",
                               "description": "The name of the web page. Use this nameand the URL to create a hyperlink that users can click to go to the webpage."
                              },
                             "snippet": {
                                "type":"string",
                               "description": "A text snippet that describes the contentof a web page."
                              },
                              "url":{
                               "type": "string",
                               "description": "The URL of the web page. Use this URL andname to create a hyperlink that the user can click to go to the web page."
                              },
                             "content": {
                                "type":"string",
                               "description": "Full text content of the web page."
                              },
                             "displayUrl": {
                               "type": "string",
                               "description": "The display URL of the web page."
                              },
                             "datePublished": {
                               "type": "string",
                               "format": "date-time",
                               "description": "The time when the web page waspublished."
                              },
                             "siteName": {
                               "type": "string",
                                "description": "Thesource of the web page"
                              },
                              "logo":{
                               "type": "string",
                               "description": "The URL of the site's logo orfavicon."
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Badrequest - Invalid parameters or missing required query parameter"
          },
          "401": {
            "description": "Unauthorized- Invalid or missing access key"
          },
          "404": {
            "description": "Notfound - Invalid endpoint path"
          },
          "500": {
            "description":"Internal server error"
          }
        }
      }
    }
  }
}

创建OpenAPI Target

创建Gateway后,可以添加Targets (即网关托管的Tools)。AgentCore Gateway支持多种Target类型,包括Lambda函数和API规范(OpenAPI Schema或Smithy 模型均可)。

单个Gateway可以附加多个Target,且可以在任意时候修改Gateway所附加的Target/Tool。每个Target都可单独绑定Credential Provider:无论Target需要 IAM 凭证、API 密钥还是OAuth凭证,都能通过这种方式实现安全访问。

本次实验使用boto3 SDK为Gateway创建Fulltext Search API的Target。

# 设置变量
gateway_id =fulltextsearch_gateway["gatewayId"]
s3_uri = "s3://{bucket}/full_text_search_openapi_schema.json" #前面OpenAPI Schema的S3路径
s3_accountid = "{account id}"
api_key_provider_arn = apikey_response["credentialProviderArn"]

# Create the agentcore client
import boto3
agentcore_client =boto3.client('bedrock-agentcore-control', region_name = "us-west-2")

# Create an OpenAPI target with API Keyauthentication
fulltextsearch_target =agentcore_client.create_gateway_target(
   gatewayIdentifier=gateway_id,
   name="fulltextsearch-target",
   targetConfiguration={
       "mcp": {
           "openApiSchema": {
               "s3": {
                   "uri": s3_uri,
                   "bucketOwnerAccountId": s3_accountid
               }
            }
        }
    },
   credentialProviderConfigurations=[
        {
           "credentialProviderType": "API_KEY",
           "credentialProvider": {
               "apiKeyCredentialProvider": {
                   "providerArn": api_key_provider_arn,
                   "credentialLocation": "HEADER",
                   "credentialParameterName": "Authorization",
                   'credentialPrefix': 'Bearer'
               }
            }
        }
    ]
)

至此,我们已经完成通过Bedrock AgentCore Gateway实现小宿全文展示搜索MCP的配置,现在可以登录亚马逊云科技 Bedrock AgentCore控制台查看Gateway的信息。

我们可以通过控制台上提供的调用代码示例将Gateway集成到我们的Agent应用中,AgentCore Gateway支持Python with Requests、MCP Python SDK、Strands MCP Client、MCP Inspector等调用方式。

1.3.5.2  相同问题在是否启用小宿搜索的对比测试

上海今天的天气情况
启用小宿智能搜索 不启用小宿智能搜索

我来帮您查询上海今天的天气情况。根据搜索结果,我为您查到了上海今天(2025年9月7日,白露节气)的天气情况:

上海今天的天气情况

今天(9月7日) – 白露节气当日:

天气状况:以多云天气为主

最高气温:市区徐家汇站最高气温达到34.6℃

特殊天气现象:

午后局部地区出现强对流天气

出现了雷电、大风、暴雨和冰雹等现象

主要影响区域:中心城区、浦东、闵行、嘉定、青浦和奉贤等地

最大降雨量:嘉定江桥镇41.5毫米

最大阵风:浦东宣桥镇达6级

嘉定区江桥镇还出现了直径约1厘米的冰雹

明天预报(9月8日):

天气:多云,午后局部地区阴有短时阵雨或雷雨

温度:27-36℃

风力:东南风4-5级,雷雨时阵风7-9级

相对湿度:90%-45%

未来趋势:

下周二、周三受短波槽东移影响,会有较明显的降水过程,高温有所缓解,预计最高气温降至31-32℃

下周后期副热带高压再次加强,午后局地雷阵雨天气可能再次上线

今天上海的天气比较典型的夏末特征,虽然进入白露节气但仍然炎热,同时伴有午后雷阵雨等强对流天气。建议外出时注意防暑降温,并关注天气变化,做好防雷雨准备。

 

我很抱歉,我目前没有获取实时天气信息的工具。我无法为您提供上海今天的具体天气情况。

要获取上海今天的天气信息,我建议您:

查看天气应用:使用手机上的天气应用

搜索引擎:在百度、Google等搜索”上海天气”

天气网站:访问中国天气网、天气通等专业天气网站

新闻应用:许多新闻应用都有天气模块

如果您需要我帮助您做其他事情,比如数学计算、编程、文件编辑等,我很乐意为您提供帮助!

 

 1.3.5.3 对比结论

通过AgentCore Gateway以MCP方式接入小宿智能搜索的情况下,在最新实时问题的答复上,回复的信息更加准确,更贴合客户需要。

1.4 方案价值总结

Amazon Bedrock中托管了各行业领先的大模型阵容,降低用户使用不同大模型的对接工作,让客户根据具体场景选择最适合的模型,同时让客户享受亚马逊云科技在安全、隐私保护、可靠性等方在的优势。

Strands Agents开源框架,显著降低了智能体开发门槛,通过提供与AWS服务深度集成的、生产就绪的底层能力,显著降低了构建高效能、可扩展企业级智能体的开发门槛与复杂度。

借助Amazon Bedrock AgentCore模块化、可扩展的组件体系, AgentCore Runtime 提供了安全、隔离且支持长时间异步任务的无服务器环境, AgentCore Memory 实现了高精度的长短期记忆管理以维持对话上下文与用户偏好,AgentCore Gateway 安全无缝地连接和调用内外部的 API 与工具,多模块协同显著降低了构建生产级智能体的复杂度和运维负担,使客户能快速扩展至百万用户。

并通过AgentCore Gateway与小宿智能搜索的集成,方便的通过MCP调用小宿智能搜索,实现数据的高效处理和深度语义理解,显著提升了智能化水平。

小宿科技借助亚马逊云科技全球基础设施,一站式云上GenAI服务解方案,极大提升了企业级智能搜索开发及部署效率,为智能体的快速落地提供一个积极的探索。

1.6 在Amazon Quick Suite中集成智能搜索方案

在企业级应用场景中,除了构建独立的智能搜索Agent,还可以将上述方案中的智能搜索能力集成到Amazon Quick Suite中,为用户提供更强大的数据分析和智能决策支持。

Amazon Quick Suite是亚马逊云科技推出的生成式AI驱动的综合Agent办公平台,集成了数据可视化、工作流自动化、AI助手等多项能力。通过将基于Amazon Bedrock AgentCore Gateway的智能搜索方案集成到Quick Suite中,企业可以在数据分析和AI交互场景中获得实时外部信息检索能力,让BI分析与实时网络数据无缝结合。

1.6.1   集成方式

Quick Suite通过MCP(Model Context Protocol)集成机制,可以直接调用已部署在AgentCore Gateway中的小宿智能搜索工具。完整的集成实现代码已开源在GitHub:

项目地址amazon-quick-suite-web-search-integration

具体集成步骤包括:

  • 在Quick Suite控制台中配置MCP Integration,指向AgentCore Gateway端点
  • 使用Cognito Service-to-Service认证方式,配置Client ID、Client Secret和Token URL
  • 在Quick Suite的Chat Agent中直接使用Cloudsway智能搜索工具

1.6.2 Quick Suite控制台查看配置好的AgentCore Gateway连接

1.6.3 测试Cloudsway AI Search

Query:查询中国十五五期间的重点方向和规划

Cloudsway AI Search 返回结果,完整 API Response 如下:

{
    "InvokeActionOutput": {
        "mcpInvokeActionOutput": {
            "content": [
                {
                    "textContent": {
                        "text": {
                            "statusCode": 200,
                            "body": {
                                "content": [
                                    {
                                        "type": "text",
                                        "text": "# Cloudsway Smart Search 结果\n\n搜索词: 查询中国十五五期间的重点方向和规划\n共找到 3 个结果\n\n## 1. 十五五战略规划全文纲要、重点项目解读(2026-2030)\n**链接:** https://www.sohu.com/a/919149380_121937266\n**相关性:** 0.8830528\n**摘要:** 2025年7月30日·“十五五规划”即中国未来2026-2030年的国家发展计划,是政府制定的第15个“五年规划”,也是作为我国迈向2035年基本实现现代化的重要衔接规划,其出台对于指导未来五 …\n\n## 2. “十五五”目标,最全解读! - 知乎\n**链接:** https://zhuanlan.zhihu.com/p/1965053013371643553\n**相关性:** 0.57277185\n**摘要:** 2025年10月24日·1. 核心发展战略与目标 科技自立自强:是引领新质生产力的重中之重,是中美博弈的核心变量。“十五”期间要实现 九大未来产业 的 …\n\n## 3. 一图了解“十五五”规划12大重点方向_新浪财经_新浪网\n**链接:** https://finance.sina.com.cn/roll/2025-10-23/doc-infuwsqf2253703.shtml\n**相关性:** 0.9838752\n**摘要:** 2025年10月23日·一图了解“十五五”规划12大重点方向 2025年10月23日 19:47 东财财经头条 新浪财经APP 举报 缩小字体 放大字体 收藏 微博 微信 分享\n\n"
                                    }
                                ]
                            }
                        }
                    }
                }
            ]
        }
    },
    "InvokeActionResponseMetadata": {},
    "InvokeActionStatus": "SUCCESS",
    "RequestId": "366952c6-afdc-49d9-83a4-c02047366b38"
}

1.6.4 应用场景

该集成方案为企业场景提供实时信息检索能力。

例如:用户在Quick Suite的Chat Agent中可以直接使用Cloudsway智能搜索获取实时新闻、技术文档等信息,提升信息获取效率。

1.7 参考资料

https://strandsagents.com/1.x/documentation/docs/user-guide/deploy/deploy_to_bedrock_agentcore/

https://github.com/aws-samples/sample_agentic_ai_strands

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。

本篇作者

赵毅鹏

小宿科技售前与服务部总监,亚马逊云科技中国区APN合作伙伴大使,负责小宿科技售前解决方案及售后服务整体运营,具有丰富的IT行业管理及实践经验。

成希才

小宿科技解决方案架构师,负责小宿科技上云客户使用亚马逊云科技云计算服务时的方案架构的设计和技术咨询,以及小宿科技智能搜索、模型聚合服务推广工作。

沈磊

小宿科技解决方案架构师,负责小宿科技生成式AI相关产品及亚马逊云科技解决方案设计与咨询。

戴荣奕

小宿科技解决方案架构师,负责云计算与AI售前解决方案工作。

李君

亚马逊云科技资深生成式 AI 技术专家,负责基于亚马逊云科技生成式 AI 解决方案的设计、实施和优化。

汤市建

亚马逊云科技数据分析解决方案架构师,负责客户大数据解决方案的咨询与架构设计。

胡凯

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的云计算方案架构的咨询和设计,致力于亚马逊云科技云服务在企业的应用和推广。曾任职于 Rancher Labs,在容器及云原生领域拥有丰富的实践经验。

陈琪

亚马逊云科技资深解决方案架构师,十余年企业数字化转型经验,涉及架构设计、业务咨询、产品研发等领域。尤其在生成式AI应用场景落地、网络&数据安全、行业方案构建等领域具有丰富实践。现负责亚马逊云科技全国战略合作伙伴的能力体系建设、战略项目支持、创新方案构建。

夏卫国

亚马逊云科技合作伙伴解决方案架构师,负责亚马逊云科技合作伙伴生态系统的云计算方案架构咨询和设计,同时致力于亚马逊云科技云服务在国内的应用和推广。

何奇

亚马逊云科技解决方案架构师,目前专注于物联网、移动应用相关领域的解决方案。在加入 AWS 之前,从事智能终端、移动应用和AIoT设备相关的开发工作,拥有十余年技术服务经验。