Spaces:
Running
Running
| """Agent 4 — Booking Agent (writes to data/bookings.json)""" | |
| import json, uuid, os | |
| from datetime import datetime, timedelta | |
| from pathlib import Path | |
| BOOKINGS_FILE = Path(__file__).parent.parent / "data" / "bookings.json" | |
| TIME_SLOT_MAP = { | |
| "morning": ["09:00", "10:00", "11:00"], | |
| "afternoon": ["13:00", "14:00", "15:00"], | |
| "evening": ["17:00", "18:00", "19:00"], | |
| "asap": ["09:00", "10:00", "11:00", "13:00", "14:00"], | |
| } | |
| def pick_slot(provider: dict, requested_time: str) -> str: | |
| available = provider.get("available_slots", []) | |
| rt = (requested_time or "").lower() | |
| for key, slots in TIME_SLOT_MAP.items(): | |
| if key in rt: | |
| for s in slots: | |
| if s in available: | |
| return s | |
| return available[0] if available else "10:00" | |
| def run(recommendation: dict, intent: dict) -> dict: | |
| provider = recommendation.get("best_provider") | |
| if not provider: | |
| return {"error": "No provider available to book."} | |
| slot = pick_slot(provider, intent.get("time", "morning")) | |
| booking_id = f"BK-{datetime.now().strftime('%Y%m%d')}-{str(uuid.uuid4())[:5].upper()}" | |
| remind_time = f"{int(slot.split(':')[0]) - 1:02d}:{slot.split(':')[1]}" | |
| booked_date = (datetime.now() + timedelta(days=1)).strftime("%A, %d %b %Y") | |
| record = { | |
| "booking_id": booking_id, | |
| "provider_id": provider["provider_id"], | |
| "provider_name": provider["name"], | |
| "service": intent.get("service_type"), | |
| "location": intent.get("location"), | |
| "confirmed_slot": slot, | |
| "booked_date": booked_date, | |
| "provider_phone": provider.get("phone"), | |
| "reminder_time": remind_time, | |
| "created_at": datetime.now().isoformat(), | |
| "status": "confirmed", | |
| } | |
| # Write to bookings.json | |
| try: | |
| existing = json.loads(BOOKINGS_FILE.read_text()) if BOOKINGS_FILE.exists() else [] | |
| existing.append(record) | |
| BOOKINGS_FILE.write_text(json.dumps(existing, indent=2)) | |
| except Exception: | |
| pass # HF free tier ephemeral filesystem — non-fatal | |
| return record | |