Skip to main content

enact_core/graph/
schema.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct GraphDefinition {
6    pub name: String,
7    #[serde(default = "default_version")]
8    pub version: String,
9    pub description: Option<String>,
10    #[serde(default)]
11    pub model: Option<String>, // default model for all LLM nodes in this graph
12    #[serde(default)]
13    pub triggers: Vec<String>, // "manual", "cron:...", etc.
14    #[serde(default)]
15    pub inputs: HashMap<String, String>, // name -> description or type
16    pub nodes: HashMap<String, NodeDefinition>,
17}
18
19fn default_version() -> String {
20    "1.0".to_string()
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize)]
24#[serde(tag = "type", rename_all = "snake_case")]
25pub enum NodeDefinition {
26    /// LLM-based agent node
27    Llm {
28        #[serde(default)]
29        model: Option<String>, // e.g., "gpt-4o"
30        system_prompt: String,
31        #[serde(default)]
32        tools: Vec<String>, // tool names
33        #[serde(default)]
34        edges: HashMap<String, String>, // output matching -> target node
35    },
36    /// Function execution node (e.g., shell command, script)
37    Function {
38        action: String, // e.g., "scripts/check_style.sh"
39        #[serde(default)]
40        edges: HashMap<String, String>,
41    },
42    /// Conditional branching node (no LLM, just logic)
43    Condition {
44        expr: String,                   // e.g. "input.contains('error')"
45        edges: HashMap<String, String>, // "true" -> nodeA, "false" -> nodeB
46    },
47    /// Sub-graph execution
48    Graph {
49        graph_name: String,
50        #[serde(default)]
51        edges: HashMap<String, String>,
52    },
53}
54
55impl NodeDefinition {
56    pub fn edges(&self) -> &HashMap<String, String> {
57        match self {
58            NodeDefinition::Llm { edges, .. } => edges,
59            NodeDefinition::Function { edges, .. } => edges,
60            NodeDefinition::Condition { edges, .. } => edges,
61            NodeDefinition::Graph { edges, .. } => edges,
62        }
63    }
64}