diff --git a/pdl-live-react/src-tauri/src/compile/beeai.rs b/pdl-live-react/src-tauri/src/compile/beeai.rs index a13fa0e0c..76d2d3c7c 100644 --- a/pdl-live-react/src-tauri/src/compile/beeai.rs +++ b/pdl-live-react/src-tauri/src/compile/beeai.rs @@ -191,7 +191,6 @@ fn with_tools( fn call_tools(model: &String, parameters: &HashMap) -> PdlBlock { let repeat = PdlBlock::Text(TextBlock { - def: None, metadata: None, role: None, parser: None, @@ -207,6 +206,7 @@ fn call_tools(model: &String, parameters: &HashMap) -> PdlBlock { tool_call_id: Some("${ tool.id }".to_string()), content: Box::new(PdlBlock::Call(CallBlock { metadata: Some(Metadata { + def: None, defs: json_loads( &"args", &"pdl__args", @@ -465,7 +465,6 @@ asyncio.run(invoke()) model_call.push(PdlBlock::Text(TextBlock { role: Some(Role::System), text: vec![PdlBlock::String(instructions)], - def: None, metadata: None, parser: None, description: Some("Model instructions".into()), @@ -482,9 +481,9 @@ asyncio.run(invoke()) }; model_call.push(PdlBlock::Model(ModelBlock { + metadata: None, input: None, description: Some(description), - def: None, model: model.clone(), model_response: model_response, pdl_result: None, @@ -505,7 +504,6 @@ asyncio.run(invoke()) PdlBlock::Function(FunctionBlock { function: HashMap::new(), return_: Box::new(PdlBlock::Text(TextBlock { - def: None, metadata: None, role: None, parser: None, @@ -515,8 +513,10 @@ asyncio.run(invoke()) }), ); PdlBlock::Text(TextBlock { - def: None, - metadata: Some(Metadata { defs: Some(defs) }), + metadata: Some(Metadata { + def: None, + defs: Some(defs), + }), role: None, parser: None, description: Some("Model call wrapper".to_string()), @@ -534,7 +534,6 @@ asyncio.run(invoke()) .collect::>(); let pdl: PdlBlock = PdlBlock::Text(TextBlock { - def: None, metadata: if tool_declarations.len() == 0 { None } else { @@ -545,7 +544,10 @@ asyncio.run(invoke()) object: tool_declarations, }), ); - Some(Metadata { defs: Some(m) }) + Some(Metadata { + def: None, + defs: Some(m), + }) }, description: Some(bee.workflow.workflow.name), role: None, diff --git a/pdl-live-react/src-tauri/src/pdl/ast.rs b/pdl-live-react/src-tauri/src/pdl/ast.rs index 8e5398f0b..599304208 100644 --- a/pdl-live-react/src-tauri/src/pdl/ast.rs +++ b/pdl-live-react/src-tauri/src/pdl/ast.rs @@ -56,6 +56,17 @@ pub enum PdlType { pub struct Metadata { #[serde(skip_serializing_if = "Option::is_none")] pub defs: Option>, + + #[serde(skip_serializing_if = "Option::is_none")] + pub def: Option, +} +impl Default for Metadata { + fn default() -> Self { + Self { + defs: None, + def: None, + } + } } /// Call a function @@ -88,7 +99,6 @@ pub trait SequencingBlock { fn kind(&self) -> &str; fn description(&self) -> &Option; fn role(&self) -> &Option; - fn def(&self) -> &Option; fn metadata(&self) -> &Option; fn items(&self) -> &Vec; fn with_items(&self, items: Vec) -> Self; @@ -118,9 +128,6 @@ pub struct LastOfBlock { #[serde(skip_serializing_if = "Option::is_none")] pub parser: Option, - - #[serde(skip_serializing_if = "Option::is_none")] - pub def: Option, } impl SequencingBlock for LastOfBlock { fn kind(&self) -> &str { @@ -132,9 +139,6 @@ impl SequencingBlock for LastOfBlock { fn role(&self) -> &Option { &self.role } - fn def(&self) -> &Option { - return &self.def; - } fn metadata(&self) -> &Option { &self.metadata } @@ -186,9 +190,6 @@ pub struct TextBlock { #[serde(skip_serializing_if = "Option::is_none")] pub parser: Option, - - #[serde(skip_serializing_if = "Option::is_none")] - pub def: Option, } impl SequencingBlock for TextBlock { fn kind(&self) -> &str { @@ -200,9 +201,6 @@ impl SequencingBlock for TextBlock { fn role(&self) -> &Option { &self.role } - fn def(&self) -> &Option { - return &self.def; - } fn metadata(&self) -> &Option { &self.metadata } @@ -237,7 +235,6 @@ impl SequencingBlock for TextBlock { impl TextBlock { pub fn new(text: Vec) -> Self { TextBlock { - def: None, metadata: None, description: None, role: None, @@ -247,7 +244,16 @@ impl TextBlock { } pub fn def(&mut self, def: &str) -> &mut Self { - self.def = Some(def.into()); + match &mut self.metadata { + Some(metadata) => { + metadata.def = Some(def.into()); + } + None => { + let mut metadata: Metadata = Default::default(); + metadata.def = Some(def.into()); + self.metadata = Some(metadata); + } + } self } @@ -295,12 +301,14 @@ pub struct PdlUsage { #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(tag = "kind", rename = "model")] pub struct ModelBlock { + #[serde(flatten)] + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, pub model: String, #[serde(skip_serializing_if = "Option::is_none")] - pub def: Option, - #[serde(skip_serializing_if = "Option::is_none")] pub parameters: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub input: Option>, @@ -318,7 +326,7 @@ pub struct ModelBlock { impl ModelBlock { pub fn new(model: &str) -> Self { ModelBlock { - def: None, + metadata: None, description: None, model_response: None, parameters: None, @@ -433,15 +441,16 @@ pub struct ObjectBlock { #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(tag = "kind")] pub struct DataBlock { + #[serde(flatten)] + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata: Option, + pub data: Value, /// Do not evaluate expressions inside strings. #[serde(skip_serializing_if = "Option::is_none")] pub raw: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub def: Option, - #[serde(skip_serializing_if = "Option::is_none")] pub parser: Option, } @@ -486,6 +495,10 @@ pub enum StringOrNull { #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(tag = "kind", rename = "read")] pub struct ReadBlock { + #[serde(flatten)] + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata: Option, + /// Name of the file to read. If `None`, read the standard input. pub read: StringOrNull, @@ -495,9 +508,6 @@ pub struct ReadBlock { /// Indicate if one or multiple lines should be read. pub multiline: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub def: Option, - #[serde(skip_serializing_if = "Option::is_none")] pub parser: Option, } diff --git a/pdl-live-react/src-tauri/src/pdl/interpreter.rs b/pdl-live-react/src-tauri/src/pdl/interpreter.rs index 171a5d175..ba834127e 100644 --- a/pdl-live-react/src-tauri/src/pdl/interpreter.rs +++ b/pdl-live-react/src-tauri/src/pdl/interpreter.rs @@ -366,7 +366,7 @@ impl<'a> Interpreter<'a> { }; let result = self.def( - &block.def, + &block.metadata.as_ref().and_then(|m| m.def.clone()), &buffer.clone().into(), &block.parser, state, @@ -747,7 +747,7 @@ impl<'a> Interpreter<'a> { let mut trace = block.clone(); if let Some(true) = block.raw { let result = self.def( - &block.def, + &block.metadata.as_ref().and_then(|m| m.def.clone()), &resultify(&block.data), &block.parser, state, @@ -756,7 +756,7 @@ impl<'a> Interpreter<'a> { Ok((result, vec![], PdlBlock::Data(trace))) } else { let result = self.def( - &block.def, + &block.metadata.as_ref().and_then(|m| m.def.clone()), &self.eval_json(&block.data, state)?, &block.parser, state, @@ -914,7 +914,7 @@ impl<'a> Interpreter<'a> { let trace = block.with_items(output_blocks); let result = self.def( - trace.def(), + &block.metadata().as_ref().and_then(|m| m.def.clone()), &trace.result_for(output_results), trace.parser(), state,