File size: 2,484 Bytes
d734fe6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/env python3
"""
crawlier-image-studio CLI - quick command-line access to the image API.
Usage:
  export CRAWLIER_API_URL=https://984183868db966.lhr.life
  python cli.py "a serene mountain lake" --size 1024
  python cli.py pricing
  python cli.py health
"""
import argparse, json, sys, os, urllib.request, urllib.error

DEFAULT_URL = os.environ.get("CRAWLIER_API_URL", "https://984183868db966.lhr.life")

def cmd_generate(args):
    url = f"{args.url.rstrip('/')}/v1/generate"
    body = {"prompt": args.prompt, "model": args.model, "size": args.size, "n": args.n}
    req = urllib.request.Request(
        url, data=json.dumps(body).encode(),
        headers={"Content-Type": "application/json"}, method="POST")
    try:
        with urllib.request.urlopen(req, timeout=60) as r:
            data = json.loads(r.read())
    except urllib.error.HTTPError as e:
        print(f"ERROR {e.code}: {e.read().decode()}", file=sys.stderr)
        return 2
    if args.json:
        print(json.dumps(data, indent=2))
    else:
        for img in data.get("images", []):
            print(img.get("url", img))
        b = data.get("billing", {})
        if b:
            print(f"# cost=${b.get('cost_usd')} price=${b.get('price_usd')} elapsed_ms={data.get('elapsed_ms')}", file=sys.stderr)
    return 0

def cmd_pricing(args):
    with urllib.request.urlopen(f"{args.url.rstrip('/')}/v1/pricing", timeout=10) as r:
        print(r.read().decode())
    return 0

def cmd_health(args):
    with urllib.request.urlopen(f"{args.url.rstrip('/')}/healthz", timeout=10) as r:
        print(r.read().decode())
    return 0

def main():
    p = argparse.ArgumentParser(description="Crawlier Image Studio CLI")
    p.add_argument("--url", default=DEFAULT_URL, help="API base URL")
    sub = p.add_subparsers(dest="cmd", required=True)

    g = sub.add_parser("generate", aliases=["g","gen"])
    g.add_argument("prompt")
    g.add_argument("--model", default="image-01", choices=["image-01","image-02"])
    g.add_argument("--size", default="1024", choices=["512","1024","2048"])
    g.add_argument("-n", type=int, default=1)
    g.add_argument("--json", action="store_true")
    g.set_defaults(func=cmd_generate)

    pr = sub.add_parser("pricing", aliases=["p","price"])
    pr.set_defaults(func=cmd_pricing)

    h = sub.add_parser("health", aliases=["h"])
    h.set_defaults(func=cmd_health)

    args = p.parse_args()
    sys.exit(args.func(args))

if __name__ == "__main__":
    main()