Files
upo-app-agents/src/app/tool.py
Berack96 3e746cdd45 Fixed Docker
- Update Dockerfile, docker-compose
- fixed app instructions not working
- fixed json ouput sanification
- added tests for predictor
2025-09-26 12:45:05 +02:00

67 lines
2.8 KiB
Python

from app.agents.news_agent import NewsAgent
from app.agents.social_agent import SocialAgent
from app.agents import predictor
from app.agents.predictor import PredictorStyle
from app.markets import get_first_available_market_api
from app.models import Models
class ToolAgent:
"""
Classe principale che coordina gli agenti per rispondere alle richieste dell'utente.
available_models: lista dei modelli disponibili (Models.availables()).
all_styles: lista degli stili di previsione disponibili (PredictorStyle).
"""
def __init__(self, available_models: list[Models], all_styles: list[PredictorStyle]):
"""
Inizializza l'agente con i modelli e gli stili disponibili.
"""
self.available_models = available_models
self.all_styles = all_styles
self.market = get_first_available_market_api(currency="USD")
self.choose_provider(0) # Default to the first model
def choose_provider(self, index: int):
"""
Sceglie il modello LLM da utilizzare in base all'indice fornito.
index: indice del modello nella lista available_models.
"""
# TODO Utilizzare AGNO per gestire i modelli... è molto più semplice e permette di cambiare modello facilmente
# TODO https://docs.agno.com/introduction
# Inoltre permette di creare dei team e workflow di agenti più facilmente
chosen_model = self.available_models[index]
self.predictor = chosen_model.get_agent(predictor.instructions())
self.news_agent = NewsAgent()
self.social_agent = SocialAgent()
def interact(self, query: str, style_index: int):
"""
Funzione principale che coordina gli agenti per rispondere alla richiesta dell'utente.
query: richiesta dell'utente (es. "Qual è la previsione per Bitcoin?")
style_index: indice dello stile di previsione nella lista all_styles.
"""
# Step 1: raccolta analisi
cryptos = ["BTC", "ETH", "XRP", "LTC", "BCH"] # TODO rendere dinamico in futuro
market_data = self.market.get_products(cryptos)
news_sentiment = self.news_agent.analyze(query)
social_sentiment = self.social_agent.analyze(query)
# Step 2: aggrega sentiment
sentiment = f"{news_sentiment}\n{social_sentiment}"
# Step 3: previsione
inputs = predictor.prepare_inputs(
data=market_data,
style=self.all_styles[style_index],
sentiment=sentiment
)
prediction = self.predictor.run(inputs)
output = Models.extract_json_str_from_response(prediction.content)
market_data = "\n".join([f"{product.symbol}: {product.price}" for product in market_data])
return f"{market_data}\n{sentiment}\n\n📈 Consiglio finale:\n{output}"