Refactor model handling and agent construction; remove deprecated example script

This commit is contained in:
2025-09-16 17:42:22 +02:00
parent 0f6a7dabb6
commit fc725e48e2
5 changed files with 178 additions and 164 deletions

View File

@@ -1,8 +1,5 @@
# Vogliamo usare una versione di linux leggera con già uv installato # Vogliamo usare una versione di linux leggera con già uv installato
# Infatti scegliamo l'immagine ufficiale di uv che ha già tutto configurato # 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 FROM ghcr.io/astral-sh/uv:python3.12-alpine
# Dopo aver definito la workdir mi trovo già in essa # Dopo aver definito la workdir mi trovo già in essa
@@ -22,4 +19,4 @@ COPY LICENSE .
COPY src ./src COPY src ./src
# Comando di default all'avvio dell'applicazione # Comando di default all'avvio dell'applicazione
CMD ["python", "src/example.py"] CMD ["python", "src/app.py"]

182
README.md
View File

@@ -1,94 +1,88 @@
# **Progetto di Esame: Da definire** # **Progetto di Esame: Da definire**
Questa è la repository per l'esame di Applicazioni Intelligenti che consiste in: Questa è la repository per l'esame di Applicazioni Intelligenti che consiste in:
- Progetto per 2/3 del voto. - Progetto per 2/3 del voto.
- Orale per 1/3 dei punti composto da: - Orale per 1/3 dei punti composto da:
- Presentazione (come se lo facessimo ad un cliente) di gruppo - Presentazione (come se lo facessimo ad un cliente) di gruppo
- Orale singolo con domande del corso (teoria e strumenti visti) - 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. 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 # Installazione
Per l'installazione si può utilizzare un approccio tramite **uv** (manuale) oppure utilizzare un ambiente **Docker** già pronto (automatico). 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. 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 ### API Keys
Le API Keys puoi ottenerle tramite i seguenti servizi: Le API Keys puoi ottenerle tramite i seguenti servizi:
- **Google AI**: [Google AI Studio](https://makersuite.google.com/app/apikey) (gratuito con limiti) - **Google AI**: [Google AI Studio](https://makersuite.google.com/app/apikey) (gratuito con limiti)
- **Anthropic**: [Anthropic Console](https://console.anthropic.com/) - **Anthropic**: [Anthropic Console](https://console.anthropic.com/)
- **DeepSeek**: [DeepSeek Platform](https://platform.deepseek.com/) - **DeepSeek**: [DeepSeek Platform](https://platform.deepseek.com/)
- **OpenAI**: [OpenAI Platform](https://platform.openai.com/api-keys) - **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. 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) ### Ollama (Modelli Locali)
Per utilizzare modelli AI localmente, è necessario installare Ollama: Per utilizzare modelli AI localmente, è necessario installare Ollama:
**1. Installazione Ollama**: **1. Installazione Ollama**:
- **Linux**: - **Linux**: `curl -fsSL https://ollama.com/install.sh | sh`
```sh - **macOS/Windows**: Scarica l'installer da [https://ollama.com/download/windows](https://ollama.com/download/windows)
curl -fsSL https://ollama.com/install.sh | sh
``` **2. GPU Support (Raccomandato)**:
- **macOS/Windows**: Scarica l'installer da [https://ollama.com/download/windows](https://ollama.com/download/windows) 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)
**2. GPU Support (Raccomandato)**: - **Documentazione WSL**: [CUDA WSL User Guide](https://docs.nvidia.com/cuda/wsl-user-guide/index.html)
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) **3. Installazione Modelli**:
- **Documentazione WSL**: [CUDA WSL User Guide](https://docs.nvidia.com/cuda/wsl-user-guide/index.html) Esempio per installare un modello locale: `ollama pull gpt-oss`
**3. Installazione Modelli**: ### Variabili d'Ambiente
Esempio per installare un modello locale:
```sh **1. Copia il file di esempio**:
ollama pull gemma3:4b ```sh
``` cp .env.example .env
```
### Variabili d'Ambiente
**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:
**1. Copia il file di esempio**: ```dotenv
```sh GOOGLE_API_KEY=
cp .env.example .env ANTHROPIC_API_KEY=
``` DEEPSEEK_API_KEY=
OPENAI_API_KEY=
**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: # Path dove Ollama salva i modelli (es. /home/username/.ollama su Linux)
```dotenv OLLAMA_MODELS_PATH=
GOOGLE_API_KEY= ```
ANTHROPIC_API_KEY=
DEEPSEEK_API_KEY= ### Opzione 1 UV
OPENAI_API_KEY= **1. Installazione uv**: Per prima cosa installa uv se non è già presente sul sistema:
# Path dove Ollama salva i modelli (es. /home/username/.ollama su Linux) ```sh
OLLAMA_MODELS_PATH= # Windows (PowerShell)
``` powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
### Opzione 1 UV # macOS/Linux
**1. Installazione uv**: Per prima cosa installa uv se non è già presente sul sistema: curl -LsSf https://astral.sh/uv/install.sh | sh
```sh ```
# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" **2. Ambiente e dipendenze**: uv installerà python e creerà automaticamente l'ambiente virtuale con le dipendenze corrette:
```sh
# macOS/Linux uv sync --frozen --no-cache
curl -LsSf https://astral.sh/uv/install.sh | sh ```
```
**3. Run**: Successivamente si può far partire il progetto tramite il comando:
**2. Ambiente e dipendenze**: uv installerà python e creerà automaticamente l'ambiente virtuale con le dipendenze corrette: ```sh
```sh uv run python src/app.py
uv sync --frozen --no-cache ```
```
### Opzione 2 Docker
**3. Run**: Successivamente si può far partire il progetto tramite il comando: 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:
```sh
uv run python src/app.py **IMPORTANTE**: Assicurati di aver configurato il file `.env` come descritto sopra prima di avviare Docker.
```
```sh
### Opzione 2 Docker docker compose up --build -d
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. Il file `.env` verrà automaticamente caricato nel container grazie alla configurazione in `docker-compose.yaml`.
```sh # Applicazione
docker compose up --build -d L'applicazione è attualmente in fase di sviluppo. Maggiori dettagli saranno aggiunti durante l'implementazione.
```
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.

View File

@@ -1,33 +1,29 @@
[project] [project]
name = "upo-app-ai" name = "upo-app-ai"
version = "0.1.0" version = "0.1.0"
description = "Agente di Pianificazione Viaggi Intelligente" description = "Agente di Pianificazione Viaggi Intelligente"
requires-python = "==3.12.*" requires-python = "==3.12.*"
# Qui ho messo alcune librerie utili utilizzate durante il corso. # Qui ho messo alcune librerie utili utilizzate durante il corso.
# Se si nota che alcune non sono necessarie, si potrebbero rimuovere # Se si nota che alcune non sono necessarie, si potrebbero rimuovere
# in modo da evitare conflitti o problemi futuri. # in modo da evitare conflitti o problemi futuri.
# Per ogni roba ho fatto un commento per evitare di dimenticarmi cosa fa chi. # 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. # Inoltre ho messo una emoji per indicare se è raccomandato o meno.
dependencies = [ dependencies = [
# ✅ per gestire variabili d'ambiente (generalmente API keys o opzioni) # ✅ per gestire variabili d'ambiente (generalmente API keys o opzioni)
"dotenv", "dotenv",
# 🟡 per fare scraping di pagine web # 🟡 per fare scraping di pagine web
#"bs4", #"bs4",
# ✅ per fare una UI web semplice con input e output # ✅ per fare una UI web semplice con input e output
"gradio", "gradio",
# per l'elaborazione del linguaggio naturale in locale (https://huggingface.co/learn/llm-course/chapter1/3?fw=pt) # per costruire agenti (ovvero modelli che possono fare più cose tramite tool) https://github.com/agno-agi/agno
#"transformers", # altamente consigliata dato che ha anche tools integrati per fare scraping, calcoli e molto altro
# ❌ per fare chiamate a modelli indipendentemente dal modello specifico (astrae meglio rispetto a openai) # oltre a questa è necessario installare anche le librerie specifiche per i modelli che si vogliono usare
#"langchain", "agno",
# ✅ per costruire agenti (ovvero modelli che possono fare più cose tramite tool) https://github.com/agno-agi/agno # ✅ Modelli supportati e installati (aggiungere qui sotto quelli che si vogliono usare)
# altamente consigliata dato che ha anche tools integrati per fare scraping, calcoli e molto altro "google-genai",
# oltre a questa è necessario installare anche le librerie specifiche per i modelli che si vogliono usare "ollama",
"agno", ]
"google-genai",
# ☑️ per usare modelli in locale
"ollama",
]

View File

@@ -1,8 +1,63 @@
import agno from dotenv import load_dotenv
import gradio from enum import Enum
import dotenv
import requests 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__": 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==============================")

View File

@@ -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()