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