Claude Platform Docs
Managed AgentsArbeit an Ihren Agenten delegieren

Ergebnisse definieren

Sag dem Agenten, wie 'fertig' aussieht, und lass ihn iterieren, bis er es erreicht.

Ein Ergebnis teilt der Session mit, wie das Endresultat aussehen soll und wie seine Qualität gemessen wird. Der Agent arbeitet auf dieses Ziel hin, bewertet sich selbst und iteriert, bis das Ergebnis erreicht ist.

Wenn du ein Ergebnis definierst, stellt das Harness automatisch einen Grader (Bewerter) bereit, um das Artefakt anhand einer Rubrik zu bewerten. Der Grader verwendet ein separates Kontextfenster, um nicht von den Implementierungsentscheidungen des Hauptagenten beeinflusst zu werden.

Der Grader gibt eine Erklärung zurück, die zusammenfasst, welche Kriterien bestanden oder nicht bestanden wurden, oder bestätigt, dass das Artefakt die Rubrik erfüllt. Dieses Feedback wird an den Agenten für die nächste Iteration zurückgegeben.

Eine Rubrik erstellen

Eine Rubrik ist ein Markdown-Dokument, das die Bewertung pro Kriterium beschreibt. Die Rubrik ist erforderlich.

Beispielrubrik:

# DCF Model Rubric

## Revenue Projections
- Uses historical revenue data from the last 5 fiscal years
- Projects revenue for at least 5 years forward
- Growth rate assumptions are explicitly stated and reasonable

## Cost Structure
- COGS and operating expenses are modeled separately
- Margins are consistent with historical trends or deviations are justified

## Discount Rate
- WACC is calculated with stated assumptions for cost of equity and cost of debt
- Beta, risk-free rate, and equity risk premium are sourced or justified

## Terminal Value
- Uses either perpetuity growth or exit multiple method (stated which)
- Terminal growth rate does not exceed long-term GDP growth

## Output Quality
- All figures are in a single .xlsx file with clearly labeled sheets
- Key assumptions are on a separate "Assumptions" sheet
- Sensitivity analysis on WACC and terminal growth rate is included

Übergib die Rubrik als Inline-Text an user.define_outcome (siehe Eine Session mit einem Ergebnis erstellen), oder lade sie über die Files API hoch, um sie über mehrere Sessions hinweg wiederzuverwenden.

import time
from pathlib import Path

from anthropic import Anthropic

client = Anthropic()

RUBRIC = """# DCF Model Rubric

## Revenue Projections
- Uses historical revenue data from the last 5 fiscal years
- Projects revenue for at least 5 years forward

## Output Quality
- All figures are in a single .xlsx file with clearly labeled sheets
"""
Path("/tmp/rubric.md").write_text(RUBRIC)

rubric = client.files.upload(file=Path("/tmp/rubric.md"))
print(f"Uploaded rubric: {rubric.id}")

Eine Session mit einem Ergebnis erstellen

Die folgenden Beispiele erstellen eine Session für einen bestehenden Agenten und eine Umgebung (beide separat erstellt) und senden dann ein user.define_outcome-Event. Der Agent beginnt sofort mit der Arbeit. Es ist kein zusätzliches User-Message-Event erforderlich.

# Erstelle eine Session
session = client.beta.sessions.create(
    agent=agent.id,
    environment_id=environment.id,
    title="Financial analysis on Costco",
)

# Definiere das Ergebnis — der Agent beginnt bei Erhalt mit der Arbeit
client.beta.sessions.events.send(
    session_id=session.id,
    events=[
        {
            "type": "user.define_outcome",
            "description": "Build a DCF model for Costco in .xlsx",
            "rubric": {"type": "text", "content": RUBRIC},
            # oder: "rubric": {"type": "file", "file_id": rubric.id},
            "max_iterations": 5,  # optional; default 3, max 20
        }
    ],
)

Ergebnis-Events

Der Fortschritt bei einer ergebnisorientierten Session wird im Events-Stream angezeigt.

  • agent.*-Events (wie Nachrichten und Tool-Nutzung) zeigen den Fortschritt in Richtung des Ergebnisses.
  • span.outcome_evaluation_*-Events werden nur für ergebnisorientierte Sessions ausgegeben und zeigen die Anzahl der Iterationsschleifen und den Feedback-Prozess des Graders.
  • Du kannst auch user.message-Events an eine ergebnisorientierte Session senden, um die Arbeit des Agenten im Verlauf zu lenken, aber das ist nicht erforderlich: Der Agent arbeitet eigenständig auf das Ergebnis hin und iteriert, bis er erfolgreich ist oder die Iterationen aufgebraucht sind.
  • Ein user.interrupt-Event pausiert die Arbeit am aktuellen Ergebnis und markiert das span.outcome_evaluation_end.result als interrupted, sodass du ein neues Ergebnis starten kannst.
  • Nach der finalen Ergebnisbewertung kann die Session als Gesprächssession fortgesetzt werden, oder es kann ein neues Ergebnis gestartet werden. Die Session behält den Verlauf des vorherigen Ergebnisses bei.

Define-Outcome-User-Event

