Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Agentes de OpenAI
Esta página explica cómo instrumentar un agente de OpenAI Agents, cómo se identifican los intervalos y cómo se extraen los campos de evaluación. AgentCore Evaluations es compatible con los agentes de OpenAI creados en Python y, en esta página TypeScript, se trata de cada idioma por separado, tanto en el soporte de agentes como en el soporte de agentes de Python. TypeScript
Temas
Soporte de agentes de Python
Un agente de Python OpenAI Agents emite intervalos con el nombre de ámbito opentelemetry.instrumentation.openai_agents (OpenTelemetry) o openinference.instrumentation.openai_agents (). OpenInference
Instrumente a su agente
Puede instrumentar un agente de OpenAI Agents con cualquiera de las dos bibliotecas de instrumentación: OpenTelemetry (opentelemetry-instrumentation-openai-agents) o OpenInference (openinference-instrumentation-openai-agents). Amazon Bedrock AgentCore Evaluations es compatible con ambas bibliotecas. Las bibliotecas emiten distintos nombres de ámbito y utilizan distintos atributos de intervalo. El servicio de evaluación extrae los mismos valores de cada uno.
Cuando su agente se ejecuta con la AWS distribución para OpenTelemetry (ADOT), como en Amazon Bedrock AgentCore Runtime, no es necesario 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.
Agregue la biblioteca de instrumentación para la ruta que desee a sus dependencias. Usa la última versión disponible a menos que tengas un motivo para anclar.
ejemplo
- OpenTelemetry
-
NOTA: Usa la versión 0.61.0 o posterior. Esta es la primera versión probada con el servicio de evaluación.
Añada opentelemetry-instrumentation-openai-agents a sus dependencias. El nombre del ámbito emitido esopentelemetry.instrumentation.openai_agents.
requirements.txt:
opentelemetry-instrumentation-openai-agents>=0.61.0
pyproject.toml:
[project]
dependencies = [
"opentelemetry-instrumentation-openai-agents>=0.61.0",
]
- OpenInference
-
NOTA: Utilice la versión 1.5.0 o posterior. Esta es la primera versión probada con el servicio de evaluación.
Añada openinference-instrumentation-openai-agents a sus dependencias. El nombre del ámbito emitido esopeninference.instrumentation.openai_agents.
requirements.txt:
openinference-instrumentation-openai-agents>=1.5.0
pyproject.toml:
[project]
dependencies = [
"openinference-instrumentation-openai-agents>=1.5.0",
]
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.
Cómo se identifican los intervalos
El atributo utilizado para clasificar los intervalos difiere entre las dos bibliotecas de instrumentación.
ejemplo
- OpenTelemetry
-
La biblioteca de OpenTelemetry instrumentación clasifica los intervalos mediante el atributo. gen_ai.operation.name
| Tipo de intervalo |
Atributo identificativo |
|
Invocar al agente
|
gen_ai.operation.name = invoke_agent
|
|
Ejecute la herramienta
|
gen_ai.operation.name = execute_tool
|
|
Inferencia
|
gen_ai.operation.name = chat
|
Los agentes de OpenAI también emiten intervalos de límite de giro internos con =. gen_ai.operation.name unknown El servicio de evaluación los omite.
- OpenInference
-
La biblioteca de OpenInference instrumentación clasifica los intervalos mediante el atributo. openinference.span.kind
| Tipo de intervalo |
Atributo identificativo |
|
Invocar al agente
|
openinference.span.kind= AGENT o CHAIN
|
|
Ejecutar herramienta
|
openinference.span.kind = TOOL
|
|
Inferencia
|
openinference.span.kind = LLM
|
En la OpenInference biblioteca, CHAIN los espacios AGENT y son contenedores estructurales vacíos: no contienen contenido de conversación. La solicitud del usuario y la respuesta del agente se reconstruyen a partir de los intervalos de inferencia (LLM) de la misma traza.
OpenAI Agents serializa los mensajes en un formato basado en partes, en el que cada mensaje contiene una parts serie de bloques de contenido escritos (por ejemplo,). [{"role": "user", "parts": [{"type": "text", "content": "…"}]}] Con la OpenTelemetry biblioteca, AgentCore Evaluations analiza el texto de estas partes. Con la OpenInference biblioteca, la salida del modelo es el objeto de respuesta completo de OpenAI, y AgentCore Evaluations lee el texto de la respuesta. output[].content[].text
La ubicación de este contenido depende de cómo se recopiló la telemetría. El atributo identificativo (gen_ai.operation.nameoopeninference.span.kind) está en el intervalo en ambos casos. Para obtener más información, consulte Configuración y entrega de telemetría.
Con la telemetría dividida, AgentCore Evaluations lee el contenido de la conversación del registro de eventos en relación con cada período. La ubicación de las entradas y salidas de las herramientas difiere entre las dos bibliotecas:
-
OpenTelemetry:
-
Mensaje del usuario y respuesta del agente: desde el registro de eventos del intervalo de agentes que invoca, en body.input ybody.output.
-
Llamada a la herramienta: el nombre de la herramienta degen_ai.tool.name, los argumentos y el resultado de gen_ai.tool.call.arguments y gen_ai.tool.call.result sobre el conjunto de herramientas de ejecución. Con la OpenTelemetry biblioteca, los argumentos y los resultados de la herramienta permanecen en los atributos del conjunto incluso con la telemetría dividida.
-
OpenInference:
-
Mensaje del usuario y respuesta del agente: se reconstruyeron a partir del registro de eventos del intervalo de inferencia. AgentCore Las evaluaciones leen los mensajes body.input ybody.output, a continuación, rellenan el intervalo vacío del agente de invocación con la solicitud del usuario y la respuesta del agente.
-
Llamada a la herramienta: el nombre de la herramienta que aparece tool.name en el 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 ybody.output.
Para obtener más información, consulte el ejemplo de intervalos en telemetría dividida.
Con la telemetría unificada, el mismo contenido permanece en el intervalo que los atributos. Los atributos dependen de la biblioteca de instrumentación:
-
OpenTelemetry:
-
Mensaje del usuario y respuesta del agente: desde gen_ai.input.messages y después del gen_ai.output.messages intervalo del agente que invoca.
-
Llamada a la herramienta: el nombre de la herramienta desdegen_ai.tool.name, los argumentos y el resultado de gen_ai.tool.call.arguments ygen_ai.tool.call.result, en el intervalo de la herramienta de ejecución.
-
OpenInference:
-
El mensaje del usuario y la respuesta del agente: a partir de los atributos del mensaje indexado en el intervalo de inferencia (llm.input_messages.*yllm.output_messages.*) y, a continuación, se rellenan en el intervalo vacío del agente de invocación.
-
Llamada a la herramienta: el nombre de la herramienta detool.name, y los argumentos y el resultado de input.value youtput.value, en el intervalo de la herramienta de ejecución.
Para obtener más información, consulte Ejemplos de intervalos en telemetría unificada.
Ejemplos de intervalos en telemetría dividida
Con la telemetría dividida, el intervalo contiene los atributos de identificación y el contenido se encuentra en un registro de eventos correlacionado. Los siguientes ejemplos provienen de un agente de planificación de viajes de Python OpenAI Agents implementado en Amazon Bedrock Runtime. AgentCore El mismo agente se muestra en cada biblioteca de instrumentación.
Estos ejemplos no son conjuntos completos. Muestran datos representativos de una interacción real con un agente; se omiten algunos campos y se truncan los valores largos para facilitar la lectura.
OpenTelemetry
ejemplo
- Invoke agent span
-
El gen_ai.operation.name atributo (invoke_agent) lo identifica como un intervalo de agentes de invocación.
{
"traceId": "6a01eef11066751d68f90def0da1f80a",
"spanId": "3a300b0b3fe650e4",
"name": "invoke_agent openaiOtelTravel",
"kind": "INTERNAL",
"scope": {
"name": "opentelemetry.instrumentation.openai_agents",
"version": "0.62.1"
},
"attributes": {
"gen_ai.operation.name": "invoke_agent",
"gen_ai.agent.name": "openaiOtelTravel",
"gen_ai.system": "openai",
"gen_ai.provider.name": "openai",
"gen_ai.request.model": "gpt-4o-mini-2024-07-18",
"session.id": "sea-nyc-trip-2-turns-openai-otel"
},
"status": {
"code": "OK"
}
}
El registro de eventos correlacionados contiene la conversación. Cada mensaje content es la matriz de formato de piezas de OpenAI; la línea de comandos del usuario es el texto del mensaje del usuario y la respuesta del agente es el texto del mensaje del asistente.
{
"spanId": "3a300b0b3fe650e4",
"traceId": "6a01eef11066751d68f90def0da1f80a",
"scope": {
"name": "opentelemetry.instrumentation.openai_agents"
},
"body": {
"input": {
"messages": [
{
"role": "user",
"content": "[{\"role\": \"user\", \"parts\": [{\"type\": \"text\", \"content\": \"Hey, how can you help me\"}]}]"
}
]
},
"output": {
"messages": [
{
"role": "assistant",
"content": "[{\"role\": \"assistant\", \"parts\": [{\"type\": \"text\", \"content\": \"I can assist you with planning your trips ...\"}]}]"
}
]
}
}
}
- Execute tool span
-
El gen_ai.operation.name atributo (execute_tool) lo identifica como un intervalo de herramientas de ejecución; gen_ai.tool.name contiene el nombre de la herramienta. Con la OpenTelemetry biblioteca, los argumentos y el resultado de la herramienta permanecen en los atributos del conjunto incluso con la telemetría dividida.
{
"traceId": "6a01eefa5c52f3d86a35038f35f5ba30",
"spanId": "3cbc4ea5f73fef81",
"name": "execute_tool search_flights",
"kind": "INTERNAL",
"scope": {
"name": "opentelemetry.instrumentation.openai_agents",
"version": "0.62.1"
},
"attributes": {
"gen_ai.operation.name": "execute_tool",
"gen_ai.tool.name": "search_flights",
"gen_ai.tool.type": "function",
"gen_ai.tool.call.arguments": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}",
"gen_ai.tool.call.result": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"flights\": [ ... ]}",
"session.id": "sea-nyc-trip-2-turns-openai-otel"
},
"status": {
"code": "OK"
}
}
- Inference span
-
El gen_ai.operation.name atributo (chat) lo identifica como un intervalo de inferencia. Este intervalo contiene los metadatos del modelo y, en élgen_ai.tool.definitions, la lista de herramientas disponibles para el agente. Los mensajes de conversación de la llamada modelo aparecen en el registro de eventos correlacionados, en body.input ybody.output.
{
"traceId": "6a01eef11066751d68f90def0da1f80a",
"spanId": "7c1f9a2b4d6e8a03",
"name": "openai.response",
"kind": "INTERNAL",
"scope": {
"name": "opentelemetry.instrumentation.openai_agents",
"version": "0.62.1"
},
"attributes": {
"gen_ai.operation.name": "chat",
"gen_ai.provider.name": "openai",
"gen_ai.request.model": "gpt-4o-mini-2024-07-18",
"gen_ai.response.model": "gpt-4o-mini-2024-07-18",
"gen_ai.usage.input_tokens": 269,
"gen_ai.usage.output_tokens": 78,
"gen_ai.tool.definitions": "[{\"type\": \"function\", \"function\": {\"name\": \"search_flights\", \"description\": \"Search for available flights between cities.\", \"parameters\": { ... }}}]",
"session.id": "sea-nyc-trip-2-turns-openai-otel"
},
"status": {
"code": "OK"
}
}
{
"spanId": "7c1f9a2b4d6e8a03",
"traceId": "6a01eef11066751d68f90def0da1f80a",
"scope": {
"name": "opentelemetry.instrumentation.openai_agents"
},
"body": {
"input": {
"messages": [
{
"role": "user",
"content": "[{\"role\": \"user\", \"parts\": [{\"type\": \"text\", \"content\": \"Hey, how can you help me\"}]}]"
}
]
},
"output": {
"messages": [
{
"role": "assistant",
"content": "[{\"role\": \"assistant\", \"parts\": [{\"type\": \"text\", \"content\": \"I can assist you with planning your trips ...\"}]}]"
}
]
}
}
}
OpenInference
Con la OpenInference biblioteca, el intervalo invoke agent (AGENT) es un contenedor vacío. AgentCore Las evaluaciones reconstruyen la solicitud del usuario y la respuesta del agente a partir del intervalo inference (LLM), cuyo contenido se encuentra en un registro de eventos correlacionados.
ejemplo
- Invoke agent span
-
El openinference.span.kind atributo (AGENT) lo identifica como un intervalo de agentes de invocación. El intervalo no incluye contenido de conversación.
{
"traceId": "6a387ee61078243c1cc455ed45c6c313",
"spanId": "9a1c7dce81b692cd",
"name": "openaiOInfTravel",
"kind": "INTERNAL",
"scope": {
"name": "openinference.instrumentation.openai_agents",
"version": "1.5.0"
},
"attributes": {
"openinference.span.kind": "AGENT",
"graph.node.id": "openaiOInfTravel",
"llm.system": "openai",
"session.id": "sea-nyc-trip-2-turns-openai-oi"
},
"status": {
"code": "OK"
}
}
- Execute tool span
-
El openinference.span.kind atributo (TOOL) lo identifica como un conjunto 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 de eventos correlacionados.
{
"traceId": "6a387ef07b8f4f3732fab45d3c0b51ff",
"spanId": "b4e78cb0a06a6fe2",
"name": "search_flights",
"kind": "INTERNAL",
"scope": {
"name": "openinference.instrumentation.openai_agents",
"version": "1.5.0"
},
"attributes": {
"openinference.span.kind": "TOOL",
"tool.name": "search_flights",
"input.mime_type": "application/json",
"output.mime_type": "application/json",
"session.id": "sea-nyc-trip-2-turns-openai-oi"
},
"status": {
"code": "OK"
}
}
{
"spanId": "b4e78cb0a06a6fe2",
"traceId": "6a387ef07b8f4f3732fab45d3c0b51ff",
"scope": {
"name": "openinference.instrumentation.openai_agents"
},
"body": {
"input": {
"messages": [
{ "role": "user", "content": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}" }
]
},
"output": {
"messages": [
{ "role": "assistant", "content": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"flights\": [ ... ]}" }
]
}
}
}
- Inference span
-
El openinference.span.kind atributo (LLM) lo identifica como un intervalo de inferencia. Las funciones de los mensajes y las definiciones de las herramientas se encuentran en los atributos del intervalo; el contenido del mensaje se encuentra en el registro de eventos correlacionados. ADOT aplana los roles de entrada para user que AgentCore Evaluations utilice el último mensaje de texto sin formato como mensaje de usuario. El mensaje de salida es el objeto de respuesta de OpenAI, desde el que AgentCore Evaluations lee el texto de la respuesta.
{
"traceId": "6a387ee61078243c1cc455ed45c6c313",
"spanId": "1221a062c7f90a8e",
"name": "response",
"kind": "INTERNAL",
"scope": {
"name": "openinference.instrumentation.openai_agents",
"version": "1.5.0"
},
"attributes": {
"openinference.span.kind": "LLM",
"llm.model_name": "gpt-4o-mini-2024-07-18",
"llm.input_messages.0.message.role": "system",
"llm.input_messages.1.message.role": "user",
"llm.output_messages.0.message.role": "assistant",
"llm.tools.0.tool.json_schema": "{\"type\": \"function\", \"function\": {\"name\": \"search_flights\", ...}}",
"session.id": "sea-nyc-trip-2-turns-openai-oi"
},
"status": {
"code": "OK"
}
}
{
"spanId": "1221a062c7f90a8e",
"traceId": "6a387ee61078243c1cc455ed45c6c313",
"scope": {
"name": "openinference.instrumentation.openai_agents"
},
"body": {
"input": {
"messages": [
{ "role": "user", "content": "[{\"content\": \"Hey, how can you help me\", \"role\": \"user\"}]" },
{ "role": "user", "content": "You are a travel planning assistant. Help users plan trips ..." },
{ "role": "user", "content": "Hey, how can you help me" }
]
},
"output": {
"messages": [
{
"role": "assistant",
"content": "{\"id\": \"resp_abc123...\", \"output\": [{\"type\": \"message\", \"content\": [{\"type\": \"output_text\", \"text\": \"I can assist you with planning your trips ...\"}]}]}"
}
]
}
}
}
El ejemplo abarca la telemetría unificada
Con la telemetría unificada, el mismo contenido permanece en los atributos del intervalo y no se produce ningún registro de eventos independiente. Los siguientes ejemplos provienen de un agente de planificación de viajes de Python OpenAI Agents. El mismo agente se muestra en cada biblioteca de instrumentación.
Estos ejemplos no son conjuntos completos. Muestran datos representativos de una interacción real con un agente; se omiten algunos campos y se truncan los valores largos para facilitar la lectura.
OpenTelemetry
ejemplo
- Invoke agent span
-
El gen_ai.input.messages atributo contiene la solicitud del usuario y la respuesta del gen_ai.output.messages agente. Ambas son matrices en formato de piezas de OpenAI.
{
"traceId": "6a4de7b85e61747e6b568a1f4768e89d",
"spanId": "50656fd77904d125",
"name": "invoke_agent openaiOtelTravel",
"kind": "INTERNAL",
"scope": {
"name": "opentelemetry.instrumentation.openai_agents",
"version": "0.62.1"
},
"attributes": {
"gen_ai.operation.name": "invoke_agent",
"gen_ai.agent.name": "openaiOtelTravel",
"gen_ai.system": "openai",
"gen_ai.input.messages": "[{\"role\": \"user\", \"parts\": [{\"type\": \"text\", \"content\": \"Hey, how can you help me\"}]}]",
"gen_ai.output.messages": "[{\"role\": \"assistant\", \"parts\": [{\"type\": \"text\", \"content\": \"I can assist you with planning your trips ...\"}]}]",
"session.id": "sea-nyc-trip-2-turns-unified"
},
"status": {
"code": "OK"
}
}
- Execute tool span
-
El gen_ai.tool.call.arguments atributo contiene los argumentos de la herramienta y el gen_ai.tool.call.result atributo contiene el resultado de la herramienta.
{
"traceId": "6a4de7c376913db82e6f0f336a16731d",
"spanId": "8840e8e23724ebd7",
"name": "execute_tool search_flights",
"kind": "INTERNAL",
"scope": {
"name": "opentelemetry.instrumentation.openai_agents",
"version": "0.62.1"
},
"attributes": {
"gen_ai.operation.name": "execute_tool",
"gen_ai.tool.name": "search_flights",
"gen_ai.tool.call.arguments": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}",
"gen_ai.tool.call.result": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"flights\": [ ... ]}",
"session.id": "sea-nyc-trip-2-turns-unified"
},
"status": {
"code": "OK"
}
}
- Inference span
-
El gen_ai.operation.name atributo (chat) lo identifica como un intervalo de inferencia. Los metadatos del modelo y el gen_ai.tool.definitions atributo (la lista de herramientas disponibles para el agente) permanecen alineados en el intervalo.
{
"traceId": "6a4de7b85e61747e6b568a1f4768e89d",
"spanId": "9b2c1e5f7a3d0846",
"name": "openai.response",
"kind": "INTERNAL",
"scope": {
"name": "opentelemetry.instrumentation.openai_agents",
"version": "0.62.1"
},
"attributes": {
"gen_ai.operation.name": "chat",
"gen_ai.provider.name": "openai",
"gen_ai.request.model": "gpt-4o-mini-2024-07-18",
"gen_ai.response.model": "gpt-4o-mini-2024-07-18",
"gen_ai.usage.input_tokens": 269,
"gen_ai.usage.output_tokens": 78,
"gen_ai.tool.definitions": "[{\"type\": \"function\", \"function\": {\"name\": \"search_flights\", \"description\": \"Search for available flights between cities.\", \"parameters\": { ... }}}]",
"session.id": "sea-nyc-trip-2-turns-unified"
},
"status": {
"code": "OK"
}
}
OpenInference
ejemplo
- Execute tool span
-
El input.value atributo contiene los argumentos de la herramienta y el output.value atributo contiene el resultado de la herramienta.
{
"traceId": "6a387ef07b8f4f3732fab45d3c0b51ff",
"spanId": "d5a1c9e70b46f312",
"name": "search_flights",
"kind": "INTERNAL",
"scope": {
"name": "openinference.instrumentation.openai_agents",
"version": "1.5.1"
},
"attributes": {
"openinference.span.kind": "TOOL",
"tool.name": "search_flights",
"input.value": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}",
"output.value": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"flights\": [ ... ]}",
"session.id": "sea-nyc-trip-2-turns-oi"
},
"status": {
"code": "OK"
}
}
- Inference span
-
El contenido del mensaje está en línea en los atributos indexados. Los llm.input_messages.* atributos contienen la solicitud del sistema y la solicitud del usuario, y los llm.output_messages.* atributos contienen la respuesta del agente. AgentCore Las evaluaciones reconstruyen la solicitud del usuario y la respuesta del agente a partir de este intervalo y rellenan el intervalo vacío de invoke agent (). AGENT
{
"traceId": "6a387ee61078243c1cc455ed45c6c313",
"spanId": "c9f0a2b41d773e88",
"name": "response",
"kind": "INTERNAL",
"scope": {
"name": "openinference.instrumentation.openai_agents",
"version": "1.5.1"
},
"attributes": {
"openinference.span.kind": "LLM",
"llm.model_name": "gpt-4o-mini-2024-07-18",
"llm.input_messages.0.message.role": "system",
"llm.input_messages.0.message.content": "You are a travel planning assistant ...",
"llm.input_messages.1.message.role": "user",
"llm.input_messages.1.message.content": "Hey, how can you help me",
"llm.output_messages.0.message.role": "assistant",
"llm.output_messages.0.message.contents.0.message_content.text": "I can assist you with planning your trips ...",
"session.id": "sea-nyc-trip-2-turns-oi"
},
"status": {
"code": "OK"
}
}
TypeScript soporte de agentes
Un agente de TypeScript OpenAI Agents emite los mismos tipos de segmentos, atributos de identificación y diseño de contenido que un agente de Python, por lo que el servicio de evaluación lo lee de la misma manera. Hay dos bibliotecas de TypeScript instrumentación, cada una con su propio nombre de ámbito.
Instrumente a su agente
Agregue a sus TypeScript dependencias la biblioteca de instrumentación de la convención que desee. Usa la última versión disponible a menos que tengas un motivo para anclar.
ejemplo
- ADOT (OpenTelemetry)
-
Para TypeScript los agentes de ADOT, añada el paquete de autoinstrumentación AWS Distro Node (@aws/aws-distro-opentelemetry-node-autoinstrumentation) a sus dependencias. Incluye la instrumentación integrada de OpenAI Agents, que se activa al inicio y emite el nombre del ámbito. @aws/aws-distro-opentelemetry-instrumentation-openai-agents
package.json:
{
"dependencies": {
"@aws/aws-distro-opentelemetry-node-autoinstrumentation": "^0.12.0"
}
}
- OpenInference
-
Añada @arizeai/openinference-instrumentation-openai-agents a sus dependencias. El nombre del ámbito emitido es. @arizeai/openinference-instrumentation-openai-agents
package.json:
{
"dependencies": {
"@arizeai/openinference-instrumentation-openai-agents": "^0.2.2"
}
}
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.
Cómo se identifican los intervalos
La identificación del intervalo es la misma que la de un agente de Python. La ADOT-native OpenTelemetry biblioteca (del paquete de autoinstrumentación AWS Distro Node@aws/aws-distro-opentelemetry-node-autoinstrumentation, que emite el nombre del ámbito@aws/aws-distro-opentelemetry-instrumentation-openai-agents) se establece gen_ai.operation.name y la biblioteca OpenInference JS () se establece. @arizeai/openinference-instrumentation-openai-agents openinference.span.kind Para ver los valores, consulte Cómo se identifican los intervalos en la sección Compatibilidad con agentes de Python. Soporte de agentes de Python
La extracción de campos lee los mismos atributos que para un agente de Python. Tenga en cuenta que en la ADOT-native TypeScript biblioteca, el intervalo del agente de invocación es un contenedor estructural: la solicitud del usuario y la respuesta del agente se reconstruyen a partir del intervalo de inference (chat) en lugar del intervalo del agente de invocación, a diferencia de la OpenTelemetry biblioteca de Python, que los mantiene en el intervalo del agente de invocación. Para saber desde dónde se lee cada campo, consulta Cómo se extraen los campos de evaluación en la versión compatible con el agente de Python. Soporte de agentes de Python
Ejemplos de intervalos de un agente TypeScript
Los siguientes ejemplos provienen de un agente de planificación de viajes de TypeScript OpenAI Agents implementado en Amazon Bedrock AgentCore Runtime con telemetría unificada. El mismo agente se muestra en cada biblioteca de instrumentación.
Estos ejemplos no son conjuntos completos. Muestran datos representativos de una interacción real con un agente; se omiten algunos campos y se truncan los valores largos para facilitar la lectura.
OpenTelemetry
En la ADOT-native biblioteca (del paquete de autoinstrumentación de AWS Distro Node, donde se emite el nombre del ámbito@aws/aws-distro-opentelemetry-instrumentation-openai-agents)@aws/aws-distro-opentelemetry-node-autoinstrumentation, el intervalo del agente invocador es un contenedor estructural y el contenido de la conversación se encuentra en el intervalo inference (), en el formato de las partes y los atributos. chat gen_ai.input.messages gen_ai.output.messages AgentCore Las evaluaciones reconstruyen la solicitud del usuario y la respuesta del agente a partir del intervalo de inferencia.
ejemplo
- Invoke agent span
-
El gen_ai.operation.name atributo (invoke_agent) lo identifica como un intervalo de agentes de invocación. El intervalo contiene el nombre del agente y la lista de herramientas, pero no el contenido de la conversación.
{
"traceId": "6a6bc695459e41aa14a172bb41d3246d",
"spanId": "9a1c7dce81b692cd",
"name": "invoke_agent openaiAdotTS",
"kind": "INTERNAL",
"scope": {
"name": "@aws/aws-distro-opentelemetry-instrumentation-openai-agents",
"version": "0.12.0"
},
"attributes": {
"gen_ai.operation.name": "invoke_agent",
"gen_ai.agent.name": "openaiAdotTS",
"gen_ai.provider.name": "openai",
"open_ai.agent.tools": "[\"search_flights\", \"book_flight\", \"search_hotels\", \"book_hotel\", \"search_activities\", \"book_activity\"]",
"session.id": "sea-nyc-trip-2-turns"
},
"status": {
"code": "OK"
}
}
- Execute tool span
-
El gen_ai.operation.name atributo (execute_tool) lo identifica como un conjunto de herramientas de ejecución; gen_ai.tool.name contiene el nombre de la herramienta. Los gen_ai.tool.call.result atributos gen_ai.tool.call.arguments y contienen los argumentos y el resultado de la herramienta.
{
"traceId": "6a6bc695459e41aa14a172bb41d3246d",
"spanId": "3cbc4ea5f73fef81",
"name": "execute_tool search_flights",
"kind": "INTERNAL",
"scope": {
"name": "@aws/aws-distro-opentelemetry-instrumentation-openai-agents",
"version": "0.12.0"
},
"attributes": {
"gen_ai.operation.name": "execute_tool",
"gen_ai.tool.name": "search_flights",
"gen_ai.tool.type": "function",
"gen_ai.tool.call.arguments": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}",
"gen_ai.tool.call.result": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"flights\": [ ... ]}",
"session.id": "sea-nyc-trip-2-turns"
},
"status": {
"code": "OK"
}
}
- Inference span
-
El gen_ai.operation.name atributo (chat) lo identifica como un intervalo de inferencia. Los gen_ai.output.messages atributos gen_ai.input.messages y mantienen la conversación en formato de partes, gen_ai.system_instructions contienen el indicador del sistema y gen_ai.tool.definitions muestran las herramientas disponibles para el agente.
{
"traceId": "6a6bc695459e41aa14a172bb41d3246d",
"spanId": "7c1f9a2b4d6e8a03",
"name": "chat gpt-4o-mini-2024-07-18",
"kind": "INTERNAL",
"scope": {
"name": "@aws/aws-distro-opentelemetry-instrumentation-openai-agents",
"version": "0.12.0"
},
"attributes": {
"gen_ai.operation.name": "chat",
"gen_ai.provider.name": "openai",
"gen_ai.response.model": "gpt-4o-mini-2024-07-18",
"gen_ai.input.messages": "[{\"role\": \"user\", \"parts\": [{\"type\": \"text\", \"content\": \"Hey, how can you help me\"}]}]",
"gen_ai.output.messages": "[{\"role\": \"assistant\", \"parts\": [{\"type\": \"text\", \"content\": \"I can assist you with planning your trips ...\"}]}]",
"gen_ai.system_instructions": "[{\"type\": \"text\", \"content\": \"You are a travel planning assistant ...\"}]",
"gen_ai.tool.definitions": "[{\"type\": \"function\", \"name\": \"search_flights\", \"description\": \"Search for available flights between cities.\", ...}]",
"gen_ai.usage.input_tokens": 422,
"gen_ai.usage.output_tokens": 82,
"session.id": "sea-nyc-trip-2-turns"
},
"status": {
"code": "OK"
}
}
OpenInference
En la biblioteca OpenInference JS, los intervalos invoke agent (AGENT) y turn (CHAIN) son contenedores vacíos. AgentCore Las evaluaciones reconstruyen la solicitud del usuario y la respuesta del agente a partir del intervalo inference (LLM), cuyos mensajes se encuentran en el índice y los atributos. llm.input_messages.* llm.output_messages.*
ejemplo
- Invoke agent span
-
El openinference.span.kind atributo (AGENT) lo identifica como un intervalo de agentes de invocación. El intervalo no incluye contenido de conversación.
{
"traceId": "6a6bc695459e41aa14a172bb41d3246d",
"spanId": "9a1c7dce81b692cd",
"name": "openaiAgentsOInf",
"kind": "INTERNAL",
"scope": {
"name": "@arizeai/openinference-instrumentation-openai-agents",
"version": "0.2.2"
},
"attributes": {
"openinference.span.kind": "AGENT",
"graph.node.id": "openaiAgentsOInf",
"llm.system": "openai",
"session.id": "sea-nyc-trip-2-turns"
},
"status": {
"code": "OK"
}
}
- Execute tool span
-
El openinference.span.kind atributo (TOOL) lo identifica como un conjunto de herramientas de ejecución; tool.name contiene el nombre de la herramienta. Los output.value atributos input.value y contienen los argumentos y el resultado de la herramienta.
{
"traceId": "6a6bc695459e41aa14a172bb41d3246d",
"spanId": "b4e78cb0a06a6fe2",
"name": "search_flights",
"kind": "INTERNAL",
"scope": {
"name": "@arizeai/openinference-instrumentation-openai-agents",
"version": "0.2.2"
},
"attributes": {
"openinference.span.kind": "TOOL",
"tool.name": "search_flights",
"input.value": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}",
"output.value": "{\"origin\": \"SEA\", \"destination\": \"NYC\", \"flights\": [ ... ]}",
"session.id": "sea-nyc-trip-2-turns"
},
"status": {
"code": "OK"
}
}
- Inference span
-
El openinference.span.kind atributo (LLM) lo identifica como un intervalo de inferencia. Los llm.input_messages.* atributos contienen la solicitud del sistema y la solicitud del usuario, los llm.output_messages.* atributos contienen la respuesta del agente y los llm.tools.*.tool.json_schema atributos contienen las definiciones de la herramienta. AgentCore Las evaluaciones reconstruyen la solicitud del usuario y la respuesta del agente a partir de este intervalo y rellenan el intervalo vacío de invoke agent (). AGENT
{
"traceId": "6a6bc695459e41aa14a172bb41d3246d",
"spanId": "1221a062c7f90a8e",
"name": "response",
"kind": "INTERNAL",
"scope": {
"name": "@arizeai/openinference-instrumentation-openai-agents",
"version": "0.2.2"
},
"attributes": {
"openinference.span.kind": "LLM",
"llm.model_name": "gpt-4o-mini-2024-07-18",
"llm.input_messages.0.message.role": "system",
"llm.input_messages.0.message.content": "You are a travel planning assistant ...",
"llm.input_messages.1.message.role": "user",
"llm.input_messages.1.message.content": "Hey, how can you help me",
"llm.output_messages.0.message.role": "assistant",
"llm.output_messages.0.message.contents.0.message_content.text": "I can assist you with travel planning by ...",
"llm.tools.0.tool.json_schema": "{\"type\": \"function\", \"function\": {\"name\": \"search_flights\", ...}}",
"session.id": "sea-nyc-trip-2-turns"
},
"status": {
"code": "OK"
}
}