Spaces:
Sleeping
Sleeping
| """Parse free-form model text into a typed JewelryAction. | |
| Mirrors inference.py:get_action_from_text so the action surface during | |
| training matches what was used during evaluation. | |
| """ | |
| from __future__ import annotations | |
| from typing import Tuple | |
| try: | |
| from ..models import JewelryAction | |
| except ImportError: | |
| from models import JewelryAction | |
| def parse_model_text_to_action(phase: str, text: str) -> Tuple[JewelryAction, str]: | |
| """Return (action, normalised_text) for the current phase. | |
| Robust against typical LLM output noise: backticks, quotes, leading/trailing | |
| whitespace. Falls back to safe defaults so a single bad token never breaks | |
| the rollout. | |
| """ | |
| text = (text or "").strip().replace("`", "").strip(" \t\n\r\"'") | |
| if phase == "market": | |
| lower = text.lower() | |
| if lower.startswith("buy"): | |
| qty_str = lower.replace("buy", "").strip() | |
| try: | |
| qty = float(qty_str) | |
| except ValueError: | |
| qty = 1.0 | |
| return JewelryAction(market_action="buy", gold_qty=qty), f"buy {qty}" | |
| if "wait" in lower: | |
| return JewelryAction(market_action="wait"), "wait" | |
| try: | |
| qty = float(text) | |
| return JewelryAction(market_action="buy", gold_qty=qty), f"buy {qty}" | |
| except ValueError: | |
| return JewelryAction(market_action="wait"), "wait" | |
| if phase == "warehouse": | |
| lower = text.lower() | |
| for product in ("necklace", "bracelet", "ring"): | |
| if product in lower: | |
| return JewelryAction(product_choice=product), product | |
| return JewelryAction(product_choice="ring"), "ring" | |
| if phase == "showroom": | |
| return JewelryAction(message=text), text | |
| return JewelryAction(), text | |