flowcept 0.9.6__tar.gz → 0.9.8__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.6 → flowcept-0.9.8}/PKG-INFO +18 -1
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/index.rst +1 -0
- flowcept-0.9.8/docs/prov_query.rst +197 -0
- flowcept-0.9.8/docs/task_schema.rst +157 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/pyproject.toml +7 -1
- {flowcept-0.9.6 → flowcept-0.9.8}/resources/sample_settings.yaml +2 -1
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/gui/agent_gui.py +31 -20
- flowcept-0.9.8/src/flowcept/agents/gui/audio_utils.py +129 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/gui/gui_utils.py +157 -5
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/prompts/general_prompts.py +2 -2
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/prompts/in_memory_query_prompts.py +6 -4
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/tools/general_tools.py +3 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/tools/in_memory_queries/in_memory_queries_tools.py +3 -1
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/mq_dao/mq_dao_redis.py +2 -1
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/task_data_preprocess.py +2 -1
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/configs.py +7 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowcept_api/flowcept_controller.py +37 -22
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/version.py +1 -1
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/instrumentation_tests/flowcept_explicit_tasks.py +14 -3
- flowcept-0.9.6/docs/task_schema.rst +0 -114
- {flowcept-0.9.6 → flowcept-0.9.8}/.github/workflows/checks.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.github/workflows/create-release-n-publish.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.github/workflows/run-llm-tests.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.github/workflows/run-tests-all-dbs.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.github/workflows/run-tests-in-container.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.github/workflows/run-tests-kafka.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.github/workflows/run-tests-py313.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.github/workflows/run-tests-simple.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.github/workflows/run-tests.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.github/workflows/run_examples.sh +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.github/workflows/version_bumper.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.gitignore +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/.readthedocs.yaml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/CONTRIBUTING.md +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/LICENSE +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/Makefile +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/README.md +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/deployment/Dockerfile +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/deployment/compose-grafana.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/deployment/compose-kafka.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/deployment/compose-mofka.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/deployment/compose-mongo.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/deployment/compose.yml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/api-reference.rst +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/architecture.rst +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/cli-reference.rst +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/conf.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/contributing.rst +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/img/architecture-diagram.png +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/img/flowcept-logo-dark.png +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/img/flowcept-logo.png +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/prov_capture.rst +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/prov_storage.rst +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/quick_start.rst +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/schemas.rst +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/setup.rst +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/telemetry_capture.rst +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/docs/workflow_schema.rst +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/agents/a2a/README.md +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/agents/a2a/agent1.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/agents/a2a/agent2.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/agents/aec_agent_context_manager.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/agents/aec_agent_mock.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/agents/aec_prompts.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/agents/opt_driver_mock.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/consumers/ping_pong_example.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/consumers/simple_consumer.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/consumers/simple_publisher.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/convergence_loop_example.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/dask_example.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/distributed_consumer_example.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/instrumented_loop_example.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/instrumented_simple_example.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/llm_complex/README.md +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/llm_complex/custom_provenance_id_mapping.yaml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/llm_complex/llm_dataprep.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/llm_complex/llm_main_example.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/llm_complex/llm_model.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/llm_complex/llm_test_runner.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/mlflow_example.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/mqtt_example.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/single_layer_perceptron_example.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/start_here.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/tensorboard_example.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/unmanaged/main.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/examples/unmanaged/simple_task.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/notebooks/analytics.ipynb +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/notebooks/dask.ipynb +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/notebooks/dask_from_CLI.ipynb +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/notebooks/mlflow.ipynb +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/notebooks/reset_dask_nb_exec_counts.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/notebooks/tensorboard.ipynb +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/resources/mofka/bedrock_setup.sh +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/resources/mofka/consumer.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/resources/mofka/mofka-requirements.yaml +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/resources/mofka/mofka_config.json +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/resources/simple_redis_consumer.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/agent_client.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/agents_utils.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/dynamic_schema_tracker.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/flowcept_agent.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/flowcept_ctx_manager.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/gui/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/llms/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/llms/claude_gcp.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/llms/gemini25.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/prompts/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/tools/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/tools/in_memory_queries/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/agents/tools/in_memory_queries/pandas_agent_utils.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/analytics/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/analytics/analytics_utils.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/analytics/data_augmentation.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/analytics/plot.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/cli.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/autoflush_buffer.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/docdb_dao/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/docdb_dao/docdb_dao_base.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/docdb_dao/lmdb_dao.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/docdb_dao/mongodb_dao.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/keyvalue_dao.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/mq_dao/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/mq_dao/mq_dao_base.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/mq_dao/mq_dao_kafka.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/mq_dao/mq_dao_mofka.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/daos/redis_conn.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/flowcept_dataclasses/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/flowcept_dataclasses/base_settings_dataclasses.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/flowcept_dataclasses/task_object.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/flowcept_dataclasses/telemetry.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/flowcept_dataclasses/workflow_object.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/flowcept_logger.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/query_utils.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/settings_factory.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/utils.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/commons/vocabulary.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowcept_api/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowcept_api/db_api.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowcept_api/task_query_api.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowcept_webserver/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowcept_webserver/app.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowcept_webserver/resources/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowcept_webserver/resources/query_rsrc.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowcept_webserver/resources/task_messages_rsrc.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/base_interceptor.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/brokers/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/brokers/mqtt_interceptor.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/dask/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/dask/dask_dataclasses.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/dask/dask_interceptor.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/dask/dask_plugins.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/instrumentation_interceptor.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/interceptor_state_manager.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/mlflow/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/mlflow/interception_event_handler.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dao.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dataclasses.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/tensorboard/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_dataclasses.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/consumers/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/consumers/agent/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/consumers/agent/base_agent_context_manager.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/consumers/base_consumer.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/consumers/consumer_utils.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/consumers/document_inserter.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/flowceptor/telemetry_capture.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/instrumentation/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/instrumentation/flowcept_agent_task.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/instrumentation/flowcept_decorator.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/instrumentation/flowcept_loop.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/instrumentation/flowcept_task.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/instrumentation/flowcept_torch.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/src/flowcept/instrumentation/task_capture.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/adapters/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/adapters/dask_test_utils.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/adapters/test_broker.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/adapters/test_dask.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/adapters/test_dask_with_context_mgmt.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/adapters/test_file_observer.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/adapters/test_mlflow.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/adapters/test_tensorboard.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/api/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/api/db_api_test.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/api/flowcept_api_test.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/api/sample_data.json +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/api/sample_data_with_telemetry_and_rai.json +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/api/task_query_api_test.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/doc_db_inserter/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/doc_db_inserter/doc_db_inserter_test.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/instrumentation_tests/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/instrumentation_tests/flowcept_loop_test.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/instrumentation_tests/flowcept_task_decorator_test.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/instrumentation_tests/ml_tests/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/instrumentation_tests/ml_tests/dl_trainer.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/instrumentation_tests/ml_tests/ml_decorator_dask_test.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/instrumentation_tests/ml_tests/ml_decorator_test.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/misc_tests/__init__.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/misc_tests/log_test.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/misc_tests/singleton_test.py +0 -0
- {flowcept-0.9.6 → flowcept-0.9.8}/tests/misc_tests/telemetry_test.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flowcept
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.8
|
|
4
4
|
Summary: Capture and query workflow provenance data using data observability
|
|
5
5
|
Author: Oak Ridge National Laboratory
|
|
6
6
|
License-Expression: MIT
|
|
@@ -27,6 +27,7 @@ Requires-Dist: jupyterlab; extra == 'all'
|
|
|
27
27
|
Requires-Dist: langchain-community; extra == 'all'
|
|
28
28
|
Requires-Dist: langchain-openai; extra == 'all'
|
|
29
29
|
Requires-Dist: lmdb; extra == 'all'
|
|
30
|
+
Requires-Dist: matplotlib; extra == 'all'
|
|
30
31
|
Requires-Dist: mcp[cli]; extra == 'all'
|
|
31
32
|
Requires-Dist: mlflow-skinny; extra == 'all'
|
|
32
33
|
Requires-Dist: nbmake; extra == 'all'
|
|
@@ -38,6 +39,7 @@ Requires-Dist: psutil>=6.1.1; extra == 'all'
|
|
|
38
39
|
Requires-Dist: py-cpuinfo; extra == 'all'
|
|
39
40
|
Requires-Dist: pyarrow; extra == 'all'
|
|
40
41
|
Requires-Dist: pymongo; extra == 'all'
|
|
42
|
+
Requires-Dist: pymupdf; extra == 'all'
|
|
41
43
|
Requires-Dist: pytest; extra == 'all'
|
|
42
44
|
Requires-Dist: pyyaml; extra == 'all'
|
|
43
45
|
Requires-Dist: redis; extra == 'all'
|
|
@@ -87,13 +89,28 @@ Requires-Dist: confluent-kafka<=2.8.0; extra == 'kafka'
|
|
|
87
89
|
Provides-Extra: llm-agent
|
|
88
90
|
Requires-Dist: langchain-community; extra == 'llm-agent'
|
|
89
91
|
Requires-Dist: langchain-openai; extra == 'llm-agent'
|
|
92
|
+
Requires-Dist: matplotlib; extra == 'llm-agent'
|
|
90
93
|
Requires-Dist: mcp[cli]; extra == 'llm-agent'
|
|
94
|
+
Requires-Dist: pymupdf; extra == 'llm-agent'
|
|
91
95
|
Requires-Dist: streamlit; extra == 'llm-agent'
|
|
96
|
+
Provides-Extra: llm-agent-audio
|
|
97
|
+
Requires-Dist: gtts; extra == 'llm-agent-audio'
|
|
98
|
+
Requires-Dist: langchain-community; extra == 'llm-agent-audio'
|
|
99
|
+
Requires-Dist: langchain-openai; extra == 'llm-agent-audio'
|
|
100
|
+
Requires-Dist: matplotlib; extra == 'llm-agent-audio'
|
|
101
|
+
Requires-Dist: mcp[cli]; extra == 'llm-agent-audio'
|
|
102
|
+
Requires-Dist: pydub; extra == 'llm-agent-audio'
|
|
103
|
+
Requires-Dist: pymupdf; extra == 'llm-agent-audio'
|
|
104
|
+
Requires-Dist: speechrecognition; extra == 'llm-agent-audio'
|
|
105
|
+
Requires-Dist: streamlit; extra == 'llm-agent-audio'
|
|
106
|
+
Requires-Dist: streamlit-mic-recorder; extra == 'llm-agent-audio'
|
|
92
107
|
Provides-Extra: llm-google
|
|
93
108
|
Requires-Dist: google-genai; extra == 'llm-google'
|
|
94
109
|
Requires-Dist: langchain-community; extra == 'llm-google'
|
|
95
110
|
Requires-Dist: langchain-openai; extra == 'llm-google'
|
|
111
|
+
Requires-Dist: matplotlib; extra == 'llm-google'
|
|
96
112
|
Requires-Dist: mcp[cli]; extra == 'llm-google'
|
|
113
|
+
Requires-Dist: pymupdf; extra == 'llm-google'
|
|
97
114
|
Requires-Dist: streamlit; extra == 'llm-google'
|
|
98
115
|
Provides-Extra: lmdb
|
|
99
116
|
Requires-Dist: lmdb; extra == 'lmdb'
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
Provenance Querying
|
|
2
|
+
====================
|
|
3
|
+
|
|
4
|
+
Flowcept captures detailed provenance about workflows, tasks, and artifacts. Once captured, there are multiple ways to query this provenance depending on your needs. This guide summarizes the main mechanisms available for querying Flowcept data.
|
|
5
|
+
|
|
6
|
+
.. note::
|
|
7
|
+
|
|
8
|
+
Persistence is optional in Flowcept. You can configure Flowcept to use LMDB, MongoDB or both. LMDB is a lightweight file‑based database ideal for simple tests; MongoDB provides advanced query support and is required for Flowcept’s database API and CLI queries. Flowcept can write to both backends if both are enabled.
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
Querying with the Command‑Line Interface
|
|
12
|
+
----------------------------------------
|
|
13
|
+
|
|
14
|
+
Flowcept provides a small CLI for quick database queries. The CLI requires MongoDB to be enabled【202622579855635†L68-L96】 and accessible from your environment. After installing Flowcept, run `flowcept --help` to see all available commands and options【463846373907647†L68-L83】. The usage pattern is:
|
|
15
|
+
|
|
16
|
+
.. code-block:: console
|
|
17
|
+
|
|
18
|
+
flowcept --<function-name-with-dashes> [--<arg-name-with-dashes>=<value>]
|
|
19
|
+
|
|
20
|
+
Important query‑oriented commands include:
|
|
21
|
+
|
|
22
|
+
* ``workflow-count`` – count tasks, workflows and objects for a given workflow ID【463846373907647†L152-L166】.
|
|
23
|
+
* ``query`` – run a MongoDB query against the tasks collection, with optional projection, sorting and limit【463846373907647†L168-L190】.
|
|
24
|
+
* ``get-task`` – fetch a single task document by its ID【463846373907647†L198-L207】.
|
|
25
|
+
|
|
26
|
+
Here’s an example session:
|
|
27
|
+
|
|
28
|
+
.. code-block:: console
|
|
29
|
+
|
|
30
|
+
# count the number of tasks, workflows and objects for a workflow
|
|
31
|
+
flowcept --workflow-count --workflow-id=123e4567-e89b-12d3-a456-426614174000
|
|
32
|
+
|
|
33
|
+
# query tasks where status is COMPLETED and only return `activity_id` and `status`
|
|
34
|
+
flowcept --query --filter='{"status": "COMPLETED"}' \
|
|
35
|
+
--project='{"activity_id": 1, "status": 1, "_id": 0}' \
|
|
36
|
+
--sort='[["started_at", -1]]' --limit=10
|
|
37
|
+
|
|
38
|
+
# fetch a task by ID
|
|
39
|
+
flowcept --get-task --task-id=24aa4e52-9aec-4ef6-8cb7-cbd7c72d436e
|
|
40
|
+
|
|
41
|
+
The CLI prints JSON results to stdout. For full usage details see the official CLI reference【463846373907647†L68-L83】.
|
|
42
|
+
|
|
43
|
+
Querying via the Python API (`Flowcept.db`)
|
|
44
|
+
-------------------------------------------
|
|
45
|
+
|
|
46
|
+
For programmatic access inside scripts and notebooks, Flowcept exposes a database API via the ``Flowcept.db`` property. When MongoDB is enabled this property returns an instance of the internal `DBAPI` class. You can call any of the following methods:
|
|
47
|
+
|
|
48
|
+
* ``task_query(filter, projection=None, limit=0, sort=None)`` – query the `tasks` collection with an optional projection, sort and limit.
|
|
49
|
+
* ``workflow_query(filter)`` – query the `workflows` collection.
|
|
50
|
+
* ``get_workflow_object(workflow_id)`` – fetch a workflow and return a `WorkflowObject`.
|
|
51
|
+
* ``insert_or_update_task(task_object)`` – insert or update a task.
|
|
52
|
+
* ``save_or_update_object(object, type, custom_metadata, …)`` – persist binary objects such as models or large artifacts.
|
|
53
|
+
|
|
54
|
+
Below is a typical usage pattern:
|
|
55
|
+
|
|
56
|
+
.. code-block:: python
|
|
57
|
+
|
|
58
|
+
from flowcept import Flowcept
|
|
59
|
+
|
|
60
|
+
# query tasks for the current workflow
|
|
61
|
+
tasks = Flowcept.db.get_tasks_from_current_workflow()
|
|
62
|
+
print(f"Tasks captured in current workflow: {len(tasks)}")
|
|
63
|
+
|
|
64
|
+
# find all tasks marked with a "math" tag
|
|
65
|
+
math_tasks = Flowcept.db.task_query(filter={"tags": "math"})
|
|
66
|
+
for t in math_tasks:
|
|
67
|
+
print(f"{t['task_id']} – {t['activity_id']}: {t['status']}")
|
|
68
|
+
|
|
69
|
+
# fetch a workflow object and inspect its arguments
|
|
70
|
+
wf = Flowcept.db.get_workflow_object(workflow_id="123e4567-e89b-12d3-a456-426614174000")
|
|
71
|
+
print(wf.workflow_args)
|
|
72
|
+
|
|
73
|
+
The `DBAPI` exposes many other methods, such as `get_tasks_recursive` to retrieve all descendants of a task, or `dump_tasks_to_file_recursive` to export tasks to Parquet. See the API reference for details.
|
|
74
|
+
|
|
75
|
+
Accessing the In‑Memory Buffer
|
|
76
|
+
------------------------------
|
|
77
|
+
|
|
78
|
+
During runtime Flowcept stores captured messages in an in‑memory buffer (`Flowcept.buffer`). This buffer is useful for debugging or lightweight scripts because it provides immediate access to the latest tasks and workflows without any additional services. In the example below we create two tasks that attach binary data and then inspect the buffer:
|
|
79
|
+
|
|
80
|
+
.. code-block:: python
|
|
81
|
+
|
|
82
|
+
from pathlib import Path
|
|
83
|
+
from flowcept import Flowcept
|
|
84
|
+
from flowcept.instrumentation.task import FlowceptTask
|
|
85
|
+
|
|
86
|
+
with Flowcept() as f:
|
|
87
|
+
used_args = {"a": 1}
|
|
88
|
+
# first task – attach a PDF
|
|
89
|
+
with FlowceptTask(used=used_args) as t:
|
|
90
|
+
img_path = Path("docs/img/architecture.pdf")
|
|
91
|
+
with open(img_path, "rb") as fp:
|
|
92
|
+
img_data = fp.read()
|
|
93
|
+
t.end(generated={"b": 2},
|
|
94
|
+
data=img_data,
|
|
95
|
+
custom_metadata={
|
|
96
|
+
"mime_type": "application/pdf",
|
|
97
|
+
"file_name": "architecture.pdf",
|
|
98
|
+
"file_extension": "pdf"})
|
|
99
|
+
t.send()
|
|
100
|
+
# second task – attach a PNG
|
|
101
|
+
with FlowceptTask(used=used_args) as t:
|
|
102
|
+
img_path = Path("docs/img/flowcept-logo.png")
|
|
103
|
+
with open(img_path, "rb") as fp:
|
|
104
|
+
img_data = fp.read()
|
|
105
|
+
t.end(generated={"c": 2},
|
|
106
|
+
data=img_data,
|
|
107
|
+
custom_metadata={
|
|
108
|
+
"mime_type": "image/png",
|
|
109
|
+
"file_name": "flowcept-logo.png",
|
|
110
|
+
"file_extension": "png"})
|
|
111
|
+
t.send()
|
|
112
|
+
|
|
113
|
+
# inspect the buffer
|
|
114
|
+
assert len(Flowcept.buffer) == 3 # includes the workflow message
|
|
115
|
+
assert Flowcept.buffer[1]["data"] # binary data is captured as bytes
|
|
116
|
+
|
|
117
|
+
At any point inside the running workflow you can access `Flowcept.buffer` to retrieve a list of dictionaries representing messages. Each element contains the original JSON payload plus any binary `data` field. Because the buffer lives in memory, it reflects the most recent state of the workflow and is cleared when the process ends.
|
|
118
|
+
|
|
119
|
+
Working Offline: Reading a Messages File
|
|
120
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
121
|
+
|
|
122
|
+
When persistence is enabled in offline mode, Flowcept dumps the buffer to a JSONL file. Use :func:`Flowcept.read_messages_file` to load these messages later. If you pass `return_df=True` Flowcept will normalise nested fields into dot‑separated columns and return a pandas DataFrame. This is handy for ad‑hoc analysis with pandas.
|
|
123
|
+
|
|
124
|
+
.. code-block:: python
|
|
125
|
+
|
|
126
|
+
from flowcept import Flowcept
|
|
127
|
+
|
|
128
|
+
# read JSON into a list of dicts
|
|
129
|
+
msgs = Flowcept.read_messages_file("offline_buffer.jsonl")
|
|
130
|
+
print(f"{len(msgs)} messages")
|
|
131
|
+
|
|
132
|
+
# read JSON into a pandas DataFrame
|
|
133
|
+
df = Flowcept.read_messages_file("offline_buffer.jsonl", return_df=True)
|
|
134
|
+
# dot‑notation columns allow easy selection; e.g., outputs of attention layers
|
|
135
|
+
print("generated.attention" in df.columns)
|
|
136
|
+
|
|
137
|
+
Keep in mind that the JSONL file is only created when using fully offline mode. The path is configured in the settings file under ``DUMP_BUFFER_PATH``. If the file doesn’t exist, `read_messages_file` will raise an error.
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
Working Directly with MongoDB
|
|
141
|
+
-----------------------------
|
|
142
|
+
|
|
143
|
+
If MongoDB is enabled in your settings you may prefer to query the database directly, especially for complex aggregation pipelines. Flowcept stores tasks in the ``tasks`` collection, workflows in ``workflows``, and binary objects in ``objects``. You can use any MongoDB tool or client library, such as:
|
|
144
|
+
|
|
145
|
+
* **PyMongo** – Python driver for MongoDB; perfect for custom scripts.
|
|
146
|
+
* **MongoDB Compass** – graphical UI for ad‑hoc queries and visualisation.
|
|
147
|
+
* **mongo shell** or **mongosh** – CLI for interactive queries.
|
|
148
|
+
|
|
149
|
+
For example, using PyMongo:
|
|
150
|
+
|
|
151
|
+
.. code-block:: python
|
|
152
|
+
|
|
153
|
+
import pymongo
|
|
154
|
+
|
|
155
|
+
client = pymongo.MongoClient("mongodb://localhost:27017")
|
|
156
|
+
db = client["flowcept"]
|
|
157
|
+
# find the 20 most recent tasks for a workflow
|
|
158
|
+
tasks = db.tasks.find(
|
|
159
|
+
{"workflow_id": "123e4567-e89b-12d3-a456-426614174000"},
|
|
160
|
+
{"_id": 0, "activity_id": 1, "status": 1}
|
|
161
|
+
).sort("started_at", pymongo.DESCENDING).limit(20)
|
|
162
|
+
for t in tasks:
|
|
163
|
+
print(t)
|
|
164
|
+
|
|
165
|
+
The connection string, database name and authentication credentials are configured in the Flowcept settings file.
|
|
166
|
+
|
|
167
|
+
Working with LMDB
|
|
168
|
+
-----------------
|
|
169
|
+
|
|
170
|
+
If LMDB is enabled instead of MongoDB【202622579855635†L68-L96】 Flowcept stores data in a directory (default: ``flowcept_lmdb``). LMDB is a file‑based key–value store; it does not support ad‑hoc queries out of the box, but you can read the data programmatically. Flowcept’s `DBAPI` can export LMDB data into pandas DataFrames, allowing you to analyse offline runs without MongoDB:
|
|
171
|
+
|
|
172
|
+
.. code-block:: python
|
|
173
|
+
|
|
174
|
+
from flowcept import Flowcept
|
|
175
|
+
|
|
176
|
+
# export LMDB tasks to a DataFrame
|
|
177
|
+
df = Flowcept.db.to_df(collection="tasks")
|
|
178
|
+
print(df.head())
|
|
179
|
+
|
|
180
|
+
Alternatively, you can use the `lmdb` Python library to iterate over raw key–value pairs. The LMDB environment is located under the directory configured in your settings file (commonly named ``flowcept_lmdb``). Because LMDB stores binary values, you’ll need to serialise and deserialise JSON messages yourself.
|
|
181
|
+
|
|
182
|
+
Monitoring Provenance with Grafana
|
|
183
|
+
----------------------------------
|
|
184
|
+
|
|
185
|
+
Flowcept supports streaming provenance into monitoring dashboards. A sample Docker compose file (`deployment/compose-grafana.yml`) runs Grafana along with MongoDB and Redis. Grafana is configured with a pre‑built MongoDB‑Grafana image and exposes a port (3000) for the dashboard【711366042692702†L292-L297】. To configure Grafana to query Flowcept’s MongoDB, create a new data source with the URL `mongodb://flowcept_mongo:27017` and specify the database name (usually `flowcept`). The compose file sets environment variables for the admin user and password so you can log in and create your own panels.
|
|
186
|
+
|
|
187
|
+
Grafana can also connect directly to Redis or Kafka for near‑real‑time streaming. See the Grafana documentation for instructions on configuring those plugins.
|
|
188
|
+
|
|
189
|
+
Querying via the LLM‑based Flowcept Agent
|
|
190
|
+
-----------------------------------------
|
|
191
|
+
|
|
192
|
+
Flowcept’s agentic querying (powered by language models) is under active development. The agent will allow natural‑language queries over provenance data, with interactive guidance and summarisation. Documentation will be released in a future version. In the meantime, use the CLI or Python API for querying tasks and workflows.
|
|
193
|
+
|
|
194
|
+
Conclusion
|
|
195
|
+
----------
|
|
196
|
+
|
|
197
|
+
Flowcept offers several ways to query provenance data depending on your environment and requirements. For quick inspection, use the in‑memory buffer or offline message files. For interactive scripts or notebooks, `Flowcept.db` provides a high‑level API to MongoDB or LMDB. For more sophisticated queries, connect directly to MongoDB using the CLI or standard MongoDB tools. Grafana integration lets you build dashboards on live data. As Flowcept evolves, additional capabilities—such as LLM‑based query agents—will expand the ways you can explore your provenance.
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
Task Data Schema
|
|
2
|
+
================
|
|
3
|
+
|
|
4
|
+
This document describes the schema of a task record used to capture metadata, telemetry, and provenance in a workflow.
|
|
5
|
+
A task represents one unit of work, including inputs, outputs, execution context, system telemetry, and runtime provenance.
|
|
6
|
+
|
|
7
|
+
Each task record may include fields for identifiers, timing, telemetry, user and system context, dependencies, and custom metadata.
|
|
8
|
+
|
|
9
|
+
Task Fields
|
|
10
|
+
-----------
|
|
11
|
+
|
|
12
|
+
- **type**: Constant type label (``"task"``) (string)
|
|
13
|
+
- **subtype**: Optional subtype of the task, e.g., iteration, ML step, custom (string)
|
|
14
|
+
|
|
15
|
+
Identifiers
|
|
16
|
+
~~~~~~~~~~~
|
|
17
|
+
|
|
18
|
+
- **task_id**: Unique identifier for the task (string)
|
|
19
|
+
- **workflow_id**: Identifier for the workflow this task belongs to (string)
|
|
20
|
+
- **workflow_name**: Name of the workflow this task belongs to (string)
|
|
21
|
+
- **campaign_id**: Identifier for the campaign this task belongs to (string)
|
|
22
|
+
- **activity_id**: Identifier for the activity performed by the task (usually a function name) (string)
|
|
23
|
+
- **group_id**: Identifier grouping related tasks, e.g., loop iterations (string)
|
|
24
|
+
- **parent_task_id**: Identifier of the parent task, if nested (string)
|
|
25
|
+
- **agent_id**: Identifier of the agent responsible for executing the task (string)
|
|
26
|
+
- **adapter_id**: Identifier of the adapter that produced this task (string)
|
|
27
|
+
- **environment_id**: Identifier of the environment where the task ran (string)
|
|
28
|
+
|
|
29
|
+
Timing
|
|
30
|
+
~~~~~~
|
|
31
|
+
|
|
32
|
+
- **utc_timestamp**: UTC timestamp when the task object was created (float)
|
|
33
|
+
- **submitted_at**: Timestamp when the task was submitted (float)
|
|
34
|
+
- **started_at**: Timestamp when execution started (float)
|
|
35
|
+
- **ended_at**: Timestamp when execution ended (float)
|
|
36
|
+
- **registered_at**: Timestamp when registered in storage (float)
|
|
37
|
+
|
|
38
|
+
Provenance Data
|
|
39
|
+
~~~~~~~~~~~~~~~
|
|
40
|
+
|
|
41
|
+
- **used**: Inputs consumed by the task, such as parameters, files, or resources (dictionary)
|
|
42
|
+
- **generated**: Outputs produced by the task, e.g., results, artifacts, files (dictionary)
|
|
43
|
+
- **dependencies**: List of task IDs this task depends on (list)
|
|
44
|
+
- **dependents**: List of task IDs that depend on this task (list)
|
|
45
|
+
|
|
46
|
+
Execution Metadata
|
|
47
|
+
~~~~~~~~~~~~~~~~~~
|
|
48
|
+
|
|
49
|
+
- **status**: Execution status of the task (e.g., FINISHED, ERROR) (string)
|
|
50
|
+
- **stdout**: Captured standard output (string or dictionary)
|
|
51
|
+
- **stderr**: Captured standard error (string or dictionary)
|
|
52
|
+
- **data**: Arbitrary raw payload associated with the task (any type)
|
|
53
|
+
- **custom_metadata**: User- or developer-provided metadata dictionary (dictionary)
|
|
54
|
+
- **tags**: User-defined tags attached to the task (list)
|
|
55
|
+
|
|
56
|
+
User and System Context
|
|
57
|
+
~~~~~~~~~~~~~~~~~~~~~~~
|
|
58
|
+
|
|
59
|
+
- **user**: User who executed or triggered the task (string)
|
|
60
|
+
- **login_name**: Login name of the user in the environment (string)
|
|
61
|
+
- **node_name**: Node where the task executed (string)
|
|
62
|
+
- **hostname**: Hostname of the machine executing the task (string)
|
|
63
|
+
- **public_ip**: Public IP address (string)
|
|
64
|
+
- **private_ip**: Private IP address (string)
|
|
65
|
+
- **address**: Optional network address (string)
|
|
66
|
+
- **mq_host**: Message queue host associated with the task (string)
|
|
67
|
+
|
|
68
|
+
Telemetry Data Schema
|
|
69
|
+
---------------------
|
|
70
|
+
|
|
71
|
+
If telemetry capture is enabled, telemetry snapshots are stored in ``telemetry_at_start`` and ``telemetry_at_end``.
|
|
72
|
+
Each is a dictionary with the following structure:
|
|
73
|
+
|
|
74
|
+
CPU
|
|
75
|
+
~~~
|
|
76
|
+
|
|
77
|
+
- **times_avg**: Dictionary with CPU times
|
|
78
|
+
- **user**, **nice**, **system**, **idle**
|
|
79
|
+
- **percent_all**: Overall CPU usage percentage
|
|
80
|
+
- **frequency**: CPU frequency
|
|
81
|
+
- **times_per_cpu**: List of dictionaries of per-core times
|
|
82
|
+
- **percent_per_cpu**: List of per-core usage percentages
|
|
83
|
+
|
|
84
|
+
Process
|
|
85
|
+
~~~~~~~
|
|
86
|
+
|
|
87
|
+
- **pid**: Process ID
|
|
88
|
+
- **memory**: Dictionary with memory stats
|
|
89
|
+
- **rss**, **vms**, **pfaults**, **pageins**
|
|
90
|
+
- **memory_percent**: Memory usage percentage
|
|
91
|
+
- **cpu_times**: Dictionary with CPU times
|
|
92
|
+
- **user**, **system**, **children_user**, **children_system**
|
|
93
|
+
- **cpu_percent**: CPU usage percentage
|
|
94
|
+
- **executable**: Path to executable
|
|
95
|
+
- **cmd_line**: Command line arguments
|
|
96
|
+
- **num_open_file_descriptors**, **num_connections**, **num_open_files**, **num_threads**
|
|
97
|
+
- **num_ctx_switches**: Dictionary with
|
|
98
|
+
- **voluntary**, **involuntary**
|
|
99
|
+
|
|
100
|
+
Memory
|
|
101
|
+
~~~~~~
|
|
102
|
+
|
|
103
|
+
- **virtual**: Dictionary with virtual memory stats
|
|
104
|
+
- **total**, **available**, **percent**, **used**, **free**, **active**, **inactive**, **wired**
|
|
105
|
+
- **swap**: Dictionary with swap memory stats
|
|
106
|
+
- **total**, **used**, **free**, **percent**, **sin**, **sout**
|
|
107
|
+
|
|
108
|
+
Disk
|
|
109
|
+
~~~~
|
|
110
|
+
|
|
111
|
+
- **disk_usage**: Dictionary with usage stats
|
|
112
|
+
- **total**, **used**, **free**, **percent**
|
|
113
|
+
- **io_sum**: Dictionary with I/O stats
|
|
114
|
+
- **read_count**, **write_count**, **read_bytes**, **write_bytes**, **read_time**, **write_time**
|
|
115
|
+
|
|
116
|
+
Network
|
|
117
|
+
~~~~~~~
|
|
118
|
+
|
|
119
|
+
- **netio_sum**: Dictionary with aggregate network I/O
|
|
120
|
+
- **bytes_sent**, **bytes_recv**, **packets_sent**, **packets_recv**, **errin**, **errout**, **dropin**, **dropout**
|
|
121
|
+
- **netio_per_interface**: Dictionary keyed by interface with same metrics
|
|
122
|
+
|
|
123
|
+
GPU
|
|
124
|
+
~~~
|
|
125
|
+
|
|
126
|
+
GPU telemetry data, if available, is in the ``gpu`` field. Structure depends on vendor.
|
|
127
|
+
|
|
128
|
+
**Common Fields**
|
|
129
|
+
|
|
130
|
+
- **gpu_ix**: GPU index (int)
|
|
131
|
+
- **used**: Memory used (bytes)
|
|
132
|
+
- **temperature**: Dictionary or integer temperature
|
|
133
|
+
- **power**: Dictionary or value of power usage
|
|
134
|
+
- **id**: Device UUID
|
|
135
|
+
- **name**: GPU name (NVIDIA only)
|
|
136
|
+
- **activity**: GPU activity percentage (AMD only)
|
|
137
|
+
- **others**: Clock/performance data (AMD only)
|
|
138
|
+
|
|
139
|
+
**AMD GPU**
|
|
140
|
+
|
|
141
|
+
- **temperature**: edge, hotspot, mem, vrgfx, vrmem, hbm, fan_speed
|
|
142
|
+
- **power**: average_socket_power, energy_accumulator
|
|
143
|
+
- **others**: current_gfxclk, current_socclk, current_uclk, current_vclk0, current_dclk0
|
|
144
|
+
|
|
145
|
+
**NVIDIA GPU**
|
|
146
|
+
|
|
147
|
+
- **temperature**: Celsius value
|
|
148
|
+
- **power**: Milliwatts usage
|
|
149
|
+
- **used**: Memory used (bytes)
|
|
150
|
+
- **name**: Model name
|
|
151
|
+
- **id**: Device UUID
|
|
152
|
+
|
|
153
|
+
Notes
|
|
154
|
+
-----
|
|
155
|
+
|
|
156
|
+
Telemetry values vary depending on system capabilities, GPU vendor APIs,
|
|
157
|
+
and what is enabled in the configuration.
|
|
@@ -65,8 +65,14 @@ mlflow = ["mlflow-skinny", "SQLAlchemy", "alembic", "watchdog", "cryptography"]
|
|
|
65
65
|
nvidia = ["nvidia-ml-py"]
|
|
66
66
|
mqtt = ["paho-mqtt"]
|
|
67
67
|
tensorboard = ["tensorboard", "tensorflow", "tbparse"]
|
|
68
|
-
llm_agent = ["mcp[cli]", "langchain_community", "streamlit", "
|
|
68
|
+
llm_agent = ["mcp[cli]", "langchain_community", "langchain_openai", "streamlit", "PyMuPDF", "matplotlib"]
|
|
69
69
|
llm_google = ["flowcept[llm_agent]", "google-genai"]
|
|
70
|
+
llm_agent_audio = ["flowcept[llm_agent]", "streamlit-mic-recorder", "SpeechRecognition", "pydub", "gTTS"]
|
|
71
|
+
# System dependency (required for pydub)
|
|
72
|
+
# Install ffmpeg on the system (not a pip package):
|
|
73
|
+
# macOS (Homebrew): brew install ffmpeg
|
|
74
|
+
# Conda (any OS): conda install -c conda-forge ffmpeg
|
|
75
|
+
# Debian/Ubuntu: sudo apt-get install ffmpeg
|
|
70
76
|
|
|
71
77
|
dev = [
|
|
72
78
|
"flowcept[docs]",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
flowcept_version: 0.9.
|
|
1
|
+
flowcept_version: 0.9.8 # 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.
|
|
@@ -91,6 +91,7 @@ agent:
|
|
|
91
91
|
model: '?'
|
|
92
92
|
service_provider: '?'
|
|
93
93
|
model_kwargs: {}
|
|
94
|
+
audio_enabled: false
|
|
94
95
|
|
|
95
96
|
databases:
|
|
96
97
|
|
|
@@ -1,76 +1,87 @@
|
|
|
1
1
|
import streamlit as st
|
|
2
|
+
|
|
2
3
|
from flowcept.agents.gui import AI, PAGE_TITLE
|
|
4
|
+
from flowcept.agents.gui.audio_utils import get_audio_text
|
|
3
5
|
from flowcept.agents.gui.gui_utils import (
|
|
4
6
|
query_agent,
|
|
5
7
|
display_ai_msg,
|
|
6
8
|
display_ai_msg_from_tool,
|
|
7
9
|
display_df_tool_response,
|
|
10
|
+
resolve_logo_path,
|
|
11
|
+
render_title_with_logo,
|
|
8
12
|
)
|
|
9
|
-
|
|
10
13
|
from flowcept.agents.tools.in_memory_queries.in_memory_queries_tools import (
|
|
11
14
|
generate_result_df,
|
|
12
15
|
generate_plot_code,
|
|
13
16
|
run_df_code,
|
|
14
17
|
)
|
|
18
|
+
from flowcept.configs import AGENT_AUDIO
|
|
15
19
|
|
|
20
|
+
# ---- Page setup & header with logo ----
|
|
16
21
|
st.set_page_config(page_title=PAGE_TITLE, page_icon=AI)
|
|
17
|
-
|
|
22
|
+
|
|
23
|
+
LOGO_PATH = resolve_logo_path(package="flowcept", resource="docs/img/flowcept-logo.png")
|
|
24
|
+
render_title_with_logo(PAGE_TITLE, LOGO_PATH, logo_width=150, add_to_sidebar=False, debug=False)
|
|
18
25
|
|
|
19
26
|
GREETING = (
|
|
20
|
-
"Hi, there! I'm
|
|
27
|
+
"Hi, there! I'm your **Workflow Provenance Assistant**.\n\n"
|
|
21
28
|
"I am tracking workflow executions and I can:\n"
|
|
22
|
-
"- 🔍
|
|
29
|
+
"- 🔍 Query running workflows\n"
|
|
23
30
|
"- 📊 Plot graphs\n"
|
|
24
31
|
"- 🤖 Answer general questions about provenance data\n\n"
|
|
25
32
|
"How can I help you today?"
|
|
26
33
|
)
|
|
27
|
-
|
|
28
|
-
|
|
29
34
|
display_ai_msg(GREETING)
|
|
30
35
|
|
|
31
|
-
# if "chat_history" not in st.session_state:
|
|
32
|
-
# st.session_state.chat_history = [{"role": "system", "content":GREETING}]
|
|
33
|
-
#
|
|
34
|
-
# for msg in st.session_state.chat_history:
|
|
35
|
-
# with st.chat_message(msg["role"], avatar=AI):
|
|
36
|
-
# st.markdown(msg["content"])
|
|
37
|
-
|
|
38
36
|
|
|
39
37
|
def main():
|
|
40
|
-
"""Main
|
|
38
|
+
"""Main Agent GUI function."""
|
|
39
|
+
st.caption(
|
|
40
|
+
"💡 Tip: Ask about workflow metrics, generate plots, or summarize data. "
|
|
41
|
+
"Inputs are mapped to `used` and outputs to `generated` fields. "
|
|
42
|
+
"Use @record <your query guidance> if you have custom guidance."
|
|
43
|
+
)
|
|
44
|
+
|
|
41
45
|
user_input = st.chat_input("Send a message")
|
|
42
|
-
st.caption("💡 Tip: Ask about workflow metrics, generate plots, or summarize data.")
|
|
43
46
|
|
|
44
47
|
if user_input:
|
|
45
|
-
|
|
48
|
+
st.session_state["speak_reply"] = False
|
|
49
|
+
|
|
50
|
+
if AGENT_AUDIO:
|
|
51
|
+
user_input = get_audio_text(user_input)
|
|
46
52
|
|
|
53
|
+
if user_input:
|
|
47
54
|
with st.chat_message("human"):
|
|
48
55
|
st.markdown(user_input)
|
|
49
56
|
|
|
50
57
|
try:
|
|
51
58
|
with st.spinner("🤖 Thinking..."):
|
|
52
59
|
tool_result = query_agent(user_input)
|
|
53
|
-
print(tool_result)
|
|
54
60
|
|
|
55
61
|
if tool_result.result_is_str():
|
|
56
62
|
display_ai_msg_from_tool(tool_result)
|
|
63
|
+
|
|
57
64
|
elif tool_result.is_success_dict():
|
|
58
65
|
tool_name = tool_result.tool_name
|
|
59
|
-
if tool_name in
|
|
66
|
+
if tool_name in (
|
|
67
|
+
generate_result_df.__name__,
|
|
68
|
+
generate_plot_code.__name__,
|
|
69
|
+
run_df_code.__name__,
|
|
70
|
+
):
|
|
60
71
|
display_df_tool_response(tool_result)
|
|
61
72
|
else:
|
|
62
73
|
display_ai_msg(f"⚠️ Received unexpected response from agent: {tool_result}")
|
|
63
74
|
st.stop()
|
|
64
75
|
else:
|
|
65
76
|
display_df_tool_response(tool_result)
|
|
66
|
-
# display_ai_msg(f"⚠️ Received unexpected response from agent: {tool_result}")
|
|
67
77
|
st.stop()
|
|
68
78
|
|
|
69
79
|
except Exception as e:
|
|
70
80
|
display_ai_msg(f"❌ Error talking to MCP agent:\n\n```text\n{e}\n```")
|
|
71
81
|
st.stop()
|
|
72
82
|
|
|
73
|
-
# st.session_state.chat_history.append({"role": "system", "content": agent_reply})
|
|
74
83
|
|
|
84
|
+
if "speak_reply" not in st.session_state:
|
|
85
|
+
st.session_state["speak_reply"] = False
|
|
75
86
|
|
|
76
87
|
main()
|