flowcept 0.9.16__tar.gz → 0.9.18__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 (222) hide show
  1. {flowcept-0.9.16 → flowcept-0.9.18}/.github/workflows/create-release-n-publish.yml +2 -2
  2. {flowcept-0.9.16 → flowcept-0.9.18}/.github/workflows/run-llm-tests.yml +1 -1
  3. {flowcept-0.9.16 → flowcept-0.9.18}/.github/workflows/run-tests-all-dbs.yml +1 -1
  4. {flowcept-0.9.16 → flowcept-0.9.18}/.github/workflows/run-tests-kafka.yml +1 -1
  5. {flowcept-0.9.16 → flowcept-0.9.18}/.github/workflows/run-tests-py313.yml +1 -1
  6. {flowcept-0.9.16 → flowcept-0.9.18}/.github/workflows/run-tests-simple.yml +1 -1
  7. {flowcept-0.9.16 → flowcept-0.9.18}/.github/workflows/run-tests.yml +1 -1
  8. {flowcept-0.9.16 → flowcept-0.9.18}/.github/workflows/run_examples.sh +2 -0
  9. {flowcept-0.9.16 → flowcept-0.9.18}/.gitignore +1 -0
  10. {flowcept-0.9.16 → flowcept-0.9.18}/Makefile +1 -1
  11. {flowcept-0.9.16 → flowcept-0.9.18}/PKG-INFO +10 -2
  12. {flowcept-0.9.16 → flowcept-0.9.18}/README.md +2 -0
  13. {flowcept-0.9.16 → flowcept-0.9.18}/docs/index.rst +18 -0
  14. {flowcept-0.9.16 → flowcept-0.9.18}/docs/prov_query.rst +2 -2
  15. {flowcept-0.9.16 → flowcept-0.9.18}/docs/publications/README.md +33 -15
  16. {flowcept-0.9.16 → flowcept-0.9.18}/examples/llm_complex/llm_main_example.py +18 -3
  17. {flowcept-0.9.16 → flowcept-0.9.18}/examples/llm_complex/llm_test_runner.py +1 -1
  18. {flowcept-0.9.16 → flowcept-0.9.18}/pyproject.toml +4 -3
  19. {flowcept-0.9.16 → flowcept-0.9.18}/resources/sample_settings.yaml +2 -1
  20. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/agents_utils.py +42 -0
  21. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/flowcept_agent.py +4 -1
  22. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/flowcept_ctx_manager.py +99 -36
  23. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/gui/gui_utils.py +21 -3
  24. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/prompts/general_prompts.py +1 -1
  25. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/prompts/in_memory_query_prompts.py +158 -45
  26. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/tools/general_tools.py +20 -3
  27. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/tools/in_memory_queries/in_memory_queries_tools.py +14 -31
  28. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/docdb_dao/lmdb_dao.py +48 -0
  29. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/mq_dao/mq_dao_kafka.py +2 -2
  30. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/mq_dao/mq_dao_redis.py +33 -2
  31. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/flowcept_dataclasses/task_object.py +4 -1
  32. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/configs.py +4 -1
  33. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowcept_api/flowcept_controller.py +5 -1
  34. flowcept-0.9.18/src/flowcept/flowceptor/adapters/mlflow/interception_event_handler.py +50 -0
  35. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py +22 -7
  36. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py +7 -1
  37. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/consumers/agent/base_agent_context_manager.py +7 -8
  38. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/instrumentation/flowcept_task.py +147 -51
  39. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/instrumentation/task_capture.py +10 -1
  40. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/version.py +1 -1
  41. {flowcept-0.9.16 → flowcept-0.9.18}/tests/adapters/test_file_observer.py +14 -7
  42. {flowcept-0.9.16 → flowcept-0.9.18}/tests/adapters/test_mlflow.py +42 -6
  43. flowcept-0.9.18/tests/agent/agent_tests.py +21 -0
  44. flowcept-0.9.18/tests/conftest.py +16 -0
  45. {flowcept-0.9.16 → flowcept-0.9.18}/tests/instrumentation_tests/flowcept_explicit_tasks.py +43 -0
  46. {flowcept-0.9.16 → flowcept-0.9.18}/tests/instrumentation_tests/flowcept_task_decorator_test.py +31 -2
  47. flowcept-0.9.18/tests/misc_tests/__init__.py +0 -0
  48. flowcept-0.9.16/src/flowcept/flowceptor/adapters/mlflow/interception_event_handler.py +0 -16
  49. {flowcept-0.9.16 → flowcept-0.9.18}/.github/workflows/checks.yml +0 -0
  50. {flowcept-0.9.16 → flowcept-0.9.18}/.github/workflows/run-tests-in-container.yml +0 -0
  51. {flowcept-0.9.16 → flowcept-0.9.18}/.github/workflows/version_bumper.py +0 -0
  52. {flowcept-0.9.16 → flowcept-0.9.18}/.readthedocs.yaml +0 -0
  53. {flowcept-0.9.16 → flowcept-0.9.18}/CONTRIBUTING.md +0 -0
  54. {flowcept-0.9.16 → flowcept-0.9.18}/LICENSE +0 -0
  55. {flowcept-0.9.16 → flowcept-0.9.18}/deployment/Dockerfile +0 -0
  56. {flowcept-0.9.16 → flowcept-0.9.18}/deployment/compose-grafana.yml +0 -0
  57. {flowcept-0.9.16 → flowcept-0.9.18}/deployment/compose-kafka.yml +0 -0
  58. {flowcept-0.9.16 → flowcept-0.9.18}/deployment/compose-mofka.yml +0 -0
  59. {flowcept-0.9.16 → flowcept-0.9.18}/deployment/compose-mongo.yml +0 -0
  60. {flowcept-0.9.16 → flowcept-0.9.18}/deployment/compose.yml +0 -0
  61. {flowcept-0.9.16 → flowcept-0.9.18}/docs/api-reference.rst +0 -0
  62. {flowcept-0.9.16 → flowcept-0.9.18}/docs/architecture.rst +0 -0
  63. {flowcept-0.9.16 → flowcept-0.9.18}/docs/cli-reference.rst +0 -0
  64. {flowcept-0.9.16 → flowcept-0.9.18}/docs/conf.py +0 -0
  65. {flowcept-0.9.16 → flowcept-0.9.18}/docs/contributing.rst +0 -0
  66. {flowcept-0.9.16 → flowcept-0.9.18}/docs/img/PROV-AGENT.svg +0 -0
  67. {flowcept-0.9.16 → flowcept-0.9.18}/docs/img/architecture-diagram.png +0 -0
  68. {flowcept-0.9.16 → flowcept-0.9.18}/docs/img/flowcept-logo-dark.png +0 -0
  69. {flowcept-0.9.16 → flowcept-0.9.18}/docs/img/flowcept-logo.png +0 -0
  70. {flowcept-0.9.16 → flowcept-0.9.18}/docs/large_data.rst +0 -0
  71. {flowcept-0.9.16 → flowcept-0.9.18}/docs/prov_capture.rst +0 -0
  72. {flowcept-0.9.16 → flowcept-0.9.18}/docs/prov_storage.rst +0 -0
  73. {flowcept-0.9.16 → flowcept-0.9.18}/docs/quick_start.rst +0 -0
  74. {flowcept-0.9.16 → flowcept-0.9.18}/docs/schemas.rst +0 -0
  75. {flowcept-0.9.16 → flowcept-0.9.18}/docs/setup.rst +0 -0
  76. {flowcept-0.9.16 → flowcept-0.9.18}/docs/task_schema.rst +0 -0
  77. {flowcept-0.9.16 → flowcept-0.9.18}/docs/telemetry_capture.rst +0 -0
  78. {flowcept-0.9.16 → flowcept-0.9.18}/docs/workflow_schema.rst +0 -0
  79. {flowcept-0.9.16 → flowcept-0.9.18}/examples/agents/a2a/README.md +0 -0
  80. {flowcept-0.9.16 → flowcept-0.9.18}/examples/agents/a2a/agent1.py +0 -0
  81. {flowcept-0.9.16 → flowcept-0.9.18}/examples/agents/a2a/agent2.py +0 -0
  82. {flowcept-0.9.16 → flowcept-0.9.18}/examples/agents/aec_agent_context_manager.py +0 -0
  83. {flowcept-0.9.16 → flowcept-0.9.18}/examples/agents/aec_agent_mock.py +0 -0
  84. {flowcept-0.9.16 → flowcept-0.9.18}/examples/agents/aec_prompts.py +0 -0
  85. {flowcept-0.9.16 → flowcept-0.9.18}/examples/agents/opt_driver_mock.py +0 -0
  86. {flowcept-0.9.16 → flowcept-0.9.18}/examples/consumers/ping_pong_example.py +0 -0
  87. {flowcept-0.9.16 → flowcept-0.9.18}/examples/consumers/simple_consumer.py +0 -0
  88. {flowcept-0.9.16 → flowcept-0.9.18}/examples/consumers/simple_publisher.py +0 -0
  89. {flowcept-0.9.16 → flowcept-0.9.18}/examples/convergence_loop_example.py +0 -0
  90. {flowcept-0.9.16 → flowcept-0.9.18}/examples/dask_example.py +0 -0
  91. {flowcept-0.9.16 → flowcept-0.9.18}/examples/distributed_consumer_example.py +0 -0
  92. {flowcept-0.9.16 → flowcept-0.9.18}/examples/instrumented_loop_example.py +0 -0
  93. {flowcept-0.9.16 → flowcept-0.9.18}/examples/instrumented_simple_example.py +0 -0
  94. {flowcept-0.9.16 → flowcept-0.9.18}/examples/llm_complex/README.md +0 -0
  95. {flowcept-0.9.16 → flowcept-0.9.18}/examples/llm_complex/custom_provenance_id_mapping.yaml +0 -0
  96. {flowcept-0.9.16 → flowcept-0.9.18}/examples/llm_complex/llm_dataprep.py +0 -0
  97. {flowcept-0.9.16 → flowcept-0.9.18}/examples/llm_complex/llm_model.py +0 -0
  98. {flowcept-0.9.16 → flowcept-0.9.18}/examples/llm_tutorial/README.md +0 -0
  99. {flowcept-0.9.16 → flowcept-0.9.18}/examples/llm_tutorial/analysis.ipynb +0 -0
  100. {flowcept-0.9.16 → flowcept-0.9.18}/examples/llm_tutorial/llm_dataprep.py +0 -0
  101. {flowcept-0.9.16 → flowcept-0.9.18}/examples/llm_tutorial/llm_model.py +0 -0
  102. {flowcept-0.9.16 → flowcept-0.9.18}/examples/llm_tutorial/llm_train_campaign.py +0 -0
  103. {flowcept-0.9.16 → flowcept-0.9.18}/examples/mlflow_example.py +0 -0
  104. {flowcept-0.9.16 → flowcept-0.9.18}/examples/mqtt_example.py +0 -0
  105. {flowcept-0.9.16 → flowcept-0.9.18}/examples/single_layer_perceptron_example.py +0 -0
  106. {flowcept-0.9.16 → flowcept-0.9.18}/examples/start_here.py +0 -0
  107. {flowcept-0.9.16 → flowcept-0.9.18}/examples/tensorboard_example.py +0 -0
  108. {flowcept-0.9.16 → flowcept-0.9.18}/examples/unmanaged/main.py +0 -0
  109. {flowcept-0.9.16 → flowcept-0.9.18}/examples/unmanaged/simple_task.py +0 -0
  110. {flowcept-0.9.16 → flowcept-0.9.18}/notebooks/analytics.ipynb +0 -0
  111. {flowcept-0.9.16 → flowcept-0.9.18}/notebooks/dask.ipynb +0 -0
  112. {flowcept-0.9.16 → flowcept-0.9.18}/notebooks/dask_from_CLI.ipynb +0 -0
  113. {flowcept-0.9.16 → flowcept-0.9.18}/notebooks/mlflow.ipynb +0 -0
  114. {flowcept-0.9.16 → flowcept-0.9.18}/notebooks/reset_dask_nb_exec_counts.py +0 -0
  115. {flowcept-0.9.16 → flowcept-0.9.18}/notebooks/tensorboard.ipynb +0 -0
  116. {flowcept-0.9.16 → flowcept-0.9.18}/resources/mofka/bedrock_setup.sh +0 -0
  117. {flowcept-0.9.16 → flowcept-0.9.18}/resources/mofka/consumer.py +0 -0
  118. {flowcept-0.9.16 → flowcept-0.9.18}/resources/mofka/mofka-requirements.yaml +0 -0
  119. {flowcept-0.9.16 → flowcept-0.9.18}/resources/mofka/mofka_config.json +0 -0
  120. {flowcept-0.9.16 → flowcept-0.9.18}/resources/ontology/catalog-v001.xml +0 -0
  121. {flowcept-0.9.16 → flowcept-0.9.18}/resources/ontology/prov_agent.owl +0 -0
  122. {flowcept-0.9.16 → flowcept-0.9.18}/resources/simple_redis_consumer.py +0 -0
  123. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/__init__.py +0 -0
  124. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/__init__.py +0 -0
  125. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/agent_client.py +0 -0
  126. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/dynamic_schema_tracker.py +0 -0
  127. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/gui/__init__.py +0 -0
  128. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/gui/agent_gui.py +0 -0
  129. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/gui/audio_utils.py +0 -0
  130. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/llms/__init__.py +0 -0
  131. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/llms/claude_gcp.py +0 -0
  132. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/llms/gemini25.py +0 -0
  133. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/prompts/__init__.py +0 -0
  134. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/tools/__init__.py +0 -0
  135. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/tools/in_memory_queries/__init__.py +0 -0
  136. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/agents/tools/in_memory_queries/pandas_agent_utils.py +0 -0
  137. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/analytics/__init__.py +0 -0
  138. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/analytics/analytics_utils.py +0 -0
  139. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/analytics/data_augmentation.py +0 -0
  140. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/analytics/plot.py +0 -0
  141. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/cli.py +0 -0
  142. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/__init__.py +0 -0
  143. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/autoflush_buffer.py +0 -0
  144. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/__init__.py +0 -0
  145. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/docdb_dao/__init__.py +0 -0
  146. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/docdb_dao/docdb_dao_base.py +0 -0
  147. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/docdb_dao/mongodb_dao.py +0 -0
  148. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/keyvalue_dao.py +0 -0
  149. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/mq_dao/__init__.py +0 -0
  150. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/mq_dao/mq_dao_base.py +0 -0
  151. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/mq_dao/mq_dao_mofka.py +0 -0
  152. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/daos/redis_conn.py +0 -0
  153. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/flowcept_dataclasses/__init__.py +0 -0
  154. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/flowcept_dataclasses/base_settings_dataclasses.py +0 -0
  155. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/flowcept_dataclasses/telemetry.py +0 -0
  156. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/flowcept_dataclasses/workflow_object.py +0 -0
  157. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/flowcept_logger.py +0 -0
  158. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/query_utils.py +0 -0
  159. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/settings_factory.py +0 -0
  160. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/task_data_preprocess.py +0 -0
  161. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/utils.py +0 -0
  162. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/commons/vocabulary.py +0 -0
  163. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowcept_api/__init__.py +0 -0
  164. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowcept_api/db_api.py +0 -0
  165. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowcept_api/task_query_api.py +0 -0
  166. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowcept_webserver/__init__.py +0 -0
  167. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowcept_webserver/app.py +0 -0
  168. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowcept_webserver/resources/__init__.py +0 -0
  169. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowcept_webserver/resources/query_rsrc.py +0 -0
  170. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowcept_webserver/resources/task_messages_rsrc.py +0 -0
  171. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/__init__.py +0 -0
  172. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/__init__.py +0 -0
  173. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/base_interceptor.py +0 -0
  174. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/brokers/__init__.py +0 -0
  175. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/brokers/mqtt_interceptor.py +0 -0
  176. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/dask/__init__.py +0 -0
  177. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/dask/dask_dataclasses.py +0 -0
  178. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/dask/dask_interceptor.py +0 -0
  179. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/dask/dask_plugins.py +0 -0
  180. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/instrumentation_interceptor.py +0 -0
  181. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/interceptor_state_manager.py +0 -0
  182. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/mlflow/__init__.py +0 -0
  183. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dao.py +0 -0
  184. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dataclasses.py +0 -0
  185. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/tensorboard/__init__.py +0 -0
  186. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_dataclasses.py +0 -0
  187. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/consumers/__init__.py +0 -0
  188. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/consumers/agent/__init__.py +0 -0
  189. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/consumers/base_consumer.py +0 -0
  190. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/consumers/consumer_utils.py +0 -0
  191. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/consumers/document_inserter.py +0 -0
  192. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/flowceptor/telemetry_capture.py +0 -0
  193. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/instrumentation/__init__.py +0 -0
  194. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/instrumentation/flowcept_agent_task.py +0 -0
  195. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/instrumentation/flowcept_decorator.py +0 -0
  196. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/instrumentation/flowcept_loop.py +0 -0
  197. {flowcept-0.9.16 → flowcept-0.9.18}/src/flowcept/instrumentation/flowcept_torch.py +0 -0
  198. {flowcept-0.9.16 → flowcept-0.9.18}/tests/__init__.py +0 -0
  199. {flowcept-0.9.16 → flowcept-0.9.18}/tests/adapters/__init__.py +0 -0
  200. {flowcept-0.9.16 → flowcept-0.9.18}/tests/adapters/dask_test_utils.py +0 -0
  201. {flowcept-0.9.16 → flowcept-0.9.18}/tests/adapters/test_broker.py +0 -0
  202. {flowcept-0.9.16 → flowcept-0.9.18}/tests/adapters/test_dask.py +0 -0
  203. {flowcept-0.9.16 → flowcept-0.9.18}/tests/adapters/test_dask_with_context_mgmt.py +0 -0
  204. {flowcept-0.9.16 → flowcept-0.9.18}/tests/adapters/test_tensorboard.py +0 -0
  205. {flowcept-0.9.16/tests/api → flowcept-0.9.18/tests/agent}/__init__.py +0 -0
  206. {flowcept-0.9.16/tests/doc_db_inserter → flowcept-0.9.18/tests/api}/__init__.py +0 -0
  207. {flowcept-0.9.16 → flowcept-0.9.18}/tests/api/db_api_test.py +0 -0
  208. {flowcept-0.9.16 → flowcept-0.9.18}/tests/api/flowcept_api_test.py +0 -0
  209. {flowcept-0.9.16 → flowcept-0.9.18}/tests/api/sample_data.json +0 -0
  210. {flowcept-0.9.16 → flowcept-0.9.18}/tests/api/sample_data_with_telemetry_and_rai.json +0 -0
  211. {flowcept-0.9.16 → flowcept-0.9.18}/tests/api/task_query_api_test.py +0 -0
  212. {flowcept-0.9.16/tests/instrumentation_tests → flowcept-0.9.18/tests/doc_db_inserter}/__init__.py +0 -0
  213. {flowcept-0.9.16 → flowcept-0.9.18}/tests/doc_db_inserter/doc_db_inserter_test.py +0 -0
  214. {flowcept-0.9.16/tests/instrumentation_tests/ml_tests → flowcept-0.9.18/tests/instrumentation_tests}/__init__.py +0 -0
  215. {flowcept-0.9.16 → flowcept-0.9.18}/tests/instrumentation_tests/flowcept_loop_test.py +0 -0
  216. {flowcept-0.9.16/tests/misc_tests → flowcept-0.9.18/tests/instrumentation_tests/ml_tests}/__init__.py +0 -0
  217. {flowcept-0.9.16 → flowcept-0.9.18}/tests/instrumentation_tests/ml_tests/dl_trainer.py +0 -0
  218. {flowcept-0.9.16 → flowcept-0.9.18}/tests/instrumentation_tests/ml_tests/ml_decorator_dask_test.py +0 -0
  219. {flowcept-0.9.16 → flowcept-0.9.18}/tests/instrumentation_tests/ml_tests/ml_decorator_test.py +0 -0
  220. {flowcept-0.9.16 → flowcept-0.9.18}/tests/misc_tests/log_test.py +0 -0
  221. {flowcept-0.9.16 → flowcept-0.9.18}/tests/misc_tests/singleton_test.py +0 -0
  222. {flowcept-0.9.16 → flowcept-0.9.18}/tests/misc_tests/telemetry_test.py +0 -0
