#!/usr/bin/env python3 """ E2E: 演示 Agent「演示-主链路委派invoke」执行成功,并校验父子执行链。 前置: - 已运行 create_router_invoke_demo_agent.py - 平台 API 可访问 用法: cd backend && .\\venv\\Scripts\\python.exe scripts/e2e_router_invoke_demo.py """ from __future__ import annotations import os import sys import time from typing import Any, Dict, Optional import requests BASE = os.getenv("PLATFORM_BASE_URL", "http://127.0.0.1:8037").rstrip("/") USER = os.getenv("PLATFORM_USERNAME", "admin") PWD = os.getenv("PLATFORM_PASSWORD", "123456") DEMO_AGENT_NAME = os.getenv("DEMO_AGENT_NAME", "演示-主链路委派invoke") def _login_headers() -> Dict[str, str]: r = requests.post( f"{BASE}/api/v1/auth/login", data={"username": USER, "password": PWD}, headers={"Content-Type": "application/x-www-form-urlencoded"}, timeout=15, ) r.raise_for_status() token = r.json().get("access_token") if not token: raise RuntimeError("无 access_token") return {"Authorization": f"Bearer {token}", "Content-Type": "application/json"} def _find_demo_id(h: Dict[str, str]) -> Optional[str]: r = requests.get( f"{BASE}/api/v1/agents", params={"search": DEMO_AGENT_NAME, "limit": 50}, headers=h, timeout=30 ) r.raise_for_status() for a in r.json() or []: if a.get("name") == DEMO_AGENT_NAME: return a.get("id") return None def _wait_done(h: Dict[str, str], eid: str, timeout_s: float = 180.0) -> Dict[str, Any]: t0 = time.time() while time.time() - t0 < timeout_s: r = requests.get(f"{BASE}/api/v1/executions/{eid}", headers=h, timeout=30) r.raise_for_status() d = r.json() st = d.get("status") if st in ("completed", "failed"): return d time.sleep(1.2) raise TimeoutError(eid) def main() -> int: h = _login_headers() aid = _find_demo_id(h) if not aid: print(f"未找到 Agent: {DEMO_AGENT_NAME},请先运行 create_router_invoke_demo_agent.py", file=sys.stderr) return 1 body = { "agent_id": aid, "input_data": {"query": "E2E 委派演示:请简短回复收到。", "user_id": "e2e_router_user"}, } cr = requests.post(f"{BASE}/api/v1/executions", headers=h, json=body, timeout=30) if cr.status_code >= 400: print(cr.status_code, cr.text[:1200], file=sys.stderr) return 2 eid = cr.json()["id"] print(f"execution={eid}") done = _wait_done(h, eid) if done.get("status") != "completed": print("failed:", done.get("error_message"), file=sys.stderr) return 3 sm = requests.get( f"{BASE}/api/v1/execution-logs/executions/{eid}/chain/summary", headers=h, timeout=30 ) if sm.status_code == 200: s = sm.json() print( "chain_summary:", s.get("total_executions"), s.get("status_count"), s.get("total_execution_time_ms"), ) if (s.get("total_executions") or 0) < 2: print("警告: 期望至少 2 条执行记录(父+子),请确认 API 已重启到最新代码", file=sys.stderr) elif sm.status_code == 404: print("chain/summary 404:当前 API 进程可能未加载最新路由,跳过汇总校验") else: print("chain/summary", sm.status_code, sm.text[:300]) print("E2E 通过") return 0 if __name__ == "__main__": raise SystemExit(main())