Files
reader/scripts/build_openclaw_delivery.py
T

85 lines
3.1 KiB
Python

from __future__ import annotations
import argparse
import json
import sys
from datetime import date
from pathlib import Path
from typing import Any
REPO_ROOT = Path(__file__).resolve().parents[1]
SRC_ROOT = REPO_ROOT / "src"
OUTPUT_ROOT = REPO_ROOT / "outputs"
REFERENCE_OUTPUT_ROOT = OUTPUT_ROOT / "reference"
if str(SRC_ROOT) not in sys.path:
sys.path.insert(0, str(SRC_ROOT))
from summary_mcp.models import OpenClawCandidateInput, build_openclaw_delivery_payload
def _load_json(path: Path) -> dict[str, Any]:
return json.loads(path.read_text(encoding="utf-8-sig"))
def _save_json(path: Path, payload: dict[str, Any]) -> None:
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
def _collect_input_paths(inputs: list[Path], input_dir: Path | None, pattern: str) -> list[Path]:
resolved = list(inputs)
if input_dir is not None:
resolved.extend(sorted(input_dir.glob(pattern)))
seen: set[Path] = set()
unique_paths: list[Path] = []
for path in resolved:
normalized = path.resolve()
if normalized in seen:
continue
seen.add(normalized)
unique_paths.append(path)
return unique_paths
def main() -> None:
parser = argparse.ArgumentParser(description="Build an OpenClaw batch delivery payload from slim candidate JSON files.")
parser.add_argument("--inputs", nargs="*", type=Path, default=[], help="One or more OpenClaw candidate input JSON files")
parser.add_argument("--input-dir", type=Path, default=None, help="Directory containing OpenClaw candidate input JSON files")
parser.add_argument(
"--pattern",
type=str,
default="*.openclaw-candidate-input.json",
help="Glob pattern used together with --input-dir",
)
parser.add_argument("--run-id", type=str, default=None, help="Optional delivery run id")
parser.add_argument("--date", type=str, default=None, help="Optional delivery date in YYYY-MM-DD format")
parser.add_argument("--sort-by-rank", action="store_true", help="Sort candidates by digest_rank descending")
parser.add_argument(
"--output",
type=Path,
default=REFERENCE_OUTPUT_ROOT / "candidates" / "openclaw-delivery-payload.json",
help="Where to save the OpenClaw delivery payload",
)
args = parser.parse_args()
input_paths = _collect_input_paths(args.inputs, args.input_dir, args.pattern)
if not input_paths:
raise SystemExit("No candidate input files found. Pass --inputs or --input-dir.")
candidates = [OpenClawCandidateInput.model_validate(_load_json(path)) for path in input_paths]
if args.sort_by_rank:
candidates.sort(key=lambda candidate: candidate.digest_rank, reverse=True)
payload = build_openclaw_delivery_payload(
candidates,
run_id=args.run_id,
for_date=date.fromisoformat(args.date) if args.date else None,
)
_save_json(args.output, payload.model_dump(mode="json"))
print(f"Saved OpenClaw delivery payload with {len(candidates)} candidates to {args.output}")
if __name__ == "__main__":
main()