Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/attilio81_erpclaw.json
T

1 line
148 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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"}}}}