use serde::Serialize;
use supercode_interchange::ChatMessage;
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct ToolSchema {
pub name: String,
pub description: String,
pub parameters: serde_json::Value,
}
impl ToolSchema {
pub fn new(
name: impl Into<String>,
description: impl Into<String>,
parameters: serde_json::Value,
) -> Self {
Self {
name: name.into(),
description: description.into(),
parameters,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ChatRequest {
pub model: String,
pub messages: Vec<ChatMessage>,
pub tools: Vec<ToolSchema>,
pub temperature: Option<f32>,
pub max_tokens: Option<u32>,
pub effort: Option<String>,
pub response_format: Option<serde_json::Value>,
pub extra_body: serde_json::Map<String, serde_json::Value>,
}
impl ChatRequest {
pub fn new(model: impl Into<String>, messages: Vec<ChatMessage>) -> Self {
Self {
model: model.into(),
messages,
tools: Vec::new(),
temperature: None,
max_tokens: None,
effort: None,
response_format: None,
extra_body: serde_json::Map::new(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn minimal_request_has_no_optional_runtime_controls() {
let request = ChatRequest::new("example/model", vec![ChatMessage::user("hello")]);
assert_eq!(request.model, "example/model");
assert_eq!(request.messages.len(), 1);
assert!(request.tools.is_empty());
assert_eq!(request.temperature, None);
assert_eq!(request.max_tokens, None);
assert!(request.extra_body.is_empty());
}
#[test]
fn schema_constructor_preserves_provider_json() {
let parameters = serde_json::json!({"type": "object"});
let schema = ToolSchema::new("read", "Read a file", parameters.clone());
assert_eq!(schema.name, "read");
assert_eq!(schema.parameters, parameters);
}
}