commerce-ops-agent / README.md
vishinvents's picture
Add commerce-ops agent demo: two trained tasks + guardrail validation
6a47b9d verified
|
Raw
History Blame Contribute Delete
2.13 kB
---
title: Commerce Ops Agent
emoji: 📈
colorFrom: yellow
colorTo: indigo
sdk: gradio
sdk_version: 6.20.0
python_version: '3.13'
app_file: app.py
pinned: false
short_description: Guarded operation planning for e-commerce stores
models:
- SkyAsl/Qwen3.5-9B-com-agent
---
# Commerce Operations Agent — Demo
Interactive demo for [`SkyAsl/Qwen3.5-9B-com-agent`](https://huggingface.co/SkyAsl/Qwen3.5-9B-com-agent),
a LoRA adapter on `Qwen/Qwen3.5-9B` fine-tuned for **structured e-commerce operations**.
It is a **structured-JSON transducer**, not a chat model. It performs exactly two tasks:
| Task | Question it answers | Output |
|---|---|---|
| `capability_advice` | "What operational work can I monitor for this store?" | recommended operations + reasons |
| `operation_plan` | "Given these candidates, which do I act on?" | selected operations + priority + rationale |
## Why the guardrail panel matters
The model is trained to **only** select operations that appear in `enabled_operations`, and to
**only** reference `candidate_id`s that were supplied in the input. The demo validates every
response against those constraints and shows the result, so you can see the model *decline to act*
when an operation is not enabled — the interesting behaviour, not just the happy path.
Use the **"guardrail (should decline)"** preset on the Operation plan tab: the candidate is
urgent (zero stock, well below reorder point) but its operation is not enabled, so the correct
answer is an empty operation list.
## Notes for running it
- **Hardware:** the base model is ~9B params, so this needs a GPU. On `cpu-basic` it will not fit
in memory. Set the Space hardware to **ZeroGPU** (or a paid GPU tier).
- **Thinking mode is disabled deliberately.** The base `Qwen3.5` chat template injects a `<think>`
block on generation. This adapter was trained on assistant turns that are *pure JSON with no
thinking blocks*, so the app passes `enable_thinking=False`. Leaving it on produces malformed output.
- **Sampling is greedy** (`do_sample=False`) because the task is structured extraction, not
creative generation.