Skip to main content

objectiveai_sdk/functions/alpha_vector/
task.rs

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