> ## Documentation Index
> Fetch the complete documentation index at: https://avala.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Schema der Sequenz-Metadaten

> Das Ergebnis-Label jeder Sequenz, wie technische Gültigkeit gemeldet wird und wie Sie beides lesen, schreiben und exportieren

Jede Sequenz trägt zwei getrennte Arten von Metadaten:

* **Technische Gültigkeit.** Ist die Aufnahme nutzbar? Avala meldet sie anhand von Akzeptanzkriterien und Qualitätszielen. Siehe den Abschnitt Technische Gültigkeit unten.
* **Verhaltensergebnis.** Was hat die Person oder der Roboter getan, und war die Aufgabe erfolgreich? Avala speichert es als **Ergebnis-Label** der Sequenz.

Eine Sequenz kann technisch gültig sein und trotzdem einen Fehler zeigen. Eine fehlgeschlagene Sequenz ist oft die nützlichste. Weil die beiden Achsen getrennt bleiben, verwirft ein Filter für saubere Daten nie einen nützlichen Fehler, und ein Filter für Erfolg verbirgt nie einen defekten Sensor.

## Das Ergebnis-Label

Jede Sequenz hat höchstens ein aktuelles Ergebnis-Label. Jeder Schreibvorgang erfasst eine neue Version. Frühere Versionen bleiben in der Label-Historie lesbar.

### Beispiel

Dies ist das Label einer menschlichen Demonstration mit einem Abrutschen und einer Erholung, so wie `GET .../sequences/<sequence-uid>/outcome/` es zurückgibt:

```json theme={null}
{
  "uid": "<outcome-uid>",
  "sequence_uid": "<sequence-uid>",
  "version": 2,
  "is_current": true,
  "outcome": "mistake_and_recovery",
  "progress": 1.0,
  "quality": 4,
  "speed": 3,
  "subtasks": [
    { "label": "Load the plate into the lower rack", "start_ts": 0.0, "end_ts": 19.8, "outcome": "mistake_and_recovery" },
    { "label": "Pull out the lower rack", "start_ts": 0.0, "end_ts": 6.2, "outcome": "expert_success" },
    { "label": "Place the wet plate in a free slot", "start_ts": 6.2, "end_ts": 19.8, "outcome": "mistake_and_recovery" }
  ],
  "hand_actions": {
    "left": [
      { "start_ts": 0.0, "end_ts": 6.2, "action": "pulling the lower rack out by its front edge", "object": "dishwasher rack", "verb": "pull", "contact": true },
      { "start_ts": 6.2, "end_ts": 19.8, "action": "holding the rack steady", "object": "dishwasher rack", "verb": "hold", "contact": true }
    ],
    "right": [
      { "start_ts": 6.2, "end_ts": 9.1, "action": "carrying the wet plate to the rack", "object": "plate", "verb": "carry", "contact": true },
      { "start_ts": 9.1, "end_ts": 10.4, "action": "the plate slips out of the grasp", "object": "plate", "verb": null, "contact": false },
      { "start_ts": 10.4, "end_ts": 14.7, "action": "regrasping the plate by its rim", "object": "plate", "verb": "grasp", "contact": true },
      { "start_ts": 14.7, "end_ts": 19.8, "action": "placing the plate in a free slot", "object": "plate", "verb": "place", "contact": true }
    ]
  },
  "mistake_type": "slip_during_place",
  "recovery_type": "regrasp",
  "failure_stage": "place",
  "autonomy_level": "human_demonstration",
  "model_version": "",
  "evaluation_membership": "train",
  "leakage_groups": {
    "location": "loc_8f2a",
    "object": "obj_set_31",
    "mechanism": "dishwasher_pull_rack_v2",
    "operator": "op_5c1e",
    "environment_family": "kitchen_galley"
  },
  "source": "human",
  "source_metadata": {},
  "labeled_by": "<user-uid>",
  "confidence": null,
  "created_at": "2026-09-30T17:42:11.204000Z",
  "updated_at": "2026-09-30T17:42:11.204000Z"
}
```

Die Werte veranschaulichen die Form des Labels. Sie beschreiben keine echte Lieferung.

### Felder

Alle Zeitstempel sind Sekunden ab Beginn der Sequenz.

