Gemini cli 源码分析之工具篇-WebFetch工具

Gemini cli 源码分析之工具篇-WebFetch工具

查看完整的Gemini cli 源码分析系列课程 Gemini CLI源码启示录:AI工程师必须掌握的终端开发范式

WebFetch工具深度分析

概述

WebFetch工具 (packages/core/src/tools/web-fetch.ts) 是Gemini CLI项目中的一个核心工具,用于从URL获取和处理网页内容。该工具结合了AI能力和传统网页抓取技术,提供了智能的内容获取和处理功能。

核心架构

主要组件

WebFetchTool(主工具类) ├── WebFetchToolInvocation(工具调用实现) ├── parsePrompt(URL解析函数) └── GroundingMetadata(引用和元数据接口)

继承关系

  • WebFetchTool 继承自 BaseDeclarativeTool<WebFetchToolParams, ToolResult>
  • WebFetchToolInvocation 继承自 BaseToolInvocation<WebFetchToolParams, ToolResult>

核心功能分析

1. URL解析和验证 (parsePrompt)

位置: lines 41-74

exportfunctionparsePrompt(text:string):{ validUrls:string[]; errors:string[];}

功能特点:

  • 从输入文本中提取包含 :// 的tokens
  • 使用 new URL() 验证URL格式
  • 协议白名单:仅支持 http:https:
  • 返回有效URL列表和错误信息

安全考虑:

  • 拒绝非标准协议(如 file:, ftp: 等)
  • 严格的URL格式验证

2. 双重执行策略

主执行路径 (execute)

位置: lines 240-380

执行流程:

  1. 解析输入prompt中的URLs
  2. 检查私有IP地址
  3. 调用Gemini AI的 urlContext 工具
  4. 处理grounding metadata和citations
  5. 格式化输出结果

核心代码:

const response =await geminiClient.generateContent([{ role:'user', parts:[{ text: userPrompt }]}],{ tools:[{ urlContext:{}}]}, signal,DEFAULT_GEMINI_FLASH_MODEL,);
Fallback执行路径 (executeFallback)

位置: lines 121-196

触发条件:

  • 检测到私有IP地址
  • 主执行路径失败
  • URL检索状态异常

功能特点:

  • 直接HTTP请求获取内容
  • GitHub URL特殊处理(blob → raw转换)
  • HTML到文本的智能转换
  • 内容长度限制 (MAX_CONTENT_LENGTH = 100000)

3. GitHub URL处理

特殊转换逻辑:

if(url.includes('github.com')&& url.includes('/blob/')){ url = url .replace('github.com','raw.githubusercontent.com').replace('/blob/','/');}

应用场景:

  • GitHub文件查看页面 → 原始文件内容
  • 便于获取可读的源代码内容

4. 内容处理机制

HTML到文本转换

使用 html-to-text 库:

textContent =convert(rawContent,{ wordwrap:false, selectors:[{ selector:'a', options:{ ignoreHref:true}},{ selector:'img', format:'skip'},],});
内容类型判断
  • text/html: 进行HTML到文本转换
  • 其他类型: 保持原始文本格式

Grounding和Citation系统

Grounding Metadata结构

接口定义 (lines 76-95):

interfaceGroundingChunkWeb{ uri?:string; title?:string;}interfaceGroundingSupportSegment{ startIndex:number; endIndex:number; text?:string;}

Citation插入算法

位置: lines 325-344

算法步骤:

  1. 收集所有grounding支持信息
  2. 生成citation标记 [1], [2]
  3. 按位置倒序插入(避免位置偏移)
  4. 在响应文本末尾添加sources列表

示例输出:

