1mod decode;
11mod dynamic;
12mod questions;
13pub mod types;
14mod validation;
15mod wire;
16
17pub use dynamic::DynamicQuery;
18pub use questions::{
19 Choice, ChoiceAnswer, DynamicScore, DynamicScoreAnswer, JoinedQuery, MappedQuery, NamedQuery,
20 Noul, NoulAnswer, Query, Score, ScoreAnswer,
21};
22use rig_core::driver::{Model, Transport};
23use rig_core::error::ProviderError;
24use rig_core::wasm_compat::{WasmCompatSend, WasmCompatSync};
25use serde::Serialize;
26pub use wire::{Evaluation, Jev, JevConfig};
27
28#[derive(Debug, Clone)]
30pub struct EvaluationResult<A> {
31 pub answers: A,
33 pub model: String,
35 pub usage: Option<types::Usage>,
37 pub provider_request_id: Option<String>,
39}
40
41pub trait Evaluate {
43 fn evaluate<S, Q>(
55 &self,
56 state: &S,
57 questions: Q,
58 ) -> impl std::future::Future<Output = Result<EvaluationResult<Q::Output>, ProviderError>>
59 + WasmCompatSend
60 where
61 S: Serialize + WasmCompatSync,
62 Q: Query;
63}
64impl<T: Transport<JevConfig>> Evaluate for Model<JevConfig, T> {
65 async fn evaluate<S, Q>(
66 &self,
67 state: &S,
68 questions: Q,
69 ) -> Result<EvaluationResult<Q::Output>, ProviderError>
70 where
71 S: Serialize + WasmCompatSync,
72 Q: Query,
73 {
74 let encoded = serde_json::value::to_raw_value(&questions)?;
75 let ids = validation::request_ids(&encoded)?;
76 let request = types::Request {
77 state: questions::state(state)?,
78 questions: encoded,
79 };
80 let response = self.call(request).await?;
81 if ids != validation::response_ids(&response.answers)? {
82 return Err(ProviderError::Response(
83 "response question IDs differ from request".into(),
84 ));
85 }
86 Ok(EvaluationResult {
87 answers: questions.decode(serde_json::from_str(response.answers.get())?)?,
88 model: response.model,
89 usage: response.usage,
90 provider_request_id: response.provider_request_id,
91 })
92 }
93}
94
95#[cfg(test)]
96mod tests;
97
98#[cfg(test)]
99mod query_tests;