"""CLI: python -m deep_research --backend {codex|antigravity} "<질문>" [--json]""" import argparse import asyncio import shutil import sys from deep_research.config import DEFAULT from deep_research.pipeline import run_research from deep_research.report import to_markdown, to_json def _make_backend(name: str): if name == "codex": if shutil.which("codex") is None: sys.exit("error: `codex` CLI not found on PATH. Install + login (subscription).") from deep_research.backends.codex import CodexBackend return CodexBackend() if name == "antigravity": if shutil.which("agy") is None: sys.exit("error: `agy` CLI not found on PATH. Install + login (subscription).") from deep_research.backends.antigravity import AntigravityBackend return AntigravityBackend(retries=DEFAULT.ANTIGRAVITY_RETRIES) sys.exit(f"error: unknown backend '{name}'") def main(argv=None): ap = argparse.ArgumentParser(prog="deep-research") ap.add_argument("question") ap.add_argument("--backend", required=True, choices=["codex", "antigravity"]) ap.add_argument("--json", action="store_true", help="emit raw JSON instead of markdown") ap.add_argument("--concurrency", type=int, default=DEFAULT.CONCURRENCY) args = ap.parse_args(argv) if args.concurrency < 1: sys.exit("error: --concurrency must be >= 1") backend = _make_backend(args.backend) cfg = DEFAULT.__class__(CONCURRENCY=args.concurrency) result = asyncio.run(run_research(args.question, backend, config=cfg)) print(to_json(result) if args.json else to_markdown(result)) if __name__ == "__main__": main()