mod decode;
mod dynamic;
mod questions;
pub mod types;
mod validation;
mod wire;
pub use dynamic::DynamicQuery;
pub use questions::{
Choice, ChoiceAnswer, DynamicScore, DynamicScoreAnswer, JoinedQuery, MappedQuery, NamedQuery,
Noul, NoulAnswer, Query, Score, ScoreAnswer,
};
use rig_core::driver::{Model, Transport};
use rig_core::error::ProviderError;
use rig_core::wasm_compat::{WasmCompatSend, WasmCompatSync};
use serde::Serialize;
pub use wire::{Evaluation, Jev, JevConfig};
#[derive(Debug, Clone)]
pub struct EvaluationResult<A> {
pub answers: A,
pub model: String,
pub usage: Option<types::Usage>,
pub provider_request_id: Option<String>,
}
pub trait Evaluate {
fn evaluate<S, Q>(
&self,
state: &S,
questions: Q,
) -> impl std::future::Future<Output = Result<EvaluationResult<Q::Output>, ProviderError>>
+ WasmCompatSend
where
S: Serialize + WasmCompatSync,
Q: Query;
}
impl<T: Transport<JevConfig>> Evaluate for Model<JevConfig, T> {
async fn evaluate<S, Q>(
&self,
state: &S,
questions: Q,
) -> Result<EvaluationResult<Q::Output>, ProviderError>
where
S: Serialize + WasmCompatSync,
Q: Query,
{
let encoded = serde_json::value::to_raw_value(&questions)?;
let ids = validation::request_ids(&encoded)?;
let request = types::Request {
state: questions::state(state)?,
questions: encoded,
};
let response = self.call(request).await?;
if ids != validation::response_ids(&response.answers)? {
return Err(ProviderError::Response(
"response question IDs differ from request".into(),
));
}
Ok(EvaluationResult {
answers: questions.decode(serde_json::from_str(response.answers.get())?)?,
model: response.model,
usage: response.usage,
provider_request_id: response.provider_request_id,
})
}
}
#[cfg(test)]
mod tests;
#[cfg(test)]
mod query_tests;