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
@@ -0,0 +1,24 @@
|
|
1
|
+
from mlflow.langchain.autolog import autolog
|
2
|
+
from mlflow.langchain.constants import FLAVOR_NAME
|
3
|
+
from mlflow.version import IS_TRACING_SDK_ONLY
|
4
|
+
|
5
|
+
__all__ = ["autolog", "FLAVOR_NAME"]
|
6
|
+
|
7
|
+
# Import model logging APIs only if mlflow skinny or full package is installed,
|
8
|
+
# i.e., skip if only mlflow-tracing package is installed.
|
9
|
+
if not IS_TRACING_SDK_ONLY:
|
10
|
+
from mlflow.langchain.model import (
|
11
|
+
_LangChainModelWrapper,
|
12
|
+
_load_pyfunc,
|
13
|
+
load_model,
|
14
|
+
log_model,
|
15
|
+
save_model,
|
16
|
+
)
|
17
|
+
|
18
|
+
__all__ += [
|
19
|
+
"_LangChainModelWrapper",
|
20
|
+
"_load_pyfunc",
|
21
|
+
"load_model",
|
22
|
+
"log_model",
|
23
|
+
"save_model",
|
24
|
+
]
|
@@ -0,0 +1,330 @@
|
|
1
|
+
# Based ons: https://github.com/openai/openai-cookbook/blob/6df6ceff470eeba26a56de131254e775292eac22/examples/api_request_parallel_processor.py
|
2
|
+
# Several changes were made to make it work with MLflow.
|
3
|
+
# Currently, only chat completion is supported.
|
4
|
+
|
5
|
+
"""
|
6
|
+
API REQUEST PARALLEL PROCESSOR
|
7
|
+
|
8
|
+
Using the LangChain API to process lots of text quickly takes some care.
|
9
|
+
If you trickle in a million API requests one by one, they'll take days to complete.
|
10
|
+
This script parallelizes requests using LangChain API.
|
11
|
+
|
12
|
+
Features:
|
13
|
+
- Streams requests from file, to avoid running out of memory for giant jobs
|
14
|
+
- Makes requests concurrently, to maximize throughput
|
15
|
+
- Logs errors, to diagnose problems with requests
|
16
|
+
"""
|
17
|
+
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
import logging
|
21
|
+
import queue
|
22
|
+
import threading
|
23
|
+
import time
|
24
|
+
import traceback
|
25
|
+
from concurrent.futures import ThreadPoolExecutor
|
26
|
+
from dataclasses import dataclass
|
27
|
+
from typing import Any, Optional, Union
|
28
|
+
|
29
|
+
import langchain.chains
|
30
|
+
from langchain.callbacks.base import BaseCallbackHandler
|
31
|
+
|
32
|
+
import mlflow
|
33
|
+
from mlflow.exceptions import MlflowException
|
34
|
+
from mlflow.langchain.utils.chat import (
|
35
|
+
transform_request_json_for_chat_if_necessary,
|
36
|
+
try_transform_response_iter_to_chat_format,
|
37
|
+
try_transform_response_to_chat_format,
|
38
|
+
)
|
39
|
+
from mlflow.langchain.utils.serialization import convert_to_serializable
|
40
|
+
from mlflow.pyfunc.context import Context, get_prediction_context
|
41
|
+
from mlflow.tracing.utils import maybe_set_prediction_context
|
42
|
+
|
43
|
+
_logger = logging.getLogger(__name__)
|
44
|
+
|
45
|
+
|
46
|
+
@dataclass
|
47
|
+
class StatusTracker:
|
48
|
+
"""
|
49
|
+
Stores metadata about the script's progress. Only one instance is created.
|
50
|
+
"""
|
51
|
+
|
52
|
+
num_tasks_started: int = 0
|
53
|
+
num_tasks_in_progress: int = 0 # script ends when this reaches 0
|
54
|
+
num_tasks_succeeded: int = 0
|
55
|
+
num_tasks_failed: int = 0
|
56
|
+
num_api_errors: int = 0 # excluding rate limit errors, counted above
|
57
|
+
lock: threading.Lock = threading.Lock()
|
58
|
+
|
59
|
+
def start_task(self):
|
60
|
+
with self.lock:
|
61
|
+
self.num_tasks_started += 1
|
62
|
+
self.num_tasks_in_progress += 1
|
63
|
+
|
64
|
+
def complete_task(self, *, success: bool):
|
65
|
+
with self.lock:
|
66
|
+
self.num_tasks_in_progress -= 1
|
67
|
+
if success:
|
68
|
+
self.num_tasks_succeeded += 1
|
69
|
+
else:
|
70
|
+
self.num_tasks_failed += 1
|
71
|
+
|
72
|
+
def increment_num_api_errors(self):
|
73
|
+
with self.lock:
|
74
|
+
self.num_api_errors += 1
|
75
|
+
|
76
|
+
|
77
|
+
@dataclass
|
78
|
+
class APIRequest:
|
79
|
+
"""
|
80
|
+
Stores an API request's inputs, outputs, and other metadata. Contains a method to make an API
|
81
|
+
call.
|
82
|
+
|
83
|
+
Args:
|
84
|
+
index: The request's index in the tasks list
|
85
|
+
lc_model: The LangChain model to call
|
86
|
+
request_json: The request's input data
|
87
|
+
results: The list to append the request's output data to, it's a list of tuples
|
88
|
+
(index, response)
|
89
|
+
errors: A dictionary to store any errors that occur
|
90
|
+
convert_chat_responses: Whether to convert the model's responses to chat format
|
91
|
+
did_perform_chat_conversion: Whether the input data was converted to chat format
|
92
|
+
based on the model's type and input data.
|
93
|
+
stream: Whether the request is a stream request
|
94
|
+
prediction_context: The prediction context to use for the request
|
95
|
+
"""
|
96
|
+
|
97
|
+
index: int
|
98
|
+
lc_model: langchain.chains.base.Chain
|
99
|
+
request_json: dict[str, Any]
|
100
|
+
results: list[tuple[int, str]]
|
101
|
+
errors: dict[int, str]
|
102
|
+
convert_chat_responses: bool
|
103
|
+
did_perform_chat_conversion: bool
|
104
|
+
stream: bool
|
105
|
+
params: dict[str, Any]
|
106
|
+
prediction_context: Optional[Context] = None
|
107
|
+
|
108
|
+
def _predict_single_input(self, single_input, callback_handlers, **kwargs):
|
109
|
+
config = kwargs.pop("config", {})
|
110
|
+
config["callbacks"] = config.get("callbacks", []) + (callback_handlers or [])
|
111
|
+
if self.stream:
|
112
|
+
return self.lc_model.stream(single_input, config=config, **kwargs)
|
113
|
+
if hasattr(self.lc_model, "invoke"):
|
114
|
+
return self.lc_model.invoke(single_input, config=config, **kwargs)
|
115
|
+
else:
|
116
|
+
# for backwards compatibility, __call__ is deprecated and will be removed in 0.3.0
|
117
|
+
# kwargs shouldn't have config field if invoking with __call__
|
118
|
+
return self.lc_model(single_input, callbacks=callback_handlers, **kwargs)
|
119
|
+
|
120
|
+
def _try_convert_response(self, response):
|
121
|
+
if self.stream:
|
122
|
+
return try_transform_response_iter_to_chat_format(response)
|
123
|
+
else:
|
124
|
+
return try_transform_response_to_chat_format(response)
|
125
|
+
|
126
|
+
def single_call_api(self, callback_handlers: Optional[list[BaseCallbackHandler]]):
|
127
|
+
from langchain.schema import BaseRetriever
|
128
|
+
|
129
|
+
from mlflow.langchain.utils.logging import langgraph_types, lc_runnables_types
|
130
|
+
|
131
|
+
if isinstance(self.lc_model, BaseRetriever):
|
132
|
+
# Retrievers are invoked differently than Chains
|
133
|
+
response = self.lc_model.get_relevant_documents(
|
134
|
+
**self.request_json, callbacks=callback_handlers, **self.params
|
135
|
+
)
|
136
|
+
elif isinstance(self.lc_model, lc_runnables_types() + langgraph_types()):
|
137
|
+
if isinstance(self.request_json, dict):
|
138
|
+
# This is a temporary fix for the case when spark_udf converts
|
139
|
+
# input into pandas dataframe with column name, while the model
|
140
|
+
# does not accept dictionaries as input, it leads to errors like
|
141
|
+
# Expected Scalar value for String field 'query_text'
|
142
|
+
try:
|
143
|
+
response = self._predict_single_input(
|
144
|
+
self.request_json, callback_handlers, **self.params
|
145
|
+
)
|
146
|
+
except TypeError as e:
|
147
|
+
_logger.debug(
|
148
|
+
f"Failed to invoke {self.lc_model.__class__.__name__} "
|
149
|
+
f"with {self.request_json}. Error: {e!r}. Trying to "
|
150
|
+
"invoke with the first value of the dictionary."
|
151
|
+
)
|
152
|
+
self.request_json = next(iter(self.request_json.values()))
|
153
|
+
(
|
154
|
+
prepared_request_json,
|
155
|
+
did_perform_chat_conversion,
|
156
|
+
) = transform_request_json_for_chat_if_necessary(
|
157
|
+
self.request_json, self.lc_model
|
158
|
+
)
|
159
|
+
self.did_perform_chat_conversion = did_perform_chat_conversion
|
160
|
+
|
161
|
+
response = self._predict_single_input(
|
162
|
+
prepared_request_json, callback_handlers, **self.params
|
163
|
+
)
|
164
|
+
else:
|
165
|
+
response = self._predict_single_input(
|
166
|
+
self.request_json, callback_handlers, **self.params
|
167
|
+
)
|
168
|
+
|
169
|
+
if self.did_perform_chat_conversion or self.convert_chat_responses:
|
170
|
+
response = self._try_convert_response(response)
|
171
|
+
else:
|
172
|
+
# return_only_outputs is invalid for stream call
|
173
|
+
if isinstance(self.lc_model, langchain.chains.base.Chain) and not self.stream:
|
174
|
+
kwargs = {"return_only_outputs": True}
|
175
|
+
else:
|
176
|
+
kwargs = {}
|
177
|
+
kwargs.update(**self.params)
|
178
|
+
response = self._predict_single_input(self.request_json, callback_handlers, **kwargs)
|
179
|
+
|
180
|
+
if self.did_perform_chat_conversion or self.convert_chat_responses:
|
181
|
+
response = self._try_convert_response(response)
|
182
|
+
elif isinstance(response, dict) and len(response) == 1:
|
183
|
+
# to maintain existing code, single output chains will still return
|
184
|
+
# only the result
|
185
|
+
response = response.popitem()[1]
|
186
|
+
|
187
|
+
return convert_to_serializable(response)
|
188
|
+
|
189
|
+
def call_api(
|
190
|
+
self, status_tracker: StatusTracker, callback_handlers: Optional[list[BaseCallbackHandler]]
|
191
|
+
):
|
192
|
+
"""
|
193
|
+
Calls the LangChain API and stores results.
|
194
|
+
"""
|
195
|
+
_logger.debug(f"Request #{self.index} started with payload: {self.request_json}")
|
196
|
+
|
197
|
+
try:
|
198
|
+
with maybe_set_prediction_context(self.prediction_context):
|
199
|
+
response = self.single_call_api(callback_handlers)
|
200
|
+
_logger.debug(f"Request #{self.index} succeeded with response: {response}")
|
201
|
+
self.results.append((self.index, response))
|
202
|
+
status_tracker.complete_task(success=True)
|
203
|
+
except Exception as e:
|
204
|
+
self.errors[self.index] = (
|
205
|
+
f"error: {e!r} {traceback.format_exc()}\n request payload: {self.request_json}"
|
206
|
+
)
|
207
|
+
status_tracker.increment_num_api_errors()
|
208
|
+
status_tracker.complete_task(success=False)
|
209
|
+
|
210
|
+
|
211
|
+
def process_api_requests(
|
212
|
+
lc_model,
|
213
|
+
requests: Optional[list[Union[Any, dict[str, Any]]]] = None,
|
214
|
+
max_workers: int = 10,
|
215
|
+
callback_handlers: Optional[list[BaseCallbackHandler]] = None,
|
216
|
+
convert_chat_responses: bool = False,
|
217
|
+
params: Optional[dict[str, Any]] = None,
|
218
|
+
context: Optional[Context] = None,
|
219
|
+
):
|
220
|
+
"""
|
221
|
+
Processes API requests in parallel.
|
222
|
+
"""
|
223
|
+
|
224
|
+
# initialize trackers
|
225
|
+
retry_queue = queue.Queue()
|
226
|
+
status_tracker = StatusTracker() # single instance to track a collection of variables
|
227
|
+
next_request = None # variable to hold the next request to call
|
228
|
+
context = context or get_prediction_context()
|
229
|
+
|
230
|
+
results = []
|
231
|
+
errors = {}
|
232
|
+
|
233
|
+
# Note: we should call `transform_request_json_for_chat_if_necessary`
|
234
|
+
# for the whole batch data, because the conversion should obey the rule
|
235
|
+
# that if any record in the batch can't be converted, then all the record
|
236
|
+
# in this batch can't be converted.
|
237
|
+
(
|
238
|
+
converted_chat_requests,
|
239
|
+
did_perform_chat_conversion,
|
240
|
+
) = transform_request_json_for_chat_if_necessary(requests, lc_model)
|
241
|
+
|
242
|
+
requests_iter = enumerate(converted_chat_requests)
|
243
|
+
with ThreadPoolExecutor(
|
244
|
+
max_workers=max_workers, thread_name_prefix="MlflowLangChainApi"
|
245
|
+
) as executor:
|
246
|
+
while True:
|
247
|
+
# get next request (if one is not already waiting for capacity)
|
248
|
+
if not retry_queue.empty():
|
249
|
+
next_request = retry_queue.get_nowait()
|
250
|
+
_logger.warning(f"Retrying request {next_request.index}: {next_request}")
|
251
|
+
elif req := next(requests_iter, None):
|
252
|
+
# get new request
|
253
|
+
index, converted_chat_request_json = req
|
254
|
+
next_request = APIRequest(
|
255
|
+
index=index,
|
256
|
+
lc_model=lc_model,
|
257
|
+
request_json=converted_chat_request_json,
|
258
|
+
results=results,
|
259
|
+
errors=errors,
|
260
|
+
convert_chat_responses=convert_chat_responses,
|
261
|
+
did_perform_chat_conversion=did_perform_chat_conversion,
|
262
|
+
stream=False,
|
263
|
+
prediction_context=context,
|
264
|
+
params=params,
|
265
|
+
)
|
266
|
+
status_tracker.start_task()
|
267
|
+
else:
|
268
|
+
next_request = None
|
269
|
+
|
270
|
+
# if enough capacity available, call API
|
271
|
+
if next_request:
|
272
|
+
# call API
|
273
|
+
executor.submit(
|
274
|
+
next_request.call_api,
|
275
|
+
status_tracker=status_tracker,
|
276
|
+
callback_handlers=callback_handlers,
|
277
|
+
)
|
278
|
+
|
279
|
+
# if all tasks are finished, break
|
280
|
+
# check next_request to avoid terminating the process
|
281
|
+
# before extra requests need to be processed
|
282
|
+
if status_tracker.num_tasks_in_progress == 0 and next_request is None:
|
283
|
+
break
|
284
|
+
|
285
|
+
time.sleep(0.001) # avoid busy waiting
|
286
|
+
|
287
|
+
# after finishing, log final status
|
288
|
+
if status_tracker.num_tasks_failed > 0:
|
289
|
+
raise mlflow.MlflowException(
|
290
|
+
f"{status_tracker.num_tasks_failed} tasks failed. Errors: {errors}"
|
291
|
+
)
|
292
|
+
|
293
|
+
return [res for _, res in sorted(results)]
|
294
|
+
|
295
|
+
|
296
|
+
def process_stream_request(
|
297
|
+
lc_model,
|
298
|
+
request_json: Union[Any, dict[str, Any]],
|
299
|
+
callback_handlers: Optional[list[BaseCallbackHandler]] = None,
|
300
|
+
convert_chat_responses: bool = False,
|
301
|
+
params: Optional[dict[str, Any]] = None,
|
302
|
+
):
|
303
|
+
"""
|
304
|
+
Process single stream request.
|
305
|
+
"""
|
306
|
+
if not hasattr(lc_model, "stream"):
|
307
|
+
raise MlflowException(
|
308
|
+
f"Model {lc_model.__class__.__name__} does not support streaming prediction output. "
|
309
|
+
"No `stream` method found."
|
310
|
+
)
|
311
|
+
|
312
|
+
(
|
313
|
+
converted_chat_requests,
|
314
|
+
did_perform_chat_conversion,
|
315
|
+
) = transform_request_json_for_chat_if_necessary(request_json, lc_model)
|
316
|
+
|
317
|
+
api_request = APIRequest(
|
318
|
+
index=0,
|
319
|
+
lc_model=lc_model,
|
320
|
+
request_json=converted_chat_requests,
|
321
|
+
results=None,
|
322
|
+
errors=None,
|
323
|
+
convert_chat_responses=convert_chat_responses,
|
324
|
+
did_perform_chat_conversion=did_perform_chat_conversion,
|
325
|
+
stream=True,
|
326
|
+
prediction_context=get_prediction_context(),
|
327
|
+
params=params,
|
328
|
+
)
|
329
|
+
with maybe_set_prediction_context(api_request.prediction_context):
|
330
|
+
return api_request.single_call_api(callback_handlers)
|
@@ -0,0 +1,147 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from mlflow.langchain.constant import FLAVOR_NAME
|
4
|
+
from mlflow.utils.annotations import experimental
|
5
|
+
from mlflow.utils.autologging_utils import autologging_integration
|
6
|
+
from mlflow.utils.autologging_utils.config import AutoLoggingConfig
|
7
|
+
from mlflow.utils.autologging_utils.safety import safe_patch
|
8
|
+
|
9
|
+
logger = logging.getLogger(__name__)
|
10
|
+
|
11
|
+
|
12
|
+
@experimental(version="2.10.0")
|
13
|
+
@autologging_integration(FLAVOR_NAME)
|
14
|
+
def autolog(
|
15
|
+
disable=False,
|
16
|
+
exclusive=False,
|
17
|
+
disable_for_unsupported_versions=False,
|
18
|
+
silent=False,
|
19
|
+
log_traces=True,
|
20
|
+
):
|
21
|
+
"""
|
22
|
+
Enables (or disables) and configures autologging from Langchain to MLflow.
|
23
|
+
|
24
|
+
Args:
|
25
|
+
disable: If ``True``, disables the Langchain autologging integration. If ``False``,
|
26
|
+
enables the Langchain autologging integration.
|
27
|
+
exclusive: If ``True``, autologged content is not logged to user-created fluent runs.
|
28
|
+
If ``False``, autologged content is logged to the active fluent run,
|
29
|
+
which may be user-created.
|
30
|
+
disable_for_unsupported_versions: If ``True``, disable autologging for versions of
|
31
|
+
langchain that have not been tested against this version of the MLflow
|
32
|
+
client or are incompatible.
|
33
|
+
silent: If ``True``, suppress all event logs and warnings from MLflow during Langchain
|
34
|
+
autologging. If ``False``, show all events and warnings during Langchain
|
35
|
+
autologging.
|
36
|
+
log_traces: If ``True``, traces are logged for Langchain models by using
|
37
|
+
MlflowLangchainTracer as a callback during inference. If ``False``, no traces are
|
38
|
+
collected during inference. Default to ``True``.
|
39
|
+
"""
|
40
|
+
try:
|
41
|
+
from langchain_core.callbacks import BaseCallbackManager
|
42
|
+
|
43
|
+
safe_patch(
|
44
|
+
FLAVOR_NAME,
|
45
|
+
BaseCallbackManager,
|
46
|
+
"__init__",
|
47
|
+
_patched_callback_manager_init,
|
48
|
+
)
|
49
|
+
except Exception as e:
|
50
|
+
logger.warning(f"Failed to enable tracing for LangChain. Error: {e}")
|
51
|
+
|
52
|
+
# Special handlings for edge cases.
|
53
|
+
try:
|
54
|
+
from langchain_core.callbacks import BaseCallbackManager
|
55
|
+
from langchain_core.runnables import RunnableSequence
|
56
|
+
|
57
|
+
safe_patch(
|
58
|
+
FLAVOR_NAME,
|
59
|
+
RunnableSequence,
|
60
|
+
"batch",
|
61
|
+
_patched_runnable_sequence_batch,
|
62
|
+
)
|
63
|
+
|
64
|
+
safe_patch(
|
65
|
+
FLAVOR_NAME,
|
66
|
+
BaseCallbackManager,
|
67
|
+
"merge",
|
68
|
+
_patched_callback_manager_merge,
|
69
|
+
)
|
70
|
+
except Exception:
|
71
|
+
logger.debug("Failed to patch RunnableSequence or BaseCallbackManager.", exc_info=True)
|
72
|
+
|
73
|
+
|
74
|
+
def _patched_callback_manager_init(original, self, *args, **kwargs):
|
75
|
+
from mlflow.langchain.langchain_tracer import MlflowLangchainTracer
|
76
|
+
|
77
|
+
original(self, *args, **kwargs)
|
78
|
+
|
79
|
+
if not AutoLoggingConfig.init(FLAVOR_NAME).log_traces:
|
80
|
+
return
|
81
|
+
|
82
|
+
for handler in self.inheritable_handlers:
|
83
|
+
if isinstance(handler, MlflowLangchainTracer):
|
84
|
+
return
|
85
|
+
|
86
|
+
_handler = MlflowLangchainTracer()
|
87
|
+
self.add_handler(_handler, inherit=True)
|
88
|
+
|
89
|
+
|
90
|
+
def _patched_callback_manager_merge(original, self, *args, **kwargs):
|
91
|
+
"""
|
92
|
+
Patch BaseCallbackManager.merge to avoid a duplicated callback issue.
|
93
|
+
|
94
|
+
In the above patched __init__, we check `inheritable_handlers` to see if the MLflow tracer
|
95
|
+
is already propagated. This works when the `inheritable_handlers` is specified as constructor
|
96
|
+
arguments. However, in the `merge` method, LangChain does not use constructor but set
|
97
|
+
callbacks via the setter method. This causes duplicated callbacks injection.
|
98
|
+
https://github.com/langchain-ai/langchain/blob/d9a069c414a321e7a3f3638a32ecf8a37ec2d188/libs/core/langchain_core/callbacks/base.py#L962-L982
|
99
|
+
"""
|
100
|
+
from mlflow.langchain.langchain_tracer import MlflowLangchainTracer
|
101
|
+
|
102
|
+
# Get the MLflow callback inherited from parent
|
103
|
+
inherited = self.inheritable_handlers + args[0].inheritable_handlers
|
104
|
+
inherited_mlflow_cb = next(
|
105
|
+
(cb for cb in inherited if isinstance(cb, MlflowLangchainTracer)), None
|
106
|
+
)
|
107
|
+
|
108
|
+
if not inherited_mlflow_cb:
|
109
|
+
return original(self, *args, **kwargs)
|
110
|
+
|
111
|
+
merged = original(self, *args, **kwargs)
|
112
|
+
# If a new MLflow callback is generated inside __init__, remove it
|
113
|
+
duplicate_mlflow_cbs = [
|
114
|
+
cb
|
115
|
+
for cb in merged.inheritable_handlers
|
116
|
+
if isinstance(cb, MlflowLangchainTracer) and cb != inherited_mlflow_cb
|
117
|
+
]
|
118
|
+
for cb in duplicate_mlflow_cbs:
|
119
|
+
merged.remove_handler(cb)
|
120
|
+
|
121
|
+
return merged
|
122
|
+
|
123
|
+
|
124
|
+
def _patched_runnable_sequence_batch(original, self, *args, **kwargs):
|
125
|
+
"""
|
126
|
+
Patch to terminate span context attachment during batch execution.
|
127
|
+
|
128
|
+
RunnableSequence's batch() methods are implemented in a peculiar way
|
129
|
+
that iterates on steps->items sequentially within the same thread. For example, if a
|
130
|
+
sequence has 2 steps and the batch size is 3, the execution flow will be:
|
131
|
+
- Step 1 for item 1
|
132
|
+
- Step 1 for item 2
|
133
|
+
- Step 1 for item 3
|
134
|
+
- Step 2 for item 1
|
135
|
+
- Step 2 for item 2
|
136
|
+
- Step 2 for item 3
|
137
|
+
Due to this behavior, we cannot attach the span to the context for this particular
|
138
|
+
API, otherwise spans for different inputs will be mixed up.
|
139
|
+
"""
|
140
|
+
from mlflow.langchain.langchain_tracer import _should_attach_span_to_context
|
141
|
+
|
142
|
+
original_state = _should_attach_span_to_context.get()
|
143
|
+
_should_attach_span_to_context.set(False)
|
144
|
+
try:
|
145
|
+
return original(self, *args, **kwargs)
|
146
|
+
finally:
|
147
|
+
_should_attach_span_to_context.set(original_state)
|