fastworkflow 2.15.9__tar.gz → 2.15.10__tar.gz

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.
Files changed (177) hide show
  1. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/PKG-INFO +1 -1
  2. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/wildcard.py +7 -0
  3. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/parameter_extraction.py +15 -3
  4. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/chat_session.py +8 -1
  5. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_executor.py +13 -4
  6. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/signatures.py +242 -52
  7. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/workflow.py +1 -5
  8. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/pyproject.toml +1 -1
  9. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/LICENSE +0 -0
  10. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/README.md +0 -0
  11. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/.DS_Store +0 -0
  12. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/__init__.py +0 -0
  13. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_commands/.gitkeep +0 -0
  14. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/__init__.py +0 -0
  15. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/__init__.py +0 -0
  16. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/abort.py +0 -0
  17. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/you_misunderstood.py +0 -0
  18. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/go_up.py +0 -0
  19. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/reset_context.py +0 -0
  20. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_can_i_do.py +0 -0
  21. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_is_current_context.py +0 -0
  22. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/__init__.py +0 -0
  23. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/command_context_model.json +0 -0
  24. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/intent_detection.py +0 -0
  25. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/__main__.py +0 -0
  26. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/ast_class_extractor.py +0 -0
  27. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/class_analysis_structures.py +0 -0
  28. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/cli_specification.md +0 -0
  29. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/command_dependency_resolver.py +0 -0
  30. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/command_file_generator.py +0 -0
  31. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/command_file_template.py +0 -0
  32. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/command_import_utils.py +0 -0
  33. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/command_stub_generator.py +0 -0
  34. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/context_folder_generator.py +0 -0
  35. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/context_model_generator.py +0 -0
  36. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/dependency_manager.py +0 -0
  37. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/dir_scanner.py +0 -0
  38. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/documentation_generator.py +0 -0
  39. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/genai_postprocessor.py +0 -0
  40. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/inheritance_block_regenerator.py +0 -0
  41. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/libcst_transformers.py +0 -0
  42. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/navigator_stub_generator.py +0 -0
  43. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/pydantic_model_generator.py +0 -0
  44. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/utterance_generator.py +0 -0
  45. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/cache_matching.py +0 -0
  46. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/cli.py +0 -0
  47. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_context_model.py +0 -0
  48. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_directory.py +0 -0
  49. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_interfaces.py +0 -0
  50. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_metadata_api.py +0 -0
  51. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_routing.py +0 -0
  52. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/docs/context_modules_prd.txt +0 -0
  53. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/README.md +0 -0
  54. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/_commands/WorkItem/get_status.py +0 -0
  55. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/_commands/generate_report.py +0 -0
  56. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/_commands/startup.py +0 -0
  57. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/simple_workflow_template.json +0 -0
  58. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/workflow_inheritance_model.json +0 -0
  59. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/fastworkflow.env +0 -0
  60. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/fastworkflow.passwords.env +0 -0
  61. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/hello_world/_commands/README.md +0 -0
  62. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/hello_world/_commands/add_two_numbers.py +0 -0
  63. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/hello_world/_commands/context_inheritance_model.json +0 -0
  64. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/hello_world/application/add_two_numbers.py +0 -0
  65. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_1/_commands/context_inheritance_model.json +0 -0
  66. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_1/_commands/send_message.py +0 -0
  67. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_1/application/send_message.py +0 -0
  68. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_2/_commands/User/send_message.py +0 -0
  69. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_2/_commands/context_inheritance_model.json +0 -0
  70. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_2/_commands/startup.py +0 -0
  71. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_2/application/user.py +0 -0
  72. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_3/_commands/PremiumUser/send_priority_message.py +0 -0
  73. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_3/_commands/User/send_message.py +0 -0
  74. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_3/_commands/context_inheritance_model.json +0 -0
  75. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_3/_commands/initialize_user.py +0 -0
  76. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_3/application/user.py +0 -0
  77. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/_ChatRoom.py +0 -0
  78. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/add_user.py +0 -0
  79. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/broadcast_message.py +0 -0
  80. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/get_current_user.py +0 -0
  81. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/list_users.py +0 -0
  82. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/set_current_user.py +0 -0
  83. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/PremiumUser/_PremiumUser.py +0 -0
  84. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/PremiumUser/send_priority_message.py +0 -0
  85. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/User/_User.py +0 -0
  86. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/User/send_message.py +0 -0
  87. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/context_inheritance_model.json +0 -0
  88. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/set_root_context.py +0 -0
  89. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/application/chatroom.py +0 -0
  90. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/application/user.py +0 -0
  91. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/context_hierarchy_model.json +0 -0
  92. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/startup_action.json +0 -0
  93. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/calculate.py +0 -0
  94. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/cancel_pending_order.py +0 -0
  95. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/exchange_delivered_order_items.py +0 -0
  96. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/find_user_id_by_email.py +0 -0
  97. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/find_user_id_by_name_zip.py +0 -0
  98. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/get_order_details.py +0 -0
  99. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/get_product_details.py +0 -0
  100. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/get_user_details.py +0 -0
  101. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/list_all_product_types.py +0 -0
  102. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_address.py +0 -0
  103. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_items.py +0 -0
  104. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_payment.py +0 -0
  105. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/modify_user_address.py +0 -0
  106. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/return_delivered_order_items.py +0 -0
  107. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/transfer_to_human_agents.py +0 -0
  108. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/context_inheritance_model.json +0 -0
  109. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/retail_data/__init__.py +0 -0
  110. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/retail_data/orders.json +0 -0
  111. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/retail_data/products.json +0 -0
  112. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/retail_data/users.json +0 -0
  113. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/calculate.py +0 -0
  114. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/cancel_pending_order.py +0 -0
  115. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/exchange_delivered_order_items.py +0 -0
  116. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/find_user_id_by_email.py +0 -0
  117. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/find_user_id_by_name_zip.py +0 -0
  118. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/get_order_details.py +0 -0
  119. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/get_product_details.py +0 -0
  120. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/get_user_details.py +0 -0
  121. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/list_all_product_types.py +0 -0
  122. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_address.py +0 -0
  123. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_items.py +0 -0
  124. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_payment.py +0 -0
  125. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/modify_user_address.py +0 -0
  126. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/return_delivered_order_items.py +0 -0
  127. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/think.py +0 -0
  128. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/tool.py +0 -0
  129. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/transfer_to_human_agents.py +0 -0
  130. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/workflow_description.txt +0 -0
  131. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/__init__.py +0 -0
  132. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/_WorkItem.py +0 -0
  133. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/add_child_workitem.py +0 -0
  134. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/get_status.py +0 -0
  135. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/go_to_workitem.py +0 -0
  136. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/mark_as_complete.py +0 -0
  137. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_first_child_workitem.py +0 -0
  138. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_last_child_workitem.py +0 -0
  139. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_next_workitem.py +0 -0
  140. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_previous_workitem.py +0 -0
  141. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/remove_all_child_workitems.py +0 -0
  142. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/remove_child_workitem.py +0 -0
  143. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/show_schema.py +0 -0
  144. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/startup.py +0 -0
  145. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/application/__init__.py +0 -0
  146. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/application/workitem.py +0 -0
  147. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/simple_workflow_template.json +0 -0
  148. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/startup_action.json +0 -0
  149. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/mcp_server.py +0 -0
  150. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/model_pipeline_training.py +0 -0
  151. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/refine/__main__.py +0 -0
  152. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/run/__init__.py +0 -0
  153. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/run/__main__.py +0 -0
  154. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/run_agent/__init__.py +0 -0
  155. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/run_agent/__main__.py +0 -0
  156. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/run_agent/agent_module.py +0 -0
  157. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/train/__init__.py +0 -0
  158. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/train/__main__.py +0 -0
  159. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/train/generate_synthetic.py +0 -0
  160. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/user_message_queues.py +0 -0
  161. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/__init__.py +0 -0
  162. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/command_dependency_graph.py +0 -0
  163. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/context_utils.py +0 -0
  164. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/dspy_cache_utils.py +0 -0
  165. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/dspy_logger.py +0 -0
  166. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/dspy_utils.py +0 -0
  167. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/env.py +0 -0
  168. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/fuzzy_match.py +0 -0
  169. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/generate_param_examples.py +0 -0
  170. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/logging.py +0 -0
  171. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/parameterize_func_decorator.py +0 -0
  172. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/pydantic_model_2_dspy_signature_class.py +0 -0
  173. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/python_utils.py +0 -0
  174. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/react.py +0 -0
  175. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/startup_progress.py +0 -0
  176. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/workflow_agent.py +0 -0
  177. {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/workflow_inheritance_model.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastworkflow
3
- Version: 2.15.9
3
+ Version: 2.15.10
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
@@ -130,6 +130,13 @@ class ResponseGenerator:
130
130
  workflow_context["NLU_Pipeline_Stage"] = NLUPipelineStage.PARAMETER_EXTRACTION
131
131
  workflow.context = workflow_context
132
132
 
133
+ if nlu_pipeline_stage == NLUPipelineStage.PARAMETER_EXTRACTION:
134
+ cnp_output.command_name = workflow.context["command_name"]
135
+ else:
136
+ workflow_context = workflow.context
137
+ workflow_context["command_name"] = cnp_output.command_name
138
+ workflow.context = workflow_context
139
+
133
140
  command_name = cnp_output.command_name
134
141
  extractor = ParameterExtraction(workflow, app_workflow, command_name, command)
135
142
  pe_output = extractor.extract()
@@ -65,12 +65,24 @@ class ParameterExtraction:
65
65
  self.command_name,
66
66
  app_workflow_folderpath)
