\n\n\n\n Creare plugin per agenti: una guida pratica per un avvio rapido - AgntKit \n

Creare plugin per agenti: una guida pratica per un avvio rapido

📖 12 min read2,266 wordsUpdated Apr 5, 2026

Introduzione: La potenza dei plugin d’agente

Nell’ambito in rapida evoluzione dell’intelligenza artificiale, i modelli di linguaggio ampio (LLM) diventano sempre più sofisticati. Tuttavia, anche i LLM più avanzati presentano limitazioni intrinseche: funzionano con i loro dati di addestramento, non hanno accesso a informazioni in tempo reale e non possono interagire direttamente con sistemi esterni o compiere azioni specifiche. È qui che entrano in gioco i plugin d’agente. I plugin d’agente consentono ai LLM di ampliare le loro capacità, fungendo da ponti verso il mondo esterno. Permettono a un’agente IA di svolgere compiti per cui non è stata esplicitamente formata, di accedere a dati proprietari, di interagire con API ed eseguire azioni nel mondo reale.

Pensate a un LLM come a una mente brillante con una vasta conoscenza ma senza mani né occhi al di là dei suoi dati interni. Un plugin gli fornisce queste mani e questi occhi. Trasforma un’IA conversazionale in un’IA azionabile, capace non solo di comprendere ma anche di fare. In questo articolo, esploreremo gli aspetti pratici della creazione di plugin d’agente, concentrandoci su un approccio di avvio rapido con esempi concreti per aiutarvi a iniziare.

Comprendere il concetto di base: LLM, agente e plugin

Prima di iniziare a programmare, consolidiamo la nostra comprensione dei componenti chiave:

  • Modello di linguaggio ampio (LLM): L’IA fondamentale che comprende e genera il linguaggio umano. È il cervello del nostro agente. Esempi: GPT-4, Claude, Llama 2.
  • Agente: Un’entità intelligente che utilizza un LLM per ragionare, pianificare e svolgere compiti. Il ruolo dell’agente è decidere quando e come utilizzare gli strumenti disponibili (plugin) per raggiungere l’obiettivo di un utente. Ciò implica spesso un ciclo di riflessione e ragionamento.
  • Plugin (o strumento/funzione): Un pezzo di codice che l’agente può chiamare per eseguire un’azione specifica o recuperare un’informazione precisa. Ogni plugin ha un obiettivo ben definito, parametri di input e un’uscita attesa.

Il flusso di interazione si svolge generalmente come segue: L’utente pone una domanda → L’agente interpreta la richiesta → L’agente decide se è necessario un plugin → L’agente chiama il plugin con i parametri appropriati → Il plugin si esegue e restituisce i risultati → L’agente elabora i risultati e risponde all’utente.

L’anatomia di un plugin d’agente

Sebbene framework e piattaforme specifiche possano avere le loro convenzioni, i componenti fondamentali di un plugin d’agente sono sorprendentemente simili:

  1. Nome: Un identificativo unico e descrittivo per il plugin (ad esempio, getCurrentWeather, searchWikipedia, sendEmail).
  2. Descrizione: Una spiegazione chiara e concisa di cosa fa il plugin e quando deve essere utilizzato. Questo è cruciale affinché il LLM ne comprenda l’obiettivo e decida se deve invocarlo.
  3. Parametri (Schema): Una definizione degli input che il plugin si aspetta. Questo è spesso descritto utilizzando uno schema JSON, specificando i nomi dei parametri, i tipi, le descrizioni e se sono richiesti.
  4. Implementazione (Codice): Il codice reale che esegue l’azione desiderata quando il plugin viene invocato. Questo potrebbe essere la chiamata a un’API esterna, l’interrogazione di un database, l’esecuzione di un calcolo locale o l’interazione con un’interfaccia utente.
  5. Uscita: I dati restituiti dal plugin dopo l’esecuzione.

Avvio rapido: creazione di un semplice plugin meteo

Esploriamo un esempio pratico. Creeremo un plugin che recupera le condizioni meteorologiche attuali per una città specifica. Per semplificare, utilizzeremo un’API fittizia, ma i principi si applicano direttamente alle API reali.

Passo 1: Definire lo scopo e l’interfaccia del plugin

Nome: get_current_weather
Descrizione: « Recupera le condizioni meteorologiche attuali per una città specificata. Utile per rispondere a domande sulla temperatura, l’umidità e lo stato generale del meteo in un luogo preciso. »
Parametri: Abbiamo bisogno di city. Supponiamo che sia una stringa e che sia richiesta.

