pub struct LlmTextAgent { /* private fields */ }Expand description
Core text agent — calls BaseLlm::generate(), dispatches tools, loops
until the model produces a final text response.
Middleware hooks fire at each lifecycle point:
before_model/after_model— wraps eachBaseLlm::generate()call;before_modelmay return a cached response to skip the LLM entirely.before_tool/after_tool/on_tool_error— wraps each tool dispatch.on_error— called whenrun()is about to return an error.
Note: before_agent/after_agent are Live-session hooks that require an
InvocationContext (a Live WebSocket concept) and are therefore not invoked
by LlmTextAgent. Use before_model or wrap in a custom TextAgent if you
need entry/exit hooks for the text path.
Implementations§
Source§impl LlmTextAgent
impl LlmTextAgent
Sourcepub fn instruction(self, inst: impl Into<String>) -> Self
pub fn instruction(self, inst: impl Into<String>) -> Self
Set the system instruction.
Sourcepub fn instruction_provider(
self,
provider: impl InstructionProvider + 'static,
) -> Self
pub fn instruction_provider( self, provider: impl InstructionProvider + 'static, ) -> Self
Set a dynamic instruction source — an
InstructionProvider
(any Fn(&State) -> String closure, or a TemplateInstruction
under the templates feature) resolved against session state at
the start of every run. Wins over instruction.
Sourcepub fn llm_provider<F>(self, provider: F) -> Self
pub fn llm_provider<F>(self, provider: F) -> Self
Set a dynamic model source, resolved against session state at the start of every run — risk-based escalation to a stronger model, cost routing to a cheaper one, per-tenant model selection — without rebuilding the agent. Wins over the constructor’s model when set.
Sourcepub fn tools(self, dispatcher: Arc<ToolDispatcher>) -> Self
pub fn tools(self, dispatcher: Arc<ToolDispatcher>) -> Self
Set the tool dispatcher.
Sourcepub fn model(self, model: impl Into<String>) -> Self
pub fn model(self, model: impl Into<String>) -> Self
Call model instead of the provider’s default model, e.g.
"gemini-2.5-pro".
Sourcepub fn temperature(self, t: f32) -> Self
pub fn temperature(self, t: f32) -> Self
Set temperature.
Sourcepub fn max_output_tokens(self, n: u32) -> Self
pub fn max_output_tokens(self, n: u32) -> Self
Set max output tokens.
Sourcepub fn stop_sequences(
self,
sequences: impl IntoIterator<Item = impl Into<String>>,
) -> Self
pub fn stop_sequences( self, sequences: impl IntoIterator<Item = impl Into<String>>, ) -> Self
End generation when the model produces any of sequences.
Sourcepub fn thinking_budget(self, tokens: u32) -> Self
pub fn thinking_budget(self, tokens: u32) -> Self
Give the model a thinking budget, in tokens.
Sourcepub fn built_in_tool(self, tool: Tool) -> Self
pub fn built_in_tool(self, tool: Tool) -> Self
Add a built-in tool (Google Search, code execution, URL context), sent alongside the dispatcher’s function declarations.
Sourcepub fn response_schema(self, schema: Value) -> Self
pub fn response_schema(self, schema: Value) -> Self
Constrain the reply to JSON matching schema.
Sourcepub fn output_key(self, key: impl Into<String>) -> Self
pub fn output_key(self, key: impl Into<String>) -> Self
Also write the final text to state under key (it is always written
to "output").
Sourcepub fn add_middleware(self, mw: Arc<dyn Middleware>) -> Self
pub fn add_middleware(self, mw: Arc<dyn Middleware>) -> Self
Append a middleware layer to the chain.
Layers are run in insertion order for before_* / on_error hooks
and in reverse insertion order for after_* hooks (outermost last).
Sourcepub fn with_middleware_chain(self, chain: MiddlewareChain) -> Self
pub fn with_middleware_chain(self, chain: MiddlewareChain) -> Self
Replace the entire middleware chain (advanced — prefer add_middleware).
Trait Implementations§
Source§impl TextAgent for LlmTextAgent
impl TextAgent for LlmTextAgent
Source§fn run<'life0, 'life1, 'async_trait>(
&'life0 self,
state: &'life1 State,
) -> Pin<Box<dyn Future<Output = Result<String, AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn run<'life0, 'life1, 'async_trait>(
&'life0 self,
state: &'life1 State,
) -> Pin<Box<dyn Future<Output = Result<String, AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
state. Returns the final text output. Read moreSource§fn run_with<'life0, 'life1, 'async_trait>(
&'life0 self,
request: RunRequest,
state: &'life1 State,
) -> Pin<Box<dyn Future<Output = Result<RunResult, AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn run_with<'life0, 'life1, 'async_trait>(
&'life0 self,
request: RunRequest,
state: &'life1 State,
) -> Pin<Box<dyn Future<Output = Result<RunResult, AgentError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn run_stream<'a>(
&'a self,
request: RunRequest,
state: State,
) -> BoxStream<'a, Result<RunEvent, AgentError>>
fn run_stream<'a>( &'a self, request: RunRequest, state: State, ) -> BoxStream<'a, Result<RunEvent, AgentError>>
RunEvents: text as the model writes
it, each tool call and result, then RunEvent::Finished. Read moreSource§fn stream(
&self,
prompt: impl Into<String>,
) -> BoxStream<'_, Result<RunEvent, AgentError>>where
Self: Sized,
fn stream(
&self,
prompt: impl Into<String>,
) -> BoxStream<'_, Result<RunEvent, AgentError>>where
Self: Sized,
Source§fn ask<'life0, 'async_trait>(
&'life0 self,
prompt: impl 'async_trait + Into<String> + Send,
) -> Pin<Box<dyn Future<Output = Result<String, AgentError>> + Send + 'async_trait>>where
Self: Sized + 'async_trait,
'life0: 'async_trait,
fn ask<'life0, 'async_trait>(
&'life0 self,
prompt: impl 'async_trait + Into<String> + Send,
) -> Pin<Box<dyn Future<Output = Result<String, AgentError>> + Send + 'async_trait>>where
Self: Sized + 'async_trait,
'life0: 'async_trait,
Source§fn ask_as<'life0, 'async_trait, T>(
&'life0 self,
prompt: impl 'async_trait + Into<String> + Send,
) -> Pin<Box<dyn Future<Output = Result<T, AgentError>> + Send + 'async_trait>>where
Self: Sized + 'async_trait,
T: DeserializeOwned + JsonSchema + Send + 'async_trait,
'life0: 'async_trait,
fn ask_as<'life0, 'async_trait, T>(
&'life0 self,
prompt: impl 'async_trait + Into<String> + Send,
) -> Pin<Box<dyn Future<Output = Result<T, AgentError>> + Send + 'async_trait>>where
Self: Sized + 'async_trait,
T: DeserializeOwned + JsonSchema + Send + 'async_trait,
'life0: 'async_trait,
T. Read moreAuto Trait Implementations§
impl Freeze for LlmTextAgent
impl !RefUnwindSafe for LlmTextAgent
impl Send for LlmTextAgent
impl Sync for LlmTextAgent
impl Unpin for LlmTextAgent
impl !UnwindSafe for LlmTextAgent
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<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>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> 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].