Skip to main content

ToolExecutionResult

Enum ToolExecutionResult 

Source
pub enum ToolExecutionResult {
    Success(Value),
    SuccessWithImages {
        result: Value,
        images: Vec<ToolResultImage>,
    },
    ToolError(String),
    InternalError(ToolInternalError),
    ConnectionRequired {
        provider: String,
    },
}
Expand description

Result of a tool execution.

This enum distinguishes between different outcomes:

  • Success: Tool executed successfully, result is returned to LLM
  • SuccessWithImages: Successful execution with JSON result plus images
  • ToolError: Tool-level error that should be shown to the LLM (e.g., “City not found”, “Invalid date format”)
  • InternalError: System-level error that should NOT be exposed to the LLM (e.g., database connection failure, API key issues)

§Security

Internal errors are logged but replaced with a generic message when returned to the LLM. This prevents leaking sensitive information like database errors, API keys, or internal system details.

Variants§

§

Success(Value)

Successful execution with a JSON result

§

SuccessWithImages

Successful execution with a JSON result and images. Images are sent to the LLM as native image content blocks (not stringified JSON), enabling visual understanding.

Fields

§result: Value
§

ToolError(String)

Tool-level error that is safe to show to the LLM

Use this for expected error conditions that the LLM should know about, such as validation errors, resource not found, etc.

§

InternalError(ToolInternalError)

Internal/system error that should NOT be exposed to the LLM

Use this for unexpected errors like network failures, database errors, or other internal issues. The error details will be logged but replaced with a generic message when returned to the LLM.

§

ConnectionRequired

A user connection is required to execute this tool.

Instead of returning an error, this signals that the workflow should pause and ask the client to set up a connection for the given provider. The UI renders an inline connection dialog; once the user saves (or cancels), a tool result is submitted and execution resumes.

Fields

§provider: String

Connection provider id (e.g. “daytona”, “brave_search”)

Implementations§

Source§

impl ToolExecutionResult

Source

pub fn success(value: impl Into<Value>) -> Self

Create a successful result

Source

pub fn success_with_raw_output( value: impl Into<Value>, raw_output: String, ) -> Self

Create a successful result with pre-truncation raw output for VFS persistence. The raw output is transferred to ToolResult.raw_output during into_tool_result().

Source

pub fn success_with_images( value: impl Into<Value>, images: Vec<ToolResultImage>, ) -> Self

Create a successful result with images

Source

pub fn tool_error(message: impl Into<String>) -> Self

Create a tool-level error (safe to show to LLM)

Source

pub fn internal_error(error: impl Error + Send + Sync + 'static) -> Self

Create an internal error (will be hidden from LLM)

Source

pub fn internal_error_msg(message: impl Into<String>) -> Self

Create an internal error from a string message

Source

pub fn connection_required(provider: impl Into<String>) -> Self

Signal that a user connection is required before this tool can execute.

Source

pub fn is_success(&self) -> bool

Check if this is a successful result

Source

pub fn is_error(&self) -> bool

Check if this is an error (either tool error or internal error)

Source

pub fn is_connection_required(&self) -> bool

Check if this requires a user connection setup

Source

pub fn into_tool_result(self, tool_call_id: &str, tool_name: &str) -> ToolResult

Convert to a ToolResult for the agent loop

Both tool errors and internal errors are packaged as {"error": "..."} in the result field. This provides a consistent contract where the result field always contains the payload, and the agent loop continues the same way for all outcomes.

Internal errors are logged but replaced with a generic message when returned.

Trait Implementations§

Source§

impl Debug for ToolExecutionResult

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> ParallelSend for T

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more