
AI 应用代码智能体交互助手CLIMCP Clients人工智能【免费下载链接】crushGlamourous agentic coding for all 项目地址https://gitcode.com/gh_mirrors/crush3/crush点击查看免费下载导读Crush 是一个面向终端场景的 Glamourous agentic coding 工具为编码代理内置了一套完整的网页内容获取工具族。其中agentic_fetch是一个特殊的工具它不是简单抓取网页原文而是启动一个独立的 AI 子代理借助web_search与web_fetch等工具完成搜索、抓取、提炼、摘要与问答把取回内容和理解内容两步合一。读完本文你将理解agentic_fetch与普通fetch的定位差异、它的两种工作模式指定 URL 模式与自由搜索模式、底层子代理的模型与工具构成、权限与会话机制以及它在什么场景下值得付出更高的延迟与成本。一、工具定位一行描述背后的设计意图agentic_fetch的工具描述位于 internal/agent/templates/agentic_fetch.md全文即其对外暴露的能力声明Fetch a URL or search the web using an AI sub-agent that can extract, summarize, and answer questions. Slower and costlier than fetch; use fetch for raw content or API responses.通过 AI 子代理抓取 URL 或搜索网络用于提取信息、生成摘要和回答问题。相比fetch更慢、更贵如需原始内容或 API 响应请使用fetch。这段描述点明了三个核心事实它是子代理sub-agent驱动的调用一次agentic_fetchCrush 会启动一个全新的、独立的会话代理来执行任务而不是在主代理上下文中直接抓取。它不止于抓取输出的是提取、摘要、问答的结果而非页面原文。它与fetch形成明确分工追求原始内容、接口响应时用轻量的fetch需要理解与加工内容时用昂贵的agentic_fetch。在 internal/agent/coordinator.go#L815-L821 中可以看到该工具与agent工具一样只有在代理配置的AllowedTools列表里显式包含agentic_fetch时才会被注册进工具集if slices.Contains(agent.AllowedTools, tools.AgenticFetchToolName) { agenticFetchTool, err : c.agenticFetchTool(ctx, nil) if err ! nil { return nil, err } allTools append(allTools, agenticFetchTool) }工具名常量定义在 internal/agent/tools/fetch_types.goconst AgenticFetchToolName agentic_fetch二、fetch 工具族全景在什么位置选择 agentic_fetch要真正用好agentic_fetch需要先看清它在整个工具族中的坐标。Crush 的网页相关工具可以分为无 AI 加工与带 AI 加工两档工具描述文件能力是否使用 AI 子代理agentinternal/agent/templates/agent_tool.md启动一个仅有glob、grep、ls、view的工具搜索代理是聚焦本地文件检索fetchinternal/agent/tools/fetch.md.tpl抓取 URL 原文为 text/markdown/html上限约 100KBMaxFetchSize 100 * 1024见 internal/agent/tools/fetch.go#L20-L23不做任何 AI 处理否web_fetchinternal/agent/tools/web_fetch.md.tpl供子代理内部使用的网页抓取返回 markdown超过 50KB 的大页面会保存到临时文件供grep/view分析否子代理的工具web_searchinternal/agent/tools/web_search.md.tpl通过 DuckDuckGo 搜索返回标题、URL 与摘要片段供子代理后续用web_fetch获取全文否子代理的工具agentic_fetchinternal/agent/templates/agentic_fetch.md启动 AI 子代理自主完成搜索、抓取、提取、摘要与问答是三个核心区分点值得注意fetch与agentic_fetch的分工fetch的描述明确写着 no AI processing. For analysis or extraction use agentic_fetch即需要分析和提取时请用 agentic_fetch。此外两个工具都检测了ghCLI 是否可用见 internal/agent/tools/tools.go#L72-L79当给定的是精确的 GitHub 仓库、Issue 或 PR 链接时工具描述会提示改用ghCLI 更高效。agent与agentic_fetch的分工agent子代理只有本地文件工具glob/grep/ls/view用于不确定能否一次命中时的检索兜底而agentic_fetch子代理拥有完整的网页工具链用于网络内容的理解与提炼。web_search/web_fetch是内部工具它们默认不直接暴露给主代理而是作为agentic_fetch子代理的专属工具集存在。三、两种工作模式指定 URL 与自由搜索agentic_fetch的参数结构定义在 internal/agent/tools/fetch_types.go#L15-L25type AgenticFetchParams struct { URL string json:url,omitempty description:The URL to fetch content from (optional - if not provided, the agent will search the web) Prompt string json:prompt description:The prompt describing what information to find or extract } type AgenticFetchPermissionsParams struct { URL string json:url,omitempty Prompt string json:prompt }参数语义非常清晰prompt必填告诉子代理要找什么、提取什么。它是唯一的必填参数缺失会直接报错见下文校验逻辑。url可选给出明确的待分析 URL。不提供时子代理进入自由搜索模式自行决定搜索关键词、抓取哪些页面。对应的两种模式在 internal/agent/agentic_fetch_tool.go#L76-L81 中先行体现——工具会按模式生成给用户看的权限描述var description string if params.URL ! { description fmt.Sprintf(Fetch and analyze content from URL: %s, params.URL) } else { description Search the web and analyze results }模式一指定 URL先抓取再分析当params.URL非空时子代理不会先做搜索而是由外层工具直接抓取该 URL 的内容调用tools.FetchURLAndConvert再交给子代理分析。这里有一个关键的分流逻辑internal/agent/agentic_fetch_tool.go#L117-L135hasLargeContent : len(content) tools.LargeContentThreshold if hasLargeContent { tempFile, err : os.CreateTemp(tmpDir, page-*.md) // ...写入 content 后关闭 fullPrompt fmt.Sprintf(%s\n\nThe web page from %s has been saved to: %s\n\nUse the view and grep tools to analyze this file and extract the requested information., params.Prompt, params.URL, tempFilePath) } else { fullPrompt fmt.Sprintf(%s\n\nWeb page URL: %s\n\nwebpage_content\n%s\n/webpage_content, params.Prompt, params.URL, content) }其中LargeContentThreshold 50000即 50KB见 internal/agent/tools/fetch_types.go#L12-L13。这意味着小于等于 50KB 的页面内容直接以内嵌webpage_content的形式拼进子代理的完整提示词中子代理一次就能读到全部内容大于 50KB 的页面内容先落盘为临时 markdown 文件提示词改为请用view和grep工具分析该文件。这是与web_fetchinternal/agent/tools/web_fetch.go#L51-L75完全一致的策略——避免超大内容撑爆上下文窗口同时让子代理借助本地检索工具精确命中所需信息。模式二自由搜索子代理自主决策未提供url时提示词改为引导子代理自主搜索internal/agent/agentic_fetch_tool.go#L136-L139fullPrompt fmt.Sprintf(%s\n\nUse the web_search tool to find relevant information. Break down the question into smaller, focused searches if needed. After searching, use web_fetch to get detailed content from the most relevant results., params.Prompt)此时子代理拥有完整的搜索-抓取-分析自主权是agentic_fetch最具agentic特性的模式它自行拆分查询、迭代搜索、挑选最有价值的链接抓取全文最后汇总答案。四、子代理的构成模型、系统提示词与工具集4.1 使用小模型驱动兼顾成本一个值得关注的实现细节无论agentic_fetch本身跑在什么模型上其内部子代理都统一使用小模型internal/agent/agentic_fetch_tool.go#L150-L153_, small, err : c.buildAgentModels(ctx, true)构建会话代理时更是显式注释了大模型不参与internal/agent/agentic_fetch_tool.go#L181-L191agent : NewSessionAgent(SessionAgentOptions{ LargeModel: small, // Use small model for both (fetch doesnt need large) SmallModel: small, SystemPromptPrefix: smallProviderCfg.SystemPromptPrefix, SystemPrompt: systemPrompt, DisableAutoSummarize: c.cfg.Config().Options.DisableAutoSummarize, IsYolo: c.permissions.SkipRequests(), Sessions: c.sessions, Messages: c.messages, Tools: fetchTools, })这是小任务用小模型的成本控制策略网页内容分析对推理深度的要求通常低于写代码用小模型足以胜任从而对冲子代理多轮工具调用带来的额外开销。4.2 系统提示词一份完整的网页内容分析员指令子代理的系统提示词来自 internal/agent/templates/agentic_fetch_prompt.md.tpl由prompt.NewPrompt(agentic_fetch, ...)渲染internal/agent/agentic_fetch_tool.go#L145-L148渲染时注入了工作目录此处即临时目录、平台与日期等环境信息Working directory: {{.WorkingDir}} Platform: {{.Platform}} Todays date: {{.Date}}该模板的规则部分rules完整定义了子代理的行为边界回答简洁直接只关注用户提示中请求的信息若内容以文件路径提供用grep与view高效检索对应大页面落盘场景相关时引用原文片段支撑答案找不到所需信息时明确说明而不是编造所有文件路径必须使用绝对路径需要链接页或搜索结果中的信息时用web_fetch获取需要更多信息时用web_search搜索抓取链接后自行分析内容提取所需信息必要时可多次抓取链接、多次搜索直至信息完整关键要求回答末尾必须附 Sources 章节列出所有对回答问题有帮助的 URL。4.3 搜索策略分解、聚焦、迭代模板的search_strategy段落为子代理提供了方法论级的搜索指引这也是自由搜索模式质量的核心保障分解复杂问题用户问题含多个子问题时逐个搜索精准定向查询多次小范围搜索优于一次宽泛搜索。模板甚至给出了正反例——坏例Python 3.12 new features performance improvements async changes好例先搜 Python 3.12 new features再搜 Python 3.12 performance improvements再搜 Python 3.12 async changes迭代与细化首轮结果不佳时更换关键词或提高精度多角度搜索为求全面答案从不同角度分别检索跟进有价值的线索发现好来源后抓取它并顺藤摸瓜查其中的相关链接。模板还附带了一个完整的示例工作流——Rust vs Go 用于 Web 服务的优缺点先分别搜 Rust web services advantages、Go web services advantages、Rust vs Go performance comparison再抓取各搜索结果中最相关的内容。4.4 子代理工具集六件套子代理不是全量工具集而是精挑细选的六件套internal/agent/agentic_fetch_tool.go#L165-L174webFetchTool : tools.NewWebFetchTool(tmpDir, client) webSearchTool : tools.NewWebSearchTool(client) fetchTools : []fantasy.AgentTool{ webFetchTool, webSearchTool, tools.NewGlobTool(tmpDir, c.cfg.Config().Tools.Glob), tools.NewGrepTool(tmpDir, c.cfg.Config().Tools.Grep), tools.NewSourcegraphTool(client), tools.NewViewTool(c.lspManager, c.permissions, c.filetracker, nil, tmpDir), }各工具的职责工具作用说明web_search网络搜索基于 DuckDuckGo返回标题、URL、摘要query必填max_results默认 10、上限 20见 internal/agent/tools/web_search.go#L39-L59web_fetch抓取全文只接受 URL返回 markdown大页面50KB保存到工作目录下的page-*.md临时文件glob/grep/view本地文件分析用于检索和分析落盘的大页面临时文件sourcegraph源码检索涉及代码问题时可检索公开代码库一个重要设计子代理的内部工具调用不经过用户 hook 拦截。源码中的注释internal/agent/agentic_fetch_tool.go#L176-L179解释得很清楚——顶层的agentic_fetch调用本身已经经过了 hook 包装如果对内部每个工具调用再触发一次 hook用户的自定义 hook 会在单次委托回合中被重复执行 N 次。五、权限与会话管理一次调用一个受控会话agentic_fetch走的是完整权限审批链路internal/agent/agentic_fetch_tool.go#L83-L100p, err : c.permissions.Request( ctx, permission.CreatePermissionRequest{ SessionID: validationResult.SessionID, Path: c.cfg.WorkingDir(), ToolCallID: call.ID, ToolName: tools.AgenticFetchToolName, Action: fetch, Description: description, Params: tools.AgenticFetchPermissionsParams(params), }, ) if err ! nil { return fantasy.ToolResponse{}, err } if !p { return tools.NewPermissionDeniedResponse(), nil }权限被拒绝时返回NewPermissionDeniedResponse()——该响应带有StopTurn标记令主代理循环停止重试见 internal/agent/tools/tools.go#L64-L70避免在用户拒绝后反复轰炸。通过审批后工具会创建一个临时目录crush-fetch-*位于配置的 DataDirectory 下作为子代理的工作目录并在子代理会话建立后立即对该会话自动批准后续所有内部权限请求internal/agent/agentic_fetch_tool.go#L199-L202SessionSetup: func(sessionID string) { c.permissions.AutoApproveSession(sessionID) },子代理会话的标题固定为 Fetch Analysis其输出通过runSubAgent汇入主代理上下文——这意味着用户能看到子代理的分析结论而无需关心其内部工具调用细节。整个临时目录在工具调用结束后随defer os.RemoveAll(tmpDir)清理不会污染工作区。六、参数校验前置防线工具调用进入正题前先经过 validateAgenticFetchParams 三道校验prompt不能为空唯一必填参数会话 ID 必须能从 context 取到GetSessionFromContext代理消息 ID 必须能从 context 取到GetMessageFromContext。其中会话与消息 ID 由tools包通过 context 键session_id/message_id传递见 internal/agent/tools/tools.go#L44-L52确保子代理结果能正确归档到发起方会话与消息之下。任何一项缺失都会返回带明确错误文案的文本错误响应。七、HTTP 客户端与性能基调工具使用的http.Client有一套统一的调优参数internal/agent/agentic_fetch_tool.go#L54-L64transport.MaxIdleConns 100 transport.MaxIdleConnsPerHost 10 transport.IdleConnTimeout 90 * time.Second client http.Client{ Timeout: 30 * time.Second, Transport: transport, }即单次请求超时 30 秒、连接池空闲上限 90 秒、每主机最多 10 个空闲连接。web_fetch与web_search工具内部复用了相同的默认值见 internal/agent/tools/web_fetch.go#L25-L36。这从侧面印证了工具描述中的Slower and costlier一次agentic_fetch调用往往包含多轮web_searchweb_fetch往返再叠加子代理的模型推理与多轮工具循环整体耗时会显著高于单次fetch。八、实践指引何时用哪个工具综合文档声明与源码实现给出如下选型建议要原始内容 / API 响应用fetch。它不做 AI 加工上限约 100KB速度快、成本低若内容是精确的 GitHub 仓库/Issue/PR 链接且本机装有gh工具描述会提示直接走ghCLI。要理解、提取、摘要、对比、问答用agentic_fetch。它用 AI 子代理消化网页给出的是结论而非原文。问题需要跨多个来源求证优先agentic_fetch的自由搜索模式不传url子代理会按模板的搜索策略自行分解查询、迭代搜索并汇总来源。已锁定单一目标页面但页面较大或结构复杂给agentic_fetch传url让外层先抓取、子代理再分析超过 50KB 时子代理会自动切换到落盘 grep/view 检索的分析路径。在本地代码库中做模糊检索用agent只有 glob/grep/ls/view不涉及网络。需要再次强调的是agentic_fetch的定位决定了它不应被用于高频、琐碎的取数场景——每一次调用都会启动一个完整的小模型会话并执行多轮工具调用属于重武器应在确实需要语义理解时启用并通过代理配置的AllowedTools列表按需开放。结语agentic_fetch虽只有一行工具描述背后却是一套完整的委托式内容理解架构从参数校验、权限审批、双模式分流、大内容落盘到小模型子代理 六件套工具 结构化系统提示词再到会话自动批准与临时目录清理。理解它的内部运作既能帮助你在合适的场景做出正确的工具选择也能为自定义子代理工具的设计提供一份可借鉴的参考范本。核心实现与模板均可在仓库中直接研读internal/agent/agentic_fetch_tool.go、internal/agent/templates/agentic_fetch_prompt.md.tpl 与 internal/agent/tools/fetch_types.go。赞分享AI 应用代码智能体交互助手CLIMCP Clients人工智能【免费下载链接】crushGlamourous agentic coding for all 项目地址https://gitcode.com/gh_mirrors/crush3/crush点击查看免费下载相关推荐《AI逐页读书PDF知识提取与摘要生成器》使用教程《AI逐页读书PDF知识提取与摘要生成器》使用教程 1. 项目目录结构及介绍 本项目《AI逐页读书PDF知识提取与摘要生成器》的目录结构如下 AI rea人工智能AI 应用如何永久保存微信聊天记录WeChatMsg数据留痕终极指南如何永久保存微信聊天记录WeChatMsg数据留痕终极指南 你是否曾因手机丢失或更换而失去珍贵的聊天记录那些与亲友的温馨对话、重要的工作沟通、成长的点点滴滴Crush源码深度解析理解AI代理工具架构与实现原理Crush源码深度解析理解AI代理工具架构与实现原理 Crush是一个基于终端的AI编程助手它通过精心设计的架构将多种大型语言模型与开发工具无缝集成。本文将AI 应用代码智能体交互助手CLIMCP Clients人工智能上一篇解决90%开发者都会遇到的Surya-OCR模型加载难题从报错到优化的全流程方案下一篇如何用Surya实现90语言的终极OCR解决方案从安装到高级应用全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考