# Search Router

> 搜索路由器：基于 opencli，按话题和场景把查询路由到合适的搜索源。当用户需要从网络获取信息时（无需用户提及 opencli）加载此技能。

- Skill: `cnife/search-router` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add cnife/search-router`
- Raw SKILL.md: https://api.skillmd.com/api/skills/cnife/search-router/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: cnife (https://skillmd.com/u/cnife)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/cnife/search-router

---


# 搜索路由器

根据话题和场景，将查询路由到合适的 opencli 搜索源。核心原则：**每次搜索前先想清楚为什么搜、搜什么、去哪搜**。

## 工作流

### 步骤 1：判断是否需要搜索

收到用户问题后，先问自己：

- 这个问题能用已有对话中的搜索结果回答吗？
- 这个问题是常识/静态知识，不需要搜索吗？
- 这个问题需要实时/最新/来自特定平台的信息吗？

只有**信息确实不足**时才启动搜索。如果已有信息足够，直接回答。

判断完成后，如果确定需要搜索，输出一行决策：

```text
🔍 需要搜索：<一句话说明为什么已有信息不足>
```

如果不需要搜索，直接回答用户。

### 步骤 2：选源

根据用户问题和场景选择搜索源。参考 `references/sources.md` 中的分类站点表，按以下优先级：

1. **用户明确指定了网站/平台** -> 直接用该站点
2. **用户没有指定，属于通用问题** -> 从 AI 源（grok / doubao / gemini）中选一个，按语言和语境判断：
   - 中文语境、国内热点、生活方式 -> `doubao`
   - 英文实时讨论、Twitter/X 语境、热点追踪 -> `grok`
   - 全球网页、英文资料、背景综述 -> `gemini`
3. **AI 源返回不足，需要原始数据/权威来源/垂直结果** -> 从 `references/sources.md` 中找 1-2 个专用源

先选一个 AI 源，不够再补。

### 步骤 3：检查站点可用性

选定站点后，分两步验证其可用性：

**第一步：确认站点存在。** 如果对这个站点不熟悉，运行紧凑的站点列表命令，一次拿到所有可用站点名（站点字段以 `opencli list -h` 为准）：

```bash
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），可以跳过这一步，直接验证子命令。

**第二步：查看子命令。** 运行：

```bash
opencli <site> -h
```

如果还需要了解具体子命令的参数和输出列，再运行：

```bash
opencli <site> <command> -h
```

子命令签名和参数以 `-h` 实时输出为准。

如果站点不可用，记录跳过原因，回退到同类其他站点或 AI 源。

### 步骤 4：构造查询词

按以下结构构造查询：

```text
<主题> + <目标> + <限定条件>
```

- **主题**：要查的对象、事件、产品、人物、技术名词
- **目标**：想要什么结果--总结、对比、原因、趋势、推荐、原始数据
- **限定条件**：语言、地区、时间范围、平台范围、输出要求

示例：

- ❌ `Rust 新特性`
- ✅ `Rust 2026年最新稳定版有哪些主要新特性，简洁汇总`

## AI 源查询模板：

| 场景 | 模板 |
|------|------|
| 热点/新闻 | `<事件> + 最新进展 + <时间范围> + <地区/平台>` |
| 对比/推荐 | `<对象A> vs <对象B> + <关注维度> + <人群/预算/用途>` |
| 中文社区 | `<主题> + 中文讨论里主要观点 + <时间范围>` |
| 全球资料 | `<主题> + overview/background + with sources` |
| 求职 | `<岗位> + <城市/国家> + market trends/hiring + <时间范围>` |
| 购物 | `<商品> + reviews/price/value + <地区/预算>` |

### 步骤 5：执行搜索并记录理由

执行搜索命令。**每次搜索前**，输出一行理由：

```text
🔍 使用 <site> 搜索 "<query>"，因为 <理由>
```

理由必须具体说明为什么选这个站点、为什么已有信息不足以回答当前问题。

## 搜索次数约束：

- 每条用户消息，AI 源最多搜 1 次--选一个最合适的，搜一次拿到初步答案
- 如果 AI 源结果不够，最多再补 1-2 个专用源
- 每个站点对每条用户消息最多搜 1 次

### 步骤 6：结果评估与补充

搜索完成后评估结果：

- **足够** -> 基于结果回答用户
- **不足** -> 说明缺口，补 1-2 个专用源（非 AI 站点）
- **两次补充后仍不足** -> 停止扩搜，明确说明覆盖范围和信息缺口

### 步骤 7：搜索摘要

每次查询结束后，在回答末尾追加搜索摘要：

```md
搜索摘要

- 网站：<site1> | 查询词：<term1> | 理由：<reason1>
- 网站：<site2> | 查询词：<term2> | 理由：<reason2>
- 已跳过：<site3>，原因：<不可用/报错/信息已够>
```

## 参考文件

- **`references/sources.md`** - 所有站点按分类整理（AI 源 + 专用源），包含适用场景和路由提示。当需要选源时，读取此文件查找合适的站点。

只读与当前查询相关的分类段落，无需全量加载。

