Aggiungere uno strumento funzione a un agente utilizzando ADK

Questa esercitazione descrive i passi per aggiungere uno strumento di funzione a un agente esistente in Generative AI Agents.

Gli strumenti di funzione consentono all'agente di utilizzare funzioni scritte su misura e definite localmente come strumenti. Sono molto flessibili e particolarmente utili per i casi aziendali grazie all'elaborazione locale, alla facile autenticazione e alla perfetta integrazione con le funzionalità esistenti.

In questo esempio, abbiamo un agente meteorologico dotato di uno strumento di funzione personalizzato. Questo è anche noto come agente chiamante funzione.

Nota

Gli strumenti di funzione vengono eseguiti localmente sul tuo lato.

Ciò che viene inviato a un agente remoto sui server OCI è la definizione della funzione (nome della funzione, parametri della funzione e relative descrizioni). I server OCI non accedono all'implementazione delle funzioni.

Panoramica

Quando viene eseguita una query meteo, l'agente remoto esegue effettivamente la classificazione dell'intento per utilizzare lo strumento get_weather. Ad esempio, in base alla query in linguaggio naturale Is it cold in Seattle?, l'agente remoto riempie lo slot dell'argomento e effettua la richiesta.

L'agente invia una richiesta contenente le azioni richieste per l'applicazione client. In questo caso, l'azione richiesta per il client è quella di richiamare lo strumento di funzione get_weather con un argomento location=Seattle.

Agent Development Kit (ADK) esegue le operazioni riportate di seguito.

  • analizza l'azione richiesta
  • trova la funzione locale registrata
  • esegue questa funzione con argomenti specifici
  • cattura l'output della chiamata di funzione
  • invia di nuovo l'output all'agente remoto, in modo che l'agente possa utilizzare tale output per generare una risposta al prompt utente

Requisiti indispensabili

Prima di creare un'applicazione agente, effettuare le operazioni riportate di seguito.
  1. Sul computer su cui è in esecuzione il codice, impostare un file di configurazione API OCI. Assicurarsi che la configurazione si riferisca a un'area in cui sono ospitati gli agenti AI generativa.
  2. Creare un ambiente virtuale:
    python3 -m venv <myenv>

    Attivare l'ambiente virtuale.

    source <myenv>/bin/activate
  3. Installare l'ADK. Python ADK richiede Python 3.10 o versioni successive.
    pip install "oci[adk]

Impostare un compartimento per lo sviluppo

Per impostare il compartimento, effettuare le operazioni riportate di seguito.
  1. Chiedere a un amministratore di aggiungere il criterio IAM seguente:
    allow <a-group-your-user-name-belongs-to> to manage all-resources in compartment <your-compartment-name>
    Importante

    Fornire l'accesso completo a un compartimento è conveniente per un'esercitazione. Tuttavia, in produzione, utilizzare criteri più restrittivi per limitare l'accesso all'agente. Vedere Accesso agli agenti AI generativa.
  2. Accedi alla console di Oracle Cloud Infrastructure.
  3. Aprire il menu di navigazione e selezionare Identità e sicurezza. In Identità, selezionare Compartimenti.
  4. Selezionare Crea compartimento.
  5. Compilare le seguenti informazioni:
    • Nome: <your-compartment-name>
    • Descrizione: Compartment for <your-description>.
    • Compartimento padre: <your-tenancy>(root)
  6. Selezionare Crea compartimento.

Riferimento: creare un compartimento

Crea agente

  1. Nella barra di navigazione della console, selezionare la stessa area selezionata per il file di configurazione nella sezione precedente.
  2. Nella pagina elenco Agenti, selezionare Crea agente. Per assistenza nella ricerca della pagina elenco, vedere Elenca agenti.
  3. Immettere le informazioni riportate di seguito.
    • Nome: <your-agent-name>
    • Compartimento: selezionare un compartimento nel quale si è autorizzati a lavorare.
    • Descrizione: agente senza strumenti iniziali. Aggiunta di strumenti con ADK.
    • Messaggio di benvenuto: lasciare vuoto.
    • Istruzioni di instradamento: lasciare vuoto.
  4. Selezionare Successivo per passare al passo Aggiungi strumento. Salta questa pagina e non aggiungi strumenti.
  5. Selezionare Next.
  6. (Facoltativo) Selezionare Crea automaticamente un endpoint per questo agente per creare un endpoint quando l'agente viene creato e mantenere tutte le altre opzioni predefinite.
  7. Selezionare Avanti e quindi Crea agente.
    Nota

    Accettare le condizioni di licenza se richiesto.
  8. Attendere che l'agente diventi attivo.

