Refactoring main

Aggiornato il file .env.example.
Aggiunta la funzione available_keys() in app.py per controllare le chiavi API disponibili.
Spostato example.py nelle demo.
Rimosso requirements.txt.
This commit is contained in:
2025-09-25 21:03:11 +02:00
parent 023cf575cf
commit 60c555fd8c
5 changed files with 63 additions and 122 deletions

View File

@@ -5,14 +5,16 @@
# Non so se saranno tutte necessarie, ma visto i limiti di utilizzo è meglio averle tutte # Non so se saranno tutte necessarie, ma visto i limiti di utilizzo è meglio averle tutte
# in modo da poterle usare a rotazione o metterne una per agenti diversi # in modo da poterle usare a rotazione o metterne una per agenti diversi
# Vedi https://docs.agno.com/examples/models per vedere tutti i modelli supportati # Vedi https://docs.agno.com/examples/models per vedere tutti i modelli supportati
# Per ora ho notato che solo Google permette di usare i suoi modelli gratis (seppur con limiti di utilizzo)
# Google Limits: https://ai.google.dev/gemini-api/docs/rate-limits
GOOGLE_API_KEY= GOOGLE_API_KEY=
ANTHROPIC_API_KEY= ANTHROPIC_API_KEY=
DEEPSEEK_API_KEY= DEEPSEEK_API_KEY=
OPENAI_API_KEY= OPENAI_API_KEY=
# Dipende dal sistema operativo
# windows: C:\Users\<user>\.ollama
# mac: /Users/<user>/.ollama
# linux: /home/<user>/.ollama
# wsl: /usr/share/ollama/.ollama
OLLAMA_MODELS_PATH=
# Coinbase CDP API per Market Agent # Coinbase CDP API per Market Agent
# Ottenibili da: https://portal.cdp.coinbase.com/access/api # Ottenibili da: https://portal.cdp.coinbase.com/access/api
@@ -29,10 +31,3 @@ CRYPTOCOMPARE_AUTH_METHOD=query
# Binance API per Market Agent (alternativa) # Binance API per Market Agent (alternativa)
BINANCE_API_KEY= BINANCE_API_KEY=
BINANCE_API_SECRET= BINANCE_API_SECRET=
# Dipende dal sistema operativo
# windows: C:\Users\<user>\.ollama
# mac: /Users/<user>/.ollama
# linux: /home/<user>/.ollama
# wsl: /usr/share/ollama/.ollama
OLLAMA_MODELS_PATH=

View File

