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.
- {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/checks.yml +1 -1
- {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/create-release-n-publish.yml +2 -2
- {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-llm-tests.yml +2 -2
- {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests-all-dbs.yml +2 -2
- {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests-kafka.yml +2 -2
- {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests-py313.yml +2 -2
- {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests-simple.yml +2 -2
- {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests.yml +2 -2
- {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run_examples.sh +2 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/PKG-INFO +3 -2
- {flowcept-0.9.15 → flowcept-0.9.17}/README.md +1 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/index.rst +18 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/prov_query.rst +2 -2
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/publications/README.md +74 -13
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/llm_main_example.py +18 -3
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/llm_test_runner.py +1 -1
- {flowcept-0.9.15 → flowcept-0.9.17}/pyproject.toml +1 -1
- flowcept-0.9.17/resources/ontology/catalog-v001.xml +4 -0
- flowcept-0.9.17/resources/ontology/prov_agent.owl +102 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/resources/sample_settings.yaml +1 -1
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/agents_utils.py +15 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/interception_event_handler.py +5 -2
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py +4 -3
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py +6 -1
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/version.py +1 -1
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_file_observer.py +11 -7
- {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/run-tests-in-container.yml +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/.github/workflows/version_bumper.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/.gitignore +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/.readthedocs.yaml +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/CONTRIBUTING.md +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/LICENSE +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/Makefile +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/deployment/Dockerfile +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/deployment/compose-grafana.yml +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/deployment/compose-kafka.yml +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/deployment/compose-mofka.yml +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/deployment/compose-mongo.yml +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/deployment/compose.yml +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/api-reference.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/architecture.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/cli-reference.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/conf.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/contributing.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/img/PROV-AGENT.svg +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/img/architecture-diagram.png +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/img/flowcept-logo-dark.png +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/img/flowcept-logo.png +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/large_data.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/prov_capture.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/prov_storage.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/quick_start.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/schemas.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/setup.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/task_schema.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/telemetry_capture.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/docs/workflow_schema.rst +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/a2a/README.md +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/a2a/agent1.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/a2a/agent2.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/aec_agent_context_manager.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/aec_agent_mock.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/aec_prompts.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/agents/opt_driver_mock.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/consumers/ping_pong_example.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/consumers/simple_consumer.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/consumers/simple_publisher.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/convergence_loop_example.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/dask_example.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/distributed_consumer_example.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/instrumented_loop_example.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/instrumented_simple_example.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/README.md +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/custom_provenance_id_mapping.yaml +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/llm_dataprep.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_complex/llm_model.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_tutorial/README.md +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_tutorial/analysis.ipynb +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_tutorial/llm_dataprep.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_tutorial/llm_model.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/llm_tutorial/llm_train_campaign.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/mlflow_example.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/mqtt_example.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/single_layer_perceptron_example.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/start_here.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/tensorboard_example.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/unmanaged/main.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/examples/unmanaged/simple_task.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/analytics.ipynb +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/dask.ipynb +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/dask_from_CLI.ipynb +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/mlflow.ipynb +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/reset_dask_nb_exec_counts.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/notebooks/tensorboard.ipynb +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/resources/mofka/bedrock_setup.sh +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/resources/mofka/consumer.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/resources/mofka/mofka-requirements.yaml +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/resources/mofka/mofka_config.json +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/resources/simple_redis_consumer.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/agent_client.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/dynamic_schema_tracker.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/flowcept_agent.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/flowcept_ctx_manager.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/gui/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/gui/agent_gui.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/gui/audio_utils.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/gui/gui_utils.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/llms/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/llms/claude_gcp.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/llms/gemini25.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/prompts/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/prompts/general_prompts.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/prompts/in_memory_query_prompts.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/tools/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/tools/general_tools.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/in_memory_queries_tools.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/pandas_agent_utils.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/analytics/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/analytics/analytics_utils.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/analytics/data_augmentation.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/analytics/plot.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/cli.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/autoflush_buffer.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/docdb_dao_base.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/lmdb_dao.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/mongodb_dao.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/keyvalue_dao.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_base.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_kafka.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_mofka.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_redis.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/daos/redis_conn.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/base_settings_dataclasses.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/task_object.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/telemetry.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/workflow_object.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/flowcept_logger.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/query_utils.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/settings_factory.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/task_data_preprocess.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/utils.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/commons/vocabulary.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/configs.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_api/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_api/db_api.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_api/flowcept_controller.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_api/task_query_api.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/app.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/query_rsrc.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/task_messages_rsrc.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/base_interceptor.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/brokers/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/brokers/mqtt_interceptor.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_dataclasses.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_interceptor.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_plugins.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/instrumentation_interceptor.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/interceptor_state_manager.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dao.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dataclasses.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_dataclasses.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/agent/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/agent/base_agent_context_manager.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/base_consumer.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/consumer_utils.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/document_inserter.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/telemetry_capture.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_agent_task.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_decorator.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_loop.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_task.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_torch.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/instrumentation/task_capture.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/dask_test_utils.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_broker.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_dask.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_dask_with_context_mgmt.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_mlflow.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/adapters/test_tensorboard.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/db_api_test.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/flowcept_api_test.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/sample_data.json +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/sample_data_with_telemetry_and_rai.json +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/api/task_query_api_test.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/doc_db_inserter/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/doc_db_inserter/doc_db_inserter_test.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_explicit_tasks.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_loop_test.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_task_decorator_test.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/dl_trainer.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/ml_decorator_dask_test.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/ml_decorator_test.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/misc_tests/__init__.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/misc_tests/log_test.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/misc_tests/singleton_test.py +0 -0
- {flowcept-0.9.15 → flowcept-0.9.17}/tests/misc_tests/telemetry_test.py +0 -0
|
@@ -7,7 +7,7 @@ jobs:
|
|
|
7
7
|
runs-on: ubuntu-latest
|
|
8
8
|
strategy:
|
|
9
9
|
matrix:
|
|
10
|
-
python-version: [ "3.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
[](https://flowcept.readthedocs.io/)
|
|
172
|
+
[](https://workflowscommunity.slack.com/archives/C06L5GYJKQS)
|
|
172
173
|
[](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml)
|
|
173
174
|
[](https://pypi.org/project/flowcept)
|
|
174
175
|
[](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
|
[](https://flowcept.readthedocs.io/)
|
|
23
|
+
[](https://workflowscommunity.slack.com/archives/C06L5GYJKQS)
|
|
23
24
|
[](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml)
|
|
24
25
|
[](https://pypi.org/project/flowcept)
|
|
25
26
|
[](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()
|
|
146
|
-
Flowcept.delete_buffer_file(
|
|
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
|
-
|
|
12
|
-
|
|
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
|
-
|
|
20
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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.
|
|
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,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.
|
|
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
|
-
|
|
18
|
+
if Path(event.src_path).resolve() == Path(self.file_path_to_watch).resolve():
|
|
19
|
+
self.callback_function(self.interceptor_instance)
|
{flowcept-0.9.15 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
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}")
|