use crate::agent;
use serde::{Deserialize, Serialize};
use schemars::JsonSchema;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, arbitrary::Arbitrary)]
#[serde(tag = "type")]
#[schemars(rename = "functions.TaskExpression")]
pub enum TaskExpression {
#[schemars(title = "ScalarFunction")]
#[serde(rename = "scalar.function")]
ScalarFunction(ScalarFunctionTaskExpression),
#[schemars(title = "VectorFunction")]
#[serde(rename = "vector.function")]
VectorFunction(VectorFunctionTaskExpression),
#[schemars(title = "VectorCompletion")]
#[serde(rename = "vector.completion")]
VectorCompletion(VectorCompletionTaskExpression),
#[schemars(title = "PlaceholderScalarFunction")]
#[serde(rename = "placeholder.scalar.function")]
PlaceholderScalarFunction(PlaceholderScalarFunctionTaskExpression),
#[schemars(title = "PlaceholderVectorFunction")]
#[serde(rename = "placeholder.vector.function")]
PlaceholderVectorFunction(PlaceholderVectorFunctionTaskExpression),
}
impl TaskExpression {
pub fn url(&self) -> Option<String> {
match self {
TaskExpression::ScalarFunction(task) => Some(task.url()),
TaskExpression::VectorFunction(task) => Some(task.url()),
TaskExpression::VectorCompletion(_) => None,
TaskExpression::PlaceholderScalarFunction(_) => None,
TaskExpression::PlaceholderVectorFunction(_) => None,
}
}
pub fn take_skip(&mut self) -> Option<super::expression::Expression> {
match self {
TaskExpression::ScalarFunction(task) => task.skip.take(),
TaskExpression::VectorFunction(task) => task.skip.take(),
TaskExpression::VectorCompletion(task) => task.skip.take(),
TaskExpression::PlaceholderScalarFunction(task) => task.skip.take(),
TaskExpression::PlaceholderVectorFunction(task) => task.skip.take(),
}
}
pub fn map(&self) -> Option<&super::expression::Expression> {
match self {
TaskExpression::ScalarFunction(task) => task.map.as_ref(),
TaskExpression::VectorFunction(task) => task.map.as_ref(),
TaskExpression::VectorCompletion(task) => task.map.as_ref(),
TaskExpression::PlaceholderScalarFunction(task) => {
task.map.as_ref()
}
TaskExpression::PlaceholderVectorFunction(task) => {
task.map.as_ref()
}
}
}
pub fn compile(
self,
params: &super::expression::Params,
) -> Result<Task, super::expression::ExpressionError> {
match self {
TaskExpression::ScalarFunction(task) => {
task.compile(params).map(Task::ScalarFunction)
}
TaskExpression::VectorFunction(task) => {
task.compile(params).map(Task::VectorFunction)
}
TaskExpression::VectorCompletion(task) => {
task.compile(params).map(Task::VectorCompletion)
}
TaskExpression::PlaceholderScalarFunction(task) => {
task.compile(params).map(Task::PlaceholderScalarFunction)
}
TaskExpression::PlaceholderVectorFunction(task) => {
task.compile(params).map(Task::PlaceholderVectorFunction)
}
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "type")]
#[schemars(rename = "functions.Task")]
pub enum Task {
#[schemars(title = "ScalarFunction")]
#[serde(rename = "scalar.function")]
ScalarFunction(ScalarFunctionTask),
#[schemars(title = "VectorFunction")]
#[serde(rename = "vector.function")]
VectorFunction(VectorFunctionTask),
#[schemars(title = "VectorCompletion")]
#[serde(rename = "vector.completion")]
VectorCompletion(VectorCompletionTask),
#[schemars(title = "PlaceholderScalarFunction")]
#[serde(rename = "placeholder.scalar.function")]
PlaceholderScalarFunction(PlaceholderScalarFunctionTask),
#[schemars(title = "PlaceholderVectorFunction")]
#[serde(rename = "placeholder.vector.function")]
PlaceholderVectorFunction(PlaceholderVectorFunctionTask),
}
impl Task {
pub fn compile_output(
&self,
input: &super::expression::InputValue,
raw_output: super::expression::TaskOutput,
) -> Result<
super::expression::TaskOutputOwned,
super::expression::ExpressionError,
> {
match self {
Task::ScalarFunction(task) => {
task.compile_output(input, raw_output)
}
Task::VectorFunction(task) => {
task.compile_output(input, raw_output)
}
Task::VectorCompletion(task) => {
task.compile_output(input, raw_output)
}
Task::PlaceholderScalarFunction(task) => {
task.compile_output(input, raw_output)
}
Task::PlaceholderVectorFunction(task) => {
task.compile_output(input, raw_output)
}
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, arbitrary::Arbitrary)]
#[schemars(rename = "functions.ScalarFunctionTaskExpression")]
pub struct ScalarFunctionTaskExpression {
#[serde(flatten)]
#[schemars(schema_with = "crate::flatten_schema::<crate::RemotePath>")]
pub path: crate::RemotePath,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub skip: Option<super::expression::Expression>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub map: Option<super::expression::Expression>,
pub input:
super::expression::WithExpression<super::expression::InputValueExpression>,
pub output: super::expression::Expression,
}
impl ScalarFunctionTaskExpression {
pub fn url(&self) -> String {
self.path.url()
}
pub fn compile(
self,
params: &super::expression::Params,
) -> Result<ScalarFunctionTask, super::expression::ExpressionError> {
let input = self.input.compile_one(params)?.compile(params)?;
Ok(ScalarFunctionTask {
path: self.path,
input,
output: self.output,
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(rename = "functions.ScalarFunctionTask")]
pub struct ScalarFunctionTask {
#[serde(flatten)]
#[schemars(schema_with = "crate::flatten_schema::<crate::RemotePath>")]
pub path: crate::RemotePath,
pub input: super::expression::InputValue,
pub output: super::expression::Expression,
}
impl ScalarFunctionTask {
pub fn url(&self) -> String {
self.path.url()
}
pub fn compile_output(
&self,
input: &super::expression::InputValue,
raw_output: super::expression::TaskOutput,
) -> Result<
super::expression::TaskOutputOwned,
super::expression::ExpressionError,
> {
let params =
super::expression::Params::Ref(super::expression::ParamsRef {
input,
output: Some(raw_output),
map: None,
tasks_min: None,
tasks_max: None,
depth: None,
name: None,
spec: None,
});
let compiled_output = self.output.compile_one(¶ms)?;
Ok(compiled_output)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, arbitrary::Arbitrary)]
#[schemars(rename = "functions.VectorFunctionTaskExpression")]
pub struct VectorFunctionTaskExpression {
#[serde(flatten)]
#[schemars(schema_with = "crate::flatten_schema::<crate::RemotePath>")]
pub path: crate::RemotePath,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub skip: Option<super::expression::Expression>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub map: Option<super::expression::Expression>,
pub input:
super::expression::WithExpression<super::expression::InputValueExpression>,
pub output: super::expression::Expression,
}
impl VectorFunctionTaskExpression {
pub fn url(&self) -> String {
self.path.url()
}
pub fn compile(
self,
params: &super::expression::Params,
) -> Result<VectorFunctionTask, super::expression::ExpressionError> {
let input = self.input.compile_one(params)?.compile(params)?;
Ok(VectorFunctionTask {
path: self.path,
input,
output: self.output,
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(rename = "functions.VectorFunctionTask")]
pub struct VectorFunctionTask {
#[serde(flatten)]
#[schemars(schema_with = "crate::flatten_schema::<crate::RemotePath>")]
pub path: crate::RemotePath,
pub input: super::expression::InputValue,
pub output: super::expression::Expression,
}
impl VectorFunctionTask {
pub fn url(&self) -> String {
self.path.url()
}
pub fn compile_output(
&self,
input: &super::expression::InputValue,
raw_output: super::expression::TaskOutput,
) -> Result<
super::expression::TaskOutputOwned,
super::expression::ExpressionError,
> {
let params =
super::expression::Params::Ref(super::expression::ParamsRef {
input,
output: Some(raw_output),
map: None,
tasks_min: None,
tasks_max: None,
depth: None,
name: None,
spec: None,
});
let compiled_output = self.output.compile_one(¶ms)?;
Ok(compiled_output)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, arbitrary::Arbitrary)]
#[schemars(rename = "functions.VectorCompletionTaskExpression")]
pub struct VectorCompletionTaskExpression {
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub skip: Option<super::expression::Expression>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub map: Option<super::expression::Expression>,
pub messages: super::expression::WithExpression<
Vec<
super::expression::WithExpression<
agent::completions::message::MessageExpression,
>,
>,
>,
pub responses: super::expression::WithExpression<
Vec<
super::expression::WithExpression<
agent::completions::message::RichContentExpression,
>,
>,
>,
pub output: super::expression::Expression,
}
impl VectorCompletionTaskExpression {
pub fn compile(
self,
params: &super::expression::Params,
) -> Result<VectorCompletionTask, super::expression::ExpressionError> {
let messages = self.messages.compile_one(params)?;
let mut compiled_messages = Vec::with_capacity(messages.len());
for message in messages {
match message.compile_one_or_many(params)? {
super::expression::OneOrMany::One(one_message) => {
compiled_messages.push(one_message.compile(params)?);
}
super::expression::OneOrMany::Many(many_messages) => {
for message in many_messages {
compiled_messages.push(message.compile(params)?);
}
}
}
}
let responses = self.responses.compile_one(params)?;
let mut compiled_responses = Vec::with_capacity(responses.len());
for response in responses {
match response.compile_one_or_many(params)? {
super::expression::OneOrMany::One(one_response) => {
compiled_responses.push(one_response.compile(params)?);
}
super::expression::OneOrMany::Many(many_responses) => {
for response in many_responses {
compiled_responses.push(response.compile(params)?);
}
}
}
}
Ok(VectorCompletionTask {
messages: compiled_messages,
responses: compiled_responses,
output: self.output,
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(rename = "functions.VectorCompletionTask")]
pub struct VectorCompletionTask {
pub messages: Vec<agent::completions::message::Message>,
pub responses: Vec<agent::completions::message::RichContent>,
pub output: super::expression::Expression,
}
impl VectorCompletionTask {
pub fn compile_output(
&self,
input: &super::expression::InputValue,
raw_output: super::expression::TaskOutput,
) -> Result<
super::expression::TaskOutputOwned,
super::expression::ExpressionError,
> {
let params =
super::expression::Params::Ref(super::expression::ParamsRef {
input,
output: Some(raw_output),
map: None,
tasks_min: None,
tasks_max: None,
depth: None,
name: None,
spec: None,
});
let compiled_output = self.output.compile_one(¶ms)?;
Ok(compiled_output)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, arbitrary::Arbitrary)]
#[schemars(rename = "functions.PlaceholderScalarFunctionTaskExpression")]
pub struct PlaceholderScalarFunctionTaskExpression {
pub input_schema: super::expression::InputSchema,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub skip: Option<super::expression::Expression>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub map: Option<super::expression::Expression>,
pub input:
super::expression::WithExpression<super::expression::InputValueExpression>,
pub output: super::expression::Expression,
}
impl PlaceholderScalarFunctionTaskExpression {
pub fn compile(
self,
params: &super::expression::Params,
) -> Result<PlaceholderScalarFunctionTask, super::expression::ExpressionError>
{
let input = self.input.compile_one(params)?.compile(params)?;
Ok(PlaceholderScalarFunctionTask {
input_schema: self.input_schema,
input,
output: self.output,
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(rename = "functions.PlaceholderScalarFunctionTask")]
pub struct PlaceholderScalarFunctionTask {
pub input_schema: super::expression::InputSchema,
pub input: super::expression::InputValue,
pub output: super::expression::Expression,
}
impl PlaceholderScalarFunctionTask {
pub fn compile_output(
&self,
input: &super::expression::InputValue,
raw_output: super::expression::TaskOutput,
) -> Result<
super::expression::TaskOutputOwned,
super::expression::ExpressionError,
> {
let params =
super::expression::Params::Ref(super::expression::ParamsRef {
input,
output: Some(raw_output),
map: None,
tasks_min: None,
tasks_max: None,
depth: None,
name: None,
spec: None,
});
let compiled_output = self.output.compile_one(¶ms)?;
Ok(compiled_output)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, arbitrary::Arbitrary)]
#[schemars(rename = "functions.PlaceholderVectorFunctionTaskExpression")]
pub struct PlaceholderVectorFunctionTaskExpression {
pub input_schema: super::expression::InputSchema,
pub output_length: super::expression::Expression,
pub input_split: super::expression::Expression,
pub input_merge: super::expression::Expression,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub skip: Option<super::expression::Expression>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub map: Option<super::expression::Expression>,
pub input:
super::expression::WithExpression<super::expression::InputValueExpression>,
pub output: super::expression::Expression,
}
impl PlaceholderVectorFunctionTaskExpression {
pub fn compile(
self,
params: &super::expression::Params,
) -> Result<PlaceholderVectorFunctionTask, super::expression::ExpressionError>
{
let input = self.input.compile_one(params)?.compile(params)?;
Ok(PlaceholderVectorFunctionTask {
input_schema: self.input_schema,
output_length: self.output_length,
input_split: self.input_split,
input_merge: self.input_merge,
input,
output: self.output,
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(rename = "functions.PlaceholderVectorFunctionTask")]
pub struct PlaceholderVectorFunctionTask {
pub input_schema: super::expression::InputSchema,
pub output_length: super::expression::Expression,
pub input_split: super::expression::Expression,
pub input_merge: super::expression::Expression,
pub input: super::expression::InputValue,
pub output: super::expression::Expression,
}
impl PlaceholderVectorFunctionTask {
pub fn compile_output(
&self,
input: &super::expression::InputValue,
raw_output: super::expression::TaskOutput,
) -> Result<
super::expression::TaskOutputOwned,
super::expression::ExpressionError,
> {
let params =
super::expression::Params::Ref(super::expression::ParamsRef {
input,
output: Some(raw_output),
map: None,
tasks_min: None,
tasks_max: None,
depth: None,
name: None,
spec: None,
});
let compiled_output = self.output.compile_one(¶ms)?;
Ok(compiled_output)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(untagged)]
#[schemars(rename = "functions.CompiledTask")]
pub enum CompiledTask {
#[schemars(title = "One")]
One(Task),
#[schemars(title = "Many")]
Many(Vec<Task>),
}