Raccogli informazioni necessarie

  1. Nell'ambiente in uso, copiare l'area impostata per il file di configurazione in un blocco note. Ad esempio, us-chicago-1.
  2. Nella console, nella pagina elenco Agenti, selezionare l'agente creato in questa esercitazione. Per assistenza nella ricerca della pagina elenco, vedere Elenca agenti.
  3. Copiare l'OCID per l'agente e incollarlo in un blocco note per la sezione successiva.

    OCID agente di esempio: ocid1.genaiagent.oc1.us-chicago-1.<unique-id>

  4. Selezionare l'endpoint per l'agente.
  5. Copiare l'OCID per l'endpoint e incollarlo in un blocco note per la sezione successiva.

    OCID endpoint di esempio: ocid1.genaiagentendpoint.oc1.us-chicago-1.<unique-id>

  6. Passare a Identità e sicurezza e selezionare Compartimenti. Selezionare il compartimento con l'agente. Copiare l'OCID per il compartimento e incollarlo in un blocco note.

    OCID compartimento di esempio: ocid1.compartment.oc1..<unique-id>

Creare un file locale

  1. Dal terminale, vai alla tua home directory.
  2. Creare una directory denominata ADK.
  3. Spostarsi nella directory ADK.
  4. Creare un file denominato weather_agent.py.
  5. Incollare il codice seguente in weather-agent.py.
    Sostituire <region-where-agent-is-created> e <your-agent-endpoint> con i valori raccolti.
    from typing import Dict
    from adk import Agent, AgentClient, tool
    
    @tool
    def get_weather(location: str) -> Dict[str, str]:
        """Get the weather for a given location"""
        return {"location": location, "temperature": 72, "unit": "F"}
    
    
    def main():
        # Create a client with your authentication details
        client = AgentClient(
            auth_type="api_key",
            profile="DEFAULT",
            region="<region-where-agent-is-created>"
        )
    
        # Instantiate the agent with your agent endpoint ID and the tool
    
        agent = Agent(
            client=client,
            agent_endpoint_id="<your-agent-endpoint>",
            instructions="Perform weather queries using the given tools.",
            tools=[get_weather]
        )
    
        # Set up the agent (configures instructions and tools in the remote agent resource)
        agent.setup()
    
        # Run the agent with an input
        input = "Is it cold in Seattle?"
        response = agent.run(input)
    
        # Print the response
        response.pretty_print()
    
    if __name__ == "__main__":
        main()

Aggiungi lo strumento

Importante

Se si sceglie un agente esistente invece di crearne uno nuovo per questa esercitazione, prima di eseguire questo file assicurarsi che l'agente remoto non disponga di strumenti. Questo programma elimina tutti gli strumenti sull'agente remoto, a meno che non si tratti dello strumento denominato get_weather. Se trova uno strumento get_weather remoto, aggiorna lo strumento remoto da sincronizzare con quello locale.
  1. Nella console andare alla pagina dei dettagli dell'agente e prendere nota dei valori relativi.
    • Istruzioni di instradamento: deve essere vuoto.
    • Selezionare Strumenti. L'elenco degli strumenti deve essere vuoto.
  2. Eseguire il file Python, get_weather
    python3 weather-agent.py
  3. Nell'output, rivedere i nomi delle funzioni locali e remote e assicurarsi che lo strumento get_weather venga aggiunto all'agente remoto. Output di esempio:
    Waiting for agent to be active...
    ╭─ Local and remote function tools found ─╮
    │ Local function tools (1):               │
    │ ['get_weather']                         │
    │                                         │
    │ Remote function tools (0):              │
    │ []                                      │
    ╰─────────────────────────────────────────╯
    Found local tool not in remote tools: get_weather. Adding it to the remote agent...
    Waiting for tool to be active...
    Checking synchronization of local and remote RAG tools...                                                             
    No active remote RAG tools found. No local RAG tool to add.                                                                                                                                                        
  4. Nella console andare alla pagina dei dettagli dell'agente e guardare gli aggiornamenti.
    • Nella pagina dei dettagli dell'agente, le istruzioni di instradamento cambiano da vuota a Perform weather queries using the given tools.
    • Selezionare Strumenti. Lo strumento, get_weather, viene visualizzato nell'elenco degli strumenti.
    • Selezionare get_weather e, in Richieste di lavoro, verificare che l'operazione CREATE_TOOL sia riuscita.