@@ -18,10 +18,10 @@ jobs:
18
18
  with:
19
19
  fetch-depth: 1
20
20
 
21
- - name: Set up Python 3.10
21
+ - name: Set up Python 3.12
22
22
  uses: actions/setup-python@v5
23
23
  with:
24
- python-version: "3.10"
24
+ python-version: "3.12"
25
25
 
26
26
  - name: Update version.py
27
27
  run: |
@@ -7,7 +7,7 @@ jobs:
7
7
  runs-on: ubuntu-latest
8
8
  strategy:
9
9
  matrix:
10
- python-version: [ "3.10", "3.11", "3.12" ]
10
+ python-version: [ "3.11", "3.12" ]
11
11
  env:
12
12
  MONGO_ENABLED: true
13
13
  LMDB_ENABLED: false
@@ -8,7 +8,7 @@ jobs:
8
8
  timeout-minutes: 40
9
9
  strategy:
10
10
  matrix:
11
- python-version: [ "3.10", "3.11", "3.12" ]
11
+ python-version: [ "3.11", "3.12" ]
12
12
  env:
13
13
  MONGO_ENABLED: true
14
14
  LMDB_ENABLED: true
@@ -12,7 +12,7 @@ jobs:
12
12
  runs-on: ubuntu-latest
13
13
  strategy:
