Lovely Router文档
获取密钥
浏览器智能体

登录、密钥与配置文件

保存只写的密钥,智能体能输入却永远看不到;生成两步验证码;保存会话,让之后的运行直接以登录状态开始。

智能体可以替你登录网站,而模型永远看不到密码。你只需把每个凭据在保险库中保存一次,绑定到允许使用它的网站,再把它的名称传给运行。由智能体决定值填到哪里。值本身只在输入的那一刻才会被解密并输入,而且只在页面属于你允许的网站时才会这样做。

方式用途存储
保险库密钥需要重复使用的密码、用户名、TOTP 种子加密保存,直到你删除
单次运行密钥只用于一次运行的凭据运行期间加密保存,运行结束时删除
配置文件在之后的运行中跳过登录Cookie 和本地存储,加密保存
在目标中写入凭据一次性的测试账号保存在运行的目标文本中。不推荐

在保险库中保存密钥#

PUT /v1/browser/vault/{name} 用于保存一个密钥。用相同的名称再次发送会替换它。

curl -X PUT https://lovelyrouter.com/v1/browser/vault/shop_password \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "value": "correct-horse-battery-staple",
    "kind": "password",
    "origins": ["https://shop.example.com"]
  }'

响应会确认保存的内容,但不包含值:

JSON
{ "name": "shop_password", "kind": "password", "origins": ["https://shop.example.com"], "stored": true }

密钥是只写的:没有任何端点会返回密钥值。你也可以在控制台的 密钥与文件 中管理它们。Python 和 Node.js 示例沿用运行你的第一个任务中的 API、H 和 headers 设置。

密钥字段

namestring必填

位于路径中。1 到 64 个字符:小写 a-z、0-9、_、.、-,以字母或数字开头。智能体能看到这个名称,所以请起一个有描述性的名字:用 github_password,而不是 pw1。

valuestring必填

密钥本身,最大 4 KB(超出返回 413)。对于 totp,填写 base32 种子。

kindstring默认 password

值的类型。它决定智能体可以把值输入到哪些字段。

originsarray必填

允许输入该密钥的 1 到 20 个网站,格式为 https://host 或 https://*.example.com。仅限 https,http://localhost 和 http://127.0.0.1 除外。

kind可输入到说明
password仅密码字段
username文本、邮箱、电话、搜索、URL 和数字字段不能输入到密码字段
text文本、邮箱、电话、搜索、URL 和数字字段任何其他值:账户号码、安全问题的答案
totp文本、电话、数字和密码字段以种子形式保存。智能体输入当前的 6 位验证码

允许的站点(origins)#

只有当智能体所在的页面(以浏览器报告的为准)与密钥的某个 origin 匹配时,它才能输入该密钥:

  • https://shop.example.com 只匹配这个网站本身,且仅限 https。
  • https://*.example.com 匹配 example.com 及其所有子域名,例如 login.example.com。

在其他任何网站上,智能体甚至都拿不到这个密钥。即使仿冒的钓鱼页面索要你的登录信息,智能体也没有办法在那里输入密钥值。

在运行中使用密钥#

在 secrets 中传入名称。运行只能使用你列出的密钥。

cURL
curl https://lovelyrouter.com/v1/browser/runs \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "goal": "Sign in and tell me the status of my latest order.",
    "start_url": "https://shop.example.com/login",
    "secrets": ["shop_user", "shop_password"]
  }'

步骤记录会显示哪个密钥填到了哪里,但从不显示值:该步骤的 action 为 secret:e4:shop_password。不在你保险库中的名称会返回 400,错误为 Unknown vault secret(s): shop_pw. Store them with PUT /v1/browser/vault/{name}.

两步验证码#

对于使用身份验证器应用的网站,把 TOTP 种子保存为 totp 类型的密钥。种子就是你开启两步验证登录时所扫描二维码背后的文本(通常显示在“无法扫描二维码?”之类的选项中):16 个或更多由 A–Z 和 2–7 组成的字符。空格和短横线会被忽略。

cURL
curl -X PUT https://lovelyrouter.com/v1/browser/vault/github_totp \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/json" \
  -d '{"value": "JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP", "kind": "totp", "origins": ["https://github.com"]}'

当网站要求输入验证码时,智能体会输入当前的验证码(标准的 6 位、30 秒刷新一次的验证码)。在 secrets 中把种子的名称与用户名和密码一起传入。

对于通过短信或邮件发送的验证码,让智能体来问你:它会以提问的形式暂停,你回复 {"secret": "481923"} 即可。参见回答问题。

单次运行密钥#

