flowcept 0.9.15__tar.gz → 0.9.17__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 (218) hide show
  1. {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/checks.yml +1 -1
  2. {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/create-release-n-publish.yml +2 -2
  3. {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-llm-tests.yml +2 -2
  4. {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests-all-dbs.yml +2 -2
  5. {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests-kafka.yml +2 -2
  6. {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests-py313.yml +2 -2
  7. {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests-simple.yml +2 -2
  8. {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests.yml +2 -2
  9. {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run_examples.sh +2 -0
  10. {flowcept-0.9.15 → flowcept-0.9.17}/PKG-INFO +3 -2
  11. {flowcept-0.9.15 → flowcept-0.9.17}/README.md +1 -0
  12. {flowcept-0.9.15 → flowcept-0.9.17}/docs/index.rst +18 -0
  13. {flowcept-0.9.15 → flowcept-0.9.17}/docs/prov_query.rst +2 -2
  14. {flowcept-0.9.15 → flowcept-0.9.17}/docs/publications/README.md +74 -13
  15. {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/llm_main_example.py +18 -3
  16. {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/llm_test_runner.py +1 -1
  17. {flowcept-0.9.15 → flowcept-0.9.17}/pyproject.toml +1 -1
  18. flowcept-0.9.17/resources/ontology/catalog-v001.xml +4 -0
  19. flowcept-0.9.17/resources/ontology/prov_agent.owl +102 -0
  20. {flowcept-0.9.15 → flowcept-0.9.17}/resources/sample_settings.yaml +1 -1
  21. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/agents_utils.py +15 -0
  22. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/interception_event_handler.py +5 -2
  23. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py +4 -3
  24. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py +6 -1
  25. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/version.py +1 -1
  26. {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_file_observer.py +11 -7
  27. {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests-in-container.yml +0 -0
  28. {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/version_bumper.py +0 -0
  29. {flowcept-0.9.15 → flowcept-0.9.17}/.gitignore +0 -0
  30. {flowcept-0.9.15 → flowcept-0.9.17}/.readthedocs.yaml +0 -0
  31. {flowcept-0.9.15 → flowcept-0.9.17}/CONTRIBUTING.md +0 -0
  32. {flowcept-0.9.15 → flowcept-0.9.17}/LICENSE +0 -0
  33. {flowcept-0.9.15 → flowcept-0.9.17}/Makefile +0 -0
  34. {flowcept-0.9.15 → flowcept-0.9.17}/deployment/Dockerfile +0 -0
  35. {flowcept-0.9.15 → flowcept-0.9.17}/deployment/compose-grafana.yml +0 -0
  36. {flowcept-0.9.15 → flowcept-0.9.17}/deployment/compose-kafka.yml +0 -0
  37. {flowcept-0.9.15 → flowcept-0.9.17}/deployment/compose-mofka.yml +0 -0
  38. {flowcept-0.9.15 → flowcept-0.9.17}/deployment/compose-mongo.yml +0 -0
  39. {flowcept-0.9.15 → flowcept-0.9.17}/deployment/compose.yml +0 -0
  40. {flowcept-0.9.15 → flowcept-0.9.17}/docs/api-reference.rst +0 -0
  41. {flowcept-0.9.15 → flowcept-0.9.17}/docs/architecture.rst +0 -0
  42. {flowcept-0.9.15 → flowcept-0.9.17}/docs/cli-reference.rst +0 -0
  43. {flowcept-0.9.15 → flowcept-0.9.17}/docs/conf.py +0 -0
  44. {flowcept-0.9.15 → flowcept-0.9.17}/docs/contributing.rst +0 -0
  45. {flowcept-0.9.15 → flowcept-0.9.17}/docs/img/PROV-AGENT.svg +0 -0
  46. {flowcept-0.9.15 → flowcept-0.9.17}/docs/img/architecture-diagram.png +0 -0
  47. {flowcept-0.9.15 → flowcept-0.9.17}/docs/img/flowcept-logo-dark.png +0 -0
  48. {flowcept-0.9.15 → flowcept-0.9.17}/docs/img/flowcept-logo.png +0 -0
  49. {flowcept-0.9.15 → flowcept-0.9.17}/docs/large_data.rst +0 -0
  50. {flowcept-0.9.15 → flowcept-0.9.17}/docs/prov_capture.rst +0 -0
  51. {flowcept-0.9.15 → flowcept-0.9.17}/docs/prov_storage.rst +0 -0
  52. {flowcept-0.9.15 → flowcept-0.9.17}/docs/quick_start.rst +0 -0
  53. {flowcept-0.9.15 → flowcept-0.9.17}/docs/schemas.rst +0 -0
  54. {flowcept-0.9.15 → flowcept-0.9.17}/docs/setup.rst +0 -0
  55. {flowcept-0.9.15 → flowcept-0.9.17}/docs/task_schema.rst +0 -0
  56. {flowcept-0.9.15 → flowcept-0.9.17}/docs/telemetry_capture.rst +0 -0
  57. {flowcept-0.9.15 → flowcept-0.9.17}/docs/workflow_schema.rst +0 -0
  58. {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/a2a/README.md +0 -0
  59. {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/a2a/agent1.py +0 -0
  60. {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/a2a/agent2.py +0 -0
  61. {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/aec_agent_context_manager.py +0 -0
  62. {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/aec_agent_mock.py +0 -0
  63. {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/aec_prompts.py +0 -0
  64. {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/opt_driver_mock.py +0 -0
  65. {flowcept-0.9.15 → flowcept-0.9.17}/examples/consumers/ping_pong_example.py +0 -0
  66. {flowcept-0.9.15 → flowcept-0.9.17}/examples/consumers/simple_consumer.py +0 -0
  67. {flowcept-0.9.15 → flowcept-0.9.17}/examples/consumers/simple_publisher.py +0 -0
  68. {flowcept-0.9.15 → flowcept-0.9.17}/examples/convergence_loop_example.py +0 -0
  69. {flowcept-0.9.15 → flowcept-0.9.17}/examples/dask_example.py +0 -0
  70. {flowcept-0.9.15 → flowcept-0.9.17}/examples/distributed_consumer_example.py +0 -0
  71. {flowcept-0.9.15 → flowcept-0.9.17}/examples/instrumented_loop_example.py +0 -0
  72. {flowcept-0.9.15 → flowcept-0.9.17}/examples/instrumented_simple_example.py +0 -0
  73. {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/README.md +0 -0
  74. {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/custom_provenance_id_mapping.yaml +0 -0
  75. {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/llm_dataprep.py +0 -0
  76. {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/llm_model.py +0 -0
  77. {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_tutorial/README.md +0 -0
  78. {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_tutorial/analysis.ipynb +0 -0
  79. {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_tutorial/llm_dataprep.py +0 -0
  80. {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_tutorial/llm_model.py +0 -0
  81. {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_tutorial/llm_train_campaign.py +0 -0
  82. {flowcept-0.9.15 → flowcept-0.9.17}/examples/mlflow_example.py +0 -0
  83. {flowcept-0.9.15 → flowcept-0.9.17}/examples/mqtt_example.py +0 -0
  84. {flowcept-0.9.15 → flowcept-0.9.17}/examples/single_layer_perceptron_example.py +0 -0
  85. {flowcept-0.9.15 → flowcept-0.9.17}/examples/start_here.py +0 -0
  86. {flowcept-0.9.15 → flowcept-0.9.17}/examples/tensorboard_example.py +0 -0
  87. {flowcept-0.9.15 → flowcept-0.9.17}/examples/unmanaged/main.py +0 -0
  88. {flowcept-0.9.15 → flowcept-0.9.17}/examples/unmanaged/simple_task.py +0 -0
  89. {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/analytics.ipynb +0 -0
  90. {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/dask.ipynb +0 -0
  91. {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/dask_from_CLI.ipynb +0 -0
  92. {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/mlflow.ipynb +0 -0
  93. {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/reset_dask_nb_exec_counts.py +0 -0
  94. {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/tensorboard.ipynb +0 -0
  95. {flowcept-0.9.15 → flowcept-0.9.17}/resources/mofka/bedrock_setup.sh +0 -0
  96. {flowcept-0.9.15 → flowcept-0.9.17}/resources/mofka/consumer.py +0 -0
  97. {flowcept-0.9.15 → flowcept-0.9.17}/resources/mofka/mofka-requirements.yaml +0 -0
  98. {flowcept-0.9.15 → flowcept-0.9.17}/resources/mofka/mofka_config.json +0 -0
  99. {flowcept-0.9.15 → flowcept-0.9.17}/resources/simple_redis_consumer.py +0 -0
  100. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/__init__.py +0 -0
  101. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/__init__.py +0 -0
  102. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/agent_client.py +0 -0
  103. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/dynamic_schema_tracker.py +0 -0
  104. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/flowcept_agent.py +0 -0
  105. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/flowcept_ctx_manager.py +0 -0
  106. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/gui/__init__.py +0 -0
  107. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/gui/agent_gui.py +0 -0
  108. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/gui/audio_utils.py +0 -0
  109. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/gui/gui_utils.py +0 -0
  110. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/llms/__init__.py +0 -0
  111. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/llms/claude_gcp.py +0 -0
  112. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/llms/gemini25.py +0 -0
  113. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/prompts/__init__.py +0 -0
  114. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/prompts/general_prompts.py +0 -0
  115. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/prompts/in_memory_query_prompts.py +0 -0
  116. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/tools/__init__.py +0 -0
  117. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/tools/general_tools.py +0 -0
  118. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/__init__.py +0 -0
  119. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/in_memory_queries_tools.py +0 -0
  120. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/pandas_agent_utils.py +0 -0
  121. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/analytics/__init__.py +0 -0
  122. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/analytics/analytics_utils.py +0 -0
  123. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/analytics/data_augmentation.py +0 -0
  124. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/analytics/plot.py +0 -0
  125. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/cli.py +0 -0
  126. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/__init__.py +0 -0
  127. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/autoflush_buffer.py +0 -0
  128. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/__init__.py +0 -0
  129. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/__init__.py +0 -0
  130. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/docdb_dao_base.py +0 -0
  131. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/lmdb_dao.py +0 -0
  132. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/mongodb_dao.py +0 -0
  133. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/keyvalue_dao.py +0 -0
  134. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/__init__.py +0 -0
  135. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_base.py +0 -0
  136. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_kafka.py +0 -0
  137. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_mofka.py +0 -0
  138. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_redis.py +0 -0
  139. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/redis_conn.py +0 -0
  140. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/__init__.py +0 -0
  141. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/base_settings_dataclasses.py +0 -0
  142. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/task_object.py +0 -0
  143. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/telemetry.py +0 -0
  144. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/workflow_object.py +0 -0
  145. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_logger.py +0 -0
  146. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/query_utils.py +0 -0
  147. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/settings_factory.py +0 -0
  148. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/task_data_preprocess.py +0 -0
  149. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/utils.py +0 -0
  150. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/vocabulary.py +0 -0
  151. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/configs.py +0 -0
  152. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_api/__init__.py +0 -0
  153. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_api/db_api.py +0 -0
  154. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_api/flowcept_controller.py +0 -0
  155. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_api/task_query_api.py +0 -0
  156. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/__init__.py +0 -0
  157. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/app.py +0 -0
  158. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/__init__.py +0 -0
  159. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/query_rsrc.py +0 -0
  160. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/task_messages_rsrc.py +0 -0
  161. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/__init__.py +0 -0
  162. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/__init__.py +0 -0
  163. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/base_interceptor.py +0 -0
  164. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/brokers/__init__.py +0 -0
  165. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/brokers/mqtt_interceptor.py +0 -0
  166. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/__init__.py +0 -0
  167. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_dataclasses.py +0 -0
  168. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_interceptor.py +0 -0
  169. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_plugins.py +0 -0
  170. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/instrumentation_interceptor.py +0 -0
  171. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/interceptor_state_manager.py +0 -0
  172. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/__init__.py +0 -0
  173. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dao.py +0 -0
  174. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dataclasses.py +0 -0
  175. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/__init__.py +0 -0
  176. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_dataclasses.py +0 -0
  177. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/__init__.py +0 -0
  178. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/agent/__init__.py +0 -0
  179. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/agent/base_agent_context_manager.py +0 -0
  180. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/base_consumer.py +0 -0
  181. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/consumer_utils.py +0 -0
  182. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/document_inserter.py +0 -0
  183. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/telemetry_capture.py +0 -0
  184. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/__init__.py +0 -0
  185. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_agent_task.py +0 -0
  186. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_decorator.py +0 -0
  187. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_loop.py +0 -0
  188. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_task.py +0 -0
  189. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_torch.py +0 -0
  190. {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/task_capture.py +0 -0
  191. {flowcept-0.9.15 → flowcept-0.9.17}/tests/__init__.py +0 -0
  192. {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/__init__.py +0 -0
  193. {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/dask_test_utils.py +0 -0
  194. {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_broker.py +0 -0
  195. {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_dask.py +0 -0
  196. {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_dask_with_context_mgmt.py +0 -0
  197. {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_mlflow.py +0 -0
  198. {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_tensorboard.py +0 -0
  199. {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/__init__.py +0 -0
  200. {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/db_api_test.py +0 -0
  201. {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/flowcept_api_test.py +0 -0
  202. {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/sample_data.json +0 -0
  203. {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/sample_data_with_telemetry_and_rai.json +0 -0
  204. {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/task_query_api_test.py +0 -0
  205. {flowcept-0.9.15 → flowcept-0.9.17}/tests/doc_db_inserter/__init__.py +0 -0
  206. {flowcept-0.9.15 → flowcept-0.9.17}/tests/doc_db_inserter/doc_db_inserter_test.py +0 -0
  207. {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/__init__.py +0 -0
  208. {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_explicit_tasks.py +0 -0
  209. {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_loop_test.py +0 -0
  210. {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_task_decorator_test.py +0 -0
  211. {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/__init__.py +0 -0
  212. {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/dl_trainer.py +0 -0
  213. {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/ml_decorator_dask_test.py +0 -0
  214. {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/ml_decorator_test.py +0 -0
  215. {flowcept-0.9.15 → flowcept-0.9.17}/tests/misc_tests/__init__.py +0 -0
  216. {flowcept-0.9.15 → flowcept-0.9.17}/tests/misc_tests/log_test.py +0 -0
  217. {flowcept-0.9.15 → flowcept-0.9.17}/tests/misc_tests/singleton_test.py +0 -0
  218. {flowcept-0.9.15 → flowcept-0.9.17}/tests/misc_tests/telemetry_test.py +0 -0
@@ -14,7 +14,7 @@ jobs:
14
14
  uses: actions/setup-python@v5
15
15
  with:
16
16
  python-version: "3.12"
17
- cache: "pip"
17
+ # cache: "pip"
18
18
 
19
19
  - name: Install package and dependencies
20
20
  run: |
@@ -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
@@ -23,7 +23,7 @@ jobs:
23
23
  uses: actions/setup-python@v5
24
24
  with:
25
25
  python-version: ${{ matrix.python-version }}
26
- cache: "pip"
26
+ # cache: "pip"
27
27
 
28
28
  - name: Show OS Info
29
29
  run: '[[ "$OSTYPE" == "linux-gnu"* ]] && { echo "OS Type: Linux"; (command -v lsb_release &> /dev/null && lsb_release -a) || cat /etc/os-release; uname -r; } || [[ "$OSTYPE" == "darwin"* ]] && { echo "OS Type: macOS"; sw_vers; uname -r; } || echo "Unsupported OS type: $OSTYPE"'
@@ -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
@@ -24,7 +24,7 @@ jobs:
24
24
  uses: actions/setup-python@v5
25
25
  with:
26
26
  python-version: ${{ matrix.python-version }}
27
- cache: "pip"
27
+ # cache: "pip"
28
28
 
29
29
  - name: Show OS Info
30
30
  run: '[[ "$OSTYPE" == "linux-gnu"* ]] && { echo "OS Type: Linux"; (command -v lsb_release &> /dev/null && lsb_release -a) || cat /etc/os-release; uname -r; } || [[ "$OSTYPE" == "darwin"* ]] && { echo "OS Type: macOS"; sw_vers; uname -r; } || echo "Unsupported OS type: $OSTYPE"'
@@ -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
@@ -28,7 +28,7 @@ jobs:
28
28
  uses: actions/setup-python@v5
29
29
  with:
30
30
  python-version: ${{ matrix.python-version }}
31
- cache: "pip"
31
+ # cache: "pip"
32
32
 
33
33
  - name: Run docker compose
34
34
  run: docker compose -f deployment/compose-kafka.yml up -d
@@ -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:
@@ -23,7 +23,7 @@ jobs:
23
23
  uses: actions/setup-python@v5
24
24
  with:
25
25
  python-version: ${{ matrix.python-version }}
26
- cache: "pip"
26
+ # cache: "pip"
27
27
 
28
28
  - name: Show OS Info
29
29
  run: '[[ "$OSTYPE" == "linux-gnu"* ]] && { echo "OS Type: Linux"; (command -v lsb_release &> /dev/null && lsb_release -a) || cat /etc/os-release; uname -r; } || [[ "$OSTYPE" == "darwin"* ]] && { echo "OS Type: macOS"; sw_vers; uname -r; } || echo "Unsupported OS type: $OSTYPE"'
@@ -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
@@ -26,7 +26,7 @@ jobs:
26
26
  uses: actions/setup-python@v5
27
27
  with:
28
28
  python-version: ${{ matrix.python-version }}
29
- cache: "pip"
29
+ # cache: "pip"
30
30
 
31
31
  - name: Show OS Info
32
32
  run: '[[ "$OSTYPE" == "linux-gnu"* ]] && { echo "OS Type: Linux"; (command -v lsb_release &> /dev/null && lsb_release -a) || cat /etc/os-release; uname -r; } || [[ "$OSTYPE" == "darwin"* ]] && { echo "OS Type: macOS"; sw_vers; uname -r; } || echo "Unsupported OS type: $OSTYPE"'
@@ -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
@@ -26,7 +26,7 @@ jobs:
26
26
  uses: actions/setup-python@v5
27
27
  with:
28
28
  python-version: ${{ matrix.python-version }}
29
- cache: "pip"
29
+ # cache: "pip"
30
30
 
31
31
  - name: Show OS Info
32
32
  run: 'case "${OSTYPE:-}" in linux*) echo "OS Type: Linux"; (command -v lsb_release >/dev/null 2>&1 && lsb_release -a || cat /etc/os-release); uname -r ;; darwin*) echo "OS Type: macOS"; sw_vers || true; uname -r ;; *) echo "Unsupported OS type: ${OSTYPE:-unknown}" ;; esac'
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowcept
3
- Version: 0.9.15
3
+ Version: 0.9.17
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
@@ -169,6 +169,7 @@ Flowcept captures and queries workflow provenance at runtime with minimal code c
169
169
 
170
170
 
171
171
  [![Documentation](https://img.shields.io/badge/docs-readthedocs.io-green.svg)](https://flowcept.readthedocs.io/)
172
+ [![Slack](https://img.shields.io/badge/Slack-%23flowcept%40Workflows%20Community-4A154B?logo=slack)](https://workflowscommunity.slack.com/archives/C06L5GYJKQS)
172
173
  [![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
174
  [![PyPI](https://badge.fury.io/py/flowcept.svg)](https://pypi.org/project/flowcept)
174
175
  [![Tests](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml/badge.svg)](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml)
@@ -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)
@@ -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,34 +7,70 @@ 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
- Publisher: IEEE.
20
- 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
+
21
24
 
22
25
  ---
23
26
 
24
27
  **Workflow Provenance in the Computing Continuum for Responsible, Trustworthy, and Energy-Efficient AI**
25
28
  R. Souza, S. Caino-Lores, M. Coletti, T. J. Skluzacek, A. Costan, F. Suter, M. Mattoso, and R. Ferreira da Silva,
26
- *IEEE International Conference on e-Science*, Osaka, Japan, 2024.
27
- doi: [10.1109/e-Science62913.2024.10678731](https://doi.org/10.1109/e-Science62913.2024.10678731)
28
- 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
+
29
34
 
30
35
  ---
31
36
 
32
37
  **LLM Agents for Interactive Workflow Provenance: Reference Architecture and Evaluation Methodology**
33
38
  R. Souza, T. Poteet, B. Etz, D. Rosendo, A. Gueroudji, W. Shin, P. Balaprakash, and R. Ferreira da Silva,
34
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.
35
- 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)
44
+
45
+
46
+ ---
47
+
48
+ ### Papers that used Flowcept
49
+
50
+
51
+ **Toward a Persistent Event-Streaming System for High-Performance Computing Applications**
52
+ M. Dorier, A. Gueroudji, V. Hayot-Sasson, H. Nguyen, S. Ockerman, R. Souza, T. Bicer, H. Pan, P. Carns, K. Chard, and others
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
+
60
+
61
+ ---
36
62
 
37
- ### Bixtex
63
+ **AI Agents for Enabling Autonomous Experiments at ORNL’s HPC and Manufacturing User Facilities**
64
+ D. Rosendo, S. DeWitt, R. Souza, P. Austria, T. Ghosal, M. McDonnell, R. Miller, T. Skluzacek, J. Haley, B. Turcksin, and others
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)
70
+
71
+ ---
72
+
73
+ ### Bibtex
38
74
 
39
75
  ```
40
76
  @inproceedings{souza2023towards,
@@ -47,7 +83,6 @@ doi: [10.1145/3731599.3767582](https://doi.org/10.1145/3731599.3767582)
47
83
  year={2023},
48
84
  abstract={Modern large-scale scientific discovery requires multidisciplinary collaboration across diverse computing facilities, including High Performance Computing (HPC) machines and the Edge-to-Cloud continuum. Integrated data analysis plays a crucial role in scientific discovery, especially in the current AI era, by enabling Responsible AI development, FAIR, Reproducibility, and User Steering. However, the heterogeneous nature of science poses challenges such as dealing with multiple supporting tools, cross-facility environments, and efficient HPC execution. Building on data observability, adapter system design, and provenance, we propose MIDA: an approach for lightweight runtime Multi-workflow Integrated Data Analysis. MIDA defines data observability strategies and adaptability methods for various parallel systems and machine learning tools. With observability, it intercepts the dataflows in the background without requiring instrumentation while integrating domain, provenance, and telemetry data at runtime into a unified database ready for user steering queries. We conduct experiments showing end-to-end multi-workflow analysis integrating data from Dask and MLFlow in a real distributed deep learning use case for materials science that runs on multiple environments with up to 276 GPUs in parallel. We show near-zero overhead running up to 100,000 tasks on 1,680 CPU cores on the Summit supercomputer.}
49
85
  }
50
-
51
86
  ```
52
87
 
53
88
  ```latex
@@ -89,3 +124,29 @@ doi: [10.1145/3731599.3767582](https://doi.org/10.1145/3731599.3767582)
89
124
  keywords = {scientific workflows, provenance, LLM agents, Large language models, AI agents, agentic workflows, agentic provenance}
90
125
  }
91
126
  ```
127
+
128
+ ```latex
129
+ @article{dorier2025toward,
130
+ author = {Dorier, Matthieu and Gueroudji, Amal and Hayot-Sasson, Valerie and Nguyen, Hai and Ockerman, Seth and Souza, Renan and Bicer, Tekin and Pan, Haochen and Carns, Philip and Chard, Kyle and others},
131
+ doi = {10.3389/fhpcp.2025.1638203},
132
+ journal = {Frontiers in High Performance Computing},
133
+ keyword = {HPC, I/O, Streaming, Mochi, Mofka, Kafka, Redpanda},
134
+ link = {https://www.frontiersin.org/journals/high-performance-computing/articles/10.3389/fhpcp.2025.1638203/abstract},
135
+ publisher = {Frontiers in High Performance Computing},
136
+ title = {Toward a Persistent Event-Streaming System for High-Performance Computing Applications},
137
+ volume = {3},
138
+ year = {2025}
139
+ }
140
+ ```
141
+
142
+ ```latex
143
+ @inproceedings{rosendo2025ai,
144
+ address = {St Louis, MO, USA},
145
+ author = {Rosendo, Daniel and DeWitt, Stephen and Souza, Renan and Austria, Phillipe and Ghosal, Tirthankar and McDonnell, Marshall and Miller, Ross and Skluzacek, Tyler J and Haley, James and Turcksin, Bruno and others},
146
+ booktitle = {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})},
147
+ pdf = {https://rafaelsilva.com/files/publications/rosendo2025xloop.pdf},
148
+ publisher = {ACM},
149
+ title = {AI Agents for Enabling Autonomous Experiments at ORNL’s HPC and Manufacturing User Facilities},
150
+ year = {2025}
151
+ }
152
+ ```
@@ -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"
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <catalog prefer="public" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
3
+ <group id="Folder Repository, directory=, recursive=true, Auto-Update=true, version=2" prefer="public" xml:base=""/>
4
+ </catalog>
@@ -0,0 +1,102 @@
1
+ @prefix prov_ag <http://example.org/aiprov#> .
2
+ @prefix prov: <http://www.w3.org/ns/prov#> .
3
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
4
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
5
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
6
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
7
+
8
+ prov_ag a owl:Ontology ;
9
+ rdfs:label "AI Agent Provenance Ontology (PROV-AGENT)" ;
10
+ rdfs:comment "Extends PROV-O to model agentic workflows, LLM calls, tools, and data per the given graph." ;
11
+ owl:imports <http://www.w3.org/ns/prov-o#> .
12
+
13
+ ### Core classes
14
+ prov_agDataObject a owl:Class ;
15
+ rdfs:subClassOf prov:Entity ;
16
+ rdfs:label "DataObject" .
17
+
18
+ prov_agDomainData a owl:Class ;
19
+ rdfs:subClassOf prov_agDataObject ,
20
+ [ a owl:Restriction ; owl:onProperty prov:wasGeneratedBy ; owl:someValuesFrom prov_agTask ] ;
21
+ rdfs:label "DomainData" .
22
+
23
+ prov_agTelemetryData a owl:Class ;
24
+ rdfs:subClassOf prov_agDataObject ,
25
+ [ a owl:Restriction ; owl:onProperty prov:wasGeneratedBy ; owl:someValuesFrom prov_agTask ] ;
26
+ rdfs:label "TelemetryData" .
27
+
28
+ prov_agSchedulingData a owl:Class ;
29
+ rdfs:subClassOf prov_agDataObject ,
30
+ [ a owl:Restriction ; owl:onProperty prov:wasGeneratedBy ; owl:someValuesFrom prov_agTask ] ;
31
+ rdfs:label "SchedulingData" .
32
+
33
+ prov_agPrompt a owl:Class ;
34
+ rdfs:subClassOf prov_agDataObject ;
35
+ rdfs:label "Prompt" .
36
+
37
+ prov_agResponseData a owl:Class ;
38
+ rdfs:subClassOf prov_agDataObject ,
39
+ [ a owl:Restriction ; owl:onProperty prov:wasGeneratedBy ; owl:someValuesFrom prov_agAIModelInvocation ] ;
40
+ rdfs:label "ResponseData" .
41
+
42
+ prov_agModel a owl:Class ;
43
+ rdfs:subClassOf prov:Entity ;
44
+ rdfs:label "AI Model" .
45
+
46
+ ### Activities
47
+ prov_agCampaign a owl:Class ;
48
+ rdfs:subClassOf prov:Activity ,
49
+ [ a owl:Restriction ; owl:onProperty prov_aghasMemberActivity ; owl:someValuesFrom prov_agWorkflow ] ;
50
+ rdfs:label "Campaign" .
51
+
52
+ prov_agWorkflow a owl:Class ;
53
+ rdfs:subClassOf prov:Activity ,
54
+ [ a owl:Restriction ; owl:onProperty prov_aghasMemberActivity ; owl:someValuesFrom prov_agTask ] ,
55
+ [ a owl:Restriction ; owl:onProperty prov_aghasMemberActivity ; owl:someValuesFrom prov_agAgentTool ] ;
56
+ rdfs:label "Workflow" .
57
+
58
+ prov_agTask a owl:Class ;
59
+ rdfs:subClassOf prov:Activity ,
60
+ [ a owl:Restriction ; owl:onProperty prov:used ; owl:someValuesFrom prov_agDomainData ] ,
61
+ [ a owl:Restriction ; owl:onProperty prov:generated ; owl:someValuesFrom prov_agDomainData ] ,
62
+ [ a owl:Restriction ; owl:onProperty prov:generated ; owl:someValuesFrom prov_agTelemetryData ] ,
63
+ [ a owl:Restriction ; owl:onProperty prov:generated ; owl:someValuesFrom prov_agSchedulingData ] ;
64
+ rdfs:label "Task" .
65
+
66
+ prov_agAgentTool a owl:Class ;
67
+ rdfs:subClassOf prov:Activity ,
68
+ [ a owl:Restriction ; owl:onProperty prov:used ; owl:someValuesFrom prov_agDataObject ] ,
69
+ [ a owl:Restriction ; owl:onProperty prov:wasAssociatedWith ; owl:someValuesFrom prov_agAIAgent ] ,
70
+ [ a owl:Restriction ; owl:onProperty prov:wasInformedBy ; owl:someValuesFrom prov_agAIModelInvocation ] ;
71
+ rdfs:label "AgentTool" .
72
+
73
+ prov_agAIModelInvocation a owl:Class ;
74
+ rdfs:subClassOf prov:Activity ,
75
+ [ a owl:Restriction ; owl:onProperty prov:used ; owl:someValuesFrom prov_agPrompt ] ,
76
+ [ a owl:Restriction ; owl:onProperty prov:used ; owl:someValuesFrom prov_agModel ] ;
77
+ rdfs:label "AI Model Invocation" .
78
+
79
+ ### Agent
80
+ prov_agAIAgent a owl:Class ;
81
+ rdfs:subClassOf prov:SoftwareAgent ;
82
+ rdfs:label "AIAgent" .
83
+
84
+ ### Custom property to mirror diagram’s hadMember (Activity-to-Activity)
85
+ prov_aghasMemberActivity a owl:ObjectProperty ;
86
+ rdfs:label "hadMember" ;
87
+ rdfs:comment "Structural membership of sub-activities within an activity, e.g., a workflow containing tasks or tools." ;
88
+ rdfs:domain prov:Activity ;
89
+ rdfs:range prov:Activity ;
90
+ rdfs:subPropertyOf rdfs:member .
91
+
92
+ ### Useful PROV-aware inferences
93
+ # If an entity wasGeneratedBy an activity that wasAssociatedWith an agent,
94
+ # then attribute the entity to that agent.
95
+ prov:wasAttributedTo owl:propertyChainAxiom ( prov:wasGeneratedBy prov:wasAssociatedWith ) .
96
+
97
+ ### Optional naming for convenience individuals (URIs to mint in data)
98
+ # Classes above define the schema. Instances can use PROV-O relations directly, e.g.:
99
+ # :t1 a prov_agTask ; prov:used :d_in .
100
+ # :d_out a prov_agDomainData ; prov:wasGeneratedBy :t1 .
101
+ # :tool1 a prov_agAgentTool ; prov:wasAssociatedWith :agent1 ; prov:wasInformedBy :llmCall1 .
102
+ # :llmCall1 a prov_agAIModelInvocation ; prov:used :prompt1, :modelX .
@@ -1,4 +1,4 @@
1
- flowcept_version: 0.9.15 # Version of the Flowcept package. This setting file is compatible with this version.
1
+ flowcept_version: 0.9.17 # 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.
@@ -166,6 +166,21 @@ def build_llm_model(
166
166
  from flowcept.agents.llms.gemini25 import Gemini25LLM
167
167
 
168
168
  llm = Gemini25LLM(**_model_kwargs)
169
+ elif _service_provider == "openai":
170
+ from langchain_openai import ChatOpenAI
171
+
172
+ api_key = os.environ.get("OPENAI_API_KEY", AGENT.get("api_key"))
173
+ base_url = os.environ.get("OPENAI_BASE_URL", AGENT.get("llm_server_url") or None) # optional
174
+ org = os.environ.get("OPENAI_ORG_ID", AGENT.get("organization", None)) # optional
175
+
176
+ init_kwargs = {"api_key": api_key}
177
+ if base_url:
178
+ init_kwargs["base_url"] = base_url
179
+ if org:
180
+ init_kwargs["organization"] = org
181
+
182
+ # IMPORTANT: use the merged kwargs so `model` and temps flow through
183
+ llm = ChatOpenAI(**init_kwargs, **_model_kwargs)
169
184
 
170
185
  else:
171
186
  raise Exception("Currently supported providers are sambanova, openai, azure, and google.")
@@ -1,16 +1,19 @@
1
1
  """Event handler module."""
2
2
 
3
+ from pathlib import Path
3
4
  from watchdog.events import FileSystemEventHandler
4
5
 
5
6
 
6
7
  class InterceptionEventHandler(FileSystemEventHandler):
7
8
  """Event handler class."""
8
9
 
9
- def __init__(self, interceptor_instance, callback_function):
10
+ def __init__(self, interceptor_instance, file_path_to_watch, callback_function):
10
11
  super().__init__()
12
+ self.file_path_to_watch = file_path_to_watch
11
13
  self.callback_function = callback_function
12
14
  self.interceptor_instance = interceptor_instance
13
15
 
14
16
  def on_modified(self, event):
15
17
  """Get on modified."""
16
- self.callback_function(self.interceptor_instance)
18
+ if Path(event.src_path).resolve() == Path(self.file_path_to_watch).resolve():
19
+ self.callback_function(self.interceptor_instance)
@@ -84,7 +84,7 @@ class MLFlowInterceptor(BaseInterceptor):
84
84
  def observe(self):
85
85
  """Observe it."""
86
86
  self.logger.debug("Observing")
87
- event_handler = InterceptionEventHandler(self, self.__class__.callback)
87
+ event_handler = InterceptionEventHandler(self, self.settings.file_path, self.__class__.callback)
88
88
  while not os.path.isfile(self.settings.file_path):
89
89
  self.logger.warning(
90
90
  f"I can't watch the file {self.settings.file_path},"
@@ -95,6 +95,7 @@ class MLFlowInterceptor(BaseInterceptor):
95
95
  sleep(self.settings.watch_interval_sec)
96
96
 
97
97
  self._observer = PollingObserver()
98
- self._observer.schedule(event_handler, self.settings.file_path, recursive=True)
98
+ watch_dir = os.path.dirname(self.settings.file_path) or "."
99
+ self._observer.schedule(event_handler, watch_dir, recursive=True)
99
100
  self._observer.start()
100
- self.logger.info(f"Watching {self.settings.file_path}")
101
+ self.logger.info(f"Watching directory {watch_dir} with file {self.settings.file_path} ")
@@ -1,6 +1,7 @@
1
1
  """Tensorboard interceptor module."""
2
2
 
3
3
  import os
4
+ from pathlib import Path
4
5
  from time import sleep
5
6
 
6
7
  from tbparse import SummaryReader
@@ -29,6 +30,8 @@ class TensorboardInterceptor(BaseInterceptor):
29
30
  def __init__(self, plugin_key="tensorboard"):
30
31
  super().__init__(plugin_key)
31
32
  self._observer: PollingObserver = None
33
+ if not Path(self.settings.file_path).is_dir():
34
+ raise Exception("Tensorboard Observer must observe directories.")
32
35
  self.state_manager = InterceptorStateManager(self.settings)
33
36
  self.state_manager.reset()
34
37
  self.log_metrics = set(self.settings.log_metrics)
@@ -108,13 +111,15 @@ class TensorboardInterceptor(BaseInterceptor):
108
111
 
109
112
  def observe(self):
110
113
  """Observe it."""
111
- event_handler = InterceptionEventHandler(self, self.__class__.callback)
114
+ self.logger.debug("Observing")
115
+ event_handler = InterceptionEventHandler(self, self.settings.file_path, self.__class__.callback)
112
116
  while not os.path.isdir(self.settings.file_path):
113
117
  self.logger.debug(f"I can't watch the file {self.settings.file_path}, as it does not exist.")
114
118
  self.logger.debug(f"\tI will sleep for {self.settings.watch_interval_sec} s to see if it appears.")
115
119
  sleep(self.settings.watch_interval_sec)
116
120
 
117
121
  self._observer = PollingObserver()
122
+
118
123
  self._observer.schedule(event_handler, self.settings.file_path, recursive=True)
119
124
  self._observer.start()
120
125
  self.logger.debug(f"Watching {self.settings.file_path}")
@@ -4,4 +4,4 @@
4
4
  # The expected format is: <Major>.<Minor>.<Patch>
5
5
  # This file is supposed to be automatically modified by the CI Bot.
6
6
  # See .github/workflows/version_bumper.py
7
- __version__ = "0.9.15"
7
+ __version__ = "0.9.17"