Passo 2: Implementare la funzione del plugin

Useremo Python per i nostri esempi, poiché è ampiamente adottato nella comunità IA. Puoi utilizzare qualsiasi linguaggio, ma i concetti rimangono gli stessi.


import json

def get_current_weather(city: str) -> dict:
 """
 Recupera le condizioni meteorologiche attuali per una città specificata.
 
 Args:
 city (str): Il nome della città per ottenere la meteo.
 
 Returns:
 dict: Un dizionario contenente informazioni meteorologiche (ad esempio, temperatura, condizioni, umidità).
 """
 # In uno scenario reale, qui faresti una chiamata API,
 # ad esempio, usando requests.get('https://api.weatherapi.com/v1/current.json?key=YOUR_KEY&q={city}')
 
 # Per questo esempio, restituiremo dati fittizi
 mock_weather_data = {
 "London": {"temperature": 15, "conditions": "Nuvoloso", "humidity": 80},
 "New York": {"temperature": 22, "conditions": "Soleggiato", "humidity": 60},
 "Tokyo": {"temperature": 28, "conditions": "Piovoso", "humidity": 90},
 "Paris": {"temperature": 18, "conditions": "Parzialmente nuvoloso", "humidity": 70},
 }
 
 weather = mock_weather_data.get(city, {"temperature": "N/D", "conditions": "Sconosciuto", "humidity": "N/D"})
 
 return {"city": city, **weather}

Passo 3: Descrivere il plugin per il LLM (Schema di chiamata della funzione)

Questa è senza dubbio la fase più critica. Il LLM non esegue direttamente il codice Python; ha bisogno di una descrizione strutturata del plugin affinché possa generare la chiamata di funzione corretta. La maggior parte dei fornitori di LLM (OpenAI, Google, Anthropic, ecc.) offre una capacità di “chiamata di funzione” o “utilizzo di strumenti”, dove fornisci uno schema JSON che descrive le tue funzioni. Ecco come il nostro plugin meteo sarebbe descritto:


{
 "type": "function",
 "function": {
 "name": "get_current_weather",
 "description": "Recupera le condizioni meteorologiche attuali per una città specificata. Utile per rispondere a domande sulla temperatura, l'umidità e lo stato generale del meteo in un luogo preciso.",
 "parameters": {
 "type": "object",
 "properties": {
 "city": {
 "type": "string",
 "description": "Il nome della città (ad esempio, Londra, New York, Tokyo)"
 }
 },
 "required": ["city"]
 }
 }
}

Elementi chiave nello schema:

  • type: "function": Indica che si tratta di una definizione di funzione.
  • function.name: Corrisponde esattamente al nostro nome di funzione Python.
  • function.description: È ciò che il LLM legge! Siate chiari e dettagliati. Includete casi d’uso e esempi se utili.
  • function.parameters: Un oggetto JSON Schema standard che definisce gli input.
  • properties: Definisce ogni parametro (city nel nostro caso).
  • required: Elenco dei parametri da fornire.

Integrazione con un LLM (Esempio OpenAI)

Ora vediamo come un agente LLM utilizzerebbe questo plugin. Useremo l’API di chiamata di funzione di OpenAI come esempio, ma i concetti sono trasferibili ad altri fornitori.


import openai
import os

# Supponiamo che OPENAI_API_KEY sia definito nelle tue variabili d'ambiente
# openai.api_key = os.getenv("OPENAI_API_KEY") 

# Il nostro schema degli strumenti definito
tools = [
 {
 "type": "function",
 "function": {
 "name": "get_current_weather",
 "description": "Ottiene le condizioni meteorologiche attuali per una città specificata. Utile per rispondere a domande riguardanti la temperatura, l'umidità e le previsioni meteorologiche generali in un luogo specifico.",
 "parameters": {
 "type": "object",
 "properties": {
 "city": {
 "type": "string",
 "description": "Il nome della città (per esempio, Londra, New York, Tokyo)"
 }
 },
 "required": ["city"]
 }
 }
 }
]

