StyleWellBackend / README.md
HelloWorld0204's picture
Upload 22 files
ca9045a verified
---
title: Wardrobe Backend API
sdk: gradio
pinned: false
---
# Wardrobe Backend API
Production backend for Wardrobe Assistant, designed to run on Hugging Face Spaces.
The service provides:
- garment classification from uploaded images,
- wardrobe item persistence,
- AI outfit scoring and recommendation,
- shopping suggestion and product URL extraction,
- lightweight feedback capture for preference signals.
The API is built with FastAPI, uses SQLite for persistence, and integrates external AI providers for inference.
## Architecture Summary
- Runtime: FastAPI + Uvicorn
- Storage: SQLite (persistent when `/data` is mounted on Hugging Face)
- Inference: Hugging Face-hosted fine-tuned Qwen model (primary); NVIDIA-hosted chat completions used as fallback (default fallback model: `qwen/qwen3.5-122b-a10b`)
- Retrieval: Web scraping pipeline for product discovery (Nike and Zalando logic in code)
Core modules:
- `app.py`: API routes, orchestration, inference calls, scraper flow
- `db.py`: SQLite schema and CRUD/caching helpers
- `scoring.py`: deterministic fallback scoring logic
- `fashion_ai/`: recommendation service and ranking support
## Repository Contents for Deployment
Upload this backend directory as your Hugging Face Space source (or sync it via Git):
- `app.py`
- `db.py`
- `scoring.py`
- `scraper.py`
- `zalando_scraper.py`
- `requirements.txt`
- `packages.txt`
- `fashion_ai/`
## Hugging Face Deployment
1. Create a new Space.
2. Select `Gradio` SDK.
3. Use CPU hardware (inference is delegated to external APIs).
4. Enable Persistent Storage if you want data durability across restarts.
5. Add the required environment variables.
6. Deploy the backend files.
### Required Environment Variables
- `HF_API_KEY`: API key for the primary Hugging Face-hosted fine-tuned Qwen model.
- `NVIDIA_API_KEY`: API key for the NVIDIA inference fallback.
### Common Optional Environment Variables
Inference and reliability:
- `HF_MODEL_ID` (default: your fine-tuned Qwen model on Hugging Face)
- `HF_INVOKE_URL` (default: Hugging Face Inference API endpoint for the fine-tuned model)
- `NVIDIA_MODEL_ID` (fallback; default: `qwen/qwen3.5-122b-a10b`)
- `NVIDIA_INVOKE_URL` (fallback; default: `https://integrate.api.nvidia.com/v1/chat/completions`)
- `OPENAI_MODEL_ID` (secondary fallback; OpenAI-compatible model ID if both primary and NVIDIA fallback are unavailable)
- `OPENAI_API_KEY` (secondary fallback; required only if OpenAI fallback is enabled)
- `NVIDIA_MAX_TOKENS` (default: `16384`)
- `NVIDIA_REASONING_MAX_TOKENS` (default: `16384`)
- `NVIDIA_TEMPERATURE` (default: `0.60`)
- `NVIDIA_TOP_P` (default: `0.95`)
- `NVIDIA_TIMEOUT_SECONDS` (default: `180`)
- `NVIDIA_MAX_RETRIES` (default: `3`)
- `NVIDIA_RETRY_BACKOFF_SECONDS` (default: `0.8`)
- `NVIDIA_ENABLE_THINKING` (default: `false`)
- `NVIDIA_FALLBACK_MODEL_IDS` (comma-separated fallback list)
Matching and cache:
- `MATCHING_RESULT_CACHE_MAX` (default: `500`)
- `MATCHING_RESULT_CACHE_TTL_SECONDS` (default: `86400`)
Scraper and planner:
- `SCRAPER_DEFAULT_STORE` (default: `nike`)
- `SCRAPER_PLANNER_MODEL_ID` (default: `nvidia/nemotron-3-nano-omni-30b-a3b-reasoning`)
- `SCRAPER_PLANNER_MAX_TOKENS` (default: `800`)
Database path:
- `DB_PATH` (optional override)
When `DB_PATH` is not provided, the app uses:
- `/data/wardrobe.db` if `/data` exists,
- otherwise `./wardrobe.db`.
## Inference Priority
The service resolves inference providers in the following order:
1. **Primary** - Fine-tuned Qwen model hosted on Hugging Face (`HF_MODEL_ID`).
2. **Fallback 1** - NVIDIA-hosted chat completions (`NVIDIA_MODEL_ID`, default: `qwen/qwen3.5-122b-a10b`). Used when the primary model is unavailable or returns an error.
3. **Fallback 2** - OpenAI-compatible model (`OPENAI_MODEL_ID`). Used when both the primary and NVIDIA fallback are unavailable.
AI-powered routes return a service-level error only when all three providers are exhausted or unconfigured.
## API Endpoints
Health and service metadata:
- `GET /`
- `GET /health`
Wardrobe ingestion and CRUD:
- `POST /classify`
- `POST /upload`
- `GET /items`
- `PUT /items/{item_id}`
- `DELETE /items/{item_id}`
Outfit intelligence:
- `POST /ai/score-outfit`
- `POST /ai/gap-analysis`
- `POST /ai/recommend-outfits`
- `POST /feedback`
Shopping and scraping:
- `POST /product-urls`
- `POST /suggestions`
- `POST /api/suggestions`
- `POST /scraper/recommend`
- `GET /scraper`
- `GET /image-proxy`
## Local Development
### 1. Install dependencies
```bash
pip install -r requirements.txt
```
### 2. Export environment variables
Linux/macOS:
```bash
export HF_API_KEY=""
export NVIDIA_API_KEY="" # fallback
export OPENAI_API_KEY="" # secondary fallback, optional
```
Windows PowerShell:
```powershell
$env:HF_API_KEY = ""
$env:NVIDIA_API_KEY = "" # fallback
$env:OPENAI_API_KEY = "" # secondary fallback, optional
```
### 3. Run the API
```bash
python app.py
```
The service starts on `http://0.0.0.0:7860`.
## Smoke Checks
Health:
```bash
curl "http://127.0.0.1:7860/health"
```
Image classification:
```bash
curl -X POST "http://127.0.0.1:7860/classify" \
-F "image=@/path/to/garment.jpg"
```
Expected post-deploy health signal:
- `hf_api_configured` should be `"True"` (primary model).
- `nvidia_api_configured` should be `"True"` (fallback model).