Add Telegram bot support #23
11
.env.example
11
.env.example
@@ -5,6 +5,7 @@
|
|||||||
# https://makersuite.google.com/app/apikey
|
# https://makersuite.google.com/app/apikey
|
||||||
GOOGLE_API_KEY=
|
GOOGLE_API_KEY=
|
||||||
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Configurazioni per gli agenti di mercato
|
# Configurazioni per gli agenti di mercato
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@@ -21,6 +22,7 @@ CRYPTOCOMPARE_API_KEY=
|
|||||||
BINANCE_API_KEY=
|
BINANCE_API_KEY=
|
||||||
BINANCE_API_SECRET=
|
BINANCE_API_SECRET=
|
||||||
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Configurazioni per gli agenti di notizie
|
# Configurazioni per gli agenti di notizie
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@@ -31,6 +33,7 @@ NEWS_API_KEY=
|
|||||||
# https://cryptopanic.com/developers/api/
|
# https://cryptopanic.com/developers/api/
|
||||||
CRYPTOPANIC_API_KEY=
|
CRYPTOPANIC_API_KEY=
|
||||||
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Configurazioni per API di social media
|
# Configurazioni per API di social media
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@@ -38,3 +41,11 @@ CRYPTOPANIC_API_KEY=
|
|||||||
# https://www.reddit.com/prefs/apps
|
# https://www.reddit.com/prefs/apps
|
||||||
REDDIT_API_CLIENT_ID=
|
REDDIT_API_CLIENT_ID=
|
||||||
REDDIT_API_CLIENT_SECRET=
|
REDDIT_API_CLIENT_SECRET=
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Configurazioni per API di messaggistica
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
# https://core.telegram.org/bots/features#creating-a-new-bot
|
||||||
|
TELEGRAM_BOT_TOKEN=
|
||||||
|
|||||||
46
docs/Telegram_Integration_plan.md
Normal file
46
docs/Telegram_Integration_plan.md
Normal file
@@ -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.
|
||||||
@@ -13,6 +13,7 @@ dependencies = [
|
|||||||
"pytest", # Test
|
"pytest", # Test
|
||||||
"dotenv", # Gestire variabili d'ambiente (generalmente API keys od opzioni)
|
"dotenv", # Gestire variabili d'ambiente (generalmente API keys od opzioni)
|
||||||
"gradio", # UI web semplice con user_input e output
|
"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
|
# 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
|
# altamente consigliata dato che ha anche tools integrati per fare scraping, calcoli e molto altro
|
||||||
|
|||||||
14
uv.lock
generated
14
uv.lock
generated
@@ -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" },
|
{ 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]]
|
[[package]]
|
||||||
name = "pytz"
|
name = "pytz"
|
||||||
version = "2025.2"
|
version = "2025.2"
|
||||||
@@ -1614,6 +1626,7 @@ dependencies = [
|
|||||||
{ name = "praw" },
|
{ name = "praw" },
|
||||||
{ name = "pytest" },
|
{ name = "pytest" },
|
||||||
{ name = "python-binance" },
|
{ name = "python-binance" },
|
||||||
|
{ name = "python-telegram-bot" },
|
||||||
{ name = "yfinance" },
|
{ name = "yfinance" },
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1631,6 +1644,7 @@ requires-dist = [
|
|||||||
{ name = "praw" },
|
{ name = "praw" },
|
||||||
{ name = "pytest" },
|
{ name = "pytest" },
|
||||||
{ name = "python-binance" },
|
{ name = "python-binance" },
|
||||||
|
{ name = "python-telegram-bot" },
|
||||||
{ name = "yfinance" },
|
{ name = "yfinance" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user