# La funzione Python reale che abbiamo definito in precedenza
def get_current_weather(city: str) -> dict:
 # ... (stessa implementazione di sopra) ...
 mock_weather_data = {
 "London": {"temperature": 15, "conditions": "Nuvoloso", "humidity": 80},
 "New York": {"temperature": 22, "conditions": "Soleggiato", "humidity": 60},
 "Tokyo": {"temperature": 28, "conditions": "Piovoso", "humidity": 90},
 "Paris": {"temperature": 18, "conditions": "Parzialmente nuvoloso", "humidity": 70},
 }
 weather = mock_weather_data.get(city, {"temperature": "N/A", "conditions": "Sconosciuto", "humidity": "N/A"})
 return {"city": city, **weather}

# Un semplice ciclo dell'agente
def run_agent_with_tools(user_query: str):
 messages = [{
 "role": "user", 
 "content": user_query
 }]

 # Primo richiamo al LLM con la richiesta dell'utente e gli strumenti disponibili
 response = openai.chat.completions.create(
 model="gpt-4o", # O gpt-3.5-turbo, ecc.
 messages=messages,
 tools=tools,
 tool_choice="auto" # Permette al LLM di decidere se vuole invocare uno strumento
 )

 response_message = response.choices[0].message
 messages.append(response_message)

 # Controlla se il LLM ha deciso di invocare uno strumento
 if response_message.tool_calls:
 for tool_call in response_message.tool_calls:
 function_name = tool_call.function.name
 function_args = json.loads(tool_call.function.arguments)
 
 if function_name == "get_current_weather":
 # Esegui lo strumento e ottieni il risultato
 tool_output = get_current_weather(city=function_args.get("city"))
 
 # Aggiungi l'output dello strumento alla cronologia delle conversazioni
 messages.append({
 "tool_call_id": tool_call.id,
 "role": "tool",
 "name": function_name,
 "content": json.dumps(tool_output)
 })
 
 # Secondo richiamo al LLM con l'output dello strumento
 final_response = openai.chat.completions.create(
 model="gpt-4o",
 messages=messages
 )
 print(final_response.choices[0].message.content)
 else:
 print(f"Errore: Strumento sconosciuto invocato: {function_name}")
 else:
 # Nessun richiamo di strumento, solo una risposta diretta dal LLM
 print(response_message.content)

# Casi di test
print("--- Richiesta 1: Meteo a Londra ---")
run_agent_with_tools("Che tempo fa a Londra?")

print("\n--- Richiesta 2: Meteo a New York ---")
run_agent_with_tools("Dimmi la temperatura attuale a New York.")

print("\n--- Richiesta 3: Domanda generale ---")
run_agent_with_tools("Qual è la capitale della Francia?")

print("\n--- Richiesta 4: Meteo in una città sconosciuta ---")
run_agent_with_tools("Che tempo fa ad Atlantide?")

Spiegazione del ciclo dell’agente:

  1. Richiesta dell’utente: L’utente pone una domanda (per esempio, « Che tempo fa a Londra? »).
  2. Primo richiamo LLM: La richiesta dell’utente e la lista degli strumenti disponibili (il nostro get_current_weather schema) vengono inviati al LLM. Il LLM analizza la richiesta e le descrizioni degli strumenti.
  3. Decisione del LLM: Il LLM, in base alla sua comprensione, decide se deve invocare uno strumento.
    • Se decide di invocare uno strumento, genererà un oggetto tool_calls specificando il nome dello strumento e i parametri che desidera passare (per esempio, {"name": "get_current_weather", "arguments": {"city": "London"}}).
    • Se non ci sono strumenti pertinenti, genererà una risposta testuale diretta.
  4. Esecuzione dello strumento: Se il LLM genera un richiamo di strumento, il nostro codice dell’agente intercetta ciò, estrae il nome della funzione e gli argomenti, poi esegue la funzione Python reale (get_current_weather("London")).
  5. Secondo richiamo LLM (con output dello strumento): Il risultato dell’esecuzione dello strumento viene quindi inviato nuovamente al LLM, con l’intera cronologia della conversazione. Il LLM ha ora la richiesta originale dell’utente, la propria decisione di invocare uno strumento e il risultato concreto di questo strumento.
  6. Risposta finale: Il LLM utilizza queste informazioni per formulare una risposta in linguaggio naturale all’utente, integrando l’output dello strumento.

Concetti avanzati dei plugin e migliori pratiche

Gestione degli errori e solidità

Le API del mondo reale falliscono. I tuoi plugin devono gestire gli errori con facilità (problemi di rete, input non validi, limiti di rate della API, ecc.). Restituisci messaggi di errore informativi dal tuo plugin e il LLM può spesso usarli per informare l’utente o anche tentare nuovamente con parametri corretti.


