Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Agents OpenAI
Cette page explique comment instrumenter un agent OpenAI Agents, comment les intervalles sont identifiés et comment les champs d'évaluation sont extraits. AgentCore Evaluations prend en charge les agents OpenAI intégrés en Python et TypeScript ; cette page couvre chaque langage séparément, en ce qui concerne la prise en charge des agents Python et la prise en charge des TypeScript agents.
Rubriques
Support pour les agents Python
Un agent Python OpenAI Agents émet des spans sous le nom de scope opentelemetry.instrumentation.openai_agents (OpenTelemetry) ou openinference.instrumentation.openai_agents (). OpenInference
Instrumentez votre agent
Vous pouvez instrumenter un agent OpenAI Agents avec l'une des deux bibliothèques d'instrumentation suivantes : OpenTelemetry (opentelemetry-instrumentation-openai-agents) ou OpenInference (openinference-instrumentation-openai-agents). Amazon Bedrock AgentCore Evaluations prend en charge les deux bibliothèques. Les bibliothèques émettent des noms de portée différents et utilisent différents attributs d'étendue. Le service d'évaluation extrait les mêmes valeurs de chacune d'entre elles.
Lorsque votre agent fonctionne avec le AWS Distro for OpenTelemetry (ADOT), par exemple sur Amazon Bedrock AgentCore Runtime, vous n'avez pas besoin d'ajouter de code d'instrumentation explicite. Il suffit d'ajouter la bibliothèque d'instrumentation aux dépendances de votre projet. ADOT le découvre au démarrage et l'active automatiquement.
Ajoutez la bibliothèque d'instrumentation correspondant au chemin que vous souhaitez utiliser pour accéder à vos dépendances. Utilisez la dernière version disponible, sauf si vous avez une raison d'épingler.
Exemple
- OpenTelemetry
-
REMARQUE : utilisez la version 0.61.0 ou une version ultérieure. Il s'agit de la première version testée avec le service d'évaluation.
Ajoutez opentelemetry-instrumentation-openai-agents à vos dépendances. Le nom du scope émis estopentelemetry.instrumentation.openai_agents.
requirements.txt:
opentelemetry-instrumentation-openai-agents>=0.61.0
pyproject.toml:
[project]
dependencies = [
"opentelemetry-instrumentation-openai-agents>=0.61.0",
]
- OpenInference
-
REMARQUE : utilisez la version 1.5.0 ou une version ultérieure. Il s'agit de la première version testée avec le service d'évaluation.
Ajoutez openinference-instrumentation-openai-agents à vos dépendances. Le nom du scope émis estopeninference.instrumentation.openai_agents.
requirements.txt:
openinference-instrumentation-openai-agents>=1.5.0
pyproject.toml:
[project]
dependencies = [
"openinference-instrumentation-openai-agents>=1.5.0",
]
L'instrumentation constitue une étape dans la mise en place de l'observabilité. Pour exporter la télémétrie à des fins d'évaluation, effectuez la configuration complète dans Configurer l'observabilité.
Comment les travées sont identifiées
L'attribut utilisé pour classer les spans diffère entre les deux bibliothèques d'instruments.
Exemple
- OpenTelemetry
-
La bibliothèque OpenTelemetry d'instrumentation classe les spans à l'aide de cet attribut. gen_ai.operation.name
| Type d'envergure |
Attribut d'identification |
|
Invoquer un agent
|
gen_ai.operation.name = invoke_agent
|
|
Outil d'exécution
|
gen_ai.operation.name = execute_tool
|
|
Inférence
|
gen_ai.operation.name = chat
|
Les agents OpenAI émettent également des intervalles de rotation internes avec =. gen_ai.operation.name unknown Le service d'évaluation les ignore.
- OpenInference
-
La bibliothèque OpenInference d'instrumentation classe les spans à l'aide de cet attribut. openinference.span.kind
| Type d'envergure |
Attribut d'identification |
|
Invoquer un agent
|
openinference.span.kind= AGENT ou CHAIN
|
|
Outil d'exécution
|
openinference.span.kind = TOOL
|
|
Inférence
|
openinference.span.kind = LLM
|
Dans le cas de la OpenInference bibliothèque, les AGENT CHAIN travées et sont des conteneurs structurels vides : elles ne contiennent aucun contenu de conversation. L'invite de l'utilisateur et la réponse de l'agent sont reconstruites à partir des intervalles d'inférence (LLM) de la même trace.
OpenAI Agents sérialise les messages dans un format basé sur des parties, dans lequel chaque message contient un parts tableau de blocs de contenu typés (par exemple,). [{"role": "user", "parts": [{"type": "text", "content": "…"}]}] Avec la OpenTelemetry bibliothèque, AgentCore Evaluations analyse le texte de ces parties. Avec la OpenInference bibliothèque, la sortie du modèle est l'objet OpenAI Response complet, et AgentCore Evaluations lit le texte de la réponse à partir de output[].content[].text celui-ci.
L'emplacement de ce contenu dépend de la manière dont la télémétrie a été collectée. L'attribut d'identification (gen_ai.operation.nameouopeninference.span.kind) se trouve sur la plage dans les deux cas. Pour plus d'informations, consultez la section Configuration et diffusion de la télémétrie.
Grâce à la télémétrie fractionnée, AgentCore Evaluations lit le contenu des conversations à partir de l'enregistrement de l'événement en corrélation avec chaque période. L'emplacement des entrées et des sorties des outils diffère entre les deux bibliothèques :
-
OpenTelemetry:
-
Invite de l'utilisateur et réponse de l'agent : à partir de l'enregistrement des événements du span d'invocation de l'agent, dans body.input etbody.output.
-
Appel à l'outil : nom de l'outil provenant degen_ai.tool.name, arguments et résultats provenant de gen_ai.tool.call.arguments et gen_ai.tool.call.result sur la plage d'outils d'exécution. Avec la OpenTelemetry bibliothèque, les arguments et les résultats de l'outil restent sur les attributs de span, même en cas de télémétrie fractionnée.
-
OpenInference:
-
Invite de l'utilisateur et réponse de l'agent : reconstruites à partir de l'enregistrement des événements de la période d'inférence. AgentCore Evaluations lit les messages depuis body.input etbody.output, puis remplit l'espace vide d'invocation de l'agent avec l'invite de l'utilisateur et la réponse de l'agent.
-
Appel d'outil : nom de l'outil figurant tool.name sur la plage d'outils d'exécution. Les arguments et le résultat de l'outil proviennent de l'enregistrement d'événements de cette plage, dans body.input etbody.output.
Pour plus d'informations, voir Exemples de plages dans la télémétrie fractionnée.
Grâce à la télémétrie unifiée, le même contenu reste sur la plage en tant qu'attributs. Les attributs dépendent de la bibliothèque d'instruments :
-
OpenTelemetry:
-
Invite utilisateur et réponse de l'agent : depuis gen_ai.input.messages et vers gen_ai.output.messages le span d'invocation de l'agent.
-
Appel d'outil : nom de l'outil provenant degen_ai.tool.name, arguments et résultats provenant de gen_ai.tool.call.arguments etgen_ai.tool.call.result, sur la plage d'outils d'exécution.
-
OpenInference:
-
Invite de l'utilisateur et réponse de l'agent : à partir des attributs de message indexés sur la plage d'inférence (llm.input_messages.*etllm.output_messages.*), puis remplis sur la plage vide d'invocation de l'agent.
-
Appel d'outil : nom de l'outil provenant detool.name, arguments et résultats provenant de input.value etoutput.value, sur la plage d'outils d'exécution.
Pour plus d'informations, consultez la section Exemples de plages de télémétrie unifiée.
Exemples de plages dans la télémétrie fractionnée
Avec la télémétrie fractionnée, la plage contient les attributs d'identification et le contenu est enregistré dans un enregistrement d'événements corrélé. Les exemples suivants proviennent d'un agent de planification de voyages Python OpenAI Agents déployé sur Amazon Bedrock Runtime. AgentCore Le même agent est affiché dans chaque bibliothèque d'instruments.
Ces exemples ne constituent pas des séries complètes. Ils présentent des données représentatives provenant d'une interaction réelle entre agents, certains champs étant omis et les valeurs longues tronquées pour des raisons de lisibilité.
OpenTelemetry
Exemple
- Invoke agent span
-
L'gen_ai.operation.nameattribut (invoke_agent) l'identifie comme une étendue d'agent d'invocation.
{
"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"
}
}
L'enregistrement d'événements corrélé contient la conversation. Chaque message content est le tableau de formats de parties OpenAI ; l'invite utilisateur est le texte du message utilisateur et la réponse de l'agent est le texte du message de l'assistant.
{
"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
-
L'gen_ai.operation.nameattribut (execute_tool) l'identifie comme une étendue d'outil d'exécution ; gen_ai.tool.name contient le nom de l'outil. Avec la OpenTelemetry bibliothèque, les arguments de l'outil et le résultat restent sur les attributs span, même en cas de télémétrie fractionnée.
{
"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
-
L'gen_ai.operation.nameattribut (chat) l'identifie comme une étendue d'inférence. Cette plage contient les métadonnées du modèle et, dansgen_ai.tool.definitions, la liste des outils disponibles pour l'agent. Les messages de conversation relatifs à l'appel modèle sont enregistrés en direct dans l'enregistrement d'événements corrélé, dans body.input etbody.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
Avec la OpenInference bibliothèque, le span invoke agent (AGENT) est un conteneur vide. AgentCore Evaluations reconstruit l'invite de l'utilisateur et la réponse de l'agent à partir de la plage d'inférence (LLM), dont le contenu se trouve dans un enregistrement d'événements corrélé.
Exemple
- Invoke agent span
-
L'openinference.span.kindattribut (AGENT) l'identifie comme une étendue d'agent d'invocation. Le span ne contient aucun contenu de conversation.
{
"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
-
L'openinference.span.kindattribut (TOOL) l'identifie comme une étendue d'outil d'exécution ; tool.name contient le nom de l'outil. Les arguments et le résultat de l'outil sont enregistrés dans l'enregistrement d'événement corrélé.
{
"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
-
L'openinference.span.kindattribut (LLM) l'identifie comme une étendue d'inférence. Les rôles des messages et les définitions des outils se trouvent dans les attributs span ; le contenu du message se trouve dans l'enregistrement d'événements corrélé. ADOT aplanit les rôles de saisie àuser, de sorte que AgentCore Evaluations utilise le dernier message d'entrée en texte brut comme invite de l'utilisateur. Le message de sortie est l'objet OpenAI Response, à partir duquel AgentCore Evaluations lit le texte de la réponse.
{
"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 ...\"}]}]}"
}
]
}
}
}
Exemples de plages en télémétrie unifiée
Grâce à la télémétrie unifiée, le même contenu reste sur les attributs de la plage et aucun enregistrement d'événement distinct n'est produit. Les exemples suivants proviennent d'un agent de planification de voyages Python OpenAI Agents. Le même agent est affiché dans chaque bibliothèque d'instruments.
Ces exemples ne constituent pas des séries complètes. Ils présentent des données représentatives provenant d'une interaction réelle entre agents, certains champs étant omis et les valeurs longues tronquées pour des raisons de lisibilité.
OpenTelemetry
Exemple
- Invoke agent span
-
L'gen_ai.input.messagesattribut contient l'invite de l'utilisateur et la gen_ai.output.messages réponse de l'agent. Les deux sont des tableaux au format de pièces 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
-
L'gen_ai.tool.call.argumentsattribut contient les arguments de l'outil et l'gen_ai.tool.call.resultattribut contient le résultat de l'outil.
{
"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
-
L'gen_ai.operation.nameattribut (chat) l'identifie comme une étendue d'inférence. Les métadonnées du modèle et l'gen_ai.tool.definitionsattribut (la liste des outils disponibles pour l'agent) restent en ligne sur la plage.
{
"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
Exemple
- Execute tool span
-
L'input.valueattribut contient les arguments de l'outil et l'output.valueattribut contient le résultat de l'outil.
{
"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
-
Le contenu du message est intégré aux attributs indexés. Les llm.input_messages.* attributs contiennent l'invite du système et l'invite de l'utilisateur, et les llm.output_messages.* attributs contiennent la réponse de l'agent. AgentCore Evaluations reconstruit l'invite de l'utilisateur et la réponse de l'agent à partir de cette plage et remplit la section vide d'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 assistance aux agents
Un agent TypeScript OpenAI Agents émet les mêmes types de span, les mêmes attributs d'identification et la même présentation de contenu qu'un agent Python, de sorte que le service d'évaluation le lit de la même manière. Il existe deux bibliothèques TypeScript d'instruments, chacune ayant son propre nom de domaine d'application.
Instrumentez votre agent
Ajoutez la bibliothèque d'instrumentation de la convention que vous souhaitez à vos TypeScript dépendances. Utilisez la dernière version disponible, sauf si vous avez une raison d'épingler.
Exemple
- ADOT (OpenTelemetry)
-
Pour les TypeScript agents sur ADOT, ajoutez le package d'instrumentation automatique AWS Distro Node (@aws/aws-distro-opentelemetry-node-autoinstrumentation) à vos dépendances. Il inclut l'instrumentation OpenAI Agents intégrée, qui s'active au démarrage et émet le nom du scope. @aws/aws-distro-opentelemetry-instrumentation-openai-agents
package.json:
{
"dependencies": {
"@aws/aws-distro-opentelemetry-node-autoinstrumentation": "^0.12.0"
}
}
- OpenInference
-
Ajoutez @arizeai/openinference-instrumentation-openai-agents à vos dépendances. Le nom du scope émis est@arizeai/openinference-instrumentation-openai-agents.
package.json:
{
"dependencies": {
"@arizeai/openinference-instrumentation-openai-agents": "^0.2.2"
}
}
L'instrumentation constitue une étape dans la mise en place de l'observabilité. Pour exporter la télémétrie à des fins d'évaluation, effectuez la configuration complète dans Configurer l'observabilité.
Comment les travées sont identifiées
L'identification du span est la même que pour un agent Python. La ADOT-native OpenTelemetry bibliothèque (issue du package d'auto-instrumentation AWS Distro Node@aws/aws-distro-opentelemetry-node-autoinstrumentation, émettant le nom du scope@aws/aws-distro-opentelemetry-instrumentation-openai-agents) est gen_ai.operation.name définie et la bibliothèque OpenInference JS (@arizeai/openinference-instrumentation-openai-agents) définit. openinference.span.kind Pour les valeurs, voir Comment les spans sont identifiées dans le cadre de la prise en charge des agents Python.
L'extraction de champs lit les mêmes attributs que pour un agent Python. Notez qu'avec la ADOT-native TypeScript bibliothèque, le span d'invocation de l'agent est un conteneur structurel : l'invite de l'utilisateur et la réponse de l'agent sont reconstruites à partir de la plage d'inférence (chat) plutôt que de l'étendue de l'agent d'appel, contrairement à la OpenTelemetry bibliothèque Python, qui les conserve sur la plage d'appel de l'agent. Pour savoir d'où chaque champ est lu, consultez Comment les champs d'évaluation sont extraits dans le cadre du support des agents Python.
Exemples de spans provenant d'un agent TypeScript
Les exemples suivants proviennent d'un agent de planification de voyages TypeScript OpenAI Agents déployé sur Amazon Bedrock AgentCore Runtime avec télémétrie unifiée. Le même agent est affiché dans chaque bibliothèque d'instruments.
Ces exemples ne constituent pas des séries complètes. Ils présentent des données représentatives provenant d'une interaction réelle entre agents, certains champs étant omis et les valeurs longues tronquées pour des raisons de lisibilité.
OpenTelemetry
Avec la ADOT-native bibliothèque (issue du package d'auto-instrumentation AWS Distro Node@aws/aws-distro-opentelemetry-node-autoinstrumentation, émettant le nom du scope@aws/aws-distro-opentelemetry-instrumentation-openai-agents), le span de l'agent d'invocation est un conteneur structurel et le contenu de la conversation se trouve sur le span inference (chat), dans le format des parties et les attributs. gen_ai.input.messages gen_ai.output.messages AgentCore Evaluations reconstruit l'invite de l'utilisateur et la réponse de l'agent à partir de la plage d'inférence.
Exemple
- Invoke agent span
-
L'gen_ai.operation.nameattribut (invoke_agent) l'identifie comme une étendue d'agent d'invocation. Le span contient le nom de l'agent et la liste des outils, mais aucun contenu de conversation.
{
"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
-
L'gen_ai.operation.nameattribut (execute_tool) l'identifie comme une étendue d'outil d'exécution ; gen_ai.tool.name contient le nom de l'outil. Les gen_ai.tool.call.result attributs gen_ai.tool.call.arguments et contiennent les arguments et le résultat de l'outil.
{
"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
-
L'gen_ai.operation.nameattribut (chat) l'identifie comme une étendue d'inférence. Les gen_ai.output.messages attributs gen_ai.input.messages et contiennent la conversation au format parties, contiennent l'invite du gen_ai.system_instructions système et gen_ai.tool.definitions répertorient les outils mis à la disposition de l'agent.
{
"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
Avec la bibliothèque OpenInference JS, les spans invoke agent (AGENT) et turn (CHAIN) sont des conteneurs vides. AgentCore Evaluations reconstruit l'invite de l'utilisateur et la réponse de l'agent à partir du span inference (LLM), dont les messages figurent sur les attributs et indexésllm.input_messages.*. llm.output_messages.*
Exemple
- Invoke agent span
-
L'openinference.span.kindattribut (AGENT) l'identifie comme une étendue d'agent d'invocation. Le span ne contient aucun contenu de conversation.
{
"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
-
L'openinference.span.kindattribut (TOOL) l'identifie comme une étendue d'outil d'exécution ; tool.name contient le nom de l'outil. Les output.value attributs input.value et contiennent les arguments et le résultat de l'outil.
{
"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
-
L'openinference.span.kindattribut (LLM) l'identifie comme une étendue d'inférence. Les llm.input_messages.* attributs contiennent l'invite du système et l'invite de l'utilisateur, llm.output_messages.* les attributs contiennent la réponse de l'agent et les llm.tools.*.tool.json_schema attributs contiennent les définitions des outils. AgentCore Evaluations reconstruit l'invite de l'utilisateur et la réponse de l'agent à partir de cette plage et remplit la section vide d'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"
}
}