"""Command line: llm-api serve | scan | create-admin | create-key | status.""" from __future__ import annotations import argparse import asyncio import json import sys def main(argv: list[str] | None = None) -> None: ap = argparse.ArgumentParser(prog="llm-api") sub = ap.add_subparsers(dest="cmd", required=True) s = sub.add_parser("serve", help="run the API server") s.add_argument("--host") s.add_argument("--port", type=int) s.add_argument("--reload", action="store_true") sub.add_parser("scan", help="scan the model directory and print the registry") a = sub.add_parser("create-admin", help="create the admin user") a.add_argument("email") a.add_argument("password") k = sub.add_parser("create-key", help="create an API key") k.add_argument("name") k.add_argument("--admin", action="store_true") sub.add_parser("status", help="print hardware and registry summary") args = ap.parse_args(argv) from .config import get_settings settings = get_settings() if args.cmd == "serve": import uvicorn uvicorn.run("llm_api.main:app", host=args.host or settings.host, port=args.port or settings.port, reload=args.reload, log_level="info", access_log=False, timeout_keep_alive=75) return async def _run(): from .auth import Auth from .db import Database from .models.registry import Registry settings.ensure_dirs() db = Database(settings.db_path) await db.connect() try: if args.cmd == "scan": reg = Registry(db, settings) print(json.dumps(await reg.rescan(), indent=2)) for m in await reg.list_models(): print(f"{m['id']:50s} {m['runtime']:8s} {m['quantization'] or '':10s} " f"{(m['estimated_ram_gb'] or 0):6.1f} GB ctx {m['recommended_context']} {m['compatibility_status']}") elif args.cmd == "create-admin": auth = Auth(db, settings) uid = await auth.create_user(args.email, args.password) print(f"admin user #{uid} created") elif args.cmd == "create-key": auth = Auth(db, settings) raw, row = await auth.create_key(args.name, ["inference", "admin"] if args.admin else ["inference"]) print(raw) elif args.cmd == "status": from .hardware import detect_hardware, sample_telemetry print(json.dumps(detect_hardware(settings.models_dir).to_dict(), indent=2)) print(json.dumps(sample_telemetry(settings.models_dir).to_dict(), indent=2)) n = await db.scalar("SELECT COUNT(*) FROM models WHERE installed=1") print(f"installed models: {n}") finally: await db.close() asyncio.run(_run()) if __name__ == "__main__": main(sys.argv[1:])