fastworkflow 2.15.6__py3-none-any.whl → 2.15.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,17 +11,16 @@ import fastworkflow
11
11
  from fastworkflow.utils.logging import logger
12
12
  from fastworkflow.utils import dspy_utils
13
13
  from fastworkflow.command_metadata_api import CommandMetadataAPI
14
- from fastworkflow.mcp_server import FastWorkflowMCPServer
14
+ from fastworkflow.utils.react import fastWorkflowReAct
15
15
 
16
16
 
17
17
  class WorkflowAgentSignature(dspy.Signature):
18
18
  """
19
- Carefully review the user request and conversation_history, then execute the todo list using available tools for building the final answer.
20
- All the tasks in the todo list must be completed before returning the final answer.
19
+ Carefully review the user request, then execute the next steps using available tools for building the final answer.
20
+ Every user intent must be fully addressed before returning the final answer.
21
21
  """
22
22
  user_query = dspy.InputField(desc="The natural language user query.")
23
- conversation_history: dspy.History = dspy.InputField()
24
- final_answer = dspy.OutputField(desc="Comprehensive final answer with supporting evidence to demonstrate that all the tasks in the todo list have been completed.")
23
+ final_answer = dspy.OutputField(desc="Comprehensive final answer with supporting evidence to demonstrate that every user intent has been fully addressed.")
25
24
 
26
25
  def _what_can_i_do(chat_session_obj: fastworkflow.ChatSession) -> str:
27
26
  """
@@ -34,36 +33,36 @@ def _what_can_i_do(chat_session_obj: fastworkflow.ChatSession) -> str:
34
33
  active_context_name=current_workflow.current_command_context_name,
35
34
  )
36
35
 
37
- def _clarify_ambiguous_intent(
38
- correct_command_name: str,
39
- chat_session_obj: fastworkflow.ChatSession) -> str:
40
- """
41
- Call this tool ONLY in the intent detection error state (ambiguous or misunderstood intent) to provide the exact command name.
42
- The intent detection error message will list the command names to pick from.
43
- """
44
- return _execute_workflow_query(correct_command_name, chat_session_obj = chat_session_obj)
45
-
46
- def _provide_missing_or_corrected_parameters(
47
- missing_or_corrected_parameter_values: list[str|int|float|bool],
48
- chat_session_obj: fastworkflow.ChatSession) -> str:
49
- """
50
- Call this tool ONLY in the parameter extraction error state to provide missing or corrected parameter values.
51
- Missing parameter values may be found in the user query, or information already available, or by aborting and executing a different command (refer to the optional 'available_from' hint for guidance on appropriate commands to use to get the information).
52
- If the error message indicates parameter values are improperly formatted, correct using your internal knowledge and command metadata information.
53
- """
54
- if missing_or_corrected_parameter_values:
55
- command = ', '.join(missing_or_corrected_parameter_values)
56
- else:
57
- return "Provide missing or corrected parameter values or abort"
36
+ # def _clarify_ambiguous_intent(
37
+ # correct_command_name: str,
38
+ # chat_session_obj: fastworkflow.ChatSession) -> str:
39
+ # """
40
+ # Call this tool ONLY in the intent detection error state (ambiguous or misunderstood intent) to provide the exact command name.
41
+ # The intent detection error message will list the command names to pick from.
42
+ # """
43
+ # return _execute_workflow_query(correct_command_name, chat_session_obj = chat_session_obj)
44
+
45
+ # def _provide_missing_or_corrected_parameters(
46
+ # missing_or_corrected_parameter_values: list[str|int|float|bool],
47
+ # chat_session_obj: fastworkflow.ChatSession) -> str:
48
+ # """
49
+ # Call this tool ONLY in the parameter extraction error state to provide missing or corrected parameter values.
50
+ # Missing parameter values may be found in the user query, or information already available, or by aborting and executing a different command (refer to the optional 'available_from' hint for guidance on appropriate commands to use to get the information).
51
+ # If the error message indicates parameter values are improperly formatted, correct using your internal knowledge and command metadata information.
52
+ # """
53
+ # if missing_or_corrected_parameter_values:
54
+ # command = ', '.join(missing_or_corrected_parameter_values)
55
+ # else:
56
+ # return "Provide missing or corrected parameter values or abort"
58
57
 
59
- return _execute_workflow_query(command, chat_session_obj = chat_session_obj)
58
+ # return _execute_workflow_query(command, chat_session_obj = chat_session_obj)
60
59
 
61
- def _abort_current_command_to_exit_parameter_extraction_error_state(
62
- chat_session_obj: fastworkflow.ChatSession) -> str:
63
- """
64
- Call this tool ONLY in the parameter extraction error state when you want to get out of the parameter extraction error state and execute a different command.
65
- """
66
- return _execute_workflow_query('abort', chat_session_obj = chat_session_obj)
60
+ # def _abort_current_command_to_exit_parameter_extraction_error_state(
61
+ # chat_session_obj: fastworkflow.ChatSession) -> str:
62
+ # """
63
+ # Call this tool ONLY in the parameter extraction error state when you want to get out of the parameter extraction error state and execute a different command.
64
+ # """
65
+ # return
67
66
 
