Skip to main content

LiveSessionBuilder

Struct LiveSessionBuilder 

Source
pub struct LiveSessionBuilder { /* private fields */ }
Expand description

Builder for a callback-driven Live session.

Combines SessionConfig, EventCallbacks, tool dispatching, extractors, computed state, phase machines, watchers, and temporal patterns into a single connection setup. Call connect() to establish the WebSocket connection and start the three-lane event processor.

For ergonomic usage, prefer the L2 Live builder from gemini-adk-fluent-rs which wraps this with a fluent API.

Implementations§

Source§

impl LiveSessionBuilder

Source

pub fn new(config: SessionConfig) -> Self

Create a new builder with the given session config.

Source

pub fn tasks(self, tasks: TaskRuntime) -> Self

Install a catalog of independently owned tasks in this voice session.

Task commands and completions run on the control lane. A task session cannot also install session-wide governance or state-changing pipelines.

Source

pub fn redaction(self, redactor: TranscriptRedactor) -> Self

Install transcript redaction — see redaction::TranscriptRedactor.

Applied at the event router, before callbacks, the transcript buffer, extraction, or persistence see the text. An inactive redactor (no rules enabled) is dropped rather than installed.

Source

pub fn clock(self, clock: SharedClock) -> Self

Read the time from clock instead of the system clock.

Installed on the session State (see State::set_clock), so temporal patterns, phase durations, resolver cache expiry, the session: timing signals and journal timestamps all follow it. Pass a ManualClock to make timing decisions reproducible in tests; replay installs one driven by the recording.

Source

pub fn middleware(self, layer: Arc<dyn Middleware>) -> Self

Add a middleware layer.

Layers run around tool dispatch in the control lane: before_tool (a returned error vetoes the call), after_tool, and on_tool_error. Multiple calls accumulate in order.

Source

pub fn flow_monitor(self, monitor: FlowMonitor) -> Self

Attach a governed-flow monitor (built from a Flow + Mode). The monitor becomes the main layer of a FlowStack with no digressions.

Source

pub fn flow_stack(self, stack: FlowStack) -> Self

Attach a governed-flow stack: the main flow plus its digressions and repair policies. This is the one governance object the control plane drives; flow_monitor is the no-digression special case.

Source

pub fn decisions(self, decisions: Arc<Decisions>) -> Self

The questions a decision model answers about the conversation, for guards that use the decided atom (see crate::flow::decided).

At each decision point (the caller’s turn ends, or the model calls a tool) the runtime asks, in one request, the questions the flow can act on then, plus the standing ones, against the rolling conversation and the active stages’ grounding lines. A tool call is admitted after its questions are answered for the caller’s latest words, and a digression whose trigger they satisfy opens before the call is admitted.

Source

pub fn state(self, state: State) -> Self

Provide a pre-created State to use for this session.

If not set, a new State is created at connect time. Use this when the State needs to be shared with tools or other components before the session connects.

Source

pub fn greeting(self, prompt: impl Into<String>) -> Self

Set a greeting prompt sent on connect to trigger the model to speak first.

Source

pub fn code_mode(self, code: CodeMode) -> Self

Give the model a code tool: it runs a short Python program whose functions are the session’s tools, each call down the same governed path as a direct call. See code_mode.

Source

pub fn dispatcher(self, dispatcher: ToolDispatcher) -> Self

Set the tool dispatcher for auto-dispatch of tool calls.

Source

pub fn callbacks(self, callbacks: EventCallbacks) -> Self

Set the event callbacks.

Source

pub fn extractor(self, extractor: Arc<dyn TurnExtractor>) -> Self

Add a turn extractor that runs between turns.

Source

pub fn computed(self, registry: ComputedRegistry) -> Self

Set the computed variable registry for derived state.

Source

pub fn phase_machine(self, machine: PhaseMachine) -> Self

Set the phase machine for declarative conversation phase management.

Source

pub fn watchers(self, registry: WatcherRegistry) -> Self

Set the watcher registry for state change watchers.

Source

