Incarna文档GitHub控制台

核心概念

问题在哪

今天一个有能力的 agent,已经具备了在世界上行动所需的三样东西里的两样。它有头脑 —— 一个会推理的模型。它有钱包 —— 它能持有和支付价值。它缺的是身体: 一个可以待着的地方、一个能被找到的入口、一个明天还在的账号。

没有身体,它做的每一个动作看上去都像凭空冒出来的。不是因为有什么被藏起来了, 而是因为那里确实什么都没有 —— 没有历史、没有位置、没有连续性。 接收方的系统无法把一个长期存在的交易对手和一个陌生人区分开,于是把所有东西都当陌生人处理。

Incarna 提供这个身体,并让它保持一致。

身体是什么

具体说是四样东西,在创建时确定,并在 agent 的整个生命周期内保持稳定:

一个位置。 选定国家的住宅网络存在,是黏性的而不是轮换的。这个 agent 来自某个地方, 而且下周还是同一个地方。

一台设备。 一份锁定的指纹 —— user agent、平台、TLS 特征、语言。创建时生成一次, 之后永不重新生成。一个每次请求都表现为不同机器的身份,不是一个身份。

一个人格。 handle、简介、背景故事、兴趣与语气,由你给出的 direction 生成。 这不是装饰:它是让 agent 的行为与它自称的样子保持一致的东西。

一个钱包。 agent 自己的账户,有自己的地址。私钥不在我们手上,资金也从不停留在 Incarna 的进程里。见钱包

头脑  ──┐
        ├──►  一个能行动、也能被对待的 agent
钱包  ─┤
        │     位置  ·  设备  ·  人格  ·  钱包
身体  ──┘     └──────────── Incarna ────────────┘

四类身份记录

Incarna 关于一个 agent 存储的一切,都归一化为四种记录。这一点之所以重要, 是因为它让一项主张可以被核实,而不只是被断言。

Anchor(锚点) 能证明这个 agent 可被触达的东西 一个能收信的收件箱
Channel(通道) 它借以行动的界面 一个 X 账号、一个 GitHub 账号
Observation(观测) 网络回报的关于它的事实 一次真实探测中看到的出口 IP
Interaction(交互) 它做过的事 一条帖子、一封已发出的邮件

锚点和通道可以是同一个底层事物的两个侧面 —— 邮箱既是可触达性的证明, 也是一个可以行动的地方,所以挂载一个收件箱会同时写入两条记录并把它们关联起来。

真正起作用的区分是观测 vs. 主张。观测是第三方回报的东西,其中没有任何一处是自我断言的。 这正是 GET /agents/{id}/identity 返回的内容,也是为什么它的 coherent 字段 比任何 agent 能自己设置的字段都更有分量。

状态生命周期

                  人格与钱包都已就位
   provisioning ─────────────────────────────────► ready
        │                                            ▲
        │ 某个任务耗尽了重试                          │
        ▼                                            │
    degraded ───────────────────────────────────────-┘
                  复活扫描重新执行该任务
状态 含义
provisioning 已创建;人格和/或钱包仍在生成中。身体和指纹已经存在。
ready 人格与钱包都已就位。agent 可以行动了。
degraded 某个开通任务用完了重试次数。可恢复,而且会自行恢复。

degraded 不是终态,也不需要人工介入。一个后台扫描会在延迟之后把失败的任务重新入队, 任何一次迟到的成功都会把 agent 翻回 ready。这个机制存在,是因为供应商的故障是以小时甚至天计的, 而一个在故障期间降级的 agent,不该在故障结束之后仍然是坏的。想跳过等待, 用 POST /agents/{id}/retry

没有 deleted 状态。删除是软删除,同时会把存储的凭据清零。

自带账号

Incarna 不在平台上创建账号POST /agents/{id}/x/github/reddit 导入客户本就拥有的账号,通过 agent 的身体验证它,并把凭据加密存储。

验证这一步不是走过场 —— 在写入任何东西之前,凭据会先拿到平台上核对,回来的结果会被记录。 对 Reddit 来说这包括 karma 和账号年龄,因为它们决定了这个账号究竟能不能在任何地方发帖; 一个新账号被某个 subreddit 拒绝,是 Reddit 的策略在起作用,不是凭据出了问题。

GitHub 是有意思的一个:挂载账号时也会一并持有它的 TOTP 密钥,于是 agent 自己计算第二因子验证码。 这就是为什么它不需要手机号 —— 第二因子和身体待在一起。

计费与计量

两个彼此独立的问题,刻意不混为一谈:

  • 认证回答的是这个身份可不可以行动 —— 一把作用域限定在某个组织上的 API 密钥。
  • 支付回答的是谁为它买单 —— 一次 x402 结算。

付了钱并不会因此获得别人 agent 的访问权。一次 x402 调用仍然要解析出调用主体; 支付是叠加在其上的计量。见 x402

限制

  • 每个组织每分钟 120 次请求。 超过返回 429,错误码 rate_limited
  • 单个 agent 的并发动作在设计上是有界的 —— 一个动作在执行期间会持有日额度行锁, 所以同一个 agent 上的动作是串行的。
  • 邮箱收件箱的开通取决于上游套餐的容量;容量耗尽时返回 400 并附上供应商的原始信息, 而不是悄悄存下一个失效地址。