Refactor model handling and agent construction; remove deprecated example script
This commit is contained in:
@@ -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
182
README.md
@@ -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.
|
|
||||||
|
|||||||
@@ -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",
|
|
||||||
]
|
|
||||||
|
|||||||
65
src/app.py
65
src/app.py
@@ -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==============================")
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
|
||||||
Reference in New Issue
Block a user