langgraph_core_rs/pregel/
mod.rs1pub mod algo;
2pub mod read;
3pub mod write;
4pub mod runner;
5pub mod io;
6
7pub use algo::{prepare_next_tasks, apply_writes};
8pub use read::PregelNode;
9pub use write::{ChannelWrite, ChannelWriteEntry};
10pub use runner::PregelRunner;
11pub use io::{map_input, map_command, read_channels, NULL_TASK_ID};
12
13use std::collections::HashMap;
14use std::sync::Arc;
15use serde_json::Value as JsonValue;
16use langgraph_checkpoint::config::RunnableConfig;
17use crate::channels::Channel;
18use crate::runnable::Runnable;
19
20#[derive(Debug, Clone)]
22pub struct PregelTask {
23 pub name: String,
25 pub input: JsonValue,
27 pub input_channels: Vec<String>,
29 pub triggers: Vec<String>,
31 pub id: String,
33}
34
35pub struct PregelExecutableTask {
37 pub name: String,
39 pub input: JsonValue,
41 pub proc: Arc<dyn Runnable>,
43 pub writes: Vec<(String, JsonValue)>,
45 pub config: RunnableConfig,
47 pub triggers: Vec<String>,
49 pub id: String,
51}
52
53#[derive(Debug, Clone, PartialEq)]
55pub enum LoopStatus {
56 Input,
58 Pending,
60 Done,
62 InterruptBefore,
64 InterruptAfter,
66 OutOfSteps,
68}
69
70pub type ChannelVersions = HashMap<String, JsonValue>;
72
73pub type TriggerToNodes = HashMap<String, Vec<String>>;
75
76pub fn build_trigger_to_nodes(nodes: &HashMap<String, PregelNode>) -> TriggerToNodes {
78 let mut map: TriggerToNodes = HashMap::new();
79 for (name, node) in nodes {
80 for trigger in &node.triggers {
81 map.entry(trigger.clone()).or_default().push(name.clone());
82 }
83 }
84 map
85}
86
87pub fn channels_from_checkpoint(
89 specs: &HashMap<String, Box<dyn Channel>>,
90 checkpoint_channels: &HashMap<String, Option<JsonValue>>,
91) -> HashMap<String, Box<dyn Channel>> {
92 let mut channels = HashMap::new();
93 for (key, spec) in specs {
94 let cp = checkpoint_channels.get(key).and_then(|v| v.as_ref());
95 channels.insert(key.clone(), spec.from_checkpoint(cp));
96 }
97 channels
98}