build_creation_demo.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #!/usr/bin/env python3
  2. """Build formal creation-query batches.
  3. Default mode only prints a summary. Use --export-json for a local review file
  4. or --persist to write query_batches/queries into the formal PostgreSQL store.
  5. """
  6. from __future__ import annotations
  7. import argparse
  8. import json
  9. from pathlib import Path
  10. import sys
  11. ROOT = Path(__file__).resolve().parents[1]
  12. if str(ROOT) not in sys.path:
  13. sys.path.insert(0, str(ROOT))
  14. from acquisition.queries.builder import (
  15. QueryBuildOptions,
  16. TREES,
  17. build_creation_query_batch,
  18. persist_query_batch,
  19. )
  20. from acquisition.repositories.postgres import PostgresAcquisitionRepository
  21. from core.config import CreationDbConfig, Settings
  22. from core.db_session import transaction
  23. def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
  24. parser = argparse.ArgumentParser(description=__doc__)
  25. parser.add_argument("--env-file", default=".env")
  26. parser.add_argument("--tree-path", type=Path)
  27. parser.add_argument("--per", type=int, default=30)
  28. parser.add_argument("--batch-n", type=int, default=30)
  29. parser.add_argument("--seed", type=int, default=7)
  30. parser.add_argument("--dry", action="store_true", help="Skip LLM query filtering")
  31. parser.add_argument(
  32. "--family",
  33. action="append",
  34. dest="families",
  35. help="Query family key to activate; repeat to enable multiple families",
  36. )
  37. parser.add_argument("--export-json", type=Path, help="Optional local review export")
  38. parser.add_argument("--persist", action="store_true", help="Persist to formal PG")
  39. parser.add_argument("--name", default="creation-demo")
  40. return parser.parse_args(argv)
  41. def _summary(generated: dict) -> dict:
  42. families = generated.get("families") or []
  43. total = sum(len(f.get("items") or []) for f in families)
  44. kept = sum(
  45. 1
  46. for family in families
  47. for item in family.get("items") or []
  48. if item.get("keep", True)
  49. )
  50. return {
  51. "family_count": len(families),
  52. "family_keys": [family.get("key") for family in families],
  53. "query_count": total,
  54. "kept_count": kept,
  55. "metadata": generated.get("metadata") or {},
  56. }
  57. def main(argv: list[str] | None = None) -> int:
  58. args = parse_args(argv)
  59. settings = Settings.from_env(args.env_file)
  60. generated = build_creation_query_batch(
  61. settings,
  62. tree_path=args.tree_path or TREES,
  63. options=QueryBuildOptions(
  64. per=args.per,
  65. batch_n=args.batch_n,
  66. seed=args.seed,
  67. dry=args.dry,
  68. active_family_keys=tuple(args.families) if args.families else ("f1", "f2"),
  69. ),
  70. )
  71. summary = _summary(generated)
  72. if args.export_json:
  73. args.export_json.parent.mkdir(parents=True, exist_ok=True)
  74. args.export_json.write_text(
  75. json.dumps(generated, ensure_ascii=False, indent=1),
  76. encoding="utf-8",
  77. )
  78. summary["export_json"] = str(args.export_json)
  79. if args.persist:
  80. db_config = CreationDbConfig.from_env(args.env_file)
  81. with transaction(db_config) as conn:
  82. repo = PostgresAcquisitionRepository(conn)
  83. batch, count = persist_query_batch(
  84. repo,
  85. generated,
  86. name=args.name,
  87. )
  88. summary["batch_id"] = str(batch.id)
  89. summary["persisted_queries"] = count
  90. print(json.dumps(summary, ensure_ascii=False, indent=2))
  91. return 0
  92. if __name__ == "__main__":
  93. raise SystemExit(main())