#[non_exhaustive]pub struct Choice {
pub instructions: Option<Content>,
pub criteria: IndexMap<String, Option<Content>>,
}Expand description
Picks one option from a set you define. The answer names the most probable option and gives the probability of each.
The options keep the order they are given in. The API accepts up to 255 of them.
use typesafe_jev::Choice;
let department = Choice::new("Which team should handle this?", [
("billing", "Payments, invoicing, refunds"),
("technical", "Bugs, outages, integrations"),
])
.option("sales", "Pricing, upgrades, new accounts");
assert_eq!(department.criteria.keys().collect::<Vec<_>>(), ["billing", "technical", "sales"]);
// Options whose names say it all need no description.
let tone = Choice::labels("What is the tone?", ["calm", "frustrated", "angry"]);
assert_eq!(tone.criteria["calm"], None);Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.instructions: Option<Content>What the model should decide.
criteria: IndexMap<String, Option<Content>>Each option and its description, in order. None (JSON null) is an option that needs
no more detail than its name.
Implementations§
Source§impl Choice
impl Choice
Sourcepub fn new<N, D>(
instructions: impl Into<Content>,
options: impl IntoIterator<Item = (N, D)>,
) -> Self
pub fn new<N, D>( instructions: impl Into<Content>, options: impl IntoIterator<Item = (N, D)>, ) -> Self
A choice between described options.
Examples found in repository?
examples/ask.rs (lines 31-38)
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 labels<N: Into<String>>(
instructions: impl Into<Content>,
names: impl IntoIterator<Item = N>,
) -> Self
pub fn labels<N: Into<String>>( instructions: impl Into<Content>, names: impl IntoIterator<Item = N>, ) -> Self
A choice between options that their names describe well enough.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Choice
impl<'de> Deserialize<'de> for Choice
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
impl StructuralPartialEq for Choice
Auto Trait Implementations§
impl Freeze for Choice
impl RefUnwindSafe for Choice
impl Send for Choice
impl Sync for Choice
impl Unpin for Choice
impl UnsafeUnpin for Choice
impl UnwindSafe for Choice
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