67
67
 
68
- self._store_parameters(self.cme_workflow, new_params)
69
-
70
- is_valid, error_msg, suggestions = input_for_param_extraction.validate_parameters(
68
+ is_valid, error_msg, suggestions, missing_invalid_fields = \
69
+ input_for_param_extraction.validate_parameters(
71
70
  self.app_workflow, self.command_name, new_params
72
71
  )
73
72
 
73
+ # Set all the missing and invalid fields to None before storing
74
+ current_values = {
75
+ field_name: getattr(new_params, field_name, None)
76
+ for field_name in list(type(new_params).model_fields.keys())
77
+ }
78
+ for field_name in missing_invalid_fields:
79
+ if field_name in current_values:
80
+ current_values[field_name] = NOT_FOUND
81
+ # Reconstruct the model instance without validation
82
+ new_params = new_params.__class__.model_construct(**current_values)
83
+
84
+ self._store_parameters(self.cme_workflow, new_params)
85
+
74
86
  if not is_valid:
75
87
  if params_str := self._format_parameters_for_display(new_params):
76
88
  error_msg = f"Extracted parameters so far:\n{params_str}\n\n{error_msg}"
@@ -345,9 +345,16 @@ class ChatSession:
345
345
  ) and self._status != SessionStatus.STOPPING:
