URL 就是 API
参数进,图出。为什么最简单的接口,恰恰是能扛住 agent 的那个。
有一类软件是 agent 用不了的:那种「想拿到数据就必须先当一次用户」的东西。 一个带登录的仪表盘、要点几下才能设好的时间范围、一个藏在「查看报表」按钮后面的图表、 一张必须先切到某个标签页才存在的表。
这些对人来说都不难,对机器却是致命的。于是团队会再做一个东西—— 一套 API:密钥、限流、schema、客户端库,外加一份 changelog。 这套 API 没问题。它同时也是同一批事实的第二份描述,靠人手保持同步, 而只要有人在仪表盘上加了个字段,它就开始漂移。
纯函数有个习惯:活得久
还有另一种做法。让链接自己就是接口:参数进,图出。 没有会话、没有登录、没有存下来的状态、没有藏起来的默认值。
/draw?type=bar&labels=Mon,Tue,Wed&values=120,180,95
这是一个纯函数。同样的参数,今天和明年给出同样的图,在任何机器上、不需要账号。 它是最小可能的 API:只剩下 web 天生就有的那部分, 也是每个 agent 本来就会读、会写、会发的那部分。
接下来三件事,全都是我们看重它的理由。
它可以缓存。 URL 就是键。URL 背后的图可以在 CDN 里待到它值得待, 之后每一个读者都是免费拿到的。
它可以版本化。 在链接里写上 v=1,输出就不再变。
贴进 release note 的图会一直是正确的,因为做出它的那个渲染器被钉住了。
这就是链接和截图的区别:截图是一个关于过去的、没人能核对的承诺。
它可以 diff。 两条只差一个参数的链接,字符上就只差一个字符。 PR 里的图表是可以被审的图表:改数字、改链接、看图变。 而在仓库里,这一条更要紧——当图表是个文件时,它是一坨二进制: 历史被撑大,数字每动一次就要重渲染一次、重上传一次。 当图表是条链接时,diff 里就是一个字符,图自己会跟上来。
共享的那块界面
这里有一部分是我们没想到会重要的。
现在没有人再手写 URL 了,也不该手写。你说出想要什么; agent 把链接拼出来、把图画好、把报告发给你。你拿回来的是一份带图的稿子—— 而每一张图都是一条链接,数字还在里面。
然后你们俩读同一份产物,读法不同。人看到图,从里面得到理解; agent 读链接,拿到精确的数据——数据已经在那儿了,不用取、不用视觉 token、 一点上下文都没花在像素上。谁都不用学对方的软件, 因为 URL 是双方早就认识的格式:你指得出它、复制得了它, agent 一次调用就能改写它。
这就是协作。不是「AI 加一个界面」。一串字符,两双手。
代价是什么
诚实要求把代价说出来。
- 链接会变长。 数据在 URL 里,URL 就会变长。实际的上限在几千字符左右, 过了就得用短链接或者存起来——于是又把我们想避开的服务器端状态请了回来, 连同它的隐私问题。
- 啰嗦。 十二条序列的图是一长串参数。扁平参数和 JSON 出口(
?d=)都需要; 单拎出来哪个都不好用。 - 不能有秘密。 URL 是公开的。这对应该被分享的数据是优点, 对不该被分享的数据,这是硬性禁止。
我们反复回到的那条规矩
如果参数就是数据,那么数据就是公开的,剩下的唯一问题就是:它该不该公开。 这个问题必须在选格式之前回答,而不是等到某天有人把客户 id 贴进了一个图表链接。
我们还在摸索这条线在哪里。它被写在还没定稿的规范里, 也写在《URL 会暴露什么》里。