{"repo": "attilio81/erpclaw", "files": {"README.md": {"1774534dac351c116a64f5f460626aa07b494718": {"t": 1785746495.4267678, "n": 13254, "h": "f178439bdb15fbfb", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (LM Studio in locale o DeepSeek cloud, via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (LM Studio / DeepSeek) → ERPTools → erp.db\n ↑ APScheduler (reminder CRM ogni 1m) → LogisticaTools → erp.db\n → CrmTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n![Bot Telegram](telegram.png)\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, indirizzi multi-tipo, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Ordini clienti** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Ordini fornitori** — creazione e gestione ordini di acquisto (`bozza → inviato → ricevuto`) con prezzo di acquisto per articolo\n- **Prezzi duali** — ogni articolo ha `prezzo_vendita` (ai clienti) e `prezzo_acquisto` (dai fornitori)\n- **Categorie articoli** — gestite dall'agente AI (`crea_categoria`, `assegna_categoria`, `lista_categorie`)\n- **Scorta minima** — soglia per articolo; alert automatico per il riordino (`articoli_sotto_scorta_minima`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Dashboard agenti** — visualizzazione e gestione del team AI in stile n8n (`/agents`)\n- **Pannello configurazione** — modifica il file `.env` dal browser senza aprirlo (`/config`)\n- **Chat web** — interagisce con l'agente AI direttamente dal browser, senza Telegram (`/chat`)\n- **CRM** — gestione visite, chiamate, email per cliente; agenda giornaliera/settimanale; note libere; storico completo per cliente; reminder automatici 60 min prima via Telegram con link Google Maps\n- **Calendario CRM** — vista mensile a griglia con badge colorati per tipo evento; creazione rapida dal giorno; dettaglio e azioni (completa/annulla) su singolo evento (`/crm`)\n- **Homepage** — menu centrale con accesso rapido a tutte le sezioni (`/`)\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Homepage\n\nMenu centrale con accesso rapido a tutte le sezioni del pannello web.\n\n![Homepage](home.png)\n\nAccessibile su **`http://localhost:5173/`** (dev) o **`http://localhost:8000/`** (produzione)\n\n---\n\n## Dashboard Agenti\n\nDashboard visuale in stile **n8n** per visualizzare e modificare il team di agenti AI in tempo reale. Costruita con **React + @xyflow/react**.\n\n![Agent Dashboard](Dashboard.png)\n\nAccessibile su **`http://localhost:5173/agents`** (dev) o **`http://localhost:8000/agents`** (produzione)\n\n### Caratteristiche\n\n- **Canvas interattivo** — ogni componente (Team, Agenti, Tool, Memory Manager) è un nodo colorato con connessioni animate (@xyflow/react)\n- **Drag & drop** — riorganizza i nodi trascinandoli sulla canvas\n- **Modifica in tempo reale** — doppio click su un nodo per aprire l'editor laterale (shadcn Sheet)\n- **Salvataggio persistente** — la configurazione viene salvata in `agent_config.json` via API PUT\n- **Ricarica a caldo** — applica le modifiche senza riavviare il server\n- **Minimap** — visualizzazione compatta dell'intera topologia dell'agente\n\n### Nodi visualizzati\n\n| Nodo | Colore | Contenuto |\n|------|--------|-----------|\n| Team ERPClaw | Rosso | Prompt principale, tools, membri, history |\n| Agenti (es. RicercaFornitore) | Viola | Ruolo, instructions, thinking on/off |\n| Tool (ERPTools, LogisticaTools, ecc.) | Blu | Descrizione, lista metodi |\n| Memory Manager | Verde | Istruzioni di cattura memoria |\n\n## Chat Web\n\nInterfaccia chat integrata nel pannello web per interagire con l'agente AI direttamente dal browser, senza Telegram.\n\n![Chat Web](chat.png)\n\nAccessibile su **`http://localhost:5173/chat`** (dev) o **`http://localhost:8000/chat`** (produzione)\n\n---\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | LM Studio (locale) o DeepSeek cloud — configurabile via `.env` |\n| Modello consigliato | Qwen3.5-9B (LM Studio) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Reminder CRM | APScheduler (AsyncIOScheduler, polling ogni minuto) |\n| Frontend SPA (admin) | Vite 6 + React 19 + TypeScript 5 + Tailwind CSS 4 + shadcn/ui + @xyflow/react |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key OpenAI (solo per i messaggi vocali)\n- **LM Studio** (locale, consigliato) oppure API key DeepSeek (cloud)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nALLOWED_CHAT_ID=... # tuo Telegram numeric user ID\nOPENAI_API_KEY=... # solo per messaggi vocali\n\n# Modello locale (default):\nLLM_PROVIDER=lmstudio\nLLM_MODEL_ID=qwen/qwen3.5-9b\nLMSTUDIO_BASE_URL=http://localhost:1234/v1\n\n# Oppure DeepSeek cloud:\n# LLM_PROVIDER=deepseek\n# LLM_MODEL_ID=deepseek-reasoner\n# DEEPSEEK_API_KEY=...\n\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il backend FastAPI (admin CRUD + shop + API JSON)\nuv run uvicorn erpclaw.web:app --reload\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n\n# Avvia il frontend React in modalità sviluppo (proxy verso FastAPI :8000)\ncd frontend && npm install # solo la prima volta\nnpm run dev\n# → http://localhost:5173\n# → Home: http://localhost:5173/\n# → Dashboard: http://localhost:5173/agents\n# → Config: http://localhost:5173/config\n# → Chat: http://localhost:5173/chat\n# → CRM: http://localhost:5173/crm\n\n# Avvia tutto insieme (Windows) — bot + backend + frontend React\nstart.bat\n\n# Azzera e rigenera i database\nreset_db.bat\n```\n\n> **LM Studio:** avvia il server locale prima di lanciare il bot. Vedi `docs/lmstudio-settings.md` per le impostazioni consigliate.\n\n> **Build produzione:** `cd frontend && npm run build` — scrive in `frontend/dist/`. FastAPI serve automaticamente la SPA su `http://localhost:8000/`.\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── agent_config.py # gestione configurazione agenti (JSON)\n├── agents_dashboard.py # API JSON agenti (/agents/api/*)\n├── config_panel.py # API JSON configurazione .env (/config/api)\n├── chat.py # API JSON chat (/chat/api/*)\n├── crm.py # API JSON CRM (/crm/api/*)\n├── crm_tools.py # tool CRM agno (eventi, note, agenda, storico)\n├── bot.py # bot Telegram (testo + voce) + APScheduler reminder CRM\n├── web.py # FastAPI: admin + shop + SPA catch-all\n├── shop.py # portale ordini clienti (/shop, HTMX)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, categorie, clienti, ordini, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env (LLM_PROVIDER, LLM_MODEL_ID, ecc.)\n└── templates/\n └── shop/ # template Jinja2 portale shop\n\nfrontend/ # React SPA (Vite + TypeScript + shadcn/ui)\n├── src/\n│ ├── pages/ # Home, AgentDashboard, ConfigPanel, Chat, CrmCalendar\n│ ├── components/\n│ │ ├── layout/ # Sidebar, TopBar\n│ │ ├── agents/ # nodi xyflow + NodeEditSheet + flowUtils\n│ │ └── config/ # EnvSection\n│ └── lib/ # types.ts, api.ts\n├── package.json\n└── vite.config.ts # proxy /agents /config /chat /crm /admin → :8000\n\nagent_config.json # configurazione agenti (default incluso nel repo)\ntests/ # suite pytest (SQLite in-memory)\ndocs/\n├── lmstudio-settings.md # impostazioni consigliate LM Studio\n└── superpowers/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nreset_db.bat # azzera e rigenera i database\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `categorie`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini clienti | `ordini`, `righe_ordine` |\n| Ordini fornitori | `ordini_fornitori`, `righe_ordini_fornitori` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n| CRM | `eventi_crm`, `note_crm` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n4. Per parametri numerici che il modello potrebbe passare come int (es. CAP), usa `Union[str, int]`\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "7c46d512558fde1f55ae8451a2723e22e339ca63": {"t": 1785764953.1921804, "n": 12463, "h": "7544c65beab85f76", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (LM Studio in locale o DeepSeek cloud, via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (LM Studio / DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n![Bot Telegram](telegram.png)\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, indirizzi multi-tipo, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Ordini clienti** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Ordini fornitori** — creazione e gestione ordini di acquisto (`bozza → inviato → ricevuto`) con prezzo di acquisto per articolo\n- **Prezzi duali** — ogni articolo ha `prezzo_vendita` (ai clienti) e `prezzo_acquisto` (dai fornitori)\n- **Categorie articoli** — gestite dall'agente AI (`crea_categoria`, `assegna_categoria`, `lista_categorie`)\n- **Scorta minima** — soglia per articolo; alert automatico per il riordino (`articoli_sotto_scorta_minima`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Dashboard agenti** — visualizzazione e gestione del team AI in stile n8n (`/agents`)\n- **Pannello configurazione** — modifica il file `.env` dal browser senza aprirlo (`/config`)\n- **Chat web** — interagisce con l'agente AI direttamente dal browser, senza Telegram (`/chat`)\n- **Homepage** — menu centrale con accesso rapido a tutte le sezioni (`/`)\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Homepage\n\nMenu centrale con accesso rapido a tutte le sezioni del pannello web.\n\n![Homepage](home.png)\n\nAccessibile su **`http://localhost:5173/`** (dev) o **`http://localhost:8000/`** (produzione)\n\n---\n\n## Dashboard Agenti\n\nDashboard visuale in stile **n8n** per visualizzare e modificare il team di agenti AI in tempo reale. Costruita con **React + @xyflow/react**.\n\n![Agent Dashboard](Dashboard.png)\n\nAccessibile su **`http://localhost:5173/agents`** (dev) o **`http://localhost:8000/agents`** (produzione)\n\n### Caratteristiche\n\n- **Canvas interattivo** — ogni componente (Team, Agenti, Tool, Memory Manager) è un nodo colorato con connessioni animate (@xyflow/react)\n- **Drag & drop** — riorganizza i nodi trascinandoli sulla canvas\n- **Modifica in tempo reale** — doppio click su un nodo per aprire l'editor laterale (shadcn Sheet)\n- **Salvataggio persistente** — la configurazione viene salvata in `agent_config.json` via API PUT\n- **Ricarica a caldo** — applica le modifiche senza riavviare il server\n- **Minimap** — visualizzazione compatta dell'intera topologia dell'agente\n\n### Nodi visualizzati\n\n| Nodo | Colore | Contenuto |\n|------|--------|-----------|\n| Team ERPClaw | Rosso | Prompt principale, tools, membri, history |\n| Agenti (es. RicercaFornitore) | Viola | Ruolo, instructions, thinking on/off |\n| Tool (ERPTools, LogisticaTools, ecc.) | Blu | Descrizione, lista metodi |\n| Memory Manager | Verde | Istruzioni di cattura memoria |\n\n## Chat Web\n\nInterfaccia chat integrata nel pannello web per interagire con l'agente AI direttamente dal browser, senza Telegram.\n\n![Chat Web](chat.png)\n\nAccessibile su **`http://localhost:5173/chat`** (dev) o **`http://localhost:8000/chat`** (produzione)\n\n---\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | LM Studio (locale) o DeepSeek cloud — configurabile via `.env` |\n| Modello consigliato | Qwen3.5-9B (LM Studio) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Frontend SPA (admin) | Vite 6 + React 19 + TypeScript 5 + Tailwind CSS 4 + shadcn/ui + @xyflow/react |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key OpenAI (solo per i messaggi vocali)\n- **LM Studio** (locale, consigliato) oppure API key DeepSeek (cloud)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nALLOWED_CHAT_ID=... # tuo Telegram numeric user ID\nOPENAI_API_KEY=... # solo per messaggi vocali\n\n# Modello locale (default):\nLLM_PROVIDER=lmstudio\nLLM_MODEL_ID=qwen/qwen3.5-9b\nLMSTUDIO_BASE_URL=http://localhost:1234/v1\n\n# Oppure DeepSeek cloud:\n# LLM_PROVIDER=deepseek\n# LLM_MODEL_ID=deepseek-reasoner\n# DEEPSEEK_API_KEY=...\n\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il backend FastAPI (admin CRUD + shop + API JSON)\nuv run uvicorn erpclaw.web:app --reload\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n\n# Avvia il frontend React in modalità sviluppo (proxy verso FastAPI :8000)\ncd frontend && npm install # solo la prima volta\nnpm run dev\n# → http://localhost:5173\n# → Home: http://localhost:5173/\n# → Dashboard: http://localhost:5173/agents\n# → Config: http://localhost:5173/config\n# → Chat: http://localhost:5173/chat\n\n# Avvia tutto insieme (Windows) — bot + backend + frontend React\nstart.bat\n\n# Azzera e rigenera i database\nreset_db.bat\n```\n\n> **LM Studio:** avvia il server locale prima di lanciare il bot. Vedi `docs/lmstudio-settings.md` per le impostazioni consigliate.\n\n> **Build produzione:** `cd frontend && npm run build` — scrive in `frontend/dist/`. FastAPI serve automaticamente la SPA su `http://localhost:8000/`.\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── agent_config.py # gestione configurazione agenti (JSON)\n├── agents_dashboard.py # API JSON agenti (/agents/api/*)\n├── config_panel.py # API JSON configurazione .env (/config/api)\n├── chat.py # API JSON chat (/chat/api/*)\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # FastAPI: admin + shop + SPA catch-all\n├── shop.py # portale ordini clienti (/shop, HTMX)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, categorie, clienti, ordini, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env (LLM_PROVIDER, LLM_MODEL_ID, ecc.)\n└── templates/\n └── shop/ # template Jinja2 portale shop\n\nfrontend/ # React SPA (Vite + TypeScript + shadcn/ui)\n├── src/\n│ ├── pages/ # Home, AgentDashboard, ConfigPanel, Chat\n│ ├── components/\n│ │ ├── layout/ # Sidebar, TopBar\n│ │ ├── agents/ # nodi xyflow + NodeEditSheet + flowUtils\n│ │ └── config/ # EnvSection\n│ └── lib/ # types.ts, api.ts\n├── package.json\n└── vite.config.ts # proxy /agents /config /chat /admin → :8000\n\nagent_config.json # configurazione agenti (default incluso nel repo)\ntests/ # suite pytest (SQLite in-memory)\ndocs/\n├── lmstudio-settings.md # impostazioni consigliate LM Studio\n└── superpowers/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nreset_db.bat # azzera e rigenera i database\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `categorie`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini clienti | `ordini`, `righe_ordine` |\n| Ordini fornitori | `ordini_fornitori`, `righe_ordini_fornitori` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n4. Per parametri numerici che il modello potrebbe passare come int (es. CAP), usa `Union[str, int]`\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "5f87c0e2882d82552932df0c69c38ecb71ffbd6d": {"t": 1785764955.2771912, "n": 12444, "h": "f644b526b02d23b6", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (LM Studio in locale o DeepSeek cloud, via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (LM Studio / DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n![Bot Telegram](telegram.png)\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini clienti** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Ordini fornitori** — creazione e gestione ordini di acquisto (`bozza → inviato → ricevuto`) con prezzo di acquisto per articolo\n- **Prezzi duali** — ogni articolo ha `prezzo_vendita` (ai clienti) e `prezzo_acquisto` (dai fornitori)\n- **Categorie articoli** — gestite dall'agente AI (`crea_categoria`, `assegna_categoria`, `lista_categorie`)\n- **Scorta minima** — soglia per articolo; alert automatico per il riordino (`articoli_sotto_scorta_minima`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Dashboard agenti** — visualizzazione e gestione del team AI in stile n8n (`/agents`)\n- **Pannello configurazione** — modifica il file `.env` dal browser senza aprirlo (`/config`)\n- **Chat web** — interagisce con l'agente AI direttamente dal browser, senza Telegram (`/chat`)\n- **Homepage** — menu centrale con accesso rapido a tutte le sezioni (`/`)\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Homepage\n\nMenu centrale con accesso rapido a tutte le sezioni del pannello web.\n\n![Homepage](home.png)\n\nAccessibile su **`http://localhost:8000/`**\n\n---\n\n## Dashboard Agenti\n\nDashboard visuale in stile **n8n** per visualizzare e modificare il team di agenti AI in tempo reale. Costruita con **React + @xyflow/react**.\n\n![Agent Dashboard](Dashboard.png)\n\nAccessibile su **`http://localhost:5173/agents`** (dev) o **`http://localhost:8000/agents`** (produzione)\n\n### Caratteristiche\n\n- **Canvas interattivo** — ogni componente (Team, Agenti, Tool, Memory Manager) è un nodo colorato con connessioni animate (@xyflow/react)\n- **Drag & drop** — riorganizza i nodi trascinandoli sulla canvas\n- **Modifica in tempo reale** — doppio click su un nodo per aprire l'editor laterale (shadcn Sheet)\n- **Salvataggio persistente** — la configurazione viene salvata in `agent_config.json` via API PUT\n- **Ricarica a caldo** — applica le modifiche senza riavviare il server\n- **Minimap** — visualizzazione compatta dell'intera topologia dell'agente\n\n### Nodi visualizzati\n\n| Nodo | Colore | Contenuto |\n|------|--------|-----------|\n| Team ERPClaw | Rosso | Prompt principale, tools, membri, history |\n| Agenti (es. RicercaFornitore) | Viola | Ruolo, instructions, thinking on/off |\n| Tool (ERPTools, LogisticaTools, ecc.) | Blu | Descrizione, lista metodi |\n| Memory Manager | Verde | Istruzioni di cattura memoria |\n\n## Chat Web\n\nInterfaccia chat integrata nel pannello web per interagire con l'agente AI direttamente dal browser, senza Telegram.\n\n![Chat Web](chat.png)\n\nAccessibile su **`http://localhost:5173/chat`** (dev) o **`http://localhost:8000/chat`** (produzione)\n\n---\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | LM Studio (locale) o DeepSeek cloud — configurabile via `.env` |\n| Modello consigliato | Qwen3.5-9B (LM Studio) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Frontend SPA (admin) | Vite 6 + React 19 + TypeScript 5 + Tailwind CSS 4 + shadcn/ui + @xyflow/react |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key OpenAI (solo per i messaggi vocali)\n- **LM Studio** (locale, consigliato) oppure API key DeepSeek (cloud)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nALLOWED_CHAT_ID=... # tuo Telegram numeric user ID\nOPENAI_API_KEY=... # solo per messaggi vocali\n\n# Modello locale (default):\nLLM_PROVIDER=lmstudio\nLLM_MODEL_ID=qwen/qwen3.5-9b\nLMSTUDIO_BASE_URL=http://localhost:1234/v1\n\n# Oppure DeepSeek cloud:\n# LLM_PROVIDER=deepseek\n# LLM_MODEL_ID=deepseek-reasoner\n# DEEPSEEK_API_KEY=...\n\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il backend FastAPI (admin CRUD + shop + API JSON)\nuv run uvicorn erpclaw.web:app --reload\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n\n# Avvia il frontend React in modalità sviluppo (proxy verso FastAPI :8000)\ncd frontend && npm install # solo la prima volta\nnpm run dev\n# → http://localhost:5173\n# → Home: http://localhost:5173/\n# → Dashboard: http://localhost:5173/agents\n# → Config: http://localhost:5173/config\n# → Chat: http://localhost:5173/chat\n\n# Avvia tutto insieme (Windows) — bot + backend + frontend React\nstart.bat\n\n# Azzera e rigenera i database\nreset_db.bat\n```\n\n> **LM Studio:** avvia il server locale prima di lanciare il bot. Vedi `docs/lmstudio-settings.md` per le impostazioni consigliate.\n\n> **Build produzione:** `cd frontend && npm run build` — scrive in `frontend/dist/`. FastAPI serve automaticamente la SPA su `http://localhost:8000/`.\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── agent_config.py # gestione configurazione agenti (JSON)\n├── agents_dashboard.py # API JSON agenti (/agents/api/*)\n├── config_panel.py # API JSON configurazione .env (/config/api)\n├── chat.py # API JSON chat (/chat/api/*)\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # FastAPI: admin + shop + SPA catch-all\n├── shop.py # portale ordini clienti (/shop, HTMX)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, categorie, clienti, ordini, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env (LLM_PROVIDER, LLM_MODEL_ID, ecc.)\n└── templates/\n └── shop/ # template Jinja2 portale shop\n\nfrontend/ # React SPA (Vite + TypeScript + shadcn/ui)\n├── src/\n│ ├── pages/ # Home, AgentDashboard, ConfigPanel, Chat\n│ ├── components/\n│ │ ├── layout/ # Sidebar, TopBar\n│ │ ├── agents/ # nodi xyflow + NodeEditSheet + flowUtils\n│ │ └── config/ # EnvSection\n│ └── lib/ # types.ts, api.ts\n├── package.json\n└── vite.config.ts # proxy /agents /config /chat /admin → :8000\n\nagent_config.json # configurazione agenti (generato al primo avvio)\ntests/ # suite pytest (SQLite in-memory)\ndocs/\n├── lmstudio-settings.md # impostazioni consigliate LM Studio\n└── superpowers/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nreset_db.bat # azzera e rigenera i database\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `categorie`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini clienti | `ordini`, `righe_ordine` |\n| Ordini fornitori | `ordini_fornitori`, `righe_ordini_fornitori` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n4. Per parametri numerici che il modello potrebbe passare come int (es. CAP), usa `Union[str, int]`\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "bffef705dc7bb1b5f8cef8f5f021a096d3567f78": {"t": 1785764958.0975802, "n": 12055, "h": "30cdf813c8a69ac2", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (LM Studio in locale o DeepSeek cloud, via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (LM Studio / DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini clienti** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Ordini fornitori** — creazione e gestione ordini di acquisto (`bozza → inviato → ricevuto`) con prezzo di acquisto per articolo\n- **Prezzi duali** — ogni articolo ha `prezzo_vendita` (ai clienti) e `prezzo_acquisto` (dai fornitori)\n- **Categorie articoli** — gestite dall'agente AI (`crea_categoria`, `assegna_categoria`, `lista_categorie`)\n- **Scorta minima** — soglia per articolo; alert automatico per il riordino (`articoli_sotto_scorta_minima`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Dashboard agenti** — visualizzazione e gestione del team AI in stile n8n (`/agents`)\n- **Pannello configurazione** — modifica il file `.env` dal browser senza aprirlo (`/config`)\n- **Homepage** — menu centrale con accesso rapido a tutte le sezioni (`/`)\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Homepage\n\nMenu centrale con accesso rapido a tutte le sezioni del pannello web.\n\n![Homepage](home.png)\n\nAccessibile su **`http://localhost:8000/`**\n\n---\n\n## Dashboard Agenti\n\nDashboard visuale in stile **n8n** per visualizzare e modificare il team di agenti AI in tempo reale. Costruita con **React + @xyflow/react**.\n\n![Agent Dashboard](Dashboard.png)\n\nAccessibile su **`http://localhost:5173/agents`** (dev) o **`http://localhost:8000/agents`** (produzione)\n\n### Caratteristiche\n\n- **Canvas interattivo** — ogni componente (Team, Agenti, Tool, Memory Manager) è un nodo colorato con connessioni animate (@xyflow/react)\n- **Drag & drop** — riorganizza i nodi trascinandoli sulla canvas\n- **Modifica in tempo reale** — doppio click su un nodo per aprire l'editor laterale (shadcn Sheet)\n- **Salvataggio persistente** — la configurazione viene salvata in `agent_config.json` via API PUT\n- **Ricarica a caldo** — applica le modifiche senza riavviare il server\n- **Minimap** — visualizzazione compatta dell'intera topologia dell'agente\n\n### Nodi visualizzati\n\n| Nodo | Colore | Contenuto |\n|------|--------|-----------|\n| Team ERPClaw | Rosso | Prompt principale, tools, membri, history |\n| Agenti (es. RicercaFornitore) | Viola | Ruolo, instructions, thinking on/off |\n| Tool (ERPTools, LogisticaTools, ecc.) | Blu | Descrizione, lista metodi |\n| Memory Manager | Verde | Istruzioni di cattura memoria |\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | LM Studio (locale) o DeepSeek cloud — configurabile via `.env` |\n| Modello consigliato | Qwen3.5-9B (LM Studio) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Frontend SPA (admin) | Vite 6 + React 19 + TypeScript 5 + Tailwind CSS 4 + shadcn/ui + @xyflow/react |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key OpenAI (solo per i messaggi vocali)\n- **LM Studio** (locale, consigliato) oppure API key DeepSeek (cloud)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nALLOWED_CHAT_ID=... # tuo Telegram numeric user ID\nOPENAI_API_KEY=... # solo per messaggi vocali\n\n# Modello locale (default):\nLLM_PROVIDER=lmstudio\nLLM_MODEL_ID=qwen/qwen3.5-9b\nLMSTUDIO_BASE_URL=http://localhost:1234/v1\n\n# Oppure DeepSeek cloud:\n# LLM_PROVIDER=deepseek\n# LLM_MODEL_ID=deepseek-reasoner\n# DEEPSEEK_API_KEY=...\n\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il backend FastAPI (admin CRUD + shop + API JSON)\nuv run uvicorn erpclaw.web:app --reload\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n\n# Avvia il frontend React in modalità sviluppo (proxy verso FastAPI :8000)\ncd frontend && npm install # solo la prima volta\nnpm run dev\n# → http://localhost:5173\n# → Home: http://localhost:5173/\n# → Dashboard: http://localhost:5173/agents\n# → Config: http://localhost:5173/config\n# → Chat: http://localhost:5173/chat\n\n# Avvia tutto insieme (Windows) — bot + backend + frontend React\nstart.bat\n\n# Azzera e rigenera i database\nreset_db.bat\n```\n\n> **LM Studio:** avvia il server locale prima di lanciare il bot. Vedi `docs/lmstudio-settings.md` per le impostazioni consigliate.\n\n> **Build produzione:** `cd frontend && npm run build` — scrive in `frontend/dist/`. FastAPI serve automaticamente la SPA su `http://localhost:8000/`.\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── agent_config.py # gestione configurazione agenti (JSON)\n├── agents_dashboard.py # API JSON agenti (/agents/api/*)\n├── config_panel.py # API JSON configurazione .env (/config/api)\n├── chat.py # API JSON chat (/chat/api/*)\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # FastAPI: admin + shop + SPA catch-all\n├── shop.py # portale ordini clienti (/shop, HTMX)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, categorie, clienti, ordini, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env (LLM_PROVIDER, LLM_MODEL_ID, ecc.)\n└── templates/\n └── shop/ # template Jinja2 portale shop\n\nfrontend/ # React SPA (Vite + TypeScript + shadcn/ui)\n├── src/\n│ ├── pages/ # Home, AgentDashboard, ConfigPanel, Chat\n│ ├── components/\n│ │ ├── layout/ # Sidebar, TopBar\n│ │ ├── agents/ # nodi xyflow + NodeEditSheet + flowUtils\n│ │ └── config/ # EnvSection\n│ └── lib/ # types.ts, api.ts\n├── package.json\n└── vite.config.ts # proxy /agents /config /chat /admin → :8000\n\nagent_config.json # configurazione agenti (generato al primo avvio)\ntests/ # suite pytest (SQLite in-memory)\ndocs/\n├── lmstudio-settings.md # impostazioni consigliate LM Studio\n└── superpowers/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nreset_db.bat # azzera e rigenera i database\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `categorie`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini clienti | `ordini`, `righe_ordine` |\n| Ordini fornitori | `ordini_fornitori`, `righe_ordini_fornitori` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n4. Per parametri numerici che il modello potrebbe passare come int (es. CAP), usa `Union[str, int]`\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "d1dbe3d503579f7e0cd3a1efd07b408334eceb3c": {"t": 1785764960.0378294, "n": 11325, "h": "4f7a43c9422e67cc", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (LM Studio in locale o DeepSeek cloud, via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (LM Studio / DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini clienti** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Ordini fornitori** — creazione e gestione ordini di acquisto (`bozza → inviato → ricevuto`) con prezzo di acquisto per articolo\n- **Prezzi duali** — ogni articolo ha `prezzo_vendita` (ai clienti) e `prezzo_acquisto` (dai fornitori)\n- **Categorie articoli** — gestite dall'agente AI (`crea_categoria`, `assegna_categoria`, `lista_categorie`)\n- **Scorta minima** — soglia per articolo; alert automatico per il riordino (`articoli_sotto_scorta_minima`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Dashboard agenti** — visualizzazione e gestione del team AI in stile n8n (`/agents`)\n- **Pannello configurazione** — modifica il file `.env` dal browser senza aprirlo (`/config`)\n- **Homepage** — menu centrale con accesso rapido a tutte le sezioni (`/`)\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Homepage\n\nMenu centrale con accesso rapido a tutte le sezioni del pannello web.\n\n![Homepage](home.png)\n\nAccessibile su **`http://localhost:8000/`**\n\n---\n\n## Dashboard Agenti\n\nDashboard visuale in stile **n8n** per visualizzare e modificare il team di agenti AI in tempo reale.\n\n![Agent Dashboard](Dashboard.png)\n\nAccessibile su **`http://localhost:8000/agents/`**\n\n### Caratteristiche\n\n- **Visualizzazione a blocchi** — ogni componente (Team, Agenti, Tool, Memory Manager) è un nodo colorato con connessioni SVG\n- **Drag & drop** — riorganizza i blocchi trascinandoli sulla canvas\n- **Modifica in tempo reale** — doppio click (desktop) o tap sull'icona ✏️ (mobile) per editare nome, ruolo, instructions e parametri\n- **Salvataggio persistente** — la configurazione viene salvata in `agent_config.json`\n- **Ricarica a caldo** — applica le modifiche senza riavviare il server\n- **Responsive / mobile** — funziona da cellulare con supporto touch completo\n\n### Nodi visualizzati\n\n| Nodo | Colore | Contenuto |\n|------|--------|-----------|\n| Team ERPClaw | Rosso | Prompt principale, tools, membri, history |\n| Agenti (es. RicercaFornitore) | Viola | Ruolo, instructions, thinking on/off |\n| Tool (ERPTools, LogisticaTools, ecc.) | Blu | Descrizione, lista metodi |\n| Memory Manager | Verde | Istruzioni di cattura memoria |\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | LM Studio (locale) o DeepSeek cloud — configurabile via `.env` |\n| Modello consigliato | Qwen3.5-9B (LM Studio) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Dashboard agenti | FastAPI + Jinja2 + vanilla JS (canvas SVG) |\n| Pannello configurazione | FastAPI + Jinja2 (form .env con toggle LLM) |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key OpenAI (solo per i messaggi vocali)\n- **LM Studio** (locale, consigliato) oppure API key DeepSeek (cloud)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nALLOWED_CHAT_ID=... # tuo Telegram numeric user ID\nOPENAI_API_KEY=... # solo per messaggi vocali\n\n# Modello locale (default):\nLLM_PROVIDER=lmstudio\nLLM_MODEL_ID=qwen/qwen3.5-9b\nLMSTUDIO_BASE_URL=http://localhost:1234/v1\n\n# Oppure DeepSeek cloud:\n# LLM_PROVIDER=deepseek\n# LLM_MODEL_ID=deepseek-reasoner\n# DEEPSEEK_API_KEY=...\n\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il pannello web (include admin + shop + dashboard agenti + config)\nuv run uvicorn erpclaw.web:app --reload\n# → Home: http://localhost:8000/\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n# → Dashboard: http://localhost:8000/agents/\n# → Config: http://localhost:8000/config/\n\n# Avvia entrambi (Windows)\nstart.bat\n\n# Azzera e rigenera i database\nreset_db.bat\n```\n\n> **LM Studio:** avvia il server locale prima di lanciare il bot. Vedi `docs/lmstudio-settings.md` per le impostazioni consigliate.\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── agent_config.py # gestione configurazione agenti (JSON)\n├── agents_dashboard.py # dashboard visuale agenti (/agents)\n├── config_panel.py # pannello configurazione .env (/config)\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # pannello admin FastAPI + shop + dashboard + home\n├── shop.py # portale ordini clienti (/shop)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, categorie, clienti, ordini, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env (LLM_PROVIDER, LLM_MODEL_ID, ecc.)\n└── templates/\n ├── home.html # homepage con menu card\n ├── agents/ # template dashboard agenti (n8n-style)\n ├── chat/ # template chat web\n ├── config/ # template pannello configurazione .env\n └── shop/ # template portale shop\n\nagent_config.json # configurazione agenti (generato al primo avvio)\ntests/ # suite pytest (SQLite in-memory)\ndocs/\n├── lmstudio-settings.md # impostazioni consigliate LM Studio\n└── plans/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nreset_db.bat # azzera e rigenera i database\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `categorie`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini clienti | `ordini`, `righe_ordine` |\n| Ordini fornitori | `ordini_fornitori`, `righe_ordini_fornitori` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n4. Per parametri numerici che il modello potrebbe passare come int (es. CAP), usa `Union[str, int]`\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "db0deb6acd67f1b4716df80b43f7c3ddfc7b982c": {"t": 1785764961.8548245, "n": 11168, "h": "bc429d1a1e407d24", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (LM Studio in locale o DeepSeek cloud, via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (LM Studio / DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini clienti** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Ordini fornitori** — creazione e gestione ordini di acquisto (`bozza → inviato → ricevuto`) con prezzo di acquisto per articolo\n- **Prezzi duali** — ogni articolo ha `prezzo_vendita` (ai clienti) e `prezzo_acquisto` (dai fornitori)\n- **Categorie articoli** — gestite dall'agente AI (`crea_categoria`, `assegna_categoria`, `lista_categorie`)\n- **Scorta minima** — soglia per articolo; alert automatico per il riordino (`articoli_sotto_scorta_minima`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Dashboard agenti** — visualizzazione e gestione del team AI in stile n8n (`/agents`)\n- **Pannello configurazione** — modifica il file `.env` dal browser senza aprirlo (`/config`)\n- **Homepage** — menu centrale con accesso rapido a tutte le sezioni (`/`)\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Dashboard Agenti\n\nDashboard visuale in stile **n8n** per visualizzare e modificare il team di agenti AI in tempo reale.\n\n![Agent Dashboard](Dashboard.png)\n\nAccessibile su **`http://localhost:8000/agents/`**\n\n### Caratteristiche\n\n- **Visualizzazione a blocchi** — ogni componente (Team, Agenti, Tool, Memory Manager) è un nodo colorato con connessioni SVG\n- **Drag & drop** — riorganizza i blocchi trascinandoli sulla canvas\n- **Modifica in tempo reale** — doppio click (desktop) o tap sull'icona ✏️ (mobile) per editare nome, ruolo, instructions e parametri\n- **Salvataggio persistente** — la configurazione viene salvata in `agent_config.json`\n- **Ricarica a caldo** — applica le modifiche senza riavviare il server\n- **Responsive / mobile** — funziona da cellulare con supporto touch completo\n\n### Nodi visualizzati\n\n| Nodo | Colore | Contenuto |\n|------|--------|-----------|\n| Team ERPClaw | Rosso | Prompt principale, tools, membri, history |\n| Agenti (es. RicercaFornitore) | Viola | Ruolo, instructions, thinking on/off |\n| Tool (ERPTools, LogisticaTools, ecc.) | Blu | Descrizione, lista metodi |\n| Memory Manager | Verde | Istruzioni di cattura memoria |\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | LM Studio (locale) o DeepSeek cloud — configurabile via `.env` |\n| Modello consigliato | Qwen3.5-9B (LM Studio) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Dashboard agenti | FastAPI + Jinja2 + vanilla JS (canvas SVG) |\n| Pannello configurazione | FastAPI + Jinja2 (form .env con toggle LLM) |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key OpenAI (solo per i messaggi vocali)\n- **LM Studio** (locale, consigliato) oppure API key DeepSeek (cloud)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nALLOWED_CHAT_ID=... # tuo Telegram numeric user ID\nOPENAI_API_KEY=... # solo per messaggi vocali\n\n# Modello locale (default):\nLLM_PROVIDER=lmstudio\nLLM_MODEL_ID=qwen/qwen3.5-9b\nLMSTUDIO_BASE_URL=http://localhost:1234/v1\n\n# Oppure DeepSeek cloud:\n# LLM_PROVIDER=deepseek\n# LLM_MODEL_ID=deepseek-reasoner\n# DEEPSEEK_API_KEY=...\n\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il pannello web (include admin + shop + dashboard agenti + config)\nuv run uvicorn erpclaw.web:app --reload\n# → Home: http://localhost:8000/\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n# → Dashboard: http://localhost:8000/agents/\n# → Config: http://localhost:8000/config/\n\n# Avvia entrambi (Windows)\nstart.bat\n\n# Azzera e rigenera i database\nreset_db.bat\n```\n\n> **LM Studio:** avvia il server locale prima di lanciare il bot. Vedi `docs/lmstudio-settings.md` per le impostazioni consigliate.\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── agent_config.py # gestione configurazione agenti (JSON)\n├── agents_dashboard.py # dashboard visuale agenti (/agents)\n├── config_panel.py # pannello configurazione .env (/config)\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # pannello admin FastAPI + shop + dashboard + home\n├── shop.py # portale ordini clienti (/shop)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, categorie, clienti, ordini, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env (LLM_PROVIDER, LLM_MODEL_ID, ecc.)\n└── templates/\n ├── home.html # homepage con menu card\n ├── agents/ # template dashboard agenti (n8n-style)\n ├── chat/ # template chat web\n ├── config/ # template pannello configurazione .env\n └── shop/ # template portale shop\n\nagent_config.json # configurazione agenti (generato al primo avvio)\ntests/ # suite pytest (SQLite in-memory)\ndocs/\n├── lmstudio-settings.md # impostazioni consigliate LM Studio\n└── plans/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nreset_db.bat # azzera e rigenera i database\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `categorie`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini clienti | `ordini`, `righe_ordine` |\n| Ordini fornitori | `ordini_fornitori`, `righe_ordini_fornitori` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n4. Per parametri numerici che il modello potrebbe passare come int (es. CAP), usa `Union[str, int]`\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "24e3a8d63051c5677b6d78bde40afa7af16bbcd2": {"t": 1785764963.392453, "n": 10624, "h": "516c032cd8e59f76", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (LM Studio in locale o DeepSeek cloud, via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (LM Studio / DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini clienti** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Ordini fornitori** — creazione e gestione ordini di acquisto (`bozza → inviato → ricevuto`) con prezzo di acquisto per articolo\n- **Prezzi duali** — ogni articolo ha `prezzo_vendita` (ai clienti) e `prezzo_acquisto` (dai fornitori)\n- **Categorie articoli** — gestite dall'agente AI (`crea_categoria`, `assegna_categoria`, `lista_categorie`)\n- **Scorta minima** — soglia per articolo; alert automatico per il riordino (`articoli_sotto_scorta_minima`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Dashboard agenti** — visualizzazione e gestione del team AI in stile n8n (`/agents`)\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Dashboard Agenti\n\nDashboard visuale in stile **n8n** per visualizzare e modificare il team di agenti AI in tempo reale.\n\n![Agent Dashboard](Dashboard.png)\n\nAccessibile su **`http://localhost:8000/agents/`**\n\n### Caratteristiche\n\n- **Visualizzazione a blocchi** — ogni componente (Team, Agenti, Tool, Memory Manager) è un nodo colorato con connessioni SVG\n- **Drag & drop** — riorganizza i blocchi trascinandoli sulla canvas\n- **Modifica in tempo reale** — doppio click (desktop) o tap sull'icona ✏️ (mobile) per editare nome, ruolo, instructions e parametri\n- **Salvataggio persistente** — la configurazione viene salvata in `agent_config.json`\n- **Ricarica a caldo** — applica le modifiche senza riavviare il server\n- **Responsive / mobile** — funziona da cellulare con supporto touch completo\n\n### Nodi visualizzati\n\n| Nodo | Colore | Contenuto |\n|------|--------|-----------|\n| Team ERPClaw | Rosso | Prompt principale, tools, membri, history |\n| Agenti (es. RicercaFornitore) | Viola | Ruolo, instructions, thinking on/off |\n| Tool (ERPTools, LogisticaTools, ecc.) | Blu | Descrizione, lista metodi |\n| Memory Manager | Verde | Istruzioni di cattura memoria |\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | LM Studio (locale) o DeepSeek cloud — configurabile via `.env` |\n| Modello consigliato | Qwen3.5-9B (LM Studio) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Dashboard agenti | FastAPI + Jinja2 + vanilla JS (canvas SVG) |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key OpenAI (solo per i messaggi vocali)\n- **LM Studio** (locale, consigliato) oppure API key DeepSeek (cloud)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nALLOWED_CHAT_ID=... # tuo Telegram numeric user ID\nOPENAI_API_KEY=... # solo per messaggi vocali\n\n# Modello locale (default):\nLLM_PROVIDER=lmstudio\nLLM_MODEL_ID=qwen/qwen3.5-9b\nLMSTUDIO_BASE_URL=http://localhost:1234/v1\n\n# Oppure DeepSeek cloud:\n# LLM_PROVIDER=deepseek\n# LLM_MODEL_ID=deepseek-reasoner\n# DEEPSEEK_API_KEY=...\n\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il pannello web (include admin + shop + dashboard agenti)\nuv run uvicorn erpclaw.web:app --reload\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n# → Dashboard: http://localhost:8000/agents/\n\n# Avvia entrambi (Windows)\nstart.bat\n\n# Azzera e rigenera i database\nreset_db.bat\n```\n\n> **LM Studio:** avvia il server locale prima di lanciare il bot. Vedi `docs/lmstudio-settings.md` per le impostazioni consigliate.\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── agent_config.py # gestione configurazione agenti (JSON)\n├── agents_dashboard.py # dashboard visuale agenti (/agents)\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # pannello admin FastAPI + shop + dashboard\n├── shop.py # portale ordini clienti (/shop)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, categorie, clienti, ordini, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env (LLM_PROVIDER, LLM_MODEL_ID, ecc.)\n└── templates/\n ├── agents/ # template dashboard agenti (n8n-style)\n ├── chat/ # template chat web\n └── shop/ # template portale shop\n\nagent_config.json # configurazione agenti (generato al primo avvio)\ntests/ # suite pytest (SQLite in-memory)\ndocs/\n├── lmstudio-settings.md # impostazioni consigliate LM Studio\n└── plans/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nreset_db.bat # azzera e rigenera i database\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `categorie`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini clienti | `ordini`, `righe_ordine` |\n| Ordini fornitori | `ordini_fornitori`, `righe_ordini_fornitori` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n4. Per parametri numerici che il modello potrebbe passare come int (es. CAP), usa `Union[str, int]`\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "d1adafb00c015eb31d1335605583db1ea7581928": {"t": 1785764965.289929, "n": 10589, "h": "a3035c0963f32044", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (LM Studio in locale o DeepSeek cloud, via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (LM Studio / DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini clienti** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Ordini fornitori** — creazione e gestione ordini di acquisto (`bozza → inviato → ricevuto`) con prezzo di acquisto per articolo\n- **Prezzi duali** — ogni articolo ha `prezzo_vendita` (ai clienti) e `prezzo_acquisto` (dai fornitori)\n- **Categorie articoli** — gestite dall'agente AI (`crea_categoria`, `assegna_categoria`, `lista_categorie`)\n- **Scorta minima** — soglia per articolo; alert automatico per il riordino (`articoli_sotto_scorta_minima`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Dashboard agenti** — visualizzazione e gestione del team AI in stile n8n (`/agents`)\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Dashboard Agenti\n\nDashboard visuale in stile **n8n** per visualizzare e modificare il team di agenti AI in tempo reale.\n\nAccessibile su **`http://localhost:8000/agents/`**\n\n### Caratteristiche\n\n- **Visualizzazione a blocchi** — ogni componente (Team, Agenti, Tool, Memory Manager) è un nodo colorato con connessioni SVG\n- **Drag & drop** — riorganizza i blocchi trascinandoli sulla canvas\n- **Modifica in tempo reale** — doppio click (desktop) o tap sull'icona ✏️ (mobile) per editare nome, ruolo, instructions e parametri\n- **Salvataggio persistente** — la configurazione viene salvata in `agent_config.json`\n- **Ricarica a caldo** — applica le modifiche senza riavviare il server\n- **Responsive / mobile** — funziona da cellulare con supporto touch completo\n\n### Nodi visualizzati\n\n| Nodo | Colore | Contenuto |\n|------|--------|-----------|\n| Team ERPClaw | Rosso | Prompt principale, tools, membri, history |\n| Agenti (es. RicercaFornitore) | Viola | Ruolo, instructions, thinking on/off |\n| Tool (ERPTools, LogisticaTools, ecc.) | Blu | Descrizione, lista metodi |\n| Memory Manager | Verde | Istruzioni di cattura memoria |\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | LM Studio (locale) o DeepSeek cloud — configurabile via `.env` |\n| Modello consigliato | Qwen3.5-9B (LM Studio) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Dashboard agenti | FastAPI + Jinja2 + vanilla JS (canvas SVG) |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key OpenAI (solo per i messaggi vocali)\n- **LM Studio** (locale, consigliato) oppure API key DeepSeek (cloud)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nALLOWED_CHAT_ID=... # tuo Telegram numeric user ID\nOPENAI_API_KEY=... # solo per messaggi vocali\n\n# Modello locale (default):\nLLM_PROVIDER=lmstudio\nLLM_MODEL_ID=qwen/qwen3.5-9b\nLMSTUDIO_BASE_URL=http://localhost:1234/v1\n\n# Oppure DeepSeek cloud:\n# LLM_PROVIDER=deepseek\n# LLM_MODEL_ID=deepseek-reasoner\n# DEEPSEEK_API_KEY=...\n\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il pannello web (include admin + shop + dashboard agenti)\nuv run uvicorn erpclaw.web:app --reload\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n# → Dashboard: http://localhost:8000/agents/\n\n# Avvia entrambi (Windows)\nstart.bat\n\n# Azzera e rigenera i database\nreset_db.bat\n```\n\n> **LM Studio:** avvia il server locale prima di lanciare il bot. Vedi `docs/lmstudio-settings.md` per le impostazioni consigliate.\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── agent_config.py # gestione configurazione agenti (JSON)\n├── agents_dashboard.py # dashboard visuale agenti (/agents)\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # pannello admin FastAPI + shop + dashboard\n├── shop.py # portale ordini clienti (/shop)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, categorie, clienti, ordini, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env (LLM_PROVIDER, LLM_MODEL_ID, ecc.)\n└── templates/\n ├── agents/ # template dashboard agenti (n8n-style)\n ├── chat/ # template chat web\n └── shop/ # template portale shop\n\nagent_config.json # configurazione agenti (generato al primo avvio)\ntests/ # suite pytest (SQLite in-memory)\ndocs/\n├── lmstudio-settings.md # impostazioni consigliate LM Studio\n└── plans/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nreset_db.bat # azzera e rigenera i database\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `categorie`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini clienti | `ordini`, `righe_ordine` |\n| Ordini fornitori | `ordini_fornitori`, `righe_ordini_fornitori` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n4. Per parametri numerici che il modello potrebbe passare come int (es. CAP), usa `Union[str, int]`\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "04494924bfb03883a8558e1f9b7bffccfb9a8d54": {"t": 1785764966.887307, "n": 8876, "h": "5fb8d93223d73b3d", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (LM Studio in locale o DeepSeek cloud, via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (LM Studio / DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini clienti** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Ordini fornitori** — creazione e gestione ordini di acquisto (`bozza → inviato → ricevuto`) con prezzo di acquisto per articolo\n- **Prezzi duali** — ogni articolo ha `prezzo_vendita` (ai clienti) e `prezzo_acquisto` (dai fornitori)\n- **Categorie articoli** — gestite dall'agente AI (`crea_categoria`, `assegna_categoria`, `lista_categorie`)\n- **Scorta minima** — soglia per articolo; alert automatico per il riordino (`articoli_sotto_scorta_minima`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | LM Studio (locale) o DeepSeek cloud — configurabile via `.env` |\n| Modello consigliato | Qwen3.5-9B (LM Studio) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key OpenAI (solo per i messaggi vocali)\n- **LM Studio** (locale, consigliato) oppure API key DeepSeek (cloud)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nALLOWED_CHAT_ID=... # tuo Telegram numeric user ID\nOPENAI_API_KEY=... # solo per messaggi vocali\n\n# Modello locale (default):\nLLM_PROVIDER=lmstudio\nLLM_MODEL_ID=qwen/qwen3.5-9b\nLMSTUDIO_BASE_URL=http://localhost:1234/v1\n\n# Oppure DeepSeek cloud:\n# LLM_PROVIDER=deepseek\n# LLM_MODEL_ID=deepseek-reasoner\n# DEEPSEEK_API_KEY=...\n\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il pannello web (include admin + shop)\nuv run uvicorn erpclaw.web:app --reload\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n\n# Avvia entrambi (Windows)\nstart.bat\n\n# Azzera e rigenera i database\nreset_db.bat\n```\n\n> **LM Studio:** avvia il server locale prima di lanciare il bot. Vedi `docs/lmstudio-settings.md` per le impostazioni consigliate.\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # pannello admin FastAPI + shop router\n├── shop.py # portale ordini clienti (/shop)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, categorie, clienti, ordini, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env (LLM_PROVIDER, LLM_MODEL_ID, ecc.)\n└── templates/shop/ # template Jinja2 per il portale shop\n\ntests/ # suite pytest (SQLite in-memory)\ndocs/\n├── lmstudio-settings.md # impostazioni consigliate LM Studio\n└── plans/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nreset_db.bat # azzera e rigenera i database\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `categorie`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini clienti | `ordini`, `righe_ordine` |\n| Ordini fornitori | `ordini_fornitori`, `righe_ordini_fornitori` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n4. Per parametri numerici che il modello potrebbe passare come int (es. CAP), usa `Union[str, int]`\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "557c887249025ef58fa85d32536ddb0f7e5afe8a": {"t": 1785764969.9914174, "n": 7963, "h": "c04e89e3f83710ce", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (DeepSeek via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini clienti** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Ordini fornitori** — creazione e gestione ordini di acquisto (`bozza → inviato → ricevuto`) con prezzo di acquisto per articolo\n- **Prezzi duali** — ogni articolo ha `prezzo_vendita` (ai clienti) e `prezzo_acquisto` (dai fornitori)\n- **Categorie articoli** — gestite dall'agente AI (`crea_categoria`, `assegna_categoria`, `lista_categorie`)\n- **Scorta minima** — soglia per articolo; alert automatico per il riordino (`articoli_sotto_scorta_minima`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | DeepSeek (`deepseek-reasoner`) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key DeepSeek\n- API key OpenAI (solo per i messaggi vocali)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nDEEPSEEK_API_KEY=...\nOPENAI_API_KEY=...\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il pannello web (include admin + shop)\nuv run uvicorn erpclaw.web:app --reload\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n\n# Avvia entrambi (Windows)\nstart.bat\n```\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # pannello admin FastAPI + shop router\n├── shop.py # portale ordini clienti (/shop)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli con prezzo duale, categorie, scorta_minima, clienti, ordini clienti/fornitori, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env\n└── templates/shop/ # template Jinja2 per il portale shop\n\ntests/ # suite pytest (SQLite in-memory)\ndocs/plans/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `categorie`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini clienti | `ordini`, `righe_ordine` |\n| Ordini fornitori | `ordini_fornitori`, `righe_ordini_fornitori` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "31beacd4400128d829b15b0a3da4b96df9bc14a6": {"t": 1785764971.5814903, "n": 7619, "h": "a054e3a77e48664c", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (DeepSeek via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Categorie articoli** — gestite dall'agente AI (`crea_categoria`, `assegna_categoria`, `lista_categorie`)\n- **Scorta minima** — soglia per articolo; alert automatico per il riordino (`articoli_sotto_scorta_minima`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | DeepSeek (`deepseek-reasoner`) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key DeepSeek\n- API key OpenAI (solo per i messaggi vocali)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nDEEPSEEK_API_KEY=...\nOPENAI_API_KEY=...\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il pannello web (include admin + shop)\nuv run uvicorn erpclaw.web:app --reload\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n\n# Avvia entrambi (Windows)\nstart.bat\n```\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # pannello admin FastAPI + shop router\n├── shop.py # portale ordini clienti (/shop)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, categorie, scorta_minima, clienti, ordini, fornitori, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env\n└── templates/shop/ # template Jinja2 per il portale shop\n\ntests/ # suite pytest (SQLite in-memory)\ndocs/plans/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `categorie`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini | `ordini`, `righe_ordine` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "85bf273eaa23ca6d79d74a2ca34a4f87749c5a86": {"t": 1785764973.1605844, "n": 7362, "h": "0f749d2d6d45dc9b", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (DeepSeek via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | DeepSeek (`deepseek-reasoner`) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key DeepSeek\n- API key OpenAI (solo per i messaggi vocali)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nDEEPSEEK_API_KEY=...\nOPENAI_API_KEY=...\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il pannello web (include admin + shop)\nuv run uvicorn erpclaw.web:app --reload\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n\n# Avvia entrambi (Windows)\nstart.bat\n```\n\n## Esempi d'uso\n\n### Ricerca fornitore e importazione catalogo\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n### Ordine completo con voce — dalla creazione cliente alla spedizione\n\nChat reale registrata il 10/03/2026. L'utente usa un messaggio vocale per fare tutto in una volta.\n\n```\nUtente: [messaggio vocale 20s]\nERPClaw: 🎤 Trascrizione: \"Allora, mi dovresti inserire un ordine per il cliente,\n me lo crei anche, che si chiama Aldo Panero, che abita in Viù Urbino 33,\n e mi metti due pezzi di gamberetti e due pezzi di sfilaccetti.\"\n\nUtente: Via Urbino 33, Torino\n\nERPClaw: Perfetto! Ho creato il cliente e l'ordine.\n 📋 Cliente: Aldo Panero (ALDO01)\n 🛒 Ordine ORD-0001 — bozza\n | GEMON CAT BOCCONI ADULT SALMONE GAMBERETTI 415GR | 2 | €1,56 |\n | MONGE CAT MONOPROTEICO SOLO POLLO 80GR SFILACCETTI | 2 | €2,16 |\n 💶 Totale: €3,72\n 📍 Indirizzo spedizione aggiunto: Via Urbino 33, 10100 Torino (TO)\n Vuoi confermare l'ordine?\n\nUtente: Confermo\n\nERPClaw: ✅ Ordine ORD-0001 confermato.\n Vuoi gestire la logistica di magazzino ora?\n\nUtente: Sì, gestiamola, ci sono le qtà?\n\nERPClaw: Stock disponibile in RIP1 (MAG1 › ZONA1 › SCAFF1):\n GEMON GAMBERETTI: 50 disponibili, 2 richiesti ✅\n MONGE SFILACCETTI: 50 disponibili, 2 richiesti ✅\n Vuoi procedere con la spedizione?\n\nUtente: Sì\n\nERPClaw: 🚚 Spedizione completata!\n Ordine ORD-0001 → stato: spedito\n Stock scaricato da RIP1: -2 gamberetti, -2 sfilaccetti\n Stock aggiornato: 48 pezzi per ciascuno\n ✅ Flusso completato in 8 passi — ordine pronto per la consegna.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # pannello admin FastAPI + shop router\n├── shop.py # portale ordini clienti (/shop)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, clienti, ordini, fornitori, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env\n└── templates/shop/ # template Jinja2 per il portale shop\n\ntests/ # suite pytest (SQLite in-memory)\ndocs/plans/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini | `ordini`, `righe_ordine` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "ed713494e40ab7ac534589f1cb9648ad234ae522": {"t": 1785764974.5504606, "n": 5777, "h": "9071a73061c21147", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (DeepSeek via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Portale shop clienti** — i clienti si registrano e ordinano via browser (`/shop`), senza Telegram\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | DeepSeek (`deepseek-reasoner`) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web + shop | FastAPI + SQLAdmin + HTMX + Bootstrap 5 |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key DeepSeek\n- API key OpenAI (solo per i messaggi vocali)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nDEEPSEEK_API_KEY=...\nOPENAI_API_KEY=...\nSHOP_SECRET_KEY=... # opzionale, default dev value\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il pannello web (include admin + shop)\nuv run uvicorn erpclaw.web:app --reload\n# → Admin: http://localhost:8000/admin\n# → Shop: http://localhost:8000/shop/register\n\n# Avvia entrambi (Windows)\nstart.bat\n```\n\n## Esempio d'uso\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # pannello admin FastAPI + shop router\n├── shop.py # portale ordini clienti (/shop)\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, clienti, ordini, fornitori, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n├── config.py # caricamento .env\n└── templates/shop/ # template Jinja2 per il portale shop\n\ntests/ # suite pytest (SQLite in-memory)\ndocs/plans/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi`, `clienti_auth` |\n| Ordini | `ordini`, `righe_ordine` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run --no-sync python -m pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "05f50c966cbb008113b1f8bedd81a5139e8e4094": {"t": 1785764977.5084372, "n": 5332, "h": "fee1cdef1b573feb", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (DeepSeek via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (DeepSeek) → ERPTools → erp.db\n → LogisticaTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino e ubicazioni** — gerarchia fisica Magazzino→Zona→Scaffale→Ripiano; stock per ubicazione\n- **Movimenti di magazzino** — carico, scarico, trasferimento con storico completo\n- **Integrazione ordini-magazzino** — scarico automatico dalle ubicazioni quando un ordine è spedito (strategia LIFO)\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica con indirizzi multi-tipo (sede legale, spedizione, fatturazione)\n- **Fornitori** — anagrafica con indirizzi multi-tipo\n- **Ordini** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | DeepSeek (`deepseek-reasoner`) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web | FastAPI + SQLAdmin |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key DeepSeek\n- API key OpenAI (solo per i messaggi vocali)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nDEEPSEEK_API_KEY=...\nOPENAI_API_KEY=...\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il pannello web\nuv run uvicorn erpclaw.web:app --reload\n# → http://localhost:8000/admin\n\n# Avvia entrambi (Windows)\nstart.bat\n```\n\n## Esempio d'uso\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # pannello admin FastAPI\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP (articoli, clienti, ordini, fornitori, indirizzi)\n├── logistica_tools.py # tool logistica (ubicazioni, stock, movimenti)\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n└── config.py # caricamento .env\n\ntests/ # suite pytest (SQLite in-memory)\ndocs/plans/ # design doc e piani implementativi\nesempi di chat/ # export chat Telegram di esempio\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Database\n\nTutte le tabelle risiedono in `erp.db` (SQLite):\n\n| Gruppo | Tabelle |\n|--------|---------|\n| Catalogo | `articoli`, `stock_ubicazioni` |\n| Clienti | `clienti`, `indirizzi` |\n| Ordini | `ordini`, `righe_ordine` |\n| Fornitori | `fornitori`, `cataloghi_fornitori` |\n| Magazzino | `magazzini`, `zone`, `scaffali`, `ripiani` |\n| Movimenti | `movimenti_magazzino` |\n\n`Articolo.giacenza` è una `column_property` derivata (somma di `StockUbicazione.quantita`).\n\n## Aggiungere nuovi tool ERP\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n\n## Aggiungere nuovi tool logistici\n\n1. Aggiungi un metodo a `LogisticaTools` in `logistica_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Aggiungi il tool alle istruzioni del team in `agent.py`\n\n## Test\n\n```bash\nuv run pytest tests/ -v\n```\n\n## Licenza\n\nMIT\n"}, "28773ce6d8cd055019675d8557f35dbf794bf0ff": {"t": 1785764979.846258, "n": 3887, "h": "9e10eefa8c76b131", "c": "# ERPClaw\n\nMini-ERP gestito da un agente AI tramite **Telegram**. Scrivi (o parla) in italiano — il sistema capisce e agisce.\n\n---\n\n## Come funziona\n\nL'utente manda un messaggio su Telegram, anche vocale. L'agente AI (DeepSeek via [agno](https://github.com/agno-agi/agno)) interpreta la richiesta ed esegue le operazioni sul database aziendale SQLite.\n\n```\nTelegram → bot.py → agno Team (DeepSeek) → ERPTools → erp.db\n ↘ FornitoreResearchAgent → web search / PDF\n```\n\n## Funzionalità\n\n- **Magazzino** — lista articoli, giacenze, aggiornamenti quantità\n- **Fornitori** — ricerca web, salvataggio anagrafica, download cataloghi PDF\n- **Importazione cataloghi** — parsing PDF, ricerca prezzi online, inserimento articoli con margine personalizzabile\n- **Clienti** — anagrafica completa\n- **Ordini** — creazione, gestione stati (`bozza → confermato → spedito → chiuso`)\n- **Messaggi vocali** — trascrizione automatica via OpenAI Whisper\n- **Pannello web** — admin CRUD su browser (FastAPI + SQLAdmin)\n- **Memoria** — l'agente ricorda preferenze e contesto per ogni utente Telegram\n\n## Stack tecnico\n\n| Componente | Tecnologia |\n|---|---|\n| LLM agente | DeepSeek (`deepseek-reasoner`) |\n| Framework agente | [agno](https://github.com/agno-agi/agno) |\n| Trascrizione voce | OpenAI Whisper |\n| Database ERP | SQLite + SQLAlchemy |\n| Bot Telegram | python-telegram-bot |\n| Pannello web | FastAPI + SQLAdmin |\n| Package manager | [uv](https://github.com/astral-sh/uv) |\n| Python | 3.13 |\n\n## Requisiti\n\n- Python 3.13\n- [uv](https://github.com/astral-sh/uv)\n- Token bot Telegram\n- API key DeepSeek\n- API key OpenAI (solo per i messaggi vocali)\n\n## Installazione\n\n```bash\ngit clone https://github.com/Attilio81/ERPClaw.git\ncd ERPClaw\n\n# Crea il file .env\ncp .env.example .env # poi compila le variabili\n\n# Installa le dipendenze\nuv sync\n```\n\nFile `.env` richiesto:\n```\nTELEGRAM_BOT_TOKEN=...\nDEEPSEEK_API_KEY=...\nOPENAI_API_KEY=...\n```\n\n## Avvio\n\n```bash\n# Avvia solo il bot Telegram\nuv run erpclaw\n\n# Avvia solo il pannello web\nuv run uvicorn erpclaw.web:app --reload\n# → http://localhost:8000/admin\n\n# Avvia entrambi (Windows)\nstart.bat\n```\n\n## Esempio d'uso\n\n```\nUtente: mi cerchi il fornitore monge? ha dei cataloghi?\n\nERPClaw: Ecco i risultati della ricerca online per Monge & C. S.p.A.\n Sede: Monasterolo di Savigliano (CN) | Fatturato: €512M\n ✅ Catalogo PDF disponibile. Vuoi salvarlo nel database?\n\nUtente: sì salvami questo fornitore\n\nERPClaw: Fornitore salvato! Codice: MONGE | Sito: https://www.monge.it\n Vuoi che scarichi il catalogo e inserisca i primi articoli?\n\nUtente: sì, scarica il catalogo e inserisci i primi 10 articoli\n\nERPClaw: Ho trovato 10 articoli. I prezzi non sono nel PDF —\n vuoi che li cerchi sui principali e-commerce italiani?\n\nUtente: sì\n\nERPClaw: Prezzi trovati su Trovaprezzi, Idealo, Zooplus.\n Inserisco con +20% di margine?\n\nUtente: procedi con opzione 2\n\nERPClaw: ✅ 10 articoli inseriti nel catalogo con prezzi +20%.\n```\n\n## Struttura del progetto\n\n```\nerpclaw/\n├── agent.py # agno Team + sub-agente ricerca fornitori\n├── bot.py # bot Telegram (testo + voce)\n├── web.py # pannello admin FastAPI\n├── erp_db.py # modelli SQLAlchemy + init DB\n├── erp_tools.py # tool ERP dell'agente\n├── fornitore_research_tools.py # tool ricerca fornitori (PDF, web)\n└── config.py # caricamento .env\n\nesempi di chat/ # export chat Telegram di esempio\nMANUALE_UTENTE.md # manuale non tecnico per l'utente finale\n```\n\n## Aggiungere nuovi tool\n\n1. Aggiungi un metodo a `ERPTools` in `erp_tools.py` con docstring in italiano\n2. Registralo con `self.register(self.nome_metodo)` in `__init__`\n3. Il metodo deve restituire una stringa markdown\n\n## Licenza\n\nMIT\n"}, "7a660496704376e99e835df972399323e6771edb": {"t": 1785764981.7108872, "n": 81, "h": "36581788c3d38702", "c": "# ERPClaw\nMini-ERP gestito da agente AI via Telegram. Basato su agno + DeepSeek.\n"}}, ".env.example": {"1774534dac351c116a64f5f460626aa07b494718": {"t": 1785747125.6697385, "n": 703, "h": "2c8b184f270fbedb", "c": "# Telegram Bot\nTELEGRAM_BOT_TOKEN=your_telegram_bot_token_here\nALLOWED_CHAT_ID=your_telegram_numeric_user_id\n\n# DeepSeek API (agent LLM) — necessario solo se LLM_PROVIDER=deepseek\n# DEEPSEEK_API_KEY=your_deepseek_api_key_here\n\n# OpenAI API (Whisper voice transcription only)\nOPENAI_API_KEY=your_openai_api_key_here\n\n# Shop session cookie secret (optional, defaults to dev value)\nSHOP_SECRET_KEY=change_me_in_production\n\n# Modello AI: \"lmstudio\" (locale) oppure \"deepseek\" (cloud)\n# Per usare LM Studio in locale:\nLLM_PROVIDER=lmstudio\nLLM_MODEL_ID=qwen3.5-9b\nLMSTUDIO_BASE_URL=http://localhost:1234/v1\n# Per usare DeepSeek cloud, sostituire con:\n# LLM_PROVIDER=deepseek\n# LLM_MODEL_ID=deepseek-reasoner\n"}, "04494924bfb03883a8558e1f9b7bffccfb9a8d54": {"t": 1785764953.1682997, "n": 703, "h": "2c8b184f270fbedb", "c": "# Telegram Bot\nTELEGRAM_BOT_TOKEN=your_telegram_bot_token_here\nALLOWED_CHAT_ID=your_telegram_numeric_user_id\n\n# DeepSeek API (agent LLM) — necessario solo se LLM_PROVIDER=deepseek\n# DEEPSEEK_API_KEY=your_deepseek_api_key_here\n\n# OpenAI API (Whisper voice transcription only)\nOPENAI_API_KEY=your_openai_api_key_here\n\n# Shop session cookie secret (optional, defaults to dev value)\nSHOP_SECRET_KEY=change_me_in_production\n\n# Modello AI: \"lmstudio\" (locale) oppure \"deepseek\" (cloud)\n# Per usare LM Studio in locale:\nLLM_PROVIDER=lmstudio\nLLM_MODEL_ID=qwen3.5-9b\nLMSTUDIO_BASE_URL=http://localhost:1234/v1\n# Per usare DeepSeek cloud, sostituire con:\n# LLM_PROVIDER=deepseek\n# LLM_MODEL_ID=deepseek-reasoner\n"}}}}