diff --git a/.env.example b/.env.example index fd9a427..ce6f756 100644 --- a/.env.example +++ b/.env.example @@ -5,6 +5,7 @@ # https://makersuite.google.com/app/apikey GOOGLE_API_KEY= + ############################################################################### # Configurazioni per gli agenti di mercato ############################################################################### @@ -21,6 +22,7 @@ CRYPTOCOMPARE_API_KEY= BINANCE_API_KEY= BINANCE_API_SECRET= + ############################################################################### # Configurazioni per gli agenti di notizie ############################################################################### @@ -31,6 +33,7 @@ NEWS_API_KEY= # https://cryptopanic.com/developers/api/ CRYPTOPANIC_API_KEY= + ############################################################################### # Configurazioni per API di social media ############################################################################### @@ -38,3 +41,11 @@ CRYPTOPANIC_API_KEY= # https://www.reddit.com/prefs/apps REDDIT_API_CLIENT_ID= REDDIT_API_CLIENT_SECRET= + + +############################################################################### +# Configurazioni per API di messaggistica +############################################################################### + +# https://core.telegram.org/bots/features#creating-a-new-bot +TELEGRAM_BOT_TOKEN= diff --git a/docs/Telegram_Integration_plan.md b/docs/Telegram_Integration_plan.md new file mode 100644 index 0000000..8f477f6 --- /dev/null +++ b/docs/Telegram_Integration_plan.md @@ -0,0 +1,46 @@ +# Implementazione Bot Telegram (Python + InlineKeyboard) + +Il progetto si basa sulla libreria **`python-telegram-bot`** e sull'uso di **`InlineKeyboard`** per gestire le scelte dell'utente, assicurando un'interfaccia rapida e pulita. + +## 1. Setup e Flusso Iniziale + +### Inizializzazione + +Dovrai innanzitutto inizializzare l'oggetto bot con il tuo **token API** di Telegram e configurare l'**Application** (o il Dispatcher). + +### Handler Principali + +* **Comando `/start`** : Implementa l'handler per questo comando. La sua funzione è inviare un messaggio di benvenuto e presentare immediatamente la prima **`InlineKeyboard`** per la scelta della strategia (A/B). + +## 2. Gestione dei Menu (InlineKeyboard) + +Per le scelte di Strategia (A/B) e LLM (Dropdown), la soluzione è basata interamente sulla gestione delle **`InlineKeyboard`** e dei `CallbackQuery`. + +### Tasti e Azioni + +* **Strategia (A/B)** : Crea una `InlineKeyboard` con i pulsanti 'A' e 'B', ciascuno con un `callback_data` univoco (es. `strategy_A`). +* **Selezione LLM** : Dopo la scelta della strategia, invia una nuova `InlineKeyboard` per la selezione dell'LLM (es. GPT-3.5, Gemini), assegnando un `callback_data` (es. `llm_gpt35`) ad ogni opzione. +* **`CallbackQuery` Handler** : Un unico handler catturerà la pressione di tutti questi pulsanti. Questo gestore deve analizzare il `callback_data` per determinare quale scelta è stata fatta. + +### Gestione dello Stato + +È fondamentale utilizzare un meccanismo (come il **`ConversationHandler`** della libreria o un sistema di stato personalizzato) per **memorizzare le scelte** dell'utente (`Strategia` e `LLM`) man mano che vengono fatte, guidando il flusso verso la fase successiva. + +## 3. Interazione con la LLM e Output + +### Acquisizione del Prompt + +* **Prompt Handler** : Dopo che l'utente ha selezionato sia la Strategia che l'LLM, il bot deve attendere un **messaggio di testo** dall'utente. Questo handler si attiverà solo quando lo stato dell'utente indica che le scelte iniziali sono state fatte. + +### Feedback e Output (Gestione degli aggiornamenti) + +Questo è il punto cruciale per evitare lo spam in chat: + +1. **Indicatore di Lavoro** : Appena ricevuto il prompt, invia l'azione **`ChatAction.TYPING`** (`sta scrivendo...`) per dare feedback immediato all'utente. +2. **Messaggio Placeholder** : Invia un messaggio iniziale (es. "Elaborazione in corso, attendere...") e **memorizza il suo `message_id`** . +3. **Aggiornamento in Tempo Reale** : Per ogni *output parziale* (`poutput`) ricevuto dalla tua LLM, utilizza la funzione **`edit_message_text`** passando l'ID del messaggio memorizzato. Questo aggiornerà continuamente l'unico messaggio esistente in chat. +4. **Output Finale** : Una volta che la LLM ha terminato, esegui l'ultima modifica del messaggio (o inviane uno nuovo, a tua discrezione) e **resetta lo stato** dell'utente per un nuovo ciclo di interazione. + +### Gestione degli Errori + +Integra un gestore di eccezioni (`try...except`) per catturare eventuali errori durante la chiamata all'API della LLM, inviando un messaggio informativo e di scuse all'utente. diff --git a/pyproject.toml b/pyproject.toml index d039c6b..e901f1f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,7 @@ dependencies = [ "pytest", # Test "dotenv", # Gestire variabili d'ambiente (generalmente API keys od opzioni) "gradio", # UI web semplice con user_input e output + "python-telegram-bot", # Interfaccia Telegram Bot # Per costruire agenti (ovvero modelli che possono fare più cose tramite tool) https://github.com/agno-agi/agno # altamente consigliata dato che ha anche tools integrati per fare scraping, calcoli e molto altro diff --git a/uv.lock b/uv.lock index d8114d6..b8b4dad 100644 --- a/uv.lock +++ b/uv.lock @@ -1289,6 +1289,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, ] +[[package]] +name = "python-telegram-bot" +version = "22.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0b/6b/400f88e5c29a270c1c519a3ca8ad0babc650ec63dbfbd1b73babf625ed54/python_telegram_bot-22.5.tar.gz", hash = "sha256:82d4efd891d04132f308f0369f5b5929e0b96957901f58bcef43911c5f6f92f8", size = 1488269, upload-time = "2025-09-27T13:50:27.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/c3/340c7520095a8c79455fcf699cbb207225e5b36490d2b9ee557c16a7b21b/python_telegram_bot-22.5-py3-none-any.whl", hash = "sha256:4b7cd365344a7dce54312cc4520d7fa898b44d1a0e5f8c74b5bd9b540d035d16", size = 730976, upload-time = "2025-09-27T13:50:25.93Z" }, +] + [[package]] name = "pytz" version = "2025.2" @@ -1614,6 +1626,7 @@ dependencies = [ { name = "praw" }, { name = "pytest" }, { name = "python-binance" }, + { name = "python-telegram-bot" }, { name = "yfinance" }, ] @@ -1631,6 +1644,7 @@ requires-dist = [ { name = "praw" }, { name = "pytest" }, { name = "python-binance" }, + { name = "python-telegram-bot" }, { name = "yfinance" }, ]