| Feld | Typ | Bedeutung |
| - | - | - |
| `uid` | string | ID dieser Label-Version. Nur lesbar. |
| `sequence_uid` | string | Die Sequenz, zu der das Label gehört. Nur lesbar. |
| `version` | integer | Label-Version, beginnend bei 1. Jeder Schreibvorgang erhöht sie um eins. Nur lesbar. |
| `is_current` | boolean | `true` für die aktuelle Version. Nur lesbar. |
| `outcome` | string | Das Verhaltensergebnis. Pflichtfeld. Siehe Ergebniswerte. |
| `progress` | number oder null | Aufgabenfortschritt von 0 bis 1. |
| `quality` | integer oder null | Ausführungsqualität von 1 bis 5. |
| `speed` | integer oder null | Ausführungstempo von 1 bis 5. |
| `subtasks` | list | Gelabelte Zeitbereiche. Siehe Teilaufgaben. |
| `hand_actions` | object | Aktionsströme pro Hand, `left` und `right`. Siehe Handaktionen. |
| `mistake_type` | string | Ihr Tag für die Art des Fehlers. Bis zu 128 Zeichen. Leer, wenn nicht gesetzt. |
| `recovery_type` | string | Ihr Tag für die Art der Erholung. Bis zu 128 Zeichen. Leer, wenn nicht gesetzt. |
| `failure_stage` | string | Ihr Tag für die Phase, in der der Fehler auftrat. Bis zu 128 Zeichen. Leer, wenn nicht gesetzt. |
| `autonomy_level` | string | Wer die Kontrolle hatte. Siehe Autonomiegrad. Leer, wenn nicht gesetzt. |
| `model_version` | string | Die Policy- oder Modellversion, die den Roboter gesteuert hat. Bis zu 255 Zeichen. Leer bei menschlichen Demonstrationen. |
| `evaluation_membership` | string | `train`, `held_out_eval` oder `none`. Leer, wenn nicht gesetzt. Siehe Zugehörigkeit zur Evaluation. |
| `leakage_groups` | object | Gruppen-IDs für saubere Aufteilungen. Siehe Leakage-Gruppen. |
| `source` | string | Wer das Label geschrieben hat: `human`, `model` oder `imported`. Standard `human`. |
| `source_metadata` | object | Herkunft eines Imports. Siehe Quell-Metadaten. |
| `labeled_by` | string oder null | UID des Nutzers, der die Version geschrieben hat. Wird nur Aufrufern zurückgegeben, die den Datensatz bearbeiten dürfen. Nur lesbar. |
| `confidence` | number oder null | Modellkonfidenz von 0 bis 1. Nur zulässig, wenn `source` gleich `model` ist. |
| `created_at`, `updated_at` | string | Zeitstempel der Version. Nur lesbar. |

`mistake_type`, `recovery_type` und `failure_stage` sind Freitext. Verwenden Sie die Tags aus der Fehlertaxonomie Ihres Programms, damit sich Sequenzen sauber gruppieren lassen.

### Ergebniswerte

| Ergebnis | Bedeutung |
| - | - |
| `expert_success` | Die Aufgabe ist erledigt. Die Ausführung ist flüssig und im Expertentempo. |
| `slow_success` | Die Aufgabe ist erledigt. Die Ausführung ist korrekt und deutlich langsamer als das Expertentempo. |
| `partial_success` | Ein Teil der Aufgabe ist erledigt. Der Zielzustand wird nicht erreicht. |
| `mistake_and_recovery` | Ein Fehler tritt auf, etwa ein Abrutschen, ein Fehlgriff oder eine falsche Platzierung. Der Akteur erholt sich ohne fremde Hilfe und schließt die Aufgabe ab. |
| `intervention` | Ein Mensch greift ein, um die Aufgabe zu korrigieren oder zu beenden. |
| `unsafe` | Die Sequenz enthält eine unsichere Aktion oder einen unsicheren Zustand. |
| `aborted` | Der Versuch endet, bevor die Aufgabe erledigt ist, ohne Erholung. |
| `failure` | Der Versuch endet, und die Aufgabe ist nicht erreicht. |
| `novel_strategy` | Die Aufgabe wird auf gültige Weise gelöst, die von der üblichen Strategie abweicht. |
| `inefficient_strategy` | Die Aufgabe wird mit vermeidbarer Zusatzbewegung, wiederholten Versuchen oder Umwegen gelöst. |

