网页读取工具要受控而不是直连任意URL

**给 agent 加网页能力,不是「让它能访问 URL」,而是新增两个受控工具:`web_search(query)` 和 `web_fetch(url)`。搜索服务与读取服务是两件事(一个返回结果列表,一个把指定 URL 转成适合模型读的文本),并且读取侧必须加白名单/SSRF 防护、超时、响应大小限制、缓存和来源返回。**

一、典型链路

用户问题
→ web_search(搜索服务)→ 结果列表
→ agent 选择 URL
→ web_fetch(读取服务)→ 正文文本
→ agent 总结并附来源

搜索端点与读取端点通常是两个不同的服务(如 s.jina.ai 搜索、r.jina.ai 读取),所以是两个工具、两把用途,不是「一个搜索工具顺便读页面」。

二、为什么必须受控

让模型直接访问任意 URL,会同时打开三类风险:

  1. SSRF / 内网探测:模型可被诱导去读内网地址。
  2. 超大响应:整页 HTML 灌进上下文,token 与费用失控。
  3. 费用失控:搜索/读取按次计费,agent 循环里可以反复调。

所以实现时要加:URL 白名单、超时、响应大小上限、缓存、来源回传。返回结果要带来源,否则总结无法溯源。

三、判断「某个服务能不能接进来」要分层

  • 有读取/搜索工具注册在 runtime 里吗? —— 没有就是「当前不支持」,与有没有 key 无关。
  • key 是哪一层的? 搜索/读取服务的 key ≠ 模型 provider 的 key,配置位置也不同(属于 agent 服务的环境变量,而不是模型接入配置)。
  • 模型侧支持 Function Calling ≠ 已有工具:工具是 runtime 注册的,模型只是决定调不调。

相关