当你不想保存某个凭据时(例如你自己的用户为某个单独任务提供给你的凭据),把它传入 ephemeral_secrets。它的用法与保险库密钥相同,但只在本次运行中存在:运行期间加密保存,运行结束时删除。

JSON
{
  "goal": "Sign in and tell me the account's plan name.",
  "start_url": "https://app.example.com/login",
  "ephemeral_secrets": {
    "customer_email": { "value": "ada@example.com", "kind": "username", "origins": ["https://app.example.com"] },
    "customer_password": { "value": "s3cret-pa55word", "kind": "password", "origins": ["https://app.example.com"] }
  }
}

名称遵循保险库的规则,且不能与你在 secrets 中传入的名称重复。kind 默认为 password,origins 必填。

在目标中写入凭据#

如果目标本身包含密码(“以 demo / demo1234 登录”),智能体可以把它输入到密码字段。这样可行,但目标会被发送给模型、在运行对象中返回,并保留在你的运行历史中。只在一次性的测试账号上这样用。对于任何真实账号,请使用保险库密钥或单次运行密钥。

保存并复用会话#

配置文件是一个保存下来的浏览器会话:运行访问过的网站的 Cookie 和本地存储。登录后保存一个配置文件,之后的运行就能直接以登录状态开始,无需密钥,也不会遇到两步验证提示。

用 save_profile(最多 64 个字符的名称)保存配置文件:

JSON
{
  "goal": "Sign in to the shop and tell me my name as shown on the account page.",
  "start_url": "https://shop.example.com/login",
  "secrets": ["shop_user", "shop_password", "shop_totp"],
  "save_profile": "shop-login"
}

运行结束时,运行对象中的 profile_saved 会显示保存的内容:

JSON
{ "profile_saved": { "id": "prof_4c1e9a7b2d0f3e5a8b6c", "name": "shop-login", "cookies": 14 } }

之后的运行可以用 profile(名称或 id)从它开始:

JSON
{
  "goal": "Open my orders and tell me the status of the latest one.",
  "start_url": "https://shop.example.com/account/orders",
  "profile": "shop-login"
}
  • 用已有的名称保存会更新该配置文件。要让会话保持最新,把同一个名称同时作为 profile 和 save_profile 传入。
  • 无论运行的最终状态如何,配置文件都会被保存。
  • 会话按网站自己的规则过期。配置文件失效时,用 save_profile 重新运行一次登录。在传入 profile 的同时传入 secrets,智能体就能在会话过期时自行重新登录。
  • 未知的配置文件会返回 400,错误为 Unknown profile "shop-login" (GET /v1/browser/profiles)。
  • 配置文件包含有效的会话 Cookie。请像对待密码一样对待它,并删除不再需要的配置文件。

管理密钥和配置文件#

cURL
# List secrets: names, kinds, origins and dates, never values
curl https://lovelyrouter.com/v1/browser/vault -H "Authorization: Bearer $LOVELY_API_KEY"

# Delete a secret
curl -X DELETE https://lovelyrouter.com/v1/browser/vault/shop_password -H "Authorization: Bearer $LOVELY_API_KEY"

# List profiles
curl https://lovelyrouter.com/v1/browser/profiles -H "Authorization: Bearer $LOVELY_API_KEY"

# Delete a profile by name or id
curl -X DELETE https://lovelyrouter.com/v1/browser/profiles/shop-login -H "Authorization: Bearer $LOVELY_API_KEY"

列表中的每个密钥都会显示 last_used_at,方便你查看运行最后一次输入它的时间。完整的响应结构见 API 参考。

密钥如何受到保护#

  • 静态加密。 密钥、单次运行密钥、配置文件和上传的文件都使用 AES-256-GCM 加密,所用的加密密钥分别为你的账户和每次运行单独派生。每个值都与其所有者和名称绑定,因此无法被当作其他人的值或以其他名称解密。
  • 只写。 API 永远不会返回密钥值,无论是对你,还是对任何持有你 API 密钥的人。
  • 从不发送给模型。 智能体使用的是 shop_password 这样的名称。只有在检查过页面所属的网站和字段类型之后,值才会在输入的那一刻被解密。
  • 从输出中清除。 任何六个字符及以上的密钥值,只要出现在页面文本、回答、data 或步骤记录中,都会被替换为 [secret:<name>]。在精准模式下,一旦输入了密钥就会停止截图。
  • 按需短期保存。 单次运行密钥和密钥回复会在运行结束时删除。

你的 API 密钥可以使用保险库,所以请像保护密钥本身一样保护它。在 API 密钥 中限制 API 密钥能做的事,并在账户安全中为你的账户开启两步验证。