Skip to main content

objectiveai_sdk/functions/alpha_vector/
task.rs

1use crate::functions;
2use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4
5#[derive(
6    Debug,
7    Clone,
8    PartialEq,
9    Serialize,
10    Deserialize,
11    JsonSchema,
12    arbitrary::Arbitrary,
13)]
14#[serde(tag = "type")]
15#[schemars(rename = "functions.alpha_vector.BranchTaskExpression")]
16pub enum BranchTaskExpression {
17    #[schemars(title = "ScalarFunction")]
18    #[serde(rename = "alpha.scalar.function")]
19    ScalarFunction(ScalarFunctionTaskExpression),
20    #[schemars(title = "VectorFunction")]
21    #[serde(rename = "alpha.vector.function")]
22    VectorFunction(VectorFunctionTaskExpression),
23    #[schemars(title = "PlaceholderScalarFunction")]
24    #[serde(rename = "placeholder.alpha.scalar.function")]
25    PlaceholderScalarFunction(PlaceholderScalarFunctionTaskExpression),
26    #[schemars(title = "PlaceholderVectorFunction")]
27    #[serde(rename = "placeholder.alpha.vector.function")]
28    PlaceholderVectorFunction(PlaceholderVectorFunctionTaskExpression),
29}
30
31impl BranchTaskExpression {
32    pub fn url(&self) -> Option<String> {
33        match self {
34            BranchTaskExpression::ScalarFunction(task) => Some(task.url()),
35            BranchTaskExpression::VectorFunction(task) => Some(task.url()),
36            BranchTaskExpression::PlaceholderScalarFunction(_) => None,
37            BranchTaskExpression::PlaceholderVectorFunction(_) => None,
38        }
39    }
40
41    pub fn transpile(self) -> functions::TaskExpression {
42        match self {
43            BranchTaskExpression::ScalarFunction(task) => {
44                functions::TaskExpression::ScalarFunction(task.transpile())
45            }
46            BranchTaskExpression::VectorFunction(task) => {
47                functions::TaskExpression::VectorFunction(task.transpile())
48            }
49            BranchTaskExpression::PlaceholderScalarFunction(task) => {
50                functions::TaskExpression::PlaceholderScalarFunction(
51                    task.transpile(),
52                )
53            }
54            BranchTaskExpression::PlaceholderVectorFunction(task) => {
55                functions::TaskExpression::PlaceholderVectorFunction(
56                    task.transpile(),
57                )
58            }
59        }
60    }
61
62    pub fn is_placeholder(&self) -> bool {
63        match self {
64            BranchTaskExpression::ScalarFunction(_) => false,
65            BranchTaskExpression::VectorFunction(_) => false,
66            BranchTaskExpression::PlaceholderScalarFunction(_) => true,
67            BranchTaskExpression::PlaceholderVectorFunction(_) => true,
68        }
69    }
70}
71
72#[derive(
73    Debug,
74    Clone,
75    PartialEq,
76    Serialize,
77    Deserialize,
78    JsonSchema,
79    arbitrary::Arbitrary,
80)]
81#[serde(tag = "type")]
82#[schemars(rename = "functions.alpha_vector.LeafTaskExpression")]
83pub enum LeafTaskExpression {
84    #[serde(rename = "vector.completion")]
85    VectorCompletion(VectorCompletionTaskExpression),
86}
87
88impl LeafTaskExpression {
89    pub fn transpile(self) -> functions::TaskExpression {
90        match self {
91            LeafTaskExpression::VectorCompletion(task) => {
92                functions::TaskExpression::VectorCompletion(task.transpile())
93            }
94        }
95    }
96}
97
98#[derive(
99    Debug,
100    Clone,
101    PartialEq,
102    Serialize,
103    Deserialize,
104    JsonSchema,
105    arbitrary::Arbitrary,
106)]
107#[schemars(rename = "functions.alpha_vector.ScalarFunctionTaskExpression")]
108pub struct ScalarFunctionTaskExpression {
109    #[serde(flatten)]
110    #[schemars(schema_with = "crate::flatten_schema::<crate::RemotePath>")]
111    pub path: crate::RemotePath,
112    #[serde(skip_serializing_if = "Option::is_none")]
113    #[schemars(extend("omitempty" = true))]
114    pub skip: Option<functions::expression::Expression>,
115    pub input: super::expression::ScalarFunctionInputValueExpression,
116}
117
118impl ScalarFunctionTaskExpression {
119    pub fn url(&self) -> String {
120        self.path.url()
121    }
122
123    pub fn transpile(self) -> functions::ScalarFunctionTaskExpression {
124        functions::ScalarFunctionTaskExpression {
125            path: self.path,
126            skip: self.skip,
127            // Scalar sub-tasks of an alpha-vector parent must be mapped
128            // over `input['items']`, otherwise expressions like
129            // `input['items'][map]` see `map = None` at runtime. Mirrors
130            // PlaceholderScalarFunctionTaskExpression::transpile below.
131            map: Some(functions::expression::Expression::Special(
132                functions::expression::Special::InputItemsOutputLength,
133            )),
134            input:
135                super::expression::scalar_function_input_value_expression::transpile(
136                    self.input,
137                ),
138            output: functions::expression::Expression::Special(
139                functions::expression::Special::TaskOutputL1Normalized,
140            ),
141        }
142    }
143}
144
145#[derive(
146    Debug,
147    Clone,
148    PartialEq,
149    Serialize,
150    Deserialize,
151    JsonSchema,
152    arbitrary::Arbitrary,
153)]
154#[schemars(rename = "functions.alpha_vector.VectorFunctionTaskExpression")]
155pub struct VectorFunctionTaskExpression {
156    #[serde(flatten)]
157    #[schemars(schema_with = "crate::flatten_schema::<crate::RemotePath>")]
158    pub path: crate::RemotePath,
159    #[serde(skip_serializing_if = "Option::is_none")]
160    #[schemars(extend("omitempty" = true))]
161    pub skip: Option<functions::expression::Expression>,
162    pub input: super::expression::VectorFunctionInputValueExpression,
163}
164
165impl VectorFunctionTaskExpression {
166    pub fn url(&self) -> String {
167        self.path.url()
168    }
169
170    pub fn transpile(self) -> functions::VectorFunctionTaskExpression {
171        functions::VectorFunctionTaskExpression {
172            path: self.path,
173            skip: self.skip,
174            map: None,
175            input: self.input.transpile(),
176            output: functions::expression::Expression::Special(
177                functions::expression::Special::Output,
178            ),
179        }
180    }
181}
182
183#[derive(
184    Debug,
185    Clone,
186    PartialEq,
187    Serialize,
188    Deserialize,
189    JsonSchema,
190    arbitrary::Arbitrary,
191)]
192#[schemars(
193    rename = "functions.alpha_vector.PlaceholderScalarFunctionTaskExpression"
194)]
195pub struct PlaceholderScalarFunctionTaskExpression {
196    pub input_schema: super::expression::ScalarFunctionInputSchema,
197    #[serde(skip_serializing_if = "Option::is_none")]
198    #[schemars(extend("omitempty" = true))]
199    pub skip: Option<functions::expression::Expression>,
200    pub input: super::expression::ScalarFunctionInputValueExpression,
201}
202
203impl PlaceholderScalarFunctionTaskExpression {
204    pub fn transpile(
205        self,
206    ) -> functions::PlaceholderScalarFunctionTaskExpression {
207        functions::PlaceholderScalarFunctionTaskExpression {
208            input_schema:
209                super::expression::scalar_function_input_schema::transpile(
210                    self.input_schema,
211                ),
212            skip: self.skip,
213            map: Some(functions::expression::Expression::Special(
214                functions::expression::Special::InputItemsOutputLength,
215            )),
216            input:
217                super::expression::scalar_function_input_value_expression::transpile(
218                    self.input,
219                ),
220            output: functions::expression::Expression::Special(
221                functions::expression::Special::TaskOutputL1Normalized,
222            ),
223        }
224    }
225
226    pub fn replace(
227        self,
228        path: &crate::RemotePath,
229    ) -> ScalarFunctionTaskExpression {
230        ScalarFunctionTaskExpression {
231            path: path.clone(),
232            skip: self.skip,
233            input: self.input,
234        }
235    }
236}
237
238#[derive(
239    Debug,
240    Clone,
241    PartialEq,
242    Serialize,
243    Deserialize,
244    JsonSchema,
245    arbitrary::Arbitrary,
246)]
247#[schemars(
248    rename = "functions.alpha_vector.PlaceholderVectorFunctionTaskExpression"
249)]
250pub struct PlaceholderVectorFunctionTaskExpression {
251    pub input_schema: super::expression::VectorFunctionInputSchema,
252    #[serde(skip_serializing_if = "Option::is_none")]
253    #[schemars(extend("omitempty" = true))]
254    pub skip: Option<functions::expression::Expression>,
255    pub input: super::expression::VectorFunctionInputValueExpression,
256}
257
258impl PlaceholderVectorFunctionTaskExpression {
259    pub fn transpile(
260        self,
261    ) -> functions::PlaceholderVectorFunctionTaskExpression {
262        functions::PlaceholderVectorFunctionTaskExpression {
263            input_schema: self.input_schema.transpile(),
264            output_length: functions::expression::Expression::Special(
265                functions::expression::Special::InputItemsOutputLength,
266            ),
267            input_split: functions::expression::Expression::Special(
268                functions::expression::Special::InputItemsOptionalContextSplit,
269            ),
270            input_merge: functions::expression::Expression::Special(
271                functions::expression::Special::InputItemsOptionalContextMerge,
272            ),
273            skip: self.skip,
274            map: None,
275            input: self.input.transpile(),
276            output: functions::expression::Expression::Special(
277                functions::expression::Special::Output,
278            ),
279        }
280    }
281
282    pub fn replace(
283        self,
284        path: &crate::RemotePath,
285    ) -> VectorFunctionTaskExpression {
286        VectorFunctionTaskExpression {
287            path: path.clone(),
288            skip: self.skip,
289            input: self.input,
290        }
291    }
292}
293
294#[derive(
295    Debug,
296    Clone,
297    PartialEq,
298    Serialize,
299    Deserialize,
300    JsonSchema,
301    arbitrary::Arbitrary,
302)]
303#[schemars(rename = "functions.alpha_vector.VectorCompletionTaskExpression")]
304pub struct VectorCompletionTaskExpression {
305    #[serde(skip_serializing_if = "Option::is_none")]
306    #[schemars(extend("omitempty" = true))]
307    pub skip: Option<functions::expression::Expression>,
308    pub messages: functions::expression::Expression,
309    pub responses: functions::expression::Expression,
310}
311
312impl VectorCompletionTaskExpression {
313    pub fn transpile(self) -> functions::VectorCompletionTaskExpression {
314        functions::VectorCompletionTaskExpression {
315            skip: self.skip,
316            map: None,
317            messages: functions::expression::WithExpression::Expression(
318                self.messages,
319            ),
320            responses: functions::expression::WithExpression::Expression(
321                self.responses,
322            ),
323            output: functions::expression::Expression::Special(
324                functions::expression::Special::Output,
325            ),
326        }
327    }
328}