{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-04-16-ecom-rlve-adaptive-verifiable-environments-for-e-commerce/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "> **TL;DR** — We extend the RLVE framework from single-turn reasoning puzzles to **multi-turn, tool-augmented e-commerce conversations**. EcomRLVE-GYM provides 8 verifiable environments — product discovery, substitution, cart building, returns, order tracking, policy QA, bundle planning, and multi-intent journeys — each with procedural problem generation, a 12-axis difficulty curriculum, and algorithmically verifiable rewards. We train a Qwen 3 8B model with DAPO over 300 steps and present early results demonstrating that environment scaling and adaptive difficulty transfer to agentic, real-world task completion.\n\nThis project originated in the [Pytorch OpenEnv Hackathon](https://cerebralvalley.ai/e/openenv-hackathon-sf) and is still evolving, follow us for updates 🔥\n\n## Why RL for shopping agents?\n\nLarge language models can hold fluent conversations, yet deploying them as shopping assistants reveals a persistent gap: **fluency ≠ task completion**. A customer who asks *\"find me a USB-C charger under $25 that ships in two days\"* needs an agent that invokes the right catalog search, filters on three hard constraints, avoids hallucinating product IDs it never retrieved, and handles follow-ups when the top result goes out of stock.\n\nSupervised fine-tuning can teach surface-level tool use from demonstrations, but it cannot scale to the combinatorial space of constraint configurations, partial-information dialogues, and multi-step transactional workflows that real e-commerce demands.\n\nReinforcement learning with verifiable rewards (RLVR) offers an alternative: the agent optimises for *outcomes* — did the products satisfy the constraints? Was the cart correct? Was the return initiated for the right order line? The challenge is constructing reward functions that are both **verifiable** (no LLM-as-a-judge subjectivity) and **adaptive** (difficulty that grows with the policy's capability).\n\n### From RLVE-Gym to EcomRLVE-GYM\n\nRLVE-Gym provides 400 environments for sorting, multiplication, Sudoku, and other algorithmic-reasoning tasks; however, those are all **single-turn, text-in / text-out** puzzles — extending to agentic domains was left as future work.\n\nEcomRLVE-GYM fills that gap: we stay in the **verifiable** regime (e-commerce outcomes *can* be checked algorithmically) while extending to **multi-turn, tool-augmented, agentic** conversations — environments where the agent must *act* (call tools, modify world state) rather than merely *reason* (produce a text answer) and compensates for the deficiency of the search system.\n\nEcomRLVE-GYM transforms customer-service outcomes structurally verifiable:\n\n[![verifiable_signals_dark](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/dA0i6ZB3JDG-rqQtLRCy0.png)](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/dA0i6ZB3JDG-rqQtLRCy0.png)\n\nEvery signal above can be evaluated by a program with access to the hidden ground-truth goal. No human annotation or LLM-as-a-judge is needed.\n\n* * *\n\n## What a training episode looks like\n\nBefore we explain the framework, here is what a single EcomRLVE episode looks like at difficulty `d = 4`. The environment generates a hidden goal, a simulated user opens the chat, and the agent must use tools to satisfy the request. Every action is verified algorithmically — no LLM judge required.\n\n![Sample Episode](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/qDXS-CPl8DT4JN6Uq6nrt.png)\n\nThe reward is fully computed by code: F1 over `(product, variant, qty)` tuples, an efficiency bonus for finishing in fewer turns, and a hallucination check that every recommended product ID was actually retrieved. If the agent had picked the Lightning variant instead of USB-C, the simulated user would have corrected it mid-dialogue — and the F1 would have dropped.\n\n## The eight environments\n\nEach environment covers a distinct real-world shopping scenario. The agent must complete the task using tools (catalog search, cart operations, order lookups, policy queries) and is scored by a program — not a human or another LLM.\n\n| Environment              | What the agent must do                                                                   |\n| ------------------------ | ---------------------------------------------------------------------------------------- |\n| **Product Discovery**    | Find products that satisfy all the user's constraints                                    |\n| **Substitution**         | An item is out of stock — find a similar, compatible alternative                         |\n| **Cart Building**        | Add the exact products, variants, and quantities the user asked for                      |\n| **Return + Replacement** | Identify the right order line, initiate a return, suggest a replacement                  |\n| **Order Tracking**       | Resolve which order the user means and report its current status                         |\n| **Policy QA**            | Answer a deterministic question about store policy (return window, shipping rules, etc.) |\n| **Bundle Planning**      | Recommend a complete shopping list for a project within a budget                         |\n| **Multi-Intent Journey** | Handle a conversation that chains 2–5 of the above tasks in sequence                     |\n\nEvery environment uses the same three-part reward signal:\n\n- **Task reward** — did the agent actually complete the goal? (e.g., were the right products recommended, was the cart correct, was the right order tracked?)\n- **Efficiency reward** — did the agent complete it without wasting turns? Turns the *user* caused (asking a follow-up, confirming an action) don't count against the agent — only turns caused by agent mistakes do.\n- **Hallucination penalty** — did the agent only recommend products it actually retrieved during the session? Recommending product IDs that were never looked up is penalised, so the agent cannot invent results from memory.\n\nInvalid outputs (malformed JSON, illegal tool calls) trigger an immediate failure score, creating a strong incentive for well-formed responses from step one.\n\n## Adaptive difficulty curriculum\n\nA single difficulty number `d` controls 12 independent aspects of a task simultaneously. This is important because e-commerce conversations are hard in many different ways at once — not just along one dimension.\n\n[![Screenshot 2026-03-08 at 11.27.11](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/SALZRvBC6TP1HG1ZxqWsh.png)](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/SALZRvBC6TP1HG1ZxqWsh.png)\n\nHere are four representative difficulty axes:\n\n| What changes                                        | Easy (`d = 0`) | Medium (`d = 6`) | Hard (`d = 12`) |\n| --------------------------------------------------- | -------------- | ---------------- | --------------- |\n| **How many constraints** the user has               | 2              | 5                | 8               |\n| **How often the user omits** a constraint           | 5%             | 70%              | \\~80%           |\n| **Fraction of search results** that are distractors | 0%             | 12%              | 24%             |\n| **Items that go out of stock** mid-conversation     | 0%             | 30%              | 50%             |\n\nThe other eight axes cover turn budget, input noise (typos, slang), context switches, retrieval depth, order-history size, policy complexity, and tool budget. The full breakdown is in the [technical report](https://github.com/owlgebra-ai/EcomRLVE-Gym).\n\n**Adaptive scheduling.** Each environment tracks the agent's success rate independently and only advances to harder problems once the agent is passing the current level reliably. This keeps every environment training at the agent's capability frontier — avoiding both \"too easy to learn from\" and \"too hard to make progress on\".\n\n## Deep dive: Cart Building (E\\_CART)\n\nCart building is a good showcase because it requires the full search → inspect → clarify → act loop, has a binary ground truth, and introduces a challenge absent from most recommendation benchmarks: **variant selection**.\n\nTo succeed, the agent must develop five distinct skills:\n\n| Skill                      | What it means in practice                                                         |\n| -------------------------- | --------------------------------------------------------------------------------- |\n| **Product Discovery**      | Search the catalog with well-formed queries to find the right items               |\n| **Variant Selection**      | Identify the correct color, size, or connector type — not just the right product  |\n| **Cart Management**        | Add items with the exact variant and quantity the user asked for                  |\n| **Clarification Dialogue** | Ask the user a focused follow-up when a request is ambiguous (e.g., missing size) |\n| **Multi-Item Orders**      | Handle shopping lists with several different products in a single conversation    |\n\nThe agent uses six tools to accomplish this:\n\n| Tool                     | What it does                                                            |\n| ------------------------ | ----------------------------------------------------------------------- |\n| `catalog_search`         | Searches the product catalog with a natural-language query              |\n| `catalog_get_variants`   | Returns available variants (color, size, connector, etc.) for a product |\n| `cart_add`               | Adds a product to the cart with a specific variant and quantity         |\n| `cart_view`              | Reads the current cart so the agent can verify it matches the request   |\n| `user_get_visit_history` | Fetches recently viewed products by user                                |\n| `ask_user`               | Sends a clarification question to the customer when a detail is missing |\n\n### The problem\n\nThe generator samples 1–5 target products (scaling in difficulty with `d`), each potentially requiring a specific variant (USB-C vs Lightning, Matte vs Glossy) and a quantity > 1. The agent must:\n\n1. Search the catalog to find each product\n2. Call `catalog.get_variants` to see available options\n3. Add the correct `(product_id, variant_id, qty)` tuples to the cart\n\n### Why variants matter\n\nReal product catalogs have sparse variant data — many products have none, and those that do typically vary only by colour or size. To create a richer discrimination task, we **synthesize variants at episode initialization**:\n\n- A per-category priority list picks the most natural attribute to vary (electronics → `connector_type`; clothing → `size`; kitchen → `material`).\n- For each target product, we generate 3 variants: 1 target + 2 plausible distractors. An \"Anker 65W USB-C Charger\" produces `{USB-C, Lightning, HDMI}`.\n- The verifier checks **composite keys** `(product_id, variant_id)` — correct product but wrong variant means the unit is unmatched.\n\n### Difficulty scaling\n\n| Axis                 | d = 0 | d = 3 | d = 6 | d = 9 |\n| -------------------- | ----- | ----- | ----- | ----- |\n| **Distinct items**   | 1     | 2     | 3     | 4     |\n| **Variant required** | 21%   | 66%   | 93%   | 99%   |\n| **Multi-quantity**   | 0%    | 30%   | 50%   | 50%   |\n\nAt `d = 0` the agent adds a single product with no variant complexity — learning the basic `catalog.search → cart.add` workflow. At `d = 6` it juggles 3 items, nearly all requiring a specific variant, with half needing qty > 1.\n\n### Scoring\n\nThe cart must be exactly right — correct product, correct variant, correct quantity. Partial credit is given for partially correct carts, but a perfect score requires every item to match. If the agent adds the wrong variant, the simulated user corrects it mid-dialogue (*\"that's the Lightning version, but I need USB-C\"*), giving the agent a chance to self-correct before the episode ends.\n\n### Trajectories: easy vs. hard\n\nTwo real E\\_CART episodes from a Qwen 3 8B agent. Same environment, same agent — difficulty alone changes the game.\n\n|                  | **d = 1** — 1 item, no variants                                                                                                 | **d = 8** — 3 items, variants + typos                                                                                                                                                                                    |\n| ---------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| **User message** | *\"Shopping list: SonicWave Keypad. Please add everything.\"*                                                                     | *\"pls add the following to my **aart**: Eco-**Frienly HrenLefa** Charger by GreenLeaf, High-Performance **AqaPure** Air Fryer , **Lighrweiht** PixelVault Tank Top (3).\"* — typos from noise axis                        |\n| **Turn 1**       | `user.get_visit_history()` → 4 results. Spots the target immediately.                                                           | `user.get_visit_history()` → 9 results. Must disambiguate across chargers, fryers, tops.                                                                                                                                 |\n| **Turn 2**       | `cart.add(\"syn_000162\", qty=1)` → Cart: 1 item, $2.74. *\"I found the SonicWave Keypad.\"* User: *\"Great, that's the exact one.\"* | No tool calls — presents 3 product cards. User: *\"Add the Charger with 100W output, Air Fryer with Charcoal filter, 3 Tank Tops in size XS.\"*                                                                            |\n| **Turn 3**       | `answer: { \"done\": true }` — **Done in 3 turns.**                                                                               | `catalog.get_variants` × 3 → charger: 6 variants (100W, 120W, 30W…), air fryer: 6 (Bamboo, Permanent, **Charcoal**…), tank top: 7 (**XS**, S, XL…). User: *\"I need three Tank Tops in XS.\"*                              |\n| **Turn 4**       |                                                                                                                                 | `cart.add(charger, \"100W\", qty=1)` ✓ `cart.add(fryer, \"Bamboo\", qty=1)` ✗ should be Charcoal. `cart.add(tank_top, \"size_XL\", qty=3)` ✗ should be XS. User: *\"Air Fryer has Bamboo not Charcoal, Tank Top is XL not XS.\"* |\n| **Turn 5**       |                                                                                                                                 | Re-fetches tank top variants, adds 2× XS — **doesn't fix the air fryer**. User: *\"Air Fryer still shows Bamboo. I need three XS, not two.\"*                                                                              |\n| **Turn 6**       |                                                                                                                                 | Re-fetches tank top variants *again* — **still ignores the air fryer**. User: *\"Please change the Air Fryer variant.\"*                                                                                                   |\n| **Turn 7**       |                                                                                                                                 | *\"I cannot find a Charcoal filter variant.\"* — It exists; the agent saw it in turn 3 but never selected it. User: *\"Skip the Air Fryer then.\"*                                                                           |\n| **Turn 8**       |                                                                                                                                 | `answer: { \"done\": true }` — Cart still wrong: Charger ✓, Air Fryer (Bamboo) ✗, Tank Top (3×XL + 2×XS) ✗                                                                                                                 |\n| **Reward**       | `r_task` = +1.00, `r_eff` = +0.33, `r_hall` = 0.00, **r\\_total = +0.80** ✓                                                      | `r_task` ≈ 0.00, `r_eff` = −0.43, `r_hall` = 0.00, **r\\_total = −0.06** ✗                                                                                                                                                |\n| **Outcome**      | Cart matches goal. 3 turns, 2 effective.                                                                                        | Wrong variants, wrong quantities, user gave up. 8 turns, 6 effective.                                                                                                                                                    |\n\nAt d=1 the agent solves the task in 3 clean turns. At d=8 it spirals — picking Bamboo instead of Charcoal, XL instead of XS, never fixing the air fryer despite two user corrections, then hallucinating that the variant doesn't exist. This is exactly the kind of multi-step error cascade that the difficulty curriculum surfaces, and that adaptive training should teach the agent to recover from.\n\n## User simulation\n\nA verifiable environment needs a user simulator that behaves realistically. We use **Qwen3.5 (9.7B)** to generate natural, varied user messages rather than canned templates — covering everything from typo-filled requests to mid-conversation topic switches.\n\nTwo design choices matter for training quality:\n\n**Preferences match stated constraints.** Each simulated user has a hidden set of preferences (price sensitivity, brand loyalty, shipping speed, etc.). These are deliberately biased toward whatever constraints the user communicated — so if the user said \"under $25\", the reward function actually cares about price. Without this, an agent could be penalised for correctly following the user's instructions.\n\n**Strategic omission.** The LLM deliberately withholds some constraints from the opening message to force the agent to ask clarifying questions. The system tracks exactly what was and wasn't mentioned, so the agent is never penalised for information it was never given.\n\n## Environment scaling\n\nFollowing RLVE's methodology, we define nested environment collections:\n\n**C1 ⊂ C2 ⊂ C4 ⊂ C8**\n\n| Collection | Environments                       | Skills trained                                                          |\n| ---------- | ---------------------------------- | ----------------------------------------------------------------------- |\n| **C1**     | Cart                               | Serarch Query Formulation, Cart Manipulation                            |\n| **C2**     | \\+ Substitution                    | Similarity reasoning under constraints                                  |\n| **C4**     | \\+ Product Discovery, Returns      | Transactional workflows (Retrieval + recommendation, return initiation) |\n| **C8**     | \\+ Status, Policy, Bundle, Journey | Knowledge retrieval, planning, compositionality                         |\n\nWe hypothesise — consistent with RLVE's findings — that C8 agents outperform single-environment specialists, even on the specialist's own task.\n\n## Early results\n\nWe trained Qwen 3 8B with DAPO on C1 (Cart Building) for 300 steps as an initial viability study.\n\n|                | Config                                                                    |\n| -------------- | ------------------------------------------------------------------------- |\n| **Base model** | Qwen 3 8B                                                                 |\n| **Algorithm**  | DAPO (G = 8 rollouts/prompt)                                              |\n| **LR**         | 1e-5                                                                      |\n| **Catalog**    | 2M products, FAISS index with `Alibaba-NLP/gte-modernbert-base` (768-dim) |\n| **User sim**   | Qwen3.5 9.7B                                                              |\n\n[![accuracy_levels](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/eWQqFP-PbCJeNsn8klCQZ.png)](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/eWQqFP-PbCJeNsn8klCQZ.png)\n\nWe saw progressive growth in difficulty reached, confirming that adaptive scheduling produces a steady learning signal rather than the saturation (static-low) or starvation (static-high) patterns predicted by the RLVE paper.\n\n## Try it yourself\n\nRun a live episode directly in your browser using the embedded demo below. Here is how to get started:\n\n1. **Pick an environment** from the dropdown (e.g., `E_CART` for cart building or `E_PD` for product discovery).\n2. **Set a difficulty** — `0` is a simple single-constraint task; `6+` introduces missing information, noisy retrieval, and variant selection.\n3. **Click \"Reset Episode\"** — the simulated user will open with a shopping request.\n4. You are the agentnow: Make tool calls, analyse outputs and submit the final list of product ids.\n5. Click **\"Reset Episode\"** between runs to start a fresh scenario.\n\n## Resources\n\n[![Models](https://img.shields.io/badge/%F0%9F%A4%97%20Models-WUFUS-blue)](https://huggingface.co/collections/owlgebra-ai/wufus) [![Data](https://img.shields.io/badge/%F0%9F%A4%97%20Catalog%20Data-Amazebay2M-yellow)](https://huggingface.co/datasets/owlgebra-ai/Amazebay-catalog-2M) [![Code](https://img.shields.io/badge/Github-Code-black)](https://github.com/owlgebra-ai/EcomRLVE-Gym) [![Demo](https://img.shields.io/badge/%F0%9F%A4%97-Space-red)](https://huggingface.co/spaces/owlgebra-ai/EcomRLVE-Gym)\n\nThe environments, verifiers, and training configs are all open-source:\n\n```bash\ngit clone https://github.com/owlgebra-ai/EcomRLVE-Gym\ncd EcomRLVE-Gym\npip install -e .\n```\n\nThe 2M-product catalog is on the Hub:\n\n```python\nfrom datasets import load_dataset\n\ncatalog = load_dataset(\"owlgebra-ai/Amazebay-catalog-2M\", split=\"train\")\nprint(f\"{len(catalog)} products loaded\")\n```\n\n## References\n\n1. Zeng, Z., Ivison, H., Wang, Y., et al. (2025). *RLVE: Scaling Up Reinforcement Learning for Language Models with Adaptive Verifiable Environments.* ICML 2025. [arXiv:2511.07317](https://arxiv.org/abs/2511.07317)\n\n2. Yu, Q., Zhang, Z., Zhu, R., et al. (2025). *DAPO: An Open-Source LLM Reinforcement Learning System at Scale.* [arXiv:2503.14476](https://arxiv.org/abs/2503.14476)\n\n3. Shao, Z., Wang, P., Zhu, Q., et al. (2024). *DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models.* [arXiv:2402.03300](https://arxiv.org/abs/2402.03300)\n\n4. DeepSeek-AI. (2025). *DeepSeek-R1: Incentivizing Reasoning in LLMs through Reinforcement Learning.* Nature.\n\n5. Meta AI. (2024). *Llama 3.1: A Foundation Model for General Intelligence.* [llama.meta.com](https://llama.meta.com)\n\n6. Qwen Team. (2025). *Qwen3 Technical Report.* [arXiv:2505.09388](https://arxiv.org/abs/2505.09388)\n",
  "authors": [],
  "captured_at": "2026-10-19T01:26:53.998049939+00:00",
  "category": "ai",
  "content_html": "<blockquote>\n<p><strong>TL;DR</strong> — We extend the RLVE framework from single-turn reasoning puzzles to <strong>multi-turn, tool-augmented e-commerce conversations</strong>. EcomRLVE-GYM provides 8 verifiable environments — product discovery, substitution, cart building, returns, order tracking, policy QA, bundle planning, and multi-intent journeys — each with procedural problem generation, a 12-axis difficulty curriculum, and algorithmically verifiable rewards. We train a Qwen 3 8B model with DAPO over 300 steps and present early results demonstrating that environment scaling and adaptive difficulty transfer to agentic, real-world task completion.</p>\n</blockquote>\n<p>This project originated in the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://cerebralvalley.ai/e/openenv-hackathon-sf\">Pytorch OpenEnv Hackathon</a> and is still evolving, follow us for updates 🔥</p>\n<h2>Why RL for shopping agents?</h2>\n<p>Large language models can hold fluent conversations, yet deploying them as shopping assistants reveals a persistent gap: <strong>fluency ≠ task completion</strong>. A customer who asks <em>&quot;find me a USB-C charger under $25 that ships in two days&quot;</em> needs an agent that invokes the right catalog search, filters on three hard constraints, avoids hallucinating product IDs it never retrieved, and handles follow-ups when the top result goes out of stock.</p>\n<p>Supervised fine-tuning can teach surface-level tool use from demonstrations, but it cannot scale to the combinatorial space of constraint configurations, partial-information dialogues, and multi-step transactional workflows that real e-commerce demands.</p>\n<p>Reinforcement learning with verifiable rewards (RLVR) offers an alternative: the agent optimises for <em>outcomes</em> — did the products satisfy the constraints? Was the cart correct? Was the return initiated for the right order line? The challenge is constructing reward functions that are both <strong>verifiable</strong> (no LLM-as-a-judge subjectivity) and <strong>adaptive</strong> (difficulty that grows with the policy's capability).</p>\n<h3>From RLVE-Gym to EcomRLVE-GYM</h3>\n<p>RLVE-Gym provides 400 environments for sorting, multiplication, Sudoku, and other algorithmic-reasoning tasks; however, those are all <strong>single-turn, text-in / text-out</strong> puzzles — extending to agentic domains was left as future work.</p>\n<p>EcomRLVE-GYM fills that gap: we stay in the <strong>verifiable</strong> regime (e-commerce outcomes <em>can</em> be checked algorithmically) while extending to <strong>multi-turn, tool-augmented, agentic</strong> conversations — environments where the agent must <em>act</em> (call tools, modify world state) rather than merely <em>reason</em> (produce a text answer) and compensates for the deficiency of the search system.</p>\n<p>EcomRLVE-GYM transforms customer-service outcomes structurally verifiable:</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/dA0i6ZB3JDG-rqQtLRCy0.png\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/dA0i6ZB3JDG-rqQtLRCy0.png\" alt=\"verifiable_signals_dark\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>Every signal above can be evaluated by a program with access to the hidden ground-truth goal. No human annotation or LLM-as-a-judge is needed.</p>\n<hr />\n<h2>What a training episode looks like</h2>\n<p>Before we explain the framework, here is what a single EcomRLVE episode looks like at difficulty <code>d = 4</code>. The environment generates a hidden goal, a simulated user opens the chat, and the agent must use tools to satisfy the request. Every action is verified algorithmically — no LLM judge required.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/qDXS-CPl8DT4JN6Uq6nrt.png\" alt=\"Sample Episode\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>The reward is fully computed by code: F1 over <code>(product, variant, qty)</code> tuples, an efficiency bonus for finishing in fewer turns, and a hallucination check that every recommended product ID was actually retrieved. If the agent had picked the Lightning variant instead of USB-C, the simulated user would have corrected it mid-dialogue — and the F1 would have dropped.</p>\n<h2>The eight environments</h2>\n<p>Each environment covers a distinct real-world shopping scenario. The agent must complete the task using tools (catalog search, cart operations, order lookups, policy queries) and is scored by a program — not a human or another LLM.</p>\n<table>\n<thead>\n<tr>\n<th>Environment</th>\n<th>What the agent must do</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Product Discovery</strong></td>\n<td>Find products that satisfy all the user's constraints</td>\n</tr>\n<tr>\n<td><strong>Substitution</strong></td>\n<td>An item is out of stock — find a similar, compatible alternative</td>\n</tr>\n<tr>\n<td><strong>Cart Building</strong></td>\n<td>Add the exact products, variants, and quantities the user asked for</td>\n</tr>\n<tr>\n<td><strong>Return + Replacement</strong></td>\n<td>Identify the right order line, initiate a return, suggest a replacement</td>\n</tr>\n<tr>\n<td><strong>Order Tracking</strong></td>\n<td>Resolve which order the user means and report its current status</td>\n</tr>\n<tr>\n<td><strong>Policy QA</strong></td>\n<td>Answer a deterministic question about store policy (return window, shipping rules, etc.)</td>\n</tr>\n<tr>\n<td><strong>Bundle Planning</strong></td>\n<td>Recommend a complete shopping list for a project within a budget</td>\n</tr>\n<tr>\n<td><strong>Multi-Intent Journey</strong></td>\n<td>Handle a conversation that chains 2–5 of the above tasks in sequence</td>\n</tr>\n</tbody>\n</table>\n<p>Every environment uses the same three-part reward signal:</p>\n<ul>\n<li><strong>Task reward</strong> — did the agent actually complete the goal? (e.g., were the right products recommended, was the cart correct, was the right order tracked?)</li>\n<li><strong>Efficiency reward</strong> — did the agent complete it without wasting turns? Turns the <em>user</em> caused (asking a follow-up, confirming an action) don't count against the agent — only turns caused by agent mistakes do.</li>\n<li><strong>Hallucination penalty</strong> — did the agent only recommend products it actually retrieved during the session? Recommending product IDs that were never looked up is penalised, so the agent cannot invent results from memory.</li>\n</ul>\n<p>Invalid outputs (malformed JSON, illegal tool calls) trigger an immediate failure score, creating a strong incentive for well-formed responses from step one.</p>\n<h2>Adaptive difficulty curriculum</h2>\n<p>A single difficulty number <code>d</code> controls 12 independent aspects of a task simultaneously. This is important because e-commerce conversations are hard in many different ways at once — not just along one dimension.</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/SALZRvBC6TP1HG1ZxqWsh.png\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/SALZRvBC6TP1HG1ZxqWsh.png\" alt=\"Screenshot 2026-03-08 at 11.27.11\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>Here are four representative difficulty axes:</p>\n<table>\n<thead>\n<tr>\n<th>What changes</th>\n<th>Easy (<code>d = 0</code>)</th>\n<th>Medium (<code>d = 6</code>)</th>\n<th>Hard (<code>d = 12</code>)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>How many constraints</strong> the user has</td>\n<td>2</td>\n<td>5</td>\n<td>8</td>\n</tr>\n<tr>\n<td><strong>How often the user omits</strong> a constraint</td>\n<td>5%</td>\n<td>70%</td>\n<td>~80%</td>\n</tr>\n<tr>\n<td><strong>Fraction of search results</strong> that are distractors</td>\n<td>0%</td>\n<td>12%</td>\n<td>24%</td>\n</tr>\n<tr>\n<td><strong>Items that go out of stock</strong> mid-conversation</td>\n<td>0%</td>\n<td>30%</td>\n<td>50%</td>\n</tr>\n</tbody>\n</table>\n<p>The other eight axes cover turn budget, input noise (typos, slang), context switches, retrieval depth, order-history size, policy complexity, and tool budget. The full breakdown is in the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/owlgebra-ai/EcomRLVE-Gym\">technical report</a>.</p>\n<p><strong>Adaptive scheduling.</strong> Each environment tracks the agent's success rate independently and only advances to harder problems once the agent is passing the current level reliably. This keeps every environment training at the agent's capability frontier — avoiding both &quot;too easy to learn from&quot; and &quot;too hard to make progress on&quot;.</p>\n<h2>Deep dive: Cart Building (E_CART)</h2>\n<p>Cart building is a good showcase because it requires the full search → inspect → clarify → act loop, has a binary ground truth, and introduces a challenge absent from most recommendation benchmarks: <strong>variant selection</strong>.</p>\n<p>To succeed, the agent must develop five distinct skills:</p>\n<table>\n<thead>\n<tr>\n<th>Skill</th>\n<th>What it means in practice</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Product Discovery</strong></td>\n<td>Search the catalog with well-formed queries to find the right items</td>\n</tr>\n<tr>\n<td><strong>Variant Selection</strong></td>\n<td>Identify the correct color, size, or connector type — not just the right product</td>\n</tr>\n<tr>\n<td><strong>Cart Management</strong></td>\n<td>Add items with the exact variant and quantity the user asked for</td>\n</tr>\n<tr>\n<td><strong>Clarification Dialogue</strong></td>\n<td>Ask the user a focused follow-up when a request is ambiguous (e.g., missing size)</td>\n</tr>\n<tr>\n<td><strong>Multi-Item Orders</strong></td>\n<td>Handle shopping lists with several different products in a single conversation</td>\n</tr>\n</tbody>\n</table>\n<p>The agent uses six tools to accomplish this:</p>\n<table>\n<thead>\n<tr>\n<th>Tool</th>\n<th>What it does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>catalog_search</code></td>\n<td>Searches the product catalog with a natural-language query</td>\n</tr>\n<tr>\n<td><code>catalog_get_variants</code></td>\n<td>Returns available variants (color, size, connector, etc.) for a product</td>\n</tr>\n<tr>\n<td><code>cart_add</code></td>\n<td>Adds a product to the cart with a specific variant and quantity</td>\n</tr>\n<tr>\n<td><code>cart_view</code></td>\n<td>Reads the current cart so the agent can verify it matches the request</td>\n</tr>\n<tr>\n<td><code>user_get_visit_history</code></td>\n<td>Fetches recently viewed products by user</td>\n</tr>\n<tr>\n<td><code>ask_user</code></td>\n<td>Sends a clarification question to the customer when a detail is missing</td>\n</tr>\n</tbody>\n</table>\n<h3>The problem</h3>\n<p>The generator samples 1–5 target products (scaling in difficulty with <code>d</code>), each potentially requiring a specific variant (USB-C vs Lightning, Matte vs Glossy) and a quantity &gt; 1. The agent must:</p>\n<ol>\n<li>Search the catalog to find each product</li>\n<li>Call <code>catalog.get_variants</code> to see available options</li>\n<li>Add the correct <code>(product_id, variant_id, qty)</code> tuples to the cart</li>\n</ol>\n<h3>Why variants matter</h3>\n<p>Real product catalogs have sparse variant data — many products have none, and those that do typically vary only by colour or size. To create a richer discrimination task, we <strong>synthesize variants at episode initialization</strong>:</p>\n<ul>\n<li>A per-category priority list picks the most natural attribute to vary (electronics → <code>connector_type</code>; clothing → <code>size</code>; kitchen → <code>material</code>).</li>\n<li>For each target product, we generate 3 variants: 1 target + 2 plausible distractors. An &quot;Anker 65W USB-C Charger&quot; produces <code>{USB-C, Lightning, HDMI}</code>.</li>\n<li>The verifier checks <strong>composite keys</strong> <code>(product_id, variant_id)</code> — correct product but wrong variant means the unit is unmatched.</li>\n</ul>\n<h3>Difficulty scaling</h3>\n<table>\n<thead>\n<tr>\n<th>Axis</th>\n<th>d = 0</th>\n<th>d = 3</th>\n<th>d = 6</th>\n<th>d = 9</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Distinct items</strong></td>\n<td>1</td>\n<td>2</td>\n<td>3</td>\n<td>4</td>\n</tr>\n<tr>\n<td><strong>Variant required</strong></td>\n<td>21%</td>\n<td>66%</td>\n<td>93%</td>\n<td>99%</td>\n</tr>\n<tr>\n<td><strong>Multi-quantity</strong></td>\n<td>0%</td>\n<td>30%</td>\n<td>50%</td>\n<td>50%</td>\n</tr>\n</tbody>\n</table>\n<p>At <code>d = 0</code> the agent adds a single product with no variant complexity — learning the basic <code>catalog.search → cart.add</code> workflow. At <code>d = 6</code> it juggles 3 items, nearly all requiring a specific variant, with half needing qty &gt; 1.</p>\n<h3>Scoring</h3>\n<p>The cart must be exactly right — correct product, correct variant, correct quantity. Partial credit is given for partially correct carts, but a perfect score requires every item to match. If the agent adds the wrong variant, the simulated user corrects it mid-dialogue (<em>&quot;that's the Lightning version, but I need USB-C&quot;</em>), giving the agent a chance to self-correct before the episode ends.</p>\n<h3>Trajectories: easy vs. hard</h3>\n<p>Two real E_CART episodes from a Qwen 3 8B agent. Same environment, same agent — difficulty alone changes the game.</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th><strong>d = 1</strong> — 1 item, no variants</th>\n<th><strong>d = 8</strong> — 3 items, variants + typos</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>User message</strong></td>\n<td><em>&quot;Shopping list: SonicWave Keypad. Please add everything.&quot;</em></td>\n<td><em>&quot;pls add the following to my <strong>aart</strong>: Eco-<strong>Frienly HrenLefa</strong> Charger by GreenLeaf, High-Performance <strong>AqaPure</strong> Air Fryer , <strong>Lighrweiht</strong> PixelVault Tank Top (3).&quot;</em> — typos from noise axis</td>\n</tr>\n<tr>\n<td><strong>Turn 1</strong></td>\n<td><code>user.get_visit_history()</code> → 4 results. Spots the target immediately.</td>\n<td><code>user.get_visit_history()</code> → 9 results. Must disambiguate across chargers, fryers, tops.</td>\n</tr>\n<tr>\n<td><strong>Turn 2</strong></td>\n<td><code>cart.add(&quot;syn_000162&quot;, qty=1)</code> → Cart: 1 item, $2.74. <em>&quot;I found the SonicWave Keypad.&quot;</em> User: <em>&quot;Great, that's the exact one.&quot;</em></td>\n<td>No tool calls — presents 3 product cards. User: <em>&quot;Add the Charger with 100W output, Air Fryer with Charcoal filter, 3 Tank Tops in size XS.&quot;</em></td>\n</tr>\n<tr>\n<td><strong>Turn 3</strong></td>\n<td><code>answer: { &quot;done&quot;: true }</code> — <strong>Done in 3 turns.</strong></td>\n<td><code>catalog.get_variants</code> × 3 → charger: 6 variants (100W, 120W, 30W…), air fryer: 6 (Bamboo, Permanent, <strong>Charcoal</strong>…), tank top: 7 (<strong>XS</strong>, S, XL…). User: <em>&quot;I need three Tank Tops in XS.&quot;</em></td>\n</tr>\n<tr>\n<td><strong>Turn 4</strong></td>\n<td></td>\n<td><code>cart.add(charger, &quot;100W&quot;, qty=1)</code> ✓ <code>cart.add(fryer, &quot;Bamboo&quot;, qty=1)</code> ✗ should be Charcoal. <code>cart.add(tank_top, &quot;size_XL&quot;, qty=3)</code> ✗ should be XS. User: <em>&quot;Air Fryer has Bamboo not Charcoal, Tank Top is XL not XS.&quot;</em></td>\n</tr>\n<tr>\n<td><strong>Turn 5</strong></td>\n<td></td>\n<td>Re-fetches tank top variants, adds 2× XS — <strong>doesn't fix the air fryer</strong>. User: <em>&quot;Air Fryer still shows Bamboo. I need three XS, not two.&quot;</em></td>\n</tr>\n<tr>\n<td><strong>Turn 6</strong></td>\n<td></td>\n<td>Re-fetches tank top variants <em>again</em> — <strong>still ignores the air fryer</strong>. User: <em>&quot;Please change the Air Fryer variant.&quot;</em></td>\n</tr>\n<tr>\n<td><strong>Turn 7</strong></td>\n<td></td>\n<td><em>&quot;I cannot find a Charcoal filter variant.&quot;</em> — It exists; the agent saw it in turn 3 but never selected it. User: <em>&quot;Skip the Air Fryer then.&quot;</em></td>\n</tr>\n<tr>\n<td><strong>Turn 8</strong></td>\n<td></td>\n<td><code>answer: { &quot;done&quot;: true }</code> — Cart still wrong: Charger ✓, Air Fryer (Bamboo) ✗, Tank Top (3×XL + 2×XS) ✗</td>\n</tr>\n<tr>\n<td><strong>Reward</strong></td>\n<td><code>r_task</code> = +1.00, <code>r_eff</code> = +0.33, <code>r_hall</code> = 0.00, <strong>r_total = +0.80</strong> ✓</td>\n<td><code>r_task</code> ≈ 0.00, <code>r_eff</code> = −0.43, <code>r_hall</code> = 0.00, <strong>r_total = −0.06</strong> ✗</td>\n</tr>\n<tr>\n<td><strong>Outcome</strong></td>\n<td>Cart matches goal. 3 turns, 2 effective.</td>\n<td>Wrong variants, wrong quantities, user gave up. 8 turns, 6 effective.</td>\n</tr>\n</tbody>\n</table>\n<p>At d=1 the agent solves the task in 3 clean turns. At d=8 it spirals — picking Bamboo instead of Charcoal, XL instead of XS, never fixing the air fryer despite two user corrections, then hallucinating that the variant doesn't exist. This is exactly the kind of multi-step error cascade that the difficulty curriculum surfaces, and that adaptive training should teach the agent to recover from.</p>\n<h2>User simulation</h2>\n<p>A verifiable environment needs a user simulator that behaves realistically. We use <strong>Qwen3.5 (9.7B)</strong> to generate natural, varied user messages rather than canned templates — covering everything from typo-filled requests to mid-conversation topic switches.</p>\n<p>Two design choices matter for training quality:</p>\n<p><strong>Preferences match stated constraints.</strong> Each simulated user has a hidden set of preferences (price sensitivity, brand loyalty, shipping speed, etc.). These are deliberately biased toward whatever constraints the user communicated — so if the user said &quot;under $25&quot;, the reward function actually cares about price. Without this, an agent could be penalised for correctly following the user's instructions.</p>\n<p><strong>Strategic omission.</strong> The LLM deliberately withholds some constraints from the opening message to force the agent to ask clarifying questions. The system tracks exactly what was and wasn't mentioned, so the agent is never penalised for information it was never given.</p>\n<h2>Environment scaling</h2>\n<p>Following RLVE's methodology, we define nested environment collections:</p>\n<p><strong>C1 ⊂ C2 ⊂ C4 ⊂ C8</strong></p>\n<table>\n<thead>\n<tr>\n<th>Collection</th>\n<th>Environments</th>\n<th>Skills trained</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>C1</strong></td>\n<td>Cart</td>\n<td>Serarch Query Formulation, Cart Manipulation</td>\n</tr>\n<tr>\n<td><strong>C2</strong></td>\n<td>+ Substitution</td>\n<td>Similarity reasoning under constraints</td>\n</tr>\n<tr>\n<td><strong>C4</strong></td>\n<td>+ Product Discovery, Returns</td>\n<td>Transactional workflows (Retrieval + recommendation, return initiation)</td>\n</tr>\n<tr>\n<td><strong>C8</strong></td>\n<td>+ Status, Policy, Bundle, Journey</td>\n<td>Knowledge retrieval, planning, compositionality</td>\n</tr>\n</tbody>\n</table>\n<p>We hypothesise — consistent with RLVE's findings — that C8 agents outperform single-environment specialists, even on the specialist's own task.</p>\n<h2>Early results</h2>\n<p>We trained Qwen 3 8B with DAPO on C1 (Cart Building) for 300 steps as an initial viability study.</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>Config</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Base model</strong></td>\n<td>Qwen 3 8B</td>\n</tr>\n<tr>\n<td><strong>Algorithm</strong></td>\n<td>DAPO (G = 8 rollouts/prompt)</td>\n</tr>\n<tr>\n<td><strong>LR</strong></td>\n<td>1e-5</td>\n</tr>\n<tr>\n<td><strong>Catalog</strong></td>\n<td>2M products, FAISS index with <code>Alibaba-NLP/gte-modernbert-base</code> (768-dim)</td>\n</tr>\n<tr>\n<td><strong>User sim</strong></td>\n<td>Qwen3.5 9.7B</td>\n</tr>\n</tbody>\n</table>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/eWQqFP-PbCJeNsn8klCQZ.png\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/eWQqFP-PbCJeNsn8klCQZ.png\" alt=\"accuracy_levels\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>We saw progressive growth in difficulty reached, confirming that adaptive scheduling produces a steady learning signal rather than the saturation (static-low) or starvation (static-high) patterns predicted by the RLVE paper.</p>\n<h2>Try it yourself</h2>\n<p>Run a live episode directly in your browser using the embedded demo below. Here is how to get started:</p>\n<ol>\n<li><strong>Pick an environment</strong> from the dropdown (e.g., <code>E_CART</code> for cart building or <code>E_PD</code> for product discovery).</li>\n<li><strong>Set a difficulty</strong> — <code>0</code> is a simple single-constraint task; <code>6+</code> introduces missing information, noisy retrieval, and variant selection.</li>\n<li><strong>Click &quot;Reset Episode&quot;</strong> — the simulated user will open with a shopping request.</li>\n<li>You are the agentnow: Make tool calls, analyse outputs and submit the final list of product ids.</li>\n<li>Click <strong>&quot;Reset Episode&quot;</strong> between runs to start a fresh scenario.</li>\n</ol>\n<h2>Resources</h2>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/collections/owlgebra-ai/wufus\"><picture class=\"article-picture article-badge\" style=\"--image-width:160px;--image-ratio:160 / 24\"><img src=\"https://img.shields.io/badge/%F0%9F%A4%97%20Models-WUFUS-blue\" width=\"160\" height=\"24\" alt=\"Models\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/owlgebra-ai/Amazebay-catalog-2M\"><picture class=\"article-picture article-badge\" style=\"--image-width:160px;--image-ratio:160 / 24\"><img src=\"https://img.shields.io/badge/%F0%9F%A4%97%20Catalog%20Data-Amazebay2M-yellow\" width=\"160\" height=\"24\" alt=\"Data\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/owlgebra-ai/EcomRLVE-Gym\"><picture class=\"article-picture article-badge\" style=\"--image-width:160px;--image-ratio:160 / 24\"><img src=\"https://img.shields.io/badge/Github-Code-black\" width=\"160\" height=\"24\" alt=\"Code\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/owlgebra-ai/EcomRLVE-Gym\"><picture class=\"article-picture article-badge\" style=\"--image-width:160px;--image-ratio:160 / 24\"><img src=\"https://img.shields.io/badge/%F0%9F%A4%97-Space-red\" width=\"160\" height=\"24\" alt=\"Demo\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>The environments, verifiers, and training configs are all open-source:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">git</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> clone https://github.com/owlgebra-ai/EcomRLVE-Gym</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-support syntax-function syntax-cd syntax-shell\">cd</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> EcomRLVE-Gym</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">pip</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> install<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>e</span> .</span>\n</span></span></code></pre>\n<p>The 2M-product catalog is on the Hub:</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">datasets</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">load_dataset</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">catalog</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">load_dataset</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">owlgebra-ai/Amazebay-catalog-2M<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">split</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">train<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">print</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-storage syntax-type syntax-string syntax-python\">f</span><span class=\"syntax-meta syntax-string syntax-interpolated syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-interpolated syntax-python\"><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-begin syntax-python\">{</span><span class=\"syntax-source syntax-python syntax-embedded\"><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">len</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">catalog</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span></span></span><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-end syntax-python\">}</span></span><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"> products loaded<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n</span></span></code></pre>\n<h2>References</h2>\n<ol>\n<li>\n<p>Zeng, Z., Ivison, H., Wang, Y., et al. (2025). <em>RLVE: Scaling Up Reinforcement Learning for Language Models with Adaptive Verifiable Environments.</em> ICML 2025. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/abs/2511.07317\">arXiv:2511.07317</a></p>\n</li>\n<li>\n<p>Yu, Q., Zhang, Z., Zhu, R., et al. (2025). <em>DAPO: An Open-Source LLM Reinforcement Learning System at Scale.</em> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/abs/2503.14476\">arXiv:2503.14476</a></p>\n</li>\n<li>\n<p>Shao, Z., Wang, P., Zhu, Q., et al. (2024). <em>DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models.</em> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/abs/2402.03300\">arXiv:2402.03300</a></p>\n</li>\n<li>\n<p>DeepSeek-AI. (2025). <em>DeepSeek-R1: Incentivizing Reasoning in LLMs through Reinforcement Learning.</em> Nature.</p>\n</li>\n<li>\n<p>Meta AI. (2024). <em>Llama 3.1: A Foundation Model for General Intelligence.</em> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://llama.meta.com\">llama.meta.com</a></p>\n</li>\n<li>\n<p>Qwen Team. (2025). <em>Qwen3 Technical Report.</em> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/abs/2505.09388\">arXiv:2505.09388</a></p>\n</li>\n</ol>\n",
  "content_markdown": "> **TL;DR** — We extend the RLVE framework from single-turn reasoning puzzles to **multi-turn, tool-augmented e-commerce conversations**. EcomRLVE-GYM provides 8 verifiable environments — product discovery, substitution, cart building, returns, order tracking, policy QA, bundle planning, and multi-intent journeys — each with procedural problem generation, a 12-axis difficulty curriculum, and algorithmically verifiable rewards. We train a Qwen 3 8B model with DAPO over 300 steps and present early results demonstrating that environment scaling and adaptive difficulty transfer to agentic, real-world task completion.\n\nThis project originated in the [Pytorch OpenEnv Hackathon](https://cerebralvalley.ai/e/openenv-hackathon-sf) and is still evolving, follow us for updates 🔥\n\n## Why RL for shopping agents?\n\nLarge language models can hold fluent conversations, yet deploying them as shopping assistants reveals a persistent gap: **fluency ≠ task completion**. A customer who asks *\"find me a USB-C charger under $25 that ships in two days\"* needs an agent that invokes the right catalog search, filters on three hard constraints, avoids hallucinating product IDs it never retrieved, and handles follow-ups when the top result goes out of stock.\n\nSupervised fine-tuning can teach surface-level tool use from demonstrations, but it cannot scale to the combinatorial space of constraint configurations, partial-information dialogues, and multi-step transactional workflows that real e-commerce demands.\n\nReinforcement learning with verifiable rewards (RLVR) offers an alternative: the agent optimises for *outcomes* — did the products satisfy the constraints? Was the cart correct? Was the return initiated for the right order line? The challenge is constructing reward functions that are both **verifiable** (no LLM-as-a-judge subjectivity) and **adaptive** (difficulty that grows with the policy's capability).\n\n### From RLVE-Gym to EcomRLVE-GYM\n\nRLVE-Gym provides 400 environments for sorting, multiplication, Sudoku, and other algorithmic-reasoning tasks; however, those are all **single-turn, text-in / text-out** puzzles — extending to agentic domains was left as future work.\n\nEcomRLVE-GYM fills that gap: we stay in the **verifiable** regime (e-commerce outcomes *can* be checked algorithmically) while extending to **multi-turn, tool-augmented, agentic** conversations — environments where the agent must *act* (call tools, modify world state) rather than merely *reason* (produce a text answer) and compensates for the deficiency of the search system.\n\nEcomRLVE-GYM transforms customer-service outcomes structurally verifiable:\n\n[![verifiable_signals_dark](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/dA0i6ZB3JDG-rqQtLRCy0.png)](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/dA0i6ZB3JDG-rqQtLRCy0.png)\n\nEvery signal above can be evaluated by a program with access to the hidden ground-truth goal. No human annotation or LLM-as-a-judge is needed.\n\n* * *\n\n## What a training episode looks like\n\nBefore we explain the framework, here is what a single EcomRLVE episode looks like at difficulty `d = 4`. The environment generates a hidden goal, a simulated user opens the chat, and the agent must use tools to satisfy the request. Every action is verified algorithmically — no LLM judge required.\n\n![Sample Episode](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/qDXS-CPl8DT4JN6Uq6nrt.png)\n\nThe reward is fully computed by code: F1 over `(product, variant, qty)` tuples, an efficiency bonus for finishing in fewer turns, and a hallucination check that every recommended product ID was actually retrieved. If the agent had picked the Lightning variant instead of USB-C, the simulated user would have corrected it mid-dialogue — and the F1 would have dropped.\n\n## The eight environments\n\nEach environment covers a distinct real-world shopping scenario. The agent must complete the task using tools (catalog search, cart operations, order lookups, policy queries) and is scored by a program — not a human or another LLM.\n\n| Environment              | What the agent must do                                                                   |\n| ------------------------ | ---------------------------------------------------------------------------------------- |\n| **Product Discovery**    | Find products that satisfy all the user's constraints                                    |\n| **Substitution**         | An item is out of stock — find a similar, compatible alternative                         |\n| **Cart Building**        | Add the exact products, variants, and quantities the user asked for                      |\n| **Return + Replacement** | Identify the right order line, initiate a return, suggest a replacement                  |\n| **Order Tracking**       | Resolve which order the user means and report its current status                         |\n| **Policy QA**            | Answer a deterministic question about store policy (return window, shipping rules, etc.) |\n| **Bundle Planning**      | Recommend a complete shopping list for a project within a budget                         |\n| **Multi-Intent Journey** | Handle a conversation that chains 2–5 of the above tasks in sequence                     |\n\nEvery environment uses the same three-part reward signal:\n\n- **Task reward** — did the agent actually complete the goal? (e.g., were the right products recommended, was the cart correct, was the right order tracked?)\n- **Efficiency reward** — did the agent complete it without wasting turns? Turns the *user* caused (asking a follow-up, confirming an action) don't count against the agent — only turns caused by agent mistakes do.\n- **Hallucination penalty** — did the agent only recommend products it actually retrieved during the session? Recommending product IDs that were never looked up is penalised, so the agent cannot invent results from memory.\n\nInvalid outputs (malformed JSON, illegal tool calls) trigger an immediate failure score, creating a strong incentive for well-formed responses from step one.\n\n## Adaptive difficulty curriculum\n\nA single difficulty number `d` controls 12 independent aspects of a task simultaneously. This is important because e-commerce conversations are hard in many different ways at once — not just along one dimension.\n\n[![Screenshot 2026-03-08 at 11.27.11](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/SALZRvBC6TP1HG1ZxqWsh.png)](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/SALZRvBC6TP1HG1ZxqWsh.png)\n\nHere are four representative difficulty axes:\n\n| What changes                                        | Easy (`d = 0`) | Medium (`d = 6`) | Hard (`d = 12`) |\n| --------------------------------------------------- | -------------- | ---------------- | --------------- |\n| **How many constraints** the user has               | 2              | 5                | 8               |\n| **How often the user omits** a constraint           | 5%             | 70%              | \\~80%           |\n| **Fraction of search results** that are distractors | 0%             | 12%              | 24%             |\n| **Items that go out of stock** mid-conversation     | 0%             | 30%              | 50%             |\n\nThe other eight axes cover turn budget, input noise (typos, slang), context switches, retrieval depth, order-history size, policy complexity, and tool budget. The full breakdown is in the [technical report](https://github.com/owlgebra-ai/EcomRLVE-Gym).\n\n**Adaptive scheduling.** Each environment tracks the agent's success rate independently and only advances to harder problems once the agent is passing the current level reliably. This keeps every environment training at the agent's capability frontier — avoiding both \"too easy to learn from\" and \"too hard to make progress on\".\n\n## Deep dive: Cart Building (E\\_CART)\n\nCart building is a good showcase because it requires the full search → inspect → clarify → act loop, has a binary ground truth, and introduces a challenge absent from most recommendation benchmarks: **variant selection**.\n\nTo succeed, the agent must develop five distinct skills:\n\n| Skill                      | What it means in practice                                                         |\n| -------------------------- | --------------------------------------------------------------------------------- |\n| **Product Discovery**      | Search the catalog with well-formed queries to find the right items               |\n| **Variant Selection**      | Identify the correct color, size, or connector type — not just the right product  |\n| **Cart Management**        | Add items with the exact variant and quantity the user asked for                  |\n| **Clarification Dialogue** | Ask the user a focused follow-up when a request is ambiguous (e.g., missing size) |\n| **Multi-Item Orders**      | Handle shopping lists with several different products in a single conversation    |\n\nThe agent uses six tools to accomplish this:\n\n| Tool                     | What it does                                                            |\n| ------------------------ | ----------------------------------------------------------------------- |\n| `catalog_search`         | Searches the product catalog with a natural-language query              |\n| `catalog_get_variants`   | Returns available variants (color, size, connector, etc.) for a product |\n| `cart_add`               | Adds a product to the cart with a specific variant and quantity         |\n| `cart_view`              | Reads the current cart so the agent can verify it matches the request   |\n| `user_get_visit_history` | Fetches recently viewed products by user                                |\n| `ask_user`               | Sends a clarification question to the customer when a detail is missing |\n\n### The problem\n\nThe generator samples 1–5 target products (scaling in difficulty with `d`), each potentially requiring a specific variant (USB-C vs Lightning, Matte vs Glossy) and a quantity > 1. The agent must:\n\n1. Search the catalog to find each product\n2. Call `catalog.get_variants` to see available options\n3. Add the correct `(product_id, variant_id, qty)` tuples to the cart\n\n### Why variants matter\n\nReal product catalogs have sparse variant data — many products have none, and those that do typically vary only by colour or size. To create a richer discrimination task, we **synthesize variants at episode initialization**:\n\n- A per-category priority list picks the most natural attribute to vary (electronics → `connector_type`; clothing → `size`; kitchen → `material`).\n- For each target product, we generate 3 variants: 1 target + 2 plausible distractors. An \"Anker 65W USB-C Charger\" produces `{USB-C, Lightning, HDMI}`.\n- The verifier checks **composite keys** `(product_id, variant_id)` — correct product but wrong variant means the unit is unmatched.\n\n### Difficulty scaling\n\n| Axis                 | d = 0 | d = 3 | d = 6 | d = 9 |\n| -------------------- | ----- | ----- | ----- | ----- |\n| **Distinct items**   | 1     | 2     | 3     | 4     |\n| **Variant required** | 21%   | 66%   | 93%   | 99%   |\n| **Multi-quantity**   | 0%    | 30%   | 50%   | 50%   |\n\nAt `d = 0` the agent adds a single product with no variant complexity — learning the basic `catalog.search → cart.add` workflow. At `d = 6` it juggles 3 items, nearly all requiring a specific variant, with half needing qty > 1.\n\n### Scoring\n\nThe cart must be exactly right — correct product, correct variant, correct quantity. Partial credit is given for partially correct carts, but a perfect score requires every item to match. If the agent adds the wrong variant, the simulated user corrects it mid-dialogue (*\"that's the Lightning version, but I need USB-C\"*), giving the agent a chance to self-correct before the episode ends.\n\n### Trajectories: easy vs. hard\n\nTwo real E\\_CART episodes from a Qwen 3 8B agent. Same environment, same agent — difficulty alone changes the game.\n\n|                  | **d = 1** — 1 item, no variants                                                                                                 | **d = 8** — 3 items, variants + typos                                                                                                                                                                                    |\n| ---------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| **User message** | *\"Shopping list: SonicWave Keypad. Please add everything.\"*                                                                     | *\"pls add the following to my **aart**: Eco-**Frienly HrenLefa** Charger by GreenLeaf, High-Performance **AqaPure** Air Fryer , **Lighrweiht** PixelVault Tank Top (3).\"* — typos from noise axis                        |\n| **Turn 1**       | `user.get_visit_history()` → 4 results. Spots the target immediately.                                                           | `user.get_visit_history()` → 9 results. Must disambiguate across chargers, fryers, tops.                                                                                                                                 |\n| **Turn 2**       | `cart.add(\"syn_000162\", qty=1)` → Cart: 1 item, $2.74. *\"I found the SonicWave Keypad.\"* User: *\"Great, that's the exact one.\"* | No tool calls — presents 3 product cards. User: *\"Add the Charger with 100W output, Air Fryer with Charcoal filter, 3 Tank Tops in size XS.\"*                                                                            |\n| **Turn 3**       | `answer: { \"done\": true }` — **Done in 3 turns.**                                                                               | `catalog.get_variants` × 3 → charger: 6 variants (100W, 120W, 30W…), air fryer: 6 (Bamboo, Permanent, **Charcoal**…), tank top: 7 (**XS**, S, XL…). User: *\"I need three Tank Tops in XS.\"*                              |\n| **Turn 4**       |                                                                                                                                 | `cart.add(charger, \"100W\", qty=1)` ✓ `cart.add(fryer, \"Bamboo\", qty=1)` ✗ should be Charcoal. `cart.add(tank_top, \"size_XL\", qty=3)` ✗ should be XS. User: *\"Air Fryer has Bamboo not Charcoal, Tank Top is XL not XS.\"* |\n| **Turn 5**       |                                                                                                                                 | Re-fetches tank top variants, adds 2× XS — **doesn't fix the air fryer**. User: *\"Air Fryer still shows Bamboo. I need three XS, not two.\"*                                                                              |\n| **Turn 6**       |                                                                                                                                 | Re-fetches tank top variants *again* — **still ignores the air fryer**. User: *\"Please change the Air Fryer variant.\"*                                                                                                   |\n| **Turn 7**       |                                                                                                                                 | *\"I cannot find a Charcoal filter variant.\"* — It exists; the agent saw it in turn 3 but never selected it. User: *\"Skip the Air Fryer then.\"*                                                                           |\n| **Turn 8**       |                                                                                                                                 | `answer: { \"done\": true }` — Cart still wrong: Charger ✓, Air Fryer (Bamboo) ✗, Tank Top (3×XL + 2×XS) ✗                                                                                                                 |\n| **Reward**       | `r_task` = +1.00, `r_eff` = +0.33, `r_hall` = 0.00, **r\\_total = +0.80** ✓                                                      | `r_task` ≈ 0.00, `r_eff` = −0.43, `r_hall` = 0.00, **r\\_total = −0.06** ✗                                                                                                                                                |\n| **Outcome**      | Cart matches goal. 3 turns, 2 effective.                                                                                        | Wrong variants, wrong quantities, user gave up. 8 turns, 6 effective.                                                                                                                                                    |\n\nAt d=1 the agent solves the task in 3 clean turns. At d=8 it spirals — picking Bamboo instead of Charcoal, XL instead of XS, never fixing the air fryer despite two user corrections, then hallucinating that the variant doesn't exist. This is exactly the kind of multi-step error cascade that the difficulty curriculum surfaces, and that adaptive training should teach the agent to recover from.\n\n## User simulation\n\nA verifiable environment needs a user simulator that behaves realistically. We use **Qwen3.5 (9.7B)** to generate natural, varied user messages rather than canned templates — covering everything from typo-filled requests to mid-conversation topic switches.\n\nTwo design choices matter for training quality:\n\n**Preferences match stated constraints.** Each simulated user has a hidden set of preferences (price sensitivity, brand loyalty, shipping speed, etc.). These are deliberately biased toward whatever constraints the user communicated — so if the user said \"under $25\", the reward function actually cares about price. Without this, an agent could be penalised for correctly following the user's instructions.\n\n**Strategic omission.** The LLM deliberately withholds some constraints from the opening message to force the agent to ask clarifying questions. The system tracks exactly what was and wasn't mentioned, so the agent is never penalised for information it was never given.\n\n## Environment scaling\n\nFollowing RLVE's methodology, we define nested environment collections:\n\n**C1 ⊂ C2 ⊂ C4 ⊂ C8**\n\n| Collection | Environments                       | Skills trained                                                          |\n| ---------- | ---------------------------------- | ----------------------------------------------------------------------- |\n| **C1**     | Cart                               | Serarch Query Formulation, Cart Manipulation                            |\n| **C2**     | \\+ Substitution                    | Similarity reasoning under constraints                                  |\n| **C4**     | \\+ Product Discovery, Returns      | Transactional workflows (Retrieval + recommendation, return initiation) |\n| **C8**     | \\+ Status, Policy, Bundle, Journey | Knowledge retrieval, planning, compositionality                         |\n\nWe hypothesise — consistent with RLVE's findings — that C8 agents outperform single-environment specialists, even on the specialist's own task.\n\n## Early results\n\nWe trained Qwen 3 8B with DAPO on C1 (Cart Building) for 300 steps as an initial viability study.\n\n|                | Config                                                                    |\n| -------------- | ------------------------------------------------------------------------- |\n| **Base model** | Qwen 3 8B                                                                 |\n| **Algorithm**  | DAPO (G = 8 rollouts/prompt)                                              |\n| **LR**         | 1e-5                                                                      |\n| **Catalog**    | 2M products, FAISS index with `Alibaba-NLP/gte-modernbert-base` (768-dim) |\n| **User sim**   | Qwen3.5 9.7B                                                              |\n\n[![accuracy_levels](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/eWQqFP-PbCJeNsn8klCQZ.png)](https://cdn-uploads.huggingface.co/production/uploads/6893dd21467f7d2f5f358a95/eWQqFP-PbCJeNsn8klCQZ.png)\n\nWe saw progressive growth in difficulty reached, confirming that adaptive scheduling produces a steady learning signal rather than the saturation (static-low) or starvation (static-high) patterns predicted by the RLVE paper.\n\n## Try it yourself\n\nRun a live episode directly in your browser using the embedded demo below. Here is how to get started:\n\n1. **Pick an environment** from the dropdown (e.g., `E_CART` for cart building or `E_PD` for product discovery).\n2. **Set a difficulty** — `0` is a simple single-constraint task; `6+` introduces missing information, noisy retrieval, and variant selection.\n3. **Click \"Reset Episode\"** — the simulated user will open with a shopping request.\n4. You are the agentnow: Make tool calls, analyse outputs and submit the final list of product ids.\n5. Click **\"Reset Episode\"** between runs to start a fresh scenario.\n\n## Resources\n\n[![Models](https://img.shields.io/badge/%F0%9F%A4%97%20Models-WUFUS-blue)](https://huggingface.co/collections/owlgebra-ai/wufus) [![Data](https://img.shields.io/badge/%F0%9F%A4%97%20Catalog%20Data-Amazebay2M-yellow)](https://huggingface.co/datasets/owlgebra-ai/Amazebay-catalog-2M) [![Code](https://img.shields.io/badge/Github-Code-black)](https://github.com/owlgebra-ai/EcomRLVE-Gym) [![Demo](https://img.shields.io/badge/%F0%9F%A4%97-Space-red)](https://huggingface.co/spaces/owlgebra-ai/EcomRLVE-Gym)\n\nThe environments, verifiers, and training configs are all open-source:\n\n```bash\ngit clone https://github.com/owlgebra-ai/EcomRLVE-Gym\ncd EcomRLVE-Gym\npip install -e .\n```\n\nThe 2M-product catalog is on the Hub:\n\n```python\nfrom datasets import load_dataset\n\ncatalog = load_dataset(\"owlgebra-ai/Amazebay-catalog-2M\", split=\"train\")\nprint(f\"{len(catalog)} products loaded\")\n```\n\n## References\n\n1. Zeng, Z., Ivison, H., Wang, Y., et al. (2025). *RLVE: Scaling Up Reinforcement Learning for Language Models with Adaptive Verifiable Environments.* ICML 2025. [arXiv:2511.07317](https://arxiv.org/abs/2511.07317)\n\n2. Yu, Q., Zhang, Z., Zhu, R., et al. (2025). *DAPO: An Open-Source LLM Reinforcement Learning System at Scale.* [arXiv:2503.14476](https://arxiv.org/abs/2503.14476)\n\n3. Shao, Z., Wang, P., Zhu, Q., et al. (2024). *DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models.* [arXiv:2402.03300](https://arxiv.org/abs/2402.03300)\n\n4. DeepSeek-AI. (2025). *DeepSeek-R1: Incentivizing Reasoning in LLMs through Reinforcement Learning.* Nature.\n\n5. Meta AI. (2024). *Llama 3.1: A Foundation Model for General Intelligence.* [llama.meta.com](https://llama.meta.com)\n\n6. Qwen Team. (2025). *Qwen3 Technical Report.* [arXiv:2505.09388](https://arxiv.org/abs/2505.09388)\n",
  "dateCreated": "2026-10-19T01:26:53.998049939+00:00",
  "date_created": "2026-04-16T00:00:00+00:00",
  "date_modified": "2026-04-16T00:00:00+00:00",
  "date_published": "2026-04-16T00:00:00+00:00",
  "description": "TL;DR — We extend the RLVE framework from single-turn reasoning puzzles to multi-turn, tool-augmented e-commerce conversations. EcomRLVE-GYM provides 8 verifiable environments — product discovery, substitution, cart building, returns,…",
  "external_url": "https://huggingface.co/blog/ecom-rlve",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/huggingface-co/2026/04/2026-04-16-ecom-rlve-adaptive-verifiable-environments-for-e-commerce.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/huggingface-co/2026/04/2026-04-16-ecom-rlve-adaptive-verifiable-environments-for-e-commerce.md"
  },
  "id": "urn:aggr:item:b7e585bfbc63d08e1b75f91986b65541d7a54752",
  "isBasedOn": {
    "@id": "https://huggingface.co/blog/ecom-rlve"
  },
  "mainEntity": {
    "@id": "https://huggingface.co/blog/ecom-rlve",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-04-16-ecom-rlve-adaptive-verifiable-environments-for-e-commerce/#webpage"
    },
    "dateModified": "2026-04-16T00:00:00+00:00",
    "datePublished": "2026-04-16T00:00:00+00:00",
    "headline": "Ecom-RLVE: Adaptive Verifiable Environments for E-Commerce Conversational Agents",
    "image": {
      "@type": "ImageObject",
      "caption": null,
      "height": 90,
      "url": "https://huggingface.co/blog/assets/ecom-rlve/thumbnail.png",
      "width": 160
    },
    "timeRequired": "PT11M",
    "url": "https://huggingface.co/blog/ecom-rlve",
    "wordCount": 2400
  },
  "name": "Archived snapshot: Ecom-RLVE: Adaptive Verifiable Environments for E-Commerce Conversational Agents",
  "preview": {
    "alt": null,
    "color": null,
    "height": 90,
    "placeholder": {
      "data_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=",
      "hash": ""
    },
    "url": "https://huggingface.co/blog/assets/ecom-rlve/thumbnail.png",
    "width": 160
  },
  "reading_minutes": 11,
  "replicated_at": null,
  "source": "huggingface-co",
  "source_name": "Hugging Face - Blog",
  "summary": null,
  "tags": [],
  "temporalCoverage": "2026-10-19T01:26:53.998049939+00:00",
  "title": "Ecom-RLVE: Adaptive Verifiable Environments for E-Commerce Conversational Agents",
  "url": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-04-16-ecom-rlve-adaptive-verifiable-environments-for-e-commerce/",
  "word_count": 2400
}