跳转至

屏幕感知

屏幕感知由两个相互独立的开关控制,注意区分:

  • [vision] 控制「看」:何时截屏、截取范围、发送至哪个模型。
  • [perception] 控制「说」:已获得的屏幕情境允许出现在哪些会话出口的提示词中。

初始配置:vision.enabled = falsevision.chat_image_enabled = trueperception.surfaces = ["desktop"]。 依赖:截屏仅发生在桌宠外壳中,桌面屏幕视觉因此还要求 desktop_pet.enabled = true; 两类视觉功能均要求 models.toml 的 vision 任务档配置具备视觉能力的模型,否则配置加载期直接报错。

截屏的触发时机

屏幕视觉(vision.enabled)开启后,截图仅在以下时刻发生,不做持续监视:

  • 桌宠窗口的消息内容涉及屏幕(「看看我这个报错」「我在干嘛」等意图由桌面端本地规则判定);
  • 托盘菜单的「持续看屏幕」被打开(该状态不落盘,重启后关闭);
  • 桌面主动搭话的「场景」意图触发时,先截取一帧再决定内容。

截图按 capture_mode 执行:window(默认)仅截取前台窗口,无法取得前台窗口标题时跳过本次; screen 截取整个主屏,包含桌面、任务栏与其它窗口。所有截图在内存中缩放为 768×432 以内的 JPEG 后发送给视觉模型,不落盘。扫视设有 20 秒冷却与 60 秒缓存,短时间内重复触发将复用上一次结果。

fullscreen_silent(默认开)仅用于一件事:检测到疑似全屏窗口时压制主动搭话, 避免直播、录屏收录其发言;不拦截用户主动发起的屏幕问答。

QQ 聊天图片为独立开关

vision.chat_image_enabled 控制 QQ 聊天图片是否调用视觉模型生成描述,与桌面屏幕视觉互不影响; 开启任一者即要求 vision 任务档可用。图片描述失败时保留 [图片] 占位,不对内容做猜测。 表情包入库打标签与内容审核同样复用该任务档,见表情包

感知出口:屏幕情境的开放范围

perception.surfaces 决定提示词中的「前台活动」块(前台程序、持续时间、屏幕描述)允许注入哪些出口:

  • 可取值仅有 desktop(桌宠窗口)与 direct(QQ 私聊);默认 ["desktop"];空列表表示任何会话均不注入。
  • 仅对主人生效:其他成员的私聊不会注入。
  • direct 出口仅使用既有缓存描述(60 秒内有效)——QQ 侧无触发截图的链路,截屏始终发生在桌面端。
  • 另请注意:桌面主动搭话的措辞不受 surfaces 约束(其出口本就仅为桌面);surfaces 控制的是聊天提示词中的活动块。

群聊的结构性排除

group 并非「默认关闭」,而是不存在该选项,由三层结构保证:

  • 配置层:surfaces 中填写 group 时,配置加载期直接报错,程序无法启动。
  • 提示词层:活动块的唯一注入点按会话类型判定,群聊类型必然不命中。
  • 主动搭话层:仅投放至桌宠会话,结构上不涉及群聊。

屏幕内容属于本机上私密程度最高的数据之一,将其限定在「主人本人与桌面/私聊」是有意的边界设计。

屏幕问答的完整链路

以桌宠窗口为例:消息发出前,桌面端本地规则判定是否涉及屏幕;命中则先截取一帧发送给视觉模型 (仅以程序名作为先验,窗口标题不进入模型请求),模型返回不超过 30 字的描述, 随后的回复即以「刚瞥了一眼屏幕」作为上下文。无法识别时提示词要求如实说明,并禁止使用历史画面充当当前所见。

开启、关闭与影响

  • 开启屏幕视觉:features.toml vision.enabled = true,并配置 vision 任务档; vision.enabledfullscreen_silentcapture_mode 改动需重启后端。
  • 开启 QQ 图片描述:vision.chat_image_enabled = true,不依赖桌宠。
  • 调整开放范围:修改 perception.surfaces,例如加入 direct 后,QQ 私聊中亦可询问「我在干嘛」 (使用缓存描述)。
  • 全部关闭:两个 enabled 保持 false、surfaces 留空。影响为:无法描述收到的图片、不掌握前台活动、 主动搭话失去由屏幕触发的「场景」意图;表情包入库打标签也会因视觉模型不可用而停止。

实现细节见开发手册·平台抽象与适配器