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