--- name: opencli-websearch description: 使用 Qoder WebSearch 和 OpenCLI 同时进行多源网络搜索,合并结果并提供全面的信息检索。支持谷歌、知乎、ArXiv、小红书、StackOverflow、HackerNews 等多个数据源。当用户需要搜索信息、研究话题或获取多源数据时自动使用。 --- # OpenCLI 多源 Web 搜索 ## 概述 本 Skill 提供**并行搜索能力**,同时使用 Qoder 内置 WebSearch 和 OpenCLI 的多源适配器进行搜索,合并结果以提供更全面的信息覆盖。 ## 搜索策略 ### 并行搜索架构 ``` 用户查询 ├──→ Qoder WebSearch (通用搜索) └──→ OpenCLI 多源搜索 ├──→ 学术源: arxiv ├──→ 技术源: stackoverflow, hackernews ├──→ 社交源: xiaohongshu, zhihu (需浏览器) ├──→ 新闻源: 36kr, bbc, reuters └──→ 通用源: google (需浏览器) ``` ### 数据源分类 | 类别 | 数据源 | 模式 | 适用场景 | |-----|-------|------|---------| | **学术** | arxiv | 公开 | 论文、研究 | | **技术** | stackoverflow, hackernews | 公开 | 编程、技术讨论 | | **中文社交** | zhihu, xiaohongshu | 浏览器 | 中文社区内容 | | **新闻** | 36kr, bbc, reuters | 公开 | 时事新闻 | | **通用** | google | 浏览器 | 广泛搜索 | ## 使用方法 ### 基本搜索 当用户需要搜索信息时,自动执行以下流程: 1. **启动并行搜索** - 调用 Qoder WebSearch - 同时调用 OpenCLI 多源搜索 2. **OpenCLI 搜索执行** ```bash # 学术搜索 opencli arxiv search "{query}" --limit 5 # 技术搜索 opencli stackoverflow search "{query}" --limit 5 opencli hackernews top # 或搜索相关 # 新闻搜索 (36kr 支持中文) opencli 36kr search "{query}" --limit 5 # 其他公开源 opencli gitee search "{query}" --limit 5 ``` 3. **结果合并与去重** - 合并所有来源的结果 - 按相关性和来源多样性排序 - 标注每个结果的来源 ### 深度内容获取 对于重要结果,使用 OpenCLI 下载完整内容: ```bash # 下载网页内容为 Markdown opencli web read --url "{url}" --output "{output_path}" ``` ### 临时数据存储 所有下载的内容存储在: ``` ~/Downloads/opencli-websearch-data/ ├── {timestamp}_{query_hash}/ │ ├── metadata.json # 搜索元数据 │ ├── results.json # 合并后的搜索结果 │ └── content/ │ ├── arxiv_{id}.md │ ├── web_{hash}.md │ └── ... ``` ## 执行流程 ### Step 1: 分析查询意图 判断查询类型以选择最佳数据源: - **学术/研究** → 优先 arxiv, google-scholar - **编程/技术** → 优先 stackoverflow, hackernews - **中文内容** → 优先 zhihu, xiaohongshu, 36kr - **新闻/时事** → 优先 bbc, reuters, 36kr - **通用查询** → 全源搜索 ### Step 2: 并行执行搜索 ```python # 伪代码示意 sources = select_sources(query_intent) results = {} # Qoder WebSearch results['qoder'] = websearch(query) # OpenCLI 多源搜索 for source in sources: results[source] = opencli_search(source, query) ``` ### Step 3: 结果处理 1. **格式化**: 统一不同来源的结果格式 2. **去重**: 基于 URL 和标题相似度去重 3. **排序**: 按来源权威性和相关性排序 4. **摘要**: 为每个结果生成简要摘要 ### Step 4: 深度获取(可选) 对于高相关性结果: 1. 使用 `opencli web read` 获取完整内容 2. 存储到本地临时目录 3. 提供内容摘要给用户 ## 输出格式 ### 搜索结果报告 ```markdown ## 搜索结果: {query} ### 概览 - 搜索源: {sources} - 总结果数: {count} - 存储位置: ~/Downloads/opencli-websearch-data/{timestamp}/ ### 按来源分类 #### 学术来源 1. [标题](url) - arxiv - 摘要: ... #### 技术来源 1. [标题](url) - stackoverflow - 摘要: ... #### 中文来源 1. [标题](url) - zhihu - 摘要: ... ### 推荐深度阅读 - [文档1](path) - 已下载完整内容 - [文档2](path) - 已下载完整内容 ``` ## 工具函数 ### 执行 OpenCLI 搜索 ```python def opencli_search(source: str, query: str, limit: int = 5) -> list: """ 使用 OpenCLI 搜索指定数据源 Args: source: 数据源名称 (arxiv, stackoverflow, etc.) query: 搜索查询 limit: 结果数量限制 Returns: 搜索结果列表 """ # 构建命令 cmd = f"opencli {source} search '{query}' --limit {limit}" # 执行并解析结果 ... ``` ### 下载文档内容 ```python def download_content(url: str, output_dir: str) -> str: """ 使用 OpenCLI web read 下载文档 Args: url: 文档 URL output_dir: 输出目录 Returns: 下载文件的本地路径 """ filename = hash(url) + ".md" output_path = os.path.join(output_dir, filename) cmd = f"opencli web read --url '{url}' --output '{output_path}'" # 执行命令 ... return output_path ``` ### 创建存储目录 ```python def create_storage_dir(query: str) -> str: """ 创建临时存储目录 Returns: 存储目录路径 """ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") query_hash = hashlib.md5(query.encode()).hexdigest()[:8] dir_name = f"{timestamp}_{query_hash}" storage_path = os.path.expanduser(f"~/Downloads/opencli-websearch-data/{dir_name}") os.makedirs(storage_path, exist_ok=True) os.makedirs(os.path.join(storage_path, "content"), exist_ok=True) return storage_path ``` ## 错误处理 ### 常见错误 | 错误码 | 原因 | 解决方案 | |-------|------|---------| | BROWSER_CONNECT | 浏览器扩展未连接 | 提示用户打开 Chrome 并启用扩展 | | TIMEOUT | 搜索超时 | 减少结果数量或更换数据源 | | NOT_FOUND | 无搜索结果 | 尝试其他数据源或修改查询词 | ### 降级策略 当某个数据源失败时: 1. 记录错误信息 2. 继续处理其他数据源 3. 在结果中标注失败的数据源 4. 建议用户可选的替代方案 ## 最佳实践 1. **查询优化**: 对于中文查询,优先使用中文数据源 2. **结果数量**: 每个源默认获取 5 条,避免过多噪声 3. **深度获取**: 只对高相关性结果下载完整内容 4. **存储管理**: 定期清理 ~/Downloads/opencli-websearch-data/ 下的旧数据 5. **来源标注**: 始终标注每个结果的来源,便于用户判断可信度 ## 示例 ### 示例 1: 学术研究 用户: "搜索关于大语言模型路由的论文" 执行: ```bash # 并行搜索 opencli arxiv search "large language model routing" --limit 5 opencli arxiv search "LLM router" --limit 5 # Qoder websearch 同时执行 ``` ### 示例 2: 技术问题 用户: "Python 异步编程最佳实践" 执行: ```bash opencli stackoverflow search "python async best practices" --limit 5 opencli hackernews top | grep -i python # Qoder websearch 同时执行 ``` ### 示例 3: 中文内容 用户: "小红书上的 AI 工具推荐" 执行: ```bash opencli xiaohongshu search "AI工具推荐" --limit 5 # 注意: 需要浏览器扩展已连接 ```