|
@@ -0,0 +1,153 @@
|
|
|
|
|
+"""测试 ji_meng 任务工具 — 通过 Router API 调用(范本同 test_liblibai_tool.py)
|
|
|
|
|
+
|
|
|
|
|
+用法:
|
|
|
|
|
+ 1. 先启动 Router:uv run python -m tool_agent
|
|
|
|
|
+ 2. 运行测试:python tests/test_jimeng.py
|
|
|
|
|
+
|
|
|
|
|
+需已注册 ji_meng_add_task、ji_meng_query_task(或改下方常量);搜索关键词默认可匹配二者。
|
|
|
|
|
+"""
|
|
|
|
|
+
|
|
|
|
|
+import sys
|
|
|
|
|
+import time
|
|
|
|
|
+
|
|
|
|
|
+if sys.platform == 'win32':
|
|
|
|
|
+ sys.stdout.reconfigure(encoding='utf-8')
|
|
|
|
|
+
|
|
|
|
|
+import httpx
|
|
|
|
|
+
|
|
|
|
|
+ROUTER_URL = "http://127.0.0.1:8001"
|
|
|
|
|
+POLL_INTERVAL_S = 2
|
|
|
|
|
+POLL_MAX_WAIT_S = 300
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _extract_task_id(data: dict):
|
|
|
|
|
+ for key in ("task_id", "taskId", "id", "job_id", "jobId"):
|
|
|
|
|
+ v = data.get(key)
|
|
|
|
|
+ if v is not None and str(v).strip():
|
|
|
|
|
+ return str(v).strip()
|
|
|
|
|
+ inner = data.get("data")
|
|
|
|
|
+ if isinstance(inner, dict):
|
|
|
|
|
+ return _extract_task_id(inner)
|
|
|
|
|
+ return None
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _terminal_success(data: dict) -> bool:
|
|
|
|
|
+ status = (
|
|
|
|
|
+ data.get("status")
|
|
|
|
|
+ or data.get("task_status")
|
|
|
|
|
+ or data.get("taskStatus")
|
|
|
|
|
+ or data.get("state")
|
|
|
|
|
+ )
|
|
|
|
|
+ if status is None and isinstance(data.get("data"), dict):
|
|
|
|
|
+ status = data["data"].get("status") or data["data"].get("task_status")
|
|
|
|
|
+ if status is None:
|
|
|
|
|
+ return False
|
|
|
|
|
+ s = str(status).lower()
|
|
|
|
|
+ return s in ("completed", "success", "done", "finished", "succeed", "complete")
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _terminal_failure(data: dict) -> bool:
|
|
|
|
|
+ status = data.get("status") or data.get("task_status") or data.get("state")
|
|
|
|
|
+ if status is None and isinstance(data.get("data"), dict):
|
|
|
|
|
+ status = data["data"].get("status")
|
|
|
|
|
+ if status is None:
|
|
|
|
|
+ return False
|
|
|
|
|
+ s = str(status).lower()
|
|
|
|
|
+ return s in ("failed", "error", "cancelled", "canceled")
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def main():
|
|
|
|
|
+ print("=" * 50)
|
|
|
|
|
+ print("测试 ji_meng 任务工具")
|
|
|
|
|
+ print("=" * 50)
|
|
|
|
|
+
|
|
|
|
|
+ # 1. 检查 Router 是否在线
|
|
|
|
|
+ try:
|
|
|
|
|
+ resp = httpx.get(f"{ROUTER_URL}/health", timeout=3)
|
|
|
|
|
+ print(f"Router 状态: {resp.json()}")
|
|
|
|
|
+ except httpx.ConnectError:
|
|
|
|
|
+ print(f"无法连接 Router ({ROUTER_URL})")
|
|
|
|
|
+ print("请先启动: uv run python -m tool_agent")
|
|
|
|
|
+ sys.exit(1)
|
|
|
|
|
+
|
|
|
|
|
+ # 2. 搜索工具,确认已注册
|
|
|
|
|
+ print("\n--- 搜索工具 ---")
|
|
|
|
|
+ resp = httpx.post(f"{ROUTER_URL}/search_tools", json={"keyword": "ji_meng"})
|
|
|
|
|
+ tools = resp.json()
|
|
|
|
|
+ print(f"找到 {tools['total']} 个工具")
|
|
|
|
|
+ for t in tools["tools"]:
|
|
|
|
|
+ print(f" {t['tool_id']}: {t['name']} (state={t['state']})")
|
|
|
|
|
+
|
|
|
|
|
+ # 3. 创建 ji_meng_add_task 工具
|
|
|
|
|
+ print("\n--- 调用 ji_meng_add_task 工具创建任务 ---")
|
|
|
|
|
+ print(f"提示词: simple white line art, cat, black background")
|
|
|
|
|
+ print("提交中...")
|
|
|
|
|
+
|
|
|
|
|
+ resp = httpx.post(
|
|
|
|
|
+ f"{ROUTER_URL}/select_tool",
|
|
|
|
|
+ json={
|
|
|
|
|
+ "tool_id": "ji_meng_add_task",
|
|
|
|
|
+ "params": {
|
|
|
|
|
+ "task_type": "image",
|
|
|
|
|
+ "prompt": "simple white line art, cat, black background",
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ timeout=120,
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ result = resp.json()
|
|
|
|
|
+ print(f"\n响应状态: {result.get('status')}")
|
|
|
|
|
+
|
|
|
|
|
+ if result.get("code") != 0:
|
|
|
|
|
+ print(f"错误: {result.get('msg')}")
|
|
|
|
|
+ sys.exit(1)
|
|
|
|
|
+
|
|
|
|
|
+ task_id = result.get("data", {}).get("task_id")
|
|
|
|
|
+ if not task_id:
|
|
|
|
|
+ print("错误: 无法从创建任务响应中解析 task_id")
|
|
|
|
|
+ sys.exit(1)
|
|
|
|
|
+ print(f"任务 ID: {task_id}")
|
|
|
|
|
+
|
|
|
|
|
+ # 4. 轮询查询任务
|
|
|
|
|
+ print("\n--- 调用 ji_meng_query_task 工具查询任务 ---")
|
|
|
|
|
+ deadline = time.monotonic() + POLL_MAX_WAIT_S
|
|
|
|
|
+ last = {}
|
|
|
|
|
+
|
|
|
|
|
+ while time.monotonic() < deadline:
|
|
|
|
|
+ resp = httpx.post(
|
|
|
|
|
+ f"{ROUTER_URL}/select_tool",
|
|
|
|
|
+ json={
|
|
|
|
|
+ "tool_id": "ji_meng_query_task",
|
|
|
|
|
+ "params": {"task_id": task_id},
|
|
|
|
|
+ },
|
|
|
|
|
+ timeout=60,
|
|
|
|
|
+ )
|
|
|
|
|
+ result = resp.json()
|
|
|
|
|
+ print(f"\n响应状态: {result.get('status')}")
|
|
|
|
|
+
|
|
|
|
|
+ if result.get("status") != "success":
|
|
|
|
|
+ print(f"错误: {result.get('error')}")
|
|
|
|
|
+ sys.exit(1)
|
|
|
|
|
+
|
|
|
|
|
+ last = result.get("result", {})
|
|
|
|
|
+ if not isinstance(last, dict):
|
|
|
|
|
+ print(f"非 dict 结果: {last}")
|
|
|
|
|
+ time.sleep(POLL_INTERVAL_S)
|
|
|
|
|
+ continue
|
|
|
|
|
+ if last.get("status") == "error":
|
|
|
|
|
+ print(f"错误: {last.get('error')}")
|
|
|
|
|
+ sys.exit(1)
|
|
|
|
|
+
|
|
|
|
|
+ print(f"任务状态: {last.get('status')}")
|
|
|
|
|
+ print(f"最终结果: {last}")
|
|
|
|
|
+ print("\n测试通过!")
|
|
|
|
|
+ return
|
|
|
|
|
+
|
|
|
|
|
+ time.sleep(POLL_INTERVAL_S)
|
|
|
|
|
+
|
|
|
|
|
+ print(f"\n等待超时 ({POLL_MAX_WAIT_S}s),最后一次响应: {last}")
|
|
|
|
|
+ sys.exit(1)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+if __name__ == "__main__":
|
|
|
|
|
+ main()
|