import argparse import json import time import urllib.error import urllib.request def request_json(url: str, method: str = "GET", payload: dict | None = None) -> dict: body = None headers = {} if payload is not None: body = json.dumps(payload).encode("utf-8") headers["Content-Type"] = "application/json" request = urllib.request.Request(url, data=body, headers=headers, method=method) try: with urllib.request.urlopen(request, timeout=30) as response: return json.loads(response.read().decode("utf-8")) except urllib.error.HTTPError as exc: detail = exc.read().decode("utf-8") raise RuntimeError(f"{exc.code}: {detail}") from exc def main() -> None: parser = argparse.ArgumentParser(description="Run an AI Clip Studio API benchmark.") parser.add_argument("--api", default="http://localhost:8000") parser.add_argument("--youtube-url", required=True) parser.add_argument("--language", default="Thai") parser.add_argument("--style", default="informative") parser.add_argument("--niche", default="education") parser.add_argument("--clip-length", type=int, default=60) args = parser.parse_args() payload = { "youtube_url": args.youtube_url, "profile": { "niche": args.niche, "clip_style": args.style, "clip_length_seconds": args.clip_length, "primary_language": args.language, "target_platform": "tiktok", }, } started = time.perf_counter() job = request_json(f"{args.api}/api/jobs/youtube", "POST", payload) while job["status"] in {"queued", "running"}: time.sleep(2) job = request_json(f"{args.api}/api/jobs/{job['id']}") elapsed = round(time.perf_counter() - started, 3) print( json.dumps( { "job_id": job["id"], "status": job["status"], "elapsed_wall_seconds": elapsed, "clips": len(job.get("clips", [])), "timings": job.get("timings", {}), "error": job.get("error"), }, indent=2, ) ) if __name__ == "__main__": main()