pub struct InferenceResult {
pub text: String,
pub tool_calls: Vec<ToolCall>,
pub bounding_boxes: Vec<BoundingBox>,
pub trace_id: String,
pub model_used: String,
pub latency_ms: u64,
pub time_to_first_token_ms: Option<u64>,
pub usage: Option<TokenUsage>,
pub provider_output_items: Vec<Value>,
}Expand description
Result of an inference call, including trace ID for outcome tracking.
Fields§
§text: StringThe generated text (empty if tool_calls are present).
tool_calls: Vec<ToolCall>Tool calls returned by the model (when tools were provided in the request).
bounding_boxes: Vec<BoundingBox>Structured bounding boxes when the model emitted Qwen2.5-VL
grounding spans (<|box_*|>, <|object_ref_*|>) in its text.
Parsed from the same text field — the raw span markers remain
visible in text for callers that need to see them verbatim.
Empty vec when the model didn’t ground anything (typical for
non-VL models or prompts that only ask for description).
trace_id: StringTrace ID for reporting outcomes back to the tracker.
model_used: StringWhich model was used.
latency_ms: u64Wall-clock latency in ms.
time_to_first_token_ms: Option<u64>Time to first token in milliseconds. Populated by the local
generate paths (Candle/MLX) which observe the prefill→first-decode
transition directly. None for paths that can’t measure it
honestly without streaming — currently the non-streaming remote
paths. Callers needing TTFT on remote models should use
InferenceEngine::generate_tracked_stream and time the first
text event arrival themselves.
Always serialized (as null when None) so downstream
validation harnesses can distinguish “wasn’t measured” from
“field doesn’t exist on this client’s protocol version”.
usage: Option<TokenUsage>Token usage statistics from the API response (None for local models).
provider_output_items: Vec<Value>Provider-specific output items the protocol emitted alongside the response — currently used by the OpenAI Responses API to return reasoning blobs, encrypted_content, web-search results, etc. as opaque structured items the next request must include verbatim. Empty for protocols that don’t emit them (Chat Completions, Anthropic, Gemini, all local backends).
Callers carry these between turns by emitting them as a
tasks::generate::Message::ProviderOutputItems message in
the next request. Builder paths that don’t recognize the
originating protocol drop the variant — the items are
protocol-specific and have no portable rendering.
Implementations§
Source§impl InferenceResult
impl InferenceResult
Sourcepub fn has_tool_calls(&self) -> bool
pub fn has_tool_calls(&self) -> bool
Returns true if the model chose to call tools instead of generating text.
Trait Implementations§
Source§impl Clone for InferenceResult
impl Clone for InferenceResult
Source§fn clone(&self) -> InferenceResult
fn clone(&self) -> InferenceResult
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for InferenceResult
impl Debug for InferenceResult
Source§impl<'de> Deserialize<'de> for InferenceResult
impl<'de> Deserialize<'de> for InferenceResult
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for InferenceResult
impl RefUnwindSafe for InferenceResult
impl Send for InferenceResult
impl Sync for InferenceResult
impl Unpin for InferenceResult
impl UnsafeUnpin for InferenceResult
impl UnwindSafe for InferenceResult
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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 more