El outcome eleva una sesión de conversación a trabajo. Tú defines cómo debe verse el resultado final y cómo medir la calidad. El agente trabaja hacia ese objetivo, autoevaluándose e iterando hasta que se cumple el resultado.
Cuando defines un resultado, el harness aprovisiona automáticamente un grader (evaluador) para evaluar el artefacto según una rúbrica. El evaluador usa una "context window" (ventana de contexto) separada para evitar verse influenciado por las decisiones de implementación del agente principal.
El evaluador devuelve una explicación que resume qué criterios se cumplieron o no, o confirma que el artefacto satisface la rúbrica. Esa retroalimentación se devuelve al agente para la siguiente iteración.
Todas las solicitudes a la Managed Agents API requieren el encabezado beta managed-agents-2026-04-01. El SDK establece el encabezado beta automáticamente.
Una rúbrica es un documento en markdown que describe la puntuación por criterio. La rúbrica es obligatoria.
Ejemplo de rúbrica:
# 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 includedPasa la rúbrica como texto en línea en user.define_outcome (consulta la siguiente sección), o súbela a través de la Files API para reutilizarla en varias sesiones.
Subir a través de la Files API requiere los encabezados beta managed-agents-2026-04-01 y files-api-2025-04-14.
rubric = client.beta.files.upload(file=Path("/tmp/rubric.md"))
print(f"Uploaded rubric: {rubric.id}")Después de crear una sesión, envía un evento user.define_outcome. El agente comienza a trabajar de inmediato; no se requiere ningún evento adicional de mensaje de usuario.
# Crea una sesión
session = client.beta.sessions.create(
agent=agent.id,
environment_id=environment.id,
title="Financial analysis on Costco",
)
# Define el resultado — el agente empieza a trabajar al recibirlo
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},
# o: "rubric": {"type": "file", "file_id": rubric.id},
"max_iterations": 5, # optional; default 3, max 20
}
],
)El progreso en una sesión orientada a resultados se muestra en el stream de eventos.
agent.* (como mensajes y uso de herramientas) muestran el progreso hacia el resultado.span.outcome_evaluation_* solo se emiten para sesiones orientadas a resultados y muestran el número de ciclos de iteración y el proceso de retroalimentación del evaluador.user.message a una sesión orientada a resultados para dirigir el trabajo del agente a medida que avanza, pero no es obligatorio: el agente trabaja hacia el resultado por su cuenta, iterando hasta que tiene éxito o se queda sin iteraciones.user.interrupt pausa el trabajo en el resultado actual y marca span.outcome_evaluation_end.result como interrupted, lo que te permite iniciar un nuevo resultado.Solo se admite un resultado a la vez, pero puedes encadenar resultados en secuencia. Para hacerlo, envía un nuevo evento user.define_outcome después del evento terminal del resultado anterior.
Este es el evento que envías para iniciar un resultado. Se devuelve como eco al recibirse, incluyendo una marca de tiempo processed_at y un 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
}Se emite una vez que el evaluador inicia una evaluación sobre un ciclo de iteración. El campo iteration es un contador de revisiones con índice base 0: 0 es la primera evaluación, 1 es la reevaluación después de la primera revisión, y así sucesivamente.
{
"type": "span.outcome_evaluation_start",
"id": "sevt_01def...",
"outcome_id": "outc_01a...",
"iteration": 0,
"processed_at": "2026-03-25T14:01:45Z"
}Heartbeat emitido mientras el evaluador se ejecuta. El razonamiento interno del evaluador es opaco: ves que está trabajando, no lo que está pensando.
{
"type": "span.outcome_evaluation_ongoing",
"id": "sevt_01ghi...",
"outcome_id": "outc_01a...",
"processed_at": "2026-03-25T14:02:10Z"
}Se emite después de que el evaluador termina de evaluar una iteración. El campo result indica qué sucede a continuación.
| Resultado | Siguiente paso |
|---|---|
satisfied | La sesión pasa a idle. |
needs_revision | El agente inicia un nuevo ciclo de iteración. |
max_iterations_reached | No hay más ciclos de evaluación. El agente puede ejecutar una revisión final antes de que la sesión pase a idle. |
failed | La sesión pasa a idle. Se devuelve cuando la rúbrica fundamentalmente no coincide con la tarea, por ejemplo, si la descripción y la rúbrica se contradicen entre sí. |
interrupted | Solo se emite si outcome_evaluation_start ya se disparó antes de la interrupción. |
{
"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"
}Puedes escuchar en el stream de eventos el evento span.outcome_evaluation_end, o hacer polling a GET /v1/sessions/:id y leer outcome_evaluations[].result:
session = client.beta.sessions.retrieve(session.id)
for outcome in session.outcome_evaluations:
print(f"{outcome.outcome_id}: {outcome.result}")
# outc_01a...: satisfiedEl agente escribe los archivos de salida en /mnt/session/outputs/ dentro del sandbox. Una vez que la sesión está en estado idle, recupéralos a través de la Files API con alcance a la sesión:
# Lista los archivos producidos por esta sesión
files = client.beta.files.list(scope_id=session.id)
for f in files:
print(f.id, f.filename)
# Descarga un archivo
if files.data:
content = client.beta.files.download(files.data[0].id)
content.write_to_file("/tmp/output.txt")Was this page helpful?