14
14
  matrix:
15
- python-version: [ "3.10", "3.11", "3.12" ]
15
+ python-version: [ "3.11", "3.12" ]
16
16
  env:
17
17
  MONGO_ENABLED: true
18
18
  LMDB_ENABLED: false
@@ -1,4 +1,4 @@
1
- name: Tests on Py313
1
+ name: Tests on Py_gt_312
2
2
  on: [pull_request]
3
3
 
4
4
  jobs:
@@ -10,7 +10,7 @@ jobs:
10
10
  runs-on: ubuntu-latest
11
11
  strategy:
12
12
  matrix:
13
- python-version: [ "3.10", "3.11", "3.12" ]
13
+ python-version: [ "3.11", "3.12" ]
14
14
  env:
15
15
  MONGO_ENABLED: false
16
16
  LMDB_ENABLED: true
@@ -10,7 +10,7 @@ jobs:
10
10
  runs-on: ubuntu-latest
11
11
  strategy:
12
12
  matrix:
13
- python-version: [ "3.10", "3.11", "3.12" ]
13
+ python-version: [ "3.11", "3.12" ]
14
14
  env:
15
15
  MONGO_ENABLED: true
16
16
  LMDB_ENABLED: false
@@ -68,7 +68,9 @@ run_test() {
68
68
  echo "Ok, ran $test_path."
69
69
  if grep -iq "error" output.log; then
70
70
  echo "Test $test_path failed! See output.log for details."
71
+ echo "[BEGIN] Content of output.log"
71
72
  cat output.log
73
+ echo "[END] Content of output.log"
72
74
  exit 1
73
75
  fi
74
76
 
@@ -34,3 +34,4 @@ core.*
34
34
 
35
35
  uv.lock
36
36
  examples/flowcept_messages.jsonl
37
+ agents.md
@@ -115,7 +115,7 @@ services-stop-mofka:
115
115
  # Run unit tests using pytest
116
116
  .PHONY: tests
117
117
  tests:
118
- pytest --ignore=tests/adapters/test_tensorboard.py
118
+ pytest --timeout=300 --ignore=tests/adapters/test_tensorboard.py
119
119
 
120
120
  .PHONY: tests-notebooks
121
121
  tests-notebooks:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowcept
3
- Version: 0.9.16
3
+ Version: 0.9.18
4
4
  Summary: Capture and query workflow provenance data using data observability
5
5
  Author: Oak Ridge National Laboratory
6
6
  License-Expression: MIT
@@ -9,7 +9,7 @@ Keywords: agentic-ai,agentic-workflows,ai,big-data,dask,data-analytics,data-inte
9
9
  Classifier: License :: OSI Approved :: MIT License
10
10
  Classifier: Operating System :: OS Independent
11
11
  Classifier: Programming Language :: Python :: 3
12
- Requires-Python: >=3.10
12
+ Requires-Python: >=3.11
13
13
  Requires-Dist: msgpack
14
14
  Requires-Dist: numpy
15
15
  Requires-Dist: omegaconf
@@ -41,6 +41,7 @@ Requires-Dist: pyarrow; extra == 'all'
41
41
  Requires-Dist: pymongo; extra == 'all'
42
42
  Requires-Dist: pymupdf; extra == 'all'
43
43
  Requires-Dist: pytest; extra == 'all'
44
+ Requires-Dist: pytest-timeout; extra == 'all'
44
45
  Requires-Dist: pyyaml; extra == 'all'
45
46
  Requires-Dist: redis; extra == 'all'
46
47
  Requires-Dist: requests; extra == 'all'
@@ -50,6 +51,7 @@ Requires-Dist: seaborn; extra == 'all'
50
51
  Requires-Dist: sphinx; extra == 'all'
51
52
  Requires-Dist: sqlalchemy; extra == 'all'
52
53
  Requires-Dist: streamlit; extra == 'all'
54
+ Requires-Dist: tabulate; extra == 'all'
53
55
  Requires-Dist: tbparse; extra == 'all'
54
56
  Requires-Dist: tensorboard; extra == 'all'
55
57
  Requires-Dist: tensorflow; extra == 'all'
@@ -69,6 +71,7 @@ Requires-Dist: jupyterlab; extra == 'dev'
69
71
  Requires-Dist: nbmake; extra == 'dev'
70
72
  Requires-Dist: pika; extra == 'dev'
71
73
  Requires-Dist: pytest; extra == 'dev'
74
+ Requires-Dist: pytest-timeout; extra == 'dev'
72
75
  Requires-Dist: pyyaml; extra == 'dev'
73
76
  Requires-Dist: ruff; extra == 'dev'
74
77
  Requires-Dist: sphinx; extra == 'dev'
@@ -94,6 +97,7 @@ Requires-Dist: matplotlib; extra == 'llm-agent'
94
97
  Requires-Dist: mcp[cli]; extra == 'llm-agent'
95
98
  Requires-Dist: pymupdf; extra == 'llm-agent'
96
99
  Requires-Dist: streamlit; extra == 'llm-agent'
100
+ Requires-Dist: tabulate; extra == 'llm-agent'
97
101
  Provides-Extra: llm-agent-audio
98
102
  Requires-Dist: gtts; extra == 'llm-agent-audio'
99
103
  Requires-Dist: langchain-community; extra == 'llm-agent-audio'
@@ -105,6 +109,7 @@ Requires-Dist: pymupdf; extra == 'llm-agent-audio'
105
109
  Requires-Dist: speechrecognition; extra == 'llm-agent-audio'
106
110
  Requires-Dist: streamlit; extra == 'llm-agent-audio'
107
111
  Requires-Dist: streamlit-mic-recorder; extra == 'llm-agent-audio'
112
+ Requires-Dist: tabulate; extra == 'llm-agent-audio'
108
113
  Provides-Extra: llm-google
109
114
  Requires-Dist: google-genai; extra == 'llm-google'
110
115
  Requires-Dist: langchain-community; extra == 'llm-google'
@@ -113,6 +118,7 @@ Requires-Dist: matplotlib; extra == 'llm-google'
113
118
  Requires-Dist: mcp[cli]; extra == 'llm-google'
114
119
  Requires-Dist: pymupdf; extra == 'llm-google'
115
120
  Requires-Dist: streamlit; extra == 'llm-google'
121
+ Requires-Dist: tabulate; extra == 'llm-google'
116
122
  Provides-Extra: lmdb
117
123
  Requires-Dist: lmdb; extra == 'lmdb'
118
124
  Provides-Extra: ml-dev
@@ -169,6 +175,7 @@ Flowcept captures and queries workflow provenance at runtime with minimal code c
169
175
 
170
176
 
171
177
  [![Documentation](https://img.shields.io/badge/docs-readthedocs.io-green.svg)](https://flowcept.readthedocs.io/)
178
+ [![Slack](https://img.shields.io/badge/Slack-%23flowcept%40Workflows%20Community-4A154B?logo=slack)](https://workflowscommunity.slack.com/archives/C06L5GYJKQS)
172
179
  [![Build](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml/badge.svg)](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml)
173
180
  [![PyPI](https://badge.fury.io/py/flowcept.svg)](https://pypi.org/project/flowcept)
174
181
  [![Tests](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml/badge.svg)](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml)
@@ -179,6 +186,7 @@ Flowcept captures and queries workflow provenance at runtime with minimal code c
179
186
 
180
187
 
181
188
  <h4 align="center">
189
+ <a href="https://flowcept.org">Website</a> &#8226;
182
190
  <a href="https://flowcept.readthedocs.io/">Documentation</a> &#8226;
183
191
  <a href="./docs/publications">Publications</a>
184
192
  </h4>
@@ -20,6 +20,7 @@ Flowcept captures and queries workflow provenance at runtime with minimal code c
20
20
 
21
21
 
22
22
  [![Documentation](https://img.shields.io/badge/docs-readthedocs.io-green.svg)](https://flowcept.readthedocs.io/)
23
+ [![Slack](https://img.shields.io/badge/Slack-%23flowcept%40Workflows%20Community-4A154B?logo=slack)](https://workflowscommunity.slack.com/archives/C06L5GYJKQS)
23
24
  [![Build](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml/badge.svg)](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml)
24
25
  [![PyPI](https://badge.fury.io/py/flowcept.svg)](https://pypi.org/project/flowcept)
25
26
  [![Tests](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml/badge.svg)](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml)
@@ -30,6 +31,7 @@ Flowcept captures and queries workflow provenance at runtime with minimal code c
30
31
 
31
32
 
32
33
  <h4 align="center">
34
+ <a href="https://flowcept.org">Website</a> &#8226;
33
35
  <a href="https://flowcept.readthedocs.io/">Documentation</a> &#8226;
34
36
  <a href="./docs/publications">Publications</a>
35
37
  </h4>
@@ -18,6 +18,12 @@ Flowcept
18
18
  html[data-theme="auto"] .logo-light { display: none; }
19
19
  html[data-theme="auto"] .logo-dark { display: inline; }
20
20
  }
21
+
22
+ .hero { text-align: center; margin: 1.25rem 0 0.25rem; }
23
+ .hero h1 { font-size: 2rem; line-height: 1.2; margin: 0; }
24
+ .tagline { text-align: center; font-size: 1.05rem; max-width: 60rem; margin: 0.25rem auto 1.25rem; }
25
+
26
+
21
27
  </style>
22
28
 
23
29
  <p align="center">
@@ -32,6 +38,18 @@ Flowcept
32
38
  :align: center
33
39
  :width: 120px
34
40
 
41
+ .. raw:: html
42
+
43
+ <div class="hero">
44
+ <h4>Lightweight Distributed Workflow Provenance</h4>
45
+ </div>
46
+ <p class=\\"tagline\\">
47
+ Flowcept captures and queries workflow provenance at runtime with minimal code changes and low overhead.
48
+ It unifies data from diverse tools and workflows across the Edge–Cloud–HPC continuum and provides ML-aware capture,
49
+ MCP agents provenance, telemetry, extensible adapters, and flexible storage.
50
+ </p>
51
+
52
+
35
53
  .. toctree::
36
54
  :maxdepth: 2
37
55
  :caption: Contents:
@@ -142,8 +142,8 @@ Deleting a buffer file
142
142
  .. code-block:: python
143
143
 
144
144
  from flowcept import Flowcept
145
- Flowcept.delete_buffer_file() # deletes default path from settings
146
- Flowcept.delete_buffer_file(\"my_buffer.jsonl\")
145
+ Flowcept.delete_buffer_file() # deletes default path from settings
146
+ Flowcept.delete_buffer_file("my_buffer.jsonl")
147
147
 
148
148
  Notes
149
149
  ^^^^^
@@ -7,48 +7,66 @@ Bibtex is available below.
7
7
 
8
8
  **Towards Lightweight Data Integration using Multi-workflow Provenance and Data Observability**
9
9
  R. Souza, T. J. Skluzacek, S. R. Wilkinson, M. Ziatdinov, and R. Ferreira da Silva,
10
- *IEEE International Conference on e-Science*, Limassol, Cyprus, 2023.
11
- doi: [10.1109/e-Science58273.2023.10254822](https://doi.org/10.1109/e-Science58273.2023.10254822)
12
- PDF: https://arxiv.org/pdf/2308.09004.pdf
13
-
10
+ *IEEE International Conference on e-Science*, Limassol, Cyprus, 2023. <br/>
11
+ **About**: Introduces Flowcept’s lightweight runtime provenance and data observability architecture and shows minimal-intrusion capture across heterogeneous workflows. <br/>
12
+ [[doi]](https://doi.org/10.1109/e-Science58273.2023.10254822)
13
+ [[pdf]](https://arxiv.org/pdf/2308.09004.pdf)
14
14
  ---
15
15
 
16
16
  **PROV-AGENT: Unified Provenance for Tracking AI Agent Interactions in Agentic Workflows**
17
17
  R. Souza, A. Gueroudji, S. DeWitt, D. Rosendo, T. Ghosal, R. Ross, P. Balaprakash, and R. Ferreira da Silva,
18
- *IEEE International Conference on e-Science*, Chicago, USA., 2025.
19
- PDF: https://arxiv.org/pdf/2508.02866
18
+ *IEEE International Conference on e-Science*, Chicago, USA., 2025. <br/>
19
+ **About**: Defines agentic provenance and a unified provenance model and tooling to capture, link, and query AI-agent interactions within agentic workflows. </br>
20
+ [[doi]](https://doi.org/10.1109/eScience65000.2025.00093)
21
+ [[pdf]](https://arxiv.org/pdf/2508.02866)
22
+ [[html]](https://arxiv.org/html/2508.02866v3) <br/>
23
+
20
24
 
21
25
  ---
22
26
 
23
27
  **Workflow Provenance in the Computing Continuum for Responsible, Trustworthy, and Energy-Efficient AI**
24
28
  R. Souza, S. Caino-Lores, M. Coletti, T. J. Skluzacek, A. Costan, F. Suter, M. Mattoso, and R. Ferreira da Silva,
25
- *IEEE International Conference on e-Science*, Osaka, Japan, 2024.
26
- doi: [10.1109/e-Science62913.2024.10678731](https://doi.org/10.1109/e-Science62913.2024.10678731)
27
- PDF: https://hal.science/hal-04902079v1/document
29
+ *IEEE International Conference on e-Science*, Osaka, Japan, 2024. <br/>
30
+ **About**: Explains how end-to-end provenance across edge, cloud, and HPC supports responsible, trustworthy, and energy-aware AI workflows. <br/>
31
+ [[doi]](https://doi.org/10.1109/e-Science62913.2024.10678731)
32
+ [[pdf]](https://hal.science/hal-04902079v1/document) <br/>
33
+
28
34
 
29
35
  ---
30
36
 
31
37
  **LLM Agents for Interactive Workflow Provenance: Reference Architecture and Evaluation Methodology**
32
38
  R. Souza, T. Poteet, B. Etz, D. Rosendo, A. Gueroudji, W. Shin, P. Balaprakash, and R. Ferreira da Silva,
33
39
  *Workflows in Support of Large-Scale Science (WORKS) co-located with the ACM/IEEE International Conference for High Performance Computing, Networking, Storage, and Analysis (SC)*, St. Louis, USA, 2025.
34
- doi: [10.1145/3731599.3767582](https://doi.org/10.1145/3731599.3767582)
40
+ **About**: Presents a reference architecture and evaluation method for LLM agents that query and act on large-scale provenance databases. </br>
41
+ [[doi]](https://doi.org/10.1145/3731599.3767582)
42
+ [[pdf]](https://arxiv.org/pdf/2509.13978)
43
+ [[html]](https://arxiv.org/html/2509.13978)
35
44
 
36
45
 
46
+ ---
47
+
37
48
  ### Papers that used Flowcept
38
49
 
39
50
 
40
51
  **Toward a Persistent Event-Streaming System for High-Performance Computing Applications**
41
52
  M. Dorier, A. Gueroudji, V. Hayot-Sasson, H. Nguyen, S. Ockerman, R. Souza, T. Bicer, H. Pan, P. Carns, K. Chard, and others
42
- *Frontiers in High Performance Computing*, 2025.
43
- doi: [10.3389/fhpcp.2025.1638203](https://doi.org/10.3389/fhpcp.2025.1638203)
44
- PDF: https://web.cels.anl.gov/~woz/papers/Mofka_2025.pdf
53
+ *Frontiers in High Performance Computing*, 2025. <br/>
54
+ **About**: Demonstrates Flowcept generating high-volume provenance that is persistently streamed with Mofka for HPC applications. <br/>
55
+ [[doi]](https://doi.org/10.3389/fhpcp.2025.1638203)
56
+ [[pdf]](https://web.cels.anl.gov/~woz/papers/Mofka_2025.pdf)
57
+ [[html]](https://www.frontiersin.org/journals/high-performance-computing/articles/10.3389/fhpcp.2025.1638203/full)
58
+ <br/>
59
+
45
60
 
46
61
  ---
47
62
 
48
63
  **AI Agents for Enabling Autonomous Experiments at ORNL’s HPC and Manufacturing User Facilities**
49
64
  D. Rosendo, S. DeWitt, R. Souza, P. Austria, T. Ghosal, M. McDonnell, R. Miller, T. Skluzacek, J. Haley, B. Turcksin, and others
50
- *Extreme-Scale Experiment-in-the-Loop Computing (XLOOP) co-located with the ACM/IEEE International Conference for High Performance Computing, Networking, Storage, and Analysis (SC)*, 2025.
51
- PDF: https://rafaelsilva.com/files/publications/rosendo2025xloop.pdf
65
+ *Extreme-Scale Experiment-in-the-Loop Computing (XLOOP) co-located with the ACM/IEEE International Conference for High Performance Computing, Networking, Storage, and Analysis (SC)*, 2025. <br/>
66
+ **About**: Leverages Flowcept’s agentic provenance to coordinate multi-agent experiments and connect agents with HPC simulations through a shared provenance stream. <br/>
67
+ [[doi]](https://doi.org/10.1145/3731599.3767592)
68
+ [[pdf]](https://rafaelsilva.com/files/publications/rosendo2025xloop.pdf)
69
+ [[html]](https://camps.aptaracorp.com/ACM_PMS/PMS/ACM/SCWORKSHOPS25/253/0b09762d-8e84-11f0-957d-16ffd757ba29/OUT/scworkshops25-253.html)
52
70
 
53
71
  ---
54
72
 
@@ -123,6 +123,13 @@ def search_workflow(ntokens, dataset_ref, train_data_path, val_data_path, test_d
123
123
 
124
124
  def start_dask(scheduler_file=None, start_dask_cluster=False, with_flowcept=True):
125
125
  from distributed import Client
126
+ try:
127
+ # Downgrading eventual dask comm errors in the logs
128
+ import logging
129
+ logging.getLogger("distributed.worker").setLevel(logging.WARNING)
130
+ logging.getLogger("distributed.comm").setLevel(logging.WARNING)
131
+ except:
132
+ pass
126
133
 
127
134
  if start_dask_cluster:
128
135
  import subprocess
@@ -196,9 +203,17 @@ def close_dask(client, cluster, scheduler_file=None, start_dask_cluster=False, _
196
203
  print("Flowcept consumer closed.")
197
204
  else:
198
205
  print("Closing dask...")
199
- client.close()
200
- cluster.close()
201
- print("Dask closed.")
206
+ try:
207
+ client.close()
208
+ cluster.close()
209
+ print("Dask closed.")
210
+ except Exception as e:
211
+ print(f"Some exception when closing dask: {e}")
212
+ try:
213
+ import logging
214
+ logging.getLogger("distributed.worker").setLevel(logging.WARNING)
215
+ except:
216
+ pass
202
217
  if _flowcept:
203
218
  print("Now closing flowcept consumer...")
204
219
  _flowcept.stop()
@@ -67,7 +67,7 @@ def all():
67
67
  try:
68
68
  success = run_test(max_runs=3, config=config)
69
69
  if not success:
70
- write_log(str(i) + "--> " + str(config))
70
+ write_log("GOT ERROR! " + str(i) + "--> " + str(config))
71
71
  sys.exit(1)
72
72
  except Exception as e:
73
73
  write_exception(f"\n\n!!!!!!##### ERROR for combination {config}\n", e)
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
5
5
  [project]
6
6
  name = "flowcept"
7
7
  dynamic = ["version"]
8
- requires-python = ">=3.10"
8
+ requires-python = ">=3.11"
9
9
 
10
10
  authors = [{name = "Oak Ridge National Laboratory"}]
11
11
  description = "Capture and query workflow provenance data using data observability"
@@ -65,7 +65,7 @@ mlflow = ["mlflow-skinny", "SQLAlchemy", "alembic", "watchdog", "cryptography"]
65
65
  nvidia = ["nvidia-ml-py"]
66
66
  mqtt = ["paho-mqtt"]
67
67
  tensorboard = ["tensorboard", "tensorflow", "tbparse"]
68
- llm_agent = ["mcp[cli]", "langchain_community", "langchain_openai", "streamlit", "PyMuPDF", "matplotlib"]
68
+ llm_agent = ["mcp[cli]", "langchain_community", "langchain_openai", "streamlit", "PyMuPDF", "matplotlib", "tabulate"]
69
69
  llm_google = ["flowcept[llm_agent]", "google-genai"]
70
70
  llm_agent_audio = ["flowcept[llm_agent]", "streamlit-mic-recorder", "SpeechRecognition", "pydub", "gTTS"]
71
71
  # System dependency (required for pydub)
@@ -80,8 +80,9 @@ dev = [
80
80
  "nbmake",
81
81
  "pika",
82
82
  "pytest",
83
+ "pytest-timeout",
83
84
  "ruff",
84
- "pyyaml",
85
+ "pyyaml"
85
86
  ]
86
87
  # Torch and some other ml-specific libs, only used for dev purposes, require the following specific versions.
87
88
  ml_dev = [
@@ -1,4 +1,4 @@
1
- flowcept_version: 0.9.16 # Version of the Flowcept package. This setting file is compatible with this version.
1
+ flowcept_version: 0.9.18 # Version of the Flowcept package. This setting file is compatible with this version.
2
2
 
3
3
  project:
4
4
  debug: true # Toggle debug mode. This will add a property `debug: true` to all saved data, making it easier to retrieve/delete them later.
@@ -94,6 +94,7 @@ agent:
94
94
  service_provider: '?'
95
95
  model_kwargs: {}
96
96
  audio_enabled: false
97
+ debug: true
97
98
 
98
99
  databases:
99
100
 
@@ -1,4 +1,6 @@
1
1
  import os
2
+ import re
3
+ import unicodedata
2
4
  from typing import Union, Dict
3
5
 
4
6
  from flowcept.flowceptor.consumers.agent.base_agent_context_manager import BaseAgentContextManager
@@ -194,3 +196,43 @@ def build_llm_model(
194
196
  if tool_task:
195
197
  llm.parent_task_id = tool_task.task_id
196
198
  return llm
199
+
200
+
201
+ def normalize_message(user_msg: str) -> str:
202
+ """
203
+ Normalize a user message into a canonical, comparison-friendly form.
204
+
205
+ The function standardizes text by trimming whitespace, applying Unicode
206
+ normalization, normalizing dash characters, collapsing repeated whitespace,
207
+ removing trailing punctuation that does not affect semantics, and converting
208
+ the result to lowercase.
209
+
210
+ Parameters
211
+ ----------
212
+ user_msg : str
213
+ Raw user input message.
214
+
215
+ Returns
216
+ -------
217
+ str
218
+ Normalized message suitable for matching, comparison, or hashing.
219
+ """
220
+ # 1) Strip leading/trailing whitespace
221
+ user_msg = user_msg.strip()
222
+
223
+ # 2) Unicode normalize to avoid weird characters (like fancy quotes, dashes)
224
+ user_msg = unicodedata.normalize("NFKC", user_msg)
225
+
226
+ # 3) Normalize dashes commonly used in chemistry (C–H, C—H, etc.)
227
+ user_msg = user_msg.replace("–", "-").replace("—", "-")
228
+
229
+ # 4) Collapse multiple spaces / newlines into a single space
230
+ user_msg = re.sub(r"\s+", " ", user_msg)
231
+
232
+ # 5) Remove trailing punctuation that doesn't change semantics
233
+ # e.g., "?", "!", "." at the VERY end
234
+ user_msg = re.sub(r"[?!.\s]+$", "", user_msg)
235
+
236
+ user_msg = user_msg.lower()
237
+
238
+ return user_msg
@@ -20,11 +20,14 @@ def main():
20
20
  def run():
21
21
  uvicorn.run(mcp_flowcept.streamable_http_app, host=AGENT_HOST, port=AGENT_PORT, lifespan="on")
22
22
 
23
- Thread(target=run).start()
23
+ server_thread = Thread(target=run, daemon=False)
24
+ server_thread.start()
24
25
  sleep(2)
25
26
  # Wake up tool call
26
27
  print(run_tool(check_liveness, host=AGENT_HOST, port=AGENT_PORT)[0])
27
28
 
29
+ server_thread.join()
30
+
28
31
 
29
32
  if __name__ == "__main__":
30
33
  main()