Skip to main content

dejadb_core/format/tool_schema/
gemini.rs

1//! Google Gemini function-declaration adapter.
2//!
3//! Shape: {"name":..., "description":..., "parameters":...}
4//! Gemini uses the OpenAPI 3.0 subset — the Phase-1 validator already
5//! rejects keywords outside that subset (`$ref`, `oneOf`, etc.), so the
6//! schema passed through here is already compatible by construction.
7
8use serde_json::{json, Value};
9
10use crate::error::Result;
11use crate::types::Tool;
12
13use super::definition_parts;
14
15pub fn render(action: &Tool) -> Result<Value> {
16    let (name, description, parameters) = definition_parts(action)?;
17    Ok(json!({
18        "name": name,
19        "description": description,
20        "parameters": parameters,
21    }))
22}
23
24#[cfg(test)]
25mod tests {
26    use super::super::tests::sample_def;
27    use super::*;
28
29    #[test]
30    fn shape_matches_gemini_wire() {
31        let v = render(&sample_def()).unwrap();
32        assert_eq!(v["name"], "slack_post_message");
33        assert_eq!(v["parameters"]["type"], "object");
34        // Gemini uses `parameters`, not `input_schema`.
35        assert!(v.get("input_schema").is_none());
36    }
37}