346
346
  try:
347
347
  message = self.user_message_queue.get()
348
+
349
+ if ((
350
+ "NLU_Pipeline_Stage" not in self._cme_workflow.context or
351
+ self._cme_workflow.context["NLU_Pipeline_Stage"] == fastworkflow.NLUPipelineStage.INTENT_DETECTION) and
352
+ message.startswith('/')
353
+ ):
354
+ self._cme_workflow.context["is_assistant_mode_command"] = True
348
355
 
349
356
  # Route based on mode and message type
350
- if self._run_as_agent and not message.startswith('/'):
357
+ if self._run_as_agent and "is_assistant_mode_command" not in self._cme_workflow.context:
351
358
  # In agent mode, use workflow tool agent for processing
352
359
  last_output = self._process_agent_message(message)
353
360
  # elif self._is_mcp_tool_call(message):
@@ -45,7 +45,12 @@ class CommandExecutor(CommandExecutorInterface):
45
45
  command = command)
46
46
  )
47
47
 
48
- if command_output.command_handled or not command_output.success:
48
+ if command_output.command_handled:
49
+ # important to clear the current command mode from the workflow context
50
+ if "is_assistant_mode_command" in chat_session.cme_workflow._context:
51
+ del chat_session.cme_workflow._context["is_assistant_mode_command"]
52
+ return command_output
53
+ elif not command_output.success:
49
54
  return command_output
50
55
 
51
56
  command_name = command_output.command_responses[0].artifacts["command_name"]
@@ -54,7 +59,7 @@ class CommandExecutor(CommandExecutorInterface):
54
59
  workflow = ChatSession.get_active_workflow()
55
60
  workflow_name = workflow.folderpath.split('/')[-1]
56
61
  context = workflow.current_command_context_displayname
57
-
62
+
58
63
  command_routing_definition = fastworkflow.RoutingRegistry.get_definition(
59
64
  workflow.folderpath
60
65
  )
