Documentation
¶
Overview ¶
Package graph provides the StateGraph durable execution runtime.
Index ¶
- Constants
- type AppendReducer
- type CompiledGraph
- type Edge
- type EdgeCondition
- type EntrypointFunc
- type MergeFunc
- type MergeMapReducer
- type Message
- type Node
- type NodeFunc
- type Reducer
- type ReducerFunc
- type ReplaceReducer
- type RunState
- type RunStatus
- type Runner
- func (r *Runner) ForkFrom(ctx context.Context, checkpointID string, stateUpdate map[string]any) (*RunState, error)
- func (r *Runner) ReplayFrom(ctx context.Context, checkpointID string) (*RunState, error)
- func (r *Runner) Resume(ctx context.Context, sessionID string) (*RunState, error)
- func (r *Runner) ResumeFromCheckpoint(ctx context.Context, checkpointID string) (*RunState, error)
- func (r *Runner) Run(ctx context.Context, sessionID string, initial State) (*RunState, error)
- func (r *Runner) Stream() <-chan StreamEvent
- func (r *Runner) WithBroker(b *stream.Broker) *Runner
- func (r *Runner) WithTracer(t *trace.Collector) *Runner
- type State
- type StateGraph
- func (g *StateGraph) AddConditionalEdge(from string, condition EdgeCondition) *StateGraph
- func (g *StateGraph) AddEdge(from, to string) *StateGraph
- func (g *StateGraph) AddInterruptNode(id string, fn NodeFunc) *StateGraph
- func (g *StateGraph) AddNode(id string, fn NodeFunc) *StateGraph
- func (g *StateGraph) AddSubgraph(id string, sub *CompiledGraph) *StateGraph
- func (g *StateGraph) Compile() (*CompiledGraph, error)
- func (g *StateGraph) SetEntryPoint(nodeID string) *StateGraph
- func (g *StateGraph) SetFinishPoint(nodeID string) *StateGraph
- type StateSchema
- type StreamEvent
- type TaskFunc
- type ToolCallRecord
- type UsageStats
Constants ¶
const ( StartNode = "__start__" EndNode = "__end__" )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AppendReducer ¶ added in v0.3.0
type AppendReducer struct{}
AppendReducer appends update elements to an existing slice. If the existing value is not a slice, it is replaced. If the update is a single value, it is wrapped in a slice and appended.
func (AppendReducer) Reduce ¶ added in v0.3.0
func (AppendReducer) Reduce(existing, update any) any
type CompiledGraph ¶
type CompiledGraph struct {
ID string
Nodes map[string]*Node
AdjList map[string][]*Edge // from -> edges
Entry string
}
CompiledGraph is the immutable, validated graph ready for execution.
func RegisterEntrypoint ¶ added in v0.3.0
func RegisterEntrypoint(name string, fn EntrypointFunc) (*CompiledGraph, error)
RegisterEntrypoint wraps a Go function as a graph entrypoint. The returned CompiledGraph has a single node that runs the function, integrating with checkpointing and durable execution.
func TaskGraph ¶ added in v0.3.0
func TaskGraph(id string, tasks map[string]TaskFunc) (*CompiledGraph, error)
TaskGraph creates a CompiledGraph from a sequence of named tasks. Tasks are chained linearly: the output of each becomes the input of the next.
func (*CompiledGraph) ToDOT ¶ added in v0.3.0
func (cg *CompiledGraph) ToDOT() string
ToDOT generates a Graphviz DOT format representation of the compiled graph.
func (*CompiledGraph) ToMermaid ¶ added in v0.3.0
func (cg *CompiledGraph) ToMermaid() string
ToMermaid generates a Mermaid flowchart definition of the compiled graph.
type Edge ¶
type Edge struct {
From string
To string // static target (mutually exclusive with Condition)
Condition EdgeCondition // dynamic routing (mutually exclusive with To)
}
Edge represents a transition between nodes.
type EdgeCondition ¶
EdgeCondition decides which node to transition to based on state. Returns the target node ID.
type EntrypointFunc ¶ added in v0.3.0
EntrypointFunc is a function that serves as a graph entrypoint.
type MergeFunc ¶ added in v0.3.0
MergeFunc combines the results of parallel branches into a single state. It receives the original pre-fork state and the results from each branch.
type MergeMapReducer ¶ added in v0.3.0
type MergeMapReducer struct{}
MergeMapReducer performs a shallow merge of two maps. Update keys overwrite existing keys. Non-map values are replaced.
func (MergeMapReducer) Reduce ¶ added in v0.3.0
func (MergeMapReducer) Reduce(existing, update any) any
type Node ¶
type Node struct {
ID string
Fn NodeFunc
// Interrupt, if true, causes the runner to checkpoint and pause before executing this node.
Interrupt bool
}
Node represents a node in the state graph.
type NodeFunc ¶
NodeFunc is the function signature for a graph node. It receives the current state and returns updated state.
func FanOut ¶ added in v0.3.0
FanOut creates a NodeFunc that executes multiple node functions in parallel. Each function receives a copy of the input state. Results are merged back using a MergeFunc.
func RegisterTask ¶ added in v0.3.0
RegisterTask marks a function as a checkpoint-able task. The result is automatically cached by task name and input hash. If the task was already completed in a previous run (via checkpoint), the cached result is returned without re-executing the function.
func SubgraphNode ¶ added in v0.3.0
func SubgraphNode(sub *CompiledGraph) NodeFunc
SubgraphNode wraps a CompiledGraph as a NodeFunc so it can be used as a node within another graph. The subgraph executes inline, sharing the parent's state.
type Reducer ¶ added in v0.3.0
Reducer defines how a state value is combined when a node returns an update. The default behavior (nil reducer) is full replacement, but specific keys can be configured to append to slices, merge maps, etc.
type ReducerFunc ¶ added in v0.3.0
ReducerFunc is a convenience adapter for functions.
func (ReducerFunc) Reduce ¶ added in v0.3.0
func (f ReducerFunc) Reduce(existing, update any) any
type ReplaceReducer ¶ added in v0.3.0
type ReplaceReducer struct{}
ReplaceReducer always replaces the existing value with the update. This is the default behavior when no reducer is configured.
func (ReplaceReducer) Reduce ¶ added in v0.3.0
func (ReplaceReducer) Reduce(_, update any) any
type RunState ¶
type RunState struct {
RunID string `json:"run_id"`
SessionID string `json:"session_id"`
GraphID string `json:"graph_id"`
CurrentNode string `json:"current_node"`
Status RunStatus `json:"status"`
State State `json:"state"`
SeqNum int64 `json:"seq_num"`
StartedAt time.Time `json:"started_at"`
UpdatedAt time.Time `json:"updated_at"`
// Rich output (Agno-inspired)
Messages []Message `json:"messages,omitempty"`
ToolCalls []ToolCallRecord `json:"tool_calls,omitempty"`
TotalUsage UsageStats `json:"total_usage"`
}
RunState captures the full runtime state for a single graph execution.
type Runner ¶
type Runner struct {
// contains filtered or unexported fields
}
Runner executes a CompiledGraph with durable checkpointing.
func NewRunner ¶
func NewRunner(g *CompiledGraph, store storage.Storage) *Runner
NewRunner creates a runner for the given compiled graph.
func (*Runner) ForkFrom ¶ added in v0.3.0
func (r *Runner) ForkFrom(ctx context.Context, checkpointID string, stateUpdate map[string]any) (*RunState, error)
ForkFrom creates a new execution branch from a specific checkpoint with modified state. The original checkpoint history is preserved; the fork continues independently.
func (*Runner) ReplayFrom ¶ added in v0.3.0
ReplayFrom loads a checkpoint and re-executes the graph from the checkpoint's node. All nodes before the checkpoint node are skipped (treated as cached). Re-execution starts at the checkpoint's node and continues to END.
func (*Runner) Resume ¶
Resume continues execution from the latest checkpoint for the given session.
func (*Runner) ResumeFromCheckpoint ¶
ResumeFromCheckpoint resumes from a specific checkpoint (time-travel).
func (*Runner) Stream ¶
func (r *Runner) Stream() <-chan StreamEvent
Stream returns a channel of execution events for real-time observability.
func (*Runner) WithBroker ¶
WithBroker attaches an SSE Broker so the runner publishes events to SSE subscribers.
type StateGraph ¶
type StateGraph struct {
// contains filtered or unexported fields
}
StateGraph is a builder for defining directed graphs with durable execution.
func (*StateGraph) AddConditionalEdge ¶
func (g *StateGraph) AddConditionalEdge(from string, condition EdgeCondition) *StateGraph
AddConditionalEdge adds a dynamic edge that routes based on state.
func (*StateGraph) AddEdge ¶
func (g *StateGraph) AddEdge(from, to string) *StateGraph
AddEdge adds a static edge from one node to another.
func (*StateGraph) AddInterruptNode ¶
func (g *StateGraph) AddInterruptNode(id string, fn NodeFunc) *StateGraph
AddInterruptNode registers a node that will pause execution for human approval.
func (*StateGraph) AddNode ¶
func (g *StateGraph) AddNode(id string, fn NodeFunc) *StateGraph
AddNode registers a node with the given ID and handler function.
func (*StateGraph) AddSubgraph ¶ added in v0.3.0
func (g *StateGraph) AddSubgraph(id string, sub *CompiledGraph) *StateGraph
AddSubgraph registers a compiled graph as a node within this graph.
func (*StateGraph) Compile ¶
func (g *StateGraph) Compile() (*CompiledGraph, error)
Compile validates the graph and returns a CompiledGraph.
func (*StateGraph) SetEntryPoint ¶
func (g *StateGraph) SetEntryPoint(nodeID string) *StateGraph
SetEntryPoint sets the starting node of the graph.
func (*StateGraph) SetFinishPoint ¶
func (g *StateGraph) SetFinishPoint(nodeID string) *StateGraph
SetFinishPoint sets the ending node of the graph.
type StateSchema ¶ added in v0.3.0
StateSchema maps state keys to their reducers. Keys not in the schema use the default ReplaceReducer behavior.
func (StateSchema) ApplyUpdate ¶ added in v0.3.0
func (s StateSchema) ApplyUpdate(existing, update State) State
ApplyUpdate merges an update into the existing state using the schema's reducers.
type StreamEvent ¶
type StreamEvent struct {
Type string `json:"type"` // node_start, node_end, edge_transition, checkpoint, interrupt, error
NodeID string `json:"node_id,omitempty"`
State State `json:"state,omitempty"`
Error string `json:"error,omitempty"`
Timestamp time.Time `json:"timestamp"`
}
StreamEvent is emitted during graph execution for real-time observability.
type ToolCallRecord ¶
type ToolCallRecord struct {
Name string `json:"name"`
Args map[string]any `json:"args"`
Result any `json:"result"`
Error string `json:"error,omitempty"`
}
ToolCallRecord records a tool invocation during the run.
type UsageStats ¶
type UsageStats struct {
PromptTokens int `json:"prompt_tokens"`
CompletionTokens int `json:"completion_tokens"`
TotalTokens int `json:"total_tokens"`
}
UsageStats tracks cumulative token usage across a run.