Jede Teilaufgabe kann ihr eigenes Ergebnis aus derselben Liste tragen.

### Autonomiegrad

| Wert | Bedeutung |
| - | - |
| `human_demonstration` | Eine Person führt die Aufgabe aus. |
| `teleoperation` | Eine Person steuert den Roboter aus der Ferne. |
| `autonomous` | Der Roboter läuft mit seiner Policy. |
| `shared_autonomy` | Policy und Person teilen sich die Kontrolle. |
| `intervention` | Eine Person übernimmt während der Sequenz von der Policy. |

### Teilaufgaben

Jede Teilaufgabe ist `{label, start_ts, end_ts, outcome}`.

| Feld | Regel |
| - | - |
| `label` | Beschreibung der Teilaufgabe in natürlicher Sprache. Pflichtfeld. 1 bis 500 Zeichen. |
| `start_ts`, `end_ts` | Endliche Zahlen, 0 oder größer. `end_ts` ist mindestens `start_ts`. |
| `outcome` | Ein Ergebniswert oder `null`. |

Ein Label enthält höchstens 256 Teilaufgaben. Die Liste muss nach `start_ts` sortiert sein. Zwei Teilaufgaben sind entweder disjunkt, oder eine enthält die andere vollständig, etwa eine Phase und ihre Schritte. Aneinanderstoßende Enden gelten als disjunkt. Eine teilweise Überlappung wird abgelehnt. Wenn zwei Teilaufgaben zur selben Zeit beginnen, führen Sie die umschließende zuerst auf.

### Handaktionen

`hand_actions` enthält zwei unabhängige Ströme, `left` und `right`. Jedes Element beschreibt, was eine Hand über einen Zeitbereich tut.

| Feld | Regel |
| - | - |
| `start_ts`, `end_ts` | Endliche Zahlen, 0 oder größer. `end_ts` ist mindestens `start_ts`. |
| `action` | Beschreibung der Aktion in natürlicher Sprache. Pflichtfeld. 1 bis 500 Zeichen. |
| `object` | Das Objekt, mit dem die Hand arbeitet. Optional. Bis zu 255 Zeichen. |
| `verb` | Ein kurzes Verb für die Aktion. Optional. Bis zu 64 Zeichen. |
| `contact` | `true`, wenn die Hand das Objekt berührt, `false`, wenn nicht, `null`, wenn unbekannt. Nur JSON-Booleans sind zulässig. |

* Innerhalb einer Hand sind die Elemente nach `start_ts` sortiert und dürfen sich nicht überlappen. Ein Element beginnt am Ende des vorherigen oder danach. Aneinanderstoßen ist erlaubt.
* Die beiden Hände dürfen sich beliebig überlappen.
* Jede Hand enthält höchstens 3.600 Elemente. Das entspricht einer Stunde bei einem Label pro Sekunde.
* `left` und `right` sind die einzigen Schlüssel. Sie können jeden davon weglassen. Eine weggelassene Hand wird als leere Liste gespeichert.
* Ein leeres `object` oder `verb` wird als `null` gespeichert. Jedes gespeicherte Element hat alle sechs Felder.

### Dauer der Sequenz

Wenn Avala die Dauer der Sequenz kennt, muss jedes `end_ts` einer Teilaufgabe und jedes `end_ts` einer Handaktion höchstens die Dauer plus 1 Sekunde betragen. Die zusätzliche Sekunde berücksichtigt Labels, die mit einem pro Sekunde geschrieben werden. Avala kennt die Dauer, wenn die Sequenz genau eine extrahierte MCAP-Datei mit erfasster Länge hat. Bei anderen Sequenzen entfällt die Prüfung.

### Zugehörigkeit zur Evaluation

`evaluation_membership` ordnet die Sequenz einer Aufteilung zu:

| Wert | Bedeutung |
| - | - |
| `train` | Die Sequenz darf für das Training verwendet werden. |
| `held_out_eval` | Die Sequenz gehört zu einem zurückgehaltenen Evaluationsset. Halten Sie sie aus dem Training heraus. |
| `none` | Die Sequenz gehört zu keiner der beiden Aufteilungen. |

