Upgrade from 2.x To 3.x

With Platform Version 24.4 bringing changes in the model onboarding flow, the Python client has been upgraded to reflect these changes using an object-oriented design. This article is a guide on how your existing 2.x API method calls change when upgrading to Fiddler Python client 3.x. Please note that the below 3.x methods are more fully documented in API documentation. You can also take a look at this notebook which walks you through usage changes with the new client

Notable Changes

  • Dataset management: In client 3.x and platform 24.4+, the dataset is a model asset rather than a project asset. Multiple datasets can be associated with a model for different purposes like feature impact computation or surrogate model generation.

  • Explicit triggering: In client 3.x, actions such as feature importance and impact computation must be triggered explicitly unlike in client 2.x where they were part of the add artifact/surrogate model methods.

  • Onboarding prerequisites: A dataset is no longer a perquisite for onboarding a model into Fiddler and the DatasetInfo object has been deprecated.

  • Naming conventions: In client 2.x API method parameters for unique identifiers used semantic names such as project_id='my_project' and model_id='my_model'. With client 3.x we will expose automatically generated unique identifiers for objects like projects and models. This unique identifier is what is to be used for any "id" or "_id" parameter. Your semantic names will be associated with an object's "name" parameter and will allow retrieval by your semantic name in addition to get by "id".

    Flow Changes

    Import

    • 2.x: import fiddler as fdl

    • 3.x: import fiddler as fdl

    Initialization

    • 2.x:

      client = fdl.FiddlerApi(
          url=URL,
          org_id=ORG_ID,
          auth_token=AUTH_TOKEN
      )
    • 3.x:

      fdl.init(
          url=URL,
          token=AUTH_TOKEN
      )

      org_id is no longer required and will be inferred from the token.

    Projects

    Get Projects

    • 2.x: projects = client.get_projects()

    • 3.x: projects = fdl.Project.list()

    Add Project

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      
      project = client.create_project(project_id=PROJECT_ID)
    • 3.x:

      PROJECT_NAME = 'YOUR_PROJECT_NAME'
      
      project = fdl.Project(name=PROJECT_NAME)
      project.create()

    Delete Project

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      
      client.delete_project(project_id=PROJECT_ID)
    • 3.x:

      PROJECT_NAME = 'YOUR_PROJECT_NAME'
      
      project = fdl.Project.from_name(name=PROJECT_NAME)
      project.delete()

    Models

    Get Model

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      
      model = client.get_model(
          project_id=PROJECT_ID,
          model_id=MODEL_ID
      )
    • 3.x:

      PROJECT_NAME = 'YOUR_PROJECT_NAME'
      MODEL_NAME = 'YOUR_MODEL_NAME'
      
      project = fdl.Project.from_name(name=PROJECT_NAME)
      model = fdl.Model.from_name(name=MODEL_NAME, project_id=project.id)

    List Models

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      
      models = client.list_models(project_id=PROJECT_ID))
    • 3.x:

      PROJECT_ID = '6dbf8656-1b6b-4f80-ba2b-b75739526dc2'
      
      models = fdl.Model.list(project_id=PROJECT_ID)

    Add Model

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      DATASET_ID = 'YOUR_DATASET_NAME'
      
      client.add_model(
          project_id=PROJECT_ID,
          dataset_id=DATASET_ID,
          model_id=MODEL_ID,
          model_info=model_info
      )
    • 3.x:

      DATASET_FILE_PATH = <path_to_file>
      MODEL_NAME = 'YOUR_MODEL_NAME'
      PROJECT_ID = '6dbf8656-1b6b-4f80-ba2b-b75739526dc2'
      
      MODEL_SPEC = fdl.ModelSpec(
          inputs=['CreditScore', 'Geography', 'Gender', 'Age', 'Tenure', 'Balance'],
          outputs=['probability_churned'],
          targets=['Churned'],
          decisions=[],
          metadata=[],
          custom_features=[],
      )
      
      model = fdl.Model.from_data(
          source=DATASET_FILE_PATH,
          name=MODEL_NAME,
          project_id=PROJECT_ID,
          spec=MODEL_SPEC,
      )
      model.create()

    \

    Add Model Artifact

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      MODEL_DIR = <path_to_dir_containing_artifact>
      DEPLOYMENT_PARAMS = {'deployment_type': 'MANUAL', 'cpu': 1000}
      
      job_id = client.add_model_artifact(
          project_id=PROJECT_ID,
          model_id=MODEL_ID,
          model_dir=MODEL_DIR,
          deployment_params=fdl.DeploymentParams(**DEPLOYMENT_PARAMS))
      )
    • 3.x:

      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      DEPLOYMENT_PARAMS = {'deployment_type': 'MANUAL', 'cpu': 1000}
      MODEL_DIR = <path_to_dir_containing_artifact>
      
      model = fdl.Model.get(id_=MODEL_ID)
      job = model.add_artifact(
              model_dir=MODEL_DIR,
              deployment_params=fdl.DeploymentParams(**DEPLOYMENT_PARAMS)
            )
      job.wait()

    📘 Computation of Feature Importance

    Pre-compute of feature importance and feature impact needs to be done manually in 3.x. Below blocks showcase how it can be done with client 3.x

    • 3.x: New steps

      DATASET_ID = '5e1e67d2-5170-45ce-a851-68bdde1ac1ad'
      
      importance_job = model.precompute_feature_importance(
                dataset_id=DATASET_ID
            )
      importance_job.wait()
      
      impact_job = model.precompute_feature_impact(
                dataset_id=DATASET_ID
            )
      impact_job.wait()

    Update Model

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      
      models = client.update_model(
          project_id=PROJECT_ID,
          model_id=MODEL_ID,
      )
    • 3.x:

      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      
      model = fdl.Model.get(id_=MODEL_ID)
      model.xai_params.default_explain_method = 'SHAP'
      model.update()

    Update Model Artifact

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      MODEL_DIR = <path_to_dir_containing_artifact>
      DEPLOYMENT_PARAMS = {'deployment_type': 'MANUAL', 'cpu': 1000}
      
      job_id = client.update_model_artifact(
          project_id=PROJECT_ID,
          model_id=MODEL_ID,
          model_dir=MODEL_DIR,
          deployment_params=fdl.DeploymentParams(**DEPLOYMENT_PARAMS))
      )
    • 3.x:

      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      DEPLOYMENT_PARAMS = {'deployment_type': 'MANUAL', 'cpu': 1000}
      MODEL_DIR = <path_to_dir_containing_artifact>
      
      model = fdl.Model.get(id_=MODEL_ID)
      job = model.update_artifact(
              model_dir=MODEL_DIR,
              deployment_params=fdl.DeploymentParams(**DEPLOYMENT_PARAMS)
            )
      job.wait()

    \

    📘 Computation of Feature Importance

    Pre-compute of feature importance and feature impact needs to be done manually in 3.x. Below blocks showcase how it can be done with client 3.x

    • 3.x: New steps

      DATASET_ID = '5e1e67d2-5170-45ce-a851-68bdde1ac1ad'
      
      importance_job = model.precompute_feature_importance(
                dataset_id=DATASET_ID
            )
      importance_job.wait()
      
      impact_job = model.precompute_feature_impact(
                dataset_id=DATASET_ID
            )
      impact_job.wait()

    Download Artifacts

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      OUTPUT_DIR = <path_to_dir_to_download_artifact>
      
      client.download_artifacts(
          project_id=PROJECT_ID,
          model_id=MODEL_ID,
          output_dir=OUTPUT_DIR
      )
    • 3.x:

      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      OUTPUT_DIR = <path_to_dir_to_download_artifact>
      
      model = fdl.Model.get(id_=MODEL_ID)
      model.download_artifact(
          output_dir=OUTPUT_DIR
      )

    Get Model Deployment

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      
      model_deployment = client.get_model_deployment(
                            project_id=PROJECT_ID,
                            model_id=MODEL_ID
                        )
    • 3.x:

      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      
      # Using Model
      model = fdl.Model.get(id_=MODEL_ID)
      model_deployment = model.deployment
      
      # Using ModelDeployment
      model_deployment = fdl.ModelDeployment.of(model_id=MODEL_ID)

    Add Model Surrogate

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      DEPLOYMENT_PARAMS = {'deployment_type': 'MANUAL', 'cpu': 1000}
      
      job_id = client.add_model_surrogate(
          project_id=PROJECT_ID,
          model_id=MODEL_ID,
          deployment_params=fdl.DeploymentParams(**DEPLOYMENT_PARAMS))
      )
    • 3.x:

      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      DATASET_ID = '5e1e67d2-5170-45ce-a851-68bdde1ac1ad'
      DEPLOYMENT_PARAMS = {'deployment_type': 'MANUAL', 'cpu': 1000}
      
      model = fdl.Model.get(id_=MODEL_ID)
      job = model.add_surrogate(
              dataset_id=DATASET_ID,
              deployment_params=fdl.DeploymentParams(**DEPLOYMENT_PARAMS))
      job.wait()

    Update Model Surrogate

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      DEPLOYMENT_PARAMS = {'deployment_type': 'MANUAL', 'cpu': 1000}
      
      job_id = client.update_model_surrogate(
          project_id=PROJECT_ID,
          model_id=MODEL_ID,
          deployment_params=fdl.DeploymentParams(**DEPLOYMENT_PARAMS))
      )
    • 3.x:

      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      DATASET_ID = '5e1e67d2-5170-45ce-a851-68bdde1ac1ad'
      DEPLOYMENT_PARAMS = {'deployment_type': 'MANUAL', 'cpu': 1000}
      
      model = fdl.Model.get(id_=MODEL_ID)
      job = model.update_surrogate(
              dataset_id=DATASET_ID,
              deployment_params=fdl.DeploymentParams(**DEPLOYMENT_PARAMS))
      job.wait()

    Update Model Deployment

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      
      model_deployment = client.update_model_deployment(
                            project_id=PROJECT_ID,
                            model_id=MODEL_ID,
                            cpu=1000
                        )
    • 3.x:

      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      
      model_deployment = fdl.ModelDeployment.of(
                          model_id=MODEL_ID
                         )
      model_deployment.cpu = 1000
      model_deployment.update()

    Delete Model

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      
      client.delete_model(
          project_id=PROJECT_ID,
          model_id=MODEL_ID,
      )
    • 3.x:

      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      
      model = fdl.Model.get(id_=MODEL_ID)
      job = model.delete()
      job.wait()

    Datasets

    Get Dataset

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      DATASET_ID = 'YOUR_MODEL_NAME'
      
      dataset = client.get_dataset(
          project_id=PROJECT_ID,
          dataset_id=DATASET_ID
      )
    • 3.x:

      # From id
      DATASET_ID = '5e1e67d2-5170-45ce-a851-68bdde1ac1ad'
      dataset = fdl.Dataset.get(id_=DATASET_ID)
      
      # From name
      DATASET_NAME = 'test_dataset'
      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      dataset = fdl.Dataset.from_name(
            name=DATASET_NAME,
            model_id=MODEL_ID
      )

    List Datasets

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      datasets = client.list_datasets(project_id=PROJECT_ID)
    • 3.x:

      # In 3.x, datasets are stored at a model level rather than project level.
      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      datasets = fdl.Dataset.list(model_id=MODEL_ID)

    Upload Dataset

    • 2.x:

      baseline_df = pd.read_csv(PATH_TO_BASELINE_CSV)
      dataset_info = fdl.DatasetInfo.from_dataframe(baseline_df)
      
      PROJECT_ID = 'YOUR_PROJECT_NAME'
      DATASET_ID = 'YOUR_MODEL_NAME'
      
      client.upload_dataset(
          project_id=PROJECT_ID,
          dataset_id=DATASET_ID,
          dataset={
              'baseline': baseline_df
          },
          info=dataset_info
      )
    • 3.x:

      # Fiddler no longer requires a dataset to be added before model creation.
      # However, you can optionally add upload dataset to a model using the
      # publish method as shown below.
      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      DATASET_NAME = 'YOUR_DATASET_NAME'
      DATASET_FILE_PATH = <path_to_dataset>
      
      job = model.publish(
          source=DATASET_FILE_PATH,
          environment=fdl.EnvType.PRE_PRODUCTION,
          dataset_name=DATASET_NAME,
      )
      # The publish() method is asynchronous by default as in previous versions. 
      # Use the publish job's wait() method if sychronous behavior is desired.
      # job.wait()        

    Baselines

    Get Baseline

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      DATASET_ID = 'YOUR_MODEL_NAME'
      BASELINE_ID = 'YOUR_BASELINE_NAME'
      
      baseline = client.get_baseline(
          project_id=PROJECT_ID,
          model_id=MODEL_ID,
          baseline_id=BASELINE_ID
      )
    • 3.x:

      # From UUID
      BASELINE_ID = '5e1e67d2-5170-45ce-a851-68bdde1ac1ad'
      baseline = fdl.Baseline.get(id_=BASELINE_ID)
      
      # From name
      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      BASELINE_NAME = 'YOUR_BASELINE_NAME'
      
      baseline = fdl.Baseline.from_name(
            name=BASELINE_NAME,
            model_id=MODEL_ID
      )

    Add Baseline

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      BASELINE_ID = 'YOUR_BASELINE_NAME'
      DATASET_ID = 'YOUR_DATASET_NAME'
      
      # Static baseline
      baseline = client.add_baseline(
            project_id=PROJECT_ID,
            model_id=MODEL_ID,
            baseline_id=BASELINE_ID,
            type=fdl.BaselineType.STATIC,
            dataset_id=DATASET_ID
      )
      
      # Rolling baseline
      baseline = client.add_baseline(
            project_id=PROJECT_ID,
            model_id=MODEL_ID,
            baseline_id=BASELINE_NAME,
            type=fdl.BaselineType.ROLLING_PRODUCTION,
            offset=fdl.WindowSize.ONE_MONTH, # How far back to set our window
            window_size=fdl.WindowSize.ONE_WEEK, # Size of the sliding window
      )
    • 3.x:

      BASELINE_NAME = 'YOUR_BASELINE_NAME'
      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      
      # Static baseline
      baseline = fdl.Baseline(
          name=BASELINE_NAME,
          model_id=MODEL_ID,
          environment=fdl.EnvType.PRE_PRODUCTION,
          type_=fdl.BaselineType.STATIC,
          dataset_id=DATASET_ID,
      )
      baseline.create()
      
      # Rolling baseline
      baseline = fdl.Baseline(
          name=BASELINE_NAME,
          model_id=MODEL_ID,
          environment=fdl.EnvType.PRODUCTION,
          type_=fdl.BaselineType.ROLLING,
          window_bin_size=fdl.WindowBinSize.HOUR,
          offset_delta=fdl.WindowBinSize.HOUR,
      )
      baseline.create()

    List Baselines

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      
      baselines = client.list_baselines(project_id=PROJECT_ID)
    • 3.x:

      MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
      
      baselines = fdl.Baseline.list(model_id=MODEL_ID)

    Delete Baselines

    • 2.x:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      BASELINE_ID = 'YOUR_BASELINE_NAME'
      
      client.delete_baseline(
          project_id=PROJECT_ID,
          model_id=MODEL_ID,
          baseline_id=BASELINE_ID
      )
    • 3.x:

      BASELINE_ID = '5e1e67d2-5170-45ce-a851-68bdde1ac1ad'
      
      baseline = fdl.Baseline.get(id_=BASELINE_ID)
      baseline.delete()

    Event Publishing

    📘 Source

    In 3.x, an event data source for batch publishing can be one of CSV filepath, parquet filepath, or Pandas dataframe and a Python list[dict] for streaming publishing.

    Publish batch production events

    • Pre-requisite:

        PROJECT_ID = 'YOUR_PROJECT_NAME'
        MODEL_ID = 'YOUR_MODEL_NAME'
        production_df = pd.read_csv(PATH_TO_EVENTS_CSV)
    • 2.x:

      job = client.publish_events_batch(
          project_id=PROJECT_ID,
          model_id=MODEL_ID,
          id_field='event_id',
          batch_source=production_df,
          timestamp_field='timestamp',
          update_event=False,
      )
    • 3.x:

      # Instantiate project and model object in 3.x
      project = fdl.Project.from_name(name=PROJECT_ID)
      model = fdl.Model.from_name(project_id=project.id, name=MODEL_ID)
      
      # One-time only on migration from v1/v2: Before publishing events, update your model
      # with the event unique identifier and event timestamp as these are now Model properties
      # instead of publish() method parameters.
      model.event_ts_col = 'timestamp'
      model.event_id_col = 'event_id'
      model.update()
      
      job = model.publish(source=production_df, update=False)
      # The publish() method is asynchronous by default as in previous versions. 
      # Use the publish job's wait() method if sychronous behavior is desired.
      # job.wait() 

      For examples of updating labels in 3.x, refer to publish API documentation.

    Publish Production Events Streaming

    • Pre-requisite:

      PROJECT_ID = 'YOUR_PROJECT_NAME'
      MODEL_ID = 'YOUR_MODEL_NAME'
      event_dict = [{
        'A': [0],                   # suppose 'A' is the target
        'B': [0],                   # suppose 'B' is the medadata
      }]
      event_id = 7342881            # event unique identifier
      event_time = '2024-05-01 00:00:00'   # event timestamp
    • 2.x:

    client.publish_event(
        project_id=PROJECT_ID,
        model_id=MODEL_ID,
        event=event_dict,
        event_timestamp=event_time,
        event_id=event_id,
        update_event= False
    )
    • 3.x:

    # setup project and model object in 3.x
    project = fdl.Project.from_name(name=PROJECT_ID)
    model = fdl.Model.from_name(project_id=project.id, name=MODEL_ID)
    
    # One-time only on migration from v1/v2: Before publishing events, update your model
    # with the event unique identifier and event timestamp as these are now Model properties
    # instead of publish() method parameters.
    model.event_ts_col = 'timestamp'
    model.event_id_col = 'event_id'
    model.update()
    
    # Add the event_id and timestamp fields to every event to be updated. Alternatively, alter 
    # your data pipeline to include these fields on the event dictionary sent to Fiddler 
    # to avoid the following step.
    event_dict['event_id'] = event_id
    event_dict['timestamp'] = event_time
    
    # The source accepts a list of 1 or more dictionaries
    model.publish(source=[event_dict])

    Custom Metrics

    Get Custom Metric

    • 2.x:

    CUSTOM_METRIC_ID = 'YOUR_METRIC_NAME'
    
    client.get_custom_metric(metric_id=METRIC_ID)
    • 3.x:

    # From UUID
    CUSTOM_METRIC_ID = '7057867c-6dd8-4915-89f2-a5f253dd4a3a'
    custom_metric = fdl.CustomMetric.get(id_=CUSTOM_METRIC_ID)
    
    # From name
    MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
    CUSTOM_METRIC_NAME = 'YOUR_METRIC_NAME'
    
    custom_metric = fdl.CustomMetric.from_name(
            name=CUSTOM_METRIC_NAME,
            model_id=MODEL_ID,
        )

    List Custom Metrics

    • 2.x:

    PROJECT_ID = 'YOUR_PROJECT_NAME'
    MODEL_ID = 'YOUR_MODEL_NAME'
    
    client.get_custom_metrics(
        project_id=PROJECT_ID,
        model_id=MODEL_ID,
    )
    • 3.x:

    MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
    
    custom_metrics = fdl.CustomMetric.list(model_id=MODEL_ID)

    Add Custom Metric

    • 2.x:

    PROJECT_ID = 'YOUR_PROJECT_NAME'
    MODEL_ID = 'YOUR_MODEL_NAME'
    CUSTOM_METRIC_NAME = 'YOUR_METRIC_NAME'
    DEFINITION = 'average("Age")'
    DESCRIPTION = 'Testing custom metrics'
    
    client.get_custom_metrics(
        name=CUSTOM_METRIC_NAME,
        project_id=PROJECT_ID,
        model_id=MODEL_ID,
        definition=DEFINITION,
        description=DESCRIPTION,
    )
    • 3.x:

    CUSTOM_METRIC_NAME = 'YOUR_METRIC_NAME'
    MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
    DEFINITION = 'average("Age")'
    DESCRIPTION = 'Testing custom metrics'
    
    custom_metric = fdl.CustomMetric(
        name=CUSTOM_METRIC_NAME,
        model_id=MODEL_ID,
        definition=DEFINITION,
        description=DESCRIPTION,
    )
    custom_metric.create()

    Delete Custom Metric

    • 2.x:

    CUSTOM_METRIC_ID = 'YOUR_METRIC_NAME'
    
    client.delete_custom_metric(metric_id=METRIC_ID)
    • 3.x:

    CUSTOM_METRIC_ID = '7057867c-6dd8-4915-89f2-a5f253dd4a3a'
    
    custom_metric = fdl.CustomMetric.get(id_=CUSTOM_METRIC_ID)
    custom_metric.delete()

    Segments

    Get Segment

    • 2.x:

    SEGMENT_ID = 'YOUR_SEGMENT_NAME'
    
    client.get_segment(segment_id=SEGMENT_ID)
    • 3.x:

    # From UUID
    SEGMENT_ID = '2c22a28b-08b8-4dd6-9238-7d7f1b5b4cb7'
    segment = fdl.Segment.get(id_=SEGMENT_ID)
    
    # From name
    MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
    SEGMENT_NAME = 'YOUR_SEGMENT_NAME'
    
    segment = fdl.Segment.from_name(
        name=SEGMENT_NAME,
        model_id=MODEL_ID,
    )

    List Segments

    • 2.x:

    PROJECT_ID = 'YOUR_PROJECT_NAME'
    MODEL_ID = 'YOUR_MODEL_NAME'
    
    client.get_segments(
        project_id=PROJECT_ID,
        model_id=MODEL_ID,
    )
    • 3.x:

    MODEL_ID = '2c22a28b-08b8-4dd6-9238-7d7f1b5b4cb7'
    
    segment = fdl.Segment.list(model_id=MODEL_ID)

    Add Segment

    • 2.x:

    PROJECT_ID = 'YOUR_PROJECT_NAME'
    MODEL_ID = 'YOUR_MODEL_NAME'
    SEGMENT_NAME = 'YOUR_SEGMENT_NAME'
    DEFINITION = 'Age < 60'
    DESCRIPTION = 'Testing segment'
    
    client.add_segment(
        name=SEGMENT_NAME,
        project_id=PROJECT_ID,
        model_id=MODEL_ID,
        definition=DEFINITION,
        description=DESCRIPTION,
    )
    • 3.x:

    SEGMENT_NAME = 'YOUR_SEGMENT_NAME'
    MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
    DEFINITION = 'Age < 60'
    DESCRIPTION = 'Testing segment'
    
    segment = fdl.Segment(
        name=SEGMENT_NAME,
        model_id=MODEL_ID,
        definition=DEFINITION,
        description=DESCRIPTION
    )
    segment.create()

    Delete Segment

    • 2.x:

    SEGMENT_ID = 'YOUR_SEGMENT_NAME'
    client.delete_segment(
      segment_id=SEGMENT_ID
    )
    • 3.x:

    SEGMENT_ID = '2c22a28b-08b8-4dd6-9238-7d7f1b5b4cb7'
    
    segment = fdl.Segment.get(id_=SEGMENT_ID)
    segment.delete()

    Alerts

    List Alert Rules

    • 2.x:

    MODEL_ID = 'YOUR_MODEL_NAME'
    
    rules = client.get_alert_rules(model_id=MODEL_ID)
    • 3.x:

    MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
    
    rules = fdl.AlertRule.list(model_id=MODEL_ID)

    \

    Add Alert Rule

    • 2.x:

    notifications_config = client.build_notifications_config(
        emails = "name@google.com",
    )
    PROJECT_ID = 'YOUR_PROJECT_NAME'
    MODEL_ID = 'YOUR_MODEL_NAME'
    
    rule = client.add_alert_rule(
        name = "Bank Churn Range Violation Alert1",
        project_id = PROJECT_ID,
        model_id = MODEL_ID,
        alert_type = fdl.AlertType.DATA_INTEGRITY,
        metric = fdl.Metric.RANGE_VIOLATION,
        bin_size = fdl.BinSize.ONE_DAY,
        compare_to = fdl.CompareTo.RAW_VALUE,
        compare_period = None,
        priority = fdl.Priority.HIGH,
        warning_threshold = 2,
        critical_threshold = 3,
        condition = fdl.AlertCondition.GREATER,
        column = "numofproducts",
        notifications_config = notifications_config
    )
    • 3.x:

    ALERT_NAME = 'YOUR_ALERT_NAME'
    METRIC_NAME = 'null_violation_count'
    MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
    
    rule = fdl.AlertRule(
      name=ALERT_NAME,
      model_id=MODEL_ID,
      metric_id=METRIC_NAME,
      priority=fdl.Priority.MEDIUM,
      compare_to=fdl.CompareTo.RAW_VALUE,
      condition=fdl.AlertCondition.GREATER,
      bin_size=fdl.BinSize.HOUR,
      critical_threshold=1,
      warning_threshold=0.32,
    )
    rule.create()

    Delete Alert Rule

    • 2.x:

    ALERT_RULE_ID = '31109d19-b8aa-4db0-a4d5-aa0706987b1b'
    
    client.delete_alert_rule(alert_rule_uuid=ALERT_RULE_ID)
    • 3.x:

    ALERT_RULE_ID = '31109d19-b8aa-4db0-a4d5-aa0706987b1b'
    
    rule = fdl.AlertRule.get(id_=ALERT_RULE_ID)
    rule.delete()

    \

    Get Triggered Alerts

    • 2.x:

    ALERT_RULE_ID = '31109d19-b8aa-4db0-a4d5-aa0706987b1b'
    
    rules = client.get_triggered_alerts(alert_rule_uuid=ALERT_RULE_ID)
    • 3.x:

    ALERT_RULE_ID = '31109d19-b8aa-4db0-a4d5-aa0706987b1b'
    
    rules = fdl.AlertRecord.list(
        alert_rule_id=ALERT_RULE_ID,
        start_time=datetime(),
        end_time=datetime()
    )

    Enable Notifications

    • 2.x:

    ALERT_RULE_ID = '31109d19-b8aa-4db0-a4d5-aa0706987b1b'
    
    notifications = client.update_alert_rule(
        alert_config_uuid=ALERT_RULE_ID,
        enable_notification=True
    )
    • 3.x:

    ALERT_RULE_ID = '31109d19-b8aa-4db0-a4d5-aa0706987b1b'
    
    rule = fdl.AlertRule.get(id_=ALERT_RULE_ID)
    rule.enable_notifications()

    Disable Notifications

    • 2.x:

    ALERT_RULE_ID = '31109d19-b8aa-4db0-a4d5-aa0706987b1b'
    
    notifications = client.update_alert_rule(
        alert_config_uuid=ALERT_RULE_ID,
        enable_notification=False
    )
    • 3.x:

    ALERT_RULE_ID = '31109d19-b8aa-4db0-a4d5-aa0706987b1b'
    
    rule = fdl.AlertRule.get(id_=ALERT_RULE_ID)
    rule.disable_notifications()

    Webhooks

    Get Webhook

    • 2.x:

    WEBHOOK_UUID = '00cb3169-7983-497c-8f3c-d25df26543b0'
    
    webhook = client.get_webhook(uuid=WEBHOOK_UUID)
    • 3.x:

    WEBHOOK_ID = '00cb3169-7983-497c-8f3c-d25df26543b0'
    
    webhook = fdl.Webhook.get(id_=WEBHOOK_ID)

    List Webhooks

    • 2.x:

    webhooks = client.get_webhooks()
    • 3.x:

    webhooks = fdl.Webhook.list()

    Add Webhook

    • 2.x:

    WEBHOOK_NAME = 'YOUR_WEBHOOK_NAME'
    WEBHOOK_URL = 'https://hooks.slack.com/services/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'
    WEBHOOK_PROVIDER = 'SLACK'
    
    webhook = client.add_webhook(
        name=WEBHOOK_NAME,
        url=WEBHOOK_URL,
        provider=WEBHOOK_PROVIDER
    )
    • 3.x:

    WEBHOOK_NAME = 'YOUR_WEBHOOK_NAME'
    WEBHOOK_URL = 'https://hooks.slack.com/services/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'
    WEBHOOK_PROVIDER = 'SLACK'
    
    webhook = fdl.Webhook(
        name=WEBHOOK_NAME,
        url=WEBHOOK_URL,
        provider=WEBHOOK_PROVIDER
    )
    webhook.create()

    Update Webhook

    • 2.x:

    WEBHOOK_UUID = '00cb3169-7983-497c-8f3c-d25df26543b0'
    WEBHOOK_NAME = 'YOUR_WEBHOOK_NAME'
    WEBHOOK_URL = 'https://hooks.slack.com/services/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'
    WEBHOOK_PROVIDER = 'SLACK'
    
    webhook = client.update_webhook(
      uuid=WEBHOOK_UUID,
      name=WEBHOOK_NAME,
      url=WEBHOOK_URL,
      provider=WEBHOOK_PROVIDER
    )
    • 3.x:

    WEBHOOK_ID = '00cb3169-7983-497c-8f3c-d25df26543b0'
    
    webhook = fdl.Webhook.get(id_=WEBHOOK_ID)
    webhook.name = 'YOUR_WEBHOOK_NAME_CHANGE'
    webhook.update()

    Delete Webhook

    • 2.x:

    WEBHOOK_UUID = '00cb3169-7983-497c-8f3c-d25df26543b0'
    
    webhook = client.delete_webhook(uuid=WEBHOOK_UUID)
    • 3.x:

    WEBHOOK_ID = '00cb3169-7983-497c-8f3c-d25df26543b0'
    
    webhook = fdl.Webhook.get(id_=WEBHOOK_ID)
    webhook.delete()

    XAI

    Get Explanation

    • 2.x:

    PROJECT_ID = 'YOUR_PROJECT_NAME'
    MODEL_ID = 'YOUR_MODEL_NAME'
    
    # RowDataSource
    explain = client.get_explanation(
      project_id=PROJECT_ID,
      model_id=MODEL_ID,
      input_data_source=fdl.RowDataSource(row={})
    )
    # EventIdDataSource
    explain = client.get_explanation(
      project_id=PROJECT_ID,
      model_id=MODEL_ID,
      input_data_source=fdl.EventIdDataSource()
    )
    • 3.x:

    MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
    
    # RowDataSource
    model = fdl.Model.get(id_=MODEL_ID)
    explain = model.explain(
        input_data_source=fdl.RowDataSource(row={})
    )
    
    # EventIdDataSource
    model = fdl.Model.get(id_=MODEL_ID)
    explain = model.explain(
        input_data_source=fdl.EventIdDataSource()
    )

    Get Fairness

    • 2.x:

    PROJECT_ID = 'YOUR_PROJECT_NAME'
    MODEL_ID = 'YOUR_MODEL_NAME'
    
    # DatasetDataSource
    fairness = client.get_fairness(
        project_id=PROJECT_ID,
        model_id=MODEL_ID,
        data_source=fdl.DatasetDataSource(),
        protected_features=[],
        positive_outcome='',
    )
    # SqlSliceQueryDataSource
    fairness = client.get_fairness(
        project_id=PROJECT_ID,
        model_id=MODEL_ID,
        data_source=fdl.SqlSliceQueryDataSource(),
        protected_features=[],
        positive_outcome='',
    )
    • 3.x:

    MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
    
    # DatasetDataSource
    model = fdl.Model.get(id_=MODEL_ID)
    fairness = model.get_fairness(
        data_source=fdl.DatasetDataSource(),
        protected_features=[],
        positive_outcome='',
    )
    
    # SqlSliceQueryDataSource
    model = fdl.Model.get(id_=MODEL_ID)
    fairness = model.get_fairness(
        data_source=fdl.SqlSliceQueryDataSource(),
        protected_features=[],
        positive_outcome='',
    )

    Get Feature Impact

    • 2.x:

    PROJECT_ID = 'YOUR_PROJECT_NAME'
    MODEL_ID = 'YOUR_MODEL_NAME'
    
    # DatasetDataSource
    impact =client.get_feature_impact(
      project_id=PROJECT_ID,
      model_id=MODEL_ID,
      data_source=fdl.DatasetDataSource()
    )
    
    # SqlSliceQueryDataSource
    impact = client.get_feature_impact(
      project_id=PROJECT_ID,
      model_id=MODEL_ID,
      data_source=fdl.SqlSliceQueryDataSource()
    )
    • 3.x:

    MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
    
    # DatasetDataSource
    model = fdl.Model.get(id_=MODEL_ID)
    impact = model.get_feature_impact(
      data_source=fdl.DatasetDataSource()
    )
    
    # SqlSliceQueryDataSource
    model = fdl.Model.get(id_=MODEL_ID)
    impact = model.get_feature_impact(
        data_source=fdl.SqlSliceQueryDataSource()
    )

    Get Feature Importance

    • 2.x:

    PROJECT_ID = 'YOUR_PROJECT_NAME'
    MODEL_ID = 'YOUR_MODEL_NAME'
    
    # DatasetDataSource
    importance = client.get_feature_importance(
      project_id=PROJECT_ID,
      model_id=MODEL_ID,
      data_source=fdl.DatasetDataSource()
    )
    
    # SqlSliceQueryDataSource
    importance = client.get_feature_importance(
      project_id=PROJECT_ID,
      model_id=MODEL_ID,
      data_source=fdl.SqlSliceQueryDataSource()
    )
    • 3.x:

    MODEL_ID = 'e38ab1ad-1a50-40b8-8bee-ab33cd8b9b93'
    
    # DatasetDataSource
    model = fdl.Model.get(id_=MODEL_ID)
    importance = model.get_feature_importance(
            data_source=fdl.DatasetDataSource()
    )
    
    # SqlSliceQueryDataSource
    model = fdl.Model.get(id_=MODEL_ID)
    importance = model.get_feature_importance(
            data_source=fdl.SqlSliceQueryDataSource()
    )

    Get Mutual Information

    • 2.x:

    PROJECT_ID = 'YOUR_PROJECT_NAME'
    DATASET_ID = 'YOUR_DATASET_NAME'
    QUERY=f'select * from production.{MODEL_NAME} limit 10'
    
    mutual_info = client.get_mutual_information(