pub struct Questions(/* private fields */);Expand description
The questions of one request, each under an id you choose. The answer comes back under the same id; the id itself is not shown to the model.
Questions keep the order they are added in, and every question of a request is evaluated against the same state independently: one answer is never context for another.
use typesafe_jev::{Choice, Noul, Questions, Score};
let questions = Questions::new()
.with("department", Choice::labels("Which team should handle this?", ["billing", "technical", "sales"]))
.with("frustration", Score::new("How frustrated is the customer?", ["Calm", "Frustrated", "Very angry"]))
.with("is_urgent", Noul::new("Does this convey urgency?"));
assert_eq!(questions.len(), 3);
assert_eq!(questions.ids().collect::<Vec<_>>(), ["department", "frustration", "is_urgent"]);Implementations§
Source§impl Questions
impl Questions
Sourcepub fn new() -> Self
pub fn new() -> Self
No questions yet.
Examples found in repository?
examples/ask.rs (line 28)
20fn main() -> Result<(), Error> {
21 let client = Client::from_env(Config::default())?;
22
23 let ticket = Ticket {
24 customer_plan: "business",
25 message: "Hi, I've been trying to connect my Stripe account for 3 days and the integration keeps failing. \
26 I'm losing sales. Please help ASAP.",
27 };
28 let questions = Questions::new()
29 .with(
30 "department",
31 Choice::new(
32 "Which team should handle the `message`?",
33 [
34 ("billing", "Payment or subscription issues"),
35 ("technical", "Bugs or integration problems"),
36 ("sales", "Pricing or account questions"),
37 ],
38 ),
39 )
40 .with(
41 "frustration",
42 Score::new(
43 "How frustrated the customer appears",
44 ["Calm, just stating facts", "Frustrated but civil", "Very angry, strong language"],
45 ),
46 )
47 .with("is_urgent", Noul::new("The message conveys urgency or time-sensitivity"));
48
49 let response = match client.ask(&ticket, &questions) {
50 Ok(response) => response,
51 // Too much state for one request: a real caller would split it and ask again.
52 Err(Error::TokenLimit(message)) => {
53 eprintln!("request too large: {message}");
54 return Ok(());
55 }
56 Err(other) => return Err(other),
57 };
58
59 if let Some(department) = response.choice("department") {
60 println!("department: {} (confidence {:.2})", department.choice, department.confidence);
61 for (option, probability) in &department.probabilities {
62 println!(" {option}: {probability:.2}");
63 }
64 }
65 if let Some(frustration) = response.score("frustration") {
66 println!("frustration: {:.2} of {} (confidence {:.2})", frustration.score, frustration.legend.len() - 1, frustration.confidence);
67 }
68 if let Some(urgent) = response.noul("is_urgent") {
69 println!("urgent: p={:.2}", urgent.noul);
70 }
71
72 let usage = client.usage();
73 println!(
74 "{}: {} request(s), {} retries, {} input tokens, ~${:.6}",
75 response.model,
76 usage.requests(),
77 usage.retries(),
78 usage.input_tokens(),
79 usage.cost_usd()
80 );
81 Ok(())
82}Sourcepub fn with(self, id: impl Into<String>, question: impl Into<Question>) -> Self
pub fn with(self, id: impl Into<String>, question: impl Into<Question>) -> Self
Adds a question and returns the set, for chaining.
Examples found in repository?
examples/ask.rs (lines 29-39)
20fn main() -> Result<(), Error> {
21 let client = Client::from_env(Config::default())?;
22
23 let ticket = Ticket {
24 customer_plan: "business",
25 message: "Hi, I've been trying to connect my Stripe account for 3 days and the integration keeps failing. \
26 I'm losing sales. Please help ASAP.",
27 };
28 let questions = Questions::new()
29 .with(
30 "department",
31 Choice::new(
32 "Which team should handle the `message`?",
33 [
34 ("billing", "Payment or subscription issues"),
35 ("technical", "Bugs or integration problems"),
36 ("sales", "Pricing or account questions"),
37 ],
38 ),
39 )
40 .with(
41 "frustration",
42 Score::new(
43 "How frustrated the customer appears",
44 ["Calm, just stating facts", "Frustrated but civil", "Very angry, strong language"],
45 ),
46 )
47 .with("is_urgent", Noul::new("The message conveys urgency or time-sensitivity"));
48
49 let response = match client.ask(&ticket, &questions) {
50 Ok(response) => response,
51 // Too much state for one request: a real caller would split it and ask again.
52 Err(Error::TokenLimit(message)) => {
53 eprintln!("request too large: {message}");
54 return Ok(());
55 }
56 Err(other) => return Err(other),
57 };
58
59 if let Some(department) = response.choice("department") {
60 println!("department: {} (confidence {:.2})", department.choice, department.confidence);
61 for (option, probability) in &department.probabilities {
62 println!(" {option}: {probability:.2}");
63 }
64 }
65 if let Some(frustration) = response.score("frustration") {
66 println!("frustration: {:.2} of {} (confidence {:.2})", frustration.score, frustration.legend.len() - 1, frustration.confidence);
67 }
68 if let Some(urgent) = response.noul("is_urgent") {
69 println!("urgent: p={:.2}", urgent.noul);
70 }
71
72 let usage = client.usage();
73 println!(
74 "{}: {} request(s), {} retries, {} input tokens, ~${:.6}",
75 response.model,
76 usage.requests(),
77 usage.retries(),
78 usage.input_tokens(),
79 usage.cost_usd()
80 );
81 Ok(())
82}Trait Implementations§
Source§impl<'de> Deserialize<'de> for Questions
impl<'de> Deserialize<'de> for Questions
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Source§impl<I: Into<String>, Q: Into<Question>> Extend<(I, Q)> for Questions
impl<I: Into<String>, Q: Into<Question>> Extend<(I, Q)> for Questions
Source§fn extend<T: IntoIterator<Item = (I, Q)>>(&mut self, questions: T)
fn extend<T: IntoIterator<Item = (I, Q)>>(&mut self, questions: T)
Extends a collection with the contents of an iterator. Read more
Source§fn extend_one(&mut self, item: T)
fn extend_one(&mut self, item: T)
🔬This is a nightly-only experimental API. (
extend_one)Extends a collection with exactly one element.
Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
🔬This is a nightly-only experimental API. (
extend_one)Reserves capacity in a collection for the given number of additional elements. Read more
Source§impl IntoIterator for Questions
impl IntoIterator for Questions
Source§impl<'a> IntoIterator for &'a Questions
impl<'a> IntoIterator for &'a Questions
impl StructuralPartialEq for Questions
Auto Trait Implementations§
impl Freeze for Questions
impl RefUnwindSafe for Questions
impl Send for Questions
impl Sync for Questions
impl Unpin for Questions
impl UnsafeUnpin for Questions
impl UnwindSafe for Questions
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
Mutably borrows from an owned value. Read more