Packages
nous
0.15.1
0.17.0
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.17
0.12.16
0.12.15
0.12.14
0.12.13
0.12.12
0.12.11
0.12.9
0.12.7
0.12.6
0.12.5
0.12.3
0.12.2
0.12.0
0.11.3
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.5.0
AI agent framework for Elixir with multi-provider LLM support
Current section
Files
Jump to
Current section
Files
lib/nous/workflow/edge.ex
defmodule Nous.Workflow.Edge do
@moduledoc """
A directed edge connecting two nodes in a workflow graph.
Edges define execution flow between nodes. They can be unconditional
(sequential), conditional (evaluated against workflow state), or
default (fallback when no conditional edge matches).
## Edge Types
| Type | Behavior |
|------|----------|
| `:sequential` | Always followed (A -> B) |
| `:conditional` | Followed when `condition.(state)` returns `true` |
| `:default` | Followed when no sibling conditional edges match |
## Examples
Nous.Workflow.Edge.new(%{
from_id: "search",
to_id: "synthesize",
type: :sequential
})
Nous.Workflow.Edge.new(%{
from_id: "evaluate",
to_id: "publish",
type: :conditional,
condition: fn state -> state.data.quality >= 0.8 end
})
"""
@type edge_type :: :sequential | :conditional | :default
@type t :: %__MODULE__{
id: String.t(),
from_id: String.t(),
to_id: String.t(),
type: edge_type(),
condition: (Nous.Workflow.State.t() -> boolean()) | nil,
label: String.t() | nil,
metadata: map()
}
defstruct [
:id,
:from_id,
:to_id,
:condition,
:label,
type: :sequential,
metadata: %{}
]
@doc """
Create a new workflow edge.
Required: `:from_id` and `:to_id`.
## Examples
iex> edge = Nous.Workflow.Edge.new(%{from_id: "a", to_id: "b"})
iex> edge.type
:sequential
iex> is_binary(edge.id)
true
"""
@spec new(map()) :: t()
def new(attrs) when is_map(attrs) do
%__MODULE__{
id: Map.get(attrs, :id) || generate_id(),
from_id: attrs |> Map.fetch!(:from_id) |> to_string(),
to_id: attrs |> Map.fetch!(:to_id) |> to_string(),
type: Map.get(attrs, :type, :sequential),
condition: Map.get(attrs, :condition),
label: Map.get(attrs, :label),
metadata: Map.get(attrs, :metadata, %{})
}
end
defp generate_id do
:crypto.strong_rand_bytes(16) |> Base.encode16(case: :lower)
end
end