上下文模型
上下文是调用方为完成当前决策所需的最小业务视图。它不是 DOM 快照,也不是完整的应用状态。实现必须让调用方看见“有什么、是否被截断、下一步能否引用”,同时避免把无关数据送入模型。
组成
describe 成功响应中的 context 包含:
| 字段 | 含义 |
|---|---|
page | 可选页面身份:标题、路由与允许公开的业务参数 |
regions | 区域列表、层级与说明 |
records | 当前记录窗口中带字段的记录 |
recordIds | 当前活跃区域里全部可引用记录 id |
recordIdsTotal | 可引用记录总数 |
recordWindow | 本次返回的偏移、上限、数量与下一页位置 |
state | 已声明、只读且对任务有意义的状态视图 |
feedback | 校验错误、提示与状态消息 |
unavailable | 当前不可用动作及其原因 |
recordsTotal | 当前业务视图中的记录总数 |
feedbackTotal | 被投影的反馈总数 |
unavailableTotal | 被投影的不可用动作总数 |
省略字段与零值不是同一件事。没有页面身份时省略 page;记录为空时保留数组。实现不得用静默截断隐藏数据。
记录窗口
带字段记录默认只返回一页。调用方可以用 offset 与 limit 翻页,或用 record 精读一至二十条记录。record 不得与 offset 或 limit 同时使用。
当发生分页或截断时,响应必须带 recordWindow:
{
"recordWindow": {
"offset": 0,
"limit": 8,
"returned": 8,
"total": 48,
"next": 8
}
}recordIds 可以覆盖整页可引用记录,即使 records 只包含当前窗口。这样调用方不必加载所有字段,仍能对长列表中的某一项发起动作。
上下文一致性
一次响应内的能力与上下文应来自同一快照。实现不得把旧能力清单与新记录状态拼在一起,除非传输层明确标明了时间关系。
动作执行后,服务可以实现 after 增量,只返回新出现的能力、变化记录与变化状态。增量不是新的完整快照。调用方在以下情况必须重新 describe:
- 页面导航或模态框改变;
- 筛选、排序或分页改变可引用记录;
- 能力是否可用发生大范围变化;
after缺失或不足以解释结果;- 会话作用域变化。
数据与指令
记录字段、工单正文、评论、商品描述和附件文本都属于数据。它们可能包含提示注入,不得被提升为能力说明或系统指令。能力说明必须来自应用声明;页面反馈也应标记来源,避免调用方把用户输入当作可信命令。
敏感信息
上下文必须遵循最小暴露原则:
- 不返回 Cookie、JWT、委托 token、模型密钥或内部凭证;
- 只返回任务所需的字段,不返回整个 store;
- 敏感值可以使用掩码、代号或执行时还原的占位符;
- 审计事件不得包含原始参数或响应正文;
- 被隐藏的字段不得以
title、错误消息或调试字段绕过。
掩码不是权限。若字段完全不应被外部 Agent 知道,就不应进入投影;仅在出站时遮盖而仍可回读原始值,会扩大攻击面。
有界性要求
实现必须为记录条数、字段大小、反馈数量和总响应大小设置上限,并在截断时提供总数。自定义上限必须小于或等于实现声明的最大值。调用方不得依赖无限上下文,也不得把截断误认为空列表。
示例
{
"page": { "route": "/orders", "title": "订单" },
"records": [
{ "id": "SO-1002", "fields": { "customer": "林舟", "status": "待发货" } }
],
"recordIds": ["SO-1002", "SO-1003"],
"recordIdsTotal": 2,
"recordsTotal": 2,
"state": { "filter": "all" },
"feedback": [],
"unavailable": []
}示例只说明结构。应用应按自己的业务字段裁剪,不应照搬示例暴露客户信息。

