Class: SwarmSDK::NodeContext

Inherits:
Object
  • Object
show all
Defined in:
lib/swarm_sdk/node_context.rb

Overview

NodeContext provides context information to node transformers

This class is passed to input and output transformers, giving them access to:

  • The original user prompt
  • Results from all previous nodes
  • Current node metadata
  • Convenience accessors for common operations

Examples:

Input transformer

input do |ctx|
  ctx.content              # Previous node's content (convenience)
  ctx.original_prompt      # Original user prompt
  ctx.all_results[:plan]   # Access any previous node
  ctx.node_name            # Current node name
end

Output transformer

output do |ctx|
  ctx.content              # Current result's content (convenience)
  ctx.original_prompt      # Original user prompt
  ctx.all_results[:plan]   # Access previous nodes
end

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(previous_result:, all_results:, original_prompt:, node_name:, dependencies:, result:, transformed_content:) ⇒ NodeContext

Returns a new instance of NodeContext.



77
78
79
80
81
82
83
84
85
# File 'lib/swarm_sdk/node_context.rb', line 77

def initialize(previous_result:, all_results:, original_prompt:, node_name:, dependencies:, result:, transformed_content:)
  @previous_result = previous_result
  @result = result
  @all_results = all_results
  @original_prompt = original_prompt
  @node_name = node_name
  @dependencies = dependencies
  @transformed_content = transformed_content
end

Instance Attribute Details

#all_resultsObject (readonly)

Returns the value of attribute all_results.



27
28
29
# File 'lib/swarm_sdk/node_context.rb', line 27

def all_results
  @all_results
end

#dependenciesObject (readonly)

Returns the value of attribute dependencies.



27
28
29
# File 'lib/swarm_sdk/node_context.rb', line 27

def dependencies
  @dependencies
end

#node_nameObject (readonly)

Returns the value of attribute node_name.



27
28
29
# File 'lib/swarm_sdk/node_context.rb', line 27

def node_name
  @node_name
end

#original_promptObject (readonly)

Returns the value of attribute original_prompt.



27
28
29
# File 'lib/swarm_sdk/node_context.rb', line 27

def original_prompt
  @original_prompt
end

#previous_resultObject (readonly)

For input transformers: result from previous node(s)



30
31
32
# File 'lib/swarm_sdk/node_context.rb', line 30

def previous_result
  @previous_result
end

#resultObject (readonly)

For output transformers: current node's result



33
34
35
# File 'lib/swarm_sdk/node_context.rb', line 33

def result
  @result
end

Class Method Details

.for_input(previous_result:, all_results:, original_prompt:, node_name:, dependencies:, transformed_content: nil) ⇒ NodeContext

Create a NodeContext for input transformers

Parameters:

  • previous_result (Result, Hash, String)

    Previous node's result or hash of results

  • all_results (Hash<Symbol, Result>)

    Results from all completed nodes

  • original_prompt (String)

    The original user prompt

  • node_name (Symbol)

    Current node name

  • dependencies (Array<Symbol>)

    Node dependencies

  • transformed_content (String, nil) (defaults to: nil)

    Already-transformed content from previous output transformer

Returns:



45
46
47
48
49
50
51
52
53
54
55
# File 'lib/swarm_sdk/node_context.rb', line 45

def for_input(previous_result:, all_results:, original_prompt:, node_name:, dependencies:, transformed_content: nil)
  new(
    previous_result: previous_result,
    all_results: all_results,
    original_prompt: original_prompt,
    node_name: node_name,
    dependencies: dependencies,
    result: nil,
    transformed_content: transformed_content,
  )
end

.for_output(result:, all_results:, original_prompt:, node_name:) ⇒ NodeContext

Create a NodeContext for output transformers

Parameters:

  • result (Result)

    Current node's execution result

  • all_results (Hash<Symbol, Result>)

    Results from all completed nodes (including current)

  • original_prompt (String)

    The original user prompt

  • node_name (Symbol)

    Current node name

Returns:



64
65
66
67
68
69
70
71
72
73
74
# File 'lib/swarm_sdk/node_context.rb', line 64

def for_output(result:, all_results:, original_prompt:, node_name:)
  new(
    result: result,
    all_results: all_results,
    original_prompt: original_prompt,
    node_name: node_name,
    dependencies: [],
    previous_result: nil,
    transformed_content: nil,
  )
end

Instance Method Details

#agentString?

Convenience accessor: Get agent from previous_result or result

Returns:

  • (String, nil)


118
119
120
121
122
123
124
# File 'lib/swarm_sdk/node_context.rb', line 118

def agent
  if @result
    @result.agent
  elsif @previous_result.respond_to?(:agent)
    @previous_result.agent
  end
end

#contentString?

Convenience accessor: Get content from previous_result or result

