prompty 2.0.0-alpha.8

Prompty is an asset class and format for LLM prompts
Documentation
// Code generated by AgentSchema emitter; DO NOT EDIT.

use super::context::{LoadContext, SaveContext};

use super::format_config::FormatConfig;

use super::parser_config::ParserConfig;

/// Template model for defining prompt templates.  This model specifies the rendering engine used for slot filling prompts, the parser used to process the rendered template into API-compatible format, and additional options for the template engine.  It allows for the creation of reusable templates that can be filled with dynamic data and processed to generate prompts for AI models.
#[derive(Debug, Clone, Default)]
pub struct Template {
    /// Template rendering engine used for slot filling prompts (e.g., mustache, jinja2)
    pub format: FormatConfig,
    /// Parser used to process the rendered template into API-compatible format
    pub parser: ParserConfig,
}

impl Template {
    /// Create a new Template with default values.
    pub fn new() -> Self {
        Self::default()
    }

    /// Load Template from a JSON string.
    pub fn from_json(json: &str, ctx: &LoadContext) -> Result<Self, serde_json::Error> {
        let value: serde_json::Value = serde_json::from_str(json)?;
        Ok(Self::load_from_value(&value, ctx))
    }

    /// Load Template from a YAML string.
    pub fn from_yaml(yaml: &str, ctx: &LoadContext) -> Result<Self, serde_yaml::Error> {
        let value: serde_json::Value = serde_yaml::from_str(yaml)?;
        Ok(Self::load_from_value(&value, ctx))
    }

    /// Load Template from a `serde_json::Value`.
    ///
    /// Calls `ctx.process_input` before field extraction.
    pub fn load_from_value(value: &serde_json::Value, ctx: &LoadContext) -> Self {
        let value = ctx.process_input(value.clone());
        Self {
            format: value
                .get("format")
                .filter(|v| v.is_object() || v.is_array() || v.is_string())
                .map(|v| FormatConfig::load_from_value(v, ctx))
                .unwrap_or_default(),
            parser: value
                .get("parser")
                .filter(|v| v.is_object() || v.is_array() || v.is_string())
                .map(|v| ParserConfig::load_from_value(v, ctx))
                .unwrap_or_default(),
        }
    }

    /// Serialize Template to a `serde_json::Value`.
    ///
    /// Calls `ctx.process_dict` after serialization.
    pub fn to_value(&self, ctx: &SaveContext) -> serde_json::Value {
        let mut result = serde_json::Map::new();
        {
            let nested = self.format.to_value(ctx);
            if !nested.is_null() {
                result.insert("format".to_string(), nested);
            }
        }
        {
            let nested = self.parser.to_value(ctx);
            if !nested.is_null() {
                result.insert("parser".to_string(), nested);
            }
        }
        ctx.process_dict(serde_json::Value::Object(result))
    }

    /// Serialize Template to a JSON string.
    pub fn to_json(&self, ctx: &SaveContext) -> Result<String, serde_json::Error> {
        serde_json::to_string_pretty(&self.to_value(ctx))
    }

    /// Serialize Template to a YAML string.
    pub fn to_yaml(&self, ctx: &SaveContext) -> Result<String, serde_yaml::Error> {
        serde_yaml::to_string(&self.to_value(ctx))
    }
}