use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GraphDefinition {
pub name: String,
#[serde(default = "default_version")]
pub version: String,
pub description: Option<String>,
#[serde(default)]
pub model: Option<String>, #[serde(default)]
pub triggers: Vec<String>, #[serde(default)]
pub inputs: HashMap<String, String>, pub nodes: HashMap<String, NodeDefinition>,
}
fn default_version() -> String {
"1.0".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum NodeDefinition {
Llm {
#[serde(default)]
model: Option<String>, system_prompt: String,
#[serde(default)]
tools: Vec<String>, #[serde(default)]
edges: HashMap<String, String>, },
Function {
action: String, #[serde(default)]
edges: HashMap<String, String>,
},
Condition {
expr: String, edges: HashMap<String, String>, },
Graph {
graph_name: String,
#[serde(default)]
edges: HashMap<String, String>,
},
}
impl NodeDefinition {
pub fn edges(&self) -> &HashMap<String, String> {
match self {
NodeDefinition::Llm { edges, .. } => edges,
NodeDefinition::Function { edges, .. } => edges,
NodeDefinition::Condition { edges, .. } => edges,
NodeDefinition::Graph { edges, .. } => edges,
}
}
}