diff --git a/.env.example b/.env.example index eb08df3..e2dce26 100644 --- a/.env.example +++ b/.env.example @@ -5,14 +5,16 @@ # 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 # 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= ANTHROPIC_API_KEY= DEEPSEEK_API_KEY= OPENAI_API_KEY= +# Dipende dal sistema operativo +# windows: C:\Users\\.ollama +# mac: /Users//.ollama +# linux: /home//.ollama +# wsl: /usr/share/ollama/.ollama +OLLAMA_MODELS_PATH= # Coinbase CDP API per Market Agent # 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_KEY= BINANCE_API_SECRET= - -# Dipende dal sistema operativo -# windows: C:\Users\\.ollama -# mac: /Users//.ollama -# linux: /home//.ollama -# wsl: /usr/share/ollama/.ollama -OLLAMA_MODELS_PATH= \ No newline at end of file diff --git a/README.md b/README.md index cc5e5c3..a96c7ab 100644 --- a/README.md +++ b/README.md @@ -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 con Docker](#installazione-con-docker) - [Applicazione](#applicazione) - - [Ultimo Aggiornamento](#ultimo aggiornamento) + - [Ultimo Aggiornamento](#ultimo-aggiornamento) - [Tests](#tests) # **Installazione** diff --git a/src/example.py b/demos/example.py similarity index 100% rename from src/example.py rename to demos/example.py diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 96dabe3..0000000 --- a/requirements.txt +++ /dev/null @@ -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 diff --git a/src/app.py b/src/app.py index 4d7e161..e3dab64 100644 --- a/src/app.py +++ b/src/app.py @@ -1,41 +1,65 @@ -import gradio as gr -import sys import os +import gradio as gr -# Aggiungi src al Python path per gli import -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) - +from dotenv import load_dotenv 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): - try: - return tool_agent.interact(user_input, provider=provider, style=style) - except Exception as e: - return f"โŒ Errore: {str(e)}" + return ['mock', *availables] -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__": - 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()