@@ -57,136 +57,157 @@ defmodule LLMAgent.Flows do
57
57
require Logger
58
58
Logger . debug ( "Conversation flow - Processing signal: #{ inspect ( signal . type ) } " )
59
59
60
- # Determine appropriate handler based on signal type
61
- result =
62
- case signal . type do
63
- :user_message ->
64
- # User message flow path
65
- Logger . debug ( "Conversation flow - Processing user message" )
60
+ # Handle the signal with the appropriate handler based on type
61
+ result = handle_signal ( signal , state )
66
62
67
- case Handlers . message_handler ( signal , state ) do
68
- { { :emit , response_signal } , new_state } ->
69
- { :emit , response_signal , new_state }
63
+ Logger . debug ( "Conversation flow - Result: #{ inspect ( result ) } " )
64
+ result
65
+ end
70
66
71
- { :skip , new_state } ->
72
- { :skip , new_state }
73
-
74
- other ->
75
- Logger . warning ( "Unexpected message handler result: #{ inspect ( other ) } " )
76
- { :skip , state }
77
- end
67
+ { flow , initial_state }
68
+ end
78
69
79
- :thinking ->
80
- # Thinking flow path
81
- Logger . debug ( "Conversation flow - Processing thinking signal" )
70
+ # Helper functions for signal handling in conversation flow
71
+
72
+ # Dispatches to the appropriate handler based on signal type
73
+ defp handle_signal ( signal , state ) do
74
+ require Logger
75
+
76
+ case signal . type do
77
+ :user_message -> handle_user_message ( signal , state )
78
+ :thinking -> handle_thinking ( signal , state )
79
+ :tool_call -> handle_tool_call ( signal , state )
80
+ :tool_result -> handle_tool_result ( signal , state )
81
+ :task -> handle_task ( signal , state )
82
+ :response -> handle_response ( signal , state )
83
+ :error -> handle_error ( signal , state )
84
+ _ -> handle_unknown_signal_type ( signal , state )
85
+ end
86
+ end
82
87
83
- case Handlers . thinking_handler ( signal , state ) do
84
- { { :emit , new_signal } , new_state } ->
85
- { :emit , new_signal , new_state }
88
+ defp handle_user_message ( signal , state ) do
89
+ require Logger
90
+ Logger . debug ( "Conversation flow - Processing user message" )
86
91
87
- { :skip , new_state } ->
88
- { :skip , new_state }
92
+ case Handlers . message_handler ( signal , state ) do
93
+ { { :emit , response_signal } , new_state } ->
94
+ { :emit , response_signal , new_state }
89
95
90
- other ->
91
- Logger . warning ( "Unexpected thinking handler result: #{ inspect ( other ) } " )
92
- { :skip , state }
93
- end
96
+ { :skip , new_state } ->
97
+ { :skip , new_state }
94
98
95
- :tool_call ->
96
- # Tool call flow path
97
- Logger . debug ( "Conversation flow - Processing tool call signal" )
99
+ other ->
100
+ Logger . warning ( "Unexpected message handler result: #{ inspect ( other ) } " )
101
+ { :skip , state }
102
+ end
103
+ end
98
104
99
- case Handlers . tool_handler ( signal , state ) do
100
- { { :emit , new_signal } , new_state } ->
101
- { :emit , new_signal , new_state }
105
+ defp handle_thinking ( signal , state ) do
106
+ require Logger
107
+ Logger . debug ( "Conversation flow - Processing thinking signal" )
102
108
103
- { :skip , new_state } ->
104
- { :skip , new_state }
109
+ case Handlers . thinking_handler ( signal , state ) do
110
+ { { :emit , new_signal } , new_state } ->
111
+ { :emit , new_signal , new_state }
105
112
106
- other ->
107
- Logger . warning ( "Unexpected tool handler result: #{ inspect ( other ) } " )
108
- { :skip , state }
109
- end
113
+ { :skip , new_state } ->
114
+ { :skip , new_state }
110
115
111
- :tool_result ->
112
- # Tool result flow path
113
- Logger . debug ( "Conversation flow - Processing tool result signal" )
116
+ other ->
117
+ Logger . warning ( "Unexpected thinking handler result: #{ inspect ( other ) } " )
118
+ { :skip , state }
119
+ end
120
+ end
114
121
115
- case Handlers . tool_result_handler ( signal , state ) do
116
- { { :emit , new_signal } , new_state } ->
117
- { :emit , new_signal , new_state }
122
+ defp handle_tool_call ( signal , state ) do
123
+ require Logger
124
+ Logger . debug ( "Conversation flow - Processing tool call signal" )
118
125
119
- { :skip , new_state } ->
120
- { :skip , new_state }
126
+ case Handlers . tool_handler ( signal , state ) do
127
+ { { :emit , new_signal } , new_state } ->
128
+ { :emit , new_signal , new_state }
121
129
122
- other ->
123
- Logger . warning ( "Unexpected tool result handler result: #{ inspect ( other ) } " )
124
- { :skip , state }
125
- end
130
+ { :skip , new_state } ->
131
+ { :skip , new_state }
126
132
127
- :task ->
128
- # Task flow path
129
- Logger . debug ( "Conversation flow - Processing task signal" )
133
+ other ->
134
+ Logger . warning ( "Unexpected tool handler result: #{ inspect ( other ) } " )
135
+ { :skip , state }
136
+ end
137
+ end
130
138
131
- case Handlers . task_handler ( signal , state ) do
132
- { { :emit , new_signal } , new_state } ->
133
- { :emit , new_signal , new_state }
139
+ defp handle_tool_result ( signal , state ) do
140
+ require Logger
141
+ Logger . debug ( "Conversation flow - Processing tool result signal" )
134
142
135
- { :skip , new_state } ->
136
- { :skip , new_state }
143
+ case Handlers . tool_result_handler ( signal , state ) do
144
+ { { :emit , new_signal } , new_state } ->
145
+ { :emit , new_signal , new_state }
137
146
138
- other ->
139
- Logger . warning ( "Unexpected task handler result: #{ inspect ( other ) } " )
140
- { :skip , state }
141
- end
147
+ { :skip , new_state } ->
148
+ { :skip , new_state }
142
149
143
- :response ->
144
- # Response flow path
145
- Logger . debug ( "Conversation flow - Processing response signal" )
150
+ other ->
151
+ Logger . warning ( "Unexpected tool result handler result: #{ inspect ( other ) } " )
152
+ { :skip , state }
153
+ end
154
+ end
146
155
147
- case Handlers . response_handler ( signal , state ) do
148
- { { :emit , new_signal } , new_state } ->
149
- { :emit , new_signal , new_state }
156
+ defp handle_task ( signal , state ) do
157
+ require Logger
158
+ Logger . debug ( "Conversation flow - Processing task signal" )
150
159
151
- { :skip , new_state } ->
152
- { :skip , new_state }
160
+ case Handlers . task_handler ( signal , state ) do
161
+ { :skip , new_state } ->
162
+ { :skip , new_state }
153
163
154
- other ->
155
- Logger . warning ( "Unexpected response handler result: #{ inspect ( other ) } " )
156
- { :skip , state }
157
- end
164
+ other ->
165
+ Logger . warning ( "Unexpected task handler result: #{ inspect ( other ) } " )
166
+ { :skip , state }
167
+ end
168
+ end
158
169
159
- :error ->
160
- # Error flow path
161
- Logger . debug ( "Conversation flow - Processing error signal" )
170
+ defp handle_response ( signal , state ) do
171
+ require Logger
172
+ Logger . debug ( "Conversation flow - Processing response signal" )
162
173
163
- case Handlers . error_handler ( signal , state ) do
164
- { { :emit , new_signal } , new_state } ->
165
- { :emit , new_signal , new_state }
174
+ case Handlers . response_handler ( signal , state ) do
175
+ { :skip , new_state } ->
176
+ { :skip , new_state }
166
177
167
- { :skip , new_state } ->
168
- { :skip , new_state }
178
+ { { :halt , result } , new_state } ->
179
+ { :halt , result , new_state }
169
180
170
- other ->
171
- Logger . warning ( "Unexpected error handler result: #{ inspect ( other ) } " )
172
- { :skip , state }
173
- end
181
+ other ->
182
+ Logger . warning ( "Unexpected response handler result: #{ inspect ( other ) } " )
183
+ { :skip , state }
184
+ end
185
+ end
174
186
175
- _ ->
176
- # Fallback for unknown signal types
177
- Logger . warning ( "Conversation flow - Unknown signal type: #{ inspect ( signal . type ) } " )
187
+ defp handle_error ( signal , state ) do
188
+ require Logger
189
+ Logger . debug ( "Conversation flow - Processing error signal" )
178
190
179
- fallback_signal =
180
- Signals . response ( "Received unhandled signal type: #{ inspect ( signal . type ) } " )
191
+ case Handlers . error_handler ( signal , state ) do
192
+ { { :emit , new_signal } , new_state } ->
193
+ { :emit , new_signal , new_state }
181
194
182
- { :emit , fallback_signal , state }
183
- end
195
+ { :skip , new_state } ->
196
+ { :skip , new_state }
184
197
185
- Logger . debug ( "Conversation flow - Result: #{ inspect ( result ) } " )
186
- result
198
+ other ->
199
+ Logger . warning ( "Unexpected error handler result: #{ inspect ( other ) } " )
200
+ { :skip , state }
187
201
end
202
+ end
188
203
189
- { flow , initial_state }
204
+ defp handle_unknown_signal_type ( signal , state ) do
205
+ require Logger
206
+ Logger . warning ( "Conversation flow - Unknown signal type: #{ inspect ( signal . type ) } " )
207
+
208
+ fallback_signal = Signals . response ( "Received unhandled signal type: #{ inspect ( signal . type ) } " )
209
+
210
+ { :emit , fallback_signal , state }
190
211
end
191
212
192
213
@ doc """
@@ -428,26 +449,30 @@ defmodule LLMAgent.Flows do
428
449
end
429
450
430
451
# Create a flow that combines flows together in sequence
452
+ # This function is currently unused but kept for future use
431
453
defp sequence_flows ( flows ) do
432
454
fn signal , state ->
433
- Enum . reduce_while ( flows , { signal , state } , fn flow , { current_signal , current_state } ->
434
- case flow . ( current_signal , current_state ) do
435
- { :emit , new_signal , new_state } ->
436
- { :cont , { new_signal , new_state } }
455
+ Enum . reduce_while ( flows , { signal , state } , & process_flow_result / 2 )
456
+ end
457
+ end
437
458
438
- { :skip , new_state } ->
439
- { :cont , { current_signal , new_state } }
459
+ # Helper function to process flow results and determine continuation
460
+ defp process_flow_result ( flow , { current_signal , current_state } ) do
461
+ case flow . ( current_signal , current_state ) do
462
+ { :emit , new_signal , new_state } ->
463
+ { :cont , { new_signal , new_state } }
440
464
441
- { :halt , result , new_state } ->
442
- { :halt , { :halt , result , new_state } }
465
+ { :skip , new_state } ->
466
+ { :cont , { current_signal , new_state } }
443
467
444
- { :error , reason , new_state } ->
445
- { :halt , { :error , reason , new_state } }
468
+ { :halt , result , new_state } ->
469
+ { :halt , { :halt , result , new_state } }
446
470
447
- other ->
448
- { :halt , other }
449
- end
450
- end )
471
+ { :error , reason , new_state } ->
472
+ { :halt , { :error , reason , new_state } }
473
+
474
+ other ->
475
+ { :halt , other }
451
476
end
452
477
end
453
478
end
0 commit comments