fastworkflow 2.17.26__tar.gz → 2.17.28__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.17.26/README.md → fastworkflow-2.17.28/PKG-INFO +155 -1
- fastworkflow-2.17.26/PKG-INFO → fastworkflow-2.17.28/README.md +110 -39
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/__init__.py +6 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/command_file_template.py +9 -5
- fastworkflow-2.17.28/fastworkflow/examples/fastworkflow.env +35 -0
- fastworkflow-2.17.28/fastworkflow/examples/fastworkflow.passwords.env +20 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/__main__.py +214 -6
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/jwt_manager.py +5 -5
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/utils.py +1 -1
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/dspy_utils.py +56 -2
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/logging.py +44 -2
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/workflow_agent.py +12 -13
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/pyproject.toml +16 -5
- fastworkflow-2.17.26/fastworkflow/examples/fastworkflow.env +0 -16
- fastworkflow-2.17.26/fastworkflow/examples/fastworkflow.passwords.env +0 -7
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/LICENSE +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/.DS_Store +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_commands/.gitkeep +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/__init__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/__init__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/abort.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/you_misunderstood.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/go_up.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/reset_context.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_can_i_do.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_is_current_context.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/__init__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/wildcard.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/command_context_model.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/intent_detection.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/parameter_extraction.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/__main__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/ast_class_extractor.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/class_analysis_structures.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/cli_specification.md +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/command_dependency_resolver.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/command_file_generator.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/command_import_utils.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/command_stub_generator.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/context_folder_generator.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/context_model_generator.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/dependency_manager.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/dir_scanner.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/documentation_generator.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/genai_postprocessor.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/inheritance_block_regenerator.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/libcst_transformers.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/navigator_stub_generator.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/pydantic_model_generator.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/utterance_generator.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/cache_matching.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/chat_session.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/cli.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_context_model.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_directory.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_executor.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_interfaces.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_metadata_api.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_routing.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/docs/context_modules_prd.txt +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/README.md +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/_commands/WorkItem/get_status.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/_commands/generate_report.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/_commands/startup.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/simple_workflow_template.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/workflow_inheritance_model.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/hello_world/_commands/README.md +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/hello_world/_commands/add_two_numbers.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/hello_world/_commands/context_inheritance_model.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/hello_world/application/add_two_numbers.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_1/_commands/context_inheritance_model.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_1/_commands/send_message.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_1/application/send_message.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_2/_commands/User/send_message.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_2/_commands/context_inheritance_model.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_2/_commands/startup.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_2/application/user.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_3/_commands/PremiumUser/send_priority_message.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_3/_commands/User/send_message.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_3/_commands/context_inheritance_model.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_3/_commands/initialize_user.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_3/application/user.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/_ChatRoom.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/add_user.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/broadcast_message.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/get_current_user.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/list_users.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/set_current_user.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/PremiumUser/_PremiumUser.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/PremiumUser/send_priority_message.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/User/_User.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/User/send_message.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/context_inheritance_model.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/set_root_context.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/application/chatroom.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/application/user.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/context_hierarchy_model.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/startup_action.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/calculate.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/cancel_pending_order.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/exchange_delivered_order_items.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/find_user_id_by_email.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/find_user_id_by_name_zip.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/get_order_details.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/get_product_details.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/get_user_details.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/list_all_product_types.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_address.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_items.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_payment.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/modify_user_address.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/return_delivered_order_items.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/transfer_to_human_agents.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/context_inheritance_model.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/retail_data/__init__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/retail_data/orders.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/retail_data/products.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/retail_data/users.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/calculate.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/cancel_pending_order.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/exchange_delivered_order_items.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/find_user_id_by_email.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/find_user_id_by_name_zip.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/get_order_details.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/get_product_details.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/get_user_details.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/list_all_product_types.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_address.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_items.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_payment.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/modify_user_address.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/return_delivered_order_items.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/think.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/tool.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/transfer_to_human_agents.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/workflow_description.txt +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/__init__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/_WorkItem.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/add_child_workitem.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/get_status.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/go_to_workitem.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/mark_as_complete.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_first_child_workitem.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_last_child_workitem.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_next_workitem.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_previous_workitem.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/remove_all_child_workitems.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/remove_child_workitem.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/show_schema.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/startup.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/application/__init__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/application/workitem.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/simple_workflow_template.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/startup_action.json +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/intent_clarification_agent.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/mcp_server.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/model_pipeline_training.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/refine/__main__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run/__init__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run/__main__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/README.md +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/__init__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/conversation_store.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/mcp_specific.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/redoc_2_standalone_html.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/train/__init__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/train/__main__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/train/generate_synthetic.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/user_message_queues.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/__init__.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/chat_adapter.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/context_utils.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/dspy_cache_utils.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/dspy_logger.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/env.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/fuzzy_match.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/generate_param_examples.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/parameterize_func_decorator.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/pydantic_model_2_dspy_signature_class.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/python_utils.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/react.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/signatures.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/startup_progress.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/workflow.py +0 -0
- {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/workflow_inheritance_model.py +0 -0
|
@@ -1,3 +1,48 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: fastworkflow
|
|
3
|
+
Version: 2.17.28
|
|
4
|
+
Summary: A framework for rapidly building large-scale, deterministic, interactive workflows with a fault-tolerant, conversational UX
|
|
5
|
+
License: Apache-2.0
|
|
6
|
+
Keywords: fastworkflow,ai,workflow,llm,openai
|
|
7
|
+
Author: Dhar Rawal
|
|
8
|
+
Author-email: drawal@radiantlogic.com
|
|
9
|
+
Requires-Python: >=3.11,<3.14
|
|
10
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Provides-Extra: fastapi
|
|
15
|
+
Provides-Extra: training
|
|
16
|
+
Requires-Dist: aiohttp (>=3.13.3)
|
|
17
|
+
Requires-Dist: colorama (>=0.4.6,<0.5.0)
|
|
18
|
+
Requires-Dist: datasets (>=4.0.0,<5.0.0) ; extra == "training"
|
|
19
|
+
Requires-Dist: dspy (>=3.0.1,<4.0.0)
|
|
20
|
+
Requires-Dist: fastapi (>=0.120.1) ; extra == "fastapi"
|
|
21
|
+
Requires-Dist: fastapi-mcp (>=0.4.0,<0.5.0) ; extra == "fastapi"
|
|
22
|
+
Requires-Dist: filelock (>=3.20.1)
|
|
23
|
+
Requires-Dist: libcst (>=1.8.2,<2.0.0)
|
|
24
|
+
Requires-Dist: litellm[proxy] (>=1.81.4,<2.0.0)
|
|
25
|
+
Requires-Dist: mmh3 (>=5.1.0,<6.0.0)
|
|
26
|
+
Requires-Dist: openai (>=2.8.0)
|
|
27
|
+
Requires-Dist: orjson (>=3.9.15)
|
|
28
|
+
Requires-Dist: prompt_toolkit (>=3.0.43,<4.0.0)
|
|
29
|
+
Requires-Dist: pyasn1 (>=0.6.2)
|
|
30
|
+
Requires-Dist: pydantic (>=2.9.2,<3.0.0)
|
|
31
|
+
Requires-Dist: pyjwt[crypto] (>=2.4.0) ; extra == "fastapi"
|
|
32
|
+
Requires-Dist: pynacl (>=1.6.2)
|
|
33
|
+
Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
|
|
34
|
+
Requires-Dist: python-levenshtein (>=0.27.1,<0.28.0)
|
|
35
|
+
Requires-Dist: scikit-learn (>=1.6.1,<2.0.0)
|
|
36
|
+
Requires-Dist: speedict (>=0.3.12,<0.4.0)
|
|
37
|
+
Requires-Dist: starlette (>=0.49.1)
|
|
38
|
+
Requires-Dist: torch (>=2.7.1,<3.0.0)
|
|
39
|
+
Requires-Dist: transformers (>=4.48.2,<5.0.0)
|
|
40
|
+
Requires-Dist: urllib3 (>=2.6.0)
|
|
41
|
+
Requires-Dist: uvicorn (>=0.31.1,<0.32.0) ; extra == "fastapi"
|
|
42
|
+
Project-URL: homepage, https://github.com/radiantlogicinc/fastworkflow
|
|
43
|
+
Project-URL: repository, https://github.com/radiantlogicinc/fastworkflow
|
|
44
|
+
Description-Content-Type: text/markdown
|
|
45
|
+
|
|
1
46
|
<!-- Logo and Title -->
|
|
2
47
|
<img src="logo.png" height="64" alt="fastWorkflow Logo and Title">
|
|
3
48
|
|
|
@@ -88,6 +133,9 @@ While [DSPy](https://dspy.ai) ([Why DSPy](https://x.com/lateinteraction/status/1
|
|
|
88
133
|
- [Adding context hierarchies with context_inheritance_model.json](#adding-context-hierarchies-with-context_inheritance_modeljson)
|
|
89
134
|
- [Using DSPy for Response Generation](#using-dspy-for-response-generation)
|
|
90
135
|
- [Using Startup Commands and Actions](#using-startup-commands-and-actions)
|
|
136
|
+
- [Running FastWorkflow as a FastAPI Service](#running-fastworkflow-as-a-fastapi-service)
|
|
137
|
+
- [Kubernetes Liveness and Readiness Probes](#kubernetes-liveness-and-readiness-probes)
|
|
138
|
+
- [Using LiteLLM Proxy](#using-litellm-proxy)
|
|
91
139
|
- [Rapidly Building Workflows with the Build Tool](#rapidly-building-workflows-with-the-build-tool)
|
|
92
140
|
- [Environment Variables Reference](#environment-variables-reference)
|
|
93
141
|
- [Environment Variables](#environment-variables)
|
|
@@ -537,6 +585,110 @@ For workflows with complex initialization requirements, creating a dedicated sta
|
|
|
537
585
|
|
|
538
586
|
---
|
|
539
587
|
|
|
588
|
+
### Running FastWorkflow as a FastAPI Service
|
|
589
|
+
|
|
590
|
+
For production deployments and integrations, fastWorkflow provides a FastAPI-based HTTP service via the `run_fastapi_mcp` module. This exposes your workflow as REST endpoints with JWT authentication, SSE streaming, and MCP (Model Context Protocol) support.
|
|
591
|
+
|
|
592
|
+
```sh
|
|
593
|
+
# Run the FastAPI service
|
|
594
|
+
python -m fastworkflow.run_fastapi_mcp \
|
|
595
|
+
--workflow_path ./my_workflow \
|
|
596
|
+
--env_file_path ./fastworkflow.env \
|
|
597
|
+
--passwords_file_path ./fastworkflow.passwords.env \
|
|
598
|
+
--port 8000
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
The service provides endpoints for:
|
|
602
|
+
- `/initialize` - Create a new session and obtain JWT tokens
|
|
603
|
+
- `/invoke_agent` - Submit natural language queries to the agent
|
|
604
|
+
- `/invoke_agent_stream` - Stream responses via SSE or NDJSON
|
|
605
|
+
- `/perform_action` - Execute workflow actions directly
|
|
606
|
+
- `/conversations` - Manage conversation history
|
|
607
|
+
|
|
608
|
+
#### Kubernetes Liveness and Readiness Probes
|
|
609
|
+
|
|
610
|
+
When deploying fastWorkflow in Kubernetes, the service provides dedicated probe endpoints for health monitoring:
|
|
611
|
+
|
|
612
|
+
**Liveness Probe (`/probes/healthz`)**
|
|
613
|
+
|
|
614
|
+
Determines whether the container is still running. If this probe fails, Kubernetes will restart the container.
|
|
615
|
+
|
|
616
|
+
```sh
|
|
617
|
+
curl http://localhost:8000/probes/healthz
|
|
618
|
+
# Response: {"status": "alive"}
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
**Readiness Probe (`/probes/readyz`)**
|
|
622
|
+
|
|
623
|
+
Checks whether the container is ready to accept traffic. Kubernetes only routes traffic to containers that pass this check.
|
|
624
|
+
|
|
625
|
+
```sh
|
|
626
|
+
curl http://localhost:8000/probes/readyz
|
|
627
|
+
# Response (ready): {"status": "ready", "checks": {"ready": true, "fastworkflow_initialized": true, "workflow_path_valid": true}}
|
|
628
|
+
# Response (not ready): {"status": "not_ready", "checks": {"ready": false, ...}}
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
The readiness probe returns:
|
|
632
|
+
- `200 OK` when the application is ready to serve traffic
|
|
633
|
+
- `503 Service Unavailable` when not ready (e.g., during startup)
|
|
634
|
+
|
|
635
|
+
**Example Kubernetes Configuration**
|
|
636
|
+
|
|
637
|
+
```yaml
|
|
638
|
+
apiVersion: apps/v1
|
|
639
|
+
kind: Deployment
|
|
640
|
+
spec:
|
|
641
|
+
template:
|
|
642
|
+
spec:
|
|
643
|
+
containers:
|
|
644
|
+
- name: fastworkflow
|
|
645
|
+
livenessProbe:
|
|
646
|
+
httpGet:
|
|
647
|
+
path: /probes/healthz
|
|
648
|
+
port: 8000
|
|
649
|
+
initialDelaySeconds: 10
|
|
650
|
+
periodSeconds: 10
|
|
651
|
+
failureThreshold: 5
|
|
652
|
+
timeoutSeconds: 3
|
|
653
|
+
readinessProbe:
|
|
654
|
+
httpGet:
|
|
655
|
+
path: /probes/readyz
|
|
656
|
+
port: 8000
|
|
657
|
+
initialDelaySeconds: 5
|
|
658
|
+
periodSeconds: 5
|
|
659
|
+
failureThreshold: 3
|
|
660
|
+
timeoutSeconds: 3
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
> [!note]
|
|
664
|
+
> Probe endpoints do not require authentication and are excluded from request logging when returning 200 status to avoid excessive log noise from frequent Kubernetes health checks.
|
|
665
|
+
|
|
666
|
+
#### Using LiteLLM Proxy
|
|
667
|
+
|
|
668
|
+
FastWorkflow supports routing LLM calls through a [LiteLLM Proxy](https://docs.litellm.ai/docs/simple_proxy) server. This is useful when you want to:
|
|
669
|
+
- Centralize API key management
|
|
670
|
+
- Use a unified endpoint for multiple LLM providers
|
|
671
|
+
- Route requests through a corporate proxy with custom configurations
|
|
672
|
+
|
|
673
|
+
To use LiteLLM Proxy, set your model strings to use the `litellm_proxy/` prefix and configure the proxy URL:
|
|
674
|
+
|
|
675
|
+
```
|
|
676
|
+
# In fastworkflow.env - use the litellm_proxy/ prefix for model names
|
|
677
|
+
LLM_AGENT=litellm_proxy/bedrock_mistral_large_2407
|
|
678
|
+
LLM_PARAM_EXTRACTION=litellm_proxy/bedrock_mistral_large_2407
|
|
679
|
+
LITELLM_PROXY_API_BASE=http://127.0.0.1:4000
|
|
680
|
+
|
|
681
|
+
# In fastworkflow.passwords.env - shared key for proxy authentication
|
|
682
|
+
LITELLM_PROXY_API_KEY=your-proxy-api-key
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
The model name after `litellm_proxy/` (e.g., `bedrock_mistral_large_2407`) is passed to your proxy server, which routes it to the actual provider based on its configuration.
|
|
686
|
+
|
|
687
|
+
> [!note]
|
|
688
|
+
> When using `litellm_proxy/` models, the per-role API keys (`LITELLM_API_KEY_*`) are ignored. All proxied calls use the shared `LITELLM_PROXY_API_KEY` instead. You can mix proxied and direct models - only models with the `litellm_proxy/` prefix are routed through the proxy.
|
|
689
|
+
|
|
690
|
+
---
|
|
691
|
+
|
|
540
692
|
## Rapidly Building Workflows with the Build Tool
|
|
541
693
|
|
|
542
694
|
After understanding the manual process, you can use the `fastworkflow build` command to automate everything. It introspects your code and generates all the necessary files.
|
|
@@ -568,6 +720,7 @@ This single command will generate the `greet.py` command, `get_properties` and `
|
|
|
568
720
|
| `LLM_PLANNER` | LiteLLM model string for the agent's task planner | `run` (agent mode) | `mistral/mistral-small-latest` |
|
|
569
721
|
| `LLM_AGENT` | LiteLLM model string for the DSPy agent | `run` (agent mode) | `mistral/mistral-small-latest` |
|
|
570
722
|
| `LLM_CONVERSATION_STORE` | LiteLLM model string for conversation topic/summary generation | FastAPI service | `mistral/mistral-small-latest` |
|
|
723
|
+
| `LITELLM_PROXY_API_BASE` | URL of your LiteLLM Proxy server | When using `litellm_proxy/` models | *not set* |
|
|
571
724
|
| `NOT_FOUND` | Placeholder value for missing parameters during extraction | Always | `"NOT_FOUND"` |
|
|
572
725
|
| `MISSING_INFORMATION_ERRMSG` | Error message prefix for missing parameters | Always | `"Missing required..."` |
|
|
573
726
|
| `INVALID_INFORMATION_ERRMSG` | Error message prefix for invalid parameters | Always | `"Invalid information..."` |
|
|
@@ -582,6 +735,7 @@ This single command will generate the `greet.py` command, `get_properties` and `
|
|
|
582
735
|
| `LITELLM_API_KEY_PLANNER`| API key for the `LLM_PLANNER` model | `run` (agent mode) | *required* |
|
|
583
736
|
| `LITELLM_API_KEY_AGENT`| API key for the `LLM_AGENT` model | `run` (agent mode) | *required* |
|
|
584
737
|
| `LITELLM_API_KEY_CONVERSATION_STORE`| API key for the `LLM_CONVERSATION_STORE` model | FastAPI service | *required* |
|
|
738
|
+
| `LITELLM_PROXY_API_KEY`| Shared API key for authenticating with LiteLLM Proxy | When using `litellm_proxy/` models | *optional* |
|
|
585
739
|
|
|
586
740
|
> [!tip]
|
|
587
741
|
> The example workflows are configured to use Mistral's models by default. You can get a free API key from [Mistral AI](https://mistral.ai) that works with the `mistral-small-latest` model.
|
|
@@ -645,4 +799,4 @@ Interested in contributing to `fastWorkflow` itself? Great!
|
|
|
645
799
|
|
|
646
800
|
## License
|
|
647
801
|
|
|
648
|
-
`fastWorkflow` is released under the Apache License 2.0
|
|
802
|
+
`fastWorkflow` is released under the Apache License 2.0
|
|
@@ -1,41 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: fastworkflow
|
|
3
|
-
Version: 2.17.26
|
|
4
|
-
Summary: A framework for rapidly building large-scale, deterministic, interactive workflows with a fault-tolerant, conversational UX
|
|
5
|
-
License: Apache-2.0
|
|
6
|
-
Keywords: fastworkflow,ai,workflow,llm,openai
|
|
7
|
-
Author: Dhar Rawal
|
|
8
|
-
Author-email: drawal@radiantlogic.com
|
|
9
|
-
Requires-Python: >=3.11,<3.14
|
|
10
|
-
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
|
-
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
-
Provides-Extra: fastapi
|
|
15
|
-
Provides-Extra: training
|
|
16
|
-
Requires-Dist: colorama (>=0.4.6,<0.5.0)
|
|
17
|
-
Requires-Dist: datasets (>=4.0.0,<5.0.0) ; extra == "training"
|
|
18
|
-
Requires-Dist: dspy (>=3.0.1,<4.0.0)
|
|
19
|
-
Requires-Dist: fastapi (>=0.120.1) ; extra == "fastapi"
|
|
20
|
-
Requires-Dist: fastapi-mcp (>=0.4.0,<0.5.0) ; extra == "fastapi"
|
|
21
|
-
Requires-Dist: libcst (>=1.8.2,<2.0.0)
|
|
22
|
-
Requires-Dist: litellm[proxy] (>=1.80.5,<2.0.0)
|
|
23
|
-
Requires-Dist: mmh3 (>=5.1.0,<6.0.0)
|
|
24
|
-
Requires-Dist: openai (>=2.8.0)
|
|
25
|
-
Requires-Dist: prompt_toolkit (>=3.0.43,<4.0.0)
|
|
26
|
-
Requires-Dist: pydantic (>=2.9.2,<3.0.0)
|
|
27
|
-
Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
|
|
28
|
-
Requires-Dist: python-jose[cryptography] (>=3.3.0,<4.0.0) ; extra == "fastapi"
|
|
29
|
-
Requires-Dist: python-levenshtein (>=0.27.1,<0.28.0)
|
|
30
|
-
Requires-Dist: scikit-learn (>=1.6.1,<2.0.0)
|
|
31
|
-
Requires-Dist: speedict (>=0.3.12,<0.4.0)
|
|
32
|
-
Requires-Dist: torch (>=2.7.1,<3.0.0)
|
|
33
|
-
Requires-Dist: transformers (>=4.48.2,<5.0.0)
|
|
34
|
-
Requires-Dist: uvicorn (>=0.31.1,<0.32.0) ; extra == "fastapi"
|
|
35
|
-
Project-URL: homepage, https://github.com/radiantlogicinc/fastworkflow
|
|
36
|
-
Project-URL: repository, https://github.com/radiantlogicinc/fastworkflow
|
|
37
|
-
Description-Content-Type: text/markdown
|
|
38
|
-
|
|
39
1
|
<!-- Logo and Title -->
|
|
40
2
|
<img src="logo.png" height="64" alt="fastWorkflow Logo and Title">
|
|
41
3
|
|
|
@@ -126,6 +88,9 @@ While [DSPy](https://dspy.ai) ([Why DSPy](https://x.com/lateinteraction/status/1
|
|
|
126
88
|
- [Adding context hierarchies with context_inheritance_model.json](#adding-context-hierarchies-with-context_inheritance_modeljson)
|
|
127
89
|
- [Using DSPy for Response Generation](#using-dspy-for-response-generation)
|
|
128
90
|
- [Using Startup Commands and Actions](#using-startup-commands-and-actions)
|
|
91
|
+
- [Running FastWorkflow as a FastAPI Service](#running-fastworkflow-as-a-fastapi-service)
|
|
92
|
+
- [Kubernetes Liveness and Readiness Probes](#kubernetes-liveness-and-readiness-probes)
|
|
93
|
+
- [Using LiteLLM Proxy](#using-litellm-proxy)
|
|
129
94
|
- [Rapidly Building Workflows with the Build Tool](#rapidly-building-workflows-with-the-build-tool)
|
|
130
95
|
- [Environment Variables Reference](#environment-variables-reference)
|
|
131
96
|
- [Environment Variables](#environment-variables)
|
|
@@ -575,6 +540,110 @@ For workflows with complex initialization requirements, creating a dedicated sta
|
|
|
575
540
|
|
|
576
541
|
---
|
|
577
542
|
|
|
543
|
+
### Running FastWorkflow as a FastAPI Service
|
|
544
|
+
|
|
545
|
+
For production deployments and integrations, fastWorkflow provides a FastAPI-based HTTP service via the `run_fastapi_mcp` module. This exposes your workflow as REST endpoints with JWT authentication, SSE streaming, and MCP (Model Context Protocol) support.
|
|
546
|
+
|
|
547
|
+
```sh
|
|
548
|
+
# Run the FastAPI service
|
|
549
|
+
python -m fastworkflow.run_fastapi_mcp \
|
|
550
|
+
--workflow_path ./my_workflow \
|
|
551
|
+
--env_file_path ./fastworkflow.env \
|
|
552
|
+
--passwords_file_path ./fastworkflow.passwords.env \
|
|
553
|
+
--port 8000
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
The service provides endpoints for:
|
|
557
|
+
- `/initialize` - Create a new session and obtain JWT tokens
|
|
558
|
+
- `/invoke_agent` - Submit natural language queries to the agent
|
|
559
|
+
- `/invoke_agent_stream` - Stream responses via SSE or NDJSON
|
|
560
|
+
- `/perform_action` - Execute workflow actions directly
|
|
561
|
+
- `/conversations` - Manage conversation history
|
|
562
|
+
|
|
563
|
+
#### Kubernetes Liveness and Readiness Probes
|
|
564
|
+
|
|
565
|
+
When deploying fastWorkflow in Kubernetes, the service provides dedicated probe endpoints for health monitoring:
|
|
566
|
+
|
|
567
|
+
**Liveness Probe (`/probes/healthz`)**
|
|
568
|
+
|
|
569
|
+
Determines whether the container is still running. If this probe fails, Kubernetes will restart the container.
|
|
570
|
+
|
|
571
|
+
```sh
|
|
572
|
+
curl http://localhost:8000/probes/healthz
|
|
573
|
+
# Response: {"status": "alive"}
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
**Readiness Probe (`/probes/readyz`)**
|
|
577
|
+
|
|
578
|
+
Checks whether the container is ready to accept traffic. Kubernetes only routes traffic to containers that pass this check.
|
|
579
|
+
|
|
580
|
+
```sh
|
|
581
|
+
curl http://localhost:8000/probes/readyz
|
|
582
|
+
# Response (ready): {"status": "ready", "checks": {"ready": true, "fastworkflow_initialized": true, "workflow_path_valid": true}}
|
|
583
|
+
# Response (not ready): {"status": "not_ready", "checks": {"ready": false, ...}}
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
The readiness probe returns:
|
|
587
|
+
- `200 OK` when the application is ready to serve traffic
|
|
588
|
+
- `503 Service Unavailable` when not ready (e.g., during startup)
|
|
589
|
+
|
|
590
|
+
**Example Kubernetes Configuration**
|
|
591
|
+
|
|
592
|
+
```yaml
|
|
593
|
+
apiVersion: apps/v1
|
|
594
|
+
kind: Deployment
|
|
595
|
+
spec:
|
|
596
|
+
template:
|
|
597
|
+
spec:
|
|
598
|
+
containers:
|
|
599
|
+
- name: fastworkflow
|
|
600
|
+
livenessProbe:
|
|
601
|
+
httpGet:
|
|
602
|
+
path: /probes/healthz
|
|
603
|
+
port: 8000
|
|
604
|
+
initialDelaySeconds: 10
|
|
605
|
+
periodSeconds: 10
|
|
606
|
+
failureThreshold: 5
|
|
607
|
+
timeoutSeconds: 3
|
|
608
|
+
readinessProbe:
|
|
609
|
+
httpGet:
|
|
610
|
+
path: /probes/readyz
|
|
611
|
+
port: 8000
|
|
612
|
+
initialDelaySeconds: 5
|
|
613
|
+
periodSeconds: 5
|
|
614
|
+
failureThreshold: 3
|
|
615
|
+
timeoutSeconds: 3
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
> [!note]
|
|
619
|
+
> Probe endpoints do not require authentication and are excluded from request logging when returning 200 status to avoid excessive log noise from frequent Kubernetes health checks.
|
|
620
|
+
|
|
621
|
+
#### Using LiteLLM Proxy
|
|
622
|
+
|
|
623
|
+
FastWorkflow supports routing LLM calls through a [LiteLLM Proxy](https://docs.litellm.ai/docs/simple_proxy) server. This is useful when you want to:
|
|
624
|
+
- Centralize API key management
|
|
625
|
+
- Use a unified endpoint for multiple LLM providers
|
|
626
|
+
- Route requests through a corporate proxy with custom configurations
|
|
627
|
+
|
|
628
|
+
To use LiteLLM Proxy, set your model strings to use the `litellm_proxy/` prefix and configure the proxy URL:
|
|
629
|
+
|
|
630
|
+
```
|
|
631
|
+
# In fastworkflow.env - use the litellm_proxy/ prefix for model names
|
|
632
|
+
LLM_AGENT=litellm_proxy/bedrock_mistral_large_2407
|
|
633
|
+
LLM_PARAM_EXTRACTION=litellm_proxy/bedrock_mistral_large_2407
|
|
634
|
+
LITELLM_PROXY_API_BASE=http://127.0.0.1:4000
|
|
635
|
+
|
|
636
|
+
# In fastworkflow.passwords.env - shared key for proxy authentication
|
|
637
|
+
LITELLM_PROXY_API_KEY=your-proxy-api-key
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
The model name after `litellm_proxy/` (e.g., `bedrock_mistral_large_2407`) is passed to your proxy server, which routes it to the actual provider based on its configuration.
|
|
641
|
+
|
|
642
|
+
> [!note]
|
|
643
|
+
> When using `litellm_proxy/` models, the per-role API keys (`LITELLM_API_KEY_*`) are ignored. All proxied calls use the shared `LITELLM_PROXY_API_KEY` instead. You can mix proxied and direct models - only models with the `litellm_proxy/` prefix are routed through the proxy.
|
|
644
|
+
|
|
645
|
+
---
|
|
646
|
+
|
|
578
647
|
## Rapidly Building Workflows with the Build Tool
|
|
579
648
|
|
|
580
649
|
After understanding the manual process, you can use the `fastworkflow build` command to automate everything. It introspects your code and generates all the necessary files.
|
|
@@ -606,6 +675,7 @@ This single command will generate the `greet.py` command, `get_properties` and `
|
|
|
606
675
|
| `LLM_PLANNER` | LiteLLM model string for the agent's task planner | `run` (agent mode) | `mistral/mistral-small-latest` |
|
|
607
676
|
| `LLM_AGENT` | LiteLLM model string for the DSPy agent | `run` (agent mode) | `mistral/mistral-small-latest` |
|
|
608
677
|
| `LLM_CONVERSATION_STORE` | LiteLLM model string for conversation topic/summary generation | FastAPI service | `mistral/mistral-small-latest` |
|
|
678
|
+
| `LITELLM_PROXY_API_BASE` | URL of your LiteLLM Proxy server | When using `litellm_proxy/` models | *not set* |
|
|
609
679
|
| `NOT_FOUND` | Placeholder value for missing parameters during extraction | Always | `"NOT_FOUND"` |
|
|
610
680
|
| `MISSING_INFORMATION_ERRMSG` | Error message prefix for missing parameters | Always | `"Missing required..."` |
|
|
611
681
|
| `INVALID_INFORMATION_ERRMSG` | Error message prefix for invalid parameters | Always | `"Invalid information..."` |
|
|
@@ -620,6 +690,7 @@ This single command will generate the `greet.py` command, `get_properties` and `
|
|
|
620
690
|
| `LITELLM_API_KEY_PLANNER`| API key for the `LLM_PLANNER` model | `run` (agent mode) | *required* |
|
|
621
691
|
| `LITELLM_API_KEY_AGENT`| API key for the `LLM_AGENT` model | `run` (agent mode) | *required* |
|
|
622
692
|
| `LITELLM_API_KEY_CONVERSATION_STORE`| API key for the `LLM_CONVERSATION_STORE` model | FastAPI service | *required* |
|
|
693
|
+
| `LITELLM_PROXY_API_KEY`| Shared API key for authenticating with LiteLLM Proxy | When using `litellm_proxy/` models | *optional* |
|
|
623
694
|
|
|
624
695
|
> [!tip]
|
|
625
696
|
> The example workflows are configured to use Mistral's models by default. You can get a free API key from [Mistral AI](https://mistral.ai) that works with the `mistral-small-latest` model.
|
|
@@ -683,4 +754,4 @@ Interested in contributing to `fastWorkflow` itself? Great!
|
|
|
683
754
|
|
|
684
755
|
## License
|
|
685
756
|
|
|
686
|
-
`fastWorkflow` is released under the Apache License 2.0
|
|
757
|
+
`fastWorkflow` is released under the Apache License 2.0
|
|
@@ -132,6 +132,12 @@ def init(env_vars: dict):
|
|
|
132
132
|
global _env_vars, CommandContextModel, RoutingDefinition, RoutingRegistry, ModelPipelineRegistry
|
|
133
133
|
_env_vars = env_vars
|
|
134
134
|
|
|
135
|
+
# Reconfigure log level from env_vars (dotenv files) if LOG_LEVEL is specified
|
|
136
|
+
# This allows LOG_LEVEL to be set in fastworkflow.env files, not just OS environment
|
|
137
|
+
if log_level := env_vars.get("LOG_LEVEL"):
|
|
138
|
+
from .utils.logging import reconfigure_log_level
|
|
139
|
+
reconfigure_log_level(log_level)
|
|
140
|
+
|
|
135
141
|
# init before importing other modules so env vars are available
|
|
136
142
|
from .command_context_model import CommandContextModel as CommandContextModelClass
|
|
137
143
|
from .command_routing import RoutingDefinition as RoutingDefinitionClass
|
|
@@ -16,7 +16,7 @@ def get_import_block():
|
|
|
16
16
|
f"from fastworkflow.train.generate_synthetic import generate_diverse_utterances\n"
|
|
17
17
|
f"from fastworkflow.utils.context_utils import list_context_names\n"
|
|
18
18
|
f"from typing import Any, Dict, Optional\n"
|
|
19
|
-
f"from pydantic import BaseModel, Field\n"
|
|
19
|
+
f"from pydantic import BaseModel, Field, ConfigDict\n"
|
|
20
20
|
)
|
|
21
21
|
|
|
22
22
|
def create_function_command_file(function_info: FunctionInfo, output_dir: str, file_name: str = None, source_dir: str = None, overwrite: bool = False) -> str:
|
|
@@ -98,8 +98,10 @@ def create_function_command_file(function_info: FunctionInfo, output_dir: str, f
|
|
|
98
98
|
call_param = ""
|
|
99
99
|
call_arg = ""
|
|
100
100
|
|
|
101
|
-
# Add Output class
|
|
102
|
-
command_file_content += f" class Output(BaseModel):\n
|
|
101
|
+
# Add Output class with arbitrary_types_allowed for non-Pydantic return types
|
|
102
|
+
command_file_content += f" class Output(BaseModel):\n"
|
|
103
|
+
command_file_content += f" model_config = ConfigDict(arbitrary_types_allowed=True)\n"
|
|
104
|
+
command_file_content += f"{output_fields}\n\n"
|
|
103
105
|
|
|
104
106
|
# Add utterances
|
|
105
107
|
command_file_content += f" plain_utterances = [\n{plain_utterances}\n ]\n\n"
|
|
@@ -326,8 +328,10 @@ def create_command_file(class_info, method_info, output_dir, file_name=None, is_
|
|
|
326
328
|
# Add Input class if needed
|
|
327
329
|
command_file_content += input_class
|
|
328
330
|
|
|
329
|
-
# Add Output class
|
|
330
|
-
command_file_content += f" class Output(BaseModel):\n
|
|
331
|
+
# Add Output class with arbitrary_types_allowed for non-Pydantic return types
|
|
332
|
+
command_file_content += f" class Output(BaseModel):\n"
|
|
333
|
+
command_file_content += f" model_config = ConfigDict(arbitrary_types_allowed=True)\n"
|
|
334
|
+
command_file_content += f"{output_fields}\n\n"
|
|
331
335
|
|
|
332
336
|
# Add utterances
|
|
333
337
|
command_file_content += f" plain_utterances = [\n{plain_utterances}\n ]\n\n"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# ============================================================================
|
|
2
|
+
# LLM Model Configuration
|
|
3
|
+
# ============================================================================
|
|
4
|
+
# Use direct provider model strings (e.g., mistral/mistral-small-latest)
|
|
5
|
+
# or LiteLLM Proxy model strings (e.g., litellm_proxy/your_model_name)
|
|
6
|
+
LLM_SYNDATA_GEN=mistral/mistral-small-latest
|
|
7
|
+
LLM_PARAM_EXTRACTION=mistral/mistral-small-latest
|
|
8
|
+
LLM_RESPONSE_GEN=mistral/mistral-small-latest
|
|
9
|
+
LLM_PLANNER=mistral/mistral-small-latest
|
|
10
|
+
LLM_AGENT=mistral/mistral-small-latest
|
|
11
|
+
LLM_CONVERSATION_STORE=mistral/mistral-small-latest
|
|
12
|
+
|
|
13
|
+
# ============================================================================
|
|
14
|
+
# LiteLLM Proxy Configuration (Optional)
|
|
15
|
+
# ============================================================================
|
|
16
|
+
# To route LLM calls through a LiteLLM Proxy, set the model strings above to
|
|
17
|
+
# use the litellm_proxy/ prefix and configure the proxy URL below.
|
|
18
|
+
# Example:
|
|
19
|
+
# LLM_AGENT=litellm_proxy/bedrock_mistral_large_2407
|
|
20
|
+
# LITELLM_PROXY_API_BASE=http://127.0.0.1:4000
|
|
21
|
+
# The proxy API key should be set in fastworkflow.passwords.env
|
|
22
|
+
# LITELLM_PROXY_API_BASE=http://127.0.0.1:4000
|
|
23
|
+
|
|
24
|
+
# ============================================================================
|
|
25
|
+
# Workflow Configuration
|
|
26
|
+
# ============================================================================
|
|
27
|
+
SPEEDDICT_FOLDERNAME=___workflow_contexts
|
|
28
|
+
SYNTHETIC_UTTERANCE_GEN_NUMOF_PERSONAS=4
|
|
29
|
+
SYNTHETIC_UTTERANCE_GEN_UTTERANCES_PER_PERSONA=5
|
|
30
|
+
SYNTHETIC_UTTERANCE_GEN_PERSONAS_PER_BATCH=1
|
|
31
|
+
MISSING_INFORMATION_ERRMSG="Missing parameter values: "
|
|
32
|
+
INVALID_INFORMATION_ERRMSG="Invalid parameter values: "
|
|
33
|
+
NOT_FOUND="NOT_FOUND"
|
|
34
|
+
INVALID="INVALID"
|
|
35
|
+
PARAMETER_EXTRACTION_ERROR_MSG="Error in parameter extraction: {error}"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# ============================================================================
|
|
2
|
+
# Direct Provider API Keys
|
|
3
|
+
# ============================================================================
|
|
4
|
+
# Tested with Mistral Small 3.1. A bigger model will produce better results, obviously
|
|
5
|
+
# These keys are used when LLM_* variables use direct provider model strings
|
|
6
|
+
# (e.g., mistral/mistral-small-latest, openai/gpt-4, etc.)
|
|
7
|
+
LITELLM_API_KEY_SYNDATA_GEN=<API KEY for synthetic data generation model>
|
|
8
|
+
LITELLM_API_KEY_PARAM_EXTRACTION=<API KEY for parameter extraction model>
|
|
9
|
+
LITELLM_API_KEY_RESPONSE_GEN=<API KEY for response generation model>
|
|
10
|
+
LITELLM_API_KEY_PLANNER=<API KEY for the agent's task planner model>
|
|
11
|
+
LITELLM_API_KEY_AGENT=<API KEY for the agent model>
|
|
12
|
+
LITELLM_API_KEY_CONVERSATION_STORE=<API KEY for conversation topic/summary generation model>
|
|
13
|
+
|
|
14
|
+
# ============================================================================
|
|
15
|
+
# LiteLLM Proxy API Key (Optional)
|
|
16
|
+
# ============================================================================
|
|
17
|
+
# When using litellm_proxy/ model strings, this shared key is used for all
|
|
18
|
+
# proxied calls. The per-role keys above are ignored for proxied models.
|
|
19
|
+
# Leave commented if your proxy doesn't require authentication.
|
|
20
|
+
# LITELLM_PROXY_API_KEY=<API KEY for LiteLLM Proxy authentication>
|