Leggi gli output

  1. Nell'output leggere il messaggio dell'utente. Output di esempio:
    
                                                          
    ╭──────────────────────────────────── Chat request to remote agent ─────────────────────────────────────╮
    │ (Local --> Remote)                                                                                    │
    │                                                                                                       │
    │ user message:                                                                                         │
    │ Is it cold in Seattle?                                                                                │
    │                                                                                                       │
    │ performed actions by client:                                                                          │
    │ []                                                                                                    │
    │                                                                                                       │
    │ session id:                                                                                           │
    │ ocid1.genaiagentsession.<unique-id>                                                          │
    ╰───────────────────────────────────────────────────────────────────────────────────────────────────────╯           
  2. Leggi la risposta della chat. Output di esempio:
    
    ╭────────────────── Chat response from remote agent ──────────────────╮
    │ (Local <-- Remote)                                                  │
    │                                                                     │
    │ agent message:                                                      │
    │ null                                                                │
    │                                                                     │
    │ required actions for client to take:                                │
    │ [                                                                   │
    │     {                                                               │
    │         "action_id": "<unique-id>",        │
    │         "required_action_type": "FUNCTION_CALLING_REQUIRED_ACTION", │
    │         "function_call": {                                          │
    │             "name": "get_weather",                                  │
    │             "arguments": "{\"location\": \"Seattle\"}"              │
    │         }                                                           │
    │     }                                                               │
    │ ]                                                                   │
    ╰─────────────────────────────────────────────────────────────────────╯                                                                           
  3. Leggi la chiamata di funzione richiesta dall'agente. Output di esempio:
    
    ╭─ Function call requested by agent and mapped local handler function ─╮
    │ Agent function tool name:                                            │
    │ get_weather                                                          │
    │                                                                      │
    │ Agent function tool call arguments:                                  │
    │ {'location': 'Seattle'}                                              │
    │                                                                      │
    │ Mapped local handler function name:                                  │
    │ get_weather                                                          │
    ╰──────────────────────────────────────────────────────────────────────╯                                                              
  4. Leggi il risultato dell'esecuzione della funzione. Output di esempio:
    
    ╭─────── Obtained local function execution result ────────╮
    │ {'location': 'Seattle', 'temperature': 72, 'unit': 'F'} │
    ╰─────────────────────────────────────────────────────────╯                                                           
  5. Leggere la richiesta di chat nell'output di esempio dell'agente remoto:
    
    ╭──────────────────────────────────── Chat request to remote agent ─────────────────────────────────────╮
    │ (Local --> Remote)                                                                                    │
    │                                                                                                       │
    │ user message:                                                                                         │
    │ null                                                                                                  │
    │                                                                                                       │
    │ performed actions by client:                                                                          │
    │ [                                                                                                     │
    │     {                                                                                                 │
    │         "action_id": "<unique-id>",                                          │
    │         "performed_action_type": "FUNCTION_CALLING_PERFORMED_ACTION",                                 │
    │         "function_call_output": "{\"location\": \"Seattle\", \"temperature\": 72, \"unit\": \"F\"}"   │
    │     }                                                                                                 │
    │ ]                                                                                                     │
    │                                                                                                       │
    │ session id:                                                                                           │
    │ ocid1.genaiagentsession.oc1.us-chicago-1.xxx                                                          │
    ╰───────────────────────────────────────────────────────────────────────────────────────────────────────╯                                                         
  6. Leggere la risposta della chat dall'output di esempio dell'agente remoto:
    
    ╭─────────────────────────────── Chat response from remote agent ────────────────────────────────╮
    │ (Local <-- Remote)                                                                             │
    │                                                                                                │
    │ agent message:                                                                                 │
    │ {                                                                                              │
    │     "role": "AGENT",                                                                           │
    │     "content": {                                                                               │
    │         "text": "It's not cold in Seattle. The current temperature is 72 degrees Fahrenheit.", │
    │         "citations": null,                                                                     │
    │         "paragraph_citations": null                                                            │
    │     },                                                                                         │
    │     "time_created": "2025-04-10T18:47:33.617000+00:00"                                         │
    │ }                                                                                              │
    │                                                                                                │
    │ required actions for client to take:                                                           │
    │ null                                                                                           │
    ╰────────────────────────────────────────────────────────────────────────────────────────────────╯                                                      
  7. Leggi la risposta di esecuzione dell'agente in linguaggio naturale. Output di esempio:
    
    ╭──────────────────────────────────────────────── Agent run response ────────────────────────────────────────────────╮
    │ agent text message:                                                                                                │
    │ It's not cold in Seattle. The current temperature is 72 degrees Fahrenheit.                                        │
    ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
                                                   

