登录、密钥与配置文件
保存只写的密钥,智能体能输入却永远看不到;生成两步验证码;保存会话,让之后的运行直接以登录状态开始。
智能体可以替你登录网站,而模型永远看不到密码。你只需把每个凭据在保险库中保存一次,绑定到允许使用它的网站,再把它的名称传给运行。由智能体决定值填到哪里。值本身只在输入的那一刻才会被解密并输入,而且只在页面属于你允许的网站时才会这样做。
| 方式 | 用途 | 存储 |
|---|---|---|
| 保险库密钥 | 需要重复使用的密码、用户名、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"]
}'响应会确认保存的内容,但不包含值:
{ "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 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 -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。它的用法与保险库密钥相同,但只在本次运行中存在:运行期间加密保存,运行结束时删除。
{
"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 个字符的名称)保存配置文件:
{
"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 会显示保存的内容:
{ "profile_saved": { "id": "prof_4c1e9a7b2d0f3e5a8b6c", "name": "shop-login", "cookies": 14 } }之后的运行可以用 profile(名称或 id)从它开始:
{
"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。请像对待密码一样对待它,并删除不再需要的配置文件。
管理密钥和配置文件#
# 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 密钥能做的事,并在账户安全中为你的账户开启两步验证。