|
|
from __future__ import annotations |
|
|
|
|
|
from dataclasses import dataclass |
|
|
from typing import TYPE_CHECKING, Any |
|
|
|
|
|
if TYPE_CHECKING: |
|
|
from .agent import Agent |
|
|
from .guardrail import InputGuardrailResult, OutputGuardrailResult |
|
|
from .items import ModelResponse, RunItem, TResponseInputItem |
|
|
from .run_context import RunContextWrapper |
|
|
from .tool_guardrails import ( |
|
|
ToolGuardrailFunctionOutput, |
|
|
ToolInputGuardrail, |
|
|
ToolOutputGuardrail, |
|
|
) |
|
|
|
|
|
from .util._pretty_print import pretty_print_run_error_details |
|
|
|
|
|
|
|
|
@dataclass |
|
|
class RunErrorDetails: |
|
|
"""Data collected from an agent run when an exception occurs.""" |
|
|
|
|
|
input: str | list[TResponseInputItem] |
|
|
new_items: list[RunItem] |
|
|
raw_responses: list[ModelResponse] |
|
|
last_agent: Agent[Any] |
|
|
context_wrapper: RunContextWrapper[Any] |
|
|
input_guardrail_results: list[InputGuardrailResult] |
|
|
output_guardrail_results: list[OutputGuardrailResult] |
|
|
|
|
|
def __str__(self) -> str: |
|
|
return pretty_print_run_error_details(self) |
|
|
|
|
|
|
|
|
class AgentsException(Exception): |
|
|
"""Base class for all exceptions in the Agents SDK.""" |
|
|
|
|
|
run_data: RunErrorDetails | None |
|
|
|
|
|
def __init__(self, *args: object) -> None: |
|
|
super().__init__(*args) |
|
|
self.run_data = None |
|
|
|
|
|
|
|
|
class MaxTurnsExceeded(AgentsException): |
|
|
"""Exception raised when the maximum number of turns is exceeded.""" |
|
|
|
|
|
message: str |
|
|
|
|
|
def __init__(self, message: str): |
|
|
self.message = message |
|
|
super().__init__(message) |
|
|
|
|
|
|
|
|
class ModelBehaviorError(AgentsException): |
|
|
"""Exception raised when the model does something unexpected, e.g. calling a tool that doesn't |
|
|
exist, or providing malformed JSON. |
|
|
""" |
|
|
|
|
|
message: str |
|
|
|
|
|
def __init__(self, message: str): |
|
|
self.message = message |
|
|
super().__init__(message) |
|
|
|
|
|
|
|
|
class UserError(AgentsException): |
|
|
"""Exception raised when the user makes an error using the SDK.""" |
|
|
|
|
|
message: str |
|
|
|
|
|
def __init__(self, message: str): |
|
|
self.message = message |
|
|
super().__init__(message) |
|
|
|
|
|
|
|
|
class InputGuardrailTripwireTriggered(AgentsException): |
|
|
"""Exception raised when a guardrail tripwire is triggered.""" |
|
|
|
|
|
guardrail_result: InputGuardrailResult |
|
|
"""The result data of the guardrail that was triggered.""" |
|
|
|
|
|
def __init__(self, guardrail_result: InputGuardrailResult): |
|
|
self.guardrail_result = guardrail_result |
|
|
super().__init__( |
|
|
f"Guardrail {guardrail_result.guardrail.__class__.__name__} triggered tripwire" |
|
|
) |
|
|
|
|
|
|
|
|
class OutputGuardrailTripwireTriggered(AgentsException): |
|
|
"""Exception raised when a guardrail tripwire is triggered.""" |
|
|
|
|
|
guardrail_result: OutputGuardrailResult |
|
|
"""The result data of the guardrail that was triggered.""" |
|
|
|
|
|
def __init__(self, guardrail_result: OutputGuardrailResult): |
|
|
self.guardrail_result = guardrail_result |
|
|
super().__init__( |
|
|
f"Guardrail {guardrail_result.guardrail.__class__.__name__} triggered tripwire" |
|
|
) |
|
|
|
|
|
|
|
|
class ToolInputGuardrailTripwireTriggered(AgentsException): |
|
|
"""Exception raised when a tool input guardrail tripwire is triggered.""" |
|
|
|
|
|
guardrail: ToolInputGuardrail[Any] |
|
|
"""The guardrail that was triggered.""" |
|
|
|
|
|
output: ToolGuardrailFunctionOutput |
|
|
"""The output from the guardrail function.""" |
|
|
|
|
|
def __init__(self, guardrail: ToolInputGuardrail[Any], output: ToolGuardrailFunctionOutput): |
|
|
self.guardrail = guardrail |
|
|
self.output = output |
|
|
super().__init__(f"Tool input guardrail {guardrail.__class__.__name__} triggered tripwire") |
|
|
|
|
|
|
|
|
class ToolOutputGuardrailTripwireTriggered(AgentsException): |
|
|
"""Exception raised when a tool output guardrail tripwire is triggered.""" |
|
|
|
|
|
guardrail: ToolOutputGuardrail[Any] |
|
|
"""The guardrail that was triggered.""" |
|
|
|
|
|
output: ToolGuardrailFunctionOutput |
|
|
"""The output from the guardrail function.""" |
|
|
|
|
|
def __init__(self, guardrail: ToolOutputGuardrail[Any], output: ToolGuardrailFunctionOutput): |
|
|
self.guardrail = guardrail |
|
|
self.output = output |
|
|
super().__init__(f"Tool output guardrail {guardrail.__class__.__name__} triggered tripwire") |
|
|
|