mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-28 06:51:16 +08:00
refactor: add tool_error/tool_result helpers + read_raw_config, migrate 129 callsites
Add three reusable helpers to eliminate pervasive boilerplate:
tools/registry.py — tool_error() and tool_result():
Every tool handler returns JSON strings. The pattern
json.dumps({"error": msg}, ensure_ascii=False) appeared 106 times,
and json.dumps({"success": False, "error": msg}, ...) another 23.
Now: tool_error(msg) or tool_error(msg, success=False).
tool_result() handles arbitrary result dicts:
tool_result(success=True, data=payload) or tool_result(some_dict).
hermes_cli/config.py — read_raw_config():
Lightweight YAML reader that returns the raw config dict without
load_config()'s deep-merge + migration overhead. Available for
callsites that just need a single config value.
Migration (129 callsites across 32 files):
- tools/: browser_camofox (18), file_tools (10), homeassistant (8),
web_tools (7), skill_manager (7), cronjob (11), code_execution (4),
delegate (5), send_message (4), tts (4), memory (7), session_search (3),
mcp (2), clarify (2), skills_tool (3), todo (1), vision (1),
browser (1), process_registry (2), image_gen (1)
- plugins/memory/: honcho (9), supermemory (9), hindsight (8),
holographic (7), openviking (7), mem0 (7), byterover (6), retaindb (2)
- agent/: memory_manager (2), builtin_memory_provider (1)
This commit is contained in:
@@ -1079,7 +1079,7 @@ def web_search_tool(query: str, limit: int = 5) -> str:
|
||||
try:
|
||||
from tools.interrupt import is_interrupted
|
||||
if is_interrupted():
|
||||
return json.dumps({"error": "Interrupted", "success": False})
|
||||
return tool_error("Interrupted", success=False)
|
||||
|
||||
# Dispatch to the configured backend
|
||||
backend = _get_backend()
|
||||
@@ -1158,7 +1158,7 @@ def web_search_tool(query: str, limit: int = 5) -> str:
|
||||
_debug.log_call("web_search_tool", debug_call_data)
|
||||
_debug.save()
|
||||
|
||||
return json.dumps({"error": error_msg}, ensure_ascii=False)
|
||||
return tool_error(error_msg)
|
||||
|
||||
|
||||
async def web_extract_tool(
|
||||
@@ -1458,7 +1458,7 @@ async def web_extract_tool(
|
||||
trimmed_response = {"results": trimmed_results}
|
||||
|
||||
if trimmed_response.get("results") == []:
|
||||
result_json = json.dumps({"error": "Content was inaccessible or not found"}, ensure_ascii=False)
|
||||
result_json = tool_error("Content was inaccessible or not found")
|
||||
|
||||
cleaned_result = clean_base64_images(result_json)
|
||||
|
||||
@@ -1484,7 +1484,7 @@ async def web_extract_tool(
|
||||
_debug.log_call("web_extract_tool", debug_call_data)
|
||||
_debug.save()
|
||||
|
||||
return json.dumps({"error": error_msg}, ensure_ascii=False)
|
||||
return tool_error(error_msg)
|
||||
|
||||
|
||||
async def web_crawl_tool(
|
||||
@@ -1560,7 +1560,7 @@ async def web_crawl_tool(
|
||||
|
||||
from tools.interrupt import is_interrupted as _is_int
|
||||
if _is_int():
|
||||
return json.dumps({"error": "Interrupted", "success": False})
|
||||
return tool_error("Interrupted", success=False)
|
||||
|
||||
logger.info("Tavily crawl: %s", url)
|
||||
payload: Dict[str, Any] = {
|
||||
@@ -1671,7 +1671,7 @@ async def web_crawl_tool(
|
||||
|
||||
from tools.interrupt import is_interrupted as _is_int
|
||||
if _is_int():
|
||||
return json.dumps({"error": "Interrupted", "success": False})
|
||||
return tool_error("Interrupted", success=False)
|
||||
|
||||
try:
|
||||
crawl_result = _get_firecrawl_client().crawl(
|
||||
@@ -1897,7 +1897,7 @@ async def web_crawl_tool(
|
||||
_debug.log_call("web_crawl_tool", debug_call_data)
|
||||
_debug.save()
|
||||
|
||||
return json.dumps({"error": error_msg}, ensure_ascii=False)
|
||||
return tool_error(error_msg)
|
||||
|
||||
|
||||
# Convenience function to check Firecrawl credentials
|
||||
@@ -2043,7 +2043,7 @@ if __name__ == "__main__":
|
||||
# ---------------------------------------------------------------------------
|
||||
# Registry
|
||||
# ---------------------------------------------------------------------------
|
||||
from tools.registry import registry
|
||||
from tools.registry import registry, tool_error
|
||||
|
||||
WEB_SEARCH_SCHEMA = {
|
||||
"name": "web_search",
|
||||
|
||||
Reference in New Issue
Block a user