AI Agent 出来以后,经常能在网上刷到一个讨论:以后还要不要 GUI?Chat 和 CLI 都这么好用了,点来点去的界面是不是就该淘汰了。

我觉得不至于。

GUI 肯定还会长期存在,只是它的位置变了。以前大家做产品,默认思路是功能差不多做全了,就包装成一个完整的独立应用;现在不一定非要这么做。固定入口的完整 GUI 软件会少一部分需求,但任务型、用完就关、甚至临时动态生成出来的界面会越来越多。消失的不是图形界面本身,而是「不管什么功能,最后都得搞成一整套 App」这种惯性思维。

早期 Coding Agent 先在 CLI 跑通,其实挺顺理成章的。Claude Code 和 Codex CLI 能火起来,不光是因为大家有多喜欢终端,主要是 Agent 的能力迭代太快了,CLI 很容易直接接入文件系统、Git、跑测试、写脚本。OpenAI 做的 Codex CLI,核心就是跑在本地终端里的 coding agent;Anthropic 的 Claude Code 也把终端、IDE、网页和桌面放在一起看。底层能力还在天天变的时候,CLI 的改动成本低很多,先能跑通、能用起来,比把界面做漂亮要关键得多。

但等能力稳定下来,GUI 的优势又体现出来了。日常要用的高频操作、复杂的系统状态、权限确认、微调参数、实时预览、历史记录回放,这些东西要是全塞在命令行或者聊天记录里,翻起来真的很头疼。Codex 后来推出 Codex app,我觉得也是这个逻辑:初期摸索靠 CLI 快速跑,等沉淀成固定的日常工作流,还是需要一套顺手的界面。CLI 适合探索,GUI 适合沉淀,软件开发一直都是这个节奏。

这让我想起 JS 生态这十几年的变化。也就是常说的 Atwood's Law:任何能用 JavaScript 写的应用,最终都会用 JavaScript 写出来。早些年很多工具为了快,先用 JS 铺开;等到生态成熟、对性能和体验要求变高后,大家又开始用 Go 写 esbuild,用 Rust 写 SWC,微软也一直在推 TypeScript native port。但这并不意味着 JS 死了,只是边界重新划分了:普通场景继续用 JS 没问题,超高频的瓶颈环节就交给 native。

AI Agent 也是类似的道理。最开始大家都在玩 CLI 和 Chat,慢慢地就会分化出固定的日常 GUI、底层的 API、MCP 插件,以及随用随走的临时界面。Model Context Protocol 这些协议之所以有用,是因为它把人和 Agent 照顾得很好:Agent 需要清晰的工具定义、权限和上下文,人需要直观的界面来确认和操作。协议不是为了取代 GUI,而是让各自做自己擅长的事。

另一个挺有意思的方向是 disposable UI。OpenAI 的 Apps SDK 支持在 ChatGPT 里根据工具调用直接渲染小组件;Vercel AI SDK 的 Generative UI 能让模型直接返回可交互的卡片;论文 Macaron-A2UI 也在研究 Agent 怎么根据当前的上下文生成界面。像确认付款、挑几个方案、滑块调参、看效果预览、审批修改,这些事情根本不需要特地打开一个独立的 App,在对话上下文里临时生成一块小界面,点两下确认完就关闭,效率高得多。

当然,也不能把这套想得太神。

动态生成的通常只是上面这层皮。底下依然要靠稳定的数据结构、权限体系、工具接口、组件库和日志。而且现实世界里绝大多数软件本身就是 GUI,Agent 免不了要去操作现有的各种界面。OpenAI 的 Operator 和 Anthropic 的 computer use 都在做这件事:让模型直接像人一样去点浏览器和桌面应用。所以 GUI 既会被 Agent 生成,也会被 Agent 使用;它没有消失,只是分工被重新安排了。

以后的软件形态大概会自然分成几种:CLI 和 Chat 适合快节奏的探索和尝试;固定的 GUI 适合高频、成熟、需要长期信任的日常工作流;而 disposable UI 则负责短平快的确认、微调和预览。GUI 依旧必不可少,只是做一个完整的大 App,不再是所有工具的唯一终点。