pub fn temporal(self, registry: TemporalRegistry) -> Self

Set the temporal pattern registry.

Source

pub fn tool_execution_mode( self, tool_name: impl Into<String>, mode: ToolExecutionMode, ) -> Self

Set the execution mode for a named tool.

Tools default to ToolExecutionMode::Standard. Set to ToolExecutionMode::Background for zero-dead-air execution.

Source

pub fn soft_turn_timeout(self, timeout: Duration) -> Self

Enable soft turn detection for proactive silence awareness.

When proactiveAudio is enabled, the model may choose not to respond. This sets a timeout after VAD end — if the model stays silent, a lightweight “soft turn” fires to keep state updated without forcing the model to speak.

Source

pub fn steering_mode(self, mode: SteeringMode) -> Self

Set the steering mode for how the phase machine delivers instructions.

A task session (see tasks) on a model that accepts contextUpdate declares only the foreground skill’s tools unless this sets a mode other than SteeringMode::ContextUpdate.

Source

pub fn context_delivery(self, mode: ContextDelivery) -> Self

Set the context delivery timing.

  • Immediate (default): send batched context during TurnComplete.
  • Deferred: queue context and flush with next user send.
Source

pub fn delivery(self, delivery: DeliveryConfig) -> Self

Set the fast-lane delivery (backpressure) policy per event class.

Defaults to all-Lossless, which preserves the historical send().await routing behavior. Opt classes into LossyDropNewest to keep the router from stalling when a fast-lane consumer falls behind.

Source

pub fn repair(self, config: RepairConfig) -> Self

Enable the conversation repair protocol.

Tracks need fulfillment per phase and nudges the model when the conversation stalls on gathering required information.

Source

pub fn persistence(self, backend: Arc<dyn SessionPersistence>) -> Self

Set a session persistence backend for surviving process restarts.

Source

pub fn session_id(self, id: impl Into<String>) -> Self

Set the session ID for persistence.

Source

pub fn tool_advisory(self, enabled: bool) -> Self

Enable or disable tool availability advisory on phase transitions.

Source

pub fn telemetry_interval(self, interval: Duration) -> Self

Set the periodic telemetry emission interval.

When set, the processor periodically emits LiveEvent::Telemetry and LiveEvent::TurnMetrics to the event stream.

Source

pub fn event_capacity(self, capacity: usize) -> Self

Set how many LiveEvents a subscriber can fall behind before it starts skipping the oldest ones.

The buffer behind LiveHandle::events is allocated in full when the session starts, at roughly 170 bytes per slot, whether or not anyone subscribes. The default, DEFAULT_EVENT_CAPACITY, is enough for a subscriber that hands each event on without waiting. Raise it when a subscriber does slow work inline, such as pacing audio to a device from its receive loop; a lagging subscriber gets RecvError::Lagged and skips events. Values below 1 are raised to 1.

Source

pub async fn connect(self) -> Result<LiveHandle, AgentError>

Connect to Gemini and start the three-lane event processor.

This is a thin orchestrator over three explicit, behavior-preserving stages:

  1. into_plan — pure derivation/validation of the resolved startup configuration (SessionPlan); no I/O, no spawning.
  2. Connect the L0 transport using the plan’s resolved SessionConfig.
  3. build_runtime — assemble the runtime wiring (channels, shared state, dispatcher, control plane) from the plan + connected session.
  4. spawn_lanes — spawn the telemetry/event/tool lanes and return the assembled LiveHandle.
Source

pub async fn connect_with_transport<T: Transport>( self, transport: T, ) -> Result<LiveHandle, AgentError>

connect over transport instead of a WebSocket to Gemini: the whole runtime (phases, tools, extractors, watchers, flow governance) runs as it would live, against whatever the transport answers.

Use it to test a session without a network or a credential, over a ReplayTransport scripted with server frames. The transport is not reconnected if it closes.

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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self> ⓘ

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

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

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows 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) -> R
where R: 'a,

Mutably borrows 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
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

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

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + 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
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. 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<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

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