@@ -14,7 +14,7 @@ L'obiettivo è quello di creare un sistema di consulenza finanziaria basato su L
- [Installazione in locale con UV](#installazione-in-locale-con-uv) - [Installazione in locale con UV](#installazione-in-locale-con-uv)
- [Installazione con Docker](#installazione-con-docker) - [Installazione con Docker](#installazione-con-docker)
- [Applicazione](#applicazione) - [Applicazione](#applicazione)
- [Ultimo Aggiornamento](#ultimo aggiornamento) - [Ultimo Aggiornamento](#ultimo-aggiornamento)
- [Tests](#tests) - [Tests](#tests)
# **Installazione** # **Installazione**

View File

@@ -1,78 +0,0 @@
agno==2.0.5
aiofiles==24.1.0
annotated-types==0.7.0
anthropic==0.68.0
anyio==4.10.0
beautifulsoup4==4.13.5
brotli==1.1.0
cachetools==5.5.2
certifi==2025.8.3
charset-normalizer==3.4.3
click==8.2.1
distro==1.9.0
docstring-parser==0.17.0
dotenv==0.9.9
fastapi==0.116.2
ffmpy==0.6.1
filelock==3.19.1
fsspec==2025.9.0
gitdb==4.0.12
gitpython==3.1.45
google==3.0.0
google-auth==2.40.3
google-genai==1.38.0
gradio==5.46.0
gradio-client==1.13.0
groovy==0.1.2
h11==0.16.0
hf-xet==1.1.10
httpcore==1.0.9
httpx==0.28.1
huggingface-hub==0.35.0
idna==3.10
jinja2==3.1.6
jiter==0.11.0
markdown-it-py==4.0.0
markupsafe==3.0.2
mdurl==0.1.2
numpy==2.3.3
ollama==0.5.4
openai==1.107.3
orjson==3.11.3
packaging==25.0
pandas==2.3.2
pillow==11.3.0
pyasn1==0.6.1
pyasn1-modules==0.4.2
pydantic==2.11.9
pydantic-core==2.33.2
pydantic-settings==2.10.1
pydub==0.25.1
pygments==2.19.2
python-dateutil==2.9.0.post0
python-dotenv==1.1.1
python-multipart==0.0.20
pytz==2025.2
pyyaml==6.0.2
requests==2.32.5
rich==14.1.0
rsa==4.9.1
ruff==0.13.0
safehttpx==0.1.6
semantic-version==2.10.0
shellingham==1.5.4
six==1.17.0
smmap==5.0.2
sniffio==1.3.1
soupsieve==2.8
starlette==0.48.0
tenacity==9.1.2
tomlkit==0.13.3
tqdm==4.67.1
typer==0.17.4
typing-extensions==4.15.0
typing-inspection==0.4.1
tzdata==2025.2
urllib3==2.5.0
uvicorn==0.35.0
websockets==15.0.1

View File

@@ -1,41 +1,65 @@
import gradio as gr
import sys
import os import os
import gradio as gr
# Aggiungi src al Python path per gli import from dotenv import load_dotenv
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from app.tool import ToolAgent from app.tool import ToolAgent
tool_agent = ToolAgent() def available_keys():
"""
Controlla quali provider di modelli LLM hanno le loro API keys disponibili
come variabili d'ambiente e ritorna una lista di provider disponibili.
Se nessuna API key è disponibile, ritorna solo 'mock' come opzione.
"""
availables = []
if os.getenv("GOOGLE_API_KEY"):
availables.append("google")
if os.getenv("OPENAI_API_KEY"):
availables.append("openai")
if os.getenv("ANTHROPIC_API_KEY"):
availables.append("anthropic")
if os.getenv("DEEPSEEK_API_KEY"):
availables.append("deepseek")
if os.getenv("OLLAMA_MODELS_PATH"):
availables.append("ollama")
def analyze_request(user_input, provider, style): return ['mock', *availables]
try:
return tool_agent.interact(user_input, provider=provider, style=style)
except Exception as e:
return f"❌ Errore: {str(e)}"
with gr.Blocks() as demo:
gr.Markdown("# 🤖 Agente di Analisi e Consulenza Crypto")
with gr.Row():
provider = gr.Dropdown(
choices=["mock", "openai", "anthropic", "google", "deepseek", "ollama"],
value="mock",
label="Modello da usare"
)
style = gr.Dropdown(
choices=["conservative", "aggressive"],
value="conservative",
label="Stile di investimento"
)
user_input = gr.Textbox(label="Richiesta utente")
output = gr.Textbox(label="Risultato analisi", lines=12)
analyze_btn = gr.Button("🔎 Analizza")
analyze_btn.click(fn=analyze_request, inputs=[user_input, provider, style], outputs=output)
########################################
# MAIN APP & GRADIO INTERFACE
########################################
if __name__ == "__main__": if __name__ == "__main__":
demo.launch() ######################################
# DA FARE PRIMA DI ESEGUIRE L'APP
# qui carichiamo le variabili d'ambiente dal file .env
# una volta fatto, possiamo usare le API keys senza problemi
# quindi non è necessario richiamare load_dotenv() altrove
load_dotenv()
######################################
tool_agent = ToolAgent()
with gr.Blocks() as demo:
gr.Markdown("# 🤖 Agente di Analisi e Consulenza Crypto")
with gr.Row():
list_choices = available_keys()
provider = gr.Dropdown(
choices=list_choices,
value=list_choices[0],
label="Modello da usare"
)
style = gr.Dropdown(
choices=["conservative", "aggressive"],
value="conservative",
label="Stile di investimento"
)
user_input = gr.Textbox(label="Richiesta utente")
output = gr.Textbox(label="Risultato analisi", lines=12)
analyze_btn = gr.Button("🔎 Analizza")
analyze_btn.click(fn=tool_agent.interact, inputs=[user_input, provider, style], outputs=output)
if __name__ == "__main__":
demo.launch()