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 LLMSuccessWithImages: Successful execution with JSON result plus imagesToolError: 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.
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.
Implementations§
Source§impl ToolExecutionResult
impl ToolExecutionResult
Sourcepub fn success_with_raw_output(
value: impl Into<Value>,
raw_output: String,
) -> Self
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().
Sourcepub fn success_with_images(
value: impl Into<Value>,
images: Vec<ToolResultImage>,
) -> Self
pub fn success_with_images( value: impl Into<Value>, images: Vec<ToolResultImage>, ) -> Self
Create a successful result with images
Sourcepub fn tool_error(message: impl Into<String>) -> Self
pub fn tool_error(message: impl Into<String>) -> Self
Create a tool-level error (safe to show to LLM)
Sourcepub fn internal_error(error: impl Error + Send + Sync + 'static) -> Self
pub fn internal_error(error: impl Error + Send + Sync + 'static) -> Self
Create an internal error (will be hidden from LLM)
Sourcepub fn internal_error_msg(message: impl Into<String>) -> Self
pub fn internal_error_msg(message: impl Into<String>) -> Self
Create an internal error from a string message
Sourcepub fn connection_required(provider: impl Into<String>) -> Self
pub fn connection_required(provider: impl Into<String>) -> Self
Signal that a user connection is required before this tool can execute.
Sourcepub fn is_success(&self) -> bool
pub fn is_success(&self) -> bool
Check if this is a successful result
Sourcepub fn is_connection_required(&self) -> bool
pub fn is_connection_required(&self) -> bool
Check if this requires a user connection setup
Sourcepub fn into_tool_result(self, tool_call_id: &str, tool_name: &str) -> ToolResult
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§
Auto Trait Implementations§
impl !RefUnwindSafe for ToolExecutionResult
impl !UnwindSafe for ToolExecutionResult
impl Freeze for ToolExecutionResult
impl Send for ToolExecutionResult
impl Sync for ToolExecutionResult
impl Unpin for ToolExecutionResult
impl UnsafeUnpin for ToolExecutionResult
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request