Skip to main content

ModelStream

Struct ModelStream 

Source
pub struct ModelStream {
    pub stream: BoxDeltaStream<'static>,
    pub completion: BoxFuture<'static, Result<ModelResponse, Error>>,
}
Expand description

Streaming dispatch result returned by Service<ModelInvocation, Response = ModelStream> — the caller-visible delta stream paired with a future that resolves to the aggregated terminal response.

The Self::stream field carries the raw StreamDelta flow (text chunks, tool-use boundaries, usage, rate-limit, warnings, terminal Stop). The Self::completion future resolves to Ok(ModelResponse) after the stream has been fully consumed AND a StreamAggregator has reconstructed the final response; it resolves to Err(...) if the stream errored mid-flight, was dropped before terminal Stop, or violated the aggregator’s protocol invariants.

Layers (OtelLayer, PolicyLayer) wrap completion to emit observability / cost events on the Ok branch only — invariant 12. A stream that errors mid-flight surfaces the error through the consumer’s stream-side Err and through completion resolving to Err; either way, no cost charge fires.

completion is internally driven by the same stream stream carries — consumers do not need to poll it separately. The aggregator runs as the consumer drains the stream; completion resolves naturally when the consumer reads the terminal Stop (or drops the stream early, in which case completion resolves Err).

Fields§

§stream: BoxDeltaStream<'static>

Raw delta stream surfaced to the caller. The wrapper produced by entelix_core::stream::tap_aggregator taps each delta into a StreamAggregator as it flows past, so the caller sees an unmodified stream while Self::completion receives the aggregated final response without a second pass.

§completion: BoxFuture<'static, Result<ModelResponse, Error>>

Future resolving to the aggregated ModelResponse after the stream has been consumed to its terminal Stop. Layers wrap this future to gate observability emission on success (invariant 12). Consumers that ignore the streaming-side completion (e.g. wire it into a fire-and-forget OTel layer) do not need to await it directly — dropping the ModelStream is the canonical “I’m done” signal that lets any wrapping layer observe stream-completion regardless of whether the consumer polled completion itself.

Trait Implementations§

Source§

impl Debug for ModelStream

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<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: 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: 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> 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<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