Skip to main content

SseEncoder

Struct SseEncoder 

Source
pub struct SseEncoder {
    pub id: String,
    pub model: String,
    pub created: u64,
}
Expand description

Stateful encoder that produces OpenAI-shape SSE frames for one response.

The id, model, and created fields are stable across all frames the encoder produces, matching the OpenAI streaming contract.

Fields§

§id: String

Stable response id, e.g. "chatcmpl-…".

§model: String

Model name as advertised to the client (NOT the upstream alias).

§created: u64

Unix epoch seconds when the response was created.

Implementations§

Source§

impl SseEncoder

Source

pub fn new( id: impl Into<String>, model: impl Into<String>, created: u64, ) -> Self

Construct a new encoder with the stable response metadata.

Source

pub fn encode(&self, event: &LlmStreamEvent) -> Option<String>

Encode a single LlmStreamEvent into one or more SSE frames.

Returns None when the event is not meant to appear on the wire (e.g. LlmStreamEvent::NormalizationError, which the proxy logs but never forwards to clients).

For LlmStreamEvent::Done, the returned String is only the terminating chunk (with finish_reason set) — it deliberately does not include the trailing data: [DONE]\n\n sentinel (DONE_SENTINEL). Done is not guaranteed to be the last event on the wire: a trailing LlmStreamEvent::Usage can legitimately arrive afterward (see that variant’s doc), and nothing may follow [DONE] once it’s sent. Callers must append DONE_SENTINEL themselves, exactly once, only after the entire event stream is truly exhausted.

Source

fn usage_frame( &self, prompt_tokens: u32, completion_tokens: u32, total_tokens: u32, cached_tokens: Option<u32>, ) -> String

Encode a LlmStreamEvent::Usage event.

Per the OpenAI stream_options.include_usage convention, the usage-totals chunk carries an empty choices array (not omitted — see crate::LlmStreamEvent::Usage doc) and a top-level usage object.

Source

fn upstream_error_frame(message: &str, error_type: &str, code: &str) -> String

Encode a LlmStreamEvent::UpstreamError event.

Deliberately bare — no id/object/created/model envelope and, crucially, no choices key at all (unlike every other frame this encoder produces). Clients such as the GitHub Copilot LLM Gateway extension detect this exact shape ('error' in obj && !('choices' in obj)) to recognise an inline mid-stream failure; wrapping it in the usual envelope or adding an empty choices: [] would hide it as an ordinary chunk instead.

Does not append DONE_SENTINEL — see Self::encode doc; the caller appends it exactly once after the stream is truly exhausted.

Source

fn frame(&self, choice: &Value) -> String

Wrap a choice value in the standard chunk envelope and SSE framing.

Trait Implementations§

Source§

impl Clone for SseEncoder

Source§

fn clone(&self) -> SseEncoder

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SseEncoder

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.
§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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