Dies ist das Event, das du sendest, um ein Ergebnis zu initiieren. Es wird beim Empfang zurückgespiegelt, einschließlich eines processed_at-Zeitstempels und einer outcome_id.

{
  "type": "user.define_outcome",
  "description": "Build a DCF model for Costco in .xlsx",
  "rubric": { "type": "file", "file_id": "file_01..." },
  "max_iterations": 5
}

Ergebnisbewertung Start

Wird ausgegeben, sobald der Grader eine Bewertung über eine Iterationsschleife startet. Das Feld iteration ist ein 0-indizierter Revisionszähler: 0 ist die erste Bewertung, 1 ist die erneute Bewertung nach der ersten Revision und so weiter.

{
  "type": "span.outcome_evaluation_start",
  "id": "sevt_01def...",
  "outcome_id": "outc_01a...",
  "iteration": 0,
  "processed_at": "2026-03-25T14:01:45Z"
}

Ergebnisbewertung laufend

Heartbeat, der ausgegeben wird, während der Grader läuft. Die interne Argumentation des Graders ist undurchsichtig: Du siehst, dass er arbeitet, nicht was er denkt.

{
  "type": "span.outcome_evaluation_ongoing",
  "id": "sevt_01ghi...",
  "outcome_id": "outc_01a...",
  "iteration": 0,
  "processed_at": "2026-03-25T14:02:10Z"
}

Ergebnisbewertung Ende

Wird ausgegeben, wenn ein Ergebnisbewertungszyklus endet: nachdem der Grader die Bewertung einer Iteration abgeschlossen hat, oder wenn die Session unterbrochen wird, während ein Ergebnis aktiv ist. Das Feld result gibt an, was als Nächstes passiert.

ResultNächstes
satisfiedSession wechselt zu idle.
needs_revisionAgent startet einen neuen Iterationszyklus.
max_iterations_reachedEine letzte Bestätigungsrunde folgt, bevor die Session zu idle wechselt. Es läuft keine weitere Bewertung.
failedSession wechselt zu idle. Wird zurückgegeben, wenn die Rubrik nicht auf die Deliverables zutrifft, zum Beispiel wenn sich die Beschreibung und die Rubrik widersprechen.
interruptedWird ausgegeben, wenn die Session unterbrochen wird, während ein Ergebnis aktiv ist, selbst wenn die Bewertung noch nicht begonnen hatte. Wenn vor der Unterbrechung kein outcome_evaluation_start ausgelöst wurde, ist outcome_evaluation_start_id ein leerer String.
{
  "type": "span.outcome_evaluation_end",
  "id": "sevt_01jkl...",
  "outcome_evaluation_start_id": "sevt_01def...",
  "outcome_id": "outc_01a...",
  "result": "satisfied",
  "explanation": "All 12 criteria met: revenue projections use 5 years of historical data, WACC assumptions are stated, sensitivity table is included...",
  "iteration": 0,
  "usage": {
    "input_tokens": 2400,
    "output_tokens": 350,
    "cache_creation_input_tokens": 0,
    "cache_read_input_tokens": 1800
  },
  "processed_at": "2026-03-25T14:03:00Z"
}

Ergebnisstatus prüfen

Du kannst entweder im Event-Stream auf span.outcome_evaluation_end lauschen oder GET /v1/sessions/{session_id} abfragen und outcome_evaluations[].result auslesen. Bis eine Bewertung abgeschlossen ist, meldet result pending, running oder evaluating:

session = client.beta.sessions.retrieve(session.id)

for outcome in session.outcome_evaluations:
    print(f"{outcome.outcome_id}: {outcome.result}")
    # outc_01a...: satisfied

Deliverables abrufen

Der Agent schreibt Ausgabedateien nach /mnt/session/outputs/ innerhalb der Sandbox. Um sie abzurufen, liste die Dateien über die Files API mit der Session-ID als scope_id auf und lade sie dann per ID herunter. Das Filtern nach scope_id erfordert den managed-agents-2026-04-01-Beta-Header bei der List-Anfrage, daher führen die SDK- und CLI-Beispiele diesen Aufruf über den beta-Namespace aus und übergeben den Header explizit. Dateien erscheinen kurz nachdem der Agent sie fertig geschrieben hat in der Liste, manchmal einige Sekunden nachdem die Session in den Leerlauf geht. Wenn eine von dir erwartete Datei noch nicht aufgelistet ist, liste nach einer kurzen Verzögerung erneut auf; sobald sie in der Liste erscheint, ist ihr Upload abgeschlossen.

# Liste die von dieser Session erzeugten Dateien auf
# scope_id-Filterung erfordert die managed-agents-Beta bei der Files-Anfrage
files = client.beta.files.list(scope_id=session.id, betas=["managed-agents-2026-04-01"])
for file in files:
    print(file.id, file.filename)

# Lade eine Datei herunter
if files.data:
    content = client.files.download(files.data[0].id)
    content.write_to_file("/tmp/output.txt")

Nächste Schritte

Registriere benutzerspezifische Anmeldedaten beim Erstellen von Sessions.

Sende Events, streame Antworten und unterbrich oder leite deine Session während der Ausführung um.

Lade Dateien hoch und binde sie in deine Sandbox zum Lesen und Verarbeiten ein.

Was this page helpful?