reflex/semantic/
schema.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct QueryResponse {
8 pub queries: Vec<QueryCommand>,
11 #[serde(default)]
14 pub message: Option<String>,
15}
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
19pub struct AgenticQueryResponse {
20 pub queries: Vec<QueryCommand>,
22
23 #[serde(skip_serializing_if = "Vec::is_empty")]
25 pub results: Vec<crate::models::FileGroupedResult>,
26
27 #[serde(skip_serializing_if = "Option::is_none")]
29 pub total_count: Option<usize>,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
34 pub gathered_context: Option<String>,
35
36 #[serde(skip_serializing_if = "Option::is_none")]
38 pub tools_executed: Option<Vec<String>>,
39
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub answer: Option<String>,
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize)]
47pub struct QueryCommand {
48 pub command: String,
54
55 pub order: i32,
57
58 pub merge: bool,
62}
63
64pub const RESPONSE_SCHEMA: &str = r#"{
66 "type": "object",
67 "properties": {
68 "queries": {
69 "type": "array",
70 "description": "Array of rfx commands to execute. Most queries should have 1 command.",
71 "items": {
72 "type": "object",
73 "properties": {
74 "command": {
75 "type": "string",
76 "description": "The rfx query command WITHOUT the 'rfx' prefix"
77 },
78 "order": {
79 "type": "integer",
80 "description": "Execution order (1-based, sequential)"
81 },
82 "merge": {
83 "type": "boolean",
84 "description": "Whether to include in final results (false = context-only)"
85 }
86 },
87 "required": ["command", "order", "merge"]
88 }
89 }
90 },
91 "required": ["queries"]
92}"#;
93
94#[cfg(test)]
95mod tests {
96 use super::*;
97
98 #[test]
99 fn test_deserialize_single_query() {
100 let json = r#"{
101 "queries": [{
102 "command": "query \"TODO\"",
103 "order": 1,
104 "merge": true
105 }]
106 }"#;
107
108 let response: QueryResponse = serde_json::from_str(json).unwrap();
109 assert_eq!(response.queries.len(), 1);
110 assert_eq!(response.queries[0].command, "query \"TODO\"");
111 assert_eq!(response.queries[0].order, 1);
112 assert_eq!(response.queries[0].merge, true);
113 }
114
115 #[test]
116 fn test_deserialize_multiple_queries() {
117 let json = r#"{
118 "queries": [
119 {
120 "command": "query \"User\" --symbols --kind struct --lang rust",
121 "order": 1,
122 "merge": false
123 },
124 {
125 "command": "query \"User\" --lang rust",
126 "order": 2,
127 "merge": true
128 }
129 ]
130 }"#;
131
132 let response: QueryResponse = serde_json::from_str(json).unwrap();
133 assert_eq!(response.queries.len(), 2);
134 assert_eq!(response.queries[0].order, 1);
135 assert_eq!(response.queries[0].merge, false);
136 assert_eq!(response.queries[1].order, 2);
137 assert_eq!(response.queries[1].merge, true);
138 }
139}