Web Fetch
把你已经知道 URL 的那个网页,整篇正文交给模型。加一个 tool 条目,Synthorai 负责抓取、清洗,把可读正文放进对话 —— 任意模型、任意渠道都能用。
最小请求
在 /v1/messages 的 tools 里加上 synthorai:web_fetch,其余照旧:
curl https://synthorai.io/v1/messages \
-H "x-api-key: $YOUR_KEY" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"tools": [{"type": "synthorai:web_fetch"}],
"messages": [
{"role": "user", "content": "Summarise https://docs.anthropic.com/en/docs/build-with-claude/tool-use"}
]
}' 只有你加了 synthorai:web_fetch、且模型判断需要读页面时才会抓取。不加就是普通请求——行为和成本完全不变。
可选参数
synthorai:web_fetch 条目上的所有字段都可选:
| 参数 | 说明 |
|---|---|
max_uses | 单次请求最多抓几个页面。默认 3,上限 10。这是花费闸,**跨重试生效** —— 声明 max_uses: 1 的请求即使内部换渠道重试,也最多只按一次抓取计费。 |
{
"type": "synthorai:web_fetch",
"max_uses": 2
} 与 Web Search 搭配
搜索负责找到页面,抓取负责读完它。两个都声明,模型就能先搜、挑一条靠谱的结果、再把整页读进来 —— 研究类问题通常需要的正是这个:
"tools": [
{"type": "synthorai:web_search"},
{"type": "synthorai:web_fetch"}
] 响应结构
每次抓取在 assistant 轮里表现为一对块,后面跟模型的回答:
{
"type": "server_tool_use",
"id": "srvtoolu_synth_...",
"name": "web_fetch",
"input": { "url": "https://example.com/page" }
},
{
"type": "web_fetch_tool_result",
"tool_use_id": "srvtoolu_synth_...",
"content": {
"type": "web_fetch_result",
"url": "https://example.com/page",
"title": "Example page",
"content": { "type": "text", "text": "…page body…" }
}
} 抓取次数会记在 usage 里,你可以自己对账:
"usage": {
"input_tokens": 9241,
"output_tokens": 412,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"server_tool_use": { "web_fetch_requests": 1 }
} 计费
| 项目 | 价格 |
|---|---|
| 每抓取一个页面 | $0.01 / 次 |
| Token(输入 + 输出) | 按所用模型的标准 input 单价 |
按次费不是全部成本。抓回的页面会作为 input token 进入对话,一篇长文动辄几千 token —— 多数模型上这部分 token 费会超过 $0.01 的抓取费。两笔都要算进预算。
三招把成本控住:
- 把
max_uses设成任务真正需要的最小值 —— 它封顶整个请求的抓取费,含重试。 - 让它抓明确的页面,而不是放它自己去探索。用户贴来的一个链接是一次抓取,"围绕这个话题读一读"可能是三次。
- 同时看
usage.server_tool_use.web_fetch_requests和usage.input_tokens—— 钱通常花在后者。
限制与安全
- 只抓
http/https地址;URL 里内嵌账号密码的一律拒绝。 - 私网、回环、链路本地与云元数据地址一律拒绝 —— web_fetch 只访问公网页面。
- 正文进对话前会按配置的字符上限截断,单个超大页面无法把一次请求的成本撑到无上限。
- 抓不下来的页面会以错误块返回,不会让整个请求失败;模型可以据此换个做法,或者不看这页直接作答。
- 在你声明
synthorai:web_fetch期间,裸名web_fetch是保留的 —— 用这个名字声明你自己的工具会得到一条指明工具名的400。把你的工具改个名,或去掉synthorai:参数即可。 - 被我们在出网之前拒掉的抓取 —— URL 不合法、命中黑名单、后端未配置 —— 不收费。已经打到后端却失败的会收费,因为后端向我们收了钱。两者都仍计入
max_uses。
抓取内容的责任归属
web_fetch 是按你的指令去取一个页面。抓哪个 URL 由你决定,因此这次抓取本身、以及你如何使用取回的内容,责任在你。
- 你必须本就有权访问该内容。这包括目标站点的服务条款、其
robots.txt、付费墙或登录边界,以及适用的著作权与数据库权利。经由我们抓取并不会给你带来你原本没有的访问权限。 - 个人信息的义务仍在你这一侧。若抓回的页面含个人信息,在 GDPR、《个人信息保护法》及同类法域下你仍是该信息的处理者 —— 合法性基础、留存期限、以及任何删除请求都由你负责。
- 因你的抓取而产生的主张由你承担。若权利人或站点运营方就你取回的内容提出主张,该主张指向你,相应成本由你承担。这与我们所路由的上游抓取服务商对我们的条款一致。
- 模型输出不等于已获授权可再发布。基于抓取材料生成的回答可能复现其中片段。你是否可以再发布这段输出,取决于原始来源的许可,我们对此不作任何陈述或保证。
属于我们的部分:我们运行抓取基础设施、阻断内网与私有网段地址、执行你的管理员配置的域名黑名单,并且除服务本次请求外不留存抓回的页面内容。我们不审查单个 URL 的合法性 —— 也做不到,一个 URL 本身并不携带它的许可信息。
若某个 API key 引发可信的滥用投诉、或被抓取服务商标记,我们会停用该 key 的 web_fetch:服务商账号一旦被封,功能对**所有**客户都会中断。
常见问题
模型会去抓我没提过的页面吗?
它可以顺着同一轮对话里 synthorai:web_search 找到的 URL 继续读,这正是两者搭配的意义。它被明确要求不要凭空编造 URL;需要先找页面时应该先搜索。
页面需要登录、或者屏蔽爬虫怎么办?
这次抓取会返回一个错误块,模型不看这页继续作答。这次仍然计入 max_uses —— 因为我们确实代你发起了这次请求。
声明了工具但一次都没抓,会有影响吗?
没有。在模型真正抓取之前,计费与行为和普通请求完全一致。