LaelaZ's picture
Deploy SupportCopilot to HF Spaces (Docker)
8981bf6 verified
"""Command-line entry points: ask a single question or print the ROI report.
python -m supportcopilot.cli ask "what is your return policy?"
python -m supportcopilot.cli ask "return my tent" --order NW-1001
python -m supportcopilot.cli roi
"""
from __future__ import annotations
import argparse
import json
import sys
from .agent import SupportAgent
from .metrics import compute_roi
def _cmd_ask(args: argparse.Namespace) -> int:
agent = SupportAgent()
resp = agent.handle(args.message, order_id=args.order, email=args.email)
if args.json:
print(json.dumps(resp.to_dict(), indent=2))
return 0
status = "ESCALATED" if resp.escalated else "AUTO-RESOLVED"
print(f"[{status}] intent={resp.intent} confidence={resp.confidence:.2f}\n")
print(resp.answer)
if resp.refund:
print(f"\nRefund decision: {resp.refund.outcome.upper()} "
f"(${resp.refund.refund_amount:.2f}) — per {resp.refund.policy_citation}")
if resp.citations:
print("\nSources:")
for c in resp.citations:
print(f" - [{c.kind}] {c.title}")
return 0
def _cmd_roi(args: argparse.Namespace) -> int:
report = compute_roi()
if args.json:
print(json.dumps(report.as_summary(), indent=2))
return 0
s = report
print("=== SupportCopilot ROI (replayed on seeded tickets) ===")
print(f"Tickets handled: {s.total_tickets}")
print(f"Auto-resolved: {s.auto_resolved} ({s.deflection_rate * 100:.0f}% deflection)")
print(f"Escalated to human: {s.escalated} ({s.escalation_rate * 100:.0f}%)")
print(f"Agent time saved: {s.handle_time_saved_hours:.2f} h "
f"({s.baseline_handle_time_min:.0f} min/ticket baseline)")
print(f"Cost saved (sample): ${s.cost_saved:,.2f}")
print(f"Projected monthly: ${s.monthly_cost_saved_projection:,.0f} "
f"(@3000 tickets/mo, ${s.agent_cost_per_hour:.0f}/agent-hr)")
return 0
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(prog="supportcopilot", description="SupportCopilot CLI")
sub = parser.add_subparsers(dest="cmd", required=True)
p_ask = sub.add_parser("ask", help="Ask the support copilot a question")
p_ask.add_argument("message")
p_ask.add_argument("--order", default=None, help="Order id, e.g. NW-1001")
p_ask.add_argument("--email", default=None, help="Customer email for verification")
p_ask.add_argument("--json", action="store_true", help="Emit JSON")
p_ask.set_defaults(func=_cmd_ask)
p_roi = sub.add_parser("roi", help="Print the ROI report")
p_roi.add_argument("--json", action="store_true", help="Emit JSON")
p_roi.set_defaults(func=_cmd_roi)
args = parser.parse_args(argv)
return args.func(args)
if __name__ == "__main__":
sys.exit(main())