68
67
  def _intent_misunderstood(
69
68
  chat_session_obj: fastworkflow.ChatSession) -> str:
@@ -71,7 +70,7 @@ def _intent_misunderstood(
71
70
  Shows the full list of available command names so you can specify the command name you really meant
72
71
  Call this tool when your intent is misunderstood (i.e. the wrong command name is executed).
73
72
  """
74
- return _execute_workflow_query('you misunderstood', chat_session_obj = chat_session_obj)
73
+ return _what_can_i_do(chat_session_obj = chat_session_obj)
75
74
 
76
75
  def _execute_workflow_query(command: str, chat_session_obj: fastworkflow.ChatSession) -> str:
77
76
  """
@@ -105,21 +104,23 @@ def _execute_workflow_query(command: str, chat_session_obj: fastworkflow.ChatSes
105
104
  params_dict = params.model_dump() if params else None
106
105
 
107
106
  # Extract response text
108
- resp_text = ""
107
+ response_text = ""
109
108
  if command_output.command_responses:
110
- response_parts = [
109
+ response_parts = []
110
+ response_parts.extend(
111
111
  cmd_response.response
112
112
  for cmd_response in command_output.command_responses
113
113
  if cmd_response.response
114
- ]
115
- resp_text = "\n".join(response_parts)
116
-
114
+ )
115
+ response_text = "\n".join(response_parts) \
116
+ if response_parts else "Command executed successfully but produced no output."
117
+
117
118
  chat_session_obj.command_trace_queue.put(fastworkflow.CommandTraceEvent(
118
119
  direction=fastworkflow.CommandTraceEventDirection.WORKFLOW_TO_AGENT,
119
120
  raw_command=None,
120
121
  command_name=name,
121
122
  parameters=params_dict,
122
- response_text=resp_text or "",
123
+ response_text=response_text,
123
124
  success=bool(command_output.success),
124
125
  timestamp_ms=int(time.time() * 1000),
125
126
  ))
@@ -129,66 +130,73 @@ def _execute_workflow_query(command: str, chat_session_obj: fastworkflow.ChatSes
129
130
  "command" if command_output.success else "failing command": command,
130
131
  "command_name": name,
131
132
  "parameters": params_dict,
132
- "response": resp_text if command_output.success else ""
133
+ "response": response_text if command_output.success else ""
133
134
  }
134
135
  with open("action.json", "a", encoding="utf-8") as f:
135
136
  f.write(json.dumps(record, ensure_ascii=False) + "\n")
136
137
 
137
- # Format output - extract text from command response
138
- if command_output.command_responses:
139
- response_parts = []
140
- response_parts.extend(
141
- cmd_response.response
142
- for cmd_response in command_output.command_responses
143
- if cmd_response.response
144
- )
145
- return "\n".join(response_parts) if response_parts else "Command executed successfully."
146
-
147
- return "Command executed but produced no output."
148
-
149
- def _missing_information_guidance_tool(
150
- how_to_find_request: str,
151
- chat_session_obj: fastworkflow.ChatSession) -> str:
152
- """
153
- Request guidance on finding missing information.
154
- The how_to_find_request must be plain text without any formatting.
155
- """
156
- lm = dspy_utils.get_lm("LLM_AGENT", "LITELLM_API_KEY_AGENT")
157
- with dspy.context(lm=lm):
158
- guidance_func = dspy.ChainOfThought(
159
- "command_info, missing_information_guidance_request -> guidance: str")
160
- prediction = guidance_func(
161
- command_info=_what_can_i_do(chat_session_obj),
162
- missing_information_guidance_request=how_to_find_request)
163
- return prediction.guidance
138
+ if 'PARAMETER EXTRACTION ERROR' in response_text or 'The command is ambiguous' in response_text:
139
+ abort_confirmation = _execute_workflow_query('abort', chat_session_obj = chat_session_obj)
140
+ return f'{response_text}\n{abort_confirmation}'
141
+
142
+ return response_text
143
+
144
+ # def _missing_information_guidance_tool(
145
+ # how_to_find_request: str,
146
+ # chat_session_obj: fastworkflow.ChatSession) -> str:
147
+ # """
148
+ # Request guidance on finding missing information.
149
+ # The how_to_find_request must be plain text without any formatting.
150
+ # """
151
+ # class MissingInfoGuidanceSignature(dspy.Signature):
152
+ # """
153
+ # Carefully review the command info 'available_from' hints to see if the missing information can be found by executing a different command.
154
+ # You may have to walk the graph of commands based on the 'available_from' hints to find the most appropriate command
155
+ # Note that using the wrong command name can produce missing information errors. The requestor should double-check that the command name is correct.
156
+ # """
157
+ # command_info: str = dspy.InputField()
158
+ # missing_information_guidance_request: str = dspy.InputField()
159
+ # guidance: str = dspy.OutputField()
160
+
161
+
162
+ # lm = dspy_utils.get_lm("LLM_AGENT", "LITELLM_API_KEY_AGENT")
163
+ # with dspy.context(lm=lm):
164
+ # guidance_func = dspy.ChainOfThought(MissingInfoGuidanceSignature)
165
+ # prediction = guidance_func(
166
+ # command_info=_what_can_i_do(chat_session_obj),
167
+ # missing_information_guidance_request=how_to_find_request)
168
+ # return prediction.guidance
164
169
 
165
170
  def _ask_user_tool(clarification_request: str, chat_session_obj: fastworkflow.ChatSession) -> str:
166
171
  """
167
- As a last resort, request clarification for missing information (only after using the missing_information_guidance_tool) or error correction from the human user.
172
+ If the missing_information_guidance_tool does not help and only as the last resort, request clarification for missing information from the human user.
168
173
  The clarification_request must be plain text without any formatting.
174
+ Note that using the wrong command name can produce missing information errors. Double-check with the missing_information_guidance_tool to verify that the correct command name is being used
169
175
  """
170
176
  command_output = fastworkflow.CommandOutput(
171
177
  command_responses=[fastworkflow.CommandResponse(response=clarification_request)]
172
178
  )
179
+
173
180
  chat_session_obj.command_output_queue.put(command_output)
181
+
174
182
  user_query = chat_session_obj.user_message_queue.get()
175
- return _think_and_plan(user_query, chat_session_obj)
183
+ return build_query_with_next_steps(user_query, chat_session_obj, with_agent_inputs_and_trajectory = True)
176
184
 
177
- def initialize_workflow_tool_agent(mcp_server: FastWorkflowMCPServer, max_iters: int = 25):
185
+ def initialize_workflow_tool_agent(chat_session: fastworkflow.ChatSession, max_iters: int = 25):
178
186
  """
179
187
  Initialize and return a DSPy ReAct agent that exposes individual MCP tools.
180
188
  Each tool expects a single query string for its specific tool.
181
189
 
182
190
  Args:
183
- mcp_server: FastWorkflowMCPServer instance
191
+ chat_session: fastworkflow.ChatSession instance
184
192
  max_iters: Maximum iterations for the ReAct agent
185
193
 
186
194
  Returns:
187
195
  DSPy ReAct agent configured with workflow tools
188
196
  """
189
- chat_session_obj = mcp_server.chat_session
197
+ chat_session_obj = chat_session
190
198
  if not chat_session_obj:
191
- return None
199
+ raise ValueError("chat session cannot be null")
192
200
 
193
201
  def what_can_i_do() -> str:
194
202
  """
@@ -196,36 +204,10 @@ def initialize_workflow_tool_agent(mcp_server: FastWorkflowMCPServer, max_iters:
196
204
  """
197
205
  return _what_can_i_do(chat_session_obj=chat_session_obj)
198
206
 
199
- def clarify_ambiguous_intent(
200
- correct_command_name: str) -> str:
201
- """
202
- Call this tool ONLY in the intent detection error state to provide the exact command name.
203
- The intent detection error message will list the command names to pick from.
204
- """
205
- return _clarify_ambiguous_intent(correct_command_name, chat_session_obj = chat_session_obj)
206
-
207
- def provide_missing_or_corrected_parameters(
208
- missing_or_corrected_parameter_values: list[str|int|float|bool]) -> str:
209
- """
210
- Call this tool ONLY in the parameter extraction error state to provide missing or corrected parameter values.
211
- Missing parameter values may be found in the user query, or information already available, or by executing a different command (refer to the optional 'available_from' hint for guidance on appropriate commands to use to get the information).
212
- If the error message indicates parameter values are improperly formatted, correct using your internal knowledge.
213
- """
214
- return _provide_missing_or_corrected_parameters(missing_or_corrected_parameter_values, chat_session_obj=chat_session_obj)
215
-
216
- def abort_current_command_to_exit_parameter_extraction_error_state() -> str:
217
- """
218
- Call this tool ONLY when you need to execute a different command to get missing parameters.
219
- DO NOT execute the same failing command over and over. Either provide_missing_or_corrected_parameters or abort
220
- """
221
- return _abort_current_command_to_exit_parameter_extraction_error_state(
222
- chat_session_obj=chat_session_obj)
223
-
224
207
  def intent_misunderstood() -> str:
225
208
  """
226
209
  Shows the full list of available command names so you can specify the command name you really meant
227
210
  Call this tool when your intent is misunderstood (i.e. the wrong command name is executed).
228
- Do not use this tool if its a missing or invalid parameter issue. Use the provide_missing_or_corrected_parameters tool instead
229
211
  """
230
212
  return _intent_misunderstood(chat_session_obj = chat_session_obj)
231
213
 
@@ -249,49 +231,63 @@ def initialize_workflow_tool_agent(mcp_server: FastWorkflowMCPServer, max_iters:
249
231
  # Continue to next attempt
250
232
  logger.warning(f"Attempt {attempt + 1} failed for command '{command}': {str(e)}")
251
233
 
252
- def missing_information_guidance(how_to_find_request: str) -> str:
253
- """
254
- Request guidance on finding missing information.
255
- The how_to_find_request must be plain text without any formatting.
256
- """
257
- return _missing_information_guidance_tool(how_to_find_request, chat_session_obj=chat_session_obj)
234
+ # def missing_information_guidance(how_to_find_request: str) -> str:
235
+ # """
236
+ # Request guidance on finding missing information.
237
+ # The how_to_find_request must be plain text without any formatting.
238
+ # """
239
+ # return _missing_information_guidance_tool(how_to_find_request, chat_session_obj=chat_session_obj)
258
240
 
259
241
  def ask_user(clarification_request: str) -> str:
260
242
  """
261
- As a last resort, request clarification for missing information (only after using the missing_information_guidance_tool) or error correction from the human user.
243
+ Only as the last resort, request clarification for missing information from the human user.
262
244
  The clarification_request must be plain text without any formatting.
245
+ Note that using the wrong command name can produce missing information errors. Double-check with the what_can_i_do tool to verify that the correct command name is being used
263
246
  """
264
247
  return _ask_user_tool(clarification_request, chat_session_obj=chat_session_obj)
265
248
 
266
249
  tools = [
267
250
  what_can_i_do,
268
251
  execute_workflow_query,
269
- missing_information_guidance,
270
- clarify_ambiguous_intent,
252
+ # missing_information_guidance,
271
253
  intent_misunderstood,
272
254
  ask_user,
273
- provide_missing_or_corrected_parameters,
274
- abort_current_command_to_exit_parameter_extraction_error_state,
275
255
  ]
276
256
 
277
- return dspy.ReAct(
257
+ return fastWorkflowReAct(
278
258
  WorkflowAgentSignature,
279
259
  tools=tools,
280
260
  max_iters=max_iters,
281
261
  )
282
262
 
283
- def _think_and_plan(user_query: str, chat_session_obj: fastworkflow.ChatSession) -> str:
263
+
264
+ def build_query_with_next_steps(user_query: str,
265
+ chat_session_obj: fastworkflow.ChatSession, with_agent_inputs_and_trajectory: bool = False) -> str:
284
266
  """
285
- Returns a refined plan by breaking down a user_query into simpler tasks based only on available commands and returns a todo list.
267
+ Generate a todo list.
268
+ Return a string that combine the user query and todo list
286
269
  """
287
270
  class TaskPlannerSignature(dspy.Signature):
288
271
  """
289
- Break down a user_query into simpler tasks based only on available commands and return a todo list.
290
- If user_query is simple, return a single todo that is the user_query as-is
272
+ Carefully review the user_query and generate a next steps sequence based only on available commands.
273
+ Walk the graph of commands based on the 'available_from' hints to build the most appropriate command sequence
274
+ Avoid specifying 'ask user' because 9 times out of 10, you can find the information via available commands.
291
275
  """
292
276
  user_query: str = dspy.InputField()
293
277
  available_commands: list[str] = dspy.InputField()
294
- todo_list: list[str] = dspy.OutputField(desc="task descriptions as short sentences")
278
+ next_steps: list[str] = dspy.OutputField(desc="task descriptions as short sentences")
279
+
280
+ class TaskPlannerWithTrajectoryAndAgentInputsSignature(dspy.Signature):
281
+ """
282
+ Carefully review agent inputs, agent trajectory and user response and generate a next steps sequence based only on available commands.
283
+ Walk the graph of commands based on the 'available_from' hints to build the most appropriate command sequence
284
+ Avoid specifying 'ask user' because 9 times out of 10, you can find the information via available commands.
285
+ """
286
+ agent_inputs: dict = dspy.InputField()
287
+ agent_trajectory: dict = dspy.InputField()
288
+ user_response: str = dspy.InputField()
289
+ available_commands: list[str] = dspy.InputField()
290
+ next_steps: list[str] = dspy.OutputField(desc="task descriptions as short sentences")
295
291
 
296
292
  current_workflow = chat_session_obj.get_active_workflow()
297
293
  available_commands = CommandMetadataAPI.get_command_display_text(
@@ -302,10 +298,27 @@ def _think_and_plan(user_query: str, chat_session_obj: fastworkflow.ChatSession)
302
298
 
303
299
  planner_lm = dspy_utils.get_lm("LLM_PLANNER", "LITELLM_API_KEY_PLANNER")
304
300
  with dspy.context(lm=planner_lm):
305
- task_planner_func = dspy.ChainOfThought(TaskPlannerSignature)
306
- prediction = task_planner_func(user_query=user_query, available_commands=available_commands)
307
-
308
- if not prediction.todo_list or (len(prediction.todo_list) == 1 and prediction.todo_list[0] == user_query):
301
+ if with_agent_inputs_and_trajectory:
302
+ workflow_tool_agent = chat_session_obj.workflow_tool_agent
303
+ task_planner_func = dspy.ChainOfThought(TaskPlannerWithTrajectoryAndAgentInputsSignature)
304
+ prediction = task_planner_func(
305
+ agent_inputs = workflow_tool_agent.inputs,
306
+ agent_trajectory = workflow_tool_agent.current_trajectory,
307
+ user_response = user_query,
308
+ available_commands=available_commands)
309
+ else:
310
+ task_planner_func = dspy.ChainOfThought(TaskPlannerSignature)
311
+ prediction = task_planner_func(
312
+ user_query=user_query,
313
+ available_commands=available_commands)
314
+
315
+ if not prediction.next_steps:
309
316
  return user_query
310
317
 
311
- return f"{user_query}\nNext steps:\n{'\n'.join([f'{i + 1}. {task}' for i, task in enumerate(prediction.todo_list)])}"
318
+ steps_list = '\n'.join([f'{i + 1}. {task}' for i, task in enumerate(prediction.next_steps)])
319
+ user_query_and_next_steps = f"{user_query}\n\nNext steps:\n{steps_list}"
320
+ return (
321
+ f'{available_commands}\n\nUser Query:\n{user_query_and_next_steps}'
322
+ if with_agent_inputs_and_trajectory else
323
+ user_query_and_next_steps
324
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastworkflow
3
- Version: 2.15.6
3
+ Version: 2.15.8
4
4
  Summary: A framework for rapidly building large-scale, deterministic, interactive workflows with a fault-tolerant, conversational UX
5
5
  License: Apache-2.0
6
6
  Keywords: fastworkflow,ai,workflow,llm,openai
@@ -209,7 +209,7 @@ You can get a free API key from [Mistral AI](https://mistral.ai) - the example i
209
209
  Train the intent-detection models for the workflow:
210
210
 
211
211
  ```sh
212
- fastworkflow examples train hello_world
212
+ fastworkflow train ./examples/hello_world ./examples/fastworkflow.env ./examples/fastworkflow.passwords.env
213
213
  ```
214
214
 
215
215
  This step builds the NLP models that help the workflow understand user commands.
@@ -219,7 +219,7 @@ This step builds the NLP models that help the workflow understand user commands.
219
219
  Once training is complete, run the interactive assistant:
220
220
 
221
221
  ```sh
222
- fastworkflow examples run hello_world
222
+ fastworkflow run ./examples/hello_world ./examples/fastworkflow.env ./examples/fastworkflow.passwords.env
223
223
  ```
224
224
 
225
225
  You will be greeted with a `User >` prompt. Try it out by asking "what can you do?" or "add 49 + 51"!
@@ -240,12 +240,6 @@ fastworkflow examples list
240
240
 
241
241
  # Fetch an example to your local directory
242
242
  fastworkflow examples fetch <example_name>
243
-
244
- # Train an example workflow
245
- fastworkflow examples train <example_name>
246
-
247
- # Run an example workflow
248
- fastworkflow examples run <example_name>
249
243
  ```
250
244
 
251
245
  ### Workflow Operations
@@ -261,11 +255,8 @@ fastworkflow train <workflow_dir> <env_file> <passwords_file>
261
255
  fastworkflow run <workflow_dir> <env_file> <passwords_file>
262
256
  ```
263
257
 
264
- To run a workflow in agentic mode, add the `--run_as_agent` flag:
265
-
266
- ```sh
267
- fastworkflow run <workflow_dir> <env_file> <passwords_file> --run_as_agent
268
- ```
258
+ > [!tip]
259
+ > **Deterministic execution:** Prefix a natural language command with `/` to execute it deterministically (non‑agentic) during an interactive run.
269
260
 
270
261
  Each command has additional options that can be viewed with the `--help` flag:
271
262
 
@@ -4,13 +4,13 @@ fastworkflow/_commands/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
4
4
  fastworkflow/_workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  fastworkflow/_workflows/command_metadata_extraction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/abort.py,sha256=C5H_sOOC1KBaW888QarWnWffMoV7VnZ03q4GMqmitSE,1388
7
- fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/you_misunderstood.py,sha256=Sp_H_ybS5-UM8ActdIrANInIsgQ1uA3pAZnznF8ubvk,2511
7
+ fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/you_misunderstood.py,sha256=VHfhwlqc1ceG9P_wL8Fl7dpJA2UlcSrcXhz7zZU9NpA,2517
8
8
  fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/go_up.py,sha256=K526OAf5ks95SwqVdRNVxLM_AWDfA1qXbkNYq0dANwg,1889
9
9
  fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/reset_context.py,sha256=xvInu6uDw0YRUHVXNyTZphSr75f8QiQgFwDtv7SlE9o,1346
10
10
  fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_can_i_do.py,sha256=Fw8tsk3wyCujf8nBfUgPDxnTP9c2IE513FzqAWGm8pU,6216
11
11
  fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_is_current_context.py,sha256=S5RQLr62Q2MnKU85nw4IW_ueAK_FXvhcY9gXajFxujg,1464
12
12
  fastworkflow/_workflows/command_metadata_extraction/_commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- fastworkflow/_workflows/command_metadata_extraction/_commands/wildcard.py,sha256=HgMHoyyCDB0Jh65lgygDDs6M_86-IKMX1dmVAzrMAfE,29900
13
+ fastworkflow/_workflows/command_metadata_extraction/_commands/wildcard.py,sha256=0VDWnDUAoMwsfH7WEI1e9UWJz_rkVGYH8KqTv9Gwea8,33307
14
14
  fastworkflow/_workflows/command_metadata_extraction/command_context_model.json,sha256=zGWBweQSmFf7WsfR_F2DE7AJ8S8-q7F9ZbvyccysJJI,117
15
15
  fastworkflow/build/__main__.py,sha256=NtedkZfM56qoEJ5vQECSURbE8AMTfwHN3tAZyZoWabk,15905
16
16
  fastworkflow/build/ast_class_extractor.py,sha256=F9OG4stkp7w3kadKqxMm8h3ZDSp_zg6mwcrKMl_XqdI,13527
@@ -33,8 +33,8 @@ fastworkflow/build/navigator_stub_generator.py,sha256=_DSvHC6r1xWQiFHtUgPhI51nQf
33
33
  fastworkflow/build/pydantic_model_generator.py,sha256=oNyoANyUWBpHG-fE3tGL911RNvDzQXjxAm0ssvuXUH4,1854
34
34
  fastworkflow/build/utterance_generator.py,sha256=UrtkF0wyAZ1hiFitHX0g8w7Wh-D0leLCrP1aUACSfHo,299
35
35
  fastworkflow/cache_matching.py,sha256=OoB--1tO6-O4BKCuCrUbB0CkUr76J62K4VAf6MShi-w,7984
36
- fastworkflow/chat_session.py,sha256=rdW26lnBjBSmeb3q-JDeihdw-kJEv8HLIXyxhTavGmU,27992
37
- fastworkflow/cli.py,sha256=RB78V78NAZsZtNqF4_kk-TnEKCOy-cFLF6wSwz8aP14,26345
36
+ fastworkflow/chat_session.py,sha256=MVHSoygLIW4Gh3BRfDYSxmh5RMuBxc96c8E9QRW6ZyU,27563
37
+ fastworkflow/cli.py,sha256=li9OFT05sxqz4BZJc9byKAeTmomjLfsWMVuy0OiRGSs,18953
38
38
  fastworkflow/command_context_model.py,sha256=nWxLP3TR7WJr3yWCedqcdFOxo_kwae_mS3VRN2cOmK8,13437
39
39
  fastworkflow/command_directory.py,sha256=aJ6UQCwevfF11KbcQB2Qz6mQ7Kj91pZtvHmQY6JFnao,29030
40
40
  fastworkflow/command_executor.py,sha256=IEcuHEqrqc6I-Hpv451VIHw6z64zkO4o51MpXUFnPGo,7936
@@ -48,7 +48,7 @@ fastworkflow/examples/extended_workflow_example/_commands/generate_report.py,sha
48
48
  fastworkflow/examples/extended_workflow_example/_commands/startup.py,sha256=V5Q29148SvXw6i3i0pKTuNWsv2xnkUMsHHuzt1ndxro,1028
49
49
  fastworkflow/examples/extended_workflow_example/simple_workflow_template.json,sha256=A-dAl5iD9ehdMGGn05O2Kjwq6ZetqQjAGzlM1st0K9U,1237
50
50
  fastworkflow/examples/extended_workflow_example/workflow_inheritance_model.json,sha256=TBk272pqfyRKzm4T-I6_nGfbcdmEzjwon7kFPWtgyhw,81
51
- fastworkflow/examples/fastworkflow.env,sha256=AtHxE3hf69DDIA8o27cOeV_0iKuMTpJCHf-CY_gzPzQ,629
51
+ fastworkflow/examples/fastworkflow.env,sha256=FNx41woSsG7ljcwI6H6Y3RCMw6mXiImcq8QMnqeqSao,623
52
52
  fastworkflow/examples/fastworkflow.passwords.env,sha256=CJemqCpj8HeSznTFUfCSc6I5r8noXuRWKfkrHaslD7E,424
53
53
  fastworkflow/examples/hello_world/_commands/README.md,sha256=pYOTGqVx41ZIuNc6hPTEJzNcMQ2Vwx3PN74ifSlayvU,1297
54
54
  fastworkflow/examples/hello_world/_commands/add_two_numbers.py,sha256=0lFGK1llT6u6fByvzCDPdegjY6gWcerM2cvxVSo7lIw,2232
@@ -84,7 +84,7 @@ fastworkflow/examples/messaging_app_4/context_hierarchy_model.json,sha256=p1PkLF
84
84
  fastworkflow/examples/messaging_app_4/startup_action.json,sha256=HhS0ApuK1wZmX2M0pVusCkgrV0IU7BwvkfEOpRfN95A,84
85
85
  fastworkflow/examples/retail_workflow/_commands/calculate.py,sha256=uj-Yg0RSiSPkK7Y0AZN1fgDdL0GWIw33g9ARAPGFFVU,2285
86
86
  fastworkflow/examples/retail_workflow/_commands/cancel_pending_order.py,sha256=npU7sERB915WJyqjuku6L63sxvXtrWGkjoTrU0nNhEU,4466
87
- fastworkflow/examples/retail_workflow/_commands/exchange_delivered_order_items.py,sha256=5Pl8eTa2fVd183RiBHczDx3GbPeP0A92uKkfSUfiddg,4107
87
+ fastworkflow/examples/retail_workflow/_commands/exchange_delivered_order_items.py,sha256=6g04D3eHUQdIBu3wqPbhHMjJUK_91uHxaZrlDggnFS0,5349
88
88
  fastworkflow/examples/retail_workflow/_commands/find_user_id_by_email.py,sha256=EhI1bNcmWETGllyb5Z91v0mRm8Ex4eQ44IQHZ244Syc,2793
89
89
  fastworkflow/examples/retail_workflow/_commands/find_user_id_by_name_zip.py,sha256=lA9UfEkBNjCXozM4fALSZZuS0DgO3W1qQ2cg0dv1XUA,3340
90
90
  fastworkflow/examples/retail_workflow/_commands/get_order_details.py,sha256=X5tcMfx0lBm5vot7Ssn8Uzg0UaTPJU7GTn0C8fGnGxM,3584
@@ -92,11 +92,11 @@ fastworkflow/examples/retail_workflow/_commands/get_product_details.py,sha256=Qf
92
92
  fastworkflow/examples/retail_workflow/_commands/get_user_details.py,sha256=zk_QYvoj-DYP4muq0p9uDF_puCKPwy9OZrYhyM6grnI,3091
93
93
  fastworkflow/examples/retail_workflow/_commands/list_all_product_types.py,sha256=qnxbHU6PwWiV0E9jO6jYOIs1w5RCrTYQYqYyip14VzI,2529
94
94
  fastworkflow/examples/retail_workflow/_commands/modify_pending_order_address.py,sha256=As6TZ2uPicrylJCULN53maHTUj4Sq-XN4C2sF653EDk,3826
95
- fastworkflow/examples/retail_workflow/_commands/modify_pending_order_items.py,sha256=53Oao7c9uLRqpgzVMzJZW9KOmSUQ-IBDWyCdbH_4AtY,4135
95
+ fastworkflow/examples/retail_workflow/_commands/modify_pending_order_items.py,sha256=t4UbYlgAADyzrE37PDcjZPd7UVqqlYE906d07zdMbKs,5346
96
96
  fastworkflow/examples/retail_workflow/_commands/modify_pending_order_payment.py,sha256=zw8mhNkT6HoSPk2ADVROyGIIPpXsT3BhB5YrRnkCtmQ,3356
97
97
  fastworkflow/examples/retail_workflow/_commands/modify_user_address.py,sha256=2Zxgbge6wDufWEvk5D7PgOkYb3bayXGH_d0Kr0AFRsw,3864
98
- fastworkflow/examples/retail_workflow/_commands/return_delivered_order_items.py,sha256=CzWYCi8xyJV1-2R7zVPaUxX8jwej8dTer62vT7jaINM,3819
99
- fastworkflow/examples/retail_workflow/_commands/transfer_to_human_agents.py,sha256=H49f81dYXVN145aeA4HCeZ4VcdrkkBofeejeVu3TWFo,2908
98
+ fastworkflow/examples/retail_workflow/_commands/return_delivered_order_items.py,sha256=xMKn1pO91BAjYURo5lf2GjpoOm1iQxsxidq69svVRQk,4222
99
+ fastworkflow/examples/retail_workflow/_commands/transfer_to_human_agents.py,sha256=09YXFSeeTN2-bNh_CzHyUN-XhYAbXOe403tjP2zo3KI,2924
100
100
  fastworkflow/examples/retail_workflow/context_inheritance_model.json,sha256=jrlby8FUUwkx4V_EGMix_pkQlWcUCVUgmeoapZaZnt4,3
101
101
  fastworkflow/examples/retail_workflow/retail_data/__init__.py,sha256=HW8jqarRRTRtNBMp8jqQBTanFTQQC_uShqY_PiGrVtI,629
102
102
  fastworkflow/examples/retail_workflow/retail_data/orders.json,sha256=JZihJYbSjy1r0WvIb0yAACm2rxjgq7XEde9chpwRztE,1810945
@@ -142,7 +142,7 @@ fastworkflow/mcp_server.py,sha256=f6vqHiG-cuMpeoeRY-mvsFxApmQ28cAJFfMtqoJYy5k,88
142
142
  fastworkflow/model_pipeline_training.py,sha256=P_9wrYSfJVSYCTu8VEPkgXJ16eH58LLCK4rCRbRFAVg,46740
143
143
  fastworkflow/refine/__main__.py,sha256=bDLpPNMcdp8U4EFnMdjxx1sPDQCZuEJoBURr2KebTng,3398
144
144
  fastworkflow/run/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
- fastworkflow/run/__main__.py,sha256=a01u5voGUyVyh6ko_sjEPgSoupYw-t5PHE9UHYEnsEk,12237
145
+ fastworkflow/run/__main__.py,sha256=e3gTjcQwYuEz12LZIdL5w48aMRJ-42MdlyapINj7XWk,12430
146
146
  fastworkflow/run_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
147
  fastworkflow/run_agent/__main__.py,sha256=japXWziVDHdLl7Hk-jzwcYkImVY4j4k9SodMhiRK3ow,11986
148
148
  fastworkflow/run_agent/agent_module.py,sha256=XbOfX2K2CwmIRT45YtoROCN4en9Ud8gMQh2kGEhqw_A,8012
@@ -163,13 +163,14 @@ fastworkflow/utils/logging.py,sha256=2SA-04fg7Lx_vGf980tfCOGDQxBvU9X6Vbhv47rbdaw
163
163
  fastworkflow/utils/parameterize_func_decorator.py,sha256=V6YJnishWRCdwiBQW6P17hmGGrga0Empk-AN5Gm7iMk,633
164
164
  fastworkflow/utils/pydantic_model_2_dspy_signature_class.py,sha256=w1pvl8rJq48ulFwaAtBgfXYn_SBIDBgq1aLMUg1zJn8,12875
165
165
  fastworkflow/utils/python_utils.py,sha256=OzSf-bGve1401SHM3QXXFauBOBrlGQzPNgvvGJPavX0,8200
166
- fastworkflow/utils/signatures.py,sha256=3B3EafS5b76L4hOwDyABKMuY_bfEwmCYdK6T5DxWM1w,20968
166
+ fastworkflow/utils/react.py,sha256=HubwmM4H9UzLaLaeIkJseKCNMjyrOXvMZz-8sw4ycCE,11224
167
+ fastworkflow/utils/signatures.py,sha256=pOQtvp5qXmA-ETD4xpax5Kj8abkRVbznywyCwanVpxY,20938
167
168
  fastworkflow/utils/startup_progress.py,sha256=9icSdnpFAxzIq0sUliGpNaH0Efvrt5lDtGfURV5BD98,3539
168
169
  fastworkflow/workflow.py,sha256=F7kGoNQbAMwy71zT1V_KF8PbRTCY4Dz-16Zv4ApK8m8,18939
169
- fastworkflow/workflow_agent.py,sha256=usSLXUJouVHQOBR2GWMGlb_uTYf9SL_WKav6nEoAxP8,15385
170
+ fastworkflow/workflow_agent.py,sha256=iUcaE1fKLTiRNyDaochPpRHdijCiQBYaCWR8DdslO9Y,16028
170
171
  fastworkflow/workflow_inheritance_model.py,sha256=Pp-qSrQISgPfPjJVUfW84pc7HLmL2evuq0UVIYR51K0,7974
171
- fastworkflow-2.15.6.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
172
- fastworkflow-2.15.6.dist-info/METADATA,sha256=nwvStKcn0GeGkbwRfZLyX4w4gZs5tnkYMSXWxvD925o,29867
173
- fastworkflow-2.15.6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
174
- fastworkflow-2.15.6.dist-info/entry_points.txt,sha256=m8HqoPzCyaZLAx-V5X8MJgw3Lx3GiPDlxNEZ7K-Gb-U,54
175
- fastworkflow-2.15.6.dist-info/RECORD,,
172
+ fastworkflow-2.15.8.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
173
+ fastworkflow-2.15.8.dist-info/METADATA,sha256=e_tIGgR1TqfZGWWtZXMWfs6AFpFssNnrCai2pvBE54o,29869
174
+ fastworkflow-2.15.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
175
+ fastworkflow-2.15.8.dist-info/entry_points.txt,sha256=m8HqoPzCyaZLAx-V5X8MJgw3Lx3GiPDlxNEZ7K-Gb-U,54
176
+ fastworkflow-2.15.8.dist-info/RECORD,,