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/dspy/callback.py
ADDED
@@ -0,0 +1,398 @@
|
|
1
|
+
import logging
|
2
|
+
import threading
|
3
|
+
from collections import defaultdict
|
4
|
+
from functools import wraps
|
5
|
+
from typing import Any, Optional, Union
|
6
|
+
|
7
|
+
import dspy
|
8
|
+
from dspy.utils.callback import BaseCallback
|
9
|
+
|
10
|
+
import mlflow
|
11
|
+
from mlflow.dspy.constant import FLAVOR_NAME
|
12
|
+
from mlflow.dspy.util import log_dspy_module_params, save_dspy_module_state
|
13
|
+
from mlflow.entities import SpanStatusCode, SpanType
|
14
|
+
from mlflow.entities.run_status import RunStatus
|
15
|
+
from mlflow.entities.span_event import SpanEvent
|
16
|
+
from mlflow.exceptions import MlflowException
|
17
|
+
from mlflow.tracing.fluent import start_span_no_context
|
18
|
+
from mlflow.tracing.provider import detach_span_from_context, set_span_in_context
|
19
|
+
from mlflow.tracing.utils import maybe_set_prediction_context, set_span_chat_messages
|
20
|
+
from mlflow.tracing.utils.token import SpanWithToken
|
21
|
+
from mlflow.utils.autologging_utils import (
|
22
|
+
get_autologging_config,
|
23
|
+
)
|
24
|
+
from mlflow.version import IS_TRACING_SDK_ONLY
|
25
|
+
|
26
|
+
_logger = logging.getLogger(__name__)
|
27
|
+
_lock = threading.Lock()
|
28
|
+
|
29
|
+
|
30
|
+
def skip_if_trace_disabled(func):
|
31
|
+
@wraps(func)
|
32
|
+
def wrapper(*args, **kwargs):
|
33
|
+
if get_autologging_config(FLAVOR_NAME, "log_traces"):
|
34
|
+
func(*args, **kwargs)
|
35
|
+
|
36
|
+
return wrapper
|
37
|
+
|
38
|
+
|
39
|
+
class MlflowCallback(BaseCallback):
|
40
|
+
"""Callback for generating MLflow traces for DSPy components"""
|
41
|
+
|
42
|
+
def __init__(self, dependencies_schema: Optional[dict[str, Any]] = None):
|
43
|
+
self._dependencies_schema = dependencies_schema
|
44
|
+
# call_id: (LiveSpan, OTel token)
|
45
|
+
self._call_id_to_span: dict[str, SpanWithToken] = {}
|
46
|
+
|
47
|
+
###### state management for optimization process ######
|
48
|
+
# The current callback logic assumes there is no optimization running in parallel.
|
49
|
+
# The state management may not work when multiple optimizations are running in parallel.
|
50
|
+
# optimizer_stack_level is used to determine if the callback is called within compile
|
51
|
+
# we cannot use boolean flag because the callback can be nested
|
52
|
+
self.optimizer_stack_level = 0
|
53
|
+
# call_id: (key, step)
|
54
|
+
self._call_id_to_metric_key: dict[str, tuple[str, int]] = {}
|
55
|
+
self._evaluation_counter = defaultdict(int)
|
56
|
+
|
57
|
+
def set_dependencies_schema(self, dependencies_schema: dict[str, Any]):
|
58
|
+
if self._dependencies_schema:
|
59
|
+
raise MlflowException(
|
60
|
+
"Dependencies schema should be set only once to the callback.",
|
61
|
+
error_code=MlflowException.INVALID_PARAMETER_VALUE,
|
62
|
+
)
|
63
|
+
self._dependencies_schema = dependencies_schema
|
64
|
+
|
65
|
+
@skip_if_trace_disabled
|
66
|
+
def on_module_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
|
67
|
+
span_type = self._get_span_type_for_module(instance)
|
68
|
+
attributes = self._get_span_attribute_for_module(instance)
|
69
|
+
|
70
|
+
# The __call__ method of dspy.Module has a signature of (self, *args, **kwargs),
|
71
|
+
# while all built-in modules only accepts keyword arguments. To avoid recording
|
72
|
+
# empty "args" key in the inputs, we remove it if it's empty.
|
73
|
+
if "args" in inputs and not inputs["args"]:
|
74
|
+
inputs.pop("args")
|
75
|
+
|
76
|
+
self._start_span(
|
77
|
+
call_id,
|
78
|
+
name=f"{instance.__class__.__name__}.forward",
|
79
|
+
span_type=span_type,
|
80
|
+
inputs=self._unpack_kwargs(inputs),
|
81
|
+
attributes=attributes,
|
82
|
+
)
|
83
|
+
|
84
|
+
@skip_if_trace_disabled
|
85
|
+
def on_module_end(
|
86
|
+
self, call_id: str, outputs: Optional[Any], exception: Optional[Exception] = None
|
87
|
+
):
|
88
|
+
# NB: DSPy's Prediction object is a customized dictionary-like object, but its repr
|
89
|
+
# is not easy to read on UI. Therefore, we unpack it to a dictionary.
|
90
|
+
# https://github.com/stanfordnlp/dspy/blob/6fe693528323c9c10c82d90cb26711a985e18b29/dspy/primitives/prediction.py#L21-L28
|
91
|
+
if isinstance(outputs, dspy.Prediction):
|
92
|
+
outputs = outputs.toDict()
|
93
|
+
|
94
|
+
self._end_span(call_id, outputs, exception)
|
95
|
+
|
96
|
+
@skip_if_trace_disabled
|
97
|
+
def on_lm_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
|
98
|
+
span_type = (
|
99
|
+
SpanType.CHAT_MODEL if getattr(instance, "model_type", None) == "chat" else SpanType.LLM
|
100
|
+
)
|
101
|
+
|
102
|
+
attributes = {
|
103
|
+
**instance.kwargs,
|
104
|
+
"model": instance.model,
|
105
|
+
"model_type": instance.model_type,
|
106
|
+
"cache": instance.cache,
|
107
|
+
}
|
108
|
+
|
109
|
+
inputs = self._unpack_kwargs(inputs)
|
110
|
+
|
111
|
+
span = self._start_span(
|
112
|
+
call_id,
|
113
|
+
name=f"{instance.__class__.__name__}.__call__",
|
114
|
+
span_type=span_type,
|
115
|
+
inputs=inputs,
|
116
|
+
attributes=attributes,
|
117
|
+
)
|
118
|
+
|
119
|
+
if messages := self._extract_messages_from_lm_inputs(inputs):
|
120
|
+
try:
|
121
|
+
set_span_chat_messages(span, messages)
|
122
|
+
except Exception as e:
|
123
|
+
_logger.debug(f"Failed to set input messages for {span}. Error: {e}")
|
124
|
+
|
125
|
+
@skip_if_trace_disabled
|
126
|
+
def on_lm_end(
|
127
|
+
self, call_id: str, outputs: Optional[Any], exception: Optional[Exception] = None
|
128
|
+
):
|
129
|
+
st = self._call_id_to_span.get(call_id)
|
130
|
+
try:
|
131
|
+
output_msg = self._extract_messages_from_lm_outputs(outputs)
|
132
|
+
set_span_chat_messages(st.span, output_msg, append=True)
|
133
|
+
except Exception as e:
|
134
|
+
_logger.debug(f"Failed to set output messages for {call_id}. Error: {e}")
|
135
|
+
|
136
|
+
self._end_span(call_id, outputs, exception)
|
137
|
+
|
138
|
+
def _extract_messages_from_lm_inputs(self, inputs: dict[str, Any]) -> list[dict[str, str]]:
|
139
|
+
# LM input is either a list of messages or a prompt string
|
140
|
+
# https://github.com/stanfordnlp/dspy/blob/ac5bf56bb1ed7261d9637168563328c1dfeb27af/dspy/clients/lm.py#L92
|
141
|
+
# TODO: Extract tool definition once https://github.com/stanfordnlp/dspy/pull/2023 is merged
|
142
|
+
return inputs.get("messages") or [{"role": "user", "content": inputs.get("prompt")}]
|
143
|
+
|
144
|
+
def _extract_messages_from_lm_outputs(
|
145
|
+
self, outputs: list[Union[str, dict[str, Any]]]
|
146
|
+
) -> list[dict[str, str]]:
|
147
|
+
# LM output is either a string or a dictionary of text and logprobs
|
148
|
+
# https://github.com/stanfordnlp/dspy/blob/ac5bf56bb1ed7261d9637168563328c1dfeb27af/dspy/clients/lm.py#L105-L114
|
149
|
+
# TODO: Extract tool calls once https://github.com/stanfordnlp/dspy/pull/2023 is merged
|
150
|
+
return [
|
151
|
+
{"role": "assistant", "content": o.get("text") if isinstance(o, dict) else o}
|
152
|
+
for o in outputs
|
153
|
+
]
|
154
|
+
|
155
|
+
@skip_if_trace_disabled
|
156
|
+
def on_adapter_format_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
|
157
|
+
self._start_span(
|
158
|
+
call_id,
|
159
|
+
name=f"{instance.__class__.__name__}.format",
|
160
|
+
span_type=SpanType.PARSER,
|
161
|
+
inputs=self._unpack_kwargs(inputs),
|
162
|
+
attributes={},
|
163
|
+
)
|
164
|
+
|
165
|
+
@skip_if_trace_disabled
|
166
|
+
def on_adapter_format_end(
|
167
|
+
self, call_id: str, outputs: Optional[Any], exception: Optional[Exception] = None
|
168
|
+
):
|
169
|
+
self._end_span(call_id, outputs, exception)
|
170
|
+
|
171
|
+
@skip_if_trace_disabled
|
172
|
+
def on_adapter_parse_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
|
173
|
+
self._start_span(
|
174
|
+
call_id,
|
175
|
+
name=f"{instance.__class__.__name__}.parse",
|
176
|
+
span_type=SpanType.PARSER,
|
177
|
+
inputs=self._unpack_kwargs(inputs),
|
178
|
+
attributes={},
|
179
|
+
)
|
180
|
+
|
181
|
+
@skip_if_trace_disabled
|
182
|
+
def on_adapter_parse_end(
|
183
|
+
self, call_id: str, outputs: Optional[Any], exception: Optional[Exception] = None
|
184
|
+
):
|
185
|
+
self._end_span(call_id, outputs, exception)
|
186
|
+
|
187
|
+
@skip_if_trace_disabled
|
188
|
+
def on_tool_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
|
189
|
+
# DSPy uses the special "finish" tool to signal the end of the agent.
|
190
|
+
if instance.name == "finish":
|
191
|
+
return
|
192
|
+
|
193
|
+
inputs = self._unpack_kwargs(inputs)
|
194
|
+
# Tools are always called with keyword arguments only.
|
195
|
+
inputs.pop("args", None)
|
196
|
+
|
197
|
+
self._start_span(
|
198
|
+
call_id,
|
199
|
+
name=f"Tool.{instance.name}",
|
200
|
+
span_type=SpanType.TOOL,
|
201
|
+
inputs=inputs,
|
202
|
+
attributes={
|
203
|
+
"name": instance.name,
|
204
|
+
"description": instance.desc,
|
205
|
+
"args": instance.args,
|
206
|
+
},
|
207
|
+
)
|
208
|
+
|
209
|
+
@skip_if_trace_disabled
|
210
|
+
def on_tool_end(
|
211
|
+
self, call_id: str, outputs: Optional[Any], exception: Optional[Exception] = None
|
212
|
+
):
|
213
|
+
if call_id in self._call_id_to_span:
|
214
|
+
self._end_span(call_id, outputs, exception)
|
215
|
+
|
216
|
+
def on_evaluate_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
|
217
|
+
"""
|
218
|
+
Callback handler at the beginning of evaluation call. Available with DSPy>=2.6.9.
|
219
|
+
This callback starts a nested run for each evaluation call inside optimization.
|
220
|
+
If called outside optimization and no active run exists, it creates a new run.
|
221
|
+
"""
|
222
|
+
if not get_autologging_config(FLAVOR_NAME, "log_evals"):
|
223
|
+
return
|
224
|
+
|
225
|
+
key = "eval"
|
226
|
+
if callback_metadata := inputs.get("callback_metadata"):
|
227
|
+
if "metric_key" in callback_metadata:
|
228
|
+
key = callback_metadata["metric_key"]
|
229
|
+
if self.optimizer_stack_level > 0:
|
230
|
+
with _lock:
|
231
|
+
# we may want to include optimizer_stack_level in the key
|
232
|
+
# to handle nested optimization
|
233
|
+
step = self._evaluation_counter[key]
|
234
|
+
self._evaluation_counter[key] += 1
|
235
|
+
self._call_id_to_metric_key[call_id] = (key, step)
|
236
|
+
mlflow.start_run(run_name=f"{key}_{step}", nested=True)
|
237
|
+
else:
|
238
|
+
mlflow.start_run(run_name=key, nested=True)
|
239
|
+
if program := inputs.get("program"):
|
240
|
+
save_dspy_module_state(program, "model.json")
|
241
|
+
log_dspy_module_params(program)
|
242
|
+
|
243
|
+
def on_evaluate_end(
|
244
|
+
self,
|
245
|
+
call_id: str,
|
246
|
+
outputs: Any,
|
247
|
+
exception: Optional[Exception] = None,
|
248
|
+
):
|
249
|
+
"""
|
250
|
+
Callback handler at the end of evaluation call. Available with DSPy>=2.6.9.
|
251
|
+
This callback logs the evaluation score to the individual run
|
252
|
+
and add eval metric to the parent run if called inside optimization.
|
253
|
+
"""
|
254
|
+
if not get_autologging_config(FLAVOR_NAME, "log_evals"):
|
255
|
+
return
|
256
|
+
if exception:
|
257
|
+
mlflow.end_run(status=RunStatus.to_string(RunStatus.FAILED))
|
258
|
+
return
|
259
|
+
score = None
|
260
|
+
if isinstance(outputs, float):
|
261
|
+
score = outputs
|
262
|
+
elif isinstance(outputs, tuple):
|
263
|
+
score = outputs[0]
|
264
|
+
elif isinstance(outputs, dspy.Prediction):
|
265
|
+
score = float(outputs)
|
266
|
+
try:
|
267
|
+
mlflow.log_table(self._generate_result_table(outputs.results), "result_table.json")
|
268
|
+
except Exception:
|
269
|
+
_logger.debug("Failed to log result table.", exc_info=True)
|
270
|
+
if score is not None:
|
271
|
+
mlflow.log_metric("eval", score)
|
272
|
+
|
273
|
+
mlflow.end_run()
|
274
|
+
# Log the evaluation score to the parent run if called inside optimization
|
275
|
+
if self.optimizer_stack_level > 0 and mlflow.active_run() is not None:
|
276
|
+
if call_id not in self._call_id_to_metric_key:
|
277
|
+
return
|
278
|
+
key, step = self._call_id_to_metric_key.pop(call_id)
|
279
|
+
if score is not None:
|
280
|
+
mlflow.log_metric(
|
281
|
+
key,
|
282
|
+
score,
|
283
|
+
step=step,
|
284
|
+
)
|
285
|
+
|
286
|
+
def reset(self):
|
287
|
+
self._call_id_to_metric_key: dict[str, tuple[str, int]] = {}
|
288
|
+
self._evaluation_counter = defaultdict(int)
|
289
|
+
|
290
|
+
def _start_span(
|
291
|
+
self,
|
292
|
+
call_id: str,
|
293
|
+
name: str,
|
294
|
+
span_type: SpanType,
|
295
|
+
inputs: dict[str, Any],
|
296
|
+
attributes: dict[str, Any],
|
297
|
+
):
|
298
|
+
if not IS_TRACING_SDK_ONLY:
|
299
|
+
from mlflow.pyfunc.context import get_prediction_context
|
300
|
+
|
301
|
+
prediction_context = get_prediction_context()
|
302
|
+
if prediction_context and self._dependencies_schema:
|
303
|
+
prediction_context.update(**self._dependencies_schema)
|
304
|
+
else:
|
305
|
+
prediction_context = None
|
306
|
+
|
307
|
+
with maybe_set_prediction_context(prediction_context):
|
308
|
+
span = start_span_no_context(
|
309
|
+
name=name,
|
310
|
+
span_type=span_type,
|
311
|
+
parent_span=mlflow.get_current_active_span(),
|
312
|
+
inputs=inputs,
|
313
|
+
attributes=attributes,
|
314
|
+
)
|
315
|
+
|
316
|
+
token = set_span_in_context(span)
|
317
|
+
self._call_id_to_span[call_id] = SpanWithToken(span, token)
|
318
|
+
|
319
|
+
return span
|
320
|
+
|
321
|
+
def _end_span(
|
322
|
+
self,
|
323
|
+
call_id: str,
|
324
|
+
outputs: Optional[Any],
|
325
|
+
exception: Optional[Exception] = None,
|
326
|
+
):
|
327
|
+
st = self._call_id_to_span.pop(call_id, None)
|
328
|
+
|
329
|
+
if not st.span:
|
330
|
+
_logger.warning(f"Failed to end a span. Span not found for call_id: {call_id}")
|
331
|
+
return
|
332
|
+
|
333
|
+
status = SpanStatusCode.OK if exception is None else SpanStatusCode.ERROR
|
334
|
+
|
335
|
+
if exception:
|
336
|
+
st.span.add_event(SpanEvent.from_exception(exception))
|
337
|
+
|
338
|
+
try:
|
339
|
+
st.span.end(outputs=outputs, status=status)
|
340
|
+
finally:
|
341
|
+
detach_span_from_context(st.token)
|
342
|
+
|
343
|
+
def _get_span_type_for_module(self, instance):
|
344
|
+
if isinstance(instance, dspy.Retrieve):
|
345
|
+
return SpanType.RETRIEVER
|
346
|
+
elif isinstance(instance, dspy.ReAct):
|
347
|
+
return SpanType.AGENT
|
348
|
+
elif isinstance(instance, dspy.Predict):
|
349
|
+
return SpanType.LLM
|
350
|
+
elif isinstance(instance, dspy.Adapter):
|
351
|
+
return SpanType.PARSER
|
352
|
+
else:
|
353
|
+
return SpanType.CHAIN
|
354
|
+
|
355
|
+
def _get_span_attribute_for_module(self, instance):
|
356
|
+
if isinstance(instance, dspy.Predict):
|
357
|
+
return {"signature": instance.signature.signature}
|
358
|
+
elif isinstance(instance, dspy.ChainOfThought):
|
359
|
+
if hasattr(instance, "signature"):
|
360
|
+
signature = instance.signature.signature
|
361
|
+
else:
|
362
|
+
signature = instance.predict.signature.signature
|
363
|
+
|
364
|
+
attributes = {"signature": signature}
|
365
|
+
if hasattr(instance, "extended_signature"):
|
366
|
+
attributes["extended_signature"] = instance.extended_signature.signature
|
367
|
+
return attributes
|
368
|
+
return {}
|
369
|
+
|
370
|
+
def _unpack_kwargs(self, inputs: dict[str, Any]) -> dict[str, Any]:
|
371
|
+
"""Unpacks the kwargs from the inputs dictionary"""
|
372
|
+
# NB: Not using pop() to avoid modifying the original inputs dictionary
|
373
|
+
kwargs = inputs.get("kwargs", {})
|
374
|
+
inputs_wo_kwargs = {k: v for k, v in inputs.items() if k != "kwargs"}
|
375
|
+
return {**inputs_wo_kwargs, **kwargs}
|
376
|
+
|
377
|
+
def _generate_result_table(
|
378
|
+
self, outputs: list[tuple[dspy.Example, dspy.Prediction, Any]]
|
379
|
+
) -> dict[str, list[Any]]:
|
380
|
+
result = {"score": []}
|
381
|
+
for i, (example, prediction, score) in enumerate(outputs):
|
382
|
+
for k, v in example.items():
|
383
|
+
if f"example_{k}" not in result:
|
384
|
+
result[f"example_{k}"] = [None] * i
|
385
|
+
result[f"example_{k}"].append(v)
|
386
|
+
|
387
|
+
for k, v in prediction.items():
|
388
|
+
if f"pred_{k}" not in result:
|
389
|
+
result[f"pred_{k}"] = [None] * i
|
390
|
+
result[f"pred_{k}"].append(v)
|
391
|
+
|
392
|
+
result["score"].append(score)
|
393
|
+
|
394
|
+
for k, v in result.items():
|
395
|
+
if len(v) != i + 1:
|
396
|
+
result[k].append(None)
|
397
|
+
|
398
|
+
return result
|
mlflow/dspy/constant.py
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
FLAVOR_NAME = "dspy"
|
mlflow/dspy/load.py
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
|
4
|
+
import cloudpickle
|
5
|
+
|
6
|
+
from mlflow.models import Model
|
7
|
+
from mlflow.models.dependencies_schemas import _get_dependencies_schema_from_model
|
8
|
+
from mlflow.models.model import _update_active_model_id_based_on_mlflow_model
|
9
|
+
from mlflow.tracing.provider import trace_disabled
|
10
|
+
from mlflow.tracking.artifact_utils import _download_artifact_from_uri
|
11
|
+
from mlflow.utils.annotations import experimental
|
12
|
+
from mlflow.utils.model_utils import (
|
13
|
+
_add_code_from_conf_to_system_path,
|
14
|
+
_get_flavor_configuration,
|
15
|
+
)
|
16
|
+
|
17
|
+
_DEFAULT_MODEL_PATH = "data/model.pkl"
|
18
|
+
_logger = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
|
21
|
+
def _set_dependency_schema_to_tracer(model_path, callbacks):
|
22
|
+
"""
|
23
|
+
Set dependency schemas from the saved model metadata to the tracer
|
24
|
+
to propagate it to inference traces.
|
25
|
+
"""
|
26
|
+
from mlflow.dspy.callback import MlflowCallback
|
27
|
+
|
28
|
+
tracer = next((cb for cb in callbacks if isinstance(cb, MlflowCallback)), None)
|
29
|
+
if tracer is None:
|
30
|
+
return
|
31
|
+
|
32
|
+
model = Model.load(model_path)
|
33
|
+
tracer.set_dependencies_schema(_get_dependencies_schema_from_model(model))
|
34
|
+
|
35
|
+
|
36
|
+
def _load_model(model_uri, dst_path=None):
|
37
|
+
local_model_path = _download_artifact_from_uri(artifact_uri=model_uri, output_path=dst_path)
|
38
|
+
mlflow_model = Model.load(local_model_path)
|
39
|
+
flavor_conf = _get_flavor_configuration(model_path=local_model_path, flavor_name="dspy")
|
40
|
+
|
41
|
+
_add_code_from_conf_to_system_path(local_model_path, flavor_conf)
|
42
|
+
model_path = flavor_conf.get("model_path", _DEFAULT_MODEL_PATH)
|
43
|
+
with open(os.path.join(local_model_path, model_path), "rb") as f:
|
44
|
+
loaded_wrapper = cloudpickle.load(f)
|
45
|
+
|
46
|
+
_set_dependency_schema_to_tracer(local_model_path, loaded_wrapper.dspy_settings["callbacks"])
|
47
|
+
_update_active_model_id_based_on_mlflow_model(mlflow_model)
|
48
|
+
return loaded_wrapper
|
49
|
+
|
50
|
+
|
51
|
+
@experimental(version="2.18.0")
|
52
|
+
@trace_disabled # Suppress traces for internal calls while loading model
|
53
|
+
def load_model(model_uri, dst_path=None):
|
54
|
+
"""
|
55
|
+
Load a Dspy model from a run.
|
56
|
+
|
57
|
+
This function will also set the global dspy settings `dspy.settings` by the saved settings.
|
58
|
+
|
59
|
+
Args:
|
60
|
+
model_uri: The location, in URI format, of the MLflow model. For example:
|
61
|
+
|
62
|
+
- ``/Users/me/path/to/local/model``
|
63
|
+
- ``relative/path/to/local/model``
|
64
|
+
- ``s3://my_bucket/path/to/model``
|
65
|
+
- ``runs:/<mlflow_run_id>/run-relative/path/to/model``
|
66
|
+
- ``mlflow-artifacts:/path/to/model``
|
67
|
+
|
68
|
+
For more information about supported URI schemes, see
|
69
|
+
`Referencing Artifacts <https://www.mlflow.org/docs/latest/tracking.html#
|
70
|
+
artifact-locations>`_.
|
71
|
+
dst_path: The local filesystem path to utilize for downloading the model artifact.
|
72
|
+
This directory must already exist if provided. If unspecified, a local output
|
73
|
+
path will be created.
|
74
|
+
|
75
|
+
Returns:
|
76
|
+
An `dspy.module` instance, representing the dspy model.
|
77
|
+
"""
|
78
|
+
import dspy
|
79
|
+
|
80
|
+
wrapper = _load_model(model_uri, dst_path)
|
81
|
+
|
82
|
+
# Set the global dspy settings for reproducing the model's behavior when the model is
|
83
|
+
# loaded via `mlflow.dspy.load_model`. Note that for the model to be loaded as pyfunc,
|
84
|
+
# settings will be set in the wrapper's `predict` method via local context to avoid the
|
85
|
+
# "dspy.settings can only be changed by the thread that initially configured it" error
|
86
|
+
# in Databricks model serving.
|
87
|
+
dspy.settings.configure(**wrapper.dspy_settings)
|
88
|
+
|
89
|
+
return wrapper.model
|
90
|
+
|
91
|
+
|
92
|
+
def _load_pyfunc(path):
|
93
|
+
return _load_model(path)
|