For input transformers:

- Returns transformed_content if available (from previous output transformer)
- Otherwise returns previous_result.content (original content)
- Returns nil for multiple dependencies (use all_results instead)

For output transformers: returns result.content

Returns:

  • (String, nil)


96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/swarm_sdk/node_context.rb', line 96

def content
  if @result
    # Output transformer context: return current result's content
    @result.content
  elsif @transformed_content
    # Input transformer with transformed content from previous output
    @transformed_content
  elsif @previous_result.respond_to?(:content)
    # Input transformer context with Result object (original content)
    @previous_result.content
  elsif @previous_result.is_a?(Hash)
    # Input transformer with multiple dependencies (hash of results)
    nil # No single "content" - user must pick from all_results hash
  else
    # String or other type (initial prompt, no dependencies)
    @previous_result.to_s
  end
end

#durationFloat?

Convenience accessor: Get duration from previous_result or result

Returns:

  • (Float, nil)


140
141
142
143
144
145
146
# File 'lib/swarm_sdk/node_context.rb', line 140

def duration
  if @result
    @result.duration
  elsif @previous_result.respond_to?(:duration)
    @previous_result.duration
  end
end

#errorException?

Convenience accessor: Get error from previous_result or result

Returns:

  • (Exception, nil)


151
152
153
154
155
156
157
# File 'lib/swarm_sdk/node_context.rb', line 151

def error
  if @result
    @result.error
  elsif @previous_result.respond_to?(:error)
    @previous_result.error
  end
end

#goto_node(node, content:) ⇒ Hash

Jump to a different node with provided content as input

Valid for both input and output transformers.

Examples:

input do |ctx|
  return ctx.goto_node(:review, content: ctx.content) if needs_review?(ctx.content)
  ctx.content
end

Parameters:

  • node (Symbol)

    Node name to jump to

  • content (String)

    Content to pass to target node

Returns:

  • (Hash)

    Control hash for goto_node

Raises:

  • (ArgumentError)

    If content is nil



234
235
236
237
238
239
240
241
242
243
# File 'lib/swarm_sdk/node_context.rb', line 234

def goto_node(node, content:)
  if content.nil?
    raise ArgumentError,
      "goto_node requires content (got nil). " \
        "Check that ctx.content or your content source is not nil. " \
        "This often happens when the previous node failed with an error. " \
        "Node: #{@node_name}, Target: #{node}"
  end
  { goto_node: node.to_sym, content: content }
end

#halt_workflow(content:) ⇒ Hash

Halt entire workflow and return content as final result

Valid for both input and output transformers.

Examples:

output do |ctx|
  return ctx.halt_workflow(content: ctx.content) if converged?(ctx.content)
  ctx.content
end

Parameters:

  • content (String)

    Final content to return

Returns:

  • (Hash)

    Control hash for halt_workflow

Raises:

  • (ArgumentError)

    If content is nil



210
211
212
213
214
215
216
217
218
# File 'lib/swarm_sdk/node_context.rb', line 210

def halt_workflow(content:)
  if content.nil?
    raise ArgumentError,
      "halt_workflow requires content (got nil). " \
        "Check that ctx.content or your content source is not nil. " \
        "Node: #{@node_name}"
  end
  { halt_workflow: true, content: content }
end

#logsArray?

Convenience accessor: Get logs from previous_result or result

Returns:

  • (Array, nil)


129
130
131
132
133
134
135
# File 'lib/swarm_sdk/node_context.rb', line 129

def logs
  if @result
    @result.logs
  elsif @previous_result.respond_to?(:logs)
    @previous_result.logs
  end
end

#skip_execution(content:) ⇒ Hash

Skip current node's LLM execution and return content immediately

Only valid for input transformers.

Examples:

input do |ctx|
  cached = check_cache(ctx.content)
  return ctx.skip_execution(content: cached) if cached
  ctx.content
end

Parameters:

  • content (String)

    Content to return (skips LLM call)

Returns:

  • (Hash)

    Control hash for skip_execution

Raises:

  • (ArgumentError)

    If content is nil



187
188
189
190
191
192
193
194
195
# File 'lib/swarm_sdk/node_context.rb', line 187

def skip_execution(content:)
  if content.nil?
    raise ArgumentError,
      "skip_execution requires content (got nil). " \
        "Check that ctx.content or your content source is not nil. " \
        "Node: #{@node_name}"
  end
  { skip_execution: true, content: content }
end

#success?Boolean?

Convenience accessor: Check success status

Returns:

  • (Boolean, nil)


162
163
164
165
166
167
168
# File 'lib/swarm_sdk/node_context.rb', line 162

def success?
  if @result
    @result.success?
  elsif @previous_result.respond_to?(:success?)
    @previous_result.success?
  end
end