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(
83    rename = "functions.alpha_vector.PartialPlaceholderBranchTaskExpression"
84)]
85pub enum PartialPlaceholderBranchTaskExpression {
86    #[schemars(title = "PlaceholderScalarFunction")]
87    #[serde(rename = "placeholder.alpha.scalar.function")]
88    PlaceholderScalarFunction(PartialPlaceholderScalarFunctionTaskExpression),
89    #[schemars(title = "PlaceholderVectorFunction")]
90    #[serde(rename = "placeholder.alpha.vector.function")]
91    PlaceholderVectorFunction(PartialPlaceholderVectorFunctionTaskExpression),
92}
93
94impl PartialPlaceholderBranchTaskExpression {
95    pub fn complete(
96        self,
97        name: String,
98        depth: u64,
99        min_branch_width: u64,
100        max_branch_width: u64,
101        min_leaf_width: u64,
102        max_leaf_width: u64,
103    ) -> BranchTaskExpression {
104        match self {
105            PartialPlaceholderBranchTaskExpression::PlaceholderScalarFunction(
106                task,
107            ) => BranchTaskExpression::PlaceholderScalarFunction(
108                task.complete(
109                    name,
110                    depth,
111                    min_branch_width,
112                    max_branch_width,
113                    min_leaf_width,
114                    max_leaf_width,
115                ),
116            ),
117            PartialPlaceholderBranchTaskExpression::PlaceholderVectorFunction(
118                task,
119            ) => BranchTaskExpression::PlaceholderVectorFunction(
120                task.complete(
121                    name,
122                    depth,
123                    min_branch_width,
124                    max_branch_width,
125                    min_leaf_width,
126                    max_leaf_width,
127                ),
128            ),
129        }
130    }
131}
132
133#[derive(
134    Debug,
135    Clone,
136    PartialEq,
137    Serialize,
138    Deserialize,
139    JsonSchema,
140    arbitrary::Arbitrary,
141)]
142#[serde(tag = "type")]
143#[schemars(rename = "functions.alpha_vector.LeafTaskExpression")]
144pub enum LeafTaskExpression {
145    #[serde(rename = "vector.completion")]
146    VectorCompletion(VectorCompletionTaskExpression),
147}
148
149impl LeafTaskExpression {
150    pub fn transpile(self) -> functions::TaskExpression {
151        match self {
152            LeafTaskExpression::VectorCompletion(task) => {
153                functions::TaskExpression::VectorCompletion(task.transpile())
154            }
155        }
156    }
157}
158
159#[derive(
160    Debug,
161    Clone,
162    PartialEq,
163    Serialize,
164    Deserialize,
165    JsonSchema,
166    arbitrary::Arbitrary,
167)]
168#[schemars(rename = "functions.alpha_vector.ScalarFunctionTaskExpression")]
169pub struct ScalarFunctionTaskExpression {
170    #[serde(flatten)]
171    #[schemars(schema_with = "crate::flatten_schema::<crate::RemotePath>")]
172    pub path: crate::RemotePath,
173    #[serde(skip_serializing_if = "Option::is_none")]
174    #[schemars(extend("omitempty" = true))]
175    pub skip: Option<functions::expression::Expression>,
176    pub input: super::expression::ScalarFunctionInputValueExpression,
177}
178
179impl ScalarFunctionTaskExpression {
180    pub fn url(&self) -> String {
181        self.path.url()
182    }
183
184    pub fn transpile(self) -> functions::ScalarFunctionTaskExpression {
185        functions::ScalarFunctionTaskExpression {
186            path: self.path,
187            skip: self.skip,
188            // Scalar sub-tasks of an alpha-vector parent must be mapped
189            // over `input['items']`, otherwise expressions like
190            // `input['items'][map]` see `map = None` at runtime. Mirrors
191            // PlaceholderScalarFunctionTaskExpression::transpile below.
192            map: Some(functions::expression::Expression::Special(
193                functions::expression::Special::InputItemsOutputLength,
194            )),
195            input:
196                super::expression::scalar_function_input_value_expression::transpile(
197                    self.input,
198                ),
199            output: functions::expression::Expression::Special(
200                functions::expression::Special::TaskOutputL1Normalized,
201            ),
202        }
203    }
204}
205
206#[derive(
207    Debug,
208    Clone,
209    PartialEq,
210    Serialize,
211    Deserialize,
212    JsonSchema,
213    arbitrary::Arbitrary,
214)]
215#[schemars(rename = "functions.alpha_vector.VectorFunctionTaskExpression")]
216pub struct VectorFunctionTaskExpression {
217    #[serde(flatten)]
218    #[schemars(schema_with = "crate::flatten_schema::<crate::RemotePath>")]
219    pub path: crate::RemotePath,
220    #[serde(skip_serializing_if = "Option::is_none")]
221    #[schemars(extend("omitempty" = true))]
222    pub skip: Option<functions::expression::Expression>,
223    pub input: super::expression::VectorFunctionInputValueExpression,
224}
225
226impl VectorFunctionTaskExpression {
227    pub fn url(&self) -> String {
228        self.path.url()
229    }
230
231    pub fn transpile(self) -> functions::VectorFunctionTaskExpression {
232        functions::VectorFunctionTaskExpression {
233            path: self.path,
234            skip: self.skip,
235            map: None,
236            input: self.input.transpile(),
237            output: functions::expression::Expression::Special(
238                functions::expression::Special::Output,
239            ),
240        }
241    }
242}
243
244#[derive(
245    Debug,
246    Clone,
247    PartialEq,
248    Serialize,
249    Deserialize,
250    JsonSchema,
251    arbitrary::Arbitrary,
252)]
253#[schemars(
254    rename = "functions.alpha_vector.PlaceholderScalarFunctionTaskExpression"
255)]
256pub struct PlaceholderScalarFunctionTaskExpression {
257    #[serde(flatten)]
258    pub params: functions::inventions::Params,
259    pub input_schema: super::expression::ScalarFunctionInputSchema,
260    #[serde(skip_serializing_if = "Option::is_none")]
261    #[schemars(extend("omitempty" = true))]
262    pub skip: Option<functions::expression::Expression>,
263    pub input: super::expression::ScalarFunctionInputValueExpression,
264}
265
266impl PlaceholderScalarFunctionTaskExpression {
267    pub fn transpile(
268        self,
269    ) -> functions::PlaceholderScalarFunctionTaskExpression {
270        functions::PlaceholderScalarFunctionTaskExpression {
271            input_schema:
272                super::expression::scalar_function_input_schema::transpile(
273                    self.input_schema,
274                ),
275            skip: self.skip,
276            map: Some(functions::expression::Expression::Special(
277                functions::expression::Special::InputItemsOutputLength,
278            )),
279            input:
280                super::expression::scalar_function_input_value_expression::transpile(
281                    self.input,
282                ),
283            output: functions::expression::Expression::Special(
284                functions::expression::Special::TaskOutputL1Normalized,
285            ),
286        }
287    }
288
289    pub fn replace(
290        self,
291        path: &crate::RemotePath,
292    ) -> ScalarFunctionTaskExpression {
293        ScalarFunctionTaskExpression {
294            path: path.clone(),
295            skip: self.skip,
296            input: self.input,
297        }
298    }
299}
300
301#[derive(
302    Debug,
303    Clone,
304    PartialEq,
305    Serialize,
306    Deserialize,
307    JsonSchema,
308    arbitrary::Arbitrary,
309)]
310#[schemars(
311    rename = "functions.alpha_vector.PartialPlaceholderScalarFunctionTaskExpression"
312)]
313pub struct PartialPlaceholderScalarFunctionTaskExpression {
314    pub spec: String,
315    pub input_schema: super::expression::ScalarFunctionInputSchema,
316    #[serde(skip_serializing_if = "Option::is_none")]
317    #[schemars(extend("omitempty" = true))]
318    pub skip: Option<functions::expression::Expression>,
319    pub input: super::expression::ScalarFunctionInputValueExpression,
320}
321
322impl PartialPlaceholderScalarFunctionTaskExpression {
323    pub fn complete(
324        self,
325        name: String,
326        depth: u64,
327        min_branch_width: u64,
328        max_branch_width: u64,
329        min_leaf_width: u64,
330        max_leaf_width: u64,
331    ) -> PlaceholderScalarFunctionTaskExpression {
332        PlaceholderScalarFunctionTaskExpression {
333            params: functions::inventions::Params {
334                depth,
335                min_branch_width,
336                max_branch_width,
337                min_leaf_width,
338                max_leaf_width,
339                name,
340                spec: self.spec,
341            },
342            input_schema: self.input_schema,
343            skip: self.skip,
344            input: self.input,
345        }
346    }
347}
348
349#[derive(
350    Debug,
351    Clone,
352    PartialEq,
353    Serialize,
354    Deserialize,
355    JsonSchema,
356    arbitrary::Arbitrary,
357)]
358#[schemars(
359    rename = "functions.alpha_vector.PlaceholderVectorFunctionTaskExpression"
360)]
361pub struct PlaceholderVectorFunctionTaskExpression {
362    #[serde(flatten)]
363    pub params: functions::inventions::Params,
364    pub input_schema: super::expression::VectorFunctionInputSchema,
365    #[serde(skip_serializing_if = "Option::is_none")]
366    #[schemars(extend("omitempty" = true))]
367    pub skip: Option<functions::expression::Expression>,
368    pub input: super::expression::VectorFunctionInputValueExpression,
369}
370
371impl PlaceholderVectorFunctionTaskExpression {
372    pub fn transpile(
373        self,
374    ) -> functions::PlaceholderVectorFunctionTaskExpression {
375        functions::PlaceholderVectorFunctionTaskExpression {
376            input_schema: self.input_schema.transpile(),
377            output_length: functions::expression::Expression::Special(
378                functions::expression::Special::InputItemsOutputLength,
379            ),
380            input_split: functions::expression::Expression::Special(
381                functions::expression::Special::InputItemsOptionalContextSplit,
382            ),
383            input_merge: functions::expression::Expression::Special(
384                functions::expression::Special::InputItemsOptionalContextMerge,
385            ),
386            skip: self.skip,
387            map: None,
388            input: self.input.transpile(),
389            output: functions::expression::Expression::Special(
390                functions::expression::Special::Output,
391            ),
392        }
393    }
394
395    pub fn replace(
396        self,
397        path: &crate::RemotePath,
398    ) -> VectorFunctionTaskExpression {
399        VectorFunctionTaskExpression {
400            path: path.clone(),
401            skip: self.skip,
402            input: self.input,
403        }
404    }
405}
406
407#[derive(
408    Debug,
409    Clone,
410    PartialEq,
411    Serialize,
412    Deserialize,
413    JsonSchema,
414    arbitrary::Arbitrary,
415)]
416#[schemars(
417    rename = "functions.alpha_vector.PartialPlaceholderVectorFunctionTaskExpression"
418)]
419pub struct PartialPlaceholderVectorFunctionTaskExpression {
420    pub spec: String,
421    pub input_schema: super::expression::VectorFunctionInputSchema,
422    #[serde(skip_serializing_if = "Option::is_none")]
423    #[schemars(extend("omitempty" = true))]
424    pub skip: Option<functions::expression::Expression>,
425    pub input: super::expression::VectorFunctionInputValueExpression,
426}
427
428impl PartialPlaceholderVectorFunctionTaskExpression {
429    pub fn complete(
430        self,
431        name: String,
432        depth: u64,
433        min_branch_width: u64,
434        max_branch_width: u64,
435        min_leaf_width: u64,
436        max_leaf_width: u64,
437    ) -> PlaceholderVectorFunctionTaskExpression {
438        PlaceholderVectorFunctionTaskExpression {
439            params: functions::inventions::Params {
440                depth,
441                min_branch_width,
442                max_branch_width,
443                min_leaf_width,
444                max_leaf_width,
445                name,
446                spec: self.spec,
447            },
448            input_schema: self.input_schema,
449            skip: self.skip,
450            input: self.input,
451        }
452    }
453}
454
455#[derive(
456    Debug,
457    Clone,
458    PartialEq,
459    Serialize,
460    Deserialize,
461    JsonSchema,
462    arbitrary::Arbitrary,
463)]
464#[schemars(rename = "functions.alpha_vector.VectorCompletionTaskExpression")]
465pub struct VectorCompletionTaskExpression {
466    #[serde(skip_serializing_if = "Option::is_none")]
467    #[schemars(extend("omitempty" = true))]
468    pub skip: Option<functions::expression::Expression>,
469    pub messages: functions::expression::Expression,
470    pub responses: functions::expression::Expression,
471}
472
473impl VectorCompletionTaskExpression {
474    pub fn transpile(self) -> functions::VectorCompletionTaskExpression {
475        functions::VectorCompletionTaskExpression {
476            skip: self.skip,
477            map: None,
478            messages: functions::expression::WithExpression::Expression(
479                self.messages,
480            ),
481            responses: functions::expression::WithExpression::Expression(
482                self.responses,
483            ),
484            output: functions::expression::Expression::Special(
485                functions::expression::Special::Output,
486            ),
487        }
488    }
489}