1. 电商 Agent 从零到可运行卡点到底在哪电商 Agent 这件事真正动手做过的人都知道难的不是写一个能聊天的机器人而是把它做成一条能跑通的最小闭环用户说“帮我查下这个商品还有没有货”Agent 要能识别意图、调用商品查询工具、拿到结构化结果、再决定要不要继续下单。这条链路里模型、编排框架、工具协议、运行时环境任何一环配错整个流程就断在中间。我这次要搭的是一个快时尚电商场景的客服 Agent核心目标很明确以 Amazon Bedrock 上的 AgentCore 作为运行时用 Strands Agents 做工具调用编排再通过 MCP Server 把商品查询和下单能力暴露出来。听起来组件不少但真正落地时你会发现最耗时间的往往不是业务逻辑而是 Key 管理、环境变量、配置文件格式这些琐碎但必须一次做对的东西。这也是为什么我把 TaoToken 统一 Key 接入放在前面讲。传统做法是每个模型服务商、每个工具服务各配一套凭证本地调试时环境变量满天飞换台机器就得重新配一遍。TaoToken 的思路是用一个统一 Key 覆盖模型对话、编码计划、API 调用等场景对电商 Agent 这种需要频繁切换模型和工具的开发过程来说能省掉大量重复配置。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 后面配置里会直接用到。这篇文章适合谁如果你正在做电商 Agent、智能客服、或者任何需要“模型 工具 运行时”三件套的项目并且希望在两小时内跑通一条端到端下单链路那下面的步骤可以直接跟做。我会给出可复制的 config.toml 和 settings.json 骨架、TaoToken 统一 Key 的配置片段以及本地启动和一次完整下单验证的具体动作。2. TaoToken 前置统一 Key 怎么拿、怎么配在开始写 Agent 代码之前先把 Key 的事情解决掉。TaoToken 的控制台入口是 https://taotoken.net/console API Keys 管理页在 https://taotoken.net/api-keys 。注册登录后在 API Keys 页面创建一个新 Key复制出来备用。这个 Key 后面会同时用于模型对话和 Coding Plan 场景所以建议命名时带上项目名比如ecommerce-agent-dev方便后续区分。拿到 Key 之后不要急着写进代码。我习惯先把它放到本地环境变量里这样配置文件里只引用变量名不暴露明文。Linux/macOS 下可以这样操作export TAOTOKEN_API_KEYsk-你的实际Key export TAOTOKEN_BASE_URLhttps://taotoken.net/apiWindows PowerShell 下用$env:TAOTOKEN_API_KEYsk-你的实际Key $env:TAOTOKEN_BASE_URLhttps://taotoken.net/api这里有个细节要注意TaoToken 的 API 地址是 https://taotoken.net/api 不要在后面多加斜杠或者路径否则某些 SDK 拼接时会出问题。我试过在 Strands Agents 里直接传 base_url多一个斜杠就会报 404排查了半小时才发现是地址格式问题。如果你打算长期做编码和 Agent 开发可以顺便看一下 Coding Plan 页面 https://taotoken.net/coding-plan 它把模型调用和编码场景打包在一起对需要频繁跑 Agent 调试的团队来说比单独按量计费更可控。模型对话的入口在 https://taotoken.net/models 接入文档在 https://taotoken.net/doc 遇到配置问题可以先翻文档大部分常见错误都有说明。Key 准备好之后接下来就是把它写进 Agent 的配置文件里。下面我会给出两个骨架文件一个是 AgentCore 运行时用的 config.toml一个是 Strands Agents 和 MCP Server 共用的 settings.json。3. 可复制配置config.toml 与 settings.json 骨架3.1 config.tomlAgentCore 运行时配置AgentCore 作为运行时需要知道用哪个模型、走哪个 API 端点、以及工具服务怎么注册。下面这个 config.toml 是我实测能跑通的版本你可以直接复制后改 Key 和区域[agent] name ecommerce-agent version 0.1.0 description 快时尚电商客服 Agent支持商品查询与下单 [model] provider taotoken model_id claude-sonnet-4-5 base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY max_tokens 4096 temperature 0.3 [runtime] type agentcore region us-west-2 memory_enabled true memory_retrieval_top_k 5 [mcp_servers.product] command uvx args [mcp-server-productlatest] env { PRODUCT_API_BASE http://localhost:9100 } [mcp_servers.order] command uvx args [mcp-server-orderlatest] env { ORDER_API_BASE http://localhost:9101 } [tools] enabled [product_query, order_create, order_status] timeout_seconds 30这里有几个关键点。api_key_env指向环境变量名而不是直接写 Key这样配置文件可以安全地提交到仓库。base_url固定为 https://taotoken.net/api 不要改。MCP Server 部分我拆成了 product 和 order 两个分别对应商品查询和下单能力这样职责清晰调试时也容易定位是哪个工具出的问题。3.2 settings.jsonStrands Agents 与 MCP 共用配置Strands Agents 需要一个 settings.json 来定义 Agent 的行为和工具绑定。下面这个骨架包含了模型配置、MCP Server 注册和工具白名单{ agent: { name: ecommerce-cs-agent, system_prompt: 你是一个快时尚电商客服助手。用户询问商品时先调用 product_query 工具查询库存和价格用户确认下单时调用 order_create 工具创建订单。所有金额单位是人民币。, max_iterations: 8 }, model: { provider: taotoken, model_id: claude-sonnet-4-5, base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY }, mcp_servers: { product: { command: uvx, args: [mcp-server-productlatest], env: { PRODUCT_API_BASE: http://localhost:9100 } }, order: { command: uvx, args: [mcp-server-orderlatest], env: { ORDER_API_BASE: http://localhost:9101 } } }, tools: { product_query: { server: product, description: 根据商品名称或 SKU 查询库存、价格和规格 }, order_create: { server: order, description: 创建订单需要商品 SKU、数量和用户 ID }, order_status: { server: order, description: 查询订单状态需要订单号 } } }这两个文件放在项目根目录下AgentCore 启动时会自动读取 config.tomlStrands Agents 初始化时会读取 settings.json。如果你用的是其他编排框架只要保证模型 base_url 和 Key 环境变量一致工具注册方式可以按框架文档调整。3.3 MCP Server 的最小实现MCP Server 负责把商品查询和下单能力暴露成标准工具。下面是一个用 Python 写的极简 product MCP Server你可以保存为product_server.pyfrom mcp.server import Server from mcp.server.stdio import stdio_server from mcp.types import Tool, TextContent import json app Server(product-server) PRODUCTS { SKU001: {name: 基础款白T恤, price: 79, stock: 120}, SKU002: {name: 高腰牛仔裤, price: 199, stock: 45}, SKU003: {name: 轻薄羽绒服, price: 399, stock: 0}, } app.list_tools() async def list_tools(): return [ Tool( nameproduct_query, description根据 SKU 查询商品库存和价格, inputSchema{ type: object, properties: { sku: {type: string, description: 商品 SKU} }, required: [sku] } ) ] app.call_tool() async def call_tool(name: str, arguments: dict): if name product_query: sku arguments.get(sku) product PRODUCTS.get(sku) if not product: return [TextContent(typetext, textjson.dumps({error: 商品不存在}))] return [TextContent(typetext, textjson.dumps(product, ensure_asciiFalse))] return [TextContent(typetext, textjson.dumps({error: 未知工具}))] async def main(): async with stdio_server() as (read, write): await app.run(read, write, app.create_initialization_options()) if __name__ __main__: import asyncio asyncio.run(main())order MCP Server 结构类似把order_create和order_status两个工具暴露出来即可。启动时用uvx或者直接python product_server.py确保 config.toml 里的 command 和 args 与实际启动方式一致。4. 验证请求本地启动与端到端下单链路4.1 本地启动顺序配置写好后按这个顺序启动避免端口冲突和依赖顺序问题第一步启动 product MCP Serverpython product_server.py第二步启动 order MCP Serverpython order_server.py第三步启动 AgentCore 本地运行时agentcore dev --config config.toml预期输出会显示 Agent 已加载、MCP Server 已连接、监听在http://localhost:8080/invocations。如果看到MCP server product connected和MCP server order connected说明工具注册成功。4.2 一次完整的下单链路验证打开新的终端先测商品查询curl -X POST http://localhost:8080/invocations \ -H Content-Type: application/json \ -d { prompt: SKU001 还有货吗多少钱, user_id: customer_001, session_id: session_abc }预期响应里应该包含商品名称、价格 79、库存 120并且intent字段是product_query。这说明模型正确识别了意图并通过 MCP Server 调用了商品查询工具。接着测下单curl -X POST http://localhost:8080/invocations \ -H Content-Type: application/json \ -d { prompt: 帮我下单 SKU001数量 2 件, user_id: customer_001, session_id: session_abc }预期响应里会返回订单号类似ORD20250101XXXX并且status是success。这一步验证了从意图识别到工具调用再到结果返回的完整闭环。最后测订单状态查询curl -X POST http://localhost:8080/invocations \ -H Content-Type: application/json \ -d { prompt: 帮我查一下订单 ORD20250101XXXX 的状态, user_id: customer_001, session_id: session_abc }如果三个请求都返回预期结果说明 AgentCore Strands Agents MCP Server 这条链路已经跑通。整个过程从配置到验证熟练的话两小时内可以完成。4.3 用 TaoToken 模型对话做快速验证如果你只想先验证模型和 Key 是否配置正确可以先用模型对话入口 https://taotoken.net/models 发一条测试消息。在对话框里输入“你好请用一句话介绍你自己”如果能正常返回说明 Key 和 base_url 没问题。这一步可以排除掉大部分环境配置错误再去调 Agent 会省心很多。5. 本篇常见错排查5.1 401 Unauthorized 或 Key 无效最常见的原因是环境变量没生效。检查TAOTOKEN_API_KEY是否在当前终端会话里可以用echo $TAOTOKEN_API_KEY确认。如果是 Windows注意 PowerShell 和 CMD 的环境变量不互通。另外Key 复制时不要带空格或换行有些编辑器会自动加换行符导致请求头里多出非法字符。5.2 MCP Server 连接失败如果 AgentCore 启动时报MCP server product connection refused先确认 product_server.py 是否已经在运行端口是否被占用。config.toml 里的command和args必须与实际启动命令完全一致。比如你用python product_server.py启动但 config 里写的是uvx mcp-server-product那肯定连不上。我踩过的坑是 uvx 缓存了旧版本导致工具列表和预期不一致清一下 uv 缓存再试。5.3 模型返回格式不符合预期Strands Agents 对模型输出有格式要求如果模型返回了多余的解释文字工具调用可能会失败。解决办法是在 system_prompt 里明确要求“只返回 JSON 格式的工具调用参数不要添加额外说明”。另外temperature 不要设太高0.3 左右比较稳定。如果还是不行检查 settings.json 里的max_iterations是否够用复杂链路可能需要 8 次以上迭代。5.4 下单链路中断在工具调用如果商品查询成功但下单失败先看 order MCP Server 的日志。常见原因是order_create工具的参数校验不通过比如缺少user_id或quantity字段。在 settings.json 的 tools 定义里把order_create的 inputSchema 写清楚required 字段一个都不能少。另外AgentCore 的 timeout_seconds 默认 30 秒如果下单接口响应慢可以适当调大。5.5 本地能跑但部署后报错本地和云端的差异通常出在环境变量和网络权限上。部署到 AgentCore Runtime 时确保TAOTOKEN_API_KEY已经配置在运行时的环境变量里而不是只放在本地 shell。另外MCP Server 如果依赖本地文件或端口部署时需要改成远程服务或者打包进容器。接入文档 https://taotoken.net/doc 里有关于运行时环境变量的说明可以对照检查。6. 把 Key 和配置一次做对后面就快了整条链路跑下来最花时间的其实不是写 Agent 逻辑而是把 Key、base_url、MCP Server 注册这些配置一次做对。TaoToken 统一 Key 的好处在这里体现得很明显模型对话、编码计划、API 调用共用一个 Key不用在多个服务商之间来回切换凭证配置文件里只需要引用一个环境变量。对于电商 Agent 这种需要频繁调试模型和工具的场景省掉的是重复配置的时间留下的是专注业务逻辑的精力。如果你还没开始配建议先去 https://taotoken.net/api-keys 创建一个 Key然后按上面的 config.toml 和 settings.json 骨架填进去。本地验证通过后再考虑部署到 AgentCore Runtime。长期做编码和 Agent 开发的话Coding Plan 页面 https://taotoken.net/coding-plan 可以看一下它把常用场景打包在一起比单独按量计费更省心。最后留一个实用技巧把 config.toml 和 settings.json 里的api_key_env统一命名比如都用TAOTOKEN_API_KEY这样换项目时只需要改环境变量配置文件可以复用。MCP Server 的启动命令也建议写成脚本避免每次手动敲一长串参数。这两步做完下次再搭新 Agent真的能压到两小时以内。
