Skip to main content

PhaseBuilder

Struct PhaseBuilder 

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

Builder for a conversation phase.

Created by Live::phase and returned to the Live chain via done.

Implementations§

Source§

impl PhaseBuilder

Source

pub fn needs(self, keys: &[&str]) -> Self

Declare what state keys this phase is responsible for gathering.

Purely informational — does not enforce transitions or block progress. The ContextBuilder reads these to append a “[Gathering] key1, key2” line to the instruction, so the model knows what to focus on in the current phase.

§Example
Live::builder()
    .phase("identify_caller")
    .instruction("Get the caller's name and organization.")
    .needs(&["caller_name", "caller_organization"])
    .transition("determine_purpose", S::is_set("caller_name"))
    .done();
Source

pub fn requires(self, keys: &[&str]) -> Self

Declare state keys that must exist before this phase can be entered.

This is a hard phase-machine gate, unlike needs, which is only conversational guidance. Use requires for authoritative facts that must be produced by tools, callbacks, retrieval, or other runtime mechanisms before the model can operate in the phase.

Live::builder()
    .phase("quote_price")
    .requires(&["catalog_item_loaded", "price"])
    .instruction("Quote only the loaded catalog price.")
    .done();
Source

pub fn prepare<F, Fut>( self, name: impl Into<String>, produces: &[&str], f: F, ) -> Self
where F: Fn(State, Arc<dyn SessionWriter>) -> Fut + Send + Sync + 'static, Fut: Future<Output = ()> + Send + 'static,

Add a preparation effect that runs before this phase is entered when its required state is missing.

Preparations are run by the phase lifecycle after an outbound transition guard selects this phase, but before the phase is committed. If the preparation does not satisfy this phase’s requires, the transition remains blocked.

Source

pub fn presents(self, concepts: &[&str]) -> Self

Declare semantic concepts presented to the user by this phase.

On phase entry the runtime writes presented:<concept> = true. Use this with transition_after_presented to avoid accepting stale acknowledgements from earlier phases.

Source

pub fn clear_on_enter(self, keys: &[&str]) -> Self

Clear state keys on phase entry.

This is useful for removing stale acknowledgements or intents that were extracted before the current phase’s concept was presented.

Source

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

Set a static instruction for this phase.

Source

pub fn dynamic_instruction<F>(self, f: F) -> Self
where F: Fn(&State) -> String + Send + Sync + 'static,

Set a dynamic instruction that is resolved from state at transition time.

Source

pub fn tools(self, tools: Vec<String>) -> Self

Set the tool filter for this phase. Only these tools will be enabled.

Calls to other tools are refused. Under SteeringMode::ContextUpdate the model is also offered only these tools while the phase is active.

Source

pub fn guard<F>(self, f: F) -> Self
where F: Fn(&State) -> bool + Send + Sync + 'static,

Set a guard that must return true for this phase to be entered.

Source

pub fn on_enter<F, Fut>(self, f: F) -> Self
where F: Fn(State, Arc<dyn SessionWriter>) -> Fut + Send + Sync + 'static, Fut: Future<Output = ()> + Send + 'static,

Set an async callback to run when entering this phase.

Source

pub fn on_exit<F, Fut>(self, f: F) -> Self
where F: Fn(State, Arc<dyn SessionWriter>) -> Fut + Send + Sync + 'static, Fut: Future<Output = ()> + Send + 'static,

Set an async callback to run when exiting this phase.

Source

pub fn transition( self, target: &str, guard: impl Fn(&State) -> bool + Send + Sync + 'static, ) -> Self

Add a guard-based transition to a target phase.

Source

pub fn transition_with( self, target: &str, guard: impl Fn(&State) -> bool + Send + Sync + 'static, description: impl Into<String>, ) -> Self

Add a guard-based transition with a human-readable description.

The description is used by PhaseMachine::describe_navigation() to help the model understand what paths are available from the current phase.

Source

pub fn transition_after_presented( self, target: &str, concept: &str, ack_key: &str, description: impl Into<String>, ) -> Self

Add a transition that only fires after a semantic concept was presented and an acknowledgement key is true.

Source

pub fn terminal(self) -> Self

Mark this phase as terminal (no outbound transitions will be evaluated).

Source

pub fn show_state(self, keys: &[&str]) -> Self

Show the given state keys to the model by appending them to this phase’s instruction at runtime, rendered as [Context: key1=val1, key2=val2, ...].

Source

pub fn when( self, predicate: impl Fn(&State) -> bool + Send + Sync + 'static, text: impl Into<String>, ) -> Self

Conditionally append text when a predicate is true.

Source

pub fn with_context( self, f: impl Fn(&State) -> String + Send + Sync + 'static, ) -> Self

Append the result of a custom formatter to the instruction.

Source

pub fn context(self, ctx: ContextBuilder) -> Self

Append a declarative gemini_adk_rs::live::context_builder::ContextBuilder to this phase’s instruction.

Source

pub fn prompt_on_enter(self) -> Self

Send turnComplete: true after instruction + context on phase entry, causing the model to generate a response immediately.

Source

pub fn on_enter_context<F>(self, f: F) -> Self
where F: Fn(&State, &TranscriptWindow) -> Option<Vec<Content>> + Send + Sync + 'static,

Set a context injection callback for phase entry. Returns Content to send as client_content before prompting.

Source

pub fn enter_prompt(self, message: impl Into<String>) -> Self

Inject a model-role bridge message on phase entry and prompt immediately.

Combines on_enter_context + prompt_on_enter() into a single call, eliminating the need to import Content in application code.

Live::builder()
    .phase("verify_identity")
    .instruction(VERIFY_IDENTITY_INSTRUCTION)
    .enter_prompt("The caller confirmed the disclosure. I'll now verify their identity.")
    .done();
Source

pub fn enter_prompt_fn<F>(self, f: F) -> Self
where F: Fn(&State, &TranscriptWindow) -> String + Send + Sync + 'static,

Like enter_prompt but with a state-aware closure.

Live::builder()
    .phase("close")
    .enter_prompt_fn(|state, _tw| {
        if state.get::<bool>("cease_desist_requested").unwrap_or(false) {
            "Cease-and-desist requested. Closing call respectfully.".into()
        } else {
            "Wrapping up the call.".into()
        }
    })
    .done();
Source

pub fn navigation(self) -> Self

Include phase navigation context in this phase’s instruction.

Source

pub fn modifiers(self, mods: &[InstructionModifier]) -> Self

Apply a slice of pre-built instruction modifiers to this phase.

Use with P::show_state(), P::when(), P::context_fn() factories.

Live::builder()
    .phase("disclosure")
    .modifiers(&[P::show_state(&["balance"]), P::when(|_| true, "warning")])
    .done();
Source

pub fn done(self) -> Live

Finish building this phase and return the Live builder.

Merges phase defaults (from Live::phase_defaults) with phase-specific settings. Defaults are prepended so phase-specific modifiers take priority.

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<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

§

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<S> FromSample<S> for S

§

fn from_sample_(s: S) -> S

§

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, U> ToSample<U> for T
where U: FromSample<T>,

§

fn to_sample_(self) -> U

§

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