| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- """测试 KnowHub 工具表查询功能"""
- import httpx
- import os
- from typing import Any
- # KnowHub API 地址
- KNOWHUB_API = os.getenv("KNOWHUB_API", "http://43.106.118.91:9999")
- def test_list_all_resources():
- """测试:列出所有资源"""
- print("\n=== 测试:列出所有资源 ===")
- try:
- resp = httpx.get(f"{KNOWHUB_API}/api/resource", params={"limit": 1000}, timeout=60.0)
- resp.raise_for_status()
- data = resp.json()
- print(f"状态码: {resp.status_code}")
- print(f"返回数据类型: {type(data)}")
- # 检查返回格式
- if isinstance(data, dict):
- print(f"返回字典的键: {data.keys()}")
- # API 返回格式: {"results": [...], "count": N}
- if "results" in data:
- data = data["results"]
- elif "data" in data:
- data = data["data"]
- if not isinstance(data, list):
- print(f"⚠️ 返回数据不是列表")
- return []
- print(f"总资源数: {len(data)}")
- # 过滤出工具
- tools = [r for r in data if isinstance(r, dict) and r.get("id", "").startswith("tools/")]
- print(f"工具数量: {len(tools)}")
- if tools:
- print("\n前 3 个工具:")
- for tool in tools[:3]:
- print(f" - {tool['id']}: {tool.get('title', 'N/A')}")
- return tools
- except Exception as e:
- print(f"❌ 错误: {e}")
- import traceback
- traceback.print_exc()
- return []
- def test_get_tool_detail(tool_id: str):
- """测试:获取工具详情"""
- print(f"\n=== 测试:获取工具详情 ({tool_id}) ===")
- try:
- resp = httpx.get(f"{KNOWHUB_API}/api/resource/{tool_id}", timeout=10.0)
- resp.raise_for_status()
- tool = resp.json()
- print(f"状态码: {resp.status_code}")
- print(f"ID: {tool['id']}")
- print(f"标题: {tool.get('title', 'N/A')}")
- metadata = tool.get("metadata", {})
- print(f"\nMetadata:")
- for key, value in metadata.items():
- # 长列表截断显示
- if isinstance(value, list) and len(value) > 3:
- print(f" - {key}: [{len(value)} items] {value[:3]}...")
- else:
- print(f" - {key}: {value}")
- return tool
- except Exception as e:
- print(f"❌ 错误: {e}")
- return None
- def test_search_tools_by_category(category: str):
- """测试:按分类搜索工具"""
- print(f"\n=== 测试:按分类搜索工具 (category={category}) ===")
- try:
- resp = httpx.get(f"{KNOWHUB_API}/api/resource", params={"limit": 1000}, timeout=60.0)
- resp.raise_for_status()
- data = resp.json()
- # 检查返回格式
- if isinstance(data, dict):
- # API 返回格式: {"results": [...], "count": N}
- if "results" in data:
- data = data["results"]
- elif "data" in data:
- data = data["data"]
- if not isinstance(data, list):
- print(f"⚠️ 返回数据不是列表")
- return []
- # 客户端过滤
- tools = [
- r for r in data
- if isinstance(r, dict) and r.get("id", "").startswith("tools/")
- and r.get("metadata", {}).get("category") == category
- ]
- print(f"找到 {len(tools)} 个 {category} 类工具:")
- for tool in tools[:5]:
- print(f" - {tool['id']}: {tool.get('title', 'N/A')}")
- return tools
- except Exception as e:
- print(f"❌ 错误: {e}")
- import traceback
- traceback.print_exc()
- return []
- def test_search_knowledge_by_tool(query: str, top_k: int = 5):
- """测试:搜索工具相关知识"""
- print(f"\n=== 测试:搜索工具相关知识 (query={query}) ===")
- try:
- resp = httpx.get(
- f"{KNOWHUB_API}/api/knowledge/search",
- params={"q": query, "top_k": top_k, "min_score": 3},
- timeout=60.0
- )
- resp.raise_for_status()
- results = resp.json()
- print(f"状态码: {resp.status_code}")
- print(f"返回数据类型: {type(results)}")
- # 检查返回格式
- if isinstance(results, dict):
- print(f"返回字典的键: {results.keys()}")
- if "results" in results:
- results = results["results"]
- elif "data" in results:
- results = results["data"]
- if not isinstance(results, list):
- print(f"⚠️ 返回数据不是列表")
- return []
- print(f"找到 {len(results)} 条知识:")
- for i, item in enumerate(results[:3], 1):
- if isinstance(item, dict):
- print(f"\n {i}. {item.get('id', 'N/A')}")
- title = item.get('title', 'N/A')
- print(f" 标题: {title[:50] if isinstance(title, str) else title}")
- print(f" 分数: {item.get('score', 0):.2f}")
- print(f" 关联工具: {item.get('resource_ids', [])}")
- return results
- except Exception as e:
- print(f"❌ 错误: {e}")
- import traceback
- traceback.print_exc()
- return []
- def test_list_tool_knowledge(tags: str = "tool"):
- """测试:列出所有工具相关知识"""
- print(f"\n=== 测试:列出所有工具相关知识 (tags={tags}) ===")
- try:
- resp = httpx.get(
- f"{KNOWHUB_API}/api/knowledge",
- params={"tags": tags, "status": "approved,checked", "page_size": 200},
- timeout=60.0
- )
- resp.raise_for_status()
- results = resp.json()
- print(f"状态码: {resp.status_code}")
- print(f"返回数据类型: {type(results)}")
- # 检查返回格式
- if isinstance(results, dict):
- print(f"返回字典的键: {results.keys()}")
- if "results" in results:
- results = results["results"]
- elif "data" in results:
- results = results["data"]
- elif "items" in results:
- results = results["items"]
- if not isinstance(results, list):
- print(f"⚠️ 返回数据不是列表")
- return []
- print(f"找到 {len(results)} 条工具知识")
- if results:
- print("\n前 3 条:")
- for item in results[:3]:
- if isinstance(item, dict):
- title = item.get('title', 'N/A')
- print(f" - {item.get('id', 'N/A')}: {title[:40] if isinstance(title, str) else title}")
- print(f" 关联工具: {item.get('resource_ids', [])}")
- return results
- except Exception as e:
- print(f"❌ 错误: {e}")
- import traceback
- traceback.print_exc()
- return []
- def main():
- """运行所有测试"""
- print(f"KnowHub API: {KNOWHUB_API}")
- print("=" * 60)
- # 1. 列出所有资源
- tools = test_list_all_resources()
- # 2. 获取 ComfyUI 工具详情(验证 toolhub_items)
- test_get_tool_detail("tools/image_gen/comfyui")
- # 3. 获取第一个工具的详情
- if tools:
- first_tool_id = tools[0]["id"]
- if first_tool_id != "tools/image_gen/comfyui":
- test_get_tool_detail(first_tool_id)
- # 3. 按分类搜索
- test_search_tools_by_category("plugin")
- # 4. 搜索工具相关知识
- test_search_knowledge_by_tool("IP-Adapter")
- # 5. 列出所有工具知识
- test_list_tool_knowledge()
- print("\n" + "=" * 60)
- print("测试完成!")
- if __name__ == "__main__":
- main()
|