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"]

View File

@@ -12,7 +12,7 @@ Per l'installazione si può utilizzare un approccio tramite **uv** (manuale) opp
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/)
@@ -21,14 +21,11 @@ Le API Keys puoi ottenerle tramite i seguenti servizi:
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
curl -fsSL https://ollama.com/install.sh | sh
```
- **macOS/Windows**: Scarica l'installer da [https://ollama.com/download/windows](https://ollama.com/download/windows) - **macOS/Windows**: Scarica l'installer da [https://ollama.com/download/windows](https://ollama.com/download/windows)
**2. GPU Support (Raccomandato)**: **2. GPU Support (Raccomandato)**:
@@ -37,10 +34,7 @@ Per utilizzare la GPU con Ollama, assicurati di avere NVIDIA CUDA Toolkit instal
- **Documentazione WSL**: [CUDA WSL User Guide](https://docs.nvidia.com/cuda/wsl-user-guide/index.html) - **Documentazione WSL**: [CUDA WSL User Guide](https://docs.nvidia.com/cuda/wsl-user-guide/index.html)
**3. Installazione Modelli**: **3. Installazione Modelli**:
Esempio per installare un modello locale: Esempio per installare un modello locale: `ollama pull gpt-oss`
```sh
ollama pull gemma3:4b
```
### Variabili d'Ambiente ### Variabili d'Ambiente

View File

@@ -19,15 +19,11 @@ dependencies = [
# ✅ 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)
#"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 # ✅ 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 # 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 # oltre a questa è necessario installare anche le librerie specifiche per i modelli che si vogliono usare
"agno", "agno",
# ✅ Modelli supportati e installati (aggiungere qui sotto quelli che si vogliono usare)
"google-genai", "google-genai",
# ☑️ per usare modelli in locale
"ollama", "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()