Update chat interface #70
9
src/app/agents/action_registry.py
Normal file
9
src/app/agents/action_registry.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Registro popolato da tutti i file Toolkit presenti all'avvio.
|
||||||
|
ACTION_DESCRIPTIONS: dict[str, str] = {}
|
||||||
|
|
||||||
|
def register_friendly_actions(actions: dict[str, str]):
|
||||||
|
"""
|
||||||
|
|
|||||||
|
Aggiunge le descrizioni di un Toolkit al registro globale.
|
||||||
|
"""
|
||||||
|
global ACTION_DESCRIPTIONS
|
||||||
|
ACTION_DESCRIPTIONS.update(actions)
|
||||||
@@ -8,11 +8,21 @@ from agno.run.workflow import WorkflowRunEvent
|
|||||||
from agno.workflow.types import StepInput, StepOutput
|
from agno.workflow.types import StepInput, StepOutput
|
||||||
from agno.workflow.step import Step
|
from agno.workflow.step import Step
|
||||||
from agno.workflow.workflow import Workflow
|
from agno.workflow.workflow import Workflow
|
||||||
|
|
||||||
|
from app.agents.action_registry import ACTION_DESCRIPTIONS
|
||||||
from app.agents.core import *
|
from app.agents.core import *
|
||||||
|
|
||||||
logging = logging.getLogger("pipeline")
|
logging = logging.getLogger("pipeline")
|
||||||
|
|
||||||
|
|
||||||
|
def _get_user_friendly_action(tool_name: str) -> str:
|
||||||
|
"""
|
||||||
|
Restituisce un messaggio leggibile e descrittivo per l'utente
|
||||||
|
leggendo dal registro globale.
|
||||||
|
"""
|
||||||
|
# Usa il dizionario ACTION_DESCRIPTIONS importato
|
||||||
|
return ACTION_DESCRIPTIONS.get(tool_name, f"⚙️ Eseguo l'operazione: {tool_name}...")
|
||||||
|
|
||||||
|
|
||||||
class PipelineEvent(str, Enum):
|
class PipelineEvent(str, Enum):
|
||||||
QUERY_CHECK = "Query Check"
|
QUERY_CHECK = "Query Check"
|
||||||
@@ -201,31 +211,3 @@ class Pipeline:
|
|||||||
else:
|
else:
|
||||||
logging.error(f"No output from workflow: {content}")
|
logging.error(f"No output from workflow: {content}")
|
||||||
yield "Nessun output dal workflow, qualcosa è andato storto."
|
yield "Nessun output dal workflow, qualcosa è andato storto."
|
||||||
|
|
||||||
# Funzione di utilità per messaggi user-friendly
|
|
||||||
def _get_user_friendly_action(tool_name: str) -> str:
|
|
||||||
"""
|
|
||||||
Restituisce un messaggio leggibile e descrittivo per l'utente
|
|
||||||
in base al nome dello strumento o funzione invocata.
|
|
||||||
"""
|
|
||||||
descriptions = {
|
|
||||||
# --- MarketAPIsTool ---
|
|
||||||
"get_product": "🔍 Recupero le informazioni sul prodotto richiesto...",
|
|
||||||
"get_products": "📦 Recupero i dati su più asset...",
|
|
||||||
"get_historical_prices": "📊 Recupero i dati storici dei prezzi...",
|
|
||||||
"get_products_aggregated": "🧩 Aggrego le informazioni da più fonti...",
|
|
||||||
"get_historical_prices_aggregated": "📈 Creo uno storico aggregato dei prezzi...",
|
|
||||||
|
|
||||||
# --- NewsAPIsTool (Aggiunto) ---
|
|
||||||
"get_top_headlines": "📰 Cerco le notizie principali...",
|
|
||||||
"get_latest_news": "🔎 Cerco notizie recenti su un argomento...",
|
|
||||||
"get_top_headlines_aggregated": "🗞️ Raccolgo le notizie principali da tutte le fonti...",
|
|
||||||
"get_latest_news_aggregated": "📚 Raccolgo notizie specifiche da tutte le fonti...",
|
|
||||||
|
|
||||||
# --- SocialAPIsTool (Aggiunto) ---
|
|
||||||
"get_top_crypto_posts": "📱 Cerco i post più popolari sui social...",
|
|
||||||
"get_top_crypto_posts_aggregated": "🌐 Raccolgo i post da tutte le piattaforme social...",
|
|
||||||
}
|
|
||||||
|
|
||||||
# Messaggio di fallback generico
|
|
||||||
return descriptions.get(tool_name, f"⚙️ Eseguo l'operazione: {tool_name}...")
|
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
from agno.tools import Toolkit
|
from agno.tools import Toolkit
|
||||||
|
|
||||||
|
from app.agents.action_registry import register_friendly_actions
|
||||||
from app.api.wrapper_handler import WrapperHandler
|
from app.api.wrapper_handler import WrapperHandler
|
||||||
from app.api.core.markets import MarketWrapper, Price, ProductInfo
|
from app.api.core.markets import MarketWrapper, Price, ProductInfo
|
||||||
from app.api.markets import BinanceWrapper, CoinBaseWrapper, CryptoCompareWrapper, YFinanceWrapper
|
from app.api.markets import BinanceWrapper, CoinBaseWrapper, CryptoCompareWrapper, YFinanceWrapper
|
||||||
@@ -127,3 +129,11 @@ class MarketAPIsTool(MarketWrapper, Toolkit):
|
|||||||
"""
|
"""
|
||||||
all_prices = self.handler.try_call_all(lambda w: w.get_historical_prices(asset_id, limit))
|
all_prices = self.handler.try_call_all(lambda w: w.get_historical_prices(asset_id, limit))
|
||||||
return Price.aggregate(all_prices)
|
return Price.aggregate(all_prices)
|
||||||
|
|
||||||
|
register_friendly_actions({
|
||||||
|
"get_product": "🔍 Recupero le informazioni sul prodotto richiesto...",
|
||||||
|
"get_products": "📦 Recupero i dati su più asset...",
|
||||||
|
"get_historical_prices": "📊 Recupero i dati storici dei prezzi...",
|
||||||
|
"get_products_aggregated": "🧩 Aggrego le informazioni da più fonti...",
|
||||||
|
"get_historical_prices_aggregated": "📈 Creo uno storico aggregato dei prezzi...",
|
||||||
|
})
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
from agno.tools import Toolkit
|
from agno.tools import Toolkit
|
||||||
|
|
||||||
|
from app.agents.action_registry import register_friendly_actions
|
||||||
from app.api.wrapper_handler import WrapperHandler
|
from app.api.wrapper_handler import WrapperHandler
|
||||||
from app.api.core.news import NewsWrapper, Article
|
from app.api.core.news import NewsWrapper, Article
|
||||||
from app.api.news import NewsApiWrapper, GoogleNewsWrapper, CryptoPanicWrapper, DuckDuckGoWrapper
|
from app.api.news import NewsApiWrapper, GoogleNewsWrapper, CryptoPanicWrapper, DuckDuckGoWrapper
|
||||||
@@ -111,3 +113,10 @@ class NewsAPIsTool(NewsWrapper, Toolkit):
|
|||||||
Exception: If all providers fail to return results.
|
Exception: If all providers fail to return results.
|
||||||
"""
|
"""
|
||||||
return self.handler.try_call_all(lambda w: w.get_latest_news(query, limit))
|
return self.handler.try_call_all(lambda w: w.get_latest_news(query, limit))
|
||||||
|
|
||||||
|
register_friendly_actions({
|
||||||
|
"get_top_headlines": "📰 Cerco le notizie principali...",
|
||||||
|
"get_latest_news": "🔎 Cerco notizie recenti su un argomento...",
|
||||||
|
"get_top_headlines_aggregated": "🗞️ Raccolgo le notizie principali da tutte le fonti...",
|
||||||
|
"get_latest_news_aggregated": "📚 Raccolgo notizie specifiche da tutte le fonti...",
|
||||||
|
})
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
from agno.tools import Toolkit
|
from agno.tools import Toolkit
|
||||||
|
|
||||||
|
from app.agents.action_registry import register_friendly_actions
|
||||||
from app.api.wrapper_handler import WrapperHandler
|
from app.api.wrapper_handler import WrapperHandler
|
||||||
from app.api.core.social import SocialPost, SocialWrapper
|
from app.api.core.social import SocialPost, SocialWrapper
|
||||||
from app.api.social import *
|
from app.api.social import *
|
||||||
@@ -73,3 +75,8 @@ class SocialAPIsTool(SocialWrapper, Toolkit):
|
|||||||
Exception: If all providers fail to return results.
|
Exception: If all providers fail to return results.
|
||||||
"""
|
"""
|
||||||
return self.handler.try_call_all(lambda w: w.get_top_crypto_posts(limit_per_wrapper))
|
return self.handler.try_call_all(lambda w: w.get_top_crypto_posts(limit_per_wrapper))
|
||||||
|
|
||||||
|
register_friendly_actions({
|
||||||
|
"get_top_crypto_posts": "📱 Cerco i post più popolari sui social...",
|
||||||
|
"get_top_crypto_posts_aggregated": "🌐 Raccolgo i post da tutte le piattaforme social...",
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user
Sarebbe più corretto metterlo dentro il file core.py dato che ci sono tutte le interazioni core con la pipeline.
O ancor meglio che sia un decorator da mettere su ogni funzione di cui si vuole avere una descrizione e che aggiorna il registro, che sia dentro la classe RunMessage o che sia libero
Stavo tentando di farne un decorator, ma sfruttando il decorator @tool di agno che però sminchiava il Toolkit. Alla fine ho fatto questo accrocchio che non mi soddisfa in pieno, ma non avevo più tempo e funziona.
Non chiudere ancora la pull request che domani provo a fare un decoratore custom così evitiamo quel registro che ho improvvisato