@@ -77,13 +82,17 @@ class CommandExecutor(CommandExecutorInterface):
77
82
  command_output = response_generation_object(workflow, command, input_obj)
78
83
  else:
79
84
  command_output = response_generation_object(workflow, command)
80
-
85
+
81
86
  # Set the additional attributes
82
87
  command_output.workflow_name = workflow_name
83
88
  command_output.context = context
84
89
  command_output.command_name = command_name
85
90
  command_output.command_parameters = input_obj or None
86
91
 
92
+ # important to clear the current command mode from the workflow context
93
+ if "is_assistant_mode_command" in chat_session.cme_workflow._context:
94
+ del chat_session.cme_workflow._context["is_assistant_mode_command"]
95
+
87
96
  return command_output
88
97
 
89
98
  @classmethod
@@ -134,7 +143,7 @@ class CommandExecutor(CommandExecutorInterface):
134
143
  input_obj = command_parameters_class(**action.parameters)
135
144
 
136
145
  input_for_param_extraction = InputForParamExtraction(command=action.command)
137
- is_valid, error_msg, _ = input_for_param_extraction.validate_parameters(
146
+ is_valid, error_msg, _, _ = input_for_param_extraction.validate_parameters(
138
147
  workflow, action.command_name, input_obj
139
148
  )
140
149
  if not is_valid:
@@ -1,4 +1,5 @@
1
1
  import sys
2
+ import ast
2
3
  import dspy
3
4
  import os
4
5
  from contextlib import suppress
@@ -318,7 +319,7 @@ Today's date is {today}.
318
319
  def validate_parameters(self,
319
320
  app_workflow: fastworkflow.Workflow,
320
321
  subject_command_name: str,
321
- cmd_parameters: BaseModel) -> Tuple[bool, str, Dict[str, List[str]]]:
322
+ cmd_parameters: BaseModel) -> Tuple[bool, str, Dict[str, List[str]], List[str]]:
322
323
  """
323
324
  Check if the parameters are valid in the current context, including database lookups.
324
325
  """
@@ -335,54 +336,234 @@ Today's date is {today}.
335
336
  invalid_fields = []
336
337
  all_suggestions = {}
337
338
 
338
- # Check required fields
339
339
  for field_name, field_info in type(cmd_parameters).model_fields.items():