响应内容... [1][2] Sources: [1] 页面标题 (https://example.com) [2] 另一页面 (https://another.com) 

安全机制

1. 私有IP检测

功能: 使用 isPrivateIp() 检查URL是否指向私有网络
处理: 检测到私有IP时自动切换到fallback模式

2. 协议白名单

限制: 仅允许 http:https: 协议
防护: 防止 file://, javascript: 等潜在危险协议

3. 内容大小限制

限制: MAX_CONTENT_LENGTH = 100000 字符
目的: 防止内存溢出和处理超大文件

4. 超时控制

设置: URL_FETCH_TIMEOUT_MS = 10000 (10秒)
应用: 防止长时间阻塞请求

错误处理机制

错误类型定义

enum ToolErrorType {WEB_FETCH_FALLBACK_FAILED,WEB_FETCH_PROCESSING_ERROR,}

错误处理策略

  1. URL解析错误: 返回具体的格式错误信息
  2. 网络请求失败: 提供HTTP状态码和错误描述
  3. 内容处理错误: 捕获并格式化异常信息
  4. Fallback失败: 记录遥测数据并返回错误

遥测集成

Fallback尝试记录:

logWebFetchFallbackAttempt(this.config,newWebFetchFallbackAttemptEvent('private_ip'));

事件类型:

  • 'private_ip': 私有IP触发fallback
  • 'primary_failed': 主执行路径失败

工具配置和验证

参数验证 (validateToolParamValues)

位置: lines 418-436

验证规则:

  1. prompt参数不能为空
  2. 至少包含一个有效URL
  3. 所有URL必须格式正确
  4. 协议必须是http或https

工具描述

用户可见描述:

"Processes content from URL(s), including local and private network addresses (e.g., localhost), embedded in a prompt. Include up to 20 URLs and instructions (e.g., summarize, extract specific data) directly in the 'prompt' parameter." 

支持特性:

  • 最多20个URL
  • 本地和私有网络地址支持
  • 嵌入式指令处理

使用示例

基本用法

{ prompt:"Summarize https://example.com/article and extract key points"}

多URL处理

{ prompt:"Compare the content from https://site1.com and https://site2.com, focusing on their main features"}

GitHub代码分析

{ prompt:"Explain the code in https://github.com/user/repo/blob/main/src/file.js"}

性能优化

1. 内容截断

  • 限制处理内容长度,避免超大文档影响性能
  • 保持响应时间在可接受范围内

2. 智能Fallback

  • 仅在必要时使用fallback机制
  • 减少不必要的双重请求

3. 并行处理能力

  • 支持在单个prompt中处理多个URL
  • Gemini AI模型并行处理能力

技术债务和改进建议

当前限制

  1. 单URL Fallback: Fallback模式目前只处理第一个URL
  2. 内容类型支持: 主要针对HTML和文本,对其他格式支持有限
  3. 缓存机制: 缺少内容缓存,重复请求相同URL会重新获取

建议改进

  1. 多URL Fallback支持:
// 建议改进:支持多URL的fallback处理for(const url of urls){// 处理每个URL}
  1. 内容缓存:
// 建议添加缓存层const cached =await cache.get(url);if(cached)return cached;
  1. 更丰富的内容类型支持:
  • PDF文档处理
  • 结构化数据(JSON、XML)解析
  • 媒体文件元数据提取

总结

WebFetch工具是Gemini CLI中一个设计精良的组件,它成功地将AI能力与传统网页抓取技术结合,提供了:

优势

  • 智能内容处理: 结合Gemini AI的理解能力
  • 健壮的错误处理: 多层次的fallback机制
  • 安全防护: 全面的安全检查和限制
  • 用户友好: 简洁的接口和清晰的错误信息

技术亮点

  • Grounding和Citation系统提供可追溯的信息来源
  • GitHub URL特殊处理增强了开发者体验
  • 私有网络支持扩展了使用场景
  • 灵活的内容处理适应不同数据格式

该工具展现了现代AI工具设计的最佳实践,平衡了功能性、安全性和易用性,为用户提供了可靠的网页内容获取和处理能力。

Read more

Ubuntu搭建PX4无人机仿真环境(5) —— 仿真环境搭建(以Ubuntu 22.04,ROS2 Humble,Micro XRCE-DDS Agent为例)

Ubuntu搭建PX4无人机仿真环境(5) —— 仿真环境搭建(以Ubuntu 22.04,ROS2 Humble,Micro XRCE-DDS Agent为例)

目录 * 前言 * 1. 准备 * 1.1 下载 PX4 源码 * 方式一: * 方式二: * 1.2 安装仿真依赖 * 1.3 安装 Gazebo * 2. 安装 Micro XRCE-DDS Agent * 3. 编译 PX4 * 4. 通信测试 * 5. 官方 offboard 程序 * 6. offboard 测试 * 参考 前言 本教程基于 ROS2 ,在搭建之前,需要把 ROS2、QGC 等基础环境安装配置完成。但是这块的资料相比较于 ROS1 下的少很多,不利于快速上手和后期开发,小白慎选! 小白必看:

IEEE TRO 南方科大张明明和北工大董明杰联合在康复机器人领域取得系列研究成果

IEEE TRO 南方科大张明明和北工大董明杰联合在康复机器人领域取得系列研究成果

近期,南方科技大学生物医学工程系张明明副教授和北京工业大学董明杰副教授联合,在康复机器人领域取得系列研究进展,相关成果接连发表在机器人领域国际学术期刊IEEE Transactions on Robotics。 创建多人协作交互方法与创新康复系统 为相关领域发展奠定理论基础 图1. 多用户协作创新康复系统 当前的多用户人机交互研究主要关注机器人控制系统自身的稳定性,往往忽视了真实协作情境中“人与人”之间的相互影响。与此不同的是,本研究并未将操作者视为独立的无源终端,而是在系统设计核心层面纳入并建模这一事实:在多人触觉交互中,每位操作者本身就是彼此交互环境的一部分,其行为会直接并持续地影响他人的感知与系统稳定性。然而,随着交互用户数量的增加,尤其在操作者具有主动行为时,传统控制方法难以有效应对人际间的交互耦合与系统规模的扩大引起的稳定性条件复杂化,导致系统扩展能力受到制约。因此,如何在承认并融入操作者主动交互行为的前提下,维持系统稳定性并实现控制架构的可扩展性,成为一项关键挑战。 为应对这一挑战,研究人员创新性地提出了“个人交互环境”(Individual Interact

豆包Seedream 4.0多图融合实力派:田园犬+三花猫多场景创作,AI绘画新时代来了!

豆包Seedream 4.0多图融合实力派:田园犬+三花猫多场景创作,AI绘画新时代来了!

豆包Seedream 4.0多图融合实力派:田园犬+三花猫多场景创作,AI绘画新时代来了! 🌟 Hello,我是摘星! 🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。 🦋 每一个优化都是我培育的花朵,每一个特性都是我放飞的蝴蝶。 🔬 每一次代码审查都是我的显微镜观察,每一次重构都是我的化学实验。 🎵 在编程的交响乐中,我既是指挥家也是演奏者。让我们一起,在技术的音乐厅里,奏响属于程序员的华美乐章。 摘要 作为一名长期关注AI技术发展的开发者,我见证了从GAN到DALL-E,再到Stable Diffusion的图像生成技术演进历程。而今天,当我深入体验字节跳动最新发布的豆包Seedream 4.0时,我被这项技术的突破性表现深深震撼了。这不仅仅是一次简单的版本迭代,而是AI绘画领域的一次革命性跃进。 通过我使用中华田园犬和三花猫素材进行的深度测评,Seedream 4.0展现出了前所未有的多图融合能力和主体一致性保持水平。从真实场景的动物追逐图,到充满想象力的卡通探险绘本,再到创意十足的布偶挂件设计,每一个生成结果都让我感受到了AI创作的无限可能。这款模

Windows下安装运用高效轻量本地龙虾机器人ZeroClaw

Windows下安装运用高效轻量本地龙虾机器人ZeroClaw

常用操作系统Windows下,本地安装、配置和使用--龙虾机器人,用过了略显复杂的原装OpenClaw,也用过了易用性逐渐提升的国产替代CoPaw、AutoClaw、WorkBuddy,欲转向性价比更高的“品牌”,几经对比,目光锁定在了ZeroClaw。下面是Windows下,安装、配置和使用ZeroClaw的过程汇总和心得体会。盛传ZeroClaw,不但开源免费、可以本地部署,而且体积小、运行高效,跟我一起体验,看其到底有没有。 1 组合工效 图1 ZeroClaw应用组合工效展现图 2 必备基础 2.1 大模型LLM 通用经济起见,选用硅基流动Siliconflow大模型平台及其下的deepseek-ai/DeepSeek-V3.2,需要进入硅基流动网站注册登录并创建相应的API密钥,如图2所示。 图2 SiliconflowAPI密钥创建及其大模型选择组合截图 2.2 机器人Robot 通用经济起见,选用腾迅的QQ机器人。进入腾迅QQ开放平台,注册登录,新建QQ机器人并创建机器人AppID与机器人密钥,在“开发”下选择相应的常用“回调配置”