Errors signalled by deputy have class deputy_error plus more specific
classes, so you can catch them by class with tryCatch(). Many carry extra
fields, such as tool_name or limit. Errors from ellmer or the provider,
such as HTTP errors, are passed through unchanged.
Error classes
deputy_error: every deputy error.deputy_permission_denied(alsodeputy_permission): an action wasn't allowed.deputy_tool_execution(alsodeputy_tool): a tool failed.deputy_budget: a usage limit was reached. Only signalled whenUsageLimits()hason_exceed = "error".deputy_request_limit:max_requestswas reached.deputy_cost_unavailable:max_cost_usdis set but a response's cost is unknown.deputy_budget_exceeded: a tool-call, token or cost limit was reached. The error'sbudget_type,actualandlimitfields say which.
deputy_session_load,deputy_session_save(alsodeputy_session): loading or saving a session file failed.deputy_human_input_unavailable: anask_userrequest couldn't reach a person, for example in a non-interactive session with no handler.
Other deputy errors, such as deputy_run_active (the agent is already
running), also inherit from deputy_error.
Usage
tryCatch(
agent$run_sync("task"),
deputy_budget = function(e) {
message("Usage limit reached: ", conditionMessage(e))
},
deputy_error = function(e) {
message("Deputy error: ", conditionMessage(e))
}
)