关于 commerce-trust-safety
为购物与商家 Agent 规定信任与安全处理规则,涵盖第三方内容隔离、来源校验、操作限制和记忆管理。适合实现或审查共享执行器及相关 MCP 服务的安全边界。
主要功能
- 01规范化并隔离第三方内容
- 02按数据来源限制写入操作
- 03对数字与术语问题执行数据读取
- 04绑定会话身份并由后端校验所有权
- 05限制记忆内容并支持删除
适用场景
- 01防止目录或网页内容注入提示词
- 02校验购物车及商家变更操作
- 03检查记忆数据的有效性与保留规则
- 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。
隔离第三方内容
- 来自目录、评价、政策、订单、指标、消息或网页内容的每个工具结果,都会经过
Fence.fence_payload(commerce_common/fencing.py):先进行 NFKC 规范化,移除不可见字符和控制字符,将围栏 标记、伪造的轮次标记和特殊令牌替换为占位内容,再用对应角色的标签包裹,并截断至max_fenced_chars。 执行器的_fenced会将其应用于每个处理器。 - 标签和通知是按角色定义的常量(
shopping_agent/fencing.py中的STOREFRONT_FENCE,merchant_agent/fencing.py中的MERCHANT_FENCE);通知只在静态提示词中出现一次,其中不包含任何不可信内容。 - 每个请求的区块(用户资料、购物车、记忆事实、页面、商店上下文)都位于缓存断点之后的同一围栏内(各角色
prompt.py中的build_dynamic_context);后端上下文区块有各自的上限。 - 模型提供的结果数量会被限制在
max_search_results以内(commerce_common/execution.py中的clamp_limit)。
根据来源和上限限制写入
- 购物车写入只接受
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)。 max_quantity_per_item会限制写入后的单行数量,max_cart_lines会限制购物车行数,并通过会话锁保证 (shopping_agent/gates.py中的gated_add_to_cart;上限见shopping_agent/config.py)。锁仅限于单个进程,因此StorefrontBackend的购物车方法也会执行这些限制;两个角色中的资格判定、定价和库存均由后端负责。- 两种接口都不会扣款或下单:
checkout只呈现购物车(shopping_agent/enrichment.py中的enrich_checkout),由宿主完成结账;购后服务仅提供读取操作,没有取消或退款工具。 - 来源记录保存在会话状态中(
ShoppingSessionState、MerchantSessionState),并在请求或轮次结束时与会话一并保存 (examples/demo_common/sessions.py中的SessionStore,即与对话记录并列的带版本状态文档),因此另一个进程上的请求也能加载这些记录。 每个映射最多保留最新的PROVENANCE_CAP条记录(commerce_common/types.py中的remember);记录被清除的 ID 需要重新读取。 - 组件会经过验证,其商品、订单、指标或变更会根据这些记录进行关联;缺少来源记录的 ID 会被丢弃并报告
(
commerce_common/presentation.py中的run_presentation;各角色的enrichment.py;commerce-ui-tools)。
为数字或术语类答案提供依据
- 术语问题、订单问题或未见过的产品 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;术语规则没有预取形式);托管路径只有提示词。 - 词汇表是配置元组(
policy_intent_terms、order_intent_terms、product_id_patterns、metrics_intent_terms及其提示词);部署时可以追加自定义词汇,开关标志可以关闭某条规则,这两者都不会改变提示词字节。
在服务端固定身份
- 会话启动时会将经过身份验证的主体绑定到一个不可猜测的会话 ID;后续请求只携带该 ID,路由从记录中读取主体(
examples/demo_common/sessions.py中的SessionStore.start和session_dependency)。请求字段和工具参数都不会指定用户、商家或操作员;MCP 服务从其环境中获取主体,而生产服务则从请求中获取。 - 记录(订单、工单、商品信息)的所有权,以及调用所依赖的步骤是否已完成,都由后端根据其存储进行检查;某个 ID 有来源记录,并不意味着它属于该主体或已可供使用。
限定记忆内容
- 两条写入路径(
save_memory和轮次后提取)上的每条事实,都会经过commerce_common/memory.py中的validate_fact:键最多 64 个字符,值最多 200 个字符,且必须是三个MemoryCategory值之一;还要通过MemoryWriteFilter,默认会拒绝形似标识符的值;memory_blocked_patterns可添加匹配模式,而带有checks的过滤器会取代默认过滤器(MemoryRuntime.build)。 - 提取过程会读取最近一轮对话中的用户和助手文本(
commerce_common/turn.py中的transcript_text);如果提取期间主体已被清除,extract_and_store会丢弃整批内容。Messages API 运行时会运行提取(update_memory),SDK 宿主会调用运行时,而托管路径只通过save_memory写入。 memory_retention_days(with_retention)、MemoryStore.delete_fact、MemoryStore.clear和enable_memory会在所有路径上生效,且不会改变提示词或工具字节;示例会公开读取和删除路由(examples/demo_common/memory.py中的install_memory_routes),而clear应纳入账户删除流程。- 主体是购物者的
user_id或商家的merchant_id(各角色executor.py中的memory_subject)。
在结果中拒绝,并保持接口固定
- 被拦截的调用会返回常规结果并指出触发的门控(
commerce_common/streaming.py中的ToolOutcome.held;宿主的tool_result事件会携带status: blocked);失败会返回错误结果,而execute永远不会抛出异常。 - 工具列表由配置决定:
enable_web_search(默认关闭)会添加该工具;SDK 运行时会将允许列表限制为已注册的名称;清单会逐一启用工具。 - 参考 MCP 服务默认绑定到回环地址,除非某个环境变量声明前方有负责身份验证的网关(
commerce_common/mcp_server.py中的enforce_local_only_bind)。
对抗性评测的两条规则
- 中毒的商品信息、评价和消息存放在评测夹具中,每次运行时合并,不属于演示数据或目录数据。
- 每个拒绝案例在同一细分领域都有一个应当提供服务的对应案例,因此评测套件也能发现过度拒绝(commerce-evals)。
评论
支持 Markdown