

# Google ADK
<a name="supported-frameworks-google-adk"></a>

En esta página, se explica cómo utilizar un [agente del Google Agent Development Kit (ADK)](https://google.github.io/adk-docs/), cómo se identifican los intervalos y cómo se extraen los campos de evaluación.

 **Temas** 
+  [Instrumente a su agente](#google-adk-instrument) 
+  [¿Cómo se identifican los tramos](#google-adk-span-identification) 
+  [Cómo se extraen los campos de evaluación](#google-adk-extraction) 
  +  [De los registros de eventos](#google-adk-extraction-event-records) 
  +  [De los atributos de span](#google-adk-extraction-attributes) 
+  [Ejemplos de tramos con registros de eventos](#google-adk-examples-with) 
+  [Ejemplos de tramos sin registros de eventos](#google-adk-examples-without) 

## Instrumente a su agente
<a name="google-adk-instrument"></a>

Puedes instrumentar un agente ADK de Google con la biblioteca de **OpenInference**instrumentación ()`openinference-instrumentation-google-adk`. Esta biblioteca emite telemetría con el nombre del ámbito, `openinference.instrumentation.google_adk` que se lee en Amazon Bedrock AgentCore Evaluations.

Cuando su agente utiliza la AWS Distro for OpenTelemetry (ADOT), como en Amazon Bedrock AgentCore Runtime, no necesita añadir código de instrumentación explícito. Basta con añadir la biblioteca de instrumentación a las dependencias de su proyecto. ADOT la descubre al inicio y la activa automáticamente.

Añada la biblioteca de instrumentación a sus dependencias.

**nota**  
Utilice la versión `0.1.13` o posterior. Esta es la primera versión probada con el servicio de evaluación.

 `requirements.txt`:

```
openinference-instrumentation-google-adk>=0.1.13
```

 `pyproject.toml`:

```
[project]
dependencies = [
    "openinference-instrumentation-google-adk>=0.1.13",
]
```

**nota**  
La instrumentación es un paso para configurar la observabilidad. [Para exportar la telemetría para su evaluación, complete la configuración completa en Configurar la observabilidad.](supported-frameworks.md#supported-frameworks-setup)

## Cómo se identifican los intervalos
<a name="google-adk-span-identification"></a>

El ADK de Google está equipado con la OpenInference convención, por lo que AgentCore Evaluations clasifica los intervalos mediante el atributo. `openinference.span.kind`


| Tipo de tramo | Atributo identificativo | 
| --- | --- | 
| Invoca al agente |  `openinference.span.kind`= `CHAIN` o `AGENT`  | 
| Ejecute la herramienta |  `openinference.span.kind` = `TOOL`  | 
| Inferencia |  `openinference.span.kind` = `LLM`  | 

El ADK de Google emite un árbol de tramos anidado: un `invocation` tramo exterior (`CHAIN`) envuelve un `agent_run` intervalo (`AGENT`), que a su vez envuelve los intervalos () y `call_llm` (`LLM`). `execute_tool` `TOOL` El `CHAIN` intervalo exterior contiene el indicador de usuario; AgentCore Evaluations lo utiliza como intervalo del agente de invocación.

## Cómo se extraen los campos de evaluación
<a name="google-adk-extraction"></a>

Google ADK envuelve el contenido de sus conversaciones en el formato de contenido Gemini. El mensaje del usuario está anidado debajo de un `new_message` objeto como `{"new_message": {"parts": [{"text": "…​"}], "role": "user"}}` y la respuesta del agente está anidada debajo de un objeto como. `content` `{"content": {"parts": [{"text": "…​"}], "role": "model"}}` AgentCore Las evaluaciones desenvuelven estas estructuras y unen el texto con líneas nuevas. `parts` Las definiciones de las herramientas vienen como una solicitud serializada de Gemini; AgentCore Evaluations lee las herramientas disponibles. `config.tools[].function_declarations[]`

La ubicación de este contenido depende de cómo se recopiló la telemetría. El atributo de identificación (`openinference.span.kind`) está en el intervalo en ambos casos. Para obtener más información, consulte [Intervalos, registros de eventos y señales de telemetría](supported-frameworks-telemetry.md).

### De los registros de eventos
<a name="google-adk-extraction-event-records"></a>

Cuando se divide la telemetría, AgentCore Evaluations lee el contenido del registro de eventos correlacionado con cada intervalo:
+  **Solicitud de usuario**: del registro de eventos del intervalo del agente de invocación, en. `body.input` AgentCore Las evaluaciones muestran el texto. `new_message.parts`
+  **Respuesta del agente**: del registro de eventos del intervalo de agentes invocado, en. `body.output` AgentCore Las evaluaciones desentrañan el texto. `content.parts`
+  **Llamada de herramienta**: el nombre de la herramienta a partir del `tool.name` atributo del intervalo de herramientas de ejecución. Los argumentos y el resultado de la herramienta provienen del registro de eventos de ese intervalo, en `body.input` y`body.output`.

Para ver ejemplos, consulte [Ejemplos de intervalos con registros de eventos](#google-adk-examples-with).

### De los atributos de span
<a name="google-adk-extraction-attributes"></a>

Cuando la telemetría no está dividida, el mismo contenido permanece en el intervalo que los atributos:
+  **Mensaje del usuario** y **respuesta del agente**: desde `input.value` y `output.value` en el intervalo de invocación del agente. AgentCore Las evaluaciones muestran el texto y. `new_message.parts` `content.parts`
+  **Llamada a** la herramienta: el nombre de la herramienta`tool.name`, los argumentos y el resultado de `input.value` y`output.value`, en el intervalo de la herramienta de ejecución.

Para ver ejemplos, consulte [Ejemplos de intervalos sin registros de eventos](#google-adk-examples-without).

## Un ejemplo de tramos con registros de eventos
<a name="google-adk-examples-with"></a>

Cuando se divide la telemetría, el intervalo contiene los atributos de identificación y el contenido reside en un registro de eventos correlacionado. Los siguientes ejemplos provienen de un agente de planificación de viajes de Google ADK implementado en Amazon Bedrock Runtime. AgentCore 

**nota**  
Estos ejemplos no son períodos completos. Muestran datos representativos de una interacción real entre agentes, omitiendo algunos campos y truncando los valores largos para facilitar la lectura.

**Example**  
El `openinference.span.kind` atributo (`CHAIN`) del `invocation` intervalo exterior lo identifica como un intervalo de agentes de invocación. El intervalo no contiene contenido de conversación; reside en el registro de eventos correlacionados.  

```
{
  "traceId": "6a387ee61078243c1cc455ed45c6c313",
  "spanId": "70f2e87a30c34420",
  "name": "invocation",
  "kind": "INTERNAL",
  "scope": {
    "name": "openinference.instrumentation.google_adk",
    "version": "0.1.14"
  },
  "attributes": {
    "openinference.span.kind": "CHAIN",
    "input.mime_type": "application/json",
    "output.mime_type": "application/json",
    "user.id": "default_user",
    "session.id": "sea-nyc-trip-2-turns-google-adk-adot"
  },
  "status": {
    "code": "OK"
  }
}
```
El registro de eventos correlacionados contiene la conversación. El mensaje del usuario está anidado debajo `new_message.parts` y la respuesta del agente está anidada debajo. `content.parts`  

```
{
  "spanId": "70f2e87a30c34420",
  "traceId": "6a387ee61078243c1cc455ed45c6c313",
  "scope": {
    "name": "openinference.instrumentation.google_adk"
  },
  "body": {
    "input": {
      "messages": [
        {
          "role": "user",
          "content": "{\"new_message\": {\"parts\": [{\"text\": \"Hey, how can you help me\"}], \"role\": \"user\"}, \"state_delta\": null, \"run_config\": null}"
        }
      ]
    },
    "output": {
      "messages": [
        {
          "role": "assistant",
          "content": "{\"model_version\": \"gemini-2.5-flash\", \"content\": {\"parts\": [{\"text\": \"I can help you with your travel plans! I can:\\n- Search and book flights\\n- Find and book hotels\\n- Suggest and book activities\"}], \"role\": \"model\"}, \"finish_reason\": \"STOP\"}"
        }
      ]
    }
  }
}
```
El `openinference.span.kind` atributo (`TOOL`) lo identifica como un intervalo de herramientas de ejecución; `tool.name` contiene el nombre de la herramienta. Los argumentos y el resultado de la herramienta se encuentran en el registro del evento correlacionado.  

```
{
  "traceId": "6a387ef07b8f4f3732fab45d3c0b51ff",
  "spanId": "9028a8dd94943456",
  "name": "execute_tool search_flights",
  "kind": "INTERNAL",
  "scope": {
    "name": "openinference.instrumentation.google_adk",
    "version": "0.1.14"
  },
  "attributes": {
    "openinference.span.kind": "TOOL",
    "gen_ai.operation.name": "execute_tool",
    "gen_ai.tool.name": "search_flights",
    "gen_ai.tool.type": "FunctionTool",
    "gen_ai.tool.call.id": "adk-12345678-1234-1234-1234-123456789012",
    "tool.name": "search_flights",
    "tool.parameters": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}",
    "session.id": "sea-nyc-trip-2-turns-google-adk-adot"
  },
  "status": {
    "code": "OK"
  }
}
```

```
{
  "spanId": "9028a8dd94943456",
  "traceId": "6a387ef07b8f4f3732fab45d3c0b51ff",
  "scope": {
    "name": "openinference.instrumentation.google_adk"
  },
  "body": {
    "input": {
      "messages": [
        { "role": "user", "content": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}" }
      ]
    },
    "output": {
      "messages": [
        {
          "role": "assistant",
          "content": "{\"id\": \"adk-12345678-...\", \"name\": \"search_flights\", \"response\": {\"origin\": \"SEA\", \"destination\": \"NYC\", \"flights\": [ ... ]}}"
        }
      ]
    }
  }
}
```
El `openinference.span.kind` atributo (`LLM`) del `call_llm` intervalo lo identifica como un intervalo de inferencia. Contiene los metadatos del modelo y, en los `llm.output_messages.` atributos `llm.input_messages. ` e indexados, los mensajes de la llamada al modelo.  

```
{
  "traceId": "6a387ee61078243c1cc455ed45c6c313",
  "spanId": "1c4e5f8a2b9d0e73",
  "name": "call_llm",
  "kind": "INTERNAL",
  "scope": {
    "name": "openinference.instrumentation.google_adk",
    "version": "0.1.14"
  },
  "attributes": {
    "openinference.span.kind": "LLM",
    "gen_ai.operation.name": "generate_content",
    "gen_ai.request.model": "gemini-2.5-flash",
    "llm.model_name": "gemini-2.5-flash",
    "llm.input_messages.0.message.role": "system",
    "llm.input_messages.1.message.role": "user",
    "llm.input_messages.1.message.contents.0.message_content.text": "Hey, how can you help me",
    "llm.output_messages.0.message.role": "model",
    "llm.output_messages.0.message.contents.0.message_content.text": "I can help you plan your trip ...",
    "session.id": "sea-nyc-trip-2-turns-google-adk-adot"
  },
  "status": {
    "code": "OK"
  }
}
```

## El ejemplo abarca espacios sin registros de eventos
<a name="google-adk-examples-without"></a>

Cuando la telemetría no está dividida, el mismo contenido permanece en los atributos del tramo y no se genera ningún registro de eventos independiente. Los siguientes ejemplos son de un agente de planificación de viajes de Google ADK.

**nota**  
Estos ejemplos no son tramos completos. Muestran datos representativos de una interacción real entre agentes, omitiendo algunos campos y truncando los valores largos para facilitar la lectura.

**Example**  
El `input.value` atributo contiene el mensaje del usuario (anidado debajo`new_message.parts`) y el `output.value` atributo contiene la respuesta del agente (anidada debajo). `content.parts`  

```
{
  "traceId": "6a4de7b85e61747e6b568a1f4768e89d",
  "spanId": "31ea3d5882dac680",
  "name": "invocation",
  "kind": "INTERNAL",
  "scope": {
    "name": "openinference.instrumentation.google_adk",
    "version": "0.1.13"
  },
  "attributes": {
    "openinference.span.kind": "CHAIN",
    "input.value": "{\"user_id\": \"test_user\", \"session_id\": \"sea-nyc-trip-2-turns-google-adk-unified\", \"new_message\": {\"parts\": [{\"text\": \"Hey, how can you help me\"}], \"role\": \"user\"}}",
    "input.mime_type": "application/json",
    "output.value": "{\"model_version\": \"gemini-2.5-flash\", \"content\": {\"parts\": [{\"text\": \"I can help you plan your trip! I can:\\n- Search and book flights\\n- Find and book hotels\\n- Suggest and book activities\"}], \"role\": \"model\"}, \"finish_reason\": \"STOP\"}",
    "output.mime_type": "application/json",
    "session.id": "sea-nyc-trip-2-turns-google-adk-unified"
  },
  "status": {
    "code": "OK"
  }
}
```
El `input.value` atributo contiene los argumentos de la herramienta y el `output.value` atributo contiene el resultado de la herramienta.  

```
{
  "traceId": "6a4de7c376913db82e6f0f336a16731d",
  "spanId": "b64c37adefae74f0",
  "name": "execute_tool search_flights",
  "kind": "INTERNAL",
  "scope": {
    "name": "openinference.instrumentation.google_adk",
    "version": "0.1.13"
  },
  "attributes": {
    "openinference.span.kind": "TOOL",
    "gen_ai.operation.name": "execute_tool",
    "gen_ai.tool.name": "search_flights",
    "gen_ai.tool.call.id": "adk-12345678-1234-1234-1234-123456789012",
    "tool.name": "search_flights",
    "tool.parameters": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}",
    "input.value": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}",
    "output.value": "{\"id\": \"adk-12345678-...\", \"name\": \"search_flights\", \"response\": {\"origin\": \"SEA\", \"destination\": \"NYC\", \"flights\": [ ... ]}}",
    "session.id": "sea-nyc-trip-2-turns-google-adk-unified"
  },
  "status": {
    "code": "OK"
  }
}
```
El `openinference.span.kind` atributo (`LLM`) del `call_llm` intervalo lo identifica como un intervalo de inferencia. Los mensajes de la llamada al modelo están en línea en los atributos indexados. `llm.input_messages. ` `llm.output_messages.`  

```
{
  "traceId": "6a4de7b85e61747e6b568a1f4768e89d",
  "spanId": "2d5f6a9b3c0e1f84",
  "name": "call_llm",
  "kind": "INTERNAL",
  "scope": {
    "name": "openinference.instrumentation.google_adk",
    "version": "0.1.13"
  },
  "attributes": {
    "openinference.span.kind": "LLM",
    "gen_ai.operation.name": "generate_content",
    "gen_ai.request.model": "gemini-2.5-flash",
    "llm.model_name": "gemini-2.5-flash",
    "llm.input_messages.0.message.role": "system",
    "llm.input_messages.1.message.role": "user",
    "llm.input_messages.1.message.contents.0.message_content.text": "Hey, how can you help me",
    "llm.output_messages.0.message.role": "model",
    "llm.output_messages.0.message.contents.0.message_content.text": "I can help you plan your trip ...",
    "session.id": "sea-nyc-trip-2-turns-google-adk-unified"
  },
  "status": {
    "code": "OK"
  }
}
```