340
- field_value = getattr(cmd_parameters, field_name, None)
340
+ field_value = getattr(cmd_parameters, field_name, None)
341
+
342
+ if field_value not in [NOT_FOUND, None, INVALID_INT_VALUE, INVALID_FLOAT_VALUE]:
343
+ annotation = field_info.annotation
344
+
345
+ # Build list of candidate concrete types (exclude NoneType from Union)
346
+ candidate_types: List[Type[Any]] = []
347
+ if hasattr(annotation, "__origin__") and annotation.__origin__ is Union:
348
+ for t in get_args(annotation):
349
+ if t is not type(None): # noqa: E721
350
+ candidate_types.append(t) # type: ignore[arg-type]
351
+ else:
352
+ candidate_types = [annotation] # type: ignore[list-item]
353
+
354
+ def try_coerce_enum(enum_cls: Type[Enum], val: Any) -> Tuple[bool, Optional[Enum]]:
355
+ if isinstance(val, enum_cls):
356
+ return True, val
357
+ if isinstance(val, str):
358
+ for member in enum_cls:
359
+ if val == member.value or val.lower() == str(member.name).lower():
360
+ return True, member
361
+ return False, None
362
+
363
+ def build_type_suggestion() -> List[str]:
364
+ examples = getattr(field_info, "examples", []) or []
365
+ example = examples[0] if examples else None
366
+ # Enum suggestions list valid values
367
+ enum_types = [t for t in candidate_types if isinstance(t, type) and issubclass(t, Enum)]
368
+ if enum_types:
369
+ opts = [f"'{opt.value}'" for t in enum_types for opt in t]
370
+ return [f"Please provide a value matching the expected type/format. Valid values: {', '.join(opts)}"]
371
+ # List suggestions
372
+ def _is_list_type(tt):
373
+ try:
374
+ return hasattr(tt, "__origin__") and tt.__origin__ in (list, List)
375
+ except Exception:
376
+ return False
377
+ list_types = [t for t in candidate_types if _is_list_type(t)]
378
+ if list_types:
379
+ inner_args = get_args(list_types[0])
380
+ inner = inner_args[0] if inner_args else str
381
+ inner_name = inner.__name__ if isinstance(inner, type) else str(inner)
382
+ hint = (
383
+ f"Please provide a list of {inner_name} values. Accepted formats: "
384
+ f"JSON list (e.g., [\"a\", \"b\"]), Python list (e.g., ['a', 'b']), "
385
+ f"or comma-separated (e.g., a,b)."
386
+ )
387
+ return [hint]
388
+ # Fallback: show expected type names (handles unions)
389
+ name_list: List[str] = []
390
+ for t in candidate_types:
391
+ if isinstance(t, type):
392
+ name_list.append(t.__name__)
393
+ else:
394
+ name_list.append(str(t))
395
+ base = f"Please provide a value matching the expected type/format: {' or '.join(name_list)}"
396
+ if example is not None:
397
+ base = f"{base} (e.g., {example})"
398
+ return [base]
399
+
400
+ valid_by_type = False
401
+ corrected_value: Optional[Any] = None
402
+ def _is_list_type(tt):
403
+ try:
404
+ return hasattr(tt, "__origin__") and tt.__origin__ in (list, List)
405
+ except Exception:
406
+ return False
407
+
408
+ def _parse_list_like_string(s: str) -> Optional[list]:
409
+ if not isinstance(s, str):
410
+ return None
411
+ text = s.strip()
412
+ if text.startswith("[") and text.endswith("]"):
413
+ with suppress(Exception):
414
+ parsed = json.loads(text)
415
+ if isinstance(parsed, list):
416
+ return parsed
417
+ # Try Python literal list
418
+ with suppress(Exception):
419
+ parsed = ast.literal_eval(text)
420
+ if isinstance(parsed, list):
421
+ return parsed
422
+ # Fallback: comma-separated
423
+ if "," in text:
424
+ parts = [p.strip() for p in text.split(",")]
425
+ cleaned = [
426
+ (p[1:-1] if len(p) >= 2 and ((p[0] == p[-1] == '"') or (p[0] == p[-1] == "'")) else p)
427
+ for p in parts
428
+ ]
429
+ return cleaned
430
+ return None
431
+
432
+ def _coerce_scalar(expected_type: Type[Any], val: Any) -> Tuple[bool, Optional[Any]]:
433
+ # str
434
+ if expected_type is str:
435
+ return True, str(val)
436
+ # int
437
+ if expected_type is int:
438
+ if isinstance(val, bool):
439
+ return False, None
440
+ if isinstance(val, int):
441
+ return True, val
442
+ if isinstance(val, str):
443
+ with suppress(Exception):
444
+ return True, int(val.strip())
445
+ return False, None
446
+ # float
447
+ if expected_type is float:
448
+ if isinstance(val, (int, float)) and not isinstance(val, bool):
449
+ return True, float(val)
450
+ if isinstance(val, str):
451
+ with suppress(Exception):
452
+ return True, float(val.strip())
453
+ return False, None
454
+ # Enum
455
+ if isinstance(expected_type, type) and issubclass(expected_type, Enum):
456
+ ok, enum_val = try_coerce_enum(expected_type, val)
457
+ return (ok, enum_val if ok else None)
458
+ # Unknown: accept if already instance
459
+ return (True, val) if isinstance(val, expected_type) else (False, None)
460
+
461
+ def _try_coerce_list(list_type: Any, value: Any) -> Tuple[bool, Optional[list]]:
462
+ inner_args = get_args(list_type)
463
+ inner_type = inner_args[0] if inner_args else str
464
+ raw_list: Optional[list] = None
465
+ if isinstance(value, list):
466
+ raw_list = value
467
+ elif isinstance(value, str):
468
+ raw_list = _parse_list_like_string(value)
469
+ if raw_list is None:
470
+ return False, None
471
+ coerced_list = []
472
+ for item in raw_list:
473
+ ok, coerced = _coerce_scalar(inner_type, item)
474
+ if not ok:
475
+ return False, None
476
+ coerced_list.append(coerced)
477
+ return True, coerced_list
478
+
479
+ for t in candidate_types:
480
+ # list[...] and typing.List[...] support
481
+ if _is_list_type(t):
482
+ ok, coerced_list = _try_coerce_list(t, field_value)
483
+ if ok:
484
+ corrected_value = coerced_list
485
+ valid_by_type = True
486
+ break
487
+ # str
488
+ if t is str and isinstance(field_value, str):
489
+ valid_by_type = True
490
+ break
491
+ # int
492
+ if t is int:
493
+ if isinstance(field_value, bool):
494
+ pass # bool is subclass of int; treat as invalid here
495
+ elif isinstance(field_value, int):
496
+ valid_by_type = True
497
+ break
498
+ elif isinstance(field_value, str):
499
+ with suppress(Exception):
500
+ coerced = int(field_value.strip())
501
+ corrected_value = coerced
502
+ valid_by_type = True
503
+ break
504
+ # float
505
+ if t is float:
506
+ if isinstance(field_value, (int, float)) and not isinstance(field_value, bool):
507
+ if isinstance(field_value, int):
508
+ corrected_value = float(field_value)
509
+ valid_by_type = True
510
+ break
511
+ elif isinstance(field_value, str):
512
+ with suppress(Exception):
513
+ coerced = float(field_value.strip())
514
+ corrected_value = coerced
515
+ valid_by_type = True
516
+ break
517
+ # Enum
518
+ if isinstance(t, type) and issubclass(t, Enum):
519
+ ok, enum_val = try_coerce_enum(t, field_value)
520
+ if ok:
521
+ corrected_value = enum_val
522
+ valid_by_type = True
523
+ break
524
+
525
+ if valid_by_type:
526
+ if corrected_value is not None:
527
+ setattr(cmd_parameters, field_name, corrected_value)
528
+ else:
529
+ invalid_fields.append(f"{field_name} '{field_value}'")
530
+ all_suggestions[field_name] = build_type_suggestion()
531
+ is_valid = False
341
532
 
