Skip to main content

agentic_tools_core/providers/
openai.rs

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