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
impl LiveSessionBuilder
Sourcepub fn new(config: SessionConfig) -> Self
pub fn new(config: SessionConfig) -> Self
Create a new builder with the given session config.
Sourcepub fn tasks(self, tasks: TaskRuntime) -> Self
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.
Sourcepub fn redaction(self, redactor: TranscriptRedactor) -> Self
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.
Sourcepub fn clock(self, clock: SharedClock) -> Self
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.
Sourcepub fn middleware(self, layer: Arc<dyn Middleware>) -> Self
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.
Sourcepub fn flow_monitor(self, monitor: FlowMonitor) -> Self
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.
Sourcepub fn flow_stack(self, stack: FlowStack) -> Self
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.
Sourcepub fn decisions(self, decisions: Arc<Decisions>) -> Self
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.
Sourcepub fn state(self, state: State) -> Self
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.
Sourcepub fn greeting(self, prompt: impl Into<String>) -> Self
pub fn greeting(self, prompt: impl Into<String>) -> Self
Set a greeting prompt sent on connect to trigger the model to speak first.
Sourcepub fn code_mode(self, code: CodeMode) -> Self
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.
Sourcepub fn dispatcher(self, dispatcher: ToolDispatcher) -> Self
pub fn dispatcher(self, dispatcher: ToolDispatcher) -> Self
Set the tool dispatcher for auto-dispatch of tool calls.
Sourcepub fn callbacks(self, callbacks: EventCallbacks) -> Self
pub fn callbacks(self, callbacks: EventCallbacks) -> Self
Set the event callbacks.
Sourcepub fn extractor(self, extractor: Arc<dyn TurnExtractor>) -> Self
pub fn extractor(self, extractor: Arc<dyn TurnExtractor>) -> Self
Add a turn extractor that runs between turns.
Sourcepub fn computed(self, registry: ComputedRegistry) -> Self
pub fn computed(self, registry: ComputedRegistry) -> Self
Set the computed variable registry for derived state.
Sourcepub fn phase_machine(self, machine: PhaseMachine) -> Self
pub fn phase_machine(self, machine: PhaseMachine) -> Self
Set the phase machine for declarative conversation phase management.
Sourcepub fn watchers(self, registry: WatcherRegistry) -> Self
pub fn watchers(self, registry: WatcherRegistry) -> Self
Set the watcher registry for state change watchers.
Sourcepub fn temporal(self, registry: TemporalRegistry) -> Self
pub fn temporal(self, registry: TemporalRegistry) -> Self
Set the temporal pattern registry.
Sourcepub fn tool_execution_mode(
self,
tool_name: impl Into<String>,
mode: ToolExecutionMode,
) -> Self
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.
Sourcepub fn soft_turn_timeout(self, timeout: Duration) -> Self
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.
Sourcepub fn steering_mode(self, mode: SteeringMode) -> Self
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.
Sourcepub fn context_delivery(self, mode: ContextDelivery) -> Self
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.
Sourcepub fn delivery(self, delivery: DeliveryConfig) -> Self
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.
Sourcepub fn repair(self, config: RepairConfig) -> Self
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.
Sourcepub fn persistence(self, backend: Arc<dyn SessionPersistence>) -> Self
pub fn persistence(self, backend: Arc<dyn SessionPersistence>) -> Self
Set a session persistence backend for surviving process restarts.
Sourcepub fn session_id(self, id: impl Into<String>) -> Self
pub fn session_id(self, id: impl Into<String>) -> Self
Set the session ID for persistence.
Sourcepub fn tool_advisory(self, enabled: bool) -> Self
pub fn tool_advisory(self, enabled: bool) -> Self
Enable or disable tool availability advisory on phase transitions.
Sourcepub fn telemetry_interval(self, interval: Duration) -> Self
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.
Sourcepub fn event_capacity(self, capacity: usize) -> Self
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.
Sourcepub async fn connect(self) -> Result<LiveHandle, AgentError>
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:
into_plan— pure derivation/validation of the resolved startup configuration (SessionPlan); no I/O, no spawning.- Connect the L0 transport using the plan’s resolved
SessionConfig. build_runtime— assemble the runtime wiring (channels, shared state, dispatcher, control plane) from the plan + connected session.spawn_lanes— spawn the telemetry/event/tool lanes and return the assembledLiveHandle.
Sourcepub async fn connect_with_transport<T: Transport>(
self,
transport: T,
) -> Result<LiveHandle, AgentError>
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§
impl !Freeze for LiveSessionBuilder
impl !RefUnwindSafe for LiveSessionBuilder
impl !UnwindSafe for LiveSessionBuilder
impl Send for LiveSessionBuilder
impl Sync for LiveSessionBuilder
impl Unpin for LiveSessionBuilder
impl UnsafeUnpin for LiveSessionBuilder
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<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<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.