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.
Files changed (185) hide show
  1. fastworkflow-2.17.26/README.md → fastworkflow-2.17.28/PKG-INFO +155 -1
  2. fastworkflow-2.17.26/PKG-INFO → fastworkflow-2.17.28/README.md +110 -39
  3. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/__init__.py +6 -0
  4. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/command_file_template.py +9 -5
  5. fastworkflow-2.17.28/fastworkflow/examples/fastworkflow.env +35 -0
  6. fastworkflow-2.17.28/fastworkflow/examples/fastworkflow.passwords.env +20 -0
  7. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/__main__.py +214 -6
  8. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/jwt_manager.py +5 -5
  9. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/utils.py +1 -1
  10. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/dspy_utils.py +56 -2
  11. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/logging.py +44 -2
  12. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/workflow_agent.py +12 -13
  13. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/pyproject.toml +16 -5
  14. fastworkflow-2.17.26/fastworkflow/examples/fastworkflow.env +0 -16
  15. fastworkflow-2.17.26/fastworkflow/examples/fastworkflow.passwords.env +0 -7
  16. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/LICENSE +0 -0
  17. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/.DS_Store +0 -0
  18. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_commands/.gitkeep +0 -0
  19. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/__init__.py +0 -0
  20. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/__init__.py +0 -0
  21. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/abort.py +0 -0
  22. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/ErrorCorrection/you_misunderstood.py +0 -0
  23. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/go_up.py +0 -0
  24. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/reset_context.py +0 -0
  25. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_can_i_do.py +0 -0
  26. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/IntentDetection/what_is_current_context.py +0 -0
  27. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/__init__.py +0 -0
  28. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/_commands/wildcard.py +0 -0
  29. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/command_context_model.json +0 -0
  30. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/intent_detection.py +0 -0
  31. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/_workflows/command_metadata_extraction/parameter_extraction.py +0 -0
  32. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/__main__.py +0 -0
  33. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/ast_class_extractor.py +0 -0
  34. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/class_analysis_structures.py +0 -0
  35. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/cli_specification.md +0 -0
  36. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/command_dependency_resolver.py +0 -0
  37. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/command_file_generator.py +0 -0
  38. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/command_import_utils.py +0 -0
  39. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/command_stub_generator.py +0 -0
  40. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/context_folder_generator.py +0 -0
  41. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/context_model_generator.py +0 -0
  42. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/dependency_manager.py +0 -0
  43. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/dir_scanner.py +0 -0
  44. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/documentation_generator.py +0 -0
  45. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/genai_postprocessor.py +0 -0
  46. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/inheritance_block_regenerator.py +0 -0
  47. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/libcst_transformers.py +0 -0
  48. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/navigator_stub_generator.py +0 -0
  49. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/pydantic_model_generator.py +0 -0
  50. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/build/utterance_generator.py +0 -0
  51. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/cache_matching.py +0 -0
  52. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/chat_session.py +0 -0
  53. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/cli.py +0 -0
  54. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_context_model.py +0 -0
  55. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_directory.py +0 -0
  56. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_executor.py +0 -0
  57. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_interfaces.py +0 -0
  58. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_metadata_api.py +0 -0
  59. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/command_routing.py +0 -0
  60. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/docs/context_modules_prd.txt +0 -0
  61. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/README.md +0 -0
  62. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/_commands/WorkItem/get_status.py +0 -0
  63. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/_commands/generate_report.py +0 -0
  64. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/_commands/startup.py +0 -0
  65. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/simple_workflow_template.json +0 -0
  66. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/extended_workflow_example/workflow_inheritance_model.json +0 -0
  67. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/hello_world/_commands/README.md +0 -0
  68. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/hello_world/_commands/add_two_numbers.py +0 -0
  69. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/hello_world/_commands/context_inheritance_model.json +0 -0
  70. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/hello_world/application/add_two_numbers.py +0 -0
  71. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_1/_commands/context_inheritance_model.json +0 -0
  72. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_1/_commands/send_message.py +0 -0
  73. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_1/application/send_message.py +0 -0
  74. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_2/_commands/User/send_message.py +0 -0
  75. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_2/_commands/context_inheritance_model.json +0 -0
  76. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_2/_commands/startup.py +0 -0
  77. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_2/application/user.py +0 -0
  78. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_3/_commands/PremiumUser/send_priority_message.py +0 -0
  79. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_3/_commands/User/send_message.py +0 -0
  80. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_3/_commands/context_inheritance_model.json +0 -0
  81. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_3/_commands/initialize_user.py +0 -0
  82. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_3/application/user.py +0 -0
  83. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/_ChatRoom.py +0 -0
  84. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/add_user.py +0 -0
  85. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/broadcast_message.py +0 -0
  86. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/get_current_user.py +0 -0
  87. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/list_users.py +0 -0
  88. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/ChatRoom/set_current_user.py +0 -0
  89. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/PremiumUser/_PremiumUser.py +0 -0
  90. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/PremiumUser/send_priority_message.py +0 -0
  91. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/User/_User.py +0 -0
  92. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/User/send_message.py +0 -0
  93. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/context_inheritance_model.json +0 -0
  94. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/_commands/set_root_context.py +0 -0
  95. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/application/chatroom.py +0 -0
  96. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/application/user.py +0 -0
  97. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/context_hierarchy_model.json +0 -0
  98. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/messaging_app_4/startup_action.json +0 -0
  99. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/calculate.py +0 -0
  100. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/cancel_pending_order.py +0 -0
  101. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/exchange_delivered_order_items.py +0 -0
  102. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/find_user_id_by_email.py +0 -0
  103. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/find_user_id_by_name_zip.py +0 -0
  104. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/get_order_details.py +0 -0
  105. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/get_product_details.py +0 -0
  106. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/get_user_details.py +0 -0
  107. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/list_all_product_types.py +0 -0
  108. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_address.py +0 -0
  109. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_items.py +0 -0
  110. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/modify_pending_order_payment.py +0 -0
  111. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/modify_user_address.py +0 -0
  112. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/return_delivered_order_items.py +0 -0
  113. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/_commands/transfer_to_human_agents.py +0 -0
  114. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/context_inheritance_model.json +0 -0
  115. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/retail_data/__init__.py +0 -0
  116. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/retail_data/orders.json +0 -0
  117. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/retail_data/products.json +0 -0
  118. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/retail_data/users.json +0 -0
  119. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/calculate.py +0 -0
  120. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/cancel_pending_order.py +0 -0
  121. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/exchange_delivered_order_items.py +0 -0
  122. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/find_user_id_by_email.py +0 -0
  123. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/find_user_id_by_name_zip.py +0 -0
  124. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/get_order_details.py +0 -0
  125. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/get_product_details.py +0 -0
  126. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/get_user_details.py +0 -0
  127. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/list_all_product_types.py +0 -0
  128. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_address.py +0 -0
  129. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_items.py +0 -0
  130. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/modify_pending_order_payment.py +0 -0
  131. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/modify_user_address.py +0 -0
  132. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/return_delivered_order_items.py +0 -0
  133. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/think.py +0 -0
  134. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/tool.py +0 -0
  135. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/tools/transfer_to_human_agents.py +0 -0
  136. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/retail_workflow/workflow_description.txt +0 -0
  137. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/__init__.py +0 -0
  138. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/_WorkItem.py +0 -0
  139. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/add_child_workitem.py +0 -0
  140. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/get_status.py +0 -0
  141. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/go_to_workitem.py +0 -0
  142. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/mark_as_complete.py +0 -0
  143. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_first_child_workitem.py +0 -0
  144. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_last_child_workitem.py +0 -0
  145. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_next_workitem.py +0 -0
  146. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/move_to_previous_workitem.py +0 -0
  147. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/remove_all_child_workitems.py +0 -0
  148. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/remove_child_workitem.py +0 -0
  149. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/WorkItem/show_schema.py +0 -0
  150. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/_commands/startup.py +0 -0
  151. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/application/__init__.py +0 -0
  152. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/application/workitem.py +0 -0
  153. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/simple_workflow_template.json +0 -0
  154. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/examples/simple_workflow_template/startup_action.json +0 -0
  155. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/intent_clarification_agent.py +0 -0
  156. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/mcp_server.py +0 -0
  157. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/model_pipeline_training.py +0 -0
  158. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/refine/__main__.py +0 -0
  159. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run/__init__.py +0 -0
  160. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run/__main__.py +0 -0
  161. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/README.md +0 -0
  162. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/__init__.py +0 -0
  163. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/conversation_store.py +0 -0
  164. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/mcp_specific.py +0 -0
  165. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/run_fastapi_mcp/redoc_2_standalone_html.py +0 -0
  166. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/train/__init__.py +0 -0
  167. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/train/__main__.py +0 -0
  168. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/train/generate_synthetic.py +0 -0
  169. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/user_message_queues.py +0 -0
  170. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/__init__.py +0 -0
  171. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/chat_adapter.py +0 -0
  172. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/context_utils.py +0 -0
  173. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/dspy_cache_utils.py +0 -0
  174. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/dspy_logger.py +0 -0
  175. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/env.py +0 -0
  176. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/fuzzy_match.py +0 -0
  177. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/generate_param_examples.py +0 -0
  178. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/parameterize_func_decorator.py +0 -0
  179. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/pydantic_model_2_dspy_signature_class.py +0 -0
  180. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/python_utils.py +0 -0
  181. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/react.py +0 -0
  182. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/signatures.py +0 -0
  183. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/utils/startup_progress.py +0 -0
  184. {fastworkflow-2.17.26 → fastworkflow-2.17.28}/fastworkflow/workflow.py +0 -0
  185. {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{output_fields}\n\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{output_fields}\n\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>