Telegram bot support (#23)

* Aggiungi supporto per il bot Telegram: aggiorna .env.example, pyproject.toml e uv.lock

* demo per bot Telegram con gestione comandi e inline keyboard

* Implementazione del bot Telegram con gestione dei comandi e stati di conversazione iniziali

* Aggiorna la gestione delle configurazioni nel bot Telegram: modifica gli stati della conversazione e aggiungi il supporto per la gestione dei messaggi.

* fix static models & readme

* aggiunto il supporto per la query dell'utente e modificata la visualizzazione dei messaggi di stato.

* Aggiunto il supporto per la gestione del bot Telegram e aggiornata la configurazione del pipeline

* Aggiornato .gitignore per includere la cartella .gradio e rimosso chroma_db. Aggiunto il supporto per la generazione di report in PDF utilizzando markdown-pdf nel bot Telegram.

* Refactor pipeline and chat manager for improved structure and functionality

* Better logging

* Aggiornato il comportamento del logging per i logger di agno. Aggiunto il supporto per l'opzione check_for_async nella configurazione di RedditWrapper.

* Rimosso codice commentato e import non utilizzati nella classe Pipeline per semplificare la struttura

* Aggiornata la sezione "Applicazione" nel README & fix main

* Telegram instance instead of static

* Fix logging to use labels for team model, leader model, and strategy

* Rinomina il lock da _lock a __lock per garantire l'incapsulamento nella classe AppConfig

* Rinomina i logger per una migliore identificazione e gestisce le eccezioni nel bot di Telegram

* Aggiorna i messaggi di errore nel gestore Telegram per una migliore chiarezza e modifica il commento nel file di configurazione per riflettere lo stato del modello.

* Aggiungi un messaggio di attesa durante la generazione del report nel bot di Telegram
This commit was merged in pull request #23.
This commit is contained in:
Giacomo Bertolazzi
2025-10-13 10:49:46 +02:00
committed by GitHub
parent 45a17d4570
commit c96617a039
15 changed files with 541 additions and 149 deletions

View File

@@ -1,5 +1,8 @@
import json
import os
import json
import gradio as gr
from app.agents.pipeline import Pipeline
class ChatManager:
"""
@@ -9,8 +12,9 @@ class ChatManager:
- salva e ricarica le chat
"""
def __init__(self):
def __init__(self, pipeline: Pipeline):
self.history: list[dict[str, str]] = [] # [{"role": "user"/"assistant", "content": "..."}]
self.pipeline = pipeline
def send_message(self, message: str) -> None:
"""
@@ -56,3 +60,66 @@ class ChatManager:
Restituisce lo storico completo della chat.
"""
return self.history
########################################
# Funzioni Gradio
########################################
def gradio_respond(self, message: str, history: list[dict[str, str]]) -> tuple[list[dict[str, str]], list[dict[str, str]], str]:
self.send_message(message)
response = self.pipeline.interact(message)
self.receive_message(response)
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": response})
return history, history, ""
def gradio_save(self) -> str:
self.save_chat("chat.json")
return "💾 Chat salvata in chat.json"
def gradio_load(self) -> tuple[list[dict[str, str]], list[dict[str, str]]]:
self.load_chat("chat.json")
history: list[dict[str, str]] = []
for m in self.get_history():
history.append({"role": m["role"], "content": m["content"]})
return history, history
def gradio_clear(self) -> tuple[list[dict[str, str]], list[dict[str, str]]]:
self.reset_chat()
return [], []
def gradio_build_interface(self) -> gr.Blocks:
with gr.Blocks() as interface:
gr.Markdown("# 🤖 Agente di Analisi e Consulenza Crypto (Chat)")
# Dropdown provider e stile
with gr.Row():
provider = gr.Dropdown(
choices=self.pipeline.list_providers(),
type="index",
label="Modello da usare"
)
provider.change(fn=self.pipeline.choose_leader, inputs=provider, outputs=None)
style = gr.Dropdown(
choices=self.pipeline.list_styles(),
type="index",
label="Stile di investimento"
)
style.change(fn=self.pipeline.choose_strategy, inputs=style, outputs=None)
chatbot = gr.Chatbot(label="Conversazione", height=500, type="messages")
msg = gr.Textbox(label="Scrivi la tua richiesta", placeholder="Es: Quali sono le crypto interessanti oggi?")
with gr.Row():
clear_btn = gr.Button("🗑️ Reset Chat")
save_btn = gr.Button("💾 Salva Chat")
load_btn = gr.Button("📂 Carica Chat")
# Eventi e interazioni
msg.submit(self.gradio_respond, inputs=[msg, chatbot], outputs=[chatbot, chatbot, msg])
clear_btn.click(self.gradio_clear, inputs=None, outputs=[chatbot, chatbot])
save_btn.click(self.gradio_save, inputs=None, outputs=None)
load_btn.click(self.gradio_load, inputs=None, outputs=[chatbot, chatbot])
return interface