task_id=task-t038p2-95e3c0,T038-P2 ai-search 核心重构
Step 2.1:cp -r agent_reach ai_search 完成包目录复制
Step 2.2:grep -rl "agent_reach" ai_search/ | xargs sed -i 's/agent_reach/ai_search/g' — 替换完成,ai_search/ 内无 agent_reach 引用残留
Step 2.3:pyproject.toml 更新
- name: agent-reach → ai-search
- version: 1.0.0 → 2.0.0
- 新增 entry point: ai-search = "ai_search.cli:main"
- 保留别名: agent-reach = "ai_search.cli:main"
- packages 列表加入 agent_reach
Step 2.4:兼容层 agent_reach/__init__.py 写入 from ai_search import *
Step 2.5:新建 ai_search/channels/searxng.py(160 行)
- SearXNGChannel 实现 Channel 接口
- 实现 check()/search()/list_categories()/list_engines()
- 分类别名映射(6 个别名)
- 修复:SearchResult 不含 source 字段,改放入 extra dict
Step 2.6:ai_search/channels/__init__.py 注册 SearXNGChannel(列表首位,tier 0)
Step 2.7:ai_search/core.py 重写为 AISearch 类
- 保留全部原有方法
- 新增:web(), find(), list_categories(), list_engines()
- 末尾声明 AgentReach = AISearch 别名
Step 2.8:ai_search/config.py 添加 SEARXNG_URL_DEFAULT = "http://127.0.0.1:8889" + get_searxng_url() 方法
Step 2.9:ai_search/doctor.py 更新(doctor 通过 get_all_channels() 自动包含 SearXNG)
安装:pip install -e . --break-system-packages → Successfully installed ai-search-2.0.0
searxng.py(~160行)
- ✅ 正确继承 Channel 基类,实现所有必要接口
- ✅ can_handle() 返回 False(搜索专用,不处理 URL 读取)
- ✅ check() 同步健康检查正常
- ✅ search/list_categories/list_engines 均为 async,用 run_in_executor 包装 requests
- ✅ 6 个分类别名全部到位(academic/qa/code/pkg/social/wiki)
- ✅ SearchResult 使用 extra dict 存储 source/engine 等元信息(符合 base.py 约定)
- ✅ 错误处理:time_range 非法值抛 ValueError,连接失败返回 "off" 状态
core.py 新方法
- ✅ web()、find()、list_categories()、list_engines() 风格与原有方法完全一致
- ✅ 正确代理到 SearXNG channel,传 config=self.config
- ✅ find() 中 category 参数传给 categories(SearXNG ch 内部做别名映射)
- ✅ AgentReach = AISearch 别名在文件末尾声明
- ✅ 文档字符串完整,参数说明清晰
config.py
- ✅ SEARXNG_URL_DEFAULT = "http://127.0.0.1:8889" 已添加
- ✅ get_searxng_url() 优先读 config.yaml > 环境变量 > 默认值
- ✅ SearXNGChannel._base() 通过 config.get("searxng_url", ...) 正确读取配置
channels/init.py
- ✅ SearXNGChannel 注册在列表首位(tier 0)
- ✅ 不影响 URL 路由(can_handle 返回 False,不会抢占其他 channel)
pyproject.toml
- ✅ 双 entry point:ai-search + agent-reach 均指向 ai_search.cli:main
- ✅ packages 列表含 agent_reach(兼容层打包)
agent_reach/init.py(兼容层)
- ✅ from ai_search import * + 显式导入 AISearch, AgentReach
Health: ok - 250 个引擎可用(共 250 个)
Search('artificial intelligence', general): 5 results,首条 Artificial intelligence - Wikipedia
Categories: 34
Science engines: 11
AISearch.web('test'): 5 results ✅
AISearch.find('test', category='science'): 5 results ✅
AISearch.list_categories(): 34 ✅
AISearch.list_engines('academic'→'science' alias): 11 ✅
ai-search version → Agent Reach v2.0.0 ✅
agent-reach version → Agent Reach v2.0.0 ✅
from agent_reach import * → compat import OK ✅
from agent_reach import AISearch, AgentReach → OK ✅
12 个 channel 文件(twitter/youtube/github/reddit/bilibili/xiaohongshu/
instagram/linkedin/bosszhipin/exa_search/web/rss):✅ 逻辑未变
base.py:✅ 逻辑未变
mcp_server.py:✅ 逻辑未变
cookie_extract.py:✅ 逻辑未变
agent_reach 残留引用所有审查要点全部通过,实测功能完整,向后兼容性完好,零修改约束完全遵守。