

# LlamaIndex
<a name="supported-frameworks-llamaindex"></a>

Auf dieser Seite wird erklärt, wie ein [LlamaIndex](https://docs.llamaindex.ai/)Agent instrumentiert wird, wie Spans identifiziert werden und wie Bewertungsfelder extrahiert werden. Abschließend werden [bewährte Verfahren](#llamaindex-best-practices) zur Strukturierung eines LlamaIndex Agenten beschrieben, sodass er zuverlässig bewertet werden kann.

 **Topics** 
+  [Instrumentieren Sie Ihren Agenten](#llamaindex-instrument) 
+  [Wie werden Spannweiten identifiziert](#llamaindex-span-identification) 
+  [Wie werden Bewertungsfelder extrahiert](#llamaindex-extraction) 
  +  [Aus Ereignisaufzeichnungen](#llamaindex-extraction-event-records) 
  +  [Aus Span-Attributen](#llamaindex-extraction-attributes) 
+  [Beispiel für Spans mit Ereignisdatensätzen](#llamaindex-examples-with) 
+  [Beispiel für Spans ohne Ereignisdatensätze](#llamaindex-examples-without) 
+  [Bewährte Methoden für Agenten LlamaIndex ](#llamaindex-best-practices) 

## Instrumentieren Sie Ihren Agenten
<a name="llamaindex-instrument"></a>

Sie können einen LlamaIndex Agenten mit einer von zwei Instrumentierungsbibliotheken instrumentieren: **OpenTelemetry**(`opentelemetry-instrumentation-llamaindex`) oder **OpenInference**(`openinference-instrumentation-llama-index`). Amazon Bedrock AgentCore Evaluations unterstützt beide Bibliotheken. Die Bibliotheken geben unterschiedliche Bereichsnamen aus und verwenden unterschiedliche Span-Attribute. Der Bewertungsservice extrahiert aus jedem die gleichen Werte.

Wenn Ihr Agent mit AWS Distro for OpenTelemetry (ADOT) ausgeführt wird, z. B. auf Amazon Bedrock AgentCore Runtime, müssen Sie keinen expliziten Instrumentierungscode hinzufügen. Es reicht aus, die Instrumentierungsbibliothek zu den Abhängigkeiten Ihres Projekts hinzuzufügen. ADOT erkennt es beim Start und aktiviert es automatisch.

Fügen Sie die Instrumentierungsbibliothek für den gewünschten Pfad zu Ihren Abhängigkeiten hinzu. Verwenden Sie die neueste verfügbare Version, es sei denn, Sie haben einen Grund zum Pin.

**Example**  
HINWEIS: Verwenden Sie Version `0.61.0` oder höher. Dies ist die früheste Version, die mit dem Evaluierungsservice getestet wurde.  
Fügen `opentelemetry-instrumentation-llamaindex` Sie Ihre Abhängigkeiten hinzu. Der ausgegebene Bereichsname lautet`opentelemetry.instrumentation.llamaindex`.  
 `requirements.txt`:  

```
opentelemetry-instrumentation-llamaindex>=0.61.0
```
 `pyproject.toml`:  

```
[project]
dependencies = [
    "opentelemetry-instrumentation-llamaindex>=0.61.0",
]
```
HINWEIS: Verwenden Sie Version `4.4.1` oder höher. Dies ist die früheste Version, die mit dem Evaluierungsservice getestet wurde.  
Fügen `openinference-instrumentation-llama-index` Sie Ihre Abhängigkeiten hinzu. Der ausgegebene Bereichsname lautet`openinference.instrumentation.llama_index`.  
 `requirements.txt`:  

```
openinference-instrumentation-llama-index>=4.4.1
```
 `pyproject.toml`:  

```
[project]
dependencies = [
    "openinference-instrumentation-llama-index>=4.4.1",
]
```

**Anmerkung**  
Die Instrumentierung ist ein Schritt bei der Einrichtung der Beobachtbarkeit. Um Telemetrie zur Auswertung zu exportieren, schließen Sie die vollständigen Einstellungen unter Beobachtbarkeit [einrichten](supported-frameworks.md#supported-frameworks-setup) ab.

## Wie werden Spannweiten identifiziert
<a name="llamaindex-span-identification"></a>

Das zur Klassifizierung von Spans verwendete Attribut unterscheidet sich zwischen den beiden Instrumentierungsbibliotheken.

**Example**  
Die OpenTelemetry Instrumentierungsbibliothek klassifiziert Spans anhand des Attributs. `traceloop.span.kind` Da sowohl LlamaIndex Inferenz- als auch Werkzeugoperationen als gekennzeichnet werden`task`, unterscheidet AgentCore Evaluations sie anhand des `traceloop.entity.name` Attributs: a, `task` dessen Entitätsname auf „steht“, ist ein Ausführungs-Tool-Span, jeder andere `Tool.task` ist ein Inferenz-Bereich. `task`  


| Typ der Spanne | Identifizierendes Attribut | 
| --- | --- | 
| Agent aufrufen |  `traceloop.span.kind` = `workflow`  | 
| Tool ausführen |  `traceloop.span.kind`=`tool`, oder `traceloop.span.kind` = `task` mit der `traceloop.entity.name` Endung `Tool.task`  | 
| Inferenz |  `traceloop.span.kind`= `task` (keine Werkzeugaufgabe) | 
Die OpenInference Instrumentierungsbibliothek klassifiziert Spannweiten anhand des `openinference.span.kind` Attributs. LlamaIndex gibt „`CHAIN``LLM`,“ und „`TOOL`Spans“ aus; es werden keine Spannen ausgegeben. `AGENT` Der Stamm-Workflow-Bereich (a`CHAIN`) fungiert als Span für den Invoke-Agent.  


| Span-Typ | Identifizierendes Attribut | 
| --- | --- | 
| Agent aufrufen |  `openinference.span.kind`= `CHAIN` (Stamm-Workflow-Bereich) | 
| Tool ausführen |  `openinference.span.kind` = `TOOL`  | 
| Inferenz |  `openinference.span.kind` = `LLM`  | 
LlamaIndex gibt mehrere Zwischenbereiche aus `CHAIN` (z. B. für die Ausgabeanalyse und das Tool-Routing). AgentCore Evaluations behandelt nur den Workflow-Stammbereich als Span des Invoke-Agents und rekonstruiert die Benutzereingabe und die Agentenantwort anhand der Inference () -Bereiche im Trace. `LLM`

## Wie werden Bewertungsfelder extrahiert
<a name="llamaindex-extraction"></a>

Der LlamaIndex Agent ist ein **Workflow**, und sein Bereich auf oberster Ebene wird vor seinem untergeordneten Bereich ausgegeben. Dieser Workflow-Bereich enthält keinen eigenen nutzbaren Konversationsinhalt. Daher rekonstruiert AgentCore Evaluations die Benutzereingabe und die Agentenantwort anhand der untergeordneten Bereiche (Inferenz- und Tool-Spans) und fügt sie der Spanne des Invoke-Agents hinzu.

LlamaIndex serialisiert Inhalte auch als verschachteltes JSON. Werkzeugargumente werden als umschlossen und `{"kwargs": {…​}}` Werkzeugergebnisse werden als umschlossen. `{"blocks": [{"text": "…​"}], …​}` AgentCore Evaluationen entpackt diese Formulare. Wenn ein LlamaIndex ReAct Agent eine Ausgabe im Formular erstellt`Thought: …​ Answer: <response>`, extrahiert AgentCore Evaluations den Text danach `Answer:` als Antwort des Agenten.

Der Speicherort dieser Inhalte hängt davon ab, wie die Telemetriedaten erfasst wurden. Das identifizierende Attribut (`traceloop.span.kind`oder`openinference.span.kind`) befindet sich in beiden Fällen auf der Spanne. Weitere Informationen finden Sie unter [Spans, Ereignisdatensätze und Telemetriesignale](supported-frameworks-telemetry.md).

### Aus Ereignisaufzeichnungen
<a name="llamaindex-extraction-event-records"></a>

Wenn die Telemetrie aufgeteilt wird, liest AgentCore Evaluations Inhalte aus den Ereignisdatensätzen, die den einzelnen Bereichen zugeordnet sind:
+  **Benutzereingabe** und **Antwort des Agenten**: rekonstruiert aus den Ereignisaufzeichnungen der Inferenzspannen, in. `body.output` Bei der OpenTelemetry Bibliothek stammt die Benutzeraufforderung aus dem Inhalt des Chat-Verlaufs und die Antwort des Agenten aus dem Inhalt der Modellergebnisse. Bei der OpenInference Bibliothek ist die Benutzereingabeaufforderung die Klartext-Eingabenachricht und die Antwort des Agenten die Modellausgabe (wobei der Text danach `Answer:` für einen Agenten verwendet wird). ReAct 
+  **Werkzeugaufruf**: Der Werkzeugname aus dem Bereich des Ausführungswerkzeugs. Die Werkzeugargumente und das Ergebnis stammen aus dem Ereignisdatensatz dieser Spanne, in `body.input` (ausgepackt von`{"kwargs": {…​}}`) und `body.output` (ausgepackt von`{"blocks": […​]}`).

Beispiele finden Sie unter [Beispiel für Spans mit](#llamaindex-examples-with) Ereignisdatensätzen.

### Aus Span-Attributen
<a name="llamaindex-extraction-attributes"></a>

Wenn die Telemetrie nicht aufgeteilt wird, verbleibt derselbe Inhalt als Attribute im Bereich. Die Attribute hängen von der Instrumentierungsbibliothek ab:
+  **OpenTelemetry**: Der Inhalt befindet sich in den `traceloop.entity.output` Attributen `traceloop.entity.input` und der einzelnen Bereiche. AgentCore Evaluations wendet denselben Chat-Verlauf, dasselbe Ergebnis und dieselbe Tool-Entschlüsselung auf diese Werte an.
+  **OpenInference**: Der Inhalt der Inferenz bezieht sich auf die indizierten Nachrichtenattribute (und). `llm.input_messages. ` `llm.output_messages.` Die Werkzeugargumente stammen von `input.value` (entpackt von`{"kwargs": {…​}}`) und das Werkzeugergebnis von `output.value` (ausgepackt von). `{"blocks": […​]}`

Beispiele finden Sie unter [Beispiel für Spans ohne](#llamaindex-examples-without) Ereignisdatensätze.

## Beispiel für Zeitspannen mit Ereignisdatensätzen
<a name="llamaindex-examples-with"></a>

Wenn die Telemetrie aufgeteilt wird, enthält die Spanne die identifizierenden Attribute und der Inhalt befindet sich in einem korrelierten Ereignisdatensatz. Die folgenden Beispiele stammen von einem LlamaIndex ReAct Reiseplanungsagenten, der auf Amazon AgentCore Bedrock Runtime eingesetzt wurde. Derselbe Agent wird unter jeder Instrumentierungsbibliothek angezeigt.

**Anmerkung**  
Bei diesen Beispielen handelt es sich nicht um vollständige Datenreihen. Sie zeigen repräsentative Daten aus einer echten Agenteninteraktion, wobei einige Felder weggelassen und lange Werte aus Gründen der Lesbarkeit gekürzt wurden.

### OpenTelemetry
<a name="llamaindex-examples-with-otel"></a>

**Example**  
Das `traceloop.span.kind` Attribut (`workflow`) identifiziert dies als eine Spanne für den Aufruf-Agenten. Der Workflow-Bereich enthält keinen Konversationsinhalt. AgentCore Evaluations rekonstruiert die Benutzereingabe und die Antwort des Agenten anhand der untergeordneten Bereiche.  

```
{
  "traceId": "6a01eef11066751d68f90def0da1f80a",
  "spanId": "ba1833fa7f097041",
  "name": "ReActAgent.workflow",
  "kind": "INTERNAL",
  "scope": {
    "name": "opentelemetry.instrumentation.llamaindex",
    "version": "0.61.0"
  },
  "attributes": {
    "traceloop.span.kind": "workflow",
    "traceloop.entity.name": "ReActAgent.workflow",
    "session.id": "sea-nyc-trip-2-turns-llamaindex-otel"
  },
  "status": {
    "code": "OK"
  }
}
```
Das `traceloop.span.kind` Attribut (`task`) mit der `traceloop.entity.name` Endung auf `Tool.task` identifiziert diesen Vorgang als einen Bereich für das Ausführungstool. Der korrelierte Ereignisdatensatz enthält die Werkzeugargumente (eingeschlossen`kwargs`) und das Werkzeugergebnis (eingeschlossen`blocks`) zusammen mit dem Werkzeugnamen.  

```
{
  "traceId": "6a01eefa5c52f3d86a35038f35f5ba30",
  "spanId": "5b332f3cd15ace04",
  "name": "FunctionTool.task",
  "kind": "INTERNAL",
  "scope": {
    "name": "opentelemetry.instrumentation.llamaindex",
    "version": "0.61.0"
  },
  "attributes": {
    "traceloop.span.kind": "task",
    "traceloop.entity.name": "FunctionTool.task",
    "session.id": "sea-nyc-trip-2-turns-llamaindex-otel"
  },
  "status": {
    "code": "OK"
  }
}
```

```
{
  "spanId": "5b332f3cd15ace04",
  "traceId": "6a01eefa5c52f3d86a35038f35f5ba30",
  "scope": {
    "name": "opentelemetry.instrumentation.llamaindex"
  },
  "body": {
    "input": {
      "messages": [
        { "role": "user", "content": "{\"kwargs\": {\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}}" }
      ]
    },
    "output": {
      "messages": [
        { "content": "{\"blocks\": [{\"block_type\": \"text\", \"text\": \"{\\\"origin\\\": \\\"SEA\\\", \\\"destination\\\": \\\"NYC\\\", \\\"flights\\\": [ ... ]}\"}], \"tool_name\": \"search_flights\"}" }
      ]
    }
  }
}
```
Das `traceloop.span.kind` Attribut (`task`) mit einem, `traceloop.entity.name` das nicht auf endet`Tool.task`, identifiziert dies als eine Inferenzspanne. Ein LlamaIndex Agent erzeugt mehrere dieser Spannen pro Spielzug. In jedem Fall wird der Inhalt als serialisierte JSON-Zeichenfolge in eine serialisierte JSON-Zeichenfolge gepackt `body.output` (es gibt keine`body.input`). AgentCore Evaluations liest die **Benutzeraufforderung** aus der Chat-Verlaufszeichenfolge (ein `{"input": […​]}` Objekt) im ersten Inferenzbereich und die **Antwort des Agenten** aus der Modellergebniszeichenfolge (ein `{"result": {"response": …​}}` Objekt) in der letzten Inferenzspanne.  
Das Folgende ist der Inferenzbereich selbst.  

```
{
  "traceId": "6a01eef11066751d68f90def0da1f80a",
  "spanId": "d9a1f0c7b3e64a20",
  "name": "BaseWorkflowAgent.task",
  "kind": "INTERNAL",
  "scope": {
    "name": "opentelemetry.instrumentation.llamaindex",
    "version": "0.61.0"
  },
  "attributes": {
    "traceloop.span.kind": "task",
    "traceloop.entity.name": "BaseWorkflowAgent.task",
    "session.id": "sea-nyc-trip-2-turns-llamaindex-otel"
  },
  "status": {
    "code": "OK"
  }
}
```
In der ersten Inferenzspanne ist der `body.output` Inhalt des Ereignisdatensatzes der Chat-Verlauf. Die Benutzereingabeaufforderung ist der Text `user` -role innerhalb des `input` verschachtelten Arrays.  

```
{
  "spanId": "d9a1f0c7b3e64a20",
  "traceId": "6a01eef11066751d68f90def0da1f80a",
  "scope": {
    "name": "opentelemetry.instrumentation.llamaindex"
  },
  "body": {
    "output": {
      "messages": [
        {
          "content": "{\"input\": [{\"role\": \"user\", \"blocks\": [{\"block_type\": \"text\", \"text\": \"Hey, how can you help me\"}]}], \"current_agent_name\": \"Agent\"}"
        }
      ]
    }
  }
}
```
In der letzten Inferenzspanne ist der `body.output` Inhalt des Ereignisdatensatzes das Modellergebnis. Die Antwort des Agenten ist der Text `assistant` -role innerhalb des `result.response` verschachtelten Objekts.  

```
{
  "spanId": "826bc829697a9610",
  "traceId": "6a01eef11066751d68f90def0da1f80a",
  "scope": {
    "name": "opentelemetry.instrumentation.llamaindex"
  },
  "body": {
    "output": {
      "messages": [
        {
          "content": "{\"result\": {\"response\": {\"role\": \"assistant\", \"blocks\": [{\"block_type\": \"text\", \"text\": \"Here are the available flights from Seattle to New York City ...\"}]}}, \"current_agent_name\": \"Agent\"}"
        }
      ]
    }
  }
}
```

### OpenInference
<a name="llamaindex-examples-with-openinference"></a>

**Example**  
Das `openinference.span.kind` Attribut (`CHAIN`) im Stamm-Workflow-Bereich identifiziert dies als Span für den Invoke-Agent. Die Spanne enthält keinen brauchbaren Konversationsinhalt. AgentCore Evaluations rekonstruiert die Benutzereingabe und die Antwort des Agenten anhand der Inferenzspannen.  

```
{
  "traceId": "6a387ee61078243c1cc455ed45c6c313",
  "spanId": "0a7990d804132a9b",
  "name": "ReActAgent.run",
  "kind": "INTERNAL",
  "scope": {
    "name": "openinference.instrumentation.llama_index",
    "version": "4.4.1"
  },
  "attributes": {
    "openinference.span.kind": "CHAIN",
    "input.mime_type": "application/json",
    "output.mime_type": "text/plain",
    "session.id": "sea-nyc-trip-2-turns-llamaindex-oi"
  },
  "status": {
    "code": "OK"
  }
}
```
Das `openinference.span.kind` Attribut (`TOOL`) identifiziert dies als Span für das Ausführungstool; es `tool.name` enthält den Namen des Tools. Die Werkzeugargumente und das Ergebnis befinden sich im korrelierten Ereignisdatensatz, eingeschlossen in `kwargs` `blocks` bzw..  

```
{
  "traceId": "6a387ef07b8f4f3732fab45d3c0b51ff",
  "spanId": "ab105c12cc40048f",
  "name": "FunctionTool.acall",
  "kind": "INTERNAL",
  "scope": {
    "name": "openinference.instrumentation.llama_index",
    "version": "4.4.1"
  },
  "attributes": {
    "openinference.span.kind": "TOOL",
    "tool.name": "search_flights",
    "tool.description": "search_flights(origin: str, destination: str, date: str) -> str ...",
    "session.id": "sea-nyc-trip-2-turns-llamaindex-oi"
  },
  "status": {
    "code": "OK"
  }
}
```

```
{
  "spanId": "ab105c12cc40048f",
  "traceId": "6a387ef07b8f4f3732fab45d3c0b51ff",
  "scope": {
    "name": "openinference.instrumentation.llama_index"
  },
  "body": {
    "input": {
      "messages": [
        { "content": "{\"kwargs\": {\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}}" }
      ]
    },
    "output": {
      "messages": [
        { "content": "{\"blocks\": [{\"text\": \"{\\\"origin\\\": \\\"SEA\\\", \\\"destination\\\": \\\"NYC\\\", \\\"flights\\\": [ ... ]}\"}], \"tool_name\": \"search_flights\"}" }
      ]
    }
  }
}
```
Das `openinference.span.kind` Attribut (`LLM`) identifiziert dies als eine Inferenzspanne. Nachrichtenrollen befinden sich in den Span-Attributen; der Inhalt befindet sich im korrelierten Ereignisdatensatz. ADOT reduziert die Eingaberollen auf`user`, sodass AgentCore Evaluations die letzte Klartext-Eingabemeldung als Benutzeraufforderung verwendet. LlamaIndex gibt eine doppelte `assistant:` Ausgabenachricht mit Präfix aus, die AgentCore Evaluations zugunsten der sauberen Kopie überspringt.  

```
{
  "traceId": "6a387ee61078243c1cc455ed45c6c313",
  "spanId": "1221a062c7f90a8e",
  "name": "OpenAI.astream_chat",
  "kind": "INTERNAL",
  "scope": {
    "name": "openinference.instrumentation.llama_index",
    "version": "4.4.1"
  },
  "attributes": {
    "openinference.span.kind": "LLM",
    "llm.system": "openai",
    "llm.model_name": "gpt-4o-mini",
    "llm.input_messages.0.message.role": "system",
    "llm.input_messages.1.message.role": "user",
    "llm.output_messages.0.message.role": "assistant",
    "session.id": "sea-nyc-trip-2-turns-llamaindex-oi"
  },
  "status": {
    "code": "OK"
  }
}
```

```
{
  "spanId": "1221a062c7f90a8e",
  "traceId": "6a387ee61078243c1cc455ed45c6c313",
  "scope": {
    "name": "openinference.instrumentation.llama_index"
  },
  "body": {
    "input": {
      "messages": [
        { "role": "user", "content": "{\"messages\": [ ... ]}" },
        { "role": "user", "content": "You are designed to help with a variety of tasks ..." },
        { "role": "user", "content": "Hey, how can you help me" }
      ]
    },
    "output": {
      "messages": [
        { "role": "assistant", "content": "assistant: Thought: ... Answer: I can help you plan your trip ..." },
        { "role": "assistant", "content": "Thought: ... Answer: I can help you plan your trip ..." }
      ]
    }
  }
}
```

## Beispiel: Spans ohne Ereignisdatensätze
<a name="llamaindex-examples-without"></a>

Wenn die Telemetrie nicht aufgeteilt wird, verbleibt derselbe Inhalt in den Span-Attributen und es wird kein separater Ereignisdatensatz erstellt. Die folgenden Beispiele stammen von einem LlamaIndex ReAct Reiseplanungsbüro. Derselbe Agent wird unter jeder Instrumentenbibliothek angezeigt.

**Anmerkung**  
Bei diesen Beispielen handelt es sich nicht um vollständige Datenreihen. Sie zeigen repräsentative Daten aus einer echten Agenteninteraktion, wobei einige Felder weggelassen und lange Werte aus Gründen der Lesbarkeit gekürzt wurden.

### OpenTelemetry
<a name="llamaindex-examples-without-otel"></a>

**Example**  
Das `traceloop.entity.input` Attribut enthält die Werkzeugargumente (eingeschlossen`kwargs`), und das `traceloop.entity.output` Attribut enthält das Werkzeugergebnis (eingeschlossen). `blocks`  

```
{
  "traceId": "6a4de7c376913db82e6f0f336a16731d",
  "spanId": "b64c37adefae74f0",
  "name": "FunctionTool.task",
  "kind": "INTERNAL",
  "scope": {
    "name": "opentelemetry.instrumentation.llamaindex",
    "version": "0.61.0"
  },
  "attributes": {
    "traceloop.span.kind": "task",
    "traceloop.entity.name": "FunctionTool.task",
    "traceloop.entity.input": "{\"kwargs\": {\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}}",
    "traceloop.entity.output": "{\"blocks\": [{\"block_type\": \"text\", \"text\": \"{\\\"origin\\\": \\\"SEA\\\", \\\"flights\\\": [ ... ]}\"}], \"tool_name\": \"search_flights\"}",
    "session.id": "sea-nyc-trip-2-turns-unified"
  },
  "status": {
    "code": "OK"
  }
}
```
Das `traceloop.entity.output` Attribut enthält den Chat-Verlauf, aus dem AgentCore Evaluations die Benutzeraufforderung liest. Die Antwort stammt aus dem Modellergebnis der letzten Inferenzspanne.  

```
{
  "traceId": "6a4de7b85e61747e6b568a1f4768e89d",
  "spanId": "31ea3d5882dac680",
  "name": "BaseWorkflowAgent.task",
  "kind": "INTERNAL",
  "scope": {
    "name": "opentelemetry.instrumentation.llamaindex",
    "version": "0.61.0"
  },
  "attributes": {
    "traceloop.span.kind": "task",
    "traceloop.entity.name": "BaseWorkflowAgent.task",
    "traceloop.entity.output": "{\"input\": [{\"role\": \"user\", \"blocks\": [{\"block_type\": \"text\", \"text\": \"Hey, how can you help me\"}]}], \"current_agent_name\": \"Agent\"}",
    "session.id": "sea-nyc-trip-2-turns-unified"
  },
  "status": {
    "code": "OK"
  }
}
```

### OpenInference
<a name="llamaindex-examples-without-openinference"></a>

**Example**  
Das `input.value` Attribut enthält die Werkzeugargumente (eingeschlossen`kwargs`), und das `output.value` Attribut enthält das Werkzeugergebnis (eingeschlossen`blocks`).  

```
{
  "traceId": "6a387ef07b8f4f3732fab45d3c0b51ff",
  "spanId": "d5a1c9e70b46f312",
  "name": "FunctionTool.acall",
  "kind": "INTERNAL",
  "scope": {
    "name": "openinference.instrumentation.llama_index",
    "version": "4.4.2"
  },
  "attributes": {
    "openinference.span.kind": "TOOL",
    "tool.name": "search_flights",
    "input.value": "{\"kwargs\": {\"origin\": \"SEA\", \"destination\": \"NYC\", \"date\": \"2025-03-15\"}}",
    "output.value": "{\"blocks\": [{\"text\": \"{\\\"origin\\\": \\\"SEA\\\", \\\"flights\\\": [ ... ]}\"}], \"tool_name\": \"search_flights\"}",
    "session.id": "sea-nyc-trip-2-turns-oi"
  },
  "status": {
    "code": "OK"
  }
}
```
Der Nachrichteninhalt befindet sich direkt in den indizierten Attributen. Die `llm.input_messages. ` Attribute enthalten die System- und Benutzereingabeaufforderung, und die `llm.output_messages.` Attribute enthalten die Modellausgabe, aus der AgentCore Evaluations den Text `Answer:` als Antwort des Agenten extrahiert.  

```
{
  "traceId": "6a387ee61078243c1cc455ed45c6c313",
  "spanId": "c9f0a2b41d773e88",
  "name": "OpenAI.astream_chat",
  "kind": "INTERNAL",
  "scope": {
    "name": "openinference.instrumentation.llama_index",
    "version": "4.4.2"
  },
  "attributes": {
    "openinference.span.kind": "LLM",
    "llm.model_name": "gpt-4o-mini",
    "llm.input_messages.0.message.role": "system",
    "llm.input_messages.0.message.content": "You are designed to help with a variety of tasks ...",
    "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.content": "Thought: ... Answer: I can help you plan your trip ...",
    "session.id": "sea-nyc-trip-2-turns-oi"
  },
  "status": {
    "code": "OK"
  }
}
```

## Bewährte Methoden für LlamaIndex Agenten
<a name="llamaindex-best-practices"></a>

Die Art und Weise, wie Sie einen LlamaIndex Agenten erstellen und aufrufen, wirkt sich darauf aus, was in seiner Telemetrie angezeigt wird und wie zuverlässig der Agent bewertet werden kann. Mit den folgenden Methoden wird sichergestellt, dass die Benutzeraufforderung, die Antwort des Agenten und die Aktivität des Tools wiederhergestellt werden können.
+  **Verwenden Sie einen LlamaIndex Agenten-Workflow.** Erstellen Sie Ihren Agenten als LlamaIndex Agenten-Workflow (z. B. ein `ReActAgent` oder`FunctionAgent`), sodass das Framework einen Workflow-Bereich auf oberster Ebene mit Inferenz- und Tool-Unterbereichen ausgibt. AgentCore Evaluations rekonstruiert anhand dieser untergeordneten Bereiche die Spanne des Agentenaufrufs.
+  **Registrieren Sie Werkzeuge als Objekte. `FunctionTool`** Definieren Sie jedes Werkzeug als ein LlamaIndex `FunctionTool` (oder verwenden Sie Helfer `@tool` im -stil, die eines erzeugen). Die einzelnen Tools werden anhand ihres Entity-Namens identifiziert, und ihre Argumente und Ergebnisse werden in den Unwraps `kwargs` und `blocks` Structures AgentCore Evaluations serialisiert.
+  **Sorgen Sie dafür, dass die Werkzeugergebnisse textserialisierbar sind.** Gibt Werkzeugergebnisse als Zeichenfolgen oder Werte zurück. JSON-serializable LlamaIndex verpackt sie in einen Textblock. Wenn sie serialisierbar bleiben, wird sichergestellt, dass das Werkzeugergebnis sauber erfasst wird.
+  **Verwenden Sie für ReAct Agenten das Standardausgabeformat.** AgentCore Evaluationen extrahiert die endgültige Antwort aus dem `Answer:` Abschnitt der Ausgabe eines ReAct Agenten. Bei Verwendung der ReAct Standardaufforderung ( LlamaIndex Standardeinstellung) kann die Antwort des Agenten wiederhergestellt werden.