模型访问与信任边界
模型不是页面的权威。它选择动作并提供参数;动作此刻是否可用、是否需要确认、目标是否属于当前用户、业务是否真的成功,仍由页面与后端判断。
因此,模型连接同时穿过几道信任边界:浏览器持有用户会话,模型服务接收提示词,网关可能持有供应商凭证,业务后端持有最终授权。把这些部分统称为一个“AI 后端”,会让失败与权限都变得无法推理。
四道边界
| 边界 | 问题 | 必要控制 |
|---|---|---|
| 页面到模型 | 哪些上下文与工具定义离开浏览器? | 有界快照、脱敏、显式声明 |
| 浏览器到网关 | 谁可以使用模型容量? | 同源路由、用户会话、额度 |
| 网关到供应商 | 使用哪个凭证与模型? | 服务端密钥、固定上游、白名单 |
| 页面到业务后端 | 这次操作是否获准? | 服务端身份、归属、状态、幂等 |
生产构建不能包含供应商密钥。VITE_* 变量会被编译进客户端产物。网关不是装饰层;它存在的意义之一,就是让服务端持有的凭证继续留在服务端。
模型可以收到什么
页面发送有界投影:页面身份、相关区域、有限的记录窗口、视图状态,以及当前可用能力的 schema。它不应发送整个 DOM、整个 Pinia 或 Redux store、Cookie、访问 token,或未脱敏的敏感字段。
这不只是保密要求。过量上下文也会增加成本,并让过期或无关数据更容易影响运行。能让模型选择下一步有效动作的最小投影,通常也是最可靠的投影。
提示词注入属于这条边界。评论、工单、商品描述或上传文档中的文字是数据,不能重新定义能力或审批策略。工具描述必须来自应用代码;敏感值应以掩码或不透明代号出站,而不是发送明文。
外部 Agent 与用户自带模型
外部 Agent 可以使用自己的模型和凭证。这属于 Agent 宿主的属性,不构成放宽页面边界的理由。页面仍只暴露已声明能力,传输层仍验证委托会话,业务后端仍校验操作。
不要把“访客填写 API key”做成默认生产路径。如果产品明确支持自带密钥,密钥应进入该产品的安全凭证存储,并有清楚披露、保留期限与撤销方式。把长期供应商密钥放进浏览器输入框和本地存储,是一项独立的安全设计,不是顺手增加的开关。
信任不是布尔值
“用户已登录”不代表“这个 Agent 可以审批这张订单”。权限取决于用户、Agent、租户、会话范围、目标记录、操作和当前业务状态。能力可能可见但不可用;会话可能有效但范围过窄;调用可以通过协议,却在后端授权失败。
这些检查必须彼此独立。Surface 校验包络与暴露范围;页面执行器校验可用性、确认与结果判据;业务后端校验持久业务规则。任何一层都不应默认另一层已经批准了写入。
发布前要回答的问题
上线前,用证据而不是意图回答:
- 检查浏览器产物时,能否确认没有供应商密钥?
- 网关是否验证真实应用会话,而不是相信请求体中的用户字段?
- 模型是否固定或列入白名单,并受用户或租户额度约束?
- 页面是否只发送这项任务需要的字段?
- 每次写入是否都有服务端授权与幂等方案?
- 运维能否在不重发前端的情况下撤销一个 Agent 会话?

