Skip to main content

objectiveai_sdk/functions/alpha_vector/expression/
input_schema.rs

1use crate::functions;
2use indexmap::IndexMap;
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6pub type ScalarFunctionInputSchema = functions::expression::ObjectInputSchema;
7
8pub mod scalar_function_input_schema {
9    use crate::functions;
10    pub fn transpile(
11        this: super::ScalarFunctionInputSchema,
12    ) -> functions::expression::InputSchema {
13        functions::expression::InputSchema::Object(this)
14    }
15}
16
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, arbitrary::Arbitrary)]
18#[schemars(rename = "functions.alpha_vector.expression.VectorFunctionInputSchema")]
19pub struct VectorFunctionInputSchema {
20    #[serde(skip_serializing_if = "Option::is_none")]
21    #[schemars(extend("omitempty" = true))]
22    pub context: Option<functions::expression::ObjectInputSchema>,
23    pub items: functions::expression::InputSchema,
24}
25
26impl VectorFunctionInputSchema {
27    /// Returns which media modalities are present in context and/or items.
28    pub fn modalities(&self) -> functions::expression::Modalities {
29        let ctx = self.context.as_ref()
30            .map(|c| c.modalities())
31            .unwrap_or_default();
32        ctx.merge(self.items.modalities())
33    }
34
35    pub fn transpile(self) -> functions::expression::InputSchema {
36        functions::expression::InputSchema::Object(
37            functions::expression::ObjectInputSchema {
38                r#type: Default::default(),
39                description: None,
40                required: Some(if self.context.is_some() {
41                    vec!["context".to_string(), "items".to_string()]
42                } else {
43                    vec!["items".to_string()]
44                }),
45                properties: {
46                    let mut map =
47                        IndexMap::with_capacity(if self.context.is_some() {
48                            2
49                        } else {
50                            1
51                        });
52                    if let Some(context) = self.context {
53                        map.insert(
54                            "context".to_string(),
55                            functions::expression::InputSchema::Object(context),
56                        );
57                    }
58                    map.insert(
59                        "items".to_string(),
60                        functions::expression::InputSchema::Array(
61                            functions::expression::ArrayInputSchema {
62                                r#type: Default::default(),
63                                description: None,
64                                min_items: Some(2),
65                                max_items: None,
66                                items: Box::new(self.items),
67                            },
68                        ),
69                    );
70                    map
71                },
72            },
73        )
74    }
75}