AgentForge.DynamicFlow (AgentForge v0.2.2)

View Source

Provides functions for dynamic flow creation and modification at runtime. Allows flows to adapt based on signal content and execution context.

Summary

Functions

Creates a handler that appends additional handlers based on signal content. The handlers_selector function should return a list of handlers to append.

Creates a flow merger that combines multiple flows into one. Each flow is executed in sequence with the same input signal. Results are collected and emitted as a batch.

Creates a handler that dynamically selects a flow based on signal content. The flow_selector function should return a list of handlers.

Creates a handler that dynamically creates and executes a subflow. The subflow_creator function should return a complete flow configuration.

Functions

append_handlers(handlers_selector)

Creates a handler that appends additional handlers based on signal content. The handlers_selector function should return a list of handlers to append.

Examples

iex> selector = fn signal, _ ->
...>   if String.contains?(signal.data, "urgent") do
...>     [fn _s, st -> {AgentForge.Signal.emit(:priority, "High priority"), st} end]
...>   else
...>     [fn _s, st -> {AgentForge.Signal.emit(:priority, "Normal priority"), st} end]
...>   end
...> end
iex> handler = AgentForge.DynamicFlow.append_handlers(selector)
iex> signal = AgentForge.Signal.new(:message, "urgent task")
iex> {{:emit, result}, _state} = handler.(signal, %{})
iex> result.data
"High priority"

merge_flows(flows)

Creates a flow merger that combines multiple flows into one. Each flow is executed in sequence with the same input signal. Results are collected and emitted as a batch.

Examples

iex> flows = [
...>   [fn _s, st -> {AgentForge.Signal.emit(:result1, "data_1"), st} end],
...>   [fn _s, st -> {AgentForge.Signal.emit(:result2, "data_2"), st} end]
...> ]
iex> merger = AgentForge.DynamicFlow.merge_flows(flows)
iex> signal = AgentForge.Signal.new(:start, "data")
iex> {{:emit_many, results}, _state} = merger.(signal, %{})
iex> length(results) == 2
true

select_flow(flow_selector)

Creates a handler that dynamically selects a flow based on signal content. The flow_selector function should return a list of handlers.

Examples

iex> selector = AgentForge.DynamicFlow.select_flow(fn signal, _ ->
...>   case signal.type do
...>     :text -> [fn _s, st -> {AgentForge.Signal.emit(:processed_text, signal.data), st} end]
...>     :number -> [fn _s, st -> {AgentForge.Signal.emit(:processed_number, signal.data * 2), st} end]
...>     _ -> [fn _s, st -> {AgentForge.Signal.emit(:unknown, signal.data), st} end]
...>   end
...> end)
iex> signal = AgentForge.Signal.new(:number, 5)
iex> {{:emit, result}, _state} = selector.(signal, %{})
iex> result.data
10

subflow(subflow_creator)

Creates a handler that dynamically creates and executes a subflow. The subflow_creator function should return a complete flow configuration.

Examples

iex> creator = fn signal, _ ->
...>   case signal.type do
...>     :validate -> [
...>       fn _s, st -> {AgentForge.Signal.emit(:validated, signal.data), st} end
...>     ]
...>     :process -> [
...>       fn _s, st -> {AgentForge.Signal.emit(:processed, signal.data), st} end
...>     ]
...>   end
...> end
iex> handler = AgentForge.DynamicFlow.subflow(creator)
iex> signal = AgentForge.Signal.new(:validate, "test")
iex> {{:emit, result}, _state} = handler.(signal, %{})
iex> result.type == :validated
true