| name | search-router |
| description | 基于 opencli 的智能搜索路由器,根据话题和场景将查询路由到最佳搜索源。当用户需要从网络获取信息时务必使用此技能——包括但不限于:查资料、搜新闻、找帖子、比价格、搜职位、查论文、搜视频、搜天气、查股价、找商品。即使用户没有明确说"用 opencli 搜索",只要需要网络信息就加载此技能。 |
搜索路由器
根据话题和场景,将查询路由到最佳的 opencli 搜索源。核心原则:每次搜索前先想清楚为什么搜、搜什么、去哪搜。
工作流
步骤 1:判断是否需要搜索
收到用户问题后,先问自己:
- 这个问题能用已有对话中的搜索结果回答吗?
- 这个问题是常识/静态知识,不需要搜索吗?
- 这个问题需要实时/最新/来自特定平台的信息吗?
只有信息确实不足时才启动搜索。如果已有信息足够,直接回答。
判断完成后,如果确定需要搜索,输出一行决策:
🔍 需要搜索:<一句话说明为什么已有信息不足>
如果不需要搜索,直接回答用户。
步骤 2:选源
根据用户问题和场景选择搜索源。参考 references/sources.md 中的分类站点表,按以下优先级:
- 用户明确指定了网站/平台 → 直接用该站点
- 用户没有指定,属于通用问题 → 从 AI 源(grok / doubao / gemini)中选一个,按语言和语境判断:
- 中文语境、国内热点、生活方式 →
doubao
- 英文实时讨论、Twitter/X 语境、热点追踪 →
grok
- 全球网页、英文资料、背景综述 →
gemini
- AI 源返回不足,需要原始数据/权威来源/垂直结果 → 从
references/sources.md 中找 1-2 个专用源
不要一开始就并行跑多个 AI 源。先选一个,不够再补。
步骤 3:检查站点可用性
选定站点后,不要假设它可用。分两步验证:
第一步:确认站点存在。 如果对这个站点不熟悉,运行紧凑的站点列表命令,一次拿到所有可用站点名:
opencli list -f json | python3 -c "import json,sys; print(', '.join(sorted(set(c['site'] for c in json.load(sys.stdin)))))"
如果确定目标站点在常用列表中(如 grok、gemini、doubao),可以跳过这一步,直接验证子命令。
第二步:查看子命令。 运行:
opencli <site> -h
如果还需要了解具体子命令的参数和输出列,再运行:
opencli <site> <command> -h
命令签名和参数以 -h 实时输出为准,不要在技能文档里硬编码。
如果站点不可用,记录跳过原因,回退到同类其他站点或 AI 源。
步骤 4:构造查询词
不要只丢一个关键词。按以下结构构造查询:
<主题> + <目标> + <限定条件>
- 主题:要查的对象、事件、产品、人物、技术名词
- 目标:想要什么结果——总结、对比、原因、趋势、推荐、原始数据
- 限定条件:语言、地区、时间范围、平台范围、输出要求
示例:
- ❌
Rust 新特性
- ✅
Rust 2026年最新稳定版有哪些主要新特性,简洁汇总
AI 源查询模板:
| 场景 | 模板 |
|---|
| 热点/新闻 | <事件> + 最新进展 + <时间范围> + <地区/平台> |
| 对比/推荐 | <对象A> vs <对象B> + <关注维度> + <人群/预算/用途> |
| 中文社区 | <主题> + 中文讨论里主要观点 + <时间范围> |
| 全球资料 | <主题> + overview/background + with sources |
| 求职 | <岗位> + <城市/国家> + market trends/hiring + <时间范围> |
| 购物 | <商品> + reviews/price/value + <地区/预算> |
步骤 5:执行搜索并记录理由
执行搜索命令。每次搜索前,输出一行理由:
🔍 使用 <site> 搜索 "<query>",因为 <理由>
理由必须具体说明为什么选这个站点、为什么已有信息不足以回答当前问题。
搜索次数约束(软性):
- 每条用户消息,AI 源最多搜 1 次——选一个最合适的,搜一次拿到初步答案
- 如果 AI 源结果不够,最多再补 1-2 个专用源
- 不要对同一条用户消息反复搜索同一个站点
- 如果搜索失败(报错、超时、需要登录),不要无脑重试——记录失败原因,换一个同类站点或直接说明缺口
步骤 6:结果评估与补充
搜索完成后评估结果:
- 足够 → 基于结果回答用户
- 不足 → 说明缺口,补 1-2 个专用源(非 AI 站点),不要再搜 AI 源
- 两次补充后仍不足 → 停止扩搜,明确说明覆盖范围和信息缺口,不要进入无限搜索循环
步骤 7:搜索摘要
每次查询结束后,在回答末尾追加搜索摘要:
搜索摘要
- 网站:<site1> | 查询词:<term1> | 理由:<reason1>
- 网站:<site2> | 查询词:<term2> | 理由:<reason2>
- 已跳过:<site3>,原因:<不可用/报错/信息已够>
处理不可用的源
- 不要因为单个源失败而中止整个搜索
- 记录跳过原因:「已跳过:,原因:<具体原因>」
- 回退到同类其他站点,或回退到一个 AI 源
- 始终以实际执行结果为准,不要假设任何站点"绝对可用"
参考文件
references/sources.md — 所有站点按分类整理(AI 源 + 专用源),包含适用场景和路由提示。当需要选源时,读取此文件查找合适的站点。
只读与当前查询相关的分类段落,无需全量加载。