diff --git a/Dockerfile b/Dockerfile index d7f15df..7de13cf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,5 @@ # Vogliamo usare una versione di linux leggera con già uv installato # Infatti scegliamo l'immagine ufficiale di uv che ha già tutto configurato -# Nel caso in cui si volesse usare un'altra immagine di base che ha magari CUDA -# bisognerebbe installare uv manualmente come descritto nel README - FROM ghcr.io/astral-sh/uv:python3.12-alpine # Dopo aver definito la workdir mi trovo già in essa @@ -22,4 +19,4 @@ COPY LICENSE . COPY src ./src # Comando di default all'avvio dell'applicazione -CMD ["python", "src/example.py"] +CMD ["python", "src/app.py"] diff --git a/README.md b/README.md index b7d374f..0fbc43c 100644 --- a/README.md +++ b/README.md @@ -1,94 +1,88 @@ -# **Progetto di Esame: Da definire** -Questa è la repository per l'esame di Applicazioni Intelligenti che consiste in: -- Progetto per 2/3 del voto. -- Orale per 1/3 dei punti composto da: - - Presentazione (come se lo facessimo ad un cliente) di gruppo - - Orale singolo con domande del corso (teoria e strumenti visti) - -L'obiettivo di questo progetto è creare un sistema basato su **LLM Agents** e deve dimostrare la capacità di ragionare, adattarsi a eventi esterni e comunicare in modo intelligente. - -# Installazione -Per l'installazione si può utilizzare un approccio tramite **uv** (manuale) oppure utilizzare un ambiente **Docker** già pronto (automatico). - -Prima di avviare l'applicazione è però necessario configurare correttamente le API keys e installare Ollama per l'utilizzo dei modelli locali, altrimenti il progetto, anche se installato correttamente, non riuscirà a partire. - -## API Keys -Le API Keys puoi ottenerle tramite i seguenti servizi: -- **Google AI**: [Google AI Studio](https://makersuite.google.com/app/apikey) (gratuito con limiti) -- **Anthropic**: [Anthropic Console](https://console.anthropic.com/) -- **DeepSeek**: [DeepSeek Platform](https://platform.deepseek.com/) -- **OpenAI**: [OpenAI Platform](https://platform.openai.com/api-keys) - -Nota che alcune API sono gratuite con limiti di utilizzo, altre sono a pagamento. Google offre attualmente l'accesso gratuito con limiti ragionevoli. - -## Ollama (Modelli Locali) -Per utilizzare modelli AI localmente, è necessario installare Ollama: - -**1. Installazione Ollama**: -- **Linux**: - ```sh - curl -fsSL https://ollama.com/install.sh | sh - ``` -- **macOS/Windows**: Scarica l'installer da [https://ollama.com/download/windows](https://ollama.com/download/windows) - -**2. GPU Support (Raccomandato)**: -Per utilizzare la GPU con Ollama, assicurati di avere NVIDIA CUDA Toolkit installato: -- **Download**: [NVIDIA CUDA Downloads](https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=11&target_type=exe_local) -- **Documentazione WSL**: [CUDA WSL User Guide](https://docs.nvidia.com/cuda/wsl-user-guide/index.html) - -**3. Installazione Modelli**: -Esempio per installare un modello locale: -```sh -ollama pull gemma3:4b -``` - -### Variabili d'Ambiente - -**1. Copia il file di esempio**: -```sh -cp .env.example .env -``` - -**2. Modifica il file .env** creato con le tue API keys e il path dei modelli Ollama, inserendoli nelle variabili opportune dopo l'uguale e ***senza*** spazi: -```dotenv -GOOGLE_API_KEY= -ANTHROPIC_API_KEY= -DEEPSEEK_API_KEY= -OPENAI_API_KEY= -# Path dove Ollama salva i modelli (es. /home/username/.ollama su Linux) -OLLAMA_MODELS_PATH= -``` - -### Opzione 1 UV -**1. Installazione uv**: Per prima cosa installa uv se non è già presente sul sistema: -```sh -# Windows (PowerShell) -powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" - -# macOS/Linux -curl -LsSf https://astral.sh/uv/install.sh | sh -``` - -**2. Ambiente e dipendenze**: uv installerà python e creerà automaticamente l'ambiente virtuale con le dipendenze corrette: -```sh -uv sync --frozen --no-cache -``` - -**3. Run**: Successivamente si può far partire il progetto tramite il comando: -```sh -uv run python src/app.py -``` - -### Opzione 2 Docker -Alternativamente, se si ha installato [Docker](https://www.docker.com), si può utilizzare il [Dockerfile](Dockerfile) e il [docker-compose.yaml](docker-compose.yaml) per creare il container con tutti i file necessari e già in esecuzione: - -**IMPORTANTE**: Assicurati di aver configurato il file `.env` come descritto sopra prima di avviare Docker. - -```sh -docker compose up --build -d -``` - -Il file `.env` verrà automaticamente caricato nel container grazie alla configurazione in `docker-compose.yaml`. - -# Applicazione -L'applicazione è attualmente in fase di sviluppo. Maggiori dettagli saranno aggiunti durante l'implementazione. +# **Progetto di Esame: Da definire** +Questa è la repository per l'esame di Applicazioni Intelligenti che consiste in: +- Progetto per 2/3 del voto. +- Orale per 1/3 dei punti composto da: + - Presentazione (come se lo facessimo ad un cliente) di gruppo + - Orale singolo con domande del corso (teoria e strumenti visti) + +L'obiettivo di questo progetto è creare un sistema basato su **LLM Agents** e deve dimostrare la capacità di ragionare, adattarsi a eventi esterni e comunicare in modo intelligente. + +# Installazione +Per l'installazione si può utilizzare un approccio tramite **uv** (manuale) oppure utilizzare un ambiente **Docker** già pronto (automatico). + +Prima di avviare l'applicazione è però necessario configurare correttamente le API keys e installare Ollama per l'utilizzo dei modelli locali, altrimenti il progetto, anche se installato correttamente, non riuscirà a partire. + +### API Keys +Le API Keys puoi ottenerle tramite i seguenti servizi: +- **Google AI**: [Google AI Studio](https://makersuite.google.com/app/apikey) (gratuito con limiti) +- **Anthropic**: [Anthropic Console](https://console.anthropic.com/) +- **DeepSeek**: [DeepSeek Platform](https://platform.deepseek.com/) +- **OpenAI**: [OpenAI Platform](https://platform.openai.com/api-keys) + +Nota che alcune API sono gratuite con limiti di utilizzo, altre sono a pagamento. Google offre attualmente l'accesso gratuito con limiti ragionevoli. + +### Ollama (Modelli Locali) +Per utilizzare modelli AI localmente, è necessario installare Ollama: + +**1. Installazione Ollama**: +- **Linux**: `curl -fsSL https://ollama.com/install.sh | sh` +- **macOS/Windows**: Scarica l'installer da [https://ollama.com/download/windows](https://ollama.com/download/windows) + +**2. GPU Support (Raccomandato)**: +Per utilizzare la GPU con Ollama, assicurati di avere NVIDIA CUDA Toolkit installato: +- **Download**: [NVIDIA CUDA Downloads](https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=11&target_type=exe_local) +- **Documentazione WSL**: [CUDA WSL User Guide](https://docs.nvidia.com/cuda/wsl-user-guide/index.html) + +**3. Installazione Modelli**: +Esempio per installare un modello locale: `ollama pull gpt-oss` + +### Variabili d'Ambiente + +**1. Copia il file di esempio**: +```sh +cp .env.example .env +``` + +**2. Modifica il file .env** creato con le tue API keys e il path dei modelli Ollama, inserendoli nelle variabili opportune dopo l'uguale e ***senza*** spazi: +```dotenv +GOOGLE_API_KEY= +ANTHROPIC_API_KEY= +DEEPSEEK_API_KEY= +OPENAI_API_KEY= +# Path dove Ollama salva i modelli (es. /home/username/.ollama su Linux) +OLLAMA_MODELS_PATH= +``` + +### Opzione 1 UV +**1. Installazione uv**: Per prima cosa installa uv se non è già presente sul sistema: +```sh +# Windows (PowerShell) +powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" + +# macOS/Linux +curl -LsSf https://astral.sh/uv/install.sh | sh +``` + +**2. Ambiente e dipendenze**: uv installerà python e creerà automaticamente l'ambiente virtuale con le dipendenze corrette: +```sh +uv sync --frozen --no-cache +``` + +**3. Run**: Successivamente si può far partire il progetto tramite il comando: +```sh +uv run python src/app.py +``` + +### Opzione 2 Docker +Alternativamente, se si ha installato [Docker](https://www.docker.com), si può utilizzare il [Dockerfile](Dockerfile) e il [docker-compose.yaml](docker-compose.yaml) per creare il container con tutti i file necessari e già in esecuzione: + +**IMPORTANTE**: Assicurati di aver configurato il file `.env` come descritto sopra prima di avviare Docker. + +```sh +docker compose up --build -d +``` + +Il file `.env` verrà automaticamente caricato nel container grazie alla configurazione in `docker-compose.yaml`. + +# Applicazione +L'applicazione è attualmente in fase di sviluppo. Maggiori dettagli saranno aggiunti durante l'implementazione. diff --git a/pyproject.toml b/pyproject.toml index 52049c3..c3fc0a2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,33 +1,29 @@ -[project] -name = "upo-app-ai" -version = "0.1.0" -description = "Agente di Pianificazione Viaggi Intelligente" -requires-python = "==3.12.*" - -# Qui ho messo alcune librerie utili utilizzate durante il corso. -# Se si nota che alcune non sono necessarie, si potrebbero rimuovere -# in modo da evitare conflitti o problemi futuri. -# Per ogni roba ho fatto un commento per evitare di dimenticarmi cosa fa chi. -# Inoltre ho messo una emoji per indicare se è raccomandato o meno. -dependencies = [ - # ✅ per gestire variabili d'ambiente (generalmente API keys o opzioni) - "dotenv", - - # 🟡 per fare scraping di pagine web - #"bs4", - - # ✅ per fare una UI web semplice con input e output - "gradio", - - # ❌ per l'elaborazione del linguaggio naturale in locale (https://huggingface.co/learn/llm-course/chapter1/3?fw=pt) - #"transformers", - # ❌ per fare chiamate a modelli indipendentemente dal modello specifico (astrae meglio rispetto a openai) - #"langchain", - # ✅ per costruire agenti (ovvero modelli che possono fare più cose tramite tool) https://github.com/agno-agi/agno - # altamente consigliata dato che ha anche tools integrati per fare scraping, calcoli e molto altro - # oltre a questa è necessario installare anche le librerie specifiche per i modelli che si vogliono usare - "agno", - "google-genai", - # ☑️ per usare modelli in locale - "ollama", -] +[project] +name = "upo-app-ai" +version = "0.1.0" +description = "Agente di Pianificazione Viaggi Intelligente" +requires-python = "==3.12.*" + +# Qui ho messo alcune librerie utili utilizzate durante il corso. +# Se si nota che alcune non sono necessarie, si potrebbero rimuovere +# in modo da evitare conflitti o problemi futuri. +# Per ogni roba ho fatto un commento per evitare di dimenticarmi cosa fa chi. +# Inoltre ho messo una emoji per indicare se è raccomandato o meno. +dependencies = [ + # ✅ per gestire variabili d'ambiente (generalmente API keys o opzioni) + "dotenv", + + # 🟡 per fare scraping di pagine web + #"bs4", + + # ✅ per fare una UI web semplice con input e output + "gradio", + + # ✅ per costruire agenti (ovvero modelli che possono fare più cose tramite tool) https://github.com/agno-agi/agno + # altamente consigliata dato che ha anche tools integrati per fare scraping, calcoli e molto altro + # oltre a questa è necessario installare anche le librerie specifiche per i modelli che si vogliono usare + "agno", + # ✅ Modelli supportati e installati (aggiungere qui sotto quelli che si vogliono usare) + "google-genai", + "ollama", +] diff --git a/src/app.py b/src/app.py index a5d1b08..0c76e79 100644 --- a/src/app.py +++ b/src/app.py @@ -1,8 +1,63 @@ -import agno -import gradio -import dotenv -import requests +from dotenv import load_dotenv +from enum import Enum + +from agno.agent import Agent +from agno.models.base import BaseModel +from agno.models.google import Gemini +from agno.models.ollama import Ollama +from agno.tools.reasoning import ReasoningTools + +class Model(Enum): + """ + Enum per i modelli supportati. + Aggiungere nuovi modelli qui se necessario. + Per quanto riguarda Ollama, i modelli dovrano essere scaricati e installati + localmente seguendo le istruzioni di https://ollama.com/docs/guide/install-models + """ + GEMINI = "gemini-2.0-flash" # API online + OLLAMA = "llama3.1" # little and fast (7b) but not so good + OLLAMA_GPT = "gpt-oss" # a bit big (13b) but very good (almost like gemini API) + OLLAMA_GEMMA = "gemma3:4b" # no tool support + OLLAMA_DEEP = "deepseek-r1:8b" # no tool support + OLLAMA_QWEN = "qwen3:8b" # good + +def get_model(model: Model, instructions:str = None) -> BaseModel: + """ + Restituisce un'istanza del modello specificato. + """ + name = model.value + + if model in {Model.GEMINI}: + return Gemini(name, instructions=instructions) + elif model in {Model.OLLAMA, Model.OLLAMA_GPT, Model.OLLAMA_GEMMA, Model.OLLAMA_DEEP, Model.OLLAMA_QWEN}: + return Ollama(name, instructions=instructions) + + raise ValueError(f"Modello non supportato: {model}") + +def build_agent(model:Model, instructions: str) -> Agent: + """ + Costruisce un agente con il modello e le istruzioni specificate. + """ + return Agent( + model=get_model(model, instructions=instructions), + tools=[ReasoningTools()], + instructions=instructions, + markdown=True, + ) + + if __name__ == "__main__": - print("Hello World!") + # da fare assolutamente prima di usare tutto perchè carica le variabili d'ambiente + # come le API key nel nostro caso + load_dotenv() + + prompt = "Scrivi una poesia su un gatto." + instructions = "Rispondi in italiano e molto brevemente. Usa tabelle per visualizzare i dati." + + gemini = build_agent(Model.GEMINI, instructions=instructions).run(prompt) + print(f"Risposta Gemini:\n{gemini.content}\n==============================") + + ollama = build_agent(Model.OLLAMA_GPT, instructions=instructions).run(prompt) + print(f"\nRisposta Ollama GPT:\n{ollama.content}\n==============================") diff --git a/src/example.py b/src/example.py deleted file mode 100644 index 7595560..0000000 --- a/src/example.py +++ /dev/null @@ -1,28 +0,0 @@ -from agno.agent import Agent -from agno.models.google import Gemini -from agno.tools.reasoning import ReasoningTools -from dotenv import load_dotenv -import ollama -from ollama_demo import generate_text - -def run_gemini_poem(): - load_dotenv() - reasoning_agent = Agent( - model=Gemini(), - tools=[ReasoningTools()], - instructions="Use tables to display data.", - markdown=True, - ) - result = reasoning_agent.run("Scrivi una poesia su un gatto. Sii breve.") - print(result.content) - -def run_ollama_codegemma_poem(): - prompt = "Scrivi una poesia su un gatto. Sii breve." - response = generate_text(model="gpt-oss:latest", prompt=prompt) - print(response) - -if __name__ == "__main__": - print("Risposta Gemini:") - run_gemini_poem() - print("\nRisposta Ollama GPT-OSS:") - run_ollama_codegemma_poem()