genesis-flow 1.0.0__py3-none-any.whl
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.
- genesis_flow-1.0.0.dist-info/METADATA +822 -0
- genesis_flow-1.0.0.dist-info/RECORD +645 -0
- genesis_flow-1.0.0.dist-info/WHEEL +5 -0
- genesis_flow-1.0.0.dist-info/entry_points.txt +19 -0
- genesis_flow-1.0.0.dist-info/licenses/LICENSE.txt +202 -0
- genesis_flow-1.0.0.dist-info/top_level.txt +1 -0
- mlflow/__init__.py +367 -0
- mlflow/__main__.py +3 -0
- mlflow/ag2/__init__.py +56 -0
- mlflow/ag2/ag2_logger.py +294 -0
- mlflow/anthropic/__init__.py +40 -0
- mlflow/anthropic/autolog.py +129 -0
- mlflow/anthropic/chat.py +144 -0
- mlflow/artifacts/__init__.py +268 -0
- mlflow/autogen/__init__.py +144 -0
- mlflow/autogen/chat.py +142 -0
- mlflow/azure/__init__.py +26 -0
- mlflow/azure/auth_handler.py +257 -0
- mlflow/azure/client.py +319 -0
- mlflow/azure/config.py +120 -0
- mlflow/azure/connection_factory.py +340 -0
- mlflow/azure/exceptions.py +27 -0
- mlflow/azure/stores.py +327 -0
- mlflow/azure/utils.py +183 -0
- mlflow/bedrock/__init__.py +45 -0
- mlflow/bedrock/_autolog.py +202 -0
- mlflow/bedrock/chat.py +122 -0
- mlflow/bedrock/stream.py +160 -0
- mlflow/bedrock/utils.py +43 -0
- mlflow/cli.py +707 -0
- mlflow/client.py +12 -0
- mlflow/config/__init__.py +56 -0
- mlflow/crewai/__init__.py +79 -0
- mlflow/crewai/autolog.py +253 -0
- mlflow/crewai/chat.py +29 -0
- mlflow/data/__init__.py +75 -0
- mlflow/data/artifact_dataset_sources.py +170 -0
- mlflow/data/code_dataset_source.py +40 -0
- mlflow/data/dataset.py +123 -0
- mlflow/data/dataset_registry.py +168 -0
- mlflow/data/dataset_source.py +110 -0
- mlflow/data/dataset_source_registry.py +219 -0
- mlflow/data/delta_dataset_source.py +167 -0
- mlflow/data/digest_utils.py +108 -0
- mlflow/data/evaluation_dataset.py +562 -0
- mlflow/data/filesystem_dataset_source.py +81 -0
- mlflow/data/http_dataset_source.py +145 -0
- mlflow/data/huggingface_dataset.py +258 -0
- mlflow/data/huggingface_dataset_source.py +118 -0
- mlflow/data/meta_dataset.py +104 -0
- mlflow/data/numpy_dataset.py +223 -0
- mlflow/data/pandas_dataset.py +231 -0
- mlflow/data/polars_dataset.py +352 -0
- mlflow/data/pyfunc_dataset_mixin.py +31 -0
- mlflow/data/schema.py +76 -0
- mlflow/data/sources.py +1 -0
- mlflow/data/spark_dataset.py +406 -0
- mlflow/data/spark_dataset_source.py +74 -0
- mlflow/data/spark_delta_utils.py +118 -0
- mlflow/data/tensorflow_dataset.py +350 -0
- mlflow/data/uc_volume_dataset_source.py +81 -0
- mlflow/db.py +27 -0
- mlflow/dspy/__init__.py +17 -0
- mlflow/dspy/autolog.py +197 -0
- mlflow/dspy/callback.py +398 -0
- mlflow/dspy/constant.py +1 -0
- mlflow/dspy/load.py +93 -0
- mlflow/dspy/save.py +393 -0
- mlflow/dspy/util.py +109 -0
- mlflow/dspy/wrapper.py +226 -0
- mlflow/entities/__init__.py +104 -0
- mlflow/entities/_mlflow_object.py +52 -0
- mlflow/entities/assessment.py +545 -0
- mlflow/entities/assessment_error.py +80 -0
- mlflow/entities/assessment_source.py +141 -0
- mlflow/entities/dataset.py +92 -0
- mlflow/entities/dataset_input.py +51 -0
- mlflow/entities/dataset_summary.py +62 -0
- mlflow/entities/document.py +48 -0
- mlflow/entities/experiment.py +109 -0
- mlflow/entities/experiment_tag.py +35 -0
- mlflow/entities/file_info.py +45 -0
- mlflow/entities/input_tag.py +35 -0
- mlflow/entities/lifecycle_stage.py +35 -0
- mlflow/entities/logged_model.py +228 -0
- mlflow/entities/logged_model_input.py +26 -0
- mlflow/entities/logged_model_output.py +32 -0
- mlflow/entities/logged_model_parameter.py +46 -0
- mlflow/entities/logged_model_status.py +74 -0
- mlflow/entities/logged_model_tag.py +33 -0
- mlflow/entities/metric.py +200 -0
- mlflow/entities/model_registry/__init__.py +29 -0
- mlflow/entities/model_registry/_model_registry_entity.py +13 -0
- mlflow/entities/model_registry/model_version.py +243 -0
- mlflow/entities/model_registry/model_version_deployment_job_run_state.py +44 -0
- mlflow/entities/model_registry/model_version_deployment_job_state.py +70 -0
- mlflow/entities/model_registry/model_version_search.py +25 -0
- mlflow/entities/model_registry/model_version_stages.py +25 -0
- mlflow/entities/model_registry/model_version_status.py +35 -0
- mlflow/entities/model_registry/model_version_tag.py +35 -0
- mlflow/entities/model_registry/prompt.py +73 -0
- mlflow/entities/model_registry/prompt_version.py +244 -0
- mlflow/entities/model_registry/registered_model.py +175 -0
- mlflow/entities/model_registry/registered_model_alias.py +35 -0
- mlflow/entities/model_registry/registered_model_deployment_job_state.py +39 -0
- mlflow/entities/model_registry/registered_model_search.py +25 -0
- mlflow/entities/model_registry/registered_model_tag.py +35 -0
- mlflow/entities/multipart_upload.py +74 -0
- mlflow/entities/param.py +49 -0
- mlflow/entities/run.py +97 -0
- mlflow/entities/run_data.py +84 -0
- mlflow/entities/run_info.py +188 -0
- mlflow/entities/run_inputs.py +59 -0
- mlflow/entities/run_outputs.py +43 -0
- mlflow/entities/run_status.py +41 -0
- mlflow/entities/run_tag.py +36 -0
- mlflow/entities/source_type.py +31 -0
- mlflow/entities/span.py +774 -0
- mlflow/entities/span_event.py +96 -0
- mlflow/entities/span_status.py +102 -0
- mlflow/entities/trace.py +317 -0
- mlflow/entities/trace_data.py +71 -0
- mlflow/entities/trace_info.py +220 -0
- mlflow/entities/trace_info_v2.py +162 -0
- mlflow/entities/trace_location.py +173 -0
- mlflow/entities/trace_state.py +39 -0
- mlflow/entities/trace_status.py +68 -0
- mlflow/entities/view_type.py +51 -0
- mlflow/environment_variables.py +866 -0
- mlflow/evaluation/__init__.py +16 -0
- mlflow/evaluation/assessment.py +369 -0
- mlflow/evaluation/evaluation.py +411 -0
- mlflow/evaluation/evaluation_tag.py +61 -0
- mlflow/evaluation/fluent.py +48 -0
- mlflow/evaluation/utils.py +201 -0
- mlflow/exceptions.py +213 -0
- mlflow/experiments.py +140 -0
- mlflow/gemini/__init__.py +81 -0
- mlflow/gemini/autolog.py +186 -0
- mlflow/gemini/chat.py +261 -0
- mlflow/genai/__init__.py +71 -0
- mlflow/genai/datasets/__init__.py +67 -0
- mlflow/genai/datasets/evaluation_dataset.py +131 -0
- mlflow/genai/evaluation/__init__.py +3 -0
- mlflow/genai/evaluation/base.py +411 -0
- mlflow/genai/evaluation/constant.py +23 -0
- mlflow/genai/evaluation/utils.py +244 -0
- mlflow/genai/judges/__init__.py +21 -0
- mlflow/genai/judges/databricks.py +404 -0
- mlflow/genai/label_schemas/__init__.py +153 -0
- mlflow/genai/label_schemas/label_schemas.py +209 -0
- mlflow/genai/labeling/__init__.py +159 -0
- mlflow/genai/labeling/labeling.py +250 -0
- mlflow/genai/optimize/__init__.py +13 -0
- mlflow/genai/optimize/base.py +198 -0
- mlflow/genai/optimize/optimizers/__init__.py +4 -0
- mlflow/genai/optimize/optimizers/base_optimizer.py +38 -0
- mlflow/genai/optimize/optimizers/dspy_mipro_optimizer.py +221 -0
- mlflow/genai/optimize/optimizers/dspy_optimizer.py +91 -0
- mlflow/genai/optimize/optimizers/utils/dspy_mipro_callback.py +76 -0
- mlflow/genai/optimize/optimizers/utils/dspy_mipro_utils.py +18 -0
- mlflow/genai/optimize/types.py +75 -0
- mlflow/genai/optimize/util.py +30 -0
- mlflow/genai/prompts/__init__.py +206 -0
- mlflow/genai/scheduled_scorers.py +431 -0
- mlflow/genai/scorers/__init__.py +26 -0
- mlflow/genai/scorers/base.py +492 -0
- mlflow/genai/scorers/builtin_scorers.py +765 -0
- mlflow/genai/scorers/scorer_utils.py +138 -0
- mlflow/genai/scorers/validation.py +165 -0
- mlflow/genai/utils/data_validation.py +146 -0
- mlflow/genai/utils/enum_utils.py +23 -0
- mlflow/genai/utils/trace_utils.py +211 -0
- mlflow/groq/__init__.py +42 -0
- mlflow/groq/_groq_autolog.py +74 -0
- mlflow/johnsnowlabs/__init__.py +888 -0
- mlflow/langchain/__init__.py +24 -0
- mlflow/langchain/api_request_parallel_processor.py +330 -0
- mlflow/langchain/autolog.py +147 -0
- mlflow/langchain/chat_agent_langgraph.py +340 -0
- mlflow/langchain/constant.py +1 -0
- mlflow/langchain/constants.py +1 -0
- mlflow/langchain/databricks_dependencies.py +444 -0
- mlflow/langchain/langchain_tracer.py +597 -0
- mlflow/langchain/model.py +919 -0
- mlflow/langchain/output_parsers.py +142 -0
- mlflow/langchain/retriever_chain.py +153 -0
- mlflow/langchain/runnables.py +527 -0
- mlflow/langchain/utils/chat.py +402 -0
- mlflow/langchain/utils/logging.py +671 -0
- mlflow/langchain/utils/serialization.py +36 -0
- mlflow/legacy_databricks_cli/__init__.py +0 -0
- mlflow/legacy_databricks_cli/configure/__init__.py +0 -0
- mlflow/legacy_databricks_cli/configure/provider.py +482 -0
- mlflow/litellm/__init__.py +175 -0
- mlflow/llama_index/__init__.py +22 -0
- mlflow/llama_index/autolog.py +55 -0
- mlflow/llama_index/chat.py +43 -0
- mlflow/llama_index/constant.py +1 -0
- mlflow/llama_index/model.py +577 -0
- mlflow/llama_index/pyfunc_wrapper.py +332 -0
- mlflow/llama_index/serialize_objects.py +188 -0
- mlflow/llama_index/tracer.py +561 -0
- mlflow/metrics/__init__.py +479 -0
- mlflow/metrics/base.py +39 -0
- mlflow/metrics/genai/__init__.py +25 -0
- mlflow/metrics/genai/base.py +101 -0
- mlflow/metrics/genai/genai_metric.py +771 -0
- mlflow/metrics/genai/metric_definitions.py +450 -0
- mlflow/metrics/genai/model_utils.py +371 -0
- mlflow/metrics/genai/prompt_template.py +68 -0
- mlflow/metrics/genai/prompts/__init__.py +0 -0
- mlflow/metrics/genai/prompts/v1.py +422 -0
- mlflow/metrics/genai/utils.py +6 -0
- mlflow/metrics/metric_definitions.py +619 -0
- mlflow/mismatch.py +34 -0
- mlflow/mistral/__init__.py +34 -0
- mlflow/mistral/autolog.py +71 -0
- mlflow/mistral/chat.py +135 -0
- mlflow/ml_package_versions.py +452 -0
- mlflow/models/__init__.py +97 -0
- mlflow/models/auth_policy.py +83 -0
- mlflow/models/cli.py +354 -0
- mlflow/models/container/__init__.py +294 -0
- mlflow/models/container/scoring_server/__init__.py +0 -0
- mlflow/models/container/scoring_server/nginx.conf +39 -0
- mlflow/models/dependencies_schemas.py +287 -0
- mlflow/models/display_utils.py +158 -0
- mlflow/models/docker_utils.py +211 -0
- mlflow/models/evaluation/__init__.py +23 -0
- mlflow/models/evaluation/_shap_patch.py +64 -0
- mlflow/models/evaluation/artifacts.py +194 -0
- mlflow/models/evaluation/base.py +1811 -0
- mlflow/models/evaluation/calibration_curve.py +109 -0
- mlflow/models/evaluation/default_evaluator.py +996 -0
- mlflow/models/evaluation/deprecated.py +23 -0
- mlflow/models/evaluation/evaluator_registry.py +80 -0
- mlflow/models/evaluation/evaluators/classifier.py +704 -0
- mlflow/models/evaluation/evaluators/default.py +233 -0
- mlflow/models/evaluation/evaluators/regressor.py +96 -0
- mlflow/models/evaluation/evaluators/shap.py +296 -0
- mlflow/models/evaluation/lift_curve.py +178 -0
- mlflow/models/evaluation/utils/metric.py +123 -0
- mlflow/models/evaluation/utils/trace.py +179 -0
- mlflow/models/evaluation/validation.py +434 -0
- mlflow/models/flavor_backend.py +93 -0
- mlflow/models/flavor_backend_registry.py +53 -0
- mlflow/models/model.py +1639 -0
- mlflow/models/model_config.py +150 -0
- mlflow/models/notebook_resources/agent_evaluation_template.html +235 -0
- mlflow/models/notebook_resources/eval_with_dataset_example.py +22 -0
- mlflow/models/notebook_resources/eval_with_synthetic_example.py +22 -0
- mlflow/models/python_api.py +369 -0
- mlflow/models/rag_signatures.py +128 -0
- mlflow/models/resources.py +321 -0
- mlflow/models/signature.py +662 -0
- mlflow/models/utils.py +2054 -0
- mlflow/models/wheeled_model.py +280 -0
- mlflow/openai/__init__.py +57 -0
- mlflow/openai/_agent_tracer.py +364 -0
- mlflow/openai/api_request_parallel_processor.py +131 -0
- mlflow/openai/autolog.py +509 -0
- mlflow/openai/constant.py +1 -0
- mlflow/openai/model.py +824 -0
- mlflow/openai/utils/chat_schema.py +367 -0
- mlflow/optuna/__init__.py +3 -0
- mlflow/optuna/storage.py +646 -0
- mlflow/plugins/__init__.py +72 -0
- mlflow/plugins/base.py +358 -0
- mlflow/plugins/builtin/__init__.py +24 -0
- mlflow/plugins/builtin/pytorch_plugin.py +150 -0
- mlflow/plugins/builtin/sklearn_plugin.py +158 -0
- mlflow/plugins/builtin/transformers_plugin.py +187 -0
- mlflow/plugins/cli.py +321 -0
- mlflow/plugins/discovery.py +340 -0
- mlflow/plugins/manager.py +465 -0
- mlflow/plugins/registry.py +316 -0
- mlflow/plugins/templates/framework_plugin_template.py +329 -0
- mlflow/prompt/constants.py +20 -0
- mlflow/prompt/promptlab_model.py +197 -0
- mlflow/prompt/registry_utils.py +248 -0
- mlflow/promptflow/__init__.py +495 -0
- mlflow/protos/__init__.py +0 -0
- mlflow/protos/assessments_pb2.py +174 -0
- mlflow/protos/databricks_artifacts_pb2.py +489 -0
- mlflow/protos/databricks_filesystem_service_pb2.py +196 -0
- mlflow/protos/databricks_managed_catalog_messages_pb2.py +95 -0
- mlflow/protos/databricks_managed_catalog_service_pb2.py +86 -0
- mlflow/protos/databricks_pb2.py +267 -0
- mlflow/protos/databricks_trace_server_pb2.py +374 -0
- mlflow/protos/databricks_uc_registry_messages_pb2.py +1249 -0
- mlflow/protos/databricks_uc_registry_service_pb2.py +170 -0
- mlflow/protos/facet_feature_statistics_pb2.py +296 -0
- mlflow/protos/internal_pb2.py +77 -0
- mlflow/protos/mlflow_artifacts_pb2.py +336 -0
- mlflow/protos/model_registry_pb2.py +1073 -0
- mlflow/protos/scalapb/__init__.py +0 -0
- mlflow/protos/scalapb/scalapb_pb2.py +104 -0
- mlflow/protos/service_pb2.py +2600 -0
- mlflow/protos/unity_catalog_oss_messages_pb2.py +457 -0
- mlflow/protos/unity_catalog_oss_service_pb2.py +130 -0
- mlflow/protos/unity_catalog_prompt_messages_pb2.py +447 -0
- mlflow/protos/unity_catalog_prompt_messages_pb2_grpc.py +24 -0
- mlflow/protos/unity_catalog_prompt_service_pb2.py +164 -0
- mlflow/protos/unity_catalog_prompt_service_pb2_grpc.py +785 -0
- mlflow/py.typed +0 -0
- mlflow/pydantic_ai/__init__.py +57 -0
- mlflow/pydantic_ai/autolog.py +173 -0
- mlflow/pyfunc/__init__.py +3844 -0
- mlflow/pyfunc/_mlflow_pyfunc_backend_predict.py +61 -0
- mlflow/pyfunc/backend.py +523 -0
- mlflow/pyfunc/context.py +78 -0
- mlflow/pyfunc/dbconnect_artifact_cache.py +144 -0
- mlflow/pyfunc/loaders/__init__.py +7 -0
- mlflow/pyfunc/loaders/chat_agent.py +117 -0
- mlflow/pyfunc/loaders/chat_model.py +125 -0
- mlflow/pyfunc/loaders/code_model.py +31 -0
- mlflow/pyfunc/loaders/responses_agent.py +112 -0
- mlflow/pyfunc/mlserver.py +46 -0
- mlflow/pyfunc/model.py +1473 -0
- mlflow/pyfunc/scoring_server/__init__.py +604 -0
- mlflow/pyfunc/scoring_server/app.py +7 -0
- mlflow/pyfunc/scoring_server/client.py +146 -0
- mlflow/pyfunc/spark_model_cache.py +48 -0
- mlflow/pyfunc/stdin_server.py +44 -0
- mlflow/pyfunc/utils/__init__.py +3 -0
- mlflow/pyfunc/utils/data_validation.py +224 -0
- mlflow/pyfunc/utils/environment.py +22 -0
- mlflow/pyfunc/utils/input_converter.py +47 -0
- mlflow/pyfunc/utils/serving_data_parser.py +11 -0
- mlflow/pytorch/__init__.py +1171 -0
- mlflow/pytorch/_lightning_autolog.py +580 -0
- mlflow/pytorch/_pytorch_autolog.py +50 -0
- mlflow/pytorch/pickle_module.py +35 -0
- mlflow/rfunc/__init__.py +42 -0
- mlflow/rfunc/backend.py +134 -0
- mlflow/runs.py +89 -0
- mlflow/server/__init__.py +302 -0
- mlflow/server/auth/__init__.py +1224 -0
- mlflow/server/auth/__main__.py +4 -0
- mlflow/server/auth/basic_auth.ini +6 -0
- mlflow/server/auth/cli.py +11 -0
- mlflow/server/auth/client.py +537 -0
- mlflow/server/auth/config.py +34 -0
- mlflow/server/auth/db/__init__.py +0 -0
- mlflow/server/auth/db/cli.py +18 -0
- mlflow/server/auth/db/migrations/__init__.py +0 -0
- mlflow/server/auth/db/migrations/alembic.ini +110 -0
- mlflow/server/auth/db/migrations/env.py +76 -0
- mlflow/server/auth/db/migrations/versions/8606fa83a998_initial_migration.py +51 -0
- mlflow/server/auth/db/migrations/versions/__init__.py +0 -0
- mlflow/server/auth/db/models.py +67 -0
- mlflow/server/auth/db/utils.py +37 -0
- mlflow/server/auth/entities.py +165 -0
- mlflow/server/auth/logo.py +14 -0
- mlflow/server/auth/permissions.py +65 -0
- mlflow/server/auth/routes.py +18 -0
- mlflow/server/auth/sqlalchemy_store.py +263 -0
- mlflow/server/graphql/__init__.py +0 -0
- mlflow/server/graphql/autogenerated_graphql_schema.py +353 -0
- mlflow/server/graphql/graphql_custom_scalars.py +24 -0
- mlflow/server/graphql/graphql_errors.py +15 -0
- mlflow/server/graphql/graphql_no_batching.py +89 -0
- mlflow/server/graphql/graphql_schema_extensions.py +74 -0
- mlflow/server/handlers.py +3217 -0
- mlflow/server/prometheus_exporter.py +17 -0
- mlflow/server/validation.py +30 -0
- mlflow/shap/__init__.py +691 -0
- mlflow/sklearn/__init__.py +1994 -0
- mlflow/sklearn/utils.py +1041 -0
- mlflow/smolagents/__init__.py +66 -0
- mlflow/smolagents/autolog.py +139 -0
- mlflow/smolagents/chat.py +29 -0
- mlflow/store/__init__.py +10 -0
- mlflow/store/_unity_catalog/__init__.py +1 -0
- mlflow/store/_unity_catalog/lineage/__init__.py +1 -0
- mlflow/store/_unity_catalog/lineage/constants.py +2 -0
- mlflow/store/_unity_catalog/registry/__init__.py +6 -0
- mlflow/store/_unity_catalog/registry/prompt_info.py +75 -0
- mlflow/store/_unity_catalog/registry/rest_store.py +1740 -0
- mlflow/store/_unity_catalog/registry/uc_oss_rest_store.py +507 -0
- mlflow/store/_unity_catalog/registry/utils.py +121 -0
- mlflow/store/artifact/__init__.py +0 -0
- mlflow/store/artifact/artifact_repo.py +472 -0
- mlflow/store/artifact/artifact_repository_registry.py +154 -0
- mlflow/store/artifact/azure_blob_artifact_repo.py +275 -0
- mlflow/store/artifact/azure_data_lake_artifact_repo.py +295 -0
- mlflow/store/artifact/cli.py +141 -0
- mlflow/store/artifact/cloud_artifact_repo.py +332 -0
- mlflow/store/artifact/databricks_artifact_repo.py +729 -0
- mlflow/store/artifact/databricks_artifact_repo_resources.py +301 -0
- mlflow/store/artifact/databricks_logged_model_artifact_repo.py +93 -0
- mlflow/store/artifact/databricks_models_artifact_repo.py +216 -0
- mlflow/store/artifact/databricks_sdk_artifact_repo.py +134 -0
- mlflow/store/artifact/databricks_sdk_models_artifact_repo.py +97 -0
- mlflow/store/artifact/dbfs_artifact_repo.py +240 -0
- mlflow/store/artifact/ftp_artifact_repo.py +132 -0
- mlflow/store/artifact/gcs_artifact_repo.py +296 -0
- mlflow/store/artifact/hdfs_artifact_repo.py +209 -0
- mlflow/store/artifact/http_artifact_repo.py +218 -0
- mlflow/store/artifact/local_artifact_repo.py +142 -0
- mlflow/store/artifact/mlflow_artifacts_repo.py +94 -0
- mlflow/store/artifact/models_artifact_repo.py +259 -0
- mlflow/store/artifact/optimized_s3_artifact_repo.py +356 -0
- mlflow/store/artifact/presigned_url_artifact_repo.py +173 -0
- mlflow/store/artifact/r2_artifact_repo.py +70 -0
- mlflow/store/artifact/runs_artifact_repo.py +265 -0
- mlflow/store/artifact/s3_artifact_repo.py +330 -0
- mlflow/store/artifact/sftp_artifact_repo.py +141 -0
- mlflow/store/artifact/uc_volume_artifact_repo.py +76 -0
- mlflow/store/artifact/unity_catalog_models_artifact_repo.py +168 -0
- mlflow/store/artifact/unity_catalog_oss_models_artifact_repo.py +168 -0
- mlflow/store/artifact/utils/__init__.py +0 -0
- mlflow/store/artifact/utils/models.py +148 -0
- mlflow/store/db/__init__.py +0 -0
- mlflow/store/db/base_sql_model.py +3 -0
- mlflow/store/db/db_types.py +10 -0
- mlflow/store/db/utils.py +314 -0
- mlflow/store/db_migrations/__init__.py +0 -0
- mlflow/store/db_migrations/alembic.ini +74 -0
- mlflow/store/db_migrations/env.py +84 -0
- mlflow/store/db_migrations/versions/0584bdc529eb_add_cascading_deletion_to_datasets_from_experiments.py +88 -0
- mlflow/store/db_migrations/versions/0a8213491aaa_drop_duplicate_killed_constraint.py +49 -0
- mlflow/store/db_migrations/versions/0c779009ac13_add_deleted_time_field_to_runs_table.py +24 -0
- mlflow/store/db_migrations/versions/181f10493468_allow_nulls_for_metric_values.py +35 -0
- mlflow/store/db_migrations/versions/27a6a02d2cf1_add_model_version_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/2b4d017a5e9b_add_model_registry_tables_to_db.py +77 -0
- mlflow/store/db_migrations/versions/2d6e25af4d3e_increase_max_param_val_length.py +33 -0
- mlflow/store/db_migrations/versions/3500859a5d39_add_model_aliases_table.py +50 -0
- mlflow/store/db_migrations/versions/39d1c3be5f05_add_is_nan_constraint_for_metrics_tables_if_necessary.py +41 -0
- mlflow/store/db_migrations/versions/400f98739977_add_logged_model_tables.py +123 -0
- mlflow/store/db_migrations/versions/4465047574b1_increase_max_dataset_schema_size.py +38 -0
- mlflow/store/db_migrations/versions/451aebb31d03_add_metric_step.py +35 -0
- mlflow/store/db_migrations/versions/5b0e9adcef9c_add_cascade_deletion_to_trace_tables_fk.py +40 -0
- mlflow/store/db_migrations/versions/6953534de441_add_step_to_inputs_table.py +25 -0
- mlflow/store/db_migrations/versions/728d730b5ebd_add_registered_model_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/7ac759974ad8_update_run_tags_with_larger_limit.py +36 -0
- mlflow/store/db_migrations/versions/7f2a7d5fae7d_add_datasets_inputs_input_tags_tables.py +82 -0
- mlflow/store/db_migrations/versions/84291f40a231_add_run_link_to_model_version.py +26 -0
- mlflow/store/db_migrations/versions/867495a8f9d4_add_trace_tables.py +90 -0
- mlflow/store/db_migrations/versions/89d4b8295536_create_latest_metrics_table.py +169 -0
- mlflow/store/db_migrations/versions/90e64c465722_migrate_user_column_to_tags.py +64 -0
- mlflow/store/db_migrations/versions/97727af70f4d_creation_time_last_update_time_experiments.py +25 -0
- mlflow/store/db_migrations/versions/__init__.py +0 -0
- mlflow/store/db_migrations/versions/a8c4a736bde6_allow_nulls_for_run_id.py +27 -0
- mlflow/store/db_migrations/versions/acf3f17fdcc7_add_storage_location_field_to_model_.py +29 -0
- mlflow/store/db_migrations/versions/bd07f7e963c5_create_index_on_run_uuid.py +26 -0
- mlflow/store/db_migrations/versions/bda7b8c39065_increase_model_version_tag_value_limit.py +38 -0
- mlflow/store/db_migrations/versions/c48cb773bb87_reset_default_value_for_is_nan_in_metrics_table_for_mysql.py +41 -0
- mlflow/store/db_migrations/versions/cbc13b556ace_add_v3_trace_schema_columns.py +31 -0
- mlflow/store/db_migrations/versions/cc1f77228345_change_param_value_length_to_500.py +34 -0
- mlflow/store/db_migrations/versions/cfd24bdc0731_update_run_status_constraint_with_killed.py +78 -0
- mlflow/store/db_migrations/versions/df50e92ffc5e_add_experiment_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/f5a4f2784254_increase_run_tag_value_limit.py +36 -0
- mlflow/store/entities/__init__.py +3 -0
- mlflow/store/entities/paged_list.py +18 -0
- mlflow/store/model_registry/__init__.py +10 -0
- mlflow/store/model_registry/abstract_store.py +1081 -0
- mlflow/store/model_registry/base_rest_store.py +44 -0
- mlflow/store/model_registry/databricks_workspace_model_registry_rest_store.py +37 -0
- mlflow/store/model_registry/dbmodels/__init__.py +0 -0
- mlflow/store/model_registry/dbmodels/models.py +206 -0
- mlflow/store/model_registry/file_store.py +1091 -0
- mlflow/store/model_registry/rest_store.py +481 -0
- mlflow/store/model_registry/sqlalchemy_store.py +1286 -0
- mlflow/store/tracking/__init__.py +23 -0
- mlflow/store/tracking/abstract_store.py +816 -0
- mlflow/store/tracking/dbmodels/__init__.py +0 -0
- mlflow/store/tracking/dbmodels/initial_models.py +243 -0
- mlflow/store/tracking/dbmodels/models.py +1073 -0
- mlflow/store/tracking/file_store.py +2438 -0
- mlflow/store/tracking/postgres_managed_identity.py +146 -0
- mlflow/store/tracking/rest_store.py +1131 -0
- mlflow/store/tracking/sqlalchemy_store.py +2785 -0
- mlflow/system_metrics/__init__.py +61 -0
- mlflow/system_metrics/metrics/__init__.py +0 -0
- mlflow/system_metrics/metrics/base_metrics_monitor.py +32 -0
- mlflow/system_metrics/metrics/cpu_monitor.py +23 -0
- mlflow/system_metrics/metrics/disk_monitor.py +21 -0
- mlflow/system_metrics/metrics/gpu_monitor.py +71 -0
- mlflow/system_metrics/metrics/network_monitor.py +34 -0
- mlflow/system_metrics/metrics/rocm_monitor.py +123 -0
- mlflow/system_metrics/system_metrics_monitor.py +198 -0
- mlflow/tracing/__init__.py +16 -0
- mlflow/tracing/assessment.py +356 -0
- mlflow/tracing/client.py +531 -0
- mlflow/tracing/config.py +125 -0
- mlflow/tracing/constant.py +105 -0
- mlflow/tracing/destination.py +81 -0
- mlflow/tracing/display/__init__.py +40 -0
- mlflow/tracing/display/display_handler.py +196 -0
- mlflow/tracing/export/async_export_queue.py +186 -0
- mlflow/tracing/export/inference_table.py +138 -0
- mlflow/tracing/export/mlflow_v3.py +137 -0
- mlflow/tracing/export/utils.py +70 -0
- mlflow/tracing/fluent.py +1417 -0
- mlflow/tracing/processor/base_mlflow.py +199 -0
- mlflow/tracing/processor/inference_table.py +175 -0
- mlflow/tracing/processor/mlflow_v3.py +47 -0
- mlflow/tracing/processor/otel.py +73 -0
- mlflow/tracing/provider.py +487 -0
- mlflow/tracing/trace_manager.py +200 -0
- mlflow/tracing/utils/__init__.py +616 -0
- mlflow/tracing/utils/artifact_utils.py +28 -0
- mlflow/tracing/utils/copy.py +55 -0
- mlflow/tracing/utils/environment.py +55 -0
- mlflow/tracing/utils/exception.py +21 -0
- mlflow/tracing/utils/once.py +35 -0
- mlflow/tracing/utils/otlp.py +63 -0
- mlflow/tracing/utils/processor.py +54 -0
- mlflow/tracing/utils/search.py +292 -0
- mlflow/tracing/utils/timeout.py +250 -0
- mlflow/tracing/utils/token.py +19 -0
- mlflow/tracing/utils/truncation.py +124 -0
- mlflow/tracing/utils/warning.py +76 -0
- mlflow/tracking/__init__.py +39 -0
- mlflow/tracking/_model_registry/__init__.py +1 -0
- mlflow/tracking/_model_registry/client.py +764 -0
- mlflow/tracking/_model_registry/fluent.py +853 -0
- mlflow/tracking/_model_registry/registry.py +67 -0
- mlflow/tracking/_model_registry/utils.py +251 -0
- mlflow/tracking/_tracking_service/__init__.py +0 -0
- mlflow/tracking/_tracking_service/client.py +883 -0
- mlflow/tracking/_tracking_service/registry.py +56 -0
- mlflow/tracking/_tracking_service/utils.py +275 -0
- mlflow/tracking/artifact_utils.py +179 -0
- mlflow/tracking/client.py +5900 -0
- mlflow/tracking/context/__init__.py +0 -0
- mlflow/tracking/context/abstract_context.py +35 -0
- mlflow/tracking/context/databricks_cluster_context.py +15 -0
- mlflow/tracking/context/databricks_command_context.py +15 -0
- mlflow/tracking/context/databricks_job_context.py +49 -0
- mlflow/tracking/context/databricks_notebook_context.py +41 -0
- mlflow/tracking/context/databricks_repo_context.py +43 -0
- mlflow/tracking/context/default_context.py +51 -0
- mlflow/tracking/context/git_context.py +32 -0
- mlflow/tracking/context/registry.py +98 -0
- mlflow/tracking/context/system_environment_context.py +15 -0
- mlflow/tracking/default_experiment/__init__.py +1 -0
- mlflow/tracking/default_experiment/abstract_context.py +43 -0
- mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py +44 -0
- mlflow/tracking/default_experiment/registry.py +75 -0
- mlflow/tracking/fluent.py +3595 -0
- mlflow/tracking/metric_value_conversion_utils.py +93 -0
- mlflow/tracking/multimedia.py +206 -0
- mlflow/tracking/registry.py +86 -0
- mlflow/tracking/request_auth/__init__.py +0 -0
- mlflow/tracking/request_auth/abstract_request_auth_provider.py +34 -0
- mlflow/tracking/request_auth/registry.py +60 -0
- mlflow/tracking/request_header/__init__.py +0 -0
- mlflow/tracking/request_header/abstract_request_header_provider.py +36 -0
- mlflow/tracking/request_header/databricks_request_header_provider.py +38 -0
- mlflow/tracking/request_header/default_request_header_provider.py +17 -0
- mlflow/tracking/request_header/registry.py +79 -0
- mlflow/transformers/__init__.py +2982 -0
- mlflow/transformers/flavor_config.py +258 -0
- mlflow/transformers/hub_utils.py +83 -0
- mlflow/transformers/llm_inference_utils.py +468 -0
- mlflow/transformers/model_io.py +301 -0
- mlflow/transformers/peft.py +51 -0
- mlflow/transformers/signature.py +183 -0
- mlflow/transformers/torch_utils.py +55 -0
- mlflow/types/__init__.py +21 -0
- mlflow/types/agent.py +270 -0
- mlflow/types/chat.py +240 -0
- mlflow/types/llm.py +935 -0
- mlflow/types/responses.py +139 -0
- mlflow/types/responses_helpers.py +416 -0
- mlflow/types/schema.py +1505 -0
- mlflow/types/type_hints.py +647 -0
- mlflow/types/utils.py +753 -0
- mlflow/utils/__init__.py +283 -0
- mlflow/utils/_capture_modules.py +256 -0
- mlflow/utils/_capture_transformers_modules.py +75 -0
- mlflow/utils/_spark_utils.py +201 -0
- mlflow/utils/_unity_catalog_oss_utils.py +97 -0
- mlflow/utils/_unity_catalog_utils.py +479 -0
- mlflow/utils/annotations.py +218 -0
- mlflow/utils/arguments_utils.py +16 -0
- mlflow/utils/async_logging/__init__.py +1 -0
- mlflow/utils/async_logging/async_artifacts_logging_queue.py +258 -0
- mlflow/utils/async_logging/async_logging_queue.py +366 -0
- mlflow/utils/async_logging/run_artifact.py +38 -0
- mlflow/utils/async_logging/run_batch.py +58 -0
- mlflow/utils/async_logging/run_operations.py +49 -0
- mlflow/utils/autologging_utils/__init__.py +737 -0
- mlflow/utils/autologging_utils/client.py +432 -0
- mlflow/utils/autologging_utils/config.py +33 -0
- mlflow/utils/autologging_utils/events.py +294 -0
- mlflow/utils/autologging_utils/logging_and_warnings.py +328 -0
- mlflow/utils/autologging_utils/metrics_queue.py +71 -0
- mlflow/utils/autologging_utils/safety.py +1104 -0
- mlflow/utils/autologging_utils/versioning.py +95 -0
- mlflow/utils/checkpoint_utils.py +206 -0
- mlflow/utils/class_utils.py +6 -0
- mlflow/utils/cli_args.py +257 -0
- mlflow/utils/conda.py +354 -0
- mlflow/utils/credentials.py +231 -0
- mlflow/utils/data_utils.py +17 -0
- mlflow/utils/databricks_utils.py +1436 -0
- mlflow/utils/docstring_utils.py +477 -0
- mlflow/utils/doctor.py +133 -0
- mlflow/utils/download_cloud_file_chunk.py +43 -0
- mlflow/utils/env_manager.py +16 -0
- mlflow/utils/env_pack.py +131 -0
- mlflow/utils/environment.py +1009 -0
- mlflow/utils/exception_utils.py +14 -0
- mlflow/utils/file_utils.py +978 -0
- mlflow/utils/git_utils.py +77 -0
- mlflow/utils/gorilla.py +797 -0
- mlflow/utils/import_hooks/__init__.py +363 -0
- mlflow/utils/lazy_load.py +51 -0
- mlflow/utils/logging_utils.py +168 -0
- mlflow/utils/mime_type_utils.py +58 -0
- mlflow/utils/mlflow_tags.py +103 -0
- mlflow/utils/model_utils.py +486 -0
- mlflow/utils/name_utils.py +346 -0
- mlflow/utils/nfs_on_spark.py +62 -0
- mlflow/utils/openai_utils.py +164 -0
- mlflow/utils/os.py +12 -0
- mlflow/utils/oss_registry_utils.py +29 -0
- mlflow/utils/plugins.py +17 -0
- mlflow/utils/process.py +182 -0
- mlflow/utils/promptlab_utils.py +146 -0
- mlflow/utils/proto_json_utils.py +743 -0
- mlflow/utils/pydantic_utils.py +54 -0
- mlflow/utils/request_utils.py +279 -0
- mlflow/utils/requirements_utils.py +704 -0
- mlflow/utils/rest_utils.py +673 -0
- mlflow/utils/search_logged_model_utils.py +127 -0
- mlflow/utils/search_utils.py +2111 -0
- mlflow/utils/secure_loading.py +221 -0
- mlflow/utils/security_validation.py +384 -0
- mlflow/utils/server_cli_utils.py +61 -0
- mlflow/utils/spark_utils.py +15 -0
- mlflow/utils/string_utils.py +138 -0
- mlflow/utils/thread_utils.py +63 -0
- mlflow/utils/time.py +54 -0
- mlflow/utils/timeout.py +42 -0
- mlflow/utils/uri.py +572 -0
- mlflow/utils/validation.py +662 -0
- mlflow/utils/virtualenv.py +458 -0
- mlflow/utils/warnings_utils.py +25 -0
- mlflow/utils/yaml_utils.py +179 -0
- mlflow/version.py +24 -0
mlflow/client.py
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
"""
|
2
|
+
The ``mlflow.client`` module provides a Python CRUD interface to MLflow Experiments, Runs,
|
3
|
+
Model Versions, and Registered Models. This is a lower level API that directly translates to MLflow
|
4
|
+
`REST API <../rest-api.html>`_ calls.
|
5
|
+
For a higher level API for managing an "active run", use the :py:mod:`mlflow` module.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from mlflow.tracking.client import MlflowClient
|
9
|
+
|
10
|
+
__all__ = [
|
11
|
+
"MlflowClient",
|
12
|
+
]
|
@@ -0,0 +1,56 @@
|
|
1
|
+
from mlflow.environment_variables import (
|
2
|
+
MLFLOW_ENABLE_ASYNC_LOGGING,
|
3
|
+
)
|
4
|
+
from mlflow.system_metrics import (
|
5
|
+
disable_system_metrics_logging,
|
6
|
+
enable_system_metrics_logging,
|
7
|
+
set_system_metrics_node_id,
|
8
|
+
set_system_metrics_samples_before_logging,
|
9
|
+
set_system_metrics_sampling_interval,
|
10
|
+
)
|
11
|
+
from mlflow.tracking import (
|
12
|
+
get_registry_uri,
|
13
|
+
get_tracking_uri,
|
14
|
+
is_tracking_uri_set,
|
15
|
+
set_registry_uri,
|
16
|
+
set_tracking_uri,
|
17
|
+
)
|
18
|
+
|
19
|
+
|
20
|
+
def enable_async_logging(enable=True):
|
21
|
+
"""Enable or disable async logging globally.
|
22
|
+
|
23
|
+
Args:
|
24
|
+
enable: bool, if True, enable async logging. If False, disable async logging.
|
25
|
+
|
26
|
+
.. code-block:: python
|
27
|
+
:caption: Example
|
28
|
+
|
29
|
+
import mlflow
|
30
|
+
|
31
|
+
mlflow.config.enable_async_logging(True)
|
32
|
+
|
33
|
+
with mlflow.start_run():
|
34
|
+
mlflow.log_param("a", 1) # This will be logged asynchronously
|
35
|
+
|
36
|
+
mlflow.config.enable_async_logging(False)
|
37
|
+
with mlflow.start_run():
|
38
|
+
mlflow.log_param("a", 1) # This will be logged synchronously
|
39
|
+
"""
|
40
|
+
|
41
|
+
MLFLOW_ENABLE_ASYNC_LOGGING.set(enable)
|
42
|
+
|
43
|
+
|
44
|
+
__all__ = [
|
45
|
+
"enable_system_metrics_logging",
|
46
|
+
"disable_system_metrics_logging",
|
47
|
+
"enable_async_logging",
|
48
|
+
"get_registry_uri",
|
49
|
+
"get_tracking_uri",
|
50
|
+
"is_tracking_uri_set",
|
51
|
+
"set_registry_uri",
|
52
|
+
"set_system_metrics_sampling_interval",
|
53
|
+
"set_system_metrics_samples_before_logging",
|
54
|
+
"set_system_metrics_node_id",
|
55
|
+
"set_tracking_uri",
|
56
|
+
]
|
@@ -0,0 +1,79 @@
|
|
1
|
+
"""
|
2
|
+
The ``mlflow.crewai`` module provides an API for tracing CrewAI AI agents.
|
3
|
+
"""
|
4
|
+
|
5
|
+
import importlib
|
6
|
+
import logging
|
7
|
+
|
8
|
+
from packaging.version import Version
|
9
|
+
|
10
|
+
from mlflow.crewai.autolog import (
|
11
|
+
patched_class_call,
|
12
|
+
)
|
13
|
+
from mlflow.utils.annotations import experimental
|
14
|
+
from mlflow.utils.autologging_utils import autologging_integration, safe_patch
|
15
|
+
|
16
|
+
_logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
FLAVOR_NAME = "crewai"
|
19
|
+
|
20
|
+
|
21
|
+
@experimental(version="2.19.0")
|
22
|
+
@autologging_integration(FLAVOR_NAME)
|
23
|
+
def autolog(
|
24
|
+
log_traces: bool = True,
|
25
|
+
disable: bool = False,
|
26
|
+
silent: bool = False,
|
27
|
+
):
|
28
|
+
"""
|
29
|
+
Enables (or disables) and configures autologging from CrewAI to MLflow.
|
30
|
+
Note that asynchronous APIs and Tool calling are not recorded now.
|
31
|
+
|
32
|
+
Args:
|
33
|
+
log_traces: If ``True``, traces are logged for CrewAI agents.
|
34
|
+
If ``False``, no traces are collected during inference. Default to ``True``.
|
35
|
+
disable: If ``True``, disables the CrewAI autologging. Default to ``False``.
|
36
|
+
silent: If ``True``, suppress all event logs and warnings from MLflow during CrewAI
|
37
|
+
autologging. If ``False``, show all events and warnings.
|
38
|
+
"""
|
39
|
+
# TODO: Handle asynchronous tasks and crew executions
|
40
|
+
# TODO: Tool calling is not supported since the interface of tool in CrewAI is
|
41
|
+
# changing drastically. Add patching once it's stabilized
|
42
|
+
import crewai
|
43
|
+
|
44
|
+
class_method_map = {
|
45
|
+
"crewai.Crew": ["kickoff", "kickoff_for_each", "train"],
|
46
|
+
"crewai.Agent": ["execute_task"],
|
47
|
+
"crewai.Task": ["execute_sync"],
|
48
|
+
"crewai.LLM": ["call"],
|
49
|
+
"crewai.Flow": ["kickoff"],
|
50
|
+
"crewai.agents.agent_builder.base_agent_executor_mixin.CrewAgentExecutorMixin": [
|
51
|
+
"_create_long_term_memory"
|
52
|
+
],
|
53
|
+
}
|
54
|
+
if Version(crewai.__version__) >= Version("0.83.0"):
|
55
|
+
# knowledge and memory are not available before 0.83.0
|
56
|
+
class_method_map.update(
|
57
|
+
{
|
58
|
+
"crewai.memory.ShortTermMemory": ["save", "search"],
|
59
|
+
"crewai.memory.LongTermMemory": ["save", "search"],
|
60
|
+
"crewai.memory.UserMemory": ["save", "search"],
|
61
|
+
"crewai.memory.EntityMemory": ["save", "search"],
|
62
|
+
"crewai.Knowledge": ["query"],
|
63
|
+
}
|
64
|
+
)
|
65
|
+
try:
|
66
|
+
for class_path, methods in class_method_map.items():
|
67
|
+
*module_parts, class_name = class_path.rsplit(".", 1)
|
68
|
+
module_path = ".".join(module_parts)
|
69
|
+
module = importlib.import_module(module_path)
|
70
|
+
cls = getattr(module, class_name)
|
71
|
+
for method in methods:
|
72
|
+
safe_patch(
|
73
|
+
FLAVOR_NAME,
|
74
|
+
cls,
|
75
|
+
method,
|
76
|
+
patched_class_call,
|
77
|
+
)
|
78
|
+
except (AttributeError, ModuleNotFoundError) as e:
|
79
|
+
_logger.error("An exception happens when applying auto-tracing to crewai. Exception: %s", e)
|
mlflow/crewai/autolog.py
ADDED
@@ -0,0 +1,253 @@
|
|
1
|
+
import inspect
|
2
|
+
import json
|
3
|
+
import logging
|
4
|
+
import warnings
|
5
|
+
|
6
|
+
from packaging.version import Version
|
7
|
+
|
8
|
+
import mlflow
|
9
|
+
from mlflow.crewai.chat import set_span_chat_attributes
|
10
|
+
from mlflow.entities import SpanType
|
11
|
+
from mlflow.entities.span import LiveSpan
|
12
|
+
from mlflow.tracing.utils import TraceJSONEncoder
|
13
|
+
from mlflow.utils.autologging_utils.config import AutoLoggingConfig
|
14
|
+
|
15
|
+
_logger = logging.getLogger(__name__)
|
16
|
+
|
17
|
+
|
18
|
+
def patched_class_call(original, self, *args, **kwargs):
|
19
|
+
config = AutoLoggingConfig.init(flavor_name=mlflow.gemini.FLAVOR_NAME)
|
20
|
+
|
21
|
+
if config.log_traces:
|
22
|
+
fullname = f"{self.__class__.__name__}.{original.__name__}"
|
23
|
+
span_type = _get_span_type(self)
|
24
|
+
with mlflow.start_span(name=fullname, span_type=span_type) as span:
|
25
|
+
inputs = _construct_full_inputs(original, self, *args, **kwargs)
|
26
|
+
span.set_inputs(inputs)
|
27
|
+
_set_span_attributes(span=span, instance=self)
|
28
|
+
result = original(self, *args, **kwargs)
|
29
|
+
|
30
|
+
if span_type == SpanType.LLM:
|
31
|
+
set_span_chat_attributes(
|
32
|
+
span=span, messages=inputs.get("messages", []), output=result
|
33
|
+
)
|
34
|
+
# Need to convert the response of generate_content for better visualization
|
35
|
+
outputs = result.__dict__ if hasattr(result, "__dict__") else result
|
36
|
+
span.set_outputs(outputs)
|
37
|
+
|
38
|
+
return result
|
39
|
+
|
40
|
+
|
41
|
+
def _get_span_type(instance) -> str:
|
42
|
+
import crewai
|
43
|
+
from crewai import LLM, Agent, Crew, Task
|
44
|
+
from crewai.flow.flow import Flow
|
45
|
+
|
46
|
+
try:
|
47
|
+
if isinstance(instance, (Flow, Crew, Task)):
|
48
|
+
return SpanType.CHAIN
|
49
|
+
elif isinstance(instance, Agent):
|
50
|
+
return SpanType.AGENT
|
51
|
+
elif isinstance(instance, LLM):
|
52
|
+
return SpanType.LLM
|
53
|
+
elif isinstance(instance, Flow):
|
54
|
+
return SpanType.CHAIN
|
55
|
+
elif isinstance(
|
56
|
+
instance, crewai.agents.agent_builder.base_agent_executor_mixin.CrewAgentExecutorMixin
|
57
|
+
):
|
58
|
+
return SpanType.RETRIEVER
|
59
|
+
|
60
|
+
# Knowledge and Memory are not available before 0.83.0
|
61
|
+
if Version(crewai.__version__) >= Version("0.83.0"):
|
62
|
+
if isinstance(
|
63
|
+
instance,
|
64
|
+
(
|
65
|
+
crewai.memory.ShortTermMemory,
|
66
|
+
crewai.memory.LongTermMemory,
|
67
|
+
crewai.memory.UserMemory,
|
68
|
+
crewai.memory.EntityMemory,
|
69
|
+
crewai.Knowledge,
|
70
|
+
),
|
71
|
+
):
|
72
|
+
return SpanType.RETRIEVER
|
73
|
+
except AttributeError as e:
|
74
|
+
_logger.warn("An exception happens when resolving the span type. Exception: %s", e)
|
75
|
+
|
76
|
+
return SpanType.UNKNOWN
|
77
|
+
|
78
|
+
|
79
|
+
def _is_serializable(value):
|
80
|
+
try:
|
81
|
+
with warnings.catch_warnings():
|
82
|
+
warnings.simplefilter("ignore")
|
83
|
+
# There is type mismatch in some crewai class, suppress warning here
|
84
|
+
json.dumps(value, cls=TraceJSONEncoder, ensure_ascii=False)
|
85
|
+
return True
|
86
|
+
except (TypeError, ValueError):
|
87
|
+
return False
|
88
|
+
|
89
|
+
|
90
|
+
def _construct_full_inputs(func, *args, **kwargs):
|
91
|
+
signature = inspect.signature(func)
|
92
|
+
# This does not create copy. So values should not be mutated directly
|
93
|
+
arguments = signature.bind_partial(*args, **kwargs).arguments
|
94
|
+
|
95
|
+
if "self" in arguments:
|
96
|
+
arguments.pop("self")
|
97
|
+
|
98
|
+
# Avoid non serializable objects and circular references
|
99
|
+
return {
|
100
|
+
k: v.__dict__ if hasattr(v, "__dict__") else v
|
101
|
+
for k, v in arguments.items()
|
102
|
+
if v is not None and _is_serializable(v)
|
103
|
+
}
|
104
|
+
|
105
|
+
|
106
|
+
def _set_span_attributes(span: LiveSpan, instance):
|
107
|
+
# Crewai is available only python >=3.10, so importing libraries inside methods.
|
108
|
+
try:
|
109
|
+
import crewai
|
110
|
+
from crewai import LLM, Agent, Crew, Task
|
111
|
+
from crewai.flow.flow import Flow
|
112
|
+
|
113
|
+
## Memory class does not have helpful attributes
|
114
|
+
if isinstance(instance, Crew):
|
115
|
+
for key, value in instance.__dict__.items():
|
116
|
+
if value is not None:
|
117
|
+
if key == "tasks":
|
118
|
+
value = _parse_tasks(value)
|
119
|
+
elif key == "agents":
|
120
|
+
value = _parse_agents(value)
|
121
|
+
span.set_attribute(key, str(value) if isinstance(value, list) else value)
|
122
|
+
|
123
|
+
elif isinstance(instance, Agent):
|
124
|
+
agent = _get_agent_attributes(instance)
|
125
|
+
for key, value in agent.items():
|
126
|
+
if value is not None:
|
127
|
+
span.set_attribute(key, str(value) if isinstance(value, list) else value)
|
128
|
+
|
129
|
+
elif isinstance(instance, Task):
|
130
|
+
task = _get_task_attributes(instance)
|
131
|
+
for key, value in task.items():
|
132
|
+
if value is not None:
|
133
|
+
span.set_attribute(key, str(value) if isinstance(value, list) else value)
|
134
|
+
|
135
|
+
elif isinstance(instance, LLM):
|
136
|
+
llm = _get_llm_attributes(instance)
|
137
|
+
for key, value in llm.items():
|
138
|
+
if value is not None:
|
139
|
+
span.set_attribute(key, str(value) if isinstance(value, list) else value)
|
140
|
+
|
141
|
+
elif isinstance(instance, Flow):
|
142
|
+
for key, value in instance.__dict__.items():
|
143
|
+
if value is not None:
|
144
|
+
span.set_attribute(key, str(value) if isinstance(value, list) else value)
|
145
|
+
|
146
|
+
elif Version(crewai.__version__) >= Version("0.83.0"):
|
147
|
+
if isinstance(instance, crewai.Knowledge):
|
148
|
+
for key, value in instance.__dict__.items():
|
149
|
+
if value is not None and key != "storage":
|
150
|
+
span.set_attribute(key, str(value) if isinstance(value, list) else value)
|
151
|
+
|
152
|
+
except AttributeError as e:
|
153
|
+
_logger.warn("An exception happens when saving span attributes. Exception: %s", e)
|
154
|
+
|
155
|
+
|
156
|
+
def _get_agent_attributes(instance):
|
157
|
+
agent = {}
|
158
|
+
for key, value in instance.__dict__.items():
|
159
|
+
if key == "tools":
|
160
|
+
value = _parse_tools(value)
|
161
|
+
if value is None:
|
162
|
+
continue
|
163
|
+
agent[key] = str(value)
|
164
|
+
|
165
|
+
return agent
|
166
|
+
|
167
|
+
|
168
|
+
def _get_task_attributes(instance):
|
169
|
+
task = {}
|
170
|
+
for key, value in instance.__dict__.items():
|
171
|
+
if value is None:
|
172
|
+
continue
|
173
|
+
if key == "tools":
|
174
|
+
value = _parse_tools(value)
|
175
|
+
task[key] = value
|
176
|
+
elif key == "agent":
|
177
|
+
task[key] = value.role
|
178
|
+
else:
|
179
|
+
task[key] = str(value)
|
180
|
+
return task
|
181
|
+
|
182
|
+
|
183
|
+
def _get_llm_attributes(instance):
|
184
|
+
llm = {}
|
185
|
+
for key, value in instance.__dict__.items():
|
186
|
+
if value is None:
|
187
|
+
continue
|
188
|
+
elif key in ["callbacks", "api_key"]:
|
189
|
+
# Skip callbacks until how they should be logged are decided
|
190
|
+
continue
|
191
|
+
else:
|
192
|
+
llm[key] = str(value)
|
193
|
+
return llm
|
194
|
+
|
195
|
+
|
196
|
+
def _parse_agents(agents):
|
197
|
+
attributes = []
|
198
|
+
for agent in agents:
|
199
|
+
model = None
|
200
|
+
if agent.llm is not None:
|
201
|
+
if hasattr(agent.llm, "model"):
|
202
|
+
model = agent.llm.model
|
203
|
+
elif hasattr(agent.llm, "model_name"):
|
204
|
+
model = agent.llm.model_name
|
205
|
+
attributes.append(
|
206
|
+
{
|
207
|
+
"id": str(agent.id),
|
208
|
+
"role": agent.role,
|
209
|
+
"goal": agent.goal,
|
210
|
+
"backstory": agent.backstory,
|
211
|
+
"cache": agent.cache,
|
212
|
+
"config": agent.config,
|
213
|
+
"verbose": agent.verbose,
|
214
|
+
"allow_delegation": agent.allow_delegation,
|
215
|
+
"tools": agent.tools,
|
216
|
+
"max_iter": agent.max_iter,
|
217
|
+
"llm": str(model if model is not None else ""),
|
218
|
+
}
|
219
|
+
)
|
220
|
+
return attributes
|
221
|
+
|
222
|
+
|
223
|
+
def _parse_tasks(tasks):
|
224
|
+
return [
|
225
|
+
{
|
226
|
+
"agent": task.agent.role,
|
227
|
+
"description": task.description,
|
228
|
+
"async_execution": task.async_execution,
|
229
|
+
"expected_output": task.expected_output,
|
230
|
+
"human_input": task.human_input,
|
231
|
+
"tools": task.tools,
|
232
|
+
"output_file": task.output_file,
|
233
|
+
}
|
234
|
+
for task in tasks
|
235
|
+
]
|
236
|
+
|
237
|
+
|
238
|
+
def _parse_tools(tools):
|
239
|
+
result = []
|
240
|
+
for tool in tools:
|
241
|
+
res = {}
|
242
|
+
if hasattr(tool, "name") and tool.name is not None:
|
243
|
+
res["name"] = tool.name
|
244
|
+
if hasattr(tool, "description") and tool.description is not None:
|
245
|
+
res["description"] = tool.description
|
246
|
+
if res:
|
247
|
+
result.append(
|
248
|
+
{
|
249
|
+
"type": "function",
|
250
|
+
"function": res,
|
251
|
+
}
|
252
|
+
)
|
253
|
+
return result
|
mlflow/crewai/chat.py
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
import logging
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
from mlflow.entities.span import LiveSpan
|
5
|
+
from mlflow.exceptions import MlflowException
|
6
|
+
from mlflow.tracing import set_span_chat_messages
|
7
|
+
|
8
|
+
_logger = logging.getLogger(__name__)
|
9
|
+
|
10
|
+
|
11
|
+
def set_span_chat_attributes(span: LiveSpan, messages: list[dict[str, Any]], output: Any):
|
12
|
+
"""
|
13
|
+
This method logs chat messages to a span when LLM class is called. Since the CrewAI library
|
14
|
+
includes tool definition in the text content, mlflow.chat.tools attribute is not recorded.
|
15
|
+
|
16
|
+
Args:
|
17
|
+
span: A span object to record the chat messages.
|
18
|
+
messages: Input messages for the LLM call.
|
19
|
+
output: Response from LLM. Though the signature is str, tool response might be returned.
|
20
|
+
"""
|
21
|
+
output_message = {"role": "assistant", "content": str(output)}
|
22
|
+
|
23
|
+
try:
|
24
|
+
set_span_chat_messages(span, [*messages, output_message])
|
25
|
+
except MlflowException:
|
26
|
+
_logger.debug(
|
27
|
+
"Failed to set chat messages on span",
|
28
|
+
exc_info=True,
|
29
|
+
)
|
mlflow/data/__init__.py
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
import sys
|
2
|
+
from contextlib import suppress
|
3
|
+
from typing import Union
|
4
|
+
|
5
|
+
from mlflow.data import dataset_registry
|
6
|
+
from mlflow.data import sources as mlflow_data_sources
|
7
|
+
from mlflow.data.dataset import Dataset
|
8
|
+
from mlflow.data.dataset_source import DatasetSource
|
9
|
+
from mlflow.data.dataset_source_registry import get_dataset_source_from_json, get_registered_sources
|
10
|
+
from mlflow.entities import Dataset as DatasetEntity
|
11
|
+
from mlflow.entities import DatasetInput
|
12
|
+
from mlflow.exceptions import MlflowException
|
13
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
14
|
+
|
15
|
+
with suppress(ImportError):
|
16
|
+
# Suppressing ImportError to pass mlflow-skinny testing.
|
17
|
+
from mlflow.data import meta_dataset # noqa: F401
|
18
|
+
|
19
|
+
|
20
|
+
def get_source(dataset: Union[DatasetEntity, DatasetInput, Dataset]) -> DatasetSource:
|
21
|
+
"""Obtains the source of the specified dataset or dataset input.
|
22
|
+
|
23
|
+
Args:
|
24
|
+
dataset:
|
25
|
+
An instance of :py:class:`mlflow.data.dataset.Dataset <mlflow.data.dataset.Dataset>`,
|
26
|
+
:py:class:`mlflow.entities.Dataset`, or :py:class:`mlflow.entities.DatasetInput`.
|
27
|
+
|
28
|
+
Returns:
|
29
|
+
An instance of :py:class:`DatasetSource <mlflow.data.dataset_source.DatasetSource>`.
|
30
|
+
|
31
|
+
"""
|
32
|
+
if isinstance(dataset, DatasetInput):
|
33
|
+
dataset: DatasetEntity = dataset.dataset
|
34
|
+
|
35
|
+
if isinstance(dataset, DatasetEntity):
|
36
|
+
dataset_source: DatasetSource = get_dataset_source_from_json(
|
37
|
+
source_json=dataset.source,
|
38
|
+
source_type=dataset.source_type,
|
39
|
+
)
|
40
|
+
elif isinstance(dataset, Dataset):
|
41
|
+
dataset_source: DatasetSource = dataset.source
|
42
|
+
else:
|
43
|
+
raise MlflowException(
|
44
|
+
f"Unrecognized dataset type {type(dataset)}. Expected one of: "
|
45
|
+
f"`mlflow.data.dataset.Dataset`,"
|
46
|
+
f" `mlflow.entities.Dataset`, `mlflow.entities.DatasetInput`.",
|
47
|
+
INVALID_PARAMETER_VALUE,
|
48
|
+
)
|
49
|
+
|
50
|
+
return dataset_source
|
51
|
+
|
52
|
+
|
53
|
+
__all__ = ["get_source"]
|
54
|
+
|
55
|
+
|
56
|
+
def _define_dataset_constructors_in_current_module():
|
57
|
+
data_module = sys.modules[__name__]
|
58
|
+
for (
|
59
|
+
constructor_name,
|
60
|
+
constructor_fn,
|
61
|
+
) in dataset_registry.get_registered_constructors().items():
|
62
|
+
setattr(data_module, constructor_name, constructor_fn)
|
63
|
+
__all__.append(constructor_name)
|
64
|
+
|
65
|
+
|
66
|
+
_define_dataset_constructors_in_current_module()
|
67
|
+
|
68
|
+
|
69
|
+
def _define_dataset_sources_in_sources_module():
|
70
|
+
for source in get_registered_sources():
|
71
|
+
setattr(mlflow_data_sources, source.__name__, source)
|
72
|
+
mlflow_data_sources.__all__.append(source.__name__)
|
73
|
+
|
74
|
+
|
75
|
+
_define_dataset_sources_in_sources_module()
|
@@ -0,0 +1,170 @@
|
|
1
|
+
import re
|
2
|
+
import warnings
|
3
|
+
from pathlib import Path
|
4
|
+
from typing import Any, TypeVar
|
5
|
+
from urllib.parse import urlparse
|
6
|
+
|
7
|
+
from mlflow.artifacts import download_artifacts
|
8
|
+
from mlflow.exceptions import MlflowException
|
9
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
10
|
+
from mlflow.store.artifact.artifact_repository_registry import get_registered_artifact_repositories
|
11
|
+
from mlflow.utils.uri import is_local_uri
|
12
|
+
|
13
|
+
|
14
|
+
def register_artifact_dataset_sources():
|
15
|
+
from mlflow.data.dataset_source_registry import register_dataset_source
|
16
|
+
|
17
|
+
registered_source_schemes = set()
|
18
|
+
artifact_schemes_to_exclude = [
|
19
|
+
"http",
|
20
|
+
"https",
|
21
|
+
"runs",
|
22
|
+
"models",
|
23
|
+
"mlflow-artifacts",
|
24
|
+
# DBFS supports two access patterns: dbfs:/ (URI) and /dbfs (FUSE).
|
25
|
+
# The DBFS artifact repository online supports dbfs:/ (URI). To ensure
|
26
|
+
# a consistent dictionary representation of DBFS datasets across the URI and
|
27
|
+
# FUSE representations, we exclude dbfs from the set of dataset sources
|
28
|
+
# that are autogenerated using artifact repositories and instead define
|
29
|
+
# a separate DBFSDatasetSource elsewhere
|
30
|
+
"dbfs",
|
31
|
+
]
|
32
|
+
schemes_to_artifact_repos = get_registered_artifact_repositories()
|
33
|
+
for scheme, artifact_repo in schemes_to_artifact_repos.items():
|
34
|
+
if scheme in artifact_schemes_to_exclude or scheme in registered_source_schemes:
|
35
|
+
continue
|
36
|
+
|
37
|
+
if "ArtifactRepository" in artifact_repo.__name__:
|
38
|
+
# Artifact repository name is something like "LocalArtifactRepository",
|
39
|
+
# "S3ArtifactRepository", etc. To preserve capitalization, strip ArtifactRepository
|
40
|
+
# and replace it with ArtifactDatasetSource
|
41
|
+
dataset_source_name = artifact_repo.__name__.replace(
|
42
|
+
"ArtifactRepository", "ArtifactDatasetSource"
|
43
|
+
)
|
44
|
+
else:
|
45
|
+
# Artifact repository name has some other form, e.g. "dbfs_artifact_repo_factory".
|
46
|
+
# In this case, generate the name by capitalizing the first letter of the scheme and
|
47
|
+
# appending ArtifactRepository
|
48
|
+
scheme = str(scheme)
|
49
|
+
|
50
|
+
def camelcase_scheme(scheme):
|
51
|
+
parts = re.split(r"[-_]", scheme)
|
52
|
+
return "".join([part.capitalize() for part in parts])
|
53
|
+
|
54
|
+
source_name_prefix = camelcase_scheme(scheme)
|
55
|
+
dataset_source_name = source_name_prefix + "ArtifactDatasetSource"
|
56
|
+
|
57
|
+
try:
|
58
|
+
registered_source_schemes.add(scheme)
|
59
|
+
dataset_source = _create_dataset_source_for_artifact_repo(
|
60
|
+
scheme=scheme, dataset_source_name=dataset_source_name
|
61
|
+
)
|
62
|
+
register_dataset_source(dataset_source)
|
63
|
+
except Exception as e:
|
64
|
+
warnings.warn(
|
65
|
+
f"Failed to register a dataset source for URIs with scheme '{scheme}': {e}",
|
66
|
+
stacklevel=2,
|
67
|
+
)
|
68
|
+
|
69
|
+
|
70
|
+
def _create_dataset_source_for_artifact_repo(scheme: str, dataset_source_name: str):
|
71
|
+
from mlflow.data.filesystem_dataset_source import FileSystemDatasetSource
|
72
|
+
|
73
|
+
if scheme in ["", "file"]:
|
74
|
+
source_type = "local"
|
75
|
+
class_docstring = "Represents the source of a dataset stored on the local filesystem."
|
76
|
+
else:
|
77
|
+
source_type = scheme
|
78
|
+
class_docstring = (
|
79
|
+
f"Represents a filesystem-based or blob-storage-based dataset source identified by a"
|
80
|
+
f" URI with scheme '{scheme}'."
|
81
|
+
)
|
82
|
+
|
83
|
+
DatasetForArtifactRepoSourceType = TypeVar(dataset_source_name)
|
84
|
+
|
85
|
+
class ArtifactRepoSource(FileSystemDatasetSource):
|
86
|
+
def __init__(self, uri: str):
|
87
|
+
self._uri = uri
|
88
|
+
|
89
|
+
@property
|
90
|
+
def uri(self):
|
91
|
+
"""
|
92
|
+
The URI with scheme '{scheme}' referring to the dataset source filesystem location.
|
93
|
+
|
94
|
+
Returns
|
95
|
+
The URI with scheme '{scheme}' referring to the dataset source filesystem
|
96
|
+
location.
|
97
|
+
"""
|
98
|
+
return self._uri
|
99
|
+
|
100
|
+
@staticmethod
|
101
|
+
def _get_source_type() -> str:
|
102
|
+
return source_type
|
103
|
+
|
104
|
+
def load(self, dst_path=None) -> str:
|
105
|
+
"""
|
106
|
+
Downloads the dataset source to the local filesystem.
|
107
|
+
|
108
|
+
Args:
|
109
|
+
dst_path: Path of the local filesystem destination directory to which to download
|
110
|
+
the dataset source. If the directory does not exist, it is created. If
|
111
|
+
unspecified, the dataset source is downloaded to a new uniquely-named
|
112
|
+
directory on the local filesystem, unless the dataset source already
|
113
|
+
exists on the local filesystem, in which case its local path is
|
114
|
+
returned directly.
|
115
|
+
|
116
|
+
Returns:
|
117
|
+
The path to the downloaded dataset source on the local filesystem.
|
118
|
+
"""
|
119
|
+
return download_artifacts(artifact_uri=self.uri, dst_path=dst_path)
|
120
|
+
|
121
|
+
@staticmethod
|
122
|
+
def _can_resolve(raw_source: Any):
|
123
|
+
is_local_source_type = ArtifactRepoSource._get_source_type() == "local"
|
124
|
+
|
125
|
+
if not isinstance(raw_source, str) and (
|
126
|
+
not isinstance(raw_source, Path) and is_local_source_type
|
127
|
+
):
|
128
|
+
return False
|
129
|
+
|
130
|
+
try:
|
131
|
+
if is_local_source_type:
|
132
|
+
return is_local_uri(str(raw_source), is_tracking_or_registry_uri=False)
|
133
|
+
else:
|
134
|
+
parsed_source = urlparse(str(raw_source))
|
135
|
+
return parsed_source.scheme == scheme
|
136
|
+
except Exception:
|
137
|
+
return False
|
138
|
+
|
139
|
+
@classmethod
|
140
|
+
def _resolve(cls, raw_source: Any) -> DatasetForArtifactRepoSourceType:
|
141
|
+
return cls(str(raw_source))
|
142
|
+
|
143
|
+
def to_dict(self) -> dict[Any, Any]:
|
144
|
+
"""
|
145
|
+
Returns:
|
146
|
+
A JSON-compatible dictionary representation of the {dataset_source_name}.
|
147
|
+
"""
|
148
|
+
return {
|
149
|
+
"uri": self.uri,
|
150
|
+
}
|
151
|
+
|
152
|
+
@classmethod
|
153
|
+
def from_dict(cls, source_dict: dict[Any, Any]) -> DatasetForArtifactRepoSourceType:
|
154
|
+
uri = source_dict.get("uri")
|
155
|
+
if uri is None:
|
156
|
+
raise MlflowException(
|
157
|
+
f'Failed to parse {dataset_source_name}. Missing expected key: "uri"',
|
158
|
+
INVALID_PARAMETER_VALUE,
|
159
|
+
)
|
160
|
+
|
161
|
+
return cls(uri=uri)
|
162
|
+
|
163
|
+
ArtifactRepoSource.__name__ = dataset_source_name
|
164
|
+
ArtifactRepoSource.__qualname__ = dataset_source_name
|
165
|
+
ArtifactRepoSource.__doc__ = class_docstring
|
166
|
+
ArtifactRepoSource.to_dict.__doc__ = ArtifactRepoSource.to_dict.__doc__.format(
|
167
|
+
dataset_source_name=dataset_source_name
|
168
|
+
)
|
169
|
+
ArtifactRepoSource.uri.__doc__ = ArtifactRepoSource.uri.__doc__.format(scheme=scheme)
|
170
|
+
return ArtifactRepoSource
|