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 = match serde_json::to_value(parameters) {
23        Ok(value) => value,
24        Err(error) => panic!("Schema serialization must succeed: {error}"),
25    };
26    json!({
27        "type": "function",
28        "function": {
29            "name": name,
30            "description": description,
31            "strict": strict,
32            "parameters": params
33        }
34    })
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[derive(schemars::JsonSchema)]
42    #[expect(dead_code)]
43    struct TestInput {
44        message: String,
45    }
46
47    #[test]
48    fn test_render_function() {
49        let schema = schemars::schema_for!(TestInput);
50        let rendered = render_function("greet", "Greet someone", &schema, true);
51
52        assert_eq!(rendered["type"], "function");
53        assert_eq!(rendered["function"]["name"], "greet");
54        assert_eq!(rendered["function"]["description"], "Greet someone");
55        assert_eq!(rendered["function"]["strict"], true);
56        assert!(rendered["function"]["parameters"].is_object());
57    }
58
59    #[test]
60    fn test_render_function_non_strict() {
61        let schema = schemars::schema_for!(TestInput);
62        let rendered = render_function("greet", "Greet someone", &schema, false);
63
64        assert_eq!(rendered["function"]["strict"], false);
65    }
66}