pub struct ValidatedLLM { /* private fields */ }
Expand description
A wrapper around an LLM provider that validates responses before returning them.
The wrapper implements validation by:
- Sending the request to the underlying provider
- Validating the response using the provided validator function
- 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
impl ValidatedLLM
Sourcepub fn new(
inner: Box<dyn LLMProvider>,
validator: Box<dyn Fn(&str) -> Result<(), String> + Sync + Send>,
attempts: usize,
) -> ValidatedLLM
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 validationvalidator
- Function that takes a response string and returns Ok(()) if valid, or Err with error message if invalidattempts
- Maximum number of validation attempts before failing
§Returns
A new ValidatedLLM instance configured with the provided parameters.
Trait Implementations§
Source§impl ChatProvider for ValidatedLLM
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,
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 modelErr(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,
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,
Source§impl CompletionProvider for ValidatedLLM
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,
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 responseErr(LLMError)
- If validation fails after max attempts or other errors occur
Source§impl EmbeddingProvider for ValidatedLLM
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,
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 vectorsErr(LLMError)
- If the embedding generation fails
Source§impl LLMProvider for ValidatedLLM
impl LLMProvider for ValidatedLLM
Source§impl SpeechToTextProvider for ValidatedLLM
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,
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,
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§
impl Freeze for ValidatedLLM
impl !RefUnwindSafe for ValidatedLLM
impl Send for ValidatedLLM
impl Sync for ValidatedLLM
impl Unpin for ValidatedLLM
impl !UnwindSafe for ValidatedLLM
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
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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