supercode_runtime/
request.rs1use serde::Serialize;
4use supercode_interchange::ChatMessage;
5
6#[derive(Debug, Clone, PartialEq, Serialize)]
8pub struct ToolSchema {
9 pub name: String,
11 pub description: String,
13 pub parameters: serde_json::Value,
15}
16
17impl ToolSchema {
18 pub fn new(
20 name: impl Into<String>,
21 description: impl Into<String>,
22 parameters: serde_json::Value,
23 ) -> Self {
24 Self {
25 name: name.into(),
26 description: description.into(),
27 parameters,
28 }
29 }
30}
31
32#[derive(Debug, Clone, PartialEq)]
34pub struct ChatRequest {
35 pub model: String,
37 pub messages: Vec<ChatMessage>,
39 pub tools: Vec<ToolSchema>,
41 pub temperature: Option<f32>,
43 pub max_tokens: Option<u32>,
45 pub effort: Option<String>,
47 pub response_format: Option<serde_json::Value>,
49 pub service_tier: Option<String>,
54 pub thinking_budget: Option<u32>,
59 pub extra_body: serde_json::Map<String, serde_json::Value>,
61}
62
63impl ChatRequest {
64 pub fn new(model: impl Into<String>, messages: Vec<ChatMessage>) -> Self {
66 Self {
67 model: model.into(),
68 messages,
69 tools: Vec::new(),
70 temperature: None,
71 max_tokens: None,
72 effort: None,
73 response_format: None,
74 service_tier: None,
75 thinking_budget: None,
76 extra_body: serde_json::Map::new(),
77 }
78 }
79}
80
81#[cfg(test)]
82mod tests {
83 use super::*;
84
85 #[test]
86 fn minimal_request_has_no_optional_runtime_controls() {
87 let request = ChatRequest::new("example/model", vec![ChatMessage::user("hello")]);
88 assert_eq!(request.model, "example/model");
89 assert_eq!(request.messages.len(), 1);
90 assert!(request.tools.is_empty());
91 assert_eq!(request.temperature, None);
92 assert_eq!(request.max_tokens, None);
93 assert!(request.extra_body.is_empty());
94 }
95
96 #[test]
97 fn schema_constructor_preserves_provider_json() {
98 let parameters = serde_json::json!({"type": "object"});
99 let schema = ToolSchema::new("read", "Read a file", parameters.clone());
100 assert_eq!(schema.name, "read");
101 assert_eq!(schema.parameters, parameters);
102 }
103}