Avala setzt `held_out_eval` für die Sequenzen jeder Evaluationskohorte. Diese Sequenzen erscheinen nie in einem Trainings-Release. Siehe [Evaluation](/docs/de/fleet-learning/evaluation.md).

### Leakage-Gruppen

Leakage-Gruppen verhindern, dass Beinahe-Duplikate auf beiden Seiten einer Aufteilung in Training und Evaluation landen. `leakage_groups` akzeptiert diese Schlüssel, jeweils mit einer Gruppen-ID von bis zu 255 Zeichen:

| Schlüssel | Fasst Sequenzen zusammen, die Folgendes teilen |
| - | - |
| `location` | Dasselbe Zuhause, denselben Standort oder denselben Raum. |
| `object` | Dasselbe physische Objektset. |
| `mechanism` | Dasselbe Gerät oder dieselbe Mechanismuseinheit. |
| `operator` | Denselben Sammler oder Teleoperator. |
| `environment_family` | Dieselbe Art von Umgebung und Aufteilung, etwa eine Küchenzeile. |

Jeder andere Schlüssel wird abgelehnt. Jeder Schlüssel ist optional.

Avala stellt Evaluationskohorten so zusammen, dass kein Gruppenwert einer Kohorte in einem Trainings-Release vorkommt. Sie können Ihre eigenen Daten genauso aufteilen: Halten Sie nach Gruppe zurück, nie nach zufälliger Sequenz. Die Gruppen-IDs von Avala sind pseudonym, sodass Sie gruppieren und aufteilen können, ohne zu erfahren, wer oder wo.

### Quell-Metadaten

`source_metadata` erfasst, woher ein importiertes Label stammt, zum Beispiel `{"importer": "...", "run_id": "...", "task": "...", "log_path": "..."}`.

* Es ist ein flaches Objekt mit höchstens 20 Schlüsseln.
* Jeder Schlüssel hat 1 bis 64 Zeichen.
* Jeder Wert ist ein String mit bis zu 512 Zeichen, eine endliche Zahl oder ein Boolean.
* Verschachtelte Objekte, Listen und `null`-Werte werden abgelehnt.

### Wie Schreibvorgänge funktionieren

* Ein Schreibvorgang ersetzt das aktuelle Label vollständig und erfasst eine neue Version. Jedes optionale Feld, das Sie weglassen, wird als nicht gesetzt gespeichert. Es wird nicht aus der vorherigen Version übernommen.
* Schreiben erfordert Bearbeitungszugriff auf den Datensatz. Lesen erfordert denselben Zugriff wie das Lesen der Sequenz, auch bei öffentlichen Datensätzen.
* `confidence` wird abgelehnt, sofern `source` nicht `model` ist.
* Das Lesen einer Sequenz ohne Label gibt `404` zurück.

## Technische Gültigkeit

Technische Gültigkeit ist nicht Teil des Ergebnis-Labels. Avala meldet sie aus der Akzeptanz-Engine und aus Qualitätszielen, und sie hat kein eigenes JSON-Schema.

**Akzeptanzkriterien.** Jede Aufnahme in einer Erfassungskampagne erhält ein maschinelles Urteil: `accept`, `quarantine` oder `reject`. Das Urteil ergibt sich aus diesen Kriterien:

| Kriterium | Was es prüft |
| - | - |
| `capture_health` | Die MCAP-Datei ist valide, und die Kanäle, die die Kampagne verlangt, sind vorhanden. |
| `frame_rate` | Die Bildrate der Kamera hält über den ganzen Clip, ohne anhaltenden Einbruch. |
| `completeness` | Die Länge liegt nahe an der Länge, die die Kampagne verlangt hat. |
| `framing` | Die Hände sind über einen ausreichenden Teil der Zeit sichtbar, in der der Detektor hingesehen hat. |
| `shake` | Die Kamera wackelt über den größten Teil des Clips nicht. |