Rimuovi lo strumento

  1. Nell'ambiente locale creare un file denominato list_agent_tools.py con il contenuto seguente. Inoltre, aggiornare tutte le variabili ID con le informazioni sull'OCID.
    import json
    from adk import AgentClient
    
    
    
    def main():
    
        agent_id = "ocid1.genaiagent.<unique-id>"
        agent_compartment_id = "<your-compartment-ocid>"
        region_id = "<your-region-id>"
        # Enter an OCI region such as "us-chicago-1" or airport code such as "ORD"
    
        # Create a client with your authentication details
        client = AgentClient(
            auth_type="api_key",
            profile="DEFAULT",
            region=region_id
        )
    
    
        # Find the tools of the following agent in the following compartment
        tool_list = client.find_tools(agent_compartment_id, agent_id)
    
        json_str = json.dumps(tool_list, indent=4)
    
        
    
        print(json_str)
    
        for item in tool_list:
            print(f"Tool Name: {item.get('display_name')}  \nTool OCID: {item.get('id')}")
    
    
    if __name__ == "__main__":
        main()

    Questo script chiama l'operazione find_tool del client e restituisce tutti gli strumenti per un agente specificato in un compartimento specificato.

  2. Controllare l'output:
    [
        {
        "id": "ocid1.genaiagenttool.<unique-id>",
            "lifecycle_state": "ACTIVE",
            "time_created": "2025-04-10T21:49:19.350000+00:00",
            "time_updated": "2025-04-10T21:49:42.132000+00:00",
            "display_name": "get_weather",
            "description": "Get the weather for a given location created by ADK",
            "compartment_id": "<your-compartment-ocid>",
                                    "agent_id": "ocid1.genaiagent.<unique-id>",
            "tool_config": {
                "tool_config_type": "FUNCTION_CALLING_TOOL_CONFIG",
                "function": {
                    "name": "get_weather",
                    "description": "Get the weather for a given location",
                    "parameters": {
                        "type": "object",
                        "properties": "{\"location\": {\"type\": \"string\"}}",
                        "required": "['location']"
                    }
                }
            },
            "metadata": null,
            "freeform_tags": {
                "ModifiedBy": "ADK",
                "CreatedBy": "ADK"
            },
            "defined_tags": {
                "Oracle-Tags": {
                    "CreatedBy": "john.doe@example.com",
                    "CreatedOn": "2025-04-10T21:49:19.277Z"
                }
            },
            "system_tags": {}
        }
    ]
    Tool Name: get_weather  
    Tool OCID: ocid1.genaiagenttool.oc1.us-chicago-1.amaa<your-ocid>
  3. Creare un file denominato delete_tools.py e copiare le seguenti informazioni per utilizzare l'operazione delete_tool per eliminare il file weather_tool. Inoltre, aggiornare tutte le variabili ID con le informazioni sull'OCID.
    import json
    from adk import AgentClient
    
    
    
    def main():
    
    agent_id = "ocid1.genaiagent.<unique-id>"
        agent_compartment_id = "<your-compartment-ocid>"
        endpoint_id = "ocid1.genaiagentendpoint.<unique-id>"
        region_id = "<your-region-id>"
    
        # Create a client with your authentication details
        client = AgentClient(
            auth_type="api_key",
            profile="DEFAULT",
            region=region_id
        )
    
    
        # Find the tools of the following agent in the following compartment
        tool_list = client.find_tools(agent_compartment_id, agent_id)
    
        json_str = json.dumps(tool_list, indent=4)
    
        
    
        print(json_str)
    
        for item in tool_list:
            print(f"Tool Name: {item.get('display_name')}  \nTool OCID: {item.get('id')}")
    
        for item in tool_list:
            print(f"Deleting tool {item.get('display_name')} with tool OCID: {item.get('id')}")
            client.delete_tool(item.get('id'))
    
        print ("Tool deleted!")
    
    if __name__ == "__main__":
        main()
  4. Nella console, andare alla pagina dei dettagli dell'agente e vedere che lo strumento viene eliminato.
  5. Disattivare l'ambiente virtuale.
    decativate