342
- is_optional = False
343
- attribute_type = field_info.annotation
344
- if hasattr(attribute_type, "__origin__") and attribute_type.__origin__ is Union:
345
- union_elements = get_args(attribute_type)
346
- if type(None) in union_elements:
347
- is_optional = True
348
-
349
- is_required=True
350
- if is_optional:
351
- is_required=False
352
-
353
- # Only add to missing fields if it's required AND has no value
354
- if is_required and \
355
- field_value in [
356
- NOT_FOUND,
357
- None,
358
- INVALID_INT_VALUE,
359
- INVALID_FLOAT_VALUE
360
- ]:
361
- missing_fields.append(field_name)
362
- is_valid = False
363
-
364
- pattern = next(
365
- (meta.pattern
366
- for meta in getattr(field_info, "metadata", [])
367
- if hasattr(meta, "pattern")),
368
- None,
369
- )
370
- if pattern and field_value is not None and field_value != NOT_FOUND:
371
- invalid_value = None
372
- if hasattr(field_info, "json_schema_extra") and field_info.json_schema_extra:
373
- invalid_value = field_info.json_schema_extra.get("invalid_value")
533
+ is_optional = False
534
+ attribute_type = field_info.annotation
535
+ if hasattr(attribute_type, "__origin__") and attribute_type.__origin__ is Union:
536
+ union_elements = get_args(attribute_type)
537
+ if type(None) in union_elements:
538
+ is_optional = True
374
539
 
375
- if invalid_value and field_value == invalid_value:
376
- invalid_fields.append(f"{field_name} '{field_value}'")
377
- pattern_str = str(pattern)
378
- examples = getattr(field_info, "examples", [])
379
- example = examples[0] if examples else ""
380
- all_suggestions[field_name] = [f"Please use the format matching pattern {pattern_str} (e.g., {example})"]
540
+ is_required=True
541
+ if is_optional:
542
+ is_required=False
543
+
544
+ # Only add to missing fields if it's required AND has no value
545
+ if is_required and \
546
+ field_value in [
547
+ NOT_FOUND,
548
+ None,
549
+ INVALID_INT_VALUE,
550
+ INVALID_FLOAT_VALUE
551
+ ]:
552
+ missing_fields.append(field_name)
381
553
  is_valid = False
382
554
 
383
- else:
384
- pattern_regex = re.compile(pattern)
385
- if not pattern_regex.fullmatch(str(field_value)):
555
+ pattern = next(
556
+ (meta.pattern
557
+ for meta in getattr(field_info, "metadata", [])
558
+ if hasattr(meta, "pattern")),
559
+ None,
560
+ )
561
+ if pattern and field_value is not None and field_value != NOT_FOUND:
562
+ invalid_value = None
563
+ if hasattr(field_info, "json_schema_extra") and field_info.json_schema_extra:
564
+ invalid_value = field_info.json_schema_extra.get("invalid_value")
565
+
566
+ if invalid_value and field_value == invalid_value:
386
567
  invalid_fields.append(f"{field_name} '{field_value}'")