Jedes Kriterium meldet `pass`, `fail`, `insufficient_evidence` oder `skipped`. Ein fehlgeschlagenes Kriterium erfasst einen Grundcode, etwa `acceptance_frame_rate_drop` oder `hands_not_visible`. Ein Reviewer bestätigt oder überstimmt dann das Urteil. Die Grundcodes sind unter [Akzeptierte Stunde](/docs/de/fleet-learning/accepted-hour.md) aufgeführt.

Lesen Sie die Akzeptanz mit den MCP-Tools `get_result_acceptance` für eine Aufnahme und `get_campaign_acceptance_summary` für eine Kampagne. `list_capture_submissions` enthält die maschinelle Akzeptanzzusammenfassung jeder Aufnahme.

**Qualitätsziele.** Ein Projekt kann Schwellenwerte für Qualitätsmetriken festlegen, etwa Akzeptanzrate, Ablehnungsrate und Problemrate. Avala alarmiert, wenn eine Metrik ihren Schwellenwert überschreitet. Lesen Sie sie mit dem MCP-Tool `list_quality_targets`.

Programmprüfungen, die keine maschinellen Kriterien sind, etwa Kalibrierung, Einwilligung und Zeitstempel-Synchronisierung, werden als Ablehnungsgründe im [Abdeckungsbericht](/docs/de/fleet-learning/coverage.md) gemeldet. Siehe [Akzeptierte Stunde](/docs/de/fleet-learning/accepted-hour.md).

## Ergebnis-Labels lesen und schreiben

Die REST-Endpunkte liegen unter `https://api.avala.ai/api/v1`:

| Methode und Pfad | Was er tut |
| - | - |
| `GET /datasets/{owner}/{slug}/sequences/{sequence_uid}/outcome/` | Aktuelles Label einer Sequenz. `404`, wenn kein Label existiert. |
| `PUT /datasets/{owner}/{slug}/sequences/{sequence_uid}/outcome/` | Ein neues aktuelles Label erfassen. |
| `GET /datasets/{owner}/{slug}/sequences/{sequence_uid}/outcome/history/` | Jede Version des Labels, die neueste zuerst. |
| `GET /datasets/{owner}/{slug}/sequence-outcomes/` | Aktuelle Labels in einem Datensatz, paginiert. |

Die Datensatzliste akzeptiert die Filter `outcome`, `evaluation_membership`, `source` und `autonomy_level`. Jeder nimmt einen Wert oder eine kommagetrennte Liste, und eine Sequenz passt, wenn sie einem beliebigen Wert der Liste entspricht. `model_version` passt auf genau eine Version. Ein unbekannter Filterwert gibt `400` zurück.

Die Sequenzliste, `GET /datasets/{owner}/{slug}/sequences/`, akzeptiert `outcome` und `evaluation_membership` in derselben Form. Sie gibt die Sequenzen zurück, deren aktuelles Label passt.

### Ein Label schreiben

```bash cURL theme={null}
curl -X PUT \
  "https://api.avala.ai/api/v1/datasets/your-org/kitchen-rollouts/sequences/<sequence-uid>/outcome/" \
  -H "X-Avala-Api-Key: $AVALA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "outcome": "failure",
    "progress": 0.4,
    "subtasks": [
      { "label": "Place the plate in the lower rack", "start_ts": 0.0, "end_ts": 21.5, "outcome": "failure" }
    ],
    "mistake_type": "slip_during_place",
    "failure_stage": "place",
    "autonomy_level": "autonomous",
    "model_version": "your-policy@2026-09-20",
    "evaluation_membership": "held_out_eval",
    "source": "imported",
    "source_metadata": { "importer": "your-eval-harness", "run_id": "r42", "task": "load_dishwasher" }
  }'
```

```python Python theme={null}
from avala import Client

client = Client()  # reads AVALA_API_KEY

label = client.sequence_outcomes.set(
    "your-org",
    "kitchen-rollouts",
    "<sequence-uid>",
    outcome="failure",
    progress=0.4,
    subtasks=[
        {"label": "Place the plate in the lower rack", "start_ts": 0.0, "end_ts": 21.5, "outcome": "failure"},
    ],
    mistake_type="slip_during_place",
    failure_stage="place",
    autonomy_level="autonomous",
    model_version="your-policy@2026-09-20",
    evaluation_membership="held_out_eval",
    source="imported",
    source_metadata={"importer": "your-eval-harness", "run_id": "r42", "task": "load_dishwasher"},
)
print(label.version, label.outcome)
```

