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:
17
.env.example
17
.env.example
@@ -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=
|
|
||||||
@@ -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**
|
||||||
|
|||||||
@@ -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
|
|
||||||
88
src/app.py
88
src/app.py
@@ -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()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user