Spaces:
Sleeping
Sleeping
| title: Shopmanagereng Environment Server | |
| emoji: ποΈ | |
| colorFrom: green | |
| colorTo: blue | |
| sdk: docker | |
| pinned: false | |
| app_port: 7860 | |
| base_path: /web | |
| tags: | |
| - openenv | |
| Link of the environment: https://huggingface.co/spaces/hard007ik/ShopManagerEng | |
| Link of Blog.md: https://huggingface.co/spaces/hard007ik/ShopManagerEng/tree/main/Blog.md | |
| # Jewelry Shop Manager β RL Environment | |
| A reinforcement learning environment simulating a **jewelry shop management** pipeline. An AI agent navigates three sequential phases β buying raw materials, selecting products to craft based on demand, and negotiating sales β to maximize profit. | |
| ## Environment Overview | |
| ### Phase 1: Market (Buy / Wait) | |
| - Gold prices **fluctuate Β±10% each round** (up to 3 rounds). | |
| - The agent analyzes price trends and decides to **buy** gold or **wait** for a better price. | |
| - Goal: Buy gold at the lowest possible price while reserving cash for crafting labor. | |
| ### Phase 2: Warehouse (Product Selection) | |
| - The agent sees **demand levels** for each product type: | |
| | Product | Gold (oz) | Labor ($) | Demand Range | | |
| |-----------|-----------|-----------|--------------| | |
| | Ring | 1.0 | $200 | 40-100% | | |
| | Necklace | 2.0 | $300 | 20-80% | | |
| | Bracelet | 0.5 | $100 | 10-60% | | |
| - The agent picks the **highest-demand product** it can afford to craft. | |
| - Goal: Match production to market demand. | |
| ### Phase 3: Showroom (Negotiation) | |
| - A customer makes an initial offer based on cost basis and product demand. | |
| - The agent can **accept**, **counter-offer**, or **reject**. | |
| - Each counter raises the customer's offer by **5%** (up to 5 rounds). | |
| - Goal: Sell at maximum profit through smart negotiation. | |
| ### Reward Structure | |
| | Component | Weight | Description | | |
| |-----------|--------|-------------| | |
| | R1 (Market) | 20% | How close to the lowest price did the agent buy? | | |
| | R2 (Warehouse) | 20% | Did the agent pick the highest-demand product? | | |
| | R3 (Showroom) | 60% | Normalized profit margin on the sale | | |
| **Final Score** = `0.2 Γ R1 + 0.2 Γ R2 + 0.6 Γ R3` (range [0, 1]) | |
| ## Quick Start | |
| ```python | |
| from ShopManagerEng import JewelryAction, JewelryShopEnv | |
| async def run(): | |
| env = JewelryShopEnv(base_url="http://localhost:8000") | |
| result = await env.reset() | |
| print(f"Gold price: ${result.observation.gold_price}/oz") | |
| # Phase 1 β Market: wait for better price | |
| result = await env.step(JewelryAction(market_action="wait")) | |
| # Phase 1 β Market: buy gold | |
| result = await env.step(JewelryAction(market_action="buy", gold_qty=2.0)) | |
| # Phase 2 β Warehouse: choose product | |
| result = await env.step(JewelryAction(product_choice="ring")) | |
| # Phase 3 β Showroom: negotiate | |
| result = await env.step(JewelryAction(message="How about $600?")) | |
| result = await env.step(JewelryAction(message="I accept")) | |
| print(f"Final reward: {result.reward}, Cash: {result.observation.cash}") | |
| await env.close() | |
| import asyncio | |
| asyncio.run(run()) | |
| ``` | |
| ## Action Space | |
| ```python | |
| class JewelryAction: | |
| market_action: str # "buy" or "wait" (Phase 1) | |
| gold_qty: float # Ounces to buy (Phase 1) | |
| product_choice: str # "ring", "necklace", or "bracelet" (Phase 2) | |
| message: str # Negotiation text (Phase 3) | |
| ``` | |
| ## Observation Space | |
| ```python | |
| class JewelryObservation: | |
| phase: str # "market" | "warehouse" | "showroom" | |
| cash: float # Current cash balance | |
| gold_oz: float # Raw gold in inventory | |
| gold_price: float # Current gold price ($/oz) | |
| gold_price_history: List[float] # Price trend for analysis | |
| market_round: int # Current market round | |
| demand: Dict[str, float] # Demand per product (0-1) | |
| product_catalog: Dict[str, dict] # Specs per product | |
| inventory: Dict[str, int] # Crafted products in stock | |
| product_for_sale: str # Product being sold (showroom) | |
| cost_basis: float # Total manufacturing cost | |
| current_offer: float # Customer's current offer | |
| negotiation_round: int # Counter-offer round | |
| message: str # Environment feedback | |
| ``` | |
| ## Running the Inference Script | |
| ```bash | |
| # Terminal 1: Start the server | |
| cd ShopManagerEng | |
| uv run server | |
| # Terminal 2: Run inference (from parent directory or inside ShopManagerEng) | |
| python inference.py | |
| ``` | |
| Required environment variables (set in `.env`): | |
| - `HF_TOKEN` β Hugging Face API token | |
| - `MODEL_NAME` β LLM model (default: `meta-llama/Llama-3.3-70B-Instruct`) | |
| ## Deploying to Hugging Face Spaces | |
| ```bash | |
| openenv push | |
| ``` | |
| ## Project Structure | |
| ``` | |
| ShopManagerEng/ | |
| βββ __init__.py # Module exports | |
| βββ README.md # This file | |
| βββ openenv.yaml # OpenEnv manifest | |
| βββ pyproject.toml # Dependencies | |
| βββ models.py # Action, Observation, State definitions | |
| βββ client.py # JewelryShopEnv client | |
| βββ inference.py # LLM-based agent inference script | |
| βββ server/ | |
| βββ __init__.py | |
| βββ ShopManagerEng_environment.py # Core environment logic | |
| βββ app.py # FastAPI application | |
| βββ Dockerfile # Container image | |
| ``` | |