hs_predict/session/
question.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(rename_all = "snake_case")]
10pub enum QuestionStep {
11 Identifier,
13 IsMixture,
15 ComponentCount,
17 ComponentIdentifier,
19 ComponentFraction,
21 PhysicalForm,
23 SolutionConcentration,
25 IntendedUse,
27 OrganicInorganic,
29 FunctionalGroups,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
35#[serde(tag = "kind", rename_all = "snake_case")]
36pub enum Question {
37 Text {
39 prompt: String,
40 example: Option<String>,
42 },
43 Choice {
45 prompt: String,
46 options: Vec<String>,
47 },
48 YesNo {
50 prompt: String,
51 },
52 Number {
54 prompt: String,
55 unit: String,
56 min: f64,
57 max: f64,
58 },
59 MultiChoice {
61 prompt: String,
62 options: Vec<String>,
63 include_unknown: bool,
65 },
66}
67
68impl Question {
69 pub fn prompt(&self) -> &str {
70 match self {
71 Question::Text { prompt, .. } => prompt,
72 Question::Choice { prompt, .. } => prompt,
73 Question::YesNo { prompt } => prompt,
74 Question::Number { prompt, .. } => prompt,
75 Question::MultiChoice { prompt, .. } => prompt,
76 }
77 }
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
85#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
86pub enum Answer {
87 Text(String),
89 Choice(usize),
91 YesNo(bool),
93 Number(f64),
95 MultiChoice(Vec<usize>),
97 Skip,
99}
100
101impl Answer {
102 pub fn kind_name(&self) -> &'static str {
103 match self {
104 Answer::Text(_) => "text",
105 Answer::Choice(_) => "choice",
106 Answer::YesNo(_) => "yes_no",
107 Answer::Number(_) => "number",
108 Answer::MultiChoice(_) => "multi_choice",
109 Answer::Skip => "skip",
110 }
111 }
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize)]
116pub struct QAPair {
117 pub question: Question,
118 pub answer: Answer,
119}
120
121#[derive(Debug, Serialize)]
123#[serde(tag = "type")]
124pub enum SessionResult {
125 NeedMoreInfo { next_question: Question },
127 Ready,
129 RequiresLlm,
131}