Skip to content

Managed Agents event stream doesn't surface model refusal stop_reason / stop_details #1664

Description

@jpsorensen-asimov

Summary

On the Messages API, a safety refusal is reported via stop_reason="refusal" plus
stop_details (RefusalStopDetails, with category = bio | cyber). The Managed
Agents session event stream appears to have no equivalent, so a consumer can't tell
that a turn ended due to a model refusal (or which category).

Details

Verified against main and the latest release (v0.107.1):

  • BetaManagedAgentsSessionStatusIdleEvent.stop_reason is a union of only
    BetaManagedAgentsSessionEndTurn | BetaManagedAgentsSessionRequiresAction | BetaManagedAgentsSessionRetriesExhausted — no refusal variant.
    (src/anthropic/types/beta/sessions/beta_managed_agents_session_status_idle_event.py)

  • BetaManagedAgentsSpanModelRequestEndEvent exposes is_error and model_usage
    but no stop_reason / stop_details.
    (src/anthropic/types/beta/sessions/beta_managed_agents_span_model_request_end_event.py)

For comparison, the Messages API Message carries stop_reason (includes "refusal")
and stop_details (RefusalStopDetails). The BetaStopReason enum also lists
"refusal", but the session-idle event's stop_reason union does not include it.

Initial analysis — needs confirmation

A prompt that triggers a refusal on the Messages API appears, in a Managed Agents
session, to produce a turn with little/no text after which the session goes idle,
with no event field indicating a refusal occurred.

Possible resolution: include a refusal variant in the session.status_idle
stop_reason union, and/or surface the underlying model stop_reason / stop_details
on span.model_request_end.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions