pub struct LlmExtractor { /* private fields */ }Expand description
LLM-backed turn extractor that sends transcript windows to an OOB LLM with a structured extraction prompt.
Implementations§
Source§impl LlmExtractor
impl LlmExtractor
Sourcepub fn new(
name: impl Into<String>,
llm: Arc<dyn BaseLlm>,
prompt: impl Into<String>,
window_size: usize,
) -> LlmExtractor
pub fn new( name: impl Into<String>, llm: Arc<dyn BaseLlm>, prompt: impl Into<String>, window_size: usize, ) -> LlmExtractor
Create a new LLM-backed extractor.
name: key for storing results in Statellm: the out-of-band LLM to use for extractionprompt: system instruction describing what to extractwindow_size: how many recent turns to include
Sourcepub fn with_thinking_budget(self, budget: Option<u32>) -> LlmExtractor
pub fn with_thinking_budget(self, budget: Option<u32>) -> LlmExtractor
Set the thinking budget sent with each extraction request.
The default is Some(0): extraction reads a few turns, and the turn
pipeline waits for it, so thinking costs seconds of latency on every
turn. Measured on gemini-flash-latest, a budget of 0 cut a short
extraction from 7.7 s to 2.3 s with the same results. None leaves
the model’s default. When a model rejects a budget of 0 (some only
work in thinking mode, and gemini-3.5-flash-lite needs at least 1),
the extractor retries with FALLBACK_THINKING_BUDGET, then without
a budget, and keeps sending the first one the model accepted.
Sourcepub fn with_min_words(self, n: usize) -> LlmExtractor
pub fn with_min_words(self, n: usize) -> LlmExtractor
Set the minimum word count in the last user utterance to trigger extraction.
Turns where the user said fewer than n words will skip the LLM call.
Useful for filtering out “uh huh”, “ok”, “yes” style responses.
Sourcepub fn with_schema(self, schema: Value) -> LlmExtractor
pub fn with_schema(self, schema: Value) -> LlmExtractor
Set a JSON Schema for structured output.
When set, the schema is included in the prompt to guide the LLM toward producing valid JSON matching the schema.
Sourcepub fn with_trigger(self, trigger: ExtractionTrigger) -> LlmExtractor
pub fn with_trigger(self, trigger: ExtractionTrigger) -> LlmExtractor
Set the trigger mode for this extractor.
Sourcepub fn with_promotions(self, rules: Vec<FieldPromotion>) -> LlmExtractor
pub fn with_promotions(self, rules: Vec<FieldPromotion>) -> LlmExtractor
Set explicit field promotion rules.
Once promotion rules are present, top-level fields are no longer automatically flattened into state; only accepted rules promote.
Trait Implementations§
Source§impl TurnExtractor for LlmExtractor
impl TurnExtractor for LlmExtractor
Source§fn extract_with_state<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
window: &'life1 [TranscriptTurn],
state: &'life2 State,
) -> Pin<Box<dyn Future<Output = Result<Value, LlmError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
LlmExtractor: 'async_trait,
fn extract_with_state<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
window: &'life1 [TranscriptTurn],
state: &'life2 State,
) -> Pin<Box<dyn Future<Output = Result<Value, LlmError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
LlmExtractor: 'async_trait,
Extract, telling the model which fields are already known so it returns only what the latest turn adds or changes.
Source§fn window_size(&self) -> usize
fn window_size(&self) -> usize
Source§fn should_extract(&self, window: &[TranscriptTurn]) -> bool
fn should_extract(&self, window: &[TranscriptTurn]) -> bool
Source§fn trigger(&self) -> ExtractionTrigger
fn trigger(&self) -> ExtractionTrigger
Source§fn promotion_rules(&self) -> &[FieldPromotion]
fn promotion_rules(&self) -> &[FieldPromotion]
Source§fn may_write(&self, key: &str) -> bool
fn may_write(&self, key: &str) -> bool
key. Read moreSource§fn extract<'life0, 'life1, 'async_trait>(
&'life0 self,
window: &'life1 [TranscriptTurn],
) -> Pin<Box<dyn Future<Output = Result<Value, LlmError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
LlmExtractor: 'async_trait,
fn extract<'life0, 'life1, 'async_trait>(
&'life0 self,
window: &'life1 [TranscriptTurn],
) -> Pin<Box<dyn Future<Output = Result<Value, LlmError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
LlmExtractor: 'async_trait,
Source§fn on_complete(&self) -> Option<OnComplete>
fn on_complete(&self) -> Option<OnComplete>
on_complete(dispatch(agent)) effect. Fired by the pipeline after
promotion, only when the extractor produced a non-empty object.Auto Trait Implementations§
impl !Freeze for LlmExtractor
impl !RefUnwindSafe for LlmExtractor
impl !UnwindSafe for LlmExtractor
impl Send for LlmExtractor
impl Sync for LlmExtractor
impl Unpin for LlmExtractor
impl UnsafeUnpin for LlmExtractor
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
§impl<T> Conv for T
impl<T> Conv for T
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> 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§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.