需依次完成五步:一、安装exa-py==1.3.0并验证版本;二、配置exa_api_key环境变量并重启服务;三、在toolsets.py启用exa_search技能并设置embedding_model;四、在context_compressor.py中实现exa与arxiv双路并行检索;五、在exa_search.py中添加超时/空结果时自动回退至fts5全文检索。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您希望在Hermes Agent中启用ExaPy搜索引擎以实现高精度语义搜索与全网数据实时检索,但当前系统未识别ExaPy服务或返回空结果,则可能是由于API密钥未配置、依赖未安装或技能模块未启用。以下是解决此问题的步骤:
一、安装ExaPy Python SDK并验证环境兼容性
ExaPy是Exa官方提供的Python客户端,用于调用其语义搜索引擎API。Hermes Agent需通过Python子进程或同步HTTP调用与其交互,因此必须确保运行环境已正确安装且版本匹配。
1、确认Python版本为3.9或更高:执行python --version,若低于3.9需升级或切换至兼容虚拟环境。
2、在Hermes Agent主目录下执行pip安装命令:pip install exa-py==1.3.0(指定1.3.0版本以避免与skills/research/exa/模块中的硬编码调用不兼容)。
3、运行验证脚本:python -c "import exa; print(exa.__version__)",输出1.3.0即表示安装成功。
二、配置Exa API密钥并注入Hermes环境变量
ExaPy需通过环境变量EXA_API_KEY读取认证凭据。该密钥不可硬编码于技能文件中,必须通过Hermes Agent的安全配置机制注入,防止泄露至Git或日志。
1、访问https://exa.ai/dashboard/api-keys登录Exa控制台,点击“Create API Key”,命名如hermes-prod,复制生成的密钥字符串。
2、编辑Hermes Agent全局环境配置文件:vim ~/.hermes/.env。
3、在文件末尾新增一行:EXA_API_KEY=<strong><font color="green">your_copied_api_key_here</font></strong>,保存退出。
4、重启Hermes Agent服务使变量生效:hermes stop && hermes start。
三、启用并测试exa_search技能模块
skills/research/exa/目录下已预置exa_search.py技能,支持search、find_similar、get_contents三类操作。该技能默认处于禁用状态,需手动注册至toolsets.py并完成嵌入模型对齐。
1、打开tools/toolsets.py,定位到AVAILABLE_TOOLS = [...]列表。
2、在列表中添加字符串"exa_search",确保逗号分隔无语法错误。
3、进入skills/research/exa/exa_search.py,检查第42行附近是否包含embedding_model = "exa-embed-xsmall";若为None或空字符串,需显式赋值以启用语义向量化搜索。
4、在终端中执行测试命令:hermes chat "使用Exa搜索最近三天关于量子退火的arXiv论文标题",观察是否返回含title字段的JSON结构化结果。
四、配置双路检索管道以融合Exa与本地arXiv技能
单一Exa搜索虽覆盖广,但学术深度弱于arXiv原生接口。Hermes Agent支持将Exa作为“广度通道”、arXiv作为“深度通道”进行并行召回,再由重排序器统一输出。该配置需修改检索路由逻辑,不依赖外部服务进程。
1、打开agent/context_compressor.py,查找函数retrieve_relevant_chunks。
2、在函数内插入并行调用块:启动两个线程,分别调用exa_search.search(..., time_bound="past_72h")与arxiv_search.search(..., max_results=5)。
3、合并两路结果时,对每条记录添加source: "exa"或source: "arxiv"字段标识来源。
4、调用reranker.rank(results, query)完成融合排序,确保Exa返回的高相关性新闻稿与arXiv返回的技术报告按语义一致性混合排列。
五、设置Exa搜索失败时的自动回退机制
当Exa API响应超时(HTTP 504)、限频(HTTP 429)或返回空结果时,Hermes Agent应自动降级至本地FTS5全文检索,保障任务连续性。该逻辑需嵌入技能执行层异常处理分支,而非由用户手动触发。
1、打开skills/research/exa/exa_search.py,定位至def search(...)函数主体。
2、在try:块末尾添加except (requests.Timeout, requests.ConnectionError, ExaRequestError) as e:分支。
3、在异常分支中插入回退调用:return fallback_to_fts5(query, limit=3),该函数需已在skills/research/local/fts5_search.py中定义。
4、确保fallback_to_fts5函数返回格式与Exa一致(含title、url、snippet字段),避免下游解析报错。