```typescript TypeScript theme={null}
import Avala from "@avala-ai/sdk";

const avala = new Avala(); // reads AVALA_API_KEY

const label = await avala.sequenceOutcomes.set("your-org", "kitchen-rollouts", "<sequence-uid>", {
  outcome: "failure",
  progress: 0.4,
  subtasks: [{ label: "Place the plate in the lower rack", startTs: 0.0, endTs: 21.5, outcome: "failure" }],
  mistakeType: "slip_during_place",
  failureStage: "place",
  autonomyLevel: "autonomous",
  modelVersion: "your-policy@2026-09-20",
  evaluationMembership: "held_out_eval",
  source: "imported",
  sourceMetadata: { importer: "your-eval-harness", run_id: "r42", task: "load_dishwasher" },
});
console.log(label.version, label.outcome);
```

```bash CLI theme={null}
avala sequence-outcomes set your-org kitchen-rollouts <sequence-uid> \
  --outcome failure \
  --progress 0.4 \
  --subtasks-file subtasks.json \
  --mistake-type slip_during_place \
  --failure-stage place \
  --autonomy-level autonomous \
  --model-version your-policy@2026-09-20 \
  --evaluation-membership held_out_eval \
  --source imported \
  --source-metadata '{"importer": "your-eval-harness", "run_id": "r42", "task": "load_dishwasher"}'
```

Das TypeScript-SDK nimmt Optionsnamen in camelCase und sendet die snake\_case-Felder der API. Schlüssel innerhalb von `sourceMetadata` werden so gesendet, wie sie geschrieben sind. In der CLI nimmt `--hand-actions-file` eine JSON-Datei mit `{"left": [...], "right": [...]}`, und `--leakage-group KEY=ID` kann wiederholt werden.

### Labels lesen

```bash cURL theme={null}
# Current label of one sequence
curl "https://api.avala.ai/api/v1/datasets/your-org/kitchen-rollouts/sequences/<sequence-uid>/outcome/" \
  -H "X-Avala-Api-Key: $AVALA_API_KEY"

# Every version, newest first
curl "https://api.avala.ai/api/v1/datasets/your-org/kitchen-rollouts/sequences/<sequence-uid>/outcome/history/" \
  -H "X-Avala-Api-Key: $AVALA_API_KEY"

# Failed or aborted held-out sequences
curl "https://api.avala.ai/api/v1/datasets/your-org/kitchen-rollouts/sequence-outcomes/?outcome=failure,aborted&evaluation_membership=held_out_eval" \
  -H "X-Avala-Api-Key: $AVALA_API_KEY"

# The sequences themselves, filtered by their current label
curl "https://api.avala.ai/api/v1/datasets/your-org/kitchen-rollouts/sequences/?outcome=mistake_and_recovery,intervention" \
  -H "X-Avala-Api-Key: $AVALA_API_KEY"
```

```python Python theme={null}
from avala import Client

client = Client()

label = client.sequence_outcomes.get("your-org", "kitchen-rollouts", "<sequence-uid>")
versions = client.sequence_outcomes.history("your-org", "kitchen-rollouts", "<sequence-uid>")

page = client.sequence_outcomes.list(
    "your-org",
    "kitchen-rollouts",
    outcome=["failure", "aborted"],
    evaluation_membership="held_out_eval",
    model_version="your-policy@2026-09-20",
)
for item in page:
    print(item.sequence_uid, item.outcome, item.progress)
```

```typescript TypeScript theme={null}
import Avala from "@avala-ai/sdk";

const avala = new Avala();

const label = await avala.sequenceOutcomes.get("your-org", "kitchen-rollouts", "<sequence-uid>");
const versions = await avala.sequenceOutcomes.history("your-org", "kitchen-rollouts", "<sequence-uid>");

const page = await avala.sequenceOutcomes.list("your-org", "kitchen-rollouts", {
  outcome: ["failure", "aborted"],
  evaluationMembership: "held_out_eval",
  modelVersion: "your-policy@2026-09-20",
});
for (const item of page.items) {
  console.log(item.sequenceUid, item.outcome, item.progress);
}
```

