Spaces:
Sleeping
Sleeping
| """Build the committed synthetic e-commerce "world" for the order-comms task. | |
| Deterministic (fixed seed) and re-runnable: produces identical JSONL every time. | |
| No network, no LLM. Everything is invented and generic — safe to commit/world-read. | |
| Writes data/order_world/{customers,products,orders,order_items,shipments,returns}.jsonl, | |
| which back BOTH tools of the task (duckdb SQL + the mock entity search). | |
| uv run python scripts/build_order_world.py | |
| """ | |
| import json | |
| import random | |
| from datetime import datetime, timedelta | |
| from pathlib import Path | |
| OUT = Path(__file__).resolve().parent.parent / "data" / "order_world" | |
| SEED = 7 | |
| BASE = datetime(2026, 6, 15, 12, 0, 0) # "today" the world is anchored to | |
| N_CUSTOMERS = 40 | |
| N_PRODUCTS = 60 | |
| N_ORDERS = 200 | |
| BRANDS = [ | |
| "Aurelia", "Kettleworth", "Nordhaus", "Brightleaf", "Pinnacle", "Quill & Co", | |
| "Vantage", "Maple & Oak", "Lumio", "Cragmont", "Sundara", "Driftwood", | |
| ] | |
| CATALOG = { | |
| "Kitchen": ["Espresso Machine", "Cast Iron Skillet", "Stand Mixer", | |
| "Electric Kettle", "Chef's Knife Set", "Air Fryer"], | |
| "Electronics": ["Wireless Earbuds", "Bluetooth Speaker", "Noise-Canceling Headphones", | |
| "Smart Thermostat", "4K Action Camera", "Mechanical Keyboard"], | |
| "Home": ["Linen Duvet Set", "Area Rug 5x7", "Arc Floor Lamp", | |
| "Ceramic Vase", "Memory Foam Pillow", "Blackout Curtains"], | |
| "Outdoor": ["2-Person Tent", "Camp Stove", "Hiking Backpack", | |
| "Insulated Water Bottle", "Trekking Poles", "Sleeping Bag"], | |
| "Apparel": ["Rain Jacket", "Merino Wool Socks", "Trail Running Shoes", | |
| "Fleece Pullover", "Canvas Tote", "Leather Belt"], | |
| "Toys": ["Building Block Set", "Wooden Train Set", "Plush Bear", | |
| "Remote Control Car", "Strategy Board Game", "1000pc Puzzle"], | |
| } | |
| CARRIERS = ["Northstar Freight", "BluePost", "RapidShip", "Continental Parcel"] | |
| FIRST = ["Avery", "Jordan", "Riley", "Casey", "Morgan", "Quinn", "Reese", "Skyler", | |
| "Devon", "Harper", "Emerson", "Rowan", "Sasha", "Marlo", "Tatum", "Blair", | |
| "Corey", "Dana", "Elliot", "Frankie", "Glen", "Hollis", "Ira", "Jules"] | |
| LAST = ["Mercer", "Holloway", "Vance", "Ashby", "Calderon", "Doyle", "Esposito", | |
| "Farrow", "Grimaldi", "Hatcher", "Ingram", "Jennings", "Keaton", "Larkin", | |
| "Maddox", "Nakamura", "Oviedo", "Pruitt", "Quintero", "Rhodes", "Salazar", | |
| "Thorne", "Underwood", "Vasquez"] | |
| CITIES = [ | |
| ("Riverton", "OH"), ("Fairview", "TX"), ("Glendale", "AZ"), ("Ashland", "OR"), | |
| ("Bellmont", "NC"), ("Crestwood", "IL"), ("Dunmore", "PA"), ("Easton", "MD"), | |
| ("Granville", "NY"), ("Hartwell", "GA"), ("Ironwood", "MI"), ("Junction City", "KS"), | |
| ] | |
| RETURN_REASONS = ["arrived damaged", "wrong item received", "no longer needed", | |
| "defective on arrival", "not as described", "changed mind"] | |
| def det_uuid(rng: random.Random) -> str: | |
| return "%08x-%04x-%04x-%04x-%012x" % ( | |
| rng.getrandbits(32), rng.getrandbits(16), rng.getrandbits(16), | |
| rng.getrandbits(16), rng.getrandbits(48), | |
| ) | |
| def iso(dt: datetime) -> str: | |
| return dt.strftime("%Y-%m-%d %H:%M:%S") | |
| def build() -> dict[str, list[dict]]: | |
| rng = random.Random(SEED) | |
| products = [] | |
| for _ in range(N_PRODUCTS): | |
| category = rng.choice(list(CATALOG)) | |
| base = rng.choice(CATALOG[category]) | |
| brand = rng.choice(BRANDS) | |
| products.append({ | |
| "sku": f"SKU-{rng.randint(100000, 999999)}", | |
| "product_name": f"{brand} {base}", | |
| "brand": brand, | |
| "category": category, | |
| "price": round(rng.uniform(12, 480), 2), | |
| }) | |
| customers = [] | |
| used_emails: set[str] = set() | |
| for _ in range(N_CUSTOMERS): | |
| name = f"{rng.choice(FIRST)} {rng.choice(LAST)}" | |
| handle = name.lower().replace(" ", ".") | |
| email = f"{handle}{rng.randint(1, 99)}@mailbox.example.com" | |
| while email in used_emails: | |
| email = f"{handle}{rng.randint(1, 999)}@mailbox.example.com" | |
| used_emails.add(email) | |
| city, state = rng.choice(CITIES) | |
| customers.append({ | |
| "customer_id": det_uuid(rng), | |
| "full_name": name, | |
| "email": email, | |
| "phone": "+1" + "".join(str(rng.randint(0, 9)) for _ in range(10)), | |
| "city": city, | |
| "state_code": state, | |
| }) | |
| orders, order_items, shipments, returns = [], [], [], [] | |
| for _ in range(N_ORDERS): | |
| cust = rng.choice(customers) | |
| placed = BASE - timedelta(days=rng.randint(0, 60), | |
| hours=rng.randint(0, 23), minutes=rng.randint(0, 59)) | |
| order_id = det_uuid(rng) | |
| order_number = f"ORD-{placed:%y%m%d}-{rng.randint(1000, 9999)}" | |
| items = rng.sample(products, rng.randint(1, 3)) | |
| total = 0.0 | |
| for p in items: | |
| qty = rng.randint(1, 2) | |
| total += qty * p["price"] | |
| order_items.append({ | |
| "order_id": order_id, "sku": p["sku"], | |
| "quantity": qty, "unit_price": p["price"], | |
| }) | |
| age_days = (BASE - placed).days | |
| # status biased by age; recent orders still moving, older ones resolved | |
| if age_days <= 2: | |
| status = rng.choice(["placed", "paid", "paid", "shipped"]) | |
| elif age_days <= 10: | |
| status = rng.choice(["shipped", "shipped", "delivered", "cancelled"]) | |
| else: | |
| status = rng.choice(["delivered", "delivered", "delivered", "refunded"]) | |
| orders.append({ | |
| "order_id": order_id, | |
| "order_number": order_number, | |
| "customer_id": cust["customer_id"], | |
| "order_status": status, | |
| "order_total": round(total, 2), | |
| "placed_at": iso(placed), | |
| "ship_to_city": cust["city"], | |
| "ship_to_state": cust["state_code"], | |
| }) | |
| if status != "cancelled": | |
| shipped = placed + timedelta(days=rng.randint(1, 3)) | |
| est = shipped + timedelta(days=rng.randint(2, 7)) | |
| if status in ("delivered", "refunded"): | |
| ship_status, delivered = "delivered", iso(est - timedelta(days=rng.randint(0, 2))) | |
| elif status == "shipped": | |
| ship_status = rng.choice(["in_transit", "in_transit", "out_for_delivery", "exception"]) | |
| delivered = "" | |
| else: | |
| ship_status, delivered = "label_created", "" | |
| shipments.append({ | |
| "shipment_id": det_uuid(rng), | |
| "shipment_number": f"SHP-{shipped:%y%m%d}-{rng.randint(1000, 9999)}", | |
| "order_id": order_id, | |
| "carrier": rng.choice(CARRIERS), | |
| "ship_status": ship_status, | |
| "tracking_number": "1Z" + "".join(str(rng.randint(0, 9)) for _ in range(12)), | |
| "shipped_at": iso(shipped), | |
| "est_delivery": iso(est), | |
| "delivered_at": delivered, | |
| }) | |
| # ~30% of delivered/refunded orders have a return | |
| if status in ("delivered", "refunded") and rng.random() < 0.4: | |
| p = rng.choice(items) | |
| created = placed + timedelta(days=rng.randint(6, 20)) | |
| rstatus = "refunded" if status == "refunded" else \ | |
| rng.choice(["requested", "approved", "received"]) | |
| returns.append({ | |
| "return_id": det_uuid(rng), | |
| "rma_number": f"RMA-{created:%y%m%d}-{rng.randint(1000, 9999)}", | |
| "order_id": order_id, | |
| "sku": p["sku"], | |
| "reason": rng.choice(RETURN_REASONS), | |
| "return_status": rstatus, | |
| "created_at": iso(created), | |
| }) | |
| return { | |
| "customers": customers, "products": products, "orders": orders, | |
| "order_items": order_items, "shipments": shipments, "returns": returns, | |
| } | |
| def main() -> None: | |
| OUT.mkdir(parents=True, exist_ok=True) | |
| world = build() | |
| for name, rows in world.items(): | |
| path = OUT / f"{name}.jsonl" | |
| with path.open("w") as f: | |
| for row in rows: | |
| f.write(json.dumps(row) + "\n") | |
| print(f"wrote {len(rows):>4} rows -> {path.relative_to(OUT.parent.parent)}") | |
| if __name__ == "__main__": | |
| main() | |