Skip to main content

agentic_tools_core/providers/
openai.rs

1//! OpenAI function calling schema renderer.
2
3use schemars::Schema;
4use serde_json::Value;
5use serde_json::json;
6
7/// Render a tool as an OpenAI function definition.
8///
9/// Output format:
10/// ```json
11/// {
12///   "type": "function",
13///   "function": {
14///     "name": "...",
15///     "description": "...",
16///     "strict": true,
17///     "parameters": { ... }
18///   }
19/// }
20/// ```
21pub fn render_function(name: &str, description: &str, parameters: &Schema, strict: bool) -> Value {
22    let params = serde_json::to_value(parameters).expect("Schema serialization must succeed");
23    json!({
24        "type": "function",
25        "function": {
26            "name": name,
27            "description": description,
28            "strict": strict,
29            "parameters": params
30        }
31    })
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[derive(schemars::JsonSchema)]
39    #[allow(dead_code)]
40    struct TestInput {
41        message: String,
42    }
43
44    #[test]
45    fn test_render_function() {
46        let schema = schemars::schema_for!(TestInput);
47        let rendered = render_function("greet", "Greet someone", &schema, true);
48
49        assert_eq!(rendered["type"], "function");
50        assert_eq!(rendered["function"]["name"], "greet");
51        assert_eq!(rendered["function"]["description"], "Greet someone");
52        assert_eq!(rendered["function"]["strict"], true);
53        assert!(rendered["function"]["parameters"].is_object());
54    }
55
56    #[test]
57    fn test_render_function_non_strict() {
58        let schema = schemars::schema_for!(TestInput);
59        let rendered = render_function("greet", "Greet someone", &schema, false);
60
61        assert_eq!(rendered["function"]["strict"], false);
62    }
63}