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.
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/PKG-INFO +1 -1
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/wildcard.py +7 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/parameter_extraction.py +15 -3
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/chat_session.py +8 -1
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_executor.py +13 -4
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/signatures.py +242 -52
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/workflow.py +1 -5
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/pyproject.toml +1 -1
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/LICENSE +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/README.md +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/.DS_Store +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/__init__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_commands/.gitkeep +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/__init__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/__init__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/abort.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/you_misunderstood.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/go_up.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/reset_context.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_can_i_do.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_is_current_context.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/_commands/__init__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/command_context_model.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/_workflows/command_metadata_extraction/intent_detection.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/__main__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/ast_class_extractor.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/class_analysis_structures.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/cli_specification.md +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/command_dependency_resolver.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/command_file_generator.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/command_file_template.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/command_import_utils.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/command_stub_generator.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/context_folder_generator.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/context_model_generator.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/dependency_manager.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/dir_scanner.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/documentation_generator.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/genai_postprocessor.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/inheritance_block_regenerator.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/libcst_transformers.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/navigator_stub_generator.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/pydantic_model_generator.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/utterance_generator.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/cache_matching.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/cli.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_context_model.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_directory.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_interfaces.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_metadata_api.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/command_routing.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/docs/context_modules_prd.txt +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/README.md +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/_commands/WorkItem/get_status.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/_commands/generate_report.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/_commands/startup.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/simple_workflow_template.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/extended_workflow_example/workflow_inheritance_model.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/fastworkflow.env +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/fastworkflow.passwords.env +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/hello_world/_commands/README.md +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/hello_world/_commands/add_two_numbers.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/hello_world/_commands/context_inheritance_model.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/hello_world/application/add_two_numbers.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_1/_commands/context_inheritance_model.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_1/_commands/send_message.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_1/application/send_message.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_2/_commands/User/send_message.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_2/_commands/context_inheritance_model.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_2/_commands/startup.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_2/application/user.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_3/_commands/PremiumUser/send_priority_message.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_3/_commands/User/send_message.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_3/_commands/context_inheritance_model.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_3/_commands/initialize_user.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_3/application/user.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/_ChatRoom.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/add_user.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/broadcast_message.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/get_current_user.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/list_users.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/set_current_user.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/PremiumUser/_PremiumUser.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/PremiumUser/send_priority_message.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/User/_User.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/User/send_message.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/context_inheritance_model.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/_commands/set_root_context.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/application/chatroom.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/application/user.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/context_hierarchy_model.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/messaging_app_4/startup_action.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/calculate.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/cancel_pending_order.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/exchange_delivered_order_items.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/find_user_id_by_email.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/find_user_id_by_name_zip.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/get_order_details.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/get_product_details.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/get_user_details.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/list_all_product_types.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_address.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_items.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_payment.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/modify_user_address.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/return_delivered_order_items.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/_commands/transfer_to_human_agents.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/context_inheritance_model.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/retail_data/__init__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/retail_data/orders.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/retail_data/products.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/retail_data/users.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/calculate.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/cancel_pending_order.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/exchange_delivered_order_items.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/find_user_id_by_email.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/find_user_id_by_name_zip.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/get_order_details.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/get_product_details.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/get_user_details.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/list_all_product_types.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_address.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_items.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_payment.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/modify_user_address.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/return_delivered_order_items.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/think.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/tool.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/tools/transfer_to_human_agents.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/retail_workflow/workflow_description.txt +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/__init__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/_WorkItem.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/add_child_workitem.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/get_status.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/go_to_workitem.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/mark_as_complete.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_first_child_workitem.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_last_child_workitem.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_next_workitem.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_previous_workitem.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/remove_all_child_workitems.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/remove_child_workitem.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/show_schema.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/_commands/startup.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/application/__init__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/application/workitem.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/simple_workflow_template.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/simple_workflow_template/startup_action.json +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/mcp_server.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/model_pipeline_training.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/refine/__main__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/run/__init__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/run/__main__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/run_agent/__init__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/run_agent/__main__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/run_agent/agent_module.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/train/__init__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/train/__main__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/train/generate_synthetic.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/user_message_queues.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/__init__.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/command_dependency_graph.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/context_utils.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/dspy_cache_utils.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/dspy_logger.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/dspy_utils.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/env.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/fuzzy_match.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/generate_param_examples.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/logging.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/parameterize_func_decorator.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/pydantic_model_2_dspy_signature_class.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/python_utils.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/react.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/utils/startup_progress.py +0 -0
- {fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/workflow_agent.py +0 -0
- {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.
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
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
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
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
|
-
|
|
384
|
-
|
|
385
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/class_analysis_structures.py
RENAMED
|
File without changes
|
|
File without changes
|
{fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/command_dependency_resolver.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/build/inheritance_block_regenerator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/fastworkflow.passwords.env
RENAMED
|
File without changes
|
{fastworkflow-2.15.9 → fastworkflow-2.15.10}/fastworkflow/examples/hello_world/_commands/README.md
RENAMED
|
File without changes
|
|
File without changes
|