"""CLI entrypoint for the v10 broadened TS reasoner.""" from __future__ import annotations import argparse import json from pathlib import Path from ts_bridge.reasoner_v10 import solve_trace from ts_bridge.reasoner_v10.server import serve ROOT = Path(__file__).resolve().parent EXAMPLES = ROOT / "examples" / "v10_examples.json" CATEGORIES = ["arithmetic", "transitivity", "code_reasoning", "boolean_logic", "set_reasoning", "string_reasoning"] def print_trace(trace: dict) -> None: print(trace["display_answer"]) print(f"rule : {trace['rule']}") print(f"confidence : {trace['confidence']:.2f} ({trace['confidence_band']})") print(f"category : {trace['detected_category']}") if trace["boundary_reason"]: print(f"boundary : {trace['boundary_reason']}") if trace["rationale"]: print(f"rationale : {trace['rationale']}") def main() -> None: ap = argparse.ArgumentParser(prog="ts_reasoner_v10") sub = ap.add_subparsers(dest="cmd", required=True) solve_ap = sub.add_parser("solve") solve_ap.add_argument("--prompt", required=True) solve_ap.add_argument("--category", default=None, choices=CATEGORIES) solve_ap.add_argument("--json", action="store_true") serve_ap = sub.add_parser("serve") serve_ap.add_argument("--host", default="127.0.0.1") serve_ap.add_argument("--port", type=int, default=7860) examples_ap = sub.add_parser("examples") examples_ap.add_argument("--json", action="store_true") args = ap.parse_args() if args.cmd == "solve": trace = solve_trace(args.prompt, args.category).to_dict() print(json.dumps(trace, indent=2) if args.json else "") if not args.json: print_trace(trace) elif args.cmd == "serve": serve(args.host, args.port) elif args.cmd == "examples": payload = json.loads(EXAMPLES.read_text()) if args.json: print(json.dumps(payload, indent=2)) else: for row in payload: print(f"{row['id']:28s} {row['category']:16s} {row['expected_display_answer']:12s} {row['prompt']}") if __name__ == "__main__": main()