from langchain_core.tools import tool @tool def book_free_trial(name: str, contact: str, preferred_date: str) -> str: """Book a free 30-minute introductory class for a new user.""" return f"Free trial booked for {name} on {preferred_date}. Contact: {contact}" @tool def subscribe_to_membership(name: str, phone_number: str, package_type: str) -> str: """Subscribe user to a membership package.""" return f"Membership subscription created for {name} ({phone_number}) - Package: {package_type}" @tool def cancel_membership(phone_number: str, request_time: str) -> str: """Cancel a membership within 48 hours of payment.""" return f"Membership cancellation processed for {phone_number} at {request_time}" @tool def postpone_membership(phone_number: str, reason: str, start_date: str, end_date: str) -> str: """Postpone membership for 2 weeks to 2 months.""" return f"Membership postponed for {phone_number} from {start_date} to {end_date}. Reason: {reason}" @tool def transfer_membership(phone_number: str, new_member_name: str, new_member_phone_number: str) -> str: """Transfer a membership to another person with consent and 200 SAR fee.""" return f"Membership transferred from {phone_number} to {new_member_name} ({new_member_phone_number}). Fee: 200 SAR" @tool def get_current_date() -> str: """Get the current date in YYYY-MM-DD format.""" from datetime import datetime return datetime.now().strftime("%Y-%m-%d") @tool def calculate_date_range(start_date: str, duration_months: int) -> str: """Calculate end date given start date and duration in months.""" from datetime import datetime from dateutil.relativedelta import relativedelta start = datetime.strptime(start_date, "%Y-%m-%d") end = start + relativedelta(months=duration_months) return f"Start: {start.strftime('%Y-%m-%d')}, End: {end.strftime('%Y-%m-%d')}, Duration: {(end - start).days} days" def format_messages_with_actions(messages): """Format messages for the manager prompt""" formatted = [] for msg in messages: if hasattr(msg, 'content'): formatted.append(f"Message: {msg.content}") elif hasattr(msg, 'invoke'): # Handle tool calls properly formatted.append(f"Tool call: {str(msg)}") return "\n".join(formatted) tools_list = [ calculate_date_range, get_current_date, book_free_trial, subscribe_to_membership, cancel_membership, postpone_membership, transfer_membership ]