"""Shared builders for Flatmate visit-scheduling scenarios.""" from __future__ import annotations from copy import deepcopy from typing import Any def build_post( *, post_id: str, area: str, rent: int, diet: str, listing_type: str, commute_to_goregaon_mins: int, constraints: list[str], calendar_slots: list[str], description: str, pre_booked_slots: list[str] | None = None, amenities: dict[str, bool] | None = None, negotiable: bool = False, ) -> dict[str, Any]: return { "id": post_id, "area": area, "rent": rent, "diet": diet, "type": listing_type, "commute_to_goregaon_mins": commute_to_goregaon_mins, "constraints": list(constraints), "calendar_slots": list(calendar_slots), "pre_booked_slots": list(pre_booked_slots or []), "description": description, "amenities": dict(amenities or {}), "negotiable": negotiable, } def build_buyer_profile( *, budget_max: int, dietary: str, areas: list[str], occupation: str, visit_availability: list[str], initial_disclosure_fields: list[str], hidden_additional_availability: list[str] | None = None, hidden_budget_ceiling: int | None = None, ) -> dict[str, Any]: return { "budget_max": budget_max, "dietary": dietary, "areas": list(areas), "occupation": occupation, "visit_availability": list(visit_availability), "initial_disclosure_fields": list(initial_disclosure_fields), "hidden_additional_availability": list(hidden_additional_availability or []), "hidden_budget_ceiling": hidden_budget_ceiling, } def build_seller_profile( *, area: str, rent: int, dietary: str, listing_type: str, occupation_requirement: str, calendar_slots: list[str], description: str, commute_to_goregaon_mins: int, constraints: list[str], ) -> dict[str, Any]: return { "area": area, "rent": rent, "dietary": dietary, "listing_type": listing_type, "occupation_requirement": occupation_requirement, "calendar_slots": list(calendar_slots), "description": description, "commute_to_goregaon_mins": commute_to_goregaon_mins, "constraints": list(constraints), } def build_ground_truth( *, optimal_posts: list[str], acceptable_posts: list[str], dealbreaker_posts: list[str], required_bookings: int, required_tool_calls: list[str], required_info: list[str], success_condition: str, min_viable_turns: int, schedule_feasible_posts: list[str] | None = None, max_schedule_feasible_visits: int | None = None, ) -> dict[str, Any]: payload = { "optimal_posts": list(optimal_posts), "acceptable_posts": list(acceptable_posts), "dealbreaker_posts": list(dealbreaker_posts), "required_bookings": required_bookings, "required_tool_calls": list(required_tool_calls), "required_info": list(required_info), "success_condition": success_condition, "min_viable_turns": min_viable_turns, } if schedule_feasible_posts is not None: payload["schedule_feasible_posts"] = list(schedule_feasible_posts) if max_schedule_feasible_visits is not None: payload["max_schedule_feasible_visits"] = max_schedule_feasible_visits return payload def build_visit_scenario( *, task_id: str, label: str, difficulty: str, description: str, task_post_ids: list[str], buyer_profile: dict[str, Any], ground_truth: dict[str, Any], scenario_creation_config: dict[str, Any], initial_user_message: str, seller_profile: dict[str, Any] | None = None, seller_initial_message: str | None = None, ) -> dict[str, Any]: return { "task_id": task_id, "label": label, "difficulty": difficulty, "description": description, "task_post_ids": list(task_post_ids), "buyer_profile": deepcopy(buyer_profile), "seller_profile": deepcopy(seller_profile), "ground_truth": deepcopy(ground_truth), "scenario_creation_config": deepcopy(scenario_creation_config), "initial_user_message": initial_user_message, "seller_initial_message": seller_initial_message or "", }