387
568
  pattern_str = str(pattern)
388
569
  examples = getattr(field_info, "examples", [])
@@ -390,6 +571,15 @@ Today's date is {today}.
390
571
  all_suggestions[field_name] = [f"Please use the format matching pattern {pattern_str} (e.g., {example})"]
391
572
  is_valid = False
392
573
 
574
+ else:
575
+ pattern_regex = re.compile(pattern)
576
+ if not pattern_regex.fullmatch(str(field_value)):
577
+ invalid_fields.append(f"{field_name} '{field_value}'")
578
+ pattern_str = str(pattern)
579
+ examples = getattr(field_info, "examples", [])
580
+ example = examples[0] if examples else ""
581
+ all_suggestions[field_name] = [f"Please use the format matching pattern {pattern_str} (e.g., {example})"]
582
+ is_valid = False
393
583
 
394
584
  for field_name, field_info in type(cmd_parameters).model_fields.items():
395
585
  field_value = getattr(cmd_parameters, field_name, None)
@@ -420,20 +610,20 @@ Today's date is {today}.
420
610
  if is_valid:
421
611
  if not (
422
612
  self.input_for_param_extraction_class and \
423
- hasattr(self.input_for_param_extraction_class, 'validate_extracted_parameters')
613
+ hasattr(self.input_for_param_extraction_class, 'validate_extracted_parameters')
424
614
  ):
425
- return (True, "All required parameters are valid.", {})
426
-
615
+ return (True, "All required parameters are valid.", {}, [])
616
+
427
617
  try:
428
618
  is_valid, message = self.input_for_param_extraction_class.validate_extracted_parameters(app_workflow, subject_command_name, cmd_parameters)
429
619
  except Exception as e:
430
620
  message = f"Exception in {subject_command_name}'s validate_extracted_parameters function: {str(e)}"
431
621
  logger.critical(message)
432
- return (False, message, {})
433
-
622
+ return (False, message, {}, [])
623
+
434
624
  if is_valid:
435
- return (True, "All required parameters are valid.", {})
436
- return (False, message, {})
625
+ return (True, "All required parameters are valid.", {}, [])
626
+ return (False, message, {}, [])
437
627
 
438
628
  message = ''
439
629
  if missing_fields:
@@ -474,4 +664,4 @@ Today's date is {today}.
474
664
  if "run_as_agent" not in app_workflow.context:
475
665
  message += "\nFor parameter values that include a comma, provide separately from other values, and one at a time."
476
666
 
477
- return (False, message, all_suggestions)
667
+ return (False, message, all_suggestions, combined_fields)
@@ -288,21 +288,17 @@ class Workflow:
288
288
 
289
289
  def end_command_processing(self) -> None:
290
290
  """Process the end of a command"""
291
- mark_dirty = False
292
291
  # important to clear the current command from the workflow context
293
292
  if "command" in self._context:
294
293
  del self._context["command"]
295
- mark_dirty = True
296
294
 
297
295
  # important to clear parameter extraction error state (if any)
298
296
  if "stored_parameters" in self._context:
299
297
  del self._context["stored_parameters"]
300
- mark_dirty = True
301
298
 
302
299
  self._context["NLU_Pipeline_Stage"] = fastworkflow.NLUPipelineStage.INTENT_DETECTION
303
300
 
304
- if mark_dirty:
305
- self._mark_dirty()
301
+ self._mark_dirty()
306
302
 
307
303
  def close(self) -> bool:
308
304
  """close the session"""
@@ -9,7 +9,7 @@ repository = "https://github.com/radiantlogicinc/fastworkflow"
9
9
 
10
10
  [tool.poetry]
11
11
  name = "fastworkflow"
12
- version = "2.15.9"
12
+ version = "2.15.10"
13
13
  description = "A framework for rapidly building large-scale, deterministic, interactive workflows with a fault-tolerant, conversational UX"
14
14
  authors = ["Dhar Rawal <drawal@radiantlogic.com>"]
15
15
  license = "Apache-2.0"
File without changes
File without changes