网页读取工具要受控而不是直连任意URL
一、典型链路
用户问题
→ web_search(搜索服务)→ 结果列表
→ agent 选择 URL
→ web_fetch(读取服务)→ 正文文本
→ agent 总结并附来源
搜索端点与读取端点通常是两个不同的服务(如 s.jina.ai 搜索、r.jina.ai 读取),所以是两个工具、两把用途,不是「一个搜索工具顺便读页面」。
二、为什么必须受控
让模型直接访问任意 URL,会同时打开三类风险:
- SSRF / 内网探测:模型可被诱导去读内网地址。
- 超大响应:整页 HTML 灌进上下文,token 与费用失控。
- 费用失控:搜索/读取按次计费,agent 循环里可以反复调。
所以实现时要加:URL 白名单、超时、响应大小上限、缓存、来源回传。返回结果要带来源,否则总结无法溯源。
三、判断「某个服务能不能接进来」要分层
- 有读取/搜索工具注册在 runtime 里吗? —— 没有就是「当前不支持」,与有没有 key 无关。
- key 是哪一层的? 搜索/读取服务的 key ≠ 模型 provider 的 key,配置位置也不同(属于 agent 服务的环境变量,而不是模型接入配置)。
- 模型侧支持 Function Calling ≠ 已有工具:工具是 runtime 注册的,模型只是决定调不调。
相关
- Agent Harness 不只是 Tool Loop
- 无头环境连MCP要用APIKey而非OAuth
- RAG是流程不是组件