运行工具
启动运行,一次调用拿到结果或轮询获取,分页读取大量结果,提前停止运行,并准确了解每次运行的费用。
一次运行会把你的输入发给工具,从你的余额中预留它的最高费用,并以 JSON 返回结果。大多数运行在 5 到 60 秒内完成。你需要一个 API 密钥,以及足以支付本次运行最高费用的余额。
启动运行#
把工具的输入和结果上限发送到 POST /v1/tools/{id}/run:
curl https://lovelyrouter.com/v1/tools/google-maps-places/run \
-H "Authorization: Bearer $LOVELY_API_KEY" \
-H "content-type: application/json" \
-d '{
"input": {
"searchTerms": ["coffee shop"],
"location": "Austin, Texas, USA",
"language": "en"
},
"max_results": 20
}'请求体参数
inputobject默认 {}工具的输入,须符合 GET /v1/tools/{id} 返回的 input_schema。input_schema.required 中的字段必须设置。序列化为 JSON 后最多 50,000 个字符。
max_resultsinteger本次运行最多返回并计费的结果数。默认为工具的 default_results。超过工具 max_results 的值会被降到该值。参阅上限如何确定。
waitinteger默认 60返回响应前等待运行完成的秒数,范围 0 到 300。也可以通过查询参数 ?wait= 传入。
请求会等待运行。返回什么取决于运行是否在 wait 秒内完成:
| 状态码 | 含义 |
|---|---|
200 | 运行已结束。响应体包含最终的 status、扣费以及 items 中的结果。 |
202 | 运行仍在进行。响应体包含它的 id 和一个 poll 路径。轮询它。 |
4xx、5xx | 运行没有启动,不产生任何扣费。参阅错误。 |
读取结果#
在等待时间内结束的运行返回 200:
{
"id": "run_8c1f0e2a9b7d4f3e6a5c2b1d",
"object": "tool_run",
"tool": "google-maps-places",
"tool_name": "Search Google Maps places",
"status": "succeeded",
"results": 20,
"max_results": 20,
"charge_usd": 0.00551,
"reserved_usd": 0,
"error": null,
"created_at": "2026-10-11T15:02:11.204Z",
"finished_at": "2026-10-11T15:02:38.917Z",
"items": [
{
"title": "Godsent Coffee",
"categories": ["Coffee shop"],
"formattedAddress": "9817 Anderson Mill Rd, Austin, TX 78750",
"website": "https://www.godsentcoffee.com/",
"rating": 5,
"reviewCount": 237,
"placeId": "ChIJq7RZDGczW4YRyCS5Z0KiiDE",
"googleMapsUri": "https://www.google.com/maps/search/?api=1&query=Godsent%20Coffee&query_place_id=ChIJq7RZDGczW4YRyCS5Z0KiiDE"
}
],
"offset": 0,
"next_offset": null
}200 表示运行已结束,并不代表它成功了。请检查 status:
succeeded:运行已完成。items中最多有max_results条结果。failed、timed_out或stopped:运行提前结束。error说明原因,items中是它在结束前返回的结果。你只为这些结果付费。
每个 item 是一条结果,格式由工具自己决定。不同工具的字段名各不相同。
轮询长时间运行#
wait 秒后仍在进行的运行返回 202:
{
"id": "run_8c1f0e2a9b7d4f3e6a5c2b1d",
"object": "tool_run",
"tool": "google-maps-places",
"tool_name": "Search Google Maps places",
"status": "running",
"results": 0,
"max_results": 20,
"charge_usd": null,
"reserved_usd": 0.00551,
"error": null,
"created_at": "2026-10-11T15:02:11.204Z",
"finished_at": null,
"poll": "/v1/tools/runs/run_8c1f0e2a9b7d4f3e6a5c2b1d?wait=60"
}反复调用 GET /v1/tools/runs/{run_id},直到 status 不再是 running。传入 ?wait=60,让每个请求在服务端最多等待 60 秒,而不是立即返回。两次轮询之间无需 sleep。
curl "https://lovelyrouter.com/v1/tools/runs/run_8c1f0e2a9b7d4f3e6a5c2b1d?wait=60" \
-H "Authorization: Bearer $LOVELY_API_KEY"响应的结构和状态码与启动运行的请求相同:进行中返回 202,结束后返回带 items 的 200。运行结束前,results 始终为 0。
即使你停止轮询,运行依然会完成,并在几分钟内自动结算,因此它的预留永远不会被一直占用。
完整示例#
启动一次运行,轮询直到结束,然后打印结果。请先设置 LOVELY_API_KEY。
# Requires jq.
RUN=$(curl -s https://lovelyrouter.com/v1/tools/google-maps-places/run \
-H "Authorization: Bearer $LOVELY_API_KEY" \
-H "content-type: application/json" \
-d '{"input": {"searchTerms": ["coffee shop"], "location": "Austin, Texas, USA"}, "max_results": 20}')
ID=$(echo "$RUN" | jq -r .id)
while [ "$(echo "$RUN" | jq -r .status)" = "running" ]; do
RUN=$(curl -s "https://lovelyrouter.com/v1/tools/runs/$ID?wait=60" \
-H "Authorization: Bearer $LOVELY_API_KEY")
done
echo "$RUN" | jq '{status, results, charge_usd, error}'
echo "$RUN" | jq -r '.items[]? | "\(.title) \(.rating)"'分页读取结果#
默认情况下,已结束的运行会一次性返回全部结果。对于大型运行,或需要再次获取结果时,可以在 GET /v1/tools/runs/{run_id} 上用 offset 和 limit 分页读取:
curl "https://lovelyrouter.com/v1/tools/runs/run_8c1f0e2a9b7d4f3e6a5c2b1d?offset=100&limit=100" \
-H "Authorization: Bearer $LOVELY_API_KEY"offset是要返回的第一条结果的索引,默认为0。limit是每页大小,范围从 1 到运行的max_results,默认也是max_results。- 响应会原样带回
offset,并把next_offset设为下一页的偏移量;最后一页则为null。
再次读取结果是免费的。费用只在运行结算时收取一次。
如果结果暂时无法加载,响应中会出现 "items": null 和一条 items_error 消息。运行本身及其扣费不受影响。重新请求同一页即可。
停止运行#
用 POST /v1/tools/runs/{run_id}/stop 停止不再需要的运行:
curl -X POST https://lovelyrouter.com/v1/tools/runs/run_8c1f0e2a9b7d4f3e6a5c2b1d/stop \
-H "Authorization: Bearer $LOVELY_API_KEY"运行以 stopped 状态结束。你只需为停止前已返回的结果支付每条结果费,不收每次调用费。响应是已结算的运行,这些结果在 items 中。停止一个已经结束的运行,会原样返回该运行。
停止通常需要几秒钟。如果运行在大约 10 秒内仍未收尾,响应为 202,照常轮询即可。
运行对象#
每个运行相关的响应都是一个运行对象。最常用的字段:
| 字段 | 含义 |
|---|---|
id | 运行 ID,由 run_ 加 24 个字符组成。用它来轮询或停止运行。 |
status | running、succeeded、failed、timed_out 或 stopped |
results | 已返回并计费的结果数。运行结束前为 0。 |
max_results | 本次运行适用的结果上限 |
charge_usd | 本次运行的费用。结算前为 null。 |
reserved_usd | 运行结算前在你余额上的预留金额。结算后为 0。 |
error | 运行提前结束的原因,或 null |
所有字段见 API 参考中的运行对象。
计费#
启动运行时,会从你的余额中预留它的最高费用:每次调用费加上每条结果费乘以 max_results。运行进行期间,这笔预留显示为 reserved_usd。运行结束时,按返回的结果扣费,设置 charge_usd,预留的剩余部分退回你的余额。
| 结果 | 扣费 |
|---|---|
succeeded | 每次调用费 + 每条结果费 × results |
failed、timed_out | 每条结果费 × 结束前已返回的结果数 |
stopped | 每条结果费 × 你停止前已返回的结果数 |
启动时被拒绝(任何 4xx 或 5xx) | 不收费,也不保留预留。 |
扣费永远不会超过预留。与模型消费一样,工具消费计入你的余额和密钥的消费上限,每次运行及其扣费都会列在控制台的工具页面中。计费的总体说明请参阅数据工具。
max_results 如何确定#
运行实际使用的上限就是运行对象中的 max_results,预留金额也以它为准:
- 你设置了它。 使用你的值;如果高于工具的
max_results,则降到该值。 - 你没有设置。 使用工具的
default_results。对于按输入列表中每个条目返回一条结果的工具(例如一组账号名或 URL),默认值就是该列表的长度。 - 最小运行规模。 少数工具只能按一定的最小批量运行。如果你要求的数量更少,上限会被提高到该最小值。这些工具的
default_results已经考虑了这一点。
如果工具有自带的数量字段(例如 maxResults 或 maxReviewsPerCompany),max_results 也会限制它,因此你不需要两个都设置。如果你把数量字段设得更低,运行返回的结果可能更少,但预留仍以 max_results 为准。长度超过 max_results 的输入列表会被截断为 max_results 个条目。
余额不足#
如果你的余额不足以支付预留,运行会被拒绝并返回 402:
{
"error": {
"type": "insufficient_quota",
"message": "Insufficient balance: this run can cost up to $0.04835 (200 places). Lower max_results or top up."
}
}调低 max_results,或充值。如果预留会让 API 密钥超出它自己的消费上限,运行会收到 402,消息为 This run can cost up to $…, which would take this API key past its spend limit.
错误#
错误的结构与 API 其他部分相同:一个 error 对象,包含 type 和可读的 message。返回错误的请求不产生任何扣费。
| 状态码 | type | 原因 | 处理方式 |
|---|---|---|---|
400 | invalid_request_error | 请求体不是 JSON、input 不是对象、缺少必填的输入字段,或工具拒绝了该输入 | 对照工具的 input_schema 检查 input。错误消息会指出缺少的字段。 |
401 | authentication_error | API 密钥缺失、无效、已吊销或已过期 | 在 Authorization: Bearer 中发送有效的密钥。 |
402 | insufficient_quota | 余额或密钥的消费上限不足以支付预留 | 调低 max_results 或充值。 |
404 | not_found | 工具 id 不存在,或运行 id 不存在或属于其他账户 | 检查 id。用 POST /v1/tools/discover 查找工具。 |
413 | invalid_request_error | input 超过 50,000 个字符 | 减少每次运行的输入。 |
429 | rate_limit_exceeded | 你的账户已有 10 个运行在进行中 | 等其中一个结束后重试。 |
502 | tool_unavailable | 工具无法启动 | 稍后重试。 |
整个 API 的错误机制请参阅错误。
列出你的运行#
GET /v1/tools/runs 按从新到旧的顺序返回你账户的运行,不含 items:
curl "https://lovelyrouter.com/v1/tools/runs?limit=20" \
-H "Authorization: Bearer $LOVELY_API_KEY"limit 范围为 1 到 100(默认 20)。如果还有更多运行,响应中的 next 是一个游标:把它作为 ?before= 传入即可获取下一页。next 为 null 时,说明已经全部获取。
运行浏览器智能体#
浏览器智能体在目录中的 id 是 browser-agent,因此 POST /v1/tools/browser-agent/run 也能启动它。把它的 goal 和 start_url 放进 input,并把 max_results 设为最大步数。它返回 202 和一个浏览器运行,之后用浏览器 API 跟进。参阅浏览器智能体。