```bash CLI theme={null}
avala sequence-outcomes get your-org kitchen-rollouts <sequence-uid>
avala sequence-outcomes history your-org kitchen-rollouts <sequence-uid>
avala sequence-outcomes list your-org kitchen-rollouts \
  --outcome failure,aborted \
  --evaluation-membership held_out_eval
```

Die Datensatzliste gibt bis zu 100 Labels pro Seite zurück. Übergeben Sie den `cursor` der vorherigen Seite, um fortzufahren.

### Labels mit dem MCP-Server lesen

Der MCP-Server liest Ergebnis-Labels. Er schreibt sie nicht.

* `get_sequence_outcome` nimmt `owner`, `slug` und `sequenceUid`. Es gibt das aktuelle Label zurück.
* `list_sequence_outcomes` nimmt `owner` und `slug`, dazu die Filter `outcome`, `evaluationMembership`, `source`, `autonomyLevel` und `modelVersion` sowie `limit` und `cursor`.

Beide Tools geben standardmäßig eine Kurzform zurück. Übergeben Sie `detail: "full"`, um Teilaufgaben, Handaktionen, die Fehler- und Erholungs-Tags, Leakage-Gruppen, Quell-Metadaten und den Labeler einzuschließen. Siehe [Avala mit KI nutzen](/docs/de/getting-started/mcp.md) für die Verbindung.

## Ergebnis-Labels mit LeRobot exportieren

Der LeRobot-Exporter kann das aktuelle Ergebnis-Label jeder Sequenz neben den Datensatz schreiben. Eine Avala-Sequenz wird zu einer LeRobot-Episode.

```bash CLI theme={null}
avala lerobot export your-org/kitchen-rollouts \
  --repo-id your-hf-user/kitchen-rollouts \
  --output ./lerobot-out \
  --include-outcomes
```

```python Python theme={null}
from avala import Client
from avala.lerobot import export_dataset

export_dataset(
    Client(),
    "your-org",
    "kitchen-rollouts",
    repo_id="your-hf-user/kitchen-rollouts",
    output_dir="./lerobot-out",
    include_outcomes=True,
)
```

Die Labels werden nach `meta/avala_sequence_outcomes.jsonl` geschrieben, ein JSON-Objekt pro Zeile und eine Zeile pro gespeicherter LeRobot-Episode. Die Episodentabelle von LeRobot selbst hat keinen Platz für diese Metadaten, deshalb ist es eine separate Datei. Jede Zeile hat diese Schlüssel:

| Schlüssel | Wert |
| - | - |
| `episode_index` | Der Index der LeRobot-Episode. |
| `avala_sequence_uid` | Die Avala-Sequenz, aus der die Episode stammt. |
| `outcome` | Der Ergebniswert, oder `null`, wenn die Sequenz kein Label hat. |
| `outcome_version` | Die Label-Version, die exportiert wurde. |
| `progress`, `quality`, `speed` | Wie im Label. |
| `subtasks`, `hand_actions` | Wie im Label. Zeitstempel sind Sekunden ab Beginn der Episode. |
| `mistake_type`, `recovery_type`, `failure_stage`, `autonomy_level`, `model_version`, `evaluation_membership` | Wie im Label, mit `null` anstelle eines leeren Werts. |
| `leakage_groups` | Wie im Label. |
| `outcome_source`, `outcome_source_metadata`, `outcome_confidence` | `source`, `source_metadata` und `confidence` des Labels. |

Eine Sequenz ohne Label erhält eine Zeile mit nur `episode_index`, `avala_sequence_uid` und `"outcome": null`.

## Die Fehler-und-Erholungs-Spur

Behebbare Fehler werden als eigene Spur geliefert: Sequenzen, deren Ergebnis `mistake_and_recovery` oder `intervention` ist. Die Teilaufgaben und Handaktionen jeder Sequenz markieren, wo der Fehler und die Erholung stattfinden.

Die Spur wird als separater Slice im Release ausgeliefert. Sie können darauf trainieren, sie gewichten oder weglassen. Sie können dieselbe Menge auch selbst mit `?outcome=mistake_and_recovery,intervention` zusammenstellen. Unsichere Sequenzen gehören nicht zur Spur.
