--- name: multi-source-search description: 多源聚合搜索skill。当用户说"搜/找/查/搜一下/找一下/查一下"时激活。支持Web通用搜索、中文社区、GitHub、视频、学习资料等多源并行搜索。 version: 1.8.0 --- # Multi-Source Search(多源聚合搜索) 当用户需要搜索、查找、查询信息时激活此skill。根据搜索类型自动选择最优搜索源和策略。 ## 搜索后端优先级 ## ⚠️ 强制规则(2026-07-18用户更新):并行双搜 **每次"搜一下"请求,必须同时启动小搜 + 大搜并行搜索。** 不再二选一,不再判断哪个合适,不需要确认。 **小搜(AnySearch CLI)** — 通用搜索(网页/新闻/知识) **大搜(Agent Reach / 马维斯)** — 垂直平台搜索(GitHub/B站/知乎/小红书等) ### 小搜路径 ```bash python "C:/Users/32295/.hermes/skills/anysearch-skill-2.1.0/scripts/anysearch_cli.py" ``` ### 大搜路径 ```bash python -m agent_reach.cli search ``` 路径:`~/Desktop/Agent-Reach/`,已 pip install -e 安装在 Hermes venv 中。 支持平台:B站、YouTube、X(Twitter)、小红书、GitHub、V2EX、Reddit、Hacker News、百度贴吧、微博、知乎、抖音等。 ### 执行方式 并行启动,互不等待。小搜跑通用查询,大搜同时跑相关平台。两个结果都回来后再综合整理输出。 **这条规则的触发条件:** 任何"搜/找/查/搜一下/找一下/查一下/去XX看看有没有"的请求,小搜+大搜同时启动。**不是** GitHub API、不是浏览器搜索、不是调度子任务去搜。详见下方「执行顺序——每次搜索都必须遵守的步骤」。 **用户 2026-07-18 明确要求并行双搜。** 这是强制规则,不是建议。 ### 常用命令 ```bash # 通用搜索(最常用,绝对路径) python "C:/Users/32295/.hermes/skills/anysearch-skill-2.1.0/scripts/anysearch_cli.py" search "关键词" # 批量搜索(2-5个请求并行) python "C:/Users/32295/.hermes/skills/anysearch-skill-2.1.0/scripts/anysearch_cli.py" batch_search --queries '["q1","q2"]' # 获取页面内容 python "C:/Users/32295/.hermes/skills/anysearch-skill-2.1.0/scripts/anysearch_cli.py" extract --url "https://..." ``` **whichllm(模型推荐工具)——硬件检测 + 模型评分:** ```bash uvx whichllm@latest ``` 详见 `references/whichllm-tool.md`。 **Agent Reach(大搜/马维斯)作为垂直平台搜索的并行搭档。** 每次"搜一下"必须和小搜同时启动。 支持平台:B站、YouTube、X(Twitter)、小红书、GitHub、V2EX、Reddit、Hacker News、百度贴吧、微博、知乎、抖音等。 用法:`python -m agent_reach.cli search ` **回退方案:** `browser_navigate` 直接搜(注意:Google/Bing/Baidu 未登录状态会被 CAPTCHA 拦截,优先用 AnySearch)。每次用浏览器搜索前,先确认 AnySearch 是否可用。CAPTCHA 详情见 `references/search-engine-captcha.md`。 **AnySearch 配置状态:** 已配置好(Python runtime,`runtime.conf` 已写)。如果 CLI 命令突然失效,先检查 `runtime.conf` 是否存在、Python CLI 是否能跑通 `doc` 命令。首次配置流程见 `references/anysearch-setup.md`。 详见 `references/user-tool-names.md`。 ### 用户分享链接的处理流程(先试再报,不预判) 当用户分享一个链接(抖音/快手/B站/GitHub等): 1. **先尝试访问** — 用 `browser_navigate` 直接打开,不要假设打不开 2. **首试失败了?再试一次** — 网络可能临时波动(ERR_PROXY_CONNECTION_FAILED 可能是瞬态) 3. **还不行?只报告障碍,不加评价** — 说"链接打不开:[具体错误]"就够了 4. **用户说"咋可能"?立刻重试,不辩解** 5. **用户问"为什么"才解释原因**,不问就不说 6. **不预判内容价值** — 不要在报告障碍时顺带说"这内容对你没用/不值得看" 错误示范: > "视频打不开。不过我知道这事,直接说判断:这个内容对你没价值..." 正确示范: > "视频打不开。发截图或复制文案,我看看。" 链接打不开时的替代方案: - 提取标题关键词 → 小搜搜标题 → 常能找到镜像 ## 路由选择 根据用户意图选择搜索路由: | 路由 | 适用场景 | 搜索源 | |------|----------|--------| | `web`(默认) | 通用知识、新闻、事实查询 | Bing + 百度 | | `cn` | 中文资料、国内信息 | 百度 + Bing国内版 | | `github` | 开源项目、代码、工具 | GitHub API | | `video` | 视频教程、网课、学习视频 | 见下方「视频搜索详细策略」 | | `study` | 学习资料、考题、笔记 | Bing + 百度 + 知乎 | | `academic` | 论文、学术 | 百度学术 + arXiv | ## 视频搜索详细策略 这是最容易踩坑的路由,有大量特殊策略。**必须先确认用户对视频的要求:** 是否需要下载?是否要求无水印?时长限制? ### 无水印获取策略总结 | 来源 | 无水印? | 可下载? | 备注 | |------|---------|---------|------| | YouTube(官方频道) | ✅ | ✅ yt-dlp | 有翻墙时首选 | | 央视网(CCTV) | ✅ | ✅ m3u8/ffmpeg | 但不一定有这个主题 | | 共产党员网(12371.cn) | ✅ | ❌ 反爬严重 | 在线看最快 | | 新华网B站官方号 | ❌ 有水印 | ✅ | 水印避不开——新华网官网自己没放文件 | | 普通B站UP | ❌ 有水印 | ✅ | 水印避不开 | ### 搜索步骤 **Step 1:YouTube(有翻墙时首选,无水印)** ``` yt-dlp --flat-playlist --playlist-end 10 "ytsearch:<关键词>" -O "%(title)s - %(id)s - %(duration>%H:%M:%S)s" ``` - 央视/CCTV的新闻联播报道在YouTube上通常30分钟全长,但核心新闻段只有前3分钟 - 裁剪命令:ffmpeg -ss 0 -t 180 -i <输入> -c copy <输出> - 下载命令:yt-dlp -f "best[height<=720]" "https://www.youtube.com/watch?v=" **Step 2:共产党员网(12371.cn)** - 首页搜关键词 → 切"视频"标签 - **注意:** 12371.cn页面反爬严重,搜索结果页链接点击可能无效(JS动态加载) - 搜索API直接HTTP请求会重定向到error页面,必须用浏览器 - 如果搜不到视频,说明这个网站可能没有这个主题的视频文件 **Step 3:新华网B站官方号** - 新华网的视频通常首发在B站官方号,官网自己反而没放独立文件 - 搜索API(so.news.cn)被WAF防火墙拦截,返回405 - B站所有视频都带B站水印,**无法去除**(DASH流的原始视频轨道也带水印) **Step 4:B站下载(仅限用户接受水印时)** 方式A - 通过浏览器console获取视频URL: ``` 1. browser_navigate 到视频页 https://www.bilibili.com/video/BVxxxxx 2. browser_console 执行获取DASH视频流URL 3. 分别下载video m4s + audio m4s 4. ffmpeg -i video.m4s -i audio.m4s -c copy output.mp4 ``` 方式B - 用lux工具(/tmp/lux.exe 已安装): ``` /tmp/lux.exe ``` 方式C - 在线解析站:leesoar.com/bilibili(输入B站URL点"解析") - 注意:以上三种方式拿到的都是B站的有水印版 **Step 5:央视网(CCTV)** - Bing搜"树立和践行正确政绩观 CCTV" 可能找到新闻报道 - 视频文件通常是m3u8直播流格式,用ffmpeg下载: ``` ffmpeg -i -c copy output.mp4 ``` - 注意:有时视频流有校验错误(packet corrupt),但ffmpeg能跳过继续 ### 视频时长处理 用户要求"少于X分钟"时: 1. 先查现有视频时长:ffprobe -v error -show_entries format=duration -of json 2. 超长的新闻联播视频(30min),用ffmpeg裁剪前3分钟核心报道段 3. 裁剪命令:ffmpeg -ss 0 -t 180 -i <输入> -c copy <输出> ### 已知限制 - **中国政务网站普遍有反爬** — 12371.cn搜索API返回405,新华网so.news.cn被WAF拦截 - **B站水印无法去除** — 无论是单文件MP4还是DASH分轨m4s,都嵌入了B站水印。没有"无水印原版" - **Bing/百度HTML解析不可靠** — 正则提取搜索结果经常空结果,优先用browser_navigate看snapshot - **GitHub API未认证每小时60次** — 大批量搜索要走认证 ## 执行顺序——每次搜索都必须遵守的步骤 ### 铁律:小搜+大搜并行双搜 **用户 2026-07-18 明确纠正:不再二选一。** 每次搜索请求,小搜(AnySearch)和大搜(Agent Reach)必须同时启动。小搜跑通用搜索,大搜同步跑 GitHub/B站/知乎/小红书等平台。 ### 禁止路径(用户明确反对的) | 不要这样做 | 理由 | 正确做法 | |-----------|------|---------| | 用 Hermes 自带 web_search(DDGS)搜中文 | DDGS 英文结果强但中文弱 | 走小搜(百度+Bing 中文)+ 大搜并行 | | 用 browser_navigate 直接搜 | 易触发 CAPTCHA,比小搜慢 | 小搜无验证码问题 | | 用 GitHub API 搜模型/仓库 | GitHub 是代码托管,不是搜索引擎 | 小搜寻 web,大搜寻 GitHub | | 调度 delegate_task 去搜 | 子任务也一样要搜索,多一层开销 | 直接小搜+大搜更快 | | 在浏览器里点来点去 | 除非需要登录或渲染,否则搜索工具足够 | 小搜+大搜优先 | | 二选一判断用小搜还是大搜 | 用户明确要求并行 | 两个同时跑,不判断 | ### Step 0:判断是否值得搜 问自己:**手中信息是否已经足够做出推荐?** - 已经知道答案 → 直接回答,不搜索 - 搜索结果不太可能改变推荐 → 停止 - 用户说"去搜"但意图是验证已知结论 → 搜一个查询确认即可,别穷举 ### Step 1:确定路由和关键词 从用户请求提取搜索关键词,判断路由。不确定时默认走 `web`。 ### Step 2:执行搜索——小搜+大搜并行 **第一步:同时启动小搜和大搜:** ```bash # 小搜:通用搜索 python "C:/Users/32295/.hermes/skills/anysearch-skill-2.1.0/scripts/anysearch_cli.py" search "关键词" # 大搜:垂直平台搜索(GitHub/B站/知乎等) python -m agent_reach.cli search github "关键词" python -m agent_reach.cli search bilibili "关键词" # 根据关键词判断最相关的1-2个平台 ``` **例外情况(可单独绕过搜索工具):** 1. 需要登录认证的网站(如 GitHub Issue 评论、知乎私信) 2. 需要 JavaScript 渲染的动态页面(如某些 SPA) 3. 小搜确实搜不到相关内容(先试两次再说) ### Step 3:内容提取 **先看列表页(如有):** 对于 GitHub Trending、搜索结果列表、话题页面等 **DOM 列表页**,先用 `browser_console` 配合 `Array.from(document.querySelectorAll(...))` 一次性提取全部条目标题和摘要,筛选后再开详情。这避免了 browser_snapshot 截断后需要反复滚动的问题。详见 `references/browser-data-extraction.md`。 **后看详情页:** 筛选出最有价值的 1-3 个页面,按类型选择提取方式: - **GitHub 仓库 README** → `curl -s https://raw.githubusercontent.com///main/README.md`(纯文本,无需浏览器,无 CAPTCHA) - **一般网页** → 优先 `curl -sL` 提取(更快),其次 `browser_navigate` + `browser_snapshot(full=true)` - **Ollama 模型页** → 用 curl 提取结构化数据。已知可提取的模式:标签用 `grep -oP 'qwen2\\.5vl:[^\\\" <&\\n]+'`,大小/上下文用 `grep -oiP '[\\d.]+GB.*?context[^<]*'`。示例见 `references/local-model-research-notes.md`。 - **需要渲染的 SPA 页面** → `browser_navigate` + 等待加载 + `browser_snapshot` - **HuggingFace API(JSON,非渲染)** → `curl -sL \"https://huggingface.co/api/models//\"` 获取结构化 JSON(含下载量、likes、config)。列表搜索:`https://huggingface.co/api/models?search=...&sort=downloads&direction=-1&limit=5` - **需要渲染的 SPA 页面** → `browser_navigate` + 等待加载 + `browser_snapshot` ### Step 4:整理输出 **⚠️ 提取核心信息,不要贴原始输出。** AnySearch 返回的内容可能包含完整的文章正文(阿里云开发者社区、CSDN 等),直接全文粘贴会: - 把消息撑爆,Hermes 桌面端渲染出白块/空白区域 - 让用户翻半天才能找到要点 - 浪费 token 上下文 正确做法:从结果中提取关键步骤/结论/数据,用自己的话总结。只在必要时引用原文(用引文块 `>`)。参考格式: ``` ## 搜索结果:[关键词] 提取到 N 条结果: **1. [标题]**(来源:...) → 核心要点:一句话说清 → 关键步骤/数据/链接(列表) **2. [标题]**(来源:...) ... ``` 需要展开某一条的话,再用 extract 命令取详情。不要直接贴 AnySearch 的原始 markdown 输出。你有判断力——提炼再呈现。 ## Windows 环境注意事项 - **Python路径**:在git-bash终端中,`python` 指向 Hermes venv (Python 3.11.12),`python3` 指向 WindowsApps 可能报 **exit code 49 且无输出**。始终用 `python` 不用 `python3`。连 `python3 --version` 都会失败。 - **curl 在 MSYS2/git-bash**:正常可用,但不支持直接 pipe 到 `python3`(会 exit 49)。用中间文件或 pipe 到 `python` 即可。 - **文件名大小写**:Windows 文件系统不敏感(不区分大小写),但 Ollama 社区模型名区分大小写(如 `Lusizo/...` 不能写成 `lusizo/...`)。 - **脚本执行**:`scripts/search.py` 用 `python scripts/search.py` 运行 - **API调用**:需要API key的环境变量(如 MOONSHOT_API_KEY)必须在终端中已设置,`execute_code` sandbox 没有这些变量 ## 常见陷阱 ### 不要在 GitHub 上搜模型推荐 模型(LLM、VLM)放在 HuggingFace 和 Ollama 库上。用户说"去GitHub找找"时,用 **小搜** 搜实际结果,不要在 GitHub 上点来点去搜仓库——GitHub 的仓库是模型的用法/工具,不是模型本身。走 `web` 路由更有效。 **正确做法:** ```bash python "C:/Users/32295/.hermes/skills/anysearch-skill-2.1.0/scripts/anysearch_cli.py" search "qwen2.5vl:7b ollama vision model review" ``` ### 做硬件依赖的建议前先验证 **永远不要靠印象猜硬件规格。** 每次涉及硬件假设时先跑: ```bash nvidia-smi --query-gpu=name,memory.total,memory.free,memory.used,driver_version --format=csv,noheader ``` 如果 GPU 相关:优先用 **whichllm** 全自动检测(比手动查更准): ```bash uvx whichllm@latest ``` ### 够了就停,别穷举 当手中已有足够信息做出正确推荐时,直接下结论。继续搜索可能翻出新东西,但用户要的是决策不是论文。如果搜索结果已经证实了你已有的判断,停。 ### 别把文件大小当系统内存 模型文件大小 ≠ 可用内存。6GB 的 GGUF 文件不意味着系统只有 6GB RAM。 ### whichllm 评分有英文 bias whichllm 的 benchmark 基于英文评测集(LiveBench、Aider 等),对中国模型(Qwen 系列)的中文能力评分偏低。中文场景下 Qwen 系列实际更强于评分数字。用 whichllm 做初筛,但最终决策要考虑中文需求。 ## 搜索技巧 ### 高级搜索语法(Bing/百度通用) - `"精确短语"` — 精确匹配 - `site:zhihu.com 关键词` — 限定网站 - `filetype:pdf 关键词` — 限定文件类型 - `关键词1 关键词2` — 同时匹配 - `关键词 -排除词` — 排除 ### 搜索失败时的 fallback 1. 精简关键词(去掉修饰词) 2. 换搜索引擎(Bing→百度→百度学术) 3. 换搜索源(中文搜不到换英文) 4. 换路由(web→github→video→academic) ## 典型触发词 | 触发词 | 示例 | |--------|------| | 搜/找/查 | "搜一下专升本政策" "找个C语言教程" | | 怎么/如何 | "怎么学高数" "如何安装Python" | | 推荐 | "推荐几个Java项目" | | 最近/最新 | "最近GitHub热门项目" | | 帮我找视频 | "找两三个学习视频" → 走video路由 |