Skip to main content

AgentLoop

Struct AgentLoop 

Source
pub struct AgentLoop<P: Platform> { /* private fields */ }
Expand description

The core agent loop that processes inbound messages.

Consumes messages from the bus, invokes the LLM pipeline, executes tool calls, and dispatches responses. This struct holds all the dependencies needed for the full processing cycle.

§Processing flow

  1. Consume: Pull the next InboundMessage from the MessageBus.
  2. Session: Look up or create a Session keyed by channel:chat_id.
  3. Context: Build the LLM message list via ContextBuilder::build_messages.
  4. Pipeline: Run the assembled context through the 6-stage pipeline (Classifier -> Router -> Assembler -> Transport -> Scorer -> Learner).
  5. Tools: If the LLM response contains tool calls, execute them via the ToolRegistry, append results, and loop back to step 4 (up to max_tool_iterations).
  6. Respond: Extract the final text response and dispatch an OutboundMessage to the bus.
  7. Persist: Save the updated session and append to history.

Implementations§

Source§

impl<P: Platform> AgentLoop<P>

Source

pub fn new( config: AgentsConfig, platform: Arc<P>, bus: Arc<MessageBus>, pipeline: PipelineRegistry, tools: Arc<ToolRegistry>, context: ContextBuilder<P>, sessions: Arc<SessionManager<P>>, permission_resolver: PermissionResolver, ) -> Self

Create a new agent loop with all dependencies wired.

§Arguments
  • config – Agent configuration (model, max_tokens, etc.)
  • platform – Platform abstraction for filesystem/env/http
  • bus – Message bus for consuming inbound and dispatching outbound
  • pipeline – Pipeline registry for LLM invocation
  • tools – Tool registry for executing tool calls
  • context – Context builder for assembling prompts
  • sessions – Session manager for conversation persistence
Source

pub fn with_cancel(self, token: CancellationToken) -> Self

Attach a CancellationToken so the agent loop exits promptly on shutdown instead of waiting for all bus senders to be dropped.

Source

pub fn with_auto_delegation(self, delegation: Arc<dyn AutoDelegation>) -> Self

Attach an auto-delegation router for pre-LLM routing.

When set, messages matching delegation rules are routed to the delegate_task tool before the local LLM processes them.

Source

pub fn config(&self) -> &AgentsConfig

Get a reference to the agent configuration.

Source

pub fn platform(&self) -> &Arc<P>

Get a reference to the platform.

Source

pub fn bus(&self) -> &Arc<MessageBus>

Get a reference to the message bus.

Source

pub async fn run(&self) -> Result<()>

Run the agent loop, consuming messages until the bus is closed or the optional CancellationToken is triggered.

This is the main entrypoint. It pulls messages from the inbound channel and processes each one through the full pipeline. Errors on individual messages are logged but do not terminate the loop.

Auto Trait Implementations§

§

impl<P> Freeze for AgentLoop<P>

§

impl<P> !RefUnwindSafe for AgentLoop<P>

§

impl<P> Send for AgentLoop<P>

§

impl<P> Sync for AgentLoop<P>

§

impl<P> Unpin for AgentLoop<P>

§

impl<P> UnsafeUnpin for AgentLoop<P>

§

impl<P> !UnwindSafe for AgentLoop<P>

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

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

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

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

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

Initializes a with the given initializer. Read more
Source§

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

Dereferences the given pointer. Read more
Source§

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

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

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

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

Source§

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

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

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more