resource.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """
  2. 资源查询工具 - KnowHub 工具表 API 封装
  3. """
  4. import os
  5. import httpx
  6. from typing import List, Dict, Optional, Any
  7. from agent.tools import tool, ToolResult
  8. KNOWHUB_API = os.getenv("KNOWHUB_API", "http://43.106.118.91:9999").rstrip("/")
  9. @tool(
  10. description="列出知识库中的所有工具资源"
  11. )
  12. def resource_list_tools(
  13. category: Optional[str] = None,
  14. ) -> ToolResult:
  15. """列出所有工具资源,可选按分类过滤
  16. Args:
  17. category: 可选的分类过滤,如 "plugin", "model" 等
  18. """
  19. try:
  20. resp = httpx.get(f"{KNOWHUB_API}/api/resource", params={"limit": 1000}, timeout=60.0)
  21. resp.raise_for_status()
  22. data = resp.json()
  23. # 处理返回格式
  24. if isinstance(data, dict):
  25. data = data.get("results") or data.get("data") or []
  26. # 过滤工具
  27. tools = [r for r in data if isinstance(r, dict) and r.get("id", "").startswith("tools/")]
  28. # 按分类过滤
  29. if category:
  30. tools = [t for t in tools if t.get("metadata", {}).get("category") == category]
  31. result = {
  32. "total": len(tools),
  33. "tools": [{"id": t["id"], "title": t.get("title", ""), "category": t.get("metadata", {}).get("category")} for t in tools]
  34. }
  35. return ToolResult(title="工具列表", output=str(result))
  36. except Exception as e:
  37. return ToolResult(title="查询失败", output="", error=str(e))
  38. @tool(
  39. description="获取指定工具的详细信息",
  40. )
  41. def resource_get_tool(tool_id: str) -> ToolResult:
  42. """获取工具详情
  43. Args:
  44. tool_id: 工具ID,如 "tools/image_gen/comfyui"
  45. """
  46. try:
  47. resp = httpx.get(f"{KNOWHUB_API}/api/resource/{tool_id}", timeout=10.0)
  48. resp.raise_for_status()
  49. return ToolResult(title=f"工具详情: {tool_id}", output=str(resp.json()))
  50. except Exception as e:
  51. return ToolResult(title="获取工具详情失败", output="", error=str(e))