mcpField
C
commerce-trust-safety

commerce-trust-safety

github.com/anthropics安全3.4k42 次安装8 周前更新
代码仓库

关于 commerce-trust-safety

为购物与商家 Agent 规定信任与安全处理规则,涵盖第三方内容隔离、来源校验、操作限制和记忆管理。适合实现或审查共享执行器及相关 MCP 服务的安全边界。

主要功能

  1. 01规范化并隔离第三方内容
  2. 02按数据来源限制写入操作
  3. 03对数字与术语问题执行数据读取
  4. 04绑定会话身份并由后端校验所有权
  5. 05限制记忆内容并支持删除

适用场景

  1. 01防止目录或网页内容注入提示词
  2. 02校验购物车及商家变更操作
  3. 03检查记忆数据的有效性与保留规则
  4. 04限制 MCP 服务仅绑定本地接口

MCP 相关

文档说明参考 MCP 服务默认绑定 loopback,除非环境变量表明前方有认证网关;服务从环境中获取主体身份。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/anthropics/commerce-agents --skill commerce-trust-safety

安装后在 Claude Code 中输入/commerce-trust-safety确认已加载。

详细介绍

信任与安全规则

commerce_common/ 是 commerce-common/commerce_common/,shopping_agent/ 是 shopping-agent/core/shopping_agent/,而 merchant_agent/ 是 merchant-agent/core/merchant_agent/;docs/safety.md 列出了相同的规则。在工具 调用中,一条规则适用于这三条路径;它们共用一个执行器(commerce-architecture);规则 10 和 15 会注明适用的路径。 商家暂存、护栏、审批和市场策略见 commerce-merchant-operations。

隔离第三方内容

  1. 来自目录、评价、政策、订单、指标、消息或网页内容的每个工具结果,都会经过 Fence.fence_payload(commerce_common/fencing.py):先进行 NFKC 规范化,移除不可见字符和控制字符,将围栏 标记、伪造的轮次标记和特殊令牌替换为占位内容,再用对应角色的标签包裹,并截断至 max_fenced_chars。 执行器的 _fenced 会将其应用于每个处理器。
  2. 标签和通知是按角色定义的常量(shopping_agent/fencing.py 中的 STOREFRONT_FENCE,merchant_agent/fencing.py 中的 MERCHANT_FENCE);通知只在静态提示词中出现一次,其中不包含任何不可信内容。
  3. 每个请求的区块(用户资料、购物车、记忆事实、页面、商店上下文)都位于缓存断点之后的同一围栏内(各角色 prompt.py 中的 build_dynamic_context);后端上下文区块有各自的上限。
  4. 模型提供的结果数量会被限制在 max_search_results 以内(commerce_common/execution.py 中的 clamp_limit)。

根据来源和上限限制写入

  1. 购物车写入只接受 ShoppingSessionState.seen_products 中的 ID;该字段由会话的目录和订单读取填充 (shopping_agent/gates.py 中的 check_provenance 和 remember_order_items);更新和移除操作也接受购物车中已有的行。 商家暂存只接受 seen_listings 和 read_listings 中的 ID,应用和丢弃操作只接受 seen_changes 中的 ID (merchant_agent/gates.py;commerce-merchant-operations)。
  2. max_quantity_per_item 会限制写入后的单行数量,max_cart_lines 会限制购物车行数,并通过会话锁保证 (shopping_agent/gates.py 中的 gated_add_to_cart;上限见 shopping_agent/config.py)。锁仅限于单个进程,因此 StorefrontBackend 的购物车方法也会执行这些限制;两个角色中的资格判定、定价和库存均由后端负责。
  3. 两种接口都不会扣款或下单:checkout 只呈现购物车(shopping_agent/enrichment.py 中的 enrich_checkout),由宿主完成结账;购后服务仅提供读取操作,没有取消或退款工具。
  4. 来源记录保存在会话状态中(ShoppingSessionState、MerchantSessionState),并在请求或轮次结束时与会话一并保存 (examples/demo_common/sessions.py 中的 SessionStore,即与对话记录并列的带版本状态文档),因此另一个进程上的请求也能加载这些记录。 每个映射最多保留最新的 PROVENANCE_CAP 条记录(commerce_common/types.py 中的 remember);记录被清除的 ID 需要重新读取。
  5. 组件会经过验证,其商品、订单、指标或变更会根据这些记录进行关联;缺少来源记录的 ID 会被丢弃并报告 (commerce_common/presentation.py 中的 run_presentation;各角色的 enrichment.py;commerce-ui-tools)。

