

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# OpenAI 代理
<a name="supported-frameworks-openai-agents"></a>

本页介绍如何检测 [ OpenAI Agents ](https://openai.github.io/openai-agents-python/) 代理、如何识别跨度以及如何提取评估字段。 AgentCore 评估支持在 Python 中内置的 OpenAI 代理 TypeScript；本页分别介绍了 [ Python 代理支持](#openai-agents-python)和[TypeScript 代理支持](#openai-agents-typescript)方面的每种语言。

 **主题** 
+  [Python 代理支持 ](#openai-agents-python) 
  +  [为您的代理人提供仪器 ](#openai-agents-instrument) 
  +  [如何识别跨度 ](#openai-agents-span-identification) 
  +  [如何提取评估字段 ](#openai-agents-extraction) 
    +  [来自事件记录 ](#openai-agents-extraction-event-records) 
    +  [来自跨度属性 ](#openai-agents-extraction-attributes) 
  +  [分体遥测中的跨度示例 ](#openai-agents-examples-split) 
  +  [统一遥测中的示例跨度 ](#openai-agents-examples-unified) 
+  [TypeScript 代理支持 ](#openai-agents-typescript) 
  +  [为您的代理人提供仪器 ](#openai-agents-typescript-instrument) 
  +  [如何识别跨度 ](#openai-agents-typescript-span-identification) 
  +  [如何提取评估字段 ](#openai-agents-typescript-extraction) 
  +  [来自代理的示例跨度 TypeScript ](#openai-agents-examples-typescript) 

## Python 代理支持
<a name="openai-agents-python"></a>

Python OpenAI 代理在作用域名称 `opentelemetry.instrumentation.openai_agents` (OpenTelemetry) 或 `openinference.instrumentation.openai_agents` () 下发出跨度。OpenInference

### 为您的代理人提供仪器
<a name="openai-agents-instrument"></a>

您可以使用两个工具库之一来检测 OpenAI 代理代理：**OpenTelemetry**(`opentelemetry-instrumentation-openai-agents`) 或 ** OpenInference ** (`openinference-instrumentation-openai-agents`)。亚马逊基岩 AgentCore 评估支持这两个库。这些库发出不同的范围名称并使用不同的跨度属性。评估服务从每种方法中提取相同的值。

当您的代理使用 Amazon 发行版 OpenTelemetry (ADOT) 运行时，例如在 Amazon Bedrock AgentCore Runtime 上，您无需添加显式的检测代码。将仪器库添加到项目的依赖项中就足够了。ADOT 在启动时发现它并自动将其激活。

为你想要的依赖项路径添加工具库。除非你有理由固定，否则请使用最新的可用版本。

**Example**  
注意：使用版本`0.61.0`或更高版本。这是使用评估服务测试的最早版本。  
将 `opentelemetry-instrumentation-openai-agents` 添加到依赖项。发出的范围名称是。`opentelemetry.instrumentation.openai_agents`  
 `requirements.txt`:  

```
opentelemetry-instrumentation-openai-agents>=0.61.0
```
 `pyproject.toml`:  

```
[project]
dependencies = [
    "opentelemetry-instrumentation-openai-agents>=0.61.0",
]
```
注意：使用版本`1.5.0`或更高版本。这是使用评估服务测试的最早版本。  
将 `openinference-instrumentation-openai-agents` 添加到依赖项。发出的范围名称是。`openinference.instrumentation.openai_agents`  
 `requirements.txt`:  

```
openinference-instrumentation-openai-agents>=1.5.0
```
 `pyproject.toml`:  

```
[project]
dependencies = [
    "openinference-instrumentation-openai-agents>=1.5.0",
]
```

**注意**  
仪器仪表是设置可观测性的一个步骤。要导出遥测数据进行评估，请在设置可观[测性中](supported-frameworks-telemetry.md#supported-frameworks-setup)完成完整设置。

### 如何识别跨度
<a name="openai-agents-span-identification"></a>

两个仪器库中用于对跨度进行分类的属性有所不同。

**Example**  
 OpenTelemetry 仪器库使用该属性对跨度进行分类。`gen_ai.operation.name`  


| 跨度类型 | 识别属性 | 
| --- | --- | 
| 调用代理 |  `gen_ai.operation.name` = `invoke_agent`  | 
| 执行工具 |  `gen_ai.operation.name` = `execute_tool`  | 
| 推理 |  `gen_ai.operation.name` = `chat`  | 
OpenAI 代理还使用 = 发出内部转向边界跨度。`gen_ai.operation.name` `unknown`评估服务会跳过这些。
 OpenInference 仪器库使用该属性对跨度进行分类。`openinference.span.kind`  


| 跨度类型 | 识别属性 | 
| --- | --- | 
| 调用代理 |  `openinference.span.kind`= `AGENT` 或 `CHAIN`  | 
| 执行工具 |  `openinference.span.kind` = `TOOL`  | 
| 推理 |  `openinference.span.kind` = `LLM`  | 
在 OpenInference 库中，`AGENT`和`CHAIN`跨度是空的结构容器：它们不携带对话内容。用户提示和代理响应是根据同一跟踪中的推断 (`LLM`) 跨度重建的。

### 如何提取评估字段
<a name="openai-agents-extraction"></a>

OpenAI Agents 以基于部件的格式序列化消息，其中每条消息都携带一`parts`组键入的内容块（例如，）。`[{"role": "user", "parts": [{"type": "text", "content": "…​"}]}]`使用该 OpenTelemetry 库，“ AgentCore 评估” 可以解析出这些部分的文本。使用该 OpenInference 库，模型输出是完整的 OpenAI 响应对象， AgentCore 评估从中`output[].content[].text`读取响应文本。

此内容的位置取决于遥测数据的收集方式。在这两种情况下，识别属性（`gen_ai.operation.name`或`openinference.span.kind`）都处于跨度内。有关更多信息，请参阅[遥测设置和交付](supported-frameworks-telemetry.md)。

#### 来自事件记录
<a name="openai-agents-extraction-event-records"></a>

通过拆分遥测， AgentCore 评估从与每个跨度相关的事件记录中读取对话内容。工具输入和输出的位置在两个库之间有所不同：
+  **OpenTelemetry**:
  +  **用户提示**和**代理响应**：来自调用代理范围的事件记录，在`body.input`和中`body.output`。
  +  **工具调用**：来自的工具名称`gen_ai.tool.name`，以及执行工具跨度中的参数`gen_ai.tool.call.arguments`和`gen_ai.tool.call.result`结果。在 OpenTelemetry 库中，即使使用分割遥测，工具参数和结果仍保留在 span 属性上。
+  **OpenInference**:
  +  **用户提示**和**代理响应**：根据推理跨度的事件记录重建。 AgentCore 评估从`body.input`和读取消息`body.output`，然后使用用户提示和代理响应回填空的调用代理跨度。
  +  **工具调用**：执行工具跨`tool.name`度中的工具名称。工具参数和结果来自该跨度的事件记录，以`body.input`和为单位`body.output`。

有关更多信息，请参见分割遥测[中的跨度](#openai-agents-examples-split)示例。

#### 来自跨度属性
<a name="openai-agents-extraction-attributes"></a>

使用统一的遥测技术，相同的内容将作为属性保留在跨度上。这些属性取决于仪器库：
+  **OpenTelemetry**:
  +  **用户提示**和**代理响应**：从`gen_ai.input.messages`调用代理跨度开始。`gen_ai.output.messages`
  +  **工具调用**：执行工具跨度上的工具名称`gen_ai.tool.call.arguments`以及来自和`gen_ai.tool.call.result`的参数和结果。`gen_ai.tool.name`
+  **OpenInference**:
  +  **用户提示**和**代理响应**：从推理跨度（`llm.input_messages.*`和`llm.output_messages.*`）的索引消息属性中回填到空的调用代理跨度中。
  +  **工具调用**：执行工具跨度上的工具名称`input.value`以及来自和`output.value`的参数和结果。`tool.name`

有关更多信息，请参阅统一遥测[中的跨度](#openai-agents-examples-unified)示例。

### 分体遥测中的跨度示例
<a name="openai-agents-examples-split"></a>

使用分离式遥测，跨度携带识别属性，内容存在于相关的事件记录中。以下示例来自部署在亚马逊 Bedrock Runtime 上的 Python OpenAI 代理旅行计划代理。 AgentCore 每个仪器库下方显示相同的代理。

**注意**  
这些例子并不完整。它们显示来自真实代理交互的代表性数据，为了便于阅读，省略了一些字段并截断了长值。

#### OpenTelemetry
<a name="openai-agents-examples-split-otel"></a>

**Example**  
`gen_ai.operation.name`属性 (`invoke_agent`) 将其标识为调用代理跨度。  

```
{
  "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"
  }
}
```
相关的事件记录承载着对话。每条消息都`content`是 OpenAI 零件格式的数组；用户提示是用户消息的文本，代理响应是助手消息的文本。  

```
{
  "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 ...\"}]}]"
        }
      ]
    }
  }
}
```
`gen_ai.operation.name`属性 (`execute_tool`) 将其标识为执行工具跨度；`gen_ai.tool.name`包含工具名称。使用该 OpenTelemetry 库，即使使用分割遥测，工具参数和结果也会保留在 span 属性上。  

```
{
  "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"
  }
}
```
`gen_ai.operation.name`属性 (`chat`) 将其标识为推理跨度。该跨度包含模型元数据以及可供代理使用的工具列表。`gen_ai.tool.definitions`模型的对话消息在相关事件记录中实时调用，位于`body.input`和`body.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
<a name="openai-agents-examples-split-openinference"></a>

在 OpenInference 库中，调用代理 (`AGENT`) 跨度是一个空容器。 AgentCore 评估从 inference (`LLM`) 跨度重构用户提示和代理响应，其内容存在于相关的事件记录中。

**Example**  
`openinference.span.kind`属性 (`AGENT`) 将其标识为调用代理跨度。该时间段不包含对话内容。  

```
{
  "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"
  }
}
```
`openinference.span.kind`属性 (`TOOL`) 将其标识为执行工具跨度；`tool.name`包含工具名称。工具参数和结果存在于相关的事件记录中。  

```
{
  "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\": [ ... ]}" }
      ]
    }
  }
}
```
`openinference.span.kind`属性 (`LLM`) 将其标识为推理跨度。消息角色和工具定义在跨度属性上；消息内容存在于相关的事件记录中。ADOT 将输入角色扁平化为`user`，因此 AgentCore 评估使用最后一条纯文本输入消息作为用户提示。输出消息是 OpenAI 响应对象， AgentCore 评估从中读取响应文本。  

```
{
  "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 ...\"}]}]}"
        }
      ]
    }
  }
}
```

### 统一遥测中的示例跨度
<a name="openai-agents-examples-unified"></a>

使用统一的遥测技术，跨度属性上的内容相同，不会生成单独的事件记录。以下示例来自 Python OpenAI 代理的旅行计划代理。每个仪器库下方显示相同的代理。

**注意**  
这些例子并不完整。它们显示来自真实代理交互的代表性数据，为了便于阅读，省略了一些字段并截断了长值。

#### OpenTelemetry
<a name="openai-agents-examples-unified-otel"></a>

**Example**  
该`gen_ai.input.messages`属性保存用户提示，该`gen_ai.output.messages`属性保存代理响应。两者都是 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"
  }
}
```
该`gen_ai.tool.call.arguments`属性保存工具参数，该`gen_ai.tool.call.result`属性保存工具结果。  

```
{
  "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"
  }
}
```
`gen_ai.operation.name`属性 (`chat`) 将其标识为推理跨度。模型元数据和`gen_ai.tool.definitions`属性（代理可用的工具列表）在跨度上保持内联状态。  

```
{
  "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
<a name="openai-agents-examples-unified-openinference"></a>

**Example**  
该`input.value`属性保存工具参数，该`output.value`属性保存工具结果。  

```
{
  "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"
  }
}
```
消息内容内嵌在索引属性上。`llm.input_messages.*`属性保存系统提示和用户提示，`llm.output_messages.*`属性保存代理响应。 AgentCore 评估会重构该跨度的用户提示和代理响应，并回填空的 invoke 代理 () `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 代理支持
<a name="openai-agents-typescript"></a>

 TypeScript OpenAI 代理发出的跨度类型、标识属性和内容布局与 Python 代理相同，因此评估服务以相同的方式读取它。有两个 TypeScript 仪器库，每个都有自己的作用域名称。

### 为您的代理人提供仪器
<a name="openai-agents-typescript-instrument"></a>

将你想要的惯例的仪器库添加到你的 TypeScript 依赖项中。除非你有理由固定，否则请使用最新的可用版本。

**Example**  
对于 ADOT 上的 TypeScript 代理，将 Amazon 发行版节点自动仪表包 (`@aws/aws-distro-opentelemetry-node-autoinstrumentation`) 添加到您的依赖项中。它包括内置的 OpenAI 代理工具，该工具在启动时激活并发出范围名称。`@aws/aws-distro-opentelemetry-instrumentation-openai-agents`  
 `package.json`:  

```
{
  "dependencies": {
    "@aws/aws-distro-opentelemetry-node-autoinstrumentation": "^0.12.0"
  }
}
```
将 `@arizeai/openinference-instrumentation-openai-agents` 添加到依赖项。发出的范围名称是。`@arizeai/openinference-instrumentation-openai-agents`  
 `package.json`:  

```
{
  "dependencies": {
    "@arizeai/openinference-instrumentation-openai-agents": "^0.2.2"
  }
}
```

**注意**  
仪器仪表是设置可观测性的一个步骤。要导出遥测数据进行评估，请在设置可观[测性中](supported-frameworks-telemetry.md#supported-frameworks-setup)完成完整设置。

### 如何识别跨度
<a name="openai-agents-typescript-span-identification"></a>

跨度识别与 Python 代理相同。 ADOT-native OpenTelemetry 库（来自 Amazon 发行版节点自动仪表包`@aws/aws-distro-opentelemetry-node-autoinstrumentation`，发出范围名称`@aws/aws-distro-opentelemetry-instrumentation-openai-agents`）集合和 OpenInference JS 库 (`@arizeai/openinference-instrumentation-openai-agents`) 集`gen_ai.operation.name`。`openinference.span.kind`有关这些值，请参阅 [ Python 代理支持[如何识别跨度](#openai-agents-span-identification)下的](#openai-agents-python)如何识别跨度。

### 如何提取评估字段
<a name="openai-agents-typescript-extraction"></a>

字段提取读取的属性与 Python 代理的属性相同。请注意，在 ADOT-native TypeScript 库中，调用代理跨度是一个结构容器：用户提示符和代理响应是从 inference (`chat`) 跨度而不是调用代理跨度重建的，这与 Python 库不同，Python OpenTelemetry 库将它们保持在调用代理跨度上。有关每个字段的读取来源，请参阅 [ Python 代理支持[下](#openai-agents-extraction)如何提取评估字段](#openai-agents-python)。

### 来自代理的示例跨度 TypeScript
<a name="openai-agents-examples-typescript"></a>

以下示例来自部署在具有统一遥测功能的亚马逊 Bedrock AgentCore Runtime 上的 TypeScript OpenAI 代理旅行计划代理。每个仪器库下方显示相同的代理。

**注意**  
这些例子并不完整。它们显示来自真实代理交互的代表性数据，为了便于阅读，省略了一些字段并截断了长值。

#### OpenTelemetry
<a name="openai-agents-examples-typescript-otel"></a>

使用 ADOT-native 库（来自 Amazon Distro Node autoInstrumentation 软件包`@aws/aws-distro-opentelemetry-node-autoinstrumentation`，发出范围名称`@aws/aws-distro-opentelemetry-instrumentation-openai-agents`），调用代理跨度是一个结构容器，对话内容以零件格式和属性存在于推断 (`chat`) 跨度上。`gen_ai.input.messages` `gen_ai.output.messages` AgentCore 评估从推理跨度重构用户提示和代理响应。

**Example**  
`gen_ai.operation.name`属性 (`invoke_agent`) 将其标识为调用代理跨度。该跨度包含代理名称和工具列表，但没有对话内容。  

```
{
  "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"
  }
}
```
`gen_ai.operation.name`属性 (`execute_tool`) 将其标识为执行工具跨度；`gen_ai.tool.name`包含工具名称。`gen_ai.tool.call.arguments`和`gen_ai.tool.call.result`属性用于保存工具参数和结果。  

```
{
  "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"
  }
}
```
`gen_ai.operation.name`属性 (`chat`) 将其标识为推理跨度。`gen_ai.input.messages`和`gen_ai.output.messages`属性以部件格式保存对话，`gen_ai.system_instructions`保存系统提示，并`gen_ai.tool.definitions`列出可供代理使用的工具。  

```
{
  "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
<a name="openai-agents-examples-typescript-openinference"></a>

在 OpenInference JS 库中，调用代理 (`AGENT`) 和 turn (`CHAIN`) 跨度是空容器。 AgentCore 评估从 inference (`LLM`) 跨度重构用户提示和代理响应，其消息位于索引`llm.input_messages.*`和属性上。`llm.output_messages.*`

**Example**  
`openinference.span.kind`属性 (`AGENT`) 将其标识为调用代理跨度。该时间段不包含对话内容。  

```
{
  "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"
  }
}
```
`openinference.span.kind`属性 (`TOOL`) 将其标识为执行工具跨度；`tool.name`包含工具名称。`input.value`和`output.value`属性用于保存工具参数和结果。  

```
{
  "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"
  }
}
```
`openinference.span.kind`属性 (`LLM`) 将其标识为推理跨度。`llm.input_messages.*`属性保存系统提示和用户提示，`llm.output_messages.*`属性保存代理响应，`llm.tools.*.tool.json_schema`属性保存工具定义。 AgentCore 评估会重构该跨度的用户提示和代理响应，并回填空的 invoke 代理 () `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"
  }
}
```