E5|感知通道:往模型眼里塞东西,不是再开一套沙箱
先别为每一种输入发明一种 AskForApproval
读完 E4,下一件错事是把 web search、贴图、口述、Appshots 各配一套「安全模式」。然后 Live 搜索被理解成 danger-full-access,Voice 被理解成第三条 Consent 旋钮。
判断先说清楚:这些都是上下文通道。 它们把字节变成 fragment 或托管 tool 结果,进 B4 那条有界历史。政策仍是 B3 的三套旋钮 + 企业 requirements 的总闸(搜不搜外网、允不允许 Appshots)。通道可以关,但关的是「模型能不能看见这类输入」,不是「cwd 能不能写」。
1. Web search:cached / indexed / live,托管工具不是 curl
WebSearchMode(protocol/src/config_types.rs:375-390):Disabled / Cached(默认)/ Indexed / Live。restrict_to 取更严的一边:任何一方 Disabled 就关;有 Cached 就停在缓存。
create_web_search_tool(hosted_spec.rs:14-20):
| 模式 | 模型侧 |
|---|---|
| Cached | external_web_access = false |
| Indexed | 外网 + indexed |
| Live | 外网,不走 index 开关 |
| Disabled / None | 不注册这个 tool |
这是 Responses API 的 ToolSpec::WebSearch,不是 exec_command 里的 curl。过滤、地理位置、context size 来自 WebSearchConfig。企业可以用 WebSearchModeRequirement 把 Live 压成 Cached(config_requirements.rs:827-840)。
没有独立 search 工具会怎样?模型用 shell 抓网页,沙箱网络闸和「搜一下文档」缠在一起。托管 search 把「看见公开网页」从「进程出网」里拆出来——前者是通道,后者仍是 B3 的 NetworkAccess。
2. 应用内浏览器 ≠ Browser Use ≠ Computer Use
三层容易焊成一个「能上网」:
| 是什么 | 本仓库 | |
|---|---|---|
| In-app browser | 桌面里预览页面、本地 dev server | Feature::InAppBrowser,注释写明 requirements-only,不该写在用户 config(features/src/lib.rs:242-245, 1405-1408) |
| Browser Use | agent 操作浏览器(含外部 Chrome、CDP) | browser_use / browser_use_external / browser_use_full_cdp_access,同样是 requirements 闸 |
| Computer Use | 看/点整个桌面 GUI | E4 插件 |
In-app 是给人看本地页面的窗。Browser Use 才是 agent 动手。本地 localhost 预览不自动等于 NetworkAccess::Enabled。企业 allow_browser_and_computer_use 可以两个一起关(E4)。
3. 图:输入走 view_image,生成走 imagegen,都是有界字节
用户拖一张图、模型 view_image 读一张盘上的图,进的是 prompt 里的 image part(handlers/view_image.rs → ImageViewItem / data URL)。有 detail 档和统一 image budget,避免原图撑爆窗口(B4 硬顶)。
图片字节本身怎么存是一个独立的、故意做薄的接口:ThreadManager 持有 image_store: Arc<dyn AttachmentStore>(core/src/thread_manager.rs:388),trait 定义在 attachment-store crate——只有一个 persist(data, metadata) -> AttachmentRef 方法,storage-neutral。默认实现是 InlineAttachmentStore(passthrough_image_store(),thread_manager.rs:455-456),原样把字节内联回 fragment;换成写盘或对象存储的实现,不用碰 view_image / budget 这条通道逻辑。
生成:真正副作用在 ext/image-generation 这个 Extension(ImageGenerationTool,B2 第 6 节)。append_extension_tool_executors 只有 image_generation_available 为真才把 image_gen / imagegen 收进这一 Step 的 Router(spec_plan.rs:feature ImageGeneration、非 Free 套餐、provider 会生成)。系统 Skill imagegen(D1)只是说明书。生成结果再当输入看,还是通道,不是新的写盘政策——写到哪仍是 patch/exec 的沙箱。
4. Voice:口述变成 TurnInput,不是新的 TaskKind
TUI /voice:「start or stop voice」(slash_command.rs:130),实现 toggle_realtime_conversation(chatwidget/realtime.rs:255)。Realtime 是 B1 里一种 Op,音频转成同一条 turn 的用户输入。桌面还有 InAppDictation,同样标成 requirements-only(features.rs:250-253)。
Ctrl+M 一类快捷键是 TUI/App keymap,不是协议字段。关掉 Voice 只是关掉这条麦克通道,不改 SandboxPolicy。
这条通道最近变重了,值得单独说一句:TUI 语音对话已经默认开启,不再是要手动 /voice 才第一次摸到的实验开关;字幕(caption)和音量条会跨着说话人切换、静音、和历史回放继续显示,不会因为对方停顿或你切了历史就丢状态。承重的是两个独立 crate——realtime-webrtc(音频传输、设备枚举、消息读取)和 voice-host(audio sink、capture worker、设备 buffer)——它们各平台的原生运行时(macOS / Windows / Linux)现在是随发行版一起打包的,不是运行时再去下载。这些仍然只是通道实现的厚度在增加,不改变本节开头的判断:口述最终还是变成一条 TurnInput,政策仍在别处,不是给 Voice 开一套新的 Consent 或 TaskKind。
5. Appshots:前台窗口的一次快照,不是持续 Computer Use
官方:macOS 上把 前台窗口 的图和可用文本送进当前 thread(双 Command 或自定义热键)。要 Screen Recording / Accessibility,和 CU 同 OS 权限,产品动作不同:一次上下文,不是循环点击。
本仓库闸是企业 allow_appshots(config_requirements.rs:183, 1044)。没有 Appshots 采集循环。实现在桌面壳。注入后就是普通多模态用户消息,走 B4 fragment 纪律。
6. 文件搜索 / tool search:发现路径,不是执行
@ 文件搜索: TUI FileSearchManager 用 codex-file-search(nucleo + ignore walk,tui/src/file_search.rs:1-8,file-search/src/lib.rs)。给人挑路径,选中变成 mention。不读文件内容进模型,直到你提交或模型再 view。
tool_search: B2 的渐进披露。feature 已是 no-op(永远开,MCP 默认可 deferred,features.rs:222-224)。模型先搜工具目录,再加载 schema。搜到 ≠ 能跑;跑仍过 Router / Orchestrator。
两者都是 目录通道:文件路径目录、工具 schema 目录。不要给 @ 配一套审批。
7. 通道可以关,政策在别处
| 通道 | 关哪里 | 不关什么 |
|---|---|---|
| Web search | WebSearchMode / 企业 requirement | 沙箱网络(那是 MCP/exec 出网) |
| In-app browser / Browser Use / CU | requirements-only feature | workspace-write |
| Appshots | allow_appshots | Chronicle 采集(C3 另闸) |
| Voice | /voice / dictation 闸 | 文本 turn |
| 图 | 模型 modality / budget | apply_patch |
@ / tool_search | 不搜就不注入 | 工具执行 |
把 Live 搜索理解成全盘访问,或把 Appshots 理解成 Computer Use,都会把通道拧进政策层。F3 第一周可以不做 Voice / CU / Appshots,P0 循环不依赖它们。
8. 结语:带走一句话
Search、浏览器预览、图、声、Appshots、@ 和 tool_search 都是往模型可见世界里送字节的通道——可以按企业闸关掉,但它们不替代沙箱、审批和 ExecPolicy;看见不等于能写,搜到不等于能跑。