Sviluppare un agente Agent Development Kit

Questa pagina mostra come sviluppare un agente utilizzando il modello Agent Development Kit (la classe AdkApp nell'SDK Vertex AI Python). L'agente restituisce il tasso di cambio tra due valute in una data specificata.

Segui questi passaggi:

  1. Definisci e configura un modello
  2. (Facoltativo) Definisci e utilizza uno strumento
  3. (Facoltativo) Gestisci le sessioni
  4. (Facoltativo) Gestisci i ricordi

Prima di iniziare

Assicurati che l'ambiente sia configurato seguendo i passaggi descritti in Configurare l'ambiente.

Definisci e configura un modello

Definisci la versione del modello:

model = "gemini-2.0-flash"

(Facoltativo) Configura le impostazioni di sicurezza del modello. Per scoprire di più sulle opzioni disponibili per le impostazioni di sicurezza in Gemini, vedi Configurare gli attributi di sicurezza. Di seguito è riportato un esempio di come puoi configurare le impostazioni della sicurezza:

from google.genai import types

safety_settings = [
    types.SafetySetting(
        category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
        threshold=types.HarmBlockThreshold.OFF,
    ),
]

(Facoltativo) Specifica i parametri di generazione dei contenuti:

from google.genai import types

generate_content_config = types.GenerateContentConfig(
   safety_settings=safety_settings,
   temperature=0.28,
   max_output_tokens=1000,
   top_p=0.95,
)

Crea un AdkApp utilizzando le configurazioni del modello:

from google.adk.agents import Agent
from vertexai.agent_engines import AdkApp

agent = Agent(
   model=model,                                      # Required.
   name='currency_exchange_agent',                   # Required.
   generate_content_config=generate_content_config,  # Optional.
)
app = AdkApp(agent=agent)

Se esegui l'operazione in un ambiente interattivo, ad esempio il terminale o un notebook Colab, puoi eseguire una query come passaggio di test intermedio:

async for event in app.async_stream_query(
   user_id="USER_ID",  # Required
   message="What is the exchange rate from US dollars to Swedish currency?",
):
   print(event)
  • USER_ID: scegli il tuo ID utente con un limite di 128 caratteri. Ad esempio, user-123.

La risposta è un dizionario Python simile al seguente esempio:

{'actions': {'artifact_delta': {},
             'requested_auth_configs': {},
             'state_delta': {}},
 'author': 'currency_exchange_agent',
 'content': {'parts': [{'text': 'To provide you with the most accurate '
                                'exchange rate, I need to know the specific '
                                'currencies you\'re asking about. "Swedish '
                                'currency" could refer to:\n'
                                '\n'
                                '*   **Swedish Krona (SEK):** This is the '
                                'official currency of Sweden.\n'
                                '\n'
                                "Please confirm if you're interested in the "
                                'exchange rate between USD and SEK. Once you '
                                'confirm, I can fetch the latest exchange rate '
                                'for you.\n'}],
             'role': 'model'},
 'id': 'LYg7wg8G',
 'invocation_id': 'e-113ca547-0f19-4d50-9dde-f76cbc001dce',
 'timestamp': 1744166956.925927}

(Facoltativo) Definisci e utilizza uno strumento

Dopo aver definito il modello, definisci gli strumenti che utilizza per il ragionamento.

Quando definisci la funzione, è importante includere commenti che descrivano in modo completo e chiaro i parametri della funzione, cosa fa la funzione e cosa restituisce. Queste informazioni vengono utilizzate dal modello per determinare quale funzione utilizzare. Devi anche testare la funzione localmente per verificare che funzioni.

Utilizza il seguente codice per definire una funzione che restituisce un tasso di cambio:

def get_exchange_rate(
    currency_from: str = "USD",
    currency_to: str = "EUR",
    currency_date: str = "latest",
):
    """Retrieves the exchange rate between two currencies on a specified date.

    Uses the Frankfurter API (https://api.frankfurter.app/) to obtain
    exchange rate data.

    Args:
        currency_from: The base currency (3-letter currency code).
            Defaults to "USD" (US Dollar).
        currency_to: The target currency (3-letter currency code).
            Defaults to "EUR" (Euro).
        currency_date: The date for which to retrieve the exchange rate.
            Defaults to "latest" for the most recent exchange rate data.
            Can be specified in YYYY-MM-DD format for historical rates.

    Returns:
        dict: A dictionary containing the exchange rate information.
            Example: {"amount": 1.0, "base": "USD", "date": "2023-11-24",
                "rates": {"EUR": 0.95534}}
    """
    import requests
    response = requests.get(
        f"https://api.frankfurter.app/{currency_date}",
        params={"from": currency_from, "to": currency_to},
    )
    return response.json()

Per testare la funzione prima di utilizzarla nell'agente, esegui il comando seguente:

get_exchange_rate(currency_from="USD", currency_to="SEK")

La risposta dovrebbe essere simile alla seguente:

{'amount': 1.0, 'base': 'USD', 'date': '2025-04-03', 'rates': {'SEK': 9.6607}}

Per utilizzare lo strumento all'interno di AdkApp, aggiungilo all'elenco degli strumenti nella sezione dell'argomento tools=:

from google.adk.agents import Agent

agent = Agent(
    model=model,                     # Required.
    name='currency_exchange_agent',  # Required.
    tools=[get_exchange_rate],       # Optional.
)

Puoi testare l'agente localmente eseguendo query di test. Esegui il seguente comando per testare l'agente localmente utilizzando dollari statunitensi e corone svedesi:

from vertexai.agent_engines import AdkApp

app = AdkApp(agent=agent)
async for event in app.async_stream_query(
    user_id="USER_ID",
    message="What is the exchange rate from US dollars to SEK on 2025-04-03?",
):
    print(event)

dove USER_ID è l'ID utente che hai definito. Ad esempio, user-123.

La risposta è una sequenza di dizionari simile alla seguente:

{'author': 'currency_exchange_agent',
 'content': {'parts': [{'function_call': {'args': {'currency_date': '2025-04-03',
                                                   'currency_from': 'USD',
                                                   'currency_to': 'SEK'},
                                          'id': 'adk-e39f3ba2-fa8c-4169-a63a-8e4c62b89818',
                                          'name': 'get_exchange_rate'}}],
             'role': 'model'},
 'id': 'zFyIaaif',
 # ...
}
{'author': 'currency_exchange_agent',
 'content': {'parts': [{'function_response': {'id': 'adk-e39f3ba2-fa8c-4169-a63a-8e4c62b89818',
                                              'name': 'get_exchange_rate',
                                              'response': {'amount': 1.0,
                                                           'base': 'USD',
                                                           'date': '2025-04-03',
                                                           'rates': {'SEK': 9.6607}}}}],
             'role': 'user'},
 'id': 'u2YR4Uom',
 # ...
}
{'author': 'currency_exchange_agent',
 'content': {'parts': [{'text': 'The exchange rate from USD to SEK on '
                                '2025-04-03 is 9.6607.'}],
             'role': 'model'},
 'id': 'q3jWA3wl',
 # ...
}

(Facoltativo) Gestisci sessioni

AdkApp utilizza sessioni in memoria durante l'esecuzione in locale e utilizza sessioni gestite basate sul cloud dopo il deployment dell'agente in Vertex AI Agent Engine. Questa sezione descrive come configurare l'agente ADK per l'utilizzo con le sessioni gestite.

(Facoltativo) Personalizza il database delle sessioni

Se vuoi sostituire il servizio di sessione gestito predefinito con il tuo database, puoi definire una funzione session_service_builder nel seguente modo:

def session_service_builder():
  from google.adk.sessions import InMemorySessionService

  return InMemorySessionService()

Passa il database a AdkApp come session_service_builder=:

from vertexai.agent_engines import AdkApp

app = AdkApp(
   agent=agent,                                      # Required.
   session_service_builder=session_service_builder,  # Optional.
)

Utilizzare l'agente con le sessioni

Quando esegui AdkApp localmente, le seguenti istruzioni utilizzano sessioni in memoria:

Crea una sessione per l'agente:

session = await app.async_create_session(user_id="USER_ID")
print(session)

La sessione viene creata come rappresentazione del dizionario di un oggetto sessione ADK.

Elenca le sessioni associate al tuo agente:

await app.async_list_sessions(user_id="USER_ID")

Recuperare una sessione specifica:

session = await app.async_get_session(user_id="USER_ID", session_id="SESSION_ID")

dove

  • USER_ID è l'ID utente che hai definito. Ad esempio, user-123.

  • SESSION_ID è l'ID della sessione specifica che vuoi recuperare.

Esegui una query su AdkApp utilizzando le sessioni:

async for event in app.async_stream_query(
    user_id="USER_ID",
    session_id=SESSION_ID, # Optional. you can pass in the session_id when querying the agent
    message="What is the exchange rate from US dollars to Swedish currency on 2025-04-03?",
):
    print(event)

L'agente potrebbe rispondere con una richiesta di informazioni come la seguente:

{'author': 'currency_exchange_agent',
 'content': {'parts': [{'text': 'I need to know the Swedish currency code to '
                                'provide you with the exchange rate.'}],
             'role': 'model'},
 'id': 'wIgZAtQ4',
 #...
}

Puoi inviare una risposta (ad esempio, "SEK") per conto di USER_ID all'interno della sessione corrispondente a session specificando:

async for event in app.async_stream_query(
    user_id="USER_ID",
    session_id=session.id, # Optional. you can pass in the session_id when querying the agent
    message="SEK",
):
    print(event)

Dovresti ricevere una continuazione della conversazione come la seguente sequenza di dizionari:

{'author': 'currency_exchange_agent',
 'content': {'parts': [{'function_call': {'args': {'currency_date': '2025-04-03',
                                                   'currency_from': 'USD',
                                                   'currency_to': 'SEK'},
                                          'id': 'adk-2b9230a6-4b92-4a1b-9a65-b708ff6c68b6',
                                          'name': 'get_exchange_rate'}}],
             'role': 'model'},
 'id': 'bOPHtzji',
 # ...
}
{'author': 'currency_exchange_agent',
 'content': {'parts': [{'function_response': {'id': 'adk-2b9230a6-4b92-4a1b-9a65-b708ff6c68b6',
                                              'name': 'get_exchange_rate',
                                              'response': {'amount': 1.0,
                                                           'base': 'USD',
                                                           'date': '2025-04-03',
                                                           'rates': {'SEK': 9.6607}}}}],
             'role': 'user'},
 'id': '9AoDFmiL',
 # ...
}
{'author': 'currency_exchange_agent',
 'content': {'parts': [{'text': 'The exchange rate from USD to SEK on '
                                '2025-04-03 is 1 USD to 9.6607 SEK.'}],
             'role': 'model'},
 'id': 'hmle7trT',
 # ...
}

(Facoltativo) Gestire i ricordi

Per impostazione predefinita, AdkApp utilizza un'implementazione in memoria della memoria dell'agente quando viene eseguito localmente e utilizza Vertex AI Agent Engine Memory Bank dopo aver eseguito il deployment dell'agente in Vertex AI Agent Engine.

Quando sviluppi l'agente ADK, puoi includere un PreloadMemoryTool che controlla quando l'agente recupera i ricordi e come vengono inclusi nel prompt. L'agente di esempio seguente recupera sempre i ricordi all'inizio di ogni turno e li include nell'istruzione di sistema:

from google import adk
from vertexai.agent_engines import AdkApp

agent = adk.Agent(
    model="gemini-2.0-flash",
    name='stateful_agent',
    instruction="""You are a Vehicle Voice Agent, designed to assist users with information and in-vehicle actions.

1.  **Direct Action:** If a user requests a specific vehicle function (e.g., "turn on the AC"), execute it immediately using the corresponding tool. You don't have the outcome of the actual tool execution, so provide a hypothetical tool execution outcome.
2.  **Information Retrieval:** Respond concisely to general information requests with your own knowledge (e.g., restaurant recommendation).
3.  **Clarity:** When necessary, try to seek clarification to better understand the user's needs and preference before taking an action.
4.  **Brevity:** Limit responses to under 30 words.
""",
    tools=[adk.tools.preload_memory_tool.PreloadMemoryTool()],
)
app = AdkApp(agent=agent)

(Facoltativo) Personalizzare il servizio di memoria

Se vuoi eseguire l'override del servizio di memoria predefinito, puoi definire una funzione memory_service_builder che restituisce un BaseMemoryService come segue:

def memory_service_builder():
  from google.adk.memory import InMemoryMemoryService

  return InMemoryMemoryService()

Passa il database a AdkApp come memory_service_builder=:

from vertexai.agent_engines import AdkApp

app = AdkApp(
   agent=agent,                                    # Required.
   memory_service_builder=memory_service_builder,  # Optional.
)

Utilizzare l'agente con i ricordi

Testa il tuo agente ADK con i ricordi:

  1. Crea una sessione e interagisci con l'agente:

    initial_session = await app.async_create_session(user_id="USER_ID")
    
    async for event in app.async_stream_query(
        user_id="USER_ID",
        session_id=initial_session.id,
        message="Can you update the temperature to my preferred temperature?",
    ):
        print(event)
    

    Poiché non sono disponibili ricordi durante la prima sessione e l'agente non conosce le preferenze dell'utente, potrebbe rispondere con una frase come "Qual è la tua temperatura preferita?" Puoi rispondere con il seguente comando:

    async for event in app.async_stream_query(
        user_id="USER_ID",
        session_id=initial_session.id,
        message="I like it at 71 degrees",
    ):
        print(event)
    

    L'agente potrebbe rispondere con un messaggio come "Imposto la temperatura a 22 gradi Celsius. Temperatura modificata correttamente." La risposta dell'agente può variare a seconda del modello utilizzato.

  2. Genera ricordi dalla sessione. Per memorizzare le informazioni della sessione da utilizzare nelle sessioni future, utilizza il metodo async_add_session_to_memory:

    await app.async_add_session_to_memory(session=initial_session)
    
  3. Verifica che l'agente abbia conservato la memoria della sessione (utilizzando PreloadMemoryTool) creando una nuova sessione e chiedendo all'agente:

    new_session = await app.async_create_session(user_id="USER_ID")
    async for event in app.async_stream_query(
        user_id="USER_ID",
        session_id=initial_session.id,
        message="Fix the temperature!",
    ):
        print(event)
    

    L'agente potrebbe restituire una risposta come "Imposto la temperatura a 22 gradi. È corretto?" La risposta dell'agente può variare a seconda del modello e del fornitore di servizi di memoria che hai utilizzato.

  4. Utilizza il metodo async_search_memory per visualizzare i ricordi dell'agente:

    response = await app.async_search_memory(
        user_id="USER_ID",
        query="Fix the temperature!",
    )
    print(response)
    

Passaggi successivi