def get_current_weather_solid(city: str) -> dict:
 try:
 # Simulare una chiamata API con potenziali errori
 if city == "Error City":
 raise ValueError("La chiamata API è fallita per Error City: Servizio non disponibile.")
 # ... resto della logica di dati mock riuscita ...
 return {"city": city, **weather}
 except Exception as e:
 return {"error": str(e), "city": city}

Multipli plugin e orchestrazione degli strumenti

Il vero potere di un agente risiede nell’utilizzo di più plugin. Immagina un agente « pianificatore di viaggi » con plugin per :

  • search_flights(origin, destination, date)
  • book_hotel(city, check_in, check_out)
  • get_attractions(city)

Il LLM, attraverso il suo ragionamento, può concatenare questi strumenti. Per esempio, se un utente chiede, « Pianifica un viaggio a Parigi il mese prossimo e trova cose da fare », il LLM potrebbe prima invocare search_flights, poi book_hotel (se confermato dall’utente), e infine get_attractions.

Quando fornisci più strumenti, basta aggiungere più schemi JSON alla lista tools nella tua chiamata LLM.

Ragionamento e riflessione degli agenti

Gli agenti sofisticati non eseguono semplicemente strumenti; ragionano sulle loro azioni. Framework come LangChain e LlamaIndex forniscono astrazioni per questo, coinvolgendo spesso :

  • Pianificazione: Scomporre obiettivi complessi in sottocompiti.
  • Selezione degli strumenti: Scegliere lo strumento più appropriato per ogni sottocompito.
  • Generazione di parametri: Estrarre gli argomenti necessari dal contesto della conversazione.
  • Esecuzione: Eseguire lo strumento.
  • Osservazione: Interpretare l’output dello strumento.
  • Riflessione: Valutare se l’obiettivo è stato raggiunto o se sono necessarie ulteriori azioni/correzioni.

La descrizione del tuo plugin da parte del LLM è centrale a questo ragionamento. Una descrizione vaga porta a una selezione mediocre degli strumenti.

Considerazioni di sicurezza

  • Validazione degli input: Valida sempre gli input ricevuti dal tuo plugin, anche se il LLM li ha generati. Input dannosi o inaspettati possono portare a vulnerabilità.
  • Minimo privilegio: Assicurati che il tuo plugin abbia accesso solo alle risorse di cui ha assolutamente bisogno.
  • Dati sensibili: Fai estrema attenzione quando gestisci informazioni sensibili. Evita di esporre direttamente segreti nelle descrizioni dei plugin o nei log.
  • Controllo degli accessi/Limiti di frequenza: Proteggi i tuoi sistemi backend contro abusi implementando limiti di frequenza appropriati e autenticazione per le API sottostanti al tuo plugin.

Operazioni asincrone

Molte azioni di plugin del mondo reale (ad esempio, invio di email, richieste lunghe a database) sono asincrone. Il tuo agente potrebbe dover gestire ciò restituendo un ID di lavoro e avendo un altro plugin per verificare lo stato del lavoro, o utilizzando webhooks.

Conclusione

Costruire plugin per agenti è una competenza trasformativa per chiunque lavori con LLM. Va oltre la semplice conversazione, permettendo ai sistemi di IA di diventare realmente interattivi e azionabili. Seguendo la guida rapida, hai imparato i componenti fondamentali: definire l’obiettivo del plugin, implementare la sua logica e, in modo cruciale, descriverlo in modo efficace usando uno schema JSON per il LLM. Il potere di queste descrizioni non può essere sottovalutato: sono il ponte tra la comprensione linguistica di un LLM e la sua capacità di interagire con il mondo reale.

Procedendo, non dimenticate di concentrarvi su descrizioni chiare, una gestione degli errori efficace e un’orchestrazione ponderata di più strumenti. Il futuro degli agenti IA risiede nella loro capacità di integrarsi armoniosamente con il vasto ecosistema di software e dati, e i plugin sono la chiave per sbloccare questo potenziale. Iniziate a sperimentare, costruite i vostri strumenti personalizzati e guardate i vostri agenti IA prendere vita!

🕒 Published:

✍️
Written by Jake Chen

AI technology writer and researcher.

Learn more →
Browse Topics: comparisons | libraries | open-source | reviews | toolkits
Scroll to Top