Skip to main content

KnowledgeChatRuntime

Struct KnowledgeChatRuntime 

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

A real, knowledge-grounded chat runtime over smooth-operator.

This is the first end-to-end “knowledge-chat turn” for smooth-operator: it wires a StorageAdapter’s KnowledgeBase into a smooth-operator Agent two ways —

  1. Auto-injected context via AgentConfig::with_knowledge: the engine queries the KB with the user’s message and prepends the top matches as a [Relevant knowledge] system message before the first LLM call.
  2. Agent-driven search via the KnowledgeSearchTool: the model can issue its own knowledge_search query mid-turn with its own phrasing.

Construct with KnowledgeChatRuntime::new for production (a real LlmClient is built from the LlmConfig), or inject a mock via KnowledgeChatRuntime::with_llm_provider for deterministic, key-free tests.

Implementations§

Source§

impl KnowledgeChatRuntime

Source

pub fn new(storage: Arc<dyn StorageAdapter>, llm: LlmConfig) -> Self

Build a production runtime over a storage adapter and LLM config.

Source

pub fn with_curation( self, store: CuratedKnowledgeStore, context: AccessContext, filter: RetrievalFilter, ) -> Self

Enable query-time curation for this runtime (Phase 11): scope retrieval to named document sets / metadata equalities and re-rank by per-document boost.

store is a CuratedKnowledgeStore wrapping the same inner KnowledgeBase the documents were ingested through (so its curation + ACL side tables are populated), context is the requester’s identity (ACL ∧ curation both apply — the curated store enforces document-level access control itself), and filter scopes the reads. Both the auto-injected [Relevant knowledge] context and the knowledge_search tool read through this filtered, boosted reader.

Pass RetrievalFilter::none to apply boost re-ranking with no set/metadata scoping. Without calling this, retrieval is unchanged.

Source

pub fn with_retrieval_filter(self, filter: RetrievalFilter) -> Self

Set (or replace) just the RetrievalFilter on an already-configured curation store, so a per-turn scope can be applied without rebuilding the store. No-op (logs nothing) when curation is not configured.

Source

pub fn with_access_control( self, store: AclKnowledgeStore, context: AccessContext, ) -> Self

Enable document-level access control for this runtime (feature gap G3).

store is an AclKnowledgeStore that wraps the same inner KnowledgeBase the documents were ingested through (so its ACL side table is populated), and context is the requester’s identity. With this set, every turn reads knowledge through an AccessContext-bound reader — both the auto-injected [Relevant knowledge] context and the knowledge_search tool drop documents the requester is not entitled to.

Without it, the runtime reads the raw storage.knowledge() exactly as before (backward-compatible — existing no-ACL knowledge stays retrievable).

Source

pub fn with_llm_provider(self, provider: Arc<dyn LlmProvider>) -> Self

Inject a custom LlmProvider (e.g. a MockLlmClient) so the agent loop runs deterministically with no network / API key. This is the test seam.

Source

pub fn with_max_iterations(self, max: u32) -> Self

Cap on agent loop iterations (LLM call → tool calls → LLM call → …). Defaults to 8.

Source

pub async fn run_turn( &self, conversation_id: &str, user_message: &str, ) -> Result<TurnOutcome>

Run one knowledge-grounded turn.

Drives the smooth-operator agent loop to completion, then returns the final assistant text plus every AgentEvent emitted. The inbound user message and the outbound reply are also persisted to the storage adapter’s message log under conversation_id (best-effort: a persist failure surfaces as an error so callers don’t silently lose history).

§Errors

Returns an error if the agent loop fails fatally or message persistence fails.

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

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

Source§

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

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T

Source§

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

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

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
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> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

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

impl<L> LayerExt<L> for L

Source§

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

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

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

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