Struct ValidatedLLM

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

A wrapper around an LLM provider that validates responses before returning them.

The wrapper implements validation by:

  1. Sending the request to the underlying provider
  2. Validating the response using the provided validator function
  3. If validation fails, retrying with feedback up to the configured number of attempts

§Type Parameters

The wrapped provider must implement the LLMProvider trait.

Implementations§

Source§

impl ValidatedLLM

Source

pub fn new( inner: Box<dyn LLMProvider>, validator: Box<dyn Fn(&str) -> Result<(), String> + Sync + Send>, attempts: usize, ) -> ValidatedLLM

Creates a new ValidatedLLM wrapper around an existing LLM provider.

§Arguments
  • inner - The LLM provider to wrap with validation
  • validator - Function that takes a response string and returns Ok(()) if valid, or Err with error message if invalid
  • attempts - Maximum number of validation attempts before failing
§Returns

A new ValidatedLLM instance configured with the provided parameters.

Trait Implementations§

Source§

impl ChatProvider for ValidatedLLM

Source§

fn chat_with_tools<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, messages: &'life1 [ChatMessage], tools: Option<&'life2 [Tool]>, ) -> Pin<Box<dyn Future<Output = Result<Box<dyn ChatResponse>, LLMError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, ValidatedLLM: 'async_trait,

Sends a chat request and validates the response.

If validation fails, retries with feedback to the model about the validation error. The feedback is appended as a new user message to help guide the model.

§Arguments
  • messages - The chat messages to send to the model
§Returns
  • Ok(String) - The validated response from the model
  • Err(LLMError) - If validation fails after max attempts or other errors occur
Source§

fn chat<'life0, 'life1, 'async_trait>( &'life0 self, messages: &'life1 [ChatMessage], ) -> Pin<Box<dyn Future<Output = Result<Box<dyn ChatResponse>, LLMError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

Sends a chat request to the provider with a sequence of messages. Read more
Source§

impl CompletionProvider for ValidatedLLM

Source§

fn complete<'life0, 'life1, 'async_trait>( &'life0 self, req: &'life1 CompletionRequest, ) -> Pin<Box<dyn Future<Output = Result<CompletionResponse, LLMError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, ValidatedLLM: 'async_trait,

Sends a completion request and validates the response.

If validation fails, retries up to the configured number of attempts. Unlike chat, completion requests don’t support adding feedback messages.

§Arguments
  • req - The completion request to send
§Returns
  • Ok(CompletionResponse) - The validated completion response
  • Err(LLMError) - If validation fails after max attempts or other errors occur
Source§

impl EmbeddingProvider for ValidatedLLM

Source§

fn embed<'life0, 'async_trait>( &'life0 self, input: Vec<String>, ) -> Pin<Box<dyn Future<Output = Result<Vec<Vec<f32>>, LLMError>> + Send + 'async_trait>>
where 'life0: 'async_trait, ValidatedLLM: 'async_trait,

Passes through embedding requests to the inner provider without validation.

Embeddings are numerical vectors that represent text semantically and don’t require validation since they’re not human-readable content.

§Arguments
  • input - Vector of strings to generate embeddings for
§Returns
  • Ok(Vec<Vec<f32>>) - Vector of embedding vectors
  • Err(LLMError) - If the embedding generation fails
Source§

impl LLMProvider for ValidatedLLM

Source§

fn tools(&self) -> Option<&[Tool]>

Source§

impl SpeechToTextProvider for ValidatedLLM

Source§

fn transcribe<'life0, 'async_trait>( &'life0 self, _audio: Vec<u8>, ) -> Pin<Box<dyn Future<Output = Result<String, LLMError>> + Send + 'async_trait>>
where 'life0: 'async_trait, ValidatedLLM: 'async_trait,

Transcribe the given audio bytes into text Read more
Source§

fn transcribe_file<'life0, 'life1, 'async_trait>( &'life0 self, file_path: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<String, LLMError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

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

impl<T> ErasedDestructor for T
where T: 'static,