为数字或术语类答案提供依据

  1. 术语问题、订单问题或未见过的产品 ID(shopping_agent/grounding.py 中的 GROUNDING_RULES),以及业绩问题或没有任何待处理事项的申请请求(merchant_agent/grounding.py),都会从匹配的读取操作开始:commerce_common/grounding.py 中的 first_forced_tool 会选定该操作;Messages API 运行时会通过 tool_choice 强制调用它;SDK 运行时则会在规则提供预取形式时预取(commerce_common/agent_sdk.py 中的 ground;术语规则没有预取形式);托管路径只有提示词。
  2. 词汇表是配置元组(policy_intent_terms、order_intent_terms、product_id_patterns、metrics_intent_terms 及其提示词);部署时可以追加自定义词汇,开关标志可以关闭某条规则,这两者都不会改变提示词字节。

在服务端固定身份

  1. 会话启动时会将经过身份验证的主体绑定到一个不可猜测的会话 ID;后续请求只携带该 ID,路由从记录中读取主体(examples/demo_common/sessions.py 中的 SessionStore.start 和 session_dependency)。请求字段和工具参数都不会指定用户、商家或操作员;MCP 服务从其环境中获取主体,而生产服务则从请求中获取。
  2. 记录(订单、工单、商品信息)的所有权,以及调用所依赖的步骤是否已完成,都由后端根据其存储进行检查;某个 ID 有来源记录,并不意味着它属于该主体或已可供使用。

限定记忆内容

  1. 两条写入路径(save_memory 和轮次后提取)上的每条事实,都会经过 commerce_common/memory.py 中的 validate_fact:键最多 64 个字符,值最多 200 个字符,且必须是三个 MemoryCategory 值之一;还要通过 MemoryWriteFilter,默认会拒绝形似标识符的值;memory_blocked_patterns 可添加匹配模式,而带有 checks 的过滤器会取代默认过滤器(MemoryRuntime.build)。
  2. 提取过程会读取最近一轮对话中的用户和助手文本(commerce_common/turn.py 中的 transcript_text);如果提取期间主体已被清除,extract_and_store 会丢弃整批内容。Messages API 运行时会运行提取(update_memory),SDK 宿主会调用运行时,而托管路径只通过 save_memory 写入。
  3. memory_retention_days(with_retention)、MemoryStore.delete_fact、MemoryStore.clear 和 enable_memory 会在所有路径上生效,且不会改变提示词或工具字节;示例会公开读取和删除路由(examples/demo_common/memory.py 中的 install_memory_routes),而 clear 应纳入账户删除流程。
  4. 主体是购物者的 user_id 或商家的 merchant_id(各角色 executor.py 中的 memory_subject)。

在结果中拒绝,并保持接口固定

  1. 被拦截的调用会返回常规结果并指出触发的门控(commerce_common/streaming.py 中的 ToolOutcome.held;宿主的 tool_result 事件会携带 status: blocked);失败会返回错误结果,而 execute 永远不会抛出异常。
  2. 工具列表由配置决定:enable_web_search(默认关闭)会添加该工具;SDK 运行时会将允许列表限制为已注册的名称;清单会逐一启用工具。
  3. 参考 MCP 服务默认绑定到回环地址,除非某个环境变量声明前方有负责身份验证的网关(commerce_common/mcp_server.py 中的 enforce_local_only_bind)。

对抗性评测的两条规则

  • 中毒的商品信息、评价和消息存放在评测夹具中,每次运行时合并,不属于演示数据或目录数据。
  • 每个拒绝案例在同一细分领域都有一个应当提供服务的对应案例,因此评测套件也能发现过度拒绝(commerce-evals)。

评论

支持 Markdown