From 8857a4335a8257053c3a2976961b034e8fcf2da2 Mon Sep 17 00:00:00 2001
From: Yvette Zhang <yvette+github@clarifai.com>
Date: Thu, 30 May 2024 13:25:38 -0400
Subject: [PATCH] Version 10.4.0

---
 VERSION                                       |    2 +-
 build.gradle                                  |    2 +-
 .../com/clarifai/grpc/api/AppDuplication.java |   42 +-
 .../grpc/api/AppDuplicationOrBuilder.java     |   12 +-
 .../com/clarifai/grpc/api/CloudProvider.java  |  763 +++
 .../grpc/api/CloudProviderOrBuilder.java      |   49 +
 .../grpc/api/CloudRegionOrBuilder.java        |   54 -
 .../com/clarifai/grpc/api/ComputeCluster.java | 1740 +++++++
 .../grpc/api/ComputeClusterOrBuilder.java     |  152 +
 .../com/clarifai/grpc/api/ConceptQuery.java   |  589 ++-
 .../grpc/api/ConceptQueryOrBuilder.java       |   58 +-
 .../api/DeleteComputeClustersRequest.java     |  904 ++++
 ...DeleteComputeClustersRequestOrBuilder.java |   77 +
 .../grpc/api/DeleteNodepoolsRequest.java      | 1042 +++++
 .../api/DeleteNodepoolsRequestOrBuilder.java  |   89 +
 .../grpc/api/DeleteRunnersRequest.java        |  168 +-
 .../api/DeleteRunnersRequestOrBuilder.java    |   20 +-
 .../com/clarifai/grpc/api/Deployment.java     |  508 ++
 .../grpc/api/DeploymentOrBuilder.java         |   63 +
 .../clarifai/grpc/api/EvalTestSetEntry.java   |    8 +-
 .../grpc/api/EvalTestSetEntryOrBuilder.java   |    4 +-
 .../java/com/clarifai/grpc/api/FrameInfo.java |    8 +-
 .../clarifai/grpc/api/FrameInfoOrBuilder.java |    2 +-
 .../grpc/api/GetComputeClusterRequest.java    |  803 ++++
 .../GetComputeClusterRequestOrBuilder.java    |   48 +
 .../clarifai/grpc/api/GetNodepoolRequest.java |  895 ++++
 .../grpc/api/GetNodepoolRequestOrBuilder.java |   48 +
 .../clarifai/grpc/api/GetRunnerRequest.java   |  158 +-
 .../grpc/api/GetRunnerRequestOrBuilder.java   |   16 +-
 .../com/clarifai/grpc/api/GetTaskRequest.java |   26 +
 .../grpc/api/GetTaskRequestOrBuilder.java     |    8 +
 .../{CloudRegion.java => InstanceType.java}   |  683 ++-
 .../grpc/api/InstanceTypeOrBuilder.java       |   56 +
 .../com/clarifai/grpc/api/LabelCount.java     |   14 +-
 .../grpc/api/LabelCountOrBuilder.java         |    4 +-
 .../clarifai/grpc/api/ListAppsRequest.java    |   42 +-
 .../grpc/api/ListAppsRequestOrBuilder.java    |   12 +-
 .../grpc/api/ListComputeClustersRequest.java  |  825 ++++
 .../ListComputeClustersRequestOrBuilder.java  |   58 +
 .../grpc/api/ListDatasetsRequest.java         |   14 +-
 .../api/ListDatasetsRequestOrBuilder.java     |    4 +-
 .../clarifai/grpc/api/ListModelsRequest.java  |   36 +-
 .../grpc/api/ListModelsRequestOrBuilder.java  |   10 +-
 .../clarifai/grpc/api/ListModulesRequest.java |   22 +-
 .../grpc/api/ListModulesRequestOrBuilder.java |    6 +-
 .../grpc/api/ListNodepoolsRequest.java        |  915 ++++
 .../api/ListNodepoolsRequestOrBuilder.java    |   58 +
 .../grpc/api/ListRunnerItemsRequest.java      |  158 +-
 .../api/ListRunnerItemsRequestOrBuilder.java  |   16 +-
 .../clarifai/grpc/api/ListRunnersRequest.java |  170 +-
 .../grpc/api/ListRunnersRequestOrBuilder.java |   16 +-
 .../clarifai/grpc/api/ListTasksRequest.java   |   26 +
 .../grpc/api/ListTasksRequestOrBuilder.java   |    8 +
 .../grpc/api/ListWorkflowsRequest.java        |   42 +-
 .../api/ListWorkflowsRequestOrBuilder.java    |   12 +-
 .../com/clarifai/grpc/api/MetricsSummary.java |   16 +-
 .../grpc/api/MetricsSummaryOrBuilder.java     |    4 +-
 .../java/com/clarifai/grpc/api/Model.java     |   36 +-
 .../com/clarifai/grpc/api/ModelOrBuilder.java |   12 +-
 .../grpc/api/MultiComputeClusterResponse.java |  960 ++++
 .../MultiComputeClusterResponseOrBuilder.java |   48 +
 .../grpc/api/MultiNodepoolResponse.java       |  960 ++++
 .../api/MultiNodepoolResponseOrBuilder.java   |   48 +
 .../clarifai/grpc/api/NodeCapacityType.java   |  820 ++++
 .../grpc/api/NodeCapacityTypeOrBuilder.java   |   38 +
 .../java/com/clarifai/grpc/api/Nodepool.java  | 2360 +++++++---
 .../clarifai/grpc/api/NodepoolOrBuilder.java  |  236 +-
 .../com/clarifai/grpc/api/OutputConfig.java   |   58 +-
 .../grpc/api/OutputConfigOrBuilder.java       |   18 +-
 .../grpc/api/PatchNodepoolsRequest.java       | 1279 +++++
 .../api/PatchNodepoolsRequestOrBuilder.java   |   82 +
 .../grpc/api/PostComputeClustersRequest.java  | 1100 +++++
 .../PostComputeClustersRequestOrBuilder.java  |   80 +
 .../api/PostModelVersionsUploadConfig.java    |  127 +-
 ...ostModelVersionsUploadConfigOrBuilder.java |   22 +-
 .../clarifai/grpc/api/PostModelsRequest.java  |    8 +-
 .../grpc/api/PostModelsRequestOrBuilder.java  |    4 +-
 .../grpc/api/PostNodepoolsRequest.java        | 1238 +++++
 .../api/PostNodepoolsRequestOrBuilder.java    |   92 +
 .../api/PostRunnerItemOutputsRequest.java     |  294 +-
 ...PostRunnerItemOutputsRequestOrBuilder.java |   44 +-
 .../clarifai/grpc/api/PostRunnersRequest.java |  138 +
 .../grpc/api/PostRunnersRequestOrBuilder.java |   12 +
 .../grpc/api/PostSearchesRequest.java         |    8 +-
 .../api/PostSearchesRequestOrBuilder.java     |    4 +-
 .../java/com/clarifai/grpc/api/Resources.java | 2125 +++++----
 .../java/com/clarifai/grpc/api/Runner.java    |  787 +---
 .../clarifai/grpc/api/RunnerOrBuilder.java    |   97 +-
 .../java/com/clarifai/grpc/api/Service.java   | 4130 +++++++++--------
 .../api/SingleComputeClusterResponse.java     |  797 ++++
 ...SingleComputeClusterResponseOrBuilder.java |   39 +
 .../grpc/api/SingleNodepoolResponse.java      |  797 ++++
 .../api/SingleNodepoolResponseOrBuilder.java  |   39 +
 src/main/java/com/clarifai/grpc/api/Task.java |   26 +-
 .../com/clarifai/grpc/api/TaskMetrics.java    |  188 +
 .../grpc/api/TaskMetricsOrBuilder.java        |   15 +
 .../com/clarifai/grpc/api/TaskOrBuilder.java  |    8 +-
 .../com/clarifai/grpc/api/TaskReview.java     |   26 +-
 .../clarifai/grpc/api/TaskReviewMetrics.java  |  586 +++
 .../grpc/api/TaskReviewMetricsOrBuilder.java  |   30 +
 .../grpc/api/TaskReviewOrBuilder.java         |    8 +-
 .../grpc/api/TaskStatusCountPerUser.java      |   14 +-
 .../api/TaskStatusCountPerUserOrBuilder.java  |    4 +-
 .../com/clarifai/grpc/api/TaskWorker.java     |   26 +-
 .../grpc/api/TaskWorkerOrBuilder.java         |    8 +-
 src/main/java/com/clarifai/grpc/api/User.java |  250 +-
 .../com/clarifai/grpc/api/UserOrBuilder.java  |   52 +-
 .../java/com/clarifai/grpc/api/V2Grpc.java    |  720 ++-
 .../java/com/clarifai/grpc/api/Video.java     |   14 +-
 .../com/clarifai/grpc/api/VideoOrBuilder.java |    4 +-
 .../com/clarifai/grpc/api/WorkflowResult.java |    8 +-
 .../grpc/api/WorkflowResultOrBuilder.java     |    4 +-
 .../clarifai/grpc/api/status/StatusCode.java  |  121 +
 .../grpc/api/status/StatusCodeOuterClass.java |  546 +--
 .../java/com/clarifai/grpc/auth/scope/S.java  |   70 +
 .../com/clarifai/grpc/auth/scope/Scope.java   |   24 +-
 116 files changed, 27642 insertions(+), 5632 deletions(-)
 create mode 100644 src/main/java/com/clarifai/grpc/api/CloudProvider.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/CloudProviderOrBuilder.java
 delete mode 100644 src/main/java/com/clarifai/grpc/api/CloudRegionOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/ComputeCluster.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/ComputeClusterOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/DeleteComputeClustersRequest.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/DeleteComputeClustersRequestOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/DeleteNodepoolsRequest.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/DeleteNodepoolsRequestOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/GetComputeClusterRequest.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/GetComputeClusterRequestOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/GetNodepoolRequest.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/GetNodepoolRequestOrBuilder.java
 rename src/main/java/com/clarifai/grpc/api/{CloudRegion.java => InstanceType.java} (55%)
 create mode 100644 src/main/java/com/clarifai/grpc/api/InstanceTypeOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/ListComputeClustersRequest.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/ListComputeClustersRequestOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/ListNodepoolsRequest.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/ListNodepoolsRequestOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/MultiComputeClusterResponse.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/MultiComputeClusterResponseOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/MultiNodepoolResponse.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/MultiNodepoolResponseOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/NodeCapacityType.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/NodeCapacityTypeOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/PatchNodepoolsRequest.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/PatchNodepoolsRequestOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/PostComputeClustersRequest.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/PostComputeClustersRequestOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/PostNodepoolsRequest.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/PostNodepoolsRequestOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/SingleComputeClusterResponse.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/SingleComputeClusterResponseOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/SingleNodepoolResponse.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/SingleNodepoolResponseOrBuilder.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/TaskReviewMetrics.java
 create mode 100644 src/main/java/com/clarifai/grpc/api/TaskReviewMetricsOrBuilder.java

diff --git a/VERSION b/VERSION
index a004d77..816c071 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-10.3.3
+10.4.0
diff --git a/build.gradle b/build.gradle
index 770e329..5b8ea2e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -41,7 +41,7 @@ nexusPublishing {
 }
 
 group = 'com.clarifai'
-version = '10.3.3'
+version = '10.4.0'
 
 repositories {
     mavenCentral()
diff --git a/src/main/java/com/clarifai/grpc/api/AppDuplication.java b/src/main/java/com/clarifai/grpc/api/AppDuplication.java
index 6550bd5..d5025df 100644
--- a/src/main/java/com/clarifai/grpc/api/AppDuplication.java
+++ b/src/main/java/com/clarifai/grpc/api/AppDuplication.java
@@ -316,7 +316,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
    *
    * <code>string existing_app_id = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.existing_app_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2919
+   *     See proto/clarifai/api/resources.proto;l=2937
    * @return The existingAppId.
    */
   @java.lang.Override
@@ -342,7 +342,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
    *
    * <code>string existing_app_id = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.existing_app_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2919
+   *     See proto/clarifai/api/resources.proto;l=2937
    * @return The bytes for existingAppId.
    */
   @java.lang.Override
@@ -372,7 +372,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
    *
    * <code>string new_app_id = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.new_app_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2927
+   *     See proto/clarifai/api/resources.proto;l=2945
    * @return The newAppId.
    */
   @java.lang.Override
@@ -398,7 +398,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
    *
    * <code>string new_app_id = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.new_app_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2927
+   *     See proto/clarifai/api/resources.proto;l=2945
    * @return The bytes for newAppId.
    */
   @java.lang.Override
@@ -428,7 +428,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
    *
    * <code>string new_app_name = 3 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.new_app_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2935
+   *     See proto/clarifai/api/resources.proto;l=2953
    * @return The newAppName.
    */
   @java.lang.Override
@@ -454,7 +454,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
    *
    * <code>string new_app_name = 3 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.new_app_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2935
+   *     See proto/clarifai/api/resources.proto;l=2953
    * @return The bytes for newAppName.
    */
   @java.lang.Override
@@ -1621,7 +1621,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string existing_app_id = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.existing_app_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2919
+     *     See proto/clarifai/api/resources.proto;l=2937
      * @return The existingAppId.
      */
     @java.lang.Deprecated public java.lang.String getExistingAppId() {
@@ -1646,7 +1646,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string existing_app_id = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.existing_app_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2919
+     *     See proto/clarifai/api/resources.proto;l=2937
      * @return The bytes for existingAppId.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -1672,7 +1672,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string existing_app_id = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.existing_app_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2919
+     *     See proto/clarifai/api/resources.proto;l=2937
      * @param value The existingAppId to set.
      * @return This builder for chaining.
      */
@@ -1696,7 +1696,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string existing_app_id = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.existing_app_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2919
+     *     See proto/clarifai/api/resources.proto;l=2937
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearExistingAppId() {
@@ -1715,7 +1715,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string existing_app_id = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.existing_app_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2919
+     *     See proto/clarifai/api/resources.proto;l=2937
      * @param value The bytes for existingAppId to set.
      * @return This builder for chaining.
      */
@@ -1742,7 +1742,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string new_app_id = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.new_app_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2927
+     *     See proto/clarifai/api/resources.proto;l=2945
      * @return The newAppId.
      */
     @java.lang.Deprecated public java.lang.String getNewAppId() {
@@ -1767,7 +1767,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string new_app_id = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.new_app_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2927
+     *     See proto/clarifai/api/resources.proto;l=2945
      * @return The bytes for newAppId.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -1793,7 +1793,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string new_app_id = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.new_app_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2927
+     *     See proto/clarifai/api/resources.proto;l=2945
      * @param value The newAppId to set.
      * @return This builder for chaining.
      */
@@ -1817,7 +1817,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string new_app_id = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.new_app_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2927
+     *     See proto/clarifai/api/resources.proto;l=2945
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearNewAppId() {
@@ -1836,7 +1836,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string new_app_id = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.new_app_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2927
+     *     See proto/clarifai/api/resources.proto;l=2945
      * @param value The bytes for newAppId to set.
      * @return This builder for chaining.
      */
@@ -1863,7 +1863,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string new_app_name = 3 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.new_app_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2935
+     *     See proto/clarifai/api/resources.proto;l=2953
      * @return The newAppName.
      */
     @java.lang.Deprecated public java.lang.String getNewAppName() {
@@ -1888,7 +1888,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string new_app_name = 3 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.new_app_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2935
+     *     See proto/clarifai/api/resources.proto;l=2953
      * @return The bytes for newAppName.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -1914,7 +1914,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string new_app_name = 3 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.new_app_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2935
+     *     See proto/clarifai/api/resources.proto;l=2953
      * @param value The newAppName to set.
      * @return This builder for chaining.
      */
@@ -1938,7 +1938,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string new_app_name = 3 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.new_app_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2935
+     *     See proto/clarifai/api/resources.proto;l=2953
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearNewAppName() {
@@ -1957,7 +1957,7 @@ public com.clarifai.grpc.api.AppOrBuilder getDestinationAppOrBuilder() {
      *
      * <code>string new_app_name = 3 [deprecated = true];</code>
      * @deprecated clarifai.api.AppDuplication.new_app_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2935
+     *     See proto/clarifai/api/resources.proto;l=2953
      * @param value The bytes for newAppName to set.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/AppDuplicationOrBuilder.java b/src/main/java/com/clarifai/grpc/api/AppDuplicationOrBuilder.java
index 45b8dc3..fd65a9c 100644
--- a/src/main/java/com/clarifai/grpc/api/AppDuplicationOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/AppDuplicationOrBuilder.java
@@ -91,7 +91,7 @@ public interface AppDuplicationOrBuilder extends
    *
    * <code>string existing_app_id = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.existing_app_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2919
+   *     See proto/clarifai/api/resources.proto;l=2937
    * @return The existingAppId.
    */
   @java.lang.Deprecated java.lang.String getExistingAppId();
@@ -105,7 +105,7 @@ public interface AppDuplicationOrBuilder extends
    *
    * <code>string existing_app_id = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.existing_app_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2919
+   *     See proto/clarifai/api/resources.proto;l=2937
    * @return The bytes for existingAppId.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -121,7 +121,7 @@ public interface AppDuplicationOrBuilder extends
    *
    * <code>string new_app_id = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.new_app_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2927
+   *     See proto/clarifai/api/resources.proto;l=2945
    * @return The newAppId.
    */
   @java.lang.Deprecated java.lang.String getNewAppId();
@@ -135,7 +135,7 @@ public interface AppDuplicationOrBuilder extends
    *
    * <code>string new_app_id = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.new_app_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2927
+   *     See proto/clarifai/api/resources.proto;l=2945
    * @return The bytes for newAppId.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -151,7 +151,7 @@ public interface AppDuplicationOrBuilder extends
    *
    * <code>string new_app_name = 3 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.new_app_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2935
+   *     See proto/clarifai/api/resources.proto;l=2953
    * @return The newAppName.
    */
   @java.lang.Deprecated java.lang.String getNewAppName();
@@ -165,7 +165,7 @@ public interface AppDuplicationOrBuilder extends
    *
    * <code>string new_app_name = 3 [deprecated = true];</code>
    * @deprecated clarifai.api.AppDuplication.new_app_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2935
+   *     See proto/clarifai/api/resources.proto;l=2953
    * @return The bytes for newAppName.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
diff --git a/src/main/java/com/clarifai/grpc/api/CloudProvider.java b/src/main/java/com/clarifai/grpc/api/CloudProvider.java
new file mode 100644
index 0000000..19abd0f
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/CloudProvider.java
@@ -0,0 +1,763 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/resources.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * <pre>
+ * CloudProvider represents the entity that provides the infrastructure where the Nodepools are deployed.
+ * This could be a public cloud provider like AWS, GCP, Azure, etc., or a self-hosted infrastructure.
+ * </pre>
+ *
+ * Protobuf type {@code clarifai.api.CloudProvider}
+ */
+public final class CloudProvider extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.CloudProvider)
+    CloudProviderOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use CloudProvider.newBuilder() to construct.
+  private CloudProvider(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private CloudProvider() {
+    id_ = "";
+    name_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new CloudProvider();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private CloudProvider(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            id_ = s;
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            name_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_CloudProvider_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_CloudProvider_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.CloudProvider.class, com.clarifai.grpc.api.CloudProvider.Builder.class);
+  }
+
+  public static final int ID_FIELD_NUMBER = 1;
+  private volatile java.lang.Object id_;
+  /**
+   * <pre>
+   * Unique identifier of the cloud provider.
+   * </pre>
+   *
+   * <code>string id = 1;</code>
+   * @return The id.
+   */
+  @java.lang.Override
+  public java.lang.String getId() {
+    java.lang.Object ref = id_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      id_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * Unique identifier of the cloud provider.
+   * </pre>
+   *
+   * <code>string id = 1;</code>
+   * @return The bytes for id.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getIdBytes() {
+    java.lang.Object ref = id_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      id_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int NAME_FIELD_NUMBER = 2;
+  private volatile java.lang.Object name_;
+  /**
+   * <pre>
+   * Name of the cloud provider.
+   * </pre>
+   *
+   * <code>string name = 2;</code>
+   * @return The name.
+   */
+  @java.lang.Override
+  public java.lang.String getName() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      name_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * Name of the cloud provider.
+   * </pre>
+   *
+   * <code>string name = 2;</code>
+   * @return The bytes for name.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getNameBytes() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      name_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.CloudProvider)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.CloudProvider other = (com.clarifai.grpc.api.CloudProvider) obj;
+
+    if (!getId()
+        .equals(other.getId())) return false;
+    if (!getName()
+        .equals(other.getName())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + ID_FIELD_NUMBER;
+    hash = (53 * hash) + getId().hashCode();
+    hash = (37 * hash) + NAME_FIELD_NUMBER;
+    hash = (53 * hash) + getName().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.CloudProvider parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.CloudProvider parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.CloudProvider parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.CloudProvider parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.CloudProvider parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.CloudProvider parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.CloudProvider parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.CloudProvider parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.CloudProvider parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.CloudProvider parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.CloudProvider parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.CloudProvider parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.CloudProvider prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * CloudProvider represents the entity that provides the infrastructure where the Nodepools are deployed.
+   * This could be a public cloud provider like AWS, GCP, Azure, etc., or a self-hosted infrastructure.
+   * </pre>
+   *
+   * Protobuf type {@code clarifai.api.CloudProvider}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.CloudProvider)
+      com.clarifai.grpc.api.CloudProviderOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_CloudProvider_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_CloudProvider_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.CloudProvider.class, com.clarifai.grpc.api.CloudProvider.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.CloudProvider.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      id_ = "";
+
+      name_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_CloudProvider_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.CloudProvider getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.CloudProvider.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.CloudProvider build() {
+      com.clarifai.grpc.api.CloudProvider result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.CloudProvider buildPartial() {
+      com.clarifai.grpc.api.CloudProvider result = new com.clarifai.grpc.api.CloudProvider(this);
+      result.id_ = id_;
+      result.name_ = name_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.CloudProvider) {
+        return mergeFrom((com.clarifai.grpc.api.CloudProvider)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.CloudProvider other) {
+      if (other == com.clarifai.grpc.api.CloudProvider.getDefaultInstance()) return this;
+      if (!other.getId().isEmpty()) {
+        id_ = other.id_;
+        onChanged();
+      }
+      if (!other.getName().isEmpty()) {
+        name_ = other.name_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.CloudProvider parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.CloudProvider) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object id_ = "";
+    /**
+     * <pre>
+     * Unique identifier of the cloud provider.
+     * </pre>
+     *
+     * <code>string id = 1;</code>
+     * @return The id.
+     */
+    public java.lang.String getId() {
+      java.lang.Object ref = id_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        id_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * Unique identifier of the cloud provider.
+     * </pre>
+     *
+     * <code>string id = 1;</code>
+     * @return The bytes for id.
+     */
+    public com.google.protobuf.ByteString
+        getIdBytes() {
+      java.lang.Object ref = id_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        id_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * Unique identifier of the cloud provider.
+     * </pre>
+     *
+     * <code>string id = 1;</code>
+     * @param value The id to set.
+     * @return This builder for chaining.
+     */
+    public Builder setId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      id_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Unique identifier of the cloud provider.
+     * </pre>
+     *
+     * <code>string id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearId() {
+      
+      id_ = getDefaultInstance().getId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Unique identifier of the cloud provider.
+     * </pre>
+     *
+     * <code>string id = 1;</code>
+     * @param value The bytes for id to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      id_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object name_ = "";
+    /**
+     * <pre>
+     * Name of the cloud provider.
+     * </pre>
+     *
+     * <code>string name = 2;</code>
+     * @return The name.
+     */
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * Name of the cloud provider.
+     * </pre>
+     *
+     * <code>string name = 2;</code>
+     * @return The bytes for name.
+     */
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * Name of the cloud provider.
+     * </pre>
+     *
+     * <code>string name = 2;</code>
+     * @param value The name to set.
+     * @return This builder for chaining.
+     */
+    public Builder setName(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      name_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Name of the cloud provider.
+     * </pre>
+     *
+     * <code>string name = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearName() {
+      
+      name_ = getDefaultInstance().getName();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Name of the cloud provider.
+     * </pre>
+     *
+     * <code>string name = 2;</code>
+     * @param value The bytes for name to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNameBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      name_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.CloudProvider)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.CloudProvider)
+  private static final com.clarifai.grpc.api.CloudProvider DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.CloudProvider();
+  }
+
+  public static com.clarifai.grpc.api.CloudProvider getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<CloudProvider>
+      PARSER = new com.google.protobuf.AbstractParser<CloudProvider>() {
+    @java.lang.Override
+    public CloudProvider parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new CloudProvider(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<CloudProvider> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<CloudProvider> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.CloudProvider getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/CloudProviderOrBuilder.java b/src/main/java/com/clarifai/grpc/api/CloudProviderOrBuilder.java
new file mode 100644
index 0000000..57e055d
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/CloudProviderOrBuilder.java
@@ -0,0 +1,49 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/resources.proto
+
+package com.clarifai.grpc.api;
+
+public interface CloudProviderOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.CloudProvider)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * Unique identifier of the cloud provider.
+   * </pre>
+   *
+   * <code>string id = 1;</code>
+   * @return The id.
+   */
+  java.lang.String getId();
+  /**
+   * <pre>
+   * Unique identifier of the cloud provider.
+   * </pre>
+   *
+   * <code>string id = 1;</code>
+   * @return The bytes for id.
+   */
+  com.google.protobuf.ByteString
+      getIdBytes();
+
+  /**
+   * <pre>
+   * Name of the cloud provider.
+   * </pre>
+   *
+   * <code>string name = 2;</code>
+   * @return The name.
+   */
+  java.lang.String getName();
+  /**
+   * <pre>
+   * Name of the cloud provider.
+   * </pre>
+   *
+   * <code>string name = 2;</code>
+   * @return The bytes for name.
+   */
+  com.google.protobuf.ByteString
+      getNameBytes();
+}
diff --git a/src/main/java/com/clarifai/grpc/api/CloudRegionOrBuilder.java b/src/main/java/com/clarifai/grpc/api/CloudRegionOrBuilder.java
deleted file mode 100644
index 9ea7632..0000000
--- a/src/main/java/com/clarifai/grpc/api/CloudRegionOrBuilder.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: proto/clarifai/api/resources.proto
-
-package com.clarifai.grpc.api;
-
-public interface CloudRegionOrBuilder extends
-    // @@protoc_insertion_point(interface_extends:clarifai.api.CloudRegion)
-    com.google.protobuf.MessageOrBuilder {
-
-  /**
-   * <code>string id = 1;</code>
-   * @return The id.
-   */
-  java.lang.String getId();
-  /**
-   * <code>string id = 1;</code>
-   * @return The bytes for id.
-   */
-  com.google.protobuf.ByteString
-      getIdBytes();
-
-  /**
-   * <code>.clarifai.api.CloudRegion.Cloud cloud = 3;</code>
-   * @return The enum numeric value on the wire for cloud.
-   */
-  int getCloudValue();
-  /**
-   * <code>.clarifai.api.CloudRegion.Cloud cloud = 3;</code>
-   * @return The cloud.
-   */
-  com.clarifai.grpc.api.CloudRegion.Cloud getCloud();
-
-  /**
-   * <pre>
-   * The region. The naming here depends on the cloud choice above and will be validated
-   * against which clouds+regions that Clarifai currently supports.
-   * </pre>
-   *
-   * <code>string region = 4;</code>
-   * @return The region.
-   */
-  java.lang.String getRegion();
-  /**
-   * <pre>
-   * The region. The naming here depends on the cloud choice above and will be validated
-   * against which clouds+regions that Clarifai currently supports.
-   * </pre>
-   *
-   * <code>string region = 4;</code>
-   * @return The bytes for region.
-   */
-  com.google.protobuf.ByteString
-      getRegionBytes();
-}
diff --git a/src/main/java/com/clarifai/grpc/api/ComputeCluster.java b/src/main/java/com/clarifai/grpc/api/ComputeCluster.java
new file mode 100644
index 0000000..0a5ec8c
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/ComputeCluster.java
@@ -0,0 +1,1740 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/resources.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * <pre>
+ * We define a cluster here to be used in Nodepools and by the cloud provider.
+ * There will be one cloud provider per Cluster.
+ * This allows us to define Clusters that are VPCs within one physical cloud and have that
+ * managed by one cloud provider which can list all nodepools for that VPC to deploy them and
+ * orchestrate work within them.
+ * </pre>
+ *
+ * Protobuf type {@code clarifai.api.ComputeCluster}
+ */
+public final class ComputeCluster extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.ComputeCluster)
+    ComputeClusterOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use ComputeCluster.newBuilder() to construct.
+  private ComputeCluster(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private ComputeCluster() {
+    id_ = "";
+    description_ = "";
+    region_ = "";
+    userId_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new ComputeCluster();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private ComputeCluster(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            id_ = s;
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            description_ = s;
+            break;
+          }
+          case 26: {
+            com.clarifai.grpc.api.CloudProvider.Builder subBuilder = null;
+            if (cloudProvider_ != null) {
+              subBuilder = cloudProvider_.toBuilder();
+            }
+            cloudProvider_ = input.readMessage(com.clarifai.grpc.api.CloudProvider.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(cloudProvider_);
+              cloudProvider_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 34: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            region_ = s;
+            break;
+          }
+          case 42: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            userId_ = s;
+            break;
+          }
+          case 50: {
+            com.google.protobuf.Timestamp.Builder subBuilder = null;
+            if (createdAt_ != null) {
+              subBuilder = createdAt_.toBuilder();
+            }
+            createdAt_ = input.readMessage(com.google.protobuf.Timestamp.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(createdAt_);
+              createdAt_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 58: {
+            com.google.protobuf.Timestamp.Builder subBuilder = null;
+            if (modifiedAt_ != null) {
+              subBuilder = modifiedAt_.toBuilder();
+            }
+            modifiedAt_ = input.readMessage(com.google.protobuf.Timestamp.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(modifiedAt_);
+              modifiedAt_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_ComputeCluster_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_ComputeCluster_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.ComputeCluster.class, com.clarifai.grpc.api.ComputeCluster.Builder.class);
+  }
+
+  public static final int ID_FIELD_NUMBER = 1;
+  private volatile java.lang.Object id_;
+  /**
+   * <code>string id = 1;</code>
+   * @return The id.
+   */
+  @java.lang.Override
+  public java.lang.String getId() {
+    java.lang.Object ref = id_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      id_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string id = 1;</code>
+   * @return The bytes for id.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getIdBytes() {
+    java.lang.Object ref = id_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      id_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int DESCRIPTION_FIELD_NUMBER = 2;
+  private volatile java.lang.Object description_;
+  /**
+   * <pre>
+   * Short description of cluster region.
+   * </pre>
+   *
+   * <code>string description = 2;</code>
+   * @return The description.
+   */
+  @java.lang.Override
+  public java.lang.String getDescription() {
+    java.lang.Object ref = description_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      description_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * Short description of cluster region.
+   * </pre>
+   *
+   * <code>string description = 2;</code>
+   * @return The bytes for description.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getDescriptionBytes() {
+    java.lang.Object ref = description_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      description_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CLOUD_PROVIDER_FIELD_NUMBER = 3;
+  private com.clarifai.grpc.api.CloudProvider cloudProvider_;
+  /**
+   * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+   * @return Whether the cloudProvider field is set.
+   */
+  @java.lang.Override
+  public boolean hasCloudProvider() {
+    return cloudProvider_ != null;
+  }
+  /**
+   * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+   * @return The cloudProvider.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.CloudProvider getCloudProvider() {
+    return cloudProvider_ == null ? com.clarifai.grpc.api.CloudProvider.getDefaultInstance() : cloudProvider_;
+  }
+  /**
+   * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.CloudProviderOrBuilder getCloudProviderOrBuilder() {
+    return getCloudProvider();
+  }
+
+  public static final int REGION_FIELD_NUMBER = 4;
+  private volatile java.lang.Object region_;
+  /**
+   * <pre>
+   * The region. The naming here depends on the cluster choice above and will be validated
+   * against which clusters+regions that Clarifai currently supports.
+   * </pre>
+   *
+   * <code>string region = 4;</code>
+   * @return The region.
+   */
+  @java.lang.Override
+  public java.lang.String getRegion() {
+    java.lang.Object ref = region_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      region_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * The region. The naming here depends on the cluster choice above and will be validated
+   * against which clusters+regions that Clarifai currently supports.
+   * </pre>
+   *
+   * <code>string region = 4;</code>
+   * @return The bytes for region.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getRegionBytes() {
+    java.lang.Object ref = region_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      region_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int USER_ID_FIELD_NUMBER = 5;
+  private volatile java.lang.Object userId_;
+  /**
+   * <pre>
+   * The user/org that this compute cluster belongs to.
+   * </pre>
+   *
+   * <code>string user_id = 5;</code>
+   * @return The userId.
+   */
+  @java.lang.Override
+  public java.lang.String getUserId() {
+    java.lang.Object ref = userId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      userId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * The user/org that this compute cluster belongs to.
+   * </pre>
+   *
+   * <code>string user_id = 5;</code>
+   * @return The bytes for userId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getUserIdBytes() {
+    java.lang.Object ref = userId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      userId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CREATED_AT_FIELD_NUMBER = 6;
+  private com.google.protobuf.Timestamp createdAt_;
+  /**
+   * <pre>
+   * When the compute cluster was created.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp created_at = 6;</code>
+   * @return Whether the createdAt field is set.
+   */
+  @java.lang.Override
+  public boolean hasCreatedAt() {
+    return createdAt_ != null;
+  }
+  /**
+   * <pre>
+   * When the compute cluster was created.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp created_at = 6;</code>
+   * @return The createdAt.
+   */
+  @java.lang.Override
+  public com.google.protobuf.Timestamp getCreatedAt() {
+    return createdAt_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : createdAt_;
+  }
+  /**
+   * <pre>
+   * When the compute cluster was created.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp created_at = 6;</code>
+   */
+  @java.lang.Override
+  public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
+    return getCreatedAt();
+  }
+
+  public static final int MODIFIED_AT_FIELD_NUMBER = 7;
+  private com.google.protobuf.Timestamp modifiedAt_;
+  /**
+   * <pre>
+   * When the compute cluster was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+   * @return Whether the modifiedAt field is set.
+   */
+  @java.lang.Override
+  public boolean hasModifiedAt() {
+    return modifiedAt_ != null;
+  }
+  /**
+   * <pre>
+   * When the compute cluster was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+   * @return The modifiedAt.
+   */
+  @java.lang.Override
+  public com.google.protobuf.Timestamp getModifiedAt() {
+    return modifiedAt_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : modifiedAt_;
+  }
+  /**
+   * <pre>
+   * When the compute cluster was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+   */
+  @java.lang.Override
+  public com.google.protobuf.TimestampOrBuilder getModifiedAtOrBuilder() {
+    return getModifiedAt();
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, description_);
+    }
+    if (cloudProvider_ != null) {
+      output.writeMessage(3, getCloudProvider());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(region_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 4, region_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 5, userId_);
+    }
+    if (createdAt_ != null) {
+      output.writeMessage(6, getCreatedAt());
+    }
+    if (modifiedAt_ != null) {
+      output.writeMessage(7, getModifiedAt());
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, description_);
+    }
+    if (cloudProvider_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(3, getCloudProvider());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(region_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, region_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, userId_);
+    }
+    if (createdAt_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(6, getCreatedAt());
+    }
+    if (modifiedAt_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(7, getModifiedAt());
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.ComputeCluster)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.ComputeCluster other = (com.clarifai.grpc.api.ComputeCluster) obj;
+
+    if (!getId()
+        .equals(other.getId())) return false;
+    if (!getDescription()
+        .equals(other.getDescription())) return false;
+    if (hasCloudProvider() != other.hasCloudProvider()) return false;
+    if (hasCloudProvider()) {
+      if (!getCloudProvider()
+          .equals(other.getCloudProvider())) return false;
+    }
+    if (!getRegion()
+        .equals(other.getRegion())) return false;
+    if (!getUserId()
+        .equals(other.getUserId())) return false;
+    if (hasCreatedAt() != other.hasCreatedAt()) return false;
+    if (hasCreatedAt()) {
+      if (!getCreatedAt()
+          .equals(other.getCreatedAt())) return false;
+    }
+    if (hasModifiedAt() != other.hasModifiedAt()) return false;
+    if (hasModifiedAt()) {
+      if (!getModifiedAt()
+          .equals(other.getModifiedAt())) return false;
+    }
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + ID_FIELD_NUMBER;
+    hash = (53 * hash) + getId().hashCode();
+    hash = (37 * hash) + DESCRIPTION_FIELD_NUMBER;
+    hash = (53 * hash) + getDescription().hashCode();
+    if (hasCloudProvider()) {
+      hash = (37 * hash) + CLOUD_PROVIDER_FIELD_NUMBER;
+      hash = (53 * hash) + getCloudProvider().hashCode();
+    }
+    hash = (37 * hash) + REGION_FIELD_NUMBER;
+    hash = (53 * hash) + getRegion().hashCode();
+    hash = (37 * hash) + USER_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getUserId().hashCode();
+    if (hasCreatedAt()) {
+      hash = (37 * hash) + CREATED_AT_FIELD_NUMBER;
+      hash = (53 * hash) + getCreatedAt().hashCode();
+    }
+    if (hasModifiedAt()) {
+      hash = (37 * hash) + MODIFIED_AT_FIELD_NUMBER;
+      hash = (53 * hash) + getModifiedAt().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.ComputeCluster parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.ComputeCluster parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ComputeCluster parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.ComputeCluster parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ComputeCluster parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.ComputeCluster parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ComputeCluster parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.ComputeCluster parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ComputeCluster parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.ComputeCluster parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ComputeCluster parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.ComputeCluster parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.ComputeCluster prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * We define a cluster here to be used in Nodepools and by the cloud provider.
+   * There will be one cloud provider per Cluster.
+   * This allows us to define Clusters that are VPCs within one physical cloud and have that
+   * managed by one cloud provider which can list all nodepools for that VPC to deploy them and
+   * orchestrate work within them.
+   * </pre>
+   *
+   * Protobuf type {@code clarifai.api.ComputeCluster}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.ComputeCluster)
+      com.clarifai.grpc.api.ComputeClusterOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_ComputeCluster_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_ComputeCluster_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.ComputeCluster.class, com.clarifai.grpc.api.ComputeCluster.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.ComputeCluster.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      id_ = "";
+
+      description_ = "";
+
+      if (cloudProviderBuilder_ == null) {
+        cloudProvider_ = null;
+      } else {
+        cloudProvider_ = null;
+        cloudProviderBuilder_ = null;
+      }
+      region_ = "";
+
+      userId_ = "";
+
+      if (createdAtBuilder_ == null) {
+        createdAt_ = null;
+      } else {
+        createdAt_ = null;
+        createdAtBuilder_ = null;
+      }
+      if (modifiedAtBuilder_ == null) {
+        modifiedAt_ = null;
+      } else {
+        modifiedAt_ = null;
+        modifiedAtBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_ComputeCluster_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.ComputeCluster getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.ComputeCluster.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.ComputeCluster build() {
+      com.clarifai.grpc.api.ComputeCluster result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.ComputeCluster buildPartial() {
+      com.clarifai.grpc.api.ComputeCluster result = new com.clarifai.grpc.api.ComputeCluster(this);
+      result.id_ = id_;
+      result.description_ = description_;
+      if (cloudProviderBuilder_ == null) {
+        result.cloudProvider_ = cloudProvider_;
+      } else {
+        result.cloudProvider_ = cloudProviderBuilder_.build();
+      }
+      result.region_ = region_;
+      result.userId_ = userId_;
+      if (createdAtBuilder_ == null) {
+        result.createdAt_ = createdAt_;
+      } else {
+        result.createdAt_ = createdAtBuilder_.build();
+      }
+      if (modifiedAtBuilder_ == null) {
+        result.modifiedAt_ = modifiedAt_;
+      } else {
+        result.modifiedAt_ = modifiedAtBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.ComputeCluster) {
+        return mergeFrom((com.clarifai.grpc.api.ComputeCluster)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.ComputeCluster other) {
+      if (other == com.clarifai.grpc.api.ComputeCluster.getDefaultInstance()) return this;
+      if (!other.getId().isEmpty()) {
+        id_ = other.id_;
+        onChanged();
+      }
+      if (!other.getDescription().isEmpty()) {
+        description_ = other.description_;
+        onChanged();
+      }
+      if (other.hasCloudProvider()) {
+        mergeCloudProvider(other.getCloudProvider());
+      }
+      if (!other.getRegion().isEmpty()) {
+        region_ = other.region_;
+        onChanged();
+      }
+      if (!other.getUserId().isEmpty()) {
+        userId_ = other.userId_;
+        onChanged();
+      }
+      if (other.hasCreatedAt()) {
+        mergeCreatedAt(other.getCreatedAt());
+      }
+      if (other.hasModifiedAt()) {
+        mergeModifiedAt(other.getModifiedAt());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.ComputeCluster parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.ComputeCluster) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object id_ = "";
+    /**
+     * <code>string id = 1;</code>
+     * @return The id.
+     */
+    public java.lang.String getId() {
+      java.lang.Object ref = id_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        id_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string id = 1;</code>
+     * @return The bytes for id.
+     */
+    public com.google.protobuf.ByteString
+        getIdBytes() {
+      java.lang.Object ref = id_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        id_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string id = 1;</code>
+     * @param value The id to set.
+     * @return This builder for chaining.
+     */
+    public Builder setId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      id_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearId() {
+      
+      id_ = getDefaultInstance().getId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string id = 1;</code>
+     * @param value The bytes for id to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      id_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object description_ = "";
+    /**
+     * <pre>
+     * Short description of cluster region.
+     * </pre>
+     *
+     * <code>string description = 2;</code>
+     * @return The description.
+     */
+    public java.lang.String getDescription() {
+      java.lang.Object ref = description_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        description_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * Short description of cluster region.
+     * </pre>
+     *
+     * <code>string description = 2;</code>
+     * @return The bytes for description.
+     */
+    public com.google.protobuf.ByteString
+        getDescriptionBytes() {
+      java.lang.Object ref = description_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        description_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * Short description of cluster region.
+     * </pre>
+     *
+     * <code>string description = 2;</code>
+     * @param value The description to set.
+     * @return This builder for chaining.
+     */
+    public Builder setDescription(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      description_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Short description of cluster region.
+     * </pre>
+     *
+     * <code>string description = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearDescription() {
+      
+      description_ = getDefaultInstance().getDescription();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Short description of cluster region.
+     * </pre>
+     *
+     * <code>string description = 2;</code>
+     * @param value The bytes for description to set.
+     * @return This builder for chaining.
+     */
+    public Builder setDescriptionBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      description_ = value;
+      onChanged();
+      return this;
+    }
+
+    private com.clarifai.grpc.api.CloudProvider cloudProvider_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.CloudProvider, com.clarifai.grpc.api.CloudProvider.Builder, com.clarifai.grpc.api.CloudProviderOrBuilder> cloudProviderBuilder_;
+    /**
+     * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+     * @return Whether the cloudProvider field is set.
+     */
+    public boolean hasCloudProvider() {
+      return cloudProviderBuilder_ != null || cloudProvider_ != null;
+    }
+    /**
+     * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+     * @return The cloudProvider.
+     */
+    public com.clarifai.grpc.api.CloudProvider getCloudProvider() {
+      if (cloudProviderBuilder_ == null) {
+        return cloudProvider_ == null ? com.clarifai.grpc.api.CloudProvider.getDefaultInstance() : cloudProvider_;
+      } else {
+        return cloudProviderBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+     */
+    public Builder setCloudProvider(com.clarifai.grpc.api.CloudProvider value) {
+      if (cloudProviderBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        cloudProvider_ = value;
+        onChanged();
+      } else {
+        cloudProviderBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+     */
+    public Builder setCloudProvider(
+        com.clarifai.grpc.api.CloudProvider.Builder builderForValue) {
+      if (cloudProviderBuilder_ == null) {
+        cloudProvider_ = builderForValue.build();
+        onChanged();
+      } else {
+        cloudProviderBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+     */
+    public Builder mergeCloudProvider(com.clarifai.grpc.api.CloudProvider value) {
+      if (cloudProviderBuilder_ == null) {
+        if (cloudProvider_ != null) {
+          cloudProvider_ =
+            com.clarifai.grpc.api.CloudProvider.newBuilder(cloudProvider_).mergeFrom(value).buildPartial();
+        } else {
+          cloudProvider_ = value;
+        }
+        onChanged();
+      } else {
+        cloudProviderBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+     */
+    public Builder clearCloudProvider() {
+      if (cloudProviderBuilder_ == null) {
+        cloudProvider_ = null;
+        onChanged();
+      } else {
+        cloudProvider_ = null;
+        cloudProviderBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+     */
+    public com.clarifai.grpc.api.CloudProvider.Builder getCloudProviderBuilder() {
+      
+      onChanged();
+      return getCloudProviderFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+     */
+    public com.clarifai.grpc.api.CloudProviderOrBuilder getCloudProviderOrBuilder() {
+      if (cloudProviderBuilder_ != null) {
+        return cloudProviderBuilder_.getMessageOrBuilder();
+      } else {
+        return cloudProvider_ == null ?
+            com.clarifai.grpc.api.CloudProvider.getDefaultInstance() : cloudProvider_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.CloudProvider, com.clarifai.grpc.api.CloudProvider.Builder, com.clarifai.grpc.api.CloudProviderOrBuilder> 
+        getCloudProviderFieldBuilder() {
+      if (cloudProviderBuilder_ == null) {
+        cloudProviderBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.CloudProvider, com.clarifai.grpc.api.CloudProvider.Builder, com.clarifai.grpc.api.CloudProviderOrBuilder>(
+                getCloudProvider(),
+                getParentForChildren(),
+                isClean());
+        cloudProvider_ = null;
+      }
+      return cloudProviderBuilder_;
+    }
+
+    private java.lang.Object region_ = "";
+    /**
+     * <pre>
+     * The region. The naming here depends on the cluster choice above and will be validated
+     * against which clusters+regions that Clarifai currently supports.
+     * </pre>
+     *
+     * <code>string region = 4;</code>
+     * @return The region.
+     */
+    public java.lang.String getRegion() {
+      java.lang.Object ref = region_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        region_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The region. The naming here depends on the cluster choice above and will be validated
+     * against which clusters+regions that Clarifai currently supports.
+     * </pre>
+     *
+     * <code>string region = 4;</code>
+     * @return The bytes for region.
+     */
+    public com.google.protobuf.ByteString
+        getRegionBytes() {
+      java.lang.Object ref = region_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        region_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The region. The naming here depends on the cluster choice above and will be validated
+     * against which clusters+regions that Clarifai currently supports.
+     * </pre>
+     *
+     * <code>string region = 4;</code>
+     * @param value The region to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRegion(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      region_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The region. The naming here depends on the cluster choice above and will be validated
+     * against which clusters+regions that Clarifai currently supports.
+     * </pre>
+     *
+     * <code>string region = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearRegion() {
+      
+      region_ = getDefaultInstance().getRegion();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The region. The naming here depends on the cluster choice above and will be validated
+     * against which clusters+regions that Clarifai currently supports.
+     * </pre>
+     *
+     * <code>string region = 4;</code>
+     * @param value The bytes for region to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRegionBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      region_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object userId_ = "";
+    /**
+     * <pre>
+     * The user/org that this compute cluster belongs to.
+     * </pre>
+     *
+     * <code>string user_id = 5;</code>
+     * @return The userId.
+     */
+    public java.lang.String getUserId() {
+      java.lang.Object ref = userId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        userId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The user/org that this compute cluster belongs to.
+     * </pre>
+     *
+     * <code>string user_id = 5;</code>
+     * @return The bytes for userId.
+     */
+    public com.google.protobuf.ByteString
+        getUserIdBytes() {
+      java.lang.Object ref = userId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        userId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The user/org that this compute cluster belongs to.
+     * </pre>
+     *
+     * <code>string user_id = 5;</code>
+     * @param value The userId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUserId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      userId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The user/org that this compute cluster belongs to.
+     * </pre>
+     *
+     * <code>string user_id = 5;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUserId() {
+      
+      userId_ = getDefaultInstance().getUserId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The user/org that this compute cluster belongs to.
+     * </pre>
+     *
+     * <code>string user_id = 5;</code>
+     * @param value The bytes for userId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUserIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      userId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private com.google.protobuf.Timestamp createdAt_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> createdAtBuilder_;
+    /**
+     * <pre>
+     * When the compute cluster was created.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp created_at = 6;</code>
+     * @return Whether the createdAt field is set.
+     */
+    public boolean hasCreatedAt() {
+      return createdAtBuilder_ != null || createdAt_ != null;
+    }
+    /**
+     * <pre>
+     * When the compute cluster was created.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp created_at = 6;</code>
+     * @return The createdAt.
+     */
+    public com.google.protobuf.Timestamp getCreatedAt() {
+      if (createdAtBuilder_ == null) {
+        return createdAt_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : createdAt_;
+      } else {
+        return createdAtBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * When the compute cluster was created.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp created_at = 6;</code>
+     */
+    public Builder setCreatedAt(com.google.protobuf.Timestamp value) {
+      if (createdAtBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        createdAt_ = value;
+        onChanged();
+      } else {
+        createdAtBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * When the compute cluster was created.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp created_at = 6;</code>
+     */
+    public Builder setCreatedAt(
+        com.google.protobuf.Timestamp.Builder builderForValue) {
+      if (createdAtBuilder_ == null) {
+        createdAt_ = builderForValue.build();
+        onChanged();
+      } else {
+        createdAtBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * When the compute cluster was created.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp created_at = 6;</code>
+     */
+    public Builder mergeCreatedAt(com.google.protobuf.Timestamp value) {
+      if (createdAtBuilder_ == null) {
+        if (createdAt_ != null) {
+          createdAt_ =
+            com.google.protobuf.Timestamp.newBuilder(createdAt_).mergeFrom(value).buildPartial();
+        } else {
+          createdAt_ = value;
+        }
+        onChanged();
+      } else {
+        createdAtBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * When the compute cluster was created.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp created_at = 6;</code>
+     */
+    public Builder clearCreatedAt() {
+      if (createdAtBuilder_ == null) {
+        createdAt_ = null;
+        onChanged();
+      } else {
+        createdAt_ = null;
+        createdAtBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * When the compute cluster was created.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp created_at = 6;</code>
+     */
+    public com.google.protobuf.Timestamp.Builder getCreatedAtBuilder() {
+      
+      onChanged();
+      return getCreatedAtFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * When the compute cluster was created.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp created_at = 6;</code>
+     */
+    public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
+      if (createdAtBuilder_ != null) {
+        return createdAtBuilder_.getMessageOrBuilder();
+      } else {
+        return createdAt_ == null ?
+            com.google.protobuf.Timestamp.getDefaultInstance() : createdAt_;
+      }
+    }
+    /**
+     * <pre>
+     * When the compute cluster was created.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp created_at = 6;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> 
+        getCreatedAtFieldBuilder() {
+      if (createdAtBuilder_ == null) {
+        createdAtBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>(
+                getCreatedAt(),
+                getParentForChildren(),
+                isClean());
+        createdAt_ = null;
+      }
+      return createdAtBuilder_;
+    }
+
+    private com.google.protobuf.Timestamp modifiedAt_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> modifiedAtBuilder_;
+    /**
+     * <pre>
+     * When the compute cluster was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+     * @return Whether the modifiedAt field is set.
+     */
+    public boolean hasModifiedAt() {
+      return modifiedAtBuilder_ != null || modifiedAt_ != null;
+    }
+    /**
+     * <pre>
+     * When the compute cluster was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+     * @return The modifiedAt.
+     */
+    public com.google.protobuf.Timestamp getModifiedAt() {
+      if (modifiedAtBuilder_ == null) {
+        return modifiedAt_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : modifiedAt_;
+      } else {
+        return modifiedAtBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * When the compute cluster was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+     */
+    public Builder setModifiedAt(com.google.protobuf.Timestamp value) {
+      if (modifiedAtBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        modifiedAt_ = value;
+        onChanged();
+      } else {
+        modifiedAtBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * When the compute cluster was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+     */
+    public Builder setModifiedAt(
+        com.google.protobuf.Timestamp.Builder builderForValue) {
+      if (modifiedAtBuilder_ == null) {
+        modifiedAt_ = builderForValue.build();
+        onChanged();
+      } else {
+        modifiedAtBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * When the compute cluster was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+     */
+    public Builder mergeModifiedAt(com.google.protobuf.Timestamp value) {
+      if (modifiedAtBuilder_ == null) {
+        if (modifiedAt_ != null) {
+          modifiedAt_ =
+            com.google.protobuf.Timestamp.newBuilder(modifiedAt_).mergeFrom(value).buildPartial();
+        } else {
+          modifiedAt_ = value;
+        }
+        onChanged();
+      } else {
+        modifiedAtBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * When the compute cluster was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+     */
+    public Builder clearModifiedAt() {
+      if (modifiedAtBuilder_ == null) {
+        modifiedAt_ = null;
+        onChanged();
+      } else {
+        modifiedAt_ = null;
+        modifiedAtBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * When the compute cluster was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+     */
+    public com.google.protobuf.Timestamp.Builder getModifiedAtBuilder() {
+      
+      onChanged();
+      return getModifiedAtFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * When the compute cluster was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+     */
+    public com.google.protobuf.TimestampOrBuilder getModifiedAtOrBuilder() {
+      if (modifiedAtBuilder_ != null) {
+        return modifiedAtBuilder_.getMessageOrBuilder();
+      } else {
+        return modifiedAt_ == null ?
+            com.google.protobuf.Timestamp.getDefaultInstance() : modifiedAt_;
+      }
+    }
+    /**
+     * <pre>
+     * When the compute cluster was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> 
+        getModifiedAtFieldBuilder() {
+      if (modifiedAtBuilder_ == null) {
+        modifiedAtBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>(
+                getModifiedAt(),
+                getParentForChildren(),
+                isClean());
+        modifiedAt_ = null;
+      }
+      return modifiedAtBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.ComputeCluster)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.ComputeCluster)
+  private static final com.clarifai.grpc.api.ComputeCluster DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.ComputeCluster();
+  }
+
+  public static com.clarifai.grpc.api.ComputeCluster getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<ComputeCluster>
+      PARSER = new com.google.protobuf.AbstractParser<ComputeCluster>() {
+    @java.lang.Override
+    public ComputeCluster parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new ComputeCluster(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<ComputeCluster> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<ComputeCluster> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.ComputeCluster getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/ComputeClusterOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ComputeClusterOrBuilder.java
new file mode 100644
index 0000000..c96405c
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/ComputeClusterOrBuilder.java
@@ -0,0 +1,152 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/resources.proto
+
+package com.clarifai.grpc.api;
+
+public interface ComputeClusterOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.ComputeCluster)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string id = 1;</code>
+   * @return The id.
+   */
+  java.lang.String getId();
+  /**
+   * <code>string id = 1;</code>
+   * @return The bytes for id.
+   */
+  com.google.protobuf.ByteString
+      getIdBytes();
+
+  /**
+   * <pre>
+   * Short description of cluster region.
+   * </pre>
+   *
+   * <code>string description = 2;</code>
+   * @return The description.
+   */
+  java.lang.String getDescription();
+  /**
+   * <pre>
+   * Short description of cluster region.
+   * </pre>
+   *
+   * <code>string description = 2;</code>
+   * @return The bytes for description.
+   */
+  com.google.protobuf.ByteString
+      getDescriptionBytes();
+
+  /**
+   * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+   * @return Whether the cloudProvider field is set.
+   */
+  boolean hasCloudProvider();
+  /**
+   * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+   * @return The cloudProvider.
+   */
+  com.clarifai.grpc.api.CloudProvider getCloudProvider();
+  /**
+   * <code>.clarifai.api.CloudProvider cloud_provider = 3;</code>
+   */
+  com.clarifai.grpc.api.CloudProviderOrBuilder getCloudProviderOrBuilder();
+
+  /**
+   * <pre>
+   * The region. The naming here depends on the cluster choice above and will be validated
+   * against which clusters+regions that Clarifai currently supports.
+   * </pre>
+   *
+   * <code>string region = 4;</code>
+   * @return The region.
+   */
+  java.lang.String getRegion();
+  /**
+   * <pre>
+   * The region. The naming here depends on the cluster choice above and will be validated
+   * against which clusters+regions that Clarifai currently supports.
+   * </pre>
+   *
+   * <code>string region = 4;</code>
+   * @return The bytes for region.
+   */
+  com.google.protobuf.ByteString
+      getRegionBytes();
+
+  /**
+   * <pre>
+   * The user/org that this compute cluster belongs to.
+   * </pre>
+   *
+   * <code>string user_id = 5;</code>
+   * @return The userId.
+   */
+  java.lang.String getUserId();
+  /**
+   * <pre>
+   * The user/org that this compute cluster belongs to.
+   * </pre>
+   *
+   * <code>string user_id = 5;</code>
+   * @return The bytes for userId.
+   */
+  com.google.protobuf.ByteString
+      getUserIdBytes();
+
+  /**
+   * <pre>
+   * When the compute cluster was created.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp created_at = 6;</code>
+   * @return Whether the createdAt field is set.
+   */
+  boolean hasCreatedAt();
+  /**
+   * <pre>
+   * When the compute cluster was created.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp created_at = 6;</code>
+   * @return The createdAt.
+   */
+  com.google.protobuf.Timestamp getCreatedAt();
+  /**
+   * <pre>
+   * When the compute cluster was created.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp created_at = 6;</code>
+   */
+  com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder();
+
+  /**
+   * <pre>
+   * When the compute cluster was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+   * @return Whether the modifiedAt field is set.
+   */
+  boolean hasModifiedAt();
+  /**
+   * <pre>
+   * When the compute cluster was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+   * @return The modifiedAt.
+   */
+  com.google.protobuf.Timestamp getModifiedAt();
+  /**
+   * <pre>
+   * When the compute cluster was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 7;</code>
+   */
+  com.google.protobuf.TimestampOrBuilder getModifiedAtOrBuilder();
+}
diff --git a/src/main/java/com/clarifai/grpc/api/ConceptQuery.java b/src/main/java/com/clarifai/grpc/api/ConceptQuery.java
index 71de198..0012c15 100644
--- a/src/main/java/com/clarifai/grpc/api/ConceptQuery.java
+++ b/src/main/java/com/clarifai/grpc/api/ConceptQuery.java
@@ -98,6 +98,34 @@ private ConceptQuery(
             input.popLimit(oldLimit);
             break;
           }
+          case 42: {
+            com.clarifai.grpc.api.Model.Builder subBuilder = null;
+            if (sourceCase_ == 5) {
+              subBuilder = ((com.clarifai.grpc.api.Model) source_).toBuilder();
+            }
+            source_ =
+                input.readMessage(com.clarifai.grpc.api.Model.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom((com.clarifai.grpc.api.Model) source_);
+              source_ = subBuilder.buildPartial();
+            }
+            sourceCase_ = 5;
+            break;
+          }
+          case 50: {
+            com.clarifai.grpc.api.Workflow.Builder subBuilder = null;
+            if (sourceCase_ == 6) {
+              subBuilder = ((com.clarifai.grpc.api.Workflow) source_).toBuilder();
+            }
+            source_ =
+                input.readMessage(com.clarifai.grpc.api.Workflow.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom((com.clarifai.grpc.api.Workflow) source_);
+              source_ = subBuilder.buildPartial();
+            }
+            sourceCase_ = 6;
+            break;
+          }
           default: {
             if (!parseUnknownField(
                 input, unknownFields, extensionRegistry, tag)) {
@@ -135,6 +163,47 @@ private ConceptQuery(
             com.clarifai.grpc.api.ConceptQuery.class, com.clarifai.grpc.api.ConceptQuery.Builder.class);
   }
 
+  private int sourceCase_ = 0;
+  private java.lang.Object source_;
+  public enum SourceCase
+      implements com.google.protobuf.Internal.EnumLite,
+          com.google.protobuf.AbstractMessage.InternalOneOfEnum {
+    MODEL(5),
+    WORKFLOW(6),
+    SOURCE_NOT_SET(0);
+    private final int value;
+    private SourceCase(int value) {
+      this.value = value;
+    }
+    /**
+     * @param value The number of the enum to look for.
+     * @return The enum associated with the given number.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static SourceCase valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static SourceCase forNumber(int value) {
+      switch (value) {
+        case 5: return MODEL;
+        case 6: return WORKFLOW;
+        case 0: return SOURCE_NOT_SET;
+        default: return null;
+      }
+    }
+    public int getNumber() {
+      return this.value;
+    }
+  };
+
+  public SourceCase
+  getSourceCase() {
+    return SourceCase.forNumber(
+        sourceCase_);
+  }
+
   public static final int NAME_FIELD_NUMBER = 1;
   private volatile java.lang.Object name_;
   /**
@@ -231,14 +300,16 @@ public java.lang.String getLanguage() {
   private volatile java.lang.Object workflowId_;
   /**
    * <pre>
-   * The id of workflow. If no id is provided, then application base workflow is used.
+   * Deprecated: Use workflow.id instead.
    * </pre>
    *
-   * <code>string workflow_id = 3;</code>
+   * <code>string workflow_id = 3 [deprecated = true];</code>
+   * @deprecated clarifai.api.ConceptQuery.workflow_id is deprecated.
+   *     See proto/clarifai/api/resources.proto;l=495
    * @return The workflowId.
    */
   @java.lang.Override
-  public java.lang.String getWorkflowId() {
+  @java.lang.Deprecated public java.lang.String getWorkflowId() {
     java.lang.Object ref = workflowId_;
     if (ref instanceof java.lang.String) {
       return (java.lang.String) ref;
@@ -252,14 +323,16 @@ public java.lang.String getWorkflowId() {
   }
   /**
    * <pre>
-   * The id of workflow. If no id is provided, then application base workflow is used.
+   * Deprecated: Use workflow.id instead.
    * </pre>
    *
-   * <code>string workflow_id = 3;</code>
+   * <code>string workflow_id = 3 [deprecated = true];</code>
+   * @deprecated clarifai.api.ConceptQuery.workflow_id is deprecated.
+   *     See proto/clarifai/api/resources.proto;l=495
    * @return The bytes for workflowId.
    */
   @java.lang.Override
-  public com.google.protobuf.ByteString
+  @java.lang.Deprecated public com.google.protobuf.ByteString
       getWorkflowIdBytes() {
     java.lang.Object ref = workflowId_;
     if (ref instanceof java.lang.String) {
@@ -287,7 +360,7 @@ public com.clarifai.grpc.api.WorkflowModelUseCase convert(java.lang.Integer from
           };
   /**
    * <pre>
-   * The concepts must belong to workflow models with specified use cases.
+   * The concepts must belong to models with specified use cases.
    * Multiple values are joined using an OR condition.
    * </pre>
    *
@@ -301,7 +374,7 @@ public java.util.List<com.clarifai.grpc.api.WorkflowModelUseCase> getUseCasesLis
   }
   /**
    * <pre>
-   * The concepts must belong to workflow models with specified use cases.
+   * The concepts must belong to models with specified use cases.
    * Multiple values are joined using an OR condition.
    * </pre>
    *
@@ -314,7 +387,7 @@ public int getUseCasesCount() {
   }
   /**
    * <pre>
-   * The concepts must belong to workflow models with specified use cases.
+   * The concepts must belong to models with specified use cases.
    * Multiple values are joined using an OR condition.
    * </pre>
    *
@@ -328,7 +401,7 @@ public com.clarifai.grpc.api.WorkflowModelUseCase getUseCases(int index) {
   }
   /**
    * <pre>
-   * The concepts must belong to workflow models with specified use cases.
+   * The concepts must belong to models with specified use cases.
    * Multiple values are joined using an OR condition.
    * </pre>
    *
@@ -342,7 +415,7 @@ public com.clarifai.grpc.api.WorkflowModelUseCase getUseCases(int index) {
   }
   /**
    * <pre>
-   * The concepts must belong to workflow models with specified use cases.
+   * The concepts must belong to models with specified use cases.
    * Multiple values are joined using an OR condition.
    * </pre>
    *
@@ -356,6 +429,68 @@ public int getUseCasesValue(int index) {
   }
   private int useCasesMemoizedSerializedSize;
 
+  public static final int MODEL_FIELD_NUMBER = 5;
+  /**
+   * <code>.clarifai.api.Model model = 5;</code>
+   * @return Whether the model field is set.
+   */
+  @java.lang.Override
+  public boolean hasModel() {
+    return sourceCase_ == 5;
+  }
+  /**
+   * <code>.clarifai.api.Model model = 5;</code>
+   * @return The model.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.Model getModel() {
+    if (sourceCase_ == 5) {
+       return (com.clarifai.grpc.api.Model) source_;
+    }
+    return com.clarifai.grpc.api.Model.getDefaultInstance();
+  }
+  /**
+   * <code>.clarifai.api.Model model = 5;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.ModelOrBuilder getModelOrBuilder() {
+    if (sourceCase_ == 5) {
+       return (com.clarifai.grpc.api.Model) source_;
+    }
+    return com.clarifai.grpc.api.Model.getDefaultInstance();
+  }
+
+  public static final int WORKFLOW_FIELD_NUMBER = 6;
+  /**
+   * <code>.clarifai.api.Workflow workflow = 6;</code>
+   * @return Whether the workflow field is set.
+   */
+  @java.lang.Override
+  public boolean hasWorkflow() {
+    return sourceCase_ == 6;
+  }
+  /**
+   * <code>.clarifai.api.Workflow workflow = 6;</code>
+   * @return The workflow.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.Workflow getWorkflow() {
+    if (sourceCase_ == 6) {
+       return (com.clarifai.grpc.api.Workflow) source_;
+    }
+    return com.clarifai.grpc.api.Workflow.getDefaultInstance();
+  }
+  /**
+   * <code>.clarifai.api.Workflow workflow = 6;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.WorkflowOrBuilder getWorkflowOrBuilder() {
+    if (sourceCase_ == 6) {
+       return (com.clarifai.grpc.api.Workflow) source_;
+    }
+    return com.clarifai.grpc.api.Workflow.getDefaultInstance();
+  }
+
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -387,6 +522,12 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     for (int i = 0; i < useCases_.size(); i++) {
       output.writeEnumNoTag(useCases_.get(i));
     }
+    if (sourceCase_ == 5) {
+      output.writeMessage(5, (com.clarifai.grpc.api.Model) source_);
+    }
+    if (sourceCase_ == 6) {
+      output.writeMessage(6, (com.clarifai.grpc.api.Workflow) source_);
+    }
     unknownFields.writeTo(output);
   }
 
@@ -417,6 +558,14 @@ public int getSerializedSize() {
           .computeUInt32SizeNoTag(dataSize);
       }useCasesMemoizedSerializedSize = dataSize;
     }
+    if (sourceCase_ == 5) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(5, (com.clarifai.grpc.api.Model) source_);
+    }
+    if (sourceCase_ == 6) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(6, (com.clarifai.grpc.api.Workflow) source_);
+    }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
     return size;
@@ -439,6 +588,19 @@ public boolean equals(final java.lang.Object obj) {
     if (!getWorkflowId()
         .equals(other.getWorkflowId())) return false;
     if (!useCases_.equals(other.useCases_)) return false;
+    if (!getSourceCase().equals(other.getSourceCase())) return false;
+    switch (sourceCase_) {
+      case 5:
+        if (!getModel()
+            .equals(other.getModel())) return false;
+        break;
+      case 6:
+        if (!getWorkflow()
+            .equals(other.getWorkflow())) return false;
+        break;
+      case 0:
+      default:
+    }
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -460,6 +622,18 @@ public int hashCode() {
       hash = (37 * hash) + USE_CASES_FIELD_NUMBER;
       hash = (53 * hash) + useCases_.hashCode();
     }
+    switch (sourceCase_) {
+      case 5:
+        hash = (37 * hash) + MODEL_FIELD_NUMBER;
+        hash = (53 * hash) + getModel().hashCode();
+        break;
+      case 6:
+        hash = (37 * hash) + WORKFLOW_FIELD_NUMBER;
+        hash = (53 * hash) + getWorkflow().hashCode();
+        break;
+      case 0:
+      default:
+    }
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -605,6 +779,8 @@ public Builder clear() {
 
       useCases_ = java.util.Collections.emptyList();
       bitField0_ = (bitField0_ & ~0x00000001);
+      sourceCase_ = 0;
+      source_ = null;
       return this;
     }
 
@@ -640,6 +816,21 @@ public com.clarifai.grpc.api.ConceptQuery buildPartial() {
         bitField0_ = (bitField0_ & ~0x00000001);
       }
       result.useCases_ = useCases_;
+      if (sourceCase_ == 5) {
+        if (modelBuilder_ == null) {
+          result.source_ = source_;
+        } else {
+          result.source_ = modelBuilder_.build();
+        }
+      }
+      if (sourceCase_ == 6) {
+        if (workflowBuilder_ == null) {
+          result.source_ = source_;
+        } else {
+          result.source_ = workflowBuilder_.build();
+        }
+      }
+      result.sourceCase_ = sourceCase_;
       onBuilt();
       return result;
     }
@@ -710,6 +901,19 @@ public Builder mergeFrom(com.clarifai.grpc.api.ConceptQuery other) {
         }
         onChanged();
       }
+      switch (other.getSourceCase()) {
+        case MODEL: {
+          mergeModel(other.getModel());
+          break;
+        }
+        case WORKFLOW: {
+          mergeWorkflow(other.getWorkflow());
+          break;
+        }
+        case SOURCE_NOT_SET: {
+          break;
+        }
+      }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
       return this;
@@ -738,6 +942,21 @@ public Builder mergeFrom(
       }
       return this;
     }
+    private int sourceCase_ = 0;
+    private java.lang.Object source_;
+    public SourceCase
+        getSourceCase() {
+      return SourceCase.forNumber(
+          sourceCase_);
+    }
+
+    public Builder clearSource() {
+      sourceCase_ = 0;
+      source_ = null;
+      onChanged();
+      return this;
+    }
+
     private int bitField0_;
 
     private java.lang.Object name_ = "";
@@ -935,13 +1154,15 @@ public Builder setLanguageBytes(
     private java.lang.Object workflowId_ = "";
     /**
      * <pre>
-     * The id of workflow. If no id is provided, then application base workflow is used.
+     * Deprecated: Use workflow.id instead.
      * </pre>
      *
-     * <code>string workflow_id = 3;</code>
+     * <code>string workflow_id = 3 [deprecated = true];</code>
+     * @deprecated clarifai.api.ConceptQuery.workflow_id is deprecated.
+     *     See proto/clarifai/api/resources.proto;l=495
      * @return The workflowId.
      */
-    public java.lang.String getWorkflowId() {
+    @java.lang.Deprecated public java.lang.String getWorkflowId() {
       java.lang.Object ref = workflowId_;
       if (!(ref instanceof java.lang.String)) {
         com.google.protobuf.ByteString bs =
@@ -955,13 +1176,15 @@ public java.lang.String getWorkflowId() {
     }
     /**
      * <pre>
-     * The id of workflow. If no id is provided, then application base workflow is used.
+     * Deprecated: Use workflow.id instead.
      * </pre>
      *
-     * <code>string workflow_id = 3;</code>
+     * <code>string workflow_id = 3 [deprecated = true];</code>
+     * @deprecated clarifai.api.ConceptQuery.workflow_id is deprecated.
+     *     See proto/clarifai/api/resources.proto;l=495
      * @return The bytes for workflowId.
      */
-    public com.google.protobuf.ByteString
+    @java.lang.Deprecated public com.google.protobuf.ByteString
         getWorkflowIdBytes() {
       java.lang.Object ref = workflowId_;
       if (ref instanceof String) {
@@ -976,14 +1199,16 @@ public java.lang.String getWorkflowId() {
     }
     /**
      * <pre>
-     * The id of workflow. If no id is provided, then application base workflow is used.
+     * Deprecated: Use workflow.id instead.
      * </pre>
      *
-     * <code>string workflow_id = 3;</code>
+     * <code>string workflow_id = 3 [deprecated = true];</code>
+     * @deprecated clarifai.api.ConceptQuery.workflow_id is deprecated.
+     *     See proto/clarifai/api/resources.proto;l=495
      * @param value The workflowId to set.
      * @return This builder for chaining.
      */
-    public Builder setWorkflowId(
+    @java.lang.Deprecated public Builder setWorkflowId(
         java.lang.String value) {
       if (value == null) {
     throw new NullPointerException();
@@ -995,13 +1220,15 @@ public Builder setWorkflowId(
     }
     /**
      * <pre>
-     * The id of workflow. If no id is provided, then application base workflow is used.
+     * Deprecated: Use workflow.id instead.
      * </pre>
      *
-     * <code>string workflow_id = 3;</code>
+     * <code>string workflow_id = 3 [deprecated = true];</code>
+     * @deprecated clarifai.api.ConceptQuery.workflow_id is deprecated.
+     *     See proto/clarifai/api/resources.proto;l=495
      * @return This builder for chaining.
      */
-    public Builder clearWorkflowId() {
+    @java.lang.Deprecated public Builder clearWorkflowId() {
       
       workflowId_ = getDefaultInstance().getWorkflowId();
       onChanged();
@@ -1009,14 +1236,16 @@ public Builder clearWorkflowId() {
     }
     /**
      * <pre>
-     * The id of workflow. If no id is provided, then application base workflow is used.
+     * Deprecated: Use workflow.id instead.
      * </pre>
      *
-     * <code>string workflow_id = 3;</code>
+     * <code>string workflow_id = 3 [deprecated = true];</code>
+     * @deprecated clarifai.api.ConceptQuery.workflow_id is deprecated.
+     *     See proto/clarifai/api/resources.proto;l=495
      * @param value The bytes for workflowId to set.
      * @return This builder for chaining.
      */
-    public Builder setWorkflowIdBytes(
+    @java.lang.Deprecated public Builder setWorkflowIdBytes(
         com.google.protobuf.ByteString value) {
       if (value == null) {
     throw new NullPointerException();
@@ -1038,7 +1267,7 @@ private void ensureUseCasesIsMutable() {
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1051,7 +1280,7 @@ public java.util.List<com.clarifai.grpc.api.WorkflowModelUseCase> getUseCasesLis
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1063,7 +1292,7 @@ public int getUseCasesCount() {
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1076,7 +1305,7 @@ public com.clarifai.grpc.api.WorkflowModelUseCase getUseCases(int index) {
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1097,7 +1326,7 @@ public Builder setUseCases(
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1116,7 +1345,7 @@ public Builder addUseCases(com.clarifai.grpc.api.WorkflowModelUseCase value) {
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1135,7 +1364,7 @@ public Builder addAllUseCases(
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1150,7 +1379,7 @@ public Builder clearUseCases() {
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1163,7 +1392,7 @@ public Builder clearUseCases() {
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1176,7 +1405,7 @@ public int getUseCasesValue(int index) {
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1194,7 +1423,7 @@ public Builder setUseCasesValue(
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1210,7 +1439,7 @@ public Builder addUseCasesValue(int value) {
     }
     /**
      * <pre>
-     * The concepts must belong to workflow models with specified use cases.
+     * The concepts must belong to models with specified use cases.
      * Multiple values are joined using an OR condition.
      * </pre>
      *
@@ -1227,6 +1456,290 @@ public Builder addAllUseCasesValue(
       onChanged();
       return this;
     }
+
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.Model, com.clarifai.grpc.api.Model.Builder, com.clarifai.grpc.api.ModelOrBuilder> modelBuilder_;
+    /**
+     * <code>.clarifai.api.Model model = 5;</code>
+     * @return Whether the model field is set.
+     */
+    @java.lang.Override
+    public boolean hasModel() {
+      return sourceCase_ == 5;
+    }
+    /**
+     * <code>.clarifai.api.Model model = 5;</code>
+     * @return The model.
+     */
+    @java.lang.Override
+    public com.clarifai.grpc.api.Model getModel() {
+      if (modelBuilder_ == null) {
+        if (sourceCase_ == 5) {
+          return (com.clarifai.grpc.api.Model) source_;
+        }
+        return com.clarifai.grpc.api.Model.getDefaultInstance();
+      } else {
+        if (sourceCase_ == 5) {
+          return modelBuilder_.getMessage();
+        }
+        return com.clarifai.grpc.api.Model.getDefaultInstance();
+      }
+    }
+    /**
+     * <code>.clarifai.api.Model model = 5;</code>
+     */
+    public Builder setModel(com.clarifai.grpc.api.Model value) {
+      if (modelBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        source_ = value;
+        onChanged();
+      } else {
+        modelBuilder_.setMessage(value);
+      }
+      sourceCase_ = 5;
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Model model = 5;</code>
+     */
+    public Builder setModel(
+        com.clarifai.grpc.api.Model.Builder builderForValue) {
+      if (modelBuilder_ == null) {
+        source_ = builderForValue.build();
+        onChanged();
+      } else {
+        modelBuilder_.setMessage(builderForValue.build());
+      }
+      sourceCase_ = 5;
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Model model = 5;</code>
+     */
+    public Builder mergeModel(com.clarifai.grpc.api.Model value) {
+      if (modelBuilder_ == null) {
+        if (sourceCase_ == 5 &&
+            source_ != com.clarifai.grpc.api.Model.getDefaultInstance()) {
+          source_ = com.clarifai.grpc.api.Model.newBuilder((com.clarifai.grpc.api.Model) source_)
+              .mergeFrom(value).buildPartial();
+        } else {
+          source_ = value;
+        }
+        onChanged();
+      } else {
+        if (sourceCase_ == 5) {
+          modelBuilder_.mergeFrom(value);
+        } else {
+          modelBuilder_.setMessage(value);
+        }
+      }
+      sourceCase_ = 5;
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Model model = 5;</code>
+     */
+    public Builder clearModel() {
+      if (modelBuilder_ == null) {
+        if (sourceCase_ == 5) {
+          sourceCase_ = 0;
+          source_ = null;
+          onChanged();
+        }
+      } else {
+        if (sourceCase_ == 5) {
+          sourceCase_ = 0;
+          source_ = null;
+        }
+        modelBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Model model = 5;</code>
+     */
+    public com.clarifai.grpc.api.Model.Builder getModelBuilder() {
+      return getModelFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.Model model = 5;</code>
+     */
+    @java.lang.Override
+    public com.clarifai.grpc.api.ModelOrBuilder getModelOrBuilder() {
+      if ((sourceCase_ == 5) && (modelBuilder_ != null)) {
+        return modelBuilder_.getMessageOrBuilder();
+      } else {
+        if (sourceCase_ == 5) {
+          return (com.clarifai.grpc.api.Model) source_;
+        }
+        return com.clarifai.grpc.api.Model.getDefaultInstance();
+      }
+    }
+    /**
+     * <code>.clarifai.api.Model model = 5;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.Model, com.clarifai.grpc.api.Model.Builder, com.clarifai.grpc.api.ModelOrBuilder> 
+        getModelFieldBuilder() {
+      if (modelBuilder_ == null) {
+        if (!(sourceCase_ == 5)) {
+          source_ = com.clarifai.grpc.api.Model.getDefaultInstance();
+        }
+        modelBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.Model, com.clarifai.grpc.api.Model.Builder, com.clarifai.grpc.api.ModelOrBuilder>(
+                (com.clarifai.grpc.api.Model) source_,
+                getParentForChildren(),
+                isClean());
+        source_ = null;
+      }
+      sourceCase_ = 5;
+      onChanged();;
+      return modelBuilder_;
+    }
+
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.Workflow, com.clarifai.grpc.api.Workflow.Builder, com.clarifai.grpc.api.WorkflowOrBuilder> workflowBuilder_;
+    /**
+     * <code>.clarifai.api.Workflow workflow = 6;</code>
+     * @return Whether the workflow field is set.
+     */
+    @java.lang.Override
+    public boolean hasWorkflow() {
+      return sourceCase_ == 6;
+    }
+    /**
+     * <code>.clarifai.api.Workflow workflow = 6;</code>
+     * @return The workflow.
+     */
+    @java.lang.Override
+    public com.clarifai.grpc.api.Workflow getWorkflow() {
+      if (workflowBuilder_ == null) {
+        if (sourceCase_ == 6) {
+          return (com.clarifai.grpc.api.Workflow) source_;
+        }
+        return com.clarifai.grpc.api.Workflow.getDefaultInstance();
+      } else {
+        if (sourceCase_ == 6) {
+          return workflowBuilder_.getMessage();
+        }
+        return com.clarifai.grpc.api.Workflow.getDefaultInstance();
+      }
+    }
+    /**
+     * <code>.clarifai.api.Workflow workflow = 6;</code>
+     */
+    public Builder setWorkflow(com.clarifai.grpc.api.Workflow value) {
+      if (workflowBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        source_ = value;
+        onChanged();
+      } else {
+        workflowBuilder_.setMessage(value);
+      }
+      sourceCase_ = 6;
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Workflow workflow = 6;</code>
+     */
+    public Builder setWorkflow(
+        com.clarifai.grpc.api.Workflow.Builder builderForValue) {
+      if (workflowBuilder_ == null) {
+        source_ = builderForValue.build();
+        onChanged();
+      } else {
+        workflowBuilder_.setMessage(builderForValue.build());
+      }
+      sourceCase_ = 6;
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Workflow workflow = 6;</code>
+     */
+    public Builder mergeWorkflow(com.clarifai.grpc.api.Workflow value) {
+      if (workflowBuilder_ == null) {
+        if (sourceCase_ == 6 &&
+            source_ != com.clarifai.grpc.api.Workflow.getDefaultInstance()) {
+          source_ = com.clarifai.grpc.api.Workflow.newBuilder((com.clarifai.grpc.api.Workflow) source_)
+              .mergeFrom(value).buildPartial();
+        } else {
+          source_ = value;
+        }
+        onChanged();
+      } else {
+        if (sourceCase_ == 6) {
+          workflowBuilder_.mergeFrom(value);
+        } else {
+          workflowBuilder_.setMessage(value);
+        }
+      }
+      sourceCase_ = 6;
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Workflow workflow = 6;</code>
+     */
+    public Builder clearWorkflow() {
+      if (workflowBuilder_ == null) {
+        if (sourceCase_ == 6) {
+          sourceCase_ = 0;
+          source_ = null;
+          onChanged();
+        }
+      } else {
+        if (sourceCase_ == 6) {
+          sourceCase_ = 0;
+          source_ = null;
+        }
+        workflowBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Workflow workflow = 6;</code>
+     */
+    public com.clarifai.grpc.api.Workflow.Builder getWorkflowBuilder() {
+      return getWorkflowFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.Workflow workflow = 6;</code>
+     */
+    @java.lang.Override
+    public com.clarifai.grpc.api.WorkflowOrBuilder getWorkflowOrBuilder() {
+      if ((sourceCase_ == 6) && (workflowBuilder_ != null)) {
+        return workflowBuilder_.getMessageOrBuilder();
+      } else {
+        if (sourceCase_ == 6) {
+          return (com.clarifai.grpc.api.Workflow) source_;
+        }
+        return com.clarifai.grpc.api.Workflow.getDefaultInstance();
+      }
+    }
+    /**
+     * <code>.clarifai.api.Workflow workflow = 6;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.Workflow, com.clarifai.grpc.api.Workflow.Builder, com.clarifai.grpc.api.WorkflowOrBuilder> 
+        getWorkflowFieldBuilder() {
+      if (workflowBuilder_ == null) {
+        if (!(sourceCase_ == 6)) {
+          source_ = com.clarifai.grpc.api.Workflow.getDefaultInstance();
+        }
+        workflowBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.Workflow, com.clarifai.grpc.api.Workflow.Builder, com.clarifai.grpc.api.WorkflowOrBuilder>(
+                (com.clarifai.grpc.api.Workflow) source_,
+                getParentForChildren(),
+                isClean());
+        source_ = null;
+      }
+      sourceCase_ = 6;
+      onChanged();;
+      return workflowBuilder_;
+    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {
diff --git a/src/main/java/com/clarifai/grpc/api/ConceptQueryOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ConceptQueryOrBuilder.java
index c49bcc2..28ffa16 100644
--- a/src/main/java/com/clarifai/grpc/api/ConceptQueryOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/ConceptQueryOrBuilder.java
@@ -49,27 +49,31 @@ public interface ConceptQueryOrBuilder extends
 
   /**
    * <pre>
-   * The id of workflow. If no id is provided, then application base workflow is used.
+   * Deprecated: Use workflow.id instead.
    * </pre>
    *
-   * <code>string workflow_id = 3;</code>
+   * <code>string workflow_id = 3 [deprecated = true];</code>
+   * @deprecated clarifai.api.ConceptQuery.workflow_id is deprecated.
+   *     See proto/clarifai/api/resources.proto;l=495
    * @return The workflowId.
    */
-  java.lang.String getWorkflowId();
+  @java.lang.Deprecated java.lang.String getWorkflowId();
   /**
    * <pre>
-   * The id of workflow. If no id is provided, then application base workflow is used.
+   * Deprecated: Use workflow.id instead.
    * </pre>
    *
-   * <code>string workflow_id = 3;</code>
+   * <code>string workflow_id = 3 [deprecated = true];</code>
+   * @deprecated clarifai.api.ConceptQuery.workflow_id is deprecated.
+   *     See proto/clarifai/api/resources.proto;l=495
    * @return The bytes for workflowId.
    */
-  com.google.protobuf.ByteString
+  @java.lang.Deprecated com.google.protobuf.ByteString
       getWorkflowIdBytes();
 
   /**
    * <pre>
-   * The concepts must belong to workflow models with specified use cases.
+   * The concepts must belong to models with specified use cases.
    * Multiple values are joined using an OR condition.
    * </pre>
    *
@@ -79,7 +83,7 @@ public interface ConceptQueryOrBuilder extends
   java.util.List<com.clarifai.grpc.api.WorkflowModelUseCase> getUseCasesList();
   /**
    * <pre>
-   * The concepts must belong to workflow models with specified use cases.
+   * The concepts must belong to models with specified use cases.
    * Multiple values are joined using an OR condition.
    * </pre>
    *
@@ -89,7 +93,7 @@ public interface ConceptQueryOrBuilder extends
   int getUseCasesCount();
   /**
    * <pre>
-   * The concepts must belong to workflow models with specified use cases.
+   * The concepts must belong to models with specified use cases.
    * Multiple values are joined using an OR condition.
    * </pre>
    *
@@ -100,7 +104,7 @@ public interface ConceptQueryOrBuilder extends
   com.clarifai.grpc.api.WorkflowModelUseCase getUseCases(int index);
   /**
    * <pre>
-   * The concepts must belong to workflow models with specified use cases.
+   * The concepts must belong to models with specified use cases.
    * Multiple values are joined using an OR condition.
    * </pre>
    *
@@ -111,7 +115,7 @@ public interface ConceptQueryOrBuilder extends
   getUseCasesValueList();
   /**
    * <pre>
-   * The concepts must belong to workflow models with specified use cases.
+   * The concepts must belong to models with specified use cases.
    * Multiple values are joined using an OR condition.
    * </pre>
    *
@@ -120,4 +124,36 @@ public interface ConceptQueryOrBuilder extends
    * @return The enum numeric value on the wire of useCases at the given index.
    */
   int getUseCasesValue(int index);
+
+  /**
+   * <code>.clarifai.api.Model model = 5;</code>
+   * @return Whether the model field is set.
+   */
+  boolean hasModel();
+  /**
+   * <code>.clarifai.api.Model model = 5;</code>
+   * @return The model.
+   */
+  com.clarifai.grpc.api.Model getModel();
+  /**
+   * <code>.clarifai.api.Model model = 5;</code>
+   */
+  com.clarifai.grpc.api.ModelOrBuilder getModelOrBuilder();
+
+  /**
+   * <code>.clarifai.api.Workflow workflow = 6;</code>
+   * @return Whether the workflow field is set.
+   */
+  boolean hasWorkflow();
+  /**
+   * <code>.clarifai.api.Workflow workflow = 6;</code>
+   * @return The workflow.
+   */
+  com.clarifai.grpc.api.Workflow getWorkflow();
+  /**
+   * <code>.clarifai.api.Workflow workflow = 6;</code>
+   */
+  com.clarifai.grpc.api.WorkflowOrBuilder getWorkflowOrBuilder();
+
+  public com.clarifai.grpc.api.ConceptQuery.SourceCase getSourceCase();
 }
diff --git a/src/main/java/com/clarifai/grpc/api/DeleteComputeClustersRequest.java b/src/main/java/com/clarifai/grpc/api/DeleteComputeClustersRequest.java
new file mode 100644
index 0000000..590357a
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/DeleteComputeClustersRequest.java
@@ -0,0 +1,904 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * Protobuf type {@code clarifai.api.DeleteComputeClustersRequest}
+ */
+public final class DeleteComputeClustersRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.DeleteComputeClustersRequest)
+    DeleteComputeClustersRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use DeleteComputeClustersRequest.newBuilder() to construct.
+  private DeleteComputeClustersRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private DeleteComputeClustersRequest() {
+    ids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new DeleteComputeClustersRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private DeleteComputeClustersRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.UserAppIDSet.Builder subBuilder = null;
+            if (userAppId_ != null) {
+              subBuilder = userAppId_.toBuilder();
+            }
+            userAppId_ = input.readMessage(com.clarifai.grpc.api.UserAppIDSet.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(userAppId_);
+              userAppId_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              ids_ = new com.google.protobuf.LazyStringArrayList();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            ids_.add(s);
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        ids_ = ids_.getUnmodifiableView();
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_DeleteComputeClustersRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_DeleteComputeClustersRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.DeleteComputeClustersRequest.class, com.clarifai.grpc.api.DeleteComputeClustersRequest.Builder.class);
+  }
+
+  public static final int USER_APP_ID_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  @java.lang.Override
+  public boolean hasUserAppId() {
+    return userAppId_ != null;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+    return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+    return getUserAppId();
+  }
+
+  public static final int IDS_FIELD_NUMBER = 2;
+  private com.google.protobuf.LazyStringList ids_;
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 2;</code>
+   * @return A list containing the ids.
+   */
+  public com.google.protobuf.ProtocolStringList
+      getIdsList() {
+    return ids_;
+  }
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 2;</code>
+   * @return The count of ids.
+   */
+  public int getIdsCount() {
+    return ids_.size();
+  }
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 2;</code>
+   * @param index The index of the element to return.
+   * @return The ids at the given index.
+   */
+  public java.lang.String getIds(int index) {
+    return ids_.get(index);
+  }
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 2;</code>
+   * @param index The index of the value to return.
+   * @return The bytes of the ids at the given index.
+   */
+  public com.google.protobuf.ByteString
+      getIdsBytes(int index) {
+    return ids_.getByteString(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (userAppId_ != null) {
+      output.writeMessage(1, getUserAppId());
+    }
+    for (int i = 0; i < ids_.size(); i++) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ids_.getRaw(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (userAppId_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getUserAppId());
+    }
+    {
+      int dataSize = 0;
+      for (int i = 0; i < ids_.size(); i++) {
+        dataSize += computeStringSizeNoTag(ids_.getRaw(i));
+      }
+      size += dataSize;
+      size += 1 * getIdsList().size();
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.DeleteComputeClustersRequest)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.DeleteComputeClustersRequest other = (com.clarifai.grpc.api.DeleteComputeClustersRequest) obj;
+
+    if (hasUserAppId() != other.hasUserAppId()) return false;
+    if (hasUserAppId()) {
+      if (!getUserAppId()
+          .equals(other.getUserAppId())) return false;
+    }
+    if (!getIdsList()
+        .equals(other.getIdsList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasUserAppId()) {
+      hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getUserAppId().hashCode();
+    }
+    if (getIdsCount() > 0) {
+      hash = (37 * hash) + IDS_FIELD_NUMBER;
+      hash = (53 * hash) + getIdsList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.DeleteComputeClustersRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code clarifai.api.DeleteComputeClustersRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.DeleteComputeClustersRequest)
+      com.clarifai.grpc.api.DeleteComputeClustersRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_DeleteComputeClustersRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_DeleteComputeClustersRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.DeleteComputeClustersRequest.class, com.clarifai.grpc.api.DeleteComputeClustersRequest.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.DeleteComputeClustersRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+      ids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      bitField0_ = (bitField0_ & ~0x00000001);
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_DeleteComputeClustersRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.DeleteComputeClustersRequest getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.DeleteComputeClustersRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.DeleteComputeClustersRequest build() {
+      com.clarifai.grpc.api.DeleteComputeClustersRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.DeleteComputeClustersRequest buildPartial() {
+      com.clarifai.grpc.api.DeleteComputeClustersRequest result = new com.clarifai.grpc.api.DeleteComputeClustersRequest(this);
+      int from_bitField0_ = bitField0_;
+      if (userAppIdBuilder_ == null) {
+        result.userAppId_ = userAppId_;
+      } else {
+        result.userAppId_ = userAppIdBuilder_.build();
+      }
+      if (((bitField0_ & 0x00000001) != 0)) {
+        ids_ = ids_.getUnmodifiableView();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      }
+      result.ids_ = ids_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.DeleteComputeClustersRequest) {
+        return mergeFrom((com.clarifai.grpc.api.DeleteComputeClustersRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.DeleteComputeClustersRequest other) {
+      if (other == com.clarifai.grpc.api.DeleteComputeClustersRequest.getDefaultInstance()) return this;
+      if (other.hasUserAppId()) {
+        mergeUserAppId(other.getUserAppId());
+      }
+      if (!other.ids_.isEmpty()) {
+        if (ids_.isEmpty()) {
+          ids_ = other.ids_;
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          ensureIdsIsMutable();
+          ids_.addAll(other.ids_);
+        }
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.DeleteComputeClustersRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.DeleteComputeClustersRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> userAppIdBuilder_;
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return Whether the userAppId field is set.
+     */
+    public boolean hasUserAppId() {
+      return userAppIdBuilder_ != null || userAppId_ != null;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return The userAppId.
+     */
+    public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      } else {
+        return userAppIdBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        userAppId_ = value;
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(
+        com.clarifai.grpc.api.UserAppIDSet.Builder builderForValue) {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = builderForValue.build();
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder mergeUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (userAppId_ != null) {
+          userAppId_ =
+            com.clarifai.grpc.api.UserAppIDSet.newBuilder(userAppId_).mergeFrom(value).buildPartial();
+        } else {
+          userAppId_ = value;
+        }
+        onChanged();
+      } else {
+        userAppIdBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder clearUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+        onChanged();
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSet.Builder getUserAppIdBuilder() {
+      
+      onChanged();
+      return getUserAppIdFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+      if (userAppIdBuilder_ != null) {
+        return userAppIdBuilder_.getMessageOrBuilder();
+      } else {
+        return userAppId_ == null ?
+            com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> 
+        getUserAppIdFieldBuilder() {
+      if (userAppIdBuilder_ == null) {
+        userAppIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder>(
+                getUserAppId(),
+                getParentForChildren(),
+                isClean());
+        userAppId_ = null;
+      }
+      return userAppIdBuilder_;
+    }
+
+    private com.google.protobuf.LazyStringList ids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+    private void ensureIdsIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        ids_ = new com.google.protobuf.LazyStringArrayList(ids_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 2;</code>
+     * @return A list containing the ids.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getIdsList() {
+      return ids_.getUnmodifiableView();
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 2;</code>
+     * @return The count of ids.
+     */
+    public int getIdsCount() {
+      return ids_.size();
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 2;</code>
+     * @param index The index of the element to return.
+     * @return The ids at the given index.
+     */
+    public java.lang.String getIds(int index) {
+      return ids_.get(index);
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 2;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the ids at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getIdsBytes(int index) {
+      return ids_.getByteString(index);
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 2;</code>
+     * @param index The index to set the value at.
+     * @param value The ids to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIds(
+        int index, java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureIdsIsMutable();
+      ids_.set(index, value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 2;</code>
+     * @param value The ids to add.
+     * @return This builder for chaining.
+     */
+    public Builder addIds(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureIdsIsMutable();
+      ids_.add(value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 2;</code>
+     * @param values The ids to add.
+     * @return This builder for chaining.
+     */
+    public Builder addAllIds(
+        java.lang.Iterable<java.lang.String> values) {
+      ensureIdsIsMutable();
+      com.google.protobuf.AbstractMessageLite.Builder.addAll(
+          values, ids_);
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIds() {
+      ids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 2;</code>
+     * @param value The bytes of the ids to add.
+     * @return This builder for chaining.
+     */
+    public Builder addIdsBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      ensureIdsIsMutable();
+      ids_.add(value);
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.DeleteComputeClustersRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.DeleteComputeClustersRequest)
+  private static final com.clarifai.grpc.api.DeleteComputeClustersRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.DeleteComputeClustersRequest();
+  }
+
+  public static com.clarifai.grpc.api.DeleteComputeClustersRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<DeleteComputeClustersRequest>
+      PARSER = new com.google.protobuf.AbstractParser<DeleteComputeClustersRequest>() {
+    @java.lang.Override
+    public DeleteComputeClustersRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new DeleteComputeClustersRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<DeleteComputeClustersRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<DeleteComputeClustersRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.DeleteComputeClustersRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/DeleteComputeClustersRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/DeleteComputeClustersRequestOrBuilder.java
new file mode 100644
index 0000000..c33bb07
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/DeleteComputeClustersRequestOrBuilder.java
@@ -0,0 +1,77 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface DeleteComputeClustersRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.DeleteComputeClustersRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  boolean hasUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  com.clarifai.grpc.api.UserAppIDSet getUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
+
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 2;</code>
+   * @return A list containing the ids.
+   */
+  java.util.List<java.lang.String>
+      getIdsList();
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 2;</code>
+   * @return The count of ids.
+   */
+  int getIdsCount();
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 2;</code>
+   * @param index The index of the element to return.
+   * @return The ids at the given index.
+   */
+  java.lang.String getIds(int index);
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 2;</code>
+   * @param index The index of the value to return.
+   * @return The bytes of the ids at the given index.
+   */
+  com.google.protobuf.ByteString
+      getIdsBytes(int index);
+}
diff --git a/src/main/java/com/clarifai/grpc/api/DeleteNodepoolsRequest.java b/src/main/java/com/clarifai/grpc/api/DeleteNodepoolsRequest.java
new file mode 100644
index 0000000..5e1b0ae
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/DeleteNodepoolsRequest.java
@@ -0,0 +1,1042 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * Protobuf type {@code clarifai.api.DeleteNodepoolsRequest}
+ */
+public final class DeleteNodepoolsRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.DeleteNodepoolsRequest)
+    DeleteNodepoolsRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use DeleteNodepoolsRequest.newBuilder() to construct.
+  private DeleteNodepoolsRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private DeleteNodepoolsRequest() {
+    computeClusterId_ = "";
+    ids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new DeleteNodepoolsRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private DeleteNodepoolsRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.UserAppIDSet.Builder subBuilder = null;
+            if (userAppId_ != null) {
+              subBuilder = userAppId_.toBuilder();
+            }
+            userAppId_ = input.readMessage(com.clarifai.grpc.api.UserAppIDSet.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(userAppId_);
+              userAppId_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            computeClusterId_ = s;
+            break;
+          }
+          case 26: {
+            java.lang.String s = input.readStringRequireUtf8();
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              ids_ = new com.google.protobuf.LazyStringArrayList();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            ids_.add(s);
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        ids_ = ids_.getUnmodifiableView();
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_DeleteNodepoolsRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_DeleteNodepoolsRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.DeleteNodepoolsRequest.class, com.clarifai.grpc.api.DeleteNodepoolsRequest.Builder.class);
+  }
+
+  public static final int USER_APP_ID_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  @java.lang.Override
+  public boolean hasUserAppId() {
+    return userAppId_ != null;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+    return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+    return getUserAppId();
+  }
+
+  public static final int COMPUTE_CLUSTER_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object computeClusterId_;
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  @java.lang.Override
+  public java.lang.String getComputeClusterId() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      computeClusterId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getComputeClusterIdBytes() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      computeClusterId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int IDS_FIELD_NUMBER = 3;
+  private com.google.protobuf.LazyStringList ids_;
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 3;</code>
+   * @return A list containing the ids.
+   */
+  public com.google.protobuf.ProtocolStringList
+      getIdsList() {
+    return ids_;
+  }
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 3;</code>
+   * @return The count of ids.
+   */
+  public int getIdsCount() {
+    return ids_.size();
+  }
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 3;</code>
+   * @param index The index of the element to return.
+   * @return The ids at the given index.
+   */
+  public java.lang.String getIds(int index) {
+    return ids_.get(index);
+  }
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 3;</code>
+   * @param index The index of the value to return.
+   * @return The bytes of the ids at the given index.
+   */
+  public com.google.protobuf.ByteString
+      getIdsBytes(int index) {
+    return ids_.getByteString(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (userAppId_ != null) {
+      output.writeMessage(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, computeClusterId_);
+    }
+    for (int i = 0; i < ids_.size(); i++) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, ids_.getRaw(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (userAppId_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, computeClusterId_);
+    }
+    {
+      int dataSize = 0;
+      for (int i = 0; i < ids_.size(); i++) {
+        dataSize += computeStringSizeNoTag(ids_.getRaw(i));
+      }
+      size += dataSize;
+      size += 1 * getIdsList().size();
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.DeleteNodepoolsRequest)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.DeleteNodepoolsRequest other = (com.clarifai.grpc.api.DeleteNodepoolsRequest) obj;
+
+    if (hasUserAppId() != other.hasUserAppId()) return false;
+    if (hasUserAppId()) {
+      if (!getUserAppId()
+          .equals(other.getUserAppId())) return false;
+    }
+    if (!getComputeClusterId()
+        .equals(other.getComputeClusterId())) return false;
+    if (!getIdsList()
+        .equals(other.getIdsList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasUserAppId()) {
+      hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getUserAppId().hashCode();
+    }
+    hash = (37 * hash) + COMPUTE_CLUSTER_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getComputeClusterId().hashCode();
+    if (getIdsCount() > 0) {
+      hash = (37 * hash) + IDS_FIELD_NUMBER;
+      hash = (53 * hash) + getIdsList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.DeleteNodepoolsRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code clarifai.api.DeleteNodepoolsRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.DeleteNodepoolsRequest)
+      com.clarifai.grpc.api.DeleteNodepoolsRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_DeleteNodepoolsRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_DeleteNodepoolsRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.DeleteNodepoolsRequest.class, com.clarifai.grpc.api.DeleteNodepoolsRequest.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.DeleteNodepoolsRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+      computeClusterId_ = "";
+
+      ids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      bitField0_ = (bitField0_ & ~0x00000001);
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_DeleteNodepoolsRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.DeleteNodepoolsRequest getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.DeleteNodepoolsRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.DeleteNodepoolsRequest build() {
+      com.clarifai.grpc.api.DeleteNodepoolsRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.DeleteNodepoolsRequest buildPartial() {
+      com.clarifai.grpc.api.DeleteNodepoolsRequest result = new com.clarifai.grpc.api.DeleteNodepoolsRequest(this);
+      int from_bitField0_ = bitField0_;
+      if (userAppIdBuilder_ == null) {
+        result.userAppId_ = userAppId_;
+      } else {
+        result.userAppId_ = userAppIdBuilder_.build();
+      }
+      result.computeClusterId_ = computeClusterId_;
+      if (((bitField0_ & 0x00000001) != 0)) {
+        ids_ = ids_.getUnmodifiableView();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      }
+      result.ids_ = ids_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.DeleteNodepoolsRequest) {
+        return mergeFrom((com.clarifai.grpc.api.DeleteNodepoolsRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.DeleteNodepoolsRequest other) {
+      if (other == com.clarifai.grpc.api.DeleteNodepoolsRequest.getDefaultInstance()) return this;
+      if (other.hasUserAppId()) {
+        mergeUserAppId(other.getUserAppId());
+      }
+      if (!other.getComputeClusterId().isEmpty()) {
+        computeClusterId_ = other.computeClusterId_;
+        onChanged();
+      }
+      if (!other.ids_.isEmpty()) {
+        if (ids_.isEmpty()) {
+          ids_ = other.ids_;
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          ensureIdsIsMutable();
+          ids_.addAll(other.ids_);
+        }
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.DeleteNodepoolsRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.DeleteNodepoolsRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> userAppIdBuilder_;
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return Whether the userAppId field is set.
+     */
+    public boolean hasUserAppId() {
+      return userAppIdBuilder_ != null || userAppId_ != null;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return The userAppId.
+     */
+    public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      } else {
+        return userAppIdBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        userAppId_ = value;
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(
+        com.clarifai.grpc.api.UserAppIDSet.Builder builderForValue) {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = builderForValue.build();
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder mergeUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (userAppId_ != null) {
+          userAppId_ =
+            com.clarifai.grpc.api.UserAppIDSet.newBuilder(userAppId_).mergeFrom(value).buildPartial();
+        } else {
+          userAppId_ = value;
+        }
+        onChanged();
+      } else {
+        userAppIdBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder clearUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+        onChanged();
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSet.Builder getUserAppIdBuilder() {
+      
+      onChanged();
+      return getUserAppIdFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+      if (userAppIdBuilder_ != null) {
+        return userAppIdBuilder_.getMessageOrBuilder();
+      } else {
+        return userAppId_ == null ?
+            com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> 
+        getUserAppIdFieldBuilder() {
+      if (userAppIdBuilder_ == null) {
+        userAppIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder>(
+                getUserAppId(),
+                getParentForChildren(),
+                isClean());
+        userAppId_ = null;
+      }
+      return userAppIdBuilder_;
+    }
+
+    private java.lang.Object computeClusterId_ = "";
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The computeClusterId.
+     */
+    public java.lang.String getComputeClusterId() {
+      java.lang.Object ref = computeClusterId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        computeClusterId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The bytes for computeClusterId.
+     */
+    public com.google.protobuf.ByteString
+        getComputeClusterIdBytes() {
+      java.lang.Object ref = computeClusterId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        computeClusterId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearComputeClusterId() {
+      
+      computeClusterId_ = getDefaultInstance().getComputeClusterId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The bytes for computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private com.google.protobuf.LazyStringList ids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+    private void ensureIdsIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        ids_ = new com.google.protobuf.LazyStringArrayList(ids_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 3;</code>
+     * @return A list containing the ids.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getIdsList() {
+      return ids_.getUnmodifiableView();
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 3;</code>
+     * @return The count of ids.
+     */
+    public int getIdsCount() {
+      return ids_.size();
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 3;</code>
+     * @param index The index of the element to return.
+     * @return The ids at the given index.
+     */
+    public java.lang.String getIds(int index) {
+      return ids_.get(index);
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 3;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the ids at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getIdsBytes(int index) {
+      return ids_.getByteString(index);
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 3;</code>
+     * @param index The index to set the value at.
+     * @param value The ids to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIds(
+        int index, java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureIdsIsMutable();
+      ids_.set(index, value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 3;</code>
+     * @param value The ids to add.
+     * @return This builder for chaining.
+     */
+    public Builder addIds(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureIdsIsMutable();
+      ids_.add(value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 3;</code>
+     * @param values The ids to add.
+     * @return This builder for chaining.
+     */
+    public Builder addAllIds(
+        java.lang.Iterable<java.lang.String> values) {
+      ensureIdsIsMutable();
+      com.google.protobuf.AbstractMessageLite.Builder.addAll(
+          values, ids_);
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIds() {
+      ids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * List of nodepool ids to be deleted
+     * </pre>
+     *
+     * <code>repeated string ids = 3;</code>
+     * @param value The bytes of the ids to add.
+     * @return This builder for chaining.
+     */
+    public Builder addIdsBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      ensureIdsIsMutable();
+      ids_.add(value);
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.DeleteNodepoolsRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.DeleteNodepoolsRequest)
+  private static final com.clarifai.grpc.api.DeleteNodepoolsRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.DeleteNodepoolsRequest();
+  }
+
+  public static com.clarifai.grpc.api.DeleteNodepoolsRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<DeleteNodepoolsRequest>
+      PARSER = new com.google.protobuf.AbstractParser<DeleteNodepoolsRequest>() {
+    @java.lang.Override
+    public DeleteNodepoolsRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new DeleteNodepoolsRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<DeleteNodepoolsRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<DeleteNodepoolsRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.DeleteNodepoolsRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/DeleteNodepoolsRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/DeleteNodepoolsRequestOrBuilder.java
new file mode 100644
index 0000000..dc4d408
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/DeleteNodepoolsRequestOrBuilder.java
@@ -0,0 +1,89 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface DeleteNodepoolsRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.DeleteNodepoolsRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  boolean hasUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  com.clarifai.grpc.api.UserAppIDSet getUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
+
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  java.lang.String getComputeClusterId();
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  com.google.protobuf.ByteString
+      getComputeClusterIdBytes();
+
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 3;</code>
+   * @return A list containing the ids.
+   */
+  java.util.List<java.lang.String>
+      getIdsList();
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 3;</code>
+   * @return The count of ids.
+   */
+  int getIdsCount();
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 3;</code>
+   * @param index The index of the element to return.
+   * @return The ids at the given index.
+   */
+  java.lang.String getIds(int index);
+  /**
+   * <pre>
+   * List of nodepool ids to be deleted
+   * </pre>
+   *
+   * <code>repeated string ids = 3;</code>
+   * @param index The index of the value to return.
+   * @return The bytes of the ids at the given index.
+   */
+  com.google.protobuf.ByteString
+      getIdsBytes(int index);
+}
diff --git a/src/main/java/com/clarifai/grpc/api/DeleteRunnersRequest.java b/src/main/java/com/clarifai/grpc/api/DeleteRunnersRequest.java
index 14bae25..427ac08 100644
--- a/src/main/java/com/clarifai/grpc/api/DeleteRunnersRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/DeleteRunnersRequest.java
@@ -20,6 +20,7 @@ private DeleteRunnersRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> b
     super(builder);
   }
   private DeleteRunnersRequest() {
+    nodepoolId_ = "";
     ids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
   }
 
@@ -69,6 +70,12 @@ private DeleteRunnersRequest(
           }
           case 18: {
             java.lang.String s = input.readStringRequireUtf8();
+
+            nodepoolId_ = s;
+            break;
+          }
+          case 26: {
+            java.lang.String s = input.readStringRequireUtf8();
             if (!((mutable_bitField0_ & 0x00000001) != 0)) {
               ids_ = new com.google.protobuf.LazyStringArrayList();
               mutable_bitField0_ |= 0x00000001;
@@ -139,10 +146,48 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
     return getUserAppId();
   }
 
-  public static final int IDS_FIELD_NUMBER = 2;
+  public static final int NODEPOOL_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object nodepoolId_;
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  @java.lang.Override
+  public java.lang.String getNodepoolId() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      nodepoolId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getNodepoolIdBytes() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      nodepoolId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int IDS_FIELD_NUMBER = 3;
   private com.google.protobuf.LazyStringList ids_;
   /**
-   * <code>repeated string ids = 2;</code>
+   * <code>repeated string ids = 3;</code>
    * @return A list containing the ids.
    */
   public com.google.protobuf.ProtocolStringList
@@ -150,14 +195,14 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
     return ids_;
   }
   /**
-   * <code>repeated string ids = 2;</code>
+   * <code>repeated string ids = 3;</code>
    * @return The count of ids.
    */
   public int getIdsCount() {
     return ids_.size();
   }
   /**
-   * <code>repeated string ids = 2;</code>
+   * <code>repeated string ids = 3;</code>
    * @param index The index of the element to return.
    * @return The ids at the given index.
    */
@@ -165,7 +210,7 @@ public java.lang.String getIds(int index) {
     return ids_.get(index);
   }
   /**
-   * <code>repeated string ids = 2;</code>
+   * <code>repeated string ids = 3;</code>
    * @param index The index of the value to return.
    * @return The bytes of the ids at the given index.
    */
@@ -191,8 +236,11 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (userAppId_ != null) {
       output.writeMessage(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, nodepoolId_);
+    }
     for (int i = 0; i < ids_.size(); i++) {
-      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ids_.getRaw(i));
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, ids_.getRaw(i));
     }
     unknownFields.writeTo(output);
   }
@@ -207,6 +255,9 @@ public int getSerializedSize() {
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, nodepoolId_);
+    }
     {
       int dataSize = 0;
       for (int i = 0; i < ids_.size(); i++) {
@@ -235,6 +286,8 @@ public boolean equals(final java.lang.Object obj) {
       if (!getUserAppId()
           .equals(other.getUserAppId())) return false;
     }
+    if (!getNodepoolId()
+        .equals(other.getNodepoolId())) return false;
     if (!getIdsList()
         .equals(other.getIdsList())) return false;
     if (!unknownFields.equals(other.unknownFields)) return false;
@@ -252,6 +305,8 @@ public int hashCode() {
       hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
       hash = (53 * hash) + getUserAppId().hashCode();
     }
+    hash = (37 * hash) + NODEPOOL_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getNodepoolId().hashCode();
     if (getIdsCount() > 0) {
       hash = (37 * hash) + IDS_FIELD_NUMBER;
       hash = (53 * hash) + getIdsList().hashCode();
@@ -399,6 +454,8 @@ public Builder clear() {
         userAppId_ = null;
         userAppIdBuilder_ = null;
       }
+      nodepoolId_ = "";
+
       ids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
       bitField0_ = (bitField0_ & ~0x00000001);
       return this;
@@ -433,6 +490,7 @@ public com.clarifai.grpc.api.DeleteRunnersRequest buildPartial() {
       } else {
         result.userAppId_ = userAppIdBuilder_.build();
       }
+      result.nodepoolId_ = nodepoolId_;
       if (((bitField0_ & 0x00000001) != 0)) {
         ids_ = ids_.getUnmodifiableView();
         bitField0_ = (bitField0_ & ~0x00000001);
@@ -489,6 +547,10 @@ public Builder mergeFrom(com.clarifai.grpc.api.DeleteRunnersRequest other) {
       if (other.hasUserAppId()) {
         mergeUserAppId(other.getUserAppId());
       }
+      if (!other.getNodepoolId().isEmpty()) {
+        nodepoolId_ = other.nodepoolId_;
+        onChanged();
+      }
       if (!other.ids_.isEmpty()) {
         if (ids_.isEmpty()) {
           ids_ = other.ids_;
@@ -648,6 +710,82 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
       return userAppIdBuilder_;
     }
 
+    private java.lang.Object nodepoolId_ = "";
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return The nodepoolId.
+     */
+    public java.lang.String getNodepoolId() {
+      java.lang.Object ref = nodepoolId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        nodepoolId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return The bytes for nodepoolId.
+     */
+    public com.google.protobuf.ByteString
+        getNodepoolIdBytes() {
+      java.lang.Object ref = nodepoolId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        nodepoolId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @param value The nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearNodepoolId() {
+      
+      nodepoolId_ = getDefaultInstance().getNodepoolId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @param value The bytes for nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+
     private com.google.protobuf.LazyStringList ids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
     private void ensureIdsIsMutable() {
       if (!((bitField0_ & 0x00000001) != 0)) {
@@ -656,7 +794,7 @@ private void ensureIdsIsMutable() {
        }
     }
     /**
-     * <code>repeated string ids = 2;</code>
+     * <code>repeated string ids = 3;</code>
      * @return A list containing the ids.
      */
     public com.google.protobuf.ProtocolStringList
@@ -664,14 +802,14 @@ private void ensureIdsIsMutable() {
       return ids_.getUnmodifiableView();
     }
     /**
-     * <code>repeated string ids = 2;</code>
+     * <code>repeated string ids = 3;</code>
      * @return The count of ids.
      */
     public int getIdsCount() {
       return ids_.size();
     }
     /**
-     * <code>repeated string ids = 2;</code>
+     * <code>repeated string ids = 3;</code>
      * @param index The index of the element to return.
      * @return The ids at the given index.
      */
@@ -679,7 +817,7 @@ public java.lang.String getIds(int index) {
       return ids_.get(index);
     }
     /**
-     * <code>repeated string ids = 2;</code>
+     * <code>repeated string ids = 3;</code>
      * @param index The index of the value to return.
      * @return The bytes of the ids at the given index.
      */
@@ -688,7 +826,7 @@ public java.lang.String getIds(int index) {
       return ids_.getByteString(index);
     }
     /**
-     * <code>repeated string ids = 2;</code>
+     * <code>repeated string ids = 3;</code>
      * @param index The index to set the value at.
      * @param value The ids to set.
      * @return This builder for chaining.
@@ -704,7 +842,7 @@ public Builder setIds(
       return this;
     }
     /**
-     * <code>repeated string ids = 2;</code>
+     * <code>repeated string ids = 3;</code>
      * @param value The ids to add.
      * @return This builder for chaining.
      */
@@ -719,7 +857,7 @@ public Builder addIds(
       return this;
     }
     /**
-     * <code>repeated string ids = 2;</code>
+     * <code>repeated string ids = 3;</code>
      * @param values The ids to add.
      * @return This builder for chaining.
      */
@@ -732,7 +870,7 @@ public Builder addAllIds(
       return this;
     }
     /**
-     * <code>repeated string ids = 2;</code>
+     * <code>repeated string ids = 3;</code>
      * @return This builder for chaining.
      */
     public Builder clearIds() {
@@ -742,7 +880,7 @@ public Builder clearIds() {
       return this;
     }
     /**
-     * <code>repeated string ids = 2;</code>
+     * <code>repeated string ids = 3;</code>
      * @param value The bytes of the ids to add.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/DeleteRunnersRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/DeleteRunnersRequestOrBuilder.java
index 222c770..f6c453e 100644
--- a/src/main/java/com/clarifai/grpc/api/DeleteRunnersRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/DeleteRunnersRequestOrBuilder.java
@@ -23,24 +23,36 @@ public interface DeleteRunnersRequestOrBuilder extends
   com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
 
   /**
-   * <code>repeated string ids = 2;</code>
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  java.lang.String getNodepoolId();
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  com.google.protobuf.ByteString
+      getNodepoolIdBytes();
+
+  /**
+   * <code>repeated string ids = 3;</code>
    * @return A list containing the ids.
    */
   java.util.List<java.lang.String>
       getIdsList();
   /**
-   * <code>repeated string ids = 2;</code>
+   * <code>repeated string ids = 3;</code>
    * @return The count of ids.
    */
   int getIdsCount();
   /**
-   * <code>repeated string ids = 2;</code>
+   * <code>repeated string ids = 3;</code>
    * @param index The index of the element to return.
    * @return The ids at the given index.
    */
   java.lang.String getIds(int index);
   /**
-   * <code>repeated string ids = 2;</code>
+   * <code>repeated string ids = 3;</code>
    * @param index The index of the value to return.
    * @return The bytes of the ids at the given index.
    */
diff --git a/src/main/java/com/clarifai/grpc/api/Deployment.java b/src/main/java/com/clarifai/grpc/api/Deployment.java
index a879421..18e9473 100644
--- a/src/main/java/com/clarifai/grpc/api/Deployment.java
+++ b/src/main/java/com/clarifai/grpc/api/Deployment.java
@@ -127,6 +127,32 @@ private Deployment(
             schedulingChoice_ = rawValue;
             break;
           }
+          case 66: {
+            com.clarifai.grpc.api.Visibility.Builder subBuilder = null;
+            if (visibility_ != null) {
+              subBuilder = visibility_.toBuilder();
+            }
+            visibility_ = input.readMessage(com.clarifai.grpc.api.Visibility.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(visibility_);
+              visibility_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 74: {
+            com.google.protobuf.Struct.Builder subBuilder = null;
+            if (metadata_ != null) {
+              subBuilder = metadata_.toBuilder();
+            }
+            metadata_ = input.readMessage(com.google.protobuf.Struct.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(metadata_);
+              metadata_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
           default: {
             if (!parseUnknownField(
                 input, unknownFields, extensionRegistry, tag)) {
@@ -776,6 +802,91 @@ public com.clarifai.grpc.api.WorkflowOrBuilder getWorkflowOrBuilder() {
     return result == null ? com.clarifai.grpc.api.Deployment.SchedulingChoice.UNRECOGNIZED : result;
   }
 
+  public static final int VISIBILITY_FIELD_NUMBER = 8;
+  private com.clarifai.grpc.api.Visibility visibility_;
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 8;</code>
+   * @return Whether the visibility field is set.
+   */
+  @java.lang.Override
+  public boolean hasVisibility() {
+    return visibility_ != null;
+  }
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 8;</code>
+   * @return The visibility.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.Visibility getVisibility() {
+    return visibility_ == null ? com.clarifai.grpc.api.Visibility.getDefaultInstance() : visibility_;
+  }
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 8;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.VisibilityOrBuilder getVisibilityOrBuilder() {
+    return getVisibility();
+  }
+
+  public static final int METADATA_FIELD_NUMBER = 9;
+  private com.google.protobuf.Struct metadata_;
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 9;</code>
+   * @return Whether the metadata field is set.
+   */
+  @java.lang.Override
+  public boolean hasMetadata() {
+    return metadata_ != null;
+  }
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 9;</code>
+   * @return The metadata.
+   */
+  @java.lang.Override
+  public com.google.protobuf.Struct getMetadata() {
+    return metadata_ == null ? com.google.protobuf.Struct.getDefaultInstance() : metadata_;
+  }
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 9;</code>
+   */
+  @java.lang.Override
+  public com.google.protobuf.StructOrBuilder getMetadataOrBuilder() {
+    return getMetadata();
+  }
+
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -811,6 +922,12 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (schedulingChoice_ != com.clarifai.grpc.api.Deployment.SchedulingChoice.UNKNOWN_SCHEDULING_CHOICE.getNumber()) {
       output.writeEnum(7, schedulingChoice_);
     }
+    if (visibility_ != null) {
+      output.writeMessage(8, getVisibility());
+    }
+    if (metadata_ != null) {
+      output.writeMessage(9, getMetadata());
+    }
     unknownFields.writeTo(output);
   }
 
@@ -846,6 +963,14 @@ public int getSerializedSize() {
       size += com.google.protobuf.CodedOutputStream
         .computeEnumSize(7, schedulingChoice_);
     }
+    if (visibility_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(8, getVisibility());
+    }
+    if (metadata_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(9, getMetadata());
+    }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
     return size;
@@ -873,6 +998,16 @@ public boolean equals(final java.lang.Object obj) {
     if (!getNodepoolsList()
         .equals(other.getNodepoolsList())) return false;
     if (schedulingChoice_ != other.schedulingChoice_) return false;
+    if (hasVisibility() != other.hasVisibility()) return false;
+    if (hasVisibility()) {
+      if (!getVisibility()
+          .equals(other.getVisibility())) return false;
+    }
+    if (hasMetadata() != other.hasMetadata()) return false;
+    if (hasMetadata()) {
+      if (!getMetadata()
+          .equals(other.getMetadata())) return false;
+    }
     if (!getObjectCase().equals(other.getObjectCase())) return false;
     switch (objectCase_) {
       case 5:
@@ -911,6 +1046,14 @@ public int hashCode() {
     }
     hash = (37 * hash) + SCHEDULING_CHOICE_FIELD_NUMBER;
     hash = (53 * hash) + schedulingChoice_;
+    if (hasVisibility()) {
+      hash = (37 * hash) + VISIBILITY_FIELD_NUMBER;
+      hash = (53 * hash) + getVisibility().hashCode();
+    }
+    if (hasMetadata()) {
+      hash = (37 * hash) + METADATA_FIELD_NUMBER;
+      hash = (53 * hash) + getMetadata().hashCode();
+    }
     switch (objectCase_) {
       case 5:
         hash = (37 * hash) + MODEL_FIELD_NUMBER;
@@ -1081,6 +1224,18 @@ public Builder clear() {
       }
       schedulingChoice_ = 0;
 
+      if (visibilityBuilder_ == null) {
+        visibility_ = null;
+      } else {
+        visibility_ = null;
+        visibilityBuilder_ = null;
+      }
+      if (metadataBuilder_ == null) {
+        metadata_ = null;
+      } else {
+        metadata_ = null;
+        metadataBuilder_ = null;
+      }
       objectCase_ = 0;
       object_ = null;
       return this;
@@ -1141,6 +1296,16 @@ public com.clarifai.grpc.api.Deployment buildPartial() {
         }
       }
       result.schedulingChoice_ = schedulingChoice_;
+      if (visibilityBuilder_ == null) {
+        result.visibility_ = visibility_;
+      } else {
+        result.visibility_ = visibilityBuilder_.build();
+      }
+      if (metadataBuilder_ == null) {
+        result.metadata_ = metadata_;
+      } else {
+        result.metadata_ = metadataBuilder_.build();
+      }
       result.objectCase_ = objectCase_;
       onBuilt();
       return result;
@@ -1230,6 +1395,12 @@ public Builder mergeFrom(com.clarifai.grpc.api.Deployment other) {
       if (other.schedulingChoice_ != 0) {
         setSchedulingChoiceValue(other.getSchedulingChoiceValue());
       }
+      if (other.hasVisibility()) {
+        mergeVisibility(other.getVisibility());
+      }
+      if (other.hasMetadata()) {
+        mergeMetadata(other.getMetadata());
+      }
       switch (other.getObjectCase()) {
         case MODEL: {
           mergeModel(other.getModel());
@@ -2464,6 +2635,343 @@ public Builder clearSchedulingChoice() {
       onChanged();
       return this;
     }
+
+    private com.clarifai.grpc.api.Visibility visibility_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.Visibility, com.clarifai.grpc.api.Visibility.Builder, com.clarifai.grpc.api.VisibilityOrBuilder> visibilityBuilder_;
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 8;</code>
+     * @return Whether the visibility field is set.
+     */
+    public boolean hasVisibility() {
+      return visibilityBuilder_ != null || visibility_ != null;
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 8;</code>
+     * @return The visibility.
+     */
+    public com.clarifai.grpc.api.Visibility getVisibility() {
+      if (visibilityBuilder_ == null) {
+        return visibility_ == null ? com.clarifai.grpc.api.Visibility.getDefaultInstance() : visibility_;
+      } else {
+        return visibilityBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 8;</code>
+     */
+    public Builder setVisibility(com.clarifai.grpc.api.Visibility value) {
+      if (visibilityBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        visibility_ = value;
+        onChanged();
+      } else {
+        visibilityBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 8;</code>
+     */
+    public Builder setVisibility(
+        com.clarifai.grpc.api.Visibility.Builder builderForValue) {
+      if (visibilityBuilder_ == null) {
+        visibility_ = builderForValue.build();
+        onChanged();
+      } else {
+        visibilityBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 8;</code>
+     */
+    public Builder mergeVisibility(com.clarifai.grpc.api.Visibility value) {
+      if (visibilityBuilder_ == null) {
+        if (visibility_ != null) {
+          visibility_ =
+            com.clarifai.grpc.api.Visibility.newBuilder(visibility_).mergeFrom(value).buildPartial();
+        } else {
+          visibility_ = value;
+        }
+        onChanged();
+      } else {
+        visibilityBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 8;</code>
+     */
+    public Builder clearVisibility() {
+      if (visibilityBuilder_ == null) {
+        visibility_ = null;
+        onChanged();
+      } else {
+        visibility_ = null;
+        visibilityBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 8;</code>
+     */
+    public com.clarifai.grpc.api.Visibility.Builder getVisibilityBuilder() {
+      
+      onChanged();
+      return getVisibilityFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 8;</code>
+     */
+    public com.clarifai.grpc.api.VisibilityOrBuilder getVisibilityOrBuilder() {
+      if (visibilityBuilder_ != null) {
+        return visibilityBuilder_.getMessageOrBuilder();
+      } else {
+        return visibility_ == null ?
+            com.clarifai.grpc.api.Visibility.getDefaultInstance() : visibility_;
+      }
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 8;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.Visibility, com.clarifai.grpc.api.Visibility.Builder, com.clarifai.grpc.api.VisibilityOrBuilder> 
+        getVisibilityFieldBuilder() {
+      if (visibilityBuilder_ == null) {
+        visibilityBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.Visibility, com.clarifai.grpc.api.Visibility.Builder, com.clarifai.grpc.api.VisibilityOrBuilder>(
+                getVisibility(),
+                getParentForChildren(),
+                isClean());
+        visibility_ = null;
+      }
+      return visibilityBuilder_;
+    }
+
+    private com.google.protobuf.Struct metadata_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Struct, com.google.protobuf.Struct.Builder, com.google.protobuf.StructOrBuilder> metadataBuilder_;
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 9;</code>
+     * @return Whether the metadata field is set.
+     */
+    public boolean hasMetadata() {
+      return metadataBuilder_ != null || metadata_ != null;
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 9;</code>
+     * @return The metadata.
+     */
+    public com.google.protobuf.Struct getMetadata() {
+      if (metadataBuilder_ == null) {
+        return metadata_ == null ? com.google.protobuf.Struct.getDefaultInstance() : metadata_;
+      } else {
+        return metadataBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 9;</code>
+     */
+    public Builder setMetadata(com.google.protobuf.Struct value) {
+      if (metadataBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        metadata_ = value;
+        onChanged();
+      } else {
+        metadataBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 9;</code>
+     */
+    public Builder setMetadata(
+        com.google.protobuf.Struct.Builder builderForValue) {
+      if (metadataBuilder_ == null) {
+        metadata_ = builderForValue.build();
+        onChanged();
+      } else {
+        metadataBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 9;</code>
+     */
+    public Builder mergeMetadata(com.google.protobuf.Struct value) {
+      if (metadataBuilder_ == null) {
+        if (metadata_ != null) {
+          metadata_ =
+            com.google.protobuf.Struct.newBuilder(metadata_).mergeFrom(value).buildPartial();
+        } else {
+          metadata_ = value;
+        }
+        onChanged();
+      } else {
+        metadataBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 9;</code>
+     */
+    public Builder clearMetadata() {
+      if (metadataBuilder_ == null) {
+        metadata_ = null;
+        onChanged();
+      } else {
+        metadata_ = null;
+        metadataBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 9;</code>
+     */
+    public com.google.protobuf.Struct.Builder getMetadataBuilder() {
+      
+      onChanged();
+      return getMetadataFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 9;</code>
+     */
+    public com.google.protobuf.StructOrBuilder getMetadataOrBuilder() {
+      if (metadataBuilder_ != null) {
+        return metadataBuilder_.getMessageOrBuilder();
+      } else {
+        return metadata_ == null ?
+            com.google.protobuf.Struct.getDefaultInstance() : metadata_;
+      }
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 9;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Struct, com.google.protobuf.Struct.Builder, com.google.protobuf.StructOrBuilder> 
+        getMetadataFieldBuilder() {
+      if (metadataBuilder_ == null) {
+        metadataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Struct, com.google.protobuf.Struct.Builder, com.google.protobuf.StructOrBuilder>(
+                getMetadata(),
+                getParentForChildren(),
+                isClean());
+        metadata_ = null;
+      }
+      return metadataBuilder_;
+    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {
diff --git a/src/main/java/com/clarifai/grpc/api/DeploymentOrBuilder.java b/src/main/java/com/clarifai/grpc/api/DeploymentOrBuilder.java
index ec43f1d..5d5c990 100644
--- a/src/main/java/com/clarifai/grpc/api/DeploymentOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/DeploymentOrBuilder.java
@@ -213,5 +213,68 @@ com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolsOrBuilder(
    */
   com.clarifai.grpc.api.Deployment.SchedulingChoice getSchedulingChoice();
 
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 8;</code>
+   * @return Whether the visibility field is set.
+   */
+  boolean hasVisibility();
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 8;</code>
+   * @return The visibility.
+   */
+  com.clarifai.grpc.api.Visibility getVisibility();
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 8;</code>
+   */
+  com.clarifai.grpc.api.VisibilityOrBuilder getVisibilityOrBuilder();
+
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 9;</code>
+   * @return Whether the metadata field is set.
+   */
+  boolean hasMetadata();
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 9;</code>
+   * @return The metadata.
+   */
+  com.google.protobuf.Struct getMetadata();
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 9;</code>
+   */
+  com.google.protobuf.StructOrBuilder getMetadataOrBuilder();
+
   public com.clarifai.grpc.api.Deployment.ObjectCase getObjectCase();
 }
diff --git a/src/main/java/com/clarifai/grpc/api/EvalTestSetEntry.java b/src/main/java/com/clarifai/grpc/api/EvalTestSetEntry.java
index 7c29d39..fe17061 100644
--- a/src/main/java/com/clarifai/grpc/api/EvalTestSetEntry.java
+++ b/src/main/java/com/clarifai/grpc/api/EvalTestSetEntry.java
@@ -314,7 +314,7 @@ public com.clarifai.grpc.api.ConceptOrBuilder getGroundTruthConceptsOrBuilder(
    *
    * <code>.clarifai.api.Annotation annotation = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.EvalTestSetEntry.annotation is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2004
+   *     See proto/clarifai/api/resources.proto;l=2020
    * @return Whether the annotation field is set.
    */
   @java.lang.Override
@@ -330,7 +330,7 @@ public com.clarifai.grpc.api.ConceptOrBuilder getGroundTruthConceptsOrBuilder(
    *
    * <code>.clarifai.api.Annotation annotation = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.EvalTestSetEntry.annotation is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2004
+   *     See proto/clarifai/api/resources.proto;l=2020
    * @return The annotation.
    */
   @java.lang.Override
@@ -1655,7 +1655,7 @@ public com.clarifai.grpc.api.Concept.Builder addGroundTruthConceptsBuilder(
      *
      * <code>.clarifai.api.Annotation annotation = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.EvalTestSetEntry.annotation is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2004
+     *     See proto/clarifai/api/resources.proto;l=2020
      * @return Whether the annotation field is set.
      */
     @java.lang.Deprecated public boolean hasAnnotation() {
@@ -1670,7 +1670,7 @@ public com.clarifai.grpc.api.Concept.Builder addGroundTruthConceptsBuilder(
      *
      * <code>.clarifai.api.Annotation annotation = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.EvalTestSetEntry.annotation is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2004
+     *     See proto/clarifai/api/resources.proto;l=2020
      * @return The annotation.
      */
     @java.lang.Deprecated public com.clarifai.grpc.api.Annotation getAnnotation() {
diff --git a/src/main/java/com/clarifai/grpc/api/EvalTestSetEntryOrBuilder.java b/src/main/java/com/clarifai/grpc/api/EvalTestSetEntryOrBuilder.java
index 7ff547f..e7767b7 100644
--- a/src/main/java/com/clarifai/grpc/api/EvalTestSetEntryOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/EvalTestSetEntryOrBuilder.java
@@ -111,7 +111,7 @@ com.clarifai.grpc.api.ConceptOrBuilder getGroundTruthConceptsOrBuilder(
    *
    * <code>.clarifai.api.Annotation annotation = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.EvalTestSetEntry.annotation is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2004
+   *     See proto/clarifai/api/resources.proto;l=2020
    * @return Whether the annotation field is set.
    */
   @java.lang.Deprecated boolean hasAnnotation();
@@ -124,7 +124,7 @@ com.clarifai.grpc.api.ConceptOrBuilder getGroundTruthConceptsOrBuilder(
    *
    * <code>.clarifai.api.Annotation annotation = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.EvalTestSetEntry.annotation is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2004
+   *     See proto/clarifai/api/resources.proto;l=2020
    * @return The annotation.
    */
   @java.lang.Deprecated com.clarifai.grpc.api.Annotation getAnnotation();
diff --git a/src/main/java/com/clarifai/grpc/api/FrameInfo.java b/src/main/java/com/clarifai/grpc/api/FrameInfo.java
index 22ef4df..3a106b2 100644
--- a/src/main/java/com/clarifai/grpc/api/FrameInfo.java
+++ b/src/main/java/com/clarifai/grpc/api/FrameInfo.java
@@ -108,7 +108,7 @@ private FrameInfo(
    *
    * <code>uint32 index = 1 [deprecated = true, (.clarifai.api.utils.cl_show_if_empty) = true];</code>
    * @deprecated clarifai.api.FrameInfo.index is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=696
+   *     See proto/clarifai/api/resources.proto;l=712
    * @return The index.
    */
   @java.lang.Override
@@ -466,7 +466,7 @@ public Builder mergeFrom(
      *
      * <code>uint32 index = 1 [deprecated = true, (.clarifai.api.utils.cl_show_if_empty) = true];</code>
      * @deprecated clarifai.api.FrameInfo.index is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=696
+     *     See proto/clarifai/api/resources.proto;l=712
      * @return The index.
      */
     @java.lang.Override
@@ -483,7 +483,7 @@ public Builder mergeFrom(
      *
      * <code>uint32 index = 1 [deprecated = true, (.clarifai.api.utils.cl_show_if_empty) = true];</code>
      * @deprecated clarifai.api.FrameInfo.index is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=696
+     *     See proto/clarifai/api/resources.proto;l=712
      * @param value The index to set.
      * @return This builder for chaining.
      */
@@ -503,7 +503,7 @@ public Builder mergeFrom(
      *
      * <code>uint32 index = 1 [deprecated = true, (.clarifai.api.utils.cl_show_if_empty) = true];</code>
      * @deprecated clarifai.api.FrameInfo.index is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=696
+     *     See proto/clarifai/api/resources.proto;l=712
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearIndex() {
diff --git a/src/main/java/com/clarifai/grpc/api/FrameInfoOrBuilder.java b/src/main/java/com/clarifai/grpc/api/FrameInfoOrBuilder.java
index 93a2756..8059739 100644
--- a/src/main/java/com/clarifai/grpc/api/FrameInfoOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/FrameInfoOrBuilder.java
@@ -17,7 +17,7 @@ public interface FrameInfoOrBuilder extends
    *
    * <code>uint32 index = 1 [deprecated = true, (.clarifai.api.utils.cl_show_if_empty) = true];</code>
    * @deprecated clarifai.api.FrameInfo.index is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=696
+   *     See proto/clarifai/api/resources.proto;l=712
    * @return The index.
    */
   @java.lang.Deprecated int getIndex();
diff --git a/src/main/java/com/clarifai/grpc/api/GetComputeClusterRequest.java b/src/main/java/com/clarifai/grpc/api/GetComputeClusterRequest.java
new file mode 100644
index 0000000..b6b65c4
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/GetComputeClusterRequest.java
@@ -0,0 +1,803 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * <pre>
+ * ComputeCLuster CRUD requests and responses
+ * </pre>
+ *
+ * Protobuf type {@code clarifai.api.GetComputeClusterRequest}
+ */
+public final class GetComputeClusterRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.GetComputeClusterRequest)
+    GetComputeClusterRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetComputeClusterRequest.newBuilder() to construct.
+  private GetComputeClusterRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetComputeClusterRequest() {
+    computeClusterId_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetComputeClusterRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetComputeClusterRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.UserAppIDSet.Builder subBuilder = null;
+            if (userAppId_ != null) {
+              subBuilder = userAppId_.toBuilder();
+            }
+            userAppId_ = input.readMessage(com.clarifai.grpc.api.UserAppIDSet.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(userAppId_);
+              userAppId_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            computeClusterId_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_GetComputeClusterRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_GetComputeClusterRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.GetComputeClusterRequest.class, com.clarifai.grpc.api.GetComputeClusterRequest.Builder.class);
+  }
+
+  public static final int USER_APP_ID_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  @java.lang.Override
+  public boolean hasUserAppId() {
+    return userAppId_ != null;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+    return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+    return getUserAppId();
+  }
+
+  public static final int COMPUTE_CLUSTER_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object computeClusterId_;
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  @java.lang.Override
+  public java.lang.String getComputeClusterId() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      computeClusterId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getComputeClusterIdBytes() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      computeClusterId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (userAppId_ != null) {
+      output.writeMessage(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, computeClusterId_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (userAppId_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, computeClusterId_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.GetComputeClusterRequest)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.GetComputeClusterRequest other = (com.clarifai.grpc.api.GetComputeClusterRequest) obj;
+
+    if (hasUserAppId() != other.hasUserAppId()) return false;
+    if (hasUserAppId()) {
+      if (!getUserAppId()
+          .equals(other.getUserAppId())) return false;
+    }
+    if (!getComputeClusterId()
+        .equals(other.getComputeClusterId())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasUserAppId()) {
+      hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getUserAppId().hashCode();
+    }
+    hash = (37 * hash) + COMPUTE_CLUSTER_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getComputeClusterId().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.GetComputeClusterRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.GetComputeClusterRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * ComputeCLuster CRUD requests and responses
+   * </pre>
+   *
+   * Protobuf type {@code clarifai.api.GetComputeClusterRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.GetComputeClusterRequest)
+      com.clarifai.grpc.api.GetComputeClusterRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_GetComputeClusterRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_GetComputeClusterRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.GetComputeClusterRequest.class, com.clarifai.grpc.api.GetComputeClusterRequest.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.GetComputeClusterRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+      computeClusterId_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_GetComputeClusterRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.GetComputeClusterRequest getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.GetComputeClusterRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.GetComputeClusterRequest build() {
+      com.clarifai.grpc.api.GetComputeClusterRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.GetComputeClusterRequest buildPartial() {
+      com.clarifai.grpc.api.GetComputeClusterRequest result = new com.clarifai.grpc.api.GetComputeClusterRequest(this);
+      if (userAppIdBuilder_ == null) {
+        result.userAppId_ = userAppId_;
+      } else {
+        result.userAppId_ = userAppIdBuilder_.build();
+      }
+      result.computeClusterId_ = computeClusterId_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.GetComputeClusterRequest) {
+        return mergeFrom((com.clarifai.grpc.api.GetComputeClusterRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.GetComputeClusterRequest other) {
+      if (other == com.clarifai.grpc.api.GetComputeClusterRequest.getDefaultInstance()) return this;
+      if (other.hasUserAppId()) {
+        mergeUserAppId(other.getUserAppId());
+      }
+      if (!other.getComputeClusterId().isEmpty()) {
+        computeClusterId_ = other.computeClusterId_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.GetComputeClusterRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.GetComputeClusterRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> userAppIdBuilder_;
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return Whether the userAppId field is set.
+     */
+    public boolean hasUserAppId() {
+      return userAppIdBuilder_ != null || userAppId_ != null;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return The userAppId.
+     */
+    public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      } else {
+        return userAppIdBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        userAppId_ = value;
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(
+        com.clarifai.grpc.api.UserAppIDSet.Builder builderForValue) {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = builderForValue.build();
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder mergeUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (userAppId_ != null) {
+          userAppId_ =
+            com.clarifai.grpc.api.UserAppIDSet.newBuilder(userAppId_).mergeFrom(value).buildPartial();
+        } else {
+          userAppId_ = value;
+        }
+        onChanged();
+      } else {
+        userAppIdBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder clearUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+        onChanged();
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSet.Builder getUserAppIdBuilder() {
+      
+      onChanged();
+      return getUserAppIdFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+      if (userAppIdBuilder_ != null) {
+        return userAppIdBuilder_.getMessageOrBuilder();
+      } else {
+        return userAppId_ == null ?
+            com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> 
+        getUserAppIdFieldBuilder() {
+      if (userAppIdBuilder_ == null) {
+        userAppIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder>(
+                getUserAppId(),
+                getParentForChildren(),
+                isClean());
+        userAppId_ = null;
+      }
+      return userAppIdBuilder_;
+    }
+
+    private java.lang.Object computeClusterId_ = "";
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The computeClusterId.
+     */
+    public java.lang.String getComputeClusterId() {
+      java.lang.Object ref = computeClusterId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        computeClusterId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The bytes for computeClusterId.
+     */
+    public com.google.protobuf.ByteString
+        getComputeClusterIdBytes() {
+      java.lang.Object ref = computeClusterId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        computeClusterId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearComputeClusterId() {
+      
+      computeClusterId_ = getDefaultInstance().getComputeClusterId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The bytes for computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.GetComputeClusterRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.GetComputeClusterRequest)
+  private static final com.clarifai.grpc.api.GetComputeClusterRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.GetComputeClusterRequest();
+  }
+
+  public static com.clarifai.grpc.api.GetComputeClusterRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetComputeClusterRequest>
+      PARSER = new com.google.protobuf.AbstractParser<GetComputeClusterRequest>() {
+    @java.lang.Override
+    public GetComputeClusterRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetComputeClusterRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetComputeClusterRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetComputeClusterRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.GetComputeClusterRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/GetComputeClusterRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/GetComputeClusterRequestOrBuilder.java
new file mode 100644
index 0000000..86953f8
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/GetComputeClusterRequestOrBuilder.java
@@ -0,0 +1,48 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface GetComputeClusterRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.GetComputeClusterRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  boolean hasUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  com.clarifai.grpc.api.UserAppIDSet getUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
+
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  java.lang.String getComputeClusterId();
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  com.google.protobuf.ByteString
+      getComputeClusterIdBytes();
+}
diff --git a/src/main/java/com/clarifai/grpc/api/GetNodepoolRequest.java b/src/main/java/com/clarifai/grpc/api/GetNodepoolRequest.java
new file mode 100644
index 0000000..a5d728d
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/GetNodepoolRequest.java
@@ -0,0 +1,895 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * <pre>
+ * TODO(zeiler): these might not be 100% correct and will be updated as we uncomment the endpoints.
+ * Nodepool CRUD requests and responses
+ * </pre>
+ *
+ * Protobuf type {@code clarifai.api.GetNodepoolRequest}
+ */
+public final class GetNodepoolRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.GetNodepoolRequest)
+    GetNodepoolRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetNodepoolRequest.newBuilder() to construct.
+  private GetNodepoolRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetNodepoolRequest() {
+    computeClusterId_ = "";
+    nodepoolId_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetNodepoolRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetNodepoolRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.UserAppIDSet.Builder subBuilder = null;
+            if (userAppId_ != null) {
+              subBuilder = userAppId_.toBuilder();
+            }
+            userAppId_ = input.readMessage(com.clarifai.grpc.api.UserAppIDSet.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(userAppId_);
+              userAppId_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            computeClusterId_ = s;
+            break;
+          }
+          case 26: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            nodepoolId_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_GetNodepoolRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_GetNodepoolRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.GetNodepoolRequest.class, com.clarifai.grpc.api.GetNodepoolRequest.Builder.class);
+  }
+
+  public static final int USER_APP_ID_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  @java.lang.Override
+  public boolean hasUserAppId() {
+    return userAppId_ != null;
+  }
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+    return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+  }
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+    return getUserAppId();
+  }
+
+  public static final int COMPUTE_CLUSTER_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object computeClusterId_;
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  @java.lang.Override
+  public java.lang.String getComputeClusterId() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      computeClusterId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getComputeClusterIdBytes() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      computeClusterId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int NODEPOOL_ID_FIELD_NUMBER = 3;
+  private volatile java.lang.Object nodepoolId_;
+  /**
+   * <code>string nodepool_id = 3;</code>
+   * @return The nodepoolId.
+   */
+  @java.lang.Override
+  public java.lang.String getNodepoolId() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      nodepoolId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string nodepool_id = 3;</code>
+   * @return The bytes for nodepoolId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getNodepoolIdBytes() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      nodepoolId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (userAppId_ != null) {
+      output.writeMessage(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, computeClusterId_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, nodepoolId_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (userAppId_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, computeClusterId_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, nodepoolId_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.GetNodepoolRequest)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.GetNodepoolRequest other = (com.clarifai.grpc.api.GetNodepoolRequest) obj;
+
+    if (hasUserAppId() != other.hasUserAppId()) return false;
+    if (hasUserAppId()) {
+      if (!getUserAppId()
+          .equals(other.getUserAppId())) return false;
+    }
+    if (!getComputeClusterId()
+        .equals(other.getComputeClusterId())) return false;
+    if (!getNodepoolId()
+        .equals(other.getNodepoolId())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasUserAppId()) {
+      hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getUserAppId().hashCode();
+    }
+    hash = (37 * hash) + COMPUTE_CLUSTER_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getComputeClusterId().hashCode();
+    hash = (37 * hash) + NODEPOOL_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getNodepoolId().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.GetNodepoolRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.GetNodepoolRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * TODO(zeiler): these might not be 100% correct and will be updated as we uncomment the endpoints.
+   * Nodepool CRUD requests and responses
+   * </pre>
+   *
+   * Protobuf type {@code clarifai.api.GetNodepoolRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.GetNodepoolRequest)
+      com.clarifai.grpc.api.GetNodepoolRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_GetNodepoolRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_GetNodepoolRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.GetNodepoolRequest.class, com.clarifai.grpc.api.GetNodepoolRequest.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.GetNodepoolRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+      computeClusterId_ = "";
+
+      nodepoolId_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_GetNodepoolRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.GetNodepoolRequest getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.GetNodepoolRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.GetNodepoolRequest build() {
+      com.clarifai.grpc.api.GetNodepoolRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.GetNodepoolRequest buildPartial() {
+      com.clarifai.grpc.api.GetNodepoolRequest result = new com.clarifai.grpc.api.GetNodepoolRequest(this);
+      if (userAppIdBuilder_ == null) {
+        result.userAppId_ = userAppId_;
+      } else {
+        result.userAppId_ = userAppIdBuilder_.build();
+      }
+      result.computeClusterId_ = computeClusterId_;
+      result.nodepoolId_ = nodepoolId_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.GetNodepoolRequest) {
+        return mergeFrom((com.clarifai.grpc.api.GetNodepoolRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.GetNodepoolRequest other) {
+      if (other == com.clarifai.grpc.api.GetNodepoolRequest.getDefaultInstance()) return this;
+      if (other.hasUserAppId()) {
+        mergeUserAppId(other.getUserAppId());
+      }
+      if (!other.getComputeClusterId().isEmpty()) {
+        computeClusterId_ = other.computeClusterId_;
+        onChanged();
+      }
+      if (!other.getNodepoolId().isEmpty()) {
+        nodepoolId_ = other.nodepoolId_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.GetNodepoolRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.GetNodepoolRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> userAppIdBuilder_;
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return Whether the userAppId field is set.
+     */
+    public boolean hasUserAppId() {
+      return userAppIdBuilder_ != null || userAppId_ != null;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return The userAppId.
+     */
+    public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      } else {
+        return userAppIdBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        userAppId_ = value;
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(
+        com.clarifai.grpc.api.UserAppIDSet.Builder builderForValue) {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = builderForValue.build();
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder mergeUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (userAppId_ != null) {
+          userAppId_ =
+            com.clarifai.grpc.api.UserAppIDSet.newBuilder(userAppId_).mergeFrom(value).buildPartial();
+        } else {
+          userAppId_ = value;
+        }
+        onChanged();
+      } else {
+        userAppIdBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder clearUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+        onChanged();
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSet.Builder getUserAppIdBuilder() {
+      
+      onChanged();
+      return getUserAppIdFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+      if (userAppIdBuilder_ != null) {
+        return userAppIdBuilder_.getMessageOrBuilder();
+      } else {
+        return userAppId_ == null ?
+            com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> 
+        getUserAppIdFieldBuilder() {
+      if (userAppIdBuilder_ == null) {
+        userAppIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder>(
+                getUserAppId(),
+                getParentForChildren(),
+                isClean());
+        userAppId_ = null;
+      }
+      return userAppIdBuilder_;
+    }
+
+    private java.lang.Object computeClusterId_ = "";
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The computeClusterId.
+     */
+    public java.lang.String getComputeClusterId() {
+      java.lang.Object ref = computeClusterId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        computeClusterId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The bytes for computeClusterId.
+     */
+    public com.google.protobuf.ByteString
+        getComputeClusterIdBytes() {
+      java.lang.Object ref = computeClusterId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        computeClusterId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearComputeClusterId() {
+      
+      computeClusterId_ = getDefaultInstance().getComputeClusterId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The bytes for computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object nodepoolId_ = "";
+    /**
+     * <code>string nodepool_id = 3;</code>
+     * @return The nodepoolId.
+     */
+    public java.lang.String getNodepoolId() {
+      java.lang.Object ref = nodepoolId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        nodepoolId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 3;</code>
+     * @return The bytes for nodepoolId.
+     */
+    public com.google.protobuf.ByteString
+        getNodepoolIdBytes() {
+      java.lang.Object ref = nodepoolId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        nodepoolId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 3;</code>
+     * @param value The nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearNodepoolId() {
+      
+      nodepoolId_ = getDefaultInstance().getNodepoolId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 3;</code>
+     * @param value The bytes for nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.GetNodepoolRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.GetNodepoolRequest)
+  private static final com.clarifai.grpc.api.GetNodepoolRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.GetNodepoolRequest();
+  }
+
+  public static com.clarifai.grpc.api.GetNodepoolRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetNodepoolRequest>
+      PARSER = new com.google.protobuf.AbstractParser<GetNodepoolRequest>() {
+    @java.lang.Override
+    public GetNodepoolRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetNodepoolRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetNodepoolRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetNodepoolRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.GetNodepoolRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/GetNodepoolRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/GetNodepoolRequestOrBuilder.java
new file mode 100644
index 0000000..1a88d4e
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/GetNodepoolRequestOrBuilder.java
@@ -0,0 +1,48 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface GetNodepoolRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.GetNodepoolRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  boolean hasUserAppId();
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  com.clarifai.grpc.api.UserAppIDSet getUserAppId();
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
+
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  java.lang.String getComputeClusterId();
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  com.google.protobuf.ByteString
+      getComputeClusterIdBytes();
+
+  /**
+   * <code>string nodepool_id = 3;</code>
+   * @return The nodepoolId.
+   */
+  java.lang.String getNodepoolId();
+  /**
+   * <code>string nodepool_id = 3;</code>
+   * @return The bytes for nodepoolId.
+   */
+  com.google.protobuf.ByteString
+      getNodepoolIdBytes();
+}
diff --git a/src/main/java/com/clarifai/grpc/api/GetRunnerRequest.java b/src/main/java/com/clarifai/grpc/api/GetRunnerRequest.java
index c94d2c0..289aa7c 100644
--- a/src/main/java/com/clarifai/grpc/api/GetRunnerRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/GetRunnerRequest.java
@@ -20,6 +20,7 @@ private GetRunnerRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> build
     super(builder);
   }
   private GetRunnerRequest() {
+    nodepoolId_ = "";
     runnerId_ = "";
   }
 
@@ -69,6 +70,12 @@ private GetRunnerRequest(
           case 18: {
             java.lang.String s = input.readStringRequireUtf8();
 
+            nodepoolId_ = s;
+            break;
+          }
+          case 26: {
+            java.lang.String s = input.readStringRequireUtf8();
+
             runnerId_ = s;
             break;
           }
@@ -132,10 +139,48 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
     return getUserAppId();
   }
 
-  public static final int RUNNER_ID_FIELD_NUMBER = 2;
+  public static final int NODEPOOL_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object nodepoolId_;
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  @java.lang.Override
+  public java.lang.String getNodepoolId() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      nodepoolId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getNodepoolIdBytes() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      nodepoolId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int RUNNER_ID_FIELD_NUMBER = 3;
   private volatile java.lang.Object runnerId_;
   /**
-   * <code>string runner_id = 2;</code>
+   * <code>string runner_id = 3;</code>
    * @return The runnerId.
    */
   @java.lang.Override
@@ -152,7 +197,7 @@ public java.lang.String getRunnerId() {
     }
   }
   /**
-   * <code>string runner_id = 2;</code>
+   * <code>string runner_id = 3;</code>
    * @return The bytes for runnerId.
    */
   @java.lang.Override
@@ -187,8 +232,11 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (userAppId_ != null) {
       output.writeMessage(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, nodepoolId_);
+    }
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(runnerId_)) {
-      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, runnerId_);
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, runnerId_);
     }
     unknownFields.writeTo(output);
   }
@@ -203,8 +251,11 @@ public int getSerializedSize() {
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, nodepoolId_);
+    }
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(runnerId_)) {
-      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, runnerId_);
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, runnerId_);
     }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
@@ -226,6 +277,8 @@ public boolean equals(final java.lang.Object obj) {
       if (!getUserAppId()
           .equals(other.getUserAppId())) return false;
     }
+    if (!getNodepoolId()
+        .equals(other.getNodepoolId())) return false;
     if (!getRunnerId()
         .equals(other.getRunnerId())) return false;
     if (!unknownFields.equals(other.unknownFields)) return false;
@@ -243,6 +296,8 @@ public int hashCode() {
       hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
       hash = (53 * hash) + getUserAppId().hashCode();
     }
+    hash = (37 * hash) + NODEPOOL_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getNodepoolId().hashCode();
     hash = (37 * hash) + RUNNER_ID_FIELD_NUMBER;
     hash = (53 * hash) + getRunnerId().hashCode();
     hash = (29 * hash) + unknownFields.hashCode();
@@ -388,6 +443,8 @@ public Builder clear() {
         userAppId_ = null;
         userAppIdBuilder_ = null;
       }
+      nodepoolId_ = "";
+
       runnerId_ = "";
 
       return this;
@@ -421,6 +478,7 @@ public com.clarifai.grpc.api.GetRunnerRequest buildPartial() {
       } else {
         result.userAppId_ = userAppIdBuilder_.build();
       }
+      result.nodepoolId_ = nodepoolId_;
       result.runnerId_ = runnerId_;
       onBuilt();
       return result;
@@ -473,6 +531,10 @@ public Builder mergeFrom(com.clarifai.grpc.api.GetRunnerRequest other) {
       if (other.hasUserAppId()) {
         mergeUserAppId(other.getUserAppId());
       }
+      if (!other.getNodepoolId().isEmpty()) {
+        nodepoolId_ = other.nodepoolId_;
+        onChanged();
+      }
       if (!other.getRunnerId().isEmpty()) {
         runnerId_ = other.runnerId_;
         onChanged();
@@ -625,9 +687,85 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
       return userAppIdBuilder_;
     }
 
+    private java.lang.Object nodepoolId_ = "";
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return The nodepoolId.
+     */
+    public java.lang.String getNodepoolId() {
+      java.lang.Object ref = nodepoolId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        nodepoolId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return The bytes for nodepoolId.
+     */
+    public com.google.protobuf.ByteString
+        getNodepoolIdBytes() {
+      java.lang.Object ref = nodepoolId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        nodepoolId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @param value The nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearNodepoolId() {
+      
+      nodepoolId_ = getDefaultInstance().getNodepoolId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @param value The bytes for nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+
     private java.lang.Object runnerId_ = "";
     /**
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @return The runnerId.
      */
     public java.lang.String getRunnerId() {
@@ -643,7 +781,7 @@ public java.lang.String getRunnerId() {
       }
     }
     /**
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @return The bytes for runnerId.
      */
     public com.google.protobuf.ByteString
@@ -660,7 +798,7 @@ public java.lang.String getRunnerId() {
       }
     }
     /**
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @param value The runnerId to set.
      * @return This builder for chaining.
      */
@@ -675,7 +813,7 @@ public Builder setRunnerId(
       return this;
     }
     /**
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @return This builder for chaining.
      */
     public Builder clearRunnerId() {
@@ -685,7 +823,7 @@ public Builder clearRunnerId() {
       return this;
     }
     /**
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @param value The bytes for runnerId to set.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/GetRunnerRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/GetRunnerRequestOrBuilder.java
index 0ffc538..a17072d 100644
--- a/src/main/java/com/clarifai/grpc/api/GetRunnerRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/GetRunnerRequestOrBuilder.java
@@ -23,12 +23,24 @@ public interface GetRunnerRequestOrBuilder extends
   com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
 
   /**
-   * <code>string runner_id = 2;</code>
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  java.lang.String getNodepoolId();
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  com.google.protobuf.ByteString
+      getNodepoolIdBytes();
+
+  /**
+   * <code>string runner_id = 3;</code>
    * @return The runnerId.
    */
   java.lang.String getRunnerId();
   /**
-   * <code>string runner_id = 2;</code>
+   * <code>string runner_id = 3;</code>
    * @return The bytes for runnerId.
    */
   com.google.protobuf.ByteString
diff --git a/src/main/java/com/clarifai/grpc/api/GetTaskRequest.java b/src/main/java/com/clarifai/grpc/api/GetTaskRequest.java
index e751960..70e8179 100644
--- a/src/main/java/com/clarifai/grpc/api/GetTaskRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/GetTaskRequest.java
@@ -195,6 +195,8 @@ public java.lang.String getTaskId() {
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 3;</code>
@@ -213,6 +215,8 @@ public java.lang.String getTaskId() {
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 3;</code>
@@ -230,6 +234,8 @@ public int getAdditionalFieldsCount() {
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 3;</code>
@@ -248,6 +254,8 @@ public java.lang.String getAdditionalFields(int index) {
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 3;</code>
@@ -842,6 +850,8 @@ private void ensureAdditionalFieldsIsMutable() {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 3;</code>
@@ -860,6 +870,8 @@ private void ensureAdditionalFieldsIsMutable() {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 3;</code>
@@ -877,6 +889,8 @@ public int getAdditionalFieldsCount() {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 3;</code>
@@ -895,6 +909,8 @@ public java.lang.String getAdditionalFields(int index) {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 3;</code>
@@ -914,6 +930,8 @@ public java.lang.String getAdditionalFields(int index) {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 3;</code>
@@ -940,6 +958,8 @@ public Builder setAdditionalFields(
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 3;</code>
@@ -965,6 +985,8 @@ public Builder addAdditionalFields(
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 3;</code>
@@ -988,6 +1010,8 @@ public Builder addAllAdditionalFields(
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 3;</code>
@@ -1008,6 +1032,8 @@ public Builder clearAdditionalFields() {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 3;</code>
diff --git a/src/main/java/com/clarifai/grpc/api/GetTaskRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/GetTaskRequestOrBuilder.java
index 3462a92..e0ebaa1 100644
--- a/src/main/java/com/clarifai/grpc/api/GetTaskRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/GetTaskRequestOrBuilder.java
@@ -43,6 +43,8 @@ public interface GetTaskRequestOrBuilder extends
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 3;</code>
@@ -59,6 +61,8 @@ public interface GetTaskRequestOrBuilder extends
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 3;</code>
@@ -74,6 +78,8 @@ public interface GetTaskRequestOrBuilder extends
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 3;</code>
@@ -90,6 +96,8 @@ public interface GetTaskRequestOrBuilder extends
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 3;</code>
diff --git a/src/main/java/com/clarifai/grpc/api/CloudRegion.java b/src/main/java/com/clarifai/grpc/api/InstanceType.java
similarity index 55%
rename from src/main/java/com/clarifai/grpc/api/CloudRegion.java
rename to src/main/java/com/clarifai/grpc/api/InstanceType.java
index 6b7d4ec..2a4890a 100644
--- a/src/main/java/com/clarifai/grpc/api/CloudRegion.java
+++ b/src/main/java/com/clarifai/grpc/api/InstanceType.java
@@ -5,35 +5,31 @@
 
 /**
  * <pre>
- * We define a cloud region here to be used in Nodepools and by the cloud agent.
- * There will be one cloud agent per CloudRegion.
- * This allows us to define CloudRegions that are VPCs within one physical cloud and have that
- * managed by one cloud agent which can list all nodepools for that VPC to deploy them and
- * orchestrate work within them.
+ * The instance types that will be available in this pool of nodes.
+ * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
  * </pre>
  *
- * Protobuf type {@code clarifai.api.CloudRegion}
+ * Protobuf type {@code clarifai.api.InstanceType}
  */
-public final class CloudRegion extends
+public final class InstanceType extends
     com.google.protobuf.GeneratedMessageV3 implements
-    // @@protoc_insertion_point(message_implements:clarifai.api.CloudRegion)
-    CloudRegionOrBuilder {
+    // @@protoc_insertion_point(message_implements:clarifai.api.InstanceType)
+    InstanceTypeOrBuilder {
 private static final long serialVersionUID = 0L;
-  // Use CloudRegion.newBuilder() to construct.
-  private CloudRegion(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+  // Use InstanceType.newBuilder() to construct.
+  private InstanceType(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
     super(builder);
   }
-  private CloudRegion() {
+  private InstanceType() {
     id_ = "";
-    cloud_ = 0;
-    region_ = "";
+    description_ = "";
   }
 
   @java.lang.Override
   @SuppressWarnings({"unused"})
   protected java.lang.Object newInstance(
       UnusedPrivateParameter unused) {
-    return new CloudRegion();
+    return new InstanceType();
   }
 
   @java.lang.Override
@@ -41,7 +37,7 @@ protected java.lang.Object newInstance(
   getUnknownFields() {
     return this.unknownFields;
   }
-  private CloudRegion(
+  private InstanceType(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
@@ -65,16 +61,23 @@ private CloudRegion(
             id_ = s;
             break;
           }
-          case 24: {
-            int rawValue = input.readEnum();
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
 
-            cloud_ = rawValue;
+            description_ = s;
             break;
           }
-          case 34: {
-            java.lang.String s = input.readStringRequireUtf8();
+          case 26: {
+            com.clarifai.grpc.api.ComputeInfo.Builder subBuilder = null;
+            if (computeInfo_ != null) {
+              subBuilder = computeInfo_.toBuilder();
+            }
+            computeInfo_ = input.readMessage(com.clarifai.grpc.api.ComputeInfo.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(computeInfo_);
+              computeInfo_ = subBuilder.buildPartial();
+            }
 
-            region_ = s;
             break;
           }
           default: {
@@ -100,171 +103,15 @@ private CloudRegion(
   }
   public static final com.google.protobuf.Descriptors.Descriptor
       getDescriptor() {
-    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_CloudRegion_descriptor;
+    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_InstanceType_descriptor;
   }
 
   @java.lang.Override
   protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internalGetFieldAccessorTable() {
-    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_CloudRegion_fieldAccessorTable
+    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_InstanceType_fieldAccessorTable
         .ensureFieldAccessorsInitialized(
-            com.clarifai.grpc.api.CloudRegion.class, com.clarifai.grpc.api.CloudRegion.Builder.class);
-  }
-
-  /**
-   * Protobuf enum {@code clarifai.api.CloudRegion.Cloud}
-   */
-  public enum Cloud
-      implements com.google.protobuf.ProtocolMessageEnum {
-    /**
-     * <code>UNKOWN_CLOUD = 0;</code>
-     */
-    UNKOWN_CLOUD(0),
-    /**
-     * <pre>
-     * Run on a user's own infrastructure. This has restrictions on who can access resources
-     * that are being run by SELF_HOSTED runners. Only those who are part of the user/org where they
-     * exist can leverage them.
-     * </pre>
-     *
-     * <code>SELF_HOSTED = 1;</code>
-     */
-    SELF_HOSTED(1),
-    /**
-     * <code>AWS = 2;</code>
-     */
-    AWS(2),
-    /**
-     * <code>GCP = 3;</code>
-     */
-    GCP(3),
-    /**
-     * <code>AZURE = 4;</code>
-     */
-    AZURE(4),
-    /**
-     * <code>LAMBDA = 5;</code>
-     */
-    LAMBDA(5),
-    UNRECOGNIZED(-1),
-    ;
-
-    /**
-     * <code>UNKOWN_CLOUD = 0;</code>
-     */
-    public static final int UNKOWN_CLOUD_VALUE = 0;
-    /**
-     * <pre>
-     * Run on a user's own infrastructure. This has restrictions on who can access resources
-     * that are being run by SELF_HOSTED runners. Only those who are part of the user/org where they
-     * exist can leverage them.
-     * </pre>
-     *
-     * <code>SELF_HOSTED = 1;</code>
-     */
-    public static final int SELF_HOSTED_VALUE = 1;
-    /**
-     * <code>AWS = 2;</code>
-     */
-    public static final int AWS_VALUE = 2;
-    /**
-     * <code>GCP = 3;</code>
-     */
-    public static final int GCP_VALUE = 3;
-    /**
-     * <code>AZURE = 4;</code>
-     */
-    public static final int AZURE_VALUE = 4;
-    /**
-     * <code>LAMBDA = 5;</code>
-     */
-    public static final int LAMBDA_VALUE = 5;
-
-
-    public final int getNumber() {
-      if (this == UNRECOGNIZED) {
-        throw new java.lang.IllegalArgumentException(
-            "Can't get the number of an unknown enum value.");
-      }
-      return value;
-    }
-
-    /**
-     * @param value The numeric wire value of the corresponding enum entry.
-     * @return The enum associated with the given numeric wire value.
-     * @deprecated Use {@link #forNumber(int)} instead.
-     */
-    @java.lang.Deprecated
-    public static Cloud valueOf(int value) {
-      return forNumber(value);
-    }
-
-    /**
-     * @param value The numeric wire value of the corresponding enum entry.
-     * @return The enum associated with the given numeric wire value.
-     */
-    public static Cloud forNumber(int value) {
-      switch (value) {
-        case 0: return UNKOWN_CLOUD;
-        case 1: return SELF_HOSTED;
-        case 2: return AWS;
-        case 3: return GCP;
-        case 4: return AZURE;
-        case 5: return LAMBDA;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<Cloud>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static final com.google.protobuf.Internal.EnumLiteMap<
-        Cloud> internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<Cloud>() {
-            public Cloud findValueByNumber(int number) {
-              return Cloud.forNumber(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      if (this == UNRECOGNIZED) {
-        throw new java.lang.IllegalStateException(
-            "Can't get the descriptor of an unrecognized enum value.");
-      }
-      return getDescriptor().getValues().get(ordinal());
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return com.clarifai.grpc.api.CloudRegion.getDescriptor().getEnumTypes().get(0);
-    }
-
-    private static final Cloud[] VALUES = values();
-
-    public static Cloud valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      if (desc.getIndex() == -1) {
-        return UNRECOGNIZED;
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int value;
-
-    private Cloud(int value) {
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:clarifai.api.CloudRegion.Cloud)
+            com.clarifai.grpc.api.InstanceType.class, com.clarifai.grpc.api.InstanceType.Builder.class);
   }
 
   public static final int ID_FIELD_NUMBER = 1;
@@ -305,73 +152,78 @@ public java.lang.String getId() {
     }
   }
 
-  public static final int CLOUD_FIELD_NUMBER = 3;
-  private int cloud_;
-  /**
-   * <code>.clarifai.api.CloudRegion.Cloud cloud = 3;</code>
-   * @return The enum numeric value on the wire for cloud.
-   */
-  @java.lang.Override public int getCloudValue() {
-    return cloud_;
-  }
-  /**
-   * <code>.clarifai.api.CloudRegion.Cloud cloud = 3;</code>
-   * @return The cloud.
-   */
-  @java.lang.Override public com.clarifai.grpc.api.CloudRegion.Cloud getCloud() {
-    @SuppressWarnings("deprecation")
-    com.clarifai.grpc.api.CloudRegion.Cloud result = com.clarifai.grpc.api.CloudRegion.Cloud.valueOf(cloud_);
-    return result == null ? com.clarifai.grpc.api.CloudRegion.Cloud.UNRECOGNIZED : result;
-  }
-
-  public static final int REGION_FIELD_NUMBER = 4;
-  private volatile java.lang.Object region_;
+  public static final int DESCRIPTION_FIELD_NUMBER = 2;
+  private volatile java.lang.Object description_;
   /**
    * <pre>
-   * The region. The naming here depends on the cloud choice above and will be validated
-   * against which clouds+regions that Clarifai currently supports.
+   * Short description of instance type.
    * </pre>
    *
-   * <code>string region = 4;</code>
-   * @return The region.
+   * <code>string description = 2;</code>
+   * @return The description.
    */
   @java.lang.Override
-  public java.lang.String getRegion() {
-    java.lang.Object ref = region_;
+  public java.lang.String getDescription() {
+    java.lang.Object ref = description_;
     if (ref instanceof java.lang.String) {
       return (java.lang.String) ref;
     } else {
       com.google.protobuf.ByteString bs = 
           (com.google.protobuf.ByteString) ref;
       java.lang.String s = bs.toStringUtf8();
-      region_ = s;
+      description_ = s;
       return s;
     }
   }
   /**
    * <pre>
-   * The region. The naming here depends on the cloud choice above and will be validated
-   * against which clouds+regions that Clarifai currently supports.
+   * Short description of instance type.
    * </pre>
    *
-   * <code>string region = 4;</code>
-   * @return The bytes for region.
+   * <code>string description = 2;</code>
+   * @return The bytes for description.
    */
   @java.lang.Override
   public com.google.protobuf.ByteString
-      getRegionBytes() {
-    java.lang.Object ref = region_;
+      getDescriptionBytes() {
+    java.lang.Object ref = description_;
     if (ref instanceof java.lang.String) {
       com.google.protobuf.ByteString b = 
           com.google.protobuf.ByteString.copyFromUtf8(
               (java.lang.String) ref);
-      region_ = b;
+      description_ = b;
       return b;
     } else {
       return (com.google.protobuf.ByteString) ref;
     }
   }
 
+  public static final int COMPUTE_INFO_FIELD_NUMBER = 3;
+  private com.clarifai.grpc.api.ComputeInfo computeInfo_;
+  /**
+   * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+   * @return Whether the computeInfo field is set.
+   */
+  @java.lang.Override
+  public boolean hasComputeInfo() {
+    return computeInfo_ != null;
+  }
+  /**
+   * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+   * @return The computeInfo.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.ComputeInfo getComputeInfo() {
+    return computeInfo_ == null ? com.clarifai.grpc.api.ComputeInfo.getDefaultInstance() : computeInfo_;
+  }
+  /**
+   * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.ComputeInfoOrBuilder getComputeInfoOrBuilder() {
+    return getComputeInfo();
+  }
+
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -389,11 +241,11 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
       com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
     }
-    if (cloud_ != com.clarifai.grpc.api.CloudRegion.Cloud.UNKOWN_CLOUD.getNumber()) {
-      output.writeEnum(3, cloud_);
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, description_);
     }
-    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(region_)) {
-      com.google.protobuf.GeneratedMessageV3.writeString(output, 4, region_);
+    if (computeInfo_ != null) {
+      output.writeMessage(3, getComputeInfo());
     }
     unknownFields.writeTo(output);
   }
@@ -407,12 +259,12 @@ public int getSerializedSize() {
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
       size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
     }
-    if (cloud_ != com.clarifai.grpc.api.CloudRegion.Cloud.UNKOWN_CLOUD.getNumber()) {
-      size += com.google.protobuf.CodedOutputStream
-        .computeEnumSize(3, cloud_);
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, description_);
     }
-    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(region_)) {
-      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, region_);
+    if (computeInfo_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(3, getComputeInfo());
     }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
@@ -424,16 +276,20 @@ public boolean equals(final java.lang.Object obj) {
     if (obj == this) {
      return true;
     }
-    if (!(obj instanceof com.clarifai.grpc.api.CloudRegion)) {
+    if (!(obj instanceof com.clarifai.grpc.api.InstanceType)) {
       return super.equals(obj);
     }
-    com.clarifai.grpc.api.CloudRegion other = (com.clarifai.grpc.api.CloudRegion) obj;
+    com.clarifai.grpc.api.InstanceType other = (com.clarifai.grpc.api.InstanceType) obj;
 
     if (!getId()
         .equals(other.getId())) return false;
-    if (cloud_ != other.cloud_) return false;
-    if (!getRegion()
-        .equals(other.getRegion())) return false;
+    if (!getDescription()
+        .equals(other.getDescription())) return false;
+    if (hasComputeInfo() != other.hasComputeInfo()) return false;
+    if (hasComputeInfo()) {
+      if (!getComputeInfo()
+          .equals(other.getComputeInfo())) return false;
+    }
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -447,78 +303,80 @@ public int hashCode() {
     hash = (19 * hash) + getDescriptor().hashCode();
     hash = (37 * hash) + ID_FIELD_NUMBER;
     hash = (53 * hash) + getId().hashCode();
-    hash = (37 * hash) + CLOUD_FIELD_NUMBER;
-    hash = (53 * hash) + cloud_;
-    hash = (37 * hash) + REGION_FIELD_NUMBER;
-    hash = (53 * hash) + getRegion().hashCode();
+    hash = (37 * hash) + DESCRIPTION_FIELD_NUMBER;
+    hash = (53 * hash) + getDescription().hashCode();
+    if (hasComputeInfo()) {
+      hash = (37 * hash) + COMPUTE_INFO_FIELD_NUMBER;
+      hash = (53 * hash) + getComputeInfo().hashCode();
+    }
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
   }
 
-  public static com.clarifai.grpc.api.CloudRegion parseFrom(
+  public static com.clarifai.grpc.api.InstanceType parseFrom(
       java.nio.ByteBuffer data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.clarifai.grpc.api.CloudRegion parseFrom(
+  public static com.clarifai.grpc.api.InstanceType parseFrom(
       java.nio.ByteBuffer data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.clarifai.grpc.api.CloudRegion parseFrom(
+  public static com.clarifai.grpc.api.InstanceType parseFrom(
       com.google.protobuf.ByteString data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.clarifai.grpc.api.CloudRegion parseFrom(
+  public static com.clarifai.grpc.api.InstanceType parseFrom(
       com.google.protobuf.ByteString data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.clarifai.grpc.api.CloudRegion parseFrom(byte[] data)
+  public static com.clarifai.grpc.api.InstanceType parseFrom(byte[] data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.clarifai.grpc.api.CloudRegion parseFrom(
+  public static com.clarifai.grpc.api.InstanceType parseFrom(
       byte[] data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.clarifai.grpc.api.CloudRegion parseFrom(java.io.InputStream input)
+  public static com.clarifai.grpc.api.InstanceType parseFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.clarifai.grpc.api.CloudRegion parseFrom(
+  public static com.clarifai.grpc.api.InstanceType parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.clarifai.grpc.api.CloudRegion parseDelimitedFrom(java.io.InputStream input)
+  public static com.clarifai.grpc.api.InstanceType parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input);
   }
-  public static com.clarifai.grpc.api.CloudRegion parseDelimitedFrom(
+  public static com.clarifai.grpc.api.InstanceType parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.clarifai.grpc.api.CloudRegion parseFrom(
+  public static com.clarifai.grpc.api.InstanceType parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.clarifai.grpc.api.CloudRegion parseFrom(
+  public static com.clarifai.grpc.api.InstanceType parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
@@ -531,7 +389,7 @@ public static com.clarifai.grpc.api.CloudRegion parseFrom(
   public static Builder newBuilder() {
     return DEFAULT_INSTANCE.toBuilder();
   }
-  public static Builder newBuilder(com.clarifai.grpc.api.CloudRegion prototype) {
+  public static Builder newBuilder(com.clarifai.grpc.api.InstanceType prototype) {
     return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
   }
   @java.lang.Override
@@ -548,33 +406,30 @@ protected Builder newBuilderForType(
   }
   /**
    * <pre>
-   * We define a cloud region here to be used in Nodepools and by the cloud agent.
-   * There will be one cloud agent per CloudRegion.
-   * This allows us to define CloudRegions that are VPCs within one physical cloud and have that
-   * managed by one cloud agent which can list all nodepools for that VPC to deploy them and
-   * orchestrate work within them.
+   * The instance types that will be available in this pool of nodes.
+   * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
    * </pre>
    *
-   * Protobuf type {@code clarifai.api.CloudRegion}
+   * Protobuf type {@code clarifai.api.InstanceType}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-      // @@protoc_insertion_point(builder_implements:clarifai.api.CloudRegion)
-      com.clarifai.grpc.api.CloudRegionOrBuilder {
+      // @@protoc_insertion_point(builder_implements:clarifai.api.InstanceType)
+      com.clarifai.grpc.api.InstanceTypeOrBuilder {
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_CloudRegion_descriptor;
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_InstanceType_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_CloudRegion_fieldAccessorTable
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_InstanceType_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.clarifai.grpc.api.CloudRegion.class, com.clarifai.grpc.api.CloudRegion.Builder.class);
+              com.clarifai.grpc.api.InstanceType.class, com.clarifai.grpc.api.InstanceType.Builder.class);
     }
 
-    // Construct using com.clarifai.grpc.api.CloudRegion.newBuilder()
+    // Construct using com.clarifai.grpc.api.InstanceType.newBuilder()
     private Builder() {
       maybeForceBuilderInitialization();
     }
@@ -594,27 +449,31 @@ public Builder clear() {
       super.clear();
       id_ = "";
 
-      cloud_ = 0;
-
-      region_ = "";
+      description_ = "";
 
+      if (computeInfoBuilder_ == null) {
+        computeInfo_ = null;
+      } else {
+        computeInfo_ = null;
+        computeInfoBuilder_ = null;
+      }
       return this;
     }
 
     @java.lang.Override
     public com.google.protobuf.Descriptors.Descriptor
         getDescriptorForType() {
-      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_CloudRegion_descriptor;
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_InstanceType_descriptor;
     }
 
     @java.lang.Override
-    public com.clarifai.grpc.api.CloudRegion getDefaultInstanceForType() {
-      return com.clarifai.grpc.api.CloudRegion.getDefaultInstance();
+    public com.clarifai.grpc.api.InstanceType getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.InstanceType.getDefaultInstance();
     }
 
     @java.lang.Override
-    public com.clarifai.grpc.api.CloudRegion build() {
-      com.clarifai.grpc.api.CloudRegion result = buildPartial();
+    public com.clarifai.grpc.api.InstanceType build() {
+      com.clarifai.grpc.api.InstanceType result = buildPartial();
       if (!result.isInitialized()) {
         throw newUninitializedMessageException(result);
       }
@@ -622,11 +481,15 @@ public com.clarifai.grpc.api.CloudRegion build() {
     }
 
     @java.lang.Override
-    public com.clarifai.grpc.api.CloudRegion buildPartial() {
-      com.clarifai.grpc.api.CloudRegion result = new com.clarifai.grpc.api.CloudRegion(this);
+    public com.clarifai.grpc.api.InstanceType buildPartial() {
+      com.clarifai.grpc.api.InstanceType result = new com.clarifai.grpc.api.InstanceType(this);
       result.id_ = id_;
-      result.cloud_ = cloud_;
-      result.region_ = region_;
+      result.description_ = description_;
+      if (computeInfoBuilder_ == null) {
+        result.computeInfo_ = computeInfo_;
+      } else {
+        result.computeInfo_ = computeInfoBuilder_.build();
+      }
       onBuilt();
       return result;
     }
@@ -665,27 +528,27 @@ public Builder addRepeatedField(
     }
     @java.lang.Override
     public Builder mergeFrom(com.google.protobuf.Message other) {
-      if (other instanceof com.clarifai.grpc.api.CloudRegion) {
-        return mergeFrom((com.clarifai.grpc.api.CloudRegion)other);
+      if (other instanceof com.clarifai.grpc.api.InstanceType) {
+        return mergeFrom((com.clarifai.grpc.api.InstanceType)other);
       } else {
         super.mergeFrom(other);
         return this;
       }
     }
 
-    public Builder mergeFrom(com.clarifai.grpc.api.CloudRegion other) {
-      if (other == com.clarifai.grpc.api.CloudRegion.getDefaultInstance()) return this;
+    public Builder mergeFrom(com.clarifai.grpc.api.InstanceType other) {
+      if (other == com.clarifai.grpc.api.InstanceType.getDefaultInstance()) return this;
       if (!other.getId().isEmpty()) {
         id_ = other.id_;
         onChanged();
       }
-      if (other.cloud_ != 0) {
-        setCloudValue(other.getCloudValue());
-      }
-      if (!other.getRegion().isEmpty()) {
-        region_ = other.region_;
+      if (!other.getDescription().isEmpty()) {
+        description_ = other.description_;
         onChanged();
       }
+      if (other.hasComputeInfo()) {
+        mergeComputeInfo(other.getComputeInfo());
+      }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
       return this;
@@ -701,11 +564,11 @@ public Builder mergeFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      com.clarifai.grpc.api.CloudRegion parsedMessage = null;
+      com.clarifai.grpc.api.InstanceType parsedMessage = null;
       try {
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        parsedMessage = (com.clarifai.grpc.api.CloudRegion) e.getUnfinishedMessage();
+        parsedMessage = (com.clarifai.grpc.api.InstanceType) e.getUnfinishedMessage();
         throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
@@ -791,77 +654,22 @@ public Builder setIdBytes(
       return this;
     }
 
-    private int cloud_ = 0;
-    /**
-     * <code>.clarifai.api.CloudRegion.Cloud cloud = 3;</code>
-     * @return The enum numeric value on the wire for cloud.
-     */
-    @java.lang.Override public int getCloudValue() {
-      return cloud_;
-    }
-    /**
-     * <code>.clarifai.api.CloudRegion.Cloud cloud = 3;</code>
-     * @param value The enum numeric value on the wire for cloud to set.
-     * @return This builder for chaining.
-     */
-    public Builder setCloudValue(int value) {
-      
-      cloud_ = value;
-      onChanged();
-      return this;
-    }
-    /**
-     * <code>.clarifai.api.CloudRegion.Cloud cloud = 3;</code>
-     * @return The cloud.
-     */
-    @java.lang.Override
-    public com.clarifai.grpc.api.CloudRegion.Cloud getCloud() {
-      @SuppressWarnings("deprecation")
-      com.clarifai.grpc.api.CloudRegion.Cloud result = com.clarifai.grpc.api.CloudRegion.Cloud.valueOf(cloud_);
-      return result == null ? com.clarifai.grpc.api.CloudRegion.Cloud.UNRECOGNIZED : result;
-    }
-    /**
-     * <code>.clarifai.api.CloudRegion.Cloud cloud = 3;</code>
-     * @param value The cloud to set.
-     * @return This builder for chaining.
-     */
-    public Builder setCloud(com.clarifai.grpc.api.CloudRegion.Cloud value) {
-      if (value == null) {
-        throw new NullPointerException();
-      }
-      
-      cloud_ = value.getNumber();
-      onChanged();
-      return this;
-    }
-    /**
-     * <code>.clarifai.api.CloudRegion.Cloud cloud = 3;</code>
-     * @return This builder for chaining.
-     */
-    public Builder clearCloud() {
-      
-      cloud_ = 0;
-      onChanged();
-      return this;
-    }
-
-    private java.lang.Object region_ = "";
+    private java.lang.Object description_ = "";
     /**
      * <pre>
-     * The region. The naming here depends on the cloud choice above and will be validated
-     * against which clouds+regions that Clarifai currently supports.
+     * Short description of instance type.
      * </pre>
      *
-     * <code>string region = 4;</code>
-     * @return The region.
+     * <code>string description = 2;</code>
+     * @return The description.
      */
-    public java.lang.String getRegion() {
-      java.lang.Object ref = region_;
+    public java.lang.String getDescription() {
+      java.lang.Object ref = description_;
       if (!(ref instanceof java.lang.String)) {
         com.google.protobuf.ByteString bs =
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        region_ = s;
+        description_ = s;
         return s;
       } else {
         return (java.lang.String) ref;
@@ -869,21 +677,20 @@ public java.lang.String getRegion() {
     }
     /**
      * <pre>
-     * The region. The naming here depends on the cloud choice above and will be validated
-     * against which clouds+regions that Clarifai currently supports.
+     * Short description of instance type.
      * </pre>
      *
-     * <code>string region = 4;</code>
-     * @return The bytes for region.
+     * <code>string description = 2;</code>
+     * @return The bytes for description.
      */
     public com.google.protobuf.ByteString
-        getRegionBytes() {
-      java.lang.Object ref = region_;
+        getDescriptionBytes() {
+      java.lang.Object ref = description_;
       if (ref instanceof String) {
         com.google.protobuf.ByteString b = 
             com.google.protobuf.ByteString.copyFromUtf8(
                 (java.lang.String) ref);
-        region_ = b;
+        description_ = b;
         return b;
       } else {
         return (com.google.protobuf.ByteString) ref;
@@ -891,60 +698,176 @@ public java.lang.String getRegion() {
     }
     /**
      * <pre>
-     * The region. The naming here depends on the cloud choice above and will be validated
-     * against which clouds+regions that Clarifai currently supports.
+     * Short description of instance type.
      * </pre>
      *
-     * <code>string region = 4;</code>
-     * @param value The region to set.
+     * <code>string description = 2;</code>
+     * @param value The description to set.
      * @return This builder for chaining.
      */
-    public Builder setRegion(
+    public Builder setDescription(
         java.lang.String value) {
       if (value == null) {
     throw new NullPointerException();
   }
   
-      region_ = value;
+      description_ = value;
       onChanged();
       return this;
     }
     /**
      * <pre>
-     * The region. The naming here depends on the cloud choice above and will be validated
-     * against which clouds+regions that Clarifai currently supports.
+     * Short description of instance type.
      * </pre>
      *
-     * <code>string region = 4;</code>
+     * <code>string description = 2;</code>
      * @return This builder for chaining.
      */
-    public Builder clearRegion() {
+    public Builder clearDescription() {
       
-      region_ = getDefaultInstance().getRegion();
+      description_ = getDefaultInstance().getDescription();
       onChanged();
       return this;
     }
     /**
      * <pre>
-     * The region. The naming here depends on the cloud choice above and will be validated
-     * against which clouds+regions that Clarifai currently supports.
+     * Short description of instance type.
      * </pre>
      *
-     * <code>string region = 4;</code>
-     * @param value The bytes for region to set.
+     * <code>string description = 2;</code>
+     * @param value The bytes for description to set.
      * @return This builder for chaining.
      */
-    public Builder setRegionBytes(
+    public Builder setDescriptionBytes(
         com.google.protobuf.ByteString value) {
       if (value == null) {
     throw new NullPointerException();
   }
   checkByteStringIsUtf8(value);
       
-      region_ = value;
+      description_ = value;
       onChanged();
       return this;
     }
+
+    private com.clarifai.grpc.api.ComputeInfo computeInfo_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.ComputeInfo, com.clarifai.grpc.api.ComputeInfo.Builder, com.clarifai.grpc.api.ComputeInfoOrBuilder> computeInfoBuilder_;
+    /**
+     * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+     * @return Whether the computeInfo field is set.
+     */
+    public boolean hasComputeInfo() {
+      return computeInfoBuilder_ != null || computeInfo_ != null;
+    }
+    /**
+     * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+     * @return The computeInfo.
+     */
+    public com.clarifai.grpc.api.ComputeInfo getComputeInfo() {
+      if (computeInfoBuilder_ == null) {
+        return computeInfo_ == null ? com.clarifai.grpc.api.ComputeInfo.getDefaultInstance() : computeInfo_;
+      } else {
+        return computeInfoBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+     */
+    public Builder setComputeInfo(com.clarifai.grpc.api.ComputeInfo value) {
+      if (computeInfoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        computeInfo_ = value;
+        onChanged();
+      } else {
+        computeInfoBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+     */
+    public Builder setComputeInfo(
+        com.clarifai.grpc.api.ComputeInfo.Builder builderForValue) {
+      if (computeInfoBuilder_ == null) {
+        computeInfo_ = builderForValue.build();
+        onChanged();
+      } else {
+        computeInfoBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+     */
+    public Builder mergeComputeInfo(com.clarifai.grpc.api.ComputeInfo value) {
+      if (computeInfoBuilder_ == null) {
+        if (computeInfo_ != null) {
+          computeInfo_ =
+            com.clarifai.grpc.api.ComputeInfo.newBuilder(computeInfo_).mergeFrom(value).buildPartial();
+        } else {
+          computeInfo_ = value;
+        }
+        onChanged();
+      } else {
+        computeInfoBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+     */
+    public Builder clearComputeInfo() {
+      if (computeInfoBuilder_ == null) {
+        computeInfo_ = null;
+        onChanged();
+      } else {
+        computeInfo_ = null;
+        computeInfoBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+     */
+    public com.clarifai.grpc.api.ComputeInfo.Builder getComputeInfoBuilder() {
+      
+      onChanged();
+      return getComputeInfoFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+     */
+    public com.clarifai.grpc.api.ComputeInfoOrBuilder getComputeInfoOrBuilder() {
+      if (computeInfoBuilder_ != null) {
+        return computeInfoBuilder_.getMessageOrBuilder();
+      } else {
+        return computeInfo_ == null ?
+            com.clarifai.grpc.api.ComputeInfo.getDefaultInstance() : computeInfo_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.ComputeInfo, com.clarifai.grpc.api.ComputeInfo.Builder, com.clarifai.grpc.api.ComputeInfoOrBuilder> 
+        getComputeInfoFieldBuilder() {
+      if (computeInfoBuilder_ == null) {
+        computeInfoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.ComputeInfo, com.clarifai.grpc.api.ComputeInfo.Builder, com.clarifai.grpc.api.ComputeInfoOrBuilder>(
+                getComputeInfo(),
+                getParentForChildren(),
+                isClean());
+        computeInfo_ = null;
+      }
+      return computeInfoBuilder_;
+    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {
@@ -958,41 +881,41 @@ public final Builder mergeUnknownFields(
     }
 
 
-    // @@protoc_insertion_point(builder_scope:clarifai.api.CloudRegion)
+    // @@protoc_insertion_point(builder_scope:clarifai.api.InstanceType)
   }
 
-  // @@protoc_insertion_point(class_scope:clarifai.api.CloudRegion)
-  private static final com.clarifai.grpc.api.CloudRegion DEFAULT_INSTANCE;
+  // @@protoc_insertion_point(class_scope:clarifai.api.InstanceType)
+  private static final com.clarifai.grpc.api.InstanceType DEFAULT_INSTANCE;
   static {
-    DEFAULT_INSTANCE = new com.clarifai.grpc.api.CloudRegion();
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.InstanceType();
   }
 
-  public static com.clarifai.grpc.api.CloudRegion getDefaultInstance() {
+  public static com.clarifai.grpc.api.InstanceType getDefaultInstance() {
     return DEFAULT_INSTANCE;
   }
 
-  private static final com.google.protobuf.Parser<CloudRegion>
-      PARSER = new com.google.protobuf.AbstractParser<CloudRegion>() {
+  private static final com.google.protobuf.Parser<InstanceType>
+      PARSER = new com.google.protobuf.AbstractParser<InstanceType>() {
     @java.lang.Override
-    public CloudRegion parsePartialFrom(
+    public InstanceType parsePartialFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      return new CloudRegion(input, extensionRegistry);
+      return new InstanceType(input, extensionRegistry);
     }
   };
 
-  public static com.google.protobuf.Parser<CloudRegion> parser() {
+  public static com.google.protobuf.Parser<InstanceType> parser() {
     return PARSER;
   }
 
   @java.lang.Override
-  public com.google.protobuf.Parser<CloudRegion> getParserForType() {
+  public com.google.protobuf.Parser<InstanceType> getParserForType() {
     return PARSER;
   }
 
   @java.lang.Override
-  public com.clarifai.grpc.api.CloudRegion getDefaultInstanceForType() {
+  public com.clarifai.grpc.api.InstanceType getDefaultInstanceForType() {
     return DEFAULT_INSTANCE;
   }
 
diff --git a/src/main/java/com/clarifai/grpc/api/InstanceTypeOrBuilder.java b/src/main/java/com/clarifai/grpc/api/InstanceTypeOrBuilder.java
new file mode 100644
index 0000000..34b5ac8
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/InstanceTypeOrBuilder.java
@@ -0,0 +1,56 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/resources.proto
+
+package com.clarifai.grpc.api;
+
+public interface InstanceTypeOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.InstanceType)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string id = 1;</code>
+   * @return The id.
+   */
+  java.lang.String getId();
+  /**
+   * <code>string id = 1;</code>
+   * @return The bytes for id.
+   */
+  com.google.protobuf.ByteString
+      getIdBytes();
+
+  /**
+   * <pre>
+   * Short description of instance type.
+   * </pre>
+   *
+   * <code>string description = 2;</code>
+   * @return The description.
+   */
+  java.lang.String getDescription();
+  /**
+   * <pre>
+   * Short description of instance type.
+   * </pre>
+   *
+   * <code>string description = 2;</code>
+   * @return The bytes for description.
+   */
+  com.google.protobuf.ByteString
+      getDescriptionBytes();
+
+  /**
+   * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+   * @return Whether the computeInfo field is set.
+   */
+  boolean hasComputeInfo();
+  /**
+   * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+   * @return The computeInfo.
+   */
+  com.clarifai.grpc.api.ComputeInfo getComputeInfo();
+  /**
+   * <code>.clarifai.api.ComputeInfo compute_info = 3;</code>
+   */
+  com.clarifai.grpc.api.ComputeInfoOrBuilder getComputeInfoOrBuilder();
+}
diff --git a/src/main/java/com/clarifai/grpc/api/LabelCount.java b/src/main/java/com/clarifai/grpc/api/LabelCount.java
index 10c0cf5..3b82d89 100644
--- a/src/main/java/com/clarifai/grpc/api/LabelCount.java
+++ b/src/main/java/com/clarifai/grpc/api/LabelCount.java
@@ -116,7 +116,7 @@ private LabelCount(
   /**
    * <code>string concept_name = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.LabelCount.concept_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1904
+   *     See proto/clarifai/api/resources.proto;l=1920
    * @return The conceptName.
    */
   @java.lang.Override
@@ -135,7 +135,7 @@ private LabelCount(
   /**
    * <code>string concept_name = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.LabelCount.concept_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1904
+   *     See proto/clarifai/api/resources.proto;l=1920
    * @return The bytes for conceptName.
    */
   @java.lang.Override
@@ -547,7 +547,7 @@ public Builder mergeFrom(
     /**
      * <code>string concept_name = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.LabelCount.concept_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1904
+     *     See proto/clarifai/api/resources.proto;l=1920
      * @return The conceptName.
      */
     @java.lang.Deprecated public java.lang.String getConceptName() {
@@ -565,7 +565,7 @@ public Builder mergeFrom(
     /**
      * <code>string concept_name = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.LabelCount.concept_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1904
+     *     See proto/clarifai/api/resources.proto;l=1920
      * @return The bytes for conceptName.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -584,7 +584,7 @@ public Builder mergeFrom(
     /**
      * <code>string concept_name = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.LabelCount.concept_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1904
+     *     See proto/clarifai/api/resources.proto;l=1920
      * @param value The conceptName to set.
      * @return This builder for chaining.
      */
@@ -601,7 +601,7 @@ public Builder mergeFrom(
     /**
      * <code>string concept_name = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.LabelCount.concept_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1904
+     *     See proto/clarifai/api/resources.proto;l=1920
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearConceptName() {
@@ -613,7 +613,7 @@ public Builder mergeFrom(
     /**
      * <code>string concept_name = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.LabelCount.concept_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1904
+     *     See proto/clarifai/api/resources.proto;l=1920
      * @param value The bytes for conceptName to set.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/LabelCountOrBuilder.java b/src/main/java/com/clarifai/grpc/api/LabelCountOrBuilder.java
index 00e1c33..938832e 100644
--- a/src/main/java/com/clarifai/grpc/api/LabelCountOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/LabelCountOrBuilder.java
@@ -10,14 +10,14 @@ public interface LabelCountOrBuilder extends
   /**
    * <code>string concept_name = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.LabelCount.concept_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1904
+   *     See proto/clarifai/api/resources.proto;l=1920
    * @return The conceptName.
    */
   @java.lang.Deprecated java.lang.String getConceptName();
   /**
    * <code>string concept_name = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.LabelCount.concept_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1904
+   *     See proto/clarifai/api/resources.proto;l=1920
    * @return The bytes for conceptName.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
diff --git a/src/main/java/com/clarifai/grpc/api/ListAppsRequest.java b/src/main/java/com/clarifai/grpc/api/ListAppsRequest.java
index 769f434..e6c16e7 100644
--- a/src/main/java/com/clarifai/grpc/api/ListAppsRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/ListAppsRequest.java
@@ -603,7 +603,7 @@ public java.lang.String getSearch() {
    *
    * <code>string query = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4056
+   *     See proto/clarifai/api/service.proto;l=4156
    * @return The query.
    */
   @java.lang.Override
@@ -627,7 +627,7 @@ public java.lang.String getSearch() {
    *
    * <code>string query = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4056
+   *     See proto/clarifai/api/service.proto;l=4156
    * @return The bytes for query.
    */
   @java.lang.Override
@@ -655,7 +655,7 @@ public java.lang.String getSearch() {
    *
    * <code>string name = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4059
+   *     See proto/clarifai/api/service.proto;l=4159
    * @return The name.
    */
   @java.lang.Override
@@ -679,7 +679,7 @@ public java.lang.String getSearch() {
    *
    * <code>string name = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4059
+   *     See proto/clarifai/api/service.proto;l=4159
    * @return The bytes for name.
    */
   @java.lang.Override
@@ -707,7 +707,7 @@ public java.lang.String getSearch() {
    *
    * <code>string id = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4062
+   *     See proto/clarifai/api/service.proto;l=4162
    * @return The id.
    */
   @java.lang.Override
@@ -731,7 +731,7 @@ public java.lang.String getSearch() {
    *
    * <code>string id = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4062
+   *     See proto/clarifai/api/service.proto;l=4162
    * @return The bytes for id.
    */
   @java.lang.Override
@@ -2337,7 +2337,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4056
+     *     See proto/clarifai/api/service.proto;l=4156
      * @return The query.
      */
     @java.lang.Deprecated public java.lang.String getQuery() {
@@ -2360,7 +2360,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4056
+     *     See proto/clarifai/api/service.proto;l=4156
      * @return The bytes for query.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -2384,7 +2384,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4056
+     *     See proto/clarifai/api/service.proto;l=4156
      * @param value The query to set.
      * @return This builder for chaining.
      */
@@ -2406,7 +2406,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4056
+     *     See proto/clarifai/api/service.proto;l=4156
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearQuery() {
@@ -2423,7 +2423,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4056
+     *     See proto/clarifai/api/service.proto;l=4156
      * @param value The bytes for query to set.
      * @return This builder for chaining.
      */
@@ -2448,7 +2448,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4059
+     *     See proto/clarifai/api/service.proto;l=4159
      * @return The name.
      */
     @java.lang.Deprecated public java.lang.String getName() {
@@ -2471,7 +2471,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4059
+     *     See proto/clarifai/api/service.proto;l=4159
      * @return The bytes for name.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -2495,7 +2495,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4059
+     *     See proto/clarifai/api/service.proto;l=4159
      * @param value The name to set.
      * @return This builder for chaining.
      */
@@ -2517,7 +2517,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4059
+     *     See proto/clarifai/api/service.proto;l=4159
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearName() {
@@ -2534,7 +2534,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4059
+     *     See proto/clarifai/api/service.proto;l=4159
      * @param value The bytes for name to set.
      * @return This builder for chaining.
      */
@@ -2559,7 +2559,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4062
+     *     See proto/clarifai/api/service.proto;l=4162
      * @return The id.
      */
     @java.lang.Deprecated public java.lang.String getId() {
@@ -2582,7 +2582,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4062
+     *     See proto/clarifai/api/service.proto;l=4162
      * @return The bytes for id.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -2606,7 +2606,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4062
+     *     See proto/clarifai/api/service.proto;l=4162
      * @param value The id to set.
      * @return This builder for chaining.
      */
@@ -2628,7 +2628,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4062
+     *     See proto/clarifai/api/service.proto;l=4162
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearId() {
@@ -2645,7 +2645,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.ListAppsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4062
+     *     See proto/clarifai/api/service.proto;l=4162
      * @param value The bytes for id to set.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/ListAppsRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ListAppsRequestOrBuilder.java
index e939586..7fdf62c 100644
--- a/src/main/java/com/clarifai/grpc/api/ListAppsRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/ListAppsRequestOrBuilder.java
@@ -255,7 +255,7 @@ public interface ListAppsRequestOrBuilder extends
    *
    * <code>string query = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4056
+   *     See proto/clarifai/api/service.proto;l=4156
    * @return The query.
    */
   @java.lang.Deprecated java.lang.String getQuery();
@@ -267,7 +267,7 @@ public interface ListAppsRequestOrBuilder extends
    *
    * <code>string query = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4056
+   *     See proto/clarifai/api/service.proto;l=4156
    * @return The bytes for query.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -281,7 +281,7 @@ public interface ListAppsRequestOrBuilder extends
    *
    * <code>string name = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4059
+   *     See proto/clarifai/api/service.proto;l=4159
    * @return The name.
    */
   @java.lang.Deprecated java.lang.String getName();
@@ -293,7 +293,7 @@ public interface ListAppsRequestOrBuilder extends
    *
    * <code>string name = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4059
+   *     See proto/clarifai/api/service.proto;l=4159
    * @return The bytes for name.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -307,7 +307,7 @@ public interface ListAppsRequestOrBuilder extends
    *
    * <code>string id = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4062
+   *     See proto/clarifai/api/service.proto;l=4162
    * @return The id.
    */
   @java.lang.Deprecated java.lang.String getId();
@@ -319,7 +319,7 @@ public interface ListAppsRequestOrBuilder extends
    *
    * <code>string id = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.ListAppsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4062
+   *     See proto/clarifai/api/service.proto;l=4162
    * @return The bytes for id.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
diff --git a/src/main/java/com/clarifai/grpc/api/ListComputeClustersRequest.java b/src/main/java/com/clarifai/grpc/api/ListComputeClustersRequest.java
new file mode 100644
index 0000000..5545bbf
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/ListComputeClustersRequest.java
@@ -0,0 +1,825 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * Protobuf type {@code clarifai.api.ListComputeClustersRequest}
+ */
+public final class ListComputeClustersRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.ListComputeClustersRequest)
+    ListComputeClustersRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use ListComputeClustersRequest.newBuilder() to construct.
+  private ListComputeClustersRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private ListComputeClustersRequest() {
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new ListComputeClustersRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private ListComputeClustersRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.UserAppIDSet.Builder subBuilder = null;
+            if (userAppId_ != null) {
+              subBuilder = userAppId_.toBuilder();
+            }
+            userAppId_ = input.readMessage(com.clarifai.grpc.api.UserAppIDSet.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(userAppId_);
+              userAppId_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 16: {
+
+            page_ = input.readUInt32();
+            break;
+          }
+          case 24: {
+
+            perPage_ = input.readUInt32();
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_ListComputeClustersRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_ListComputeClustersRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.ListComputeClustersRequest.class, com.clarifai.grpc.api.ListComputeClustersRequest.Builder.class);
+  }
+
+  public static final int USER_APP_ID_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  @java.lang.Override
+  public boolean hasUserAppId() {
+    return userAppId_ != null;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+    return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+    return getUserAppId();
+  }
+
+  public static final int PAGE_FIELD_NUMBER = 2;
+  private int page_;
+  /**
+   * <pre>
+   * (optional URL parameter) The page number. Pagination is used to split the results into chunks.
+   * Defaults to 1.
+   * </pre>
+   *
+   * <code>uint32 page = 2;</code>
+   * @return The page.
+   */
+  @java.lang.Override
+  public int getPage() {
+    return page_;
+  }
+
+  public static final int PER_PAGE_FIELD_NUMBER = 3;
+  private int perPage_;
+  /**
+   * <pre>
+   * (optional URL parameter) The number of results that will be contained in each page. Defaults
+   * to 128.
+   * </pre>
+   *
+   * <code>uint32 per_page = 3;</code>
+   * @return The perPage.
+   */
+  @java.lang.Override
+  public int getPerPage() {
+    return perPage_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (userAppId_ != null) {
+      output.writeMessage(1, getUserAppId());
+    }
+    if (page_ != 0) {
+      output.writeUInt32(2, page_);
+    }
+    if (perPage_ != 0) {
+      output.writeUInt32(3, perPage_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (userAppId_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getUserAppId());
+    }
+    if (page_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt32Size(2, page_);
+    }
+    if (perPage_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt32Size(3, perPage_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.ListComputeClustersRequest)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.ListComputeClustersRequest other = (com.clarifai.grpc.api.ListComputeClustersRequest) obj;
+
+    if (hasUserAppId() != other.hasUserAppId()) return false;
+    if (hasUserAppId()) {
+      if (!getUserAppId()
+          .equals(other.getUserAppId())) return false;
+    }
+    if (getPage()
+        != other.getPage()) return false;
+    if (getPerPage()
+        != other.getPerPage()) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasUserAppId()) {
+      hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getUserAppId().hashCode();
+    }
+    hash = (37 * hash) + PAGE_FIELD_NUMBER;
+    hash = (53 * hash) + getPage();
+    hash = (37 * hash) + PER_PAGE_FIELD_NUMBER;
+    hash = (53 * hash) + getPerPage();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.ListComputeClustersRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.ListComputeClustersRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code clarifai.api.ListComputeClustersRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.ListComputeClustersRequest)
+      com.clarifai.grpc.api.ListComputeClustersRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_ListComputeClustersRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_ListComputeClustersRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.ListComputeClustersRequest.class, com.clarifai.grpc.api.ListComputeClustersRequest.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.ListComputeClustersRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+      page_ = 0;
+
+      perPage_ = 0;
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_ListComputeClustersRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.ListComputeClustersRequest getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.ListComputeClustersRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.ListComputeClustersRequest build() {
+      com.clarifai.grpc.api.ListComputeClustersRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.ListComputeClustersRequest buildPartial() {
+      com.clarifai.grpc.api.ListComputeClustersRequest result = new com.clarifai.grpc.api.ListComputeClustersRequest(this);
+      if (userAppIdBuilder_ == null) {
+        result.userAppId_ = userAppId_;
+      } else {
+        result.userAppId_ = userAppIdBuilder_.build();
+      }
+      result.page_ = page_;
+      result.perPage_ = perPage_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.ListComputeClustersRequest) {
+        return mergeFrom((com.clarifai.grpc.api.ListComputeClustersRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.ListComputeClustersRequest other) {
+      if (other == com.clarifai.grpc.api.ListComputeClustersRequest.getDefaultInstance()) return this;
+      if (other.hasUserAppId()) {
+        mergeUserAppId(other.getUserAppId());
+      }
+      if (other.getPage() != 0) {
+        setPage(other.getPage());
+      }
+      if (other.getPerPage() != 0) {
+        setPerPage(other.getPerPage());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.ListComputeClustersRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.ListComputeClustersRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> userAppIdBuilder_;
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return Whether the userAppId field is set.
+     */
+    public boolean hasUserAppId() {
+      return userAppIdBuilder_ != null || userAppId_ != null;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return The userAppId.
+     */
+    public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      } else {
+        return userAppIdBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        userAppId_ = value;
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(
+        com.clarifai.grpc.api.UserAppIDSet.Builder builderForValue) {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = builderForValue.build();
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder mergeUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (userAppId_ != null) {
+          userAppId_ =
+            com.clarifai.grpc.api.UserAppIDSet.newBuilder(userAppId_).mergeFrom(value).buildPartial();
+        } else {
+          userAppId_ = value;
+        }
+        onChanged();
+      } else {
+        userAppIdBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder clearUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+        onChanged();
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSet.Builder getUserAppIdBuilder() {
+      
+      onChanged();
+      return getUserAppIdFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+      if (userAppIdBuilder_ != null) {
+        return userAppIdBuilder_.getMessageOrBuilder();
+      } else {
+        return userAppId_ == null ?
+            com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> 
+        getUserAppIdFieldBuilder() {
+      if (userAppIdBuilder_ == null) {
+        userAppIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder>(
+                getUserAppId(),
+                getParentForChildren(),
+                isClean());
+        userAppId_ = null;
+      }
+      return userAppIdBuilder_;
+    }
+
+    private int page_ ;
+    /**
+     * <pre>
+     * (optional URL parameter) The page number. Pagination is used to split the results into chunks.
+     * Defaults to 1.
+     * </pre>
+     *
+     * <code>uint32 page = 2;</code>
+     * @return The page.
+     */
+    @java.lang.Override
+    public int getPage() {
+      return page_;
+    }
+    /**
+     * <pre>
+     * (optional URL parameter) The page number. Pagination is used to split the results into chunks.
+     * Defaults to 1.
+     * </pre>
+     *
+     * <code>uint32 page = 2;</code>
+     * @param value The page to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPage(int value) {
+      
+      page_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * (optional URL parameter) The page number. Pagination is used to split the results into chunks.
+     * Defaults to 1.
+     * </pre>
+     *
+     * <code>uint32 page = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearPage() {
+      
+      page_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private int perPage_ ;
+    /**
+     * <pre>
+     * (optional URL parameter) The number of results that will be contained in each page. Defaults
+     * to 128.
+     * </pre>
+     *
+     * <code>uint32 per_page = 3;</code>
+     * @return The perPage.
+     */
+    @java.lang.Override
+    public int getPerPage() {
+      return perPage_;
+    }
+    /**
+     * <pre>
+     * (optional URL parameter) The number of results that will be contained in each page. Defaults
+     * to 128.
+     * </pre>
+     *
+     * <code>uint32 per_page = 3;</code>
+     * @param value The perPage to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPerPage(int value) {
+      
+      perPage_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * (optional URL parameter) The number of results that will be contained in each page. Defaults
+     * to 128.
+     * </pre>
+     *
+     * <code>uint32 per_page = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearPerPage() {
+      
+      perPage_ = 0;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.ListComputeClustersRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.ListComputeClustersRequest)
+  private static final com.clarifai.grpc.api.ListComputeClustersRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.ListComputeClustersRequest();
+  }
+
+  public static com.clarifai.grpc.api.ListComputeClustersRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<ListComputeClustersRequest>
+      PARSER = new com.google.protobuf.AbstractParser<ListComputeClustersRequest>() {
+    @java.lang.Override
+    public ListComputeClustersRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new ListComputeClustersRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<ListComputeClustersRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<ListComputeClustersRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.ListComputeClustersRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/ListComputeClustersRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ListComputeClustersRequestOrBuilder.java
new file mode 100644
index 0000000..0ee1608
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/ListComputeClustersRequestOrBuilder.java
@@ -0,0 +1,58 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface ListComputeClustersRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.ListComputeClustersRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  boolean hasUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  com.clarifai.grpc.api.UserAppIDSet getUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
+
+  /**
+   * <pre>
+   * (optional URL parameter) The page number. Pagination is used to split the results into chunks.
+   * Defaults to 1.
+   * </pre>
+   *
+   * <code>uint32 page = 2;</code>
+   * @return The page.
+   */
+  int getPage();
+
+  /**
+   * <pre>
+   * (optional URL parameter) The number of results that will be contained in each page. Defaults
+   * to 128.
+   * </pre>
+   *
+   * <code>uint32 per_page = 3;</code>
+   * @return The perPage.
+   */
+  int getPerPage();
+}
diff --git a/src/main/java/com/clarifai/grpc/api/ListDatasetsRequest.java b/src/main/java/com/clarifai/grpc/api/ListDatasetsRequest.java
index 6c9fe3f..0790330 100644
--- a/src/main/java/com/clarifai/grpc/api/ListDatasetsRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/ListDatasetsRequest.java
@@ -548,7 +548,7 @@ public java.lang.String getSearch() {
    *
    * <code>string id = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListDatasetsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4788
+   *     See proto/clarifai/api/service.proto;l=4888
    * @return The id.
    */
   @java.lang.Override
@@ -572,7 +572,7 @@ public java.lang.String getSearch() {
    *
    * <code>string id = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListDatasetsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4788
+   *     See proto/clarifai/api/service.proto;l=4888
    * @return The bytes for id.
    */
   @java.lang.Override
@@ -2035,7 +2035,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListDatasetsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4788
+     *     See proto/clarifai/api/service.proto;l=4888
      * @return The id.
      */
     @java.lang.Deprecated public java.lang.String getId() {
@@ -2058,7 +2058,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListDatasetsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4788
+     *     See proto/clarifai/api/service.proto;l=4888
      * @return The bytes for id.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -2082,7 +2082,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListDatasetsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4788
+     *     See proto/clarifai/api/service.proto;l=4888
      * @param value The id to set.
      * @return This builder for chaining.
      */
@@ -2104,7 +2104,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListDatasetsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4788
+     *     See proto/clarifai/api/service.proto;l=4888
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearId() {
@@ -2121,7 +2121,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListDatasetsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=4788
+     *     See proto/clarifai/api/service.proto;l=4888
      * @param value The bytes for id to set.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/ListDatasetsRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ListDatasetsRequestOrBuilder.java
index d014d12..5648775 100644
--- a/src/main/java/com/clarifai/grpc/api/ListDatasetsRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/ListDatasetsRequestOrBuilder.java
@@ -224,7 +224,7 @@ public interface ListDatasetsRequestOrBuilder extends
    *
    * <code>string id = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListDatasetsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4788
+   *     See proto/clarifai/api/service.proto;l=4888
    * @return The id.
    */
   @java.lang.Deprecated java.lang.String getId();
@@ -236,7 +236,7 @@ public interface ListDatasetsRequestOrBuilder extends
    *
    * <code>string id = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListDatasetsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=4788
+   *     See proto/clarifai/api/service.proto;l=4888
    * @return The bytes for id.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
diff --git a/src/main/java/com/clarifai/grpc/api/ListModelsRequest.java b/src/main/java/com/clarifai/grpc/api/ListModelsRequest.java
index 1d2508c..5f569e5 100644
--- a/src/main/java/com/clarifai/grpc/api/ListModelsRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/ListModelsRequest.java
@@ -1117,7 +1117,7 @@ public java.lang.String getSearch() {
    *
    * <code>string query = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModelsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5229
+   *     See proto/clarifai/api/service.proto;l=5329
    * @return The query.
    */
   @java.lang.Override
@@ -1141,7 +1141,7 @@ public java.lang.String getSearch() {
    *
    * <code>string query = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModelsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5229
+   *     See proto/clarifai/api/service.proto;l=5329
    * @return The bytes for query.
    */
   @java.lang.Override
@@ -1169,7 +1169,7 @@ public java.lang.String getSearch() {
    *
    * <code>string name = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModelsRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5232
+   *     See proto/clarifai/api/service.proto;l=5332
    * @return The name.
    */
   @java.lang.Override
@@ -1193,7 +1193,7 @@ public java.lang.String getSearch() {
    *
    * <code>string name = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModelsRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5232
+   *     See proto/clarifai/api/service.proto;l=5332
    * @return The bytes for name.
    */
   @java.lang.Override
@@ -1221,7 +1221,7 @@ public java.lang.String getSearch() {
    *
    * <code>bool filter_by_user_id = 22 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModelsRequest.filter_by_user_id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5235
+   *     See proto/clarifai/api/service.proto;l=5335
    * @return The filterByUserId.
    */
   @java.lang.Override
@@ -4182,7 +4182,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5229
+     *     See proto/clarifai/api/service.proto;l=5329
      * @return The query.
      */
     @java.lang.Deprecated public java.lang.String getQuery() {
@@ -4205,7 +4205,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5229
+     *     See proto/clarifai/api/service.proto;l=5329
      * @return The bytes for query.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -4229,7 +4229,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5229
+     *     See proto/clarifai/api/service.proto;l=5329
      * @param value The query to set.
      * @return This builder for chaining.
      */
@@ -4251,7 +4251,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5229
+     *     See proto/clarifai/api/service.proto;l=5329
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearQuery() {
@@ -4268,7 +4268,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5229
+     *     See proto/clarifai/api/service.proto;l=5329
      * @param value The bytes for query to set.
      * @return This builder for chaining.
      */
@@ -4293,7 +4293,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5232
+     *     See proto/clarifai/api/service.proto;l=5332
      * @return The name.
      */
     @java.lang.Deprecated public java.lang.String getName() {
@@ -4316,7 +4316,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5232
+     *     See proto/clarifai/api/service.proto;l=5332
      * @return The bytes for name.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -4340,7 +4340,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5232
+     *     See proto/clarifai/api/service.proto;l=5332
      * @param value The name to set.
      * @return This builder for chaining.
      */
@@ -4362,7 +4362,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5232
+     *     See proto/clarifai/api/service.proto;l=5332
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearName() {
@@ -4379,7 +4379,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5232
+     *     See proto/clarifai/api/service.proto;l=5332
      * @param value The bytes for name to set.
      * @return This builder for chaining.
      */
@@ -4404,7 +4404,7 @@ public Builder setSearchBytes(
      *
      * <code>bool filter_by_user_id = 22 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.filter_by_user_id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5235
+     *     See proto/clarifai/api/service.proto;l=5335
      * @return The filterByUserId.
      */
     @java.lang.Override
@@ -4419,7 +4419,7 @@ public Builder setSearchBytes(
      *
      * <code>bool filter_by_user_id = 22 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.filter_by_user_id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5235
+     *     See proto/clarifai/api/service.proto;l=5335
      * @param value The filterByUserId to set.
      * @return This builder for chaining.
      */
@@ -4437,7 +4437,7 @@ public Builder setSearchBytes(
      *
      * <code>bool filter_by_user_id = 22 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModelsRequest.filter_by_user_id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5235
+     *     See proto/clarifai/api/service.proto;l=5335
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearFilterByUserId() {
diff --git a/src/main/java/com/clarifai/grpc/api/ListModelsRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ListModelsRequestOrBuilder.java
index 271d879..c34c6f6 100644
--- a/src/main/java/com/clarifai/grpc/api/ListModelsRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/ListModelsRequestOrBuilder.java
@@ -553,7 +553,7 @@ public interface ListModelsRequestOrBuilder extends
    *
    * <code>string query = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModelsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5229
+   *     See proto/clarifai/api/service.proto;l=5329
    * @return The query.
    */
   @java.lang.Deprecated java.lang.String getQuery();
@@ -565,7 +565,7 @@ public interface ListModelsRequestOrBuilder extends
    *
    * <code>string query = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModelsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5229
+   *     See proto/clarifai/api/service.proto;l=5329
    * @return The bytes for query.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -579,7 +579,7 @@ public interface ListModelsRequestOrBuilder extends
    *
    * <code>string name = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModelsRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5232
+   *     See proto/clarifai/api/service.proto;l=5332
    * @return The name.
    */
   @java.lang.Deprecated java.lang.String getName();
@@ -591,7 +591,7 @@ public interface ListModelsRequestOrBuilder extends
    *
    * <code>string name = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModelsRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5232
+   *     See proto/clarifai/api/service.proto;l=5332
    * @return The bytes for name.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -605,7 +605,7 @@ public interface ListModelsRequestOrBuilder extends
    *
    * <code>bool filter_by_user_id = 22 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModelsRequest.filter_by_user_id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5235
+   *     See proto/clarifai/api/service.proto;l=5335
    * @return The filterByUserId.
    */
   @java.lang.Deprecated boolean getFilterByUserId();
diff --git a/src/main/java/com/clarifai/grpc/api/ListModulesRequest.java b/src/main/java/com/clarifai/grpc/api/ListModulesRequest.java
index 649c566..4fc3db4 100644
--- a/src/main/java/com/clarifai/grpc/api/ListModulesRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/ListModulesRequest.java
@@ -551,7 +551,7 @@ public java.lang.String getSearch() {
    *
    * <code>string name = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModulesRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=7023
+   *     See proto/clarifai/api/service.proto;l=7130
    * @return The name.
    */
   @java.lang.Override
@@ -575,7 +575,7 @@ public java.lang.String getSearch() {
    *
    * <code>string name = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModulesRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=7023
+   *     See proto/clarifai/api/service.proto;l=7130
    * @return The bytes for name.
    */
   @java.lang.Override
@@ -603,7 +603,7 @@ public java.lang.String getSearch() {
    *
    * <code>bool filter_by_user_id = 13 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModulesRequest.filter_by_user_id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=7026
+   *     See proto/clarifai/api/service.proto;l=7133
    * @return The filterByUserId.
    */
   @java.lang.Override
@@ -2069,7 +2069,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModulesRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=7023
+     *     See proto/clarifai/api/service.proto;l=7130
      * @return The name.
      */
     @java.lang.Deprecated public java.lang.String getName() {
@@ -2092,7 +2092,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModulesRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=7023
+     *     See proto/clarifai/api/service.proto;l=7130
      * @return The bytes for name.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -2116,7 +2116,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModulesRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=7023
+     *     See proto/clarifai/api/service.proto;l=7130
      * @param value The name to set.
      * @return This builder for chaining.
      */
@@ -2138,7 +2138,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModulesRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=7023
+     *     See proto/clarifai/api/service.proto;l=7130
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearName() {
@@ -2155,7 +2155,7 @@ public Builder setSearchBytes(
      *
      * <code>string name = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModulesRequest.name is deprecated.
-     *     See proto/clarifai/api/service.proto;l=7023
+     *     See proto/clarifai/api/service.proto;l=7130
      * @param value The bytes for name to set.
      * @return This builder for chaining.
      */
@@ -2180,7 +2180,7 @@ public Builder setSearchBytes(
      *
      * <code>bool filter_by_user_id = 13 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModulesRequest.filter_by_user_id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=7026
+     *     See proto/clarifai/api/service.proto;l=7133
      * @return The filterByUserId.
      */
     @java.lang.Override
@@ -2195,7 +2195,7 @@ public Builder setSearchBytes(
      *
      * <code>bool filter_by_user_id = 13 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModulesRequest.filter_by_user_id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=7026
+     *     See proto/clarifai/api/service.proto;l=7133
      * @param value The filterByUserId to set.
      * @return This builder for chaining.
      */
@@ -2213,7 +2213,7 @@ public Builder setSearchBytes(
      *
      * <code>bool filter_by_user_id = 13 [deprecated = true];</code>
      * @deprecated clarifai.api.ListModulesRequest.filter_by_user_id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=7026
+     *     See proto/clarifai/api/service.proto;l=7133
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearFilterByUserId() {
diff --git a/src/main/java/com/clarifai/grpc/api/ListModulesRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ListModulesRequestOrBuilder.java
index 55a0aaf..47d320c 100644
--- a/src/main/java/com/clarifai/grpc/api/ListModulesRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/ListModulesRequestOrBuilder.java
@@ -222,7 +222,7 @@ public interface ListModulesRequestOrBuilder extends
    *
    * <code>string name = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModulesRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=7023
+   *     See proto/clarifai/api/service.proto;l=7130
    * @return The name.
    */
   @java.lang.Deprecated java.lang.String getName();
@@ -234,7 +234,7 @@ public interface ListModulesRequestOrBuilder extends
    *
    * <code>string name = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModulesRequest.name is deprecated.
-   *     See proto/clarifai/api/service.proto;l=7023
+   *     See proto/clarifai/api/service.proto;l=7130
    * @return The bytes for name.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -248,7 +248,7 @@ public interface ListModulesRequestOrBuilder extends
    *
    * <code>bool filter_by_user_id = 13 [deprecated = true];</code>
    * @deprecated clarifai.api.ListModulesRequest.filter_by_user_id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=7026
+   *     See proto/clarifai/api/service.proto;l=7133
    * @return The filterByUserId.
    */
   @java.lang.Deprecated boolean getFilterByUserId();
diff --git a/src/main/java/com/clarifai/grpc/api/ListNodepoolsRequest.java b/src/main/java/com/clarifai/grpc/api/ListNodepoolsRequest.java
new file mode 100644
index 0000000..e0f86ce
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/ListNodepoolsRequest.java
@@ -0,0 +1,915 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * Protobuf type {@code clarifai.api.ListNodepoolsRequest}
+ */
+public final class ListNodepoolsRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.ListNodepoolsRequest)
+    ListNodepoolsRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use ListNodepoolsRequest.newBuilder() to construct.
+  private ListNodepoolsRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private ListNodepoolsRequest() {
+    computeClusterId_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new ListNodepoolsRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private ListNodepoolsRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.UserAppIDSet.Builder subBuilder = null;
+            if (userAppId_ != null) {
+              subBuilder = userAppId_.toBuilder();
+            }
+            userAppId_ = input.readMessage(com.clarifai.grpc.api.UserAppIDSet.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(userAppId_);
+              userAppId_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            computeClusterId_ = s;
+            break;
+          }
+          case 24: {
+
+            page_ = input.readUInt32();
+            break;
+          }
+          case 32: {
+
+            perPage_ = input.readUInt32();
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_ListNodepoolsRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_ListNodepoolsRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.ListNodepoolsRequest.class, com.clarifai.grpc.api.ListNodepoolsRequest.Builder.class);
+  }
+
+  public static final int USER_APP_ID_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  @java.lang.Override
+  public boolean hasUserAppId() {
+    return userAppId_ != null;
+  }
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+    return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+  }
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+    return getUserAppId();
+  }
+
+  public static final int COMPUTE_CLUSTER_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object computeClusterId_;
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  @java.lang.Override
+  public java.lang.String getComputeClusterId() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      computeClusterId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getComputeClusterIdBytes() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      computeClusterId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int PAGE_FIELD_NUMBER = 3;
+  private int page_;
+  /**
+   * <pre>
+   * (optional URL parameter) The page number. Pagination is used to split the results into chunks.
+   * Defaults to 1.
+   * </pre>
+   *
+   * <code>uint32 page = 3;</code>
+   * @return The page.
+   */
+  @java.lang.Override
+  public int getPage() {
+    return page_;
+  }
+
+  public static final int PER_PAGE_FIELD_NUMBER = 4;
+  private int perPage_;
+  /**
+   * <pre>
+   * (optional URL parameter) The number of results that will be contained in each page. Defaults
+   * to 128.
+   * </pre>
+   *
+   * <code>uint32 per_page = 4;</code>
+   * @return The perPage.
+   */
+  @java.lang.Override
+  public int getPerPage() {
+    return perPage_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (userAppId_ != null) {
+      output.writeMessage(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, computeClusterId_);
+    }
+    if (page_ != 0) {
+      output.writeUInt32(3, page_);
+    }
+    if (perPage_ != 0) {
+      output.writeUInt32(4, perPage_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (userAppId_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, computeClusterId_);
+    }
+    if (page_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt32Size(3, page_);
+    }
+    if (perPage_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt32Size(4, perPage_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.ListNodepoolsRequest)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.ListNodepoolsRequest other = (com.clarifai.grpc.api.ListNodepoolsRequest) obj;
+
+    if (hasUserAppId() != other.hasUserAppId()) return false;
+    if (hasUserAppId()) {
+      if (!getUserAppId()
+          .equals(other.getUserAppId())) return false;
+    }
+    if (!getComputeClusterId()
+        .equals(other.getComputeClusterId())) return false;
+    if (getPage()
+        != other.getPage()) return false;
+    if (getPerPage()
+        != other.getPerPage()) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasUserAppId()) {
+      hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getUserAppId().hashCode();
+    }
+    hash = (37 * hash) + COMPUTE_CLUSTER_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getComputeClusterId().hashCode();
+    hash = (37 * hash) + PAGE_FIELD_NUMBER;
+    hash = (53 * hash) + getPage();
+    hash = (37 * hash) + PER_PAGE_FIELD_NUMBER;
+    hash = (53 * hash) + getPerPage();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.ListNodepoolsRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.ListNodepoolsRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code clarifai.api.ListNodepoolsRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.ListNodepoolsRequest)
+      com.clarifai.grpc.api.ListNodepoolsRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_ListNodepoolsRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_ListNodepoolsRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.ListNodepoolsRequest.class, com.clarifai.grpc.api.ListNodepoolsRequest.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.ListNodepoolsRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+      computeClusterId_ = "";
+
+      page_ = 0;
+
+      perPage_ = 0;
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_ListNodepoolsRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.ListNodepoolsRequest getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.ListNodepoolsRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.ListNodepoolsRequest build() {
+      com.clarifai.grpc.api.ListNodepoolsRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.ListNodepoolsRequest buildPartial() {
+      com.clarifai.grpc.api.ListNodepoolsRequest result = new com.clarifai.grpc.api.ListNodepoolsRequest(this);
+      if (userAppIdBuilder_ == null) {
+        result.userAppId_ = userAppId_;
+      } else {
+        result.userAppId_ = userAppIdBuilder_.build();
+      }
+      result.computeClusterId_ = computeClusterId_;
+      result.page_ = page_;
+      result.perPage_ = perPage_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.ListNodepoolsRequest) {
+        return mergeFrom((com.clarifai.grpc.api.ListNodepoolsRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.ListNodepoolsRequest other) {
+      if (other == com.clarifai.grpc.api.ListNodepoolsRequest.getDefaultInstance()) return this;
+      if (other.hasUserAppId()) {
+        mergeUserAppId(other.getUserAppId());
+      }
+      if (!other.getComputeClusterId().isEmpty()) {
+        computeClusterId_ = other.computeClusterId_;
+        onChanged();
+      }
+      if (other.getPage() != 0) {
+        setPage(other.getPage());
+      }
+      if (other.getPerPage() != 0) {
+        setPerPage(other.getPerPage());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.ListNodepoolsRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.ListNodepoolsRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> userAppIdBuilder_;
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return Whether the userAppId field is set.
+     */
+    public boolean hasUserAppId() {
+      return userAppIdBuilder_ != null || userAppId_ != null;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return The userAppId.
+     */
+    public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      } else {
+        return userAppIdBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        userAppId_ = value;
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(
+        com.clarifai.grpc.api.UserAppIDSet.Builder builderForValue) {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = builderForValue.build();
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder mergeUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (userAppId_ != null) {
+          userAppId_ =
+            com.clarifai.grpc.api.UserAppIDSet.newBuilder(userAppId_).mergeFrom(value).buildPartial();
+        } else {
+          userAppId_ = value;
+        }
+        onChanged();
+      } else {
+        userAppIdBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder clearUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+        onChanged();
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSet.Builder getUserAppIdBuilder() {
+      
+      onChanged();
+      return getUserAppIdFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+      if (userAppIdBuilder_ != null) {
+        return userAppIdBuilder_.getMessageOrBuilder();
+      } else {
+        return userAppId_ == null ?
+            com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> 
+        getUserAppIdFieldBuilder() {
+      if (userAppIdBuilder_ == null) {
+        userAppIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder>(
+                getUserAppId(),
+                getParentForChildren(),
+                isClean());
+        userAppId_ = null;
+      }
+      return userAppIdBuilder_;
+    }
+
+    private java.lang.Object computeClusterId_ = "";
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The computeClusterId.
+     */
+    public java.lang.String getComputeClusterId() {
+      java.lang.Object ref = computeClusterId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        computeClusterId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The bytes for computeClusterId.
+     */
+    public com.google.protobuf.ByteString
+        getComputeClusterIdBytes() {
+      java.lang.Object ref = computeClusterId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        computeClusterId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearComputeClusterId() {
+      
+      computeClusterId_ = getDefaultInstance().getComputeClusterId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The bytes for computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private int page_ ;
+    /**
+     * <pre>
+     * (optional URL parameter) The page number. Pagination is used to split the results into chunks.
+     * Defaults to 1.
+     * </pre>
+     *
+     * <code>uint32 page = 3;</code>
+     * @return The page.
+     */
+    @java.lang.Override
+    public int getPage() {
+      return page_;
+    }
+    /**
+     * <pre>
+     * (optional URL parameter) The page number. Pagination is used to split the results into chunks.
+     * Defaults to 1.
+     * </pre>
+     *
+     * <code>uint32 page = 3;</code>
+     * @param value The page to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPage(int value) {
+      
+      page_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * (optional URL parameter) The page number. Pagination is used to split the results into chunks.
+     * Defaults to 1.
+     * </pre>
+     *
+     * <code>uint32 page = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearPage() {
+      
+      page_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private int perPage_ ;
+    /**
+     * <pre>
+     * (optional URL parameter) The number of results that will be contained in each page. Defaults
+     * to 128.
+     * </pre>
+     *
+     * <code>uint32 per_page = 4;</code>
+     * @return The perPage.
+     */
+    @java.lang.Override
+    public int getPerPage() {
+      return perPage_;
+    }
+    /**
+     * <pre>
+     * (optional URL parameter) The number of results that will be contained in each page. Defaults
+     * to 128.
+     * </pre>
+     *
+     * <code>uint32 per_page = 4;</code>
+     * @param value The perPage to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPerPage(int value) {
+      
+      perPage_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * (optional URL parameter) The number of results that will be contained in each page. Defaults
+     * to 128.
+     * </pre>
+     *
+     * <code>uint32 per_page = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearPerPage() {
+      
+      perPage_ = 0;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.ListNodepoolsRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.ListNodepoolsRequest)
+  private static final com.clarifai.grpc.api.ListNodepoolsRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.ListNodepoolsRequest();
+  }
+
+  public static com.clarifai.grpc.api.ListNodepoolsRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<ListNodepoolsRequest>
+      PARSER = new com.google.protobuf.AbstractParser<ListNodepoolsRequest>() {
+    @java.lang.Override
+    public ListNodepoolsRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new ListNodepoolsRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<ListNodepoolsRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<ListNodepoolsRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.ListNodepoolsRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/ListNodepoolsRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ListNodepoolsRequestOrBuilder.java
new file mode 100644
index 0000000..bd7eff7
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/ListNodepoolsRequestOrBuilder.java
@@ -0,0 +1,58 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface ListNodepoolsRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.ListNodepoolsRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  boolean hasUserAppId();
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  com.clarifai.grpc.api.UserAppIDSet getUserAppId();
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
+
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  java.lang.String getComputeClusterId();
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  com.google.protobuf.ByteString
+      getComputeClusterIdBytes();
+
+  /**
+   * <pre>
+   * (optional URL parameter) The page number. Pagination is used to split the results into chunks.
+   * Defaults to 1.
+   * </pre>
+   *
+   * <code>uint32 page = 3;</code>
+   * @return The page.
+   */
+  int getPage();
+
+  /**
+   * <pre>
+   * (optional URL parameter) The number of results that will be contained in each page. Defaults
+   * to 128.
+   * </pre>
+   *
+   * <code>uint32 per_page = 4;</code>
+   * @return The perPage.
+   */
+  int getPerPage();
+}
diff --git a/src/main/java/com/clarifai/grpc/api/ListRunnerItemsRequest.java b/src/main/java/com/clarifai/grpc/api/ListRunnerItemsRequest.java
index 7d8d910..42ab5fa 100644
--- a/src/main/java/com/clarifai/grpc/api/ListRunnerItemsRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/ListRunnerItemsRequest.java
@@ -16,6 +16,7 @@ private ListRunnerItemsRequest(com.google.protobuf.GeneratedMessageV3.Builder<?>
     super(builder);
   }
   private ListRunnerItemsRequest() {
+    nodepoolId_ = "";
     runnerId_ = "";
   }
 
@@ -65,6 +66,12 @@ private ListRunnerItemsRequest(
           case 18: {
             java.lang.String s = input.readStringRequireUtf8();
 
+            nodepoolId_ = s;
+            break;
+          }
+          case 26: {
+            java.lang.String s = input.readStringRequireUtf8();
+
             runnerId_ = s;
             break;
           }
@@ -128,10 +135,48 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
     return getUserAppId();
   }
 
-  public static final int RUNNER_ID_FIELD_NUMBER = 2;
+  public static final int NODEPOOL_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object nodepoolId_;
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  @java.lang.Override
+  public java.lang.String getNodepoolId() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      nodepoolId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getNodepoolIdBytes() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      nodepoolId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int RUNNER_ID_FIELD_NUMBER = 3;
   private volatile java.lang.Object runnerId_;
   /**
-   * <code>string runner_id = 2;</code>
+   * <code>string runner_id = 3;</code>
    * @return The runnerId.
    */
   @java.lang.Override
@@ -148,7 +193,7 @@ public java.lang.String getRunnerId() {
     }
   }
   /**
-   * <code>string runner_id = 2;</code>
+   * <code>string runner_id = 3;</code>
    * @return The bytes for runnerId.
    */
   @java.lang.Override
@@ -183,8 +228,11 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (userAppId_ != null) {
       output.writeMessage(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, nodepoolId_);
+    }
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(runnerId_)) {
-      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, runnerId_);
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, runnerId_);
     }
     unknownFields.writeTo(output);
   }
@@ -199,8 +247,11 @@ public int getSerializedSize() {
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, nodepoolId_);
+    }
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(runnerId_)) {
-      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, runnerId_);
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, runnerId_);
     }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
@@ -222,6 +273,8 @@ public boolean equals(final java.lang.Object obj) {
       if (!getUserAppId()
           .equals(other.getUserAppId())) return false;
     }
+    if (!getNodepoolId()
+        .equals(other.getNodepoolId())) return false;
     if (!getRunnerId()
         .equals(other.getRunnerId())) return false;
     if (!unknownFields.equals(other.unknownFields)) return false;
@@ -239,6 +292,8 @@ public int hashCode() {
       hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
       hash = (53 * hash) + getUserAppId().hashCode();
     }
+    hash = (37 * hash) + NODEPOOL_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getNodepoolId().hashCode();
     hash = (37 * hash) + RUNNER_ID_FIELD_NUMBER;
     hash = (53 * hash) + getRunnerId().hashCode();
     hash = (29 * hash) + unknownFields.hashCode();
@@ -380,6 +435,8 @@ public Builder clear() {
         userAppId_ = null;
         userAppIdBuilder_ = null;
       }
+      nodepoolId_ = "";
+
       runnerId_ = "";
 
       return this;
@@ -413,6 +470,7 @@ public com.clarifai.grpc.api.ListRunnerItemsRequest buildPartial() {
       } else {
         result.userAppId_ = userAppIdBuilder_.build();
       }
+      result.nodepoolId_ = nodepoolId_;
       result.runnerId_ = runnerId_;
       onBuilt();
       return result;
@@ -465,6 +523,10 @@ public Builder mergeFrom(com.clarifai.grpc.api.ListRunnerItemsRequest other) {
       if (other.hasUserAppId()) {
         mergeUserAppId(other.getUserAppId());
       }
+      if (!other.getNodepoolId().isEmpty()) {
+        nodepoolId_ = other.nodepoolId_;
+        onChanged();
+      }
       if (!other.getRunnerId().isEmpty()) {
         runnerId_ = other.runnerId_;
         onChanged();
@@ -617,9 +679,85 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
       return userAppIdBuilder_;
     }
 
+    private java.lang.Object nodepoolId_ = "";
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return The nodepoolId.
+     */
+    public java.lang.String getNodepoolId() {
+      java.lang.Object ref = nodepoolId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        nodepoolId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return The bytes for nodepoolId.
+     */
+    public com.google.protobuf.ByteString
+        getNodepoolIdBytes() {
+      java.lang.Object ref = nodepoolId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        nodepoolId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @param value The nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearNodepoolId() {
+      
+      nodepoolId_ = getDefaultInstance().getNodepoolId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @param value The bytes for nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+
     private java.lang.Object runnerId_ = "";
     /**
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @return The runnerId.
      */
     public java.lang.String getRunnerId() {
@@ -635,7 +773,7 @@ public java.lang.String getRunnerId() {
       }
     }
     /**
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @return The bytes for runnerId.
      */
     public com.google.protobuf.ByteString
@@ -652,7 +790,7 @@ public java.lang.String getRunnerId() {
       }
     }
     /**
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @param value The runnerId to set.
      * @return This builder for chaining.
      */
@@ -667,7 +805,7 @@ public Builder setRunnerId(
       return this;
     }
     /**
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @return This builder for chaining.
      */
     public Builder clearRunnerId() {
@@ -677,7 +815,7 @@ public Builder clearRunnerId() {
       return this;
     }
     /**
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @param value The bytes for runnerId to set.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/ListRunnerItemsRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ListRunnerItemsRequestOrBuilder.java
index 3c02e0d..ff7ce2b 100644
--- a/src/main/java/com/clarifai/grpc/api/ListRunnerItemsRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/ListRunnerItemsRequestOrBuilder.java
@@ -23,12 +23,24 @@ public interface ListRunnerItemsRequestOrBuilder extends
   com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
 
   /**
-   * <code>string runner_id = 2;</code>
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  java.lang.String getNodepoolId();
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  com.google.protobuf.ByteString
+      getNodepoolIdBytes();
+
+  /**
+   * <code>string runner_id = 3;</code>
    * @return The runnerId.
    */
   java.lang.String getRunnerId();
   /**
-   * <code>string runner_id = 2;</code>
+   * <code>string runner_id = 3;</code>
    * @return The bytes for runnerId.
    */
   com.google.protobuf.ByteString
diff --git a/src/main/java/com/clarifai/grpc/api/ListRunnersRequest.java b/src/main/java/com/clarifai/grpc/api/ListRunnersRequest.java
index a44c467..abaff0c 100644
--- a/src/main/java/com/clarifai/grpc/api/ListRunnersRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/ListRunnersRequest.java
@@ -20,6 +20,7 @@ private ListRunnersRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> bui
     super(builder);
   }
   private ListRunnersRequest() {
+    nodepoolId_ = "";
   }
 
   @java.lang.Override
@@ -65,13 +66,19 @@ private ListRunnersRequest(
 
             break;
           }
-          case 16: {
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
 
-            page_ = input.readUInt32();
+            nodepoolId_ = s;
             break;
           }
           case 24: {
 
+            page_ = input.readUInt32();
+            break;
+          }
+          case 32: {
+
             perPage_ = input.readUInt32();
             break;
           }
@@ -135,7 +142,45 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
     return getUserAppId();
   }
 
-  public static final int PAGE_FIELD_NUMBER = 2;
+  public static final int NODEPOOL_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object nodepoolId_;
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  @java.lang.Override
+  public java.lang.String getNodepoolId() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      nodepoolId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getNodepoolIdBytes() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      nodepoolId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int PAGE_FIELD_NUMBER = 3;
   private int page_;
   /**
    * <pre>
@@ -143,7 +188,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
    * Defaults to 1.
    * </pre>
    *
-   * <code>uint32 page = 2;</code>
+   * <code>uint32 page = 3;</code>
    * @return The page.
    */
   @java.lang.Override
@@ -151,7 +196,7 @@ public int getPage() {
     return page_;
   }
 
-  public static final int PER_PAGE_FIELD_NUMBER = 3;
+  public static final int PER_PAGE_FIELD_NUMBER = 4;
   private int perPage_;
   /**
    * <pre>
@@ -159,7 +204,7 @@ public int getPage() {
    * to 128.
    * </pre>
    *
-   * <code>uint32 per_page = 3;</code>
+   * <code>uint32 per_page = 4;</code>
    * @return The perPage.
    */
   @java.lang.Override
@@ -184,11 +229,14 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (userAppId_ != null) {
       output.writeMessage(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, nodepoolId_);
+    }
     if (page_ != 0) {
-      output.writeUInt32(2, page_);
+      output.writeUInt32(3, page_);
     }
     if (perPage_ != 0) {
-      output.writeUInt32(3, perPage_);
+      output.writeUInt32(4, perPage_);
     }
     unknownFields.writeTo(output);
   }
@@ -203,13 +251,16 @@ public int getSerializedSize() {
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, nodepoolId_);
+    }
     if (page_ != 0) {
       size += com.google.protobuf.CodedOutputStream
-        .computeUInt32Size(2, page_);
+        .computeUInt32Size(3, page_);
     }
     if (perPage_ != 0) {
       size += com.google.protobuf.CodedOutputStream
-        .computeUInt32Size(3, perPage_);
+        .computeUInt32Size(4, perPage_);
     }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
@@ -231,6 +282,8 @@ public boolean equals(final java.lang.Object obj) {
       if (!getUserAppId()
           .equals(other.getUserAppId())) return false;
     }
+    if (!getNodepoolId()
+        .equals(other.getNodepoolId())) return false;
     if (getPage()
         != other.getPage()) return false;
     if (getPerPage()
@@ -250,6 +303,8 @@ public int hashCode() {
       hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
       hash = (53 * hash) + getUserAppId().hashCode();
     }
+    hash = (37 * hash) + NODEPOOL_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getNodepoolId().hashCode();
     hash = (37 * hash) + PAGE_FIELD_NUMBER;
     hash = (53 * hash) + getPage();
     hash = (37 * hash) + PER_PAGE_FIELD_NUMBER;
@@ -397,6 +452,8 @@ public Builder clear() {
         userAppId_ = null;
         userAppIdBuilder_ = null;
       }
+      nodepoolId_ = "";
+
       page_ = 0;
 
       perPage_ = 0;
@@ -432,6 +489,7 @@ public com.clarifai.grpc.api.ListRunnersRequest buildPartial() {
       } else {
         result.userAppId_ = userAppIdBuilder_.build();
       }
+      result.nodepoolId_ = nodepoolId_;
       result.page_ = page_;
       result.perPage_ = perPage_;
       onBuilt();
@@ -485,6 +543,10 @@ public Builder mergeFrom(com.clarifai.grpc.api.ListRunnersRequest other) {
       if (other.hasUserAppId()) {
         mergeUserAppId(other.getUserAppId());
       }
+      if (!other.getNodepoolId().isEmpty()) {
+        nodepoolId_ = other.nodepoolId_;
+        onChanged();
+      }
       if (other.getPage() != 0) {
         setPage(other.getPage());
       }
@@ -639,6 +701,82 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
       return userAppIdBuilder_;
     }
 
+    private java.lang.Object nodepoolId_ = "";
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return The nodepoolId.
+     */
+    public java.lang.String getNodepoolId() {
+      java.lang.Object ref = nodepoolId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        nodepoolId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return The bytes for nodepoolId.
+     */
+    public com.google.protobuf.ByteString
+        getNodepoolIdBytes() {
+      java.lang.Object ref = nodepoolId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        nodepoolId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @param value The nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearNodepoolId() {
+      
+      nodepoolId_ = getDefaultInstance().getNodepoolId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @param value The bytes for nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+
     private int page_ ;
     /**
      * <pre>
@@ -646,7 +784,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
      * Defaults to 1.
      * </pre>
      *
-     * <code>uint32 page = 2;</code>
+     * <code>uint32 page = 3;</code>
      * @return The page.
      */
     @java.lang.Override
@@ -659,7 +797,7 @@ public int getPage() {
      * Defaults to 1.
      * </pre>
      *
-     * <code>uint32 page = 2;</code>
+     * <code>uint32 page = 3;</code>
      * @param value The page to set.
      * @return This builder for chaining.
      */
@@ -675,7 +813,7 @@ public Builder setPage(int value) {
      * Defaults to 1.
      * </pre>
      *
-     * <code>uint32 page = 2;</code>
+     * <code>uint32 page = 3;</code>
      * @return This builder for chaining.
      */
     public Builder clearPage() {
@@ -692,7 +830,7 @@ public Builder clearPage() {
      * to 128.
      * </pre>
      *
-     * <code>uint32 per_page = 3;</code>
+     * <code>uint32 per_page = 4;</code>
      * @return The perPage.
      */
     @java.lang.Override
@@ -705,7 +843,7 @@ public int getPerPage() {
      * to 128.
      * </pre>
      *
-     * <code>uint32 per_page = 3;</code>
+     * <code>uint32 per_page = 4;</code>
      * @param value The perPage to set.
      * @return This builder for chaining.
      */
@@ -721,7 +859,7 @@ public Builder setPerPage(int value) {
      * to 128.
      * </pre>
      *
-     * <code>uint32 per_page = 3;</code>
+     * <code>uint32 per_page = 4;</code>
      * @return This builder for chaining.
      */
     public Builder clearPerPage() {
diff --git a/src/main/java/com/clarifai/grpc/api/ListRunnersRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ListRunnersRequestOrBuilder.java
index fe0ad4a..14fbef6 100644
--- a/src/main/java/com/clarifai/grpc/api/ListRunnersRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/ListRunnersRequestOrBuilder.java
@@ -22,13 +22,25 @@ public interface ListRunnersRequestOrBuilder extends
    */
   com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
 
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  java.lang.String getNodepoolId();
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  com.google.protobuf.ByteString
+      getNodepoolIdBytes();
+
   /**
    * <pre>
    * (optional URL parameter) The page number. Pagination is used to split the results into chunks.
    * Defaults to 1.
    * </pre>
    *
-   * <code>uint32 page = 2;</code>
+   * <code>uint32 page = 3;</code>
    * @return The page.
    */
   int getPage();
@@ -39,7 +51,7 @@ public interface ListRunnersRequestOrBuilder extends
    * to 128.
    * </pre>
    *
-   * <code>uint32 per_page = 3;</code>
+   * <code>uint32 per_page = 4;</code>
    * @return The perPage.
    */
   int getPerPage();
diff --git a/src/main/java/com/clarifai/grpc/api/ListTasksRequest.java b/src/main/java/com/clarifai/grpc/api/ListTasksRequest.java
index 6740f1d..147507b 100644
--- a/src/main/java/com/clarifai/grpc/api/ListTasksRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/ListTasksRequest.java
@@ -418,6 +418,8 @@ public boolean getIncludingLabelOrderTasks() {
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 7;</code>
@@ -436,6 +438,8 @@ public boolean getIncludingLabelOrderTasks() {
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 7;</code>
@@ -453,6 +457,8 @@ public int getAdditionalFieldsCount() {
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 7;</code>
@@ -471,6 +477,8 @@ public java.lang.String getAdditionalFields(int index) {
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 7;</code>
@@ -1787,6 +1795,8 @@ private void ensureAdditionalFieldsIsMutable() {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 7;</code>
@@ -1805,6 +1815,8 @@ private void ensureAdditionalFieldsIsMutable() {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 7;</code>
@@ -1822,6 +1834,8 @@ public int getAdditionalFieldsCount() {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 7;</code>
@@ -1840,6 +1854,8 @@ public java.lang.String getAdditionalFields(int index) {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 7;</code>
@@ -1859,6 +1875,8 @@ public java.lang.String getAdditionalFields(int index) {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 7;</code>
@@ -1885,6 +1903,8 @@ public Builder setAdditionalFields(
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 7;</code>
@@ -1910,6 +1930,8 @@ public Builder addAdditionalFields(
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 7;</code>
@@ -1933,6 +1955,8 @@ public Builder addAllAdditionalFields(
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 7;</code>
@@ -1953,6 +1977,8 @@ public Builder clearAdditionalFields() {
      * - review.users
      * - metrics.work.inputs_count_estimated
      * - metrics.work.inputs_percent_estimated
+     * - metrics.review.inputs_count_estimated
+     * - metrics.review.inputs_percent_estimated
      * </pre>
      *
      * <code>repeated string additional_fields = 7;</code>
diff --git a/src/main/java/com/clarifai/grpc/api/ListTasksRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ListTasksRequestOrBuilder.java
index 1c994b0..8fd6100 100644
--- a/src/main/java/com/clarifai/grpc/api/ListTasksRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/ListTasksRequestOrBuilder.java
@@ -187,6 +187,8 @@ public interface ListTasksRequestOrBuilder extends
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 7;</code>
@@ -203,6 +205,8 @@ public interface ListTasksRequestOrBuilder extends
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 7;</code>
@@ -218,6 +222,8 @@ public interface ListTasksRequestOrBuilder extends
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 7;</code>
@@ -234,6 +240,8 @@ public interface ListTasksRequestOrBuilder extends
    * - review.users
    * - metrics.work.inputs_count_estimated
    * - metrics.work.inputs_percent_estimated
+   * - metrics.review.inputs_count_estimated
+   * - metrics.review.inputs_percent_estimated
    * </pre>
    *
    * <code>repeated string additional_fields = 7;</code>
diff --git a/src/main/java/com/clarifai/grpc/api/ListWorkflowsRequest.java b/src/main/java/com/clarifai/grpc/api/ListWorkflowsRequest.java
index 423cc24..7d875a9 100644
--- a/src/main/java/com/clarifai/grpc/api/ListWorkflowsRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/ListWorkflowsRequest.java
@@ -601,7 +601,7 @@ public java.lang.String getSearch() {
    *
    * <code>string query = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6384
+   *     See proto/clarifai/api/service.proto;l=6491
    * @return The query.
    */
   @java.lang.Override
@@ -625,7 +625,7 @@ public java.lang.String getSearch() {
    *
    * <code>string query = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6384
+   *     See proto/clarifai/api/service.proto;l=6491
    * @return The bytes for query.
    */
   @java.lang.Override
@@ -653,7 +653,7 @@ public java.lang.String getSearch() {
    *
    * <code>string id = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6387
+   *     See proto/clarifai/api/service.proto;l=6494
    * @return The id.
    */
   @java.lang.Override
@@ -677,7 +677,7 @@ public java.lang.String getSearch() {
    *
    * <code>string id = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6387
+   *     See proto/clarifai/api/service.proto;l=6494
    * @return The bytes for id.
    */
   @java.lang.Override
@@ -705,7 +705,7 @@ public java.lang.String getSearch() {
    *
    * <code>string search_term = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.search_term is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6390
+   *     See proto/clarifai/api/service.proto;l=6497
    * @return The searchTerm.
    */
   @java.lang.Override
@@ -729,7 +729,7 @@ public java.lang.String getSearch() {
    *
    * <code>string search_term = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.search_term is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6390
+   *     See proto/clarifai/api/service.proto;l=6497
    * @return The bytes for searchTerm.
    */
   @java.lang.Override
@@ -2330,7 +2330,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6384
+     *     See proto/clarifai/api/service.proto;l=6491
      * @return The query.
      */
     @java.lang.Deprecated public java.lang.String getQuery() {
@@ -2353,7 +2353,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6384
+     *     See proto/clarifai/api/service.proto;l=6491
      * @return The bytes for query.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -2377,7 +2377,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6384
+     *     See proto/clarifai/api/service.proto;l=6491
      * @param value The query to set.
      * @return This builder for chaining.
      */
@@ -2399,7 +2399,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6384
+     *     See proto/clarifai/api/service.proto;l=6491
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearQuery() {
@@ -2416,7 +2416,7 @@ public Builder setSearchBytes(
      *
      * <code>string query = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6384
+     *     See proto/clarifai/api/service.proto;l=6491
      * @param value The bytes for query to set.
      * @return This builder for chaining.
      */
@@ -2441,7 +2441,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6387
+     *     See proto/clarifai/api/service.proto;l=6494
      * @return The id.
      */
     @java.lang.Deprecated public java.lang.String getId() {
@@ -2464,7 +2464,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6387
+     *     See proto/clarifai/api/service.proto;l=6494
      * @return The bytes for id.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -2488,7 +2488,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6387
+     *     See proto/clarifai/api/service.proto;l=6494
      * @param value The id to set.
      * @return This builder for chaining.
      */
@@ -2510,7 +2510,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6387
+     *     See proto/clarifai/api/service.proto;l=6494
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearId() {
@@ -2527,7 +2527,7 @@ public Builder setSearchBytes(
      *
      * <code>string id = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.id is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6387
+     *     See proto/clarifai/api/service.proto;l=6494
      * @param value The bytes for id to set.
      * @return This builder for chaining.
      */
@@ -2552,7 +2552,7 @@ public Builder setSearchBytes(
      *
      * <code>string search_term = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.search_term is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6390
+     *     See proto/clarifai/api/service.proto;l=6497
      * @return The searchTerm.
      */
     @java.lang.Deprecated public java.lang.String getSearchTerm() {
@@ -2575,7 +2575,7 @@ public Builder setSearchBytes(
      *
      * <code>string search_term = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.search_term is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6390
+     *     See proto/clarifai/api/service.proto;l=6497
      * @return The bytes for searchTerm.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -2599,7 +2599,7 @@ public Builder setSearchBytes(
      *
      * <code>string search_term = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.search_term is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6390
+     *     See proto/clarifai/api/service.proto;l=6497
      * @param value The searchTerm to set.
      * @return This builder for chaining.
      */
@@ -2621,7 +2621,7 @@ public Builder setSearchBytes(
      *
      * <code>string search_term = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.search_term is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6390
+     *     See proto/clarifai/api/service.proto;l=6497
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearSearchTerm() {
@@ -2638,7 +2638,7 @@ public Builder setSearchBytes(
      *
      * <code>string search_term = 12 [deprecated = true];</code>
      * @deprecated clarifai.api.ListWorkflowsRequest.search_term is deprecated.
-     *     See proto/clarifai/api/service.proto;l=6390
+     *     See proto/clarifai/api/service.proto;l=6497
      * @param value The bytes for searchTerm to set.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/ListWorkflowsRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ListWorkflowsRequestOrBuilder.java
index ef553cb..2ce4ddd 100644
--- a/src/main/java/com/clarifai/grpc/api/ListWorkflowsRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/ListWorkflowsRequestOrBuilder.java
@@ -253,7 +253,7 @@ public interface ListWorkflowsRequestOrBuilder extends
    *
    * <code>string query = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6384
+   *     See proto/clarifai/api/service.proto;l=6491
    * @return The query.
    */
   @java.lang.Deprecated java.lang.String getQuery();
@@ -265,7 +265,7 @@ public interface ListWorkflowsRequestOrBuilder extends
    *
    * <code>string query = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6384
+   *     See proto/clarifai/api/service.proto;l=6491
    * @return The bytes for query.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -279,7 +279,7 @@ public interface ListWorkflowsRequestOrBuilder extends
    *
    * <code>string id = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6387
+   *     See proto/clarifai/api/service.proto;l=6494
    * @return The id.
    */
   @java.lang.Deprecated java.lang.String getId();
@@ -291,7 +291,7 @@ public interface ListWorkflowsRequestOrBuilder extends
    *
    * <code>string id = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.id is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6387
+   *     See proto/clarifai/api/service.proto;l=6494
    * @return The bytes for id.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -305,7 +305,7 @@ public interface ListWorkflowsRequestOrBuilder extends
    *
    * <code>string search_term = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.search_term is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6390
+   *     See proto/clarifai/api/service.proto;l=6497
    * @return The searchTerm.
    */
   @java.lang.Deprecated java.lang.String getSearchTerm();
@@ -317,7 +317,7 @@ public interface ListWorkflowsRequestOrBuilder extends
    *
    * <code>string search_term = 12 [deprecated = true];</code>
    * @deprecated clarifai.api.ListWorkflowsRequest.search_term is deprecated.
-   *     See proto/clarifai/api/service.proto;l=6390
+   *     See proto/clarifai/api/service.proto;l=6497
    * @return The bytes for searchTerm.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
diff --git a/src/main/java/com/clarifai/grpc/api/MetricsSummary.java b/src/main/java/com/clarifai/grpc/api/MetricsSummary.java
index c2af67e..8dd4027 100644
--- a/src/main/java/com/clarifai/grpc/api/MetricsSummary.java
+++ b/src/main/java/com/clarifai/grpc/api/MetricsSummary.java
@@ -155,7 +155,7 @@ private MetricsSummary(
   /**
    * <code>float top1_accuracy = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.MetricsSummary.top1_accuracy is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2050
+   *     See proto/clarifai/api/resources.proto;l=2066
    * @return The top1Accuracy.
    */
   @java.lang.Override
@@ -168,7 +168,7 @@ private MetricsSummary(
   /**
    * <code>float top5_accuracy = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.MetricsSummary.top5_accuracy is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2051
+   *     See proto/clarifai/api/resources.proto;l=2067
    * @return The top5Accuracy.
    */
   @java.lang.Override
@@ -844,7 +844,7 @@ public Builder mergeFrom(
     /**
      * <code>float top1_accuracy = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.MetricsSummary.top1_accuracy is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2050
+     *     See proto/clarifai/api/resources.proto;l=2066
      * @return The top1Accuracy.
      */
     @java.lang.Override
@@ -854,7 +854,7 @@ public Builder mergeFrom(
     /**
      * <code>float top1_accuracy = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.MetricsSummary.top1_accuracy is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2050
+     *     See proto/clarifai/api/resources.proto;l=2066
      * @param value The top1Accuracy to set.
      * @return This builder for chaining.
      */
@@ -867,7 +867,7 @@ public Builder mergeFrom(
     /**
      * <code>float top1_accuracy = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.MetricsSummary.top1_accuracy is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2050
+     *     See proto/clarifai/api/resources.proto;l=2066
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearTop1Accuracy() {
@@ -881,7 +881,7 @@ public Builder mergeFrom(
     /**
      * <code>float top5_accuracy = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.MetricsSummary.top5_accuracy is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2051
+     *     See proto/clarifai/api/resources.proto;l=2067
      * @return The top5Accuracy.
      */
     @java.lang.Override
@@ -891,7 +891,7 @@ public Builder mergeFrom(
     /**
      * <code>float top5_accuracy = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.MetricsSummary.top5_accuracy is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2051
+     *     See proto/clarifai/api/resources.proto;l=2067
      * @param value The top5Accuracy to set.
      * @return This builder for chaining.
      */
@@ -904,7 +904,7 @@ public Builder mergeFrom(
     /**
      * <code>float top5_accuracy = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.MetricsSummary.top5_accuracy is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2051
+     *     See proto/clarifai/api/resources.proto;l=2067
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearTop5Accuracy() {
diff --git a/src/main/java/com/clarifai/grpc/api/MetricsSummaryOrBuilder.java b/src/main/java/com/clarifai/grpc/api/MetricsSummaryOrBuilder.java
index bc1b117..d6f23fd 100644
--- a/src/main/java/com/clarifai/grpc/api/MetricsSummaryOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/MetricsSummaryOrBuilder.java
@@ -10,7 +10,7 @@ public interface MetricsSummaryOrBuilder extends
   /**
    * <code>float top1_accuracy = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.MetricsSummary.top1_accuracy is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2050
+   *     See proto/clarifai/api/resources.proto;l=2066
    * @return The top1Accuracy.
    */
   @java.lang.Deprecated float getTop1Accuracy();
@@ -18,7 +18,7 @@ public interface MetricsSummaryOrBuilder extends
   /**
    * <code>float top5_accuracy = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.MetricsSummary.top5_accuracy is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2051
+   *     See proto/clarifai/api/resources.proto;l=2067
    * @return The top5Accuracy.
    */
   @java.lang.Deprecated float getTop5Accuracy();
diff --git a/src/main/java/com/clarifai/grpc/api/Model.java b/src/main/java/com/clarifai/grpc/api/Model.java
index 718c61b..68a24df 100644
--- a/src/main/java/com/clarifai/grpc/api/Model.java
+++ b/src/main/java/com/clarifai/grpc/api/Model.java
@@ -433,7 +433,7 @@ public java.lang.String getId() {
    *
    * <code>string name = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1320
+   *     See proto/clarifai/api/resources.proto;l=1336
    * @return The name.
    */
   @java.lang.Override
@@ -456,7 +456,7 @@ public java.lang.String getId() {
    *
    * <code>string name = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1320
+   *     See proto/clarifai/api/resources.proto;l=1336
    * @return The bytes for name.
    */
   @java.lang.Override
@@ -618,7 +618,7 @@ public java.lang.String getAppId() {
    *
    * <code>.clarifai.api.OutputInfo output_info = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.output_info is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1333
+   *     See proto/clarifai/api/resources.proto;l=1349
    * @return Whether the outputInfo field is set.
    */
   @java.lang.Override
@@ -633,7 +633,7 @@ public java.lang.String getAppId() {
    *
    * <code>.clarifai.api.OutputInfo output_info = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.output_info is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1333
+   *     See proto/clarifai/api/resources.proto;l=1349
    * @return The outputInfo.
    */
   @java.lang.Override
@@ -703,7 +703,7 @@ public com.clarifai.grpc.api.ModelVersionOrBuilder getModelVersionOrBuilder() {
    *
    * <code>string display_name = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.display_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1338
+   *     See proto/clarifai/api/resources.proto;l=1354
    * @return The displayName.
    */
   @java.lang.Override
@@ -726,7 +726,7 @@ public com.clarifai.grpc.api.ModelVersionOrBuilder getModelVersionOrBuilder() {
    *
    * <code>string display_name = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.display_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1338
+   *     See proto/clarifai/api/resources.proto;l=1354
    * @return The bytes for displayName.
    */
   @java.lang.Override
@@ -2638,7 +2638,7 @@ public Builder setIdBytes(
      *
      * <code>string name = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1320
+     *     See proto/clarifai/api/resources.proto;l=1336
      * @return The name.
      */
     @java.lang.Deprecated public java.lang.String getName() {
@@ -2660,7 +2660,7 @@ public Builder setIdBytes(
      *
      * <code>string name = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1320
+     *     See proto/clarifai/api/resources.proto;l=1336
      * @return The bytes for name.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -2683,7 +2683,7 @@ public Builder setIdBytes(
      *
      * <code>string name = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1320
+     *     See proto/clarifai/api/resources.proto;l=1336
      * @param value The name to set.
      * @return This builder for chaining.
      */
@@ -2704,7 +2704,7 @@ public Builder setIdBytes(
      *
      * <code>string name = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1320
+     *     See proto/clarifai/api/resources.proto;l=1336
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearName() {
@@ -2720,7 +2720,7 @@ public Builder setIdBytes(
      *
      * <code>string name = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1320
+     *     See proto/clarifai/api/resources.proto;l=1336
      * @param value The bytes for name to set.
      * @return This builder for chaining.
      */
@@ -3189,7 +3189,7 @@ public Builder setAppIdBytes(
      *
      * <code>.clarifai.api.OutputInfo output_info = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.output_info is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1333
+     *     See proto/clarifai/api/resources.proto;l=1349
      * @return Whether the outputInfo field is set.
      */
     @java.lang.Deprecated public boolean hasOutputInfo() {
@@ -3203,7 +3203,7 @@ public Builder setAppIdBytes(
      *
      * <code>.clarifai.api.OutputInfo output_info = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.output_info is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1333
+     *     See proto/clarifai/api/resources.proto;l=1349
      * @return The outputInfo.
      */
     @java.lang.Deprecated public com.clarifai.grpc.api.OutputInfo getOutputInfo() {
@@ -3518,7 +3518,7 @@ public com.clarifai.grpc.api.ModelVersionOrBuilder getModelVersionOrBuilder() {
      *
      * <code>string display_name = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.display_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1338
+     *     See proto/clarifai/api/resources.proto;l=1354
      * @return The displayName.
      */
     @java.lang.Deprecated public java.lang.String getDisplayName() {
@@ -3540,7 +3540,7 @@ public com.clarifai.grpc.api.ModelVersionOrBuilder getModelVersionOrBuilder() {
      *
      * <code>string display_name = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.display_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1338
+     *     See proto/clarifai/api/resources.proto;l=1354
      * @return The bytes for displayName.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -3563,7 +3563,7 @@ public com.clarifai.grpc.api.ModelVersionOrBuilder getModelVersionOrBuilder() {
      *
      * <code>string display_name = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.display_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1338
+     *     See proto/clarifai/api/resources.proto;l=1354
      * @param value The displayName to set.
      * @return This builder for chaining.
      */
@@ -3584,7 +3584,7 @@ public com.clarifai.grpc.api.ModelVersionOrBuilder getModelVersionOrBuilder() {
      *
      * <code>string display_name = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.display_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1338
+     *     See proto/clarifai/api/resources.proto;l=1354
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearDisplayName() {
@@ -3600,7 +3600,7 @@ public com.clarifai.grpc.api.ModelVersionOrBuilder getModelVersionOrBuilder() {
      *
      * <code>string display_name = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Model.display_name is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1338
+     *     See proto/clarifai/api/resources.proto;l=1354
      * @param value The bytes for displayName to set.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/ModelOrBuilder.java b/src/main/java/com/clarifai/grpc/api/ModelOrBuilder.java
index d137b56..a22a7fc 100644
--- a/src/main/java/com/clarifai/grpc/api/ModelOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/ModelOrBuilder.java
@@ -34,7 +34,7 @@ public interface ModelOrBuilder extends
    *
    * <code>string name = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1320
+   *     See proto/clarifai/api/resources.proto;l=1336
    * @return The name.
    */
   @java.lang.Deprecated java.lang.String getName();
@@ -45,7 +45,7 @@ public interface ModelOrBuilder extends
    *
    * <code>string name = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1320
+   *     See proto/clarifai/api/resources.proto;l=1336
    * @return The bytes for name.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -145,7 +145,7 @@ public interface ModelOrBuilder extends
    *
    * <code>.clarifai.api.OutputInfo output_info = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.output_info is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1333
+   *     See proto/clarifai/api/resources.proto;l=1349
    * @return Whether the outputInfo field is set.
    */
   @java.lang.Deprecated boolean hasOutputInfo();
@@ -157,7 +157,7 @@ public interface ModelOrBuilder extends
    *
    * <code>.clarifai.api.OutputInfo output_info = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.output_info is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1333
+   *     See proto/clarifai/api/resources.proto;l=1349
    * @return The outputInfo.
    */
   @java.lang.Deprecated com.clarifai.grpc.api.OutputInfo getOutputInfo();
@@ -208,7 +208,7 @@ public interface ModelOrBuilder extends
    *
    * <code>string display_name = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.display_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1338
+   *     See proto/clarifai/api/resources.proto;l=1354
    * @return The displayName.
    */
   @java.lang.Deprecated java.lang.String getDisplayName();
@@ -219,7 +219,7 @@ public interface ModelOrBuilder extends
    *
    * <code>string display_name = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Model.display_name is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1338
+   *     See proto/clarifai/api/resources.proto;l=1354
    * @return The bytes for displayName.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
diff --git a/src/main/java/com/clarifai/grpc/api/MultiComputeClusterResponse.java b/src/main/java/com/clarifai/grpc/api/MultiComputeClusterResponse.java
new file mode 100644
index 0000000..2c5a77a
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/MultiComputeClusterResponse.java
@@ -0,0 +1,960 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * Protobuf type {@code clarifai.api.MultiComputeClusterResponse}
+ */
+public final class MultiComputeClusterResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.MultiComputeClusterResponse)
+    MultiComputeClusterResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use MultiComputeClusterResponse.newBuilder() to construct.
+  private MultiComputeClusterResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private MultiComputeClusterResponse() {
+    computeClusters_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new MultiComputeClusterResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private MultiComputeClusterResponse(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.status.Status.Builder subBuilder = null;
+            if (status_ != null) {
+              subBuilder = status_.toBuilder();
+            }
+            status_ = input.readMessage(com.clarifai.grpc.api.status.Status.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(status_);
+              status_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              computeClusters_ = new java.util.ArrayList<com.clarifai.grpc.api.ComputeCluster>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            computeClusters_.add(
+                input.readMessage(com.clarifai.grpc.api.ComputeCluster.parser(), extensionRegistry));
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        computeClusters_ = java.util.Collections.unmodifiableList(computeClusters_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_MultiComputeClusterResponse_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_MultiComputeClusterResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.MultiComputeClusterResponse.class, com.clarifai.grpc.api.MultiComputeClusterResponse.Builder.class);
+  }
+
+  public static final int STATUS_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.status.Status status_;
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return Whether the status field is set.
+   */
+  @java.lang.Override
+  public boolean hasStatus() {
+    return status_ != null;
+  }
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return The status.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.status.Status getStatus() {
+    return status_ == null ? com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+  }
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder() {
+    return getStatus();
+  }
+
+  public static final int COMPUTE_CLUSTERS_FIELD_NUMBER = 2;
+  private java.util.List<com.clarifai.grpc.api.ComputeCluster> computeClusters_;
+  /**
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  @java.lang.Override
+  public java.util.List<com.clarifai.grpc.api.ComputeCluster> getComputeClustersList() {
+    return computeClusters_;
+  }
+  /**
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends com.clarifai.grpc.api.ComputeClusterOrBuilder> 
+      getComputeClustersOrBuilderList() {
+    return computeClusters_;
+  }
+  /**
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  @java.lang.Override
+  public int getComputeClustersCount() {
+    return computeClusters_.size();
+  }
+  /**
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.ComputeCluster getComputeClusters(int index) {
+    return computeClusters_.get(index);
+  }
+  /**
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClustersOrBuilder(
+      int index) {
+    return computeClusters_.get(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (status_ != null) {
+      output.writeMessage(1, getStatus());
+    }
+    for (int i = 0; i < computeClusters_.size(); i++) {
+      output.writeMessage(2, computeClusters_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (status_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getStatus());
+    }
+    for (int i = 0; i < computeClusters_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, computeClusters_.get(i));
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.MultiComputeClusterResponse)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.MultiComputeClusterResponse other = (com.clarifai.grpc.api.MultiComputeClusterResponse) obj;
+
+    if (hasStatus() != other.hasStatus()) return false;
+    if (hasStatus()) {
+      if (!getStatus()
+          .equals(other.getStatus())) return false;
+    }
+    if (!getComputeClustersList()
+        .equals(other.getComputeClustersList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasStatus()) {
+      hash = (37 * hash) + STATUS_FIELD_NUMBER;
+      hash = (53 * hash) + getStatus().hashCode();
+    }
+    if (getComputeClustersCount() > 0) {
+      hash = (37 * hash) + COMPUTE_CLUSTERS_FIELD_NUMBER;
+      hash = (53 * hash) + getComputeClustersList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.MultiComputeClusterResponse prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code clarifai.api.MultiComputeClusterResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.MultiComputeClusterResponse)
+      com.clarifai.grpc.api.MultiComputeClusterResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_MultiComputeClusterResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_MultiComputeClusterResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.MultiComputeClusterResponse.class, com.clarifai.grpc.api.MultiComputeClusterResponse.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.MultiComputeClusterResponse.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getComputeClustersFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (statusBuilder_ == null) {
+        status_ = null;
+      } else {
+        status_ = null;
+        statusBuilder_ = null;
+      }
+      if (computeClustersBuilder_ == null) {
+        computeClusters_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        computeClustersBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_MultiComputeClusterResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.MultiComputeClusterResponse getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.MultiComputeClusterResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.MultiComputeClusterResponse build() {
+      com.clarifai.grpc.api.MultiComputeClusterResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.MultiComputeClusterResponse buildPartial() {
+      com.clarifai.grpc.api.MultiComputeClusterResponse result = new com.clarifai.grpc.api.MultiComputeClusterResponse(this);
+      int from_bitField0_ = bitField0_;
+      if (statusBuilder_ == null) {
+        result.status_ = status_;
+      } else {
+        result.status_ = statusBuilder_.build();
+      }
+      if (computeClustersBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          computeClusters_ = java.util.Collections.unmodifiableList(computeClusters_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.computeClusters_ = computeClusters_;
+      } else {
+        result.computeClusters_ = computeClustersBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.MultiComputeClusterResponse) {
+        return mergeFrom((com.clarifai.grpc.api.MultiComputeClusterResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.MultiComputeClusterResponse other) {
+      if (other == com.clarifai.grpc.api.MultiComputeClusterResponse.getDefaultInstance()) return this;
+      if (other.hasStatus()) {
+        mergeStatus(other.getStatus());
+      }
+      if (computeClustersBuilder_ == null) {
+        if (!other.computeClusters_.isEmpty()) {
+          if (computeClusters_.isEmpty()) {
+            computeClusters_ = other.computeClusters_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureComputeClustersIsMutable();
+            computeClusters_.addAll(other.computeClusters_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.computeClusters_.isEmpty()) {
+          if (computeClustersBuilder_.isEmpty()) {
+            computeClustersBuilder_.dispose();
+            computeClustersBuilder_ = null;
+            computeClusters_ = other.computeClusters_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            computeClustersBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getComputeClustersFieldBuilder() : null;
+          } else {
+            computeClustersBuilder_.addAllMessages(other.computeClusters_);
+          }
+        }
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.MultiComputeClusterResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.MultiComputeClusterResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.clarifai.grpc.api.status.Status status_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder> statusBuilder_;
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     * @return Whether the status field is set.
+     */
+    public boolean hasStatus() {
+      return statusBuilder_ != null || status_ != null;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     * @return The status.
+     */
+    public com.clarifai.grpc.api.status.Status getStatus() {
+      if (statusBuilder_ == null) {
+        return status_ == null ? com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+      } else {
+        return statusBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder setStatus(com.clarifai.grpc.api.status.Status value) {
+      if (statusBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        status_ = value;
+        onChanged();
+      } else {
+        statusBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder setStatus(
+        com.clarifai.grpc.api.status.Status.Builder builderForValue) {
+      if (statusBuilder_ == null) {
+        status_ = builderForValue.build();
+        onChanged();
+      } else {
+        statusBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder mergeStatus(com.clarifai.grpc.api.status.Status value) {
+      if (statusBuilder_ == null) {
+        if (status_ != null) {
+          status_ =
+            com.clarifai.grpc.api.status.Status.newBuilder(status_).mergeFrom(value).buildPartial();
+        } else {
+          status_ = value;
+        }
+        onChanged();
+      } else {
+        statusBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder clearStatus() {
+      if (statusBuilder_ == null) {
+        status_ = null;
+        onChanged();
+      } else {
+        status_ = null;
+        statusBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public com.clarifai.grpc.api.status.Status.Builder getStatusBuilder() {
+      
+      onChanged();
+      return getStatusFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder() {
+      if (statusBuilder_ != null) {
+        return statusBuilder_.getMessageOrBuilder();
+      } else {
+        return status_ == null ?
+            com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder> 
+        getStatusFieldBuilder() {
+      if (statusBuilder_ == null) {
+        statusBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder>(
+                getStatus(),
+                getParentForChildren(),
+                isClean());
+        status_ = null;
+      }
+      return statusBuilder_;
+    }
+
+    private java.util.List<com.clarifai.grpc.api.ComputeCluster> computeClusters_ =
+      java.util.Collections.emptyList();
+    private void ensureComputeClustersIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        computeClusters_ = new java.util.ArrayList<com.clarifai.grpc.api.ComputeCluster>(computeClusters_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder> computeClustersBuilder_;
+
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.ComputeCluster> getComputeClustersList() {
+      if (computeClustersBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(computeClusters_);
+      } else {
+        return computeClustersBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public int getComputeClustersCount() {
+      if (computeClustersBuilder_ == null) {
+        return computeClusters_.size();
+      } else {
+        return computeClustersBuilder_.getCount();
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public com.clarifai.grpc.api.ComputeCluster getComputeClusters(int index) {
+      if (computeClustersBuilder_ == null) {
+        return computeClusters_.get(index);
+      } else {
+        return computeClustersBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder setComputeClusters(
+        int index, com.clarifai.grpc.api.ComputeCluster value) {
+      if (computeClustersBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureComputeClustersIsMutable();
+        computeClusters_.set(index, value);
+        onChanged();
+      } else {
+        computeClustersBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder setComputeClusters(
+        int index, com.clarifai.grpc.api.ComputeCluster.Builder builderForValue) {
+      if (computeClustersBuilder_ == null) {
+        ensureComputeClustersIsMutable();
+        computeClusters_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        computeClustersBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder addComputeClusters(com.clarifai.grpc.api.ComputeCluster value) {
+      if (computeClustersBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureComputeClustersIsMutable();
+        computeClusters_.add(value);
+        onChanged();
+      } else {
+        computeClustersBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder addComputeClusters(
+        int index, com.clarifai.grpc.api.ComputeCluster value) {
+      if (computeClustersBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureComputeClustersIsMutable();
+        computeClusters_.add(index, value);
+        onChanged();
+      } else {
+        computeClustersBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder addComputeClusters(
+        com.clarifai.grpc.api.ComputeCluster.Builder builderForValue) {
+      if (computeClustersBuilder_ == null) {
+        ensureComputeClustersIsMutable();
+        computeClusters_.add(builderForValue.build());
+        onChanged();
+      } else {
+        computeClustersBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder addComputeClusters(
+        int index, com.clarifai.grpc.api.ComputeCluster.Builder builderForValue) {
+      if (computeClustersBuilder_ == null) {
+        ensureComputeClustersIsMutable();
+        computeClusters_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        computeClustersBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder addAllComputeClusters(
+        java.lang.Iterable<? extends com.clarifai.grpc.api.ComputeCluster> values) {
+      if (computeClustersBuilder_ == null) {
+        ensureComputeClustersIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, computeClusters_);
+        onChanged();
+      } else {
+        computeClustersBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder clearComputeClusters() {
+      if (computeClustersBuilder_ == null) {
+        computeClusters_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        computeClustersBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder removeComputeClusters(int index) {
+      if (computeClustersBuilder_ == null) {
+        ensureComputeClustersIsMutable();
+        computeClusters_.remove(index);
+        onChanged();
+      } else {
+        computeClustersBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public com.clarifai.grpc.api.ComputeCluster.Builder getComputeClustersBuilder(
+        int index) {
+      return getComputeClustersFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClustersOrBuilder(
+        int index) {
+      if (computeClustersBuilder_ == null) {
+        return computeClusters_.get(index);  } else {
+        return computeClustersBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public java.util.List<? extends com.clarifai.grpc.api.ComputeClusterOrBuilder> 
+         getComputeClustersOrBuilderList() {
+      if (computeClustersBuilder_ != null) {
+        return computeClustersBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(computeClusters_);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public com.clarifai.grpc.api.ComputeCluster.Builder addComputeClustersBuilder() {
+      return getComputeClustersFieldBuilder().addBuilder(
+          com.clarifai.grpc.api.ComputeCluster.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public com.clarifai.grpc.api.ComputeCluster.Builder addComputeClustersBuilder(
+        int index) {
+      return getComputeClustersFieldBuilder().addBuilder(
+          index, com.clarifai.grpc.api.ComputeCluster.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.ComputeCluster.Builder> 
+         getComputeClustersBuilderList() {
+      return getComputeClustersFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder> 
+        getComputeClustersFieldBuilder() {
+      if (computeClustersBuilder_ == null) {
+        computeClustersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder>(
+                computeClusters_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        computeClusters_ = null;
+      }
+      return computeClustersBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.MultiComputeClusterResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.MultiComputeClusterResponse)
+  private static final com.clarifai.grpc.api.MultiComputeClusterResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.MultiComputeClusterResponse();
+  }
+
+  public static com.clarifai.grpc.api.MultiComputeClusterResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<MultiComputeClusterResponse>
+      PARSER = new com.google.protobuf.AbstractParser<MultiComputeClusterResponse>() {
+    @java.lang.Override
+    public MultiComputeClusterResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new MultiComputeClusterResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<MultiComputeClusterResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<MultiComputeClusterResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.MultiComputeClusterResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/MultiComputeClusterResponseOrBuilder.java b/src/main/java/com/clarifai/grpc/api/MultiComputeClusterResponseOrBuilder.java
new file mode 100644
index 0000000..a2b2f62
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/MultiComputeClusterResponseOrBuilder.java
@@ -0,0 +1,48 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface MultiComputeClusterResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.MultiComputeClusterResponse)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return Whether the status field is set.
+   */
+  boolean hasStatus();
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return The status.
+   */
+  com.clarifai.grpc.api.status.Status getStatus();
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   */
+  com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder();
+
+  /**
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  java.util.List<com.clarifai.grpc.api.ComputeCluster> 
+      getComputeClustersList();
+  /**
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  com.clarifai.grpc.api.ComputeCluster getComputeClusters(int index);
+  /**
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  int getComputeClustersCount();
+  /**
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  java.util.List<? extends com.clarifai.grpc.api.ComputeClusterOrBuilder> 
+      getComputeClustersOrBuilderList();
+  /**
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClustersOrBuilder(
+      int index);
+}
diff --git a/src/main/java/com/clarifai/grpc/api/MultiNodepoolResponse.java b/src/main/java/com/clarifai/grpc/api/MultiNodepoolResponse.java
new file mode 100644
index 0000000..7e59ba7
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/MultiNodepoolResponse.java
@@ -0,0 +1,960 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * Protobuf type {@code clarifai.api.MultiNodepoolResponse}
+ */
+public final class MultiNodepoolResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.MultiNodepoolResponse)
+    MultiNodepoolResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use MultiNodepoolResponse.newBuilder() to construct.
+  private MultiNodepoolResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private MultiNodepoolResponse() {
+    nodepools_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new MultiNodepoolResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private MultiNodepoolResponse(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.status.Status.Builder subBuilder = null;
+            if (status_ != null) {
+              subBuilder = status_.toBuilder();
+            }
+            status_ = input.readMessage(com.clarifai.grpc.api.status.Status.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(status_);
+              status_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              nodepools_ = new java.util.ArrayList<com.clarifai.grpc.api.Nodepool>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            nodepools_.add(
+                input.readMessage(com.clarifai.grpc.api.Nodepool.parser(), extensionRegistry));
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        nodepools_ = java.util.Collections.unmodifiableList(nodepools_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_MultiNodepoolResponse_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_MultiNodepoolResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.MultiNodepoolResponse.class, com.clarifai.grpc.api.MultiNodepoolResponse.Builder.class);
+  }
+
+  public static final int STATUS_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.status.Status status_;
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return Whether the status field is set.
+   */
+  @java.lang.Override
+  public boolean hasStatus() {
+    return status_ != null;
+  }
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return The status.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.status.Status getStatus() {
+    return status_ == null ? com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+  }
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder() {
+    return getStatus();
+  }
+
+  public static final int NODEPOOLS_FIELD_NUMBER = 2;
+  private java.util.List<com.clarifai.grpc.api.Nodepool> nodepools_;
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  @java.lang.Override
+  public java.util.List<com.clarifai.grpc.api.Nodepool> getNodepoolsList() {
+    return nodepools_;
+  }
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends com.clarifai.grpc.api.NodepoolOrBuilder> 
+      getNodepoolsOrBuilderList() {
+    return nodepools_;
+  }
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  @java.lang.Override
+  public int getNodepoolsCount() {
+    return nodepools_.size();
+  }
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.Nodepool getNodepools(int index) {
+    return nodepools_.get(index);
+  }
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolsOrBuilder(
+      int index) {
+    return nodepools_.get(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (status_ != null) {
+      output.writeMessage(1, getStatus());
+    }
+    for (int i = 0; i < nodepools_.size(); i++) {
+      output.writeMessage(2, nodepools_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (status_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getStatus());
+    }
+    for (int i = 0; i < nodepools_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, nodepools_.get(i));
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.MultiNodepoolResponse)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.MultiNodepoolResponse other = (com.clarifai.grpc.api.MultiNodepoolResponse) obj;
+
+    if (hasStatus() != other.hasStatus()) return false;
+    if (hasStatus()) {
+      if (!getStatus()
+          .equals(other.getStatus())) return false;
+    }
+    if (!getNodepoolsList()
+        .equals(other.getNodepoolsList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasStatus()) {
+      hash = (37 * hash) + STATUS_FIELD_NUMBER;
+      hash = (53 * hash) + getStatus().hashCode();
+    }
+    if (getNodepoolsCount() > 0) {
+      hash = (37 * hash) + NODEPOOLS_FIELD_NUMBER;
+      hash = (53 * hash) + getNodepoolsList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.MultiNodepoolResponse parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.MultiNodepoolResponse prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code clarifai.api.MultiNodepoolResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.MultiNodepoolResponse)
+      com.clarifai.grpc.api.MultiNodepoolResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_MultiNodepoolResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_MultiNodepoolResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.MultiNodepoolResponse.class, com.clarifai.grpc.api.MultiNodepoolResponse.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.MultiNodepoolResponse.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getNodepoolsFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (statusBuilder_ == null) {
+        status_ = null;
+      } else {
+        status_ = null;
+        statusBuilder_ = null;
+      }
+      if (nodepoolsBuilder_ == null) {
+        nodepools_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        nodepoolsBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_MultiNodepoolResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.MultiNodepoolResponse getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.MultiNodepoolResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.MultiNodepoolResponse build() {
+      com.clarifai.grpc.api.MultiNodepoolResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.MultiNodepoolResponse buildPartial() {
+      com.clarifai.grpc.api.MultiNodepoolResponse result = new com.clarifai.grpc.api.MultiNodepoolResponse(this);
+      int from_bitField0_ = bitField0_;
+      if (statusBuilder_ == null) {
+        result.status_ = status_;
+      } else {
+        result.status_ = statusBuilder_.build();
+      }
+      if (nodepoolsBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          nodepools_ = java.util.Collections.unmodifiableList(nodepools_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.nodepools_ = nodepools_;
+      } else {
+        result.nodepools_ = nodepoolsBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.MultiNodepoolResponse) {
+        return mergeFrom((com.clarifai.grpc.api.MultiNodepoolResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.MultiNodepoolResponse other) {
+      if (other == com.clarifai.grpc.api.MultiNodepoolResponse.getDefaultInstance()) return this;
+      if (other.hasStatus()) {
+        mergeStatus(other.getStatus());
+      }
+      if (nodepoolsBuilder_ == null) {
+        if (!other.nodepools_.isEmpty()) {
+          if (nodepools_.isEmpty()) {
+            nodepools_ = other.nodepools_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureNodepoolsIsMutable();
+            nodepools_.addAll(other.nodepools_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.nodepools_.isEmpty()) {
+          if (nodepoolsBuilder_.isEmpty()) {
+            nodepoolsBuilder_.dispose();
+            nodepoolsBuilder_ = null;
+            nodepools_ = other.nodepools_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            nodepoolsBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getNodepoolsFieldBuilder() : null;
+          } else {
+            nodepoolsBuilder_.addAllMessages(other.nodepools_);
+          }
+        }
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.MultiNodepoolResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.MultiNodepoolResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.clarifai.grpc.api.status.Status status_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder> statusBuilder_;
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     * @return Whether the status field is set.
+     */
+    public boolean hasStatus() {
+      return statusBuilder_ != null || status_ != null;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     * @return The status.
+     */
+    public com.clarifai.grpc.api.status.Status getStatus() {
+      if (statusBuilder_ == null) {
+        return status_ == null ? com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+      } else {
+        return statusBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder setStatus(com.clarifai.grpc.api.status.Status value) {
+      if (statusBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        status_ = value;
+        onChanged();
+      } else {
+        statusBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder setStatus(
+        com.clarifai.grpc.api.status.Status.Builder builderForValue) {
+      if (statusBuilder_ == null) {
+        status_ = builderForValue.build();
+        onChanged();
+      } else {
+        statusBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder mergeStatus(com.clarifai.grpc.api.status.Status value) {
+      if (statusBuilder_ == null) {
+        if (status_ != null) {
+          status_ =
+            com.clarifai.grpc.api.status.Status.newBuilder(status_).mergeFrom(value).buildPartial();
+        } else {
+          status_ = value;
+        }
+        onChanged();
+      } else {
+        statusBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder clearStatus() {
+      if (statusBuilder_ == null) {
+        status_ = null;
+        onChanged();
+      } else {
+        status_ = null;
+        statusBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public com.clarifai.grpc.api.status.Status.Builder getStatusBuilder() {
+      
+      onChanged();
+      return getStatusFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder() {
+      if (statusBuilder_ != null) {
+        return statusBuilder_.getMessageOrBuilder();
+      } else {
+        return status_ == null ?
+            com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder> 
+        getStatusFieldBuilder() {
+      if (statusBuilder_ == null) {
+        statusBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder>(
+                getStatus(),
+                getParentForChildren(),
+                isClean());
+        status_ = null;
+      }
+      return statusBuilder_;
+    }
+
+    private java.util.List<com.clarifai.grpc.api.Nodepool> nodepools_ =
+      java.util.Collections.emptyList();
+    private void ensureNodepoolsIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        nodepools_ = new java.util.ArrayList<com.clarifai.grpc.api.Nodepool>(nodepools_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder> nodepoolsBuilder_;
+
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.Nodepool> getNodepoolsList() {
+      if (nodepoolsBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(nodepools_);
+      } else {
+        return nodepoolsBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public int getNodepoolsCount() {
+      if (nodepoolsBuilder_ == null) {
+        return nodepools_.size();
+      } else {
+        return nodepoolsBuilder_.getCount();
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public com.clarifai.grpc.api.Nodepool getNodepools(int index) {
+      if (nodepoolsBuilder_ == null) {
+        return nodepools_.get(index);
+      } else {
+        return nodepoolsBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder setNodepools(
+        int index, com.clarifai.grpc.api.Nodepool value) {
+      if (nodepoolsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodepoolsIsMutable();
+        nodepools_.set(index, value);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder setNodepools(
+        int index, com.clarifai.grpc.api.Nodepool.Builder builderForValue) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        nodepoolsBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder addNodepools(com.clarifai.grpc.api.Nodepool value) {
+      if (nodepoolsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodepoolsIsMutable();
+        nodepools_.add(value);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder addNodepools(
+        int index, com.clarifai.grpc.api.Nodepool value) {
+      if (nodepoolsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodepoolsIsMutable();
+        nodepools_.add(index, value);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder addNodepools(
+        com.clarifai.grpc.api.Nodepool.Builder builderForValue) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.add(builderForValue.build());
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder addNodepools(
+        int index, com.clarifai.grpc.api.Nodepool.Builder builderForValue) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder addAllNodepools(
+        java.lang.Iterable<? extends com.clarifai.grpc.api.Nodepool> values) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, nodepools_);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder clearNodepools() {
+      if (nodepoolsBuilder_ == null) {
+        nodepools_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public Builder removeNodepools(int index) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.remove(index);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public com.clarifai.grpc.api.Nodepool.Builder getNodepoolsBuilder(
+        int index) {
+      return getNodepoolsFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolsOrBuilder(
+        int index) {
+      if (nodepoolsBuilder_ == null) {
+        return nodepools_.get(index);  } else {
+        return nodepoolsBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public java.util.List<? extends com.clarifai.grpc.api.NodepoolOrBuilder> 
+         getNodepoolsOrBuilderList() {
+      if (nodepoolsBuilder_ != null) {
+        return nodepoolsBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(nodepools_);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public com.clarifai.grpc.api.Nodepool.Builder addNodepoolsBuilder() {
+      return getNodepoolsFieldBuilder().addBuilder(
+          com.clarifai.grpc.api.Nodepool.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public com.clarifai.grpc.api.Nodepool.Builder addNodepoolsBuilder(
+        int index) {
+      return getNodepoolsFieldBuilder().addBuilder(
+          index, com.clarifai.grpc.api.Nodepool.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.Nodepool.Builder> 
+         getNodepoolsBuilderList() {
+      return getNodepoolsFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder> 
+        getNodepoolsFieldBuilder() {
+      if (nodepoolsBuilder_ == null) {
+        nodepoolsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder>(
+                nodepools_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        nodepools_ = null;
+      }
+      return nodepoolsBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.MultiNodepoolResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.MultiNodepoolResponse)
+  private static final com.clarifai.grpc.api.MultiNodepoolResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.MultiNodepoolResponse();
+  }
+
+  public static com.clarifai.grpc.api.MultiNodepoolResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<MultiNodepoolResponse>
+      PARSER = new com.google.protobuf.AbstractParser<MultiNodepoolResponse>() {
+    @java.lang.Override
+    public MultiNodepoolResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new MultiNodepoolResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<MultiNodepoolResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<MultiNodepoolResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.MultiNodepoolResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/MultiNodepoolResponseOrBuilder.java b/src/main/java/com/clarifai/grpc/api/MultiNodepoolResponseOrBuilder.java
new file mode 100644
index 0000000..f263a74
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/MultiNodepoolResponseOrBuilder.java
@@ -0,0 +1,48 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface MultiNodepoolResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.MultiNodepoolResponse)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return Whether the status field is set.
+   */
+  boolean hasStatus();
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return The status.
+   */
+  com.clarifai.grpc.api.status.Status getStatus();
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   */
+  com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder();
+
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  java.util.List<com.clarifai.grpc.api.Nodepool> 
+      getNodepoolsList();
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  com.clarifai.grpc.api.Nodepool getNodepools(int index);
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  int getNodepoolsCount();
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  java.util.List<? extends com.clarifai.grpc.api.NodepoolOrBuilder> 
+      getNodepoolsOrBuilderList();
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 2 [(.clarifai.api.utils.cl_show_if_empty) = true];</code>
+   */
+  com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolsOrBuilder(
+      int index);
+}
diff --git a/src/main/java/com/clarifai/grpc/api/NodeCapacityType.java b/src/main/java/com/clarifai/grpc/api/NodeCapacityType.java
new file mode 100644
index 0000000..f88f81a
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/NodeCapacityType.java
@@ -0,0 +1,820 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/resources.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * <pre>
+ * Type of nodes that are ok for instances in this pool.
+ * If both spot and on-demand are provided then the runner will be able to run on either
+ * with a preference for spot until they are not available.
+ * </pre>
+ *
+ * Protobuf type {@code clarifai.api.NodeCapacityType}
+ */
+public final class NodeCapacityType extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.NodeCapacityType)
+    NodeCapacityTypeOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use NodeCapacityType.newBuilder() to construct.
+  private NodeCapacityType(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private NodeCapacityType() {
+    capacityTypes_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new NodeCapacityType();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private NodeCapacityType(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+            int rawValue = input.readEnum();
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              capacityTypes_ = new java.util.ArrayList<java.lang.Integer>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            capacityTypes_.add(rawValue);
+            break;
+          }
+          case 10: {
+            int length = input.readRawVarint32();
+            int oldLimit = input.pushLimit(length);
+            while(input.getBytesUntilLimit() > 0) {
+              int rawValue = input.readEnum();
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                capacityTypes_ = new java.util.ArrayList<java.lang.Integer>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              capacityTypes_.add(rawValue);
+            }
+            input.popLimit(oldLimit);
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        capacityTypes_ = java.util.Collections.unmodifiableList(capacityTypes_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_NodeCapacityType_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_NodeCapacityType_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.NodeCapacityType.class, com.clarifai.grpc.api.NodeCapacityType.Builder.class);
+  }
+
+  /**
+   * Protobuf enum {@code clarifai.api.NodeCapacityType.CapacityType}
+   */
+  public enum CapacityType
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <code>UKNOWN_CAPACITY_TYPE = 0;</code>
+     */
+    UKNOWN_CAPACITY_TYPE(0),
+    /**
+     * <code>ON_DEMAND_TYPE = 1;</code>
+     */
+    ON_DEMAND_TYPE(1),
+    /**
+     * <code>SPOT_TYPE = 2;</code>
+     */
+    SPOT_TYPE(2),
+    UNRECOGNIZED(-1),
+    ;
+
+    /**
+     * <code>UKNOWN_CAPACITY_TYPE = 0;</code>
+     */
+    public static final int UKNOWN_CAPACITY_TYPE_VALUE = 0;
+    /**
+     * <code>ON_DEMAND_TYPE = 1;</code>
+     */
+    public static final int ON_DEMAND_TYPE_VALUE = 1;
+    /**
+     * <code>SPOT_TYPE = 2;</code>
+     */
+    public static final int SPOT_TYPE_VALUE = 2;
+
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static CapacityType valueOf(int value) {
+      return forNumber(value);
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     */
+    public static CapacityType forNumber(int value) {
+      switch (value) {
+        case 0: return UKNOWN_CAPACITY_TYPE;
+        case 1: return ON_DEMAND_TYPE;
+        case 2: return SPOT_TYPE;
+        default: return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<CapacityType>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        CapacityType> internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<CapacityType>() {
+            public CapacityType findValueByNumber(int number) {
+              return CapacityType.forNumber(number);
+            }
+          };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+        getValueDescriptor() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalStateException(
+            "Can't get the descriptor of an unrecognized enum value.");
+      }
+      return getDescriptor().getValues().get(ordinal());
+    }
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptorForType() {
+      return getDescriptor();
+    }
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.NodeCapacityType.getDescriptor().getEnumTypes().get(0);
+    }
+
+    private static final CapacityType[] VALUES = values();
+
+    public static CapacityType valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException(
+          "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private CapacityType(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:clarifai.api.NodeCapacityType.CapacityType)
+  }
+
+  public static final int CAPACITY_TYPES_FIELD_NUMBER = 1;
+  private java.util.List<java.lang.Integer> capacityTypes_;
+  private static final com.google.protobuf.Internal.ListAdapter.Converter<
+      java.lang.Integer, com.clarifai.grpc.api.NodeCapacityType.CapacityType> capacityTypes_converter_ =
+          new com.google.protobuf.Internal.ListAdapter.Converter<
+              java.lang.Integer, com.clarifai.grpc.api.NodeCapacityType.CapacityType>() {
+            public com.clarifai.grpc.api.NodeCapacityType.CapacityType convert(java.lang.Integer from) {
+              @SuppressWarnings("deprecation")
+              com.clarifai.grpc.api.NodeCapacityType.CapacityType result = com.clarifai.grpc.api.NodeCapacityType.CapacityType.valueOf(from);
+              return result == null ? com.clarifai.grpc.api.NodeCapacityType.CapacityType.UNRECOGNIZED : result;
+            }
+          };
+  /**
+   * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+   * @return A list containing the capacityTypes.
+   */
+  @java.lang.Override
+  public java.util.List<com.clarifai.grpc.api.NodeCapacityType.CapacityType> getCapacityTypesList() {
+    return new com.google.protobuf.Internal.ListAdapter<
+        java.lang.Integer, com.clarifai.grpc.api.NodeCapacityType.CapacityType>(capacityTypes_, capacityTypes_converter_);
+  }
+  /**
+   * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+   * @return The count of capacityTypes.
+   */
+  @java.lang.Override
+  public int getCapacityTypesCount() {
+    return capacityTypes_.size();
+  }
+  /**
+   * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+   * @param index The index of the element to return.
+   * @return The capacityTypes at the given index.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.NodeCapacityType.CapacityType getCapacityTypes(int index) {
+    return capacityTypes_converter_.convert(capacityTypes_.get(index));
+  }
+  /**
+   * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+   * @return A list containing the enum numeric values on the wire for capacityTypes.
+   */
+  @java.lang.Override
+  public java.util.List<java.lang.Integer>
+  getCapacityTypesValueList() {
+    return capacityTypes_;
+  }
+  /**
+   * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+   * @param index The index of the value to return.
+   * @return The enum numeric value on the wire of capacityTypes at the given index.
+   */
+  @java.lang.Override
+  public int getCapacityTypesValue(int index) {
+    return capacityTypes_.get(index);
+  }
+  private int capacityTypesMemoizedSerializedSize;
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    getSerializedSize();
+    if (getCapacityTypesList().size() > 0) {
+      output.writeUInt32NoTag(10);
+      output.writeUInt32NoTag(capacityTypesMemoizedSerializedSize);
+    }
+    for (int i = 0; i < capacityTypes_.size(); i++) {
+      output.writeEnumNoTag(capacityTypes_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    {
+      int dataSize = 0;
+      for (int i = 0; i < capacityTypes_.size(); i++) {
+        dataSize += com.google.protobuf.CodedOutputStream
+          .computeEnumSizeNoTag(capacityTypes_.get(i));
+      }
+      size += dataSize;
+      if (!getCapacityTypesList().isEmpty()) {  size += 1;
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32SizeNoTag(dataSize);
+      }capacityTypesMemoizedSerializedSize = dataSize;
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.NodeCapacityType)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.NodeCapacityType other = (com.clarifai.grpc.api.NodeCapacityType) obj;
+
+    if (!capacityTypes_.equals(other.capacityTypes_)) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (getCapacityTypesCount() > 0) {
+      hash = (37 * hash) + CAPACITY_TYPES_FIELD_NUMBER;
+      hash = (53 * hash) + capacityTypes_.hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.NodeCapacityType parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.NodeCapacityType parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.NodeCapacityType parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.NodeCapacityType parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.NodeCapacityType parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.NodeCapacityType parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.NodeCapacityType parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.NodeCapacityType parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.NodeCapacityType parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.NodeCapacityType parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.NodeCapacityType parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.NodeCapacityType parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.NodeCapacityType prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * Type of nodes that are ok for instances in this pool.
+   * If both spot and on-demand are provided then the runner will be able to run on either
+   * with a preference for spot until they are not available.
+   * </pre>
+   *
+   * Protobuf type {@code clarifai.api.NodeCapacityType}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.NodeCapacityType)
+      com.clarifai.grpc.api.NodeCapacityTypeOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_NodeCapacityType_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_NodeCapacityType_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.NodeCapacityType.class, com.clarifai.grpc.api.NodeCapacityType.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.NodeCapacityType.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      capacityTypes_ = java.util.Collections.emptyList();
+      bitField0_ = (bitField0_ & ~0x00000001);
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_NodeCapacityType_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.NodeCapacityType getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.NodeCapacityType.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.NodeCapacityType build() {
+      com.clarifai.grpc.api.NodeCapacityType result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.NodeCapacityType buildPartial() {
+      com.clarifai.grpc.api.NodeCapacityType result = new com.clarifai.grpc.api.NodeCapacityType(this);
+      int from_bitField0_ = bitField0_;
+      if (((bitField0_ & 0x00000001) != 0)) {
+        capacityTypes_ = java.util.Collections.unmodifiableList(capacityTypes_);
+        bitField0_ = (bitField0_ & ~0x00000001);
+      }
+      result.capacityTypes_ = capacityTypes_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.NodeCapacityType) {
+        return mergeFrom((com.clarifai.grpc.api.NodeCapacityType)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.NodeCapacityType other) {
+      if (other == com.clarifai.grpc.api.NodeCapacityType.getDefaultInstance()) return this;
+      if (!other.capacityTypes_.isEmpty()) {
+        if (capacityTypes_.isEmpty()) {
+          capacityTypes_ = other.capacityTypes_;
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          ensureCapacityTypesIsMutable();
+          capacityTypes_.addAll(other.capacityTypes_);
+        }
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.NodeCapacityType parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.NodeCapacityType) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private java.util.List<java.lang.Integer> capacityTypes_ =
+      java.util.Collections.emptyList();
+    private void ensureCapacityTypesIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        capacityTypes_ = new java.util.ArrayList<java.lang.Integer>(capacityTypes_);
+        bitField0_ |= 0x00000001;
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @return A list containing the capacityTypes.
+     */
+    public java.util.List<com.clarifai.grpc.api.NodeCapacityType.CapacityType> getCapacityTypesList() {
+      return new com.google.protobuf.Internal.ListAdapter<
+          java.lang.Integer, com.clarifai.grpc.api.NodeCapacityType.CapacityType>(capacityTypes_, capacityTypes_converter_);
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @return The count of capacityTypes.
+     */
+    public int getCapacityTypesCount() {
+      return capacityTypes_.size();
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @param index The index of the element to return.
+     * @return The capacityTypes at the given index.
+     */
+    public com.clarifai.grpc.api.NodeCapacityType.CapacityType getCapacityTypes(int index) {
+      return capacityTypes_converter_.convert(capacityTypes_.get(index));
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @param index The index to set the value at.
+     * @param value The capacityTypes to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCapacityTypes(
+        int index, com.clarifai.grpc.api.NodeCapacityType.CapacityType value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      ensureCapacityTypesIsMutable();
+      capacityTypes_.set(index, value.getNumber());
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @param value The capacityTypes to add.
+     * @return This builder for chaining.
+     */
+    public Builder addCapacityTypes(com.clarifai.grpc.api.NodeCapacityType.CapacityType value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      ensureCapacityTypesIsMutable();
+      capacityTypes_.add(value.getNumber());
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @param values The capacityTypes to add.
+     * @return This builder for chaining.
+     */
+    public Builder addAllCapacityTypes(
+        java.lang.Iterable<? extends com.clarifai.grpc.api.NodeCapacityType.CapacityType> values) {
+      ensureCapacityTypesIsMutable();
+      for (com.clarifai.grpc.api.NodeCapacityType.CapacityType value : values) {
+        capacityTypes_.add(value.getNumber());
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCapacityTypes() {
+      capacityTypes_ = java.util.Collections.emptyList();
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @return A list containing the enum numeric values on the wire for capacityTypes.
+     */
+    public java.util.List<java.lang.Integer>
+    getCapacityTypesValueList() {
+      return java.util.Collections.unmodifiableList(capacityTypes_);
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @param index The index of the value to return.
+     * @return The enum numeric value on the wire of capacityTypes at the given index.
+     */
+    public int getCapacityTypesValue(int index) {
+      return capacityTypes_.get(index);
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @param index The index to set the value at.
+     * @param value The enum numeric value on the wire for capacityTypes to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCapacityTypesValue(
+        int index, int value) {
+      ensureCapacityTypesIsMutable();
+      capacityTypes_.set(index, value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @param value The enum numeric value on the wire for capacityTypes to add.
+     * @return This builder for chaining.
+     */
+    public Builder addCapacityTypesValue(int value) {
+      ensureCapacityTypesIsMutable();
+      capacityTypes_.add(value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+     * @param values The enum numeric values on the wire for capacityTypes to add.
+     * @return This builder for chaining.
+     */
+    public Builder addAllCapacityTypesValue(
+        java.lang.Iterable<java.lang.Integer> values) {
+      ensureCapacityTypesIsMutable();
+      for (int value : values) {
+        capacityTypes_.add(value);
+      }
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.NodeCapacityType)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.NodeCapacityType)
+  private static final com.clarifai.grpc.api.NodeCapacityType DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.NodeCapacityType();
+  }
+
+  public static com.clarifai.grpc.api.NodeCapacityType getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<NodeCapacityType>
+      PARSER = new com.google.protobuf.AbstractParser<NodeCapacityType>() {
+    @java.lang.Override
+    public NodeCapacityType parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new NodeCapacityType(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<NodeCapacityType> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<NodeCapacityType> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.NodeCapacityType getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/NodeCapacityTypeOrBuilder.java b/src/main/java/com/clarifai/grpc/api/NodeCapacityTypeOrBuilder.java
new file mode 100644
index 0000000..e415005
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/NodeCapacityTypeOrBuilder.java
@@ -0,0 +1,38 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/resources.proto
+
+package com.clarifai.grpc.api;
+
+public interface NodeCapacityTypeOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.NodeCapacityType)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+   * @return A list containing the capacityTypes.
+   */
+  java.util.List<com.clarifai.grpc.api.NodeCapacityType.CapacityType> getCapacityTypesList();
+  /**
+   * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+   * @return The count of capacityTypes.
+   */
+  int getCapacityTypesCount();
+  /**
+   * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+   * @param index The index of the element to return.
+   * @return The capacityTypes at the given index.
+   */
+  com.clarifai.grpc.api.NodeCapacityType.CapacityType getCapacityTypes(int index);
+  /**
+   * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+   * @return A list containing the enum numeric values on the wire for capacityTypes.
+   */
+  java.util.List<java.lang.Integer>
+  getCapacityTypesValueList();
+  /**
+   * <code>repeated .clarifai.api.NodeCapacityType.CapacityType capacity_types = 1;</code>
+   * @param index The index of the value to return.
+   * @return The enum numeric value on the wire of capacityTypes at the given index.
+   */
+  int getCapacityTypesValue(int index);
+}
diff --git a/src/main/java/com/clarifai/grpc/api/Nodepool.java b/src/main/java/com/clarifai/grpc/api/Nodepool.java
index 269fe6a..3a05317 100644
--- a/src/main/java/com/clarifai/grpc/api/Nodepool.java
+++ b/src/main/java/com/clarifai/grpc/api/Nodepool.java
@@ -23,9 +23,9 @@ private Nodepool(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
   }
   private Nodepool() {
     id_ = "";
+    description_ = "";
     userId_ = "";
-    capacityTypes_ = java.util.Collections.emptyList();
-    instanceTypes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+    instanceTypes_ = java.util.Collections.emptyList();
   }
 
   @java.lang.Override
@@ -68,52 +68,74 @@ private Nodepool(
           case 18: {
             java.lang.String s = input.readStringRequireUtf8();
 
-            userId_ = s;
+            description_ = s;
             break;
           }
           case 26: {
-            com.clarifai.grpc.api.CloudRegion.Builder subBuilder = null;
-            if (cloudRegion_ != null) {
-              subBuilder = cloudRegion_.toBuilder();
+            com.google.protobuf.Timestamp.Builder subBuilder = null;
+            if (createdAt_ != null) {
+              subBuilder = createdAt_.toBuilder();
             }
-            cloudRegion_ = input.readMessage(com.clarifai.grpc.api.CloudRegion.parser(), extensionRegistry);
+            createdAt_ = input.readMessage(com.google.protobuf.Timestamp.parser(), extensionRegistry);
             if (subBuilder != null) {
-              subBuilder.mergeFrom(cloudRegion_);
-              cloudRegion_ = subBuilder.buildPartial();
+              subBuilder.mergeFrom(createdAt_);
+              createdAt_ = subBuilder.buildPartial();
             }
 
             break;
           }
-          case 32: {
-            int rawValue = input.readEnum();
-            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-              capacityTypes_ = new java.util.ArrayList<java.lang.Integer>();
-              mutable_bitField0_ |= 0x00000001;
+          case 34: {
+            com.google.protobuf.Timestamp.Builder subBuilder = null;
+            if (modifiedAt_ != null) {
+              subBuilder = modifiedAt_.toBuilder();
             }
-            capacityTypes_.add(rawValue);
+            modifiedAt_ = input.readMessage(com.google.protobuf.Timestamp.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(modifiedAt_);
+              modifiedAt_ = subBuilder.buildPartial();
+            }
+
             break;
           }
-          case 34: {
-            int length = input.readRawVarint32();
-            int oldLimit = input.pushLimit(length);
-            while(input.getBytesUntilLimit() > 0) {
-              int rawValue = input.readEnum();
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                capacityTypes_ = new java.util.ArrayList<java.lang.Integer>();
-                mutable_bitField0_ |= 0x00000001;
-              }
-              capacityTypes_.add(rawValue);
+          case 42: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            userId_ = s;
+            break;
+          }
+          case 50: {
+            com.clarifai.grpc.api.ComputeCluster.Builder subBuilder = null;
+            if (computeCluster_ != null) {
+              subBuilder = computeCluster_.toBuilder();
+            }
+            computeCluster_ = input.readMessage(com.clarifai.grpc.api.ComputeCluster.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(computeCluster_);
+              computeCluster_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 58: {
+            com.clarifai.grpc.api.NodeCapacityType.Builder subBuilder = null;
+            if (nodeCapacityType_ != null) {
+              subBuilder = nodeCapacityType_.toBuilder();
+            }
+            nodeCapacityType_ = input.readMessage(com.clarifai.grpc.api.NodeCapacityType.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(nodeCapacityType_);
+              nodeCapacityType_ = subBuilder.buildPartial();
             }
-            input.popLimit(oldLimit);
+
             break;
           }
           case 66: {
-            java.lang.String s = input.readStringRequireUtf8();
-            if (!((mutable_bitField0_ & 0x00000002) != 0)) {
-              instanceTypes_ = new com.google.protobuf.LazyStringArrayList();
-              mutable_bitField0_ |= 0x00000002;
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              instanceTypes_ = new java.util.ArrayList<com.clarifai.grpc.api.InstanceType>();
+              mutable_bitField0_ |= 0x00000001;
             }
-            instanceTypes_.add(s);
+            instanceTypes_.add(
+                input.readMessage(com.clarifai.grpc.api.InstanceType.parser(), extensionRegistry));
             break;
           }
           case 72: {
@@ -126,6 +148,32 @@ private Nodepool(
             maxInstances_ = input.readUInt32();
             break;
           }
+          case 90: {
+            com.clarifai.grpc.api.Visibility.Builder subBuilder = null;
+            if (visibility_ != null) {
+              subBuilder = visibility_.toBuilder();
+            }
+            visibility_ = input.readMessage(com.clarifai.grpc.api.Visibility.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(visibility_);
+              visibility_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 98: {
+            com.google.protobuf.Struct.Builder subBuilder = null;
+            if (metadata_ != null) {
+              subBuilder = metadata_.toBuilder();
+            }
+            metadata_ = input.readMessage(com.google.protobuf.Struct.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(metadata_);
+              metadata_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
           default: {
             if (!parseUnknownField(
                 input, unknownFields, extensionRegistry, tag)) {
@@ -144,10 +192,7 @@ private Nodepool(
           e).setUnfinishedMessage(this);
     } finally {
       if (((mutable_bitField0_ & 0x00000001) != 0)) {
-        capacityTypes_ = java.util.Collections.unmodifiableList(capacityTypes_);
-      }
-      if (((mutable_bitField0_ & 0x00000002) != 0)) {
-        instanceTypes_ = instanceTypes_.getUnmodifiableView();
+        instanceTypes_ = java.util.Collections.unmodifiableList(instanceTypes_);
       }
       this.unknownFields = unknownFields.build();
       makeExtensionsImmutable();
@@ -166,129 +211,6 @@ private Nodepool(
             com.clarifai.grpc.api.Nodepool.class, com.clarifai.grpc.api.Nodepool.Builder.class);
   }
 
-  /**
-   * <pre>
-   * Type of nodes that are ok for instances in this pool.
-   * If both spot and on-demand are provided then the runner will be able to run on either
-   * with a preference for spot until they are not available.
-   * </pre>
-   *
-   * Protobuf enum {@code clarifai.api.Nodepool.CapacityType}
-   */
-  public enum CapacityType
-      implements com.google.protobuf.ProtocolMessageEnum {
-    /**
-     * <code>UKNOWN_CAPACITY_TYPE = 0;</code>
-     */
-    UKNOWN_CAPACITY_TYPE(0),
-    /**
-     * <code>ONDEMAND_TYPE = 1;</code>
-     */
-    ONDEMAND_TYPE(1),
-    /**
-     * <code>SPOT_TYPE = 2;</code>
-     */
-    SPOT_TYPE(2),
-    UNRECOGNIZED(-1),
-    ;
-
-    /**
-     * <code>UKNOWN_CAPACITY_TYPE = 0;</code>
-     */
-    public static final int UKNOWN_CAPACITY_TYPE_VALUE = 0;
-    /**
-     * <code>ONDEMAND_TYPE = 1;</code>
-     */
-    public static final int ONDEMAND_TYPE_VALUE = 1;
-    /**
-     * <code>SPOT_TYPE = 2;</code>
-     */
-    public static final int SPOT_TYPE_VALUE = 2;
-
-
-    public final int getNumber() {
-      if (this == UNRECOGNIZED) {
-        throw new java.lang.IllegalArgumentException(
-            "Can't get the number of an unknown enum value.");
-      }
-      return value;
-    }
-
-    /**
-     * @param value The numeric wire value of the corresponding enum entry.
-     * @return The enum associated with the given numeric wire value.
-     * @deprecated Use {@link #forNumber(int)} instead.
-     */
-    @java.lang.Deprecated
-    public static CapacityType valueOf(int value) {
-      return forNumber(value);
-    }
-
-    /**
-     * @param value The numeric wire value of the corresponding enum entry.
-     * @return The enum associated with the given numeric wire value.
-     */
-    public static CapacityType forNumber(int value) {
-      switch (value) {
-        case 0: return UKNOWN_CAPACITY_TYPE;
-        case 1: return ONDEMAND_TYPE;
-        case 2: return SPOT_TYPE;
-        default: return null;
-      }
-    }
-
-    public static com.google.protobuf.Internal.EnumLiteMap<CapacityType>
-        internalGetValueMap() {
-      return internalValueMap;
-    }
-    private static final com.google.protobuf.Internal.EnumLiteMap<
-        CapacityType> internalValueMap =
-          new com.google.protobuf.Internal.EnumLiteMap<CapacityType>() {
-            public CapacityType findValueByNumber(int number) {
-              return CapacityType.forNumber(number);
-            }
-          };
-
-    public final com.google.protobuf.Descriptors.EnumValueDescriptor
-        getValueDescriptor() {
-      if (this == UNRECOGNIZED) {
-        throw new java.lang.IllegalStateException(
-            "Can't get the descriptor of an unrecognized enum value.");
-      }
-      return getDescriptor().getValues().get(ordinal());
-    }
-    public final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptorForType() {
-      return getDescriptor();
-    }
-    public static final com.google.protobuf.Descriptors.EnumDescriptor
-        getDescriptor() {
-      return com.clarifai.grpc.api.Nodepool.getDescriptor().getEnumTypes().get(0);
-    }
-
-    private static final CapacityType[] VALUES = values();
-
-    public static CapacityType valueOf(
-        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
-      if (desc.getType() != getDescriptor()) {
-        throw new java.lang.IllegalArgumentException(
-          "EnumValueDescriptor is not for this type.");
-      }
-      if (desc.getIndex() == -1) {
-        return UNRECOGNIZED;
-      }
-      return VALUES[desc.getIndex()];
-    }
-
-    private final int value;
-
-    private CapacityType(int value) {
-      this.value = value;
-    }
-
-    // @@protoc_insertion_point(enum_scope:clarifai.api.Nodepool.CapacityType)
-  }
-
   public static final int ID_FIELD_NUMBER = 1;
   private volatile java.lang.Object id_;
   /**
@@ -335,14 +257,136 @@ public java.lang.String getId() {
     }
   }
 
-  public static final int USER_ID_FIELD_NUMBER = 2;
+  public static final int DESCRIPTION_FIELD_NUMBER = 2;
+  private volatile java.lang.Object description_;
+  /**
+   * <pre>
+   * Short description about the nodepool.
+   * </pre>
+   *
+   * <code>string description = 2;</code>
+   * @return The description.
+   */
+  @java.lang.Override
+  public java.lang.String getDescription() {
+    java.lang.Object ref = description_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      description_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * Short description about the nodepool.
+   * </pre>
+   *
+   * <code>string description = 2;</code>
+   * @return The bytes for description.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getDescriptionBytes() {
+    java.lang.Object ref = description_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      description_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CREATED_AT_FIELD_NUMBER = 3;
+  private com.google.protobuf.Timestamp createdAt_;
+  /**
+   * <pre>
+   * When the nodepool was created.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp created_at = 3;</code>
+   * @return Whether the createdAt field is set.
+   */
+  @java.lang.Override
+  public boolean hasCreatedAt() {
+    return createdAt_ != null;
+  }
+  /**
+   * <pre>
+   * When the nodepool was created.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp created_at = 3;</code>
+   * @return The createdAt.
+   */
+  @java.lang.Override
+  public com.google.protobuf.Timestamp getCreatedAt() {
+    return createdAt_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : createdAt_;
+  }
+  /**
+   * <pre>
+   * When the nodepool was created.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp created_at = 3;</code>
+   */
+  @java.lang.Override
+  public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
+    return getCreatedAt();
+  }
+
+  public static final int MODIFIED_AT_FIELD_NUMBER = 4;
+  private com.google.protobuf.Timestamp modifiedAt_;
+  /**
+   * <pre>
+   * When the nodepool was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 4;</code>
+   * @return Whether the modifiedAt field is set.
+   */
+  @java.lang.Override
+  public boolean hasModifiedAt() {
+    return modifiedAt_ != null;
+  }
+  /**
+   * <pre>
+   * When the nodepool was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 4;</code>
+   * @return The modifiedAt.
+   */
+  @java.lang.Override
+  public com.google.protobuf.Timestamp getModifiedAt() {
+    return modifiedAt_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : modifiedAt_;
+  }
+  /**
+   * <pre>
+   * When the nodepool was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 4;</code>
+   */
+  @java.lang.Override
+  public com.google.protobuf.TimestampOrBuilder getModifiedAtOrBuilder() {
+    return getModifiedAt();
+  }
+
+  public static final int USER_ID_FIELD_NUMBER = 5;
   private volatile java.lang.Object userId_;
   /**
    * <pre>
    * The user/org that this nodepool belongs to.
    * </pre>
    *
-   * <code>string user_id = 2;</code>
+   * <code>string user_id = 5;</code>
    * @return The userId.
    */
   @java.lang.Override
@@ -363,7 +407,7 @@ public java.lang.String getUserId() {
    * The user/org that this nodepool belongs to.
    * </pre>
    *
-   * <code>string user_id = 2;</code>
+   * <code>string user_id = 5;</code>
    * @return The bytes for userId.
    */
   @java.lang.Override
@@ -381,166 +425,115 @@ public java.lang.String getUserId() {
     }
   }
 
-  public static final int CLOUD_REGION_FIELD_NUMBER = 3;
-  private com.clarifai.grpc.api.CloudRegion cloudRegion_;
+  public static final int COMPUTE_CLUSTER_FIELD_NUMBER = 6;
+  private com.clarifai.grpc.api.ComputeCluster computeCluster_;
   /**
    * <pre>
-   * Which cloud region this nodepool is within.
+   * Which cluster this nodepool is within.
    * </pre>
    *
-   * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
-   * @return Whether the cloudRegion field is set.
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+   * @return Whether the computeCluster field is set.
    */
   @java.lang.Override
-  public boolean hasCloudRegion() {
-    return cloudRegion_ != null;
+  public boolean hasComputeCluster() {
+    return computeCluster_ != null;
   }
   /**
    * <pre>
-   * Which cloud region this nodepool is within.
+   * Which cluster this nodepool is within.
    * </pre>
    *
-   * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
-   * @return The cloudRegion.
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+   * @return The computeCluster.
    */
   @java.lang.Override
-  public com.clarifai.grpc.api.CloudRegion getCloudRegion() {
-    return cloudRegion_ == null ? com.clarifai.grpc.api.CloudRegion.getDefaultInstance() : cloudRegion_;
+  public com.clarifai.grpc.api.ComputeCluster getComputeCluster() {
+    return computeCluster_ == null ? com.clarifai.grpc.api.ComputeCluster.getDefaultInstance() : computeCluster_;
   }
   /**
    * <pre>
-   * Which cloud region this nodepool is within.
+   * Which cluster this nodepool is within.
    * </pre>
    *
-   * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
-   */
-  @java.lang.Override
-  public com.clarifai.grpc.api.CloudRegionOrBuilder getCloudRegionOrBuilder() {
-    return getCloudRegion();
-  }
-
-  public static final int CAPACITY_TYPES_FIELD_NUMBER = 4;
-  private java.util.List<java.lang.Integer> capacityTypes_;
-  private static final com.google.protobuf.Internal.ListAdapter.Converter<
-      java.lang.Integer, com.clarifai.grpc.api.Nodepool.CapacityType> capacityTypes_converter_ =
-          new com.google.protobuf.Internal.ListAdapter.Converter<
-              java.lang.Integer, com.clarifai.grpc.api.Nodepool.CapacityType>() {
-            public com.clarifai.grpc.api.Nodepool.CapacityType convert(java.lang.Integer from) {
-              @SuppressWarnings("deprecation")
-              com.clarifai.grpc.api.Nodepool.CapacityType result = com.clarifai.grpc.api.Nodepool.CapacityType.valueOf(from);
-              return result == null ? com.clarifai.grpc.api.Nodepool.CapacityType.UNRECOGNIZED : result;
-            }
-          };
-  /**
-   * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-   * @return A list containing the capacityTypes.
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
    */
   @java.lang.Override
-  public java.util.List<com.clarifai.grpc.api.Nodepool.CapacityType> getCapacityTypesList() {
-    return new com.google.protobuf.Internal.ListAdapter<
-        java.lang.Integer, com.clarifai.grpc.api.Nodepool.CapacityType>(capacityTypes_, capacityTypes_converter_);
+  public com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClusterOrBuilder() {
+    return getComputeCluster();
   }
+
+  public static final int NODE_CAPACITY_TYPE_FIELD_NUMBER = 7;
+  private com.clarifai.grpc.api.NodeCapacityType nodeCapacityType_;
   /**
-   * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-   * @return The count of capacityTypes.
+   * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+   * @return Whether the nodeCapacityType field is set.
    */
   @java.lang.Override
-  public int getCapacityTypesCount() {
-    return capacityTypes_.size();
+  public boolean hasNodeCapacityType() {
+    return nodeCapacityType_ != null;
   }
   /**
-   * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-   * @param index The index of the element to return.
-   * @return The capacityTypes at the given index.
+   * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+   * @return The nodeCapacityType.
    */
   @java.lang.Override
-  public com.clarifai.grpc.api.Nodepool.CapacityType getCapacityTypes(int index) {
-    return capacityTypes_converter_.convert(capacityTypes_.get(index));
+  public com.clarifai.grpc.api.NodeCapacityType getNodeCapacityType() {
+    return nodeCapacityType_ == null ? com.clarifai.grpc.api.NodeCapacityType.getDefaultInstance() : nodeCapacityType_;
   }
   /**
-   * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-   * @return A list containing the enum numeric values on the wire for capacityTypes.
+   * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
    */
   @java.lang.Override
-  public java.util.List<java.lang.Integer>
-  getCapacityTypesValueList() {
-    return capacityTypes_;
+  public com.clarifai.grpc.api.NodeCapacityTypeOrBuilder getNodeCapacityTypeOrBuilder() {
+    return getNodeCapacityType();
   }
+
+  public static final int INSTANCE_TYPES_FIELD_NUMBER = 8;
+  private java.util.List<com.clarifai.grpc.api.InstanceType> instanceTypes_;
   /**
-   * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-   * @param index The index of the value to return.
-   * @return The enum numeric value on the wire of capacityTypes at the given index.
+   * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
    */
   @java.lang.Override
-  public int getCapacityTypesValue(int index) {
-    return capacityTypes_.get(index);
+  public java.util.List<com.clarifai.grpc.api.InstanceType> getInstanceTypesList() {
+    return instanceTypes_;
   }
-  private int capacityTypesMemoizedSerializedSize;
-
-  public static final int INSTANCE_TYPES_FIELD_NUMBER = 8;
-  private com.google.protobuf.LazyStringList instanceTypes_;
   /**
-   * <pre>
-   *&#47;///////////////////////////////////
-   * The instance types that will be available in this pool of nodes.
-   * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
-   * </pre>
-   *
-   * <code>repeated string instance_types = 8;</code>
-   * @return A list containing the instanceTypes.
+   * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
    */
-  public com.google.protobuf.ProtocolStringList
-      getInstanceTypesList() {
+  @java.lang.Override
+  public java.util.List<? extends com.clarifai.grpc.api.InstanceTypeOrBuilder> 
+      getInstanceTypesOrBuilderList() {
     return instanceTypes_;
   }
   /**
-   * <pre>
-   *&#47;///////////////////////////////////
-   * The instance types that will be available in this pool of nodes.
-   * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
-   * </pre>
-   *
-   * <code>repeated string instance_types = 8;</code>
-   * @return The count of instanceTypes.
+   * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
    */
+  @java.lang.Override
   public int getInstanceTypesCount() {
     return instanceTypes_.size();
   }
   /**
-   * <pre>
-   *&#47;///////////////////////////////////
-   * The instance types that will be available in this pool of nodes.
-   * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
-   * </pre>
-   *
-   * <code>repeated string instance_types = 8;</code>
-   * @param index The index of the element to return.
-   * @return The instanceTypes at the given index.
+   * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
    */
-  public java.lang.String getInstanceTypes(int index) {
+  @java.lang.Override
+  public com.clarifai.grpc.api.InstanceType getInstanceTypes(int index) {
     return instanceTypes_.get(index);
   }
   /**
-   * <pre>
-   *&#47;///////////////////////////////////
-   * The instance types that will be available in this pool of nodes.
-   * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
-   * </pre>
-   *
-   * <code>repeated string instance_types = 8;</code>
-   * @param index The index of the value to return.
-   * @return The bytes of the instanceTypes at the given index.
+   * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
    */
-  public com.google.protobuf.ByteString
-      getInstanceTypesBytes(int index) {
-    return instanceTypes_.getByteString(index);
+  @java.lang.Override
+  public com.clarifai.grpc.api.InstanceTypeOrBuilder getInstanceTypesOrBuilder(
+      int index) {
+    return instanceTypes_.get(index);
   }
 
   public static final int MIN_INSTANCES_FIELD_NUMBER = 9;
   private int minInstances_;
   /**
    * <pre>
-   * Minimum number of instances in this nodepool. This allows the nodeool to scale down to this
+   * Minimum number of instances in this nodepool. This allows the nodepool to scale down to this
    * amount. A nodepool needs a minimum of 1 instance.
    * </pre>
    *
@@ -568,6 +561,91 @@ public int getMaxInstances() {
     return maxInstances_;
   }
 
+  public static final int VISIBILITY_FIELD_NUMBER = 11;
+  private com.clarifai.grpc.api.Visibility visibility_;
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 11;</code>
+   * @return Whether the visibility field is set.
+   */
+  @java.lang.Override
+  public boolean hasVisibility() {
+    return visibility_ != null;
+  }
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 11;</code>
+   * @return The visibility.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.Visibility getVisibility() {
+    return visibility_ == null ? com.clarifai.grpc.api.Visibility.getDefaultInstance() : visibility_;
+  }
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 11;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.VisibilityOrBuilder getVisibilityOrBuilder() {
+    return getVisibility();
+  }
+
+  public static final int METADATA_FIELD_NUMBER = 12;
+  private com.google.protobuf.Struct metadata_;
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 12;</code>
+   * @return Whether the metadata field is set.
+   */
+  @java.lang.Override
+  public boolean hasMetadata() {
+    return metadata_ != null;
+  }
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 12;</code>
+   * @return The metadata.
+   */
+  @java.lang.Override
+  public com.google.protobuf.Struct getMetadata() {
+    return metadata_ == null ? com.google.protobuf.Struct.getDefaultInstance() : metadata_;
+  }
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 12;</code>
+   */
+  @java.lang.Override
+  public com.google.protobuf.StructOrBuilder getMetadataOrBuilder() {
+    return getMetadata();
+  }
+
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -582,25 +660,29 @@ public final boolean isInitialized() {
   @java.lang.Override
   public void writeTo(com.google.protobuf.CodedOutputStream output)
                       throws java.io.IOException {
-    getSerializedSize();
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
       com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
     }
-    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) {
-      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, userId_);
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, description_);
+    }
+    if (createdAt_ != null) {
+      output.writeMessage(3, getCreatedAt());
     }
-    if (cloudRegion_ != null) {
-      output.writeMessage(3, getCloudRegion());
+    if (modifiedAt_ != null) {
+      output.writeMessage(4, getModifiedAt());
     }
-    if (getCapacityTypesList().size() > 0) {
-      output.writeUInt32NoTag(34);
-      output.writeUInt32NoTag(capacityTypesMemoizedSerializedSize);
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 5, userId_);
+    }
+    if (computeCluster_ != null) {
+      output.writeMessage(6, getComputeCluster());
     }
-    for (int i = 0; i < capacityTypes_.size(); i++) {
-      output.writeEnumNoTag(capacityTypes_.get(i));
+    if (nodeCapacityType_ != null) {
+      output.writeMessage(7, getNodeCapacityType());
     }
     for (int i = 0; i < instanceTypes_.size(); i++) {
-      com.google.protobuf.GeneratedMessageV3.writeString(output, 8, instanceTypes_.getRaw(i));
+      output.writeMessage(8, instanceTypes_.get(i));
     }
     if (minInstances_ != 0) {
       output.writeUInt32(9, minInstances_);
@@ -608,6 +690,12 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (maxInstances_ != 0) {
       output.writeUInt32(10, maxInstances_);
     }
+    if (visibility_ != null) {
+      output.writeMessage(11, getVisibility());
+    }
+    if (metadata_ != null) {
+      output.writeMessage(12, getMetadata());
+    }
     unknownFields.writeTo(output);
   }
 
@@ -620,32 +708,31 @@ public int getSerializedSize() {
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(id_)) {
       size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, description_);
+    }
+    if (createdAt_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(3, getCreatedAt());
+    }
+    if (modifiedAt_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(4, getModifiedAt());
+    }
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) {
-      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, userId_);
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, userId_);
     }
-    if (cloudRegion_ != null) {
+    if (computeCluster_ != null) {
       size += com.google.protobuf.CodedOutputStream
-        .computeMessageSize(3, getCloudRegion());
+        .computeMessageSize(6, getComputeCluster());
     }
-    {
-      int dataSize = 0;
-      for (int i = 0; i < capacityTypes_.size(); i++) {
-        dataSize += com.google.protobuf.CodedOutputStream
-          .computeEnumSizeNoTag(capacityTypes_.get(i));
-      }
-      size += dataSize;
-      if (!getCapacityTypesList().isEmpty()) {  size += 1;
-        size += com.google.protobuf.CodedOutputStream
-          .computeUInt32SizeNoTag(dataSize);
-      }capacityTypesMemoizedSerializedSize = dataSize;
+    if (nodeCapacityType_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(7, getNodeCapacityType());
     }
-    {
-      int dataSize = 0;
-      for (int i = 0; i < instanceTypes_.size(); i++) {
-        dataSize += computeStringSizeNoTag(instanceTypes_.getRaw(i));
-      }
-      size += dataSize;
-      size += 1 * getInstanceTypesList().size();
+    for (int i = 0; i < instanceTypes_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(8, instanceTypes_.get(i));
     }
     if (minInstances_ != 0) {
       size += com.google.protobuf.CodedOutputStream
@@ -655,8 +742,16 @@ public int getSerializedSize() {
       size += com.google.protobuf.CodedOutputStream
         .computeUInt32Size(10, maxInstances_);
     }
-    size += unknownFields.getSerializedSize();
-    memoizedSize = size;
+    if (visibility_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(11, getVisibility());
+    }
+    if (metadata_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(12, getMetadata());
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
     return size;
   }
 
@@ -672,20 +767,46 @@ public boolean equals(final java.lang.Object obj) {
 
     if (!getId()
         .equals(other.getId())) return false;
+    if (!getDescription()
+        .equals(other.getDescription())) return false;
+    if (hasCreatedAt() != other.hasCreatedAt()) return false;
+    if (hasCreatedAt()) {
+      if (!getCreatedAt()
+          .equals(other.getCreatedAt())) return false;
+    }
+    if (hasModifiedAt() != other.hasModifiedAt()) return false;
+    if (hasModifiedAt()) {
+      if (!getModifiedAt()
+          .equals(other.getModifiedAt())) return false;
+    }
     if (!getUserId()
         .equals(other.getUserId())) return false;
-    if (hasCloudRegion() != other.hasCloudRegion()) return false;
-    if (hasCloudRegion()) {
-      if (!getCloudRegion()
-          .equals(other.getCloudRegion())) return false;
+    if (hasComputeCluster() != other.hasComputeCluster()) return false;
+    if (hasComputeCluster()) {
+      if (!getComputeCluster()
+          .equals(other.getComputeCluster())) return false;
+    }
+    if (hasNodeCapacityType() != other.hasNodeCapacityType()) return false;
+    if (hasNodeCapacityType()) {
+      if (!getNodeCapacityType()
+          .equals(other.getNodeCapacityType())) return false;
     }
-    if (!capacityTypes_.equals(other.capacityTypes_)) return false;
     if (!getInstanceTypesList()
         .equals(other.getInstanceTypesList())) return false;
     if (getMinInstances()
         != other.getMinInstances()) return false;
     if (getMaxInstances()
         != other.getMaxInstances()) return false;
+    if (hasVisibility() != other.hasVisibility()) return false;
+    if (hasVisibility()) {
+      if (!getVisibility()
+          .equals(other.getVisibility())) return false;
+    }
+    if (hasMetadata() != other.hasMetadata()) return false;
+    if (hasMetadata()) {
+      if (!getMetadata()
+          .equals(other.getMetadata())) return false;
+    }
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -699,15 +820,25 @@ public int hashCode() {
     hash = (19 * hash) + getDescriptor().hashCode();
     hash = (37 * hash) + ID_FIELD_NUMBER;
     hash = (53 * hash) + getId().hashCode();
+    hash = (37 * hash) + DESCRIPTION_FIELD_NUMBER;
+    hash = (53 * hash) + getDescription().hashCode();
+    if (hasCreatedAt()) {
+      hash = (37 * hash) + CREATED_AT_FIELD_NUMBER;
+      hash = (53 * hash) + getCreatedAt().hashCode();
+    }
+    if (hasModifiedAt()) {
+      hash = (37 * hash) + MODIFIED_AT_FIELD_NUMBER;
+      hash = (53 * hash) + getModifiedAt().hashCode();
+    }
     hash = (37 * hash) + USER_ID_FIELD_NUMBER;
     hash = (53 * hash) + getUserId().hashCode();
-    if (hasCloudRegion()) {
-      hash = (37 * hash) + CLOUD_REGION_FIELD_NUMBER;
-      hash = (53 * hash) + getCloudRegion().hashCode();
+    if (hasComputeCluster()) {
+      hash = (37 * hash) + COMPUTE_CLUSTER_FIELD_NUMBER;
+      hash = (53 * hash) + getComputeCluster().hashCode();
     }
-    if (getCapacityTypesCount() > 0) {
-      hash = (37 * hash) + CAPACITY_TYPES_FIELD_NUMBER;
-      hash = (53 * hash) + capacityTypes_.hashCode();
+    if (hasNodeCapacityType()) {
+      hash = (37 * hash) + NODE_CAPACITY_TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + getNodeCapacityType().hashCode();
     }
     if (getInstanceTypesCount() > 0) {
       hash = (37 * hash) + INSTANCE_TYPES_FIELD_NUMBER;
@@ -717,6 +848,14 @@ public int hashCode() {
     hash = (53 * hash) + getMinInstances();
     hash = (37 * hash) + MAX_INSTANCES_FIELD_NUMBER;
     hash = (53 * hash) + getMaxInstances();
+    if (hasVisibility()) {
+      hash = (37 * hash) + VISIBILITY_FIELD_NUMBER;
+      hash = (53 * hash) + getVisibility().hashCode();
+    }
+    if (hasMetadata()) {
+      hash = (37 * hash) + METADATA_FIELD_NUMBER;
+      hash = (53 * hash) + getMetadata().hashCode();
+    }
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -851,6 +990,7 @@ private Builder(
     private void maybeForceBuilderInitialization() {
       if (com.google.protobuf.GeneratedMessageV3
               .alwaysUseFieldBuilders) {
+        getInstanceTypesFieldBuilder();
       }
     }
     @java.lang.Override
@@ -858,22 +998,56 @@ public Builder clear() {
       super.clear();
       id_ = "";
 
+      description_ = "";
+
+      if (createdAtBuilder_ == null) {
+        createdAt_ = null;
+      } else {
+        createdAt_ = null;
+        createdAtBuilder_ = null;
+      }
+      if (modifiedAtBuilder_ == null) {
+        modifiedAt_ = null;
+      } else {
+        modifiedAt_ = null;
+        modifiedAtBuilder_ = null;
+      }
       userId_ = "";
 
-      if (cloudRegionBuilder_ == null) {
-        cloudRegion_ = null;
+      if (computeClusterBuilder_ == null) {
+        computeCluster_ = null;
+      } else {
+        computeCluster_ = null;
+        computeClusterBuilder_ = null;
+      }
+      if (nodeCapacityTypeBuilder_ == null) {
+        nodeCapacityType_ = null;
+      } else {
+        nodeCapacityType_ = null;
+        nodeCapacityTypeBuilder_ = null;
+      }
+      if (instanceTypesBuilder_ == null) {
+        instanceTypes_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
       } else {
-        cloudRegion_ = null;
-        cloudRegionBuilder_ = null;
+        instanceTypesBuilder_.clear();
       }
-      capacityTypes_ = java.util.Collections.emptyList();
-      bitField0_ = (bitField0_ & ~0x00000001);
-      instanceTypes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-      bitField0_ = (bitField0_ & ~0x00000002);
       minInstances_ = 0;
 
       maxInstances_ = 0;
 
+      if (visibilityBuilder_ == null) {
+        visibility_ = null;
+      } else {
+        visibility_ = null;
+        visibilityBuilder_ = null;
+      }
+      if (metadataBuilder_ == null) {
+        metadata_ = null;
+      } else {
+        metadata_ = null;
+        metadataBuilder_ = null;
+      }
       return this;
     }
 
@@ -902,24 +1076,49 @@ public com.clarifai.grpc.api.Nodepool buildPartial() {
       com.clarifai.grpc.api.Nodepool result = new com.clarifai.grpc.api.Nodepool(this);
       int from_bitField0_ = bitField0_;
       result.id_ = id_;
+      result.description_ = description_;
+      if (createdAtBuilder_ == null) {
+        result.createdAt_ = createdAt_;
+      } else {
+        result.createdAt_ = createdAtBuilder_.build();
+      }
+      if (modifiedAtBuilder_ == null) {
+        result.modifiedAt_ = modifiedAt_;
+      } else {
+        result.modifiedAt_ = modifiedAtBuilder_.build();
+      }
       result.userId_ = userId_;
-      if (cloudRegionBuilder_ == null) {
-        result.cloudRegion_ = cloudRegion_;
+      if (computeClusterBuilder_ == null) {
+        result.computeCluster_ = computeCluster_;
       } else {
-        result.cloudRegion_ = cloudRegionBuilder_.build();
+        result.computeCluster_ = computeClusterBuilder_.build();
       }
-      if (((bitField0_ & 0x00000001) != 0)) {
-        capacityTypes_ = java.util.Collections.unmodifiableList(capacityTypes_);
-        bitField0_ = (bitField0_ & ~0x00000001);
+      if (nodeCapacityTypeBuilder_ == null) {
+        result.nodeCapacityType_ = nodeCapacityType_;
+      } else {
+        result.nodeCapacityType_ = nodeCapacityTypeBuilder_.build();
       }
-      result.capacityTypes_ = capacityTypes_;
-      if (((bitField0_ & 0x00000002) != 0)) {
-        instanceTypes_ = instanceTypes_.getUnmodifiableView();
-        bitField0_ = (bitField0_ & ~0x00000002);
+      if (instanceTypesBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          instanceTypes_ = java.util.Collections.unmodifiableList(instanceTypes_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.instanceTypes_ = instanceTypes_;
+      } else {
+        result.instanceTypes_ = instanceTypesBuilder_.build();
       }
-      result.instanceTypes_ = instanceTypes_;
       result.minInstances_ = minInstances_;
       result.maxInstances_ = maxInstances_;
+      if (visibilityBuilder_ == null) {
+        result.visibility_ = visibility_;
+      } else {
+        result.visibility_ = visibilityBuilder_.build();
+      }
+      if (metadataBuilder_ == null) {
+        result.metadata_ = metadata_;
+      } else {
+        result.metadata_ = metadataBuilder_.build();
+      }
       onBuilt();
       return result;
     }
@@ -972,32 +1171,51 @@ public Builder mergeFrom(com.clarifai.grpc.api.Nodepool other) {
         id_ = other.id_;
         onChanged();
       }
+      if (!other.getDescription().isEmpty()) {
+        description_ = other.description_;
+        onChanged();
+      }
+      if (other.hasCreatedAt()) {
+        mergeCreatedAt(other.getCreatedAt());
+      }
+      if (other.hasModifiedAt()) {
+        mergeModifiedAt(other.getModifiedAt());
+      }
       if (!other.getUserId().isEmpty()) {
         userId_ = other.userId_;
         onChanged();
       }
-      if (other.hasCloudRegion()) {
-        mergeCloudRegion(other.getCloudRegion());
+      if (other.hasComputeCluster()) {
+        mergeComputeCluster(other.getComputeCluster());
       }
-      if (!other.capacityTypes_.isEmpty()) {
-        if (capacityTypes_.isEmpty()) {
-          capacityTypes_ = other.capacityTypes_;
-          bitField0_ = (bitField0_ & ~0x00000001);
-        } else {
-          ensureCapacityTypesIsMutable();
-          capacityTypes_.addAll(other.capacityTypes_);
-        }
-        onChanged();
+      if (other.hasNodeCapacityType()) {
+        mergeNodeCapacityType(other.getNodeCapacityType());
       }
-      if (!other.instanceTypes_.isEmpty()) {
-        if (instanceTypes_.isEmpty()) {
-          instanceTypes_ = other.instanceTypes_;
-          bitField0_ = (bitField0_ & ~0x00000002);
-        } else {
-          ensureInstanceTypesIsMutable();
-          instanceTypes_.addAll(other.instanceTypes_);
+      if (instanceTypesBuilder_ == null) {
+        if (!other.instanceTypes_.isEmpty()) {
+          if (instanceTypes_.isEmpty()) {
+            instanceTypes_ = other.instanceTypes_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureInstanceTypesIsMutable();
+            instanceTypes_.addAll(other.instanceTypes_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.instanceTypes_.isEmpty()) {
+          if (instanceTypesBuilder_.isEmpty()) {
+            instanceTypesBuilder_.dispose();
+            instanceTypesBuilder_ = null;
+            instanceTypes_ = other.instanceTypes_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            instanceTypesBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getInstanceTypesFieldBuilder() : null;
+          } else {
+            instanceTypesBuilder_.addAllMessages(other.instanceTypes_);
+          }
         }
-        onChanged();
       }
       if (other.getMinInstances() != 0) {
         setMinInstances(other.getMinInstances());
@@ -1005,6 +1223,12 @@ public Builder mergeFrom(com.clarifai.grpc.api.Nodepool other) {
       if (other.getMaxInstances() != 0) {
         setMaxInstances(other.getMaxInstances());
       }
+      if (other.hasVisibility()) {
+        mergeVisibility(other.getVisibility());
+      }
+      if (other.hasMetadata()) {
+        mergeMetadata(other.getMetadata());
+      }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
       return this;
@@ -1131,22 +1355,22 @@ public Builder setIdBytes(
       return this;
     }
 
-    private java.lang.Object userId_ = "";
+    private java.lang.Object description_ = "";
     /**
      * <pre>
-     * The user/org that this nodepool belongs to.
+     * Short description about the nodepool.
      * </pre>
      *
-     * <code>string user_id = 2;</code>
-     * @return The userId.
+     * <code>string description = 2;</code>
+     * @return The description.
      */
-    public java.lang.String getUserId() {
-      java.lang.Object ref = userId_;
+    public java.lang.String getDescription() {
+      java.lang.Object ref = description_;
       if (!(ref instanceof java.lang.String)) {
         com.google.protobuf.ByteString bs =
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        userId_ = s;
+        description_ = s;
         return s;
       } else {
         return (java.lang.String) ref;
@@ -1154,20 +1378,20 @@ public java.lang.String getUserId() {
     }
     /**
      * <pre>
-     * The user/org that this nodepool belongs to.
+     * Short description about the nodepool.
      * </pre>
      *
-     * <code>string user_id = 2;</code>
-     * @return The bytes for userId.
+     * <code>string description = 2;</code>
+     * @return The bytes for description.
      */
     public com.google.protobuf.ByteString
-        getUserIdBytes() {
-      java.lang.Object ref = userId_;
+        getDescriptionBytes() {
+      java.lang.Object ref = description_;
       if (ref instanceof String) {
         com.google.protobuf.ByteString b = 
             com.google.protobuf.ByteString.copyFromUtf8(
                 (java.lang.String) ref);
-        userId_ = b;
+        description_ = b;
         return b;
       } else {
         return (com.google.protobuf.ByteString) ref;
@@ -1175,554 +1399,1015 @@ public java.lang.String getUserId() {
     }
     /**
      * <pre>
-     * The user/org that this nodepool belongs to.
+     * Short description about the nodepool.
      * </pre>
      *
-     * <code>string user_id = 2;</code>
-     * @param value The userId to set.
+     * <code>string description = 2;</code>
+     * @param value The description to set.
      * @return This builder for chaining.
      */
-    public Builder setUserId(
+    public Builder setDescription(
         java.lang.String value) {
       if (value == null) {
     throw new NullPointerException();
   }
   
-      userId_ = value;
+      description_ = value;
       onChanged();
       return this;
     }
     /**
      * <pre>
-     * The user/org that this nodepool belongs to.
+     * Short description about the nodepool.
      * </pre>
      *
-     * <code>string user_id = 2;</code>
+     * <code>string description = 2;</code>
      * @return This builder for chaining.
      */
-    public Builder clearUserId() {
+    public Builder clearDescription() {
       
-      userId_ = getDefaultInstance().getUserId();
+      description_ = getDefaultInstance().getDescription();
       onChanged();
       return this;
     }
     /**
      * <pre>
-     * The user/org that this nodepool belongs to.
+     * Short description about the nodepool.
      * </pre>
      *
-     * <code>string user_id = 2;</code>
-     * @param value The bytes for userId to set.
+     * <code>string description = 2;</code>
+     * @param value The bytes for description to set.
      * @return This builder for chaining.
      */
-    public Builder setUserIdBytes(
+    public Builder setDescriptionBytes(
         com.google.protobuf.ByteString value) {
       if (value == null) {
     throw new NullPointerException();
   }
   checkByteStringIsUtf8(value);
       
-      userId_ = value;
+      description_ = value;
       onChanged();
       return this;
     }
 
-    private com.clarifai.grpc.api.CloudRegion cloudRegion_;
+    private com.google.protobuf.Timestamp createdAt_;
     private com.google.protobuf.SingleFieldBuilderV3<
-        com.clarifai.grpc.api.CloudRegion, com.clarifai.grpc.api.CloudRegion.Builder, com.clarifai.grpc.api.CloudRegionOrBuilder> cloudRegionBuilder_;
+        com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> createdAtBuilder_;
     /**
      * <pre>
-     * Which cloud region this nodepool is within.
+     * When the nodepool was created.
      * </pre>
      *
-     * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
-     * @return Whether the cloudRegion field is set.
+     * <code>.google.protobuf.Timestamp created_at = 3;</code>
+     * @return Whether the createdAt field is set.
      */
-    public boolean hasCloudRegion() {
-      return cloudRegionBuilder_ != null || cloudRegion_ != null;
+    public boolean hasCreatedAt() {
+      return createdAtBuilder_ != null || createdAt_ != null;
     }
     /**
      * <pre>
-     * Which cloud region this nodepool is within.
+     * When the nodepool was created.
      * </pre>
      *
-     * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
-     * @return The cloudRegion.
+     * <code>.google.protobuf.Timestamp created_at = 3;</code>
+     * @return The createdAt.
      */
-    public com.clarifai.grpc.api.CloudRegion getCloudRegion() {
-      if (cloudRegionBuilder_ == null) {
-        return cloudRegion_ == null ? com.clarifai.grpc.api.CloudRegion.getDefaultInstance() : cloudRegion_;
+    public com.google.protobuf.Timestamp getCreatedAt() {
+      if (createdAtBuilder_ == null) {
+        return createdAt_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : createdAt_;
       } else {
-        return cloudRegionBuilder_.getMessage();
+        return createdAtBuilder_.getMessage();
       }
     }
     /**
      * <pre>
-     * Which cloud region this nodepool is within.
+     * When the nodepool was created.
      * </pre>
      *
-     * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
+     * <code>.google.protobuf.Timestamp created_at = 3;</code>
      */
-    public Builder setCloudRegion(com.clarifai.grpc.api.CloudRegion value) {
-      if (cloudRegionBuilder_ == null) {
+    public Builder setCreatedAt(com.google.protobuf.Timestamp value) {
+      if (createdAtBuilder_ == null) {
         if (value == null) {
           throw new NullPointerException();
         }
-        cloudRegion_ = value;
+        createdAt_ = value;
         onChanged();
       } else {
-        cloudRegionBuilder_.setMessage(value);
+        createdAtBuilder_.setMessage(value);
       }
 
       return this;
     }
     /**
      * <pre>
-     * Which cloud region this nodepool is within.
+     * When the nodepool was created.
      * </pre>
      *
-     * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
+     * <code>.google.protobuf.Timestamp created_at = 3;</code>
      */
-    public Builder setCloudRegion(
-        com.clarifai.grpc.api.CloudRegion.Builder builderForValue) {
-      if (cloudRegionBuilder_ == null) {
-        cloudRegion_ = builderForValue.build();
+    public Builder setCreatedAt(
+        com.google.protobuf.Timestamp.Builder builderForValue) {
+      if (createdAtBuilder_ == null) {
+        createdAt_ = builderForValue.build();
         onChanged();
       } else {
-        cloudRegionBuilder_.setMessage(builderForValue.build());
+        createdAtBuilder_.setMessage(builderForValue.build());
       }
 
       return this;
     }
     /**
      * <pre>
-     * Which cloud region this nodepool is within.
+     * When the nodepool was created.
      * </pre>
      *
-     * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
+     * <code>.google.protobuf.Timestamp created_at = 3;</code>
      */
-    public Builder mergeCloudRegion(com.clarifai.grpc.api.CloudRegion value) {
-      if (cloudRegionBuilder_ == null) {
-        if (cloudRegion_ != null) {
-          cloudRegion_ =
-            com.clarifai.grpc.api.CloudRegion.newBuilder(cloudRegion_).mergeFrom(value).buildPartial();
+    public Builder mergeCreatedAt(com.google.protobuf.Timestamp value) {
+      if (createdAtBuilder_ == null) {
+        if (createdAt_ != null) {
+          createdAt_ =
+            com.google.protobuf.Timestamp.newBuilder(createdAt_).mergeFrom(value).buildPartial();
         } else {
-          cloudRegion_ = value;
+          createdAt_ = value;
         }
         onChanged();
       } else {
-        cloudRegionBuilder_.mergeFrom(value);
+        createdAtBuilder_.mergeFrom(value);
       }
 
       return this;
     }
     /**
      * <pre>
-     * Which cloud region this nodepool is within.
+     * When the nodepool was created.
      * </pre>
      *
-     * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
+     * <code>.google.protobuf.Timestamp created_at = 3;</code>
      */
-    public Builder clearCloudRegion() {
-      if (cloudRegionBuilder_ == null) {
-        cloudRegion_ = null;
+    public Builder clearCreatedAt() {
+      if (createdAtBuilder_ == null) {
+        createdAt_ = null;
         onChanged();
       } else {
-        cloudRegion_ = null;
-        cloudRegionBuilder_ = null;
+        createdAt_ = null;
+        createdAtBuilder_ = null;
       }
 
       return this;
     }
     /**
      * <pre>
-     * Which cloud region this nodepool is within.
+     * When the nodepool was created.
      * </pre>
      *
-     * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
+     * <code>.google.protobuf.Timestamp created_at = 3;</code>
      */
-    public com.clarifai.grpc.api.CloudRegion.Builder getCloudRegionBuilder() {
+    public com.google.protobuf.Timestamp.Builder getCreatedAtBuilder() {
       
       onChanged();
-      return getCloudRegionFieldBuilder().getBuilder();
+      return getCreatedAtFieldBuilder().getBuilder();
     }
     /**
      * <pre>
-     * Which cloud region this nodepool is within.
+     * When the nodepool was created.
      * </pre>
      *
-     * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
+     * <code>.google.protobuf.Timestamp created_at = 3;</code>
      */
-    public com.clarifai.grpc.api.CloudRegionOrBuilder getCloudRegionOrBuilder() {
-      if (cloudRegionBuilder_ != null) {
-        return cloudRegionBuilder_.getMessageOrBuilder();
+    public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
+      if (createdAtBuilder_ != null) {
+        return createdAtBuilder_.getMessageOrBuilder();
       } else {
-        return cloudRegion_ == null ?
-            com.clarifai.grpc.api.CloudRegion.getDefaultInstance() : cloudRegion_;
+        return createdAt_ == null ?
+            com.google.protobuf.Timestamp.getDefaultInstance() : createdAt_;
       }
     }
     /**
      * <pre>
-     * Which cloud region this nodepool is within.
+     * When the nodepool was created.
      * </pre>
      *
-     * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
+     * <code>.google.protobuf.Timestamp created_at = 3;</code>
      */
     private com.google.protobuf.SingleFieldBuilderV3<
-        com.clarifai.grpc.api.CloudRegion, com.clarifai.grpc.api.CloudRegion.Builder, com.clarifai.grpc.api.CloudRegionOrBuilder> 
-        getCloudRegionFieldBuilder() {
-      if (cloudRegionBuilder_ == null) {
-        cloudRegionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-            com.clarifai.grpc.api.CloudRegion, com.clarifai.grpc.api.CloudRegion.Builder, com.clarifai.grpc.api.CloudRegionOrBuilder>(
-                getCloudRegion(),
+        com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> 
+        getCreatedAtFieldBuilder() {
+      if (createdAtBuilder_ == null) {
+        createdAtBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>(
+                getCreatedAt(),
                 getParentForChildren(),
                 isClean());
-        cloudRegion_ = null;
+        createdAt_ = null;
       }
-      return cloudRegionBuilder_;
+      return createdAtBuilder_;
     }
 
-    private java.util.List<java.lang.Integer> capacityTypes_ =
-      java.util.Collections.emptyList();
-    private void ensureCapacityTypesIsMutable() {
-      if (!((bitField0_ & 0x00000001) != 0)) {
-        capacityTypes_ = new java.util.ArrayList<java.lang.Integer>(capacityTypes_);
-        bitField0_ |= 0x00000001;
-      }
-    }
-    /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @return A list containing the capacityTypes.
-     */
-    public java.util.List<com.clarifai.grpc.api.Nodepool.CapacityType> getCapacityTypesList() {
-      return new com.google.protobuf.Internal.ListAdapter<
-          java.lang.Integer, com.clarifai.grpc.api.Nodepool.CapacityType>(capacityTypes_, capacityTypes_converter_);
-    }
-    /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @return The count of capacityTypes.
-     */
-    public int getCapacityTypesCount() {
-      return capacityTypes_.size();
-    }
+    private com.google.protobuf.Timestamp modifiedAt_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> modifiedAtBuilder_;
     /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @param index The index of the element to return.
-     * @return The capacityTypes at the given index.
+     * <pre>
+     * When the nodepool was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 4;</code>
+     * @return Whether the modifiedAt field is set.
      */
-    public com.clarifai.grpc.api.Nodepool.CapacityType getCapacityTypes(int index) {
-      return capacityTypes_converter_.convert(capacityTypes_.get(index));
+    public boolean hasModifiedAt() {
+      return modifiedAtBuilder_ != null || modifiedAt_ != null;
     }
     /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @param index The index to set the value at.
-     * @param value The capacityTypes to set.
-     * @return This builder for chaining.
+     * <pre>
+     * When the nodepool was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 4;</code>
+     * @return The modifiedAt.
      */
-    public Builder setCapacityTypes(
-        int index, com.clarifai.grpc.api.Nodepool.CapacityType value) {
-      if (value == null) {
-        throw new NullPointerException();
+    public com.google.protobuf.Timestamp getModifiedAt() {
+      if (modifiedAtBuilder_ == null) {
+        return modifiedAt_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : modifiedAt_;
+      } else {
+        return modifiedAtBuilder_.getMessage();
       }
-      ensureCapacityTypesIsMutable();
-      capacityTypes_.set(index, value.getNumber());
-      onChanged();
-      return this;
     }
     /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @param value The capacityTypes to add.
-     * @return This builder for chaining.
+     * <pre>
+     * When the nodepool was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 4;</code>
      */
-    public Builder addCapacityTypes(com.clarifai.grpc.api.Nodepool.CapacityType value) {
-      if (value == null) {
-        throw new NullPointerException();
+    public Builder setModifiedAt(com.google.protobuf.Timestamp value) {
+      if (modifiedAtBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        modifiedAt_ = value;
+        onChanged();
+      } else {
+        modifiedAtBuilder_.setMessage(value);
       }
-      ensureCapacityTypesIsMutable();
-      capacityTypes_.add(value.getNumber());
-      onChanged();
+
       return this;
     }
     /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @param values The capacityTypes to add.
-     * @return This builder for chaining.
+     * <pre>
+     * When the nodepool was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 4;</code>
      */
-    public Builder addAllCapacityTypes(
-        java.lang.Iterable<? extends com.clarifai.grpc.api.Nodepool.CapacityType> values) {
-      ensureCapacityTypesIsMutable();
-      for (com.clarifai.grpc.api.Nodepool.CapacityType value : values) {
-        capacityTypes_.add(value.getNumber());
+    public Builder setModifiedAt(
+        com.google.protobuf.Timestamp.Builder builderForValue) {
+      if (modifiedAtBuilder_ == null) {
+        modifiedAt_ = builderForValue.build();
+        onChanged();
+      } else {
+        modifiedAtBuilder_.setMessage(builderForValue.build());
       }
-      onChanged();
-      return this;
-    }
-    /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @return This builder for chaining.
-     */
-    public Builder clearCapacityTypes() {
-      capacityTypes_ = java.util.Collections.emptyList();
-      bitField0_ = (bitField0_ & ~0x00000001);
-      onChanged();
-      return this;
-    }
-    /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @return A list containing the enum numeric values on the wire for capacityTypes.
-     */
-    public java.util.List<java.lang.Integer>
-    getCapacityTypesValueList() {
-      return java.util.Collections.unmodifiableList(capacityTypes_);
-    }
-    /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @param index The index of the value to return.
-     * @return The enum numeric value on the wire of capacityTypes at the given index.
-     */
-    public int getCapacityTypesValue(int index) {
-      return capacityTypes_.get(index);
-    }
-    /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @param index The index to set the value at.
-     * @param value The enum numeric value on the wire for capacityTypes to set.
-     * @return This builder for chaining.
-     */
-    public Builder setCapacityTypesValue(
-        int index, int value) {
-      ensureCapacityTypesIsMutable();
-      capacityTypes_.set(index, value);
-      onChanged();
+
       return this;
     }
     /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @param value The enum numeric value on the wire for capacityTypes to add.
-     * @return This builder for chaining.
+     * <pre>
+     * When the nodepool was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 4;</code>
      */
-    public Builder addCapacityTypesValue(int value) {
-      ensureCapacityTypesIsMutable();
-      capacityTypes_.add(value);
-      onChanged();
+    public Builder mergeModifiedAt(com.google.protobuf.Timestamp value) {
+      if (modifiedAtBuilder_ == null) {
+        if (modifiedAt_ != null) {
+          modifiedAt_ =
+            com.google.protobuf.Timestamp.newBuilder(modifiedAt_).mergeFrom(value).buildPartial();
+        } else {
+          modifiedAt_ = value;
+        }
+        onChanged();
+      } else {
+        modifiedAtBuilder_.mergeFrom(value);
+      }
+
       return this;
     }
     /**
-     * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-     * @param values The enum numeric values on the wire for capacityTypes to add.
-     * @return This builder for chaining.
+     * <pre>
+     * When the nodepool was last modified.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp modified_at = 4;</code>
      */
-    public Builder addAllCapacityTypesValue(
-        java.lang.Iterable<java.lang.Integer> values) {
-      ensureCapacityTypesIsMutable();
-      for (int value : values) {
-        capacityTypes_.add(value);
+    public Builder clearModifiedAt() {
+      if (modifiedAtBuilder_ == null) {
+        modifiedAt_ = null;
+        onChanged();
+      } else {
+        modifiedAt_ = null;
+        modifiedAtBuilder_ = null;
       }
-      onChanged();
-      return this;
-    }
 
-    private com.google.protobuf.LazyStringList instanceTypes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-    private void ensureInstanceTypesIsMutable() {
-      if (!((bitField0_ & 0x00000002) != 0)) {
-        instanceTypes_ = new com.google.protobuf.LazyStringArrayList(instanceTypes_);
-        bitField0_ |= 0x00000002;
-       }
+      return this;
     }
     /**
      * <pre>
-     *&#47;///////////////////////////////////
-     * The instance types that will be available in this pool of nodes.
-     * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+     * When the nodepool was last modified.
      * </pre>
      *
-     * <code>repeated string instance_types = 8;</code>
-     * @return A list containing the instanceTypes.
+     * <code>.google.protobuf.Timestamp modified_at = 4;</code>
      */
-    public com.google.protobuf.ProtocolStringList
-        getInstanceTypesList() {
-      return instanceTypes_.getUnmodifiableView();
+    public com.google.protobuf.Timestamp.Builder getModifiedAtBuilder() {
+      
+      onChanged();
+      return getModifiedAtFieldBuilder().getBuilder();
     }
     /**
      * <pre>
-     *&#47;///////////////////////////////////
-     * The instance types that will be available in this pool of nodes.
-     * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+     * When the nodepool was last modified.
      * </pre>
      *
-     * <code>repeated string instance_types = 8;</code>
-     * @return The count of instanceTypes.
+     * <code>.google.protobuf.Timestamp modified_at = 4;</code>
      */
-    public int getInstanceTypesCount() {
-      return instanceTypes_.size();
+    public com.google.protobuf.TimestampOrBuilder getModifiedAtOrBuilder() {
+      if (modifiedAtBuilder_ != null) {
+        return modifiedAtBuilder_.getMessageOrBuilder();
+      } else {
+        return modifiedAt_ == null ?
+            com.google.protobuf.Timestamp.getDefaultInstance() : modifiedAt_;
+      }
     }
     /**
      * <pre>
-     *&#47;///////////////////////////////////
-     * The instance types that will be available in this pool of nodes.
-     * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+     * When the nodepool was last modified.
      * </pre>
      *
-     * <code>repeated string instance_types = 8;</code>
-     * @param index The index of the element to return.
-     * @return The instanceTypes at the given index.
+     * <code>.google.protobuf.Timestamp modified_at = 4;</code>
      */
-    public java.lang.String getInstanceTypes(int index) {
-      return instanceTypes_.get(index);
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> 
+        getModifiedAtFieldBuilder() {
+      if (modifiedAtBuilder_ == null) {
+        modifiedAtBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>(
+                getModifiedAt(),
+                getParentForChildren(),
+                isClean());
+        modifiedAt_ = null;
+      }
+      return modifiedAtBuilder_;
     }
+
+    private java.lang.Object userId_ = "";
     /**
      * <pre>
-     *&#47;///////////////////////////////////
-     * The instance types that will be available in this pool of nodes.
-     * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+     * The user/org that this nodepool belongs to.
      * </pre>
      *
-     * <code>repeated string instance_types = 8;</code>
-     * @param index The index of the value to return.
-     * @return The bytes of the instanceTypes at the given index.
+     * <code>string user_id = 5;</code>
+     * @return The userId.
      */
-    public com.google.protobuf.ByteString
-        getInstanceTypesBytes(int index) {
-      return instanceTypes_.getByteString(index);
+    public java.lang.String getUserId() {
+      java.lang.Object ref = userId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        userId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
     }
     /**
      * <pre>
-     *&#47;///////////////////////////////////
-     * The instance types that will be available in this pool of nodes.
-     * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+     * The user/org that this nodepool belongs to.
      * </pre>
      *
-     * <code>repeated string instance_types = 8;</code>
-     * @param index The index to set the value at.
-     * @param value The instanceTypes to set.
-     * @return This builder for chaining.
+     * <code>string user_id = 5;</code>
+     * @return The bytes for userId.
      */
-    public Builder setInstanceTypes(
-        int index, java.lang.String value) {
-      if (value == null) {
-    throw new NullPointerException();
-  }
-  ensureInstanceTypesIsMutable();
-      instanceTypes_.set(index, value);
-      onChanged();
-      return this;
+    public com.google.protobuf.ByteString
+        getUserIdBytes() {
+      java.lang.Object ref = userId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        userId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
     /**
      * <pre>
-     *&#47;///////////////////////////////////
-     * The instance types that will be available in this pool of nodes.
-     * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+     * The user/org that this nodepool belongs to.
      * </pre>
      *
-     * <code>repeated string instance_types = 8;</code>
-     * @param value The instanceTypes to add.
+     * <code>string user_id = 5;</code>
+     * @param value The userId to set.
      * @return This builder for chaining.
      */
-    public Builder addInstanceTypes(
+    public Builder setUserId(
         java.lang.String value) {
       if (value == null) {
     throw new NullPointerException();
   }
-  ensureInstanceTypesIsMutable();
-      instanceTypes_.add(value);
-      onChanged();
-      return this;
-    }
-    /**
-     * <pre>
-     *&#47;///////////////////////////////////
-     * The instance types that will be available in this pool of nodes.
-     * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
-     * </pre>
-     *
-     * <code>repeated string instance_types = 8;</code>
-     * @param values The instanceTypes to add.
-     * @return This builder for chaining.
-     */
-    public Builder addAllInstanceTypes(
-        java.lang.Iterable<java.lang.String> values) {
-      ensureInstanceTypesIsMutable();
-      com.google.protobuf.AbstractMessageLite.Builder.addAll(
-          values, instanceTypes_);
+  
+      userId_ = value;
       onChanged();
       return this;
     }
     /**
      * <pre>
-     *&#47;///////////////////////////////////
-     * The instance types that will be available in this pool of nodes.
-     * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+     * The user/org that this nodepool belongs to.
      * </pre>
      *
-     * <code>repeated string instance_types = 8;</code>
+     * <code>string user_id = 5;</code>
      * @return This builder for chaining.
      */
-    public Builder clearInstanceTypes() {
-      instanceTypes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-      bitField0_ = (bitField0_ & ~0x00000002);
+    public Builder clearUserId() {
+      
+      userId_ = getDefaultInstance().getUserId();
       onChanged();
       return this;
     }
     /**
      * <pre>
-     *&#47;///////////////////////////////////
-     * The instance types that will be available in this pool of nodes.
-     * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+     * The user/org that this nodepool belongs to.
      * </pre>
      *
-     * <code>repeated string instance_types = 8;</code>
-     * @param value The bytes of the instanceTypes to add.
+     * <code>string user_id = 5;</code>
+     * @param value The bytes for userId to set.
      * @return This builder for chaining.
      */
-    public Builder addInstanceTypesBytes(
+    public Builder setUserIdBytes(
         com.google.protobuf.ByteString value) {
       if (value == null) {
     throw new NullPointerException();
   }
   checkByteStringIsUtf8(value);
-      ensureInstanceTypesIsMutable();
-      instanceTypes_.add(value);
+      
+      userId_ = value;
       onChanged();
       return this;
     }
 
-    private int minInstances_ ;
+    private com.clarifai.grpc.api.ComputeCluster computeCluster_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder> computeClusterBuilder_;
     /**
      * <pre>
-     * Minimum number of instances in this nodepool. This allows the nodeool to scale down to this
-     * amount. A nodepool needs a minimum of 1 instance.
+     * Which cluster this nodepool is within.
      * </pre>
      *
-     * <code>uint32 min_instances = 9;</code>
-     * @return The minInstances.
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+     * @return Whether the computeCluster field is set.
      */
-    @java.lang.Override
-    public int getMinInstances() {
-      return minInstances_;
+    public boolean hasComputeCluster() {
+      return computeClusterBuilder_ != null || computeCluster_ != null;
     }
     /**
      * <pre>
-     * Minimum number of instances in this nodepool. This allows the nodeool to scale down to this
-     * amount. A nodepool needs a minimum of 1 instance.
+     * Which cluster this nodepool is within.
      * </pre>
      *
-     * <code>uint32 min_instances = 9;</code>
-     * @param value The minInstances to set.
-     * @return This builder for chaining.
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+     * @return The computeCluster.
      */
-    public Builder setMinInstances(int value) {
-      
-      minInstances_ = value;
-      onChanged();
-      return this;
+    public com.clarifai.grpc.api.ComputeCluster getComputeCluster() {
+      if (computeClusterBuilder_ == null) {
+        return computeCluster_ == null ? com.clarifai.grpc.api.ComputeCluster.getDefaultInstance() : computeCluster_;
+      } else {
+        return computeClusterBuilder_.getMessage();
+      }
     }
     /**
      * <pre>
-     * Minimum number of instances in this nodepool. This allows the nodeool to scale down to this
-     * amount. A nodepool needs a minimum of 1 instance.
+     * Which cluster this nodepool is within.
      * </pre>
      *
-     * <code>uint32 min_instances = 9;</code>
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+     */
+    public Builder setComputeCluster(com.clarifai.grpc.api.ComputeCluster value) {
+      if (computeClusterBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        computeCluster_ = value;
+        onChanged();
+      } else {
+        computeClusterBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Which cluster this nodepool is within.
+     * </pre>
+     *
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+     */
+    public Builder setComputeCluster(
+        com.clarifai.grpc.api.ComputeCluster.Builder builderForValue) {
+      if (computeClusterBuilder_ == null) {
+        computeCluster_ = builderForValue.build();
+        onChanged();
+      } else {
+        computeClusterBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Which cluster this nodepool is within.
+     * </pre>
+     *
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+     */
+    public Builder mergeComputeCluster(com.clarifai.grpc.api.ComputeCluster value) {
+      if (computeClusterBuilder_ == null) {
+        if (computeCluster_ != null) {
+          computeCluster_ =
+            com.clarifai.grpc.api.ComputeCluster.newBuilder(computeCluster_).mergeFrom(value).buildPartial();
+        } else {
+          computeCluster_ = value;
+        }
+        onChanged();
+      } else {
+        computeClusterBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Which cluster this nodepool is within.
+     * </pre>
+     *
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+     */
+    public Builder clearComputeCluster() {
+      if (computeClusterBuilder_ == null) {
+        computeCluster_ = null;
+        onChanged();
+      } else {
+        computeCluster_ = null;
+        computeClusterBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Which cluster this nodepool is within.
+     * </pre>
+     *
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+     */
+    public com.clarifai.grpc.api.ComputeCluster.Builder getComputeClusterBuilder() {
+      
+      onChanged();
+      return getComputeClusterFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * Which cluster this nodepool is within.
+     * </pre>
+     *
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+     */
+    public com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClusterOrBuilder() {
+      if (computeClusterBuilder_ != null) {
+        return computeClusterBuilder_.getMessageOrBuilder();
+      } else {
+        return computeCluster_ == null ?
+            com.clarifai.grpc.api.ComputeCluster.getDefaultInstance() : computeCluster_;
+      }
+    }
+    /**
+     * <pre>
+     * Which cluster this nodepool is within.
+     * </pre>
+     *
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder> 
+        getComputeClusterFieldBuilder() {
+      if (computeClusterBuilder_ == null) {
+        computeClusterBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder>(
+                getComputeCluster(),
+                getParentForChildren(),
+                isClean());
+        computeCluster_ = null;
+      }
+      return computeClusterBuilder_;
+    }
+
+    private com.clarifai.grpc.api.NodeCapacityType nodeCapacityType_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.NodeCapacityType, com.clarifai.grpc.api.NodeCapacityType.Builder, com.clarifai.grpc.api.NodeCapacityTypeOrBuilder> nodeCapacityTypeBuilder_;
+    /**
+     * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+     * @return Whether the nodeCapacityType field is set.
+     */
+    public boolean hasNodeCapacityType() {
+      return nodeCapacityTypeBuilder_ != null || nodeCapacityType_ != null;
+    }
+    /**
+     * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+     * @return The nodeCapacityType.
+     */
+    public com.clarifai.grpc.api.NodeCapacityType getNodeCapacityType() {
+      if (nodeCapacityTypeBuilder_ == null) {
+        return nodeCapacityType_ == null ? com.clarifai.grpc.api.NodeCapacityType.getDefaultInstance() : nodeCapacityType_;
+      } else {
+        return nodeCapacityTypeBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+     */
+    public Builder setNodeCapacityType(com.clarifai.grpc.api.NodeCapacityType value) {
+      if (nodeCapacityTypeBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        nodeCapacityType_ = value;
+        onChanged();
+      } else {
+        nodeCapacityTypeBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+     */
+    public Builder setNodeCapacityType(
+        com.clarifai.grpc.api.NodeCapacityType.Builder builderForValue) {
+      if (nodeCapacityTypeBuilder_ == null) {
+        nodeCapacityType_ = builderForValue.build();
+        onChanged();
+      } else {
+        nodeCapacityTypeBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+     */
+    public Builder mergeNodeCapacityType(com.clarifai.grpc.api.NodeCapacityType value) {
+      if (nodeCapacityTypeBuilder_ == null) {
+        if (nodeCapacityType_ != null) {
+          nodeCapacityType_ =
+            com.clarifai.grpc.api.NodeCapacityType.newBuilder(nodeCapacityType_).mergeFrom(value).buildPartial();
+        } else {
+          nodeCapacityType_ = value;
+        }
+        onChanged();
+      } else {
+        nodeCapacityTypeBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+     */
+    public Builder clearNodeCapacityType() {
+      if (nodeCapacityTypeBuilder_ == null) {
+        nodeCapacityType_ = null;
+        onChanged();
+      } else {
+        nodeCapacityType_ = null;
+        nodeCapacityTypeBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+     */
+    public com.clarifai.grpc.api.NodeCapacityType.Builder getNodeCapacityTypeBuilder() {
+      
+      onChanged();
+      return getNodeCapacityTypeFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+     */
+    public com.clarifai.grpc.api.NodeCapacityTypeOrBuilder getNodeCapacityTypeOrBuilder() {
+      if (nodeCapacityTypeBuilder_ != null) {
+        return nodeCapacityTypeBuilder_.getMessageOrBuilder();
+      } else {
+        return nodeCapacityType_ == null ?
+            com.clarifai.grpc.api.NodeCapacityType.getDefaultInstance() : nodeCapacityType_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.NodeCapacityType, com.clarifai.grpc.api.NodeCapacityType.Builder, com.clarifai.grpc.api.NodeCapacityTypeOrBuilder> 
+        getNodeCapacityTypeFieldBuilder() {
+      if (nodeCapacityTypeBuilder_ == null) {
+        nodeCapacityTypeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.NodeCapacityType, com.clarifai.grpc.api.NodeCapacityType.Builder, com.clarifai.grpc.api.NodeCapacityTypeOrBuilder>(
+                getNodeCapacityType(),
+                getParentForChildren(),
+                isClean());
+        nodeCapacityType_ = null;
+      }
+      return nodeCapacityTypeBuilder_;
+    }
+
+    private java.util.List<com.clarifai.grpc.api.InstanceType> instanceTypes_ =
+      java.util.Collections.emptyList();
+    private void ensureInstanceTypesIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        instanceTypes_ = new java.util.ArrayList<com.clarifai.grpc.api.InstanceType>(instanceTypes_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.InstanceType, com.clarifai.grpc.api.InstanceType.Builder, com.clarifai.grpc.api.InstanceTypeOrBuilder> instanceTypesBuilder_;
+
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.InstanceType> getInstanceTypesList() {
+      if (instanceTypesBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(instanceTypes_);
+      } else {
+        return instanceTypesBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public int getInstanceTypesCount() {
+      if (instanceTypesBuilder_ == null) {
+        return instanceTypes_.size();
+      } else {
+        return instanceTypesBuilder_.getCount();
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public com.clarifai.grpc.api.InstanceType getInstanceTypes(int index) {
+      if (instanceTypesBuilder_ == null) {
+        return instanceTypes_.get(index);
+      } else {
+        return instanceTypesBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public Builder setInstanceTypes(
+        int index, com.clarifai.grpc.api.InstanceType value) {
+      if (instanceTypesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureInstanceTypesIsMutable();
+        instanceTypes_.set(index, value);
+        onChanged();
+      } else {
+        instanceTypesBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public Builder setInstanceTypes(
+        int index, com.clarifai.grpc.api.InstanceType.Builder builderForValue) {
+      if (instanceTypesBuilder_ == null) {
+        ensureInstanceTypesIsMutable();
+        instanceTypes_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        instanceTypesBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public Builder addInstanceTypes(com.clarifai.grpc.api.InstanceType value) {
+      if (instanceTypesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureInstanceTypesIsMutable();
+        instanceTypes_.add(value);
+        onChanged();
+      } else {
+        instanceTypesBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public Builder addInstanceTypes(
+        int index, com.clarifai.grpc.api.InstanceType value) {
+      if (instanceTypesBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureInstanceTypesIsMutable();
+        instanceTypes_.add(index, value);
+        onChanged();
+      } else {
+        instanceTypesBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public Builder addInstanceTypes(
+        com.clarifai.grpc.api.InstanceType.Builder builderForValue) {
+      if (instanceTypesBuilder_ == null) {
+        ensureInstanceTypesIsMutable();
+        instanceTypes_.add(builderForValue.build());
+        onChanged();
+      } else {
+        instanceTypesBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public Builder addInstanceTypes(
+        int index, com.clarifai.grpc.api.InstanceType.Builder builderForValue) {
+      if (instanceTypesBuilder_ == null) {
+        ensureInstanceTypesIsMutable();
+        instanceTypes_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        instanceTypesBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public Builder addAllInstanceTypes(
+        java.lang.Iterable<? extends com.clarifai.grpc.api.InstanceType> values) {
+      if (instanceTypesBuilder_ == null) {
+        ensureInstanceTypesIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, instanceTypes_);
+        onChanged();
+      } else {
+        instanceTypesBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public Builder clearInstanceTypes() {
+      if (instanceTypesBuilder_ == null) {
+        instanceTypes_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        instanceTypesBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public Builder removeInstanceTypes(int index) {
+      if (instanceTypesBuilder_ == null) {
+        ensureInstanceTypesIsMutable();
+        instanceTypes_.remove(index);
+        onChanged();
+      } else {
+        instanceTypesBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public com.clarifai.grpc.api.InstanceType.Builder getInstanceTypesBuilder(
+        int index) {
+      return getInstanceTypesFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public com.clarifai.grpc.api.InstanceTypeOrBuilder getInstanceTypesOrBuilder(
+        int index) {
+      if (instanceTypesBuilder_ == null) {
+        return instanceTypes_.get(index);  } else {
+        return instanceTypesBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public java.util.List<? extends com.clarifai.grpc.api.InstanceTypeOrBuilder> 
+         getInstanceTypesOrBuilderList() {
+      if (instanceTypesBuilder_ != null) {
+        return instanceTypesBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(instanceTypes_);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public com.clarifai.grpc.api.InstanceType.Builder addInstanceTypesBuilder() {
+      return getInstanceTypesFieldBuilder().addBuilder(
+          com.clarifai.grpc.api.InstanceType.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public com.clarifai.grpc.api.InstanceType.Builder addInstanceTypesBuilder(
+        int index) {
+      return getInstanceTypesFieldBuilder().addBuilder(
+          index, com.clarifai.grpc.api.InstanceType.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.InstanceType.Builder> 
+         getInstanceTypesBuilderList() {
+      return getInstanceTypesFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.InstanceType, com.clarifai.grpc.api.InstanceType.Builder, com.clarifai.grpc.api.InstanceTypeOrBuilder> 
+        getInstanceTypesFieldBuilder() {
+      if (instanceTypesBuilder_ == null) {
+        instanceTypesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.clarifai.grpc.api.InstanceType, com.clarifai.grpc.api.InstanceType.Builder, com.clarifai.grpc.api.InstanceTypeOrBuilder>(
+                instanceTypes_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        instanceTypes_ = null;
+      }
+      return instanceTypesBuilder_;
+    }
+
+    private int minInstances_ ;
+    /**
+     * <pre>
+     * Minimum number of instances in this nodepool. This allows the nodepool to scale down to this
+     * amount. A nodepool needs a minimum of 1 instance.
+     * </pre>
+     *
+     * <code>uint32 min_instances = 9;</code>
+     * @return The minInstances.
+     */
+    @java.lang.Override
+    public int getMinInstances() {
+      return minInstances_;
+    }
+    /**
+     * <pre>
+     * Minimum number of instances in this nodepool. This allows the nodepool to scale down to this
+     * amount. A nodepool needs a minimum of 1 instance.
+     * </pre>
+     *
+     * <code>uint32 min_instances = 9;</code>
+     * @param value The minInstances to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMinInstances(int value) {
+      
+      minInstances_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Minimum number of instances in this nodepool. This allows the nodepool to scale down to this
+     * amount. A nodepool needs a minimum of 1 instance.
+     * </pre>
+     *
+     * <code>uint32 min_instances = 9;</code>
      * @return This builder for chaining.
      */
     public Builder clearMinInstances() {
@@ -1777,6 +2462,343 @@ public Builder clearMaxInstances() {
       onChanged();
       return this;
     }
+
+    private com.clarifai.grpc.api.Visibility visibility_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.Visibility, com.clarifai.grpc.api.Visibility.Builder, com.clarifai.grpc.api.VisibilityOrBuilder> visibilityBuilder_;
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 11;</code>
+     * @return Whether the visibility field is set.
+     */
+    public boolean hasVisibility() {
+      return visibilityBuilder_ != null || visibility_ != null;
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 11;</code>
+     * @return The visibility.
+     */
+    public com.clarifai.grpc.api.Visibility getVisibility() {
+      if (visibilityBuilder_ == null) {
+        return visibility_ == null ? com.clarifai.grpc.api.Visibility.getDefaultInstance() : visibility_;
+      } else {
+        return visibilityBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 11;</code>
+     */
+    public Builder setVisibility(com.clarifai.grpc.api.Visibility value) {
+      if (visibilityBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        visibility_ = value;
+        onChanged();
+      } else {
+        visibilityBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 11;</code>
+     */
+    public Builder setVisibility(
+        com.clarifai.grpc.api.Visibility.Builder builderForValue) {
+      if (visibilityBuilder_ == null) {
+        visibility_ = builderForValue.build();
+        onChanged();
+      } else {
+        visibilityBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 11;</code>
+     */
+    public Builder mergeVisibility(com.clarifai.grpc.api.Visibility value) {
+      if (visibilityBuilder_ == null) {
+        if (visibility_ != null) {
+          visibility_ =
+            com.clarifai.grpc.api.Visibility.newBuilder(visibility_).mergeFrom(value).buildPartial();
+        } else {
+          visibility_ = value;
+        }
+        onChanged();
+      } else {
+        visibilityBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 11;</code>
+     */
+    public Builder clearVisibility() {
+      if (visibilityBuilder_ == null) {
+        visibility_ = null;
+        onChanged();
+      } else {
+        visibility_ = null;
+        visibilityBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 11;</code>
+     */
+    public com.clarifai.grpc.api.Visibility.Builder getVisibilityBuilder() {
+      
+      onChanged();
+      return getVisibilityFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 11;</code>
+     */
+    public com.clarifai.grpc.api.VisibilityOrBuilder getVisibilityOrBuilder() {
+      if (visibilityBuilder_ != null) {
+        return visibilityBuilder_.getMessageOrBuilder();
+      } else {
+        return visibility_ == null ?
+            com.clarifai.grpc.api.Visibility.getDefaultInstance() : visibility_;
+      }
+    }
+    /**
+     * <pre>
+     * The visibility field represents whether this message is privately/publicly visible.
+     * To be visible to the public the App that contains it AND the User that contains the App must
+     * also be publicly visible.
+     * </pre>
+     *
+     * <code>.clarifai.api.Visibility visibility = 11;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.Visibility, com.clarifai.grpc.api.Visibility.Builder, com.clarifai.grpc.api.VisibilityOrBuilder> 
+        getVisibilityFieldBuilder() {
+      if (visibilityBuilder_ == null) {
+        visibilityBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.Visibility, com.clarifai.grpc.api.Visibility.Builder, com.clarifai.grpc.api.VisibilityOrBuilder>(
+                getVisibility(),
+                getParentForChildren(),
+                isClean());
+        visibility_ = null;
+      }
+      return visibilityBuilder_;
+    }
+
+    private com.google.protobuf.Struct metadata_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Struct, com.google.protobuf.Struct.Builder, com.google.protobuf.StructOrBuilder> metadataBuilder_;
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 12;</code>
+     * @return Whether the metadata field is set.
+     */
+    public boolean hasMetadata() {
+      return metadataBuilder_ != null || metadata_ != null;
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 12;</code>
+     * @return The metadata.
+     */
+    public com.google.protobuf.Struct getMetadata() {
+      if (metadataBuilder_ == null) {
+        return metadata_ == null ? com.google.protobuf.Struct.getDefaultInstance() : metadata_;
+      } else {
+        return metadataBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 12;</code>
+     */
+    public Builder setMetadata(com.google.protobuf.Struct value) {
+      if (metadataBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        metadata_ = value;
+        onChanged();
+      } else {
+        metadataBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 12;</code>
+     */
+    public Builder setMetadata(
+        com.google.protobuf.Struct.Builder builderForValue) {
+      if (metadataBuilder_ == null) {
+        metadata_ = builderForValue.build();
+        onChanged();
+      } else {
+        metadataBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 12;</code>
+     */
+    public Builder mergeMetadata(com.google.protobuf.Struct value) {
+      if (metadataBuilder_ == null) {
+        if (metadata_ != null) {
+          metadata_ =
+            com.google.protobuf.Struct.newBuilder(metadata_).mergeFrom(value).buildPartial();
+        } else {
+          metadata_ = value;
+        }
+        onChanged();
+      } else {
+        metadataBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 12;</code>
+     */
+    public Builder clearMetadata() {
+      if (metadataBuilder_ == null) {
+        metadata_ = null;
+        onChanged();
+      } else {
+        metadata_ = null;
+        metadataBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 12;</code>
+     */
+    public com.google.protobuf.Struct.Builder getMetadataBuilder() {
+      
+      onChanged();
+      return getMetadataFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 12;</code>
+     */
+    public com.google.protobuf.StructOrBuilder getMetadataOrBuilder() {
+      if (metadataBuilder_ != null) {
+        return metadataBuilder_.getMessageOrBuilder();
+      } else {
+        return metadata_ == null ?
+            com.google.protobuf.Struct.getDefaultInstance() : metadata_;
+      }
+    }
+    /**
+     * <pre>
+     * To handle arbitrary json metadata:
+     * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+     * </pre>
+     *
+     * <code>.google.protobuf.Struct metadata = 12;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Struct, com.google.protobuf.Struct.Builder, com.google.protobuf.StructOrBuilder> 
+        getMetadataFieldBuilder() {
+      if (metadataBuilder_ == null) {
+        metadataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Struct, com.google.protobuf.Struct.Builder, com.google.protobuf.StructOrBuilder>(
+                getMetadata(),
+                getParentForChildren(),
+                isClean());
+        metadata_ = null;
+      }
+      return metadataBuilder_;
+    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {
diff --git a/src/main/java/com/clarifai/grpc/api/NodepoolOrBuilder.java b/src/main/java/com/clarifai/grpc/api/NodepoolOrBuilder.java
index 4aa05ee..96a9a75 100644
--- a/src/main/java/com/clarifai/grpc/api/NodepoolOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/NodepoolOrBuilder.java
@@ -29,132 +29,167 @@ public interface NodepoolOrBuilder extends
 
   /**
    * <pre>
-   * The user/org that this nodepool belongs to.
+   * Short description about the nodepool.
    * </pre>
    *
-   * <code>string user_id = 2;</code>
-   * @return The userId.
+   * <code>string description = 2;</code>
+   * @return The description.
    */
-  java.lang.String getUserId();
+  java.lang.String getDescription();
   /**
    * <pre>
-   * The user/org that this nodepool belongs to.
+   * Short description about the nodepool.
    * </pre>
    *
-   * <code>string user_id = 2;</code>
-   * @return The bytes for userId.
+   * <code>string description = 2;</code>
+   * @return The bytes for description.
    */
   com.google.protobuf.ByteString
-      getUserIdBytes();
+      getDescriptionBytes();
 
   /**
    * <pre>
-   * Which cloud region this nodepool is within.
+   * When the nodepool was created.
    * </pre>
    *
-   * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
-   * @return Whether the cloudRegion field is set.
+   * <code>.google.protobuf.Timestamp created_at = 3;</code>
+   * @return Whether the createdAt field is set.
    */
-  boolean hasCloudRegion();
+  boolean hasCreatedAt();
   /**
    * <pre>
-   * Which cloud region this nodepool is within.
+   * When the nodepool was created.
    * </pre>
    *
-   * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
-   * @return The cloudRegion.
+   * <code>.google.protobuf.Timestamp created_at = 3;</code>
+   * @return The createdAt.
    */
-  com.clarifai.grpc.api.CloudRegion getCloudRegion();
+  com.google.protobuf.Timestamp getCreatedAt();
   /**
    * <pre>
-   * Which cloud region this nodepool is within.
+   * When the nodepool was created.
    * </pre>
    *
-   * <code>.clarifai.api.CloudRegion cloud_region = 3;</code>
+   * <code>.google.protobuf.Timestamp created_at = 3;</code>
    */
-  com.clarifai.grpc.api.CloudRegionOrBuilder getCloudRegionOrBuilder();
+  com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder();
 
   /**
-   * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-   * @return A list containing the capacityTypes.
-   */
-  java.util.List<com.clarifai.grpc.api.Nodepool.CapacityType> getCapacityTypesList();
-  /**
-   * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-   * @return The count of capacityTypes.
+   * <pre>
+   * When the nodepool was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 4;</code>
+   * @return Whether the modifiedAt field is set.
    */
-  int getCapacityTypesCount();
+  boolean hasModifiedAt();
   /**
-   * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-   * @param index The index of the element to return.
-   * @return The capacityTypes at the given index.
+   * <pre>
+   * When the nodepool was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 4;</code>
+   * @return The modifiedAt.
    */
-  com.clarifai.grpc.api.Nodepool.CapacityType getCapacityTypes(int index);
+  com.google.protobuf.Timestamp getModifiedAt();
   /**
-   * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-   * @return A list containing the enum numeric values on the wire for capacityTypes.
+   * <pre>
+   * When the nodepool was last modified.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp modified_at = 4;</code>
    */
-  java.util.List<java.lang.Integer>
-  getCapacityTypesValueList();
+  com.google.protobuf.TimestampOrBuilder getModifiedAtOrBuilder();
+
   /**
-   * <code>repeated .clarifai.api.Nodepool.CapacityType capacity_types = 4;</code>
-   * @param index The index of the value to return.
-   * @return The enum numeric value on the wire of capacityTypes at the given index.
+   * <pre>
+   * The user/org that this nodepool belongs to.
+   * </pre>
+   *
+   * <code>string user_id = 5;</code>
+   * @return The userId.
    */
-  int getCapacityTypesValue(int index);
-
+  java.lang.String getUserId();
   /**
    * <pre>
-   *&#47;///////////////////////////////////
-   * The instance types that will be available in this pool of nodes.
-   * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+   * The user/org that this nodepool belongs to.
    * </pre>
    *
-   * <code>repeated string instance_types = 8;</code>
-   * @return A list containing the instanceTypes.
+   * <code>string user_id = 5;</code>
+   * @return The bytes for userId.
    */
-  java.util.List<java.lang.String>
-      getInstanceTypesList();
+  com.google.protobuf.ByteString
+      getUserIdBytes();
+
   /**
    * <pre>
-   *&#47;///////////////////////////////////
-   * The instance types that will be available in this pool of nodes.
-   * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+   * Which cluster this nodepool is within.
    * </pre>
    *
-   * <code>repeated string instance_types = 8;</code>
-   * @return The count of instanceTypes.
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+   * @return Whether the computeCluster field is set.
    */
-  int getInstanceTypesCount();
+  boolean hasComputeCluster();
   /**
    * <pre>
-   *&#47;///////////////////////////////////
-   * The instance types that will be available in this pool of nodes.
-   * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+   * Which cluster this nodepool is within.
    * </pre>
    *
-   * <code>repeated string instance_types = 8;</code>
-   * @param index The index of the element to return.
-   * @return The instanceTypes at the given index.
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
+   * @return The computeCluster.
    */
-  java.lang.String getInstanceTypes(int index);
+  com.clarifai.grpc.api.ComputeCluster getComputeCluster();
   /**
    * <pre>
-   *&#47;///////////////////////////////////
-   * The instance types that will be available in this pool of nodes.
-   * Clarifai offers multiple different choices that combine cpu cores, memory and accelerator.
+   * Which cluster this nodepool is within.
    * </pre>
    *
-   * <code>repeated string instance_types = 8;</code>
-   * @param index The index of the value to return.
-   * @return The bytes of the instanceTypes at the given index.
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 6;</code>
    */
-  com.google.protobuf.ByteString
-      getInstanceTypesBytes(int index);
+  com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClusterOrBuilder();
+
+  /**
+   * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+   * @return Whether the nodeCapacityType field is set.
+   */
+  boolean hasNodeCapacityType();
+  /**
+   * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+   * @return The nodeCapacityType.
+   */
+  com.clarifai.grpc.api.NodeCapacityType getNodeCapacityType();
+  /**
+   * <code>.clarifai.api.NodeCapacityType node_capacity_type = 7;</code>
+   */
+  com.clarifai.grpc.api.NodeCapacityTypeOrBuilder getNodeCapacityTypeOrBuilder();
+
+  /**
+   * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+   */
+  java.util.List<com.clarifai.grpc.api.InstanceType> 
+      getInstanceTypesList();
+  /**
+   * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+   */
+  com.clarifai.grpc.api.InstanceType getInstanceTypes(int index);
+  /**
+   * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+   */
+  int getInstanceTypesCount();
+  /**
+   * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+   */
+  java.util.List<? extends com.clarifai.grpc.api.InstanceTypeOrBuilder> 
+      getInstanceTypesOrBuilderList();
+  /**
+   * <code>repeated .clarifai.api.InstanceType instance_types = 8;</code>
+   */
+  com.clarifai.grpc.api.InstanceTypeOrBuilder getInstanceTypesOrBuilder(
+      int index);
 
   /**
    * <pre>
-   * Minimum number of instances in this nodepool. This allows the nodeool to scale down to this
+   * Minimum number of instances in this nodepool. This allows the nodepool to scale down to this
    * amount. A nodepool needs a minimum of 1 instance.
    * </pre>
    *
@@ -173,4 +208,67 @@ public interface NodepoolOrBuilder extends
    * @return The maxInstances.
    */
   int getMaxInstances();
+
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 11;</code>
+   * @return Whether the visibility field is set.
+   */
+  boolean hasVisibility();
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 11;</code>
+   * @return The visibility.
+   */
+  com.clarifai.grpc.api.Visibility getVisibility();
+  /**
+   * <pre>
+   * The visibility field represents whether this message is privately/publicly visible.
+   * To be visible to the public the App that contains it AND the User that contains the App must
+   * also be publicly visible.
+   * </pre>
+   *
+   * <code>.clarifai.api.Visibility visibility = 11;</code>
+   */
+  com.clarifai.grpc.api.VisibilityOrBuilder getVisibilityOrBuilder();
+
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 12;</code>
+   * @return Whether the metadata field is set.
+   */
+  boolean hasMetadata();
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 12;</code>
+   * @return The metadata.
+   */
+  com.google.protobuf.Struct getMetadata();
+  /**
+   * <pre>
+   * To handle arbitrary json metadata:
+   * https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
+   * </pre>
+   *
+   * <code>.google.protobuf.Struct metadata = 12;</code>
+   */
+  com.google.protobuf.StructOrBuilder getMetadataOrBuilder();
 }
diff --git a/src/main/java/com/clarifai/grpc/api/OutputConfig.java b/src/main/java/com/clarifai/grpc/api/OutputConfig.java
index 2337a8b..600159b 100644
--- a/src/main/java/com/clarifai/grpc/api/OutputConfig.java
+++ b/src/main/java/com/clarifai/grpc/api/OutputConfig.java
@@ -195,7 +195,7 @@ private OutputConfig(
    *
    * <code>bool concepts_mutually_exclusive = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.concepts_mutually_exclusive is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1501
+   *     See proto/clarifai/api/resources.proto;l=1517
    * @return The conceptsMutuallyExclusive.
    */
   @java.lang.Override
@@ -213,7 +213,7 @@ private OutputConfig(
    *
    * <code>string existing_model_id = 3 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.existing_model_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1504
+   *     See proto/clarifai/api/resources.proto;l=1520
    * @return The existingModelId.
    */
   @java.lang.Override
@@ -237,7 +237,7 @@ private OutputConfig(
    *
    * <code>string existing_model_id = 3 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.existing_model_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1504
+   *     See proto/clarifai/api/resources.proto;l=1520
    * @return The bytes for existingModelId.
    */
   @java.lang.Override
@@ -311,7 +311,7 @@ public java.lang.String getLanguage() {
    *
    * <code>string hyper_parameters = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.hyper_parameters is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1509
+   *     See proto/clarifai/api/resources.proto;l=1525
    * @return The hyperParameters.
    */
   @java.lang.Override
@@ -335,7 +335,7 @@ public java.lang.String getLanguage() {
    *
    * <code>string hyper_parameters = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.hyper_parameters is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1509
+   *     See proto/clarifai/api/resources.proto;l=1525
    * @return The bytes for hyperParameters.
    */
   @java.lang.Override
@@ -525,7 +525,7 @@ public com.google.protobuf.StructOrBuilder getHyperParamsOrBuilder() {
    *
    * <code>string embed_model_version_id = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.embed_model_version_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1528
+   *     See proto/clarifai/api/resources.proto;l=1544
    * @return The embedModelVersionId.
    */
   @java.lang.Override
@@ -549,7 +549,7 @@ public com.google.protobuf.StructOrBuilder getHyperParamsOrBuilder() {
    *
    * <code>string embed_model_version_id = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.embed_model_version_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1528
+   *     See proto/clarifai/api/resources.proto;l=1544
    * @return The bytes for embedModelVersionId.
    */
   @java.lang.Override
@@ -597,7 +597,7 @@ public boolean getFailOnMissingPositiveExamples() {
    *
    * <code>.google.protobuf.Struct model_metadata = 17 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.model_metadata is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1538
+   *     See proto/clarifai/api/resources.proto;l=1554
    * @return Whether the modelMetadata field is set.
    */
   @java.lang.Override
@@ -616,7 +616,7 @@ public boolean getFailOnMissingPositiveExamples() {
    *
    * <code>.google.protobuf.Struct model_metadata = 17 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.model_metadata is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1538
+   *     See proto/clarifai/api/resources.proto;l=1554
    * @return The modelMetadata.
    */
   @java.lang.Override
@@ -1230,7 +1230,7 @@ public Builder mergeFrom(
      *
      * <code>bool concepts_mutually_exclusive = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.concepts_mutually_exclusive is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1501
+     *     See proto/clarifai/api/resources.proto;l=1517
      * @return The conceptsMutuallyExclusive.
      */
     @java.lang.Override
@@ -1244,7 +1244,7 @@ public Builder mergeFrom(
      *
      * <code>bool concepts_mutually_exclusive = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.concepts_mutually_exclusive is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1501
+     *     See proto/clarifai/api/resources.proto;l=1517
      * @param value The conceptsMutuallyExclusive to set.
      * @return This builder for chaining.
      */
@@ -1261,7 +1261,7 @@ public Builder mergeFrom(
      *
      * <code>bool concepts_mutually_exclusive = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.concepts_mutually_exclusive is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1501
+     *     See proto/clarifai/api/resources.proto;l=1517
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearConceptsMutuallyExclusive() {
@@ -1280,7 +1280,7 @@ public Builder mergeFrom(
      *
      * <code>string existing_model_id = 3 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.existing_model_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1504
+     *     See proto/clarifai/api/resources.proto;l=1520
      * @return The existingModelId.
      */
     @java.lang.Deprecated public java.lang.String getExistingModelId() {
@@ -1303,7 +1303,7 @@ public Builder mergeFrom(
      *
      * <code>string existing_model_id = 3 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.existing_model_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1504
+     *     See proto/clarifai/api/resources.proto;l=1520
      * @return The bytes for existingModelId.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -1327,7 +1327,7 @@ public Builder mergeFrom(
      *
      * <code>string existing_model_id = 3 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.existing_model_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1504
+     *     See proto/clarifai/api/resources.proto;l=1520
      * @param value The existingModelId to set.
      * @return This builder for chaining.
      */
@@ -1349,7 +1349,7 @@ public Builder mergeFrom(
      *
      * <code>string existing_model_id = 3 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.existing_model_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1504
+     *     See proto/clarifai/api/resources.proto;l=1520
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearExistingModelId() {
@@ -1366,7 +1366,7 @@ public Builder mergeFrom(
      *
      * <code>string existing_model_id = 3 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.existing_model_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1504
+     *     See proto/clarifai/api/resources.proto;l=1520
      * @param value The bytes for existingModelId to set.
      * @return This builder for chaining.
      */
@@ -1487,7 +1487,7 @@ public Builder setLanguageBytes(
      *
      * <code>string hyper_parameters = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.hyper_parameters is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1509
+     *     See proto/clarifai/api/resources.proto;l=1525
      * @return The hyperParameters.
      */
     @java.lang.Deprecated public java.lang.String getHyperParameters() {
@@ -1510,7 +1510,7 @@ public Builder setLanguageBytes(
      *
      * <code>string hyper_parameters = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.hyper_parameters is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1509
+     *     See proto/clarifai/api/resources.proto;l=1525
      * @return The bytes for hyperParameters.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -1534,7 +1534,7 @@ public Builder setLanguageBytes(
      *
      * <code>string hyper_parameters = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.hyper_parameters is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1509
+     *     See proto/clarifai/api/resources.proto;l=1525
      * @param value The hyperParameters to set.
      * @return This builder for chaining.
      */
@@ -1556,7 +1556,7 @@ public Builder setLanguageBytes(
      *
      * <code>string hyper_parameters = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.hyper_parameters is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1509
+     *     See proto/clarifai/api/resources.proto;l=1525
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearHyperParameters() {
@@ -1573,7 +1573,7 @@ public Builder setLanguageBytes(
      *
      * <code>string hyper_parameters = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.hyper_parameters is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1509
+     *     See proto/clarifai/api/resources.proto;l=1525
      * @param value The bytes for hyperParameters to set.
      * @return This builder for chaining.
      */
@@ -2249,7 +2249,7 @@ public com.google.protobuf.StructOrBuilder getHyperParamsOrBuilder() {
      *
      * <code>string embed_model_version_id = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.embed_model_version_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1528
+     *     See proto/clarifai/api/resources.proto;l=1544
      * @return The embedModelVersionId.
      */
     @java.lang.Deprecated public java.lang.String getEmbedModelVersionId() {
@@ -2272,7 +2272,7 @@ public com.google.protobuf.StructOrBuilder getHyperParamsOrBuilder() {
      *
      * <code>string embed_model_version_id = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.embed_model_version_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1528
+     *     See proto/clarifai/api/resources.proto;l=1544
      * @return The bytes for embedModelVersionId.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -2296,7 +2296,7 @@ public com.google.protobuf.StructOrBuilder getHyperParamsOrBuilder() {
      *
      * <code>string embed_model_version_id = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.embed_model_version_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1528
+     *     See proto/clarifai/api/resources.proto;l=1544
      * @param value The embedModelVersionId to set.
      * @return This builder for chaining.
      */
@@ -2318,7 +2318,7 @@ public com.google.protobuf.StructOrBuilder getHyperParamsOrBuilder() {
      *
      * <code>string embed_model_version_id = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.embed_model_version_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1528
+     *     See proto/clarifai/api/resources.proto;l=1544
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearEmbedModelVersionId() {
@@ -2335,7 +2335,7 @@ public com.google.protobuf.StructOrBuilder getHyperParamsOrBuilder() {
      *
      * <code>string embed_model_version_id = 14 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.embed_model_version_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1528
+     *     See proto/clarifai/api/resources.proto;l=1544
      * @param value The bytes for embedModelVersionId to set.
      * @return This builder for chaining.
      */
@@ -2412,7 +2412,7 @@ public Builder clearFailOnMissingPositiveExamples() {
      *
      * <code>.google.protobuf.Struct model_metadata = 17 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.model_metadata is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1538
+     *     See proto/clarifai/api/resources.proto;l=1554
      * @return Whether the modelMetadata field is set.
      */
     @java.lang.Deprecated public boolean hasModelMetadata() {
@@ -2430,7 +2430,7 @@ public Builder clearFailOnMissingPositiveExamples() {
      *
      * <code>.google.protobuf.Struct model_metadata = 17 [deprecated = true];</code>
      * @deprecated clarifai.api.OutputConfig.model_metadata is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=1538
+     *     See proto/clarifai/api/resources.proto;l=1554
      * @return The modelMetadata.
      */
     @java.lang.Deprecated public com.google.protobuf.Struct getModelMetadata() {
diff --git a/src/main/java/com/clarifai/grpc/api/OutputConfigOrBuilder.java b/src/main/java/com/clarifai/grpc/api/OutputConfigOrBuilder.java
index fb52e06..b53396b 100644
--- a/src/main/java/com/clarifai/grpc/api/OutputConfigOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/OutputConfigOrBuilder.java
@@ -14,7 +14,7 @@ public interface OutputConfigOrBuilder extends
    *
    * <code>bool concepts_mutually_exclusive = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.concepts_mutually_exclusive is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1501
+   *     See proto/clarifai/api/resources.proto;l=1517
    * @return The conceptsMutuallyExclusive.
    */
   @java.lang.Deprecated boolean getConceptsMutuallyExclusive();
@@ -27,7 +27,7 @@ public interface OutputConfigOrBuilder extends
    *
    * <code>string existing_model_id = 3 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.existing_model_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1504
+   *     See proto/clarifai/api/resources.proto;l=1520
    * @return The existingModelId.
    */
   @java.lang.Deprecated java.lang.String getExistingModelId();
@@ -39,7 +39,7 @@ public interface OutputConfigOrBuilder extends
    *
    * <code>string existing_model_id = 3 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.existing_model_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1504
+   *     See proto/clarifai/api/resources.proto;l=1520
    * @return The bytes for existingModelId.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -73,7 +73,7 @@ public interface OutputConfigOrBuilder extends
    *
    * <code>string hyper_parameters = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.hyper_parameters is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1509
+   *     See proto/clarifai/api/resources.proto;l=1525
    * @return The hyperParameters.
    */
   @java.lang.Deprecated java.lang.String getHyperParameters();
@@ -85,7 +85,7 @@ public interface OutputConfigOrBuilder extends
    *
    * <code>string hyper_parameters = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.hyper_parameters is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1509
+   *     See proto/clarifai/api/resources.proto;l=1525
    * @return The bytes for hyperParameters.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -214,7 +214,7 @@ com.clarifai.grpc.api.ConceptOrBuilder getSelectConceptsOrBuilder(
    *
    * <code>string embed_model_version_id = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.embed_model_version_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1528
+   *     See proto/clarifai/api/resources.proto;l=1544
    * @return The embedModelVersionId.
    */
   @java.lang.Deprecated java.lang.String getEmbedModelVersionId();
@@ -226,7 +226,7 @@ com.clarifai.grpc.api.ConceptOrBuilder getSelectConceptsOrBuilder(
    *
    * <code>string embed_model_version_id = 14 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.embed_model_version_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1528
+   *     See proto/clarifai/api/resources.proto;l=1544
    * @return The bytes for embedModelVersionId.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -255,7 +255,7 @@ com.clarifai.grpc.api.ConceptOrBuilder getSelectConceptsOrBuilder(
    *
    * <code>.google.protobuf.Struct model_metadata = 17 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.model_metadata is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1538
+   *     See proto/clarifai/api/resources.proto;l=1554
    * @return Whether the modelMetadata field is set.
    */
   @java.lang.Deprecated boolean hasModelMetadata();
@@ -271,7 +271,7 @@ com.clarifai.grpc.api.ConceptOrBuilder getSelectConceptsOrBuilder(
    *
    * <code>.google.protobuf.Struct model_metadata = 17 [deprecated = true];</code>
    * @deprecated clarifai.api.OutputConfig.model_metadata is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=1538
+   *     See proto/clarifai/api/resources.proto;l=1554
    * @return The modelMetadata.
    */
   @java.lang.Deprecated com.google.protobuf.Struct getModelMetadata();
diff --git a/src/main/java/com/clarifai/grpc/api/PatchNodepoolsRequest.java b/src/main/java/com/clarifai/grpc/api/PatchNodepoolsRequest.java
new file mode 100644
index 0000000..36aeabe
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/PatchNodepoolsRequest.java
@@ -0,0 +1,1279 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * <pre>
+ * PatchNodepoolsRequest
+ * </pre>
+ *
+ * Protobuf type {@code clarifai.api.PatchNodepoolsRequest}
+ */
+public final class PatchNodepoolsRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.PatchNodepoolsRequest)
+    PatchNodepoolsRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use PatchNodepoolsRequest.newBuilder() to construct.
+  private PatchNodepoolsRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private PatchNodepoolsRequest() {
+    computeClusterId_ = "";
+    nodepools_ = java.util.Collections.emptyList();
+    action_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new PatchNodepoolsRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private PatchNodepoolsRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.UserAppIDSet.Builder subBuilder = null;
+            if (userAppId_ != null) {
+              subBuilder = userAppId_.toBuilder();
+            }
+            userAppId_ = input.readMessage(com.clarifai.grpc.api.UserAppIDSet.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(userAppId_);
+              userAppId_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            computeClusterId_ = s;
+            break;
+          }
+          case 26: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              nodepools_ = new java.util.ArrayList<com.clarifai.grpc.api.Nodepool>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            nodepools_.add(
+                input.readMessage(com.clarifai.grpc.api.Nodepool.parser(), extensionRegistry));
+            break;
+          }
+          case 34: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            action_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        nodepools_ = java.util.Collections.unmodifiableList(nodepools_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PatchNodepoolsRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PatchNodepoolsRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.PatchNodepoolsRequest.class, com.clarifai.grpc.api.PatchNodepoolsRequest.Builder.class);
+  }
+
+  public static final int USER_APP_ID_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  @java.lang.Override
+  public boolean hasUserAppId() {
+    return userAppId_ != null;
+  }
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+    return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+  }
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+    return getUserAppId();
+  }
+
+  public static final int COMPUTE_CLUSTER_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object computeClusterId_;
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  @java.lang.Override
+  public java.lang.String getComputeClusterId() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      computeClusterId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getComputeClusterIdBytes() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      computeClusterId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int NODEPOOLS_FIELD_NUMBER = 3;
+  private java.util.List<com.clarifai.grpc.api.Nodepool> nodepools_;
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  @java.lang.Override
+  public java.util.List<com.clarifai.grpc.api.Nodepool> getNodepoolsList() {
+    return nodepools_;
+  }
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends com.clarifai.grpc.api.NodepoolOrBuilder> 
+      getNodepoolsOrBuilderList() {
+    return nodepools_;
+  }
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  @java.lang.Override
+  public int getNodepoolsCount() {
+    return nodepools_.size();
+  }
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.Nodepool getNodepools(int index) {
+    return nodepools_.get(index);
+  }
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolsOrBuilder(
+      int index) {
+    return nodepools_.get(index);
+  }
+
+  public static final int ACTION_FIELD_NUMBER = 4;
+  private volatile java.lang.Object action_;
+  /**
+   * <pre>
+   * The action to perform on the patched objects
+   * For now actions 'merge', 'overwrite', and 'remove' are supported
+   * </pre>
+   *
+   * <code>string action = 4;</code>
+   * @return The action.
+   */
+  @java.lang.Override
+  public java.lang.String getAction() {
+    java.lang.Object ref = action_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      action_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * The action to perform on the patched objects
+   * For now actions 'merge', 'overwrite', and 'remove' are supported
+   * </pre>
+   *
+   * <code>string action = 4;</code>
+   * @return The bytes for action.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getActionBytes() {
+    java.lang.Object ref = action_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      action_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (userAppId_ != null) {
+      output.writeMessage(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, computeClusterId_);
+    }
+    for (int i = 0; i < nodepools_.size(); i++) {
+      output.writeMessage(3, nodepools_.get(i));
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(action_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 4, action_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (userAppId_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, computeClusterId_);
+    }
+    for (int i = 0; i < nodepools_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(3, nodepools_.get(i));
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(action_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, action_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.PatchNodepoolsRequest)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.PatchNodepoolsRequest other = (com.clarifai.grpc.api.PatchNodepoolsRequest) obj;
+
+    if (hasUserAppId() != other.hasUserAppId()) return false;
+    if (hasUserAppId()) {
+      if (!getUserAppId()
+          .equals(other.getUserAppId())) return false;
+    }
+    if (!getComputeClusterId()
+        .equals(other.getComputeClusterId())) return false;
+    if (!getNodepoolsList()
+        .equals(other.getNodepoolsList())) return false;
+    if (!getAction()
+        .equals(other.getAction())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasUserAppId()) {
+      hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getUserAppId().hashCode();
+    }
+    hash = (37 * hash) + COMPUTE_CLUSTER_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getComputeClusterId().hashCode();
+    if (getNodepoolsCount() > 0) {
+      hash = (37 * hash) + NODEPOOLS_FIELD_NUMBER;
+      hash = (53 * hash) + getNodepoolsList().hashCode();
+    }
+    hash = (37 * hash) + ACTION_FIELD_NUMBER;
+    hash = (53 * hash) + getAction().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.PatchNodepoolsRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * PatchNodepoolsRequest
+   * </pre>
+   *
+   * Protobuf type {@code clarifai.api.PatchNodepoolsRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.PatchNodepoolsRequest)
+      com.clarifai.grpc.api.PatchNodepoolsRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PatchNodepoolsRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PatchNodepoolsRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.PatchNodepoolsRequest.class, com.clarifai.grpc.api.PatchNodepoolsRequest.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.PatchNodepoolsRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getNodepoolsFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+      computeClusterId_ = "";
+
+      if (nodepoolsBuilder_ == null) {
+        nodepools_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        nodepoolsBuilder_.clear();
+      }
+      action_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PatchNodepoolsRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.PatchNodepoolsRequest getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.PatchNodepoolsRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.PatchNodepoolsRequest build() {
+      com.clarifai.grpc.api.PatchNodepoolsRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.PatchNodepoolsRequest buildPartial() {
+      com.clarifai.grpc.api.PatchNodepoolsRequest result = new com.clarifai.grpc.api.PatchNodepoolsRequest(this);
+      int from_bitField0_ = bitField0_;
+      if (userAppIdBuilder_ == null) {
+        result.userAppId_ = userAppId_;
+      } else {
+        result.userAppId_ = userAppIdBuilder_.build();
+      }
+      result.computeClusterId_ = computeClusterId_;
+      if (nodepoolsBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          nodepools_ = java.util.Collections.unmodifiableList(nodepools_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.nodepools_ = nodepools_;
+      } else {
+        result.nodepools_ = nodepoolsBuilder_.build();
+      }
+      result.action_ = action_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.PatchNodepoolsRequest) {
+        return mergeFrom((com.clarifai.grpc.api.PatchNodepoolsRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.PatchNodepoolsRequest other) {
+      if (other == com.clarifai.grpc.api.PatchNodepoolsRequest.getDefaultInstance()) return this;
+      if (other.hasUserAppId()) {
+        mergeUserAppId(other.getUserAppId());
+      }
+      if (!other.getComputeClusterId().isEmpty()) {
+        computeClusterId_ = other.computeClusterId_;
+        onChanged();
+      }
+      if (nodepoolsBuilder_ == null) {
+        if (!other.nodepools_.isEmpty()) {
+          if (nodepools_.isEmpty()) {
+            nodepools_ = other.nodepools_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureNodepoolsIsMutable();
+            nodepools_.addAll(other.nodepools_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.nodepools_.isEmpty()) {
+          if (nodepoolsBuilder_.isEmpty()) {
+            nodepoolsBuilder_.dispose();
+            nodepoolsBuilder_ = null;
+            nodepools_ = other.nodepools_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            nodepoolsBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getNodepoolsFieldBuilder() : null;
+          } else {
+            nodepoolsBuilder_.addAllMessages(other.nodepools_);
+          }
+        }
+      }
+      if (!other.getAction().isEmpty()) {
+        action_ = other.action_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.PatchNodepoolsRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.PatchNodepoolsRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> userAppIdBuilder_;
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return Whether the userAppId field is set.
+     */
+    public boolean hasUserAppId() {
+      return userAppIdBuilder_ != null || userAppId_ != null;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return The userAppId.
+     */
+    public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      } else {
+        return userAppIdBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        userAppId_ = value;
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(
+        com.clarifai.grpc.api.UserAppIDSet.Builder builderForValue) {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = builderForValue.build();
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder mergeUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (userAppId_ != null) {
+          userAppId_ =
+            com.clarifai.grpc.api.UserAppIDSet.newBuilder(userAppId_).mergeFrom(value).buildPartial();
+        } else {
+          userAppId_ = value;
+        }
+        onChanged();
+      } else {
+        userAppIdBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder clearUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+        onChanged();
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSet.Builder getUserAppIdBuilder() {
+      
+      onChanged();
+      return getUserAppIdFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+      if (userAppIdBuilder_ != null) {
+        return userAppIdBuilder_.getMessageOrBuilder();
+      } else {
+        return userAppId_ == null ?
+            com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> 
+        getUserAppIdFieldBuilder() {
+      if (userAppIdBuilder_ == null) {
+        userAppIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder>(
+                getUserAppId(),
+                getParentForChildren(),
+                isClean());
+        userAppId_ = null;
+      }
+      return userAppIdBuilder_;
+    }
+
+    private java.lang.Object computeClusterId_ = "";
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The computeClusterId.
+     */
+    public java.lang.String getComputeClusterId() {
+      java.lang.Object ref = computeClusterId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        computeClusterId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The bytes for computeClusterId.
+     */
+    public com.google.protobuf.ByteString
+        getComputeClusterIdBytes() {
+      java.lang.Object ref = computeClusterId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        computeClusterId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearComputeClusterId() {
+      
+      computeClusterId_ = getDefaultInstance().getComputeClusterId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The bytes for computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.util.List<com.clarifai.grpc.api.Nodepool> nodepools_ =
+      java.util.Collections.emptyList();
+    private void ensureNodepoolsIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        nodepools_ = new java.util.ArrayList<com.clarifai.grpc.api.Nodepool>(nodepools_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder> nodepoolsBuilder_;
+
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.Nodepool> getNodepoolsList() {
+      if (nodepoolsBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(nodepools_);
+      } else {
+        return nodepoolsBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public int getNodepoolsCount() {
+      if (nodepoolsBuilder_ == null) {
+        return nodepools_.size();
+      } else {
+        return nodepoolsBuilder_.getCount();
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public com.clarifai.grpc.api.Nodepool getNodepools(int index) {
+      if (nodepoolsBuilder_ == null) {
+        return nodepools_.get(index);
+      } else {
+        return nodepoolsBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder setNodepools(
+        int index, com.clarifai.grpc.api.Nodepool value) {
+      if (nodepoolsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodepoolsIsMutable();
+        nodepools_.set(index, value);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder setNodepools(
+        int index, com.clarifai.grpc.api.Nodepool.Builder builderForValue) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        nodepoolsBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder addNodepools(com.clarifai.grpc.api.Nodepool value) {
+      if (nodepoolsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodepoolsIsMutable();
+        nodepools_.add(value);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder addNodepools(
+        int index, com.clarifai.grpc.api.Nodepool value) {
+      if (nodepoolsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodepoolsIsMutable();
+        nodepools_.add(index, value);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder addNodepools(
+        com.clarifai.grpc.api.Nodepool.Builder builderForValue) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.add(builderForValue.build());
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder addNodepools(
+        int index, com.clarifai.grpc.api.Nodepool.Builder builderForValue) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder addAllNodepools(
+        java.lang.Iterable<? extends com.clarifai.grpc.api.Nodepool> values) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, nodepools_);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder clearNodepools() {
+      if (nodepoolsBuilder_ == null) {
+        nodepools_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder removeNodepools(int index) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.remove(index);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public com.clarifai.grpc.api.Nodepool.Builder getNodepoolsBuilder(
+        int index) {
+      return getNodepoolsFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolsOrBuilder(
+        int index) {
+      if (nodepoolsBuilder_ == null) {
+        return nodepools_.get(index);  } else {
+        return nodepoolsBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public java.util.List<? extends com.clarifai.grpc.api.NodepoolOrBuilder> 
+         getNodepoolsOrBuilderList() {
+      if (nodepoolsBuilder_ != null) {
+        return nodepoolsBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(nodepools_);
+      }
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public com.clarifai.grpc.api.Nodepool.Builder addNodepoolsBuilder() {
+      return getNodepoolsFieldBuilder().addBuilder(
+          com.clarifai.grpc.api.Nodepool.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public com.clarifai.grpc.api.Nodepool.Builder addNodepoolsBuilder(
+        int index) {
+      return getNodepoolsFieldBuilder().addBuilder(
+          index, com.clarifai.grpc.api.Nodepool.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.Nodepool.Builder> 
+         getNodepoolsBuilderList() {
+      return getNodepoolsFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder> 
+        getNodepoolsFieldBuilder() {
+      if (nodepoolsBuilder_ == null) {
+        nodepoolsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder>(
+                nodepools_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        nodepools_ = null;
+      }
+      return nodepoolsBuilder_;
+    }
+
+    private java.lang.Object action_ = "";
+    /**
+     * <pre>
+     * The action to perform on the patched objects
+     * For now actions 'merge', 'overwrite', and 'remove' are supported
+     * </pre>
+     *
+     * <code>string action = 4;</code>
+     * @return The action.
+     */
+    public java.lang.String getAction() {
+      java.lang.Object ref = action_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        action_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The action to perform on the patched objects
+     * For now actions 'merge', 'overwrite', and 'remove' are supported
+     * </pre>
+     *
+     * <code>string action = 4;</code>
+     * @return The bytes for action.
+     */
+    public com.google.protobuf.ByteString
+        getActionBytes() {
+      java.lang.Object ref = action_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        action_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The action to perform on the patched objects
+     * For now actions 'merge', 'overwrite', and 'remove' are supported
+     * </pre>
+     *
+     * <code>string action = 4;</code>
+     * @param value The action to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAction(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      action_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The action to perform on the patched objects
+     * For now actions 'merge', 'overwrite', and 'remove' are supported
+     * </pre>
+     *
+     * <code>string action = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAction() {
+      
+      action_ = getDefaultInstance().getAction();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The action to perform on the patched objects
+     * For now actions 'merge', 'overwrite', and 'remove' are supported
+     * </pre>
+     *
+     * <code>string action = 4;</code>
+     * @param value The bytes for action to set.
+     * @return This builder for chaining.
+     */
+    public Builder setActionBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      action_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.PatchNodepoolsRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.PatchNodepoolsRequest)
+  private static final com.clarifai.grpc.api.PatchNodepoolsRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.PatchNodepoolsRequest();
+  }
+
+  public static com.clarifai.grpc.api.PatchNodepoolsRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<PatchNodepoolsRequest>
+      PARSER = new com.google.protobuf.AbstractParser<PatchNodepoolsRequest>() {
+    @java.lang.Override
+    public PatchNodepoolsRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new PatchNodepoolsRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<PatchNodepoolsRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<PatchNodepoolsRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.PatchNodepoolsRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/PatchNodepoolsRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/PatchNodepoolsRequestOrBuilder.java
new file mode 100644
index 0000000..decf246
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/PatchNodepoolsRequestOrBuilder.java
@@ -0,0 +1,82 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface PatchNodepoolsRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.PatchNodepoolsRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  boolean hasUserAppId();
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  com.clarifai.grpc.api.UserAppIDSet getUserAppId();
+  /**
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
+
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  java.lang.String getComputeClusterId();
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  com.google.protobuf.ByteString
+      getComputeClusterIdBytes();
+
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  java.util.List<com.clarifai.grpc.api.Nodepool> 
+      getNodepoolsList();
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  com.clarifai.grpc.api.Nodepool getNodepools(int index);
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  int getNodepoolsCount();
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  java.util.List<? extends com.clarifai.grpc.api.NodepoolOrBuilder> 
+      getNodepoolsOrBuilderList();
+  /**
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolsOrBuilder(
+      int index);
+
+  /**
+   * <pre>
+   * The action to perform on the patched objects
+   * For now actions 'merge', 'overwrite', and 'remove' are supported
+   * </pre>
+   *
+   * <code>string action = 4;</code>
+   * @return The action.
+   */
+  java.lang.String getAction();
+  /**
+   * <pre>
+   * The action to perform on the patched objects
+   * For now actions 'merge', 'overwrite', and 'remove' are supported
+   * </pre>
+   *
+   * <code>string action = 4;</code>
+   * @return The bytes for action.
+   */
+  com.google.protobuf.ByteString
+      getActionBytes();
+}
diff --git a/src/main/java/com/clarifai/grpc/api/PostComputeClustersRequest.java b/src/main/java/com/clarifai/grpc/api/PostComputeClustersRequest.java
new file mode 100644
index 0000000..0a7f182
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/PostComputeClustersRequest.java
@@ -0,0 +1,1100 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * Protobuf type {@code clarifai.api.PostComputeClustersRequest}
+ */
+public final class PostComputeClustersRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.PostComputeClustersRequest)
+    PostComputeClustersRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use PostComputeClustersRequest.newBuilder() to construct.
+  private PostComputeClustersRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private PostComputeClustersRequest() {
+    computeClusters_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new PostComputeClustersRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private PostComputeClustersRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.UserAppIDSet.Builder subBuilder = null;
+            if (userAppId_ != null) {
+              subBuilder = userAppId_.toBuilder();
+            }
+            userAppId_ = input.readMessage(com.clarifai.grpc.api.UserAppIDSet.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(userAppId_);
+              userAppId_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              computeClusters_ = new java.util.ArrayList<com.clarifai.grpc.api.ComputeCluster>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            computeClusters_.add(
+                input.readMessage(com.clarifai.grpc.api.ComputeCluster.parser(), extensionRegistry));
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        computeClusters_ = java.util.Collections.unmodifiableList(computeClusters_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PostComputeClustersRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PostComputeClustersRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.PostComputeClustersRequest.class, com.clarifai.grpc.api.PostComputeClustersRequest.Builder.class);
+  }
+
+  public static final int USER_APP_ID_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  @java.lang.Override
+  public boolean hasUserAppId() {
+    return userAppId_ != null;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+    return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+    return getUserAppId();
+  }
+
+  public static final int COMPUTE_CLUSTERS_FIELD_NUMBER = 2;
+  private java.util.List<com.clarifai.grpc.api.ComputeCluster> computeClusters_;
+  /**
+   * <pre>
+   * This allows you to create one or more compute_clusters by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<com.clarifai.grpc.api.ComputeCluster> getComputeClustersList() {
+    return computeClusters_;
+  }
+  /**
+   * <pre>
+   * This allows you to create one or more compute_clusters by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends com.clarifai.grpc.api.ComputeClusterOrBuilder> 
+      getComputeClustersOrBuilderList() {
+    return computeClusters_;
+  }
+  /**
+   * <pre>
+   * This allows you to create one or more compute_clusters by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+   */
+  @java.lang.Override
+  public int getComputeClustersCount() {
+    return computeClusters_.size();
+  }
+  /**
+   * <pre>
+   * This allows you to create one or more compute_clusters by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.ComputeCluster getComputeClusters(int index) {
+    return computeClusters_.get(index);
+  }
+  /**
+   * <pre>
+   * This allows you to create one or more compute_clusters by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClustersOrBuilder(
+      int index) {
+    return computeClusters_.get(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (userAppId_ != null) {
+      output.writeMessage(1, getUserAppId());
+    }
+    for (int i = 0; i < computeClusters_.size(); i++) {
+      output.writeMessage(2, computeClusters_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (userAppId_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getUserAppId());
+    }
+    for (int i = 0; i < computeClusters_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, computeClusters_.get(i));
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.PostComputeClustersRequest)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.PostComputeClustersRequest other = (com.clarifai.grpc.api.PostComputeClustersRequest) obj;
+
+    if (hasUserAppId() != other.hasUserAppId()) return false;
+    if (hasUserAppId()) {
+      if (!getUserAppId()
+          .equals(other.getUserAppId())) return false;
+    }
+    if (!getComputeClustersList()
+        .equals(other.getComputeClustersList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasUserAppId()) {
+      hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getUserAppId().hashCode();
+    }
+    if (getComputeClustersCount() > 0) {
+      hash = (37 * hash) + COMPUTE_CLUSTERS_FIELD_NUMBER;
+      hash = (53 * hash) + getComputeClustersList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.PostComputeClustersRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.PostComputeClustersRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code clarifai.api.PostComputeClustersRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.PostComputeClustersRequest)
+      com.clarifai.grpc.api.PostComputeClustersRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PostComputeClustersRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PostComputeClustersRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.PostComputeClustersRequest.class, com.clarifai.grpc.api.PostComputeClustersRequest.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.PostComputeClustersRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getComputeClustersFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+      if (computeClustersBuilder_ == null) {
+        computeClusters_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        computeClustersBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PostComputeClustersRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.PostComputeClustersRequest getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.PostComputeClustersRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.PostComputeClustersRequest build() {
+      com.clarifai.grpc.api.PostComputeClustersRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.PostComputeClustersRequest buildPartial() {
+      com.clarifai.grpc.api.PostComputeClustersRequest result = new com.clarifai.grpc.api.PostComputeClustersRequest(this);
+      int from_bitField0_ = bitField0_;
+      if (userAppIdBuilder_ == null) {
+        result.userAppId_ = userAppId_;
+      } else {
+        result.userAppId_ = userAppIdBuilder_.build();
+      }
+      if (computeClustersBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          computeClusters_ = java.util.Collections.unmodifiableList(computeClusters_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.computeClusters_ = computeClusters_;
+      } else {
+        result.computeClusters_ = computeClustersBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.PostComputeClustersRequest) {
+        return mergeFrom((com.clarifai.grpc.api.PostComputeClustersRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.PostComputeClustersRequest other) {
+      if (other == com.clarifai.grpc.api.PostComputeClustersRequest.getDefaultInstance()) return this;
+      if (other.hasUserAppId()) {
+        mergeUserAppId(other.getUserAppId());
+      }
+      if (computeClustersBuilder_ == null) {
+        if (!other.computeClusters_.isEmpty()) {
+          if (computeClusters_.isEmpty()) {
+            computeClusters_ = other.computeClusters_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureComputeClustersIsMutable();
+            computeClusters_.addAll(other.computeClusters_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.computeClusters_.isEmpty()) {
+          if (computeClustersBuilder_.isEmpty()) {
+            computeClustersBuilder_.dispose();
+            computeClustersBuilder_ = null;
+            computeClusters_ = other.computeClusters_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            computeClustersBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getComputeClustersFieldBuilder() : null;
+          } else {
+            computeClustersBuilder_.addAllMessages(other.computeClusters_);
+          }
+        }
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.PostComputeClustersRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.PostComputeClustersRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> userAppIdBuilder_;
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return Whether the userAppId field is set.
+     */
+    public boolean hasUserAppId() {
+      return userAppIdBuilder_ != null || userAppId_ != null;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return The userAppId.
+     */
+    public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      } else {
+        return userAppIdBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        userAppId_ = value;
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(
+        com.clarifai.grpc.api.UserAppIDSet.Builder builderForValue) {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = builderForValue.build();
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder mergeUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (userAppId_ != null) {
+          userAppId_ =
+            com.clarifai.grpc.api.UserAppIDSet.newBuilder(userAppId_).mergeFrom(value).buildPartial();
+        } else {
+          userAppId_ = value;
+        }
+        onChanged();
+      } else {
+        userAppIdBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder clearUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+        onChanged();
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSet.Builder getUserAppIdBuilder() {
+      
+      onChanged();
+      return getUserAppIdFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+      if (userAppIdBuilder_ != null) {
+        return userAppIdBuilder_.getMessageOrBuilder();
+      } else {
+        return userAppId_ == null ?
+            com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> 
+        getUserAppIdFieldBuilder() {
+      if (userAppIdBuilder_ == null) {
+        userAppIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder>(
+                getUserAppId(),
+                getParentForChildren(),
+                isClean());
+        userAppId_ = null;
+      }
+      return userAppIdBuilder_;
+    }
+
+    private java.util.List<com.clarifai.grpc.api.ComputeCluster> computeClusters_ =
+      java.util.Collections.emptyList();
+    private void ensureComputeClustersIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        computeClusters_ = new java.util.ArrayList<com.clarifai.grpc.api.ComputeCluster>(computeClusters_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder> computeClustersBuilder_;
+
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.ComputeCluster> getComputeClustersList() {
+      if (computeClustersBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(computeClusters_);
+      } else {
+        return computeClustersBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public int getComputeClustersCount() {
+      if (computeClustersBuilder_ == null) {
+        return computeClusters_.size();
+      } else {
+        return computeClustersBuilder_.getCount();
+      }
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public com.clarifai.grpc.api.ComputeCluster getComputeClusters(int index) {
+      if (computeClustersBuilder_ == null) {
+        return computeClusters_.get(index);
+      } else {
+        return computeClustersBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public Builder setComputeClusters(
+        int index, com.clarifai.grpc.api.ComputeCluster value) {
+      if (computeClustersBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureComputeClustersIsMutable();
+        computeClusters_.set(index, value);
+        onChanged();
+      } else {
+        computeClustersBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public Builder setComputeClusters(
+        int index, com.clarifai.grpc.api.ComputeCluster.Builder builderForValue) {
+      if (computeClustersBuilder_ == null) {
+        ensureComputeClustersIsMutable();
+        computeClusters_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        computeClustersBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public Builder addComputeClusters(com.clarifai.grpc.api.ComputeCluster value) {
+      if (computeClustersBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureComputeClustersIsMutable();
+        computeClusters_.add(value);
+        onChanged();
+      } else {
+        computeClustersBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public Builder addComputeClusters(
+        int index, com.clarifai.grpc.api.ComputeCluster value) {
+      if (computeClustersBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureComputeClustersIsMutable();
+        computeClusters_.add(index, value);
+        onChanged();
+      } else {
+        computeClustersBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public Builder addComputeClusters(
+        com.clarifai.grpc.api.ComputeCluster.Builder builderForValue) {
+      if (computeClustersBuilder_ == null) {
+        ensureComputeClustersIsMutable();
+        computeClusters_.add(builderForValue.build());
+        onChanged();
+      } else {
+        computeClustersBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public Builder addComputeClusters(
+        int index, com.clarifai.grpc.api.ComputeCluster.Builder builderForValue) {
+      if (computeClustersBuilder_ == null) {
+        ensureComputeClustersIsMutable();
+        computeClusters_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        computeClustersBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public Builder addAllComputeClusters(
+        java.lang.Iterable<? extends com.clarifai.grpc.api.ComputeCluster> values) {
+      if (computeClustersBuilder_ == null) {
+        ensureComputeClustersIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, computeClusters_);
+        onChanged();
+      } else {
+        computeClustersBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public Builder clearComputeClusters() {
+      if (computeClustersBuilder_ == null) {
+        computeClusters_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        computeClustersBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public Builder removeComputeClusters(int index) {
+      if (computeClustersBuilder_ == null) {
+        ensureComputeClustersIsMutable();
+        computeClusters_.remove(index);
+        onChanged();
+      } else {
+        computeClustersBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public com.clarifai.grpc.api.ComputeCluster.Builder getComputeClustersBuilder(
+        int index) {
+      return getComputeClustersFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClustersOrBuilder(
+        int index) {
+      if (computeClustersBuilder_ == null) {
+        return computeClusters_.get(index);  } else {
+        return computeClustersBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public java.util.List<? extends com.clarifai.grpc.api.ComputeClusterOrBuilder> 
+         getComputeClustersOrBuilderList() {
+      if (computeClustersBuilder_ != null) {
+        return computeClustersBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(computeClusters_);
+      }
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public com.clarifai.grpc.api.ComputeCluster.Builder addComputeClustersBuilder() {
+      return getComputeClustersFieldBuilder().addBuilder(
+          com.clarifai.grpc.api.ComputeCluster.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public com.clarifai.grpc.api.ComputeCluster.Builder addComputeClustersBuilder(
+        int index) {
+      return getComputeClustersFieldBuilder().addBuilder(
+          index, com.clarifai.grpc.api.ComputeCluster.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more compute_clusters by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.ComputeCluster.Builder> 
+         getComputeClustersBuilderList() {
+      return getComputeClustersFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder> 
+        getComputeClustersFieldBuilder() {
+      if (computeClustersBuilder_ == null) {
+        computeClustersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder>(
+                computeClusters_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        computeClusters_ = null;
+      }
+      return computeClustersBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.PostComputeClustersRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.PostComputeClustersRequest)
+  private static final com.clarifai.grpc.api.PostComputeClustersRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.PostComputeClustersRequest();
+  }
+
+  public static com.clarifai.grpc.api.PostComputeClustersRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<PostComputeClustersRequest>
+      PARSER = new com.google.protobuf.AbstractParser<PostComputeClustersRequest>() {
+    @java.lang.Override
+    public PostComputeClustersRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new PostComputeClustersRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<PostComputeClustersRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<PostComputeClustersRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.PostComputeClustersRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/PostComputeClustersRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/PostComputeClustersRequestOrBuilder.java
new file mode 100644
index 0000000..8a9ff97
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/PostComputeClustersRequestOrBuilder.java
@@ -0,0 +1,80 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface PostComputeClustersRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.PostComputeClustersRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  boolean hasUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  com.clarifai.grpc.api.UserAppIDSet getUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
+
+  /**
+   * <pre>
+   * This allows you to create one or more compute_clusters by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+   */
+  java.util.List<com.clarifai.grpc.api.ComputeCluster> 
+      getComputeClustersList();
+  /**
+   * <pre>
+   * This allows you to create one or more compute_clusters by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+   */
+  com.clarifai.grpc.api.ComputeCluster getComputeClusters(int index);
+  /**
+   * <pre>
+   * This allows you to create one or more compute_clusters by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+   */
+  int getComputeClustersCount();
+  /**
+   * <pre>
+   * This allows you to create one or more compute_clusters by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+   */
+  java.util.List<? extends com.clarifai.grpc.api.ComputeClusterOrBuilder> 
+      getComputeClustersOrBuilderList();
+  /**
+   * <pre>
+   * This allows you to create one or more compute_clusters by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.ComputeCluster compute_clusters = 2;</code>
+   */
+  com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClustersOrBuilder(
+      int index);
+}
diff --git a/src/main/java/com/clarifai/grpc/api/PostModelVersionsUploadConfig.java b/src/main/java/com/clarifai/grpc/api/PostModelVersionsUploadConfig.java
index ad6e05f..82b7939 100644
--- a/src/main/java/com/clarifai/grpc/api/PostModelVersionsUploadConfig.java
+++ b/src/main/java/com/clarifai/grpc/api/PostModelVersionsUploadConfig.java
@@ -86,6 +86,11 @@ private PostModelVersionsUploadConfig(
             totalSize_ = input.readUInt64();
             break;
           }
+          case 40: {
+
+            isV3_ = input.readBool();
+            break;
+          }
           default: {
             if (!parseUnknownField(
                 input, unknownFields, extensionRegistry, tag)) {
@@ -150,7 +155,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
   private volatile java.lang.Object modelId_;
   /**
    * <pre>
-   * model to create version of
+   * Model to create version for
    * </pre>
    *
    * <code>string model_id = 2;</code>
@@ -171,7 +176,7 @@ public java.lang.String getModelId() {
   }
   /**
    * <pre>
-   * model to create version of
+   * Model to create version for
    * </pre>
    *
    * <code>string model_id = 2;</code>
@@ -196,7 +201,7 @@ public java.lang.String getModelId() {
   private com.clarifai.grpc.api.ModelVersion modelVersion_;
   /**
    * <pre>
-   * specification for the model version to be uploaded
+   * Specification for the model version to be uploaded
    * </pre>
    *
    * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -208,7 +213,7 @@ public boolean hasModelVersion() {
   }
   /**
    * <pre>
-   * specification for the model version to be uploaded
+   * Specification for the model version to be uploaded
    * </pre>
    *
    * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -220,7 +225,7 @@ public com.clarifai.grpc.api.ModelVersion getModelVersion() {
   }
   /**
    * <pre>
-   * specification for the model version to be uploaded
+   * Specification for the model version to be uploaded
    * </pre>
    *
    * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -234,7 +239,7 @@ public com.clarifai.grpc.api.ModelVersionOrBuilder getModelVersionOrBuilder() {
   private long totalSize_;
   /**
    * <pre>
-   * number of bytes in the model files to be uploaded
+   * Number of bytes in the model files to be uploaded
    * </pre>
    *
    * <code>uint64 total_size = 4;</code>
@@ -245,6 +250,21 @@ public long getTotalSize() {
     return totalSize_;
   }
 
+  public static final int IS_V3_FIELD_NUMBER = 5;
+  private boolean isV3_;
+  /**
+   * <pre>
+   * Whether the uploaded package will be a .tar.gz which contains a Dockerfile or the standard .zip
+   * </pre>
+   *
+   * <code>bool is_v3 = 5;</code>
+   * @return The isV3.
+   */
+  @java.lang.Override
+  public boolean getIsV3() {
+    return isV3_;
+  }
+
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -271,6 +291,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (totalSize_ != 0L) {
       output.writeUInt64(4, totalSize_);
     }
+    if (isV3_ != false) {
+      output.writeBool(5, isV3_);
+    }
     unknownFields.writeTo(output);
   }
 
@@ -295,6 +318,10 @@ public int getSerializedSize() {
       size += com.google.protobuf.CodedOutputStream
         .computeUInt64Size(4, totalSize_);
     }
+    if (isV3_ != false) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeBoolSize(5, isV3_);
+    }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
     return size;
@@ -324,6 +351,8 @@ public boolean equals(final java.lang.Object obj) {
     }
     if (getTotalSize()
         != other.getTotalSize()) return false;
+    if (getIsV3()
+        != other.getIsV3()) return false;
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -348,6 +377,9 @@ public int hashCode() {
     hash = (37 * hash) + TOTAL_SIZE_FIELD_NUMBER;
     hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
         getTotalSize());
+    hash = (37 * hash) + IS_V3_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+        getIsV3());
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -497,6 +529,8 @@ public Builder clear() {
       }
       totalSize_ = 0L;
 
+      isV3_ = false;
+
       return this;
     }
 
@@ -535,6 +569,7 @@ public com.clarifai.grpc.api.PostModelVersionsUploadConfig buildPartial() {
         result.modelVersion_ = modelVersionBuilder_.build();
       }
       result.totalSize_ = totalSize_;
+      result.isV3_ = isV3_;
       onBuilt();
       return result;
     }
@@ -596,6 +631,9 @@ public Builder mergeFrom(com.clarifai.grpc.api.PostModelVersionsUploadConfig oth
       if (other.getTotalSize() != 0L) {
         setTotalSize(other.getTotalSize());
       }
+      if (other.getIsV3() != false) {
+        setIsV3(other.getIsV3());
+      }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
       return this;
@@ -747,7 +785,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
     private java.lang.Object modelId_ = "";
     /**
      * <pre>
-     * model to create version of
+     * Model to create version for
      * </pre>
      *
      * <code>string model_id = 2;</code>
@@ -767,7 +805,7 @@ public java.lang.String getModelId() {
     }
     /**
      * <pre>
-     * model to create version of
+     * Model to create version for
      * </pre>
      *
      * <code>string model_id = 2;</code>
@@ -788,7 +826,7 @@ public java.lang.String getModelId() {
     }
     /**
      * <pre>
-     * model to create version of
+     * Model to create version for
      * </pre>
      *
      * <code>string model_id = 2;</code>
@@ -807,7 +845,7 @@ public Builder setModelId(
     }
     /**
      * <pre>
-     * model to create version of
+     * Model to create version for
      * </pre>
      *
      * <code>string model_id = 2;</code>
@@ -821,7 +859,7 @@ public Builder clearModelId() {
     }
     /**
      * <pre>
-     * model to create version of
+     * Model to create version for
      * </pre>
      *
      * <code>string model_id = 2;</code>
@@ -845,7 +883,7 @@ public Builder setModelIdBytes(
         com.clarifai.grpc.api.ModelVersion, com.clarifai.grpc.api.ModelVersion.Builder, com.clarifai.grpc.api.ModelVersionOrBuilder> modelVersionBuilder_;
     /**
      * <pre>
-     * specification for the model version to be uploaded
+     * Specification for the model version to be uploaded
      * </pre>
      *
      * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -856,7 +894,7 @@ public boolean hasModelVersion() {
     }
     /**
      * <pre>
-     * specification for the model version to be uploaded
+     * Specification for the model version to be uploaded
      * </pre>
      *
      * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -871,7 +909,7 @@ public com.clarifai.grpc.api.ModelVersion getModelVersion() {
     }
     /**
      * <pre>
-     * specification for the model version to be uploaded
+     * Specification for the model version to be uploaded
      * </pre>
      *
      * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -891,7 +929,7 @@ public Builder setModelVersion(com.clarifai.grpc.api.ModelVersion value) {
     }
     /**
      * <pre>
-     * specification for the model version to be uploaded
+     * Specification for the model version to be uploaded
      * </pre>
      *
      * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -909,7 +947,7 @@ public Builder setModelVersion(
     }
     /**
      * <pre>
-     * specification for the model version to be uploaded
+     * Specification for the model version to be uploaded
      * </pre>
      *
      * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -931,7 +969,7 @@ public Builder mergeModelVersion(com.clarifai.grpc.api.ModelVersion value) {
     }
     /**
      * <pre>
-     * specification for the model version to be uploaded
+     * Specification for the model version to be uploaded
      * </pre>
      *
      * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -949,7 +987,7 @@ public Builder clearModelVersion() {
     }
     /**
      * <pre>
-     * specification for the model version to be uploaded
+     * Specification for the model version to be uploaded
      * </pre>
      *
      * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -961,7 +999,7 @@ public com.clarifai.grpc.api.ModelVersion.Builder getModelVersionBuilder() {
     }
     /**
      * <pre>
-     * specification for the model version to be uploaded
+     * Specification for the model version to be uploaded
      * </pre>
      *
      * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -976,7 +1014,7 @@ public com.clarifai.grpc.api.ModelVersionOrBuilder getModelVersionOrBuilder() {
     }
     /**
      * <pre>
-     * specification for the model version to be uploaded
+     * Specification for the model version to be uploaded
      * </pre>
      *
      * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -998,7 +1036,7 @@ public com.clarifai.grpc.api.ModelVersionOrBuilder getModelVersionOrBuilder() {
     private long totalSize_ ;
     /**
      * <pre>
-     * number of bytes in the model files to be uploaded
+     * Number of bytes in the model files to be uploaded
      * </pre>
      *
      * <code>uint64 total_size = 4;</code>
@@ -1010,7 +1048,7 @@ public long getTotalSize() {
     }
     /**
      * <pre>
-     * number of bytes in the model files to be uploaded
+     * Number of bytes in the model files to be uploaded
      * </pre>
      *
      * <code>uint64 total_size = 4;</code>
@@ -1025,7 +1063,7 @@ public Builder setTotalSize(long value) {
     }
     /**
      * <pre>
-     * number of bytes in the model files to be uploaded
+     * Number of bytes in the model files to be uploaded
      * </pre>
      *
      * <code>uint64 total_size = 4;</code>
@@ -1037,6 +1075,49 @@ public Builder clearTotalSize() {
       onChanged();
       return this;
     }
+
+    private boolean isV3_ ;
+    /**
+     * <pre>
+     * Whether the uploaded package will be a .tar.gz which contains a Dockerfile or the standard .zip
+     * </pre>
+     *
+     * <code>bool is_v3 = 5;</code>
+     * @return The isV3.
+     */
+    @java.lang.Override
+    public boolean getIsV3() {
+      return isV3_;
+    }
+    /**
+     * <pre>
+     * Whether the uploaded package will be a .tar.gz which contains a Dockerfile or the standard .zip
+     * </pre>
+     *
+     * <code>bool is_v3 = 5;</code>
+     * @param value The isV3 to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIsV3(boolean value) {
+      
+      isV3_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Whether the uploaded package will be a .tar.gz which contains a Dockerfile or the standard .zip
+     * </pre>
+     *
+     * <code>bool is_v3 = 5;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIsV3() {
+      
+      isV3_ = false;
+      onChanged();
+      return this;
+    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {
diff --git a/src/main/java/com/clarifai/grpc/api/PostModelVersionsUploadConfigOrBuilder.java b/src/main/java/com/clarifai/grpc/api/PostModelVersionsUploadConfigOrBuilder.java
index 2b64563..1db61a1 100644
--- a/src/main/java/com/clarifai/grpc/api/PostModelVersionsUploadConfigOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/PostModelVersionsUploadConfigOrBuilder.java
@@ -24,7 +24,7 @@ public interface PostModelVersionsUploadConfigOrBuilder extends
 
   /**
    * <pre>
-   * model to create version of
+   * Model to create version for
    * </pre>
    *
    * <code>string model_id = 2;</code>
@@ -33,7 +33,7 @@ public interface PostModelVersionsUploadConfigOrBuilder extends
   java.lang.String getModelId();
   /**
    * <pre>
-   * model to create version of
+   * Model to create version for
    * </pre>
    *
    * <code>string model_id = 2;</code>
@@ -44,7 +44,7 @@ public interface PostModelVersionsUploadConfigOrBuilder extends
 
   /**
    * <pre>
-   * specification for the model version to be uploaded
+   * Specification for the model version to be uploaded
    * </pre>
    *
    * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -53,7 +53,7 @@ public interface PostModelVersionsUploadConfigOrBuilder extends
   boolean hasModelVersion();
   /**
    * <pre>
-   * specification for the model version to be uploaded
+   * Specification for the model version to be uploaded
    * </pre>
    *
    * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -62,7 +62,7 @@ public interface PostModelVersionsUploadConfigOrBuilder extends
   com.clarifai.grpc.api.ModelVersion getModelVersion();
   /**
    * <pre>
-   * specification for the model version to be uploaded
+   * Specification for the model version to be uploaded
    * </pre>
    *
    * <code>.clarifai.api.ModelVersion model_version = 3;</code>
@@ -71,11 +71,21 @@ public interface PostModelVersionsUploadConfigOrBuilder extends
 
   /**
    * <pre>
-   * number of bytes in the model files to be uploaded
+   * Number of bytes in the model files to be uploaded
    * </pre>
    *
    * <code>uint64 total_size = 4;</code>
    * @return The totalSize.
    */
   long getTotalSize();
+
+  /**
+   * <pre>
+   * Whether the uploaded package will be a .tar.gz which contains a Dockerfile or the standard .zip
+   * </pre>
+   *
+   * <code>bool is_v3 = 5;</code>
+   * @return The isV3.
+   */
+  boolean getIsV3();
 }
diff --git a/src/main/java/com/clarifai/grpc/api/PostModelsRequest.java b/src/main/java/com/clarifai/grpc/api/PostModelsRequest.java
index 4299667..cda0494 100644
--- a/src/main/java/com/clarifai/grpc/api/PostModelsRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/PostModelsRequest.java
@@ -164,7 +164,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
    *
    * <code>.clarifai.api.Model model = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.PostModelsRequest.model is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5324
+   *     See proto/clarifai/api/service.proto;l=5424
    * @return Whether the model field is set.
    */
   @java.lang.Override
@@ -181,7 +181,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
    *
    * <code>.clarifai.api.Model model = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.PostModelsRequest.model is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5324
+   *     See proto/clarifai/api/service.proto;l=5424
    * @return The model.
    */
   @java.lang.Override
@@ -801,7 +801,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
      *
      * <code>.clarifai.api.Model model = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.PostModelsRequest.model is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5324
+     *     See proto/clarifai/api/service.proto;l=5424
      * @return Whether the model field is set.
      */
     @java.lang.Deprecated public boolean hasModel() {
@@ -817,7 +817,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
      *
      * <code>.clarifai.api.Model model = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.PostModelsRequest.model is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5324
+     *     See proto/clarifai/api/service.proto;l=5424
      * @return The model.
      */
     @java.lang.Deprecated public com.clarifai.grpc.api.Model getModel() {
diff --git a/src/main/java/com/clarifai/grpc/api/PostModelsRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/PostModelsRequestOrBuilder.java
index 4994225..292f9be 100644
--- a/src/main/java/com/clarifai/grpc/api/PostModelsRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/PostModelsRequestOrBuilder.java
@@ -32,7 +32,7 @@ public interface PostModelsRequestOrBuilder extends
    *
    * <code>.clarifai.api.Model model = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.PostModelsRequest.model is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5324
+   *     See proto/clarifai/api/service.proto;l=5424
    * @return Whether the model field is set.
    */
   @java.lang.Deprecated boolean hasModel();
@@ -46,7 +46,7 @@ public interface PostModelsRequestOrBuilder extends
    *
    * <code>.clarifai.api.Model model = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.PostModelsRequest.model is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5324
+   *     See proto/clarifai/api/service.proto;l=5424
    * @return The model.
    */
   @java.lang.Deprecated com.clarifai.grpc.api.Model getModel();
diff --git a/src/main/java/com/clarifai/grpc/api/PostNodepoolsRequest.java b/src/main/java/com/clarifai/grpc/api/PostNodepoolsRequest.java
new file mode 100644
index 0000000..c82d524
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/PostNodepoolsRequest.java
@@ -0,0 +1,1238 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * Protobuf type {@code clarifai.api.PostNodepoolsRequest}
+ */
+public final class PostNodepoolsRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.PostNodepoolsRequest)
+    PostNodepoolsRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use PostNodepoolsRequest.newBuilder() to construct.
+  private PostNodepoolsRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private PostNodepoolsRequest() {
+    computeClusterId_ = "";
+    nodepools_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new PostNodepoolsRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private PostNodepoolsRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.UserAppIDSet.Builder subBuilder = null;
+            if (userAppId_ != null) {
+              subBuilder = userAppId_.toBuilder();
+            }
+            userAppId_ = input.readMessage(com.clarifai.grpc.api.UserAppIDSet.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(userAppId_);
+              userAppId_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            computeClusterId_ = s;
+            break;
+          }
+          case 26: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              nodepools_ = new java.util.ArrayList<com.clarifai.grpc.api.Nodepool>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            nodepools_.add(
+                input.readMessage(com.clarifai.grpc.api.Nodepool.parser(), extensionRegistry));
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        nodepools_ = java.util.Collections.unmodifiableList(nodepools_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PostNodepoolsRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PostNodepoolsRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.PostNodepoolsRequest.class, com.clarifai.grpc.api.PostNodepoolsRequest.Builder.class);
+  }
+
+  public static final int USER_APP_ID_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  @java.lang.Override
+  public boolean hasUserAppId() {
+    return userAppId_ != null;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+    return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+  }
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+    return getUserAppId();
+  }
+
+  public static final int COMPUTE_CLUSTER_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object computeClusterId_;
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  @java.lang.Override
+  public java.lang.String getComputeClusterId() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      computeClusterId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getComputeClusterIdBytes() {
+    java.lang.Object ref = computeClusterId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      computeClusterId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int NODEPOOLS_FIELD_NUMBER = 3;
+  private java.util.List<com.clarifai.grpc.api.Nodepool> nodepools_;
+  /**
+   * <pre>
+   * This allows you to create one or more nodepools by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  @java.lang.Override
+  public java.util.List<com.clarifai.grpc.api.Nodepool> getNodepoolsList() {
+    return nodepools_;
+  }
+  /**
+   * <pre>
+   * This allows you to create one or more nodepools by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends com.clarifai.grpc.api.NodepoolOrBuilder> 
+      getNodepoolsOrBuilderList() {
+    return nodepools_;
+  }
+  /**
+   * <pre>
+   * This allows you to create one or more nodepools by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  @java.lang.Override
+  public int getNodepoolsCount() {
+    return nodepools_.size();
+  }
+  /**
+   * <pre>
+   * This allows you to create one or more nodepools by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.Nodepool getNodepools(int index) {
+    return nodepools_.get(index);
+  }
+  /**
+   * <pre>
+   * This allows you to create one or more nodepools by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolsOrBuilder(
+      int index) {
+    return nodepools_.get(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (userAppId_ != null) {
+      output.writeMessage(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, computeClusterId_);
+    }
+    for (int i = 0; i < nodepools_.size(); i++) {
+      output.writeMessage(3, nodepools_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (userAppId_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getUserAppId());
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(computeClusterId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, computeClusterId_);
+    }
+    for (int i = 0; i < nodepools_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(3, nodepools_.get(i));
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.PostNodepoolsRequest)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.PostNodepoolsRequest other = (com.clarifai.grpc.api.PostNodepoolsRequest) obj;
+
+    if (hasUserAppId() != other.hasUserAppId()) return false;
+    if (hasUserAppId()) {
+      if (!getUserAppId()
+          .equals(other.getUserAppId())) return false;
+    }
+    if (!getComputeClusterId()
+        .equals(other.getComputeClusterId())) return false;
+    if (!getNodepoolsList()
+        .equals(other.getNodepoolsList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasUserAppId()) {
+      hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getUserAppId().hashCode();
+    }
+    hash = (37 * hash) + COMPUTE_CLUSTER_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getComputeClusterId().hashCode();
+    if (getNodepoolsCount() > 0) {
+      hash = (37 * hash) + NODEPOOLS_FIELD_NUMBER;
+      hash = (53 * hash) + getNodepoolsList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.PostNodepoolsRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.PostNodepoolsRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code clarifai.api.PostNodepoolsRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.PostNodepoolsRequest)
+      com.clarifai.grpc.api.PostNodepoolsRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PostNodepoolsRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PostNodepoolsRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.PostNodepoolsRequest.class, com.clarifai.grpc.api.PostNodepoolsRequest.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.PostNodepoolsRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getNodepoolsFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+      computeClusterId_ = "";
+
+      if (nodepoolsBuilder_ == null) {
+        nodepools_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        nodepoolsBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_PostNodepoolsRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.PostNodepoolsRequest getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.PostNodepoolsRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.PostNodepoolsRequest build() {
+      com.clarifai.grpc.api.PostNodepoolsRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.PostNodepoolsRequest buildPartial() {
+      com.clarifai.grpc.api.PostNodepoolsRequest result = new com.clarifai.grpc.api.PostNodepoolsRequest(this);
+      int from_bitField0_ = bitField0_;
+      if (userAppIdBuilder_ == null) {
+        result.userAppId_ = userAppId_;
+      } else {
+        result.userAppId_ = userAppIdBuilder_.build();
+      }
+      result.computeClusterId_ = computeClusterId_;
+      if (nodepoolsBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          nodepools_ = java.util.Collections.unmodifiableList(nodepools_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.nodepools_ = nodepools_;
+      } else {
+        result.nodepools_ = nodepoolsBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.PostNodepoolsRequest) {
+        return mergeFrom((com.clarifai.grpc.api.PostNodepoolsRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.PostNodepoolsRequest other) {
+      if (other == com.clarifai.grpc.api.PostNodepoolsRequest.getDefaultInstance()) return this;
+      if (other.hasUserAppId()) {
+        mergeUserAppId(other.getUserAppId());
+      }
+      if (!other.getComputeClusterId().isEmpty()) {
+        computeClusterId_ = other.computeClusterId_;
+        onChanged();
+      }
+      if (nodepoolsBuilder_ == null) {
+        if (!other.nodepools_.isEmpty()) {
+          if (nodepools_.isEmpty()) {
+            nodepools_ = other.nodepools_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureNodepoolsIsMutable();
+            nodepools_.addAll(other.nodepools_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.nodepools_.isEmpty()) {
+          if (nodepoolsBuilder_.isEmpty()) {
+            nodepoolsBuilder_.dispose();
+            nodepoolsBuilder_ = null;
+            nodepools_ = other.nodepools_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            nodepoolsBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getNodepoolsFieldBuilder() : null;
+          } else {
+            nodepoolsBuilder_.addAllMessages(other.nodepools_);
+          }
+        }
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.PostNodepoolsRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.PostNodepoolsRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.clarifai.grpc.api.UserAppIDSet userAppId_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> userAppIdBuilder_;
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return Whether the userAppId field is set.
+     */
+    public boolean hasUserAppId() {
+      return userAppIdBuilder_ != null || userAppId_ != null;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     * @return The userAppId.
+     */
+    public com.clarifai.grpc.api.UserAppIDSet getUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        return userAppId_ == null ? com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      } else {
+        return userAppIdBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        userAppId_ = value;
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder setUserAppId(
+        com.clarifai.grpc.api.UserAppIDSet.Builder builderForValue) {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = builderForValue.build();
+        onChanged();
+      } else {
+        userAppIdBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder mergeUserAppId(com.clarifai.grpc.api.UserAppIDSet value) {
+      if (userAppIdBuilder_ == null) {
+        if (userAppId_ != null) {
+          userAppId_ =
+            com.clarifai.grpc.api.UserAppIDSet.newBuilder(userAppId_).mergeFrom(value).buildPartial();
+        } else {
+          userAppId_ = value;
+        }
+        onChanged();
+      } else {
+        userAppIdBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public Builder clearUserAppId() {
+      if (userAppIdBuilder_ == null) {
+        userAppId_ = null;
+        onChanged();
+      } else {
+        userAppId_ = null;
+        userAppIdBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSet.Builder getUserAppIdBuilder() {
+      
+      onChanged();
+      return getUserAppIdFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
+      if (userAppIdBuilder_ != null) {
+        return userAppIdBuilder_.getMessageOrBuilder();
+      } else {
+        return userAppId_ == null ?
+            com.clarifai.grpc.api.UserAppIDSet.getDefaultInstance() : userAppId_;
+      }
+    }
+    /**
+     * <pre>
+     * Only the user_id is used from this.
+     * </pre>
+     *
+     * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder> 
+        getUserAppIdFieldBuilder() {
+      if (userAppIdBuilder_ == null) {
+        userAppIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.UserAppIDSet, com.clarifai.grpc.api.UserAppIDSet.Builder, com.clarifai.grpc.api.UserAppIDSetOrBuilder>(
+                getUserAppId(),
+                getParentForChildren(),
+                isClean());
+        userAppId_ = null;
+      }
+      return userAppIdBuilder_;
+    }
+
+    private java.lang.Object computeClusterId_ = "";
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The computeClusterId.
+     */
+    public java.lang.String getComputeClusterId() {
+      java.lang.Object ref = computeClusterId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        computeClusterId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return The bytes for computeClusterId.
+     */
+    public com.google.protobuf.ByteString
+        getComputeClusterIdBytes() {
+      java.lang.Object ref = computeClusterId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        computeClusterId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearComputeClusterId() {
+      
+      computeClusterId_ = getDefaultInstance().getComputeClusterId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string compute_cluster_id = 2;</code>
+     * @param value The bytes for computeClusterId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setComputeClusterIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      computeClusterId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.util.List<com.clarifai.grpc.api.Nodepool> nodepools_ =
+      java.util.Collections.emptyList();
+    private void ensureNodepoolsIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        nodepools_ = new java.util.ArrayList<com.clarifai.grpc.api.Nodepool>(nodepools_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder> nodepoolsBuilder_;
+
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.Nodepool> getNodepoolsList() {
+      if (nodepoolsBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(nodepools_);
+      } else {
+        return nodepoolsBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public int getNodepoolsCount() {
+      if (nodepoolsBuilder_ == null) {
+        return nodepools_.size();
+      } else {
+        return nodepoolsBuilder_.getCount();
+      }
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public com.clarifai.grpc.api.Nodepool getNodepools(int index) {
+      if (nodepoolsBuilder_ == null) {
+        return nodepools_.get(index);
+      } else {
+        return nodepoolsBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder setNodepools(
+        int index, com.clarifai.grpc.api.Nodepool value) {
+      if (nodepoolsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodepoolsIsMutable();
+        nodepools_.set(index, value);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder setNodepools(
+        int index, com.clarifai.grpc.api.Nodepool.Builder builderForValue) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        nodepoolsBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder addNodepools(com.clarifai.grpc.api.Nodepool value) {
+      if (nodepoolsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodepoolsIsMutable();
+        nodepools_.add(value);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder addNodepools(
+        int index, com.clarifai.grpc.api.Nodepool value) {
+      if (nodepoolsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureNodepoolsIsMutable();
+        nodepools_.add(index, value);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder addNodepools(
+        com.clarifai.grpc.api.Nodepool.Builder builderForValue) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.add(builderForValue.build());
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder addNodepools(
+        int index, com.clarifai.grpc.api.Nodepool.Builder builderForValue) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder addAllNodepools(
+        java.lang.Iterable<? extends com.clarifai.grpc.api.Nodepool> values) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, nodepools_);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder clearNodepools() {
+      if (nodepoolsBuilder_ == null) {
+        nodepools_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public Builder removeNodepools(int index) {
+      if (nodepoolsBuilder_ == null) {
+        ensureNodepoolsIsMutable();
+        nodepools_.remove(index);
+        onChanged();
+      } else {
+        nodepoolsBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public com.clarifai.grpc.api.Nodepool.Builder getNodepoolsBuilder(
+        int index) {
+      return getNodepoolsFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolsOrBuilder(
+        int index) {
+      if (nodepoolsBuilder_ == null) {
+        return nodepools_.get(index);  } else {
+        return nodepoolsBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public java.util.List<? extends com.clarifai.grpc.api.NodepoolOrBuilder> 
+         getNodepoolsOrBuilderList() {
+      if (nodepoolsBuilder_ != null) {
+        return nodepoolsBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(nodepools_);
+      }
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public com.clarifai.grpc.api.Nodepool.Builder addNodepoolsBuilder() {
+      return getNodepoolsFieldBuilder().addBuilder(
+          com.clarifai.grpc.api.Nodepool.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public com.clarifai.grpc.api.Nodepool.Builder addNodepoolsBuilder(
+        int index) {
+      return getNodepoolsFieldBuilder().addBuilder(
+          index, com.clarifai.grpc.api.Nodepool.getDefaultInstance());
+    }
+    /**
+     * <pre>
+     * This allows you to create one or more nodepools by posting it to the API.
+     * </pre>
+     *
+     * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+     */
+    public java.util.List<com.clarifai.grpc.api.Nodepool.Builder> 
+         getNodepoolsBuilderList() {
+      return getNodepoolsFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder> 
+        getNodepoolsFieldBuilder() {
+      if (nodepoolsBuilder_ == null) {
+        nodepoolsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder>(
+                nodepools_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        nodepools_ = null;
+      }
+      return nodepoolsBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.PostNodepoolsRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.PostNodepoolsRequest)
+  private static final com.clarifai.grpc.api.PostNodepoolsRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.PostNodepoolsRequest();
+  }
+
+  public static com.clarifai.grpc.api.PostNodepoolsRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<PostNodepoolsRequest>
+      PARSER = new com.google.protobuf.AbstractParser<PostNodepoolsRequest>() {
+    @java.lang.Override
+    public PostNodepoolsRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new PostNodepoolsRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<PostNodepoolsRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<PostNodepoolsRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.PostNodepoolsRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/PostNodepoolsRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/PostNodepoolsRequestOrBuilder.java
new file mode 100644
index 0000000..2db9ef3
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/PostNodepoolsRequestOrBuilder.java
@@ -0,0 +1,92 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface PostNodepoolsRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.PostNodepoolsRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return Whether the userAppId field is set.
+   */
+  boolean hasUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   * @return The userAppId.
+   */
+  com.clarifai.grpc.api.UserAppIDSet getUserAppId();
+  /**
+   * <pre>
+   * Only the user_id is used from this.
+   * </pre>
+   *
+   * <code>.clarifai.api.UserAppIDSet user_app_id = 1;</code>
+   */
+  com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
+
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The computeClusterId.
+   */
+  java.lang.String getComputeClusterId();
+  /**
+   * <code>string compute_cluster_id = 2;</code>
+   * @return The bytes for computeClusterId.
+   */
+  com.google.protobuf.ByteString
+      getComputeClusterIdBytes();
+
+  /**
+   * <pre>
+   * This allows you to create one or more nodepools by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  java.util.List<com.clarifai.grpc.api.Nodepool> 
+      getNodepoolsList();
+  /**
+   * <pre>
+   * This allows you to create one or more nodepools by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  com.clarifai.grpc.api.Nodepool getNodepools(int index);
+  /**
+   * <pre>
+   * This allows you to create one or more nodepools by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  int getNodepoolsCount();
+  /**
+   * <pre>
+   * This allows you to create one or more nodepools by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  java.util.List<? extends com.clarifai.grpc.api.NodepoolOrBuilder> 
+      getNodepoolsOrBuilderList();
+  /**
+   * <pre>
+   * This allows you to create one or more nodepools by posting it to the API.
+   * </pre>
+   *
+   * <code>repeated .clarifai.api.Nodepool nodepools = 3;</code>
+   */
+  com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolsOrBuilder(
+      int index);
+}
diff --git a/src/main/java/com/clarifai/grpc/api/PostRunnerItemOutputsRequest.java b/src/main/java/com/clarifai/grpc/api/PostRunnerItemOutputsRequest.java
index f0d4ccc..f8363f0 100644
--- a/src/main/java/com/clarifai/grpc/api/PostRunnerItemOutputsRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/PostRunnerItemOutputsRequest.java
@@ -20,6 +20,7 @@ private PostRunnerItemOutputsRequest(com.google.protobuf.GeneratedMessageV3.Buil
     super(builder);
   }
   private PostRunnerItemOutputsRequest() {
+    nodepoolId_ = "";
     runnerId_ = "";
     runnerItemId_ = "";
     runnerItemOutputs_ = java.util.Collections.emptyList();
@@ -72,16 +73,22 @@ private PostRunnerItemOutputsRequest(
           case 18: {
             java.lang.String s = input.readStringRequireUtf8();
 
-            runnerId_ = s;
+            nodepoolId_ = s;
             break;
           }
           case 26: {
             java.lang.String s = input.readStringRequireUtf8();
 
-            runnerItemId_ = s;
+            runnerId_ = s;
             break;
           }
           case 34: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            runnerItemId_ = s;
+            break;
+          }
+          case 42: {
             if (!((mutable_bitField0_ & 0x00000001) != 0)) {
               runnerItemOutputs_ = new java.util.ArrayList<com.clarifai.grpc.api.RunnerItemOutput>();
               mutable_bitField0_ |= 0x00000001;
@@ -90,7 +97,7 @@ private PostRunnerItemOutputsRequest(
                 input.readMessage(com.clarifai.grpc.api.RunnerItemOutput.parser(), extensionRegistry));
             break;
           }
-          case 42: {
+          case 50: {
             com.clarifai.grpc.api.status.Status.Builder subBuilder = null;
             if (status_ != null) {
               subBuilder = status_.toBuilder();
@@ -166,14 +173,60 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
     return getUserAppId();
   }
 
-  public static final int RUNNER_ID_FIELD_NUMBER = 2;
+  public static final int NODEPOOL_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object nodepoolId_;
+  /**
+   * <pre>
+   * The particular nodepool that runner belongs to
+   * </pre>
+   *
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  @java.lang.Override
+  public java.lang.String getNodepoolId() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      nodepoolId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * The particular nodepool that runner belongs to
+   * </pre>
+   *
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getNodepoolIdBytes() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      nodepoolId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int RUNNER_ID_FIELD_NUMBER = 3;
   private volatile java.lang.Object runnerId_;
   /**
    * <pre>
    * The particular runner that processed the work.
    * </pre>
    *
-   * <code>string runner_id = 2;</code>
+   * <code>string runner_id = 3;</code>
    * @return The runnerId.
    */
   @java.lang.Override
@@ -194,7 +247,7 @@ public java.lang.String getRunnerId() {
    * The particular runner that processed the work.
    * </pre>
    *
-   * <code>string runner_id = 2;</code>
+   * <code>string runner_id = 3;</code>
    * @return The bytes for runnerId.
    */
   @java.lang.Override
@@ -212,14 +265,14 @@ public java.lang.String getRunnerId() {
     }
   }
 
-  public static final int RUNNER_ITEM_ID_FIELD_NUMBER = 3;
+  public static final int RUNNER_ITEM_ID_FIELD_NUMBER = 4;
   private volatile java.lang.Object runnerItemId_;
   /**
    * <pre>
    * The particular item of work processed.
    * </pre>
    *
-   * <code>string runner_item_id = 3;</code>
+   * <code>string runner_item_id = 4;</code>
    * @return The runnerItemId.
    */
   @java.lang.Override
@@ -240,7 +293,7 @@ public java.lang.String getRunnerItemId() {
    * The particular item of work processed.
    * </pre>
    *
-   * <code>string runner_item_id = 3;</code>
+   * <code>string runner_item_id = 4;</code>
    * @return The bytes for runnerItemId.
    */
   @java.lang.Override
@@ -258,14 +311,14 @@ public java.lang.String getRunnerItemId() {
     }
   }
 
-  public static final int RUNNER_ITEM_OUTPUTS_FIELD_NUMBER = 4;
+  public static final int RUNNER_ITEM_OUTPUTS_FIELD_NUMBER = 5;
   private java.util.List<com.clarifai.grpc.api.RunnerItemOutput> runnerItemOutputs_;
   /**
    * <pre>
    * This allows you to create one or more runner by posting it to the API.
    * </pre>
    *
-   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
    */
   @java.lang.Override
   public java.util.List<com.clarifai.grpc.api.RunnerItemOutput> getRunnerItemOutputsList() {
@@ -276,7 +329,7 @@ public java.util.List<com.clarifai.grpc.api.RunnerItemOutput> getRunnerItemOutpu
    * This allows you to create one or more runner by posting it to the API.
    * </pre>
    *
-   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
    */
   @java.lang.Override
   public java.util.List<? extends com.clarifai.grpc.api.RunnerItemOutputOrBuilder> 
@@ -288,7 +341,7 @@ public java.util.List<com.clarifai.grpc.api.RunnerItemOutput> getRunnerItemOutpu
    * This allows you to create one or more runner by posting it to the API.
    * </pre>
    *
-   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
    */
   @java.lang.Override
   public int getRunnerItemOutputsCount() {
@@ -299,7 +352,7 @@ public int getRunnerItemOutputsCount() {
    * This allows you to create one or more runner by posting it to the API.
    * </pre>
    *
-   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
    */
   @java.lang.Override
   public com.clarifai.grpc.api.RunnerItemOutput getRunnerItemOutputs(int index) {
@@ -310,7 +363,7 @@ public com.clarifai.grpc.api.RunnerItemOutput getRunnerItemOutputs(int index) {
    * This allows you to create one or more runner by posting it to the API.
    * </pre>
    *
-   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
    */
   @java.lang.Override
   public com.clarifai.grpc.api.RunnerItemOutputOrBuilder getRunnerItemOutputsOrBuilder(
@@ -318,7 +371,7 @@ public com.clarifai.grpc.api.RunnerItemOutputOrBuilder getRunnerItemOutputsOrBui
     return runnerItemOutputs_.get(index);
   }
 
-  public static final int STATUS_FIELD_NUMBER = 5;
+  public static final int STATUS_FIELD_NUMBER = 6;
   private com.clarifai.grpc.api.status.Status status_;
   /**
    * <pre>
@@ -327,7 +380,7 @@ public com.clarifai.grpc.api.RunnerItemOutputOrBuilder getRunnerItemOutputsOrBui
    * in a reverse protocol.
    * </pre>
    *
-   * <code>.clarifai.api.status.Status status = 5;</code>
+   * <code>.clarifai.api.status.Status status = 6;</code>
    * @return Whether the status field is set.
    */
   @java.lang.Override
@@ -341,7 +394,7 @@ public boolean hasStatus() {
    * in a reverse protocol.
    * </pre>
    *
-   * <code>.clarifai.api.status.Status status = 5;</code>
+   * <code>.clarifai.api.status.Status status = 6;</code>
    * @return The status.
    */
   @java.lang.Override
@@ -355,7 +408,7 @@ public com.clarifai.grpc.api.status.Status getStatus() {
    * in a reverse protocol.
    * </pre>
    *
-   * <code>.clarifai.api.status.Status status = 5;</code>
+   * <code>.clarifai.api.status.Status status = 6;</code>
    */
   @java.lang.Override
   public com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder() {
@@ -379,17 +432,20 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (userAppId_ != null) {
       output.writeMessage(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, nodepoolId_);
+    }
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(runnerId_)) {
-      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, runnerId_);
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, runnerId_);
     }
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(runnerItemId_)) {
-      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, runnerItemId_);
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 4, runnerItemId_);
     }
     for (int i = 0; i < runnerItemOutputs_.size(); i++) {
-      output.writeMessage(4, runnerItemOutputs_.get(i));
+      output.writeMessage(5, runnerItemOutputs_.get(i));
     }
     if (status_ != null) {
-      output.writeMessage(5, getStatus());
+      output.writeMessage(6, getStatus());
     }
     unknownFields.writeTo(output);
   }
@@ -404,19 +460,22 @@ public int getSerializedSize() {
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, nodepoolId_);
+    }
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(runnerId_)) {
-      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, runnerId_);
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, runnerId_);
     }
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(runnerItemId_)) {
-      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, runnerItemId_);
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, runnerItemId_);
     }
     for (int i = 0; i < runnerItemOutputs_.size(); i++) {
       size += com.google.protobuf.CodedOutputStream
-        .computeMessageSize(4, runnerItemOutputs_.get(i));
+        .computeMessageSize(5, runnerItemOutputs_.get(i));
     }
     if (status_ != null) {
       size += com.google.protobuf.CodedOutputStream
-        .computeMessageSize(5, getStatus());
+        .computeMessageSize(6, getStatus());
     }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
@@ -438,6 +497,8 @@ public boolean equals(final java.lang.Object obj) {
       if (!getUserAppId()
           .equals(other.getUserAppId())) return false;
     }
+    if (!getNodepoolId()
+        .equals(other.getNodepoolId())) return false;
     if (!getRunnerId()
         .equals(other.getRunnerId())) return false;
     if (!getRunnerItemId()
@@ -464,6 +525,8 @@ public int hashCode() {
       hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
       hash = (53 * hash) + getUserAppId().hashCode();
     }
+    hash = (37 * hash) + NODEPOOL_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getNodepoolId().hashCode();
     hash = (37 * hash) + RUNNER_ID_FIELD_NUMBER;
     hash = (53 * hash) + getRunnerId().hashCode();
     hash = (37 * hash) + RUNNER_ITEM_ID_FIELD_NUMBER;
@@ -620,6 +683,8 @@ public Builder clear() {
         userAppId_ = null;
         userAppIdBuilder_ = null;
       }
+      nodepoolId_ = "";
+
       runnerId_ = "";
 
       runnerItemId_ = "";
@@ -668,6 +733,7 @@ public com.clarifai.grpc.api.PostRunnerItemOutputsRequest buildPartial() {
       } else {
         result.userAppId_ = userAppIdBuilder_.build();
       }
+      result.nodepoolId_ = nodepoolId_;
       result.runnerId_ = runnerId_;
       result.runnerItemId_ = runnerItemId_;
       if (runnerItemOutputsBuilder_ == null) {
@@ -735,6 +801,10 @@ public Builder mergeFrom(com.clarifai.grpc.api.PostRunnerItemOutputsRequest othe
       if (other.hasUserAppId()) {
         mergeUserAppId(other.getUserAppId());
       }
+      if (!other.getNodepoolId().isEmpty()) {
+        nodepoolId_ = other.nodepoolId_;
+        onChanged();
+      }
       if (!other.getRunnerId().isEmpty()) {
         runnerId_ = other.runnerId_;
         onChanged();
@@ -921,13 +991,109 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
       return userAppIdBuilder_;
     }
 
+    private java.lang.Object nodepoolId_ = "";
+    /**
+     * <pre>
+     * The particular nodepool that runner belongs to
+     * </pre>
+     *
+     * <code>string nodepool_id = 2;</code>
+     * @return The nodepoolId.
+     */
+    public java.lang.String getNodepoolId() {
+      java.lang.Object ref = nodepoolId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        nodepoolId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The particular nodepool that runner belongs to
+     * </pre>
+     *
+     * <code>string nodepool_id = 2;</code>
+     * @return The bytes for nodepoolId.
+     */
+    public com.google.protobuf.ByteString
+        getNodepoolIdBytes() {
+      java.lang.Object ref = nodepoolId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        nodepoolId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The particular nodepool that runner belongs to
+     * </pre>
+     *
+     * <code>string nodepool_id = 2;</code>
+     * @param value The nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The particular nodepool that runner belongs to
+     * </pre>
+     *
+     * <code>string nodepool_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearNodepoolId() {
+      
+      nodepoolId_ = getDefaultInstance().getNodepoolId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The particular nodepool that runner belongs to
+     * </pre>
+     *
+     * <code>string nodepool_id = 2;</code>
+     * @param value The bytes for nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+
     private java.lang.Object runnerId_ = "";
     /**
      * <pre>
      * The particular runner that processed the work.
      * </pre>
      *
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @return The runnerId.
      */
     public java.lang.String getRunnerId() {
@@ -947,7 +1113,7 @@ public java.lang.String getRunnerId() {
      * The particular runner that processed the work.
      * </pre>
      *
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @return The bytes for runnerId.
      */
     public com.google.protobuf.ByteString
@@ -968,7 +1134,7 @@ public java.lang.String getRunnerId() {
      * The particular runner that processed the work.
      * </pre>
      *
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @param value The runnerId to set.
      * @return This builder for chaining.
      */
@@ -987,7 +1153,7 @@ public Builder setRunnerId(
      * The particular runner that processed the work.
      * </pre>
      *
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @return This builder for chaining.
      */
     public Builder clearRunnerId() {
@@ -1001,7 +1167,7 @@ public Builder clearRunnerId() {
      * The particular runner that processed the work.
      * </pre>
      *
-     * <code>string runner_id = 2;</code>
+     * <code>string runner_id = 3;</code>
      * @param value The bytes for runnerId to set.
      * @return This builder for chaining.
      */
@@ -1023,7 +1189,7 @@ public Builder setRunnerIdBytes(
      * The particular item of work processed.
      * </pre>
      *
-     * <code>string runner_item_id = 3;</code>
+     * <code>string runner_item_id = 4;</code>
      * @return The runnerItemId.
      */
     public java.lang.String getRunnerItemId() {
@@ -1043,7 +1209,7 @@ public java.lang.String getRunnerItemId() {
      * The particular item of work processed.
      * </pre>
      *
-     * <code>string runner_item_id = 3;</code>
+     * <code>string runner_item_id = 4;</code>
      * @return The bytes for runnerItemId.
      */
     public com.google.protobuf.ByteString
@@ -1064,7 +1230,7 @@ public java.lang.String getRunnerItemId() {
      * The particular item of work processed.
      * </pre>
      *
-     * <code>string runner_item_id = 3;</code>
+     * <code>string runner_item_id = 4;</code>
      * @param value The runnerItemId to set.
      * @return This builder for chaining.
      */
@@ -1083,7 +1249,7 @@ public Builder setRunnerItemId(
      * The particular item of work processed.
      * </pre>
      *
-     * <code>string runner_item_id = 3;</code>
+     * <code>string runner_item_id = 4;</code>
      * @return This builder for chaining.
      */
     public Builder clearRunnerItemId() {
@@ -1097,7 +1263,7 @@ public Builder clearRunnerItemId() {
      * The particular item of work processed.
      * </pre>
      *
-     * <code>string runner_item_id = 3;</code>
+     * <code>string runner_item_id = 4;</code>
      * @param value The bytes for runnerItemId to set.
      * @return This builder for chaining.
      */
@@ -1130,7 +1296,7 @@ private void ensureRunnerItemOutputsIsMutable() {
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public java.util.List<com.clarifai.grpc.api.RunnerItemOutput> getRunnerItemOutputsList() {
       if (runnerItemOutputsBuilder_ == null) {
@@ -1144,7 +1310,7 @@ public java.util.List<com.clarifai.grpc.api.RunnerItemOutput> getRunnerItemOutpu
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public int getRunnerItemOutputsCount() {
       if (runnerItemOutputsBuilder_ == null) {
@@ -1158,7 +1324,7 @@ public int getRunnerItemOutputsCount() {
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public com.clarifai.grpc.api.RunnerItemOutput getRunnerItemOutputs(int index) {
       if (runnerItemOutputsBuilder_ == null) {
@@ -1172,7 +1338,7 @@ public com.clarifai.grpc.api.RunnerItemOutput getRunnerItemOutputs(int index) {
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public Builder setRunnerItemOutputs(
         int index, com.clarifai.grpc.api.RunnerItemOutput value) {
@@ -1193,7 +1359,7 @@ public Builder setRunnerItemOutputs(
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public Builder setRunnerItemOutputs(
         int index, com.clarifai.grpc.api.RunnerItemOutput.Builder builderForValue) {
@@ -1211,7 +1377,7 @@ public Builder setRunnerItemOutputs(
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public Builder addRunnerItemOutputs(com.clarifai.grpc.api.RunnerItemOutput value) {
       if (runnerItemOutputsBuilder_ == null) {
@@ -1231,7 +1397,7 @@ public Builder addRunnerItemOutputs(com.clarifai.grpc.api.RunnerItemOutput value
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public Builder addRunnerItemOutputs(
         int index, com.clarifai.grpc.api.RunnerItemOutput value) {
@@ -1252,7 +1418,7 @@ public Builder addRunnerItemOutputs(
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public Builder addRunnerItemOutputs(
         com.clarifai.grpc.api.RunnerItemOutput.Builder builderForValue) {
@@ -1270,7 +1436,7 @@ public Builder addRunnerItemOutputs(
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public Builder addRunnerItemOutputs(
         int index, com.clarifai.grpc.api.RunnerItemOutput.Builder builderForValue) {
@@ -1288,7 +1454,7 @@ public Builder addRunnerItemOutputs(
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public Builder addAllRunnerItemOutputs(
         java.lang.Iterable<? extends com.clarifai.grpc.api.RunnerItemOutput> values) {
@@ -1307,7 +1473,7 @@ public Builder addAllRunnerItemOutputs(
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public Builder clearRunnerItemOutputs() {
       if (runnerItemOutputsBuilder_ == null) {
@@ -1324,7 +1490,7 @@ public Builder clearRunnerItemOutputs() {
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public Builder removeRunnerItemOutputs(int index) {
       if (runnerItemOutputsBuilder_ == null) {
@@ -1341,7 +1507,7 @@ public Builder removeRunnerItemOutputs(int index) {
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public com.clarifai.grpc.api.RunnerItemOutput.Builder getRunnerItemOutputsBuilder(
         int index) {
@@ -1352,7 +1518,7 @@ public com.clarifai.grpc.api.RunnerItemOutput.Builder getRunnerItemOutputsBuilde
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public com.clarifai.grpc.api.RunnerItemOutputOrBuilder getRunnerItemOutputsOrBuilder(
         int index) {
@@ -1366,7 +1532,7 @@ public com.clarifai.grpc.api.RunnerItemOutputOrBuilder getRunnerItemOutputsOrBui
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public java.util.List<? extends com.clarifai.grpc.api.RunnerItemOutputOrBuilder> 
          getRunnerItemOutputsOrBuilderList() {
@@ -1381,7 +1547,7 @@ public com.clarifai.grpc.api.RunnerItemOutputOrBuilder getRunnerItemOutputsOrBui
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public com.clarifai.grpc.api.RunnerItemOutput.Builder addRunnerItemOutputsBuilder() {
       return getRunnerItemOutputsFieldBuilder().addBuilder(
@@ -1392,7 +1558,7 @@ public com.clarifai.grpc.api.RunnerItemOutput.Builder addRunnerItemOutputsBuilde
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public com.clarifai.grpc.api.RunnerItemOutput.Builder addRunnerItemOutputsBuilder(
         int index) {
@@ -1404,7 +1570,7 @@ public com.clarifai.grpc.api.RunnerItemOutput.Builder addRunnerItemOutputsBuilde
      * This allows you to create one or more runner by posting it to the API.
      * </pre>
      *
-     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+     * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
      */
     public java.util.List<com.clarifai.grpc.api.RunnerItemOutput.Builder> 
          getRunnerItemOutputsBuilderList() {
@@ -1435,7 +1601,7 @@ public com.clarifai.grpc.api.RunnerItemOutput.Builder addRunnerItemOutputsBuilde
      * in a reverse protocol.
      * </pre>
      *
-     * <code>.clarifai.api.status.Status status = 5;</code>
+     * <code>.clarifai.api.status.Status status = 6;</code>
      * @return Whether the status field is set.
      */
     public boolean hasStatus() {
@@ -1448,7 +1614,7 @@ public boolean hasStatus() {
      * in a reverse protocol.
      * </pre>
      *
-     * <code>.clarifai.api.status.Status status = 5;</code>
+     * <code>.clarifai.api.status.Status status = 6;</code>
      * @return The status.
      */
     public com.clarifai.grpc.api.status.Status getStatus() {
@@ -1465,7 +1631,7 @@ public com.clarifai.grpc.api.status.Status getStatus() {
      * in a reverse protocol.
      * </pre>
      *
-     * <code>.clarifai.api.status.Status status = 5;</code>
+     * <code>.clarifai.api.status.Status status = 6;</code>
      */
     public Builder setStatus(com.clarifai.grpc.api.status.Status value) {
       if (statusBuilder_ == null) {
@@ -1487,7 +1653,7 @@ public Builder setStatus(com.clarifai.grpc.api.status.Status value) {
      * in a reverse protocol.
      * </pre>
      *
-     * <code>.clarifai.api.status.Status status = 5;</code>
+     * <code>.clarifai.api.status.Status status = 6;</code>
      */
     public Builder setStatus(
         com.clarifai.grpc.api.status.Status.Builder builderForValue) {
@@ -1507,7 +1673,7 @@ public Builder setStatus(
      * in a reverse protocol.
      * </pre>
      *
-     * <code>.clarifai.api.status.Status status = 5;</code>
+     * <code>.clarifai.api.status.Status status = 6;</code>
      */
     public Builder mergeStatus(com.clarifai.grpc.api.status.Status value) {
       if (statusBuilder_ == null) {
@@ -1531,7 +1697,7 @@ public Builder mergeStatus(com.clarifai.grpc.api.status.Status value) {
      * in a reverse protocol.
      * </pre>
      *
-     * <code>.clarifai.api.status.Status status = 5;</code>
+     * <code>.clarifai.api.status.Status status = 6;</code>
      */
     public Builder clearStatus() {
       if (statusBuilder_ == null) {
@@ -1551,7 +1717,7 @@ public Builder clearStatus() {
      * in a reverse protocol.
      * </pre>
      *
-     * <code>.clarifai.api.status.Status status = 5;</code>
+     * <code>.clarifai.api.status.Status status = 6;</code>
      */
     public com.clarifai.grpc.api.status.Status.Builder getStatusBuilder() {
       
@@ -1565,7 +1731,7 @@ public com.clarifai.grpc.api.status.Status.Builder getStatusBuilder() {
      * in a reverse protocol.
      * </pre>
      *
-     * <code>.clarifai.api.status.Status status = 5;</code>
+     * <code>.clarifai.api.status.Status status = 6;</code>
      */
     public com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder() {
       if (statusBuilder_ != null) {
@@ -1582,7 +1748,7 @@ public com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder() {
      * in a reverse protocol.
      * </pre>
      *
-     * <code>.clarifai.api.status.Status status = 5;</code>
+     * <code>.clarifai.api.status.Status status = 6;</code>
      */
     private com.google.protobuf.SingleFieldBuilderV3<
         com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder> 
diff --git a/src/main/java/com/clarifai/grpc/api/PostRunnerItemOutputsRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/PostRunnerItemOutputsRequestOrBuilder.java
index de64aa8..ca1808e 100644
--- a/src/main/java/com/clarifai/grpc/api/PostRunnerItemOutputsRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/PostRunnerItemOutputsRequestOrBuilder.java
@@ -22,12 +22,32 @@ public interface PostRunnerItemOutputsRequestOrBuilder extends
    */
   com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
 
+  /**
+   * <pre>
+   * The particular nodepool that runner belongs to
+   * </pre>
+   *
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  java.lang.String getNodepoolId();
+  /**
+   * <pre>
+   * The particular nodepool that runner belongs to
+   * </pre>
+   *
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  com.google.protobuf.ByteString
+      getNodepoolIdBytes();
+
   /**
    * <pre>
    * The particular runner that processed the work.
    * </pre>
    *
-   * <code>string runner_id = 2;</code>
+   * <code>string runner_id = 3;</code>
    * @return The runnerId.
    */
   java.lang.String getRunnerId();
@@ -36,7 +56,7 @@ public interface PostRunnerItemOutputsRequestOrBuilder extends
    * The particular runner that processed the work.
    * </pre>
    *
-   * <code>string runner_id = 2;</code>
+   * <code>string runner_id = 3;</code>
    * @return The bytes for runnerId.
    */
   com.google.protobuf.ByteString
@@ -47,7 +67,7 @@ public interface PostRunnerItemOutputsRequestOrBuilder extends
    * The particular item of work processed.
    * </pre>
    *
-   * <code>string runner_item_id = 3;</code>
+   * <code>string runner_item_id = 4;</code>
    * @return The runnerItemId.
    */
   java.lang.String getRunnerItemId();
@@ -56,7 +76,7 @@ public interface PostRunnerItemOutputsRequestOrBuilder extends
    * The particular item of work processed.
    * </pre>
    *
-   * <code>string runner_item_id = 3;</code>
+   * <code>string runner_item_id = 4;</code>
    * @return The bytes for runnerItemId.
    */
   com.google.protobuf.ByteString
@@ -67,7 +87,7 @@ public interface PostRunnerItemOutputsRequestOrBuilder extends
    * This allows you to create one or more runner by posting it to the API.
    * </pre>
    *
-   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
    */
   java.util.List<com.clarifai.grpc.api.RunnerItemOutput> 
       getRunnerItemOutputsList();
@@ -76,7 +96,7 @@ public interface PostRunnerItemOutputsRequestOrBuilder extends
    * This allows you to create one or more runner by posting it to the API.
    * </pre>
    *
-   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
    */
   com.clarifai.grpc.api.RunnerItemOutput getRunnerItemOutputs(int index);
   /**
@@ -84,7 +104,7 @@ public interface PostRunnerItemOutputsRequestOrBuilder extends
    * This allows you to create one or more runner by posting it to the API.
    * </pre>
    *
-   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
    */
   int getRunnerItemOutputsCount();
   /**
@@ -92,7 +112,7 @@ public interface PostRunnerItemOutputsRequestOrBuilder extends
    * This allows you to create one or more runner by posting it to the API.
    * </pre>
    *
-   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
    */
   java.util.List<? extends com.clarifai.grpc.api.RunnerItemOutputOrBuilder> 
       getRunnerItemOutputsOrBuilderList();
@@ -101,7 +121,7 @@ public interface PostRunnerItemOutputsRequestOrBuilder extends
    * This allows you to create one or more runner by posting it to the API.
    * </pre>
    *
-   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 4;</code>
+   * <code>repeated .clarifai.api.RunnerItemOutput runner_item_outputs = 5;</code>
    */
   com.clarifai.grpc.api.RunnerItemOutputOrBuilder getRunnerItemOutputsOrBuilder(
       int index);
@@ -113,7 +133,7 @@ com.clarifai.grpc.api.RunnerItemOutputOrBuilder getRunnerItemOutputsOrBuilder(
    * in a reverse protocol.
    * </pre>
    *
-   * <code>.clarifai.api.status.Status status = 5;</code>
+   * <code>.clarifai.api.status.Status status = 6;</code>
    * @return Whether the status field is set.
    */
   boolean hasStatus();
@@ -124,7 +144,7 @@ com.clarifai.grpc.api.RunnerItemOutputOrBuilder getRunnerItemOutputsOrBuilder(
    * in a reverse protocol.
    * </pre>
    *
-   * <code>.clarifai.api.status.Status status = 5;</code>
+   * <code>.clarifai.api.status.Status status = 6;</code>
    * @return The status.
    */
   com.clarifai.grpc.api.status.Status getStatus();
@@ -135,7 +155,7 @@ com.clarifai.grpc.api.RunnerItemOutputOrBuilder getRunnerItemOutputsOrBuilder(
    * in a reverse protocol.
    * </pre>
    *
-   * <code>.clarifai.api.status.Status status = 5;</code>
+   * <code>.clarifai.api.status.Status status = 6;</code>
    */
   com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder();
 }
diff --git a/src/main/java/com/clarifai/grpc/api/PostRunnersRequest.java b/src/main/java/com/clarifai/grpc/api/PostRunnersRequest.java
index 8d2041c..1e44808 100644
--- a/src/main/java/com/clarifai/grpc/api/PostRunnersRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/PostRunnersRequest.java
@@ -20,6 +20,7 @@ private PostRunnersRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> bui
     super(builder);
   }
   private PostRunnersRequest() {
+    nodepoolId_ = "";
     runners_ = java.util.Collections.emptyList();
   }
 
@@ -67,6 +68,12 @@ private PostRunnersRequest(
 
             break;
           }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            nodepoolId_ = s;
+            break;
+          }
           case 26: {
             if (!((mutable_bitField0_ & 0x00000001) != 0)) {
               runners_ = new java.util.ArrayList<com.clarifai.grpc.api.Runner>();
@@ -139,6 +146,44 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
     return getUserAppId();
   }
 
+  public static final int NODEPOOL_ID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object nodepoolId_;
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  @java.lang.Override
+  public java.lang.String getNodepoolId() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      nodepoolId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getNodepoolIdBytes() {
+    java.lang.Object ref = nodepoolId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      nodepoolId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
   public static final int RUNNERS_FIELD_NUMBER = 3;
   private java.util.List<com.clarifai.grpc.api.Runner> runners_;
   /**
@@ -216,6 +261,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (userAppId_ != null) {
       output.writeMessage(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, nodepoolId_);
+    }
     for (int i = 0; i < runners_.size(); i++) {
       output.writeMessage(3, runners_.get(i));
     }
@@ -232,6 +280,9 @@ public int getSerializedSize() {
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(1, getUserAppId());
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nodepoolId_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, nodepoolId_);
+    }
     for (int i = 0; i < runners_.size(); i++) {
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(3, runners_.get(i));
@@ -256,6 +307,8 @@ public boolean equals(final java.lang.Object obj) {
       if (!getUserAppId()
           .equals(other.getUserAppId())) return false;
     }
+    if (!getNodepoolId()
+        .equals(other.getNodepoolId())) return false;
     if (!getRunnersList()
         .equals(other.getRunnersList())) return false;
     if (!unknownFields.equals(other.unknownFields)) return false;
@@ -273,6 +326,8 @@ public int hashCode() {
       hash = (37 * hash) + USER_APP_ID_FIELD_NUMBER;
       hash = (53 * hash) + getUserAppId().hashCode();
     }
+    hash = (37 * hash) + NODEPOOL_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getNodepoolId().hashCode();
     if (getRunnersCount() > 0) {
       hash = (37 * hash) + RUNNERS_FIELD_NUMBER;
       hash = (53 * hash) + getRunnersList().hashCode();
@@ -421,6 +476,8 @@ public Builder clear() {
         userAppId_ = null;
         userAppIdBuilder_ = null;
       }
+      nodepoolId_ = "";
+
       if (runnersBuilder_ == null) {
         runners_ = java.util.Collections.emptyList();
         bitField0_ = (bitField0_ & ~0x00000001);
@@ -459,6 +516,7 @@ public com.clarifai.grpc.api.PostRunnersRequest buildPartial() {
       } else {
         result.userAppId_ = userAppIdBuilder_.build();
       }
+      result.nodepoolId_ = nodepoolId_;
       if (runnersBuilder_ == null) {
         if (((bitField0_ & 0x00000001) != 0)) {
           runners_ = java.util.Collections.unmodifiableList(runners_);
@@ -519,6 +577,10 @@ public Builder mergeFrom(com.clarifai.grpc.api.PostRunnersRequest other) {
       if (other.hasUserAppId()) {
         mergeUserAppId(other.getUserAppId());
       }
+      if (!other.getNodepoolId().isEmpty()) {
+        nodepoolId_ = other.nodepoolId_;
+        onChanged();
+      }
       if (runnersBuilder_ == null) {
         if (!other.runners_.isEmpty()) {
           if (runners_.isEmpty()) {
@@ -694,6 +756,82 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
       return userAppIdBuilder_;
     }
 
+    private java.lang.Object nodepoolId_ = "";
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return The nodepoolId.
+     */
+    public java.lang.String getNodepoolId() {
+      java.lang.Object ref = nodepoolId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        nodepoolId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return The bytes for nodepoolId.
+     */
+    public com.google.protobuf.ByteString
+        getNodepoolIdBytes() {
+      java.lang.Object ref = nodepoolId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        nodepoolId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @param value The nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearNodepoolId() {
+      
+      nodepoolId_ = getDefaultInstance().getNodepoolId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string nodepool_id = 2;</code>
+     * @param value The bytes for nodepoolId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNodepoolIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      nodepoolId_ = value;
+      onChanged();
+      return this;
+    }
+
     private java.util.List<com.clarifai.grpc.api.Runner> runners_ =
       java.util.Collections.emptyList();
     private void ensureRunnersIsMutable() {
diff --git a/src/main/java/com/clarifai/grpc/api/PostRunnersRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/PostRunnersRequestOrBuilder.java
index 084b4b8..986ff03 100644
--- a/src/main/java/com/clarifai/grpc/api/PostRunnersRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/PostRunnersRequestOrBuilder.java
@@ -22,6 +22,18 @@ public interface PostRunnersRequestOrBuilder extends
    */
   com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder();
 
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The nodepoolId.
+   */
+  java.lang.String getNodepoolId();
+  /**
+   * <code>string nodepool_id = 2;</code>
+   * @return The bytes for nodepoolId.
+   */
+  com.google.protobuf.ByteString
+      getNodepoolIdBytes();
+
   /**
    * <pre>
    * This allows you to create one or more runner by posting it to the API.
diff --git a/src/main/java/com/clarifai/grpc/api/PostSearchesRequest.java b/src/main/java/com/clarifai/grpc/api/PostSearchesRequest.java
index 5aa9a61..84d5297 100644
--- a/src/main/java/com/clarifai/grpc/api/PostSearchesRequest.java
+++ b/src/main/java/com/clarifai/grpc/api/PostSearchesRequest.java
@@ -187,7 +187,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
    *
    * <code>.clarifai.api.Query query = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.PostSearchesRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5922
+   *     See proto/clarifai/api/service.proto;l=6028
    * @return Whether the query field is set.
    */
   @java.lang.Override
@@ -202,7 +202,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
    *
    * <code>.clarifai.api.Query query = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.PostSearchesRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5922
+   *     See proto/clarifai/api/service.proto;l=6028
    * @return The query.
    */
   @java.lang.Override
@@ -927,7 +927,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
      *
      * <code>.clarifai.api.Query query = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.PostSearchesRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5922
+     *     See proto/clarifai/api/service.proto;l=6028
      * @return Whether the query field is set.
      */
     @java.lang.Deprecated public boolean hasQuery() {
@@ -941,7 +941,7 @@ public com.clarifai.grpc.api.UserAppIDSetOrBuilder getUserAppIdOrBuilder() {
      *
      * <code>.clarifai.api.Query query = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.PostSearchesRequest.query is deprecated.
-     *     See proto/clarifai/api/service.proto;l=5922
+     *     See proto/clarifai/api/service.proto;l=6028
      * @return The query.
      */
     @java.lang.Deprecated public com.clarifai.grpc.api.Query getQuery() {
diff --git a/src/main/java/com/clarifai/grpc/api/PostSearchesRequestOrBuilder.java b/src/main/java/com/clarifai/grpc/api/PostSearchesRequestOrBuilder.java
index 1974414..7d94129 100644
--- a/src/main/java/com/clarifai/grpc/api/PostSearchesRequestOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/PostSearchesRequestOrBuilder.java
@@ -42,7 +42,7 @@ public interface PostSearchesRequestOrBuilder extends
    *
    * <code>.clarifai.api.Query query = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.PostSearchesRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5922
+   *     See proto/clarifai/api/service.proto;l=6028
    * @return Whether the query field is set.
    */
   @java.lang.Deprecated boolean hasQuery();
@@ -54,7 +54,7 @@ public interface PostSearchesRequestOrBuilder extends
    *
    * <code>.clarifai.api.Query query = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.PostSearchesRequest.query is deprecated.
-   *     See proto/clarifai/api/service.proto;l=5922
+   *     See proto/clarifai/api/service.proto;l=6028
    * @return The query.
    */
   @java.lang.Deprecated com.clarifai.grpc.api.Query getQuery();
diff --git a/src/main/java/com/clarifai/grpc/api/Resources.java b/src/main/java/com/clarifai/grpc/api/Resources.java
index acf3d25..9ca5c25 100644
--- a/src/main/java/com/clarifai/grpc/api/Resources.java
+++ b/src/main/java/com/clarifai/grpc/api/Resources.java
@@ -774,6 +774,11 @@ public static void registerAllExtensions(
   static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_clarifai_api_TaskWorkMetrics_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_TaskReviewMetrics_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_TaskReviewMetrics_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
     internal_static_clarifai_api_Collector_descriptor;
   static final 
@@ -1030,10 +1035,25 @@ public static void registerAllExtensions(
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_clarifai_api_Nodepool_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_clarifai_api_CloudRegion_descriptor;
+    internal_static_clarifai_api_NodeCapacityType_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_NodeCapacityType_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_InstanceType_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_InstanceType_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_CloudProvider_descriptor;
   static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_clarifai_api_CloudRegion_fieldAccessorTable;
+      internal_static_clarifai_api_CloudProvider_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_ComputeCluster_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_ComputeCluster_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
     internal_static_clarifai_api_ComputeInfo_descriptor;
   static final 
@@ -1169,973 +1189,994 @@ public static void registerAllExtensions(
       "clarifai.api.ConceptTypeCount\022.\n\006errors\030" +
       "\003 \001(\0132\036.clarifai.api.ConceptTypeCount\0222\n" +
       "\nprocessing\030\004 \001(\0132\036.clarifai.api.Concept" +
-      "TypeCount\"z\n\014ConceptQuery\022\014\n\004name\030\001 \001(\t\022" +
-      "\020\n\010language\030\002 \001(\t\022\023\n\013workflow_id\030\003 \001(\t\0225" +
-      "\n\tuse_cases\030\004 \003(\0162\".clarifai.api.Workflo" +
-      "wModelUseCase\"\331\001\n\017ConceptRelation\022\n\n\002id\030" +
-      "\001 \001(\t\022.\n\017subject_concept\030\002 \001(\0132\025.clarifa" +
-      "i.api.Concept\022-\n\016object_concept\030\003 \001(\0132\025." +
-      "clarifai.api.Concept\022\021\n\tpredicate\030\004 \001(\t\022" +
-      "\032\n\022knowledge_graph_id\030\005 \001(\t\022,\n\nvisibilit" +
-      "y\030\006 \001(\0132\030.clarifai.api.Visibility\"y\n\016Kno" +
-      "wledgeGraph\022\n\n\002id\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\022\023\n" +
-      "\013description\030\003 \001(\t\022\027\n\017examples_app_id\030\004 " +
-      "\001(\t\022\037\n\027sampled_examples_app_id\030\005 \001(\t\"D\n\021" +
-      "ConceptMappingJob\022\032\n\022knowledge_graph_id\030" +
-      "\001 \001(\t\022\023\n\013concept_ids\030\002 \003(\t\"?\n\017ConceptLan" +
-      "guage\022\n\n\002id\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\022\022\n\ndefin" +
-      "ition\030\003 \001(\t\"\372\004\n\004Data\022\"\n\005image\030\001 \001(\0132\023.cl" +
-      "arifai.api.Image\022\"\n\005video\030\002 \001(\0132\023.clarif" +
-      "ai.api.Video\022\'\n\010concepts\030\003 \003(\0132\025.clarifa" +
-      "i.api.Concept\022)\n\010metadata\030\005 \001(\0132\027.google" +
-      ".protobuf.Struct\022\036\n\003geo\030\006 \001(\0132\021.clarifai" +
-      ".api.Geo\022#\n\006colors\030\007 \003(\0132\023.clarifai.api." +
-      "Color\022\'\n\010clusters\030\010 \003(\0132\025.clarifai.api.C" +
-      "luster\022+\n\nembeddings\030\t \003(\0132\027.clarifai.ap" +
-      "i.Embedding\022%\n\007regions\030\013 \003(\0132\024.clarifai." +
-      "api.Region\022#\n\006frames\030\014 \003(\0132\023.clarifai.ap" +
-      "i.Frame\022 \n\004text\030\r \001(\0132\022.clarifai.api.Tex" +
-      "t\022\"\n\005audio\030\016 \001(\0132\023.clarifai.api.Audio\022#\n" +
-      "\006tracks\030\017 \003(\0132\023.clarifai.api.Track\0220\n\rti" +
-      "me_segments\030\020 \003(\0132\031.clarifai.api.TimeSeg" +
-      "ment\022\037\n\004hits\030\021 \003(\0132\021.clarifai.api.Hit\022%\n" +
-      "\010heatmaps\030\022 \003(\0132\023.clarifai.api.ImageJ\004\010\004" +
-      "\020\005J\004\010\n\020\013\"\206\001\n\006Region\022\n\n\002id\030\001 \001(\t\022-\n\013regio" +
-      "n_info\030\002 \001(\0132\030.clarifai.api.RegionInfo\022 " +
-      "\n\004data\030\003 \001(\0132\022.clarifai.api.Data\022\r\n\005valu" +
-      "e\030\004 \001(\002\022\020\n\010track_id\030\005 \001(\t\"\256\002\n\nRegionInfo" +
-      "\022/\n\014bounding_box\030\001 \001(\0132\031.clarifai.api.Bo" +
-      "undingBox\022 \n\004mask\030\004 \001(\0132\022.clarifai.api.M" +
-      "ask\022&\n\007polygon\030\005 \001(\0132\025.clarifai.api.Poly" +
-      "gon\022\"\n\005point\030\006 \001(\0132\023.clarifai.api.Point\022" +
-      " \n\004span\030\007 \001(\0132\022.clarifai.api.Span\022\"\n\005tok" +
-      "en\030\010 \001(\0132\023.clarifai.api.Token\022/\n\022keypoin" +
-      "t_locations\030\t \003(\0132\023.clarifai.api.PointJ\004" +
-      "\010\002\020\003J\004\010\003\020\004\"o\n\013BoundingBox\022\025\n\007top_row\030\001 \001" +
-      "(\002B\004\200\265\030\001\022\026\n\010left_col\030\002 \001(\002B\004\200\265\030\001\022\030\n\nbott" +
-      "om_row\030\003 \001(\002B\004\200\265\030\001\022\027\n\tright_col\030\004 \001(\002B\004\200" +
-      "\265\030\001\"6\n\tFrameInfo\022\025\n\005index\030\001 \001(\rB\006\030\001\200\265\030\001\022" +
-      "\022\n\004time\030\002 \001(\rB\004\200\265\030\001\"b\n\005Frame\022+\n\nframe_in" +
-      "fo\030\001 \001(\0132\027.clarifai.api.FrameInfo\022 \n\004dat" +
-      "a\030\002 \001(\0132\022.clarifai.api.Data\022\n\n\002id\030\003 \001(\t\"" +
-      "0\n\004Mask\022\"\n\005image\030\002 \001(\0132\023.clarifai.api.Im" +
-      "ageJ\004\010\001\020\002\".\n\007Polygon\022#\n\006points\030\001 \003(\0132\023.c" +
-      "larifai.api.Point\"\266\001\n\005Point\022\021\n\003row\030\001 \001(\002" +
-      "B\004\200\265\030\001\022\021\n\003col\030\002 \001(\002B\004\200\265\030\001\022\t\n\001z\030\003 \001(\002\0222\n\n" +
-      "visibility\030\004 \001(\0162\036.clarifai.api.Point.Vi" +
-      "sibility\"H\n\nVisibility\022\013\n\007NOT_SET\020\000\022\013\n\007V" +
-      "ISIBLE\020\001\022\017\n\013NOT_VISIBLE\020\002\022\017\n\013NOT_PRESENT" +
-      "\020\003\"J\n\004Span\022\030\n\nchar_start\030\001 \001(\rB\004\200\265\030\001\022\026\n\010" +
-      "char_end\030\002 \001(\rB\004\200\265\030\001\022\020\n\010raw_text\030\003 \001(\t\"K" +
-      "\n\005Token\022\030\n\nchar_start\030\001 \001(\rB\004\200\265\030\001\022\026\n\010cha" +
-      "r_end\030\002 \001(\rB\004\200\265\030\001\022\020\n\010raw_text\030\003 \001(\t\"7\n\tE" +
-      "mbedding\022\022\n\006vector\030\001 \003(\002B\002\020\001\022\026\n\016num_dime" +
-      "nsions\030\002 \001(\r\";\n\010GeoPoint\022\027\n\tlongitude\030\001 " +
-      "\001(\002B\004\200\265\030\001\022\026\n\010latitude\030\002 \001(\002B\004\200\265\030\001\"-\n\010Geo" +
-      "Limit\022\014\n\004type\030\001 \001(\t\022\023\n\005value\030\002 \001(\002B\004\200\265\030\001" +
-      "\":\n\rGeoBoxedPoint\022)\n\tgeo_point\030\001 \001(\0132\026.c" +
-      "larifai.api.GeoPoint\"\211\001\n\003Geo\022)\n\tgeo_poin" +
-      "t\030\001 \001(\0132\026.clarifai.api.GeoPoint\022)\n\tgeo_l" +
-      "imit\030\002 \001(\0132\026.clarifai.api.GeoLimit\022,\n\007ge" +
-      "o_box\030\003 \003(\0132\033.clarifai.api.GeoBoxedPoint" +
-      "\"\235\001\n\005Image\022\013\n\003url\030\001 \001(\t\022\016\n\006base64\030\002 \001(\014\022" +
-      "\033\n\023allow_duplicate_url\030\004 \001(\010\022\'\n\006hosted\030\005" +
-      " \001(\0132\027.clarifai.api.HostedURL\022+\n\nimage_i" +
-      "nfo\030\006 \001(\0132\027.clarifai.api.ImageInfoJ\004\010\003\020\004" +
-      "\"N\n\tImageInfo\022\r\n\005width\030\001 \001(\005\022\016\n\006height\030\002" +
-      " \001(\005\022\016\n\006format\030\003 \001(\t\022\022\n\ncolor_mode\030\004 \001(\t" +
-      "\"O\n\tHostedURL\022\016\n\006prefix\030\001 \001(\t\022\016\n\006suffix\030" +
-      "\002 \001(\t\022\r\n\005sizes\030\003 \003(\t\022\023\n\013crossorigin\030\004 \001(" +
-      "\t\"\336\001\n\005Input\022\n\n\002id\030\001 \001(\t\022 \n\004data\030\002 \001(\0132\022." +
-      "clarifai.api.Data\022.\n\ncreated_at\030\004 \001(\0132\032." +
-      "google.protobuf.Timestamp\022/\n\013modified_at" +
-      "\030\005 \001(\0132\032.google.protobuf.Timestamp\022+\n\006st" +
-      "atus\030\006 \001(\0132\033.clarifai.api.status.Status\022" +
-      "\023\n\013dataset_ids\030\007 \003(\tJ\004\010\003\020\004\"1\n\nInputBatch" +
-      "\022#\n\006inputs\030\001 \003(\0132\023.clarifai.api.Input\"\332\001" +
-      "\n\nInputCount\022\027\n\tprocessed\030\001 \001(\rB\004\200\265\030\001\022\030\n" +
-      "\nto_process\030\002 \001(\rB\004\200\265\030\001\022\024\n\006errors\030\003 \001(\rB" +
-      "\004\200\265\030\001\022\030\n\nprocessing\030\004 \001(\rB\004\200\265\030\001\022\027\n\treind" +
-      "exed\030\005 \001(\rB\004\200\265\030\001\022\030\n\nto_reindex\030\006 \001(\rB\004\200\265" +
-      "\030\001\022\034\n\016reindex_errors\030\007 \001(\rB\004\200\265\030\001\022\030\n\nrein" +
-      "dexing\030\010 \001(\rB\004\200\265\030\001\"\342\004\n\007Dataset\022\n\n\002id\030\001 \001" +
-      "(\t\022.\n\ncreated_at\030\002 \001(\0132\032.google.protobuf" +
-      ".Timestamp\022/\n\013modified_at\030\003 \001(\0132\032.google" +
-      ".protobuf.Timestamp\022\016\n\006app_id\030\004 \001(\t\022\017\n\007u" +
-      "ser_id\030\005 \001(\t\022\023\n\013description\030\007 \001(\t\022)\n\010met" +
-      "adata\030\010 \001(\0132\027.google.protobuf.Struct\022,\n\n" +
-      "visibility\030\t \001(\0132\030.clarifai.api.Visibili" +
-      "ty\022A\n\031default_annotation_filter\030\014 \001(\0132\036." +
-      "clarifai.api.AnnotationFilter\022K\n\027default" +
-      "_processing_info\030\020 \001(\0132*.clarifai.api.Da" +
-      "tasetVersionProcessingInfo\022\r\n\005notes\030\013 \001(" +
-      "\t\022-\n\007version\030\r \001(\0132\034.clarifai.api.Datase" +
-      "tVersion\022\022\n\nis_starred\030\016 \001(\010\022\022\n\nstar_cou" +
-      "nt\030\017 \001(\005\0225\n\017bookmark_origin\030\021 \001(\0132\034.clar" +
-      "ifai.api.BookmarkOrigin\022\"\n\005image\030\022 \001(\0132\023" +
-      ".clarifai.api.ImageJ\004\010\006\020\007J\004\010\n\020\013\"\330\001\n\020Anno" +
-      "tationFilter\022\n\n\002id\030\001 \001(\t\022.\n\ncreated_at\030\002" +
+      "TypeCount\"\332\001\n\014ConceptQuery\022\014\n\004name\030\001 \001(\t" +
+      "\022\020\n\010language\030\002 \001(\t\022\027\n\013workflow_id\030\003 \001(\tB" +
+      "\002\030\001\0225\n\tuse_cases\030\004 \003(\0162\".clarifai.api.Wo" +
+      "rkflowModelUseCase\022$\n\005model\030\005 \001(\0132\023.clar" +
+      "ifai.api.ModelH\000\022*\n\010workflow\030\006 \001(\0132\026.cla" +
+      "rifai.api.WorkflowH\000B\010\n\006source\"\331\001\n\017Conce" +
+      "ptRelation\022\n\n\002id\030\001 \001(\t\022.\n\017subject_concep" +
+      "t\030\002 \001(\0132\025.clarifai.api.Concept\022-\n\016object" +
+      "_concept\030\003 \001(\0132\025.clarifai.api.Concept\022\021\n" +
+      "\tpredicate\030\004 \001(\t\022\032\n\022knowledge_graph_id\030\005" +
+      " \001(\t\022,\n\nvisibility\030\006 \001(\0132\030.clarifai.api." +
+      "Visibility\"y\n\016KnowledgeGraph\022\n\n\002id\030\001 \001(\t" +
+      "\022\014\n\004name\030\002 \001(\t\022\023\n\013description\030\003 \001(\t\022\027\n\017e" +
+      "xamples_app_id\030\004 \001(\t\022\037\n\027sampled_examples" +
+      "_app_id\030\005 \001(\t\"D\n\021ConceptMappingJob\022\032\n\022kn" +
+      "owledge_graph_id\030\001 \001(\t\022\023\n\013concept_ids\030\002 " +
+      "\003(\t\"?\n\017ConceptLanguage\022\n\n\002id\030\001 \001(\t\022\014\n\004na" +
+      "me\030\002 \001(\t\022\022\n\ndefinition\030\003 \001(\t\"\372\004\n\004Data\022\"\n" +
+      "\005image\030\001 \001(\0132\023.clarifai.api.Image\022\"\n\005vid" +
+      "eo\030\002 \001(\0132\023.clarifai.api.Video\022\'\n\010concept" +
+      "s\030\003 \003(\0132\025.clarifai.api.Concept\022)\n\010metada" +
+      "ta\030\005 \001(\0132\027.google.protobuf.Struct\022\036\n\003geo" +
+      "\030\006 \001(\0132\021.clarifai.api.Geo\022#\n\006colors\030\007 \003(" +
+      "\0132\023.clarifai.api.Color\022\'\n\010clusters\030\010 \003(\013" +
+      "2\025.clarifai.api.Cluster\022+\n\nembeddings\030\t " +
+      "\003(\0132\027.clarifai.api.Embedding\022%\n\007regions\030" +
+      "\013 \003(\0132\024.clarifai.api.Region\022#\n\006frames\030\014 " +
+      "\003(\0132\023.clarifai.api.Frame\022 \n\004text\030\r \001(\0132\022" +
+      ".clarifai.api.Text\022\"\n\005audio\030\016 \001(\0132\023.clar" +
+      "ifai.api.Audio\022#\n\006tracks\030\017 \003(\0132\023.clarifa" +
+      "i.api.Track\0220\n\rtime_segments\030\020 \003(\0132\031.cla" +
+      "rifai.api.TimeSegment\022\037\n\004hits\030\021 \003(\0132\021.cl" +
+      "arifai.api.Hit\022%\n\010heatmaps\030\022 \003(\0132\023.clari" +
+      "fai.api.ImageJ\004\010\004\020\005J\004\010\n\020\013\"\206\001\n\006Region\022\n\n\002" +
+      "id\030\001 \001(\t\022-\n\013region_info\030\002 \001(\0132\030.clarifai" +
+      ".api.RegionInfo\022 \n\004data\030\003 \001(\0132\022.clarifai" +
+      ".api.Data\022\r\n\005value\030\004 \001(\002\022\020\n\010track_id\030\005 \001" +
+      "(\t\"\256\002\n\nRegionInfo\022/\n\014bounding_box\030\001 \001(\0132" +
+      "\031.clarifai.api.BoundingBox\022 \n\004mask\030\004 \001(\013" +
+      "2\022.clarifai.api.Mask\022&\n\007polygon\030\005 \001(\0132\025." +
+      "clarifai.api.Polygon\022\"\n\005point\030\006 \001(\0132\023.cl" +
+      "arifai.api.Point\022 \n\004span\030\007 \001(\0132\022.clarifa" +
+      "i.api.Span\022\"\n\005token\030\010 \001(\0132\023.clarifai.api" +
+      ".Token\022/\n\022keypoint_locations\030\t \003(\0132\023.cla" +
+      "rifai.api.PointJ\004\010\002\020\003J\004\010\003\020\004\"o\n\013BoundingB" +
+      "ox\022\025\n\007top_row\030\001 \001(\002B\004\200\265\030\001\022\026\n\010left_col\030\002 " +
+      "\001(\002B\004\200\265\030\001\022\030\n\nbottom_row\030\003 \001(\002B\004\200\265\030\001\022\027\n\tr" +
+      "ight_col\030\004 \001(\002B\004\200\265\030\001\"6\n\tFrameInfo\022\025\n\005ind" +
+      "ex\030\001 \001(\rB\006\030\001\200\265\030\001\022\022\n\004time\030\002 \001(\rB\004\200\265\030\001\"b\n\005" +
+      "Frame\022+\n\nframe_info\030\001 \001(\0132\027.clarifai.api" +
+      ".FrameInfo\022 \n\004data\030\002 \001(\0132\022.clarifai.api." +
+      "Data\022\n\n\002id\030\003 \001(\t\"0\n\004Mask\022\"\n\005image\030\002 \001(\0132" +
+      "\023.clarifai.api.ImageJ\004\010\001\020\002\".\n\007Polygon\022#\n" +
+      "\006points\030\001 \003(\0132\023.clarifai.api.Point\"\266\001\n\005P" +
+      "oint\022\021\n\003row\030\001 \001(\002B\004\200\265\030\001\022\021\n\003col\030\002 \001(\002B\004\200\265" +
+      "\030\001\022\t\n\001z\030\003 \001(\002\0222\n\nvisibility\030\004 \001(\0162\036.clar" +
+      "ifai.api.Point.Visibility\"H\n\nVisibility\022" +
+      "\013\n\007NOT_SET\020\000\022\013\n\007VISIBLE\020\001\022\017\n\013NOT_VISIBLE" +
+      "\020\002\022\017\n\013NOT_PRESENT\020\003\"J\n\004Span\022\030\n\nchar_star" +
+      "t\030\001 \001(\rB\004\200\265\030\001\022\026\n\010char_end\030\002 \001(\rB\004\200\265\030\001\022\020\n" +
+      "\010raw_text\030\003 \001(\t\"K\n\005Token\022\030\n\nchar_start\030\001" +
+      " \001(\rB\004\200\265\030\001\022\026\n\010char_end\030\002 \001(\rB\004\200\265\030\001\022\020\n\010ra" +
+      "w_text\030\003 \001(\t\"7\n\tEmbedding\022\022\n\006vector\030\001 \003(" +
+      "\002B\002\020\001\022\026\n\016num_dimensions\030\002 \001(\r\";\n\010GeoPoin" +
+      "t\022\027\n\tlongitude\030\001 \001(\002B\004\200\265\030\001\022\026\n\010latitude\030\002" +
+      " \001(\002B\004\200\265\030\001\"-\n\010GeoLimit\022\014\n\004type\030\001 \001(\t\022\023\n\005" +
+      "value\030\002 \001(\002B\004\200\265\030\001\":\n\rGeoBoxedPoint\022)\n\tge" +
+      "o_point\030\001 \001(\0132\026.clarifai.api.GeoPoint\"\211\001" +
+      "\n\003Geo\022)\n\tgeo_point\030\001 \001(\0132\026.clarifai.api." +
+      "GeoPoint\022)\n\tgeo_limit\030\002 \001(\0132\026.clarifai.a" +
+      "pi.GeoLimit\022,\n\007geo_box\030\003 \003(\0132\033.clarifai." +
+      "api.GeoBoxedPoint\"\235\001\n\005Image\022\013\n\003url\030\001 \001(\t" +
+      "\022\016\n\006base64\030\002 \001(\014\022\033\n\023allow_duplicate_url\030" +
+      "\004 \001(\010\022\'\n\006hosted\030\005 \001(\0132\027.clarifai.api.Hos" +
+      "tedURL\022+\n\nimage_info\030\006 \001(\0132\027.clarifai.ap" +
+      "i.ImageInfoJ\004\010\003\020\004\"N\n\tImageInfo\022\r\n\005width\030" +
+      "\001 \001(\005\022\016\n\006height\030\002 \001(\005\022\016\n\006format\030\003 \001(\t\022\022\n" +
+      "\ncolor_mode\030\004 \001(\t\"O\n\tHostedURL\022\016\n\006prefix" +
+      "\030\001 \001(\t\022\016\n\006suffix\030\002 \001(\t\022\r\n\005sizes\030\003 \003(\t\022\023\n" +
+      "\013crossorigin\030\004 \001(\t\"\336\001\n\005Input\022\n\n\002id\030\001 \001(\t" +
+      "\022 \n\004data\030\002 \001(\0132\022.clarifai.api.Data\022.\n\ncr" +
+      "eated_at\030\004 \001(\0132\032.google.protobuf.Timesta" +
+      "mp\022/\n\013modified_at\030\005 \001(\0132\032.google.protobu" +
+      "f.Timestamp\022+\n\006status\030\006 \001(\0132\033.clarifai.a" +
+      "pi.status.Status\022\023\n\013dataset_ids\030\007 \003(\tJ\004\010" +
+      "\003\020\004\"1\n\nInputBatch\022#\n\006inputs\030\001 \003(\0132\023.clar" +
+      "ifai.api.Input\"\332\001\n\nInputCount\022\027\n\tprocess" +
+      "ed\030\001 \001(\rB\004\200\265\030\001\022\030\n\nto_process\030\002 \001(\rB\004\200\265\030\001" +
+      "\022\024\n\006errors\030\003 \001(\rB\004\200\265\030\001\022\030\n\nprocessing\030\004 \001" +
+      "(\rB\004\200\265\030\001\022\027\n\treindexed\030\005 \001(\rB\004\200\265\030\001\022\030\n\nto_" +
+      "reindex\030\006 \001(\rB\004\200\265\030\001\022\034\n\016reindex_errors\030\007 " +
+      "\001(\rB\004\200\265\030\001\022\030\n\nreindexing\030\010 \001(\rB\004\200\265\030\001\"\342\004\n\007" +
+      "Dataset\022\n\n\002id\030\001 \001(\t\022.\n\ncreated_at\030\002 \001(\0132" +
+      "\032.google.protobuf.Timestamp\022/\n\013modified_" +
+      "at\030\003 \001(\0132\032.google.protobuf.Timestamp\022\016\n\006" +
+      "app_id\030\004 \001(\t\022\017\n\007user_id\030\005 \001(\t\022\023\n\013descrip" +
+      "tion\030\007 \001(\t\022)\n\010metadata\030\010 \001(\0132\027.google.pr" +
+      "otobuf.Struct\022,\n\nvisibility\030\t \001(\0132\030.clar" +
+      "ifai.api.Visibility\022A\n\031default_annotatio" +
+      "n_filter\030\014 \001(\0132\036.clarifai.api.Annotation" +
+      "Filter\022K\n\027default_processing_info\030\020 \001(\0132" +
+      "*.clarifai.api.DatasetVersionProcessingI" +
+      "nfo\022\r\n\005notes\030\013 \001(\t\022-\n\007version\030\r \001(\0132\034.cl" +
+      "arifai.api.DatasetVersion\022\022\n\nis_starred\030" +
+      "\016 \001(\010\022\022\n\nstar_count\030\017 \001(\005\0225\n\017bookmark_or" +
+      "igin\030\021 \001(\0132\034.clarifai.api.BookmarkOrigin" +
+      "\022\"\n\005image\030\022 \001(\0132\023.clarifai.api.ImageJ\004\010\006" +
+      "\020\007J\004\010\n\020\013\"\330\001\n\020AnnotationFilter\022\n\n\002id\030\001 \001(" +
+      "\t\022.\n\ncreated_at\030\002 \001(\0132\032.google.protobuf." +
+      "Timestamp\022/\n\013modified_at\030\003 \001(\0132\032.google." +
+      "protobuf.Timestamp\022\017\n\007user_id\030\004 \001(\t\022\016\n\006a" +
+      "pp_id\030\005 \001(\t\022$\n\006search\030\t \001(\0132\024.clarifai.a" +
+      "pi.SearchJ\004\010\006\020\007J\004\010\007\020\010J\004\010\010\020\t\"b\n\014DatasetIn" +
+      "put\022.\n\ncreated_at\030\001 \001(\0132\032.google.protobu" +
+      "f.Timestamp\022\"\n\005input\030\002 \001(\0132\023.clarifai.ap" +
+      "i.Input\"\361\006\n\016DatasetVersion\022\n\n\002id\030\001 \001(\t\022." +
+      "\n\ncreated_at\030\002 \001(\0132\032.google.protobuf.Tim" +
+      "estamp\022/\n\013modified_at\030\003 \001(\0132\032.google.pro" +
+      "tobuf.Timestamp\022\016\n\006app_id\030\004 \001(\t\022\017\n\007user_" +
+      "id\030\005 \001(\t\022\022\n\ndataset_id\030\006 \001(\t\022H\n\030annotati" +
+      "on_filter_config\030\017 \001(\0132$.clarifai.api.An" +
+      "notationFilterConfigH\000\022@\n\024model_predict_" +
+      "config\030\022 \001(\0132 .clarifai.api.ModelPredict" +
+      "ConfigH\000\022+\n\006status\030\010 \001(\0132\033.clarifai.api." +
+      "status.Status\022\023\n\013description\030\n \001(\t\022C\n\017pr" +
+      "ocessing_info\030\023 \001(\0132*.clarifai.api.Datas" +
+      "etVersionProcessingInfo\022:\n\007metrics\030\020 \003(\013" +
+      "2).clarifai.api.DatasetVersion.MetricsEn" +
+      "try\022;\n\013export_info\030\021 \001(\0132&.clarifai.api." +
+      "DatasetVersionExportInfo\022)\n\010metadata\030\014 \001" +
+      "(\0132\027.google.protobuf.Struct\022,\n\nvisibilit" +
+      "y\030\r \001(\0132\030.clarifai.api.Visibility\022\037\n\027emb" +
+      "ed_model_version_ids\030\016 \003(\t\022A\n\016request_or" +
+      "igin\030\024 \001(\0162).clarifai.api.DatasetVersion" +
+      "RequestOrigin\032S\n\014MetricsEntry\022\013\n\003key\030\001 \001" +
+      "(\t\0222\n\005value\030\002 \001(\0132#.clarifai.api.Dataset" +
+      "VersionMetrics:\0028\001B\r\n\013data_configJ\004\010\007\020\010J" +
+      "\004\010\t\020\nJ\004\010\013\020\014\"p\n\026AnnotationFilterConfig\0229\n" +
+      "\021annotation_filter\030\001 \001(\0132\036.clarifai.api." +
+      "AnnotationFilter\022\033\n\023ignore_empty_inputs\030" +
+      "\002 \001(\010\"8\n\022ModelPredictConfig\022\"\n\005model\030\001 \001" +
+      "(\0132\023.clarifai.api.Model\"\303\010\n\025DatasetVersi" +
+      "onMetrics\0222\n\014inputs_count\030\001 \001(\0132\034.google" +
+      ".protobuf.UInt64Value\022<\n\026unlabeled_input" +
+      "s_count\030\006 \001(\0132\034.google.protobuf.UInt64Va" +
+      "lue\022@\n\032inputs_with_metadata_count\030\010 \001(\0132" +
+      "\034.google.protobuf.UInt64Value\022;\n\025inputs_" +
+      "with_geo_count\030\t \001(\0132\034.google.protobuf.U" +
+      "Int64Value\0223\n\rregions_count\030\024 \001(\0132\034.goog" +
+      "le.protobuf.UInt64Value\022-\n\026region_locati" +
+      "on_matrix\030\025 \001(\0132\r.MatrixUint64\022:\n\024boundi" +
+      "ng_boxes_count\030\026 \001(\0132\034.google.protobuf.U" +
+      "Int64Value\0224\n\016polygons_count\030\027 \001(\0132\034.goo" +
+      "gle.protobuf.UInt64Value\0222\n\014points_count" +
+      "\030\030 \001(\0132\034.google.protobuf.UInt64Value\0221\n\013" +
+      "masks_count\030\031 \001(\0132\034.google.protobuf.UInt" +
+      "64Value\0229\n\023region_inputs_count\030< \001(\0132\034.g" +
+      "oogle.protobuf.UInt64Value\0229\n\023region_fra" +
+      "mes_count\030= \001(\0132\034.google.protobuf.UInt64" +
+      "Value\0222\n\014frames_count\030\036 \001(\0132\034.google.pro" +
+      "tobuf.UInt64Value\0228\n\022frame_inputs_count\030" +
+      "F \001(\0132\034.google.protobuf.UInt64Value\0226\n\020e" +
+      "mbeddings_count\030( \001(\0132\034.google.protobuf." +
+      "UInt64Value\022?\n\031positive_input_tags_count" +
+      "\0302 \001(\0132\034.google.protobuf.UInt64Value\022@\n\032" +
+      "positive_region_tags_count\0303 \001(\0132\034.googl" +
+      "e.protobuf.UInt64Value\022?\n\031positive_frame" +
+      "_tags_count\0304 \001(\0132\034.google.protobuf.UInt" +
+      "64ValueJ\004\010\002\020\003J\004\010\003\020\004J\004\010\004\020\005J\004\010\005\020\006J\004\010\007\020\010\"\312\001" +
+      "\n\032DatasetVersionMetricsGroup\022\023\n\013parent_p" +
+      "ath\030\001 \001(\t\022:\n\004type\030\002 \001(\0162,.clarifai.api.D" +
+      "atasetVersionMetricsGroupType\022%\n\005value\030\003" +
+      " \001(\0132\026.google.protobuf.Value\0224\n\007metrics\030" +
+      "\004 \001(\0132#.clarifai.api.DatasetVersionMetri" +
+      "cs\"\320\001\n\030DatasetVersionExportInfo\022B\n\026clari" +
+      "fai_data_protobuf\030\001 \001(\0132\".clarifai.api.D" +
+      "atasetVersionExport\022>\n\022clarifai_data_jso" +
+      "n\030\003 \001(\0132\".clarifai.api.DatasetVersionExp" +
+      "ort\0220\n\004coco\030\002 \001(\0132\".clarifai.api.Dataset" +
+      "VersionExport\"\264\001\n\024DatasetVersionExport\0228" +
+      "\n\006format\030\001 \001(\0162(.clarifai.api.DatasetVer" +
+      "sionExportFormat\022+\n\006status\030\002 \001(\0132\033.clari" +
+      "fai.api.status.Status\022\013\n\003url\030\003 \001(\t\022\014\n\004si" +
+      "ze\030\004 \001(\004\022\032\n\022include_embeddings\030\005 \001(\010\"f\n\034" +
+      "DatasetVersionProcessingInfo\022F\n\030frame_in" +
+      "terpolation_info\030\001 \001(\0132$.clarifai.api.Fr" +
+      "ameInterpolationInfo\"+\n\026FrameInterpolati" +
+      "onInfo\022\021\n\tsample_ms\030\001 \001(\r\"n\n\031WorkflowRes" +
+      "ultsSimilarity\022(\n\013probe_input\030\001 \001(\0132\023.cl" +
+      "arifai.api.Input\022\'\n\014pool_results\030\002 \003(\0132\021" +
+      ".clarifai.api.Hit\"\364\001\n\003Key\022\n\n\002id\030\001 \001(\t\022\014\n" +
+      "\004type\030\010 \001(\t\022\023\n\013description\030\002 \001(\t\022\016\n\006scop" +
+      "es\030\003 \003(\t\022\021\n\tendpoints\030\007 \003(\t\022\037\n\004apps\030\004 \003(" +
+      "\0132\021.clarifai.api.App\022.\n\ncreated_at\030\005 \001(\013" +
+      "2\032.google.protobuf.Timestamp\022.\n\nexpires_" +
+      "at\030\006 \001(\0132\032.google.protobuf.Timestamp\022\032\n\022" +
+      "authorized_idp_ids\030\t \003(\t\"\260\007\n\005Model\022\n\n\002id" +
+      "\030\001 \001(\t\022\020\n\004name\030\002 \001(\tB\002\030\001\022.\n\ncreated_at\030\003" +
       " \001(\0132\032.google.protobuf.Timestamp\022/\n\013modi" +
-      "fied_at\030\003 \001(\0132\032.google.protobuf.Timestam" +
-      "p\022\017\n\007user_id\030\004 \001(\t\022\016\n\006app_id\030\005 \001(\t\022$\n\006se" +
-      "arch\030\t \001(\0132\024.clarifai.api.SearchJ\004\010\006\020\007J\004" +
-      "\010\007\020\010J\004\010\010\020\t\"b\n\014DatasetInput\022.\n\ncreated_at" +
-      "\030\001 \001(\0132\032.google.protobuf.Timestamp\022\"\n\005in" +
-      "put\030\002 \001(\0132\023.clarifai.api.Input\"\361\006\n\016Datas" +
-      "etVersion\022\n\n\002id\030\001 \001(\t\022.\n\ncreated_at\030\002 \001(" +
-      "\0132\032.google.protobuf.Timestamp\022/\n\013modifie" +
-      "d_at\030\003 \001(\0132\032.google.protobuf.Timestamp\022\016" +
-      "\n\006app_id\030\004 \001(\t\022\017\n\007user_id\030\005 \001(\t\022\022\n\ndatas" +
-      "et_id\030\006 \001(\t\022H\n\030annotation_filter_config\030" +
-      "\017 \001(\0132$.clarifai.api.AnnotationFilterCon" +
-      "figH\000\022@\n\024model_predict_config\030\022 \001(\0132 .cl" +
-      "arifai.api.ModelPredictConfigH\000\022+\n\006statu" +
-      "s\030\010 \001(\0132\033.clarifai.api.status.Status\022\023\n\013" +
-      "description\030\n \001(\t\022C\n\017processing_info\030\023 \001" +
-      "(\0132*.clarifai.api.DatasetVersionProcessi" +
-      "ngInfo\022:\n\007metrics\030\020 \003(\0132).clarifai.api.D" +
-      "atasetVersion.MetricsEntry\022;\n\013export_inf" +
-      "o\030\021 \001(\0132&.clarifai.api.DatasetVersionExp" +
-      "ortInfo\022)\n\010metadata\030\014 \001(\0132\027.google.proto" +
-      "buf.Struct\022,\n\nvisibility\030\r \001(\0132\030.clarifa" +
-      "i.api.Visibility\022\037\n\027embed_model_version_" +
-      "ids\030\016 \003(\t\022A\n\016request_origin\030\024 \001(\0162).clar" +
-      "ifai.api.DatasetVersionRequestOrigin\032S\n\014" +
-      "MetricsEntry\022\013\n\003key\030\001 \001(\t\0222\n\005value\030\002 \001(\013" +
-      "2#.clarifai.api.DatasetVersionMetrics:\0028" +
-      "\001B\r\n\013data_configJ\004\010\007\020\010J\004\010\t\020\nJ\004\010\013\020\014\"p\n\026An" +
-      "notationFilterConfig\0229\n\021annotation_filte" +
-      "r\030\001 \001(\0132\036.clarifai.api.AnnotationFilter\022" +
-      "\033\n\023ignore_empty_inputs\030\002 \001(\010\"8\n\022ModelPre" +
-      "dictConfig\022\"\n\005model\030\001 \001(\0132\023.clarifai.api" +
-      ".Model\"\303\010\n\025DatasetVersionMetrics\0222\n\014inpu" +
-      "ts_count\030\001 \001(\0132\034.google.protobuf.UInt64V" +
-      "alue\022<\n\026unlabeled_inputs_count\030\006 \001(\0132\034.g" +
-      "oogle.protobuf.UInt64Value\022@\n\032inputs_wit" +
-      "h_metadata_count\030\010 \001(\0132\034.google.protobuf" +
-      ".UInt64Value\022;\n\025inputs_with_geo_count\030\t " +
-      "\001(\0132\034.google.protobuf.UInt64Value\0223\n\rreg" +
-      "ions_count\030\024 \001(\0132\034.google.protobuf.UInt6" +
-      "4Value\022-\n\026region_location_matrix\030\025 \001(\0132\r" +
-      ".MatrixUint64\022:\n\024bounding_boxes_count\030\026 " +
-      "\001(\0132\034.google.protobuf.UInt64Value\0224\n\016pol" +
-      "ygons_count\030\027 \001(\0132\034.google.protobuf.UInt" +
-      "64Value\0222\n\014points_count\030\030 \001(\0132\034.google.p" +
-      "rotobuf.UInt64Value\0221\n\013masks_count\030\031 \001(\013" +
-      "2\034.google.protobuf.UInt64Value\0229\n\023region" +
-      "_inputs_count\030< \001(\0132\034.google.protobuf.UI" +
-      "nt64Value\0229\n\023region_frames_count\030= \001(\0132\034" +
-      ".google.protobuf.UInt64Value\0222\n\014frames_c" +
-      "ount\030\036 \001(\0132\034.google.protobuf.UInt64Value" +
-      "\0228\n\022frame_inputs_count\030F \001(\0132\034.google.pr" +
-      "otobuf.UInt64Value\0226\n\020embeddings_count\030(" +
-      " \001(\0132\034.google.protobuf.UInt64Value\022?\n\031po" +
-      "sitive_input_tags_count\0302 \001(\0132\034.google.p" +
-      "rotobuf.UInt64Value\022@\n\032positive_region_t" +
-      "ags_count\0303 \001(\0132\034.google.protobuf.UInt64" +
-      "Value\022?\n\031positive_frame_tags_count\0304 \001(\013" +
-      "2\034.google.protobuf.UInt64ValueJ\004\010\002\020\003J\004\010\003" +
-      "\020\004J\004\010\004\020\005J\004\010\005\020\006J\004\010\007\020\010\"\312\001\n\032DatasetVersionM" +
-      "etricsGroup\022\023\n\013parent_path\030\001 \001(\t\022:\n\004type" +
-      "\030\002 \001(\0162,.clarifai.api.DatasetVersionMetr" +
-      "icsGroupType\022%\n\005value\030\003 \001(\0132\026.google.pro" +
-      "tobuf.Value\0224\n\007metrics\030\004 \001(\0132#.clarifai." +
-      "api.DatasetVersionMetrics\"\320\001\n\030DatasetVer" +
-      "sionExportInfo\022B\n\026clarifai_data_protobuf" +
-      "\030\001 \001(\0132\".clarifai.api.DatasetVersionExpo" +
-      "rt\022>\n\022clarifai_data_json\030\003 \001(\0132\".clarifa" +
-      "i.api.DatasetVersionExport\0220\n\004coco\030\002 \001(\013" +
-      "2\".clarifai.api.DatasetVersionExport\"\264\001\n" +
-      "\024DatasetVersionExport\0228\n\006format\030\001 \001(\0162(." +
-      "clarifai.api.DatasetVersionExportFormat\022" +
-      "+\n\006status\030\002 \001(\0132\033.clarifai.api.status.St" +
-      "atus\022\013\n\003url\030\003 \001(\t\022\014\n\004size\030\004 \001(\004\022\032\n\022inclu" +
-      "de_embeddings\030\005 \001(\010\"f\n\034DatasetVersionPro" +
-      "cessingInfo\022F\n\030frame_interpolation_info\030" +
-      "\001 \001(\0132$.clarifai.api.FrameInterpolationI" +
-      "nfo\"+\n\026FrameInterpolationInfo\022\021\n\tsample_" +
-      "ms\030\001 \001(\r\"n\n\031WorkflowResultsSimilarity\022(\n" +
-      "\013probe_input\030\001 \001(\0132\023.clarifai.api.Input\022" +
-      "\'\n\014pool_results\030\002 \003(\0132\021.clarifai.api.Hit" +
-      "\"\364\001\n\003Key\022\n\n\002id\030\001 \001(\t\022\014\n\004type\030\010 \001(\t\022\023\n\013de" +
-      "scription\030\002 \001(\t\022\016\n\006scopes\030\003 \003(\t\022\021\n\tendpo" +
-      "ints\030\007 \003(\t\022\037\n\004apps\030\004 \003(\0132\021.clarifai.api." +
-      "App\022.\n\ncreated_at\030\005 \001(\0132\032.google.protobu" +
-      "f.Timestamp\022.\n\nexpires_at\030\006 \001(\0132\032.google" +
-      ".protobuf.Timestamp\022\032\n\022authorized_idp_id" +
-      "s\030\t \003(\t\"\260\007\n\005Model\022\n\n\002id\030\001 \001(\t\022\020\n\004name\030\002 " +
-      "\001(\tB\002\030\001\022.\n\ncreated_at\030\003 \001(\0132\032.google.pro" +
-      "tobuf.Timestamp\022/\n\013modified_at\030\023 \001(\0132\032.g" +
-      "oogle.protobuf.Timestamp\022\024\n\006app_id\030\004 \001(\t" +
-      "B\004\200\265\030\001\0221\n\013output_info\030\005 \001(\0132\030.clarifai.a" +
-      "pi.OutputInfoB\002\030\001\0221\n\rmodel_version\030\006 \001(\013" +
-      "2\032.clarifai.api.ModelVersion\022\030\n\014display_" +
-      "name\030\007 \001(\tB\002\030\001\022\017\n\007user_id\030\t \001(\t\0221\n\021defau" +
-      "lt_eval_info\030\036 \001(\0132\026.clarifai.api.EvalIn" +
-      "fo\022\025\n\rmodel_type_id\030\016 \001(\t\022\014\n\004task\030\032 \001(\t\022" +
-      ",\n\nvisibility\030\017 \001(\0132\030.clarifai.api.Visib" +
-      "ility\022\023\n\013description\030\020 \001(\t\022)\n\010metadata\030\021" +
-      " \001(\0132\027.google.protobuf.Struct\022(\n\007presets" +
-      "\030\033 \001(\0132\027.google.protobuf.Struct\022\r\n\005notes" +
-      "\030\022 \001(\t\022\026\n\010toolkits\030\024 \003(\tB\004\200\265\030\001\022\027\n\tuse_ca" +
-      "ses\030\025 \003(\tB\004\200\265\030\001\022\027\n\tlanguages\030\031 \003(\tB\004\200\265\030\001" +
-      "\0223\n\016languages_full\030\037 \003(\0132\025.clarifai.api." +
-      "FullTagB\004\200\265\030\001\022\034\n\016check_consents\030  \003(\tB\004\200" +
-      "\265\030\001\022\022\n\nis_starred\030\026 \001(\010\022\022\n\nstar_count\030\027 " +
-      "\001(\005\0228\n\024workflow_recommended\030\035 \001(\0132\032.goog" +
-      "le.protobuf.BoolValue\0225\n\017bookmark_origin" +
-      "\030! \001(\0132\034.clarifai.api.BookmarkOrigin\022\"\n\005" +
-      "image\030\" \001(\0132\023.clarifai.api.ImageJ\004\010\010\020\tJ\004" +
-      "\010\n\020\013J\004\010\013\020\014J\004\010\014\020\rJ\004\010\r\020\016J\004\010\030\020\031J\004\010\034\020\035\"t\n\016Mo" +
-      "delReference\022\n\n\002id\030\001 \001(\t\022\020\n\010model_id\030\002 \001" +
-      "(\t\022\013\n\003url\030\003 \001(\t\022\014\n\004name\030\004 \001(\t\022)\n\010metadat" +
-      "a\030\005 \001(\0132\027.google.protobuf.Struct\"\227\001\n\030Mod" +
-      "elVersionInputExample\022\n\n\002id\030\001 \001(\t\022\020\n\010mod" +
-      "el_id\030\002 \001(\t\022\030\n\020model_version_id\030\003 \001(\t\022 \n" +
-      "\004data\030\004 \001(\0132\022.clarifai.api.Data\022\014\n\004name\030" +
-      "\005 \001(\t\022\023\n\013description\030\006 \001(\t\"\210\002\n\nOutputInf" +
-      "o\022 \n\004data\030\001 \001(\0132\022.clarifai.api.Data\0221\n\ro" +
-      "utput_config\030\002 \001(\0132\032.clarifai.api.Output" +
-      "Config\022\017\n\007message\030\003 \001(\t\022+\n\nfields_map\030\006 " +
-      "\001(\0132\027.google.protobuf.Struct\022\'\n\006params\030\007" +
-      " \001(\0132\027.google.protobuf.Struct\0222\n\014params_" +
-      "specs\030\010 \003(\0132\034.clarifai.api.ModelTypeFiel" +
-      "dJ\004\010\004\020\005J\004\010\005\020\006\"\220\001\n\tInputInfo\022+\n\nfields_ma" +
-      "p\030\001 \001(\0132\027.google.protobuf.Struct\022\'\n\006para" +
-      "ms\030\002 \001(\0132\027.google.protobuf.Struct\022-\n\020bas" +
-      "e_embed_model\030\003 \001(\0132\023.clarifai.api.Model" +
-      "\"\214\001\n\tTrainInfo\022\'\n\006params\030\001 \001(\0132\027.google." +
-      "protobuf.Struct\022&\n\007dataset\030\002 \001(\0132\025.clari" +
-      "fai.api.Dataset\022.\n\021resume_from_model\030\003 \001" +
-      "(\0132\023.clarifai.api.Model\"3\n\010EvalInfo\022\'\n\006p" +
-      "arams\030\001 \001(\0132\027.google.protobuf.Struct\"5\n\n" +
-      "ImportInfo\022\'\n\006params\030\001 \001(\0132\027.google.prot" +
-      "obuf.Struct\"\343\003\n\014OutputConfig\022\'\n\033concepts" +
-      "_mutually_exclusive\030\001 \001(\010B\002\030\001\022\035\n\021existin" +
-      "g_model_id\030\003 \001(\tB\002\030\001\022\020\n\010language\030\004 \001(\t\022\034" +
-      "\n\020hyper_parameters\030\005 \001(\tB\002\030\001\022\032\n\014max_conc" +
-      "epts\030\006 \001(\rB\004\200\265\030\001\022\027\n\tmin_value\030\007 \001(\002B\004\200\265\030" +
-      "\001\022.\n\017select_concepts\030\010 \003(\0132\025.clarifai.ap" +
-      "i.Concept\022\030\n\020training_timeout\030\t \001(\r\022\021\n\ts" +
-      "ample_ms\030\n \001(\r\022-\n\014hyper_params\030\r \001(\0132\027.g" +
-      "oogle.protobuf.Struct\022\"\n\026embed_model_ver" +
-      "sion_id\030\016 \001(\tB\002\030\001\022)\n!fail_on_missing_pos" +
-      "itive_examples\030\017 \001(\010\0223\n\016model_metadata\030\021" +
-      " \001(\0132\027.google.protobuf.StructB\002\030\001J\004\010\013\020\014J" +
-      "\004\010\014\020\rJ\004\010\020\020\021J\004\010\022\020\023\"\322\003\n\tModelType\022\n\n\002id\030\001 " +
-      "\001(\t\022\r\n\005title\030\002 \001(\t\022\023\n\013description\030\003 \001(\t\022" +
-      "\024\n\014input_fields\030\005 \003(\t\022\025\n\routput_fields\030\006" +
-      " \003(\t\022\021\n\ttrainable\030\010 \001(\010\022\021\n\tcreatable\030\t \001" +
-      "(\010\022\025\n\rinternal_only\030\n \001(\010\0227\n\021model_type_" +
-      "fields\030\013 \003(\0132\034.clarifai.api.ModelTypeFie" +
-      "ld\022\"\n\032requires_sequential_frames\030\014 \001(\010\022;" +
-      "\n\025expected_input_layers\030\020 \003(\0132\034.clarifai" +
-      ".api.ModelLayerInfo\022<\n\026expected_output_l" +
-      "ayers\030\021 \003(\0132\034.clarifai.api.ModelLayerInf" +
-      "o\0225\n\017evaluation_type\030\022 \001(\0162\034.clarifai.ap" +
-      "i.EvaluationTypeJ\004\010\007\020\010J\004\010\004\020\005J\004\010\r\020\016J\004\010\016\020\017" +
-      "J\004\010\017\020\020\"\211\001\n\016ModelLayerInfo\022\027\n\017data_field_" +
-      "name\030\001 \001(\t\022(\n\006shapes\030\002 \003(\0132\030.clarifai.ap" +
-      "i.LayerShape\022\023\n\013description\030\003 \001(\t\022\037\n\027req" +
-      "uires_label_filename\030\004 \001(\010\"D\n\022TritonCond" +
-      "aEnvInfo\022\026\n\016conda_pack_url\030\001 \001(\t\022\026\n\016cond" +
-      "a_yaml_url\030\002 \001(\t\"l\n\nLayerShape\022\014\n\004dims\030\001" +
-      " \003(\005\022\020\n\010max_dims\030\002 \003(\005\022)\n\tdata_type\030\003 \001(" +
-      "\0162\026.clarifai.api.DataType\022\023\n\013description" +
-      "\030\004 \001(\t\"\275\006\n\016ModelTypeField\022\014\n\004path\030\001 \001(\t\022" +
-      "C\n\nfield_type\030\002 \001(\0162/.clarifai.api.Model" +
-      "TypeField.ModelTypeFieldType\022-\n\rdefault_" +
-      "value\030\003 \001(\0132\026.google.protobuf.Value\022\023\n\013d" +
-      "escription\030\004 \001(\t\022\023\n\013placeholder\030\005 \001(\t\022B\n" +
-      "\027model_type_enum_options\030\006 \003(\0132!.clarifa" +
-      "i.api.ModelTypeEnumOption\022\025\n\rinternal_on" +
-      "ly\030\007 \001(\010\022\020\n\010required\030\010 \001(\010\022?\n\025model_type" +
-      "_range_info\030\t \001(\0132 .clarifai.api.ModelTy" +
-      "peRangeInfo\"\320\003\n\022ModelTypeFieldType\022!\n\035IN" +
-      "VALID_MODEL_TYPE_FIELD_TYPE\020\000\022\013\n\007BOOLEAN" +
-      "\020\001\022\n\n\006STRING\020\002\022\n\n\006NUMBER\020\003\022\025\n\021ARRAY_OF_C" +
-      "ONCEPTS\020\004\022$\n ARRAY_OF_CONCEPTS_WITH_THRE" +
-      "SHOLD\020\005\022\t\n\005RANGE\020\007\022\010\n\004ENUM\020\010\022\021\n\rCOLLABOR" +
-      "ATORS\020\t\022\010\n\004JSON\020\n\022\024\n\020ARRAY_OF_NUMBERS\020\013\022" +
-      "\031\n\025WORKFLOW_EMBED_MODELS\020\014\022\024\n\020ARRAY_OF_S" +
-      "TRINGS\020\r\022\022\n\016RECURSIVE_ENUM\020\016\022\017\n\013PYTHON_C" +
-      "ODE\020\017\022\016\n\nDATASET_ID\020\020\022\026\n\022DATASET_VERSION" +
-      "_ID\020\021\022\033\n\027ARRAY_OF_MODEL_CONCEPTS\020\022\022\013\n\007DA" +
-      "TASET\020\023\022\023\n\017DATASET_VERSION\020\024\022\024\n\020ENCRYPTE" +
-      "D_STRING\020\025\022\024\n\020CHECKPOINT_MODEL\020\026\"\004\010\006\020\006\"<" +
-      "\n\022ModelTypeRangeInfo\022\013\n\003min\030\001 \001(\002\022\013\n\003max" +
-      "\030\002 \001(\002\022\014\n\004step\030\003 \001(\002\"\324\001\n\023ModelTypeEnumOp" +
-      "tion\022\n\n\002id\030\001 \001(\t\0227\n\007aliases\030\005 \003(\0132&.clar" +
-      "ifai.api.ModelTypeEnumOptionAlias\022\023\n\013des" +
-      "cription\030\002 \001(\t\0227\n\021model_type_fields\030\003 \003(",
-      "\0132\034.clarifai.api.ModelTypeField\022\025\n\rinter" +
-      "nal_only\030\004 \001(\010\022\023\n\013recommended\030\006 \001(\010\"C\n\030M" +
-      "odelTypeEnumOptionAlias\022\016\n\006id_int\030\001 \001(\003\022" +
-      "\027\n\017wildcard_string\030\002 \001(\t\"7\n\nModelQuery\022\014" +
-      "\n\004name\030\001 \001(\t\022\025\n\rmodel_type_id\030\003 \001(\tJ\004\010\002\020" +
-      "\003\"\344\006\n\014ModelVersion\022\n\n\002id\030\001 \001(\t\022.\n\ncreate" +
-      "d_at\030\002 \001(\0132\032.google.protobuf.Timestamp\022+" +
-      "\n\006status\030\003 \001(\0132\033.clarifai.api.status.Sta" +
-      "tus\022\034\n\024active_concept_count\030\004 \001(\r\022*\n\007met" +
-      "rics\030\005 \001(\0132\031.clarifai.api.EvalMetrics\022\031\n" +
-      "\021total_input_count\030\006 \001(\r\022D\n\027pretrained_m" +
-      "odel_config\030\007 \001(\0132#.clarifai.api.Pretrai" +
-      "nedModelConfig\0220\n\014completed_at\030\n \001(\0132\032.g" +
-      "oogle.protobuf.Timestamp\022\023\n\013description\030" +
-      "\013 \001(\t\022,\n\nvisibility\030\014 \001(\0132\030.clarifai.api" +
-      ".Visibility\022\016\n\006app_id\030\r \001(\t\022\017\n\007user_id\030\016" +
-      " \001(\t\022/\n\013modified_at\030\017 \001(\0132\032.google.proto" +
-      "buf.Timestamp\022)\n\010metadata\030\020 \001(\0132\027.google" +
-      ".protobuf.Struct\022\017\n\007license\030\021 \001(\t\022-\n\013out" +
-      "put_info\030\023 \001(\0132\030.clarifai.api.OutputInfo" +
-      "\022+\n\ninput_info\030\024 \001(\0132\027.clarifai.api.Inpu" +
-      "tInfo\022+\n\ntrain_info\030\025 \001(\0132\027.clarifai.api" +
-      ".TrainInfo\022-\n\013import_info\030\026 \001(\0132\030.clarif" +
-      "ai.api.ImportInfo\022\021\n\ttrain_log\030\027 \001(\t\0229\n\026" +
-      "inference_compute_info\030\030 \001(\0132\031.clarifai." +
-      "api.ComputeInfo\022+\n\nbuild_info\030\031 \001(\0132\027.cl" +
-      "arifai.api.BuildInfoJ\004\010\t\020\nJ\004\010\022\020\023\"]\n\tBuil" +
-      "dInfo\022\031\n\021docker_image_name\030\001 \001(\t\022\030\n\020dock" +
-      "er_image_tag\030\002 \001(\t\022\033\n\023docker_image_diges" +
-      "t\030\003 \001(\t\"\\\n\022ModelVersionExport\022+\n\006status\030" +
-      "\001 \001(\0132\033.clarifai.api.status.Status\022\013\n\003ur" +
-      "l\030\002 \001(\t\022\014\n\004size\030\003 \001(\003\"\241\001\n\025PretrainedMode" +
-      "lConfig\0221\n\020input_fields_map\030\003 \001(\0132\027.goog" +
-      "le.protobuf.Struct\0222\n\021output_fields_map\030" +
-      "\004 \001(\0132\027.google.protobuf.Struct\022\025\n\rmodel_" +
-      "zip_url\030\006 \001(\tJ\004\010\002\020\003J\004\010\005\020\006\">\n\nTrainStats\022" +
-      "0\n\nloss_curve\030\001 \003(\0132\034.clarifai.api.LossC" +
-      "urveEntry\"B\n\016LossCurveEntry\022\r\n\005epoch\030\001 \001" +
-      "(\r\022\023\n\013global_step\030\002 \001(\r\022\014\n\004cost\030\003 \001(\002\"]\n" +
-      "\nLabelCount\022\030\n\014concept_name\030\001 \001(\tB\002\030\001\022\r\n" +
-      "\005count\030\002 \001(\r\022&\n\007concept\030\003 \001(\0132\025.clarifai" +
-      ".api.Concept\"L\n\021LabelDistribution\0227\n\025pos" +
-      "itive_label_counts\030\001 \003(\0132\030.clarifai.api." +
-      "LabelCount\"B\n\027CooccurrenceMatrixEntry\022\013\n" +
-      "\003row\030\001 \001(\t\022\013\n\003col\030\002 \001(\t\022\r\n\005count\030\003 \001(\r\"`" +
-      "\n\022CooccurrenceMatrix\0225\n\006matrix\030\001 \003(\0132%.c" +
-      "larifai.api.CooccurrenceMatrixEntry\022\023\n\013c" +
-      "oncept_ids\030\002 \003(\t\"\257\001\n\024ConfusionMatrixEntr" +
-      "y\022\021\n\tpredicted\030\001 \001(\t\022\016\n\006actual\030\002 \001(\t\022\023\n\005" +
-      "value\030\004 \001(\002B\004\200\265\030\001\0220\n\021predicted_concept\030\005" +
-      " \001(\0132\025.clarifai.api.Concept\022-\n\016actual_co" +
-      "ncept\030\006 \001(\0132\025.clarifai.api.Concept\"Z\n\017Co" +
-      "nfusionMatrix\0222\n\006matrix\030\001 \003(\0132\".clarifai" +
-      ".api.ConfusionMatrixEntry\022\023\n\013concept_ids" +
-      "\030\002 \003(\t\"t\n\003ROC\022\021\n\003fpr\030\001 \003(\002B\004\200\265\030\001\022\021\n\003tpr\030" +
-      "\002 \003(\002B\004\200\265\030\001\022\030\n\nthresholds\030\003 \003(\002B\004\200\265\030\001\022\025\n" +
-      "\rfpr_per_image\030\004 \003(\002\022\026\n\016fpr_per_object\030\005" +
-      " \003(\002\"_\n\024PrecisionRecallCurve\022\024\n\006recall\030\001" +
-      " \003(\002B\004\200\265\030\001\022\027\n\tprecision\030\002 \003(\002B\004\200\265\030\001\022\030\n\nt" +
-      "hresholds\030\003 \003(\002B\004\200\265\030\001\"\352\002\n\rBinaryMetrics\022" +
-      "\025\n\007num_pos\030\001 \001(\rB\004\200\265\030\001\022\025\n\007num_neg\030\002 \001(\rB" +
-      "\004\200\265\030\001\022\025\n\007num_tot\030\003 \001(\rB\004\200\265\030\001\022\025\n\007roc_auc\030" +
-      "\004 \001(\002B\004\200\265\030\001\022\020\n\002f1\030\005 \001(\002B\004\200\265\030\001\022&\n\007concept" +
-      "\030\006 \001(\0132\025.clarifai.api.Concept\022$\n\troc_cur" +
-      "ve\030\007 \001(\0132\021.clarifai.api.ROC\022B\n\026precision" +
-      "_recall_curve\030\010 \001(\0132\".clarifai.api.Preci" +
-      "sionRecallCurve\022\025\n\ravg_precision\030\t \001(\002\022\021" +
-      "\n\tarea_name\030\n \001(\t\022\020\n\010area_min\030\013 \001(\001\022\020\n\010a" +
-      "rea_max\030\014 \001(\001\022\013\n\003iou\030\r \001(\002\"\221\001\n\016TrackerMe" +
-      "trics\022\020\n\010mot_mota\030\001 \001(\002\022\030\n\020mot_num_switc" +
-      "hes\030\002 \001(\005\022\022\n\nmorse_frag\030\003 \001(\002\022\025\n\ravg_pre" +
-      "cision\030\004 \001(\002\022\014\n\004aiid\030\005 \001(\t\022\032\n\022unique_swi" +
-      "tch_rate\030\006 \001(\002\"\320\002\n\020EvalTestSetEntry\022\"\n\005i" +
-      "nput\030\006 \001(\0132\023.clarifai.api.Input\0221\n\022predi" +
-      "cted_concepts\030\003 \003(\0132\025.clarifai.api.Conce" +
-      "pt\0224\n\025ground_truth_concepts\030\004 \003(\0132\025.clar" +
-      "ifai.api.Concept\0220\n\nannotation\030\005 \001(\0132\030.c" +
-      "larifai.api.AnnotationB\002\030\001\0226\n\024predicted_" +
-      "annotation\030\007 \001(\0132\030.clarifai.api.Annotati" +
-      "on\0229\n\027ground_truth_annotation\030\010 \001(\0132\030.cl" +
-      "arifai.api.AnnotationJ\004\010\001\020\002J\004\010\002\020\003\"\315\001\n\016LO" +
-      "PQEvalResult\022\t\n\001k\030\001 \001(\005\022#\n\025recall_vs_bru" +
-      "te_force\030\002 \001(\002B\004\200\265\030\001\022(\n\032kendall_tau_vs_b" +
-      "rute_force\030\003 \001(\002B\004\200\265\030\001\022(\n\032most_frequent_" +
-      "code_percent\030\004 \001(\002B\004\200\265\030\001\022\027\n\tlopq_ndcg\030\005 " +
-      "\001(\002B\004\200\265\030\001\022\036\n\020brute_force_ndcg\030\006 \001(\002B\004\200\265\030" +
-      "\001\"\214\003\n\016MetricsSummary\022\031\n\rtop1_accuracy\030\001 " +
-      "\001(\002B\002\030\001\022\031\n\rtop5_accuracy\030\002 \001(\002B\002\030\001\022\037\n\021ma" +
-      "cro_avg_roc_auc\030\003 \001(\002B\004\200\265\030\001\022\037\n\021macro_std" +
-      "_roc_auc\030\004 \001(\002B\004\200\265\030\001\022 \n\022macro_avg_f1_sco" +
-      "re\030\005 \001(\002B\004\200\265\030\001\022 \n\022macro_std_f1_score\030\006 \001" +
-      "(\002B\004\200\265\030\001\022!\n\023macro_avg_precision\030\007 \001(\002B\004\200" +
-      "\265\030\001\022\036\n\020macro_avg_recall\030\010 \001(\002B\004\200\265\030\001\022!\n\031m" +
-      "ean_avg_precision_iou_50\030\n \001(\002\022$\n\034mean_a" +
-      "vg_precision_iou_range\030\013 \001(\002\0222\n\014lopq_met" +
-      "rics\030\t \003(\0132\034.clarifai.api.LOPQEvalResult" +
-      "\"\301\006\n\013EvalMetrics\022+\n\006status\030\001 \001(\0132\033.clari" +
-      "fai.api.status.Status\022\017\n\007user_id\030\017 \001(\t\022\016" +
-      "\n\006app_id\030\020 \001(\t\022\n\n\002id\030\n \001(\t\022\"\n\005model\030\r \001(" +
-      "\0132\023.clarifai.api.Model\0223\n\024ground_truth_d" +
-      "ataset\030\016 \001(\0132\025.clarifai.api.Dataset\0222\n\023p" +
-      "redictions_dataset\030\022 \001(\0132\025.clarifai.api." +
-      "Dataset\022-\n\007summary\030\002 \001(\0132\034.clarifai.api." +
-      "MetricsSummary\0227\n\020confusion_matrix\030\003 \001(\013" +
-      "2\035.clarifai.api.ConfusionMatrix\022=\n\023coocc" +
-      "urrence_matrix\030\004 \001(\0132 .clarifai.api.Cooc" +
-      "currenceMatrix\0225\n\014label_counts\030\005 \001(\0132\037.c" +
-      "larifai.api.LabelDistribution\0223\n\016binary_" +
-      "metrics\030\006 \003(\0132\033.clarifai.api.BinaryMetri" +
-      "cs\0220\n\010test_set\030\007 \003(\0132\036.clarifai.api.Eval" +
-      "TestSetEntry\0224\n\017metrics_by_area\030\010 \003(\0132\033." +
-      "clarifai.api.BinaryMetrics\0225\n\020metrics_by" +
-      "_class\030\t \003(\0132\033.clarifai.api.BinaryMetric" +
-      "s\0225\n\017tracker_metrics\030\013 \003(\0132\034.clarifai.ap" +
-      "i.TrackerMetrics\022)\n\teval_info\030\014 \001(\0132\026.cl" +
-      "arifai.api.EvalInfo\0227\n\020extended_metrics\030" +
-      "\021 \001(\0132\035.clarifai.api.ExtendedMetrics\"@\n\017" +
-      "ExtendedMetrics\022-\n\014user_metrics\030\001 \001(\0132\027." +
-      "google.protobuf.Struct\"\267\001\n\013FieldsValue\022\030" +
-      "\n\020confusion_matrix\030\001 \001(\010\022\033\n\023cooccurrence" +
-      "_matrix\030\002 \001(\010\022\024\n\014label_counts\030\003 \001(\010\022\026\n\016b" +
-      "inary_metrics\030\004 \001(\010\022\020\n\010test_set\030\005 \001(\010\022\027\n" +
-      "\017metrics_by_area\030\006 \001(\010\022\030\n\020metrics_by_cla" +
-      "ss\030\007 \001(\010\"\333\001\n\006Output\022\n\n\002id\030\001 \001(\t\022+\n\006statu" +
-      "s\030\002 \001(\0132\033.clarifai.api.status.Status\022.\n\n" +
-      "created_at\030\003 \001(\0132\032.google.protobuf.Times" +
-      "tamp\022\"\n\005model\030\004 \001(\0132\023.clarifai.api.Model" +
-      "\022\"\n\005input\030\005 \001(\0132\023.clarifai.api.Input\022 \n\004" +
-      "data\030\006 \001(\0132\022.clarifai.api.Data\"4\n\tScopeD" +
-      "eps\022\r\n\005scope\030\001 \001(\t\022\030\n\020depending_scopes\030\002" +
-      " \003(\t\":\n\014EndpointDeps\022\020\n\010endpoint\030\001 \001(\t\022\030" +
-      "\n\020depending_scopes\030\002 \003(\t\"\215\001\n\003Hit\022\023\n\005scor" +
-      "e\030\001 \001(\002B\004\200\265\030\001\022\"\n\005input\030\002 \001(\0132\023.clarifai." +
-      "api.Input\022,\n\nannotation\030\003 \001(\0132\030.clarifai" +
-      ".api.Annotation\022\017\n\007user_id\030\004 \001(\t\022\016\n\006app_" +
-      "id\030\005 \001(\t\"#\n\010HitCount\022\027\n\017estimated_total\030" +
-      "\001 \001(\004\"\215\001\n\003And\022\"\n\005input\030\001 \001(\0132\023.clarifai." +
-      "api.Input\022$\n\006output\030\002 \001(\0132\024.clarifai.api" +
-      ".Output\022\016\n\006negate\030\003 \001(\010\022,\n\nannotation\030\004 " +
-      "\001(\0132\030.clarifai.api.Annotation\"\210\001\n\005Query\022" +
-      "#\n\004ands\030\001 \003(\0132\021.clarifai.api.AndB\002\030\001\022\020\n\010" +
-      "language\030\002 \001(\t\022%\n\007filters\030\003 \003(\0132\024.clarif" +
-      "ai.api.Filter\022!\n\005ranks\030\004 \003(\0132\022.clarifai." +
-      "api.Rank\"\326\003\n\006Search\022\"\n\005query\030\001 \001(\0132\023.cla" +
-      "rifai.api.Query\022\n\n\002id\030\002 \001(\t\022\026\n\016applicati" +
-      "on_id\030\003 \001(\t\022\014\n\004name\030\004 \001(\t\022)\n\005as_of\030\005 \001(\013" +
-      "2\032.google.protobuf.Timestamp\022\020\n\010git_hash" +
-      "\030\006 \001(\t\022.\n\ncreated_at\030\007 \001(\0132\032.google.prot" +
-      "obuf.Timestamp\022/\n\013modified_at\030\010 \001(\0132\032.go" +
-      "ogle.protobuf.Timestamp\022\021\n\talgorithm\030\t \001" +
-      "(\t\022\014\n\004save\030\n \001(\010\022\021\n\tmin_value\030\013 \001(\002\022,\n\nv" +
-      "isibility\030\014 \001(\0132\030.clarifai.api.Visibilit" +
-      "y\022+\n\006metric\030\r \001(\0162\033.clarifai.api.Search." +
-      "Metric\"I\n\006Metric\022\022\n\016METRIC_NOT_SET\020\000\022\026\n\022" +
-      "EUCLIDEAN_DISTANCE\020\001\022\023\n\017COSINE_DISTANCE\020" +
-      "\002\"\244\001\n\006Filter\022\016\n\006negate\030\003 \001(\010\022,\n\nannotati" +
-      "on\030\004 \001(\0132\030.clarifai.api.Annotation\022\"\n\005in" +
-      "put\030\005 \001(\0132\023.clarifai.api.Input\0228\n\027last_u" +
-      "pdated_time_range\030\006 \001(\0132\027.clarifai.api.T" +
-      "imeRange\"i\n\tTimeRange\022.\n\nstart_time\030\001 \001(" +
-      "\0132\032.google.protobuf.Timestamp\022,\n\010end_tim" +
-      "e\030\002 \001(\0132\032.google.protobuf.Timestamp\"D\n\004R" +
-      "ank\022\016\n\006negate\030\003 \001(\010\022,\n\nannotation\030\004 \001(\0132" +
-      "\030.clarifai.api.Annotation\"\215\002\n\027Annotation" +
-      "SearchMetrics\022*\n\014ground_truth\030\001 \001(\0132\024.cl" +
-      "arifai.api.Search\022,\n\016search_to_eval\030\002 \001(" +
-      "\0132\024.clarifai.api.Search\022*\n\007metrics\030\003 \001(\013" +
-      "2\031.clarifai.api.EvalMetrics\022 \n\004data\030\004 \001(" +
-      "\0132\022.clarifai.api.Data\022\034\n\024active_concept_" +
-      "count\030\005 \001(\r\022,\n\nvisibility\030\006 \001(\0132\030.clarif" +
-      "ai.api.Visibility\"\221\001\n\004Text\022\013\n\003raw\030\001 \001(\t\022" +
-      "\013\n\003url\030\002 \001(\t\022\033\n\023allow_duplicate_url\030\003 \001(" +
-      "\010\022\'\n\006hosted\030\004 \001(\0132\027.clarifai.api.HostedU" +
-      "RL\022)\n\ttext_info\030\005 \001(\0132\026.clarifai.api.Tex" +
-      "tInfo\"0\n\010TextInfo\022\022\n\nchar_count\030\001 \001(\005\022\020\n" +
-      "\010encoding\030\002 \001(\t\"\217\006\n\004User\022\n\n\002id\030\001 \001(\t\022\031\n\r" +
-      "primary_email\030\002 \001(\tB\002\030\001\022\022\n\nfirst_name\030\003 " +
-      "\001(\t\022\021\n\tlast_name\030\004 \001(\t\022\024\n\014company_name\030\005" +
-      " \001(\t\022\021\n\tjob_title\030\023 \001(\t\022\020\n\010job_role\030\024 \001(" +
-      "\t\022\021\n\tintention\030\030 \001(\t\022\025\n\tbill_type\030\007 \001(\tB" +
-      "\002\030\001\022.\n\ncreated_at\030\006 \001(\0132\032.google.protobu" +
-      "f.Timestamp\0229\n\021date_gdpr_consent\030\010 \001(\0132\032" +
-      ".google.protobuf.TimestampB\002\030\001\0228\n\020date_t" +
-      "os_consent\030\t \001(\0132\032.google.protobuf.Times" +
-      "tampB\002\030\001\022>\n\026date_marketing_consent\030\n \001(\013" +
+      "fied_at\030\023 \001(\0132\032.google.protobuf.Timestam" +
+      "p\022\024\n\006app_id\030\004 \001(\tB\004\200\265\030\001\0221\n\013output_info\030\005" +
+      " \001(\0132\030.clarifai.api.OutputInfoB\002\030\001\0221\n\rmo" +
+      "del_version\030\006 \001(\0132\032.clarifai.api.ModelVe" +
+      "rsion\022\030\n\014display_name\030\007 \001(\tB\002\030\001\022\017\n\007user_" +
+      "id\030\t \001(\t\0221\n\021default_eval_info\030\036 \001(\0132\026.cl" +
+      "arifai.api.EvalInfo\022\025\n\rmodel_type_id\030\016 \001" +
+      "(\t\022\014\n\004task\030\032 \001(\t\022,\n\nvisibility\030\017 \001(\0132\030.c" +
+      "larifai.api.Visibility\022\023\n\013description\030\020 " +
+      "\001(\t\022)\n\010metadata\030\021 \001(\0132\027.google.protobuf." +
+      "Struct\022(\n\007presets\030\033 \001(\0132\027.google.protobu" +
+      "f.Struct\022\r\n\005notes\030\022 \001(\t\022\026\n\010toolkits\030\024 \003(" +
+      "\tB\004\200\265\030\001\022\027\n\tuse_cases\030\025 \003(\tB\004\200\265\030\001\022\027\n\tlang" +
+      "uages\030\031 \003(\tB\004\200\265\030\001\0223\n\016languages_full\030\037 \003(" +
+      "\0132\025.clarifai.api.FullTagB\004\200\265\030\001\022\034\n\016check_" +
+      "consents\030  \003(\tB\004\200\265\030\001\022\022\n\nis_starred\030\026 \001(\010" +
+      "\022\022\n\nstar_count\030\027 \001(\005\0228\n\024workflow_recomme" +
+      "nded\030\035 \001(\0132\032.google.protobuf.BoolValue\0225" +
+      "\n\017bookmark_origin\030! \001(\0132\034.clarifai.api.B" +
+      "ookmarkOrigin\022\"\n\005image\030\" \001(\0132\023.clarifai." +
+      "api.ImageJ\004\010\010\020\tJ\004\010\n\020\013J\004\010\013\020\014J\004\010\014\020\rJ\004\010\r\020\016J" +
+      "\004\010\030\020\031J\004\010\034\020\035\"t\n\016ModelReference\022\n\n\002id\030\001 \001(" +
+      "\t\022\020\n\010model_id\030\002 \001(\t\022\013\n\003url\030\003 \001(\t\022\014\n\004name" +
+      "\030\004 \001(\t\022)\n\010metadata\030\005 \001(\0132\027.google.protob" +
+      "uf.Struct\"\227\001\n\030ModelVersionInputExample\022\n" +
+      "\n\002id\030\001 \001(\t\022\020\n\010model_id\030\002 \001(\t\022\030\n\020model_ve" +
+      "rsion_id\030\003 \001(\t\022 \n\004data\030\004 \001(\0132\022.clarifai." +
+      "api.Data\022\014\n\004name\030\005 \001(\t\022\023\n\013description\030\006 " +
+      "\001(\t\"\210\002\n\nOutputInfo\022 \n\004data\030\001 \001(\0132\022.clari" +
+      "fai.api.Data\0221\n\routput_config\030\002 \001(\0132\032.cl" +
+      "arifai.api.OutputConfig\022\017\n\007message\030\003 \001(\t" +
+      "\022+\n\nfields_map\030\006 \001(\0132\027.google.protobuf.S" +
+      "truct\022\'\n\006params\030\007 \001(\0132\027.google.protobuf." +
+      "Struct\0222\n\014params_specs\030\010 \003(\0132\034.clarifai." +
+      "api.ModelTypeFieldJ\004\010\004\020\005J\004\010\005\020\006\"\220\001\n\tInput" +
+      "Info\022+\n\nfields_map\030\001 \001(\0132\027.google.protob" +
+      "uf.Struct\022\'\n\006params\030\002 \001(\0132\027.google.proto" +
+      "buf.Struct\022-\n\020base_embed_model\030\003 \001(\0132\023.c" +
+      "larifai.api.Model\"\214\001\n\tTrainInfo\022\'\n\006param" +
+      "s\030\001 \001(\0132\027.google.protobuf.Struct\022&\n\007data" +
+      "set\030\002 \001(\0132\025.clarifai.api.Dataset\022.\n\021resu" +
+      "me_from_model\030\003 \001(\0132\023.clarifai.api.Model" +
+      "\"3\n\010EvalInfo\022\'\n\006params\030\001 \001(\0132\027.google.pr" +
+      "otobuf.Struct\"5\n\nImportInfo\022\'\n\006params\030\001 " +
+      "\001(\0132\027.google.protobuf.Struct\"\343\003\n\014OutputC" +
+      "onfig\022\'\n\033concepts_mutually_exclusive\030\001 \001" +
+      "(\010B\002\030\001\022\035\n\021existing_model_id\030\003 \001(\tB\002\030\001\022\020\n" +
+      "\010language\030\004 \001(\t\022\034\n\020hyper_parameters\030\005 \001(" +
+      "\tB\002\030\001\022\032\n\014max_concepts\030\006 \001(\rB\004\200\265\030\001\022\027\n\tmin" +
+      "_value\030\007 \001(\002B\004\200\265\030\001\022.\n\017select_concepts\030\010 " +
+      "\003(\0132\025.clarifai.api.Concept\022\030\n\020training_t" +
+      "imeout\030\t \001(\r\022\021\n\tsample_ms\030\n \001(\r\022-\n\014hyper" +
+      "_params\030\r \001(\0132\027.google.protobuf.Struct\022\"" +
+      "\n\026embed_model_version_id\030\016 \001(\tB\002\030\001\022)\n!fa" +
+      "il_on_missing_positive_examples\030\017 \001(\010\0223\n" +
+      "\016model_metadata\030\021 \001(\0132\027.google.protobuf." +
+      "StructB\002\030\001J\004\010\013\020\014J\004\010\014\020\rJ\004\010\020\020\021J\004\010\022\020\023\"\322\003\n\tM" +
+      "odelType\022\n\n\002id\030\001 \001(\t\022\r\n\005title\030\002 \001(\t\022\023\n\013d" +
+      "escription\030\003 \001(\t\022\024\n\014input_fields\030\005 \003(\t\022\025" +
+      "\n\routput_fields\030\006 \003(\t\022\021\n\ttrainable\030\010 \001(\010" +
+      "\022\021\n\tcreatable\030\t \001(\010\022\025\n\rinternal_only\030\n \001" +
+      "(\010\0227\n\021model_type_fields\030\013 \003(\0132\034.clarifai" +
+      ".api.ModelTypeField\022\"\n\032requires_sequenti" +
+      "al_frames\030\014 \001(\010\022;\n\025expected_input_layers" +
+      "\030\020 \003(\0132\034.clarifai.api.ModelLayerInfo\022<\n\026" +
+      "expected_output_layers\030\021 \003(\0132\034.clarifai." +
+      "api.ModelLayerInfo\0225\n\017evaluation_type\030\022 " +
+      "\001(\0162\034.clarifai.api.EvaluationTypeJ\004\010\007\020\010J" +
+      "\004\010\004\020\005J\004\010\r\020\016J\004\010\016\020\017J\004\010\017\020\020\"\211\001\n\016ModelLayerIn" +
+      "fo\022\027\n\017data_field_name\030\001 \001(\t\022(\n\006shapes\030\002 " +
+      "\003(\0132\030.clarifai.api.LayerShape\022\023\n\013descrip" +
+      "tion\030\003 \001(\t\022\037\n\027requires_label_filename\030\004 " +
+      "\001(\010\"D\n\022TritonCondaEnvInfo\022\026\n\016conda_pack_" +
+      "url\030\001 \001(\t\022\026\n\016conda_yaml_url\030\002 \001(\t\"l\n\nLay" +
+      "erShape\022\014\n\004dims\030\001 \003(\005\022\020\n\010max_dims\030\002 \003(\005\022" +
+      ")\n\tdata_type\030\003 \001(\0162\026.clarifai.api.DataTy" +
+      "pe\022\023\n\013description\030\004 \001(\t\"\275\006\n\016ModelTypeFie" +
+      "ld\022\014\n\004path\030\001 \001(\t\022C\n\nfield_type\030\002 \001(\0162/.c" +
+      "larifai.api.ModelTypeField.ModelTypeFiel" +
+      "dType\022-\n\rdefault_value\030\003 \001(\0132\026.google.pr" +
+      "otobuf.Value\022\023\n\013description\030\004 \001(\t\022\023\n\013pla" +
+      "ceholder\030\005 \001(\t\022B\n\027model_type_enum_option" +
+      "s\030\006 \003(\0132!.clarifai.api.ModelTypeEnumOpti" +
+      "on\022\025\n\rinternal_only\030\007 \001(\010\022\020\n\010required\030\010 " +
+      "\001(\010\022?\n\025model_type_range_info\030\t \001(\0132 .cla" +
+      "rifai.api.ModelTypeRangeInfo\"\320\003\n\022ModelTy" +
+      "peFieldType\022!\n\035INVALID_MODEL_TYPE_FIELD_" +
+      "TYPE\020\000\022\013\n\007BOOLEAN\020\001\022\n\n\006STRING\020\002\022\n\n\006NUMBE" +
+      "R\020\003\022\025\n\021ARRAY_OF_CONCEPTS\020\004\022$\n ARRAY_OF_C" +
+      "ONCEPTS_WITH_THRESHOLD\020\005\022\t\n\005RANGE\020\007\022\010\n\004E" +
+      "NUM\020\010\022\021\n\rCOLLABORATORS\020\t\022\010\n\004JSON\020\n\022\024\n\020AR" +
+      "RAY_OF_NUMBERS\020\013\022\031\n\025WORKFLOW_EMBED_MODEL" +
+      "S\020\014\022\024\n\020ARRAY_OF_STRINGS\020\r\022\022\n\016RECURSIVE_E" +
+      "NUM\020\016\022\017\n\013PYTHON_CODE\020\017\022\016\n\nDATASET_ID\020\020\022\026" +
+      "\n\022DATASET_VERSION_ID\020\021\022\033\n\027ARRAY_OF_MODEL" +
+      "_CONCEPTS\020\022\022\013\n\007DATASET\020\023\022\023\n\017DATASET_VERS" +
+      "ION\020\024\022\024\n\020ENCRYPTED_STRING\020\025\022\024\n\020CHECKPOIN" +
+      "T_MODEL\020\026\"\004\010\006\020\006\"<\n\022ModelTypeRangeInfo\022\013\n" +
+      "\003min\030\001 \001(\002\022\013\n\003max\030\002 \001(\002\022\014\n\004step\030\003 \001(\002\"\324\001" +
+      "\n\023ModelTypeEnumOption\022\n\n\002id\030\001 \001(\t\0227\n\007ali",
+      "ases\030\005 \003(\0132&.clarifai.api.ModelTypeEnumO" +
+      "ptionAlias\022\023\n\013description\030\002 \001(\t\0227\n\021model" +
+      "_type_fields\030\003 \003(\0132\034.clarifai.api.ModelT" +
+      "ypeField\022\025\n\rinternal_only\030\004 \001(\010\022\023\n\013recom" +
+      "mended\030\006 \001(\010\"C\n\030ModelTypeEnumOptionAlias" +
+      "\022\016\n\006id_int\030\001 \001(\003\022\027\n\017wildcard_string\030\002 \001(" +
+      "\t\"7\n\nModelQuery\022\014\n\004name\030\001 \001(\t\022\025\n\rmodel_t" +
+      "ype_id\030\003 \001(\tJ\004\010\002\020\003\"\344\006\n\014ModelVersion\022\n\n\002i" +
+      "d\030\001 \001(\t\022.\n\ncreated_at\030\002 \001(\0132\032.google.pro" +
+      "tobuf.Timestamp\022+\n\006status\030\003 \001(\0132\033.clarif" +
+      "ai.api.status.Status\022\034\n\024active_concept_c" +
+      "ount\030\004 \001(\r\022*\n\007metrics\030\005 \001(\0132\031.clarifai.a" +
+      "pi.EvalMetrics\022\031\n\021total_input_count\030\006 \001(" +
+      "\r\022D\n\027pretrained_model_config\030\007 \001(\0132#.cla" +
+      "rifai.api.PretrainedModelConfig\0220\n\014compl" +
+      "eted_at\030\n \001(\0132\032.google.protobuf.Timestam" +
+      "p\022\023\n\013description\030\013 \001(\t\022,\n\nvisibility\030\014 \001" +
+      "(\0132\030.clarifai.api.Visibility\022\016\n\006app_id\030\r" +
+      " \001(\t\022\017\n\007user_id\030\016 \001(\t\022/\n\013modified_at\030\017 \001" +
+      "(\0132\032.google.protobuf.Timestamp\022)\n\010metada" +
+      "ta\030\020 \001(\0132\027.google.protobuf.Struct\022\017\n\007lic" +
+      "ense\030\021 \001(\t\022-\n\013output_info\030\023 \001(\0132\030.clarif" +
+      "ai.api.OutputInfo\022+\n\ninput_info\030\024 \001(\0132\027." +
+      "clarifai.api.InputInfo\022+\n\ntrain_info\030\025 \001" +
+      "(\0132\027.clarifai.api.TrainInfo\022-\n\013import_in" +
+      "fo\030\026 \001(\0132\030.clarifai.api.ImportInfo\022\021\n\ttr" +
+      "ain_log\030\027 \001(\t\0229\n\026inference_compute_info\030" +
+      "\030 \001(\0132\031.clarifai.api.ComputeInfo\022+\n\nbuil" +
+      "d_info\030\031 \001(\0132\027.clarifai.api.BuildInfoJ\004\010" +
+      "\t\020\nJ\004\010\022\020\023\"]\n\tBuildInfo\022\031\n\021docker_image_n" +
+      "ame\030\001 \001(\t\022\030\n\020docker_image_tag\030\002 \001(\t\022\033\n\023d" +
+      "ocker_image_digest\030\003 \001(\t\"\\\n\022ModelVersion" +
+      "Export\022+\n\006status\030\001 \001(\0132\033.clarifai.api.st" +
+      "atus.Status\022\013\n\003url\030\002 \001(\t\022\014\n\004size\030\003 \001(\003\"\241" +
+      "\001\n\025PretrainedModelConfig\0221\n\020input_fields" +
+      "_map\030\003 \001(\0132\027.google.protobuf.Struct\0222\n\021o" +
+      "utput_fields_map\030\004 \001(\0132\027.google.protobuf" +
+      ".Struct\022\025\n\rmodel_zip_url\030\006 \001(\tJ\004\010\002\020\003J\004\010\005" +
+      "\020\006\">\n\nTrainStats\0220\n\nloss_curve\030\001 \003(\0132\034.c" +
+      "larifai.api.LossCurveEntry\"B\n\016LossCurveE" +
+      "ntry\022\r\n\005epoch\030\001 \001(\r\022\023\n\013global_step\030\002 \001(\r" +
+      "\022\014\n\004cost\030\003 \001(\002\"]\n\nLabelCount\022\030\n\014concept_" +
+      "name\030\001 \001(\tB\002\030\001\022\r\n\005count\030\002 \001(\r\022&\n\007concept" +
+      "\030\003 \001(\0132\025.clarifai.api.Concept\"L\n\021LabelDi" +
+      "stribution\0227\n\025positive_label_counts\030\001 \003(" +
+      "\0132\030.clarifai.api.LabelCount\"B\n\027Cooccurre" +
+      "nceMatrixEntry\022\013\n\003row\030\001 \001(\t\022\013\n\003col\030\002 \001(\t" +
+      "\022\r\n\005count\030\003 \001(\r\"`\n\022CooccurrenceMatrix\0225\n" +
+      "\006matrix\030\001 \003(\0132%.clarifai.api.Cooccurrenc" +
+      "eMatrixEntry\022\023\n\013concept_ids\030\002 \003(\t\"\257\001\n\024Co" +
+      "nfusionMatrixEntry\022\021\n\tpredicted\030\001 \001(\t\022\016\n" +
+      "\006actual\030\002 \001(\t\022\023\n\005value\030\004 \001(\002B\004\200\265\030\001\0220\n\021pr" +
+      "edicted_concept\030\005 \001(\0132\025.clarifai.api.Con" +
+      "cept\022-\n\016actual_concept\030\006 \001(\0132\025.clarifai." +
+      "api.Concept\"Z\n\017ConfusionMatrix\0222\n\006matrix" +
+      "\030\001 \003(\0132\".clarifai.api.ConfusionMatrixEnt" +
+      "ry\022\023\n\013concept_ids\030\002 \003(\t\"t\n\003ROC\022\021\n\003fpr\030\001 " +
+      "\003(\002B\004\200\265\030\001\022\021\n\003tpr\030\002 \003(\002B\004\200\265\030\001\022\030\n\nthreshol" +
+      "ds\030\003 \003(\002B\004\200\265\030\001\022\025\n\rfpr_per_image\030\004 \003(\002\022\026\n" +
+      "\016fpr_per_object\030\005 \003(\002\"_\n\024PrecisionRecall" +
+      "Curve\022\024\n\006recall\030\001 \003(\002B\004\200\265\030\001\022\027\n\tprecision" +
+      "\030\002 \003(\002B\004\200\265\030\001\022\030\n\nthresholds\030\003 \003(\002B\004\200\265\030\001\"\352" +
+      "\002\n\rBinaryMetrics\022\025\n\007num_pos\030\001 \001(\rB\004\200\265\030\001\022" +
+      "\025\n\007num_neg\030\002 \001(\rB\004\200\265\030\001\022\025\n\007num_tot\030\003 \001(\rB" +
+      "\004\200\265\030\001\022\025\n\007roc_auc\030\004 \001(\002B\004\200\265\030\001\022\020\n\002f1\030\005 \001(\002" +
+      "B\004\200\265\030\001\022&\n\007concept\030\006 \001(\0132\025.clarifai.api.C" +
+      "oncept\022$\n\troc_curve\030\007 \001(\0132\021.clarifai.api" +
+      ".ROC\022B\n\026precision_recall_curve\030\010 \001(\0132\".c" +
+      "larifai.api.PrecisionRecallCurve\022\025\n\ravg_" +
+      "precision\030\t \001(\002\022\021\n\tarea_name\030\n \001(\t\022\020\n\010ar" +
+      "ea_min\030\013 \001(\001\022\020\n\010area_max\030\014 \001(\001\022\013\n\003iou\030\r " +
+      "\001(\002\"\221\001\n\016TrackerMetrics\022\020\n\010mot_mota\030\001 \001(\002" +
+      "\022\030\n\020mot_num_switches\030\002 \001(\005\022\022\n\nmorse_frag" +
+      "\030\003 \001(\002\022\025\n\ravg_precision\030\004 \001(\002\022\014\n\004aiid\030\005 " +
+      "\001(\t\022\032\n\022unique_switch_rate\030\006 \001(\002\"\320\002\n\020Eval" +
+      "TestSetEntry\022\"\n\005input\030\006 \001(\0132\023.clarifai.a" +
+      "pi.Input\0221\n\022predicted_concepts\030\003 \003(\0132\025.c" +
+      "larifai.api.Concept\0224\n\025ground_truth_conc" +
+      "epts\030\004 \003(\0132\025.clarifai.api.Concept\0220\n\nann" +
+      "otation\030\005 \001(\0132\030.clarifai.api.AnnotationB" +
+      "\002\030\001\0226\n\024predicted_annotation\030\007 \001(\0132\030.clar" +
+      "ifai.api.Annotation\0229\n\027ground_truth_anno" +
+      "tation\030\010 \001(\0132\030.clarifai.api.AnnotationJ\004" +
+      "\010\001\020\002J\004\010\002\020\003\"\315\001\n\016LOPQEvalResult\022\t\n\001k\030\001 \001(\005" +
+      "\022#\n\025recall_vs_brute_force\030\002 \001(\002B\004\200\265\030\001\022(\n" +
+      "\032kendall_tau_vs_brute_force\030\003 \001(\002B\004\200\265\030\001\022" +
+      "(\n\032most_frequent_code_percent\030\004 \001(\002B\004\200\265\030" +
+      "\001\022\027\n\tlopq_ndcg\030\005 \001(\002B\004\200\265\030\001\022\036\n\020brute_forc" +
+      "e_ndcg\030\006 \001(\002B\004\200\265\030\001\"\214\003\n\016MetricsSummary\022\031\n" +
+      "\rtop1_accuracy\030\001 \001(\002B\002\030\001\022\031\n\rtop5_accurac" +
+      "y\030\002 \001(\002B\002\030\001\022\037\n\021macro_avg_roc_auc\030\003 \001(\002B\004" +
+      "\200\265\030\001\022\037\n\021macro_std_roc_auc\030\004 \001(\002B\004\200\265\030\001\022 \n" +
+      "\022macro_avg_f1_score\030\005 \001(\002B\004\200\265\030\001\022 \n\022macro" +
+      "_std_f1_score\030\006 \001(\002B\004\200\265\030\001\022!\n\023macro_avg_p" +
+      "recision\030\007 \001(\002B\004\200\265\030\001\022\036\n\020macro_avg_recall" +
+      "\030\010 \001(\002B\004\200\265\030\001\022!\n\031mean_avg_precision_iou_5" +
+      "0\030\n \001(\002\022$\n\034mean_avg_precision_iou_range\030" +
+      "\013 \001(\002\0222\n\014lopq_metrics\030\t \003(\0132\034.clarifai.a" +
+      "pi.LOPQEvalResult\"\301\006\n\013EvalMetrics\022+\n\006sta" +
+      "tus\030\001 \001(\0132\033.clarifai.api.status.Status\022\017" +
+      "\n\007user_id\030\017 \001(\t\022\016\n\006app_id\030\020 \001(\t\022\n\n\002id\030\n " +
+      "\001(\t\022\"\n\005model\030\r \001(\0132\023.clarifai.api.Model\022" +
+      "3\n\024ground_truth_dataset\030\016 \001(\0132\025.clarifai" +
+      ".api.Dataset\0222\n\023predictions_dataset\030\022 \001(" +
+      "\0132\025.clarifai.api.Dataset\022-\n\007summary\030\002 \001(" +
+      "\0132\034.clarifai.api.MetricsSummary\0227\n\020confu" +
+      "sion_matrix\030\003 \001(\0132\035.clarifai.api.Confusi" +
+      "onMatrix\022=\n\023cooccurrence_matrix\030\004 \001(\0132 ." +
+      "clarifai.api.CooccurrenceMatrix\0225\n\014label" +
+      "_counts\030\005 \001(\0132\037.clarifai.api.LabelDistri" +
+      "bution\0223\n\016binary_metrics\030\006 \003(\0132\033.clarifa" +
+      "i.api.BinaryMetrics\0220\n\010test_set\030\007 \003(\0132\036." +
+      "clarifai.api.EvalTestSetEntry\0224\n\017metrics" +
+      "_by_area\030\010 \003(\0132\033.clarifai.api.BinaryMetr" +
+      "ics\0225\n\020metrics_by_class\030\t \003(\0132\033.clarifai" +
+      ".api.BinaryMetrics\0225\n\017tracker_metrics\030\013 " +
+      "\003(\0132\034.clarifai.api.TrackerMetrics\022)\n\teva" +
+      "l_info\030\014 \001(\0132\026.clarifai.api.EvalInfo\0227\n\020" +
+      "extended_metrics\030\021 \001(\0132\035.clarifai.api.Ex" +
+      "tendedMetrics\"@\n\017ExtendedMetrics\022-\n\014user" +
+      "_metrics\030\001 \001(\0132\027.google.protobuf.Struct\"" +
+      "\267\001\n\013FieldsValue\022\030\n\020confusion_matrix\030\001 \001(" +
+      "\010\022\033\n\023cooccurrence_matrix\030\002 \001(\010\022\024\n\014label_" +
+      "counts\030\003 \001(\010\022\026\n\016binary_metrics\030\004 \001(\010\022\020\n\010" +
+      "test_set\030\005 \001(\010\022\027\n\017metrics_by_area\030\006 \001(\010\022" +
+      "\030\n\020metrics_by_class\030\007 \001(\010\"\333\001\n\006Output\022\n\n\002" +
+      "id\030\001 \001(\t\022+\n\006status\030\002 \001(\0132\033.clarifai.api." +
+      "status.Status\022.\n\ncreated_at\030\003 \001(\0132\032.goog" +
+      "le.protobuf.Timestamp\022\"\n\005model\030\004 \001(\0132\023.c" +
+      "larifai.api.Model\022\"\n\005input\030\005 \001(\0132\023.clari" +
+      "fai.api.Input\022 \n\004data\030\006 \001(\0132\022.clarifai.a" +
+      "pi.Data\"4\n\tScopeDeps\022\r\n\005scope\030\001 \001(\t\022\030\n\020d" +
+      "epending_scopes\030\002 \003(\t\":\n\014EndpointDeps\022\020\n" +
+      "\010endpoint\030\001 \001(\t\022\030\n\020depending_scopes\030\002 \003(" +
+      "\t\"\215\001\n\003Hit\022\023\n\005score\030\001 \001(\002B\004\200\265\030\001\022\"\n\005input\030" +
+      "\002 \001(\0132\023.clarifai.api.Input\022,\n\nannotation" +
+      "\030\003 \001(\0132\030.clarifai.api.Annotation\022\017\n\007user" +
+      "_id\030\004 \001(\t\022\016\n\006app_id\030\005 \001(\t\"#\n\010HitCount\022\027\n" +
+      "\017estimated_total\030\001 \001(\004\"\215\001\n\003And\022\"\n\005input\030" +
+      "\001 \001(\0132\023.clarifai.api.Input\022$\n\006output\030\002 \001" +
+      "(\0132\024.clarifai.api.Output\022\016\n\006negate\030\003 \001(\010" +
+      "\022,\n\nannotation\030\004 \001(\0132\030.clarifai.api.Anno" +
+      "tation\"\210\001\n\005Query\022#\n\004ands\030\001 \003(\0132\021.clarifa" +
+      "i.api.AndB\002\030\001\022\020\n\010language\030\002 \001(\t\022%\n\007filte" +
+      "rs\030\003 \003(\0132\024.clarifai.api.Filter\022!\n\005ranks\030" +
+      "\004 \003(\0132\022.clarifai.api.Rank\"\326\003\n\006Search\022\"\n\005" +
+      "query\030\001 \001(\0132\023.clarifai.api.Query\022\n\n\002id\030\002" +
+      " \001(\t\022\026\n\016application_id\030\003 \001(\t\022\014\n\004name\030\004 \001" +
+      "(\t\022)\n\005as_of\030\005 \001(\0132\032.google.protobuf.Time" +
+      "stamp\022\020\n\010git_hash\030\006 \001(\t\022.\n\ncreated_at\030\007 " +
+      "\001(\0132\032.google.protobuf.Timestamp\022/\n\013modif" +
+      "ied_at\030\010 \001(\0132\032.google.protobuf.Timestamp" +
+      "\022\021\n\talgorithm\030\t \001(\t\022\014\n\004save\030\n \001(\010\022\021\n\tmin" +
+      "_value\030\013 \001(\002\022,\n\nvisibility\030\014 \001(\0132\030.clari" +
+      "fai.api.Visibility\022+\n\006metric\030\r \001(\0162\033.cla" +
+      "rifai.api.Search.Metric\"I\n\006Metric\022\022\n\016MET" +
+      "RIC_NOT_SET\020\000\022\026\n\022EUCLIDEAN_DISTANCE\020\001\022\023\n" +
+      "\017COSINE_DISTANCE\020\002\"\244\001\n\006Filter\022\016\n\006negate\030" +
+      "\003 \001(\010\022,\n\nannotation\030\004 \001(\0132\030.clarifai.api" +
+      ".Annotation\022\"\n\005input\030\005 \001(\0132\023.clarifai.ap" +
+      "i.Input\0228\n\027last_updated_time_range\030\006 \001(\013" +
+      "2\027.clarifai.api.TimeRange\"i\n\tTimeRange\022." +
+      "\n\nstart_time\030\001 \001(\0132\032.google.protobuf.Tim" +
+      "estamp\022,\n\010end_time\030\002 \001(\0132\032.google.protob" +
+      "uf.Timestamp\"D\n\004Rank\022\016\n\006negate\030\003 \001(\010\022,\n\n" +
+      "annotation\030\004 \001(\0132\030.clarifai.api.Annotati" +
+      "on\"\215\002\n\027AnnotationSearchMetrics\022*\n\014ground" +
+      "_truth\030\001 \001(\0132\024.clarifai.api.Search\022,\n\016se" +
+      "arch_to_eval\030\002 \001(\0132\024.clarifai.api.Search" +
+      "\022*\n\007metrics\030\003 \001(\0132\031.clarifai.api.EvalMet" +
+      "rics\022 \n\004data\030\004 \001(\0132\022.clarifai.api.Data\022\034" +
+      "\n\024active_concept_count\030\005 \001(\r\022,\n\nvisibili" +
+      "ty\030\006 \001(\0132\030.clarifai.api.Visibility\"\221\001\n\004T" +
+      "ext\022\013\n\003raw\030\001 \001(\t\022\013\n\003url\030\002 \001(\t\022\033\n\023allow_d" +
+      "uplicate_url\030\003 \001(\010\022\'\n\006hosted\030\004 \001(\0132\027.cla" +
+      "rifai.api.HostedURL\022)\n\ttext_info\030\005 \001(\0132\026" +
+      ".clarifai.api.TextInfo\"0\n\010TextInfo\022\022\n\nch" +
+      "ar_count\030\001 \001(\005\022\020\n\010encoding\030\002 \001(\t\"\250\006\n\004Use" +
+      "r\022\n\n\002id\030\001 \001(\t\022\031\n\rprimary_email\030\002 \001(\tB\002\030\001" +
+      "\022\022\n\nfirst_name\030\003 \001(\t\022\021\n\tlast_name\030\004 \001(\t\022" +
+      "\024\n\014company_name\030\005 \001(\t\022\021\n\tjob_title\030\023 \001(\t" +
+      "\022\020\n\010job_role\030\024 \001(\t\022\021\n\tintention\030\030 \001(\t\022\027\n" +
+      "\017referral_source\030\031 \001(\t\022\025\n\tbill_type\030\007 \001(" +
+      "\tB\002\030\001\022.\n\ncreated_at\030\006 \001(\0132\032.google.proto" +
+      "buf.Timestamp\0229\n\021date_gdpr_consent\030\010 \001(\013" +
       "2\032.google.protobuf.TimestampB\002\030\001\0228\n\020date" +
-      "_pii_consent\030\027 \001(\0132\032.google.protobuf.Tim" +
-      "estampB\002\030\001\022-\n\010metadata\030\013 \001(\0132\027.google.pr" +
-      "otobuf.StructB\002\030\001\0227\n\017email_addresses\030\014 \003" +
-      "(\0132\032.clarifai.api.EmailAddressB\002\030\001\022#\n\027tw" +
-      "o_factor_auth_enabled\030\017 \001(\010B\002\030\001\022\027\n\013teams" +
-      "_count\030\020 \001(\rB\002\030\001\022\022\n\nis_starred\030\025 \001(\010\022\022\n\n" +
-      "star_count\030\026 \001(\005\022,\n\nvisibility\030\021 \001(\0132\030.c" +
-      "larifai.api.Visibility\022-\n\013user_detail\030\022 " +
-      "\001(\0132\030.clarifai.api.UserDetailJ\004\010\r\020\016J\004\010\016\020" +
-      "\017\"\321\003\n\nUserDetail\022\025\n\rprimary_email\030\001 \001(\t\022" +
-      "\021\n\tbill_type\030\002 \001(\t\0225\n\021date_gdpr_consent\030" +
-      "\003 \001(\0132\032.google.protobuf.Timestamp\0224\n\020dat" +
-      "e_tos_consent\030\004 \001(\0132\032.google.protobuf.Ti" +
-      "mestamp\022:\n\026date_marketing_consent\030\005 \001(\0132" +
-      "\032.google.protobuf.Timestamp\0224\n\020date_pii_" +
-      "consent\030\r \001(\0132\032.google.protobuf.Timestam" +
-      "p\022)\n\010metadata\030\006 \001(\0132\027.google.protobuf.St" +
-      "ruct\0223\n\017email_addresses\030\007 \003(\0132\032.clarifai" +
-      ".api.EmailAddress\022\037\n\027two_factor_auth_ena" +
-      "bled\030\t \001(\010\022\023\n\013teams_count\030\n \001(\r\022\017\n\007count" +
-      "ry\030\013 \001(\t\022\r\n\005state\030\014 \001(\tJ\004\010\010\020\t\"R\n\014EmailAd" +
-      "dress\022\023\n\005email\030\001 \001(\tB\004\200\265\030\001\022\025\n\007primary\030\002 " +
-      "\001(\010B\004\200\265\030\001\022\026\n\010verified\030\003 \001(\010B\004\200\265\030\001\"\035\n\010Pas" +
-      "sword\022\021\n\tplaintext\030\001 \001(\t\"\206\003\n\022PasswordVio" +
-      "lations\022\026\n\016minimum_length\030\001 \001(\010\022\026\n\016maxim" +
-      "um_length\030\002 \001(\010\022\031\n\021upper_case_needed\030\003 \001" +
-      "(\010\022\031\n\021lower_case_needed\030\004 \001(\010\022\026\n\016numeric" +
-      "_needed\030\005 \001(\010\022\037\n\027non_alphanumeric_needed" +
-      "\030\006 \001(\010\022\026\n\016password_reuse\030\007 \001(\010\022\025\n\rexclud" +
-      "e_names\030\010 \001(\010\022\025\n\rexclude_email\030\t \001(\010\022\034\n\024" +
-      "no_confusing_letters\030\n \001(\010\022\033\n\023no_simple_" +
-      "passwords\030\013 \001(\010\022\030\n\020no_common_vocabs\030\014 \001(" +
-      "\010\022\033\n\023no_overlap_with_old\030\r \001(\010\022\031\n\021passwo" +
-      "rd_lifespan\030\016 \001(\010\"\345\001\n\005Video\022\013\n\003url\030\001 \001(\t" +
-      "\022\016\n\006base64\030\002 \001(\014\022\033\n\023allow_duplicate_url\030" +
-      "\004 \001(\010\022\031\n\rthumbnail_url\030\005 \001(\tB\002\030\001\022\'\n\006host" +
-      "ed\030\006 \001(\0132\027.clarifai.api.HostedURL\0221\n\020hos" +
-      "ted_thumbnail\030\010 \001(\0132\027.clarifai.api.Hoste" +
-      "dURL\022+\n\nvideo_info\030\007 \001(\0132\027.clarifai.api." +
-      "VideoInfo\"\216\001\n\tVideoInfo\022\r\n\005width\030\001 \001(\005\022\016" +
-      "\n\006height\030\002 \001(\005\022\013\n\003fps\030\003 \001(\002\022\024\n\014video_for" +
-      "mat\030\004 \001(\t\022\020\n\010bit_rate\030\005 \001(\005\022\023\n\013frame_cou" +
-      "nt\030\006 \001(\005\022\030\n\020duration_seconds\030\007 \001(\002\"\252\004\n\010W" +
-      "orkflow\022\n\n\002id\030\001 \001(\t\022\016\n\006app_id\030\002 \001(\t\022.\n\nc" +
-      "reated_at\030\003 \001(\0132\032.google.protobuf.Timest" +
-      "amp\022)\n\005nodes\030\004 \003(\0132\032.clarifai.api.Workfl" +
-      "owNode\022)\n\010metadata\030\005 \001(\0132\027.google.protob" +
-      "uf.Struct\022,\n\nvisibility\030\006 \001(\0132\030.clarifai" +
-      ".api.Visibility\022\017\n\007user_id\030\007 \001(\t\022/\n\013modi" +
-      "fied_at\030\010 \001(\0132\032.google.protobuf.Timestam" +
-      "p\022.\n\007version\030\t \001(\0132\035.clarifai.api.Workfl" +
-      "owVersion\022\022\n\nis_starred\030\n \001(\010\022\022\n\nstar_co" +
-      "unt\030\013 \001(\005\022\023\n\013description\030\014 \001(\t\022\r\n\005notes\030" +
-      "\r \001(\t\022\027\n\tuse_cases\030\016 \003(\tB\004\200\265\030\001\022\034\n\016check_" +
-      "consents\030\017 \003(\tB\004\200\265\030\001\0225\n\017bookmark_origin\030" +
-      "\020 \001(\0132\034.clarifai.api.BookmarkOrigin\022\"\n\005i" +
-      "mage\030\021 \001(\0132\023.clarifai.api.Image\"\336\002\n\017Work" +
-      "flowVersion\022\n\n\002id\030\001 \001(\t\022\023\n\013workflow_id\030\002" +
+      "_tos_consent\030\t \001(\0132\032.google.protobuf.Tim" +
+      "estampB\002\030\001\022>\n\026date_marketing_consent\030\n \001" +
+      "(\0132\032.google.protobuf.TimestampB\002\030\001\0228\n\020da" +
+      "te_pii_consent\030\027 \001(\0132\032.google.protobuf.T" +
+      "imestampB\002\030\001\022-\n\010metadata\030\013 \001(\0132\027.google." +
+      "protobuf.StructB\002\030\001\0227\n\017email_addresses\030\014" +
+      " \003(\0132\032.clarifai.api.EmailAddressB\002\030\001\022#\n\027" +
+      "two_factor_auth_enabled\030\017 \001(\010B\002\030\001\022\027\n\013tea" +
+      "ms_count\030\020 \001(\rB\002\030\001\022\022\n\nis_starred\030\025 \001(\010\022\022" +
+      "\n\nstar_count\030\026 \001(\005\022,\n\nvisibility\030\021 \001(\0132\030" +
+      ".clarifai.api.Visibility\022-\n\013user_detail\030" +
+      "\022 \001(\0132\030.clarifai.api.UserDetailJ\004\010\r\020\016J\004\010" +
+      "\016\020\017\"\321\003\n\nUserDetail\022\025\n\rprimary_email\030\001 \001(" +
+      "\t\022\021\n\tbill_type\030\002 \001(\t\0225\n\021date_gdpr_consen" +
+      "t\030\003 \001(\0132\032.google.protobuf.Timestamp\0224\n\020d" +
+      "ate_tos_consent\030\004 \001(\0132\032.google.protobuf." +
+      "Timestamp\022:\n\026date_marketing_consent\030\005 \001(" +
+      "\0132\032.google.protobuf.Timestamp\0224\n\020date_pi" +
+      "i_consent\030\r \001(\0132\032.google.protobuf.Timest" +
+      "amp\022)\n\010metadata\030\006 \001(\0132\027.google.protobuf." +
+      "Struct\0223\n\017email_addresses\030\007 \003(\0132\032.clarif" +
+      "ai.api.EmailAddress\022\037\n\027two_factor_auth_e" +
+      "nabled\030\t \001(\010\022\023\n\013teams_count\030\n \001(\r\022\017\n\007cou" +
+      "ntry\030\013 \001(\t\022\r\n\005state\030\014 \001(\tJ\004\010\010\020\t\"R\n\014Email" +
+      "Address\022\023\n\005email\030\001 \001(\tB\004\200\265\030\001\022\025\n\007primary\030" +
+      "\002 \001(\010B\004\200\265\030\001\022\026\n\010verified\030\003 \001(\010B\004\200\265\030\001\"\035\n\010P" +
+      "assword\022\021\n\tplaintext\030\001 \001(\t\"\206\003\n\022PasswordV" +
+      "iolations\022\026\n\016minimum_length\030\001 \001(\010\022\026\n\016max" +
+      "imum_length\030\002 \001(\010\022\031\n\021upper_case_needed\030\003" +
+      " \001(\010\022\031\n\021lower_case_needed\030\004 \001(\010\022\026\n\016numer" +
+      "ic_needed\030\005 \001(\010\022\037\n\027non_alphanumeric_need" +
+      "ed\030\006 \001(\010\022\026\n\016password_reuse\030\007 \001(\010\022\025\n\rexcl" +
+      "ude_names\030\010 \001(\010\022\025\n\rexclude_email\030\t \001(\010\022\034" +
+      "\n\024no_confusing_letters\030\n \001(\010\022\033\n\023no_simpl" +
+      "e_passwords\030\013 \001(\010\022\030\n\020no_common_vocabs\030\014 " +
+      "\001(\010\022\033\n\023no_overlap_with_old\030\r \001(\010\022\031\n\021pass" +
+      "word_lifespan\030\016 \001(\010\"\345\001\n\005Video\022\013\n\003url\030\001 \001" +
+      "(\t\022\016\n\006base64\030\002 \001(\014\022\033\n\023allow_duplicate_ur" +
+      "l\030\004 \001(\010\022\031\n\rthumbnail_url\030\005 \001(\tB\002\030\001\022\'\n\006ho" +
+      "sted\030\006 \001(\0132\027.clarifai.api.HostedURL\0221\n\020h" +
+      "osted_thumbnail\030\010 \001(\0132\027.clarifai.api.Hos" +
+      "tedURL\022+\n\nvideo_info\030\007 \001(\0132\027.clarifai.ap" +
+      "i.VideoInfo\"\216\001\n\tVideoInfo\022\r\n\005width\030\001 \001(\005" +
+      "\022\016\n\006height\030\002 \001(\005\022\013\n\003fps\030\003 \001(\002\022\024\n\014video_f" +
+      "ormat\030\004 \001(\t\022\020\n\010bit_rate\030\005 \001(\005\022\023\n\013frame_c" +
+      "ount\030\006 \001(\005\022\030\n\020duration_seconds\030\007 \001(\002\"\252\004\n" +
+      "\010Workflow\022\n\n\002id\030\001 \001(\t\022\016\n\006app_id\030\002 \001(\t\022.\n" +
+      "\ncreated_at\030\003 \001(\0132\032.google.protobuf.Time" +
+      "stamp\022)\n\005nodes\030\004 \003(\0132\032.clarifai.api.Work" +
+      "flowNode\022)\n\010metadata\030\005 \001(\0132\027.google.prot" +
+      "obuf.Struct\022,\n\nvisibility\030\006 \001(\0132\030.clarif" +
+      "ai.api.Visibility\022\017\n\007user_id\030\007 \001(\t\022/\n\013mo" +
+      "dified_at\030\010 \001(\0132\032.google.protobuf.Timest" +
+      "amp\022.\n\007version\030\t \001(\0132\035.clarifai.api.Work" +
+      "flowVersion\022\022\n\nis_starred\030\n \001(\010\022\022\n\nstar_" +
+      "count\030\013 \001(\005\022\023\n\013description\030\014 \001(\t\022\r\n\005note" +
+      "s\030\r \001(\t\022\027\n\tuse_cases\030\016 \003(\tB\004\200\265\030\001\022\034\n\016chec" +
+      "k_consents\030\017 \003(\tB\004\200\265\030\001\0225\n\017bookmark_origi" +
+      "n\030\020 \001(\0132\034.clarifai.api.BookmarkOrigin\022\"\n" +
+      "\005image\030\021 \001(\0132\023.clarifai.api.Image\"\336\002\n\017Wo" +
+      "rkflowVersion\022\n\n\002id\030\001 \001(\t\022\023\n\013workflow_id" +
+      "\030\002 \001(\t\022.\n\ncreated_at\030\003 \001(\0132\032.google.prot" +
+      "obuf.Timestamp\022/\n\013modified_at\030\004 \001(\0132\032.go" +
+      "ogle.protobuf.Timestamp\022,\n\nvisibility\030\005 " +
+      "\001(\0132\030.clarifai.api.Visibility\022)\n\005nodes\030\006" +
+      " \003(\0132\032.clarifai.api.WorkflowNode\022)\n\010meta" +
+      "data\030\007 \001(\0132\027.google.protobuf.Struct\022\016\n\006a" +
+      "pp_id\030\010 \001(\t\022\017\n\007user_id\030\t \001(\t\022\023\n\013descript" +
+      "ion\030\n \001(\t\022\017\n\007license\030\013 \001(\t\"\275\001\n\014WorkflowN" +
+      "ode\022\n\n\002id\030\001 \001(\t\022\"\n\005model\030\002 \001(\0132\023.clarifa" +
+      "i.api.Model\022,\n\013node_inputs\030\003 \003(\0132\027.clari" +
+      "fai.api.NodeInput\022\027\n\017suppress_output\030\004 \001" +
+      "(\010\0226\n\024output_info_override\030\005 \001(\0132\030.clari" +
+      "fai.api.OutputInfo\"\034\n\tNodeInput\022\017\n\007node_" +
+      "id\030\001 \001(\t\"\205\002\n\016WorkflowResult\022\n\n\002id\030\001 \001(\t\022" +
+      "+\n\006status\030\002 \001(\0132\033.clarifai.api.status.St" +
+      "atus\022.\n\ncreated_at\030\003 \001(\0132\032.google.protob" +
+      "uf.Timestamp\022&\n\005model\030\004 \001(\0132\023.clarifai.a" +
+      "pi.ModelB\002\030\001\022\"\n\005input\030\005 \001(\0132\023.clarifai.a" +
+      "pi.Input\022%\n\007outputs\030\006 \003(\0132\024.clarifai.api" +
+      ".Output\022\027\n\017suppress_output\030\007 \001(\010\"\033\n\rWork" +
+      "flowState\022\n\n\002id\030\001 \001(\t\"\220\003\n\016AppDuplication" +
+      "\022\n\n\002id\030\001 \001(\t\022*\n\017destination_app\030\n \001(\0132\021." +
+      "clarifai.api.App\022\033\n\017existing_app_id\030\010 \001(" +
+      "\tB\002\030\001\022\026\n\nnew_app_id\030\002 \001(\tB\002\030\001\022\030\n\014new_app" +
+      "_name\030\003 \001(\tB\002\030\001\022+\n\006status\030\004 \001(\0132\033.clarif" +
+      "ai.api.status.Status\022.\n\ncreated_at\030\005 \001(\013" +
+      "2\032.google.protobuf.Timestamp\0224\n\020last_mod" +
+      "ified_at\030\006 \001(\0132\032.google.protobuf.Timesta" +
+      "mp\0223\n\006filter\030\007 \001(\0132#.clarifai.api.AppDup" +
+      "licationFilters\022/\n\010progress\030\t \003(\0132\035.clar" +
+      "ifai.api.AppCopyProgress\"5\n\017AppCopyProgr" +
+      "ess\022\r\n\005field\030\001 \001(\t\022\023\n\005value\030\002 \001(\005B\004\200\265\030\001\"" +
+      "\262\001\n\025AppDuplicationFilters\022\023\n\013copy_inputs" +
+      "\030\001 \001(\010\022\025\n\rcopy_concepts\030\002 \001(\010\022\030\n\020copy_an" +
+      "notations\030\003 \001(\010\022\023\n\013copy_models\030\004 \001(\010\022\026\n\016" +
+      "copy_workflows\030\005 \001(\010\022&\n\036copy_installed_m" +
+      "odule_versions\030\006 \001(\010\"\372\002\n\nLabelOrder\022\n\n\002i" +
+      "d\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\022+\n\006status\030\003 \001(\0132\033." +
+      "clarifai.api.status.Status\022\024\n\014auto_relea" +
+      "se\030\004 \001(\010\022\027\n\017allow_empty_tag\030\005 \001(\010\0228\n\024des" +
+      "ired_fulfill_time\030\006 \001(\0132\032.google.protobu" +
+      "f.Timestamp\0229\n\025estimate_fulfill_time\030\007 \001" +
+      "(\0132\032.google.protobuf.Timestamp\022 \n\004task\030\010" +
+      " \001(\0132\022.clarifai.api.Task\022.\n\ncreated_at\030\t" +
+      " \001(\0132\032.google.protobuf.Timestamp\022/\n\013modi" +
+      "fied_at\030\n \001(\0132\032.google.protobuf.Timestam" +
+      "p\"\347\006\n\004Task\022\n\n\002id\030\001 \001(\t\022.\n\ncreated_at\030\002 \001" +
+      "(\0132\032.google.protobuf.Timestamp\022/\n\013modifi" +
+      "ed_at\030\003 \001(\0132\032.google.protobuf.Timestamp\022" +
+      ")\n\004type\030\004 \001(\0162\033.clarifai.api.Task.TaskTy" +
+      "pe\022\023\n\013description\030\005 \001(\t\022(\n\006worker\030\006 \001(\0132" +
+      "\030.clarifai.api.TaskWorker\022\027\n\013concept_ids" +
+      "\030\007 \003(\tB\002\030\001\0223\n\014input_source\030\010 \001(\0132\035.clari" +
+      "fai.api.TaskInputSource\022\021\n\tsample_ms\030\t \001" +
+      "(\r\0223\n\014ai_assistant\030\n \001(\0132\035.clarifai.api." +
+      "TaskAIAssistant\022(\n\006review\030\013 \001(\0132\030.clarif" +
+      "ai.api.TaskReview\022+\n\006status\030\014 \001(\0132\033.clar" +
+      "ifai.api.status.Status\022\014\n\004name\030\r \001(\t\022:\n\020" +
+      "ai_assist_params\030\016 \001(\0132 .clarifai.api.Ai" +
+      "AssistParameters\022,\n\nvisibility\030\017 \001(\0132\030.c" +
+      "larifai.api.Visibility\022\016\n\006app_id\030\020 \001(\t\022\017" +
+      "\n\007user_id\030\021 \001(\t\022\026\n\016label_order_id\030\022 \001(\t\022" +
+      "+\n\010concepts\030\023 \003(\0132\031.clarifai.api.TaskCon" +
+      "cept\022#\n\033delete_previous_annotations\030\024 \001(" +
+      "\010\022*\n\007metrics\030\025 \001(\0132\031.clarifai.api.TaskMe" +
+      "trics\"l\n\010TaskType\022\020\n\014TYPE_NOT_SET\020\000\022\033\n\027C" +
+      "ONCEPTS_CLASSIFICATION\020\001\022\032\n\026BOUNDING_BOX" +
+      "_DETECTION\020\002\022\025\n\021POLYGON_DETECTION\020\003\"`\n\022A" +
+      "iAssistParameters\022\025\n\rmin_threshold\030\001 \001(\002" +
+      "\022\025\n\rmax_threshold\030\002 \001(\002\022\034\n\024concept_relat" +
+      "ion_ids\030\003 \003(\t\"\366\002\n\nTaskWorker\022=\n\010strategy" +
+      "\030\001 \001(\0162+.clarifai.api.TaskWorker.TaskWor" +
+      "kerStrategy\022\024\n\010user_ids\030\002 \003(\tB\002\030\001\022%\n\005use" +
+      "rs\030\004 \003(\0132\022.clarifai.api.UserB\002\030\001\022T\n\031part" +
+      "itioned_strategy_info\030\003 \001(\0132/.clarifai.a" +
+      "pi.TaskWorkerPartitionedStrategyInfoH\000\022%" +
+      "\n\007workers\030\007 \003(\0132\024.clarifai.api.Worker\"R\n" +
+      "\022TaskWorkerStrategy\022\033\n\027WORKER_STRATEGY_N" +
+      "OT_SET\020\000\022\017\n\013PARTITIONED\020\002\022\010\n\004FULL\020\003\"\004\010\001\020" +
+      "\001B\017\n\rstrategy_infoJ\004\010\005\020\006J\004\010\006\020\007\"\251\002\n!TaskW" +
+      "orkerPartitionedStrategyInfo\022[\n\004type\030\001 \001" +
+      "(\0162M.clarifai.api.TaskWorkerPartitionedS" +
+      "trategyInfo.TaskWorkerPartitionedStrateg" +
+      "y\022\031\n\021workers_per_input\030\002 \001(\005\022(\n\007weights\030" +
+      "\003 \001(\0132\027.google.protobuf.Struct\"b\n\035TaskWo" +
+      "rkerPartitionedStrategy\022\'\n#PARTITIONED_W" +
+      "ORKER_STRATEGY_NOT_SET\020\000\022\n\n\006EVENLY\020\001\022\014\n\010" +
+      "WEIGHTED\020\002\"\303\001\n\017TaskInputSource\022?\n\004type\030\001" +
+      " \001(\01621.clarifai.api.TaskInputSource.Task" +
+      "InputSourceType\022\n\n\002id\030\002 \001(\t\"c\n\023TaskInput" +
+      "SourceType\022\035\n\031INPUT_SOURCE_TYPE_NOT_SET\020" +
+      "\000\022\016\n\nALL_INPUTS\020\001\022\020\n\014SAVED_SEARCH\020\002\022\013\n\007D" +
+      "ATASET\020\003\"\220\003\n\nTaskReview\022=\n\010strategy\030\001 \001(" +
+      "\0162+.clarifai.api.TaskReview.TaskReviewSt" +
+      "rategy\022\024\n\010user_ids\030\002 \003(\tB\002\030\001\022!\n\005users\030\005 " +
+      "\003(\0132\022.clarifai.api.User\022J\n\024manual_strate" +
+      "gy_info\030\003 \001(\0132*.clarifai.api.TaskReviewM" +
+      "anualStrategyInfoH\000\022P\n\027consensus_strateg" +
+      "y_info\030\004 \001(\0132-.clarifai.api.TaskReviewCo" +
+      "nsensusStrategyInfoH\000\"[\n\022TaskReviewStrat" +
+      "egy\022 \n\034TASK_REVIEW_STRATEGY_NOT_SET\020\000\022\010\n" +
+      "\004NONE\020\001\022\n\n\006MANUAL\020\002\022\r\n\tCONSENSUS\020\003B\017\n\rst" +
+      "rategy_info\"9\n\034TaskReviewManualStrategyI" +
+      "nfo\022\031\n\021sample_percentage\030\001 \001(\002\"C\n\037TaskRe" +
+      "viewConsensusStrategyInfo\022\032\n\022approval_th" +
+      "reshold\030\002 \001(\rJ\004\010\001\020\002\"&\n\017TaskAIAssistant\022\023" +
+      "\n\013workflow_id\030\001 \001(\t\"\364\001\n\016TaskAssignment\022\n" +
+      "\n\002id\030\001 \001(\t\022.\n\ncreated_at\030\002 \001(\0132\032.google." +
+      "protobuf.Timestamp\022/\n\013modified_at\030\003 \001(\0132" +
+      "\032.google.protobuf.Timestamp\022$\n\006worker\030\004 " +
+      "\001(\0132\024.clarifai.api.Worker\022\"\n\005input\030\005 \001(\013" +
+      "2\023.clarifai.api.Input\022+\n\006status\030\006 \001(\0132\033." +
+      "clarifai.api.status.Status\"\346\001\n\026TaskStatu" +
+      "sCountPerUser\022\023\n\007user_id\030\001 \001(\tB\002\030\001\022\025\n\007pe" +
+      "nding\030\002 \001(\rB\004\200\265\030\001\022\035\n\017awaiting_review\030\003 \001" +
+      "(\rB\004\200\265\030\001\022\025\n\007success\030\004 \001(\rB\004\200\265\030\001\022\033\n\rrevie" +
+      "w_denied\030\005 \001(\rB\004\200\265\030\001\022\'\n\031awaiting_consens" +
+      "us_review\030\006 \001(\rB\004\200\265\030\001\022$\n\006worker\030\007 \001(\0132\024." +
+      "clarifai.api.Worker\"f\n\016ThresholdRange\022\032\n" +
+      "\022is_lower_inclusive\030\001 \001(\010\022\032\n\022is_upper_in" +
+      "clusive\030\002 \001(\010\022\r\n\005lower\030\003 \001(\002\022\r\n\005upper\030\004 " +
+      "\001(\002\"\255\001\n\037TaskConceptAutoAnnotationConfig\022" +
+      "\035\n\025annotation_data_types\030\001 \001(\r\0225\n\017thresh" +
+      "old_range\030\002 \001(\0132\034.clarifai.api.Threshold" +
+      "Range\0224\n\013status_code\030\003 \001(\0162\037.clarifai.ap" +
+      "i.status.StatusCode\"\204\001\n\013TaskConcept\022&\n\007c" +
+      "oncept\030\001 \001(\0132\025.clarifai.api.Concept\022M\n\026a" +
+      "uto_annotation_config\030\002 \001(\0132-.clarifai.a" +
+      "pi.TaskConceptAutoAnnotationConfig\"q\n\013Ta" +
+      "skMetrics\022+\n\004work\030\002 \001(\0132\035.clarifai.api.T" +
+      "askWorkMetrics\022/\n\006review\030\003 \001(\0132\037.clarifa" +
+      "i.api.TaskReviewMetricsJ\004\010\001\020\002\"S\n\017TaskWor" +
+      "kMetrics\022\036\n\026inputs_count_estimated\030\001 \001(\004" +
+      "\022 \n\030inputs_percent_estimated\030\002 \001(\r\"U\n\021Ta" +
+      "skReviewMetrics\022\036\n\026inputs_count_estimate" +
+      "d\030\001 \001(\004\022 \n\030inputs_percent_estimated\030\002 \001(" +
+      "\r\"\273\002\n\tCollector\022\n\n\002id\030\001 \001(\t\022\023\n\013descripti" +
+      "on\030\002 \001(\t\022.\n\ncreated_at\030\003 \001(\0132\032.google.pr" +
+      "otobuf.Timestamp\022\035\n\025pre_queue_workflow_i" +
+      "d\030\004 \001(\t\022\037\n\027pre_queue_random_sample\030\010 \001(\002" +
+      "\022\036\n\026post_queue_workflow_id\030\005 \001(\t\0227\n\020coll" +
+      "ector_source\030\006 \001(\0132\035.clarifai.api.Collec" +
+      "torSource\022+\n\006status\030\007 \001(\0132\033.clarifai.api" +
+      ".status.Status\022\027\n\017collect_outputs\030\t \001(\010\"" +
+      "t\n\017CollectorSource\022a\n\'api_post_model_out" +
+      "puts_collector_source\030\002 \001(\01320.clarifai.a" +
+      "pi.APIPostModelOutputsCollectorSource\"\261\001" +
+      "\n\"APIPostModelOutputsCollectorSource\022\025\n\r" +
+      "model_user_id\030\001 \001(\t\022\024\n\014model_app_id\030\002 \001(" +
+      "\t\022\020\n\010model_id\030\003 \001(\t\022\030\n\020model_version_id\030" +
+      "\004 \001(\t\022\032\n\022post_inputs_key_id\030\005 \001(\t\022\026\n\016cal" +
+      "ler_user_id\030\006 \001(\t\"R\n\tStatValue\022(\n\004time\030\001" +
+      " \001(\0132\032.google.protobuf.Timestamp\022\r\n\005valu",
+      "e\030\002 \001(\002\022\014\n\004tags\030\003 \003(\t\"\246\001\n\030StatValueAggre" +
+      "gateResult\022?\n\025stat_value_aggregates\030\001 \003(" +
+      "\0132 .clarifai.api.StatValueAggregate\022I\n\032s" +
+      "tat_value_aggregate_query\030\002 \001(\0132%.clarif" +
+      "ai.api.StatValueAggregateQuery\"t\n\022StatVa" +
+      "lueAggregate\022(\n\004time\030\001 \001(\0132\032.google.prot" +
+      "obuf.Timestamp\022\027\n\017aggregate_value\030\002 \001(\002\022" +
+      "\r\n\005count\030\003 \001(\004\022\014\n\004tags\030\004 \003(\t\"\221\002\n\027StatVal" +
+      "ueAggregateQuery\022\014\n\004tags\030\001 \003(\t\022\022\n\ntag_gr" +
+      "oups\030\002 \003(\t\022;\n\023stat_value_agg_type\030\003 \001(\0162" +
+      "\036.clarifai.api.StatValueAggType\0229\n\022stat_" +
+      "time_agg_type\030\004 \001(\0162\035.clarifai.api.StatT" +
+      "imeAggType\022.\n\nstart_time\030\005 \001(\0132\032.google." +
+      "protobuf.Timestamp\022,\n\010end_time\030\006 \001(\0132\032.g" +
+      "oogle.protobuf.Timestamp\"O\n\027PCAProjectio" +
+      "nComparator\022\032\n\022distance_threshold\030\001 \001(\002\022" +
+      "\030\n\020model_version_id\030\002 \001(\t\"K\n\033DuplicateAn" +
+      "notationsResults\022\026\n\016duplicate_cfid\030\001 \003(\t" +
+      "\022\024\n\014unique_count\030\002 \001(\005\"\207\001\n\nVisibility\0223\n" +
+      "\010gettable\030\001 \001(\0162!.clarifai.api.Visibilit" +
+      "y.Gettable\"D\n\010Gettable\022\026\n\022UNKNOWN_VISIBI" +
+      "LITY\020\000\022\013\n\007PRIVATE\020\n\022\007\n\003ORG\020\036\022\n\n\006PUBLIC\0202" +
+      "\"X\n\016TrendingMetric\022\017\n\007user_id\030\001 \001(\t\022\016\n\006a" +
+      "pp_id\030\002 \001(\t\022\021\n\tobject_id\030\003 \001(\t\022\022\n\nview_c" +
+      "ount\030\004 \001(\004\"#\n\007FullTag\022\014\n\004name\030\001 \001(\t\022\n\n\002i" +
+      "d\030\002 \001(\t\"f\n\013TimeSegment\022\n\n\002id\030\001 \001(\t\022 \n\004da" +
+      "ta\030\002 \001(\0132\022.clarifai.api.Data\022)\n\ttime_inf" +
+      "o\030\003 \001(\0132\026.clarifai.api.TimeInfo\"P\n\010TimeI" +
+      "nfo\022\022\n\nnum_frames\030\001 \001(\r\022\022\n\nbegin_time\030\004 " +
+      "\001(\002\022\020\n\010end_time\030\005 \001(\002J\004\010\002\020\003J\004\010\003\020\004\"!\n\013Dat" +
+      "asetStar\022\022\n\ndataset_id\030\001 \001(\t\"\037\n\nModuleSt" +
+      "ar\022\021\n\tmodule_id\030\001 \001(\t\"\302\003\n\006Module\022\n\n\002id\030\001" +
+      " \001(\t\022\023\n\013description\030\003 \001(\t\022.\n\ncreated_at\030" +
+      "\004 \001(\0132\032.google.protobuf.Timestamp\022/\n\013mod" +
+      "ified_at\030\005 \001(\0132\032.google.protobuf.Timesta" +
+      "mp\022,\n\nvisibility\030\007 \001(\0132\030.clarifai.api.Vi" +
+      "sibility\022)\n\010metadata\030\010 \001(\0132\027.google.prot" +
+      "obuf.Struct\022\017\n\007user_id\030\t \001(\t\022\016\n\006app_id\030\n" +
+      " \001(\t\0223\n\016module_version\030\013 \001(\0132\033.clarifai." +
+      "api.ModuleVersion\022\022\n\nis_starred\030\014 \001(\010\022\022\n" +
+      "\nstar_count\030\r \001(\005\0225\n\017bookmark_origin\030\016 \001" +
+      "(\0132\034.clarifai.api.BookmarkOrigin\022\"\n\005imag" +
+      "e\030\017 \001(\0132\023.clarifai.api.ImageJ\004\010\002\020\003\"\276\004\n\rM" +
+      "oduleVersion\022\n\n\002id\030\001 \001(\t\022\021\n\tmodule_id\030\002 " +
+      "\001(\t\022\016\n\006app_id\030\003 \001(\t\022\017\n\007user_id\030\004 \001(\t\022\023\n\013" +
+      "description\030\006 \001(\t\022\r\n\005notes\030\007 \001(\t\022.\n\ncrea" +
+      "ted_at\030\010 \001(\0132\032.google.protobuf.Timestamp" +
+      "\022/\n\013modified_at\030\t \001(\0132\032.google.protobuf." +
+      "Timestamp\022\026\n\016git_commit_url\030\n \001(\t\0229\n\nmod" +
+      "ule_nav\030\013 \001(\0132%.clarifai.api.ModuleVersi" +
+      "on.ModuleNav\022\020\n\010approved\030\014 \001(\010\022,\n\nvisibi" +
+      "lity\030\r \001(\0132\030.clarifai.api.Visibility\022)\n\010" +
+      "metadata\030\016 \001(\0132\027.google.protobuf.Struct\032" +
+      "E\n\014ModuleSubNav\022\r\n\005title\030\001 \001(\t\022\021\n\tquery_" +
+      "key\030\002 \001(\t\022\023\n\013query_value\030\003 \001(\t\032]\n\tModule" +
+      "Nav\022\r\n\005title\030\001 \001(\t\022A\n\017module_sub_navs\030\002 " +
+      "\003(\0132(.clarifai.api.ModuleVersion.ModuleS" +
+      "ubNavJ\004\010\005\020\006\"\255\002\n\026InstalledModuleVersion\022\n" +
+      "\n\002id\030\001 \001(\t\0223\n\016module_version\030\002 \001(\0132\033.cla" +
+      "rifai.api.ModuleVersion\022\016\n\006app_id\030\003 \001(\t\022" +
+      "\017\n\007user_id\030\004 \001(\t\022.\n\ncreated_at\030\005 \001(\0132\032.g" +
+      "oogle.protobuf.Timestamp\022/\n\013modified_at\030" +
+      "\006 \001(\0132\032.google.protobuf.Timestamp\022\022\n\ndep" +
+      "loy_url\030\007 \001(\t\022,\n\nvisibility\030\010 \001(\0132\030.clar" +
+      "ifai.api.Visibility\022\016\n\006key_id\030\t \001(\t\"\267\003\n\r" +
+      "BulkOperation\022\n\n\002id\030\001 \001(\t\022+\n\tinput_ids\030\002" +
+      " \001(\0132\026.clarifai.api.InputIDsH\000\022&\n\006search" +
+      "\030\n \001(\0132\024.clarifai.api.SearchH\000\022(\n\007datase" +
+      "t\030\013 \001(\0132\025.clarifai.api.DatasetH\000\022*\n\toper" +
+      "ation\030\003 \001(\0132\027.clarifai.api.Operation\022\016\n\006" +
+      "app_id\030\004 \001(\t\022+\n\006status\030\005 \001(\0132\033.clarifai." +
+      "api.status.Status\022(\n\010progress\030\006 \001(\0132\026.cl" +
+      "arifai.api.Progress\022\022\n\ncreated_by\030\007 \001(\t\022" +
+      ".\n\ncreated_at\030\010 \001(\0132\032.google.protobuf.Ti" +
+      "mestamp\0224\n\020last_modified_at\030\t \001(\0132\032.goog" +
+      "le.protobuf.TimestampB\016\n\014input_source\"\035\n" +
+      "\010InputIDs\022\021\n\tinput_ids\030\001 \003(\t\"8\n\010Progress" +
+      "\022\021\n\tprocessed\030\001 \001(\r\022\031\n\021last_processed_id" +
+      "\030\002 \001(\t\"\212\004\n\tOperation\0221\n\014add_concepts\030\001 \001" +
+      "(\0132\031.clarifai.api.AddConceptsH\000\0227\n\017delet" +
+      "e_concepts\030\002 \001(\0132\034.clarifai.api.DeleteCo" +
+      "nceptsH\000\0221\n\014add_metadata\030\003 \001(\0132\031.clarifa" +
+      "i.api.AddMetadataH\000\0227\n\017delete_metadata\030\004" +
+      " \001(\0132\034.clarifai.api.DeleteMetadataH\000\0223\n\r" +
+      "overwrite_geo\030\005 \001(\0132\032.clarifai.api.Overw" +
+      "riteGeoH\000\022-\n\ndelete_geo\030\006 \001(\0132\027.clarifai" +
+      ".api.DeleteGeoH\000\022>\n\023delete_from_dataset\030" +
+      "\007 \001(\0132\037.clarifai.api.DeleteFromDatasetH\000" +
+      "\0224\n\016add_to_dataset\030\010 \001(\0132\032.clarifai.api." +
+      "AddToDatasetH\000\022>\n\023split_into_datasets\030\t " +
+      "\001(\0132\037.clarifai.api.SplitIntoDatasetsH\000B\013" +
+      "\n\toperation\"6\n\013AddConcepts\022\'\n\010concepts\030\001" +
+      " \003(\0132\025.clarifai.api.Concept\"K\n\016DeleteCon" +
+      "cepts\022\'\n\010concepts\030\001 \003(\0132\025.clarifai.api.C" +
+      "oncept\022\020\n\010user_ids\030\002 \003(\t\"8\n\013AddMetadata\022" +
+      ")\n\010metadata\030\001 \001(\0132\027.google.protobuf.Stru" +
+      "ct\";\n\016DeleteMetadata\022)\n\010metadata\030\001 \001(\0132\027" +
+      ".google.protobuf.Struct\".\n\014OverwriteGeo\022" +
+      "\036\n\003geo\030\001 \001(\0132\021.clarifai.api.Geo\"\013\n\tDelet" +
+      "eGeo\"\"\n\014AddToDataset\022\022\n\ndataset_id\030\001 \001(\t" +
+      "\"\'\n\021DeleteFromDataset\022\022\n\ndataset_id\030\001 \001(" +
+      "\t\"\313\001\n\021SplitIntoDatasets\0222\n\016dataset_split" +
+      "s\030\001 \003(\0132\032.clarifai.api.DatasetSplit\022B\n\006m" +
+      "ethod\030\002 \001(\01622.clarifai.api.SplitIntoData" +
+      "sets.DatasetSplitMethod\">\n\022DatasetSplitM" +
+      "ethod\022\013\n\007NOT_SET\020\000\022\033\n\027RANDOM_PERCENTAGE_" +
+      "SPLIT\020\001\"[\n\014DatasetSplit\022&\n\007dataset\030\001 \001(\013" +
+      "2\025.clarifai.api.Dataset\022\024\n\npercentage\030\002 " +
+      "\001(\rH\000B\r\n\013method_info\"\373\002\n\014InputsAddJob\022\n\n" +
+      "\002id\030\001 \001(\t\022\025\n\rcall_back_url\030\003 \001(\t\022\017\n\007app_" +
+      "pat\030\004 \001(\t\0224\n\010progress\030\007 \001(\0132\".clarifai.a" +
+      "pi.InputsAddJobProgress\022.\n\ncreated_at\030\010 " +
+      "\001(\0132\032.google.protobuf.Timestamp\022/\n\013modif" +
+      "ied_at\030\t \001(\0132\032.google.protobuf.Timestamp" +
+      "\022:\n\017extraction_jobs\030\n \003(\0132!.clarifai.api" +
+      ".InputsExtractionJob\022%\n\007uploads\030\013 \003(\0132\024." +
+      "clarifai.api.Upload\022+\n\006status\030\014 \001(\0132\033.cl" +
+      "arifai.api.status.StatusJ\004\010\002\020\003J\004\010\005\020\006J\004\010\006" +
+      "\020\007\"u\n\024InputsAddJobProgress\022\025\n\rpending_co" +
+      "unt\030\001 \001(\004\022\031\n\021in_progress_count\030\002 \001(\004\022\025\n\r" +
+      "success_count\030\003 \001(\004\022\024\n\014failed_count\030\004 \001(" +
+      "\004\"\225\002\n\006Upload\022\n\n\002id\030\001 \001(\t\022.\n\ncreated_at\030\002" +
+      " \001(\0132\032.google.protobuf.Timestamp\022/\n\013modi" +
+      "fied_at\030\003 \001(\0132\032.google.protobuf.Timestam" +
+      "p\022.\n\nexpires_at\030\004 \001(\0132\032.google.protobuf." +
+      "Timestamp\022+\n\006status\030\005 \001(\0132\033.clarifai.api" +
+      ".status.Status\022\024\n\014content_name\030\010 \001(\t\022\026\n\016" +
+      "content_length\030\006 \001(\004\022\023\n\013content_url\030\007 \001(" +
+      "\t\"K\n\021UploadContentPart\022\023\n\013range_start\030\001 " +
+      "\001(\004\022\023\n\013part_number\030\002 \001(\003\022\014\n\004data\030\003 \001(\014\"l" +
+      "\n\031CustomCodeOperatorRequest\022#\n\006inputs\030\001 " +
+      "\003(\0132\023.clarifai.api.Input\022*\n\010metadata\030\352\007 " +
+      "\001(\0132\027.google.protobuf.Struct\"\365\002\n\023InputsE" +
+      "xtractionJob\022+\n\006status\030\001 \001(\0132\033.clarifai." +
+      "api.status.Status\022\n\n\002id\030\002 \001(\t\022\013\n\003url\030\003 \001" +
+      "(\t\022;\n\010progress\030\004 \001(\0132).clarifai.api.Inpu" +
+      "tsExtractionJobProgress\022.\n\ncreated_at\030\005 " +
+      "\001(\0132\032.google.protobuf.Timestamp\022/\n\013modif" +
+      "ied_at\030\006 \001(\0132\032.google.protobuf.Timestamp" +
+      "\022M\n\034input_id_conflict_resolution\030\007 \001(\0162\'" +
+      ".clarifai.api.InputIDConflictResolution\022" +
+      "+\n\016input_template\030\010 \001(\0132\023.clarifai.api.I" +
+      "nput\"\227\002\n\033InputsExtractionJobProgress\022\032\n\022" +
+      "audio_inputs_count\030\002 \001(\004\022\032\n\022image_inputs" +
+      "_count\030\003 \001(\004\022\032\n\022video_inputs_count\030\004 \001(\004" +
+      "\022\031\n\021text_inputs_count\030\005 \001(\004\022\036\n\026pending_a" +
+      "rchives_count\030\006 \001(\004\022\"\n\032in_progress_archi" +
+      "ves_count\030\007 \001(\004\022 \n\030completed_archives_co" +
+      "unt\030\010 \001(\004\022\035\n\025failed_archives_count\030\t \001(\004" +
+      "J\004\010\001\020\002\"\323\001\n\020InputsDataSource\022\031\n\021inputs_ad" +
+      "d_job_id\030\001 \001(\t\022(\n\003url\030\002 \001(\0132\033.clarifai.a" +
+      "pi.DataSourceURL\022M\n\034input_id_conflict_re" +
+      "solution\030\003 \001(\0162\'.clarifai.api.InputIDCon" +
+      "flictResolution\022+\n\016input_template\030\004 \001(\0132" +
+      "\023.clarifai.api.Input\"V\n\rDataSourceURL\022\013\n" +
+      "\003url\030\001 \001(\t\0228\n\013credentials\030\002 \001(\0132#.clarif" +
+      "ai.api.DataSourceCredentials\"\247\001\n\025DataSou" +
+      "rceCredentials\022*\n\010s3_creds\030\001 \001(\0132\026.clari" +
+      "fai.api.AWSCredsH\000\022\023\n\tgcp_creds\030\002 \001(\014H\000\022" +
+      "8\n\020azure_blob_creds\030\004 \001(\0132\034.clarifai.api" +
+      ".AzureBlobCredsH\000B\r\n\013credentialsJ\004\010\003\020\004\"K" +
+      "\n\010AWSCreds\022\016\n\006region\030\002 \001(\t\022\n\n\002id\030\003 \001(\t\022\016" +
+      "\n\006secret\030\004 \001(\t\022\r\n\005token\030\005 \001(\tJ\004\010\001\020\002\";\n\016A" +
+      "zureBlobCreds\022\024\n\014account_name\030\001 \001(\t\022\023\n\013a" +
+      "ccount_key\030\002 \001(\t\"\334\001\n\014InputsUpload\022\031\n\021inp" +
+      "uts_add_job_id\030\001 \001(\t\022\017\n\007app_pat\030\002 \001(\t\022$\n" +
+      "\006upload\030\003 \001(\0132\024.clarifai.api.Upload\022M\n\034i" +
+      "nput_id_conflict_resolution\030\004 \001(\0162\'.clar" +
+      "ifai.api.InputIDConflictResolution\022+\n\016in" +
+      "put_template\030\005 \001(\0132\023.clarifai.api.Input\"" +
+      "\316\001\n\016BookmarkOrigin\022\n\n\002id\030\001 \001(\t\022\016\n\006app_id" +
+      "\030\002 \001(\t\022\017\n\007user_id\030\003 \001(\t\022@\n\rresource_type" +
+      "\030\004 \001(\0162).clarifai.api.BookmarkOrigin.Boo" +
+      "kmarkType\"M\n\014BookmarkType\022\013\n\007unknown\020\000\022\t" +
+      "\n\005model\020\001\022\014\n\010workflow\020\002\022\013\n\007dataset\020\003\022\n\n\006" +
+      "module\020\004\"\333\002\n\006Runner\022\n\n\002id\030\001 \001(\t\022\023\n\013descr" +
+      "iption\030\002 \001(\t\022.\n\ncreated_at\030\003 \001(\0132\032.googl" +
+      "e.protobuf.Timestamp\022/\n\013modified_at\030\004 \001(" +
+      "\0132\032.google.protobuf.Timestamp\022)\n\010metadat" +
+      "a\030\005 \001(\0132\027.google.protobuf.Struct\022\017\n\007user" +
+      "_id\030\006 \001(\t\022\022\n\006labels\030\007 \003(\tB\002\030\001\022$\n\006worker\030" +
+      "\010 \001(\0132\024.clarifai.api.Worker\022(\n\010nodepool\030" +
+      "\t \001(\0132\026.clarifai.api.Nodepool\022/\n\014compute" +
+      "_info\030\n \001(\0132\031.clarifai.api.ComputeInfo\"\313" +
+      "\003\n\010Nodepool\022\n\n\002id\030\001 \001(\t\022\023\n\013description\030\002" +
       " \001(\t\022.\n\ncreated_at\030\003 \001(\0132\032.google.protob" +
       "uf.Timestamp\022/\n\013modified_at\030\004 \001(\0132\032.goog" +
-      "le.protobuf.Timestamp\022,\n\nvisibility\030\005 \001(" +
-      "\0132\030.clarifai.api.Visibility\022)\n\005nodes\030\006 \003" +
-      "(\0132\032.clarifai.api.WorkflowNode\022)\n\010metada" +
-      "ta\030\007 \001(\0132\027.google.protobuf.Struct\022\016\n\006app" +
-      "_id\030\010 \001(\t\022\017\n\007user_id\030\t \001(\t\022\023\n\013descriptio" +
-      "n\030\n \001(\t\022\017\n\007license\030\013 \001(\t\"\275\001\n\014WorkflowNod" +
-      "e\022\n\n\002id\030\001 \001(\t\022\"\n\005model\030\002 \001(\0132\023.clarifai." +
-      "api.Model\022,\n\013node_inputs\030\003 \003(\0132\027.clarifa" +
-      "i.api.NodeInput\022\027\n\017suppress_output\030\004 \001(\010" +
-      "\0226\n\024output_info_override\030\005 \001(\0132\030.clarifa" +
-      "i.api.OutputInfo\"\034\n\tNodeInput\022\017\n\007node_id" +
-      "\030\001 \001(\t\"\205\002\n\016WorkflowResult\022\n\n\002id\030\001 \001(\t\022+\n" +
-      "\006status\030\002 \001(\0132\033.clarifai.api.status.Stat" +
-      "us\022.\n\ncreated_at\030\003 \001(\0132\032.google.protobuf" +
-      ".Timestamp\022&\n\005model\030\004 \001(\0132\023.clarifai.api" +
-      ".ModelB\002\030\001\022\"\n\005input\030\005 \001(\0132\023.clarifai.api" +
-      ".Input\022%\n\007outputs\030\006 \003(\0132\024.clarifai.api.O" +
-      "utput\022\027\n\017suppress_output\030\007 \001(\010\"\033\n\rWorkfl" +
-      "owState\022\n\n\002id\030\001 \001(\t\"\220\003\n\016AppDuplication\022\n" +
-      "\n\002id\030\001 \001(\t\022*\n\017destination_app\030\n \001(\0132\021.cl" +
-      "arifai.api.App\022\033\n\017existing_app_id\030\010 \001(\tB" +
-      "\002\030\001\022\026\n\nnew_app_id\030\002 \001(\tB\002\030\001\022\030\n\014new_app_n" +
-      "ame\030\003 \001(\tB\002\030\001\022+\n\006status\030\004 \001(\0132\033.clarifai" +
-      ".api.status.Status\022.\n\ncreated_at\030\005 \001(\0132\032" +
-      ".google.protobuf.Timestamp\0224\n\020last_modif" +
-      "ied_at\030\006 \001(\0132\032.google.protobuf.Timestamp" +
-      "\0223\n\006filter\030\007 \001(\0132#.clarifai.api.AppDupli" +
-      "cationFilters\022/\n\010progress\030\t \003(\0132\035.clarif" +
-      "ai.api.AppCopyProgress\"5\n\017AppCopyProgres" +
-      "s\022\r\n\005field\030\001 \001(\t\022\023\n\005value\030\002 \001(\005B\004\200\265\030\001\"\262\001" +
-      "\n\025AppDuplicationFilters\022\023\n\013copy_inputs\030\001" +
-      " \001(\010\022\025\n\rcopy_concepts\030\002 \001(\010\022\030\n\020copy_anno" +
-      "tations\030\003 \001(\010\022\023\n\013copy_models\030\004 \001(\010\022\026\n\016co" +
-      "py_workflows\030\005 \001(\010\022&\n\036copy_installed_mod" +
-      "ule_versions\030\006 \001(\010\"\372\002\n\nLabelOrder\022\n\n\002id\030" +
-      "\001 \001(\t\022\014\n\004name\030\002 \001(\t\022+\n\006status\030\003 \001(\0132\033.cl" +
-      "arifai.api.status.Status\022\024\n\014auto_release" +
-      "\030\004 \001(\010\022\027\n\017allow_empty_tag\030\005 \001(\010\0228\n\024desir" +
-      "ed_fulfill_time\030\006 \001(\0132\032.google.protobuf." +
-      "Timestamp\0229\n\025estimate_fulfill_time\030\007 \001(\013" +
-      "2\032.google.protobuf.Timestamp\022 \n\004task\030\010 \001" +
-      "(\0132\022.clarifai.api.Task\022.\n\ncreated_at\030\t \001" +
-      "(\0132\032.google.protobuf.Timestamp\022/\n\013modifi" +
-      "ed_at\030\n \001(\0132\032.google.protobuf.Timestamp\"" +
-      "\347\006\n\004Task\022\n\n\002id\030\001 \001(\t\022.\n\ncreated_at\030\002 \001(\013" +
-      "2\032.google.protobuf.Timestamp\022/\n\013modified" +
-      "_at\030\003 \001(\0132\032.google.protobuf.Timestamp\022)\n" +
-      "\004type\030\004 \001(\0162\033.clarifai.api.Task.TaskType" +
-      "\022\023\n\013description\030\005 \001(\t\022(\n\006worker\030\006 \001(\0132\030." +
-      "clarifai.api.TaskWorker\022\027\n\013concept_ids\030\007" +
-      " \003(\tB\002\030\001\0223\n\014input_source\030\010 \001(\0132\035.clarifa" +
-      "i.api.TaskInputSource\022\021\n\tsample_ms\030\t \001(\r" +
-      "\0223\n\014ai_assistant\030\n \001(\0132\035.clarifai.api.Ta" +
-      "skAIAssistant\022(\n\006review\030\013 \001(\0132\030.clarifai" +
-      ".api.TaskReview\022+\n\006status\030\014 \001(\0132\033.clarif" +
-      "ai.api.status.Status\022\014\n\004name\030\r \001(\t\022:\n\020ai" +
-      "_assist_params\030\016 \001(\0132 .clarifai.api.AiAs" +
-      "sistParameters\022,\n\nvisibility\030\017 \001(\0132\030.cla" +
-      "rifai.api.Visibility\022\016\n\006app_id\030\020 \001(\t\022\017\n\007" +
-      "user_id\030\021 \001(\t\022\026\n\016label_order_id\030\022 \001(\t\022+\n" +
-      "\010concepts\030\023 \003(\0132\031.clarifai.api.TaskConce" +
-      "pt\022#\n\033delete_previous_annotations\030\024 \001(\010\022" +
-      "*\n\007metrics\030\025 \001(\0132\031.clarifai.api.TaskMetr" +
-      "ics\"l\n\010TaskType\022\020\n\014TYPE_NOT_SET\020\000\022\033\n\027CON" +
-      "CEPTS_CLASSIFICATION\020\001\022\032\n\026BOUNDING_BOX_D" +
-      "ETECTION\020\002\022\025\n\021POLYGON_DETECTION\020\003\"`\n\022AiA" +
-      "ssistParameters\022\025\n\rmin_threshold\030\001 \001(\002\022\025" +
-      "\n\rmax_threshold\030\002 \001(\002\022\034\n\024concept_relatio" +
-      "n_ids\030\003 \003(\t\"\366\002\n\nTaskWorker\022=\n\010strategy\030\001" +
-      " \001(\0162+.clarifai.api.TaskWorker.TaskWorke" +
-      "rStrategy\022\024\n\010user_ids\030\002 \003(\tB\002\030\001\022%\n\005users" +
-      "\030\004 \003(\0132\022.clarifai.api.UserB\002\030\001\022T\n\031partit" +
-      "ioned_strategy_info\030\003 \001(\0132/.clarifai.api" +
-      ".TaskWorkerPartitionedStrategyInfoH\000\022%\n\007" +
-      "workers\030\007 \003(\0132\024.clarifai.api.Worker\"R\n\022T" +
-      "askWorkerStrategy\022\033\n\027WORKER_STRATEGY_NOT" +
-      "_SET\020\000\022\017\n\013PARTITIONED\020\002\022\010\n\004FULL\020\003\"\004\010\001\020\001B" +
-      "\017\n\rstrategy_infoJ\004\010\005\020\006J\004\010\006\020\007\"\251\002\n!TaskWor" +
-      "kerPartitionedStrategyInfo\022[\n\004type\030\001 \001(\016" +
-      "2M.clarifai.api.TaskWorkerPartitionedStr" +
-      "ategyInfo.TaskWorkerPartitionedStrategy\022" +
-      "\031\n\021workers_per_input\030\002 \001(\005\022(\n\007weights\030\003 " +
-      "\001(\0132\027.google.protobuf.Struct\"b\n\035TaskWork" +
-      "erPartitionedStrategy\022\'\n#PARTITIONED_WOR" +
-      "KER_STRATEGY_NOT_SET\020\000\022\n\n\006EVENLY\020\001\022\014\n\010WE" +
-      "IGHTED\020\002\"\303\001\n\017TaskInputSource\022?\n\004type\030\001 \001" +
-      "(\01621.clarifai.api.TaskInputSource.TaskIn" +
-      "putSourceType\022\n\n\002id\030\002 \001(\t\"c\n\023TaskInputSo" +
-      "urceType\022\035\n\031INPUT_SOURCE_TYPE_NOT_SET\020\000\022" +
-      "\016\n\nALL_INPUTS\020\001\022\020\n\014SAVED_SEARCH\020\002\022\013\n\007DAT" +
-      "ASET\020\003\"\220\003\n\nTaskReview\022=\n\010strategy\030\001 \001(\0162" +
-      "+.clarifai.api.TaskReview.TaskReviewStra" +
-      "tegy\022\024\n\010user_ids\030\002 \003(\tB\002\030\001\022!\n\005users\030\005 \003(" +
-      "\0132\022.clarifai.api.User\022J\n\024manual_strategy" +
-      "_info\030\003 \001(\0132*.clarifai.api.TaskReviewMan" +
-      "ualStrategyInfoH\000\022P\n\027consensus_strategy_" +
-      "info\030\004 \001(\0132-.clarifai.api.TaskReviewCons" +
-      "ensusStrategyInfoH\000\"[\n\022TaskReviewStrateg" +
-      "y\022 \n\034TASK_REVIEW_STRATEGY_NOT_SET\020\000\022\010\n\004N" +
-      "ONE\020\001\022\n\n\006MANUAL\020\002\022\r\n\tCONSENSUS\020\003B\017\n\rstra" +
-      "tegy_info\"9\n\034TaskReviewManualStrategyInf" +
-      "o\022\031\n\021sample_percentage\030\001 \001(\002\"C\n\037TaskRevi" +
-      "ewConsensusStrategyInfo\022\032\n\022approval_thre" +
-      "shold\030\002 \001(\rJ\004\010\001\020\002\"&\n\017TaskAIAssistant\022\023\n\013" +
-      "workflow_id\030\001 \001(\t\"\364\001\n\016TaskAssignment\022\n\n\002" +
-      "id\030\001 \001(\t\022.\n\ncreated_at\030\002 \001(\0132\032.google.pr" +
-      "otobuf.Timestamp\022/\n\013modified_at\030\003 \001(\0132\032." +
-      "google.protobuf.Timestamp\022$\n\006worker\030\004 \001(" +
-      "\0132\024.clarifai.api.Worker\022\"\n\005input\030\005 \001(\0132\023" +
-      ".clarifai.api.Input\022+\n\006status\030\006 \001(\0132\033.cl" +
-      "arifai.api.status.Status\"\346\001\n\026TaskStatusC" +
-      "ountPerUser\022\023\n\007user_id\030\001 \001(\tB\002\030\001\022\025\n\007pend" +
-      "ing\030\002 \001(\rB\004\200\265\030\001\022\035\n\017awaiting_review\030\003 \001(\r" +
-      "B\004\200\265\030\001\022\025\n\007success\030\004 \001(\rB\004\200\265\030\001\022\033\n\rreview_" +
-      "denied\030\005 \001(\rB\004\200\265\030\001\022\'\n\031awaiting_consensus" +
-      "_review\030\006 \001(\rB\004\200\265\030\001\022$\n\006worker\030\007 \001(\0132\024.cl" +
-      "arifai.api.Worker\"f\n\016ThresholdRange\022\032\n\022i" +
-      "s_lower_inclusive\030\001 \001(\010\022\032\n\022is_upper_incl" +
-      "usive\030\002 \001(\010\022\r\n\005lower\030\003 \001(\002\022\r\n\005upper\030\004 \001(" +
-      "\002\"\255\001\n\037TaskConceptAutoAnnotationConfig\022\035\n" +
-      "\025annotation_data_types\030\001 \001(\r\0225\n\017threshol" +
-      "d_range\030\002 \001(\0132\034.clarifai.api.ThresholdRa" +
-      "nge\0224\n\013status_code\030\003 \001(\0162\037.clarifai.api." +
-      "status.StatusCode\"\204\001\n\013TaskConcept\022&\n\007con" +
-      "cept\030\001 \001(\0132\025.clarifai.api.Concept\022M\n\026aut" +
-      "o_annotation_config\030\002 \001(\0132-.clarifai.api" +
-      ".TaskConceptAutoAnnotationConfig\"@\n\013Task" +
-      "Metrics\022+\n\004work\030\002 \001(\0132\035.clarifai.api.Tas" +
-      "kWorkMetricsJ\004\010\001\020\002\"S\n\017TaskWorkMetrics\022\036\n" +
-      "\026inputs_count_estimated\030\001 \001(\004\022 \n\030inputs_" +
-      "percent_estimated\030\002 \001(\r\"\273\002\n\tCollector\022\n\n" +
-      "\002id\030\001 \001(\t\022\023\n\013description\030\002 \001(\t\022.\n\ncreate" +
-      "d_at\030\003 \001(\0132\032.google.protobuf.Timestamp\022\035" +
-      "\n\025pre_queue_workflow_id\030\004 \001(\t\022\037\n\027pre_que" +
-      "ue_random_sample\030\010 \001(\002\022\036\n\026post_queue_wor" +
-      "kflow_id\030\005 \001(\t\0227\n\020collector_source\030\006 \001(\013" +
-      "2\035.clarifai.api.CollectorSource\022+\n\006statu" +
-      "s\030\007 \001(\0132\033.clarifai.api.status.Status\022\027\n\017" +
-      "collect_outputs\030\t \001(\010\"t\n\017CollectorSource" +
-      "\022a\n\'api_post_model_outputs_collector_sou" +
-      "rce\030\002 \001(\01320.clarifai.api.APIPostModelOut" +
-      "putsCollectorSource\"\261\001\n\"APIPostModelOutp" +
-      "utsCollectorSource\022\025\n\rmodel_user_id\030\001 \001(" +
-      "\t\022\024\n\014model_app_id\030\002 \001(\t\022\020\n\010model_id\030\003 \001(" +
-      "\t\022\030\n\020model_version_id\030\004 \001(\t\022\032\n\022post_inpu" +
-      "ts_key_id\030\005 \001(\t\022\026\n\016caller_user_id\030\006 \001(\t\"" +
-      "R\n\tStatValue\022(\n\004time\030\001 \001(\0132\032.google.prot" +
-      "obuf.Timestamp\022\r\n\005value\030\002 \001(\002\022\014\n\004tags\030\003 " +
-      "\003(\t\"\246\001\n\030StatValueAggregateResult\022?\n\025stat" +
-      "_value_aggregates\030\001 \003(\0132 .clarifai.api.S" +
-      "tatValueAggregate\022I\n\032stat_value_aggregat" +
-      "e_query\030\002 \001(\0132%.clarifai.api.StatValueAg" +
-      "gregateQuery\"t\n\022StatValueAggregate\022(\n\004ti" +
-      "me\030\001 \001(\0132\032.google.protobuf.Timestamp\022\027\n\017",
-      "aggregate_value\030\002 \001(\002\022\r\n\005count\030\003 \001(\004\022\014\n\004" +
-      "tags\030\004 \003(\t\"\221\002\n\027StatValueAggregateQuery\022\014" +
-      "\n\004tags\030\001 \003(\t\022\022\n\ntag_groups\030\002 \003(\t\022;\n\023stat" +
-      "_value_agg_type\030\003 \001(\0162\036.clarifai.api.Sta" +
-      "tValueAggType\0229\n\022stat_time_agg_type\030\004 \001(" +
-      "\0162\035.clarifai.api.StatTimeAggType\022.\n\nstar" +
-      "t_time\030\005 \001(\0132\032.google.protobuf.Timestamp" +
-      "\022,\n\010end_time\030\006 \001(\0132\032.google.protobuf.Tim" +
-      "estamp\"O\n\027PCAProjectionComparator\022\032\n\022dis" +
-      "tance_threshold\030\001 \001(\002\022\030\n\020model_version_i" +
-      "d\030\002 \001(\t\"K\n\033DuplicateAnnotationsResults\022\026" +
-      "\n\016duplicate_cfid\030\001 \003(\t\022\024\n\014unique_count\030\002" +
-      " \001(\005\"\207\001\n\nVisibility\0223\n\010gettable\030\001 \001(\0162!." +
-      "clarifai.api.Visibility.Gettable\"D\n\010Gett" +
-      "able\022\026\n\022UNKNOWN_VISIBILITY\020\000\022\013\n\007PRIVATE\020" +
-      "\n\022\007\n\003ORG\020\036\022\n\n\006PUBLIC\0202\"X\n\016TrendingMetric" +
-      "\022\017\n\007user_id\030\001 \001(\t\022\016\n\006app_id\030\002 \001(\t\022\021\n\tobj" +
-      "ect_id\030\003 \001(\t\022\022\n\nview_count\030\004 \001(\004\"#\n\007Full" +
-      "Tag\022\014\n\004name\030\001 \001(\t\022\n\n\002id\030\002 \001(\t\"f\n\013TimeSeg" +
-      "ment\022\n\n\002id\030\001 \001(\t\022 \n\004data\030\002 \001(\0132\022.clarifa" +
-      "i.api.Data\022)\n\ttime_info\030\003 \001(\0132\026.clarifai" +
-      ".api.TimeInfo\"P\n\010TimeInfo\022\022\n\nnum_frames\030" +
-      "\001 \001(\r\022\022\n\nbegin_time\030\004 \001(\002\022\020\n\010end_time\030\005 " +
-      "\001(\002J\004\010\002\020\003J\004\010\003\020\004\"!\n\013DatasetStar\022\022\n\ndatase" +
-      "t_id\030\001 \001(\t\"\037\n\nModuleStar\022\021\n\tmodule_id\030\001 " +
-      "\001(\t\"\302\003\n\006Module\022\n\n\002id\030\001 \001(\t\022\023\n\013descriptio" +
-      "n\030\003 \001(\t\022.\n\ncreated_at\030\004 \001(\0132\032.google.pro" +
-      "tobuf.Timestamp\022/\n\013modified_at\030\005 \001(\0132\032.g" +
-      "oogle.protobuf.Timestamp\022,\n\nvisibility\030\007" +
-      " \001(\0132\030.clarifai.api.Visibility\022)\n\010metada" +
-      "ta\030\010 \001(\0132\027.google.protobuf.Struct\022\017\n\007use" +
-      "r_id\030\t \001(\t\022\016\n\006app_id\030\n \001(\t\0223\n\016module_ver" +
-      "sion\030\013 \001(\0132\033.clarifai.api.ModuleVersion\022" +
-      "\022\n\nis_starred\030\014 \001(\010\022\022\n\nstar_count\030\r \001(\005\022" +
-      "5\n\017bookmark_origin\030\016 \001(\0132\034.clarifai.api." +
-      "BookmarkOrigin\022\"\n\005image\030\017 \001(\0132\023.clarifai" +
-      ".api.ImageJ\004\010\002\020\003\"\276\004\n\rModuleVersion\022\n\n\002id" +
-      "\030\001 \001(\t\022\021\n\tmodule_id\030\002 \001(\t\022\016\n\006app_id\030\003 \001(" +
-      "\t\022\017\n\007user_id\030\004 \001(\t\022\023\n\013description\030\006 \001(\t\022" +
-      "\r\n\005notes\030\007 \001(\t\022.\n\ncreated_at\030\010 \001(\0132\032.goo" +
-      "gle.protobuf.Timestamp\022/\n\013modified_at\030\t " +
-      "\001(\0132\032.google.protobuf.Timestamp\022\026\n\016git_c" +
-      "ommit_url\030\n \001(\t\0229\n\nmodule_nav\030\013 \001(\0132%.cl" +
-      "arifai.api.ModuleVersion.ModuleNav\022\020\n\010ap" +
-      "proved\030\014 \001(\010\022,\n\nvisibility\030\r \001(\0132\030.clari" +
-      "fai.api.Visibility\022)\n\010metadata\030\016 \001(\0132\027.g" +
-      "oogle.protobuf.Struct\032E\n\014ModuleSubNav\022\r\n" +
-      "\005title\030\001 \001(\t\022\021\n\tquery_key\030\002 \001(\t\022\023\n\013query" +
-      "_value\030\003 \001(\t\032]\n\tModuleNav\022\r\n\005title\030\001 \001(\t" +
-      "\022A\n\017module_sub_navs\030\002 \003(\0132(.clarifai.api" +
-      ".ModuleVersion.ModuleSubNavJ\004\010\005\020\006\"\255\002\n\026In" +
-      "stalledModuleVersion\022\n\n\002id\030\001 \001(\t\0223\n\016modu" +
-      "le_version\030\002 \001(\0132\033.clarifai.api.ModuleVe" +
-      "rsion\022\016\n\006app_id\030\003 \001(\t\022\017\n\007user_id\030\004 \001(\t\022." +
-      "\n\ncreated_at\030\005 \001(\0132\032.google.protobuf.Tim" +
-      "estamp\022/\n\013modified_at\030\006 \001(\0132\032.google.pro" +
-      "tobuf.Timestamp\022\022\n\ndeploy_url\030\007 \001(\t\022,\n\nv" +
-      "isibility\030\010 \001(\0132\030.clarifai.api.Visibilit" +
-      "y\022\016\n\006key_id\030\t \001(\t\"\267\003\n\rBulkOperation\022\n\n\002i" +
-      "d\030\001 \001(\t\022+\n\tinput_ids\030\002 \001(\0132\026.clarifai.ap" +
-      "i.InputIDsH\000\022&\n\006search\030\n \001(\0132\024.clarifai." +
-      "api.SearchH\000\022(\n\007dataset\030\013 \001(\0132\025.clarifai" +
-      ".api.DatasetH\000\022*\n\toperation\030\003 \001(\0132\027.clar" +
-      "ifai.api.Operation\022\016\n\006app_id\030\004 \001(\t\022+\n\006st" +
-      "atus\030\005 \001(\0132\033.clarifai.api.status.Status\022" +
-      "(\n\010progress\030\006 \001(\0132\026.clarifai.api.Progres" +
-      "s\022\022\n\ncreated_by\030\007 \001(\t\022.\n\ncreated_at\030\010 \001(" +
-      "\0132\032.google.protobuf.Timestamp\0224\n\020last_mo" +
-      "dified_at\030\t \001(\0132\032.google.protobuf.Timest" +
-      "ampB\016\n\014input_source\"\035\n\010InputIDs\022\021\n\tinput" +
-      "_ids\030\001 \003(\t\"8\n\010Progress\022\021\n\tprocessed\030\001 \001(" +
-      "\r\022\031\n\021last_processed_id\030\002 \001(\t\"\212\004\n\tOperati" +
-      "on\0221\n\014add_concepts\030\001 \001(\0132\031.clarifai.api." +
-      "AddConceptsH\000\0227\n\017delete_concepts\030\002 \001(\0132\034" +
-      ".clarifai.api.DeleteConceptsH\000\0221\n\014add_me" +
-      "tadata\030\003 \001(\0132\031.clarifai.api.AddMetadataH" +
-      "\000\0227\n\017delete_metadata\030\004 \001(\0132\034.clarifai.ap" +
-      "i.DeleteMetadataH\000\0223\n\roverwrite_geo\030\005 \001(" +
-      "\0132\032.clarifai.api.OverwriteGeoH\000\022-\n\ndelet" +
-      "e_geo\030\006 \001(\0132\027.clarifai.api.DeleteGeoH\000\022>" +
-      "\n\023delete_from_dataset\030\007 \001(\0132\037.clarifai.a" +
-      "pi.DeleteFromDatasetH\000\0224\n\016add_to_dataset" +
-      "\030\010 \001(\0132\032.clarifai.api.AddToDatasetH\000\022>\n\023" +
-      "split_into_datasets\030\t \001(\0132\037.clarifai.api" +
-      ".SplitIntoDatasetsH\000B\013\n\toperation\"6\n\013Add" +
-      "Concepts\022\'\n\010concepts\030\001 \003(\0132\025.clarifai.ap" +
-      "i.Concept\"K\n\016DeleteConcepts\022\'\n\010concepts\030" +
-      "\001 \003(\0132\025.clarifai.api.Concept\022\020\n\010user_ids" +
-      "\030\002 \003(\t\"8\n\013AddMetadata\022)\n\010metadata\030\001 \001(\0132" +
-      "\027.google.protobuf.Struct\";\n\016DeleteMetada" +
-      "ta\022)\n\010metadata\030\001 \001(\0132\027.google.protobuf.S" +
-      "truct\".\n\014OverwriteGeo\022\036\n\003geo\030\001 \001(\0132\021.cla" +
-      "rifai.api.Geo\"\013\n\tDeleteGeo\"\"\n\014AddToDatas" +
-      "et\022\022\n\ndataset_id\030\001 \001(\t\"\'\n\021DeleteFromData" +
-      "set\022\022\n\ndataset_id\030\001 \001(\t\"\313\001\n\021SplitIntoDat" +
-      "asets\0222\n\016dataset_splits\030\001 \003(\0132\032.clarifai" +
-      ".api.DatasetSplit\022B\n\006method\030\002 \001(\01622.clar" +
-      "ifai.api.SplitIntoDatasets.DatasetSplitM" +
-      "ethod\">\n\022DatasetSplitMethod\022\013\n\007NOT_SET\020\000" +
-      "\022\033\n\027RANDOM_PERCENTAGE_SPLIT\020\001\"[\n\014Dataset" +
-      "Split\022&\n\007dataset\030\001 \001(\0132\025.clarifai.api.Da" +
-      "taset\022\024\n\npercentage\030\002 \001(\rH\000B\r\n\013method_in" +
-      "fo\"\373\002\n\014InputsAddJob\022\n\n\002id\030\001 \001(\t\022\025\n\rcall_" +
-      "back_url\030\003 \001(\t\022\017\n\007app_pat\030\004 \001(\t\0224\n\010progr" +
-      "ess\030\007 \001(\0132\".clarifai.api.InputsAddJobPro" +
-      "gress\022.\n\ncreated_at\030\010 \001(\0132\032.google.proto" +
-      "buf.Timestamp\022/\n\013modified_at\030\t \001(\0132\032.goo" +
-      "gle.protobuf.Timestamp\022:\n\017extraction_job" +
-      "s\030\n \003(\0132!.clarifai.api.InputsExtractionJ" +
-      "ob\022%\n\007uploads\030\013 \003(\0132\024.clarifai.api.Uploa" +
-      "d\022+\n\006status\030\014 \001(\0132\033.clarifai.api.status." +
-      "StatusJ\004\010\002\020\003J\004\010\005\020\006J\004\010\006\020\007\"u\n\024InputsAddJob" +
-      "Progress\022\025\n\rpending_count\030\001 \001(\004\022\031\n\021in_pr" +
-      "ogress_count\030\002 \001(\004\022\025\n\rsuccess_count\030\003 \001(" +
-      "\004\022\024\n\014failed_count\030\004 \001(\004\"\225\002\n\006Upload\022\n\n\002id" +
-      "\030\001 \001(\t\022.\n\ncreated_at\030\002 \001(\0132\032.google.prot" +
-      "obuf.Timestamp\022/\n\013modified_at\030\003 \001(\0132\032.go" +
-      "ogle.protobuf.Timestamp\022.\n\nexpires_at\030\004 " +
-      "\001(\0132\032.google.protobuf.Timestamp\022+\n\006statu" +
-      "s\030\005 \001(\0132\033.clarifai.api.status.Status\022\024\n\014" +
-      "content_name\030\010 \001(\t\022\026\n\016content_length\030\006 \001" +
-      "(\004\022\023\n\013content_url\030\007 \001(\t\"K\n\021UploadContent" +
-      "Part\022\023\n\013range_start\030\001 \001(\004\022\023\n\013part_number" +
-      "\030\002 \001(\003\022\014\n\004data\030\003 \001(\014\"l\n\031CustomCodeOperat" +
-      "orRequest\022#\n\006inputs\030\001 \003(\0132\023.clarifai.api" +
-      ".Input\022*\n\010metadata\030\352\007 \001(\0132\027.google.proto" +
-      "buf.Struct\"\365\002\n\023InputsExtractionJob\022+\n\006st" +
-      "atus\030\001 \001(\0132\033.clarifai.api.status.Status\022" +
-      "\n\n\002id\030\002 \001(\t\022\013\n\003url\030\003 \001(\t\022;\n\010progress\030\004 \001" +
-      "(\0132).clarifai.api.InputsExtractionJobPro" +
-      "gress\022.\n\ncreated_at\030\005 \001(\0132\032.google.proto" +
-      "buf.Timestamp\022/\n\013modified_at\030\006 \001(\0132\032.goo" +
-      "gle.protobuf.Timestamp\022M\n\034input_id_confl" +
-      "ict_resolution\030\007 \001(\0162\'.clarifai.api.Inpu" +
-      "tIDConflictResolution\022+\n\016input_template\030" +
-      "\010 \001(\0132\023.clarifai.api.Input\"\227\002\n\033InputsExt" +
-      "ractionJobProgress\022\032\n\022audio_inputs_count" +
-      "\030\002 \001(\004\022\032\n\022image_inputs_count\030\003 \001(\004\022\032\n\022vi" +
-      "deo_inputs_count\030\004 \001(\004\022\031\n\021text_inputs_co" +
-      "unt\030\005 \001(\004\022\036\n\026pending_archives_count\030\006 \001(" +
-      "\004\022\"\n\032in_progress_archives_count\030\007 \001(\004\022 \n" +
-      "\030completed_archives_count\030\010 \001(\004\022\035\n\025faile" +
-      "d_archives_count\030\t \001(\004J\004\010\001\020\002\"\323\001\n\020InputsD" +
-      "ataSource\022\031\n\021inputs_add_job_id\030\001 \001(\t\022(\n\003" +
-      "url\030\002 \001(\0132\033.clarifai.api.DataSourceURL\022M" +
-      "\n\034input_id_conflict_resolution\030\003 \001(\0162\'.c" +
-      "larifai.api.InputIDConflictResolution\022+\n" +
-      "\016input_template\030\004 \001(\0132\023.clarifai.api.Inp" +
-      "ut\"V\n\rDataSourceURL\022\013\n\003url\030\001 \001(\t\0228\n\013cred" +
-      "entials\030\002 \001(\0132#.clarifai.api.DataSourceC" +
-      "redentials\"\247\001\n\025DataSourceCredentials\022*\n\010" +
-      "s3_creds\030\001 \001(\0132\026.clarifai.api.AWSCredsH\000" +
-      "\022\023\n\tgcp_creds\030\002 \001(\014H\000\0228\n\020azure_blob_cred" +
-      "s\030\004 \001(\0132\034.clarifai.api.AzureBlobCredsH\000B" +
-      "\r\n\013credentialsJ\004\010\003\020\004\"K\n\010AWSCreds\022\016\n\006regi" +
-      "on\030\002 \001(\t\022\n\n\002id\030\003 \001(\t\022\016\n\006secret\030\004 \001(\t\022\r\n\005" +
-      "token\030\005 \001(\tJ\004\010\001\020\002\";\n\016AzureBlobCreds\022\024\n\014a" +
-      "ccount_name\030\001 \001(\t\022\023\n\013account_key\030\002 \001(\t\"\334" +
-      "\001\n\014InputsUpload\022\031\n\021inputs_add_job_id\030\001 \001" +
-      "(\t\022\017\n\007app_pat\030\002 \001(\t\022$\n\006upload\030\003 \001(\0132\024.cl" +
-      "arifai.api.Upload\022M\n\034input_id_conflict_r" +
-      "esolution\030\004 \001(\0162\'.clarifai.api.InputIDCo" +
-      "nflictResolution\022+\n\016input_template\030\005 \001(\013" +
-      "2\023.clarifai.api.Input\"\316\001\n\016BookmarkOrigin" +
-      "\022\n\n\002id\030\001 \001(\t\022\016\n\006app_id\030\002 \001(\t\022\017\n\007user_id\030" +
-      "\003 \001(\t\022@\n\rresource_type\030\004 \001(\0162).clarifai." +
-      "api.BookmarkOrigin.BookmarkType\"M\n\014Bookm" +
-      "arkType\022\013\n\007unknown\020\000\022\t\n\005model\020\001\022\014\n\010workf" +
-      "low\020\002\022\013\n\007dataset\020\003\022\n\n\006module\020\004\"\221\003\n\006Runne" +
-      "r\022\n\n\002id\030\001 \001(\t\022\023\n\013description\030\002 \001(\t\022.\n\ncr" +
-      "eated_at\030\003 \001(\0132\032.google.protobuf.Timesta" +
-      "mp\022/\n\013modified_at\030\004 \001(\0132\032.google.protobu" +
-      "f.Timestamp\022)\n\010metadata\030\005 \001(\0132\027.google.p" +
-      "rotobuf.Struct\022\017\n\007user_id\030\006 \001(\t\022\022\n\006label" +
-      "s\030\007 \003(\tB\002\030\001\022$\n\005model\030\t \001(\0132\023.clarifai.ap" +
-      "i.ModelH\000\022*\n\010workflow\030\n \001(\0132\026.clarifai.a" +
-      "pi.WorkflowH\000\022(\n\010nodepool\030\014 \001(\0132\026.clarif" +
-      "ai.api.Nodepool\022/\n\014compute_info\030\r \001(\0132\031." +
-      "clarifai.api.ComputeInfoB\010\n\006object\"\247\002\n\010N" +
-      "odepool\022\n\n\002id\030\001 \001(\t\022\017\n\007user_id\030\002 \001(\t\022/\n\014" +
-      "cloud_region\030\003 \001(\0132\031.clarifai.api.CloudR" +
-      "egion\022;\n\016capacity_types\030\004 \003(\0162#.clarifai" +
-      ".api.Nodepool.CapacityType\022\026\n\016instance_t" +
-      "ypes\030\010 \003(\t\022\025\n\rmin_instances\030\t \001(\r\022\025\n\rmax" +
-      "_instances\030\n \001(\r\"J\n\014CapacityType\022\030\n\024UKNO" +
-      "WN_CAPACITY_TYPE\020\000\022\021\n\rONDEMAND_TYPE\020\001\022\r\n" +
-      "\tSPOT_TYPE\020\002\"\256\001\n\013CloudRegion\022\n\n\002id\030\001 \001(\t" +
-      "\022.\n\005cloud\030\003 \001(\0162\037.clarifai.api.CloudRegi" +
-      "on.Cloud\022\016\n\006region\030\004 \001(\t\"S\n\005Cloud\022\020\n\014UNK" +
-      "OWN_CLOUD\020\000\022\017\n\013SELF_HOSTED\020\001\022\007\n\003AWS\020\002\022\007\n" +
-      "\003GCP\020\003\022\t\n\005AZURE\020\004\022\n\n\006LAMBDA\020\005\"\203\001\n\013Comput" +
-      "eInfo\022\020\n\010num_cpus\030\001 \001(\r\022\022\n\ncpu_memory\030\002 " +
-      "\001(\t\022\030\n\020num_accelerators\030\003 \001(\r\022\032\n\022acceler" +
-      "ator_memory\030\004 \001(\t\022\030\n\020accelerator_type\030\005 " +
-      "\003(\t\"\270\001\n\017AutoscaleConfig\022\024\n\014min_replicas\030" +
-      "\001 \001(\r\022\024\n\014max_replicas\030\002 \001(\r\022\037\n\027traffic_h" +
-      "istory_seconds\030\003 \001(\r\022 \n\030scale_down_delay" +
-      "_seconds\030\004 \001(\r\022\036\n\026scale_up_delay_seconds" +
-      "\030\005 \001(\r\022\026\n\016enable_packing\030\006 \001(\010\"\331\003\n\nDeplo" +
-      "yment\022\n\n\002id\030\001 \001(\t\022\017\n\007user_id\030\002 \001(\t\0227\n\020au" +
-      "toscale_config\030\003 \001(\0132\035.clarifai.api.Auto" +
-      "scaleConfig\022)\n\tnodepools\030\004 \003(\0132\026.clarifa" +
-      "i.api.Nodepool\022$\n\005model\030\005 \001(\0132\023.clarifai" +
-      ".api.ModelH\000\022*\n\010workflow\030\006 \001(\0132\026.clarifa" +
-      "i.api.WorkflowH\000\022D\n\021scheduling_choice\030\007 " +
-      "\001(\0162).clarifai.api.Deployment.Scheduling" +
-      "Choice\"\247\001\n\020SchedulingChoice\022\035\n\031UNKNOWN_S" +
-      "CHEDULING_CHOICE\020\000\022\010\n\004FAIL\020\001\022\n\n\006RANDOM\020\002" +
-      "\022\t\n\005PRICE\020\003\022\017\n\013PERFORMANCE\020\004\022\013\n\007NETWORK\020" +
-      "\005\022\017\n\013UTILIZATION\020\006\022\017\n\013PREFER_SPOT\020\007\022\023\n\017P" +
-      "REFER_ONDEMAND\020\010B\010\n\006object\"\216\001\n\016RunnerSel" +
-      "ector\022(\n\010nodepool\030\001 \001(\0132\026.clarifai.api.N" +
-      "odepool\022$\n\006runner\030\002 \001(\0132\024.clarifai.api.R" +
-      "unner\022,\n\ndeployment\030\003 \001(\0132\030.clarifai.api" +
-      ".Deployment\"y\n\016ProcessingInfo\022:\n\022runner_" +
-      "method_type\030\001 \001(\0162\036.clarifai.api.RunnerM" +
-      "ethodType\022+\n\006status\030\002 \001(\0132\033.clarifai.api" +
-      ".status.Status*^\n\024WorkflowModelUseCase\022#" +
-      "\n\037WORKFLOW_MODEL_USE_CASE_NOT_SET\020\000\022\022\n\016C" +
-      "LASSIFICATION\020\001\022\r\n\tDETECTION\020\002*\220\001\n\033Datas" +
-      "etVersionRequestOrigin\022*\n&DATASET_VERSIO" +
-      "N_REQUEST_ORIGIN_NOT_SET\020\000\022\n\n\006MANUAL\020\001\022\014" +
-      "\n\010TRAINING\020\002\022\025\n\021EVAL_GROUND_TRUTH\020\003\022\024\n\020E" +
-      "VAL_PREDICTIONS\020\004*\371\001\n\036DatasetVersionMetr" +
-      "icsGroupType\022.\n*DATASET_VERSION_METRICS_" +
-      "GROUP_TYPE_NOT_SET\020\000\022\016\n\nINPUT_TYPE\020\002\022\016\n\n" +
-      "CONCEPT_ID\020\n\022\022\n\016CONCEPTS_COUNT\020\013\022\030\n\024BOUN" +
-      "DING_BOXES_COUNT\020\024\022\022\n\016POLYGONS_COUNT\020\025\022\020" +
-      "\n\014POINTS_COUNT\020\026\022\017\n\013MASKS_COUNT\020\027\022\020\n\014PIX" +
-      "ELS_COUNT\020\036\022\020\n\014ASPECT_RATIO\020\037*\205\001\n\032Datase" +
-      "tVersionExportFormat\022)\n%DATASET_VERSION_" +
-      "EXPORT_FORMAT_NOT_SET\020\000\022\032\n\026CLARIFAI_DATA" +
-      "_PROTOBUF\020\001\022\026\n\022CLARIFAI_DATA_JSON\020\003\022\010\n\004C" +
-      "OCO\020\002*H\n\020ExpirationAction\022\035\n\031EXPIRATION_" +
-      "ACTION_NOT_SET\020\000\022\t\n\005DELAY\020\001\022\n\n\006EXPIRY\020\002*" +
-      "M\n\014LicenseScope\022\031\n\025LICENSE_SCOPE_NOT_SET" +
-      "\020\000\022\013\n\007PREDICT\020\001\022\t\n\005TRAIN\020\002\022\n\n\006SEARCH\020\003*P" +
-      "\n\010DataType\022\r\n\tUNDEFINED\020\000\022\n\n\006STRING\020\001\022\t\n" +
-      "\005UINT8\020\002\022\t\n\005INT32\020\003\022\t\n\005INT64\020\004\022\010\n\004FP32\020\005" +
-      "*\217\001\n\017ValueComparator\022\035\n\031CONCEPT_THRESHOL" +
-      "D_NOT_SET\020\000\022\020\n\014GREATER_THAN\020\001\022\031\n\025GREATER" +
-      "_THAN_OR_EQUAL\020\002\022\r\n\tLESS_THAN\020\003\022\026\n\022LESS_" +
-      "THAN_OR_EQUAL\020\004\022\t\n\005EQUAL\020\005*\201\001\n\016Evaluatio" +
-      "nType\022\r\n\tUndefined\020\000\022\022\n\016Classification\020\001" +
-      "\022\r\n\tDetection\020\002\022\020\n\014Segmentation\020\003\022\016\n\nClu" +
-      "stering\020\004\022\013\n\007Tracker\020\005\022\016\n\nGeneration\020\006*f" +
-      "\n\014APIEventType\022\032\n\026API_EVENT_TYPE_NOT_SET" +
-      "\020\000\022\023\n\017ON_PREM_PREDICT\020\001\022\021\n\rON_PREM_TRAIN" +
-      "\020\002\022\022\n\016ON_PREM_SEARCH\020\003*<\n\021UsageIntervalT" +
-      "ype\022\t\n\005undef\020\000\022\007\n\003day\020\001\022\t\n\005month\020\002\022\010\n\004ye" +
-      "ar\020\003*}\n\022AnnotationDataType\022 \n\034ANNOTATION" +
-      "_DATA_TYPE_NOT_SET\020\000\022\007\n\003TAG\020\001\022\020\n\014BOUNDIN" +
-      "G_BOX\020\002\022\013\n\007POLYGON\020\004\022\t\n\005POINT\020\010\022\010\n\004SPAN\020" +
-      "\020\022\010\n\004MASK\020 *\035\n\010RoleType\022\010\n\004TEAM\020\000\022\007\n\003ORG" +
-      "\020\001*$\n\020StatValueAggType\022\007\n\003SUM\020\000\022\007\n\003AVG\020\001" +
-      "*`\n\017StatTimeAggType\022\017\n\013NO_TIME_AGG\020\000\022\010\n\004" +
-      "YEAR\020\001\022\t\n\005MONTH\020\002\022\010\n\004WEEK\020\003\022\007\n\003DAY\020\004\022\010\n\004" +
-      "HOUR\020\005\022\n\n\006MINUTE\020\006*b\n\023ValidationErrorTyp" +
-      "e\022!\n\035VALIDATION_ERROR_TYPE_NOT_SET\020\000\022\016\n\n" +
-      "RESTRICTED\020\001\022\014\n\010DATABASE\020\002\022\n\n\006FORMAT\020\003*[" +
-      "\n\031InputIDConflictResolution\022(\n$INPUT_ID_" +
-      "CONFLICT_RESOLUTION_NOT_SET\020\000\022\010\n\004SKIP\020\001\022" +
-      "\n\n\006SUFFIX\020\002*s\n\020RunnerMethodType\022\013\n\007UNKNO" +
-      "WN\020\000\022\017\n\013UNARY_UNARY\020\001\022\023\n\017UNARY_STREAMING" +
-      "\020\002\022\023\n\017STREAMING_UNARY\020\003\022\027\n\023STREAMING_STR" +
-      "EAMING\020\004BY\n\025com.clarifai.grpc.apiP\001Z7git" +
-      "hub.com/Clarifai/clarifai-go-grpc/proto/" +
-      "clarifai/api\242\002\004CAIPb\006proto3"
+      "le.protobuf.Timestamp\022\017\n\007user_id\030\005 \001(\t\0225" +
+      "\n\017compute_cluster\030\006 \001(\0132\034.clarifai.api.C" +
+      "omputeCluster\022:\n\022node_capacity_type\030\007 \001(" +
+      "\0132\036.clarifai.api.NodeCapacityType\0222\n\016ins" +
+      "tance_types\030\010 \003(\0132\032.clarifai.api.Instanc" +
+      "eType\022\025\n\rmin_instances\030\t \001(\r\022\025\n\rmax_inst" +
+      "ances\030\n \001(\r\022,\n\nvisibility\030\013 \001(\0132\030.clarif" +
+      "ai.api.Visibility\022)\n\010metadata\030\014 \001(\0132\027.go" +
+      "ogle.protobuf.Struct\"\244\001\n\020NodeCapacityTyp" +
+      "e\022C\n\016capacity_types\030\001 \003(\0162+.clarifai.api" +
+      ".NodeCapacityType.CapacityType\"K\n\014Capaci" +
+      "tyType\022\030\n\024UKNOWN_CAPACITY_TYPE\020\000\022\022\n\016ON_D" +
+      "EMAND_TYPE\020\001\022\r\n\tSPOT_TYPE\020\002\"`\n\014InstanceT" +
+      "ype\022\n\n\002id\030\001 \001(\t\022\023\n\013description\030\002 \001(\t\022/\n\014" +
+      "compute_info\030\003 \001(\0132\031.clarifai.api.Comput" +
+      "eInfo\")\n\rCloudProvider\022\n\n\002id\030\001 \001(\t\022\014\n\004na" +
+      "me\030\002 \001(\t\"\350\001\n\016ComputeCluster\022\n\n\002id\030\001 \001(\t\022" +
+      "\023\n\013description\030\002 \001(\t\0223\n\016cloud_provider\030\003" +
+      " \001(\0132\033.clarifai.api.CloudProvider\022\016\n\006reg" +
+      "ion\030\004 \001(\t\022\017\n\007user_id\030\005 \001(\t\022.\n\ncreated_at" +
+      "\030\006 \001(\0132\032.google.protobuf.Timestamp\022/\n\013mo" +
+      "dified_at\030\007 \001(\0132\032.google.protobuf.Timest" +
+      "amp\"\203\001\n\013ComputeInfo\022\020\n\010num_cpus\030\001 \001(\r\022\022\n" +
+      "\ncpu_memory\030\002 \001(\t\022\030\n\020num_accelerators\030\003 " +
+      "\001(\r\022\032\n\022accelerator_memory\030\004 \001(\t\022\030\n\020accel" +
+      "erator_type\030\005 \003(\t\"\270\001\n\017AutoscaleConfig\022\024\n" +
+      "\014min_replicas\030\001 \001(\r\022\024\n\014max_replicas\030\002 \001(" +
+      "\r\022\037\n\027traffic_history_seconds\030\003 \001(\r\022 \n\030sc" +
+      "ale_down_delay_seconds\030\004 \001(\r\022\036\n\026scale_up" +
+      "_delay_seconds\030\005 \001(\r\022\026\n\016enable_packing\030\006" +
+      " \001(\010\"\262\004\n\nDeployment\022\n\n\002id\030\001 \001(\t\022\017\n\007user_" +
+      "id\030\002 \001(\t\0227\n\020autoscale_config\030\003 \001(\0132\035.cla" +
+      "rifai.api.AutoscaleConfig\022)\n\tnodepools\030\004" +
+      " \003(\0132\026.clarifai.api.Nodepool\022$\n\005model\030\005 " +
+      "\001(\0132\023.clarifai.api.ModelH\000\022*\n\010workflow\030\006" +
+      " \001(\0132\026.clarifai.api.WorkflowH\000\022D\n\021schedu" +
+      "ling_choice\030\007 \001(\0162).clarifai.api.Deploym" +
+      "ent.SchedulingChoice\022,\n\nvisibility\030\010 \001(\013" +
+      "2\030.clarifai.api.Visibility\022)\n\010metadata\030\t" +
+      " \001(\0132\027.google.protobuf.Struct\"\247\001\n\020Schedu" +
+      "lingChoice\022\035\n\031UNKNOWN_SCHEDULING_CHOICE\020" +
+      "\000\022\010\n\004FAIL\020\001\022\n\n\006RANDOM\020\002\022\t\n\005PRICE\020\003\022\017\n\013PE" +
+      "RFORMANCE\020\004\022\013\n\007NETWORK\020\005\022\017\n\013UTILIZATION\020" +
+      "\006\022\017\n\013PREFER_SPOT\020\007\022\023\n\017PREFER_ONDEMAND\020\010B" +
+      "\010\n\006object\"\216\001\n\016RunnerSelector\022(\n\010nodepool" +
+      "\030\001 \001(\0132\026.clarifai.api.Nodepool\022$\n\006runner" +
+      "\030\002 \001(\0132\024.clarifai.api.Runner\022,\n\ndeployme" +
+      "nt\030\003 \001(\0132\030.clarifai.api.Deployment\"y\n\016Pr" +
+      "ocessingInfo\022:\n\022runner_method_type\030\001 \001(\016" +
+      "2\036.clarifai.api.RunnerMethodType\022+\n\006stat" +
+      "us\030\002 \001(\0132\033.clarifai.api.status.Status*^\n" +
+      "\024WorkflowModelUseCase\022#\n\037WORKFLOW_MODEL_" +
+      "USE_CASE_NOT_SET\020\000\022\022\n\016CLASSIFICATION\020\001\022\r" +
+      "\n\tDETECTION\020\002*\220\001\n\033DatasetVersionRequestO" +
+      "rigin\022*\n&DATASET_VERSION_REQUEST_ORIGIN_" +
+      "NOT_SET\020\000\022\n\n\006MANUAL\020\001\022\014\n\010TRAINING\020\002\022\025\n\021E" +
+      "VAL_GROUND_TRUTH\020\003\022\024\n\020EVAL_PREDICTIONS\020\004" +
+      "*\371\001\n\036DatasetVersionMetricsGroupType\022.\n*D" +
+      "ATASET_VERSION_METRICS_GROUP_TYPE_NOT_SE" +
+      "T\020\000\022\016\n\nINPUT_TYPE\020\002\022\016\n\nCONCEPT_ID\020\n\022\022\n\016C" +
+      "ONCEPTS_COUNT\020\013\022\030\n\024BOUNDING_BOXES_COUNT\020" +
+      "\024\022\022\n\016POLYGONS_COUNT\020\025\022\020\n\014POINTS_COUNT\020\026\022" +
+      "\017\n\013MASKS_COUNT\020\027\022\020\n\014PIXELS_COUNT\020\036\022\020\n\014AS" +
+      "PECT_RATIO\020\037*\205\001\n\032DatasetVersionExportFor" +
+      "mat\022)\n%DATASET_VERSION_EXPORT_FORMAT_NOT" +
+      "_SET\020\000\022\032\n\026CLARIFAI_DATA_PROTOBUF\020\001\022\026\n\022CL" +
+      "ARIFAI_DATA_JSON\020\003\022\010\n\004COCO\020\002*H\n\020Expirati" +
+      "onAction\022\035\n\031EXPIRATION_ACTION_NOT_SET\020\000\022" +
+      "\t\n\005DELAY\020\001\022\n\n\006EXPIRY\020\002*M\n\014LicenseScope\022\031" +
+      "\n\025LICENSE_SCOPE_NOT_SET\020\000\022\013\n\007PREDICT\020\001\022\t" +
+      "\n\005TRAIN\020\002\022\n\n\006SEARCH\020\003*P\n\010DataType\022\r\n\tUND" +
+      "EFINED\020\000\022\n\n\006STRING\020\001\022\t\n\005UINT8\020\002\022\t\n\005INT32" +
+      "\020\003\022\t\n\005INT64\020\004\022\010\n\004FP32\020\005*\217\001\n\017ValueCompara" +
+      "tor\022\035\n\031CONCEPT_THRESHOLD_NOT_SET\020\000\022\020\n\014GR" +
+      "EATER_THAN\020\001\022\031\n\025GREATER_THAN_OR_EQUAL\020\002\022" +
+      "\r\n\tLESS_THAN\020\003\022\026\n\022LESS_THAN_OR_EQUAL\020\004\022\t" +
+      "\n\005EQUAL\020\005*\201\001\n\016EvaluationType\022\r\n\tUndefine" +
+      "d\020\000\022\022\n\016Classification\020\001\022\r\n\tDetection\020\002\022\020" +
+      "\n\014Segmentation\020\003\022\016\n\nClustering\020\004\022\013\n\007Trac" +
+      "ker\020\005\022\016\n\nGeneration\020\006*f\n\014APIEventType\022\032\n" +
+      "\026API_EVENT_TYPE_NOT_SET\020\000\022\023\n\017ON_PREM_PRE" +
+      "DICT\020\001\022\021\n\rON_PREM_TRAIN\020\002\022\022\n\016ON_PREM_SEA" +
+      "RCH\020\003*<\n\021UsageIntervalType\022\t\n\005undef\020\000\022\007\n" +
+      "\003day\020\001\022\t\n\005month\020\002\022\010\n\004year\020\003*}\n\022Annotatio" +
+      "nDataType\022 \n\034ANNOTATION_DATA_TYPE_NOT_SE" +
+      "T\020\000\022\007\n\003TAG\020\001\022\020\n\014BOUNDING_BOX\020\002\022\013\n\007POLYGO" +
+      "N\020\004\022\t\n\005POINT\020\010\022\010\n\004SPAN\020\020\022\010\n\004MASK\020 *\035\n\010Ro" +
+      "leType\022\010\n\004TEAM\020\000\022\007\n\003ORG\020\001*$\n\020StatValueAg" +
+      "gType\022\007\n\003SUM\020\000\022\007\n\003AVG\020\001*`\n\017StatTimeAggTy" +
+      "pe\022\017\n\013NO_TIME_AGG\020\000\022\010\n\004YEAR\020\001\022\t\n\005MONTH\020\002" +
+      "\022\010\n\004WEEK\020\003\022\007\n\003DAY\020\004\022\010\n\004HOUR\020\005\022\n\n\006MINUTE\020" +
+      "\006*b\n\023ValidationErrorType\022!\n\035VALIDATION_E" +
+      "RROR_TYPE_NOT_SET\020\000\022\016\n\nRESTRICTED\020\001\022\014\n\010D" +
+      "ATABASE\020\002\022\n\n\006FORMAT\020\003*[\n\031InputIDConflict" +
+      "Resolution\022(\n$INPUT_ID_CONFLICT_RESOLUTI" +
+      "ON_NOT_SET\020\000\022\010\n\004SKIP\020\001\022\n\n\006SUFFIX\020\002*s\n\020Ru" +
+      "nnerMethodType\022\013\n\007UNKNOWN\020\000\022\017\n\013UNARY_UNA" +
+      "RY\020\001\022\023\n\017UNARY_STREAMING\020\002\022\023\n\017STREAMING_U" +
+      "NARY\020\003\022\027\n\023STREAMING_STREAMING\020\004BY\n\025com.c" +
+      "larifai.grpc.apiP\001Z7github.com/Clarifai/" +
+      "clarifai-go-grpc/proto/clarifai/api\242\002\004CA" +
+      "IPb\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -2292,7 +2333,7 @@ public static void registerAllExtensions(
     internal_static_clarifai_api_ConceptQuery_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_ConceptQuery_descriptor,
-        new java.lang.String[] { "Name", "Language", "WorkflowId", "UseCases", });
+        new java.lang.String[] { "Name", "Language", "WorkflowId", "UseCases", "Model", "Workflow", "Source", });
     internal_static_clarifai_api_ConceptRelation_descriptor =
       getDescriptor().getMessageTypes().get(24);
     internal_static_clarifai_api_ConceptRelation_fieldAccessorTable = new
@@ -2868,7 +2909,7 @@ public static void registerAllExtensions(
     internal_static_clarifai_api_User_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_User_descriptor,
-        new java.lang.String[] { "Id", "PrimaryEmail", "FirstName", "LastName", "CompanyName", "JobTitle", "JobRole", "Intention", "BillType", "CreatedAt", "DateGdprConsent", "DateTosConsent", "DateMarketingConsent", "DatePiiConsent", "Metadata", "EmailAddresses", "TwoFactorAuthEnabled", "TeamsCount", "IsStarred", "StarCount", "Visibility", "UserDetail", });
+        new java.lang.String[] { "Id", "PrimaryEmail", "FirstName", "LastName", "CompanyName", "JobTitle", "JobRole", "Intention", "ReferralSource", "BillType", "CreatedAt", "DateGdprConsent", "DateTosConsent", "DateMarketingConsent", "DatePiiConsent", "Metadata", "EmailAddresses", "TwoFactorAuthEnabled", "TeamsCount", "IsStarred", "StarCount", "Visibility", "UserDetail", });
     internal_static_clarifai_api_UserDetail_descriptor =
       getDescriptor().getMessageTypes().get(119);
     internal_static_clarifai_api_UserDetail_fieldAccessorTable = new
@@ -3054,117 +3095,123 @@ public static void registerAllExtensions(
     internal_static_clarifai_api_TaskMetrics_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_TaskMetrics_descriptor,
-        new java.lang.String[] { "Work", });
+        new java.lang.String[] { "Work", "Review", });
     internal_static_clarifai_api_TaskWorkMetrics_descriptor =
       getDescriptor().getMessageTypes().get(150);
     internal_static_clarifai_api_TaskWorkMetrics_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_TaskWorkMetrics_descriptor,
         new java.lang.String[] { "InputsCountEstimated", "InputsPercentEstimated", });
-    internal_static_clarifai_api_Collector_descriptor =
+    internal_static_clarifai_api_TaskReviewMetrics_descriptor =
       getDescriptor().getMessageTypes().get(151);
+    internal_static_clarifai_api_TaskReviewMetrics_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_TaskReviewMetrics_descriptor,
+        new java.lang.String[] { "InputsCountEstimated", "InputsPercentEstimated", });
+    internal_static_clarifai_api_Collector_descriptor =
+      getDescriptor().getMessageTypes().get(152);
     internal_static_clarifai_api_Collector_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_Collector_descriptor,
         new java.lang.String[] { "Id", "Description", "CreatedAt", "PreQueueWorkflowId", "PreQueueRandomSample", "PostQueueWorkflowId", "CollectorSource", "Status", "CollectOutputs", });
     internal_static_clarifai_api_CollectorSource_descriptor =
-      getDescriptor().getMessageTypes().get(152);
+      getDescriptor().getMessageTypes().get(153);
     internal_static_clarifai_api_CollectorSource_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_CollectorSource_descriptor,
         new java.lang.String[] { "ApiPostModelOutputsCollectorSource", });
     internal_static_clarifai_api_APIPostModelOutputsCollectorSource_descriptor =
-      getDescriptor().getMessageTypes().get(153);
+      getDescriptor().getMessageTypes().get(154);
     internal_static_clarifai_api_APIPostModelOutputsCollectorSource_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_APIPostModelOutputsCollectorSource_descriptor,
         new java.lang.String[] { "ModelUserId", "ModelAppId", "ModelId", "ModelVersionId", "PostInputsKeyId", "CallerUserId", });
     internal_static_clarifai_api_StatValue_descriptor =
-      getDescriptor().getMessageTypes().get(154);
+      getDescriptor().getMessageTypes().get(155);
     internal_static_clarifai_api_StatValue_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_StatValue_descriptor,
         new java.lang.String[] { "Time", "Value", "Tags", });
     internal_static_clarifai_api_StatValueAggregateResult_descriptor =
-      getDescriptor().getMessageTypes().get(155);
+      getDescriptor().getMessageTypes().get(156);
     internal_static_clarifai_api_StatValueAggregateResult_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_StatValueAggregateResult_descriptor,
         new java.lang.String[] { "StatValueAggregates", "StatValueAggregateQuery", });
     internal_static_clarifai_api_StatValueAggregate_descriptor =
-      getDescriptor().getMessageTypes().get(156);
+      getDescriptor().getMessageTypes().get(157);
     internal_static_clarifai_api_StatValueAggregate_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_StatValueAggregate_descriptor,
         new java.lang.String[] { "Time", "AggregateValue", "Count", "Tags", });
     internal_static_clarifai_api_StatValueAggregateQuery_descriptor =
-      getDescriptor().getMessageTypes().get(157);
+      getDescriptor().getMessageTypes().get(158);
     internal_static_clarifai_api_StatValueAggregateQuery_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_StatValueAggregateQuery_descriptor,
         new java.lang.String[] { "Tags", "TagGroups", "StatValueAggType", "StatTimeAggType", "StartTime", "EndTime", });
     internal_static_clarifai_api_PCAProjectionComparator_descriptor =
-      getDescriptor().getMessageTypes().get(158);
+      getDescriptor().getMessageTypes().get(159);
     internal_static_clarifai_api_PCAProjectionComparator_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_PCAProjectionComparator_descriptor,
         new java.lang.String[] { "DistanceThreshold", "ModelVersionId", });
     internal_static_clarifai_api_DuplicateAnnotationsResults_descriptor =
-      getDescriptor().getMessageTypes().get(159);
+      getDescriptor().getMessageTypes().get(160);
     internal_static_clarifai_api_DuplicateAnnotationsResults_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_DuplicateAnnotationsResults_descriptor,
         new java.lang.String[] { "DuplicateCfid", "UniqueCount", });
     internal_static_clarifai_api_Visibility_descriptor =
-      getDescriptor().getMessageTypes().get(160);
+      getDescriptor().getMessageTypes().get(161);
     internal_static_clarifai_api_Visibility_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_Visibility_descriptor,
         new java.lang.String[] { "Gettable", });
     internal_static_clarifai_api_TrendingMetric_descriptor =
-      getDescriptor().getMessageTypes().get(161);
+      getDescriptor().getMessageTypes().get(162);
     internal_static_clarifai_api_TrendingMetric_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_TrendingMetric_descriptor,
         new java.lang.String[] { "UserId", "AppId", "ObjectId", "ViewCount", });
     internal_static_clarifai_api_FullTag_descriptor =
-      getDescriptor().getMessageTypes().get(162);
+      getDescriptor().getMessageTypes().get(163);
     internal_static_clarifai_api_FullTag_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_FullTag_descriptor,
         new java.lang.String[] { "Name", "Id", });
     internal_static_clarifai_api_TimeSegment_descriptor =
-      getDescriptor().getMessageTypes().get(163);
+      getDescriptor().getMessageTypes().get(164);
     internal_static_clarifai_api_TimeSegment_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_TimeSegment_descriptor,
         new java.lang.String[] { "Id", "Data", "TimeInfo", });
     internal_static_clarifai_api_TimeInfo_descriptor =
-      getDescriptor().getMessageTypes().get(164);
+      getDescriptor().getMessageTypes().get(165);
     internal_static_clarifai_api_TimeInfo_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_TimeInfo_descriptor,
         new java.lang.String[] { "NumFrames", "BeginTime", "EndTime", });
     internal_static_clarifai_api_DatasetStar_descriptor =
-      getDescriptor().getMessageTypes().get(165);
+      getDescriptor().getMessageTypes().get(166);
     internal_static_clarifai_api_DatasetStar_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_DatasetStar_descriptor,
         new java.lang.String[] { "DatasetId", });
     internal_static_clarifai_api_ModuleStar_descriptor =
-      getDescriptor().getMessageTypes().get(166);
+      getDescriptor().getMessageTypes().get(167);
     internal_static_clarifai_api_ModuleStar_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_ModuleStar_descriptor,
         new java.lang.String[] { "ModuleId", });
     internal_static_clarifai_api_Module_descriptor =
-      getDescriptor().getMessageTypes().get(167);
+      getDescriptor().getMessageTypes().get(168);
     internal_static_clarifai_api_Module_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_Module_descriptor,
         new java.lang.String[] { "Id", "Description", "CreatedAt", "ModifiedAt", "Visibility", "Metadata", "UserId", "AppId", "ModuleVersion", "IsStarred", "StarCount", "BookmarkOrigin", "Image", });
     internal_static_clarifai_api_ModuleVersion_descriptor =
-      getDescriptor().getMessageTypes().get(168);
+      getDescriptor().getMessageTypes().get(169);
     internal_static_clarifai_api_ModuleVersion_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_ModuleVersion_descriptor,
@@ -3182,223 +3229,241 @@ public static void registerAllExtensions(
         internal_static_clarifai_api_ModuleVersion_ModuleNav_descriptor,
         new java.lang.String[] { "Title", "ModuleSubNavs", });
     internal_static_clarifai_api_InstalledModuleVersion_descriptor =
-      getDescriptor().getMessageTypes().get(169);
+      getDescriptor().getMessageTypes().get(170);
     internal_static_clarifai_api_InstalledModuleVersion_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_InstalledModuleVersion_descriptor,
         new java.lang.String[] { "Id", "ModuleVersion", "AppId", "UserId", "CreatedAt", "ModifiedAt", "DeployUrl", "Visibility", "KeyId", });
     internal_static_clarifai_api_BulkOperation_descriptor =
-      getDescriptor().getMessageTypes().get(170);
+      getDescriptor().getMessageTypes().get(171);
     internal_static_clarifai_api_BulkOperation_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_BulkOperation_descriptor,
         new java.lang.String[] { "Id", "InputIds", "Search", "Dataset", "Operation", "AppId", "Status", "Progress", "CreatedBy", "CreatedAt", "LastModifiedAt", "InputSource", });
     internal_static_clarifai_api_InputIDs_descriptor =
-      getDescriptor().getMessageTypes().get(171);
+      getDescriptor().getMessageTypes().get(172);
     internal_static_clarifai_api_InputIDs_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_InputIDs_descriptor,
         new java.lang.String[] { "InputIds", });
     internal_static_clarifai_api_Progress_descriptor =
-      getDescriptor().getMessageTypes().get(172);
+      getDescriptor().getMessageTypes().get(173);
     internal_static_clarifai_api_Progress_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_Progress_descriptor,
         new java.lang.String[] { "Processed", "LastProcessedId", });
     internal_static_clarifai_api_Operation_descriptor =
-      getDescriptor().getMessageTypes().get(173);
+      getDescriptor().getMessageTypes().get(174);
     internal_static_clarifai_api_Operation_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_Operation_descriptor,
         new java.lang.String[] { "AddConcepts", "DeleteConcepts", "AddMetadata", "DeleteMetadata", "OverwriteGeo", "DeleteGeo", "DeleteFromDataset", "AddToDataset", "SplitIntoDatasets", "Operation", });
     internal_static_clarifai_api_AddConcepts_descriptor =
-      getDescriptor().getMessageTypes().get(174);
+      getDescriptor().getMessageTypes().get(175);
     internal_static_clarifai_api_AddConcepts_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_AddConcepts_descriptor,
         new java.lang.String[] { "Concepts", });
     internal_static_clarifai_api_DeleteConcepts_descriptor =
-      getDescriptor().getMessageTypes().get(175);
+      getDescriptor().getMessageTypes().get(176);
     internal_static_clarifai_api_DeleteConcepts_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_DeleteConcepts_descriptor,
         new java.lang.String[] { "Concepts", "UserIds", });
     internal_static_clarifai_api_AddMetadata_descriptor =
-      getDescriptor().getMessageTypes().get(176);
+      getDescriptor().getMessageTypes().get(177);
     internal_static_clarifai_api_AddMetadata_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_AddMetadata_descriptor,
         new java.lang.String[] { "Metadata", });
     internal_static_clarifai_api_DeleteMetadata_descriptor =
-      getDescriptor().getMessageTypes().get(177);
+      getDescriptor().getMessageTypes().get(178);
     internal_static_clarifai_api_DeleteMetadata_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_DeleteMetadata_descriptor,
         new java.lang.String[] { "Metadata", });
     internal_static_clarifai_api_OverwriteGeo_descriptor =
-      getDescriptor().getMessageTypes().get(178);
+      getDescriptor().getMessageTypes().get(179);
     internal_static_clarifai_api_OverwriteGeo_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_OverwriteGeo_descriptor,
         new java.lang.String[] { "Geo", });
     internal_static_clarifai_api_DeleteGeo_descriptor =
-      getDescriptor().getMessageTypes().get(179);
+      getDescriptor().getMessageTypes().get(180);
     internal_static_clarifai_api_DeleteGeo_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_DeleteGeo_descriptor,
         new java.lang.String[] { });
     internal_static_clarifai_api_AddToDataset_descriptor =
-      getDescriptor().getMessageTypes().get(180);
+      getDescriptor().getMessageTypes().get(181);
     internal_static_clarifai_api_AddToDataset_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_AddToDataset_descriptor,
         new java.lang.String[] { "DatasetId", });
     internal_static_clarifai_api_DeleteFromDataset_descriptor =
-      getDescriptor().getMessageTypes().get(181);
+      getDescriptor().getMessageTypes().get(182);
     internal_static_clarifai_api_DeleteFromDataset_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_DeleteFromDataset_descriptor,
         new java.lang.String[] { "DatasetId", });
     internal_static_clarifai_api_SplitIntoDatasets_descriptor =
-      getDescriptor().getMessageTypes().get(182);
+      getDescriptor().getMessageTypes().get(183);
     internal_static_clarifai_api_SplitIntoDatasets_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_SplitIntoDatasets_descriptor,
         new java.lang.String[] { "DatasetSplits", "Method", });
     internal_static_clarifai_api_DatasetSplit_descriptor =
-      getDescriptor().getMessageTypes().get(183);
+      getDescriptor().getMessageTypes().get(184);
     internal_static_clarifai_api_DatasetSplit_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_DatasetSplit_descriptor,
         new java.lang.String[] { "Dataset", "Percentage", "MethodInfo", });
     internal_static_clarifai_api_InputsAddJob_descriptor =
-      getDescriptor().getMessageTypes().get(184);
+      getDescriptor().getMessageTypes().get(185);
     internal_static_clarifai_api_InputsAddJob_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_InputsAddJob_descriptor,
         new java.lang.String[] { "Id", "CallBackUrl", "AppPat", "Progress", "CreatedAt", "ModifiedAt", "ExtractionJobs", "Uploads", "Status", });
     internal_static_clarifai_api_InputsAddJobProgress_descriptor =
-      getDescriptor().getMessageTypes().get(185);
+      getDescriptor().getMessageTypes().get(186);
     internal_static_clarifai_api_InputsAddJobProgress_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_InputsAddJobProgress_descriptor,
         new java.lang.String[] { "PendingCount", "InProgressCount", "SuccessCount", "FailedCount", });
     internal_static_clarifai_api_Upload_descriptor =
-      getDescriptor().getMessageTypes().get(186);
+      getDescriptor().getMessageTypes().get(187);
     internal_static_clarifai_api_Upload_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_Upload_descriptor,
         new java.lang.String[] { "Id", "CreatedAt", "ModifiedAt", "ExpiresAt", "Status", "ContentName", "ContentLength", "ContentUrl", });
     internal_static_clarifai_api_UploadContentPart_descriptor =
-      getDescriptor().getMessageTypes().get(187);
+      getDescriptor().getMessageTypes().get(188);
     internal_static_clarifai_api_UploadContentPart_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_UploadContentPart_descriptor,
         new java.lang.String[] { "RangeStart", "PartNumber", "Data", });
     internal_static_clarifai_api_CustomCodeOperatorRequest_descriptor =
-      getDescriptor().getMessageTypes().get(188);
+      getDescriptor().getMessageTypes().get(189);
     internal_static_clarifai_api_CustomCodeOperatorRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_CustomCodeOperatorRequest_descriptor,
         new java.lang.String[] { "Inputs", "Metadata", });
     internal_static_clarifai_api_InputsExtractionJob_descriptor =
-      getDescriptor().getMessageTypes().get(189);
+      getDescriptor().getMessageTypes().get(190);
     internal_static_clarifai_api_InputsExtractionJob_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_InputsExtractionJob_descriptor,
         new java.lang.String[] { "Status", "Id", "Url", "Progress", "CreatedAt", "ModifiedAt", "InputIdConflictResolution", "InputTemplate", });
     internal_static_clarifai_api_InputsExtractionJobProgress_descriptor =
-      getDescriptor().getMessageTypes().get(190);
+      getDescriptor().getMessageTypes().get(191);
     internal_static_clarifai_api_InputsExtractionJobProgress_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_InputsExtractionJobProgress_descriptor,
         new java.lang.String[] { "AudioInputsCount", "ImageInputsCount", "VideoInputsCount", "TextInputsCount", "PendingArchivesCount", "InProgressArchivesCount", "CompletedArchivesCount", "FailedArchivesCount", });
     internal_static_clarifai_api_InputsDataSource_descriptor =
-      getDescriptor().getMessageTypes().get(191);
+      getDescriptor().getMessageTypes().get(192);
     internal_static_clarifai_api_InputsDataSource_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_InputsDataSource_descriptor,
         new java.lang.String[] { "InputsAddJobId", "Url", "InputIdConflictResolution", "InputTemplate", });
     internal_static_clarifai_api_DataSourceURL_descriptor =
-      getDescriptor().getMessageTypes().get(192);
+      getDescriptor().getMessageTypes().get(193);
     internal_static_clarifai_api_DataSourceURL_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_DataSourceURL_descriptor,
         new java.lang.String[] { "Url", "Credentials", });
     internal_static_clarifai_api_DataSourceCredentials_descriptor =
-      getDescriptor().getMessageTypes().get(193);
+      getDescriptor().getMessageTypes().get(194);
     internal_static_clarifai_api_DataSourceCredentials_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_DataSourceCredentials_descriptor,
         new java.lang.String[] { "S3Creds", "GcpCreds", "AzureBlobCreds", "Credentials", });
     internal_static_clarifai_api_AWSCreds_descriptor =
-      getDescriptor().getMessageTypes().get(194);
+      getDescriptor().getMessageTypes().get(195);
     internal_static_clarifai_api_AWSCreds_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_AWSCreds_descriptor,
         new java.lang.String[] { "Region", "Id", "Secret", "Token", });
     internal_static_clarifai_api_AzureBlobCreds_descriptor =
-      getDescriptor().getMessageTypes().get(195);
+      getDescriptor().getMessageTypes().get(196);
     internal_static_clarifai_api_AzureBlobCreds_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_AzureBlobCreds_descriptor,
         new java.lang.String[] { "AccountName", "AccountKey", });
     internal_static_clarifai_api_InputsUpload_descriptor =
-      getDescriptor().getMessageTypes().get(196);
+      getDescriptor().getMessageTypes().get(197);
     internal_static_clarifai_api_InputsUpload_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_InputsUpload_descriptor,
         new java.lang.String[] { "InputsAddJobId", "AppPat", "Upload", "InputIdConflictResolution", "InputTemplate", });
     internal_static_clarifai_api_BookmarkOrigin_descriptor =
-      getDescriptor().getMessageTypes().get(197);
+      getDescriptor().getMessageTypes().get(198);
     internal_static_clarifai_api_BookmarkOrigin_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_BookmarkOrigin_descriptor,
         new java.lang.String[] { "Id", "AppId", "UserId", "ResourceType", });
     internal_static_clarifai_api_Runner_descriptor =
-      getDescriptor().getMessageTypes().get(198);
+      getDescriptor().getMessageTypes().get(199);
     internal_static_clarifai_api_Runner_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_Runner_descriptor,
-        new java.lang.String[] { "Id", "Description", "CreatedAt", "ModifiedAt", "Metadata", "UserId", "Labels", "Model", "Workflow", "Nodepool", "ComputeInfo", "Object", });
+        new java.lang.String[] { "Id", "Description", "CreatedAt", "ModifiedAt", "Metadata", "UserId", "Labels", "Worker", "Nodepool", "ComputeInfo", });
     internal_static_clarifai_api_Nodepool_descriptor =
-      getDescriptor().getMessageTypes().get(199);
+      getDescriptor().getMessageTypes().get(200);
     internal_static_clarifai_api_Nodepool_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_Nodepool_descriptor,
-        new java.lang.String[] { "Id", "UserId", "CloudRegion", "CapacityTypes", "InstanceTypes", "MinInstances", "MaxInstances", });
-    internal_static_clarifai_api_CloudRegion_descriptor =
-      getDescriptor().getMessageTypes().get(200);
-    internal_static_clarifai_api_CloudRegion_fieldAccessorTable = new
+        new java.lang.String[] { "Id", "Description", "CreatedAt", "ModifiedAt", "UserId", "ComputeCluster", "NodeCapacityType", "InstanceTypes", "MinInstances", "MaxInstances", "Visibility", "Metadata", });
+    internal_static_clarifai_api_NodeCapacityType_descriptor =
+      getDescriptor().getMessageTypes().get(201);
+    internal_static_clarifai_api_NodeCapacityType_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_NodeCapacityType_descriptor,
+        new java.lang.String[] { "CapacityTypes", });
+    internal_static_clarifai_api_InstanceType_descriptor =
+      getDescriptor().getMessageTypes().get(202);
+    internal_static_clarifai_api_InstanceType_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_InstanceType_descriptor,
+        new java.lang.String[] { "Id", "Description", "ComputeInfo", });
+    internal_static_clarifai_api_CloudProvider_descriptor =
+      getDescriptor().getMessageTypes().get(203);
+    internal_static_clarifai_api_CloudProvider_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_clarifai_api_CloudRegion_descriptor,
-        new java.lang.String[] { "Id", "Cloud", "Region", });
+        internal_static_clarifai_api_CloudProvider_descriptor,
+        new java.lang.String[] { "Id", "Name", });
+    internal_static_clarifai_api_ComputeCluster_descriptor =
+      getDescriptor().getMessageTypes().get(204);
+    internal_static_clarifai_api_ComputeCluster_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_ComputeCluster_descriptor,
+        new java.lang.String[] { "Id", "Description", "CloudProvider", "Region", "UserId", "CreatedAt", "ModifiedAt", });
     internal_static_clarifai_api_ComputeInfo_descriptor =
-      getDescriptor().getMessageTypes().get(201);
+      getDescriptor().getMessageTypes().get(205);
     internal_static_clarifai_api_ComputeInfo_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_ComputeInfo_descriptor,
         new java.lang.String[] { "NumCpus", "CpuMemory", "NumAccelerators", "AcceleratorMemory", "AcceleratorType", });
     internal_static_clarifai_api_AutoscaleConfig_descriptor =
-      getDescriptor().getMessageTypes().get(202);
+      getDescriptor().getMessageTypes().get(206);
     internal_static_clarifai_api_AutoscaleConfig_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_AutoscaleConfig_descriptor,
         new java.lang.String[] { "MinReplicas", "MaxReplicas", "TrafficHistorySeconds", "ScaleDownDelaySeconds", "ScaleUpDelaySeconds", "EnablePacking", });
     internal_static_clarifai_api_Deployment_descriptor =
-      getDescriptor().getMessageTypes().get(203);
+      getDescriptor().getMessageTypes().get(207);
     internal_static_clarifai_api_Deployment_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_Deployment_descriptor,
-        new java.lang.String[] { "Id", "UserId", "AutoscaleConfig", "Nodepools", "Model", "Workflow", "SchedulingChoice", "Object", });
+        new java.lang.String[] { "Id", "UserId", "AutoscaleConfig", "Nodepools", "Model", "Workflow", "SchedulingChoice", "Visibility", "Metadata", "Object", });
     internal_static_clarifai_api_RunnerSelector_descriptor =
-      getDescriptor().getMessageTypes().get(204);
+      getDescriptor().getMessageTypes().get(208);
     internal_static_clarifai_api_RunnerSelector_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_RunnerSelector_descriptor,
         new java.lang.String[] { "Nodepool", "Runner", "Deployment", });
     internal_static_clarifai_api_ProcessingInfo_descriptor =
-      getDescriptor().getMessageTypes().get(205);
+      getDescriptor().getMessageTypes().get(209);
     internal_static_clarifai_api_ProcessingInfo_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_ProcessingInfo_descriptor,
diff --git a/src/main/java/com/clarifai/grpc/api/Runner.java b/src/main/java/com/clarifai/grpc/api/Runner.java
index b2189ac..0bfa46f 100644
--- a/src/main/java/com/clarifai/grpc/api/Runner.java
+++ b/src/main/java/com/clarifai/grpc/api/Runner.java
@@ -124,35 +124,20 @@ private Runner(
             labels_.add(s);
             break;
           }
-          case 74: {
-            com.clarifai.grpc.api.Model.Builder subBuilder = null;
-            if (objectCase_ == 9) {
-              subBuilder = ((com.clarifai.grpc.api.Model) object_).toBuilder();
-            }
-            object_ =
-                input.readMessage(com.clarifai.grpc.api.Model.parser(), extensionRegistry);
-            if (subBuilder != null) {
-              subBuilder.mergeFrom((com.clarifai.grpc.api.Model) object_);
-              object_ = subBuilder.buildPartial();
-            }
-            objectCase_ = 9;
-            break;
-          }
-          case 82: {
-            com.clarifai.grpc.api.Workflow.Builder subBuilder = null;
-            if (objectCase_ == 10) {
-              subBuilder = ((com.clarifai.grpc.api.Workflow) object_).toBuilder();
+          case 66: {
+            com.clarifai.grpc.api.Worker.Builder subBuilder = null;
+            if (worker_ != null) {
+              subBuilder = worker_.toBuilder();
             }
-            object_ =
-                input.readMessage(com.clarifai.grpc.api.Workflow.parser(), extensionRegistry);
+            worker_ = input.readMessage(com.clarifai.grpc.api.Worker.parser(), extensionRegistry);
             if (subBuilder != null) {
-              subBuilder.mergeFrom((com.clarifai.grpc.api.Workflow) object_);
-              object_ = subBuilder.buildPartial();
+              subBuilder.mergeFrom(worker_);
+              worker_ = subBuilder.buildPartial();
             }
-            objectCase_ = 10;
+
             break;
           }
-          case 98: {
+          case 74: {
             com.clarifai.grpc.api.Nodepool.Builder subBuilder = null;
             if (nodepool_ != null) {
               subBuilder = nodepool_.toBuilder();
@@ -165,7 +150,7 @@ private Runner(
 
             break;
           }
-          case 106: {
+          case 82: {
             com.clarifai.grpc.api.ComputeInfo.Builder subBuilder = null;
             if (computeInfo_ != null) {
               subBuilder = computeInfo_.toBuilder();
@@ -215,52 +200,11 @@ private Runner(
             com.clarifai.grpc.api.Runner.class, com.clarifai.grpc.api.Runner.Builder.class);
   }
 
-  private int objectCase_ = 0;
-  private java.lang.Object object_;
-  public enum ObjectCase
-      implements com.google.protobuf.Internal.EnumLite,
-          com.google.protobuf.AbstractMessage.InternalOneOfEnum {
-    MODEL(9),
-    WORKFLOW(10),
-    OBJECT_NOT_SET(0);
-    private final int value;
-    private ObjectCase(int value) {
-      this.value = value;
-    }
-    /**
-     * @param value The number of the enum to look for.
-     * @return The enum associated with the given number.
-     * @deprecated Use {@link #forNumber(int)} instead.
-     */
-    @java.lang.Deprecated
-    public static ObjectCase valueOf(int value) {
-      return forNumber(value);
-    }
-
-    public static ObjectCase forNumber(int value) {
-      switch (value) {
-        case 9: return MODEL;
-        case 10: return WORKFLOW;
-        case 0: return OBJECT_NOT_SET;
-        default: return null;
-      }
-    }
-    public int getNumber() {
-      return this.value;
-    }
-  };
-
-  public ObjectCase
-  getObjectCase() {
-    return ObjectCase.forNumber(
-        objectCase_);
-  }
-
   public static final int ID_FIELD_NUMBER = 1;
   private volatile java.lang.Object id_;
   /**
    * <pre>
-   * A unique ID for this app module.
+   * A unique ID for this runner.
    * This is a UUID since runners can be automatically orchestrated.
    * </pre>
    *
@@ -282,7 +226,7 @@ public java.lang.String getId() {
   }
   /**
    * <pre>
-   * A unique ID for this app module.
+   * A unique ID for this runner.
    * This is a UUID since runners can be automatically orchestrated.
    * </pre>
    *
@@ -308,7 +252,7 @@ public java.lang.String getId() {
   private volatile java.lang.Object description_;
   /**
    * <pre>
-   * A short description for this app module to be used in grids of modules.
+   * short description about the runner.
    * </pre>
    *
    * <code>string description = 2;</code>
@@ -329,7 +273,7 @@ public java.lang.String getDescription() {
   }
   /**
    * <pre>
-   * A short description for this app module to be used in grids of modules.
+   * short description about the runner.
    * </pre>
    *
    * <code>string description = 2;</code>
@@ -354,7 +298,7 @@ public java.lang.String getDescription() {
   private com.google.protobuf.Timestamp createdAt_;
   /**
    * <pre>
-   * When the app module was created.
+   * When the runner was created.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -366,7 +310,7 @@ public boolean hasCreatedAt() {
   }
   /**
    * <pre>
-   * When the app module was created.
+   * When the runner was created.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -378,7 +322,7 @@ public com.google.protobuf.Timestamp getCreatedAt() {
   }
   /**
    * <pre>
-   * When the app module was created.
+   * When the runner was created.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -392,7 +336,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
   private com.google.protobuf.Timestamp modifiedAt_;
   /**
    * <pre>
-   * When the app module was last modified.
+   * When the runner was last modified.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -404,7 +348,7 @@ public boolean hasModifiedAt() {
   }
   /**
    * <pre>
-   * When the app module was last modified.
+   * When the runner was last modified.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -416,7 +360,7 @@ public com.google.protobuf.Timestamp getModifiedAt() {
   }
   /**
    * <pre>
-   * When the app module was last modified.
+   * When the runner was last modified.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -525,7 +469,7 @@ public java.lang.String getUserId() {
    *
    * <code>repeated string labels = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Runner.labels is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=4279
+   *     See proto/clarifai/api/resources.proto;l=4298
    * @return A list containing the labels.
    */
   @java.lang.Deprecated public com.google.protobuf.ProtocolStringList
@@ -539,7 +483,7 @@ public java.lang.String getUserId() {
    *
    * <code>repeated string labels = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Runner.labels is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=4279
+   *     See proto/clarifai/api/resources.proto;l=4298
    * @return The count of labels.
    */
   @java.lang.Deprecated public int getLabelsCount() {
@@ -552,7 +496,7 @@ public java.lang.String getUserId() {
    *
    * <code>repeated string labels = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Runner.labels is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=4279
+   *     See proto/clarifai/api/resources.proto;l=4298
    * @param index The index of the element to return.
    * @return The labels at the given index.
    */
@@ -566,7 +510,7 @@ public java.lang.String getUserId() {
    *
    * <code>repeated string labels = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Runner.labels is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=4279
+   *     See proto/clarifai/api/resources.proto;l=4298
    * @param index The index of the value to return.
    * @return The bytes of the labels at the given index.
    */
@@ -575,93 +519,51 @@ public java.lang.String getUserId() {
     return labels_.getByteString(index);
   }
 
-  public static final int MODEL_FIELD_NUMBER = 9;
-  /**
-   * <pre>
-   * Model: match work to only a specific model.
-   * </pre>
-   *
-   * <code>.clarifai.api.Model model = 9;</code>
-   * @return Whether the model field is set.
-   */
-  @java.lang.Override
-  public boolean hasModel() {
-    return objectCase_ == 9;
-  }
-  /**
-   * <pre>
-   * Model: match work to only a specific model.
-   * </pre>
-   *
-   * <code>.clarifai.api.Model model = 9;</code>
-   * @return The model.
-   */
-  @java.lang.Override
-  public com.clarifai.grpc.api.Model getModel() {
-    if (objectCase_ == 9) {
-       return (com.clarifai.grpc.api.Model) object_;
-    }
-    return com.clarifai.grpc.api.Model.getDefaultInstance();
-  }
-  /**
-   * <pre>
-   * Model: match work to only a specific model.
-   * </pre>
-   *
-   * <code>.clarifai.api.Model model = 9;</code>
-   */
-  @java.lang.Override
-  public com.clarifai.grpc.api.ModelOrBuilder getModelOrBuilder() {
-    if (objectCase_ == 9) {
-       return (com.clarifai.grpc.api.Model) object_;
-    }
-    return com.clarifai.grpc.api.Model.getDefaultInstance();
-  }
-
-  public static final int WORKFLOW_FIELD_NUMBER = 10;
+  public static final int WORKER_FIELD_NUMBER = 8;
+  private com.clarifai.grpc.api.Worker worker_;
   /**
    * <pre>
-   * Workflow: match work to only a specific workflow.
+   * Instead of just matching on labels we might want to have more explicit matching of what
+   * work this runner is looking for.
+   * The thing that the autoscaling config applies to for this nodepool.
    * </pre>
    *
-   * <code>.clarifai.api.Workflow workflow = 10;</code>
-   * @return Whether the workflow field is set.
+   * <code>.clarifai.api.Worker worker = 8;</code>
+   * @return Whether the worker field is set.
    */
   @java.lang.Override
-  public boolean hasWorkflow() {
-    return objectCase_ == 10;
+  public boolean hasWorker() {
+    return worker_ != null;
   }
   /**
    * <pre>
-   * Workflow: match work to only a specific workflow.
+   * Instead of just matching on labels we might want to have more explicit matching of what
+   * work this runner is looking for.
+   * The thing that the autoscaling config applies to for this nodepool.
    * </pre>
    *
-   * <code>.clarifai.api.Workflow workflow = 10;</code>
-   * @return The workflow.
+   * <code>.clarifai.api.Worker worker = 8;</code>
+   * @return The worker.
    */
   @java.lang.Override
-  public com.clarifai.grpc.api.Workflow getWorkflow() {
-    if (objectCase_ == 10) {
-       return (com.clarifai.grpc.api.Workflow) object_;
-    }
-    return com.clarifai.grpc.api.Workflow.getDefaultInstance();
+  public com.clarifai.grpc.api.Worker getWorker() {
+    return worker_ == null ? com.clarifai.grpc.api.Worker.getDefaultInstance() : worker_;
   }
   /**
    * <pre>
-   * Workflow: match work to only a specific workflow.
+   * Instead of just matching on labels we might want to have more explicit matching of what
+   * work this runner is looking for.
+   * The thing that the autoscaling config applies to for this nodepool.
    * </pre>
    *
-   * <code>.clarifai.api.Workflow workflow = 10;</code>
+   * <code>.clarifai.api.Worker worker = 8;</code>
    */
   @java.lang.Override
-  public com.clarifai.grpc.api.WorkflowOrBuilder getWorkflowOrBuilder() {
-    if (objectCase_ == 10) {
-       return (com.clarifai.grpc.api.Workflow) object_;
-    }
-    return com.clarifai.grpc.api.Workflow.getDefaultInstance();
+  public com.clarifai.grpc.api.WorkerOrBuilder getWorkerOrBuilder() {
+    return getWorker();
   }
 
-  public static final int NODEPOOL_FIELD_NUMBER = 12;
+  public static final int NODEPOOL_FIELD_NUMBER = 9;
   private com.clarifai.grpc.api.Nodepool nodepool_;
   /**
    * <pre>
@@ -670,7 +572,7 @@ public com.clarifai.grpc.api.WorkflowOrBuilder getWorkflowOrBuilder() {
    * This nodepool must be accessible to you or an org you are part of.
    * </pre>
    *
-   * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+   * <code>.clarifai.api.Nodepool nodepool = 9;</code>
    * @return Whether the nodepool field is set.
    */
   @java.lang.Override
@@ -684,7 +586,7 @@ public boolean hasNodepool() {
    * This nodepool must be accessible to you or an org you are part of.
    * </pre>
    *
-   * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+   * <code>.clarifai.api.Nodepool nodepool = 9;</code>
    * @return The nodepool.
    */
   @java.lang.Override
@@ -698,14 +600,14 @@ public com.clarifai.grpc.api.Nodepool getNodepool() {
    * This nodepool must be accessible to you or an org you are part of.
    * </pre>
    *
-   * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+   * <code>.clarifai.api.Nodepool nodepool = 9;</code>
    */
   @java.lang.Override
   public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolOrBuilder() {
     return getNodepool();
   }
 
-  public static final int COMPUTE_INFO_FIELD_NUMBER = 13;
+  public static final int COMPUTE_INFO_FIELD_NUMBER = 10;
   private com.clarifai.grpc.api.ComputeInfo computeInfo_;
   /**
    * <pre>
@@ -719,7 +621,7 @@ public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolOrBuilder() {
    * margin for the runner to for sure run the resource).
    * </pre>
    *
-   * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+   * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
    * @return Whether the computeInfo field is set.
    */
   @java.lang.Override
@@ -738,7 +640,7 @@ public boolean hasComputeInfo() {
    * margin for the runner to for sure run the resource).
    * </pre>
    *
-   * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+   * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
    * @return The computeInfo.
    */
   @java.lang.Override
@@ -757,7 +659,7 @@ public com.clarifai.grpc.api.ComputeInfo getComputeInfo() {
    * margin for the runner to for sure run the resource).
    * </pre>
    *
-   * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+   * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
    */
   @java.lang.Override
   public com.clarifai.grpc.api.ComputeInfoOrBuilder getComputeInfoOrBuilder() {
@@ -799,17 +701,14 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     for (int i = 0; i < labels_.size(); i++) {
       com.google.protobuf.GeneratedMessageV3.writeString(output, 7, labels_.getRaw(i));
     }
-    if (objectCase_ == 9) {
-      output.writeMessage(9, (com.clarifai.grpc.api.Model) object_);
-    }
-    if (objectCase_ == 10) {
-      output.writeMessage(10, (com.clarifai.grpc.api.Workflow) object_);
+    if (worker_ != null) {
+      output.writeMessage(8, getWorker());
     }
     if (nodepool_ != null) {
-      output.writeMessage(12, getNodepool());
+      output.writeMessage(9, getNodepool());
     }
     if (computeInfo_ != null) {
-      output.writeMessage(13, getComputeInfo());
+      output.writeMessage(10, getComputeInfo());
     }
     unknownFields.writeTo(output);
   }
@@ -849,21 +748,17 @@ public int getSerializedSize() {
       size += dataSize;
       size += 1 * getLabelsList().size();
     }
-    if (objectCase_ == 9) {
+    if (worker_ != null) {
       size += com.google.protobuf.CodedOutputStream
-        .computeMessageSize(9, (com.clarifai.grpc.api.Model) object_);
-    }
-    if (objectCase_ == 10) {
-      size += com.google.protobuf.CodedOutputStream
-        .computeMessageSize(10, (com.clarifai.grpc.api.Workflow) object_);
+        .computeMessageSize(8, getWorker());
     }
     if (nodepool_ != null) {
       size += com.google.protobuf.CodedOutputStream
-        .computeMessageSize(12, getNodepool());
+        .computeMessageSize(9, getNodepool());
     }
     if (computeInfo_ != null) {
       size += com.google.protobuf.CodedOutputStream
-        .computeMessageSize(13, getComputeInfo());
+        .computeMessageSize(10, getComputeInfo());
     }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
@@ -903,6 +798,11 @@ public boolean equals(final java.lang.Object obj) {
         .equals(other.getUserId())) return false;
     if (!getLabelsList()
         .equals(other.getLabelsList())) return false;
+    if (hasWorker() != other.hasWorker()) return false;
+    if (hasWorker()) {
+      if (!getWorker()
+          .equals(other.getWorker())) return false;
+    }
     if (hasNodepool() != other.hasNodepool()) return false;
     if (hasNodepool()) {
       if (!getNodepool()
@@ -913,19 +813,6 @@ public boolean equals(final java.lang.Object obj) {
       if (!getComputeInfo()
           .equals(other.getComputeInfo())) return false;
     }
-    if (!getObjectCase().equals(other.getObjectCase())) return false;
-    switch (objectCase_) {
-      case 9:
-        if (!getModel()
-            .equals(other.getModel())) return false;
-        break;
-      case 10:
-        if (!getWorkflow()
-            .equals(other.getWorkflow())) return false;
-        break;
-      case 0:
-      default:
-    }
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -959,6 +846,10 @@ public int hashCode() {
       hash = (37 * hash) + LABELS_FIELD_NUMBER;
       hash = (53 * hash) + getLabelsList().hashCode();
     }
+    if (hasWorker()) {
+      hash = (37 * hash) + WORKER_FIELD_NUMBER;
+      hash = (53 * hash) + getWorker().hashCode();
+    }
     if (hasNodepool()) {
       hash = (37 * hash) + NODEPOOL_FIELD_NUMBER;
       hash = (53 * hash) + getNodepool().hashCode();
@@ -967,18 +858,6 @@ public int hashCode() {
       hash = (37 * hash) + COMPUTE_INFO_FIELD_NUMBER;
       hash = (53 * hash) + getComputeInfo().hashCode();
     }
-    switch (objectCase_) {
-      case 9:
-        hash = (37 * hash) + MODEL_FIELD_NUMBER;
-        hash = (53 * hash) + getModel().hashCode();
-        break;
-      case 10:
-        hash = (37 * hash) + WORKFLOW_FIELD_NUMBER;
-        hash = (53 * hash) + getWorkflow().hashCode();
-        break;
-      case 0:
-      default:
-    }
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -1143,6 +1022,12 @@ public Builder clear() {
 
       labels_ = com.google.protobuf.LazyStringArrayList.EMPTY;
       bitField0_ = (bitField0_ & ~0x00000001);
+      if (workerBuilder_ == null) {
+        worker_ = null;
+      } else {
+        worker_ = null;
+        workerBuilder_ = null;
+      }
       if (nodepoolBuilder_ == null) {
         nodepool_ = null;
       } else {
@@ -1155,8 +1040,6 @@ public Builder clear() {
         computeInfo_ = null;
         computeInfoBuilder_ = null;
       }
-      objectCase_ = 0;
-      object_ = null;
       return this;
     }
 
@@ -1207,19 +1090,10 @@ public com.clarifai.grpc.api.Runner buildPartial() {
         bitField0_ = (bitField0_ & ~0x00000001);
       }
       result.labels_ = labels_;
-      if (objectCase_ == 9) {
-        if (modelBuilder_ == null) {
-          result.object_ = object_;
-        } else {
-          result.object_ = modelBuilder_.build();
-        }
-      }
-      if (objectCase_ == 10) {
-        if (workflowBuilder_ == null) {
-          result.object_ = object_;
-        } else {
-          result.object_ = workflowBuilder_.build();
-        }
+      if (workerBuilder_ == null) {
+        result.worker_ = worker_;
+      } else {
+        result.worker_ = workerBuilder_.build();
       }
       if (nodepoolBuilder_ == null) {
         result.nodepool_ = nodepool_;
@@ -1231,7 +1105,6 @@ public com.clarifai.grpc.api.Runner buildPartial() {
       } else {
         result.computeInfo_ = computeInfoBuilder_.build();
       }
-      result.objectCase_ = objectCase_;
       onBuilt();
       return result;
     }
@@ -1311,25 +1184,15 @@ public Builder mergeFrom(com.clarifai.grpc.api.Runner other) {
         }
         onChanged();
       }
+      if (other.hasWorker()) {
+        mergeWorker(other.getWorker());
+      }
       if (other.hasNodepool()) {
         mergeNodepool(other.getNodepool());
       }
       if (other.hasComputeInfo()) {
         mergeComputeInfo(other.getComputeInfo());
       }
-      switch (other.getObjectCase()) {
-        case MODEL: {
-          mergeModel(other.getModel());
-          break;
-        }
-        case WORKFLOW: {
-          mergeWorkflow(other.getWorkflow());
-          break;
-        }
-        case OBJECT_NOT_SET: {
-          break;
-        }
-      }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
       return this;
@@ -1358,27 +1221,12 @@ public Builder mergeFrom(
       }
       return this;
     }
-    private int objectCase_ = 0;
-    private java.lang.Object object_;
-    public ObjectCase
-        getObjectCase() {
-      return ObjectCase.forNumber(
-          objectCase_);
-    }
-
-    public Builder clearObject() {
-      objectCase_ = 0;
-      object_ = null;
-      onChanged();
-      return this;
-    }
-
     private int bitField0_;
 
     private java.lang.Object id_ = "";
     /**
      * <pre>
-     * A unique ID for this app module.
+     * A unique ID for this runner.
      * This is a UUID since runners can be automatically orchestrated.
      * </pre>
      *
@@ -1399,7 +1247,7 @@ public java.lang.String getId() {
     }
     /**
      * <pre>
-     * A unique ID for this app module.
+     * A unique ID for this runner.
      * This is a UUID since runners can be automatically orchestrated.
      * </pre>
      *
@@ -1421,7 +1269,7 @@ public java.lang.String getId() {
     }
     /**
      * <pre>
-     * A unique ID for this app module.
+     * A unique ID for this runner.
      * This is a UUID since runners can be automatically orchestrated.
      * </pre>
      *
@@ -1441,7 +1289,7 @@ public Builder setId(
     }
     /**
      * <pre>
-     * A unique ID for this app module.
+     * A unique ID for this runner.
      * This is a UUID since runners can be automatically orchestrated.
      * </pre>
      *
@@ -1456,7 +1304,7 @@ public Builder clearId() {
     }
     /**
      * <pre>
-     * A unique ID for this app module.
+     * A unique ID for this runner.
      * This is a UUID since runners can be automatically orchestrated.
      * </pre>
      *
@@ -1479,7 +1327,7 @@ public Builder setIdBytes(
     private java.lang.Object description_ = "";
     /**
      * <pre>
-     * A short description for this app module to be used in grids of modules.
+     * short description about the runner.
      * </pre>
      *
      * <code>string description = 2;</code>
@@ -1499,7 +1347,7 @@ public java.lang.String getDescription() {
     }
     /**
      * <pre>
-     * A short description for this app module to be used in grids of modules.
+     * short description about the runner.
      * </pre>
      *
      * <code>string description = 2;</code>
@@ -1520,7 +1368,7 @@ public java.lang.String getDescription() {
     }
     /**
      * <pre>
-     * A short description for this app module to be used in grids of modules.
+     * short description about the runner.
      * </pre>
      *
      * <code>string description = 2;</code>
@@ -1539,7 +1387,7 @@ public Builder setDescription(
     }
     /**
      * <pre>
-     * A short description for this app module to be used in grids of modules.
+     * short description about the runner.
      * </pre>
      *
      * <code>string description = 2;</code>
@@ -1553,7 +1401,7 @@ public Builder clearDescription() {
     }
     /**
      * <pre>
-     * A short description for this app module to be used in grids of modules.
+     * short description about the runner.
      * </pre>
      *
      * <code>string description = 2;</code>
@@ -1577,7 +1425,7 @@ public Builder setDescriptionBytes(
         com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> createdAtBuilder_;
     /**
      * <pre>
-     * When the app module was created.
+     * When the runner was created.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -1588,7 +1436,7 @@ public boolean hasCreatedAt() {
     }
     /**
      * <pre>
-     * When the app module was created.
+     * When the runner was created.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -1603,7 +1451,7 @@ public com.google.protobuf.Timestamp getCreatedAt() {
     }
     /**
      * <pre>
-     * When the app module was created.
+     * When the runner was created.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -1623,7 +1471,7 @@ public Builder setCreatedAt(com.google.protobuf.Timestamp value) {
     }
     /**
      * <pre>
-     * When the app module was created.
+     * When the runner was created.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -1641,7 +1489,7 @@ public Builder setCreatedAt(
     }
     /**
      * <pre>
-     * When the app module was created.
+     * When the runner was created.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -1663,7 +1511,7 @@ public Builder mergeCreatedAt(com.google.protobuf.Timestamp value) {
     }
     /**
      * <pre>
-     * When the app module was created.
+     * When the runner was created.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -1681,7 +1529,7 @@ public Builder clearCreatedAt() {
     }
     /**
      * <pre>
-     * When the app module was created.
+     * When the runner was created.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -1693,7 +1541,7 @@ public com.google.protobuf.Timestamp.Builder getCreatedAtBuilder() {
     }
     /**
      * <pre>
-     * When the app module was created.
+     * When the runner was created.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -1708,7 +1556,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
     }
     /**
      * <pre>
-     * When the app module was created.
+     * When the runner was created.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -1732,7 +1580,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
         com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> modifiedAtBuilder_;
     /**
      * <pre>
-     * When the app module was last modified.
+     * When the runner was last modified.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -1743,7 +1591,7 @@ public boolean hasModifiedAt() {
     }
     /**
      * <pre>
-     * When the app module was last modified.
+     * When the runner was last modified.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -1758,7 +1606,7 @@ public com.google.protobuf.Timestamp getModifiedAt() {
     }
     /**
      * <pre>
-     * When the app module was last modified.
+     * When the runner was last modified.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -1778,7 +1626,7 @@ public Builder setModifiedAt(com.google.protobuf.Timestamp value) {
     }
     /**
      * <pre>
-     * When the app module was last modified.
+     * When the runner was last modified.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -1796,7 +1644,7 @@ public Builder setModifiedAt(
     }
     /**
      * <pre>
-     * When the app module was last modified.
+     * When the runner was last modified.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -1818,7 +1666,7 @@ public Builder mergeModifiedAt(com.google.protobuf.Timestamp value) {
     }
     /**
      * <pre>
-     * When the app module was last modified.
+     * When the runner was last modified.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -1836,7 +1684,7 @@ public Builder clearModifiedAt() {
     }
     /**
      * <pre>
-     * When the app module was last modified.
+     * When the runner was last modified.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -1848,7 +1696,7 @@ public com.google.protobuf.Timestamp.Builder getModifiedAtBuilder() {
     }
     /**
      * <pre>
-     * When the app module was last modified.
+     * When the runner was last modified.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -1863,7 +1711,7 @@ public com.google.protobuf.TimestampOrBuilder getModifiedAtOrBuilder() {
     }
     /**
      * <pre>
-     * When the app module was last modified.
+     * When the runner was last modified.
      * </pre>
      *
      * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -2165,7 +2013,7 @@ private void ensureLabelsIsMutable() {
      *
      * <code>repeated string labels = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Runner.labels is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=4279
+     *     See proto/clarifai/api/resources.proto;l=4298
      * @return A list containing the labels.
      */
     @java.lang.Deprecated public com.google.protobuf.ProtocolStringList
@@ -2179,7 +2027,7 @@ private void ensureLabelsIsMutable() {
      *
      * <code>repeated string labels = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Runner.labels is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=4279
+     *     See proto/clarifai/api/resources.proto;l=4298
      * @return The count of labels.
      */
     @java.lang.Deprecated public int getLabelsCount() {
@@ -2192,7 +2040,7 @@ private void ensureLabelsIsMutable() {
      *
      * <code>repeated string labels = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Runner.labels is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=4279
+     *     See proto/clarifai/api/resources.proto;l=4298
      * @param index The index of the element to return.
      * @return The labels at the given index.
      */
@@ -2206,7 +2054,7 @@ private void ensureLabelsIsMutable() {
      *
      * <code>repeated string labels = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Runner.labels is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=4279
+     *     See proto/clarifai/api/resources.proto;l=4298
      * @param index The index of the value to return.
      * @return The bytes of the labels at the given index.
      */
@@ -2221,7 +2069,7 @@ private void ensureLabelsIsMutable() {
      *
      * <code>repeated string labels = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Runner.labels is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=4279
+     *     See proto/clarifai/api/resources.proto;l=4298
      * @param index The index to set the value at.
      * @param value The labels to set.
      * @return This builder for chaining.
@@ -2243,7 +2091,7 @@ private void ensureLabelsIsMutable() {
      *
      * <code>repeated string labels = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Runner.labels is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=4279
+     *     See proto/clarifai/api/resources.proto;l=4298
      * @param value The labels to add.
      * @return This builder for chaining.
      */
@@ -2264,7 +2112,7 @@ private void ensureLabelsIsMutable() {
      *
      * <code>repeated string labels = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Runner.labels is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=4279
+     *     See proto/clarifai/api/resources.proto;l=4298
      * @param values The labels to add.
      * @return This builder for chaining.
      */
@@ -2283,7 +2131,7 @@ private void ensureLabelsIsMutable() {
      *
      * <code>repeated string labels = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Runner.labels is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=4279
+     *     See proto/clarifai/api/resources.proto;l=4298
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearLabels() {
@@ -2299,7 +2147,7 @@ private void ensureLabelsIsMutable() {
      *
      * <code>repeated string labels = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Runner.labels is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=4279
+     *     See proto/clarifai/api/resources.proto;l=4298
      * @param value The bytes of the labels to add.
      * @return This builder for chaining.
      */
@@ -2315,360 +2163,177 @@ private void ensureLabelsIsMutable() {
       return this;
     }
 
+    private com.clarifai.grpc.api.Worker worker_;
     private com.google.protobuf.SingleFieldBuilderV3<
-        com.clarifai.grpc.api.Model, com.clarifai.grpc.api.Model.Builder, com.clarifai.grpc.api.ModelOrBuilder> modelBuilder_;
+        com.clarifai.grpc.api.Worker, com.clarifai.grpc.api.Worker.Builder, com.clarifai.grpc.api.WorkerOrBuilder> workerBuilder_;
     /**
      * <pre>
-     * Model: match work to only a specific model.
+     * Instead of just matching on labels we might want to have more explicit matching of what
+     * work this runner is looking for.
+     * The thing that the autoscaling config applies to for this nodepool.
      * </pre>
      *
-     * <code>.clarifai.api.Model model = 9;</code>
-     * @return Whether the model field is set.
+     * <code>.clarifai.api.Worker worker = 8;</code>
+     * @return Whether the worker field is set.
      */
-    @java.lang.Override
-    public boolean hasModel() {
-      return objectCase_ == 9;
+    public boolean hasWorker() {
+      return workerBuilder_ != null || worker_ != null;
     }
     /**
      * <pre>
-     * Model: match work to only a specific model.
+     * Instead of just matching on labels we might want to have more explicit matching of what
+     * work this runner is looking for.
+     * The thing that the autoscaling config applies to for this nodepool.
      * </pre>
      *
-     * <code>.clarifai.api.Model model = 9;</code>
-     * @return The model.
+     * <code>.clarifai.api.Worker worker = 8;</code>
+     * @return The worker.
      */
-    @java.lang.Override
-    public com.clarifai.grpc.api.Model getModel() {
-      if (modelBuilder_ == null) {
-        if (objectCase_ == 9) {
-          return (com.clarifai.grpc.api.Model) object_;
-        }
-        return com.clarifai.grpc.api.Model.getDefaultInstance();
+    public com.clarifai.grpc.api.Worker getWorker() {
+      if (workerBuilder_ == null) {
+        return worker_ == null ? com.clarifai.grpc.api.Worker.getDefaultInstance() : worker_;
       } else {
-        if (objectCase_ == 9) {
-          return modelBuilder_.getMessage();
-        }
-        return com.clarifai.grpc.api.Model.getDefaultInstance();
+        return workerBuilder_.getMessage();
       }
     }
     /**
      * <pre>
-     * Model: match work to only a specific model.
+     * Instead of just matching on labels we might want to have more explicit matching of what
+     * work this runner is looking for.
+     * The thing that the autoscaling config applies to for this nodepool.
      * </pre>
      *
-     * <code>.clarifai.api.Model model = 9;</code>
+     * <code>.clarifai.api.Worker worker = 8;</code>
      */
-    public Builder setModel(com.clarifai.grpc.api.Model value) {
-      if (modelBuilder_ == null) {
+    public Builder setWorker(com.clarifai.grpc.api.Worker value) {
+      if (workerBuilder_ == null) {
         if (value == null) {
           throw new NullPointerException();
         }
-        object_ = value;
+        worker_ = value;
         onChanged();
       } else {
-        modelBuilder_.setMessage(value);
+        workerBuilder_.setMessage(value);
       }
-      objectCase_ = 9;
+
       return this;
     }
     /**
      * <pre>
-     * Model: match work to only a specific model.
+     * Instead of just matching on labels we might want to have more explicit matching of what
+     * work this runner is looking for.
+     * The thing that the autoscaling config applies to for this nodepool.
      * </pre>
      *
-     * <code>.clarifai.api.Model model = 9;</code>
+     * <code>.clarifai.api.Worker worker = 8;</code>
      */
-    public Builder setModel(
-        com.clarifai.grpc.api.Model.Builder builderForValue) {
-      if (modelBuilder_ == null) {
-        object_ = builderForValue.build();
+    public Builder setWorker(
+        com.clarifai.grpc.api.Worker.Builder builderForValue) {
+      if (workerBuilder_ == null) {
+        worker_ = builderForValue.build();
         onChanged();
       } else {
-        modelBuilder_.setMessage(builderForValue.build());
+        workerBuilder_.setMessage(builderForValue.build());
       }
-      objectCase_ = 9;
+
       return this;
     }
     /**
      * <pre>
-     * Model: match work to only a specific model.
+     * Instead of just matching on labels we might want to have more explicit matching of what
+     * work this runner is looking for.
+     * The thing that the autoscaling config applies to for this nodepool.
      * </pre>
      *
-     * <code>.clarifai.api.Model model = 9;</code>
+     * <code>.clarifai.api.Worker worker = 8;</code>
      */
-    public Builder mergeModel(com.clarifai.grpc.api.Model value) {
-      if (modelBuilder_ == null) {
-        if (objectCase_ == 9 &&
-            object_ != com.clarifai.grpc.api.Model.getDefaultInstance()) {
-          object_ = com.clarifai.grpc.api.Model.newBuilder((com.clarifai.grpc.api.Model) object_)
-              .mergeFrom(value).buildPartial();
+    public Builder mergeWorker(com.clarifai.grpc.api.Worker value) {
+      if (workerBuilder_ == null) {
+        if (worker_ != null) {
+          worker_ =
+            com.clarifai.grpc.api.Worker.newBuilder(worker_).mergeFrom(value).buildPartial();
         } else {
-          object_ = value;
+          worker_ = value;
         }
         onChanged();
       } else {
-        if (objectCase_ == 9) {
-          modelBuilder_.mergeFrom(value);
-        } else {
-          modelBuilder_.setMessage(value);
-        }
+        workerBuilder_.mergeFrom(value);
       }
-      objectCase_ = 9;
-      return this;
-    }
-    /**
-     * <pre>
-     * Model: match work to only a specific model.
-     * </pre>
-     *
-     * <code>.clarifai.api.Model model = 9;</code>
-     */
-    public Builder clearModel() {
-      if (modelBuilder_ == null) {
-        if (objectCase_ == 9) {
-          objectCase_ = 0;
-          object_ = null;
-          onChanged();
-        }
-      } else {
-        if (objectCase_ == 9) {
-          objectCase_ = 0;
-          object_ = null;
-        }
-        modelBuilder_.clear();
-      }
-      return this;
-    }
-    /**
-     * <pre>
-     * Model: match work to only a specific model.
-     * </pre>
-     *
-     * <code>.clarifai.api.Model model = 9;</code>
-     */
-    public com.clarifai.grpc.api.Model.Builder getModelBuilder() {
-      return getModelFieldBuilder().getBuilder();
-    }
-    /**
-     * <pre>
-     * Model: match work to only a specific model.
-     * </pre>
-     *
-     * <code>.clarifai.api.Model model = 9;</code>
-     */
-    @java.lang.Override
-    public com.clarifai.grpc.api.ModelOrBuilder getModelOrBuilder() {
-      if ((objectCase_ == 9) && (modelBuilder_ != null)) {
-        return modelBuilder_.getMessageOrBuilder();
-      } else {
-        if (objectCase_ == 9) {
-          return (com.clarifai.grpc.api.Model) object_;
-        }
-        return com.clarifai.grpc.api.Model.getDefaultInstance();
-      }
-    }
-    /**
-     * <pre>
-     * Model: match work to only a specific model.
-     * </pre>
-     *
-     * <code>.clarifai.api.Model model = 9;</code>
-     */
-    private com.google.protobuf.SingleFieldBuilderV3<
-        com.clarifai.grpc.api.Model, com.clarifai.grpc.api.Model.Builder, com.clarifai.grpc.api.ModelOrBuilder> 
-        getModelFieldBuilder() {
-      if (modelBuilder_ == null) {
-        if (!(objectCase_ == 9)) {
-          object_ = com.clarifai.grpc.api.Model.getDefaultInstance();
-        }
-        modelBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-            com.clarifai.grpc.api.Model, com.clarifai.grpc.api.Model.Builder, com.clarifai.grpc.api.ModelOrBuilder>(
-                (com.clarifai.grpc.api.Model) object_,
-                getParentForChildren(),
-                isClean());
-        object_ = null;
-      }
-      objectCase_ = 9;
-      onChanged();;
-      return modelBuilder_;
-    }
 
-    private com.google.protobuf.SingleFieldBuilderV3<
-        com.clarifai.grpc.api.Workflow, com.clarifai.grpc.api.Workflow.Builder, com.clarifai.grpc.api.WorkflowOrBuilder> workflowBuilder_;
-    /**
-     * <pre>
-     * Workflow: match work to only a specific workflow.
-     * </pre>
-     *
-     * <code>.clarifai.api.Workflow workflow = 10;</code>
-     * @return Whether the workflow field is set.
-     */
-    @java.lang.Override
-    public boolean hasWorkflow() {
-      return objectCase_ == 10;
-    }
-    /**
-     * <pre>
-     * Workflow: match work to only a specific workflow.
-     * </pre>
-     *
-     * <code>.clarifai.api.Workflow workflow = 10;</code>
-     * @return The workflow.
-     */
-    @java.lang.Override
-    public com.clarifai.grpc.api.Workflow getWorkflow() {
-      if (workflowBuilder_ == null) {
-        if (objectCase_ == 10) {
-          return (com.clarifai.grpc.api.Workflow) object_;
-        }
-        return com.clarifai.grpc.api.Workflow.getDefaultInstance();
-      } else {
-        if (objectCase_ == 10) {
-          return workflowBuilder_.getMessage();
-        }
-        return com.clarifai.grpc.api.Workflow.getDefaultInstance();
-      }
-    }
-    /**
-     * <pre>
-     * Workflow: match work to only a specific workflow.
-     * </pre>
-     *
-     * <code>.clarifai.api.Workflow workflow = 10;</code>
-     */
-    public Builder setWorkflow(com.clarifai.grpc.api.Workflow value) {
-      if (workflowBuilder_ == null) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        object_ = value;
-        onChanged();
-      } else {
-        workflowBuilder_.setMessage(value);
-      }
-      objectCase_ = 10;
       return this;
     }
     /**
      * <pre>
-     * Workflow: match work to only a specific workflow.
+     * Instead of just matching on labels we might want to have more explicit matching of what
+     * work this runner is looking for.
+     * The thing that the autoscaling config applies to for this nodepool.
      * </pre>
      *
-     * <code>.clarifai.api.Workflow workflow = 10;</code>
+     * <code>.clarifai.api.Worker worker = 8;</code>
      */
-    public Builder setWorkflow(
-        com.clarifai.grpc.api.Workflow.Builder builderForValue) {
-      if (workflowBuilder_ == null) {
-        object_ = builderForValue.build();
+    public Builder clearWorker() {
+      if (workerBuilder_ == null) {
+        worker_ = null;
         onChanged();
       } else {
-        workflowBuilder_.setMessage(builderForValue.build());
-      }
-      objectCase_ = 10;
-      return this;
-    }
-    /**
-     * <pre>
-     * Workflow: match work to only a specific workflow.
-     * </pre>
-     *
-     * <code>.clarifai.api.Workflow workflow = 10;</code>
-     */
-    public Builder mergeWorkflow(com.clarifai.grpc.api.Workflow value) {
-      if (workflowBuilder_ == null) {
-        if (objectCase_ == 10 &&
-            object_ != com.clarifai.grpc.api.Workflow.getDefaultInstance()) {
-          object_ = com.clarifai.grpc.api.Workflow.newBuilder((com.clarifai.grpc.api.Workflow) object_)
-              .mergeFrom(value).buildPartial();
-        } else {
-          object_ = value;
-        }
-        onChanged();
-      } else {
-        if (objectCase_ == 10) {
-          workflowBuilder_.mergeFrom(value);
-        } else {
-          workflowBuilder_.setMessage(value);
-        }
-      }
-      objectCase_ = 10;
-      return this;
-    }
-    /**
-     * <pre>
-     * Workflow: match work to only a specific workflow.
-     * </pre>
-     *
-     * <code>.clarifai.api.Workflow workflow = 10;</code>
-     */
-    public Builder clearWorkflow() {
-      if (workflowBuilder_ == null) {
-        if (objectCase_ == 10) {
-          objectCase_ = 0;
-          object_ = null;
-          onChanged();
-        }
-      } else {
-        if (objectCase_ == 10) {
-          objectCase_ = 0;
-          object_ = null;
-        }
-        workflowBuilder_.clear();
+        worker_ = null;
+        workerBuilder_ = null;
       }
+
       return this;
     }
     /**
      * <pre>
-     * Workflow: match work to only a specific workflow.
+     * Instead of just matching on labels we might want to have more explicit matching of what
+     * work this runner is looking for.
+     * The thing that the autoscaling config applies to for this nodepool.
      * </pre>
      *
-     * <code>.clarifai.api.Workflow workflow = 10;</code>
+     * <code>.clarifai.api.Worker worker = 8;</code>
      */
-    public com.clarifai.grpc.api.Workflow.Builder getWorkflowBuilder() {
-      return getWorkflowFieldBuilder().getBuilder();
+    public com.clarifai.grpc.api.Worker.Builder getWorkerBuilder() {
+      
+      onChanged();
+      return getWorkerFieldBuilder().getBuilder();
     }
     /**
      * <pre>
-     * Workflow: match work to only a specific workflow.
+     * Instead of just matching on labels we might want to have more explicit matching of what
+     * work this runner is looking for.
+     * The thing that the autoscaling config applies to for this nodepool.
      * </pre>
      *
-     * <code>.clarifai.api.Workflow workflow = 10;</code>
+     * <code>.clarifai.api.Worker worker = 8;</code>
      */
-    @java.lang.Override
-    public com.clarifai.grpc.api.WorkflowOrBuilder getWorkflowOrBuilder() {
-      if ((objectCase_ == 10) && (workflowBuilder_ != null)) {
-        return workflowBuilder_.getMessageOrBuilder();
+    public com.clarifai.grpc.api.WorkerOrBuilder getWorkerOrBuilder() {
+      if (workerBuilder_ != null) {
+        return workerBuilder_.getMessageOrBuilder();
       } else {
-        if (objectCase_ == 10) {
-          return (com.clarifai.grpc.api.Workflow) object_;
-        }
-        return com.clarifai.grpc.api.Workflow.getDefaultInstance();
+        return worker_ == null ?
+            com.clarifai.grpc.api.Worker.getDefaultInstance() : worker_;
       }
     }
     /**
      * <pre>
-     * Workflow: match work to only a specific workflow.
+     * Instead of just matching on labels we might want to have more explicit matching of what
+     * work this runner is looking for.
+     * The thing that the autoscaling config applies to for this nodepool.
      * </pre>
      *
-     * <code>.clarifai.api.Workflow workflow = 10;</code>
+     * <code>.clarifai.api.Worker worker = 8;</code>
      */
     private com.google.protobuf.SingleFieldBuilderV3<
-        com.clarifai.grpc.api.Workflow, com.clarifai.grpc.api.Workflow.Builder, com.clarifai.grpc.api.WorkflowOrBuilder> 
-        getWorkflowFieldBuilder() {
-      if (workflowBuilder_ == null) {
-        if (!(objectCase_ == 10)) {
-          object_ = com.clarifai.grpc.api.Workflow.getDefaultInstance();
-        }
-        workflowBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-            com.clarifai.grpc.api.Workflow, com.clarifai.grpc.api.Workflow.Builder, com.clarifai.grpc.api.WorkflowOrBuilder>(
-                (com.clarifai.grpc.api.Workflow) object_,
+        com.clarifai.grpc.api.Worker, com.clarifai.grpc.api.Worker.Builder, com.clarifai.grpc.api.WorkerOrBuilder> 
+        getWorkerFieldBuilder() {
+      if (workerBuilder_ == null) {
+        workerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.Worker, com.clarifai.grpc.api.Worker.Builder, com.clarifai.grpc.api.WorkerOrBuilder>(
+                getWorker(),
                 getParentForChildren(),
                 isClean());
-        object_ = null;
+        worker_ = null;
       }
-      objectCase_ = 10;
-      onChanged();;
-      return workflowBuilder_;
+      return workerBuilder_;
     }
 
     private com.clarifai.grpc.api.Nodepool nodepool_;
@@ -2681,7 +2346,7 @@ public com.clarifai.grpc.api.WorkflowOrBuilder getWorkflowOrBuilder() {
      * This nodepool must be accessible to you or an org you are part of.
      * </pre>
      *
-     * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+     * <code>.clarifai.api.Nodepool nodepool = 9;</code>
      * @return Whether the nodepool field is set.
      */
     public boolean hasNodepool() {
@@ -2694,7 +2359,7 @@ public boolean hasNodepool() {
      * This nodepool must be accessible to you or an org you are part of.
      * </pre>
      *
-     * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+     * <code>.clarifai.api.Nodepool nodepool = 9;</code>
      * @return The nodepool.
      */
     public com.clarifai.grpc.api.Nodepool getNodepool() {
@@ -2711,7 +2376,7 @@ public com.clarifai.grpc.api.Nodepool getNodepool() {
      * This nodepool must be accessible to you or an org you are part of.
      * </pre>
      *
-     * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+     * <code>.clarifai.api.Nodepool nodepool = 9;</code>
      */
     public Builder setNodepool(com.clarifai.grpc.api.Nodepool value) {
       if (nodepoolBuilder_ == null) {
@@ -2733,7 +2398,7 @@ public Builder setNodepool(com.clarifai.grpc.api.Nodepool value) {
      * This nodepool must be accessible to you or an org you are part of.
      * </pre>
      *
-     * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+     * <code>.clarifai.api.Nodepool nodepool = 9;</code>
      */
     public Builder setNodepool(
         com.clarifai.grpc.api.Nodepool.Builder builderForValue) {
@@ -2753,7 +2418,7 @@ public Builder setNodepool(
      * This nodepool must be accessible to you or an org you are part of.
      * </pre>
      *
-     * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+     * <code>.clarifai.api.Nodepool nodepool = 9;</code>
      */
     public Builder mergeNodepool(com.clarifai.grpc.api.Nodepool value) {
       if (nodepoolBuilder_ == null) {
@@ -2777,7 +2442,7 @@ public Builder mergeNodepool(com.clarifai.grpc.api.Nodepool value) {
      * This nodepool must be accessible to you or an org you are part of.
      * </pre>
      *
-     * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+     * <code>.clarifai.api.Nodepool nodepool = 9;</code>
      */
     public Builder clearNodepool() {
       if (nodepoolBuilder_ == null) {
@@ -2797,7 +2462,7 @@ public Builder clearNodepool() {
      * This nodepool must be accessible to you or an org you are part of.
      * </pre>
      *
-     * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+     * <code>.clarifai.api.Nodepool nodepool = 9;</code>
      */
     public com.clarifai.grpc.api.Nodepool.Builder getNodepoolBuilder() {
       
@@ -2811,7 +2476,7 @@ public com.clarifai.grpc.api.Nodepool.Builder getNodepoolBuilder() {
      * This nodepool must be accessible to you or an org you are part of.
      * </pre>
      *
-     * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+     * <code>.clarifai.api.Nodepool nodepool = 9;</code>
      */
     public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolOrBuilder() {
       if (nodepoolBuilder_ != null) {
@@ -2828,7 +2493,7 @@ public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolOrBuilder() {
      * This nodepool must be accessible to you or an org you are part of.
      * </pre>
      *
-     * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+     * <code>.clarifai.api.Nodepool nodepool = 9;</code>
      */
     private com.google.protobuf.SingleFieldBuilderV3<
         com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder> 
@@ -2859,7 +2524,7 @@ public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolOrBuilder() {
      * margin for the runner to for sure run the resource).
      * </pre>
      *
-     * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+     * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
      * @return Whether the computeInfo field is set.
      */
     public boolean hasComputeInfo() {
@@ -2877,7 +2542,7 @@ public boolean hasComputeInfo() {
      * margin for the runner to for sure run the resource).
      * </pre>
      *
-     * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+     * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
      * @return The computeInfo.
      */
     public com.clarifai.grpc.api.ComputeInfo getComputeInfo() {
@@ -2899,7 +2564,7 @@ public com.clarifai.grpc.api.ComputeInfo getComputeInfo() {
      * margin for the runner to for sure run the resource).
      * </pre>
      *
-     * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+     * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
      */
     public Builder setComputeInfo(com.clarifai.grpc.api.ComputeInfo value) {
       if (computeInfoBuilder_ == null) {
@@ -2926,7 +2591,7 @@ public Builder setComputeInfo(com.clarifai.grpc.api.ComputeInfo value) {
      * margin for the runner to for sure run the resource).
      * </pre>
      *
-     * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+     * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
      */
     public Builder setComputeInfo(
         com.clarifai.grpc.api.ComputeInfo.Builder builderForValue) {
@@ -2951,7 +2616,7 @@ public Builder setComputeInfo(
      * margin for the runner to for sure run the resource).
      * </pre>
      *
-     * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+     * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
      */
     public Builder mergeComputeInfo(com.clarifai.grpc.api.ComputeInfo value) {
       if (computeInfoBuilder_ == null) {
@@ -2980,7 +2645,7 @@ public Builder mergeComputeInfo(com.clarifai.grpc.api.ComputeInfo value) {
      * margin for the runner to for sure run the resource).
      * </pre>
      *
-     * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+     * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
      */
     public Builder clearComputeInfo() {
       if (computeInfoBuilder_ == null) {
@@ -3005,7 +2670,7 @@ public Builder clearComputeInfo() {
      * margin for the runner to for sure run the resource).
      * </pre>
      *
-     * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+     * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
      */
     public com.clarifai.grpc.api.ComputeInfo.Builder getComputeInfoBuilder() {
       
@@ -3024,7 +2689,7 @@ public com.clarifai.grpc.api.ComputeInfo.Builder getComputeInfoBuilder() {
      * margin for the runner to for sure run the resource).
      * </pre>
      *
-     * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+     * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
      */
     public com.clarifai.grpc.api.ComputeInfoOrBuilder getComputeInfoOrBuilder() {
       if (computeInfoBuilder_ != null) {
@@ -3046,7 +2711,7 @@ public com.clarifai.grpc.api.ComputeInfoOrBuilder getComputeInfoOrBuilder() {
      * margin for the runner to for sure run the resource).
      * </pre>
      *
-     * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+     * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
      */
     private com.google.protobuf.SingleFieldBuilderV3<
         com.clarifai.grpc.api.ComputeInfo, com.clarifai.grpc.api.ComputeInfo.Builder, com.clarifai.grpc.api.ComputeInfoOrBuilder> 
diff --git a/src/main/java/com/clarifai/grpc/api/RunnerOrBuilder.java b/src/main/java/com/clarifai/grpc/api/RunnerOrBuilder.java
index 08f3f4d..22dc54b 100644
--- a/src/main/java/com/clarifai/grpc/api/RunnerOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/RunnerOrBuilder.java
@@ -9,7 +9,7 @@ public interface RunnerOrBuilder extends
 
   /**
    * <pre>
-   * A unique ID for this app module.
+   * A unique ID for this runner.
    * This is a UUID since runners can be automatically orchestrated.
    * </pre>
    *
@@ -19,7 +19,7 @@ public interface RunnerOrBuilder extends
   java.lang.String getId();
   /**
    * <pre>
-   * A unique ID for this app module.
+   * A unique ID for this runner.
    * This is a UUID since runners can be automatically orchestrated.
    * </pre>
    *
@@ -31,7 +31,7 @@ public interface RunnerOrBuilder extends
 
   /**
    * <pre>
-   * A short description for this app module to be used in grids of modules.
+   * short description about the runner.
    * </pre>
    *
    * <code>string description = 2;</code>
@@ -40,7 +40,7 @@ public interface RunnerOrBuilder extends
   java.lang.String getDescription();
   /**
    * <pre>
-   * A short description for this app module to be used in grids of modules.
+   * short description about the runner.
    * </pre>
    *
    * <code>string description = 2;</code>
@@ -51,7 +51,7 @@ public interface RunnerOrBuilder extends
 
   /**
    * <pre>
-   * When the app module was created.
+   * When the runner was created.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -60,7 +60,7 @@ public interface RunnerOrBuilder extends
   boolean hasCreatedAt();
   /**
    * <pre>
-   * When the app module was created.
+   * When the runner was created.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -69,7 +69,7 @@ public interface RunnerOrBuilder extends
   com.google.protobuf.Timestamp getCreatedAt();
   /**
    * <pre>
-   * When the app module was created.
+   * When the runner was created.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp created_at = 3;</code>
@@ -78,7 +78,7 @@ public interface RunnerOrBuilder extends
 
   /**
    * <pre>
-   * When the app module was last modified.
+   * When the runner was last modified.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -87,7 +87,7 @@ public interface RunnerOrBuilder extends
   boolean hasModifiedAt();
   /**
    * <pre>
-   * When the app module was last modified.
+   * When the runner was last modified.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -96,7 +96,7 @@ public interface RunnerOrBuilder extends
   com.google.protobuf.Timestamp getModifiedAt();
   /**
    * <pre>
-   * When the app module was last modified.
+   * When the runner was last modified.
    * </pre>
    *
    * <code>.google.protobuf.Timestamp modified_at = 4;</code>
@@ -163,7 +163,7 @@ public interface RunnerOrBuilder extends
    *
    * <code>repeated string labels = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Runner.labels is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=4279
+   *     See proto/clarifai/api/resources.proto;l=4298
    * @return A list containing the labels.
    */
   @java.lang.Deprecated java.util.List<java.lang.String>
@@ -175,7 +175,7 @@ public interface RunnerOrBuilder extends
    *
    * <code>repeated string labels = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Runner.labels is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=4279
+   *     See proto/clarifai/api/resources.proto;l=4298
    * @return The count of labels.
    */
   @java.lang.Deprecated int getLabelsCount();
@@ -186,7 +186,7 @@ public interface RunnerOrBuilder extends
    *
    * <code>repeated string labels = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Runner.labels is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=4279
+   *     See proto/clarifai/api/resources.proto;l=4298
    * @param index The index of the element to return.
    * @return The labels at the given index.
    */
@@ -198,7 +198,7 @@ public interface RunnerOrBuilder extends
    *
    * <code>repeated string labels = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Runner.labels is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=4279
+   *     See proto/clarifai/api/resources.proto;l=4298
    * @param index The index of the value to return.
    * @return The bytes of the labels at the given index.
    */
@@ -207,57 +207,36 @@ public interface RunnerOrBuilder extends
 
   /**
    * <pre>
-   * Model: match work to only a specific model.
+   * Instead of just matching on labels we might want to have more explicit matching of what
+   * work this runner is looking for.
+   * The thing that the autoscaling config applies to for this nodepool.
    * </pre>
    *
-   * <code>.clarifai.api.Model model = 9;</code>
-   * @return Whether the model field is set.
+   * <code>.clarifai.api.Worker worker = 8;</code>
+   * @return Whether the worker field is set.
    */
-  boolean hasModel();
+  boolean hasWorker();
   /**
    * <pre>
-   * Model: match work to only a specific model.
+   * Instead of just matching on labels we might want to have more explicit matching of what
+   * work this runner is looking for.
+   * The thing that the autoscaling config applies to for this nodepool.
    * </pre>
    *
-   * <code>.clarifai.api.Model model = 9;</code>
-   * @return The model.
+   * <code>.clarifai.api.Worker worker = 8;</code>
+   * @return The worker.
    */
-  com.clarifai.grpc.api.Model getModel();
+  com.clarifai.grpc.api.Worker getWorker();
   /**
    * <pre>
-   * Model: match work to only a specific model.
+   * Instead of just matching on labels we might want to have more explicit matching of what
+   * work this runner is looking for.
+   * The thing that the autoscaling config applies to for this nodepool.
    * </pre>
    *
-   * <code>.clarifai.api.Model model = 9;</code>
+   * <code>.clarifai.api.Worker worker = 8;</code>
    */
-  com.clarifai.grpc.api.ModelOrBuilder getModelOrBuilder();
-
-  /**
-   * <pre>
-   * Workflow: match work to only a specific workflow.
-   * </pre>
-   *
-   * <code>.clarifai.api.Workflow workflow = 10;</code>
-   * @return Whether the workflow field is set.
-   */
-  boolean hasWorkflow();
-  /**
-   * <pre>
-   * Workflow: match work to only a specific workflow.
-   * </pre>
-   *
-   * <code>.clarifai.api.Workflow workflow = 10;</code>
-   * @return The workflow.
-   */
-  com.clarifai.grpc.api.Workflow getWorkflow();
-  /**
-   * <pre>
-   * Workflow: match work to only a specific workflow.
-   * </pre>
-   *
-   * <code>.clarifai.api.Workflow workflow = 10;</code>
-   */
-  com.clarifai.grpc.api.WorkflowOrBuilder getWorkflowOrBuilder();
+  com.clarifai.grpc.api.WorkerOrBuilder getWorkerOrBuilder();
 
   /**
    * <pre>
@@ -266,7 +245,7 @@ public interface RunnerOrBuilder extends
    * This nodepool must be accessible to you or an org you are part of.
    * </pre>
    *
-   * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+   * <code>.clarifai.api.Nodepool nodepool = 9;</code>
    * @return Whether the nodepool field is set.
    */
   boolean hasNodepool();
@@ -277,7 +256,7 @@ public interface RunnerOrBuilder extends
    * This nodepool must be accessible to you or an org you are part of.
    * </pre>
    *
-   * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+   * <code>.clarifai.api.Nodepool nodepool = 9;</code>
    * @return The nodepool.
    */
   com.clarifai.grpc.api.Nodepool getNodepool();
@@ -288,7 +267,7 @@ public interface RunnerOrBuilder extends
    * This nodepool must be accessible to you or an org you are part of.
    * </pre>
    *
-   * <code>.clarifai.api.Nodepool nodepool = 12;</code>
+   * <code>.clarifai.api.Nodepool nodepool = 9;</code>
    */
   com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolOrBuilder();
 
@@ -304,7 +283,7 @@ public interface RunnerOrBuilder extends
    * margin for the runner to for sure run the resource).
    * </pre>
    *
-   * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+   * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
    * @return Whether the computeInfo field is set.
    */
   boolean hasComputeInfo();
@@ -320,7 +299,7 @@ public interface RunnerOrBuilder extends
    * margin for the runner to for sure run the resource).
    * </pre>
    *
-   * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+   * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
    * @return The computeInfo.
    */
   com.clarifai.grpc.api.ComputeInfo getComputeInfo();
@@ -336,9 +315,7 @@ public interface RunnerOrBuilder extends
    * margin for the runner to for sure run the resource).
    * </pre>
    *
-   * <code>.clarifai.api.ComputeInfo compute_info = 13;</code>
+   * <code>.clarifai.api.ComputeInfo compute_info = 10;</code>
    */
   com.clarifai.grpc.api.ComputeInfoOrBuilder getComputeInfoOrBuilder();
-
-  public com.clarifai.grpc.api.Runner.ObjectCase getObjectCase();
 }
diff --git a/src/main/java/com/clarifai/grpc/api/Service.java b/src/main/java/com/clarifai/grpc/api/Service.java
index 6395c1c..2d7a368 100644
--- a/src/main/java/com/clarifai/grpc/api/Service.java
+++ b/src/main/java/com/clarifai/grpc/api/Service.java
@@ -1684,6 +1684,71 @@ public static void registerAllExtensions(
   static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_clarifai_api_MultiTrainingTimeEstimateResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_GetComputeClusterRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_GetComputeClusterRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_ListComputeClustersRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_ListComputeClustersRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_PostComputeClustersRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_PostComputeClustersRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_DeleteComputeClustersRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_DeleteComputeClustersRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_SingleComputeClusterResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_SingleComputeClusterResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_MultiComputeClusterResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_MultiComputeClusterResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_GetNodepoolRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_GetNodepoolRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_ListNodepoolsRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_ListNodepoolsRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_PostNodepoolsRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_PostNodepoolsRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_PatchNodepoolsRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_PatchNodepoolsRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_DeleteNodepoolsRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_DeleteNodepoolsRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_SingleNodepoolResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_SingleNodepoolResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_clarifai_api_MultiNodepoolResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_clarifai_api_MultiNodepoolResponse_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -2190,2007 +2255,2100 @@ public static void registerAllExtensions(
       "ta\"\201\001\n\037PostModelVersionsUploadResponse\022+" +
       "\n\006status\030\001 \001(\0132\033.clarifai.api.status.Sta" +
       "tus\022\027\n\017bytes_remaining\030\002 \001(\004\022\030\n\020model_ve" +
-      "rsion_id\030\003 \001(\t\"\251\001\n\035PostModelVersionsUplo" +
+      "rsion_id\030\003 \001(\t\"\270\001\n\035PostModelVersionsUplo" +
       "adConfig\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai" +
       ".api.UserAppIDSet\022\020\n\010model_id\030\002 \001(\t\0221\n\rm" +
       "odel_version\030\003 \001(\0132\032.clarifai.api.ModelV" +
-      "ersion\022\022\n\ntotal_size\030\004 \001(\004\"v\n\035PutModelVe" +
-      "rsionExportsRequest\022/\n\013user_app_id\030\001 \001(\013" +
-      "2\032.clarifai.api.UserAppIDSet\022\020\n\010model_id" +
-      "\030\002 \001(\t\022\022\n\nversion_id\030\003 \001(\t\"u\n\034GetModelVe" +
-      "rsionExportRequest\022/\n\013user_app_id\030\001 \001(\0132" +
-      "\032.clarifai.api.UserAppIDSet\022\020\n\010model_id\030" +
-      "\002 \001(\t\022\022\n\nversion_id\030\003 \001(\t\"\207\001\n SingleMode" +
-      "lVersionExportResponse\022+\n\006status\030\001 \001(\0132\033" +
-      ".clarifai.api.status.Status\0226\n\006export\030\002 " +
-      "\001(\0132 .clarifai.api.ModelVersionExportB\004\200" +
-      "\265\030\001\"\261\001\n$PostWorkflowVersionsUnPublishReq" +
-      "uest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api" +
-      ".UserAppIDSet\022\023\n\013workflow_id\030\002 \001(\t\022C\n\014pu" +
-      "blications\030\003 \003(\0132-.clarifai.api.Workflow" +
-      "VersionUnPublishRequest\"\255\001\n\"PostWorkflow" +
-      "VersionsPublishRequest\022/\n\013user_app_id\030\001 " +
-      "\001(\0132\032.clarifai.api.UserAppIDSet\022\023\n\013workf" +
-      "low_id\030\002 \001(\t\022A\n\014publications\030\003 \003(\0132+.cla" +
-      "rifai.api.WorkflowVersionPublishRequest\"" +
-      "3\n\035WorkflowVersionPublishRequest\022\022\n\nvers" +
-      "ion_id\030\001 \001(\t\"5\n\037WorkflowVersionUnPublish" +
-      "Request\022\022\n\nversion_id\030\001 \001(\t\"0\n\032ModelVers" +
-      "ionPublishRequest\022\022\n\nversion_id\030\001 \001(\t\"\244\001" +
-      "\n\037PostModelVersionsPublishRequest\022/\n\013use" +
+      "ersion\022\022\n\ntotal_size\030\004 \001(\004\022\r\n\005is_v3\030\005 \001(" +
+      "\010\"v\n\035PutModelVersionExportsRequest\022/\n\013us" +
+      "er_app_id\030\001 \001(\0132\032.clarifai.api.UserAppID" +
+      "Set\022\020\n\010model_id\030\002 \001(\t\022\022\n\nversion_id\030\003 \001(" +
+      "\t\"u\n\034GetModelVersionExportRequest\022/\n\013use" +
       "r_app_id\030\001 \001(\0132\032.clarifai.api.UserAppIDS" +
-      "et\022\020\n\010model_id\030\002 \001(\t\022>\n\014publications\030\003 \003" +
-      "(\0132(.clarifai.api.ModelVersionPublishReq" +
-      "uest\"2\n\034ModelVersionUnpublishRequest\022\022\n\n" +
-      "version_id\030\001 \001(\t\"\250\001\n!PostModelVersionsUn" +
-      "PublishRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cl" +
-      "arifai.api.UserAppIDSet\022\020\n\010model_id\030\002 \001(" +
-      "\t\022@\n\014publications\030\003 \003(\0132*.clarifai.api.M" +
-      "odelVersionUnpublishRequest\"z\n\026PostEvalu" +
-      "ationsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cla" +
-      "rifai.api.UserAppIDSet\022/\n\014eval_metrics\030\002" +
-      " \003(\0132\031.clarifai.api.EvalMetrics\"\263\004\n\026List" +
-      "EvaluationsRequest\022/\n\013user_app_id\030\001 \001(\0132" +
-      "\032.clarifai.api.UserAppIDSet\022\014\n\004page\030\002 \001(" +
-      "\r\022\020\n\010per_page\030\003 \001(\r\022\026\n\016sort_ascending\030\004 " +
-      "\001(\010\022\030\n\016sort_by_app_id\030\005 \001(\010H\000\022\031\n\017sort_by" +
-      "_roc_auc\030\006 \001(\010H\000\022\024\n\nsort_by_f1\030\007 \001(\010H\000\022\034" +
-      "\n\022sort_by_created_at\030\010 \001(\010H\000\022$\n\032sort_by_" +
-      "mean_avg_precision\030\t \001(\010H\000\022\033\n\021sort_by_pr" +
-      "ecision\030\n \001(\010H\000\022\030\n\016sort_by_recall\030\013 \001(\010H" +
-      "\000\022\032\n\020sort_by_model_id\030\020 \001(\010H\000\022!\n\027sort_by" +
-      "_eval_dataset_id\030\021 \001(\010H\000\022\"\n\030sort_by_trai" +
-      "n_dataset_id\030\022 \001(\010H\000\022\025\n\rmodel_type_id\030\014 " +
-      "\001(\t\022\030\n\020eval_dataset_ids\030\r \003(\t\022\031\n\021train_d" +
-      "ataset_ids\030\016 \003(\t\022\023\n\013concept_ids\030\017 \003(\t\022\033\n" +
-      "\023show_failed_metrics\030\023 \001(\010B\t\n\007sort_by\"\211\001" +
-      "\n\024GetEvaluationRequest\022/\n\013user_app_id\030\001 " +
-      "\001(\0132\032.clarifai.api.UserAppIDSet\022\025\n\revalu" +
-      "ation_id\030\002 \001(\t\022)\n\006fields\030\003 \001(\0132\031.clarifa" +
-      "i.api.FieldsValue\"\262\001\n\"PostModelVersionEv" +
-      "aluationsRequest\022/\n\013user_app_id\030\001 \001(\0132\032." +
-      "clarifai.api.UserAppIDSet\022\020\n\010model_id\030\002 " +
-      "\001(\t\022\030\n\020model_version_id\030\003 \001(\t\022/\n\014eval_me" +
-      "trics\030\004 \003(\0132\031.clarifai.api.EvalMetrics\"\241" +
-      "\001\n\"ListModelVersionEvaluationsRequest\022/\n" +
+      "et\022\020\n\010model_id\030\002 \001(\t\022\022\n\nversion_id\030\003 \001(\t" +
+      "\"\207\001\n SingleModelVersionExportResponse\022+\n" +
+      "\006status\030\001 \001(\0132\033.clarifai.api.status.Stat" +
+      "us\0226\n\006export\030\002 \001(\0132 .clarifai.api.ModelV" +
+      "ersionExportB\004\200\265\030\001\"\261\001\n$PostWorkflowVersi" +
+      "onsUnPublishRequest\022/\n\013user_app_id\030\001 \001(\013" +
+      "2\032.clarifai.api.UserAppIDSet\022\023\n\013workflow" +
+      "_id\030\002 \001(\t\022C\n\014publications\030\003 \003(\0132-.clarif" +
+      "ai.api.WorkflowVersionUnPublishRequest\"\255" +
+      "\001\n\"PostWorkflowVersionsPublishRequest\022/\n" +
       "\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserAp" +
-      "pIDSet\022\020\n\010model_id\030\002 \001(\t\022\030\n\020model_versio" +
-      "n_id\030\003 \001(\t\022\014\n\004page\030\004 \001(\r\022\020\n\010per_page\030\005 \001" +
-      "(\r\"\301\001\n GetModelVersionEvaluationRequest\022" +
-      "/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.User" +
-      "AppIDSet\022\020\n\010model_id\030\002 \001(\t\022\030\n\020model_vers" +
-      "ion_id\030\003 \001(\t\022\025\n\revaluation_id\030\004 \001(\t\022)\n\006f" +
-      "ields\030\005 \001(\0132\031.clarifai.api.FieldsValue\"y" +
-      "\n\031SingleEvalMetricsResponse\022+\n\006status\030\001 " +
-      "\001(\0132\033.clarifai.api.status.Status\022/\n\014eval" +
-      "_metrics\030\002 \001(\0132\031.clarifai.api.EvalMetric" +
-      "s\"x\n\030MultiEvalMetricsResponse\022+\n\006status\030" +
-      "\001 \001(\0132\033.clarifai.api.status.Status\022/\n\014ev" +
-      "al_metrics\030\002 \003(\0132\031.clarifai.api.EvalMetr" +
-      "ics\"\323\001\n\036PostModelVersionMetricsRequest\022/" +
-      "\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserA" +
-      "ppIDSet\022\020\n\010model_id\030\002 \001(\t\022\022\n\nversion_id\030" +
-      "\003 \001(\t\022)\n\013test_search\030\005 \001(\0132\024.clarifai.ap" +
-      "i.Search\022)\n\teval_info\030\n \001(\0132\026.clarifai.a" +
-      "pi.EvalInfoJ\004\010\004\020\005\"\241\001\n\035GetModelVersionMet" +
-      "ricsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clari" +
-      "fai.api.UserAppIDSet\022\020\n\010model_id\030\002 \001(\t\022\022" +
-      "\n\nversion_id\030\003 \001(\t\022)\n\006fields\030\004 \001(\0132\031.cla" +
-      "rifai.api.FieldsValue\"]\n\023GetModelTypeReq" +
-      "uest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api" +
-      ".UserAppIDSet\022\025\n\rmodel_type_id\030\002 \001(\t\"h\n\025" +
-      "ListModelTypesRequest\022/\n\013user_app_id\030\001 \001" +
-      "(\0132\032.clarifai.api.UserAppIDSet\022\014\n\004page\030\002" +
-      " \001(\r\022\020\n\010per_page\030\003 \001(\r\"\037\n\035ListOpenSource" +
-      "LicensesRequest\"_\n\036ListOpenSourceLicense" +
-      "sResponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api" +
-      ".status.Status\022\020\n\010licenses\030\002 \003(\t\"y\n\027Sing" +
-      "leModelTypeResponse\022+\n\006status\030\001 \001(\0132\033.cl" +
-      "arifai.api.status.Status\0221\n\nmodel_type\030\002" +
-      " \001(\0132\027.clarifai.api.ModelTypeB\004\200\265\030\001\"\362\001\n\026" +
-      "MultiModelTypeResponse\022+\n\006status\030\001 \001(\0132\033" +
-      ".clarifai.api.status.Status\0222\n\013model_typ" +
-      "es\030\002 \003(\0132\027.clarifai.api.ModelTypeB\004\200\265\030\001\022" +
-      "5\n\017model_importers\030\003 \001(\0132\034.clarifai.api." +
-      "ModelTypeField\022@\n\026triton_conda_envs_info" +
-      "\030\004 \003(\0132 .clarifai.api.TritonCondaEnvInfo" +
-      "\"\225\001\n\"GetModelVersionInputExampleRequest\022" +
-      "/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.User" +
-      "AppIDSet\022\020\n\010model_id\030\002 \001(\t\022\030\n\020model_vers" +
-      "ion_id\030\003 \001(\t\022\022\n\nexample_id\030\004 \001(\t\"\243\001\n$Lis" +
-      "tModelVersionInputExamplesRequest\022/\n\013use" +
+      "pIDSet\022\023\n\013workflow_id\030\002 \001(\t\022A\n\014publicati" +
+      "ons\030\003 \003(\0132+.clarifai.api.WorkflowVersion" +
+      "PublishRequest\"3\n\035WorkflowVersionPublish" +
+      "Request\022\022\n\nversion_id\030\001 \001(\t\"5\n\037WorkflowV" +
+      "ersionUnPublishRequest\022\022\n\nversion_id\030\001 \001" +
+      "(\t\"0\n\032ModelVersionPublishRequest\022\022\n\nvers" +
+      "ion_id\030\001 \001(\t\"\244\001\n\037PostModelVersionsPublis" +
+      "hRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai" +
+      ".api.UserAppIDSet\022\020\n\010model_id\030\002 \001(\t\022>\n\014p" +
+      "ublications\030\003 \003(\0132(.clarifai.api.ModelVe" +
+      "rsionPublishRequest\"2\n\034ModelVersionUnpub" +
+      "lishRequest\022\022\n\nversion_id\030\001 \001(\t\"\250\001\n!Post" +
+      "ModelVersionsUnPublishRequest\022/\n\013user_ap" +
+      "p_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\020" +
+      "\n\010model_id\030\002 \001(\t\022@\n\014publications\030\003 \003(\0132*" +
+      ".clarifai.api.ModelVersionUnpublishReque" +
+      "st\"z\n\026PostEvaluationsRequest\022/\n\013user_app" +
+      "_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022/\n" +
+      "\014eval_metrics\030\002 \003(\0132\031.clarifai.api.EvalM" +
+      "etrics\"\263\004\n\026ListEvaluationsRequest\022/\n\013use" +
       "r_app_id\030\001 \001(\0132\032.clarifai.api.UserAppIDS" +
-      "et\022\020\n\010model_id\030\002 \001(\t\022\030\n\020model_version_id" +
-      "\030\003 \001(\t\022\014\n\004page\030\004 \001(\r\022\020\n\010per_page\030\005 \001(\r\"\242" +
-      "\001\n&SingleModelVersionInputExampleRespons" +
-      "e\022+\n\006status\030\001 \001(\0132\033.clarifai.api.status." +
-      "Status\022K\n\033model_version_input_example\030\002 " +
-      "\001(\0132&.clarifai.api.ModelVersionInputExam" +
-      "ple\"\242\001\n%MultiModelVersionInputExampleRes" +
-      "ponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.sta" +
-      "tus.Status\022L\n\034model_version_input_exampl" +
-      "es\030\002 \003(\0132&.clarifai.api.ModelVersionInpu" +
-      "tExample\"\177\n\032ListModelReferencesRequest\022/" +
-      "\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserA" +
-      "ppIDSet\022\020\n\010model_id\030\002 \001(\t\022\014\n\004page\030\003 \001(\r\022" +
-      "\020\n\010per_page\030\004 \001(\r\"\202\001\n\033MultiModelReferenc" +
-      "eResponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api" +
-      ".status.Status\0226\n\020model_references\030\002 \003(\013" +
-      "2\034.clarifai.api.ModelReference\"o\n\023MultiO" +
-      "utputResponse\022+\n\006status\030\001 \001(\0132\033.clarifai" +
-      ".api.status.Status\022+\n\007outputs\030\002 \003(\0132\024.cl" +
-      "arifai.api.OutputB\004\200\265\030\001\"V\n\021ListScopesReq" +
-      "uest\022\020\n\010key_type\030\001 \001(\t\022/\n\013user_app_id\030\002 " +
-      "\001(\0132\032.clarifai.api.UserAppIDSet\"B\n\017MySco" +
-      "pesRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarif" +
-      "ai.api.UserAppIDSet\"F\n\023MyScopesUserReque" +
-      "st\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.U" +
-      "serAppIDSet\"\025\n\023MyScopesRootRequest\"\245\001\n\026M" +
-      "ultiScopeDepsResponse\022+\n\006status\030\001 \001(\0132\033." +
-      "clarifai.api.status.Status\022+\n\nscope_deps" +
-      "\030\002 \003(\0132\027.clarifai.api.ScopeDeps\0221\n\rendpo" +
-      "int_deps\030\003 \003(\0132\032.clarifai.api.EndpointDe" +
-      "ps\"\240\001\n\022MultiScopeResponse\022+\n\006status\030\001 \001(" +
-      "\0132\033.clarifai.api.status.Status\022\016\n\006scopes" +
-      "\030\002 \003(\t\022\036\n\003app\030\003 \001(\0132\021.clarifai.api.App\022\021" +
-      "\n\tendpoints\030\004 \003(\t\022\032\n\022user_feature_flags\030" +
-      "\005 \001(\t\"\204\001\n\026MultiScopeUserResponse\022+\n\006stat" +
-      "us\030\001 \001(\0132\033.clarifai.api.status.Status\022\016\n" +
-      "\006scopes\030\002 \003(\t\022\021\n\tendpoints\030\004 \003(\t\022\032\n\022user" +
-      "_feature_flags\030\005 \001(\t\"\204\001\n\026MultiScopeRootR" +
-      "esponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.s" +
-      "tatus.Status\022\016\n\006scopes\030\002 \003(\t\022\021\n\tendpoint" +
-      "s\030\004 \003(\t\022\032\n\022user_feature_flags\030\005 \001(\t\"O\n\020G" +
-      "etSearchRequest\022/\n\013user_app_id\030\001 \001(\0132\032.c" +
-      "larifai.api.UserAppIDSet\022\n\n\002id\030\002 \001(\t\"f\n\023" +
-      "ListSearchesRequest\022/\n\013user_app_id\030\001 \001(\013" +
-      "2\032.clarifai.api.UserAppIDSet\022\014\n\004page\030\002 \001" +
-      "(\r\022\020\n\010per_page\030\003 \001(\r\"\304\001\n\023PostSearchesReq" +
-      "uest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api" +
-      ".UserAppIDSet\022&\n\005query\030\002 \001(\0132\023.clarifai." +
-      "api.QueryB\002\030\001\022&\n\010searches\030\003 \003(\0132\024.clarif" +
-      "ai.api.Search\022,\n\npagination\030\004 \001(\0132\030.clar" +
-      "ifai.api.Pagination\"\205\001\n\032PatchInputsSearc" +
-      "hesRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarif" +
-      "ai.api.UserAppIDSet\022&\n\010searches\030\002 \003(\0132\024." +
-      "clarifai.api.Search\022\016\n\006action\030\003 \001(\t\"\212\001\n\037" +
-      "PatchAnnotationsSearchesRequest\022/\n\013user_" +
+      "et\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\022\026\n\016so" +
+      "rt_ascending\030\004 \001(\010\022\030\n\016sort_by_app_id\030\005 \001" +
+      "(\010H\000\022\031\n\017sort_by_roc_auc\030\006 \001(\010H\000\022\024\n\nsort_" +
+      "by_f1\030\007 \001(\010H\000\022\034\n\022sort_by_created_at\030\010 \001(" +
+      "\010H\000\022$\n\032sort_by_mean_avg_precision\030\t \001(\010H" +
+      "\000\022\033\n\021sort_by_precision\030\n \001(\010H\000\022\030\n\016sort_b" +
+      "y_recall\030\013 \001(\010H\000\022\032\n\020sort_by_model_id\030\020 \001" +
+      "(\010H\000\022!\n\027sort_by_eval_dataset_id\030\021 \001(\010H\000\022" +
+      "\"\n\030sort_by_train_dataset_id\030\022 \001(\010H\000\022\025\n\rm" +
+      "odel_type_id\030\014 \001(\t\022\030\n\020eval_dataset_ids\030\r" +
+      " \003(\t\022\031\n\021train_dataset_ids\030\016 \003(\t\022\023\n\013conce" +
+      "pt_ids\030\017 \003(\t\022\033\n\023show_failed_metrics\030\023 \001(" +
+      "\010B\t\n\007sort_by\"\211\001\n\024GetEvaluationRequest\022/\n" +
+      "\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserAp" +
+      "pIDSet\022\025\n\revaluation_id\030\002 \001(\t\022)\n\006fields\030" +
+      "\003 \001(\0132\031.clarifai.api.FieldsValue\"\262\001\n\"Pos" +
+      "tModelVersionEvaluationsRequest\022/\n\013user_" +
       "app_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet" +
-      "\022&\n\010searches\030\002 \003(\0132\024.clarifai.api.Search" +
-      "\022\016\n\006action\030\003 \001(\t\"\177\n\024PatchSearchesRequest" +
-      "\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Use" +
-      "rAppIDSet\022&\n\010searches\030\002 \003(\0132\024.clarifai.a" +
-      "pi.Search\022\016\n\006action\030\003 \001(\t\"\204\001\n\027PostSearch" +
-      "esByIDRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cla" +
-      "rifai.api.UserAppIDSet\022\n\n\002id\030\002 \001(\t\022,\n\npa" +
-      "gination\030\003 \001(\0132\030.clarifai.api.Pagination" +
-      "\"R\n\023DeleteSearchRequest\022/\n\013user_app_id\030\001" +
-      " \001(\0132\032.clarifai.api.UserAppIDSet\022\n\n\002id\030\002" +
-      " \001(\t\"\247\001\n\036PostAnnotationsSearchesRequest\022" +
-      "/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.User" +
-      "AppIDSet\022&\n\010searches\030\002 \003(\0132\024.clarifai.ap" +
-      "i.Search\022,\n\npagination\030\003 \001(\0132\030.clarifai." +
-      "api.Pagination\"c\n$DeleteAnnotationSearch" +
-      "MetricsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cl" +
-      "arifai.api.UserAppIDSet\022\n\n\002id\030\002 \001(\t\"\266\001\n\031" +
-      "PostInputsSearchesRequest\022/\n\013user_app_id" +
-      "\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022&\n\010se" +
-      "arches\030\002 \003(\0132\024.clarifai.api.Search\022,\n\npa" +
-      "gination\030\003 \001(\0132\030.clarifai.api.Pagination" +
-      "\022\022\n\nonly_count\030\004 \001(\010\"i\n\024SingleSearchResp" +
+      "\022\020\n\010model_id\030\002 \001(\t\022\030\n\020model_version_id\030\003" +
+      " \001(\t\022/\n\014eval_metrics\030\004 \003(\0132\031.clarifai.ap" +
+      "i.EvalMetrics\"\241\001\n\"ListModelVersionEvalua" +
+      "tionsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clar" +
+      "ifai.api.UserAppIDSet\022\020\n\010model_id\030\002 \001(\t\022" +
+      "\030\n\020model_version_id\030\003 \001(\t\022\014\n\004page\030\004 \001(\r\022" +
+      "\020\n\010per_page\030\005 \001(\r\"\301\001\n GetModelVersionEva" +
+      "luationRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cl" +
+      "arifai.api.UserAppIDSet\022\020\n\010model_id\030\002 \001(" +
+      "\t\022\030\n\020model_version_id\030\003 \001(\t\022\025\n\revaluatio" +
+      "n_id\030\004 \001(\t\022)\n\006fields\030\005 \001(\0132\031.clarifai.ap" +
+      "i.FieldsValue\"y\n\031SingleEvalMetricsRespon" +
+      "se\022+\n\006status\030\001 \001(\0132\033.clarifai.api.status" +
+      ".Status\022/\n\014eval_metrics\030\002 \001(\0132\031.clarifai" +
+      ".api.EvalMetrics\"x\n\030MultiEvalMetricsResp" +
       "onse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.stat" +
-      "us.Status\022$\n\006search\030\005 \001(\0132\024.clarifai.api" +
-      ".Search\"\355\001\n\023MultiSearchResponse\022+\n\006statu" +
-      "s\030\001 \001(\0132\033.clarifai.api.status.Status\022\n\n\002" +
-      "id\030\002 \001(\t\022%\n\004hits\030\003 \003(\0132\021.clarifai.api.Hi" +
-      "tB\004\200\265\030\001\022\"\n\005query\030\004 \001(\0132\023.clarifai.api.Qu" +
-      "ery\022&\n\010searches\030\005 \003(\0132\024.clarifai.api.Sea" +
-      "rch\022*\n\nhit_counts\030\006 \003(\0132\026.clarifai.api.H" +
-      "itCount\"\224\002\n\"PostAnnotationSearchMetricsR" +
-      "equest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.a" +
-      "pi.UserAppIDSet\022\n\n\002id\030\002 \001(\t\022*\n\014ground_tr" +
-      "uth\030\003 \001(\0132\024.clarifai.api.Search\022,\n\016searc" +
-      "h_to_eval\030\004 \001(\0132\024.clarifai.api.Search\022 \n" +
-      "\004data\030\005 \001(\0132\022.clarifai.api.Data\0225\n\017evalu" +
-      "ation_type\030\006 \001(\0162\034.clarifai.api.Evaluati" +
-      "onType\"`\n!GetAnnotationSearchMetricsRequ" +
-      "est\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api." +
-      "UserAppIDSet\022\n\n\002id\030\002 \001(\t\"U\n\"ListAnnotati" +
-      "onSearchMetricsRequest\022/\n\013user_app_id\030\001 " +
-      "\001(\0132\032.clarifai.api.UserAppIDSet\"\235\001\n$Mult" +
-      "iAnnotationSearchMetricsResponse\022+\n\006stat" +
-      "us\030\001 \001(\0132\033.clarifai.api.status.Status\022H\n" +
-      "\031annotation_search_metrics\030\002 \003(\0132%.clari" +
-      "fai.api.AnnotationSearchMetrics\"o\n\034ListA" +
-      "nnotationFiltersRequest\022/\n\013user_app_id\030\001" +
-      " \001(\0132\032.clarifai.api.UserAppIDSet\022\014\n\004page" +
-      "\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"k\n\032GetAnnotatio" +
-      "nFilterRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cl" +
-      "arifai.api.UserAppIDSet\022\034\n\024annotation_fi" +
-      "lter_id\030\002 \001(\t\"\213\001\n\034PostAnnotationFiltersR" +
-      "equest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.a" +
-      "pi.UserAppIDSet\022:\n\022annotation_filters\030\002 " +
-      "\003(\0132\036.clarifai.api.AnnotationFilter\"\234\001\n\035" +
-      "PatchAnnotationFiltersRequest\022/\n\013user_ap" +
-      "p_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022:" +
-      "\n\022annotation_filters\030\002 \003(\0132\036.clarifai.ap" +
-      "i.AnnotationFilter\022\016\n\006action\030\003 \001(\t\"p\n\036De" +
-      "leteAnnotationFiltersRequest\022/\n\013user_app" +
-      "_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\035\n" +
-      "\025annotation_filter_ids\030\002 \003(\t\"\216\001\n\035MultiAn" +
-      "notationFilterResponse\022+\n\006status\030\001 \001(\0132\033" +
-      ".clarifai.api.status.Status\022@\n\022annotatio" +
-      "n_filters\030\002 \003(\0132\036.clarifai.api.Annotatio" +
-      "nFilterB\004\200\265\030\001\"\210\001\n\036SingleAnnotationFilter" +
-      "Response\022+\n\006status\030\001 \001(\0132\033.clarifai.api." +
-      "status.Status\0229\n\021annotation_filter\030\002 \001(\013" +
-      "2\036.clarifai.api.AnnotationFilter\"\\\n\016GetU" +
-      "serRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarif" +
-      "ai.api.UserAppIDSet\022\031\n\021additional_fields" +
-      "\030\002 \003(\t\"c\n\022SingleUserResponse\022+\n\006status\030\001" +
-      " \001(\0132\033.clarifai.api.status.Status\022 \n\004use" +
-      "r\030\002 \001(\0132\022.clarifai.api.User\"x\n\033PostValid" +
-      "atePasswordRequest\022/\n\013user_app_id\030\001 \001(\0132" +
-      "\032.clarifai.api.UserAppIDSet\022(\n\010password\030" +
-      "\002 \001(\0132\026.clarifai.api.Password\"\216\001\n Single" +
-      "PasswordValidationResponse\022+\n\006status\030\001 \001" +
-      "(\0132\033.clarifai.api.status.Status\022=\n\023passw" +
-      "ord_violations\030\002 \001(\0132 .clarifai.api.Pass" +
-      "wordViolations\"\273\001\n\022GetWorkflowRequest\022/\n" +
-      "\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserAp" +
-      "pIDSet\022\023\n\013workflow_id\030\002 \001(\t\022 \n\030favor_cla" +
-      "rifai_workflows\030\003 \001(\010\022\031\n\021additional_fiel" +
-      "ds\030\004 \003(\t\022\"\n\032exclude_clarifai_workflows\030\005" +
-      " \001(\010\"\241\003\n\024ListWorkflowsRequest\022/\n\013user_ap" +
-      "p_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\014" +
-      "\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\022\031\n\021additi" +
-      "onal_fields\030\n \003(\t\022\026\n\016sort_ascending\030\005 \001(" +
-      "\010\022\024\n\nsort_by_id\030\006 \001(\010H\000\022\035\n\023sort_by_modif" +
-      "ied_at\030\007 \001(\010H\000\022\034\n\022sort_by_created_at\030\r \001" +
-      "(\010H\000\022\034\n\022sort_by_star_count\030\016 \001(\010H\000\022\025\n\rfe" +
-      "atured_only\030\t \001(\010\022\024\n\014starred_only\030\013 \001(\010\022" +
-      "\020\n\010bookmark\030\017 \001(\010\022\016\n\006search\030\020 \001(\t\022\021\n\005que" +
-      "ry\030\010 \001(\tB\002\030\001\022\016\n\002id\030\004 \001(\tB\002\030\001\022\027\n\013search_t" +
-      "erm\030\014 \001(\tB\002\030\001B\t\n\007sort_by\"r\n\024PostWorkflow" +
+      "us.Status\022/\n\014eval_metrics\030\002 \003(\0132\031.clarif" +
+      "ai.api.EvalMetrics\"\323\001\n\036PostModelVersionM" +
+      "etricsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cla" +
+      "rifai.api.UserAppIDSet\022\020\n\010model_id\030\002 \001(\t" +
+      "\022\022\n\nversion_id\030\003 \001(\t\022)\n\013test_search\030\005 \001(" +
+      "\0132\024.clarifai.api.Search\022)\n\teval_info\030\n \001" +
+      "(\0132\026.clarifai.api.EvalInfoJ\004\010\004\020\005\"\241\001\n\035Get" +
+      "ModelVersionMetricsRequest\022/\n\013user_app_i" +
+      "d\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\020\n\010m" +
+      "odel_id\030\002 \001(\t\022\022\n\nversion_id\030\003 \001(\t\022)\n\006fie" +
+      "lds\030\004 \001(\0132\031.clarifai.api.FieldsValue\"]\n\023" +
+      "GetModelTypeRequest\022/\n\013user_app_id\030\001 \001(\013" +
+      "2\032.clarifai.api.UserAppIDSet\022\025\n\rmodel_ty" +
+      "pe_id\030\002 \001(\t\"h\n\025ListModelTypesRequest\022/\n\013" +
+      "user_app_id\030\001 \001(\0132\032.clarifai.api.UserApp" +
+      "IDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"\037\n" +
+      "\035ListOpenSourceLicensesRequest\"_\n\036ListOp" +
+      "enSourceLicensesResponse\022+\n\006status\030\001 \001(\013" +
+      "2\033.clarifai.api.status.Status\022\020\n\010license" +
+      "s\030\002 \003(\t\"y\n\027SingleModelTypeResponse\022+\n\006st" +
+      "atus\030\001 \001(\0132\033.clarifai.api.status.Status\022" +
+      "1\n\nmodel_type\030\002 \001(\0132\027.clarifai.api.Model" +
+      "TypeB\004\200\265\030\001\"\362\001\n\026MultiModelTypeResponse\022+\n" +
+      "\006status\030\001 \001(\0132\033.clarifai.api.status.Stat" +
+      "us\0222\n\013model_types\030\002 \003(\0132\027.clarifai.api.M" +
+      "odelTypeB\004\200\265\030\001\0225\n\017model_importers\030\003 \001(\0132" +
+      "\034.clarifai.api.ModelTypeField\022@\n\026triton_" +
+      "conda_envs_info\030\004 \003(\0132 .clarifai.api.Tri" +
+      "tonCondaEnvInfo\"\225\001\n\"GetModelVersionInput" +
+      "ExampleRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cl" +
+      "arifai.api.UserAppIDSet\022\020\n\010model_id\030\002 \001(" +
+      "\t\022\030\n\020model_version_id\030\003 \001(\t\022\022\n\nexample_i" +
+      "d\030\004 \001(\t\"\243\001\n$ListModelVersionInputExample" +
       "sRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai" +
-      ".api.UserAppIDSet\022)\n\tworkflows\030\002 \003(\0132\026.c" +
-      "larifai.api.Workflow\"\203\001\n\025PatchWorkflowsR" +
+      ".api.UserAppIDSet\022\020\n\010model_id\030\002 \001(\t\022\030\n\020m" +
+      "odel_version_id\030\003 \001(\t\022\014\n\004page\030\004 \001(\r\022\020\n\010p" +
+      "er_page\030\005 \001(\r\"\242\001\n&SingleModelVersionInpu" +
+      "tExampleResponse\022+\n\006status\030\001 \001(\0132\033.clari" +
+      "fai.api.status.Status\022K\n\033model_version_i" +
+      "nput_example\030\002 \001(\0132&.clarifai.api.ModelV" +
+      "ersionInputExample\"\242\001\n%MultiModelVersion" +
+      "InputExampleResponse\022+\n\006status\030\001 \001(\0132\033.c" +
+      "larifai.api.status.Status\022L\n\034model_versi" +
+      "on_input_examples\030\002 \003(\0132&.clarifai.api.M" +
+      "odelVersionInputExample\"\177\n\032ListModelRefe" +
+      "rencesRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cla" +
+      "rifai.api.UserAppIDSet\022\020\n\010model_id\030\002 \001(\t" +
+      "\022\014\n\004page\030\003 \001(\r\022\020\n\010per_page\030\004 \001(\r\"\202\001\n\033Mul" +
+      "tiModelReferenceResponse\022+\n\006status\030\001 \001(\013" +
+      "2\033.clarifai.api.status.Status\0226\n\020model_r" +
+      "eferences\030\002 \003(\0132\034.clarifai.api.ModelRefe" +
+      "rence\"o\n\023MultiOutputResponse\022+\n\006status\030\001" +
+      " \001(\0132\033.clarifai.api.status.Status\022+\n\007out" +
+      "puts\030\002 \003(\0132\024.clarifai.api.OutputB\004\200\265\030\001\"V" +
+      "\n\021ListScopesRequest\022\020\n\010key_type\030\001 \001(\t\022/\n" +
+      "\013user_app_id\030\002 \001(\0132\032.clarifai.api.UserAp" +
+      "pIDSet\"B\n\017MyScopesRequest\022/\n\013user_app_id" +
+      "\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\"F\n\023My" +
+      "ScopesUserRequest\022/\n\013user_app_id\030\001 \001(\0132\032" +
+      ".clarifai.api.UserAppIDSet\"\025\n\023MyScopesRo" +
+      "otRequest\"\245\001\n\026MultiScopeDepsResponse\022+\n\006" +
+      "status\030\001 \001(\0132\033.clarifai.api.status.Statu" +
+      "s\022+\n\nscope_deps\030\002 \003(\0132\027.clarifai.api.Sco" +
+      "peDeps\0221\n\rendpoint_deps\030\003 \003(\0132\032.clarifai" +
+      ".api.EndpointDeps\"\240\001\n\022MultiScopeResponse" +
+      "\022+\n\006status\030\001 \001(\0132\033.clarifai.api.status.S" +
+      "tatus\022\016\n\006scopes\030\002 \003(\t\022\036\n\003app\030\003 \001(\0132\021.cla" +
+      "rifai.api.App\022\021\n\tendpoints\030\004 \003(\t\022\032\n\022user" +
+      "_feature_flags\030\005 \001(\t\"\204\001\n\026MultiScopeUserR" +
+      "esponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.s" +
+      "tatus.Status\022\016\n\006scopes\030\002 \003(\t\022\021\n\tendpoint" +
+      "s\030\004 \003(\t\022\032\n\022user_feature_flags\030\005 \001(\t\"\204\001\n\026" +
+      "MultiScopeRootResponse\022+\n\006status\030\001 \001(\0132\033" +
+      ".clarifai.api.status.Status\022\016\n\006scopes\030\002 " +
+      "\003(\t\022\021\n\tendpoints\030\004 \003(\t\022\032\n\022user_feature_f" +
+      "lags\030\005 \001(\t\"O\n\020GetSearchRequest\022/\n\013user_a" +
+      "pp_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022" +
+      "\n\n\002id\030\002 \001(\t\"f\n\023ListSearchesRequest\022/\n\013us" +
+      "er_app_id\030\001 \001(\0132\032.clarifai.api.UserAppID" +
+      "Set\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"\304\001\n\023" +
+      "PostSearchesRequest\022/\n\013user_app_id\030\001 \001(\013" +
+      "2\032.clarifai.api.UserAppIDSet\022&\n\005query\030\002 " +
+      "\001(\0132\023.clarifai.api.QueryB\002\030\001\022&\n\010searches" +
+      "\030\003 \003(\0132\024.clarifai.api.Search\022,\n\npaginati" +
+      "on\030\004 \001(\0132\030.clarifai.api.Pagination\"\205\001\n\032P" +
+      "atchInputsSearchesRequest\022/\n\013user_app_id" +
+      "\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022&\n\010se" +
+      "arches\030\002 \003(\0132\024.clarifai.api.Search\022\016\n\006ac" +
+      "tion\030\003 \001(\t\"\212\001\n\037PatchAnnotationsSearchesR" +
       "equest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.a" +
-      "pi.UserAppIDSet\022)\n\tworkflows\030\002 \003(\0132\026.cla" +
-      "rifai.api.Workflow\022\016\n\006action\030\003 \001(\t\"\205\001\n\027P" +
-      "atchWorkflowIdsRequest\022/\n\013user_app_id\030\001 " +
-      "\001(\0132\032.clarifai.api.UserAppIDSet\022)\n\003ids\030\003" +
-      " \003(\0132\034.clarifai.api.IdUpdateSource\022\016\n\006ac" +
-      "tion\030\004 \001(\t\"]\n\025DeleteWorkflowRequest\022/\n\013u" +
-      "ser_app_id\030\001 \001(\0132\032.clarifai.api.UserAppI" +
-      "DSet\022\023\n\013workflow_id\030\002 \001(\t\"j\n\026DeleteWorkf" +
-      "lowsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clari" +
-      "fai.api.UserAppIDSet\022\013\n\003ids\030\002 \003(\t\022\022\n\ndel" +
-      "ete_all\030\003 \001(\010\"o\n\026SingleWorkflowResponse\022" +
-      "+\n\006status\030\001 \001(\0132\033.clarifai.api.status.St" +
-      "atus\022(\n\010workflow\030\002 \001(\0132\026.clarifai.api.Wo" +
-      "rkflow\"u\n\025MultiWorkflowResponse\022+\n\006statu" +
-      "s\030\001 \001(\0132\033.clarifai.api.status.Status\022/\n\t" +
-      "workflows\030\002 \003(\0132\026.clarifai.api.WorkflowB" +
-      "\004\200\265\030\001\"\245\002\n\032PostWorkflowResultsRequest\022/\n\013" +
-      "user_app_id\030\001 \001(\0132\032.clarifai.api.UserApp" +
-      "IDSet\022\023\n\013workflow_id\030\002 \001(\t\022\022\n\nversion_id" +
-      "\030\007 \001(\t\022#\n\006inputs\030\003 \003(\0132\023.clarifai.api.In" +
-      "put\0221\n\routput_config\030\004 \001(\0132\032.clarifai.ap" +
-      "i.OutputConfig\022 \n\030favor_clarifai_workflo" +
-      "ws\030\005 \001(\010\0223\n\016workflow_state\030\006 \001(\0132\033.clari" +
-      "fai.api.WorkflowState\"\330\001\n\033PostWorkflowRe" +
-      "sultsResponse\022+\n\006status\030\001 \001(\0132\033.clarifai" +
-      ".api.status.Status\022(\n\010workflow\030\002 \001(\0132\026.c" +
-      "larifai.api.Workflow\022-\n\007results\030\003 \003(\0132\034." +
-      "clarifai.api.WorkflowResult\0223\n\016workflow_" +
-      "state\030\004 \001(\0132\033.clarifai.api.WorkflowState" +
-      "\"\221\002\n$PostWorkflowResultsSimilarityReques" +
-      "t\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Us" +
-      "erAppIDSet\022\023\n\013workflow_id\030\002 \001(\t\022\022\n\nversi" +
-      "on_id\030\007 \001(\t\022\030\n\020model_version_id\030\003 \001(\t\022)\n" +
-      "\014probe_inputs\030\004 \003(\0132\023.clarifai.api.Input" +
-      "\022(\n\013pool_inputs\030\005 \003(\0132\023.clarifai.api.Inp" +
-      "ut\022 \n\030favor_clarifai_workflows\030\006 \001(\010\"\216\001\n" +
-      "%PostWorkflowResultsSimilarityResponse\022+",
-      "\n\006status\030\001 \001(\0132\033.clarifai.api.status.Sta" +
-      "tus\0228\n\007results\030\002 \003(\0132\'.clarifai.api.Work" +
-      "flowResultsSimilarity\"\203\001\n\033ListWorkflowVe" +
-      "rsionsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cla" +
-      "rifai.api.UserAppIDSet\022\023\n\013workflow_id\030\002 " +
-      "\001(\t\022\014\n\004page\030\003 \001(\r\022\020\n\010per_page\030\004 \001(\r\"~\n\031G" +
-      "etWorkflowVersionRequest\022/\n\013user_app_id\030" +
-      "\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\023\n\013wor" +
-      "kflow_id\030\002 \001(\t\022\033\n\023workflow_version_id\030\003 " +
-      "\001(\t\"\203\001\n\035DeleteWorkflowVersionsRequest\022/\n" +
-      "\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserAp" +
-      "pIDSet\022\023\n\013workflow_id\030\002 \001(\t\022\034\n\024workflow_" +
-      "version_ids\030\003 \003(\t\"\256\001\n\034PatchWorkflowVersi" +
-      "onsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarif" +
-      "ai.api.UserAppIDSet\022\023\n\013workflow_id\030\002 \001(\t" +
-      "\0228\n\021workflow_versions\030\003 \003(\0132\035.clarifai.a" +
-      "pi.WorkflowVersion\022\016\n\006action\030\004 \001(\t\"\213\001\n\034M" +
-      "ultiWorkflowVersionResponse\022+\n\006status\030\001 " +
-      "\001(\0132\033.clarifai.api.status.Status\022>\n\021work" +
-      "flow_versions\030\002 \003(\0132\035.clarifai.api.Workf" +
-      "lowVersionB\004\200\265\030\001\"\205\001\n\035SingleWorkflowVersi" +
-      "onResponse\022+\n\006status\030\001 \001(\0132\033.clarifai.ap" +
-      "i.status.Status\0227\n\020workflow_version\030\002 \001(" +
-      "\0132\035.clarifai.api.WorkflowVersion\"\205\001\n\032Pos" +
-      "tAppDuplicationsRequest\022/\n\013user_app_id\030\001" +
-      " \001(\0132\032.clarifai.api.UserAppIDSet\0226\n\020app_" +
-      "duplications\030\002 \003(\0132\034.clarifai.api.AppDup" +
-      "lication\"g\n\030GetAppDuplicationRequest\022/\n\013" +
-      "user_app_id\030\001 \001(\0132\032.clarifai.api.UserApp" +
-      "IDSet\022\032\n\022app_duplication_id\030\002 \001(\t\"m\n\032Lis" +
-      "tAppDuplicationsRequest\022/\n\013user_app_id\030\001" +
-      " \001(\0132\032.clarifai.api.UserAppIDSet\022\014\n\004page" +
-      "\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"\203\001\n\034MultiAppDup" +
-      "licationsResponse\022+\n\006status\030\001 \001(\0132\033.clar" +
-      "ifai.api.status.Status\0226\n\020app_duplicatio" +
-      "ns\030\002 \003(\0132\034.clarifai.api.AppDuplication\"\202" +
-      "\001\n\034SingleAppDuplicationResponse\022+\n\006statu" +
-      "s\030\001 \001(\0132\033.clarifai.api.status.Status\0225\n\017" +
-      "app_duplication\030\002 \001(\0132\034.clarifai.api.App" +
-      "Duplication\"f\n\020PostTasksRequest\022/\n\013user_" +
-      "app_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet" +
-      "\022!\n\005tasks\030\002 \003(\0132\022.clarifai.api.Task\"m\n\016G" +
-      "etTaskRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cla" +
-      "rifai.api.UserAppIDSet\022\017\n\007task_id\030\002 \001(\t\022" +
-      "\031\n\021additional_fields\030\003 \003(\t\"\373\001\n\020ListTasks" +
-      "Request\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai." +
-      "api.UserAppIDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010per_pa" +
-      "ge\030\003 \001(\r\022\027\n\017worker_user_ids\030\004 \003(\t\022\027\n\017rev" +
-      "iew_user_ids\030\005 \003(\t\022\027\n\017label_order_ids\030\010 " +
-      "\003(\t\022#\n\033including_label_order_tasks\030\006 \001(\010" +
-      "\022\031\n\021additional_fields\030\007 \003(\t\022\013\n\003ids\030\t \003(\t" +
-      "\"w\n\021PatchTasksRequest\022/\n\013user_app_id\030\001 \001" +
-      "(\0132\032.clarifai.api.UserAppIDSet\022!\n\005tasks\030" +
-      "\002 \003(\0132\022.clarifai.api.Task\022\016\n\006action\030\003 \001(" +
-      "\t\"R\n\022DeleteTasksRequest\022/\n\013user_app_id\030\001" +
-      " \001(\0132\032.clarifai.api.UserAppIDSet\022\013\n\003ids\030" +
-      "\002 \003(\t\"i\n\021MultiTaskResponse\022+\n\006status\030\001 \001" +
-      "(\0132\033.clarifai.api.status.Status\022\'\n\005tasks" +
-      "\030\002 \003(\0132\022.clarifai.api.TaskB\004\200\265\030\001\"c\n\022Sing" +
-      "leTaskResponse\022+\n\006status\030\001 \001(\0132\033.clarifa" +
-      "i.api.status.Status\022 \n\004task\030\002 \001(\0132\022.clar" +
-      "ifai.api.Task\"\242\001\n\023GetTaskCountRequest\022/\n" +
-      "\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserAp" +
-      "pIDSet\022\017\n\007task_id\030\002 \001(\t\022\020\n\010user_ids\030\003 \003(" +
-      "\t\022\031\n\021model_version_ids\030\004 \003(\t\022\034\n\024workflow" +
-      "_version_ids\030\005 \003(\t\"\235\001\n\027SingleTaskCountRe" +
+      "pi.UserAppIDSet\022&\n\010searches\030\002 \003(\0132\024.clar" +
+      "ifai.api.Search\022\016\n\006action\030\003 \001(\t\"\177\n\024Patch" +
+      "SearchesRequest\022/\n\013user_app_id\030\001 \001(\0132\032.c" +
+      "larifai.api.UserAppIDSet\022&\n\010searches\030\002 \003" +
+      "(\0132\024.clarifai.api.Search\022\016\n\006action\030\003 \001(\t" +
+      "\"\204\001\n\027PostSearchesByIDRequest\022/\n\013user_app" +
+      "_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\n\n" +
+      "\002id\030\002 \001(\t\022,\n\npagination\030\003 \001(\0132\030.clarifai" +
+      ".api.Pagination\"R\n\023DeleteSearchRequest\022/" +
+      "\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserA" +
+      "ppIDSet\022\n\n\002id\030\002 \001(\t\"\247\001\n\036PostAnnotationsS" +
+      "earchesRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cl" +
+      "arifai.api.UserAppIDSet\022&\n\010searches\030\002 \003(" +
+      "\0132\024.clarifai.api.Search\022,\n\npagination\030\003 " +
+      "\001(\0132\030.clarifai.api.Pagination\"c\n$DeleteA" +
+      "nnotationSearchMetricsRequest\022/\n\013user_ap" +
+      "p_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\n" +
+      "\n\002id\030\002 \001(\t\"\266\001\n\031PostInputsSearchesRequest" +
+      "\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Use" +
+      "rAppIDSet\022&\n\010searches\030\002 \003(\0132\024.clarifai.a" +
+      "pi.Search\022,\n\npagination\030\003 \001(\0132\030.clarifai" +
+      ".api.Pagination\022\022\n\nonly_count\030\004 \001(\010\"i\n\024S" +
+      "ingleSearchResponse\022+\n\006status\030\001 \001(\0132\033.cl" +
+      "arifai.api.status.Status\022$\n\006search\030\005 \001(\013" +
+      "2\024.clarifai.api.Search\"\355\001\n\023MultiSearchRe" +
       "sponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.st" +
-      "atus.Status\022\016\n\006app_id\030\002 \001(\t\022\017\n\007task_id\030\003" +
-      " \001(\t\0224\n\006counts\030\004 \003(\0132$.clarifai.api.Task" +
-      "StatusCountPerUser\"y\n\026PostLabelOrdersReq" +
+      "atus.Status\022\n\n\002id\030\002 \001(\t\022%\n\004hits\030\003 \003(\0132\021." +
+      "clarifai.api.HitB\004\200\265\030\001\022\"\n\005query\030\004 \001(\0132\023." +
+      "clarifai.api.Query\022&\n\010searches\030\005 \003(\0132\024.c" +
+      "larifai.api.Search\022*\n\nhit_counts\030\006 \003(\0132\026" +
+      ".clarifai.api.HitCount\"\224\002\n\"PostAnnotatio" +
+      "nSearchMetricsRequest\022/\n\013user_app_id\030\001 \001" +
+      "(\0132\032.clarifai.api.UserAppIDSet\022\n\n\002id\030\002 \001" +
+      "(\t\022*\n\014ground_truth\030\003 \001(\0132\024.clarifai.api." +
+      "Search\022,\n\016search_to_eval\030\004 \001(\0132\024.clarifa" +
+      "i.api.Search\022 \n\004data\030\005 \001(\0132\022.clarifai.ap" +
+      "i.Data\0225\n\017evaluation_type\030\006 \001(\0162\034.clarif" +
+      "ai.api.EvaluationType\"`\n!GetAnnotationSe" +
+      "archMetricsRequest\022/\n\013user_app_id\030\001 \001(\0132" +
+      "\032.clarifai.api.UserAppIDSet\022\n\n\002id\030\002 \001(\t\"" +
+      "U\n\"ListAnnotationSearchMetricsRequest\022/\n" +
+      "\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserAp" +
+      "pIDSet\"\235\001\n$MultiAnnotationSearchMetricsR" +
+      "esponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.s" +
+      "tatus.Status\022H\n\031annotation_search_metric" +
+      "s\030\002 \003(\0132%.clarifai.api.AnnotationSearchM" +
+      "etrics\"o\n\034ListAnnotationFiltersRequest\022/" +
+      "\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserA" +
+      "ppIDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"" +
+      "k\n\032GetAnnotationFilterRequest\022/\n\013user_ap" +
+      "p_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\034" +
+      "\n\024annotation_filter_id\030\002 \001(\t\"\213\001\n\034PostAnn" +
+      "otationFiltersRequest\022/\n\013user_app_id\030\001 \001" +
+      "(\0132\032.clarifai.api.UserAppIDSet\022:\n\022annota" +
+      "tion_filters\030\002 \003(\0132\036.clarifai.api.Annota" +
+      "tionFilter\"\234\001\n\035PatchAnnotationFiltersReq" +
       "uest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api" +
-      ".UserAppIDSet\022.\n\014label_orders\030\002 \003(\0132\030.cl" +
-      "arifai.api.LabelOrder\"_\n\024GetLabelOrderRe" +
-      "quest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.ap" +
-      "i.UserAppIDSet\022\026\n\016label_order_id\030\002 \001(\t\"i" +
-      "\n\026ListLabelOrdersRequest\022/\n\013user_app_id\030" +
-      "\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\014\n\004pag" +
-      "e\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"\212\001\n\027PatchLabel" +
-      "OrdersRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cla" +
-      "rifai.api.UserAppIDSet\022.\n\014label_orders\030\002" +
-      " \003(\0132\030.clarifai.api.LabelOrder\022\016\n\006action" +
-      "\030\003 \001(\t\"X\n\030DeleteLabelOrdersRequest\022/\n\013us" +
-      "er_app_id\030\001 \001(\0132\032.clarifai.api.UserAppID" +
-      "Set\022\013\n\003ids\030\002 \003(\t\"|\n\027MultiLabelOrderRespo" +
+      ".UserAppIDSet\022:\n\022annotation_filters\030\002 \003(" +
+      "\0132\036.clarifai.api.AnnotationFilter\022\016\n\006act" +
+      "ion\030\003 \001(\t\"p\n\036DeleteAnnotationFiltersRequ" +
+      "est\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api." +
+      "UserAppIDSet\022\035\n\025annotation_filter_ids\030\002 " +
+      "\003(\t\"\216\001\n\035MultiAnnotationFilterResponse\022+\n" +
+      "\006status\030\001 \001(\0132\033.clarifai.api.status.Stat" +
+      "us\022@\n\022annotation_filters\030\002 \003(\0132\036.clarifa" +
+      "i.api.AnnotationFilterB\004\200\265\030\001\"\210\001\n\036SingleA" +
+      "nnotationFilterResponse\022+\n\006status\030\001 \001(\0132" +
+      "\033.clarifai.api.status.Status\0229\n\021annotati" +
+      "on_filter\030\002 \001(\0132\036.clarifai.api.Annotatio" +
+      "nFilter\"\\\n\016GetUserRequest\022/\n\013user_app_id" +
+      "\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\031\n\021ad" +
+      "ditional_fields\030\002 \003(\t\"c\n\022SingleUserRespo" +
       "nse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.statu" +
-      "s.Status\0224\n\014label_orders\030\002 \003(\0132\030.clarifa" +
-      "i.api.LabelOrderB\004\200\265\030\001\"v\n\030SingleLabelOrd" +
-      "erResponse\022+\n\006status\030\001 \001(\0132\033.clarifai.ap" +
-      "i.status.Status\022-\n\013label_order\030\002 \001(\0132\030.c" +
-      "larifai.api.LabelOrder\"u\n\025PostCollectors" +
-      "Request\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai." +
-      "api.UserAppIDSet\022+\n\ncollectors\030\002 \003(\0132\027.c" +
-      "larifai.api.Collector\"\206\001\n\026PatchCollector" +
-      "sRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai" +
-      ".api.UserAppIDSet\022+\n\ncollectors\030\002 \003(\0132\027." +
-      "clarifai.api.Collector\022\016\n\006action\030\003 \001(\t\"k" +
-      "\n\027DeleteCollectorsRequest\022/\n\013user_app_id" +
-      "\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\013\n\003id" +
-      "s\030\002 \003(\t\022\022\n\ndelete_all\030\003 \001(\010\"\\\n\023GetCollec" +
-      "torRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarif" +
-      "ai.api.UserAppIDSet\022\024\n\014collector_id\030\002 \001(" +
-      "\t\"h\n\025ListCollectorsRequest\022/\n\013user_app_i" +
-      "d\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\014\n\004p" +
-      "age\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"r\n\026MultiColl" +
-      "ectorResponse\022+\n\006status\030\001 \001(\0132\033.clarifai" +
-      ".api.status.Status\022+\n\ncollectors\030\002 \003(\0132\027" +
-      ".clarifai.api.Collector\"r\n\027SingleCollect" +
-      "orResponse\022+\n\006status\030\001 \001(\0132\033.clarifai.ap" +
-      "i.status.Status\022*\n\tcollector\030\002 \001(\0132\027.cla" +
-      "rifai.api.Collector\"v\n\025PostStatValuesReq" +
+      "s.Status\022 \n\004user\030\002 \001(\0132\022.clarifai.api.Us" +
+      "er\"x\n\033PostValidatePasswordRequest\022/\n\013use" +
+      "r_app_id\030\001 \001(\0132\032.clarifai.api.UserAppIDS" +
+      "et\022(\n\010password\030\002 \001(\0132\026.clarifai.api.Pass" +
+      "word\"\216\001\n SinglePasswordValidationRespons" +
+      "e\022+\n\006status\030\001 \001(\0132\033.clarifai.api.status." +
+      "Status\022=\n\023password_violations\030\002 \001(\0132 .cl" +
+      "arifai.api.PasswordViolations\"\273\001\n\022GetWor" +
+      "kflowRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clar" +
+      "ifai.api.UserAppIDSet\022\023\n\013workflow_id\030\002 \001" +
+      "(\t\022 \n\030favor_clarifai_workflows\030\003 \001(\010\022\031\n\021" +
+      "additional_fields\030\004 \003(\t\022\"\n\032exclude_clari" +
+      "fai_workflows\030\005 \001(\010\"\241\003\n\024ListWorkflowsReq" +
       "uest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api" +
-      ".UserAppIDSet\022,\n\013stat_values\030\002 \003(\0132\027.cla" +
-      "rifai.api.StatValue\"y\n\026MultiStatValueRes" +
-      "ponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.sta" +
-      "tus.Status\0222\n\013stat_values\030\002 \003(\0132\027.clarif" +
-      "ai.api.StatValueB\004\200\265\030\001\"\236\001\n\036PostStatValue" +
-      "sAggregateRequest\022/\n\013user_app_id\030\001 \001(\0132\032" +
-      ".clarifai.api.UserAppIDSet\022K\n\034stat_value" +
-      "_aggregate_queries\030\002 \003(\0132%.clarifai.api." +
-      "StatValueAggregateQuery\"\234\001\n\037MultiStatVal" +
-      "ueAggregateResponse\022+\n\006status\030\001 \001(\0132\033.cl" +
-      "arifai.api.status.Status\022L\n\034stat_value_a" +
-      "ggregate_results\030\002 \003(\0132&.clarifai.api.St" +
-      "atValueAggregateResult\"w\n\036PostTrendingMe" +
-      "tricsViewRequest\022/\n\013user_app_id\030\001 \001(\0132\032." +
-      "clarifai.api.UserAppIDSet\022\021\n\tview_type\030\002" +
-      " \001(\t\022\021\n\tobject_id\030\003 \001(\t\"\205\001\n\037ListTrending" +
-      "MetricsViewsRequest\022/\n\013user_app_id\030\001 \001(\013" +
-      "2\032.clarifai.api.UserAppIDSet\022\021\n\tview_typ" +
-      "e\030\002 \001(\t\022\014\n\004page\030\003 \001(\r\022\020\n\010per_page\030\004 \001(\r\"" +
-      "~\n MultiTrendingMetricsViewResponse\022+\n\006s" +
-      "tatus\030\001 \001(\0132\033.clarifai.api.status.Status" +
-      "\022-\n\007metrics\030\002 \003(\0132\034.clarifai.api.Trendin" +
-      "gMetric\"q\n\020GetModuleRequest\022/\n\013user_app_" +
-      "id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\021\n\t" +
-      "module_id\030\002 \001(\t\022\031\n\021additional_fields\030\003 \003" +
-      "(\t\"\375\002\n\022ListModulesRequest\022/\n\013user_app_id" +
-      "\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\014\n\004pa" +
-      "ge\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\022\031\n\021additional" +
-      "_fields\030\005 \003(\t\022\026\n\016sort_ascending\030\006 \001(\010\022\034\n" +
-      "\022sort_by_created_at\030\007 \001(\010H\000\022\034\n\022sort_by_s" +
-      "tar_count\030\010 \001(\010H\000\022\035\n\023sort_by_modified_at" +
-      "\030\t \001(\010H\000\022\024\n\nsort_by_id\030\013 \001(\010H\000\022\024\n\014starre" +
-      "d_only\030\004 \001(\010\022\020\n\010bookmark\030\n \001(\010\022\016\n\006search" +
-      "\030\016 \001(\t\022\020\n\004name\030\014 \001(\tB\002\030\001\022\035\n\021filter_by_us" +
-      "er_id\030\r \001(\010B\002\030\001B\t\n\007sort_by\"l\n\022PostModule" +
-      "sRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai" +
-      ".api.UserAppIDSet\022%\n\007modules\030\003 \003(\0132\024.cla" +
-      "rifai.api.Module\"}\n\023PatchModulesRequest\022" +
+      ".UserAppIDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030" +
+      "\003 \001(\r\022\031\n\021additional_fields\030\n \003(\t\022\026\n\016sort" +
+      "_ascending\030\005 \001(\010\022\024\n\nsort_by_id\030\006 \001(\010H\000\022\035" +
+      "\n\023sort_by_modified_at\030\007 \001(\010H\000\022\034\n\022sort_by" +
+      "_created_at\030\r \001(\010H\000\022\034\n\022sort_by_star_coun" +
+      "t\030\016 \001(\010H\000\022\025\n\rfeatured_only\030\t \001(\010\022\024\n\014star" +
+      "red_only\030\013 \001(\010\022\020\n\010bookmark\030\017 \001(\010\022\016\n\006sear" +
+      "ch\030\020 \001(\t\022\021\n\005query\030\010 \001(\tB\002\030\001\022\016\n\002id\030\004 \001(\tB" +
+      "\002\030\001\022\027\n\013search_term\030\014 \001(\tB\002\030\001B\t\n\007sort_by\"" +
+      "r\n\024PostWorkflowsRequest\022/\n\013user_app_id\030\001" +
+      " \001(\0132\032.clarifai.api.UserAppIDSet\022)\n\twork" +
+      "flows\030\002 \003(\0132\026.clarifai.api.Workflow\"\203\001\n\025" +
+      "PatchWorkflowsRequest\022/\n\013user_app_id\030\001 \001" +
+      "(\0132\032.clarifai.api.UserAppIDSet\022)\n\tworkfl" +
+      "ows\030\002 \003(\0132\026.clarifai.api.Workflow\022\016\n\006act" +
+      "ion\030\003 \001(\t\"\205\001\n\027PatchWorkflowIdsRequest\022/\n" +
+      "\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserAp" +
+      "pIDSet\022)\n\003ids\030\003 \003(\0132\034.clarifai.api.IdUpd" +
+      "ateSource\022\016\n\006action\030\004 \001(\t\"]\n\025DeleteWorkf" +
+      "lowRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarif" +
+      "ai.api.UserAppIDSet\022\023\n\013workflow_id\030\002 \001(\t" +
+      "\"j\n\026DeleteWorkflowsRequest\022/\n\013user_app_i" +
+      "d\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\013\n\003i" +
+      "ds\030\002 \003(\t\022\022\n\ndelete_all\030\003 \001(\010\"o\n\026SingleWo" +
+      "rkflowResponse\022+\n\006status\030\001 \001(\0132\033.clarifa" +
+      "i.api.status.Status\022(\n\010workflow\030\002 \001(\0132\026." +
+      "clarifai.api.Workflow\"u\n\025MultiWorkflowRe" +
+      "sponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.st" +
+      "atus.Status\022/\n\tworkflows\030\002 \003(\0132\026.clarifa" +
+      "i.api.WorkflowB\004\200\265\030\001\"\245\002\n\032PostWorkflowRes" +
+      "ultsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clari" +
+      "fai.api.UserAppIDSet\022\023\n\013workflow_id\030\002 \001(" +
+      "\t\022\022\n\nversion_id\030\007 \001(\t\022#\n\006inputs\030\003 \003(\0132\023." +
+      "clarifai.api.Input\0221\n\routput_config\030\004 \001(" +
+      "\0132\032.clarifai.api.OutputConfig\022 \n\030favor_c" +
+      "larifai_workflows\030\005 \001(\010\0223\n\016workflow_stat" +
+      "e\030\006 \001(\0132\033.clarifai.api.WorkflowState\"\330\001\n" +
+      "\033PostWorkflowResultsResponse\022+\n\006status\030\001" +
+      " \001(\0132\033.clarifai.api.status.Status\022(\n\010wor" +
+      "kflow\030\002 \001(\0132\026.clarifai.api.Workflow\022-\n\007r" +
+      "esults\030\003 \003(\0132\034.clarifai.api.WorkflowResu" +
+      "lt\0223\n\016workflow_state\030\004 \001(\0132\033.clarifai.ap" +
+      "i.WorkflowState\"\221\002\n$PostWorkflowResultsS" +
+      "imilarityRequest\022/\n\013user_app_id\030\001 \001(\0132\032." +
+      "clarifai.api.UserAppIDSet\022\023\n\013workflow_id" +
+      "\030\002 \001(\t\022\022\n\nversion_id\030\007 \001(\t\022\030\n\020model_vers" +
+      "ion_id\030\003 \001(\t\022)\n\014probe_inputs\030\004 \003(\0132\023.cla" +
+      "rifai.api.Input\022(\n\013pool_inputs\030\005 \003(\0132\023.c" +
+      "larifai.api.Input\022 \n\030favor_clarifai_work" +
+      "flows\030\006 \001(\010\"\216\001\n%PostWorkflowResultsSimil",
+      "arityResponse\022+\n\006status\030\001 \001(\0132\033.clarifai" +
+      ".api.status.Status\0228\n\007results\030\002 \003(\0132\'.cl" +
+      "arifai.api.WorkflowResultsSimilarity\"\203\001\n" +
+      "\033ListWorkflowVersionsRequest\022/\n\013user_app" +
+      "_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\023\n" +
+      "\013workflow_id\030\002 \001(\t\022\014\n\004page\030\003 \001(\r\022\020\n\010per_" +
+      "page\030\004 \001(\r\"~\n\031GetWorkflowVersionRequest\022" +
       "/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.User" +
-      "AppIDSet\022%\n\007modules\030\002 \003(\0132\024.clarifai.api" +
-      ".Module\022\016\n\006action\030\003 \001(\t\"T\n\024DeleteModules" +
-      "Request\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai." +
-      "api.UserAppIDSet\022\013\n\003ids\030\002 \003(\t\"i\n\024SingleM" +
-      "oduleResponse\022+\n\006status\030\001 \001(\0132\033.clarifai" +
-      ".api.status.Status\022$\n\006module\030\002 \001(\0132\024.cla" +
-      "rifai.api.Module\"o\n\023MultiModuleResponse\022" +
-      "+\n\006status\030\001 \001(\0132\033.clarifai.api.status.St" +
-      "atus\022+\n\007modules\030\002 \003(\0132\024.clarifai.api.Mod" +
-      "uleB\004\200\265\030\001\"x\n\027GetModuleVersionRequest\022/\n\013" +
-      "user_app_id\030\001 \001(\0132\032.clarifai.api.UserApp" +
-      "IDSet\022\021\n\tmodule_id\030\002 \001(\t\022\031\n\021module_versi" +
-      "on_id\030\003 \001(\t\"\177\n\031ListModuleVersionsRequest" +
-      "\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Use" +
-      "rAppIDSet\022\021\n\tmodule_id\030\002 \001(\t\022\014\n\004page\030\003 \001" +
-      "(\r\022\020\n\010per_page\030\004 \001(\r\"\225\001\n\031PostModuleVersi" +
-      "onsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarif" +
-      "ai.api.UserAppIDSet\022\021\n\tmodule_id\030\002 \001(\t\0224" +
-      "\n\017module_versions\030\003 \003(\0132\033.clarifai.api.M" +
-      "oduleVersion\"\246\001\n\032PatchModuleVersionsRequ" +
-      "est\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api." +
-      "UserAppIDSet\022\021\n\tmodule_id\030\002 \001(\t\0224\n\017modul" +
-      "e_versions\030\003 \003(\0132\033.clarifai.api.ModuleVe" +
-      "rsion\022\016\n\006action\030\004 \001(\t\"n\n\033DeleteModuleVer" +
+      "AppIDSet\022\023\n\013workflow_id\030\002 \001(\t\022\033\n\023workflo" +
+      "w_version_id\030\003 \001(\t\"\203\001\n\035DeleteWorkflowVer" +
       "sionsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clar" +
-      "ifai.api.UserAppIDSet\022\021\n\tmodule_id\030\002 \001(\t" +
-      "\022\013\n\003ids\030\003 \003(\t\"\202\001\n!GetModuleVersionUsageC" +
-      "ountRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clari" +
-      "fai.api.UserAppIDSet\022\021\n\tmodule_id\030\002 \001(\t\022" +
-      "\031\n\021module_version_id\030\003 \001(\t\"\177\n\033SingleModu" +
-      "leVersionResponse\022+\n\006status\030\001 \001(\0132\033.clar" +
-      "ifai.api.status.Status\0223\n\016module_version" +
-      "\030\002 \001(\0132\033.clarifai.api.ModuleVersion\"\205\001\n\032" +
-      "MultiModuleVersionResponse\022+\n\006status\030\001 \001" +
-      "(\0132\033.clarifai.api.status.Status\022:\n\017modul" +
-      "e_versions\030\002 \003(\0132\033.clarifai.api.ModuleVe" +
-      "rsionB\004\200\265\030\001\"i\n%SingleModuleVersionUsageC" +
-      "ountResponse\022+\n\006status\030\001 \001(\0132\033.clarifai." +
-      "api.status.Status\022\023\n\013usage_count\030\002 \001(\r\"x" +
-      "\n GetInstalledModuleVersionRequest\022/\n\013us" +
-      "er_app_id\030\001 \001(\0132\032.clarifai.api.UserAppID" +
-      "Set\022#\n\033installed_module_version_id\030\002 \001(\t" +
-      "\"u\n\"ListInstalledModuleVersionsRequest\022/" +
+      "ifai.api.UserAppIDSet\022\023\n\013workflow_id\030\002 \001" +
+      "(\t\022\034\n\024workflow_version_ids\030\003 \003(\t\"\256\001\n\034Pat" +
+      "chWorkflowVersionsRequest\022/\n\013user_app_id" +
+      "\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\023\n\013wo" +
+      "rkflow_id\030\002 \001(\t\0228\n\021workflow_versions\030\003 \003" +
+      "(\0132\035.clarifai.api.WorkflowVersion\022\016\n\006act" +
+      "ion\030\004 \001(\t\"\213\001\n\034MultiWorkflowVersionRespon" +
+      "se\022+\n\006status\030\001 \001(\0132\033.clarifai.api.status" +
+      ".Status\022>\n\021workflow_versions\030\002 \003(\0132\035.cla" +
+      "rifai.api.WorkflowVersionB\004\200\265\030\001\"\205\001\n\035Sing" +
+      "leWorkflowVersionResponse\022+\n\006status\030\001 \001(" +
+      "\0132\033.clarifai.api.status.Status\0227\n\020workfl" +
+      "ow_version\030\002 \001(\0132\035.clarifai.api.Workflow" +
+      "Version\"\205\001\n\032PostAppDuplicationsRequest\022/" +
+      "\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserA" +
+      "ppIDSet\0226\n\020app_duplications\030\002 \003(\0132\034.clar" +
+      "ifai.api.AppDuplication\"g\n\030GetAppDuplica" +
+      "tionRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clari" +
+      "fai.api.UserAppIDSet\022\032\n\022app_duplication_" +
+      "id\030\002 \001(\t\"m\n\032ListAppDuplicationsRequest\022/" +
       "\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserA" +
       "ppIDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"" +
-      "\236\001\n\"PostInstalledModuleVersionsRequest\022/" +
+      "\203\001\n\034MultiAppDuplicationsResponse\022+\n\006stat" +
+      "us\030\001 \001(\0132\033.clarifai.api.status.Status\0226\n" +
+      "\020app_duplications\030\002 \003(\0132\034.clarifai.api.A" +
+      "ppDuplication\"\202\001\n\034SingleAppDuplicationRe" +
+      "sponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.st" +
+      "atus.Status\0225\n\017app_duplication\030\002 \001(\0132\034.c" +
+      "larifai.api.AppDuplication\"f\n\020PostTasksR" +
+      "equest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.a" +
+      "pi.UserAppIDSet\022!\n\005tasks\030\002 \003(\0132\022.clarifa" +
+      "i.api.Task\"m\n\016GetTaskRequest\022/\n\013user_app" +
+      "_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\017\n" +
+      "\007task_id\030\002 \001(\t\022\031\n\021additional_fields\030\003 \003(" +
+      "\t\"\373\001\n\020ListTasksRequest\022/\n\013user_app_id\030\001 " +
+      "\001(\0132\032.clarifai.api.UserAppIDSet\022\014\n\004page\030" +
+      "\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\022\027\n\017worker_user_i" +
+      "ds\030\004 \003(\t\022\027\n\017review_user_ids\030\005 \003(\t\022\027\n\017lab" +
+      "el_order_ids\030\010 \003(\t\022#\n\033including_label_or" +
+      "der_tasks\030\006 \001(\010\022\031\n\021additional_fields\030\007 \003" +
+      "(\t\022\013\n\003ids\030\t \003(\t\"w\n\021PatchTasksRequest\022/\n\013" +
+      "user_app_id\030\001 \001(\0132\032.clarifai.api.UserApp" +
+      "IDSet\022!\n\005tasks\030\002 \003(\0132\022.clarifai.api.Task" +
+      "\022\016\n\006action\030\003 \001(\t\"R\n\022DeleteTasksRequest\022/" +
       "\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserA" +
-      "ppIDSet\022G\n\031installed_module_versions\030\002 \003" +
-      "(\0132$.clarifai.api.InstalledModuleVersion" +
-      "\"}\n%PostInstalledModuleVersionsKeyReques" +
-      "t\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Us" +
-      "erAppIDSet\022#\n\033installed_module_version_i" +
-      "d\030\002 \001(\t\"d\n$DeleteInstalledModuleVersions" +
-      "Request\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai." +
-      "api.UserAppIDSet\022\013\n\003ids\030\002 \003(\t\"\233\001\n$Single" +
-      "InstalledModuleVersionResponse\022+\n\006status" +
-      "\030\001 \001(\0132\033.clarifai.api.status.Status\022F\n\030i" +
-      "nstalled_module_version\030\002 \001(\0132$.clarifai" +
-      ".api.InstalledModuleVersion\"\241\001\n#MultiIns" +
-      "talledModuleVersionResponse\022+\n\006status\030\001 " +
-      "\001(\0132\033.clarifai.api.status.Status\022M\n\031inst" +
-      "alled_module_versions\030\002 \003(\0132$.clarifai.a" +
-      "pi.InstalledModuleVersionB\004\200\265\030\001\"b\n\036ListN" +
-      "extTaskAssignmentsRequest\022/\n\013user_app_id" +
-      "\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\017\n\007ta" +
-      "sk_id\030\002 \001(\t\"\202\001\n\031PostBulkOperationsReques" +
+      "ppIDSet\022\013\n\003ids\030\002 \003(\t\"i\n\021MultiTaskRespons" +
+      "e\022+\n\006status\030\001 \001(\0132\033.clarifai.api.status." +
+      "Status\022\'\n\005tasks\030\002 \003(\0132\022.clarifai.api.Tas" +
+      "kB\004\200\265\030\001\"c\n\022SingleTaskResponse\022+\n\006status\030" +
+      "\001 \001(\0132\033.clarifai.api.status.Status\022 \n\004ta" +
+      "sk\030\002 \001(\0132\022.clarifai.api.Task\"\242\001\n\023GetTask" +
+      "CountRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clar" +
+      "ifai.api.UserAppIDSet\022\017\n\007task_id\030\002 \001(\t\022\020" +
+      "\n\010user_ids\030\003 \003(\t\022\031\n\021model_version_ids\030\004 " +
+      "\003(\t\022\034\n\024workflow_version_ids\030\005 \003(\t\"\235\001\n\027Si" +
+      "ngleTaskCountResponse\022+\n\006status\030\001 \001(\0132\033." +
+      "clarifai.api.status.Status\022\016\n\006app_id\030\002 \001" +
+      "(\t\022\017\n\007task_id\030\003 \001(\t\0224\n\006counts\030\004 \003(\0132$.cl" +
+      "arifai.api.TaskStatusCountPerUser\"y\n\026Pos" +
+      "tLabelOrdersRequest\022/\n\013user_app_id\030\001 \001(\013" +
+      "2\032.clarifai.api.UserAppIDSet\022.\n\014label_or" +
+      "ders\030\002 \003(\0132\030.clarifai.api.LabelOrder\"_\n\024" +
+      "GetLabelOrderRequest\022/\n\013user_app_id\030\001 \001(" +
+      "\0132\032.clarifai.api.UserAppIDSet\022\026\n\016label_o" +
+      "rder_id\030\002 \001(\t\"i\n\026ListLabelOrdersRequest\022" +
+      "/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.User" +
+      "AppIDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r" +
+      "\"\212\001\n\027PatchLabelOrdersRequest\022/\n\013user_app" +
+      "_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022.\n" +
+      "\014label_orders\030\002 \003(\0132\030.clarifai.api.Label" +
+      "Order\022\016\n\006action\030\003 \001(\t\"X\n\030DeleteLabelOrde" +
+      "rsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifa" +
+      "i.api.UserAppIDSet\022\013\n\003ids\030\002 \003(\t\"|\n\027Multi" +
+      "LabelOrderResponse\022+\n\006status\030\001 \001(\0132\033.cla" +
+      "rifai.api.status.Status\0224\n\014label_orders\030" +
+      "\002 \003(\0132\030.clarifai.api.LabelOrderB\004\200\265\030\001\"v\n" +
+      "\030SingleLabelOrderResponse\022+\n\006status\030\001 \001(" +
+      "\0132\033.clarifai.api.status.Status\022-\n\013label_" +
+      "order\030\002 \001(\0132\030.clarifai.api.LabelOrder\"u\n" +
+      "\025PostCollectorsRequest\022/\n\013user_app_id\030\001 " +
+      "\001(\0132\032.clarifai.api.UserAppIDSet\022+\n\ncolle" +
+      "ctors\030\002 \003(\0132\027.clarifai.api.Collector\"\206\001\n" +
+      "\026PatchCollectorsRequest\022/\n\013user_app_id\030\001" +
+      " \001(\0132\032.clarifai.api.UserAppIDSet\022+\n\ncoll" +
+      "ectors\030\002 \003(\0132\027.clarifai.api.Collector\022\016\n" +
+      "\006action\030\003 \001(\t\"k\n\027DeleteCollectorsRequest" +
+      "\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Use" +
+      "rAppIDSet\022\013\n\003ids\030\002 \003(\t\022\022\n\ndelete_all\030\003 \001" +
+      "(\010\"\\\n\023GetCollectorRequest\022/\n\013user_app_id" +
+      "\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\024\n\014co" +
+      "llector_id\030\002 \001(\t\"h\n\025ListCollectorsReques" +
       "t\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Us" +
-      "erAppIDSet\0224\n\017bulk_operations\030\002 \003(\0132\033.cl" +
-      "arifai.api.BulkOperation\"l\n\031ListBulkOper" +
-      "ationsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cla" +
+      "erAppIDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001" +
+      "(\r\"r\n\026MultiCollectorResponse\022+\n\006status\030\001" +
+      " \001(\0132\033.clarifai.api.status.Status\022+\n\ncol" +
+      "lectors\030\002 \003(\0132\027.clarifai.api.Collector\"r" +
+      "\n\027SingleCollectorResponse\022+\n\006status\030\001 \001(" +
+      "\0132\033.clarifai.api.status.Status\022*\n\tcollec" +
+      "tor\030\002 \001(\0132\027.clarifai.api.Collector\"v\n\025Po" +
+      "stStatValuesRequest\022/\n\013user_app_id\030\001 \001(\013" +
+      "2\032.clarifai.api.UserAppIDSet\022,\n\013stat_val" +
+      "ues\030\002 \003(\0132\027.clarifai.api.StatValue\"y\n\026Mu" +
+      "ltiStatValueResponse\022+\n\006status\030\001 \001(\0132\033.c" +
+      "larifai.api.status.Status\0222\n\013stat_values" +
+      "\030\002 \003(\0132\027.clarifai.api.StatValueB\004\200\265\030\001\"\236\001" +
+      "\n\036PostStatValuesAggregateRequest\022/\n\013user" +
+      "_app_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSe" +
+      "t\022K\n\034stat_value_aggregate_queries\030\002 \003(\0132" +
+      "%.clarifai.api.StatValueAggregateQuery\"\234" +
+      "\001\n\037MultiStatValueAggregateResponse\022+\n\006st" +
+      "atus\030\001 \001(\0132\033.clarifai.api.status.Status\022" +
+      "L\n\034stat_value_aggregate_results\030\002 \003(\0132&." +
+      "clarifai.api.StatValueAggregateResult\"w\n" +
+      "\036PostTrendingMetricsViewRequest\022/\n\013user_" +
+      "app_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet" +
+      "\022\021\n\tview_type\030\002 \001(\t\022\021\n\tobject_id\030\003 \001(\t\"\205" +
+      "\001\n\037ListTrendingMetricsViewsRequest\022/\n\013us" +
+      "er_app_id\030\001 \001(\0132\032.clarifai.api.UserAppID" +
+      "Set\022\021\n\tview_type\030\002 \001(\t\022\014\n\004page\030\003 \001(\r\022\020\n\010" +
+      "per_page\030\004 \001(\r\"~\n MultiTrendingMetricsVi" +
+      "ewResponse\022+\n\006status\030\001 \001(\0132\033.clarifai.ap" +
+      "i.status.Status\022-\n\007metrics\030\002 \003(\0132\034.clari" +
+      "fai.api.TrendingMetric\"q\n\020GetModuleReque" +
+      "st\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.U" +
+      "serAppIDSet\022\021\n\tmodule_id\030\002 \001(\t\022\031\n\021additi" +
+      "onal_fields\030\003 \003(\t\"\375\002\n\022ListModulesRequest" +
+      "\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Use" +
+      "rAppIDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(" +
+      "\r\022\031\n\021additional_fields\030\005 \003(\t\022\026\n\016sort_asc" +
+      "ending\030\006 \001(\010\022\034\n\022sort_by_created_at\030\007 \001(\010" +
+      "H\000\022\034\n\022sort_by_star_count\030\010 \001(\010H\000\022\035\n\023sort" +
+      "_by_modified_at\030\t \001(\010H\000\022\024\n\nsort_by_id\030\013 " +
+      "\001(\010H\000\022\024\n\014starred_only\030\004 \001(\010\022\020\n\010bookmark\030" +
+      "\n \001(\010\022\016\n\006search\030\016 \001(\t\022\020\n\004name\030\014 \001(\tB\002\030\001\022" +
+      "\035\n\021filter_by_user_id\030\r \001(\010B\002\030\001B\t\n\007sort_b" +
+      "y\"l\n\022PostModulesRequest\022/\n\013user_app_id\030\001" +
+      " \001(\0132\032.clarifai.api.UserAppIDSet\022%\n\007modu" +
+      "les\030\003 \003(\0132\024.clarifai.api.Module\"}\n\023Patch" +
+      "ModulesRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cl" +
+      "arifai.api.UserAppIDSet\022%\n\007modules\030\002 \003(\013" +
+      "2\024.clarifai.api.Module\022\016\n\006action\030\003 \001(\t\"T" +
+      "\n\024DeleteModulesRequest\022/\n\013user_app_id\030\001 " +
+      "\001(\0132\032.clarifai.api.UserAppIDSet\022\013\n\003ids\030\002" +
+      " \003(\t\"i\n\024SingleModuleResponse\022+\n\006status\030\001" +
+      " \001(\0132\033.clarifai.api.status.Status\022$\n\006mod" +
+      "ule\030\002 \001(\0132\024.clarifai.api.Module\"o\n\023Multi" +
+      "ModuleResponse\022+\n\006status\030\001 \001(\0132\033.clarifa" +
+      "i.api.status.Status\022+\n\007modules\030\002 \003(\0132\024.c" +
+      "larifai.api.ModuleB\004\200\265\030\001\"x\n\027GetModuleVer" +
+      "sionRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clari" +
+      "fai.api.UserAppIDSet\022\021\n\tmodule_id\030\002 \001(\t\022" +
+      "\031\n\021module_version_id\030\003 \001(\t\"\177\n\031ListModule" +
+      "VersionsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.c" +
+      "larifai.api.UserAppIDSet\022\021\n\tmodule_id\030\002 " +
+      "\001(\t\022\014\n\004page\030\003 \001(\r\022\020\n\010per_page\030\004 \001(\r\"\225\001\n\031" +
+      "PostModuleVersionsRequest\022/\n\013user_app_id" +
+      "\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\021\n\tmo" +
+      "dule_id\030\002 \001(\t\0224\n\017module_versions\030\003 \003(\0132\033" +
+      ".clarifai.api.ModuleVersion\"\246\001\n\032PatchMod" +
+      "uleVersionsRequest\022/\n\013user_app_id\030\001 \001(\0132" +
+      "\032.clarifai.api.UserAppIDSet\022\021\n\tmodule_id" +
+      "\030\002 \001(\t\0224\n\017module_versions\030\003 \003(\0132\033.clarif" +
+      "ai.api.ModuleVersion\022\016\n\006action\030\004 \001(\t\"n\n\033" +
+      "DeleteModuleVersionsRequest\022/\n\013user_app_" +
+      "id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\021\n\t" +
+      "module_id\030\002 \001(\t\022\013\n\003ids\030\003 \003(\t\"\202\001\n!GetModu" +
+      "leVersionUsageCountRequest\022/\n\013user_app_i" +
+      "d\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\021\n\tm" +
+      "odule_id\030\002 \001(\t\022\031\n\021module_version_id\030\003 \001(" +
+      "\t\"\177\n\033SingleModuleVersionResponse\022+\n\006stat" +
+      "us\030\001 \001(\0132\033.clarifai.api.status.Status\0223\n" +
+      "\016module_version\030\002 \001(\0132\033.clarifai.api.Mod" +
+      "uleVersion\"\205\001\n\032MultiModuleVersionRespons" +
+      "e\022+\n\006status\030\001 \001(\0132\033.clarifai.api.status." +
+      "Status\022:\n\017module_versions\030\002 \003(\0132\033.clarif" +
+      "ai.api.ModuleVersionB\004\200\265\030\001\"i\n%SingleModu" +
+      "leVersionUsageCountResponse\022+\n\006status\030\001 " +
+      "\001(\0132\033.clarifai.api.status.Status\022\023\n\013usag" +
+      "e_count\030\002 \001(\r\"x\n GetInstalledModuleVersi" +
+      "onRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifa" +
+      "i.api.UserAppIDSet\022#\n\033installed_module_v" +
+      "ersion_id\030\002 \001(\t\"u\n\"ListInstalledModuleVe" +
+      "rsionsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cla" +
       "rifai.api.UserAppIDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010" +
-      "per_page\030\003 \001(\r\"V\n\027GetBulkOperationReques" +
-      "t\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Us" +
-      "erAppIDSet\022\n\n\002id\030\002 \001(\t\"Z\n\032CancelBulkOper" +
-      "ationRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clar" +
-      "ifai.api.UserAppIDSet\022\013\n\003ids\030\002 \003(\t\"Z\n\032De" +
-      "leteBulkOperationRequest\022/\n\013user_app_id\030" +
-      "\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\013\n\003ids" +
-      "\030\002 \003(\t\"\200\001\n\034SingleBulkOperationsResponse\022" +
-      "+\n\006status\030\001 \001(\0132\033.clarifai.api.status.St" +
-      "atus\0223\n\016bulk_operation\030\002 \001(\0132\033.clarifai." +
-      "api.BulkOperation\"\177\n\033MultiBulkOperations" +
+      "per_page\030\003 \001(\r\"\236\001\n\"PostInstalledModuleVe" +
+      "rsionsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cla" +
+      "rifai.api.UserAppIDSet\022G\n\031installed_modu" +
+      "le_versions\030\002 \003(\0132$.clarifai.api.Install" +
+      "edModuleVersion\"}\n%PostInstalledModuleVe" +
+      "rsionsKeyRequest\022/\n\013user_app_id\030\001 \001(\0132\032." +
+      "clarifai.api.UserAppIDSet\022#\n\033installed_m" +
+      "odule_version_id\030\002 \001(\t\"d\n$DeleteInstalle" +
+      "dModuleVersionsRequest\022/\n\013user_app_id\030\001 " +
+      "\001(\0132\032.clarifai.api.UserAppIDSet\022\013\n\003ids\030\002" +
+      " \003(\t\"\233\001\n$SingleInstalledModuleVersionRes" +
+      "ponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.sta" +
+      "tus.Status\022F\n\030installed_module_version\030\002" +
+      " \001(\0132$.clarifai.api.InstalledModuleVersi" +
+      "on\"\241\001\n#MultiInstalledModuleVersionRespon" +
+      "se\022+\n\006status\030\001 \001(\0132\033.clarifai.api.status" +
+      ".Status\022M\n\031installed_module_versions\030\002 \003" +
+      "(\0132$.clarifai.api.InstalledModuleVersion" +
+      "B\004\200\265\030\001\"b\n\036ListNextTaskAssignmentsRequest" +
+      "\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Use" +
+      "rAppIDSet\022\017\n\007task_id\030\002 \001(\t\"\202\001\n\031PostBulkO" +
+      "perationsRequest\022/\n\013user_app_id\030\001 \001(\0132\032." +
+      "clarifai.api.UserAppIDSet\0224\n\017bulk_operat" +
+      "ions\030\002 \003(\0132\033.clarifai.api.BulkOperation\"" +
+      "l\n\031ListBulkOperationsRequest\022/\n\013user_app" +
+      "_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\014\n" +
+      "\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"V\n\027GetBulk" +
+      "OperationRequest\022/\n\013user_app_id\030\001 \001(\0132\032." +
+      "clarifai.api.UserAppIDSet\022\n\n\002id\030\002 \001(\t\"Z\n" +
+      "\032CancelBulkOperationRequest\022/\n\013user_app_" +
+      "id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\013\n\003" +
+      "ids\030\002 \003(\t\"Z\n\032DeleteBulkOperationRequest\022" +
+      "/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.User" +
+      "AppIDSet\022\013\n\003ids\030\002 \003(\t\"\200\001\n\034SingleBulkOper" +
+      "ationsResponse\022+\n\006status\030\001 \001(\0132\033.clarifa" +
+      "i.api.status.Status\0223\n\016bulk_operation\030\002 " +
+      "\001(\0132\033.clarifai.api.BulkOperation\"\177\n\033Mult" +
+      "iBulkOperationsResponse\022+\n\006status\030\001 \001(\0132" +
+      "\033.clarifai.api.status.Status\0223\n\016bulk_ope" +
+      "ration\030\002 \003(\0132\033.clarifai.api.BulkOperatio" +
+      "n\"\330\003\n\031PutTaskAssignmentsRequest\022/\n\013user_" +
+      "app_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet" +
+      "\022\017\n\007task_id\030\002 \001(\t\022\020\n\010input_id\030\003 \001(\t\022=\n\006a" +
+      "ction\030\004 \001(\0162-.clarifai.api.PutTaskAssign" +
+      "mentsRequestAction\022>\n\023label_submit_confi" +
+      "g\030\006 \001(\0132\037.clarifai.api.LabelSubmitConfig" +
+      "H\000\022B\n\025review_approve_config\030\007 \001(\0132!.clar" +
+      "ifai.api.ReviewApproveConfigH\000\022Q\n\035review" +
+      "_request_changes_config\030\010 \001(\0132(.clarifai" +
+      ".api.ReviewRequestChangesConfigH\000\022@\n\024rev" +
+      "iew_reject_config\030\t \001(\0132 .clarifai.api.R" +
+      "eviewRejectConfigH\000B\017\n\raction_config\"K\n\021" +
+      "LabelSubmitConfig\0226\n\020task_assignments\030\001 " +
+      "\003(\0132\034.clarifai.api.TaskAssignment\"t\n\023Rev" +
+      "iewApproveConfig\0226\n\020task_assignments\030\001 \003" +
+      "(\0132\034.clarifai.api.TaskAssignment\022%\n\007work" +
+      "ers\030\002 \003(\0132\024.clarifai.api.Worker\"{\n\032Revie" +
+      "wRequestChangesConfig\0226\n\020task_assignment" +
+      "s\030\001 \003(\0132\034.clarifai.api.TaskAssignment\022%\n" +
+      "\007workers\030\002 \003(\0132\024.clarifai.api.Worker\"s\n\022" +
+      "ReviewRejectConfig\0226\n\020task_assignments\030\001" +
+      " \003(\0132\034.clarifai.api.TaskAssignment\022%\n\007wo" +
+      "rkers\030\002 \003(\0132\024.clarifai.api.Worker\"\210\001\n\033Mu" +
+      "ltiTaskAssignmentResponse\022+\n\006status\030\001 \001(" +
+      "\0132\033.clarifai.api.status.Status\022<\n\020task_a" +
+      "ssignments\030\002 \003(\0132\034.clarifai.api.TaskAssi" +
+      "gnmentB\004\200\265\030\001\"k\n\030ListInputsAddJobsRequest" +
+      "\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Use" +
+      "rAppIDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(" +
+      "\r\"U\n\026GetInputsAddJobRequest\022/\n\013user_app_" +
+      "id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\n\n\002" +
+      "id\030\002 \001(\t\"X\n\031CancelInputsAddJobRequest\022/\n" +
+      "\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserAp" +
+      "pIDSet\022\n\n\002id\030\002 \001(\t\"\203\001\n\031MultiInputsAddJob" +
       "Response\022+\n\006status\030\001 \001(\0132\033.clarifai.api." +
-      "status.Status\0223\n\016bulk_operation\030\002 \003(\0132\033." +
-      "clarifai.api.BulkOperation\"\330\003\n\031PutTaskAs" +
-      "signmentsRequest\022/\n\013user_app_id\030\001 \001(\0132\032." +
-      "clarifai.api.UserAppIDSet\022\017\n\007task_id\030\002 \001" +
-      "(\t\022\020\n\010input_id\030\003 \001(\t\022=\n\006action\030\004 \001(\0162-.c" +
-      "larifai.api.PutTaskAssignmentsRequestAct" +
-      "ion\022>\n\023label_submit_config\030\006 \001(\0132\037.clari" +
-      "fai.api.LabelSubmitConfigH\000\022B\n\025review_ap" +
-      "prove_config\030\007 \001(\0132!.clarifai.api.Review" +
-      "ApproveConfigH\000\022Q\n\035review_request_change" +
-      "s_config\030\010 \001(\0132(.clarifai.api.ReviewRequ" +
-      "estChangesConfigH\000\022@\n\024review_reject_conf" +
-      "ig\030\t \001(\0132 .clarifai.api.ReviewRejectConf" +
-      "igH\000B\017\n\raction_config\"K\n\021LabelSubmitConf" +
-      "ig\0226\n\020task_assignments\030\001 \003(\0132\034.clarifai." +
-      "api.TaskAssignment\"t\n\023ReviewApproveConfi" +
-      "g\0226\n\020task_assignments\030\001 \003(\0132\034.clarifai.a" +
-      "pi.TaskAssignment\022%\n\007workers\030\002 \003(\0132\024.cla" +
-      "rifai.api.Worker\"{\n\032ReviewRequestChanges" +
-      "Config\0226\n\020task_assignments\030\001 \003(\0132\034.clari" +
-      "fai.api.TaskAssignment\022%\n\007workers\030\002 \003(\0132" +
-      "\024.clarifai.api.Worker\"s\n\022ReviewRejectCon" +
-      "fig\0226\n\020task_assignments\030\001 \003(\0132\034.clarifai" +
-      ".api.TaskAssignment\022%\n\007workers\030\002 \003(\0132\024.c" +
-      "larifai.api.Worker\"\210\001\n\033MultiTaskAssignme" +
-      "ntResponse\022+\n\006status\030\001 \001(\0132\033.clarifai.ap" +
-      "i.status.Status\022<\n\020task_assignments\030\002 \003(" +
-      "\0132\034.clarifai.api.TaskAssignmentB\004\200\265\030\001\"k\n" +
-      "\030ListInputsAddJobsRequest\022/\n\013user_app_id" +
-      "\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\014\n\004pa" +
-      "ge\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"U\n\026GetInputsA" +
-      "ddJobRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clar" +
-      "ifai.api.UserAppIDSet\022\n\n\002id\030\002 \001(\t\"X\n\031Can" +
-      "celInputsAddJobRequest\022/\n\013user_app_id\030\001 " +
-      "\001(\0132\032.clarifai.api.UserAppIDSet\022\n\n\002id\030\002 " +
-      "\001(\t\"\203\001\n\031MultiInputsAddJobResponse\022+\n\006sta" +
-      "tus\030\001 \001(\0132\033.clarifai.api.status.Status\0229" +
-      "\n\017inputs_add_jobs\030\002 \003(\0132\032.clarifai.api.I" +
-      "nputsAddJobB\004\200\265\030\001\"}\n\032SingleInputsAddJobR" +
-      "esponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.s" +
-      "tatus.Status\0222\n\016inputs_add_job\030\002 \001(\0132\032.c" +
-      "larifai.api.InputsAddJob\"l\n\022PostUploadsR" +
-      "equest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.a" +
-      "pi.UserAppIDSet\022%\n\007uploads\030\002 \003(\0132\024.clari" +
-      "fai.api.Upload\"T\n\024DeleteUploadsRequest\022/" +
+      "status.Status\0229\n\017inputs_add_jobs\030\002 \003(\0132\032" +
+      ".clarifai.api.InputsAddJobB\004\200\265\030\001\"}\n\032Sing" +
+      "leInputsAddJobResponse\022+\n\006status\030\001 \001(\0132\033" +
+      ".clarifai.api.status.Status\0222\n\016inputs_ad" +
+      "d_job\030\002 \001(\0132\032.clarifai.api.InputsAddJob\"" +
+      "l\n\022PostUploadsRequest\022/\n\013user_app_id\030\001 \001" +
+      "(\0132\032.clarifai.api.UserAppIDSet\022%\n\007upload" +
+      "s\030\002 \003(\0132\024.clarifai.api.Upload\"T\n\024DeleteU" +
+      "ploadsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.cla" +
+      "rifai.api.UserAppIDSet\022\013\n\003ids\030\002 \003(\t\"e\n\022L" +
+      "istUploadsRequest\022/\n\013user_app_id\030\001 \001(\0132\032" +
+      ".clarifai.api.UserAppIDSet\022\014\n\004page\030\002 \001(\r" +
+      "\022\020\n\010per_page\030\003 \001(\r\"V\n\020GetUploadRequest\022/" +
       "\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserA" +
-      "ppIDSet\022\013\n\003ids\030\002 \003(\t\"e\n\022ListUploadsReque" +
-      "st\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.U" +
-      "serAppIDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 " +
-      "\001(\r\"V\n\020GetUploadRequest\022/\n\013user_app_id\030\001" +
-      " \001(\0132\032.clarifai.api.UserAppIDSet\022\021\n\tuplo" +
-      "ad_id\030\002 \001(\t\"i\n\024SingleUploadResponse\022+\n\006s" +
-      "tatus\030\001 \001(\0132\033.clarifai.api.status.Status" +
-      "\022$\n\006upload\030\002 \001(\0132\024.clarifai.api.Upload\"i" +
-      "\n\023MultiUploadResponse\022+\n\006status\030\001 \001(\0132\033." +
-      "clarifai.api.status.Status\022%\n\007uploads\030\002 " +
-      "\003(\0132\024.clarifai.api.Upload\"\232\001\n\034PutUploadC" +
-      "ontentPartsRequest\022/\n\013user_app_id\030\001 \001(\0132" +
-      "\032.clarifai.api.UserAppIDSet\022\021\n\tupload_id" +
-      "\030\002 \001(\t\0226\n\rcontent_parts\030\003 \003(\0132\037.clarifai" +
-      ".api.UploadContentPart\"\255\001\n\034PostInputsDat" +
-      "aSourcesRequest\022/\n\013user_app_id\030\001 \001(\0132\032.c" +
-      "larifai.api.UserAppIDSet\0224\n\014data_sources" +
-      "\030\002 \003(\0132\036.clarifai.api.InputsDataSource\022\025" +
-      "\n\rcall_back_url\030\003 \001(\t\022\017\n\007app_pat\030\004 \001(\t\"r" +
-      "\n\035GetInputsExtractionJobRequest\022/\n\013user_" +
+      "ppIDSet\022\021\n\tupload_id\030\002 \001(\t\"i\n\024SingleUplo" +
+      "adResponse\022+\n\006status\030\001 \001(\0132\033.clarifai.ap" +
+      "i.status.Status\022$\n\006upload\030\002 \001(\0132\024.clarif" +
+      "ai.api.Upload\"i\n\023MultiUploadResponse\022+\n\006" +
+      "status\030\001 \001(\0132\033.clarifai.api.status.Statu" +
+      "s\022%\n\007uploads\030\002 \003(\0132\024.clarifai.api.Upload" +
+      "\"\232\001\n\034PutUploadContentPartsRequest\022/\n\013use" +
+      "r_app_id\030\001 \001(\0132\032.clarifai.api.UserAppIDS" +
+      "et\022\021\n\tupload_id\030\002 \001(\t\0226\n\rcontent_parts\030\003" +
+      " \003(\0132\037.clarifai.api.UploadContentPart\"\255\001" +
+      "\n\034PostInputsDataSourcesRequest\022/\n\013user_a" +
+      "pp_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022" +
+      "4\n\014data_sources\030\002 \003(\0132\036.clarifai.api.Inp" +
+      "utsDataSource\022\025\n\rcall_back_url\030\003 \001(\t\022\017\n\007" +
+      "app_pat\030\004 \001(\t\"r\n\035GetInputsExtractionJobR" +
+      "equest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.a" +
+      "pi.UserAppIDSet\022 \n\030inputs_extraction_job" +
+      "_id\030\002 \001(\t\"r\n\037ListInputsExtractionJobsReq" +
+      "uest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api" +
+      ".UserAppIDSet\022\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030" +
+      "\003 \001(\r\"\222\001\n!SingleInputsExtractionJobRespo" +
+      "nse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.statu" +
+      "s.Status\022@\n\025inputs_extraction_job\030\002 \001(\0132" +
+      "!.clarifai.api.InputsExtractionJob\"\222\001\n M" +
+      "ultiInputsExtractionJobResponse\022+\n\006statu" +
+      "s\030\001 \001(\0132\033.clarifai.api.status.Status\022A\n\026" +
+      "inputs_extraction_jobs\030\002 \003(\0132!.clarifai." +
+      "api.InputsExtractionJob\"a\n!CancelInputsE" +
+      "xtractionJobsRequest\022/\n\013user_app_id\030\001 \001(" +
+      "\0132\032.clarifai.api.UserAppIDSet\022\013\n\003ids\030\002 \003" +
+      "(\t\"\177\n\030PostInputsUploadsRequest\022/\n\013user_a" +
+      "pp_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022" +
+      "2\n\016inputs_uploads\030\002 \003(\0132\032.clarifai.api.I" +
+      "nputsUpload\"k\n\020GetRunnerRequest\022/\n\013user_" +
       "app_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet" +
-      "\022 \n\030inputs_extraction_job_id\030\002 \001(\t\"r\n\037Li" +
-      "stInputsExtractionJobsRequest\022/\n\013user_ap" +
-      "p_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\014" +
-      "\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"\222\001\n!Singl" +
-      "eInputsExtractionJobResponse\022+\n\006status\030\001" +
-      " \001(\0132\033.clarifai.api.status.Status\022@\n\025inp" +
-      "uts_extraction_job\030\002 \001(\0132!.clarifai.api." +
-      "InputsExtractionJob\"\222\001\n MultiInputsExtra" +
-      "ctionJobResponse\022+\n\006status\030\001 \001(\0132\033.clari" +
-      "fai.api.status.Status\022A\n\026inputs_extracti" +
-      "on_jobs\030\002 \003(\0132!.clarifai.api.InputsExtra" +
-      "ctionJob\"a\n!CancelInputsExtractionJobsRe" +
-      "quest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.ap" +
-      "i.UserAppIDSet\022\013\n\003ids\030\002 \003(\t\"\177\n\030PostInput" +
-      "sUploadsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.c" +
-      "larifai.api.UserAppIDSet\0222\n\016inputs_uploa" +
-      "ds\030\002 \003(\0132\032.clarifai.api.InputsUpload\"V\n\020" +
-      "GetRunnerRequest\022/\n\013user_app_id\030\001 \001(\0132\032." +
-      "clarifai.api.UserAppIDSet\022\021\n\trunner_id\030\002" +
-      " \001(\t\"e\n\022ListRunnersRequest\022/\n\013user_app_i" +
-      "d\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\014\n\004p" +
-      "age\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"l\n\022PostRunne" +
-      "rsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifa" +
-      "i.api.UserAppIDSet\022%\n\007runners\030\003 \003(\0132\024.cl" +
-      "arifai.api.Runner\"T\n\024DeleteRunnersReques" +
-      "t\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Us" +
-      "erAppIDSet\022\013\n\003ids\030\002 \003(\t\"i\n\024SingleRunnerR" +
-      "esponse\022+\n\006status\030\001 \001(\0132\033.clarifai.api.s" +
-      "tatus.Status\022$\n\006runner\030\002 \001(\0132\024.clarifai." +
-      "api.Runner\"o\n\023MultiRunnerResponse\022+\n\006sta" +
-      "tus\030\001 \001(\0132\033.clarifai.api.status.Status\022+" +
-      "\n\007runners\030\002 \003(\0132\024.clarifai.api.RunnerB\004\200" +
-      "\265\030\001\"\\\n\026ListRunnerItemsRequest\022/\n\013user_ap" +
-      "p_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\021" +
-      "\n\trunner_id\030\002 \001(\t\"\344\001\n\034PostRunnerItemOutp" +
-      "utsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarif" +
-      "ai.api.UserAppIDSet\022\021\n\trunner_id\030\002 \001(\t\022\026" +
-      "\n\016runner_item_id\030\003 \001(\t\022;\n\023runner_item_ou" +
-      "tputs\030\004 \003(\0132\036.clarifai.api.RunnerItemOut" +
-      "put\022+\n\006status\030\005 \001(\0132\033.clarifai.api.statu" +
-      "s.Status\"|\n\027MultiRunnerItemResponse\022+\n\006s" +
-      "tatus\030\001 \001(\0132\033.clarifai.api.status.Status" +
-      "\0224\n\014runner_items\030\002 \003(\0132\030.clarifai.api.Ru" +
-      "nnerItemB\004\200\265\030\001\"\274\001\n\nRunnerItem\022\n\n\002id\030\001 \001(" +
-      "\t\022\023\n\013description\030\002 \001(\t\0225\n\017processing_inf" +
-      "o\030\003 \001(\0132\034.clarifai.api.ProcessingInfo\022K\n" +
-      "\032post_model_outputs_request\030\004 \001(\0132%.clar" +
-      "ifai.api.PostModelOutputsRequestH\000B\t\n\007re" +
-      "quest\"b\n\020RunnerItemOutput\022B\n\025multi_outpu" +
-      "t_response\030\001 \001(\0132!.clarifai.api.MultiOut" +
-      "putResponseH\000B\n\n\010response\"\217\001\n\035MultiRunne" +
-      "rItemOutputResponse\022+\n\006status\030\001 \001(\0132\033.cl" +
-      "arifai.api.status.Status\022A\n\023runner_item_" +
-      "outputs\030\002 \003(\0132\036.clarifai.api.RunnerItemO" +
-      "utputB\004\200\265\030\001\"\304\001\n,PostModelVersionsTrainin" +
-      "gTimeEstimateRequest\022/\n\013user_app_id\030\001 \001(" +
-      "\0132\032.clarifai.api.UserAppIDSet\022\020\n\010model_i" +
-      "d\030\002 \001(\t\0222\n\016model_versions\030\003 \003(\0132\032.clarif" +
-      "ai.api.ModelVersion\022\035\n\025estimated_input_c" +
-      "ount\030\004 \001(\004\"\214\001\n!MultiTrainingTimeEstimate" +
-      "Response\022+\n\006status\030\001 \001(\0132\033.clarifai.api." +
-      "status.Status\022:\n\027training_time_estimates" +
-      "\030\002 \003(\0132\031.google.protobuf.Duration*p\n\034Org" +
-      "anizationInvitationStatus\022\013\n\007NOT_SET\020\000\022\013" +
-      "\n\007PENDING\020\001\022\014\n\010ACCEPTED\020\002\022\r\n\tCANCELLED\020\003" +
-      "\022\014\n\010DECLINED\020\004\022\013\n\007EXPIRED\020\005*\312\001\n\037PutTaskA" +
-      "ssignmentsRequestAction\022/\n+PUT_TASK_ASSI" +
-      "GNMENTS_REQUEST_ACTION_NOT_SET\020\000\022\017\n\013LABE" +
-      "L_START\020\001\022\020\n\014LABEL_SUBMIT\020\002\022\020\n\014REVIEW_ST" +
-      "ART\020\n\022\022\n\016REVIEW_APPROVE\020\013\022\032\n\026REVIEW_REQU" +
-      "EST_CHANGES\020\014\022\021\n\rREVIEW_REJECT\020\r2\345\235\003\n\002V2" +
-      "\022\256\002\n\024ListConceptRelations\022).clarifai.api" +
-      ".ListConceptRelationsRequest\032*.clarifai." +
-      "api.MultiConceptRelationResponse\"\276\001\202\323\344\223\002" +
-      "\253\001\022Y/v2/users/{user_app_id.user_id}/apps" +
-      "/{user_app_id.app_id}/concepts/{concept_" +
-      "id}/relationsZN\022L/v2/users/{user_app_id." +
-      "user_id}/apps/{user_app_id.app_id}/conce" +
-      "pts/relations\230\234\'\005\220\234\'-\220\234\'\013\022\343\001\n\024PostConcep" +
-      "tRelations\022).clarifai.api.PostConceptRel" +
-      "ationsRequest\032*.clarifai.api.MultiConcep" +
-      "tRelationResponse\"t\202\323\344\223\002^\"Y/v2/users/{us" +
-      "er_app_id.user_id}/apps/{user_app_id.app" +
-      "_id}/concepts/{concept_id}/relations:\001*\230" +
-      "\234\'\005\220\234\'-\220\234\'\n\220\234\'\013\022\342\001\n\026DeleteConceptRelatio" +
-      "ns\022+.clarifai.api.DeleteConceptRelations" +
-      "Request\032!.clarifai.api.status.BaseRespon" +
-      "se\"x\202\323\344\223\002^*Y/v2/users/{user_app_id.user_" +
-      "id}/apps/{user_app_id.app_id}/concepts/{" +
-      "concept_id}/relations:\001*\230\234\'\005\220\234\'-\220\234\'\r\220\234\'\n" +
-      "\220\234\'\013\022\340\001\n\020GetConceptCounts\022%.clarifai.api" +
-      ".GetConceptCountsRequest\032\'.clarifai.api." +
-      "MultiConceptCountResponse\"|\202\323\344\223\002b\022I/v2/u" +
-      "sers/{user_app_id.user_id}/apps/{user_ap" +
-      "p_id.app_id}/concepts/statusZ\025\022\023/v2/conc" +
-      "epts/status\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\022\325\001\n\nGetC" +
-      "oncept\022\037.clarifai.api.GetConceptRequest\032" +
-      "#.clarifai.api.SingleConceptResponse\"\200\001\202" +
-      "\323\344\223\002n\022O/v2/users/{user_app_id.user_id}/a" +
-      "pps/{user_app_id.app_id}/concepts/{conce",
-      "pt_id}Z\033\022\031/v2/concepts/{concept_id}\230\234\'\002\220" +
-      "\234\'-\220\234\'\013\022\275\001\n\014ListConcepts\022!.clarifai.api." +
-      "ListConceptsRequest\032\".clarifai.api.Multi" +
-      "ConceptResponse\"f\202\323\344\223\002T\022B/v2/users/{user" +
-      "_app_id.user_id}/apps/{user_app_id.app_i" +
-      "d}/conceptsZ\016\022\014/v2/concepts\230\234\'\002\220\234\'-\220\234\'\013\022" +
-      "\275\002\n\021ListModelConcepts\022&.clarifai.api.Lis" +
-      "tModelConceptsRequest\032\".clarifai.api.Mul" +
-      "tiConceptResponse\"\333\001\202\323\344\223\002\304\001\022T/v2/users/{" +
-      "user_app_id.user_id}/apps/{user_app_id.a" +
-      "pp_id}/models/{model_id}/conceptsZl\022j/v2" +
-      "/users/{user_app_id.user_id}/apps/{user_" +
-      "app_id.app_id}/models/{model_id}/version" +
-      "s/{version_id}/concepts\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\022" +
-      "\356\001\n\024PostConceptsSearches\022).clarifai.api." +
-      "PostConceptsSearchesRequest\032\".clarifai.a" +
-      "pi.MultiConceptResponse\"\206\001\202\323\344\223\002l\"K/v2/us" +
-      "ers/{user_app_id.user_id}/apps/{user_app" +
-      "_id.app_id}/concepts/searches:\001*Z\032\"\025/v2/" +
-      "concepts/searches:\001*\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\220\234\'\023" +
-      "\022\307\001\n\014PostConcepts\022!.clarifai.api.PostCon" +
-      "ceptsRequest\032\".clarifai.api.MultiConcept" +
-      "Response\"p\202\323\344\223\002Z\"B/v2/users/{user_app_id" +
-      ".user_id}/apps/{user_app_id.app_id}/conc" +
-      "epts:\001*Z\021\"\014/v2/concepts:\001*\230\234\'\002\220\234\'-\220\234\'\n\220\234" +
-      "\'\013\022\311\001\n\rPatchConcepts\022\".clarifai.api.Patc" +
-      "hConceptsRequest\032\".clarifai.api.MultiCon" +
-      "ceptResponse\"p\202\323\344\223\002Z2B/v2/users/{user_ap" +
-      "p_id.user_id}/apps/{user_app_id.app_id}/" +
-      "concepts:\001*Z\0212\014/v2/concepts:\001*\230\234\'\002\220\234\'-\220\234" +
-      "\'\n\220\234\'\013\022\230\002\n\022GetConceptLanguage\022\'.clarifai" +
-      ".api.GetConceptLanguageRequest\032+.clarifa" +
-      "i.api.SingleConceptLanguageResponse\"\253\001\202\323" +
-      "\344\223\002\230\001\022d/v2/users/{user_app_id.user_id}/a" +
-      "pps/{user_app_id.app_id}/concepts/{conce" +
-      "pt_id}/languages/{language}Z0\022./v2/conce" +
-      "pts/{concept_id}/languages/{language}\230\234\'" +
-      "\002\220\234\'-\220\234\'\013\022\205\002\n\024ListConceptLanguages\022).cla" +
-      "rifai.api.ListConceptLanguagesRequest\032*." +
-      "clarifai.api.MultiConceptLanguageRespons" +
-      "e\"\225\001\202\323\344\223\002\202\001\022Y/v2/users/{user_app_id.user" +
+      "\022\023\n\013nodepool_id\030\002 \001(\t\022\021\n\trunner_id\030\003 \001(\t" +
+      "\"z\n\022ListRunnersRequest\022/\n\013user_app_id\030\001 " +
+      "\001(\0132\032.clarifai.api.UserAppIDSet\022\023\n\013nodep" +
+      "ool_id\030\002 \001(\t\022\014\n\004page\030\003 \001(\r\022\020\n\010per_page\030\004" +
+      " \001(\r\"\201\001\n\022PostRunnersRequest\022/\n\013user_app_" +
+      "id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022\023\n\013" +
+      "nodepool_id\030\002 \001(\t\022%\n\007runners\030\003 \003(\0132\024.cla" +
+      "rifai.api.Runner\"i\n\024DeleteRunnersRequest" +
+      "\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Use" +
+      "rAppIDSet\022\023\n\013nodepool_id\030\002 \001(\t\022\013\n\003ids\030\003 " +
+      "\003(\t\"i\n\024SingleRunnerResponse\022+\n\006status\030\001 " +
+      "\001(\0132\033.clarifai.api.status.Status\022$\n\006runn" +
+      "er\030\002 \001(\0132\024.clarifai.api.Runner\"o\n\023MultiR" +
+      "unnerResponse\022+\n\006status\030\001 \001(\0132\033.clarifai" +
+      ".api.status.Status\022+\n\007runners\030\002 \003(\0132\024.cl" +
+      "arifai.api.RunnerB\004\200\265\030\001\"q\n\026ListRunnerIte" +
+      "msRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clarifa" +
+      "i.api.UserAppIDSet\022\023\n\013nodepool_id\030\002 \001(\t\022" +
+      "\021\n\trunner_id\030\003 \001(\t\"\371\001\n\034PostRunnerItemOut" +
+      "putsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clari" +
+      "fai.api.UserAppIDSet\022\023\n\013nodepool_id\030\002 \001(" +
+      "\t\022\021\n\trunner_id\030\003 \001(\t\022\026\n\016runner_item_id\030\004" +
+      " \001(\t\022;\n\023runner_item_outputs\030\005 \003(\0132\036.clar" +
+      "ifai.api.RunnerItemOutput\022+\n\006status\030\006 \001(" +
+      "\0132\033.clarifai.api.status.Status\"|\n\027MultiR" +
+      "unnerItemResponse\022+\n\006status\030\001 \001(\0132\033.clar" +
+      "ifai.api.status.Status\0224\n\014runner_items\030\002" +
+      " \003(\0132\030.clarifai.api.RunnerItemB\004\200\265\030\001\"\274\001\n" +
+      "\nRunnerItem\022\n\n\002id\030\001 \001(\t\022\023\n\013description\030\002" +
+      " \001(\t\0225\n\017processing_info\030\003 \001(\0132\034.clarifai" +
+      ".api.ProcessingInfo\022K\n\032post_model_output" +
+      "s_request\030\004 \001(\0132%.clarifai.api.PostModel" +
+      "OutputsRequestH\000B\t\n\007request\"b\n\020RunnerIte" +
+      "mOutput\022B\n\025multi_output_response\030\001 \001(\0132!" +
+      ".clarifai.api.MultiOutputResponseH\000B\n\n\010r" +
+      "esponse\"\217\001\n\035MultiRunnerItemOutputRespons" +
+      "e\022+\n\006status\030\001 \001(\0132\033.clarifai.api.status." +
+      "Status\022A\n\023runner_item_outputs\030\002 \003(\0132\036.cl" +
+      "arifai.api.RunnerItemOutputB\004\200\265\030\001\"\304\001\n,Po" +
+      "stModelVersionsTrainingTimeEstimateReque" +
+      "st\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.U" +
+      "serAppIDSet\022\020\n\010model_id\030\002 \001(\t\0222\n\016model_v" +
+      "ersions\030\003 \003(\0132\032.clarifai.api.ModelVersio" +
+      "n\022\035\n\025estimated_input_count\030\004 \001(\004\"\214\001\n!Mul" +
+      "tiTrainingTimeEstimateResponse\022+\n\006status" +
+      "\030\001 \001(\0132\033.clarifai.api.status.Status\022:\n\027t" +
+      "raining_time_estimates\030\002 \003(\0132\031.google.pr" +
+      "otobuf.Duration\"g\n\030GetComputeClusterRequ" +
+      "est\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api." +
+      "UserAppIDSet\022\032\n\022compute_cluster_id\030\002 \001(\t" +
+      "\"m\n\032ListComputeClustersRequest\022/\n\013user_a" +
+      "pp_id\030\001 \001(\0132\032.clarifai.api.UserAppIDSet\022" +
+      "\014\n\004page\030\002 \001(\r\022\020\n\010per_page\030\003 \001(\r\"\205\001\n\032Post" +
+      "ComputeClustersRequest\022/\n\013user_app_id\030\001 " +
+      "\001(\0132\032.clarifai.api.UserAppIDSet\0226\n\020compu" +
+      "te_clusters\030\002 \003(\0132\034.clarifai.api.Compute" +
+      "Cluster\"\\\n\034DeleteComputeClustersRequest\022" +
+      "/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.User" +
+      "AppIDSet\022\013\n\003ids\030\002 \003(\t\"\202\001\n\034SingleComputeC" +
+      "lusterResponse\022+\n\006status\030\001 \001(\0132\033.clarifa" +
+      "i.api.status.Status\0225\n\017compute_cluster\030\002" +
+      " \001(\0132\034.clarifai.api.ComputeCluster\"\210\001\n\033M" +
+      "ultiComputeClusterResponse\022+\n\006status\030\001 \001" +
+      "(\0132\033.clarifai.api.status.Status\022<\n\020compu" +
+      "te_clusters\030\002 \003(\0132\034.clarifai.api.Compute" +
+      "ClusterB\004\200\265\030\001\"v\n\022GetNodepoolRequest\022/\n\013u" +
+      "ser_app_id\030\001 \001(\0132\032.clarifai.api.UserAppI" +
+      "DSet\022\032\n\022compute_cluster_id\030\002 \001(\t\022\023\n\013node" +
+      "pool_id\030\003 \001(\t\"\203\001\n\024ListNodepoolsRequest\022/" +
+      "\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserA" +
+      "ppIDSet\022\032\n\022compute_cluster_id\030\002 \001(\t\022\014\n\004p" +
+      "age\030\003 \001(\r\022\020\n\010per_page\030\004 \001(\r\"\216\001\n\024PostNode" +
+      "poolsRequest\022/\n\013user_app_id\030\001 \001(\0132\032.clar" +
+      "ifai.api.UserAppIDSet\022\032\n\022compute_cluster" +
+      "_id\030\002 \001(\t\022)\n\tnodepools\030\003 \003(\0132\026.clarifai." +
+      "api.Nodepool\"\237\001\n\025PatchNodepoolsRequest\022/" +
+      "\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.UserA" +
+      "ppIDSet\022\032\n\022compute_cluster_id\030\002 \001(\t\022)\n\tn" +
+      "odepools\030\003 \003(\0132\026.clarifai.api.Nodepool\022\016" +
+      "\n\006action\030\004 \001(\t\"r\n\026DeleteNodepoolsRequest" +
+      "\022/\n\013user_app_id\030\001 \001(\0132\032.clarifai.api.Use",
+      "rAppIDSet\022\032\n\022compute_cluster_id\030\002 \001(\t\022\013\n" +
+      "\003ids\030\003 \003(\t\"o\n\026SingleNodepoolResponse\022+\n\006" +
+      "status\030\001 \001(\0132\033.clarifai.api.status.Statu" +
+      "s\022(\n\010nodepool\030\002 \001(\0132\026.clarifai.api.Nodep" +
+      "ool\"u\n\025MultiNodepoolResponse\022+\n\006status\030\001" +
+      " \001(\0132\033.clarifai.api.status.Status\022/\n\tnod" +
+      "epools\030\002 \003(\0132\026.clarifai.api.NodepoolB\004\200\265" +
+      "\030\001*p\n\034OrganizationInvitationStatus\022\013\n\007NO" +
+      "T_SET\020\000\022\013\n\007PENDING\020\001\022\014\n\010ACCEPTED\020\002\022\r\n\tCA" +
+      "NCELLED\020\003\022\014\n\010DECLINED\020\004\022\013\n\007EXPIRED\020\005*\312\001\n" +
+      "\037PutTaskAssignmentsRequestAction\022/\n+PUT_" +
+      "TASK_ASSIGNMENTS_REQUEST_ACTION_NOT_SET\020" +
+      "\000\022\017\n\013LABEL_START\020\001\022\020\n\014LABEL_SUBMIT\020\002\022\020\n\014" +
+      "REVIEW_START\020\n\022\022\n\016REVIEW_APPROVE\020\013\022\032\n\026RE" +
+      "VIEW_REQUEST_CHANGES\020\014\022\021\n\rREVIEW_REJECT\020" +
+      "\r2\230\255\003\n\002V2\022\256\002\n\024ListConceptRelations\022).cla" +
+      "rifai.api.ListConceptRelationsRequest\032*." +
+      "clarifai.api.MultiConceptRelationRespons" +
+      "e\"\276\001\202\323\344\223\002\253\001\022Y/v2/users/{user_app_id.user" +
       "_id}/apps/{user_app_id.app_id}/concepts/" +
-      "{concept_id}/languagesZ%\022#/v2/concepts/{" +
-      "concept_id}/languages\230\234\'\002\220\234\'-\220\234\'\013\022\217\002\n\024Po" +
-      "stConceptLanguages\022).clarifai.api.PostCo" +
-      "nceptLanguagesRequest\032*.clarifai.api.Mul" +
-      "tiConceptLanguageResponse\"\237\001\202\323\344\223\002\210\001\"Y/v2" +
-      "/users/{user_app_id.user_id}/apps/{user_" +
-      "app_id.app_id}/concepts/{concept_id}/lan" +
-      "guages:\001*Z(\"#/v2/concepts/{concept_id}/l" +
-      "anguages:\001*\230\234\'\002\220\234\'-\220\234\'\n\220\234\'\013\022\221\002\n\025PatchCon" +
-      "ceptLanguages\022*.clarifai.api.PatchConcep" +
-      "tLanguagesRequest\032*.clarifai.api.MultiCo" +
-      "nceptLanguageResponse\"\237\001\202\323\344\223\002\210\0012Y/v2/use" +
-      "rs/{user_app_id.user_id}/apps/{user_app_" +
-      "id.app_id}/concepts/{concept_id}/languag" +
-      "es:\001*Z(2#/v2/concepts/{concept_id}/langu" +
-      "ages:\001*\230\234\'\002\220\234\'-\220\234\'\n\220\234\'\013\022\365\001\n\023ListKnowledg" +
-      "eGraphs\022(.clarifai.api.ListKnowledgeGrap" +
-      "hsRequest\032).clarifai.api.MultiKnowledgeG" +
-      "raphResponse\"\210\001\202\323\344\223\002v\022S/v2/users/{user_a" +
-      "pp_id.user_id}/apps/{user_app_id.app_id}" +
-      "/concepts/knowledge_graphsZ\037\022\035/v2/concep" +
-      "ts/knowledge_graphs\230\234\'\002\220\234\'-\220\234\'\013\022\377\001\n\023Post" +
-      "KnowledgeGraphs\022(.clarifai.api.PostKnowl" +
-      "edgeGraphsRequest\032).clarifai.api.MultiKn" +
-      "owledgeGraphResponse\"\222\001\202\323\344\223\002|\"S/v2/users" +
-      "/{user_app_id.user_id}/apps/{user_app_id" +
-      ".app_id}/concepts/knowledge_graphs:\001*Z\"\"" +
-      "\035/v2/concepts/knowledge_graphs:\001*\230\234\'\002\220\234\'" +
-      "-\220\234\'\n\220\234\'\013\022\202\002\n\026PostConceptMappingJobs\022+.c" +
-      "larifai.api.PostConceptMappingJobsReques" +
-      "t\032,.clarifai.api.MultiConceptMappingJobR" +
-      "esponse\"\214\001\202\323\344\223\002v\"P/v2/users/{user_app_id" +
-      ".user_id}/apps/{user_app_id.app_id}/conc" +
-      "epts/mappings/jobs:\001*Z\037\"\032/v2/concepts/ma" +
-      "ppings/jobs:\001*\230\234\'\002\220\234\'-\220\234\'\n\220\234\'\013\022\227\002\n\rGetAn" +
-      "notation\022\".clarifai.api.GetAnnotationReq" +
-      "uest\032&.clarifai.api.SingleAnnotationResp" +
-      "onse\"\271\001\202\323\344\223\002\236\001\022g/v2/users/{user_app_id.u" +
-      "ser_id}/apps/{user_app_id.app_id}/inputs" +
-      "/{input_id}/annotations/{annotation_id}Z" +
-      "3\0221/v2/inputs/{input_id}/annotations/{an" +
-      "notation_id}\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\017\022\324\001\n\017Lis" +
-      "tAnnotations\022$.clarifai.api.ListAnnotati" +
-      "onsRequest\032%.clarifai.api.MultiAnnotatio" +
-      "nResponse\"t\202\323\344\223\002Z\022E/v2/users/{user_app_i" +
-      "d.user_id}/apps/{user_app_id.app_id}/ann" +
-      "otationsZ\021\022\017/v2/annotations\230\234\'\002\220\234\'-\220\234\'&\220" +
-      "\234\'\013\220\234\'\017\022\347\001\n\017PostAnnotations\022$.clarifai.a" +
-      "pi.PostAnnotationsRequest\032%.clarifai.api" +
-      ".MultiAnnotationResponse\"\206\001\202\323\344\223\002`\"E/v2/u" +
-      "sers/{user_app_id.user_id}/apps/{user_ap" +
-      "p_id.app_id}/annotations:\001*Z\024\"\017/v2/annot" +
-      "ations:\001*\230\234\'\002\220\234\'-\220\234\'\005\220\234\'%\220\234\'&\220\234\'\013\220\234\'\017\220\234\'" +
-      "\023\022\351\001\n\020PatchAnnotations\022%.clarifai.api.Pa" +
-      "tchAnnotationsRequest\032%.clarifai.api.Mul" +
-      "tiAnnotationResponse\"\206\001\202\323\344\223\002`2E/v2/users" +
-      "/{user_app_id.user_id}/apps/{user_app_id" +
-      ".app_id}/annotations:\001*Z\0242\017/v2/annotatio" +
-      "ns:\001*\230\234\'\002\220\234\'-\220\234\'\005\220\234\'%\220\234\'&\220\234\'\013\220\234\'\023\220\234\'\017\022\370\001" +
-      "\n\026PatchAnnotationsStatus\022+.clarifai.api." +
-      "PatchAnnotationsStatusRequest\032,.clarifai" +
-      ".api.PatchAnnotationsStatusResponse\"\202\001\202\323" +
-      "\344\223\002`2[/v2/users/{user_app_id.user_id}/ap" +
-      "ps/{user_app_id.app_id}/task/{task_id}/a" +
-      "nnotations/status:\001*\230\234\'\002\220\234\'-\220\234\'%\220\234\'&\220\234\'\013" +
-      "\220\234\'\023\220\234\'\017\022\240\002\n\020DeleteAnnotation\022%.clarifai" +
-      ".api.DeleteAnnotationRequest\032!.clarifai." +
-      "api.status.BaseResponse\"\301\001\202\323\344\223\002\236\001*g/v2/u" +
-      "sers/{user_app_id.user_id}/apps/{user_ap" +
-      "p_id.app_id}/inputs/{input_id}/annotatio" +
-      "ns/{annotation_id}Z3*1/v2/inputs/{input_" +
-      "id}/annotations/{annotation_id}\230\234\'\002\220\234\'-\220" +
-      "\234\'%\220\234\'(\220\234\'&\220\234\'\023\220\234\'\017\022\324\002\n\021DeleteAnnotation" +
-      "s\022&.clarifai.api.DeleteAnnotationsReques" +
-      "t\032!.clarifai.api.status.BaseResponse\"\363\001\202" +
-      "\323\344\223\002\320\001*L/v2/users/{user_app_id.user_id}/" +
-      "apps/{user_app_id.app_id}/inputs/annotat" +
-      "ions:\001*Z\033*\026/v2/inputs/annotations:\001*ZJ*E" +
-      "/v2/users/{user_app_id.user_id}/apps/{us" +
-      "er_app_id.app_id}/annotations:\001*Z\024*\017/v2/" +
-      "annotations:\001*\230\234\'\002\220\234\'-\220\234\'%\220\234\'(\220\234\'&\220\234\'\023\220\234" +
-      "\'\017\022\367\001\n\030PatchAnnotationsSearches\022-.clarif" +
-      "ai.api.PatchAnnotationsSearchesRequest\032!" +
-      ".clarifai.api.MultiSearchResponse\"\210\001\202\323\344\223" +
-      "\002r2N/v2/users/{user_app_id.user_id}/apps" +
-      "/{user_app_id.app_id}/annotations/search" +
-      "es:\001*Z\0352\030/v2/annotations/searches:\001*\230\234\'\002" +
-      "\220\234\'-\220\234\'s\220\234\'r\022\205\002\n\027PostAnnotationsSearches" +
-      "\022,.clarifai.api.PostAnnotationsSearchesR" +
-      "equest\032!.clarifai.api.MultiSearchRespons" +
-      "e\"\230\001\202\323\344\223\002r\"N/v2/users/{user_app_id.user_" +
-      "id}/apps/{user_app_id.app_id}/annotation" +
-      "s/searches:\001*Z\035\"\030/v2/annotations/searche" +
-      "s:\001*\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\017\220\234\'\003\220\234\'\023\022\361\001\n" +
-      "\025ListAnnotationWorkers\022*.clarifai.api.Li" +
-      "stAnnotationWorkersRequest\032!.clarifai.ap" +
-      "i.MultiWorkerResponse\"\210\001\202\323\344\223\002j\022M/v2/user" +
-      "s/{user_app_id.user_id}/apps/{user_app_i" +
-      "d.app_id}/annotations/workersZ\031\022\027/v2/ann" +
-      "otations/workers\230\234\'\002\220\234\'-\220\234\'&\220\234\'2\220\234\'\017\220\234\'\023" +
-      "\022\325\001\n\rGetInputCount\022\".clarifai.api.GetInp" +
-      "utCountRequest\032&.clarifai.api.SingleInpu" +
-      "tCountResponse\"x\202\323\344\223\002^\022G/v2/users/{user_" +
-      "app_id.user_id}/apps/{user_app_id.app_id" +
-      "}/inputs/statusZ\023\022\021/v2/inputs/status\230\234\'\002" +
-      "\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\022\315\001\n\014StreamInputs\022!.clar" +
-      "ifai.api.StreamInputsRequest\032 .clarifai." +
-      "api.MultiInputResponse\"x\202\323\344\223\002^\022G/v2/user" +
-      "s/{user_app_id.user_id}/apps/{user_app_i" +
-      "d.app_id}/inputs/streamZ\023\022\021/v2/inputs/st" +
-      "ream\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\022\201\002\n\017GetInputSam" +
-      "ples\022$.clarifai.api.GetInputSamplesReque" +
-      "st\032*.clarifai.api.MultiInputAnnotationRe" +
-      "sponse\"\233\001\202\323\344\223\002\200\001\022X/v2/users/{user_app_id" +
-      ".user_id}/apps/{user_app_id.app_id}/task" +
-      "s/{task_id}/inputs/samplesZ$\022\"/v2/tasks/" +
-      "{task_id}/inputs/samples\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013" +
-      "\220\234\'\005\022\317\001\n\010GetInput\022\035.clarifai.api.GetInpu" +
-      "tRequest\032!.clarifai.api.SingleInputRespo" +
-      "nse\"\200\001\202\323\344\223\002f\022K/v2/users/{user_app_id.use" +
-      "r_id}/apps/{user_app_id.app_id}/inputs/{" +
-      "input_id}Z\027\022\025/v2/inputs/{input_id}\230\234\'\002\220\234" +
-      "\'-\220\234\'&\220\234\'\013\220\234\'\005\022\200\002\n\025GetInputVideoManifest" +
-      "\022%.clarifai.api.GetVideoManifestRequest\032" +
-      "&.clarifai.api.GetVideoManifestResponse\"" +
-      "\227\001\202\323\344\223\002\204\001\022Z/v2/users/{user_app_id.user_i" +
-      "d}/apps/{user_app_id.app_id}/inputs/{inp" +
-      "ut_id}/video_manifestZ&\022$/v2/inputs/{inp" +
-      "ut_id}/video_manifest\230\234\'\002\220\234\'-\220\234\'\005\022\273\001\n\nLi" +
-      "stInputs\022\037.clarifai.api.ListInputsReques" +
-      "t\032 .clarifai.api.MultiInputResponse\"j\202\323\344" +
-      "\223\002P\022@/v2/users/{user_app_id.user_id}/app" +
-      "s/{user_app_id.app_id}/inputsZ\014\022\n/v2/inp" +
-      "uts\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\022\326\001\n\nPostInputs\022\037" +
-      ".clarifai.api.PostInputsRequest\032 .clarif" +
-      "ai.api.MultiInputResponse\"\204\001\202\323\344\223\002V\"@/v2/" +
-      "users/{user_app_id.user_id}/apps/{user_a" +
-      "pp_id.app_id}/inputs:\001*Z\017\"\n/v2/inputs:\001*" +
-      "\230\234\'\002\220\234\'-\220\234\'%\220\234\'&\220\234\'\013\220\234\'\004\220\234\'\005\220\234\'\017\220\234\'\002\220\234\'\023" +
-      "\022\317\001\n\013PatchInputs\022 .clarifai.api.PatchInp" +
-      "utsRequest\032 .clarifai.api.MultiInputResp" +
-      "onse\"|\202\323\344\223\002V2@/v2/users/{user_app_id.use" +
-      "r_id}/apps/{user_app_id.app_id}/inputs:\001" +
-      "*Z\0172\n/v2/inputs:\001*\230\234\'\002\220\234\'-\220\234\'%\220\234\'&\220\234\'\013\220\234" +
-      "\'\004\220\234\'\005\220\234\'\017\022\351\001\n\013DeleteInput\022 .clarifai.ap" +
-      "i.DeleteInputRequest\032!.clarifai.api.stat" +
-      "us.BaseResponse\"\224\001\202\323\344\223\002f*K/v2/users/{use" +
+      "{concept_id}/relationsZN\022L/v2/users/{use" +
       "r_app_id.user_id}/apps/{user_app_id.app_" +
-      "id}/inputs/{input_id}Z\027*\025/v2/inputs/{inp" +
-      "ut_id}\230\234\'\002\220\234\'-\220\234\'%\220\234\'(\220\234\'&\220\234\'\004\220\234\'\010\220\234\'\005\220\234" +
-      "\'\017\220\234\'\023\022\333\001\n\014DeleteInputs\022!.clarifai.api.D" +
-      "eleteInputsRequest\032!.clarifai.api.status" +
-      ".BaseResponse\"\204\001\202\323\344\223\002V*@/v2/users/{user_" +
-      "app_id.user_id}/apps/{user_app_id.app_id" +
-      "}/inputs:\001*Z\017*\n/v2/inputs:\001*\230\234\'\002\220\234\'-\220\234\'%" +
-      "\220\234\'(\220\234\'&\220\234\'\004\220\234\'\010\220\234\'\005\220\234\'\017\220\234\'\023\022\342\001\n\023PatchIn" +
-      "putsSearches\022(.clarifai.api.PatchInputsS" +
-      "earchesRequest\032!.clarifai.api.MultiSearc" +
-      "hResponse\"~\202\323\344\223\002h2I/v2/users/{user_app_i" +
-      "d.user_id}/apps/{user_app_id.app_id}/inp" +
-      "uts/searches:\001*Z\0302\023/v2/inputs/searches:\001" +
-      "*\230\234\'\002\220\234\'-\220\234\'s\220\234\'r\022\361\001\n\022PostInputsSearches" +
-      "\022\'.clarifai.api.PostInputsSearchesReques" +
-      "t\032!.clarifai.api.MultiSearchResponse\"\216\001\202" +
-      "\323\344\223\002h\"I/v2/users/{user_app_id.user_id}/a" +
-      "pps/{user_app_id.app_id}/inputs/searches" +
-      ":\001*Z\030\"\023/v2/inputs/searches:\001*\230\234\'\002\220\234\'-\220\234\'" +
-      "&\220\234\'\013\220\234\'\005\220\234\'\017\220\234\'\003\220\234\'\023\022\211\004\n\020PostModelOutpu" +
-      "ts\022%.clarifai.api.PostModelOutputsReques" +
-      "t\032!.clarifai.api.MultiOutputResponse\"\252\003\202" +
-      "\323\344\223\002\217\003\"i/v2/users/{user_app_id.user_id}/" +
-      "apps/{user_app_id.app_id}/models/{model_" +
-      "id}/versions/{version_id}/outputs:\001*Z8\"3" +
-      "/v2/models/{model_id}/versions/{version_" +
-      "id}/outputs:\001*ZX\"S/v2/users/{user_app_id" +
-      ".user_id}/apps/{user_app_id.app_id}/mode" +
-      "ls/{model_id}/outputs:\001*Z\"\"\035/v2/models/{" +
-      "model_id}/outputs:\001*Zg\"b/v2/users/{runne" +
-      "r_selector.deployment.user_id}/deploymen" +
-      "ts/{runner_selector.deployment.id}/outpu" +
-      "ts:\001*\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\220\234\'\002\022\332\002\n\024GenerateMo" +
-      "delOutputs\022%.clarifai.api.PostModelOutpu" +
-      "tsRequest\032!.clarifai.api.MultiOutputResp" +
-      "onse\"\365\001\202\323\344\223\002\332\001\"r/v2/users/{user_app_id.u" +
-      "ser_id}/apps/{user_app_id.app_id}/models" +
-      "/{model_id}/versions/{version_id}/output" +
-      "s/generate:\001*Za\"\\/v2/users/{user_app_id." +
-      "user_id}/apps/{user_app_id.app_id}/model" +
-      "s/{model_id}/outputs/generate:\001*\230\234\'\002\220\234\'-" +
-      "\220\234\'\013\220\234\'\017\220\234\'\0020\001\022\234\001\n\022StreamModelOutputs\022%." +
-      "clarifai.api.PostModelOutputsRequest\032!.c" +
-      "larifai.api.MultiOutputResponse\"8\202\323\344\223\002\036\"" +
-      "\031/v2/models/outputs/stream:\001*\230\234\'\002\220\234\'-\220\234\'" +
-      "\013\220\234\'\017\220\234\'\002(\0010\001\022\357\001\n\014ListDatasets\022!.clarifa" +
-      "i.api.ListDatasetsRequest\032\".clarifai.api" +
-      ".MultiDatasetResponse\"\227\001\202\323\344\223\002\200\001\022B/v2/use" +
-      "rs/{user_app_id.user_id}/apps/{user_app_" +
-      "id.app_id}/datasetsZ*\022(/v2/users/{user_a" +
-      "pp_id.user_id}/datasetsZ\016\022\014/v2/datasets\230" +
-      "\234\'\002\220\234\'-\220\234\'i\220\234\'r\022\331\001\n\nGetDataset\022\037.clarifa" +
-      "i.api.GetDatasetRequest\032#.clarifai.api.S" +
-      "ingleDatasetResponse\"\204\001\202\323\344\223\002n\022O/v2/users" +
+      "id}/concepts/relations\230\234\'\005\220\234\'-\220\234\'\013\022\343\001\n\024P" +
+      "ostConceptRelations\022).clarifai.api.PostC" +
+      "onceptRelationsRequest\032*.clarifai.api.Mu" +
+      "ltiConceptRelationResponse\"t\202\323\344\223\002^\"Y/v2/" +
+      "users/{user_app_id.user_id}/apps/{user_a" +
+      "pp_id.app_id}/concepts/{concept_id}/rela" +
+      "tions:\001*\230\234\'\005\220\234\'-\220\234\'\n\220\234\'\013\022\342\001\n\026DeleteConce" +
+      "ptRelations\022+.clarifai.api.DeleteConcept" +
+      "RelationsRequest\032!.clarifai.api.status.B" +
+      "aseResponse\"x\202\323\344\223\002^*Y/v2/users/{user_app" +
+      "_id.user_id}/apps/{user_app_id.app_id}/c" +
+      "oncepts/{concept_id}/relations:\001*\230\234\'\005\220\234\'" +
+      "-\220\234\'\r\220\234\'\n\220\234\'\013\022\340\001\n\020GetConceptCounts\022%.cla" +
+      "rifai.api.GetConceptCountsRequest\032\'.clar" +
+      "ifai.api.MultiConceptCountResponse\"|\202\323\344\223" +
+      "\002b\022I/v2/users/{user_app_id.user_id}/apps" +
+      "/{user_app_id.app_id}/concepts/statusZ\025\022" +
+      "\023/v2/concepts/status\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005" +
+      "\022\325\001\n\nGetConcept\022\037.clarifai.api.GetConcep" +
+      "tRequest\032#.clarifai.api.SingleConceptRes" +
+      "ponse\"\200\001\202\323\344\223\002n\022O/v2/users/{user_app_id.u" +
+      "ser_id}/apps/{user_app_id.app_id}/concep" +
+      "ts/{concept_id}Z\033\022\031/v2/concepts/{concept" +
+      "_id}\230\234\'\002\220\234\'-\220\234\'\013\022\275\001\n\014ListConcepts\022!.clar" +
+      "ifai.api.ListConceptsRequest\032\".clarifai." +
+      "api.MultiConceptResponse\"f\202\323\344\223\002T\022B/v2/us" +
+      "ers/{user_app_id.user_id}/apps/{user_app" +
+      "_id.app_id}/conceptsZ\016\022\014/v2/concepts\230\234\'\002" +
+      "\220\234\'-\220\234\'\013\022\275\002\n\021ListModelConcepts\022&.clarifa" +
+      "i.api.ListModelConceptsRequest\032\".clarifa" +
+      "i.api.MultiConceptResponse\"\333\001\202\323\344\223\002\304\001\022T/v" +
+      "2/users/{user_app_id.user_id}/apps/{user" +
+      "_app_id.app_id}/models/{model_id}/concep" +
+      "tsZl\022j/v2/users/{user_app_id.user_id}/ap" +
+      "ps/{user_app_id.app_id}/models/{model_id" +
+      "}/versions/{version_id}/concepts\230\234\'\002\220\234\'-" +
+      "\220\234\'\013\220\234\'\017\022\356\001\n\024PostConceptsSearches\022).clar" +
+      "ifai.api.PostConceptsSearchesRequest\032\".c" +
+      "larifai.api.MultiConceptResponse\"\206\001\202\323\344\223\002" +
+      "l\"K/v2/users/{user_app_id.user_id}/apps/" +
+      "{user_app_id.app_id}/concepts/searches:\001" +
+      "*Z\032\"\025/v2/concepts/searches:\001*\230\234\'\002\220\234\'-\220\234\'" +
+      "\013\220\234\'\017\220\234\'\023\022\307\001\n\014PostConcepts\022!.clarifai.ap" +
+      "i.PostConceptsRequest\032\".clarifai.api.Mul" +
+      "tiConceptResponse\"p\202\323\344\223\002Z\"B/v2/users/{us" +
+      "er_app_id.user_id}/apps/{user_app_id.app" +
+      "_id}/concepts:\001*Z\021\"\014/v2/concepts:\001*\230\234\'\002\220" +
+      "\234\'-\220\234\'\n\220\234\'\013\022\311\001\n\rPatchConcepts\022\".clarifai" +
+      ".api.PatchConceptsRequest\032\".clarifai.api" +
+      ".MultiConceptResponse\"p\202\323\344\223\002Z2B/v2/users" +
       "/{user_app_id.user_id}/apps/{user_app_id" +
-      ".app_id}/datasets/{dataset_id}Z\033\022\031/v2/da" +
-      "tasets/{dataset_id}\230\234\'\002\220\234\'-\220\234\'i\220\234\'r\022\313\001\n\014" +
-      "PostDatasets\022!.clarifai.api.PostDatasets" +
-      "Request\032\".clarifai.api.MultiDatasetRespo" +
-      "nse\"t\202\323\344\223\002Z\"B/v2/users/{user_app_id.user" +
-      "_id}/apps/{user_app_id.app_id}/datasets:" +
-      "\001*Z\021\"\014/v2/datasets:\001*\230\234\'\002\220\234\'-\220\234\'i\220\234\'j\220\234\'" +
-      "r\022\315\001\n\rPatchDatasets\022\".clarifai.api.Patch" +
-      "DatasetsRequest\032\".clarifai.api.MultiData" +
-      "setResponse\"t\202\323\344\223\002Z2B/v2/users/{user_app" +
-      "_id.user_id}/apps/{user_app_id.app_id}/d" +
-      "atasets:\001*Z\0212\014/v2/datasets:\001*\230\234\'\002\220\234\'-\220\234\'" +
-      "i\220\234\'j\220\234\'r\022\316\001\n\016DeleteDatasets\022#.clarifai." +
-      "api.DeleteDatasetsRequest\032!.clarifai.api" +
-      ".status.BaseResponse\"t\202\323\344\223\002Z*B/v2/users/" +
-      "{user_app_id.user_id}/apps/{user_app_id." +
-      "app_id}/datasets:\001*Z\021*\014/v2/datasets:\001*\230\234" +
-      "\'\002\220\234\'-\220\234\'i\220\234\'j\220\234\'k\022\201\002\n\021ListDatasetInputs" +
-      "\022&.clarifai.api.ListDatasetInputsRequest" +
-      "\032\'.clarifai.api.MultiDatasetInputRespons" +
-      "e\"\232\001\202\323\344\223\002|\022V/v2/users/{user_app_id.user_" +
-      "id}/apps/{user_app_id.app_id}/datasets/{" +
-      "dataset_id}/inputsZ\"\022 /v2/datasets/{data" +
-      "set_id}/inputs\230\234\'\002\220\234\'-\220\234\'i\220\234\'\005\220\234\'&\220\234\'\013\022\225" +
-      "\002\n\017GetDatasetInput\022$.clarifai.api.GetDat" +
-      "asetInputRequest\032(.clarifai.api.SingleDa" +
-      "tasetInputResponse\"\261\001\202\323\344\223\002\222\001\022a/v2/users/" +
-      "{user_app_id.user_id}/apps/{user_app_id." +
-      "app_id}/datasets/{dataset_id}/inputs/{in" +
-      "put_id}Z-\022+/v2/datasets/{dataset_id}/inp" +
-      "uts/{input_id}\230\234\'\002\220\234\'-\220\234\'i\220\234\'\005\220\234\'&\220\234\'\013\022\214" +
-      "\002\n\021PostDatasetInputs\022&.clarifai.api.Post" +
-      "DatasetInputsRequest\032\'.clarifai.api.Mult" +
-      "iDatasetInputResponse\"\245\001\202\323\344\223\002\202\001\"V/v2/use" +
-      "rs/{user_app_id.user_id}/apps/{user_app_" +
-      "id.app_id}/datasets/{dataset_id}/inputs:" +
-      "\001*Z%\" /v2/datasets/{dataset_id}/inputs:\001" +
-      "*\230\234\'\002\220\234\'-\220\234\'i\220\234\'j\220\234\'\005\220\234\'&\220\234\'\013\022\206\002\n\023Delete" +
-      "DatasetInputs\022(.clarifai.api.DeleteDatas" +
-      "etInputsRequest\032!.clarifai.api.status.Ba" +
-      "seResponse\"\241\001\202\323\344\223\002\202\001*V/v2/users/{user_ap" +
+      ".app_id}/concepts:\001*Z\0212\014/v2/concepts:\001*\230" +
+      "\234\'\002\220\234\'-\220\234\'\n\220\234\'\013\022\230\002\n\022GetConceptLanguage\022\'" +
+      ".clarifai.api.GetConceptLanguageRequest\032" +
+      "+.clarifai.api.SingleConceptLanguageResp" +
+      "onse\"\253\001\202\323\344\223\002\230\001\022d/v2/users/{user_app_id.u" +
+      "ser_id}/apps/{user_app_id.app_id}/concep" +
+      "ts/{concept_id}/languages/{language}Z0\022." +
+      "/v2/concepts/{concept_id}/languages/{lan" +
+      "guage}\230\234\'\002\220\234\'-\220\234\'\013\022\205\002\n\024ListConceptLangua" +
+      "ges\022).clarifai.api.ListConceptLanguagesR" +
+      "equest\032*.clarifai.api.MultiConceptLangua" +
+      "geResponse\"\225\001\202\323\344\223\002\202\001\022Y/v2/users/{user_ap" +
       "p_id.user_id}/apps/{user_app_id.app_id}/" +
-      "datasets/{dataset_id}/inputs:\001*Z%* /v2/d" +
-      "atasets/{dataset_id}/inputs:\001*\230\234\'\002\220\234\'-\220\234" +
-      "\'i\220\234\'j\220\234\'k\220\234\'\005\022\204\002\n\023ListDatasetVersions\022(" +
-      ".clarifai.api.ListDatasetVersionsRequest" +
-      "\032).clarifai.api.MultiDatasetVersionRespo" +
-      "nse\"\227\001\202\323\344\223\002\200\001\022X/v2/users/{user_app_id.us" +
-      "er_id}/apps/{user_app_id.app_id}/dataset" +
-      "s/{dataset_id}/versionsZ$\022\"/v2/datasets/" +
-      "{dataset_id}/versions\230\234\'\002\220\234\'-\220\234\'i\220\234\'r\022\253\002" +
-      "\n\021GetDatasetVersion\022&.clarifai.api.GetDa" +
-      "tasetVersionRequest\032*.clarifai.api.Singl" +
-      "eDatasetVersionResponse\"\301\001\202\323\344\223\002\252\001\022m/v2/u" +
-      "sers/{user_app_id.user_id}/apps/{user_ap" +
-      "p_id.app_id}/datasets/{dataset_id}/versi" +
-      "ons/{dataset_version_id}Z9\0227/v2/datasets" +
-      "/{dataset_id}/versions/{dataset_version_" +
-      "id}\230\234\'\002\220\234\'-\220\234\'i\220\234\'r\022\352\002\n\037ListDatasetVersi" +
-      "onMetricsGroups\0224.clarifai.api.ListDatas" +
-      "etVersionMetricsGroupsRequest\0325.clarifai" +
-      ".api.MultiDatasetVersionMetricsGroupResp" +
-      "onse\"\331\001\202\323\344\223\002\272\001\022u/v2/users/{user_app_id.u" +
-      "ser_id}/apps/{user_app_id.app_id}/datase" +
-      "ts/{dataset_id}/versions/{dataset_versio" +
-      "n_id}/metricsZA\022?/v2/datasets/{dataset_i" +
-      "d}/versions/{dataset_version_id}/metrics" +
-      "\230\234\'\002\220\234\'-\220\234\'i\220\234\'&\220\234\'\013\220\234\'\005\022\222\002\n\023PostDataset" +
-      "Versions\022(.clarifai.api.PostDatasetVersi" +
-      "onsRequest\032).clarifai.api.MultiDatasetVe" +
-      "rsionResponse\"\245\001\202\323\344\223\002\206\001\"X/v2/users/{user" +
+      "concepts/{concept_id}/languagesZ%\022#/v2/c" +
+      "oncepts/{concept_id}/languages\230\234\'\002\220\234\'-\220\234" +
+      "\'\013\022\217\002\n\024PostConceptLanguages\022).clarifai.a" +
+      "pi.PostConceptLanguagesRequest\032*.clarifa" +
+      "i.api.MultiConceptLanguageResponse\"\237\001\202\323\344" +
+      "\223\002\210\001\"Y/v2/users/{user_app_id.user_id}/ap" +
+      "ps/{user_app_id.app_id}/concepts/{concep" +
+      "t_id}/languages:\001*Z(\"#/v2/concepts/{conc" +
+      "ept_id}/languages:\001*\230\234\'\002\220\234\'-\220\234\'\n\220\234\'\013\022\221\002\n" +
+      "\025PatchConceptLanguages\022*.clarifai.api.Pa" +
+      "tchConceptLanguagesRequest\032*.clarifai.ap" +
+      "i.MultiConceptLanguageResponse\"\237\001\202\323\344\223\002\210\001" +
+      "2Y/v2/users/{user_app_id.user_id}/apps/{" +
+      "user_app_id.app_id}/concepts/{concept_id" +
+      "}/languages:\001*Z(2#/v2/concepts/{concept_" +
+      "id}/languages:\001*\230\234\'\002\220\234\'-\220\234\'\n\220\234\'\013\022\365\001\n\023Lis" +
+      "tKnowledgeGraphs\022(.clarifai.api.ListKnow" +
+      "ledgeGraphsRequest\032).clarifai.api.MultiK" +
+      "nowledgeGraphResponse\"\210\001\202\323\344\223\002v\022S/v2/user" +
+      "s/{user_app_id.user_id}/apps/{user_app_i" +
+      "d.app_id}/concepts/knowledge_graphsZ\037\022\035/" +
+      "v2/concepts/knowledge_graphs\230\234\'\002\220\234\'-\220\234\'\013" +
+      "\022\377\001\n\023PostKnowledgeGraphs\022(.clarifai.api." +
+      "PostKnowledgeGraphsRequest\032).clarifai.ap" +
+      "i.MultiKnowledgeGraphResponse\"\222\001\202\323\344\223\002|\"S" +
+      "/v2/users/{user_app_id.user_id}/apps/{us" +
+      "er_app_id.app_id}/concepts/knowledge_gra" +
+      "phs:\001*Z\"\"\035/v2/concepts/knowledge_graphs:" +
+      "\001*\230\234\'\002\220\234\'-\220\234\'\n\220\234\'\013\022\202\002\n\026PostConceptMappin" +
+      "gJobs\022+.clarifai.api.PostConceptMappingJ" +
+      "obsRequest\032,.clarifai.api.MultiConceptMa" +
+      "ppingJobResponse\"\214\001\202\323\344\223\002v\"P/v2/users/{us" +
+      "er_app_id.user_id}/apps/{user_app_id.app" +
+      "_id}/concepts/mappings/jobs:\001*Z\037\"\032/v2/co" +
+      "ncepts/mappings/jobs:\001*\230\234\'\002\220\234\'-\220\234\'\n\220\234\'\013\022" +
+      "\227\002\n\rGetAnnotation\022\".clarifai.api.GetAnno" +
+      "tationRequest\032&.clarifai.api.SingleAnnot" +
+      "ationResponse\"\271\001\202\323\344\223\002\236\001\022g/v2/users/{user" +
       "_app_id.user_id}/apps/{user_app_id.app_i" +
-      "d}/datasets/{dataset_id}/versions:\001*Z\'\"\"" +
-      "/v2/datasets/{dataset_id}/versions:\001*\230\234\'" +
-      "\002\220\234\'-\220\234\'i\220\234\'j\220\234\'\017\220\234\'\023\022\214\002\n\024PatchDatasetVe" +
-      "rsions\022).clarifai.api.PatchDatasetVersio" +
-      "nsRequest\032).clarifai.api.MultiDatasetVer" +
-      "sionResponse\"\235\001\202\323\344\223\002\206\0012X/v2/users/{user_" +
-      "app_id.user_id}/apps/{user_app_id.app_id" +
-      "}/datasets/{dataset_id}/versions:\001*Z\'2\"/" +
-      "v2/datasets/{dataset_id}/versions:\001*\230\234\'\002" +
-      "\220\234\'-\220\234\'i\220\234\'j\022\212\002\n\025DeleteDatasetVersions\022*" +
-      ".clarifai.api.DeleteDatasetVersionsReque" +
-      "st\032!.clarifai.api.status.BaseResponse\"\241\001" +
-      "\202\323\344\223\002\206\001*X/v2/users/{user_app_id.user_id}" +
-      "/apps/{user_app_id.app_id}/datasets/{dat" +
-      "aset_id}/versions:\001*Z\'*\"/v2/datasets/{da" +
-      "taset_id}/versions:\001*\230\234\'\002\220\234\'-\220\234\'i\220\234\'j\220\234\'" +
-      "k\022\324\002\n\030PutDatasetVersionExports\022-.clarifa" +
-      "i.api.PutDatasetVersionExportsRequest\032/." +
-      "clarifai.api.MultiDatasetVersionExportRe" +
-      "sponse\"\327\001\202\323\344\223\002\300\001\032u/v2/users/{user_app_id" +
-      ".user_id}/apps/{user_app_id.app_id}/data" +
-      "sets/{dataset_id}/versions/{dataset_vers" +
-      "ion_id}/exports:\001*ZD\032?/v2/datasets/{data" +
-      "set_id}/versions/{dataset_version_id}/ex" +
-      "ports:\001*\230\234\'\002\220\234\'-\220\234\'i\220\234\'j\022\351\001\n\014GetModelTyp" +
-      "e\022!.clarifai.api.GetModelTypeRequest\032%.c" +
-      "larifai.api.SingleModelTypeResponse\"\216\001\202\323" +
-      "\344\223\002|\022V/v2/users/{user_app_id.user_id}/ap" +
-      "ps/{user_app_id.app_id}/models/types/{mo" +
-      "del_type_id}Z\"\022 /v2/models/types/{model_" +
-      "type_id}\230\234\'\002\220\234\'-\220\234\'\017\022\231\001\n\026ListOpenSourceL" +
-      "icenses\022+.clarifai.api.ListOpenSourceLic" +
-      "ensesRequest\032,.clarifai.api.ListOpenSour" +
-      "ceLicensesResponse\"$\202\323\344\223\002\032\022\030/v2/open_sou" +
-      "rce_licenses\230\234\'\001\022\313\001\n\016ListModelTypes\022#.cl" +
-      "arifai.api.ListModelTypesRequest\032$.clari" +
-      "fai.api.MultiModelTypeResponse\"n\202\323\344\223\002\\\022F" +
+      "d}/inputs/{input_id}/annotations/{annota" +
+      "tion_id}Z3\0221/v2/inputs/{input_id}/annota" +
+      "tions/{annotation_id}\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'" +
+      "\017\022\324\001\n\017ListAnnotations\022$.clarifai.api.Lis" +
+      "tAnnotationsRequest\032%.clarifai.api.Multi" +
+      "AnnotationResponse\"t\202\323\344\223\002Z\022E/v2/users/{u" +
+      "ser_app_id.user_id}/apps/{user_app_id.ap" +
+      "p_id}/annotationsZ\021\022\017/v2/annotations\230\234\'\002" +
+      "\220\234\'-\220\234\'&\220\234\'\013\220\234\'\017\022\347\001\n\017PostAnnotations\022$.c" +
+      "larifai.api.PostAnnotationsRequest\032%.cla" +
+      "rifai.api.MultiAnnotationResponse\"\206\001\202\323\344\223" +
+      "\002`\"E/v2/users/{user_app_id.user_id}/apps" +
+      "/{user_app_id.app_id}/annotations:\001*Z\024\"\017" +
+      "/v2/annotations:\001*\230\234\'\002\220\234\'-\220\234\'\005\220\234\'%\220\234\'&\220\234" +
+      "\'\013\220\234\'\017\220\234\'\023\022\351\001\n\020PatchAnnotations\022%.clarif" +
+      "ai.api.PatchAnnotationsRequest\032%.clarifa" +
+      "i.api.MultiAnnotationResponse\"\206\001\202\323\344\223\002`2E" +
       "/v2/users/{user_app_id.user_id}/apps/{us" +
-      "er_app_id.app_id}/models/typesZ\022\022\020/v2/mo" +
-      "dels/types\230\234\'\002\220\234\'-\220\234\'\017\022\312\001\n\010GetModel\022\035.cl" +
-      "arifai.api.GetModelRequest\032!.clarifai.ap" +
-      "i.SingleModelResponse\"|\202\323\344\223\002f\022K/v2/users" +
-      "/{user_app_id.user_id}/apps/{user_app_id" +
-      ".app_id}/models/{model_id}Z\027\022\025/v2/models" +
-      "/{model_id}\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\022\232\003\n\022GetModel" +
-      "OutputInfo\022\035.clarifai.api.GetModelReques" +
-      "t\032!.clarifai.api.SingleModelResponse\"\301\002\202" +
-      "\323\344\223\002\252\002\022W/v2/users/{user_app_id.user_id}/" +
-      "apps/{user_app_id.app_id}/models/{model_" +
-      "id}/output_infoZ#\022!/v2/models/{model_id}" +
-      "/output_infoZo\022m/v2/users/{user_app_id.u" +
-      "ser_id}/apps/{user_app_id.app_id}/models" +
-      "/{model_id}/versions/{version_id}/output" +
-      "_infoZ9\0227/v2/models/{model_id}/versions/" +
-      "{version_id}/output_info\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017" +
-      "\022\342\001\n\nListModels\022\037.clarifai.api.ListModel" +
-      "sRequest\032 .clarifai.api.MultiModelRespon" +
-      "se\"\220\001\202\323\344\223\002z\022@/v2/users/{user_app_id.user" +
-      "_id}/apps/{user_app_id.app_id}/modelsZ(\022" +
-      "&/v2/users/{user_app_id.user_id}/modelsZ" +
-      "\014\022\n/v2/models\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\022\347\001\n\021GetRes" +
-      "ourceCounts\022&.clarifai.api.GetResourceCo" +
-      "untsRequest\032\'.clarifai.api.GetResourceCo" +
-      "untsResponse\"\200\001\202\323\344\223\002b\022I/v2/users/{user_a" +
+      "er_app_id.app_id}/annotations:\001*Z\0242\017/v2/" +
+      "annotations:\001*\230\234\'\002\220\234\'-\220\234\'\005\220\234\'%\220\234\'&\220\234\'\013\220\234" +
+      "\'\023\220\234\'\017\022\370\001\n\026PatchAnnotationsStatus\022+.clar" +
+      "ifai.api.PatchAnnotationsStatusRequest\032," +
+      ".clarifai.api.PatchAnnotationsStatusResp" +
+      "onse\"\202\001\202\323\344\223\002`2[/v2/users/{user_app_id.us" +
+      "er_id}/apps/{user_app_id.app_id}/task/{t" +
+      "ask_id}/annotations/status:\001*\230\234\'\002\220\234\'-\220\234\'" +
+      "%\220\234\'&\220\234\'\013\220\234\'\023\220\234\'\017\022\240\002\n\020DeleteAnnotation\022%" +
+      ".clarifai.api.DeleteAnnotationRequest\032!." +
+      "clarifai.api.status.BaseResponse\"\301\001\202\323\344\223\002" +
+      "\236\001*g/v2/users/{user_app_id.user_id}/apps" +
+      "/{user_app_id.app_id}/inputs/{input_id}/" +
+      "annotations/{annotation_id}Z3*1/v2/input" +
+      "s/{input_id}/annotations/{annotation_id}" +
+      "\230\234\'\002\220\234\'-\220\234\'%\220\234\'(\220\234\'&\220\234\'\023\220\234\'\017\022\324\002\n\021DeleteA" +
+      "nnotations\022&.clarifai.api.DeleteAnnotati" +
+      "onsRequest\032!.clarifai.api.status.BaseRes" +
+      "ponse\"\363\001\202\323\344\223\002\320\001*L/v2/users/{user_app_id." +
+      "user_id}/apps/{user_app_id.app_id}/input" +
+      "s/annotations:\001*Z\033*\026/v2/inputs/annotatio" +
+      "ns:\001*ZJ*E/v2/users/{user_app_id.user_id}" +
+      "/apps/{user_app_id.app_id}/annotations:\001" +
+      "*Z\024*\017/v2/annotations:\001*\230\234\'\002\220\234\'-\220\234\'%\220\234\'(\220" +
+      "\234\'&\220\234\'\023\220\234\'\017\022\367\001\n\030PatchAnnotationsSearches" +
+      "\022-.clarifai.api.PatchAnnotationsSearches" +
+      "Request\032!.clarifai.api.MultiSearchRespon" +
+      "se\"\210\001\202\323\344\223\002r2N/v2/users/{user_app_id.user" +
+      "_id}/apps/{user_app_id.app_id}/annotatio" +
+      "ns/searches:\001*Z\0352\030/v2/annotations/search" +
+      "es:\001*\230\234\'\002\220\234\'-\220\234\'s\220\234\'r\022\205\002\n\027PostAnnotation" +
+      "sSearches\022,.clarifai.api.PostAnnotations" +
+      "SearchesRequest\032!.clarifai.api.MultiSear" +
+      "chResponse\"\230\001\202\323\344\223\002r\"N/v2/users/{user_app" +
+      "_id.user_id}/apps/{user_app_id.app_id}/a" +
+      "nnotations/searches:\001*Z\035\"\030/v2/annotation" +
+      "s/searches:\001*\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\017\220\234\'" +
+      "\003\220\234\'\023\022\361\001\n\025ListAnnotationWorkers\022*.clarif" +
+      "ai.api.ListAnnotationWorkersRequest\032!.cl" +
+      "arifai.api.MultiWorkerResponse\"\210\001\202\323\344\223\002j\022" +
+      "M/v2/users/{user_app_id.user_id}/apps/{u" +
+      "ser_app_id.app_id}/annotations/workersZ\031" +
+      "\022\027/v2/annotations/workers\230\234\'\002\220\234\'-\220\234\'&\220\234\'" +
+      "2\220\234\'\017\220\234\'\023\022\325\001\n\rGetInputCount\022\".clarifai.a" +
+      "pi.GetInputCountRequest\032&.clarifai.api.S" +
+      "ingleInputCountResponse\"x\202\323\344\223\002^\022G/v2/use" +
+      "rs/{user_app_id.user_id}/apps/{user_app_" +
+      "id.app_id}/inputs/statusZ\023\022\021/v2/inputs/s" +
+      "tatus\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\022\315\001\n\014StreamInpu" +
+      "ts\022!.clarifai.api.StreamInputsRequest\032 ." +
+      "clarifai.api.MultiInputResponse\"x\202\323\344\223\002^\022" +
+      "G/v2/users/{user_app_id.user_id}/apps/{u" +
+      "ser_app_id.app_id}/inputs/streamZ\023\022\021/v2/" +
+      "inputs/stream\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\022\201\002\n\017Ge" +
+      "tInputSamples\022$.clarifai.api.GetInputSam" +
+      "plesRequest\032*.clarifai.api.MultiInputAnn" +
+      "otationResponse\"\233\001\202\323\344\223\002\200\001\022X/v2/users/{us" +
+      "er_app_id.user_id}/apps/{user_app_id.app" +
+      "_id}/tasks/{task_id}/inputs/samplesZ$\022\"/" +
+      "v2/tasks/{task_id}/inputs/samples\230\234\'\002\220\234\'" +
+      "-\220\234\'&\220\234\'\013\220\234\'\005\022\317\001\n\010GetInput\022\035.clarifai.ap" +
+      "i.GetInputRequest\032!.clarifai.api.SingleI" +
+      "nputResponse\"\200\001\202\323\344\223\002f\022K/v2/users/{user_a" +
       "pp_id.user_id}/apps/{user_app_id.app_id}" +
-      "/resource_countsZ\025\022\023/v2/resource_counts\230" +
-      "\234\'\002\220\234\'i\220\234\'\017\220\234\'\023\220\234\'m\220\234\'-\022\337\001\n\022PostModelsSe" +
-      "arches\022\'.clarifai.api.PostModelsSearches" +
-      "Request\032 .clarifai.api.MultiModelRespons" +
-      "e\"~\202\323\344\223\002h\"I/v2/users/{user_app_id.user_i" +
-      "d}/apps/{user_app_id.app_id}/models/sear" +
-      "ches:\001*Z\030\"\023/v2/models/searches:\001*\230\234\'\002\220\234\'" +
-      "-\220\234\'\013\220\234\'\017\022\312\001\n\nPostModels\022\037.clarifai.api." +
-      "PostModelsRequest\032!.clarifai.api.SingleM" +
-      "odelResponse\"x\202\323\344\223\002V\"@/v2/users/{user_ap" +
-      "p_id.user_id}/apps/{user_app_id.app_id}/" +
-      "models:\001*Z\017\"\n/v2/models:\001*\230\234\'\002\220\234\'-\220\234\'\013\220\234" +
-      "\'\016\220\234\'\017\220\234\'\032\220\234\'\023\022\307\001\n\013PatchModels\022 .clarifa" +
-      "i.api.PatchModelsRequest\032 .clarifai.api." +
-      "MultiModelResponse\"t\202\323\344\223\002V2@/v2/users/{u" +
-      "ser_app_id.user_id}/apps/{user_app_id.ap" +
-      "p_id}/models:\001*Z\0172\n/v2/models:\001*\230\234\'\002\220\234\'-" +
-      "\220\234\'\013\220\234\'\016\220\234\'\017\220\234\'\032\022\266\001\n\rPatchModelIds\022\".cla",
-      "rifai.api.PatchModelIdsRequest\032 .clarifa" +
-      "i.api.MultiModelResponse\"_\202\323\344\223\002I2D/v2/us" +
-      "ers/{user_app_id.user_id}/apps/{user_app" +
-      "_id.app_id}/models/ids:\001*\230\234\'\002\220\234\'-\220\234\'\016\220\234\'" +
-      "\017\022\335\001\n\013DeleteModel\022 .clarifai.api.DeleteM" +
-      "odelRequest\032!.clarifai.api.status.BaseRe" +
-      "sponse\"\210\001\202\323\344\223\002f*K/v2/users/{user_app_id." +
-      "user_id}/apps/{user_app_id.app_id}/model" +
-      "s/{model_id}Z\027*\025/v2/models/{model_id}\230\234\'" +
-      "\002\220\234\'-\220\234\'\013\220\234\'\016\220\234\'\021\220\234\'\017\220\234\'\023\022\316\001\n\014DeleteMode" +
-      "ls\022!.clarifai.api.DeleteModelsRequest\032!." +
-      "clarifai.api.status.BaseResponse\"x\202\323\344\223\002V" +
-      "*@/v2/users/{user_app_id.user_id}/apps/{" +
-      "user_app_id.app_id}/models:\001*Z\017*\n/v2/mod" +
-      "els:\001*\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\016\220\234\'\021\220\234\'\017\220\234\'\023\022\225\002\n\027P" +
-      "atchModelCheckConsents\022,.clarifai.api.Pa" +
-      "tchModelCheckConsentsRequest\032,.clarifai." +
-      "api.MultiModelCheckConsentResponse\"\235\001\202\323\344" +
-      "\223\002\212\0012Z/v2/users/{user_app_id.user_id}/ap" +
-      "ps/{user_app_id.app_id}/models/{model_id" +
-      "}/check_consents:\001*Z)2$/v2/models/{model" +
-      "_id}/check_consents:\001*\230\234\'\002\220\234\'-\220\234\'\017\022\371\001\n\022P" +
-      "atchModelToolkits\022\'.clarifai.api.PatchMo" +
-      "delToolkitsRequest\032\'.clarifai.api.MultiM" +
-      "odelToolkitResponse\"\220\001\202\323\344\223\002~2T/v2/users/" +
-      "{user_app_id.user_id}/apps/{user_app_id." +
-      "app_id}/models/{model_id}/toolkits:\001*Z#2" +
-      "\036/v2/models/{model_id}/toolkits:\001*\230\234\'\002\220\234" +
-      "\'-\220\234\'\017\022\371\001\n\022PatchModelUseCases\022\'.clarifai" +
-      ".api.PatchModelUseCasesRequest\032\'.clarifa" +
-      "i.api.MultiModelUseCaseResponse\"\220\001\202\323\344\223\002~" +
-      "2T/v2/users/{user_app_id.user_id}/apps/{" +
-      "user_app_id.app_id}/models/{model_id}/us" +
-      "ecases:\001*Z#2\036/v2/models/{model_id}/useca" +
-      "ses:\001*\230\234\'\002\220\234\'-\220\234\'\017\022\377\001\n\023PatchModelLanguag" +
-      "es\022(.clarifai.api.PatchModelLanguagesReq" +
-      "uest\032(.clarifai.api.MultiModelLanguageRe" +
-      "sponse\"\223\001\202\323\344\223\002\200\0012U/v2/users/{user_app_id" +
-      ".user_id}/apps/{user_app_id.app_id}/mode" +
-      "ls/{model_id}/languages:\001*Z$2\037/v2/models" +
-      "/{model_id}/languages:\001*\230\234\'\002\220\234\'-\220\234\'\017\022\224\003\n" +
-      "\017ListModelInputs\022$.clarifai.api.ListMode" +
-      "lInputsRequest\032 .clarifai.api.MultiInput" +
-      "Response\"\270\002\210\002\001\202\323\344\223\002\226\002\022R/v2/users/{user_a" +
+      "/inputs/{input_id}Z\027\022\025/v2/inputs/{input_" +
+      "id}\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\022\200\002\n\025GetInputVide" +
+      "oManifest\022%.clarifai.api.GetVideoManifes" +
+      "tRequest\032&.clarifai.api.GetVideoManifest" +
+      "Response\"\227\001\202\323\344\223\002\204\001\022Z/v2/users/{user_app_" +
+      "id.user_id}/apps/{user_app_id.app_id}/in" +
+      "puts/{input_id}/video_manifestZ&\022$/v2/in" +
+      "puts/{input_id}/video_manifest\230\234\'\002\220\234\'-\220\234" +
+      "\'\005\022\273\001\n\nListInputs\022\037.clarifai.api.ListInp" +
+      "utsRequest\032 .clarifai.api.MultiInputResp" +
+      "onse\"j\202\323\344\223\002P\022@/v2/users/{user_app_id.use" +
+      "r_id}/apps/{user_app_id.app_id}/inputsZ\014" +
+      "\022\n/v2/inputs\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\022\326\001\n\nPos" +
+      "tInputs\022\037.clarifai.api.PostInputsRequest" +
+      "\032 .clarifai.api.MultiInputResponse\"\204\001\202\323\344" +
+      "\223\002V\"@/v2/users/{user_app_id.user_id}/app" +
+      "s/{user_app_id.app_id}/inputs:\001*Z\017\"\n/v2/" +
+      "inputs:\001*\230\234\'\002\220\234\'-\220\234\'%\220\234\'&\220\234\'\013\220\234\'\004\220\234\'\005\220\234\'" +
+      "\017\220\234\'\002\220\234\'\023\022\317\001\n\013PatchInputs\022 .clarifai.api" +
+      ".PatchInputsRequest\032 .clarifai.api.Multi" +
+      "InputResponse\"|\202\323\344\223\002V2@/v2/users/{user_a" +
       "pp_id.user_id}/apps/{user_app_id.app_id}" +
-      "/models/{model_id}/inputsZ\036\022\034/v2/models/" +
-      "{model_id}/inputsZj\022h/v2/users/{user_app" +
-      "_id.user_id}/apps/{user_app_id.app_id}/m" +
-      "odels/{model_id}/versions/{version_id}/i" +
-      "nputsZ4\0222/v2/models/{model_id}/versions/" +
-      "{version_id}/inputs\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220" +
-      "\234\'\017\022\215\002\n\017GetModelVersion\022$.clarifai.api.G" +
-      "etModelVersionRequest\032(.clarifai.api.Sin" +
-      "gleModelVersionResponse\"\251\001\202\323\344\223\002\222\001\022a/v2/u" +
-      "sers/{user_app_id.user_id}/apps/{user_ap" +
-      "p_id.app_id}/models/{model_id}/versions/" +
-      "{version_id}Z-\022+/v2/models/{model_id}/ve" +
-      "rsions/{version_id}\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\022\365\001\n\021" +
-      "ListModelVersions\022&.clarifai.api.ListMod" +
-      "elVersionsRequest\032\'.clarifai.api.MultiMo" +
-      "delVersionResponse\"\216\001\202\323\344\223\002x\022T/v2/users/{" +
-      "user_app_id.user_id}/apps/{user_app_id.a" +
-      "pp_id}/models/{model_id}/versionsZ \022\036/v2" +
-      "/models/{model_id}/versions\230\234\'\002\220\234\'-\220\234\'\013\220" +
-      "\234\'\017\022\274\002\n\035PostWorkflowVersionsUnPublish\0222." +
-      "clarifai.api.PostWorkflowVersionsUnPubli" +
-      "shRequest\032!.clarifai.api.status.BaseResp" +
-      "onse\"\303\001\202\323\344\223\002\214\001\"[/v2/users/{user_app_id.u" +
-      "ser_id}/apps/{user_app_id.app_id}/workfl" +
-      "ows/{workflow_id}/unpublish:\001*Z*\"%/v2/wo" +
-      "rkflows/{workflow_id}/unpublish:\001*\230\234\'\002\220\234" +
-      "\'-\220\234\'x\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\023\220\234\'5\220\234" +
-      "\'6\022\264\002\n\033PostWorkflowVersionsPublish\0220.cla" +
-      "rifai.api.PostWorkflowVersionsPublishReq" +
-      "uest\032!.clarifai.api.status.BaseResponse\"" +
-      "\277\001\202\323\344\223\002\210\001\"Y/v2/users/{user_app_id.user_i" +
-      "d}/apps/{user_app_id.app_id}/workflows/{" +
-      "workflow_id}/publish:\001*Z(\"#/v2/workflows" +
-      "/{workflow_id}/publish:\001*\230\234\'\002\220\234\'-\220\234\'w\220\234\'" +
-      "&\220\234\'\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\023\220\234\'5\220\234\'6\022\241\002\n\030Po" +
-      "stModelVersionsPublish\022-.clarifai.api.Po" +
-      "stModelVersionsPublishRequest\032!.clarifai" +
-      ".api.status.BaseResponse\"\262\001\202\323\344\223\002|\"S/v2/u" +
+      "/inputs:\001*Z\0172\n/v2/inputs:\001*\230\234\'\002\220\234\'-\220\234\'%\220" +
+      "\234\'&\220\234\'\013\220\234\'\004\220\234\'\005\220\234\'\017\022\351\001\n\013DeleteInput\022 .cl" +
+      "arifai.api.DeleteInputRequest\032!.clarifai" +
+      ".api.status.BaseResponse\"\224\001\202\323\344\223\002f*K/v2/u" +
       "sers/{user_app_id.user_id}/apps/{user_ap" +
-      "p_id.app_id}/models/{model_id}/publish:\001" +
-      "*Z\"\"\035/v2/models/{model_id}/publish:\001*\230\234\'" +
-      "\002\220\234\'-\220\234\'u\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\023\220\234\'" +
-      "5\220\234\'6\022\252\002\n\032PostModelVersionsUnPublish\022/.c" +
-      "larifai.api.PostModelVersionsUnPublishRe" +
-      "quest\032!.clarifai.api.status.BaseResponse" +
-      "\"\267\001\202\323\344\223\002\200\001\"U/v2/users/{user_app_id.user_" +
-      "id}/apps/{user_app_id.app_id}/models/{mo" +
-      "del_id}/unpublish:\001*Z$\"\037/v2/models/{mode" +
-      "l_id}/unpublish:\001*\230\234\'\002\220\234\'-\220\234\'v\220\234\'&\220\234\'\013\220\234" +
-      "\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\023\220\234\'5\220\234\'6\022\221\002\n\021PostModel" +
-      "Versions\022&.clarifai.api.PostModelVersion" +
-      "sRequest\032!.clarifai.api.SingleModelRespo" +
-      "nse\"\260\001\202\323\344\223\002~\"T/v2/users/{user_app_id.use" +
-      "r_id}/apps/{user_app_id.app_id}/models/{" +
-      "model_id}/versions:\001*Z#\"\036/v2/models/{mod" +
-      "el_id}/versions:\001*\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234" +
-      "\'\016\220\234\'\017\220\234\'\032\220\234\'\023\220\234\'5\220\234\'6\022\337\001\n\022PatchModelVer" +
-      "sions\022\'.clarifai.api.PatchModelVersionsR" +
-      "equest\032\'.clarifai.api.MultiModelVersionR" +
-      "esponse\"w\202\323\344\223\002Y2T/v2/users/{user_app_id." +
+      "p_id.app_id}/inputs/{input_id}Z\027*\025/v2/in" +
+      "puts/{input_id}\230\234\'\002\220\234\'-\220\234\'%\220\234\'(\220\234\'&\220\234\'\004\220" +
+      "\234\'\010\220\234\'\005\220\234\'\017\220\234\'\023\022\333\001\n\014DeleteInputs\022!.clari" +
+      "fai.api.DeleteInputsRequest\032!.clarifai.a" +
+      "pi.status.BaseResponse\"\204\001\202\323\344\223\002V*@/v2/use" +
+      "rs/{user_app_id.user_id}/apps/{user_app_" +
+      "id.app_id}/inputs:\001*Z\017*\n/v2/inputs:\001*\230\234\'" +
+      "\002\220\234\'-\220\234\'%\220\234\'(\220\234\'&\220\234\'\004\220\234\'\010\220\234\'\005\220\234\'\017\220\234\'\023\022\342\001" +
+      "\n\023PatchInputsSearches\022(.clarifai.api.Pat" +
+      "chInputsSearchesRequest\032!.clarifai.api.M" +
+      "ultiSearchResponse\"~\202\323\344\223\002h2I/v2/users/{u" +
+      "ser_app_id.user_id}/apps/{user_app_id.ap" +
+      "p_id}/inputs/searches:\001*Z\0302\023/v2/inputs/s" +
+      "earches:\001*\230\234\'\002\220\234\'-\220\234\'s\220\234\'r\022\361\001\n\022PostInput" +
+      "sSearches\022\'.clarifai.api.PostInputsSearc" +
+      "hesRequest\032!.clarifai.api.MultiSearchRes" +
+      "ponse\"\216\001\202\323\344\223\002h\"I/v2/users/{user_app_id.u" +
+      "ser_id}/apps/{user_app_id.app_id}/inputs" +
+      "/searches:\001*Z\030\"\023/v2/inputs/searches:\001*\230\234" +
+      "\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\017\220\234\'\003\220\234\'\023\022\211\004\n\020PostM" +
+      "odelOutputs\022%.clarifai.api.PostModelOutp" +
+      "utsRequest\032!.clarifai.api.MultiOutputRes" +
+      "ponse\"\252\003\202\323\344\223\002\217\003\"i/v2/users/{user_app_id." +
       "user_id}/apps/{user_app_id.app_id}/model" +
-      "s/{model_id}/versions:\001*\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017" +
-      "\220\234\'\016\220\234\'\032\022\230\002\n\022DeleteModelVersion\022\'.clarif" +
-      "ai.api.DeleteModelVersionRequest\032!.clari" +
-      "fai.api.status.BaseResponse\"\265\001\202\323\344\223\002\222\001*a/" +
-      "v2/users/{user_app_id.user_id}/apps/{use" +
-      "r_app_id.app_id}/models/{model_id}/versi" +
-      "ons/{version_id}Z-*+/v2/models/{model_id" +
-      "}/versions/{version_id}\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\016\220" +
-      "\234\'\021\220\234\'\017\220\234\'\023\022\271\001\n\027PostModelVersionsUpload\022" +
-      ",.clarifai.api.PostModelVersionsUploadRe" +
-      "quest\032-.clarifai.api.PostModelVersionsUp" +
-      "loadResponse\"=\202\323\344\223\002\037\"\032/v2/models/version" +
-      "s/upload:\001*\230\234\'\002\220\234\'-\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\023(\0010\001\022" +
-      "\267\002\n\026PutModelVersionExports\022+.clarifai.ap" +
-      "i.PutModelVersionExportsRequest\032..clarif" +
-      "ai.api.SingleModelVersionExportResponse\"" +
-      "\277\001\202\323\344\223\002\242\001\032i/v2/users/{user_app_id.user_i" +
-      "d}/apps/{user_app_id.app_id}/models/{mod" +
-      "el_id}/versions/{version_id}/exportsZ5\0323" +
-      "/v2/models/{model_id}/versions/{version_" +
-      "id}/exports\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\216\001\220\234\'\217\001\022\260\002\n\025Ge" +
-      "tModelVersionExport\022*.clarifai.api.GetMo" +
-      "delVersionExportRequest\032..clarifai.api.S" +
-      "ingleModelVersionExportResponse\"\272\001\202\323\344\223\002\242" +
-      "\001\022i/v2/users/{user_app_id.user_id}/apps/" +
-      "{user_app_id.app_id}/models/{model_id}/v" +
-      "ersions/{version_id}/exportsZ5\0223/v2/mode" +
-      "ls/{model_id}/versions/{version_id}/expo" +
-      "rts\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\216\001\022\267\002\n\026GetModelVersion" +
-      "Metrics\022+.clarifai.api.GetModelVersionMe" +
-      "tricsRequest\032(.clarifai.api.SingleModelV" +
-      "ersionResponse\"\305\001\202\323\344\223\002\242\001\022i/v2/users/{use" +
+      "s/{model_id}/versions/{version_id}/outpu" +
+      "ts:\001*Z8\"3/v2/models/{model_id}/versions/" +
+      "{version_id}/outputs:\001*ZX\"S/v2/users/{us" +
+      "er_app_id.user_id}/apps/{user_app_id.app" +
+      "_id}/models/{model_id}/outputs:\001*Z\"\"\035/v2" +
+      "/models/{model_id}/outputs:\001*Zg\"b/v2/use" +
+      "rs/{runner_selector.deployment.user_id}/" +
+      "deployments/{runner_selector.deployment." +
+      "id}/outputs:\001*\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\220\234\'\002\022\332\002\n\024G" +
+      "enerateModelOutputs\022%.clarifai.api.PostM" +
+      "odelOutputsRequest\032!.clarifai.api.MultiO" +
+      "utputResponse\"\365\001\202\323\344\223\002\332\001\"r/v2/users/{user" +
+      "_app_id.user_id}/apps/{user_app_id.app_i" +
+      "d}/models/{model_id}/versions/{version_i" +
+      "d}/outputs/generate:\001*Za\"\\/v2/users/{use" +
       "r_app_id.user_id}/apps/{user_app_id.app_" +
-      "id}/models/{model_id}/versions/{version_" +
-      "id}/metricsZ5\0223/v2/models/{model_id}/ver" +
-      "sions/{version_id}/metrics\230\234\'\002\220\234\'-\220\234\'&\220\234" +
-      "\'\013\220\234\'\017\220\234\'\005\220\234\'5\022\323\002\n\027PostModelVersionMetri" +
-      "cs\022,.clarifai.api.PostModelVersionMetric" +
-      "sRequest\032(.clarifai.api.SingleModelVersi" +
-      "onResponse\"\337\001\202\323\344\223\002\250\001\"i/v2/users/{user_ap" +
+      "id}/models/{model_id}/outputs/generate:\001" +
+      "*\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\220\234\'\0020\001\022\234\001\n\022StreamModelO" +
+      "utputs\022%.clarifai.api.PostModelOutputsRe" +
+      "quest\032!.clarifai.api.MultiOutputResponse" +
+      "\"8\202\323\344\223\002\036\"\031/v2/models/outputs/stream:\001*\230\234" +
+      "\'\002\220\234\'-\220\234\'\013\220\234\'\017\220\234\'\002(\0010\001\022\357\001\n\014ListDatasets\022" +
+      "!.clarifai.api.ListDatasetsRequest\032\".cla" +
+      "rifai.api.MultiDatasetResponse\"\227\001\202\323\344\223\002\200\001" +
+      "\022B/v2/users/{user_app_id.user_id}/apps/{" +
+      "user_app_id.app_id}/datasetsZ*\022(/v2/user" +
+      "s/{user_app_id.user_id}/datasetsZ\016\022\014/v2/" +
+      "datasets\230\234\'\002\220\234\'-\220\234\'i\220\234\'r\022\331\001\n\nGetDataset\022" +
+      "\037.clarifai.api.GetDatasetRequest\032#.clari" +
+      "fai.api.SingleDatasetResponse\"\204\001\202\323\344\223\002n\022O" +
+      "/v2/users/{user_app_id.user_id}/apps/{us" +
+      "er_app_id.app_id}/datasets/{dataset_id}Z" +
+      "\033\022\031/v2/datasets/{dataset_id}\230\234\'\002\220\234\'-\220\234\'i" +
+      "\220\234\'r\022\313\001\n\014PostDatasets\022!.clarifai.api.Pos" +
+      "tDatasetsRequest\032\".clarifai.api.MultiDat" +
+      "asetResponse\"t\202\323\344\223\002Z\"B/v2/users/{user_ap" +
       "p_id.user_id}/apps/{user_app_id.app_id}/" +
-      "models/{model_id}/versions/{version_id}/" +
-      "metrics:\001*Z8\"3/v2/models/{model_id}/vers" +
-      "ions/{version_id}/metrics:\001*\230\234\'\002\220\234\'-\220\234\'&" +
-      "\220\234\'\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\002\220\234\'\023\220\234\'5\220\234\'6\022\355\002\n" +
-      "\033PostModelVersionEvaluations\0220.clarifai." +
-      "api.PostModelVersionEvaluationsRequest\032&" +
-      ".clarifai.api.MultiEvalMetricsResponse\"\363" +
-      "\001\202\323\344\223\002\274\001\"s/v2/users/{user_app_id.user_id" +
-      "}/apps/{user_app_id.app_id}/models/{mode" +
-      "l_id}/versions/{model_version_id}/evalua" +
-      "tions:\001*ZB\"=/v2/models/{model_id}/versio" +
-      "ns/{model_version_id}/evaluations:\001*\230\234\'\002" +
-      "\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\002\220\234\'\023\220\234\'5" +
-      "\220\234\'6\022\323\002\n\033ListModelVersionEvaluations\0220.c" +
-      "larifai.api.ListModelVersionEvaluationsR" +
-      "equest\032&.clarifai.api.MultiEvalMetricsRe" +
-      "sponse\"\331\001\202\323\344\223\002\266\001\022s/v2/users/{user_app_id" +
-      ".user_id}/apps/{user_app_id.app_id}/mode" +
-      "ls/{model_id}/versions/{model_version_id" +
-      "}/evaluationsZ?\022=/v2/models/{model_id}/v" +
-      "ersions/{model_version_id}/evaluations\230\234" +
-      "\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\017\220\234\'\005\220\234\'5\022\361\002\n\031GetModelV" +
-      "ersionEvaluation\022..clarifai.api.GetModel" +
-      "VersionEvaluationRequest\032\'.clarifai.api." +
-      "SingleEvalMetricsResponse\"\372\001\202\323\344\223\002\327\001\022\203\001/v" +
-      "2/users/{user_app_id.user_id}/apps/{user" +
-      "_app_id.app_id}/models/{model_id}/versio" +
-      "ns/{model_version_id}/evaluations/{evalu" +
-      "ation_id}ZO\022M/v2/models/{model_id}/versi" +
-      "ons/{model_version_id}/evaluations/{eval" +
-      "uation_id}\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\017\220\234\'\005\220\234\'5\022\370" +
-      "\001\n\017PostEvaluations\022$.clarifai.api.PostEv" +
-      "aluationsRequest\032&.clarifai.api.MultiEva" +
-      "lMetricsResponse\"\226\001\202\323\344\223\002`\"E/v2/users/{us" +
-      "er_app_id.user_id}/apps/{user_app_id.app" +
-      "_id}/evaluations:\001*Z\024\"\017/v2/evaluations:\001" +
-      "*\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\002\220\234\'" +
-      "\023\220\234\'5\220\234\'6\022\216\002\n\017ListEvaluations\022$.clarifai" +
-      ".api.ListEvaluationsRequest\032&.clarifai.a" +
-      "pi.MultiEvalMetricsResponse\"\254\001\202\323\344\223\002\211\001\022E/" +
-      "v2/users/{user_app_id.user_id}/apps/{use" +
-      "r_app_id.app_id}/evaluationsZ-\022+/v2/user" +
-      "s/{user_app_id.user_id}/evaluationsZ\021\022\017/" +
-      "v2/evaluations\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\017\220\234\'\005\220\234" +
-      "\'5\022\373\001\n\rGetEvaluation\022\".clarifai.api.GetE" +
-      "valuationRequest\032\'.clarifai.api.SingleEv" +
-      "alMetricsResponse\"\234\001\202\323\344\223\002z\022U/v2/users/{u" +
-      "ser_app_id.user_id}/apps/{user_app_id.ap" +
-      "p_id}/evaluations/{evaluation_id}Z!\022\037/v2" +
-      "/evaluations/{evaluation_id}\230\234\'\002\220\234\'-\220\234\'&" +
-      "\220\234\'\013\220\234\'\017\220\234\'\005\220\234\'5\022\373\001\n\023ListModelReferences" +
-      "\022(.clarifai.api.ListModelReferencesReque" +
-      "st\032).clarifai.api.MultiModelReferenceRes" +
-      "ponse\"\216\001\202\323\344\223\002|\022V/v2/users/{user_app_id.u" +
-      "ser_id}/apps/{user_app_id.app_id}/models" +
-      "/{model_id}/referencesZ\"\022 /v2/models/{mo" +
-      "del_id}/references\230\234\'\002\220\234\'-\220\234\'\017\022\362\002\n\033GetMo" +
-      "delVersionInputExample\0220.clarifai.api.Ge" +
-      "tModelVersionInputExampleRequest\0324.clari" +
-      "fai.api.SingleModelVersionInputExampleRe" +
-      "sponse\"\352\001\202\323\344\223\002\327\001\022\203\001/v2/users/{user_app_i" +
-      "d.user_id}/apps/{user_app_id.app_id}/mod" +
-      "els/{model_id}/versions/{model_version_i" +
-      "d}/input_examples/{example_id}ZO\022M/v2/mo" +
-      "dels/{model_id}/versions/{model_version_" +
-      "id}/input_examples/{example_id}\230\234\'\002\220\234\'-\220" +
-      "\234\'\017\022\332\002\n\035ListModelVersionInputExamples\0222." +
-      "clarifai.api.ListModelVersionInputExampl" +
-      "esRequest\0323.clarifai.api.MultiModelVersi" +
-      "onInputExampleResponse\"\317\001\202\323\344\223\002\274\001\022v/v2/us" +
-      "ers/{user_app_id.user_id}/apps/{user_app" +
-      "_id.app_id}/models/{model_id}/versions/{" +
-      "model_version_id}/input_examplesZB\022@/v2/" +
-      "models/{model_id}/versions/{model_versio" +
-      "n_id}/input_examples\230\234\'\002\220\234\'-\220\234\'\017\022\340\001\n\013Get" +
-      "Workflow\022 .clarifai.api.GetWorkflowReque" +
-      "st\032$.clarifai.api.SingleWorkflowResponse" +
-      "\"\210\001\202\323\344\223\002r\022Q/v2/users/{user_app_id.user_i" +
-      "d}/apps/{user_app_id.app_id}/workflows/{" +
-      "workflow_id}Z\035\022\033/v2/workflows/{workflow_" +
-      "id}\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\023\022\365\001\n\rListWorkflows\022\"." +
-      "clarifai.api.ListWorkflowsRequest\032#.clar" +
-      "ifai.api.MultiWorkflowResponse\"\232\001\202\323\344\223\002\203\001" +
-      "\022C/v2/users/{user_app_id.user_id}/apps/{" +
-      "user_app_id.app_id}/workflowsZ+\022)/v2/use" +
-      "rs/{user_app_id.user_id}/workflowsZ\017\022\r/v" +
-      "2/workflows\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\023\022\320\001\n\rPostWork" +
-      "flows\022\".clarifai.api.PostWorkflowsReques" +
-      "t\032#.clarifai.api.MultiWorkflowResponse\"v" +
-      "\202\323\344\223\002\\\"C/v2/users/{user_app_id.user_id}/" +
-      "apps/{user_app_id.app_id}/workflows:\001*Z\022" +
-      "\"\r/v2/workflows:\001*\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\022\220\234\'\023\022\322" +
-      "\001\n\016PatchWorkflows\022#.clarifai.api.PatchWo" +
-      "rkflowsRequest\032#.clarifai.api.MultiWorkf" +
-      "lowResponse\"v\202\323\344\223\002\\2C/v2/users/{user_app" +
-      "_id.user_id}/apps/{user_app_id.app_id}/w" +
-      "orkflows:\001*Z\0222\r/v2/workflows:\001*\230\234\'\002\220\234\'-\220" +
-      "\234\'\017\220\234\'\022\220\234\'\023\022\302\001\n\020PatchWorkflowIds\022%.clari" +
-      "fai.api.PatchWorkflowIdsRequest\032#.clarif" +
-      "ai.api.MultiWorkflowResponse\"b\202\323\344\223\002L2G/v" +
-      "2/users/{user_app_id.user_id}/apps/{user" +
-      "_app_id.app_id}/workflows/ids:\001*\230\234\'\002\220\234\'-" +
-      "\220\234\'\022\220\234\'\023\022\347\001\n\016DeleteWorkflow\022#.clarifai.a" +
-      "pi.DeleteWorkflowRequest\032!.clarifai.api." +
-      "status.BaseResponse\"\214\001\202\323\344\223\002r*Q/v2/users/" +
+      "datasets:\001*Z\021\"\014/v2/datasets:\001*\230\234\'\002\220\234\'-\220\234" +
+      "\'i\220\234\'j\220\234\'r\022\315\001\n\rPatchDatasets\022\".clarifai." +
+      "api.PatchDatasetsRequest\032\".clarifai.api." +
+      "MultiDatasetResponse\"t\202\323\344\223\002Z2B/v2/users/" +
       "{user_app_id.user_id}/apps/{user_app_id." +
-      "app_id}/workflows/{workflow_id}Z\035*\033/v2/w" +
-      "orkflows/{workflow_id}\230\234\'\002\220\234\'-\220\234\'\022\220\234\'\025\220\234" +
-      "\'\023\022\322\001\n\017DeleteWorkflows\022$.clarifai.api.De" +
-      "leteWorkflowsRequest\032!.clarifai.api.stat" +
-      "us.BaseResponse\"v\202\323\344\223\002\\*C/v2/users/{user" +
+      "app_id}/datasets:\001*Z\0212\014/v2/datasets:\001*\230\234" +
+      "\'\002\220\234\'-\220\234\'i\220\234\'j\220\234\'r\022\316\001\n\016DeleteDatasets\022#." +
+      "clarifai.api.DeleteDatasetsRequest\032!.cla" +
+      "rifai.api.status.BaseResponse\"t\202\323\344\223\002Z*B/" +
+      "v2/users/{user_app_id.user_id}/apps/{use" +
+      "r_app_id.app_id}/datasets:\001*Z\021*\014/v2/data" +
+      "sets:\001*\230\234\'\002\220\234\'-\220\234\'i\220\234\'j\220\234\'k\022\201\002\n\021ListData" +
+      "setInputs\022&.clarifai.api.ListDatasetInpu" +
+      "tsRequest\032\'.clarifai.api.MultiDatasetInp" +
+      "utResponse\"\232\001\202\323\344\223\002|\022V/v2/users/{user_app" +
+      "_id.user_id}/apps/{user_app_id.app_id}/d" +
+      "atasets/{dataset_id}/inputsZ\"\022 /v2/datas" +
+      "ets/{dataset_id}/inputs\230\234\'\002\220\234\'-\220\234\'i\220\234\'\005\220" +
+      "\234\'&\220\234\'\013\022\225\002\n\017GetDatasetInput\022$.clarifai.a" +
+      "pi.GetDatasetInputRequest\032(.clarifai.api" +
+      ".SingleDatasetInputResponse\"\261\001\202\323\344\223\002\222\001\022a/" +
+      "v2/users/{user_app_id.user_id}/apps/{use" +
+      "r_app_id.app_id}/datasets/{dataset_id}/i" +
+      "nputs/{input_id}Z-\022+/v2/datasets/{datase" +
+      "t_id}/inputs/{input_id}\230\234\'\002\220\234\'-\220\234\'i\220\234\'\005\220" +
+      "\234\'&\220\234\'\013\022\214\002\n\021PostDatasetInputs\022&.clarifai" +
+      ".api.PostDatasetInputsRequest\032\'.clarifai" +
+      ".api.MultiDatasetInputResponse\"\245\001\202\323\344\223\002\202\001" +
+      "\"V/v2/users/{user_app_id.user_id}/apps/{" +
+      "user_app_id.app_id}/datasets/{dataset_id" +
+      "}/inputs:\001*Z%\" /v2/datasets/{dataset_id}" +
+      "/inputs:\001*\230\234\'\002\220\234\'-\220\234\'i\220\234\'j\220\234\'\005\220\234\'&\220\234\'\013\022\206" +
+      "\002\n\023DeleteDatasetInputs\022(.clarifai.api.De" +
+      "leteDatasetInputsRequest\032!.clarifai.api." +
+      "status.BaseResponse\"\241\001\202\323\344\223\002\202\001*V/v2/users" +
+      "/{user_app_id.user_id}/apps/{user_app_id" +
+      ".app_id}/datasets/{dataset_id}/inputs:\001*" +
+      "Z%* /v2/datasets/{dataset_id}/inputs:\001*\230" +
+      "\234\'\002\220\234\'-\220\234\'i\220\234\'j\220\234\'k\220\234\'\005\022\204\002\n\023ListDatasetV" +
+      "ersions\022(.clarifai.api.ListDatasetVersio" +
+      "nsRequest\032).clarifai.api.MultiDatasetVer" +
+      "sionResponse\"\227\001\202\323\344\223\002\200\001\022X/v2/users/{user_" +
+      "app_id.user_id}/apps/{user_app_id.app_id" +
+      "}/datasets/{dataset_id}/versionsZ$\022\"/v2/" +
+      "datasets/{dataset_id}/versions\230\234\'\002\220\234\'-\220\234" +
+      "\'i\220\234\'r\022\253\002\n\021GetDatasetVersion\022&.clarifai." +
+      "api.GetDatasetVersionRequest\032*.clarifai." +
+      "api.SingleDatasetVersionResponse\"\301\001\202\323\344\223\002" +
+      "\252\001\022m/v2/users/{user_app_id.user_id}/apps" +
+      "/{user_app_id.app_id}/datasets/{dataset_" +
+      "id}/versions/{dataset_version_id}Z9\0227/v2" +
+      "/datasets/{dataset_id}/versions/{dataset" +
+      "_version_id}\230\234\'\002\220\234\'-\220\234\'i\220\234\'r\022\336\002\n\037ListDat" +
+      "asetVersionMetricsGroups\0224.clarifai.api." +
+      "ListDatasetVersionMetricsGroupsRequest\0325" +
+      ".clarifai.api.MultiDatasetVersionMetrics" +
+      "GroupResponse\"\315\001\202\323\344\223\002\272\001\022u/v2/users/{user" +
       "_app_id.user_id}/apps/{user_app_id.app_i" +
-      "d}/workflows:\001*Z\022*\r/v2/workflows:\001*\230\234\'\002\220" +
-      "\234\'-\220\234\'\022\220\234\'\025\220\234\'\023\022\212\003\n\023PostWorkflowResults\022" +
-      "(.clarifai.api.PostWorkflowResultsReques" +
-      "t\032).clarifai.api.PostWorkflowResultsResp" +
-      "onse\"\235\002\202\323\344\223\002\376\001\"o/v2/users/{user_app_id.u" +
-      "ser_id}/apps/{user_app_id.app_id}/workfl" +
-      "ows/{workflow_id}/versions/{version_id}/" +
-      "results:\001*Z^\"Y/v2/users/{user_app_id.use" +
-      "r_id}/apps/{user_app_id.app_id}/workflow" +
-      "s/{workflow_id}/results:\001*Z(\"#/v2/workfl" +
-      "ows/{workflow_id}/results:\001*\230\234\'\002\220\234\'-\220\234\'\017" +
-      "\220\234\'\013\220\234\'\002\220\234\'\023\022\311\003\n\035PostWorkflowResultsSimi" +
-      "larity\0222.clarifai.api.PostWorkflowResult" +
-      "sSimilarityRequest\0323.clarifai.api.PostWo" +
-      "rkflowResultsSimilarityResponse\"\276\002\202\323\344\223\002\237" +
-      "\002\"z/v2/users/{user_app_id.user_id}/apps/" +
-      "{user_app_id.app_id}/workflows/{workflow" +
-      "_id}/versions/{version_id}/results/simil" +
-      "arity:\001*Zi\"d/v2/users/{user_app_id.user_" +
-      "id}/apps/{user_app_id.app_id}/workflows/" +
-      "{workflow_id}/results/similarity:\001*Z3\"./" +
-      "v2/workflows/{workflow_id}/results/simil" +
-      "arity:\001*\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\013\220\234\'\002\220\234\'\023\022\213\002\n\024Lis" +
-      "tWorkflowVersions\022).clarifai.api.ListWor" +
-      "kflowVersionsRequest\032*.clarifai.api.Mult" +
-      "iWorkflowVersionResponse\"\233\001\202\323\344\223\002\204\001\022Z/v2/" +
-      "users/{user_app_id.user_id}/apps/{user_a" +
-      "pp_id.app_id}/workflows/{workflow_id}/ve" +
-      "rsionsZ&\022$/v2/workflows/{workflow_id}/ve" +
-      "rsions\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\023\022\264\002\n\022GetWorkflowVe" +
-      "rsion\022\'.clarifai.api.GetWorkflowVersionR" +
-      "equest\032+.clarifai.api.SingleWorkflowVers" +
-      "ionResponse\"\307\001\202\323\344\223\002\260\001\022p/v2/users/{user_a" +
-      "pp_id.user_id}/apps/{user_app_id.app_id}" +
-      "/workflows/{workflow_id}/versions/{workf" +
-      "low_version_id}Z<\022:/v2/workflows/{workfl" +
-      "ow_id}/versions/{workflow_version_id}\230\234\'" +
-      "\002\220\234\'-\220\234\'\017\220\234\'\023\022\220\002\n\026DeleteWorkflowVersions" +
-      "\022+.clarifai.api.DeleteWorkflowVersionsRe" +
-      "quest\032!.clarifai.api.status.BaseResponse" +
-      "\"\245\001\202\323\344\223\002\212\001*Z/v2/users/{user_app_id.user_" +
-      "id}/apps/{user_app_id.app_id}/workflows/" +
-      "{workflow_id}/versions:\001*Z)*$/v2/workflo" +
-      "ws/{workflow_id}/versions:\001*\230\234\'\002\220\234\'-\220\234\'\023" +
-      "\220\234\'\022\220\234\'\025\022\227\002\n\025PatchWorkflowVersions\022*.cla" +
-      "rifai.api.PatchWorkflowVersionsRequest\032*" +
-      ".clarifai.api.MultiWorkflowVersionRespon" +
-      "se\"\245\001\202\323\344\223\002\212\0012Z/v2/users/{user_app_id.use" +
-      "r_id}/apps/{user_app_id.app_id}/workflow" +
-      "s/{workflow_id}/versions:\001*Z)2$/v2/workf" +
-      "lows/{workflow_id}/versions:\001*\230\234\'\002\220\234\'-\220\234" +
-      "\'\017\220\234\'\023\220\234\'\022\022\205\001\n\006GetKey\022\033.clarifai.api.Get" +
-      "KeyRequest\032\037.clarifai.api.SingleKeyRespo" +
-      "nse\"=\202\323\344\223\002/\022-/v2/users/{user_app_id.user" +
-      "_id}/keys/{key_id}\230\234\'\005\220\234\'0\022\177\n\010ListKeys\022\035" +
-      ".clarifai.api.ListKeysRequest\032\036.clarifai" +
-      ".api.MultiKeyResponse\"4\202\323\344\223\002&\022$/v2/users" +
-      "/{user_app_id.user_id}/keys\230\234\'\005\220\234\'0\022\243\001\n\013" +
-      "ListAppKeys\022 .clarifai.api.ListAppKeysRe" +
-      "quest\032\036.clarifai.api.MultiKeyResponse\"R\202" +
-      "\323\344\223\002@\022>/v2/users/{user_app_id.user_id}/a" +
-      "pps/{user_app_id.app_id}/keys\230\234\'\005\220\234\'-\220\234\'" +
-      "0\022\225\001\n\tDeleteKey\022\036.clarifai.api.DeleteKey" +
-      "Request\032!.clarifai.api.status.BaseRespon" +
-      "se\"E\202\323\344\223\002/*-/v2/users/{user_app_id.user_" +
-      "id}/keys/{key_id}\230\234\'\005\220\234\'/\220\234\'1\220\234\'0\022\212\001\n\010Po" +
-      "stKeys\022\035.clarifai.api.PostKeysRequest\032\036." +
-      "clarifai.api.MultiKeyResponse\"?\202\323\344\223\002)\"$/" +
-      "v2/users/{user_app_id.user_id}/keys:\001*\230\234" +
-      "\'\005\220\234\'-\220\234\'/\220\234\'0\022\210\001\n\tPatchKeys\022\036.clarifai." +
-      "api.PatchKeysRequest\032\036.clarifai.api.Mult" +
-      "iKeyResponse\";\202\323\344\223\002)2$/v2/users/{user_ap" +
-      "p_id.user_id}/keys:\001*\230\234\'\005\220\234\'/\220\234\'0\022\274\001\n\010My" +
-      "Scopes\022\035.clarifai.api.MyScopesRequest\032 ." +
-      "clarifai.api.MultiScopeResponse\"o\202\323\344\223\002e\022" +
-      "B/v2/users/{user_app_id.user_id}/apps/{u" +
-      "ser_app_id.app_id}/myscopesZ\016\022\014/v2/mysco" +
-      "pesZ\017\022\r/v2/my_scopes\230\234\'\002\022\215\001\n\014MyScopesUse" +
-      "r\022!.clarifai.api.MyScopesUserRequest\032$.c" +
-      "larifai.api.MultiScopeUserResponse\"4\202\323\344\223" +
-      "\002*\022(/v2/users/{user_app_id.user_id}/mysc" +
-      "opes\230\234\'\005\022u\n\014MyScopesRoot\022!.clarifai.api." +
-      "MyScopesRootRequest\032$.clarifai.api.Multi" +
-      "ScopeRootResponse\"\034\202\323\344\223\002\022\022\020/v2/myscopesr" +
-      "oot\230\234\'\005\022\207\001\n\nListScopes\022\037.clarifai.api.Li" +
-      "stScopesRequest\032$.clarifai.api.MultiScop" +
-      "eDepsResponse\"2\202\323\344\223\002(\022&/v2/users/{user_a" +
-      "pp_id.user_id}/scopes\230\234\'\003\022\240\001\n\006GetApp\022\033.c" +
-      "larifai.api.GetAppRequest\032\037.clarifai.api" +
-      ".SingleAppResponse\"X\202\323\344\223\002F\0229/v2/users/{u" +
+      "d}/datasets/{dataset_id}/versions/{datas" +
+      "et_version_id}/metricsZA\022?/v2/datasets/{" +
+      "dataset_id}/versions/{dataset_version_id" +
+      "}/metrics\230\234\'\002\220\234\'-\220\234\'i\022\222\002\n\023PostDatasetVer" +
+      "sions\022(.clarifai.api.PostDatasetVersions" +
+      "Request\032).clarifai.api.MultiDatasetVersi" +
+      "onResponse\"\245\001\202\323\344\223\002\206\001\"X/v2/users/{user_ap" +
+      "p_id.user_id}/apps/{user_app_id.app_id}/" +
+      "datasets/{dataset_id}/versions:\001*Z\'\"\"/v2" +
+      "/datasets/{dataset_id}/versions:\001*\230\234\'\002\220\234" +
+      "\'-\220\234\'i\220\234\'j\220\234\'\017\220\234\'\023\022\214\002\n\024PatchDatasetVersi" +
+      "ons\022).clarifai.api.PatchDatasetVersionsR" +
+      "equest\032).clarifai.api.MultiDatasetVersio" +
+      "nResponse\"\235\001\202\323\344\223\002\206\0012X/v2/users/{user_app" +
+      "_id.user_id}/apps/{user_app_id.app_id}/d" +
+      "atasets/{dataset_id}/versions:\001*Z\'2\"/v2/" +
+      "datasets/{dataset_id}/versions:\001*\230\234\'\002\220\234\'" +
+      "-\220\234\'i\220\234\'j\022\212\002\n\025DeleteDatasetVersions\022*.cl" +
+      "arifai.api.DeleteDatasetVersionsRequest\032" +
+      "!.clarifai.api.status.BaseResponse\"\241\001\202\323\344" +
+      "\223\002\206\001*X/v2/users/{user_app_id.user_id}/ap" +
+      "ps/{user_app_id.app_id}/datasets/{datase" +
+      "t_id}/versions:\001*Z\'*\"/v2/datasets/{datas" +
+      "et_id}/versions:\001*\230\234\'\002\220\234\'-\220\234\'i\220\234\'j\220\234\'k\022\324" +
+      "\002\n\030PutDatasetVersionExports\022-.clarifai.a" +
+      "pi.PutDatasetVersionExportsRequest\032/.cla" +
+      "rifai.api.MultiDatasetVersionExportRespo" +
+      "nse\"\327\001\202\323\344\223\002\300\001\032u/v2/users/{user_app_id.us" +
+      "er_id}/apps/{user_app_id.app_id}/dataset" +
+      "s/{dataset_id}/versions/{dataset_version" +
+      "_id}/exports:\001*ZD\032?/v2/datasets/{dataset" +
+      "_id}/versions/{dataset_version_id}/expor" +
+      "ts:\001*\230\234\'\002\220\234\'-\220\234\'i\220\234\'j\022\351\001\n\014GetModelType\022!" +
+      ".clarifai.api.GetModelTypeRequest\032%.clar" +
+      "ifai.api.SingleModelTypeResponse\"\216\001\202\323\344\223\002" +
+      "|\022V/v2/users/{user_app_id.user_id}/apps/" +
+      "{user_app_id.app_id}/models/types/{model" +
+      "_type_id}Z\"\022 /v2/models/types/{model_typ" +
+      "e_id}\230\234\'\002\220\234\'-\220\234\'\017\022\231\001\n\026ListOpenSourceLice" +
+      "nses\022+.clarifai.api.ListOpenSourceLicens" +
+      "esRequest\032,.clarifai.api.ListOpenSourceL" +
+      "icensesResponse\"$\202\323\344\223\002\032\022\030/v2/open_source" +
+      "_licenses\230\234\'\001\022\313\001\n\016ListModelTypes\022#.clari" +
+      "fai.api.ListModelTypesRequest\032$.clarifai" +
+      ".api.MultiModelTypeResponse\"n\202\323\344\223\002\\\022F/v2" +
+      "/users/{user_app_id.user_id}/apps/{user_" +
+      "app_id.app_id}/models/typesZ\022\022\020/v2/model",
+      "s/types\230\234\'\002\220\234\'-\220\234\'\017\022\312\001\n\010GetModel\022\035.clari" +
+      "fai.api.GetModelRequest\032!.clarifai.api.S" +
+      "ingleModelResponse\"|\202\323\344\223\002f\022K/v2/users/{u" +
       "ser_app_id.user_id}/apps/{user_app_id.ap" +
-      "p_id}Z\t\022\007/v2/app\230\234\'\002\220\234\'-\220\234\'\023\022\217\001\n\010ListApp" +
-      "s\022\035.clarifai.api.ListAppsRequest\032\036.clari" +
-      "fai.api.MultiAppResponse\"D\202\323\344\223\0022\022$/v2/us" +
-      "ers/{user_app_id.user_id}/appsZ\n\022\010/v2/ap" +
-      "ps\230\234\'\005\220\234\'-\220\234\'\023\022\245\001\n\tDeleteApp\022\036.clarifai." +
-      "api.DeleteAppRequest\032!.clarifai.api.stat" +
-      "us.BaseResponse\"U\202\323\344\223\002;*9/v2/users/{user" +
+      "p_id}/models/{model_id}Z\027\022\025/v2/models/{m" +
+      "odel_id}\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\022\232\003\n\022GetModelOut" +
+      "putInfo\022\035.clarifai.api.GetModelRequest\032!" +
+      ".clarifai.api.SingleModelResponse\"\301\002\202\323\344\223" +
+      "\002\252\002\022W/v2/users/{user_app_id.user_id}/app" +
+      "s/{user_app_id.app_id}/models/{model_id}" +
+      "/output_infoZ#\022!/v2/models/{model_id}/ou" +
+      "tput_infoZo\022m/v2/users/{user_app_id.user" +
+      "_id}/apps/{user_app_id.app_id}/models/{m" +
+      "odel_id}/versions/{version_id}/output_in" +
+      "foZ9\0227/v2/models/{model_id}/versions/{ve" +
+      "rsion_id}/output_info\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\022\342\001" +
+      "\n\nListModels\022\037.clarifai.api.ListModelsRe" +
+      "quest\032 .clarifai.api.MultiModelResponse\"" +
+      "\220\001\202\323\344\223\002z\022@/v2/users/{user_app_id.user_id" +
+      "}/apps/{user_app_id.app_id}/modelsZ(\022&/v" +
+      "2/users/{user_app_id.user_id}/modelsZ\014\022\n" +
+      "/v2/models\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\022\347\001\n\021GetResour" +
+      "ceCounts\022&.clarifai.api.GetResourceCount" +
+      "sRequest\032\'.clarifai.api.GetResourceCount" +
+      "sResponse\"\200\001\202\323\344\223\002b\022I/v2/users/{user_app_" +
+      "id.user_id}/apps/{user_app_id.app_id}/re" +
+      "source_countsZ\025\022\023/v2/resource_counts\230\234\'\002" +
+      "\220\234\'i\220\234\'\017\220\234\'\023\220\234\'m\220\234\'-\022\337\001\n\022PostModelsSearc" +
+      "hes\022\'.clarifai.api.PostModelsSearchesReq" +
+      "uest\032 .clarifai.api.MultiModelResponse\"~" +
+      "\202\323\344\223\002h\"I/v2/users/{user_app_id.user_id}/" +
+      "apps/{user_app_id.app_id}/models/searche" +
+      "s:\001*Z\030\"\023/v2/models/searches:\001*\230\234\'\002\220\234\'-\220\234" +
+      "\'\013\220\234\'\017\022\312\001\n\nPostModels\022\037.clarifai.api.Pos" +
+      "tModelsRequest\032!.clarifai.api.SingleMode" +
+      "lResponse\"x\202\323\344\223\002V\"@/v2/users/{user_app_i" +
+      "d.user_id}/apps/{user_app_id.app_id}/mod" +
+      "els:\001*Z\017\"\n/v2/models:\001*\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\016\220" +
+      "\234\'\017\220\234\'\032\220\234\'\023\022\307\001\n\013PatchModels\022 .clarifai.a" +
+      "pi.PatchModelsRequest\032 .clarifai.api.Mul" +
+      "tiModelResponse\"t\202\323\344\223\002V2@/v2/users/{user" +
       "_app_id.user_id}/apps/{user_app_id.app_i" +
-      "d}\230\234\'\005\220\234\',\220\234\'.\220\234\'-\220\234\'\023\022\222\001\n\010PostApps\022\035.cl" +
-      "arifai.api.PostAppsRequest\032\036.clarifai.ap" +
-      "i.MultiAppResponse\"G\202\323\344\223\002)\"$/v2/users/{u" +
-      "ser_app_id.user_id}/apps:\001*\230\234\'\005\220\234\',\220\234\'-\220" +
-      "\234\'\017\220\234\'\023\220\234\'\022\022\210\001\n\tPatchApps\022\036.clarifai.api" +
-      ".PatchAppsRequest\032\036.clarifai.api.MultiAp" +
-      "pResponse\";\202\323\344\223\002)2$/v2/users/{user_app_i" +
-      "d.user_id}/apps:\001*\230\234\'\005\220\234\',\220\234\'-\022\222\001\n\014Patch" +
-      "AppsIds\022!.clarifai.api.PatchAppsIdsReque" +
-      "st\032\036.clarifai.api.MultiAppResponse\"?\202\323\344\223" +
-      "\002-2(/v2/users/{user_app_id.user_id}/apps" +
-      "/ids:\001*\230\234\'\005\220\234\',\220\234\'-\022\234\001\n\010PatchApp\022\035.clari" +
-      "fai.api.PatchAppRequest\032\037.clarifai.api.S" +
-      "ingleAppResponse\"P\202\323\344\223\002>29/v2/users/{use" +
+      "d}/models:\001*Z\0172\n/v2/models:\001*\230\234\'\002\220\234\'-\220\234\'" +
+      "\013\220\234\'\016\220\234\'\017\220\234\'\032\022\266\001\n\rPatchModelIds\022\".clarif" +
+      "ai.api.PatchModelIdsRequest\032 .clarifai.a" +
+      "pi.MultiModelResponse\"_\202\323\344\223\002I2D/v2/users" +
+      "/{user_app_id.user_id}/apps/{user_app_id" +
+      ".app_id}/models/ids:\001*\230\234\'\002\220\234\'-\220\234\'\016\220\234\'\017\022\335" +
+      "\001\n\013DeleteModel\022 .clarifai.api.DeleteMode" +
+      "lRequest\032!.clarifai.api.status.BaseRespo" +
+      "nse\"\210\001\202\323\344\223\002f*K/v2/users/{user_app_id.use" +
+      "r_id}/apps/{user_app_id.app_id}/models/{" +
+      "model_id}Z\027*\025/v2/models/{model_id}\230\234\'\002\220\234" +
+      "\'-\220\234\'\013\220\234\'\016\220\234\'\021\220\234\'\017\220\234\'\023\022\316\001\n\014DeleteModels\022" +
+      "!.clarifai.api.DeleteModelsRequest\032!.cla" +
+      "rifai.api.status.BaseResponse\"x\202\323\344\223\002V*@/" +
+      "v2/users/{user_app_id.user_id}/apps/{use" +
+      "r_app_id.app_id}/models:\001*Z\017*\n/v2/models" +
+      ":\001*\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\016\220\234\'\021\220\234\'\017\220\234\'\023\022\225\002\n\027Patc" +
+      "hModelCheckConsents\022,.clarifai.api.Patch" +
+      "ModelCheckConsentsRequest\032,.clarifai.api" +
+      ".MultiModelCheckConsentResponse\"\235\001\202\323\344\223\002\212" +
+      "\0012Z/v2/users/{user_app_id.user_id}/apps/" +
+      "{user_app_id.app_id}/models/{model_id}/c" +
+      "heck_consents:\001*Z)2$/v2/models/{model_id" +
+      "}/check_consents:\001*\230\234\'\002\220\234\'-\220\234\'\017\022\371\001\n\022Patc" +
+      "hModelToolkits\022\'.clarifai.api.PatchModel" +
+      "ToolkitsRequest\032\'.clarifai.api.MultiMode" +
+      "lToolkitResponse\"\220\001\202\323\344\223\002~2T/v2/users/{us" +
+      "er_app_id.user_id}/apps/{user_app_id.app" +
+      "_id}/models/{model_id}/toolkits:\001*Z#2\036/v" +
+      "2/models/{model_id}/toolkits:\001*\230\234\'\002\220\234\'-\220" +
+      "\234\'\017\022\371\001\n\022PatchModelUseCases\022\'.clarifai.ap" +
+      "i.PatchModelUseCasesRequest\032\'.clarifai.a" +
+      "pi.MultiModelUseCaseResponse\"\220\001\202\323\344\223\002~2T/" +
+      "v2/users/{user_app_id.user_id}/apps/{use" +
+      "r_app_id.app_id}/models/{model_id}/useca" +
+      "ses:\001*Z#2\036/v2/models/{model_id}/usecases" +
+      ":\001*\230\234\'\002\220\234\'-\220\234\'\017\022\377\001\n\023PatchModelLanguages\022" +
+      "(.clarifai.api.PatchModelLanguagesReques" +
+      "t\032(.clarifai.api.MultiModelLanguageRespo" +
+      "nse\"\223\001\202\323\344\223\002\200\0012U/v2/users/{user_app_id.us" +
+      "er_id}/apps/{user_app_id.app_id}/models/" +
+      "{model_id}/languages:\001*Z$2\037/v2/models/{m" +
+      "odel_id}/languages:\001*\230\234\'\002\220\234\'-\220\234\'\017\022\224\003\n\017Li" +
+      "stModelInputs\022$.clarifai.api.ListModelIn" +
+      "putsRequest\032 .clarifai.api.MultiInputRes" +
+      "ponse\"\270\002\210\002\001\202\323\344\223\002\226\002\022R/v2/users/{user_app_" +
+      "id.user_id}/apps/{user_app_id.app_id}/mo" +
+      "dels/{model_id}/inputsZ\036\022\034/v2/models/{mo" +
+      "del_id}/inputsZj\022h/v2/users/{user_app_id" +
+      ".user_id}/apps/{user_app_id.app_id}/mode" +
+      "ls/{model_id}/versions/{version_id}/inpu" +
+      "tsZ4\0222/v2/models/{model_id}/versions/{ve" +
+      "rsion_id}/inputs\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\017" +
+      "\022\215\002\n\017GetModelVersion\022$.clarifai.api.GetM" +
+      "odelVersionRequest\032(.clarifai.api.Single" +
+      "ModelVersionResponse\"\251\001\202\323\344\223\002\222\001\022a/v2/user" +
+      "s/{user_app_id.user_id}/apps/{user_app_i" +
+      "d.app_id}/models/{model_id}/versions/{ve" +
+      "rsion_id}Z-\022+/v2/models/{model_id}/versi" +
+      "ons/{version_id}\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\022\365\001\n\021Lis" +
+      "tModelVersions\022&.clarifai.api.ListModelV" +
+      "ersionsRequest\032\'.clarifai.api.MultiModel" +
+      "VersionResponse\"\216\001\202\323\344\223\002x\022T/v2/users/{use" +
       "r_app_id.user_id}/apps/{user_app_id.app_" +
-      "id}:\001*\230\234\'\005\220\234\',\220\234\'-\022\237\001\n\020PostAppsSearches\022" +
-      "%.clarifai.api.PostAppsSearchesRequest\032\036" +
-      ".clarifai.api.MultiAppResponse\"D\202\323\344\223\0022\"-" +
-      "/v2/users/{user_app_id.user_id}/apps/sea" +
-      "rches:\001*\230\234\'\005\220\234\'-\220\234\'\023\022v\n\007GetUser\022\034.clarif" +
-      "ai.api.GetUserRequest\032 .clarifai.api.Sin" +
-      "gleUserResponse\"+\202\323\344\223\002!\022\037/v2/users/{user" +
-      "_app_id.user_id}\230\234\'\005\022\317\001\n\024PostValidatePas" +
-      "sword\022).clarifai.api.PostValidatePasswor" +
-      "dRequest\032..clarifai.api.SinglePasswordVa" +
-      "lidationResponse\"\\\202\323\344\223\002R\"1/v2/users/{use" +
-      "r_app_id.user_id}/validate_password:\001*Z\032" +
-      "\"\025/v2/validate_password:\001*\230\234\'\003\022\301\001\n\tGetSe" +
-      "arch\022\036.clarifai.api.GetSearchRequest\032\".c" +
-      "larifai.api.SingleSearchResponse\"p\202\323\344\223\002^" +
-      "\022G/v2/users/{user_app_id.user_id}/apps/{" +
-      "user_app_id.app_id}/searches/{id}Z\023\022\021/v2" +
-      "/searches/{id}\230\234\'\002\220\234\'-\220\234\'r\022\274\001\n\014ListSearc" +
-      "hes\022!.clarifai.api.ListSearchesRequest\032!" +
-      ".clarifai.api.MultiSearchResponse\"f\202\323\344\223\002" +
-      "T\022B/v2/users/{user_app_id.user_id}/apps/" +
-      "{user_app_id.app_id}/searchesZ\016\022\014/v2/sea" +
-      "rches\230\234\'\002\220\234\'-\220\234\'r\022\310\001\n\rPatchSearches\022\".cl" +
-      "arifai.api.PatchSearchesRequest\032!.clarif" +
-      "ai.api.MultiSearchResponse\"p\202\323\344\223\002Z2B/v2/" +
+      "id}/models/{model_id}/versionsZ \022\036/v2/mo" +
+      "dels/{model_id}/versions\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017" +
+      "\022\274\002\n\035PostWorkflowVersionsUnPublish\0222.cla" +
+      "rifai.api.PostWorkflowVersionsUnPublishR" +
+      "equest\032!.clarifai.api.status.BaseRespons" +
+      "e\"\303\001\202\323\344\223\002\214\001\"[/v2/users/{user_app_id.user" +
+      "_id}/apps/{user_app_id.app_id}/workflows" +
+      "/{workflow_id}/unpublish:\001*Z*\"%/v2/workf" +
+      "lows/{workflow_id}/unpublish:\001*\230\234\'\002\220\234\'-\220" +
+      "\234\'x\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\023\220\234\'5\220\234\'6\022" +
+      "\264\002\n\033PostWorkflowVersionsPublish\0220.clarif" +
+      "ai.api.PostWorkflowVersionsPublishReques" +
+      "t\032!.clarifai.api.status.BaseResponse\"\277\001\202" +
+      "\323\344\223\002\210\001\"Y/v2/users/{user_app_id.user_id}/" +
+      "apps/{user_app_id.app_id}/workflows/{wor" +
+      "kflow_id}/publish:\001*Z(\"#/v2/workflows/{w" +
+      "orkflow_id}/publish:\001*\230\234\'\002\220\234\'-\220\234\'w\220\234\'&\220\234" +
+      "\'\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\023\220\234\'5\220\234\'6\022\241\002\n\030PostM" +
+      "odelVersionsPublish\022-.clarifai.api.PostM" +
+      "odelVersionsPublishRequest\032!.clarifai.ap" +
+      "i.status.BaseResponse\"\262\001\202\323\344\223\002|\"S/v2/user" +
+      "s/{user_app_id.user_id}/apps/{user_app_i" +
+      "d.app_id}/models/{model_id}/publish:\001*Z\"" +
+      "\"\035/v2/models/{model_id}/publish:\001*\230\234\'\002\220\234" +
+      "\'-\220\234\'u\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\023\220\234\'5\220\234" +
+      "\'6\022\252\002\n\032PostModelVersionsUnPublish\022/.clar" +
+      "ifai.api.PostModelVersionsUnPublishReque" +
+      "st\032!.clarifai.api.status.BaseResponse\"\267\001" +
+      "\202\323\344\223\002\200\001\"U/v2/users/{user_app_id.user_id}" +
+      "/apps/{user_app_id.app_id}/models/{model" +
+      "_id}/unpublish:\001*Z$\"\037/v2/models/{model_i" +
+      "d}/unpublish:\001*\230\234\'\002\220\234\'-\220\234\'v\220\234\'&\220\234\'\013\220\234\'\005\220" +
+      "\234\'\016\220\234\'\017\220\234\'\032\220\234\'\023\220\234\'5\220\234\'6\022\221\002\n\021PostModelVer" +
+      "sions\022&.clarifai.api.PostModelVersionsRe" +
+      "quest\032!.clarifai.api.SingleModelResponse" +
+      "\"\260\001\202\323\344\223\002~\"T/v2/users/{user_app_id.user_i" +
+      "d}/apps/{user_app_id.app_id}/models/{mod" +
+      "el_id}/versions:\001*Z#\"\036/v2/models/{model_" +
+      "id}/versions:\001*\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\016\220" +
+      "\234\'\017\220\234\'\032\220\234\'\023\220\234\'5\220\234\'6\022\337\001\n\022PatchModelVersio" +
+      "ns\022\'.clarifai.api.PatchModelVersionsRequ" +
+      "est\032\'.clarifai.api.MultiModelVersionResp" +
+      "onse\"w\202\323\344\223\002Y2T/v2/users/{user_app_id.use" +
+      "r_id}/apps/{user_app_id.app_id}/models/{" +
+      "model_id}/versions:\001*\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\017\220\234\'" +
+      "\016\220\234\'\032\022\230\002\n\022DeleteModelVersion\022\'.clarifai." +
+      "api.DeleteModelVersionRequest\032!.clarifai" +
+      ".api.status.BaseResponse\"\265\001\202\323\344\223\002\222\001*a/v2/" +
       "users/{user_app_id.user_id}/apps/{user_a" +
-      "pp_id.app_id}/searches:\001*Z\0212\014/v2/searche",
-      "s:\001*\230\234\'\002\220\234\'-\220\234\'s\220\234\'r\022\332\001\n\014PostSearches\022!." +
-      "clarifai.api.PostSearchesRequest\032!.clari" +
-      "fai.api.MultiSearchResponse\"\203\001\210\002\001\202\323\344\223\002Z\"" +
-      "B/v2/users/{user_app_id.user_id}/apps/{u" +
-      "ser_app_id.app_id}/searches:\001*Z\021\"\014/v2/se" +
-      "arches:\001*\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\017\220\234\'\003\220\234\'" +
-      "\023\022\330\001\n\020PostSearchesByID\022%.clarifai.api.Po" +
-      "stSearchesByIDRequest\032!.clarifai.api.Mul" +
-      "tiSearchResponse\"z\202\323\344\223\002d\"G/v2/users/{use" +
-      "r_app_id.user_id}/apps/{user_app_id.app_" +
-      "id}/searches/{id}:\001*Z\026\"\021/v2/searches/{id" +
-      "}:\001*\230\234\'\002\220\234\'-\220\234\'r\220\234\'\003\022\263\002\n\033PostAnnotationS" +
-      "earchMetrics\0220.clarifai.api.PostAnnotati" +
-      "onSearchMetricsRequest\0322.clarifai.api.Mu" +
-      "ltiAnnotationSearchMetricsResponse\"\255\001\202\323\344" +
-      "\223\002\202\001\"V/v2/users/{user_app_id.user_id}/ap" +
-      "ps/{user_app_id.app_id}/annotations/sear" +
-      "ches/metrics:\001*Z%\" /v2/annotations/searc" +
-      "hes/metrics:\001*\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'5\220\234" +
-      "\'6\220\234\'\017\220\234\'\023\022\251\002\n\032GetAnnotationSearchMetric" +
-      "s\022/.clarifai.api.GetAnnotationSearchMetr" +
-      "icsRequest\0322.clarifai.api.MultiAnnotatio" +
-      "nSearchMetricsResponse\"\245\001\202\323\344\223\002\206\001\022[/v2/us" +
-      "ers/{user_app_id.user_id}/apps/{user_app" +
-      "_id.app_id}/annotations/searches/metrics" +
-      "/{id}Z\'\022%/v2/annotations/searches/metric" +
-      "s/{id}\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'5\022\240\002\n\033ListA" +
-      "nnotationSearchMetrics\0220.clarifai.api.Li" +
-      "stAnnotationSearchMetricsRequest\0322.clari" +
-      "fai.api.MultiAnnotationSearchMetricsResp" +
-      "onse\"\232\001\202\323\344\223\002|\022V/v2/users/{user_app_id.us" +
-      "er_id}/apps/{user_app_id.app_id}/annotat" +
-      "ions/searches/metricsZ\"\022 /v2/annotations" +
-      "/searches/metrics\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'" +
-      "5\022\232\002\n\035DeleteAnnotationSearchMetrics\0222.cl" +
-      "arifai.api.DeleteAnnotationSearchMetrics" +
-      "Request\032!.clarifai.api.status.BaseRespon" +
-      "se\"\241\001\202\323\344\223\002\206\001*[/v2/users/{user_app_id.use" +
-      "r_id}/apps/{user_app_id.app_id}/annotati" +
-      "ons/searches/metrics/{id}Z\'*%/v2/annotat" +
-      "ions/searches/metrics/{id}\230\234\'\002\220\234\'-\220\234\'5\220\234" +
-      "\'6\220\234\'?\022\316\001\n\014DeleteSearch\022!.clarifai.api.D" +
-      "eleteSearchRequest\032!.clarifai.api.status" +
-      ".BaseResponse\"x\202\323\344\223\002^*G/v2/users/{user_a" +
+      "pp_id.app_id}/models/{model_id}/versions" +
+      "/{version_id}Z-*+/v2/models/{model_id}/v" +
+      "ersions/{version_id}\230\234\'\002\220\234\'-\220\234\'\013\220\234\'\016\220\234\'\021" +
+      "\220\234\'\017\220\234\'\023\022\271\001\n\027PostModelVersionsUpload\022,.c" +
+      "larifai.api.PostModelVersionsUploadReque" +
+      "st\032-.clarifai.api.PostModelVersionsUploa" +
+      "dResponse\"=\202\323\344\223\002\037\"\032/v2/models/versions/u" +
+      "pload:\001*\230\234\'\002\220\234\'-\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\023(\0010\001\022\267\002\n" +
+      "\026PutModelVersionExports\022+.clarifai.api.P" +
+      "utModelVersionExportsRequest\032..clarifai." +
+      "api.SingleModelVersionExportResponse\"\277\001\202" +
+      "\323\344\223\002\242\001\032i/v2/users/{user_app_id.user_id}/" +
+      "apps/{user_app_id.app_id}/models/{model_" +
+      "id}/versions/{version_id}/exportsZ5\0323/v2" +
+      "/models/{model_id}/versions/{version_id}" +
+      "/exports\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\216\001\220\234\'\217\001\022\260\002\n\025GetMo" +
+      "delVersionExport\022*.clarifai.api.GetModel" +
+      "VersionExportRequest\032..clarifai.api.Sing" +
+      "leModelVersionExportResponse\"\272\001\202\323\344\223\002\242\001\022i" +
+      "/v2/users/{user_app_id.user_id}/apps/{us" +
+      "er_app_id.app_id}/models/{model_id}/vers" +
+      "ions/{version_id}/exportsZ5\0223/v2/models/" +
+      "{model_id}/versions/{version_id}/exports" +
+      "\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\216\001\022\267\002\n\026GetModelVersionMet" +
+      "rics\022+.clarifai.api.GetModelVersionMetri" +
+      "csRequest\032(.clarifai.api.SingleModelVers" +
+      "ionResponse\"\305\001\202\323\344\223\002\242\001\022i/v2/users/{user_a" +
       "pp_id.user_id}/apps/{user_app_id.app_id}" +
-      "/searches/{id}Z\023*\021/v2/searches/{id}\230\234\'\002\220" +
-      "\234\'-\220\234\'r\220\234\'s\220\234\'t\022\354\001\n\025ListAnnotationFilter" +
-      "s\022*.clarifai.api.ListAnnotationFiltersRe" +
-      "quest\032+.clarifai.api.MultiAnnotationFilt" +
-      "erResponse\"z\202\323\344\223\002h\022L/v2/users/{user_app_" +
-      "id.user_id}/apps/{user_app_id.app_id}/an" +
-      "notation_filtersZ\030\022\026/v2/annotation_filte" +
-      "rs\230\234\'\002\220\234\'-\220\234\'r\022\231\002\n\023GetAnnotationFilter\022(" +
-      ".clarifai.api.GetAnnotationFilterRequest" +
-      "\032,.clarifai.api.SingleAnnotationFilterRe" +
-      "sponse\"\251\001\202\323\344\223\002\226\001\022c/v2/users/{user_app_id" +
-      ".user_id}/apps/{user_app_id.app_id}/anno" +
-      "tation_filters/{annotation_filter_id}Z/\022" +
-      "-/v2/annotation_filters/{annotation_filt" +
-      "er_id}\230\234\'\002\220\234\'-\220\234\'r\022\367\001\n\025PostAnnotationFil" +
-      "ters\022*.clarifai.api.PostAnnotationFilter" +
-      "sRequest\032+.clarifai.api.MultiAnnotationF" +
-      "ilterResponse\"\204\001\202\323\344\223\002n\"L/v2/users/{user_" +
+      "/models/{model_id}/versions/{version_id}" +
+      "/metricsZ5\0223/v2/models/{model_id}/versio" +
+      "ns/{version_id}/metrics\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220" +
+      "\234\'\017\220\234\'\005\220\234\'5\022\323\002\n\027PostModelVersionMetrics\022" +
+      ",.clarifai.api.PostModelVersionMetricsRe" +
+      "quest\032(.clarifai.api.SingleModelVersionR" +
+      "esponse\"\337\001\202\323\344\223\002\250\001\"i/v2/users/{user_app_i" +
+      "d.user_id}/apps/{user_app_id.app_id}/mod" +
+      "els/{model_id}/versions/{version_id}/met" +
+      "rics:\001*Z8\"3/v2/models/{model_id}/version" +
+      "s/{version_id}/metrics:\001*\230\234\'\002\220\234\'-\220\234\'&\220\234\'" +
+      "\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\002\220\234\'\023\220\234\'5\220\234\'6\022\355\002\n\033Po" +
+      "stModelVersionEvaluations\0220.clarifai.api" +
+      ".PostModelVersionEvaluationsRequest\032&.cl" +
+      "arifai.api.MultiEvalMetricsResponse\"\363\001\202\323" +
+      "\344\223\002\274\001\"s/v2/users/{user_app_id.user_id}/a" +
+      "pps/{user_app_id.app_id}/models/{model_i" +
+      "d}/versions/{model_version_id}/evaluatio" +
+      "ns:\001*ZB\"=/v2/models/{model_id}/versions/" +
+      "{model_version_id}/evaluations:\001*\230\234\'\002\220\234\'" +
+      "-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\002\220\234\'\023\220\234\'5\220\234\'" +
+      "6\022\323\002\n\033ListModelVersionEvaluations\0220.clar" +
+      "ifai.api.ListModelVersionEvaluationsRequ" +
+      "est\032&.clarifai.api.MultiEvalMetricsRespo" +
+      "nse\"\331\001\202\323\344\223\002\266\001\022s/v2/users/{user_app_id.us" +
+      "er_id}/apps/{user_app_id.app_id}/models/" +
+      "{model_id}/versions/{model_version_id}/e" +
+      "valuationsZ?\022=/v2/models/{model_id}/vers" +
+      "ions/{model_version_id}/evaluations\230\234\'\002\220" +
+      "\234\'-\220\234\'&\220\234\'\013\220\234\'\017\220\234\'\005\220\234\'5\022\361\002\n\031GetModelVers" +
+      "ionEvaluation\022..clarifai.api.GetModelVer" +
+      "sionEvaluationRequest\032\'.clarifai.api.Sin" +
+      "gleEvalMetricsResponse\"\372\001\202\323\344\223\002\327\001\022\203\001/v2/u" +
+      "sers/{user_app_id.user_id}/apps/{user_ap" +
+      "p_id.app_id}/models/{model_id}/versions/" +
+      "{model_version_id}/evaluations/{evaluati" +
+      "on_id}ZO\022M/v2/models/{model_id}/versions" +
+      "/{model_version_id}/evaluations/{evaluat" +
+      "ion_id}\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\017\220\234\'\005\220\234\'5\022\370\001\n\017" +
+      "PostEvaluations\022$.clarifai.api.PostEvalu" +
+      "ationsRequest\032&.clarifai.api.MultiEvalMe" +
+      "tricsResponse\"\226\001\202\323\344\223\002`\"E/v2/users/{user_" +
       "app_id.user_id}/apps/{user_app_id.app_id" +
-      "}/annotation_filters:\001*Z\033\"\026/v2/annotatio" +
-      "n_filters:\001*\230\234\'\002\220\234\'-\220\234\'r\220\234\'s\022\371\001\n\026PatchAn" +
-      "notationFilters\022+.clarifai.api.PatchAnno" +
-      "tationFiltersRequest\032+.clarifai.api.Mult" +
-      "iAnnotationFilterResponse\"\204\001\202\323\344\223\002n2L/v2/" +
+      "}/evaluations:\001*Z\024\"\017/v2/evaluations:\001*\230\234" +
+      "\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\016\220\234\'\017\220\234\'\032\220\234\'\002\220\234\'\023\220\234" +
+      "\'5\220\234\'6\022\216\002\n\017ListEvaluations\022$.clarifai.ap" +
+      "i.ListEvaluationsRequest\032&.clarifai.api." +
+      "MultiEvalMetricsResponse\"\254\001\202\323\344\223\002\211\001\022E/v2/" +
       "users/{user_app_id.user_id}/apps/{user_a" +
-      "pp_id.app_id}/annotation_filters:\001*Z\0332\026/" +
-      "v2/annotation_filters:\001*\230\234\'\002\220\234\'-\220\234\'r\220\234\'s" +
-      "\022\361\001\n\027DeleteAnnotationFilters\022,.clarifai." +
-      "api.DeleteAnnotationFiltersRequest\032!.cla" +
-      "rifai.api.status.BaseResponse\"\204\001\202\323\344\223\002n*L" +
-      "/v2/users/{user_app_id.user_id}/apps/{us" +
-      "er_app_id.app_id}/annotation_filters:\001*Z" +
-      "\033*\026/v2/annotation_filters:\001*\230\234\'\002\220\234\'-\220\234\'r" +
-      "\220\234\'s\022|\n\017ListStatusCodes\022$.clarifai.api.L" +
-      "istStatusCodesRequest\032%.clarifai.api.Mul" +
-      "tiStatusCodeResponse\"\034\202\323\344\223\002\022\022\020/v2/status" +
-      "_codes\230\234\'\001\022\212\001\n\rGetStatusCode\022\".clarifai." +
-      "api.GetStatusCodeRequest\032&.clarifai.api." +
-      "SingleStatusCodeResponse\"-\202\323\344\223\002#\022!/v2/st" +
-      "atus_codes/{status_code_id}\230\234\'\001\022\302\001\n\021List" +
-      "Collaborators\022&.clarifai.api.ListCollabo" +
-      "ratorsRequest\032(.clarifai.api.MultiCollab" +
-      "oratorsResponse\"[\202\323\344\223\002I\022G/v2/users/{user" +
+      "pp_id.app_id}/evaluationsZ-\022+/v2/users/{" +
+      "user_app_id.user_id}/evaluationsZ\021\022\017/v2/" +
+      "evaluations\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\017\220\234\'\005\220\234\'5\022" +
+      "\373\001\n\rGetEvaluation\022\".clarifai.api.GetEval" +
+      "uationRequest\032\'.clarifai.api.SingleEvalM" +
+      "etricsResponse\"\234\001\202\323\344\223\002z\022U/v2/users/{user" +
       "_app_id.user_id}/apps/{user_app_id.app_i" +
-      "d}/collaborators\230\234\'\002\220\234\'-\220\234\'2\022\311\001\n\021PostCol" +
-      "laborators\022&.clarifai.api.PostCollaborat" +
-      "orsRequest\032(.clarifai.api.MultiCollabora" +
-      "torsResponse\"b\202\323\344\223\002L\"G/v2/users/{user_ap" +
+      "d}/evaluations/{evaluation_id}Z!\022\037/v2/ev" +
+      "aluations/{evaluation_id}\230\234\'\002\220\234\'-\220\234\'&\220\234\'" +
+      "\013\220\234\'\017\220\234\'\005\220\234\'5\022\373\001\n\023ListModelReferences\022(." +
+      "clarifai.api.ListModelReferencesRequest\032" +
+      ").clarifai.api.MultiModelReferenceRespon" +
+      "se\"\216\001\202\323\344\223\002|\022V/v2/users/{user_app_id.user" +
+      "_id}/apps/{user_app_id.app_id}/models/{m" +
+      "odel_id}/referencesZ\"\022 /v2/models/{model" +
+      "_id}/references\230\234\'\002\220\234\'-\220\234\'\017\022\362\002\n\033GetModel" +
+      "VersionInputExample\0220.clarifai.api.GetMo" +
+      "delVersionInputExampleRequest\0324.clarifai" +
+      ".api.SingleModelVersionInputExampleRespo" +
+      "nse\"\352\001\202\323\344\223\002\327\001\022\203\001/v2/users/{user_app_id.u" +
+      "ser_id}/apps/{user_app_id.app_id}/models" +
+      "/{model_id}/versions/{model_version_id}/" +
+      "input_examples/{example_id}ZO\022M/v2/model" +
+      "s/{model_id}/versions/{model_version_id}" +
+      "/input_examples/{example_id}\230\234\'\002\220\234\'-\220\234\'\017" +
+      "\022\332\002\n\035ListModelVersionInputExamples\0222.cla" +
+      "rifai.api.ListModelVersionInputExamplesR" +
+      "equest\0323.clarifai.api.MultiModelVersionI" +
+      "nputExampleResponse\"\317\001\202\323\344\223\002\274\001\022v/v2/users" +
+      "/{user_app_id.user_id}/apps/{user_app_id" +
+      ".app_id}/models/{model_id}/versions/{mod" +
+      "el_version_id}/input_examplesZB\022@/v2/mod" +
+      "els/{model_id}/versions/{model_version_i" +
+      "d}/input_examples\230\234\'\002\220\234\'-\220\234\'\017\022\340\001\n\013GetWor" +
+      "kflow\022 .clarifai.api.GetWorkflowRequest\032" +
+      "$.clarifai.api.SingleWorkflowResponse\"\210\001" +
+      "\202\323\344\223\002r\022Q/v2/users/{user_app_id.user_id}/" +
+      "apps/{user_app_id.app_id}/workflows/{wor" +
+      "kflow_id}Z\035\022\033/v2/workflows/{workflow_id}" +
+      "\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\023\022\365\001\n\rListWorkflows\022\".cla" +
+      "rifai.api.ListWorkflowsRequest\032#.clarifa" +
+      "i.api.MultiWorkflowResponse\"\232\001\202\323\344\223\002\203\001\022C/" +
+      "v2/users/{user_app_id.user_id}/apps/{use" +
+      "r_app_id.app_id}/workflowsZ+\022)/v2/users/" +
+      "{user_app_id.user_id}/workflowsZ\017\022\r/v2/w" +
+      "orkflows\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\023\022\320\001\n\rPostWorkflo" +
+      "ws\022\".clarifai.api.PostWorkflowsRequest\032#" +
+      ".clarifai.api.MultiWorkflowResponse\"v\202\323\344" +
+      "\223\002\\\"C/v2/users/{user_app_id.user_id}/app" +
+      "s/{user_app_id.app_id}/workflows:\001*Z\022\"\r/" +
+      "v2/workflows:\001*\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\022\220\234\'\023\022\322\001\n\016" +
+      "PatchWorkflows\022#.clarifai.api.PatchWorkf" +
+      "lowsRequest\032#.clarifai.api.MultiWorkflow" +
+      "Response\"v\202\323\344\223\002\\2C/v2/users/{user_app_id" +
+      ".user_id}/apps/{user_app_id.app_id}/work" +
+      "flows:\001*Z\0222\r/v2/workflows:\001*\230\234\'\002\220\234\'-\220\234\'\017" +
+      "\220\234\'\022\220\234\'\023\022\302\001\n\020PatchWorkflowIds\022%.clarifai" +
+      ".api.PatchWorkflowIdsRequest\032#.clarifai." +
+      "api.MultiWorkflowResponse\"b\202\323\344\223\002L2G/v2/u" +
+      "sers/{user_app_id.user_id}/apps/{user_ap" +
+      "p_id.app_id}/workflows/ids:\001*\230\234\'\002\220\234\'-\220\234\'" +
+      "\022\220\234\'\023\022\347\001\n\016DeleteWorkflow\022#.clarifai.api." +
+      "DeleteWorkflowRequest\032!.clarifai.api.sta" +
+      "tus.BaseResponse\"\214\001\202\323\344\223\002r*Q/v2/users/{us" +
+      "er_app_id.user_id}/apps/{user_app_id.app" +
+      "_id}/workflows/{workflow_id}Z\035*\033/v2/work" +
+      "flows/{workflow_id}\230\234\'\002\220\234\'-\220\234\'\022\220\234\'\025\220\234\'\023\022" +
+      "\322\001\n\017DeleteWorkflows\022$.clarifai.api.Delet" +
+      "eWorkflowsRequest\032!.clarifai.api.status." +
+      "BaseResponse\"v\202\323\344\223\002\\*C/v2/users/{user_ap" +
       "p_id.user_id}/apps/{user_app_id.app_id}/" +
-      "collaborators:\001*\230\234\'\002\220\234\'-\220\234\'3\220\234\'2\022\317\001\n\022Pat" +
-      "chCollaborators\022\'.clarifai.api.PatchColl" +
-      "aboratorsRequest\032(.clarifai.api.MultiCol" +
-      "laboratorsResponse\"f\202\323\344\223\002L2G/v2/users/{u" +
-      "ser_app_id.user_id}/apps/{user_app_id.ap" +
-      "p_id}/collaborators:\001*\230\234\'\002\220\234\'-\220\234\'3\220\234\'2\220\234" +
-      "\'4\022\322\001\n\023DeleteCollaborators\022(.clarifai.ap" +
-      "i.DeleteCollaboratorsRequest\032!.clarifai." +
-      "api.status.BaseResponse\"n\202\323\344\223\002L*G/v2/use" +
+      "workflows:\001*Z\022*\r/v2/workflows:\001*\230\234\'\002\220\234\'-" +
+      "\220\234\'\022\220\234\'\025\220\234\'\023\022\212\003\n\023PostWorkflowResults\022(.c" +
+      "larifai.api.PostWorkflowResultsRequest\032)" +
+      ".clarifai.api.PostWorkflowResultsRespons" +
+      "e\"\235\002\202\323\344\223\002\376\001\"o/v2/users/{user_app_id.user" +
+      "_id}/apps/{user_app_id.app_id}/workflows" +
+      "/{workflow_id}/versions/{version_id}/res" +
+      "ults:\001*Z^\"Y/v2/users/{user_app_id.user_i" +
+      "d}/apps/{user_app_id.app_id}/workflows/{" +
+      "workflow_id}/results:\001*Z(\"#/v2/workflows" +
+      "/{workflow_id}/results:\001*\230\234\'\002\220\234\'-\220\234\'\017\220\234\'" +
+      "\013\220\234\'\002\220\234\'\023\022\311\003\n\035PostWorkflowResultsSimilar" +
+      "ity\0222.clarifai.api.PostWorkflowResultsSi" +
+      "milarityRequest\0323.clarifai.api.PostWorkf" +
+      "lowResultsSimilarityResponse\"\276\002\202\323\344\223\002\237\002\"z" +
+      "/v2/users/{user_app_id.user_id}/apps/{us" +
+      "er_app_id.app_id}/workflows/{workflow_id" +
+      "}/versions/{version_id}/results/similari" +
+      "ty:\001*Zi\"d/v2/users/{user_app_id.user_id}" +
+      "/apps/{user_app_id.app_id}/workflows/{wo" +
+      "rkflow_id}/results/similarity:\001*Z3\"./v2/" +
+      "workflows/{workflow_id}/results/similari" +
+      "ty:\001*\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\013\220\234\'\002\220\234\'\023\022\213\002\n\024ListWo" +
+      "rkflowVersions\022).clarifai.api.ListWorkfl" +
+      "owVersionsRequest\032*.clarifai.api.MultiWo" +
+      "rkflowVersionResponse\"\233\001\202\323\344\223\002\204\001\022Z/v2/use" +
+      "rs/{user_app_id.user_id}/apps/{user_app_" +
+      "id.app_id}/workflows/{workflow_id}/versi" +
+      "onsZ&\022$/v2/workflows/{workflow_id}/versi" +
+      "ons\230\234\'\002\220\234\'-\220\234\'\017\220\234\'\023\022\264\002\n\022GetWorkflowVersi" +
+      "on\022\'.clarifai.api.GetWorkflowVersionRequ" +
+      "est\032+.clarifai.api.SingleWorkflowVersion" +
+      "Response\"\307\001\202\323\344\223\002\260\001\022p/v2/users/{user_app_" +
+      "id.user_id}/apps/{user_app_id.app_id}/wo" +
+      "rkflows/{workflow_id}/versions/{workflow" +
+      "_version_id}Z<\022:/v2/workflows/{workflow_" +
+      "id}/versions/{workflow_version_id}\230\234\'\002\220\234" +
+      "\'-\220\234\'\017\220\234\'\023\022\220\002\n\026DeleteWorkflowVersions\022+." +
+      "clarifai.api.DeleteWorkflowVersionsReque" +
+      "st\032!.clarifai.api.status.BaseResponse\"\245\001" +
+      "\202\323\344\223\002\212\001*Z/v2/users/{user_app_id.user_id}" +
+      "/apps/{user_app_id.app_id}/workflows/{wo" +
+      "rkflow_id}/versions:\001*Z)*$/v2/workflows/" +
+      "{workflow_id}/versions:\001*\230\234\'\002\220\234\'-\220\234\'\023\220\234\'" +
+      "\022\220\234\'\025\022\227\002\n\025PatchWorkflowVersions\022*.clarif" +
+      "ai.api.PatchWorkflowVersionsRequest\032*.cl" +
+      "arifai.api.MultiWorkflowVersionResponse\"" +
+      "\245\001\202\323\344\223\002\212\0012Z/v2/users/{user_app_id.user_i" +
+      "d}/apps/{user_app_id.app_id}/workflows/{" +
+      "workflow_id}/versions:\001*Z)2$/v2/workflow" +
+      "s/{workflow_id}/versions:\001*\230\234\'\002\220\234\'-\220\234\'\017\220" +
+      "\234\'\023\220\234\'\022\022\205\001\n\006GetKey\022\033.clarifai.api.GetKey" +
+      "Request\032\037.clarifai.api.SingleKeyResponse" +
+      "\"=\202\323\344\223\002/\022-/v2/users/{user_app_id.user_id" +
+      "}/keys/{key_id}\230\234\'\005\220\234\'0\022\177\n\010ListKeys\022\035.cl" +
+      "arifai.api.ListKeysRequest\032\036.clarifai.ap" +
+      "i.MultiKeyResponse\"4\202\323\344\223\002&\022$/v2/users/{u" +
+      "ser_app_id.user_id}/keys\230\234\'\005\220\234\'0\022\243\001\n\013Lis" +
+      "tAppKeys\022 .clarifai.api.ListAppKeysReque" +
+      "st\032\036.clarifai.api.MultiKeyResponse\"R\202\323\344\223" +
+      "\002@\022>/v2/users/{user_app_id.user_id}/apps" +
+      "/{user_app_id.app_id}/keys\230\234\'\005\220\234\'-\220\234\'0\022\225" +
+      "\001\n\tDeleteKey\022\036.clarifai.api.DeleteKeyReq" +
+      "uest\032!.clarifai.api.status.BaseResponse\"" +
+      "E\202\323\344\223\002/*-/v2/users/{user_app_id.user_id}" +
+      "/keys/{key_id}\230\234\'\005\220\234\'/\220\234\'1\220\234\'0\022\212\001\n\010PostK" +
+      "eys\022\035.clarifai.api.PostKeysRequest\032\036.cla" +
+      "rifai.api.MultiKeyResponse\"?\202\323\344\223\002)\"$/v2/" +
+      "users/{user_app_id.user_id}/keys:\001*\230\234\'\005\220" +
+      "\234\'-\220\234\'/\220\234\'0\022\210\001\n\tPatchKeys\022\036.clarifai.api" +
+      ".PatchKeysRequest\032\036.clarifai.api.MultiKe" +
+      "yResponse\";\202\323\344\223\002)2$/v2/users/{user_app_i" +
+      "d.user_id}/keys:\001*\230\234\'\005\220\234\'/\220\234\'0\022\274\001\n\010MySco" +
+      "pes\022\035.clarifai.api.MyScopesRequest\032 .cla" +
+      "rifai.api.MultiScopeResponse\"o\202\323\344\223\002e\022B/v" +
+      "2/users/{user_app_id.user_id}/apps/{user" +
+      "_app_id.app_id}/myscopesZ\016\022\014/v2/myscopes" +
+      "Z\017\022\r/v2/my_scopes\230\234\'\002\022\215\001\n\014MyScopesUser\022!" +
+      ".clarifai.api.MyScopesUserRequest\032$.clar" +
+      "ifai.api.MultiScopeUserResponse\"4\202\323\344\223\002*\022" +
+      "(/v2/users/{user_app_id.user_id}/myscope" +
+      "s\230\234\'\005\022u\n\014MyScopesRoot\022!.clarifai.api.MyS" +
+      "copesRootRequest\032$.clarifai.api.MultiSco" +
+      "peRootResponse\"\034\202\323\344\223\002\022\022\020/v2/myscopesroot" +
+      "\230\234\'\005\022\207\001\n\nListScopes\022\037.clarifai.api.ListS" +
+      "copesRequest\032$.clarifai.api.MultiScopeDe" +
+      "psResponse\"2\202\323\344\223\002(\022&/v2/users/{user_app_" +
+      "id.user_id}/scopes\230\234\'\003\022\240\001\n\006GetApp\022\033.clar" +
+      "ifai.api.GetAppRequest\032\037.clarifai.api.Si" +
+      "ngleAppResponse\"X\202\323\344\223\002F\0229/v2/users/{user" +
+      "_app_id.user_id}/apps/{user_app_id.app_i" +
+      "d}Z\t\022\007/v2/app\230\234\'\002\220\234\'-\220\234\'\023\022\217\001\n\010ListApps\022\035" +
+      ".clarifai.api.ListAppsRequest\032\036.clarifai" +
+      ".api.MultiAppResponse\"D\202\323\344\223\0022\022$/v2/users" +
+      "/{user_app_id.user_id}/appsZ\n\022\010/v2/apps\230" +
+      "\234\'\005\220\234\'-\220\234\'\023\022\245\001\n\tDeleteApp\022\036.clarifai.api" +
+      ".DeleteAppRequest\032!.clarifai.api.status.",
+      "BaseResponse\"U\202\323\344\223\002;*9/v2/users/{user_ap" +
+      "p_id.user_id}/apps/{user_app_id.app_id}\230" +
+      "\234\'\005\220\234\',\220\234\'.\220\234\'-\220\234\'\023\022\222\001\n\010PostApps\022\035.clari" +
+      "fai.api.PostAppsRequest\032\036.clarifai.api.M" +
+      "ultiAppResponse\"G\202\323\344\223\002)\"$/v2/users/{user" +
+      "_app_id.user_id}/apps:\001*\230\234\'\005\220\234\',\220\234\'-\220\234\'\017" +
+      "\220\234\'\023\220\234\'\022\022\210\001\n\tPatchApps\022\036.clarifai.api.Pa" +
+      "tchAppsRequest\032\036.clarifai.api.MultiAppRe" +
+      "sponse\";\202\323\344\223\002)2$/v2/users/{user_app_id.u" +
+      "ser_id}/apps:\001*\230\234\'\005\220\234\',\220\234\'-\022\222\001\n\014PatchApp" +
+      "sIds\022!.clarifai.api.PatchAppsIdsRequest\032" +
+      "\036.clarifai.api.MultiAppResponse\"?\202\323\344\223\002-2" +
+      "(/v2/users/{user_app_id.user_id}/apps/id" +
+      "s:\001*\230\234\'\005\220\234\',\220\234\'-\022\234\001\n\010PatchApp\022\035.clarifai" +
+      ".api.PatchAppRequest\032\037.clarifai.api.Sing" +
+      "leAppResponse\"P\202\323\344\223\002>29/v2/users/{user_a" +
+      "pp_id.user_id}/apps/{user_app_id.app_id}" +
+      ":\001*\230\234\'\005\220\234\',\220\234\'-\022\237\001\n\020PostAppsSearches\022%.c" +
+      "larifai.api.PostAppsSearchesRequest\032\036.cl" +
+      "arifai.api.MultiAppResponse\"D\202\323\344\223\0022\"-/v2" +
+      "/users/{user_app_id.user_id}/apps/search" +
+      "es:\001*\230\234\'\005\220\234\'-\220\234\'\023\022v\n\007GetUser\022\034.clarifai." +
+      "api.GetUserRequest\032 .clarifai.api.Single" +
+      "UserResponse\"+\202\323\344\223\002!\022\037/v2/users/{user_ap" +
+      "p_id.user_id}\230\234\'\005\022\317\001\n\024PostValidatePasswo" +
+      "rd\022).clarifai.api.PostValidatePasswordRe" +
+      "quest\032..clarifai.api.SinglePasswordValid" +
+      "ationResponse\"\\\202\323\344\223\002R\"1/v2/users/{user_a" +
+      "pp_id.user_id}/validate_password:\001*Z\032\"\025/" +
+      "v2/validate_password:\001*\230\234\'\003\022\301\001\n\tGetSearc" +
+      "h\022\036.clarifai.api.GetSearchRequest\032\".clar" +
+      "ifai.api.SingleSearchResponse\"p\202\323\344\223\002^\022G/" +
+      "v2/users/{user_app_id.user_id}/apps/{use" +
+      "r_app_id.app_id}/searches/{id}Z\023\022\021/v2/se" +
+      "arches/{id}\230\234\'\002\220\234\'-\220\234\'r\022\274\001\n\014ListSearches" +
+      "\022!.clarifai.api.ListSearchesRequest\032!.cl" +
+      "arifai.api.MultiSearchResponse\"f\202\323\344\223\002T\022B" +
+      "/v2/users/{user_app_id.user_id}/apps/{us" +
+      "er_app_id.app_id}/searchesZ\016\022\014/v2/search" +
+      "es\230\234\'\002\220\234\'-\220\234\'r\022\310\001\n\rPatchSearches\022\".clari" +
+      "fai.api.PatchSearchesRequest\032!.clarifai." +
+      "api.MultiSearchResponse\"p\202\323\344\223\002Z2B/v2/use" +
       "rs/{user_app_id.user_id}/apps/{user_app_" +
-      "id.app_id}/collaborators:\001*\230\234\'\002\220\234\'-\220\234\'3\220" +
-      "\234\'2\220\234\'4\220\234\'7\220\234\'8\022\244\001\n\022ListCollaborations\022\'" +
-      ".clarifai.api.ListCollaborationsRequest\032" +
-      ").clarifai.api.MultiCollaborationsRespon" +
-      "se\":\202\323\344\223\0020\022./v2/users/{user_app_id.user_" +
-      "id}/collaborations\230\234\'\003\022\306\001\n\023PostAppDuplic" +
-      "ations\022(.clarifai.api.PostAppDuplication" +
-      "sRequest\032*.clarifai.api.MultiAppDuplicat" +
-      "ionsResponse\"Y\202\323\344\223\002K\"F/v2/users/{user_ap" +
+      "id.app_id}/searches:\001*Z\0212\014/v2/searches:\001" +
+      "*\230\234\'\002\220\234\'-\220\234\'s\220\234\'r\022\332\001\n\014PostSearches\022!.cla" +
+      "rifai.api.PostSearchesRequest\032!.clarifai" +
+      ".api.MultiSearchResponse\"\203\001\210\002\001\202\323\344\223\002Z\"B/v" +
+      "2/users/{user_app_id.user_id}/apps/{user" +
+      "_app_id.app_id}/searches:\001*Z\021\"\014/v2/searc" +
+      "hes:\001*\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'\017\220\234\'\003\220\234\'\023\022\330" +
+      "\001\n\020PostSearchesByID\022%.clarifai.api.PostS" +
+      "earchesByIDRequest\032!.clarifai.api.MultiS" +
+      "earchResponse\"z\202\323\344\223\002d\"G/v2/users/{user_a" +
+      "pp_id.user_id}/apps/{user_app_id.app_id}" +
+      "/searches/{id}:\001*Z\026\"\021/v2/searches/{id}:\001" +
+      "*\230\234\'\002\220\234\'-\220\234\'r\220\234\'\003\022\263\002\n\033PostAnnotationSear" +
+      "chMetrics\0220.clarifai.api.PostAnnotationS" +
+      "earchMetricsRequest\0322.clarifai.api.Multi" +
+      "AnnotationSearchMetricsResponse\"\255\001\202\323\344\223\002\202" +
+      "\001\"V/v2/users/{user_app_id.user_id}/apps/" +
+      "{user_app_id.app_id}/annotations/searche" +
+      "s/metrics:\001*Z%\" /v2/annotations/searches" +
+      "/metrics:\001*\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'5\220\234\'6\220" +
+      "\234\'\017\220\234\'\023\022\251\002\n\032GetAnnotationSearchMetrics\022/" +
+      ".clarifai.api.GetAnnotationSearchMetrics" +
+      "Request\0322.clarifai.api.MultiAnnotationSe" +
+      "archMetricsResponse\"\245\001\202\323\344\223\002\206\001\022[/v2/users" +
+      "/{user_app_id.user_id}/apps/{user_app_id" +
+      ".app_id}/annotations/searches/metrics/{i" +
+      "d}Z\'\022%/v2/annotations/searches/metrics/{" +
+      "id}\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'5\022\240\002\n\033ListAnno" +
+      "tationSearchMetrics\0220.clarifai.api.ListA" +
+      "nnotationSearchMetricsRequest\0322.clarifai" +
+      ".api.MultiAnnotationSearchMetricsRespons" +
+      "e\"\232\001\202\323\344\223\002|\022V/v2/users/{user_app_id.user_" +
+      "id}/apps/{user_app_id.app_id}/annotation" +
+      "s/searches/metricsZ\"\022 /v2/annotations/se" +
+      "arches/metrics\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234\'5\022\232" +
+      "\002\n\035DeleteAnnotationSearchMetrics\0222.clari" +
+      "fai.api.DeleteAnnotationSearchMetricsReq" +
+      "uest\032!.clarifai.api.status.BaseResponse\"" +
+      "\241\001\202\323\344\223\002\206\001*[/v2/users/{user_app_id.user_i" +
+      "d}/apps/{user_app_id.app_id}/annotations" +
+      "/searches/metrics/{id}Z\'*%/v2/annotation" +
+      "s/searches/metrics/{id}\230\234\'\002\220\234\'-\220\234\'5\220\234\'6\220" +
+      "\234\'?\022\316\001\n\014DeleteSearch\022!.clarifai.api.Dele" +
+      "teSearchRequest\032!.clarifai.api.status.Ba" +
+      "seResponse\"x\202\323\344\223\002^*G/v2/users/{user_app_" +
+      "id.user_id}/apps/{user_app_id.app_id}/se" +
+      "arches/{id}Z\023*\021/v2/searches/{id}\230\234\'\002\220\234\'-" +
+      "\220\234\'r\220\234\'s\220\234\'t\022\354\001\n\025ListAnnotationFilters\022*" +
+      ".clarifai.api.ListAnnotationFiltersReque" +
+      "st\032+.clarifai.api.MultiAnnotationFilterR" +
+      "esponse\"z\202\323\344\223\002h\022L/v2/users/{user_app_id." +
+      "user_id}/apps/{user_app_id.app_id}/annot" +
+      "ation_filtersZ\030\022\026/v2/annotation_filters\230" +
+      "\234\'\002\220\234\'-\220\234\'r\022\231\002\n\023GetAnnotationFilter\022(.cl" +
+      "arifai.api.GetAnnotationFilterRequest\032,." +
+      "clarifai.api.SingleAnnotationFilterRespo" +
+      "nse\"\251\001\202\323\344\223\002\226\001\022c/v2/users/{user_app_id.us" +
+      "er_id}/apps/{user_app_id.app_id}/annotat" +
+      "ion_filters/{annotation_filter_id}Z/\022-/v" +
+      "2/annotation_filters/{annotation_filter_" +
+      "id}\230\234\'\002\220\234\'-\220\234\'r\022\367\001\n\025PostAnnotationFilter" +
+      "s\022*.clarifai.api.PostAnnotationFiltersRe" +
+      "quest\032+.clarifai.api.MultiAnnotationFilt" +
+      "erResponse\"\204\001\202\323\344\223\002n\"L/v2/users/{user_app" +
+      "_id.user_id}/apps/{user_app_id.app_id}/a" +
+      "nnotation_filters:\001*Z\033\"\026/v2/annotation_f" +
+      "ilters:\001*\230\234\'\002\220\234\'-\220\234\'r\220\234\'s\022\371\001\n\026PatchAnnot" +
+      "ationFilters\022+.clarifai.api.PatchAnnotat" +
+      "ionFiltersRequest\032+.clarifai.api.MultiAn" +
+      "notationFilterResponse\"\204\001\202\323\344\223\002n2L/v2/use" +
+      "rs/{user_app_id.user_id}/apps/{user_app_" +
+      "id.app_id}/annotation_filters:\001*Z\0332\026/v2/" +
+      "annotation_filters:\001*\230\234\'\002\220\234\'-\220\234\'r\220\234\'s\022\361\001" +
+      "\n\027DeleteAnnotationFilters\022,.clarifai.api" +
+      ".DeleteAnnotationFiltersRequest\032!.clarif" +
+      "ai.api.status.BaseResponse\"\204\001\202\323\344\223\002n*L/v2" +
+      "/users/{user_app_id.user_id}/apps/{user_" +
+      "app_id.app_id}/annotation_filters:\001*Z\033*\026" +
+      "/v2/annotation_filters:\001*\230\234\'\002\220\234\'-\220\234\'r\220\234\'" +
+      "s\022|\n\017ListStatusCodes\022$.clarifai.api.List" +
+      "StatusCodesRequest\032%.clarifai.api.MultiS" +
+      "tatusCodeResponse\"\034\202\323\344\223\002\022\022\020/v2/status_co" +
+      "des\230\234\'\001\022\212\001\n\rGetStatusCode\022\".clarifai.api" +
+      ".GetStatusCodeRequest\032&.clarifai.api.Sin" +
+      "gleStatusCodeResponse\"-\202\323\344\223\002#\022!/v2/statu" +
+      "s_codes/{status_code_id}\230\234\'\001\022\302\001\n\021ListCol" +
+      "laborators\022&.clarifai.api.ListCollaborat" +
+      "orsRequest\032(.clarifai.api.MultiCollabora" +
+      "torsResponse\"[\202\323\344\223\002I\022G/v2/users/{user_ap" +
       "p_id.user_id}/apps/{user_app_id.app_id}/" +
-      "duplications:\001*\230\234\'\005\220\234\'-\022\245\001\n\023ListAppDupli" +
-      "cations\022(.clarifai.api.ListAppDuplicatio" +
-      "nsRequest\032*.clarifai.api.MultiAppDuplica" +
-      "tionsResponse\"8\202\323\344\223\002.\022,/v2/users/{user_a" +
-      "pp_id.user_id}/duplications\230\234\'\005\022\266\001\n\021GetA" +
-      "ppDuplication\022&.clarifai.api.GetAppDupli" +
-      "cationRequest\032*.clarifai.api.SingleAppDu" +
-      "plicationResponse\"M\202\323\344\223\002C\022A/v2/users/{us" +
-      "er_app_id.user_id}/duplications/{app_dup" +
-      "lication_id}\230\234\'\005\022\331\001\n\tPostTasks\022\036.clarifa" +
-      "i.api.PostTasksRequest\032\037.clarifai.api.Mu" +
-      "ltiTaskResponse\"\212\001\202\323\344\223\002T\"?/v2/users/{use" +
+      "collaborators\230\234\'\002\220\234\'-\220\234\'2\022\311\001\n\021PostCollab" +
+      "orators\022&.clarifai.api.PostCollaborators" +
+      "Request\032(.clarifai.api.MultiCollaborator" +
+      "sResponse\"b\202\323\344\223\002L\"G/v2/users/{user_app_i" +
+      "d.user_id}/apps/{user_app_id.app_id}/col" +
+      "laborators:\001*\230\234\'\002\220\234\'-\220\234\'3\220\234\'2\022\317\001\n\022PatchC" +
+      "ollaborators\022\'.clarifai.api.PatchCollabo" +
+      "ratorsRequest\032(.clarifai.api.MultiCollab" +
+      "oratorsResponse\"f\202\323\344\223\002L2G/v2/users/{user" +
+      "_app_id.user_id}/apps/{user_app_id.app_i" +
+      "d}/collaborators:\001*\230\234\'\002\220\234\'-\220\234\'3\220\234\'2\220\234\'4\022" +
+      "\322\001\n\023DeleteCollaborators\022(.clarifai.api.D" +
+      "eleteCollaboratorsRequest\032!.clarifai.api" +
+      ".status.BaseResponse\"n\202\323\344\223\002L*G/v2/users/" +
+      "{user_app_id.user_id}/apps/{user_app_id." +
+      "app_id}/collaborators:\001*\230\234\'\002\220\234\'-\220\234\'3\220\234\'2" +
+      "\220\234\'4\220\234\'7\220\234\'8\022\254\001\n\022ListCollaborations\022\'.cl" +
+      "arifai.api.ListCollaborationsRequest\032).c" +
+      "larifai.api.MultiCollaborationsResponse\"" +
+      "B\202\323\344\223\0020\022./v2/users/{user_app_id.user_id}" +
+      "/collaborations\230\234\'\005\220\234\'-\220\234\'2\022\306\001\n\023PostAppD" +
+      "uplications\022(.clarifai.api.PostAppDuplic" +
+      "ationsRequest\032*.clarifai.api.MultiAppDup" +
+      "licationsResponse\"Y\202\323\344\223\002K\"F/v2/users/{us" +
+      "er_app_id.user_id}/apps/{user_app_id.app" +
+      "_id}/duplications:\001*\230\234\'\005\220\234\'-\022\245\001\n\023ListApp" +
+      "Duplications\022(.clarifai.api.ListAppDupli" +
+      "cationsRequest\032*.clarifai.api.MultiAppDu" +
+      "plicationsResponse\"8\202\323\344\223\002.\022,/v2/users/{u" +
+      "ser_app_id.user_id}/duplications\230\234\'\005\022\266\001\n" +
+      "\021GetAppDuplication\022&.clarifai.api.GetApp" +
+      "DuplicationRequest\032*.clarifai.api.Single" +
+      "AppDuplicationResponse\"M\202\323\344\223\002C\022A/v2/user" +
+      "s/{user_app_id.user_id}/duplications/{ap" +
+      "p_duplication_id}\230\234\'\005\022\331\001\n\tPostTasks\022\036.cl" +
+      "arifai.api.PostTasksRequest\032\037.clarifai.a" +
+      "pi.MultiTaskResponse\"\212\001\202\323\344\223\002T\"?/v2/users" +
+      "/{user_app_id.user_id}/apps/{user_app_id" +
+      ".app_id}/tasks:\001*Z\016\"\t/v2/tasks:\001*\230\234\'\002\220\234\'" +
+      "-\220\234\'7\220\234\'8\220\234\'\005\220\234\'\003\220\234\'r\220\234\'\013\220\234\'\023\220\234\'\017\220\234\'%\220\234\'" +
+      "&\022\376\001\n\026GetTaskAnnotationCount\022!.clarifai." +
+      "api.GetTaskCountRequest\032%.clarifai.api.S" +
+      "ingleTaskCountResponse\"\231\001\202\323\344\223\002\206\001\022[/v2/us" +
+      "ers/{user_app_id.user_id}/apps/{user_app" +
+      "_id.app_id}/tasks/{task_id}/annotations/" +
+      "countZ\'\022%/v2/tasks/{task_id}/annotations" +
+      "/count\230\234\'\002\220\234\'-\220\234\'8\022\356\001\n\021GetTaskInputCount" +
+      "\022!.clarifai.api.GetTaskCountRequest\032%.cl" +
+      "arifai.api.SingleTaskCountResponse\"\216\001\202\323\344" +
+      "\223\002|\022V/v2/users/{user_app_id.user_id}/app" +
+      "s/{user_app_id.app_id}/tasks/{task_id}/i" +
+      "nputs/countZ\"\022 /v2/tasks/{task_id}/input" +
+      "s/count\230\234\'\002\220\234\'-\220\234\'8\022\320\001\n\007GetTask\022\034.clarif" +
+      "ai.api.GetTaskRequest\032 .clarifai.api.Sin" +
+      "gleTaskResponse\"\204\001\202\323\344\223\002b\022I/v2/users/{use" +
       "r_app_id.user_id}/apps/{user_app_id.app_" +
-      "id}/tasks:\001*Z\016\"\t/v2/tasks:\001*\230\234\'\002\220\234\'-\220\234\'7" +
-      "\220\234\'8\220\234\'\005\220\234\'\003\220\234\'r\220\234\'\013\220\234\'\023\220\234\'\017\220\234\'%\220\234\'&\022\376\001\n" +
-      "\026GetTaskAnnotationCount\022!.clarifai.api.G" +
-      "etTaskCountRequest\032%.clarifai.api.Single" +
-      "TaskCountResponse\"\231\001\202\323\344\223\002\206\001\022[/v2/users/{" +
-      "user_app_id.user_id}/apps/{user_app_id.a" +
-      "pp_id}/tasks/{task_id}/annotations/count" +
-      "Z\'\022%/v2/tasks/{task_id}/annotations/coun" +
-      "t\230\234\'\002\220\234\'-\220\234\'8\022\356\001\n\021GetTaskInputCount\022!.cl" +
-      "arifai.api.GetTaskCountRequest\032%.clarifa" +
-      "i.api.SingleTaskCountResponse\"\216\001\202\323\344\223\002|\022V" +
-      "/v2/users/{user_app_id.user_id}/apps/{us" +
-      "er_app_id.app_id}/tasks/{task_id}/inputs" +
-      "/countZ\"\022 /v2/tasks/{task_id}/inputs/cou" +
-      "nt\230\234\'\002\220\234\'-\220\234\'8\022\320\001\n\007GetTask\022\034.clarifai.ap" +
-      "i.GetTaskRequest\032 .clarifai.api.SingleTa" +
-      "skResponse\"\204\001\202\323\344\223\002b\022I/v2/users/{user_app" +
-      "_id.user_id}/apps/{user_app_id.app_id}/t" +
-      "asks/{task_id}Z\025\022\023/v2/tasks/{task_id}\230\234\'" +
-      "\002\220\234\'-\220\234\'8\220\234\'r\220\234\'\013\220\234\'\023\220\234\'\017\022\276\001\n\tListTasks\022" +
-      "\036.clarifai.api.ListTasksRequest\032\037.clarif" +
-      "ai.api.MultiTaskResponse\"p\202\323\344\223\002N\022?/v2/us" +
+      "id}/tasks/{task_id}Z\025\022\023/v2/tasks/{task_i" +
+      "d}\230\234\'\002\220\234\'-\220\234\'8\220\234\'r\220\234\'\013\220\234\'\023\220\234\'\017\022\276\001\n\tListT" +
+      "asks\022\036.clarifai.api.ListTasksRequest\032\037.c" +
+      "larifai.api.MultiTaskResponse\"p\202\323\344\223\002N\022?/" +
+      "v2/users/{user_app_id.user_id}/apps/{use" +
+      "r_app_id.app_id}/tasksZ\013\022\t/v2/tasks\230\234\'\002\220" +
+      "\234\'-\220\234\'8\220\234\'r\220\234\'\013\220\234\'\023\220\234\'\017\022\327\001\n\nPatchTasks\022\037" +
+      ".clarifai.api.PatchTasksRequest\032\037.clarif" +
+      "ai.api.MultiTaskResponse\"\206\001\202\323\344\223\002T2?/v2/u" +
+      "sers/{user_app_id.user_id}/apps/{user_ap" +
+      "p_id.app_id}/tasks:\001*Z\0162\t/v2/tasks:\001*\230\234\'" +
+      "\002\220\234\'-\220\234\'7\220\234\'8\220\234\'\005\220\234\'r\220\234\'\013\220\234\'\023\220\234\'\017\220\234\'%\220\234\'" +
+      "&\022\302\001\n\013DeleteTasks\022 .clarifai.api.DeleteT" +
+      "asksRequest\032!.clarifai.api.status.BaseRe" +
+      "sponse\"n\202\323\344\223\002T*?/v2/users/{user_app_id.u" +
+      "ser_id}/apps/{user_app_id.app_id}/tasks:" +
+      "\001*Z\016*\t/v2/tasks:\001*\230\234\'\002\220\234\'-\220\234\'7\220\234\'8\220\234\'F\022\365" +
+      "\001\n\017PostLabelOrders\022$.clarifai.api.PostLa" +
+      "belOrdersRequest\032%.clarifai.api.MultiLab" +
+      "elOrderResponse\"\224\001\202\323\344\223\002b\"F/v2/users/{use" +
+      "r_app_id.user_id}/apps/{user_app_id.app_" +
+      "id}/label_orders:\001*Z\025\"\020/v2/label_orders:" +
+      "\001*\230\234\'\002\220\234\'-\220\234\'C\220\234\'D\220\234\'7\220\234\'8\220\234\'\005\220\234\'r\220\234\'\013\220\234" +
+      "\'\023\220\234\'\017\022\366\001\n\rGetLabelOrder\022\".clarifai.api." +
+      "GetLabelOrderRequest\032&.clarifai.api.Sing" +
+      "leLabelOrderResponse\"\230\001\202\323\344\223\002~\022W/v2/users" +
+      "/{user_app_id.user_id}/apps/{user_app_id" +
+      ".app_id}/label_orders/{label_order_id}Z#" +
+      "\022!/v2/label_orders/{label_order_id}\230\234\'\002\220" +
+      "\234\'-\220\234\'C\220\234\'\013\220\234\'8\022\326\001\n\017ListLabelOrders\022$.cl" +
+      "arifai.api.ListLabelOrdersRequest\032%.clar" +
+      "ifai.api.MultiLabelOrderResponse\"v\202\323\344\223\002\\" +
+      "\022F/v2/users/{user_app_id.user_id}/apps/{" +
+      "user_app_id.app_id}/label_ordersZ\022\022\020/v2/" +
+      "label_orders\230\234\'\002\220\234\'-\220\234\'C\220\234\'\013\220\234\'8\022\353\001\n\020Pat" +
+      "chLabelOrders\022%.clarifai.api.PatchLabelO" +
+      "rdersRequest\032%.clarifai.api.MultiLabelOr" +
+      "derResponse\"\210\001\202\323\344\223\002b2F/v2/users/{user_ap" +
+      "p_id.user_id}/apps/{user_app_id.app_id}/" +
+      "label_orders:\001*Z\0252\020/v2/label_orders:\001*\230\234" +
+      "\'\002\220\234\'-\220\234\'C\220\234\'D\220\234\'\013\220\234\'7\220\234\'8\220\234\'F\022\345\001\n\021Delet" +
+      "eLabelOrders\022&.clarifai.api.DeleteLabelO" +
+      "rdersRequest\032!.clarifai.api.status.BaseR" +
+      "esponse\"\204\001\202\323\344\223\002b*F/v2/users/{user_app_id" +
+      ".user_id}/apps/{user_app_id.app_id}/labe" +
+      "l_orders:\001*Z\025*\020/v2/label_orders:\001*\230\234\'\002\220\234" +
+      "\'-\220\234\'E\220\234\'C\220\234\'D\220\234\'7\220\234\'8\022\362\001\n\016PostCollector" +
+      "s\022#.clarifai.api.PostCollectorsRequest\032$" +
+      ".clarifai.api.MultiCollectorResponse\"\224\001\202" +
+      "\323\344\223\002^\"D/v2/users/{user_app_id.user_id}/a" +
+      "pps/{user_app_id.app_id}/collectors:\001*Z\023" +
+      "\"\016/v2/collectors:\001*\230\234\'\002\220\234\'-\220\234\'\004\220\234\'%\220\234\'&\220" +
+      "\234\')\220\234\'\013\220\234\'\004\220\234\'\005\220\234\'\017\220\234\'\002\220\234\'\023\022\343\001\n\014GetColle" +
+      "ctor\022!.clarifai.api.GetCollectorRequest\032" +
+      "%.clarifai.api.SingleCollectorResponse\"\210" +
+      "\001\202\323\344\223\002v\022S/v2/users/{user_app_id.user_id}" +
+      "/apps/{user_app_id.app_id}/collectors/{c" +
+      "ollector_id}Z\037\022\035/v2/collectors/{collecto" +
+      "r_id}\230\234\'\002\220\234\'-\220\234\'*\022\307\001\n\016ListCollectors\022#.c" +
+      "larifai.api.ListCollectorsRequest\032$.clar" +
+      "ifai.api.MultiCollectorResponse\"j\202\323\344\223\002X\022" +
+      "D/v2/users/{user_app_id.user_id}/apps/{u" +
+      "ser_app_id.app_id}/collectorsZ\020\022\016/v2/col" +
+      "lectors\230\234\'\002\220\234\'-\220\234\'*\022\323\001\n\017PatchCollectors\022" +
+      "$.clarifai.api.PatchCollectorsRequest\032$." +
+      "clarifai.api.MultiCollectorResponse\"t\202\323\344" +
+      "\223\002^2D/v2/users/{user_app_id.user_id}/app" +
+      "s/{user_app_id.app_id}/collectors:\001*Z\0232\016" +
+      "/v2/collectors:\001*\230\234\'\002\220\234\'-\220\234\')\220\234\'*\022\326\001\n\020De" +
+      "leteCollectors\022%.clarifai.api.DeleteColl" +
+      "ectorsRequest\032!.clarifai.api.status.Base" +
+      "Response\"x\202\323\344\223\002^*D/v2/users/{user_app_id" +
+      ".user_id}/apps/{user_app_id.app_id}/coll" +
+      "ectors:\001*Z\023*\016/v2/collectors:\001*\230\234\'\002\220\234\'-\220\234" +
+      "\')\220\234\'+\220\234\'*\022\311\001\n\016PostStatValues\022#.clarifai" +
+      ".api.PostStatValuesRequest\032$.clarifai.ap" +
+      "i.MultiStatValueResponse\"l\202\323\344\223\002b\"F/v2/us" +
       "ers/{user_app_id.user_id}/apps/{user_app" +
-      "_id.app_id}/tasksZ\013\022\t/v2/tasks\230\234\'\002\220\234\'-\220\234" +
-      "\'8\220\234\'r\220\234\'\013\220\234\'\023\220\234\'\017\022\327\001\n\nPatchTasks\022\037.clar" +
-      "ifai.api.PatchTasksRequest\032\037.clarifai.ap" +
-      "i.MultiTaskResponse\"\206\001\202\323\344\223\002T2?/v2/users/" +
-      "{user_app_id.user_id}/apps/{user_app_id." +
-      "app_id}/tasks:\001*Z\0162\t/v2/tasks:\001*\230\234\'\002\220\234\'-" +
-      "\220\234\'7\220\234\'8\220\234\'\005\220\234\'r\220\234\'\013\220\234\'\023\220\234\'\017\220\234\'%\220\234\'&\022\302\001\n" +
-      "\013DeleteTasks\022 .clarifai.api.DeleteTasksR" +
-      "equest\032!.clarifai.api.status.BaseRespons" +
-      "e\"n\202\323\344\223\002T*?/v2/users/{user_app_id.user_i" +
-      "d}/apps/{user_app_id.app_id}/tasks:\001*Z\016*" +
-      "\t/v2/tasks:\001*\230\234\'\002\220\234\'-\220\234\'7\220\234\'8\220\234\'F\022\365\001\n\017Po" +
-      "stLabelOrders\022$.clarifai.api.PostLabelOr" +
-      "dersRequest\032%.clarifai.api.MultiLabelOrd" +
-      "erResponse\"\224\001\202\323\344\223\002b\"F/v2/users/{user_app" +
-      "_id.user_id}/apps/{user_app_id.app_id}/l" +
-      "abel_orders:\001*Z\025\"\020/v2/label_orders:\001*\230\234\'" +
-      "\002\220\234\'-\220\234\'C\220\234\'D\220\234\'7\220\234\'8\220\234\'\005\220\234\'r\220\234\'\013\220\234\'\023\220\234\'" +
-      "\017\022\366\001\n\rGetLabelOrder\022\".clarifai.api.GetLa" +
-      "belOrderRequest\032&.clarifai.api.SingleLab" +
-      "elOrderResponse\"\230\001\202\323\344\223\002~\022W/v2/users/{use" +
+      "_id.app_id}/stats/values:\001*Z\025\"\020/v2/stats" +
+      "/values:\001*\230\234\'\002\022\375\001\n\027PostStatValuesAggrega" +
+      "te\022,.clarifai.api.PostStatValuesAggregat" +
+      "eRequest\032-.clarifai.api.MultiStatValueAg" +
+      "gregateResponse\"\204\001\202\323\344\223\002v\"P/v2/users/{use" +
       "r_app_id.user_id}/apps/{user_app_id.app_" +
-      "id}/label_orders/{label_order_id}Z#\022!/v2" +
-      "/label_orders/{label_order_id}\230\234\'\002\220\234\'-\220\234" +
-      "\'C\220\234\'\013\220\234\'8\022\326\001\n\017ListLabelOrders\022$.clarifa" +
-      "i.api.ListLabelOrdersRequest\032%.clarifai." +
-      "api.MultiLabelOrderResponse\"v\202\323\344\223\002\\\022F/v2" +
-      "/users/{user_app_id.user_id}/apps/{user_" +
-      "app_id.app_id}/label_ordersZ\022\022\020/v2/label" +
-      "_orders\230\234\'\002\220\234\'-\220\234\'C\220\234\'\013\220\234\'8\022\353\001\n\020PatchLab" +
-      "elOrders\022%.clarifai.api.PatchLabelOrders" +
-      "Request\032%.clarifai.api.MultiLabelOrderRe" +
-      "sponse\"\210\001\202\323\344\223\002b2F/v2/users/{user_app_id." +
-      "user_id}/apps/{user_app_id.app_id}/label" +
-      "_orders:\001*Z\0252\020/v2/label_orders:\001*\230\234\'\002\220\234\'" +
-      "-\220\234\'C\220\234\'D\220\234\'\013\220\234\'7\220\234\'8\220\234\'F\022\345\001\n\021DeleteLabe" +
-      "lOrders\022&.clarifai.api.DeleteLabelOrders" +
-      "Request\032!.clarifai.api.status.BaseRespon" +
-      "se\"\204\001\202\323\344\223\002b*F/v2/users/{user_app_id.user" +
-      "_id}/apps/{user_app_id.app_id}/label_ord" +
-      "ers:\001*Z\025*\020/v2/label_orders:\001*\230\234\'\002\220\234\'-\220\234\'" +
-      "E\220\234\'C\220\234\'D\220\234\'7\220\234\'8\022\362\001\n\016PostCollectors\022#.c" +
-      "larifai.api.PostCollectorsRequest\032$.clar" +
-      "ifai.api.MultiCollectorResponse\"\224\001\202\323\344\223\002^" +
-      "\"D/v2/users/{user_app_id.user_id}/apps/{" +
-      "user_app_id.app_id}/collectors:\001*Z\023\"\016/v2" +
-      "/collectors:\001*\230\234\'\002\220\234\'-\220\234\'\004\220\234\'%\220\234\'&\220\234\')\220\234" +
-      "\'\013\220\234\'\004\220\234\'\005\220\234\'\017\220\234\'\002\220\234\'\023\022\343\001\n\014GetCollector\022" +
-      "!.clarifai.api.GetCollectorRequest\032%.cla" +
-      "rifai.api.SingleCollectorResponse\"\210\001\202\323\344\223" +
-      "\002v\022S/v2/users/{user_app_id.user_id}/apps" +
-      "/{user_app_id.app_id}/collectors/{collec" +
-      "tor_id}Z\037\022\035/v2/collectors/{collector_id}" +
-      "\230\234\'\002\220\234\'-\220\234\'*\022\307\001\n\016ListCollectors\022#.clarif" +
-      "ai.api.ListCollectorsRequest\032$.clarifai." +
-      "api.MultiCollectorResponse\"j\202\323\344\223\002X\022D/v2/" +
-      "users/{user_app_id.user_id}/apps/{user_a" +
-      "pp_id.app_id}/collectorsZ\020\022\016/v2/collecto" +
-      "rs\230\234\'\002\220\234\'-\220\234\'*\022\323\001\n\017PatchCollectors\022$.cla" +
-      "rifai.api.PatchCollectorsRequest\032$.clari" +
-      "fai.api.MultiCollectorResponse\"t\202\323\344\223\002^2D" +
-      "/v2/users/{user_app_id.user_id}/apps/{us" +
-      "er_app_id.app_id}/collectors:\001*Z\0232\016/v2/c" +
-      "ollectors:\001*\230\234\'\002\220\234\'-\220\234\')\220\234\'*\022\326\001\n\020DeleteC" +
-      "ollectors\022%.clarifai.api.DeleteCollector" +
-      "sRequest\032!.clarifai.api.status.BaseRespo" +
-      "nse\"x\202\323\344\223\002^*D/v2/users/{user_app_id.user" +
-      "_id}/apps/{user_app_id.app_id}/collector" +
-      "s:\001*Z\023*\016/v2/collectors:\001*\230\234\'\002\220\234\'-\220\234\')\220\234\'" +
-      "+\220\234\'*\022\311\001\n\016PostStatValues\022#.clarifai.api." +
-      "PostStatValuesRequest\032$.clarifai.api.Mul" +
-      "tiStatValueResponse\"l\202\323\344\223\002b\"F/v2/users/{" +
+      "id}/stats/values/aggregate:\001*Z\037\"\032/v2/sta" +
+      "ts/values/aggregate:\001*\230\234\'\002\220\234\'-\022\343\001\n\027PostT" +
+      "rendingMetricsView\022,.clarifai.api.PostTr" +
+      "endingMetricsViewRequest\032!.clarifai.api." +
+      "status.BaseResponse\"w\202\323\344\223\002m\"h/v2/users/{" +
       "user_app_id.user_id}/apps/{user_app_id.a" +
-      "pp_id}/stats/values:\001*Z\025\"\020/v2/stats/valu" +
-      "es:\001*\230\234\'\002\022\375\001\n\027PostStatValuesAggregate\022,." +
-      "clarifai.api.PostStatValuesAggregateRequ" +
-      "est\032-.clarifai.api.MultiStatValueAggrega" +
-      "teResponse\"\204\001\202\323\344\223\002v\"P/v2/users/{user_app" +
-      "_id.user_id}/apps/{user_app_id.app_id}/s" +
-      "tats/values/aggregate:\001*Z\037\"\032/v2/stats/va" +
-      "lues/aggregate:\001*\230\234\'\002\220\234\'-\022\343\001\n\027PostTrendi" +
-      "ngMetricsView\022,.clarifai.api.PostTrendin" +
-      "gMetricsViewRequest\032!.clarifai.api.statu" +
-      "s.BaseResponse\"w\202\323\344\223\002m\"h/v2/users/{user_" +
+      "pp_id}/trending_metrics/views/{view_type" +
+      "}/{object_id}:\001*\230\234\'\002\022\217\002\n\030ListTrendingMet" +
+      "ricsViews\022-.clarifai.api.ListTrendingMet" +
+      "ricsViewsRequest\032..clarifai.api.MultiTre" +
+      "ndingMetricsViewResponse\"\223\001\202\323\344\223\002\210\001\022\\/v2/" +
+      "users/{user_app_id.user_id}/apps/{user_a" +
+      "pp_id.app_id}/trending_metrics/views/{vi" +
+      "ew_type}Z(\022&/v2/trending_metrics/views/{" +
+      "view_type}\230\234\'\002\022\262\001\n\tGetModule\022\036.clarifai." +
+      "api.GetModuleRequest\032\".clarifai.api.Sing" +
+      "leModuleResponse\"a\202\323\344\223\002O\022M/v2/users/{use" +
+      "r_app_id.user_id}/apps/{user_app_id.app_" +
+      "id}/modules/{module_id}\230\234\'\005\220\234\'-\220\234\'m\022\344\001\n\013" +
+      "ListModules\022 .clarifai.api.ListModulesRe" +
+      "quest\032!.clarifai.api.MultiModuleResponse" +
+      "\"\217\001\202\323\344\223\002}\022A/v2/users/{user_app_id.user_i" +
+      "d}/apps/{user_app_id.app_id}/modulesZ)\022\'" +
+      "/v2/users/{user_app_id.user_id}/modulesZ" +
+      "\r\022\013/v2/modules\230\234\'\005\220\234\'-\220\234\'m\022\260\001\n\013PostModul" +
+      "es\022 .clarifai.api.PostModulesRequest\032!.c" +
+      "larifai.api.MultiModuleResponse\"\\\202\323\344\223\002F\"" +
+      "A/v2/users/{user_app_id.user_id}/apps/{u" +
+      "ser_app_id.app_id}/modules:\001*\230\234\'\005\220\234\'-\220\234\'" +
+      "l\220\234\'m\022\262\001\n\014PatchModules\022!.clarifai.api.Pa" +
+      "tchModulesRequest\032!.clarifai.api.MultiMo" +
+      "duleResponse\"\\\202\323\344\223\002F2A/v2/users/{user_ap" +
+      "p_id.user_id}/apps/{user_app_id.app_id}/" +
+      "modules:\001*\230\234\'\005\220\234\'-\220\234\'l\220\234\'m\022\320\001\n\rDeleteMod" +
+      "ules\022\".clarifai.api.DeleteModulesRequest" +
+      "\032!.clarifai.api.status.BaseResponse\"x\202\323\344" +
+      "\223\002F*A/v2/users/{user_app_id.user_id}/app" +
+      "s/{user_app_id.app_id}/modules:\001*\230\234\'\005\220\234\'" +
+      "-\220\234\'l\220\234\'n\220\234\'m\220\234\'p\220\234\'o\220\234\'q\220\234\'1\220\234\'0\220\234\'/\022\344\001" +
+      "\n\020GetModuleVersion\022%.clarifai.api.GetMod" +
+      "uleVersionRequest\032).clarifai.api.SingleM" +
+      "oduleVersionResponse\"~\202\323\344\223\002l\022j/v2/users/" +
+      "{user_app_id.user_id}/apps/{user_app_id." +
+      "app_id}/modules/{module_id}/versions/{mo" +
+      "dule_version_id}\230\234\'\005\220\234\'-\220\234\'m\022\323\001\n\022ListMod" +
+      "uleVersions\022\'.clarifai.api.ListModuleVer" +
+      "sionsRequest\032(.clarifai.api.MultiModuleV" +
+      "ersionResponse\"j\202\323\344\223\002X\022V/v2/users/{user_" +
       "app_id.user_id}/apps/{user_app_id.app_id" +
-      "}/trending_metrics/views/{view_type}/{ob" +
-      "ject_id}:\001*\230\234\'\002\022\217\002\n\030ListTrendingMetricsV" +
-      "iews\022-.clarifai.api.ListTrendingMetricsV" +
-      "iewsRequest\032..clarifai.api.MultiTrending" +
-      "MetricsViewResponse\"\223\001\202\323\344\223\002\210\001\022\\/v2/users" +
-      "/{user_app_id.user_id}/apps/{user_app_id" +
-      ".app_id}/trending_metrics/views/{view_ty" +
-      "pe}Z(\022&/v2/trending_metrics/views/{view_" +
-      "type}\230\234\'\002\022\262\001\n\tGetModule\022\036.clarifai.api.G" +
-      "etModuleRequest\032\".clarifai.api.SingleMod" +
-      "uleResponse\"a\202\323\344\223\002O\022M/v2/users/{user_app" +
+      "}/modules/{module_id}/versions\230\234\'\005\220\234\'-\220\234" +
+      "\'m\022\332\001\n\022PostModuleVersions\022\'.clarifai.api" +
+      ".PostModuleVersionsRequest\032(.clarifai.ap" +
+      "i.MultiModuleVersionResponse\"q\202\323\344\223\002[\"V/v" +
+      "2/users/{user_app_id.user_id}/apps/{user" +
+      "_app_id.app_id}/modules/{module_id}/vers" +
+      "ions:\001*\230\234\'\005\220\234\'-\220\234\'l\220\234\'m\022\334\001\n\023PatchModuleV" +
+      "ersions\022(.clarifai.api.PatchModuleVersio" +
+      "nsRequest\032(.clarifai.api.MultiModuleVers" +
+      "ionResponse\"q\202\323\344\223\002[2V/v2/users/{user_app" +
       "_id.user_id}/apps/{user_app_id.app_id}/m" +
-      "odules/{module_id}\230\234\'\005\220\234\'-\220\234\'m\022\344\001\n\013ListM" +
-      "odules\022 .clarifai.api.ListModulesRequest" +
-      "\032!.clarifai.api.MultiModuleResponse\"\217\001\202\323" +
-      "\344\223\002}\022A/v2/users/{user_app_id.user_id}/ap" +
-      "ps/{user_app_id.app_id}/modulesZ)\022\'/v2/u" +
-      "sers/{user_app_id.user_id}/modulesZ\r\022\013/v" +
-      "2/modules\230\234\'\005\220\234\'-\220\234\'m\022\260\001\n\013PostModules\022 ." +
-      "clarifai.api.PostModulesRequest\032!.clarif" +
-      "ai.api.MultiModuleResponse\"\\\202\323\344\223\002F\"A/v2/" +
-      "users/{user_app_id.user_id}/apps/{user_a" +
-      "pp_id.app_id}/modules:\001*\230\234\'\005\220\234\'-\220\234\'l\220\234\'m" +
-      "\022\262\001\n\014PatchModules\022!.clarifai.api.PatchMo" +
-      "dulesRequest\032!.clarifai.api.MultiModuleR" +
-      "esponse\"\\\202\323\344\223\002F2A/v2/users/{user_app_id." +
-      "user_id}/apps/{user_app_id.app_id}/modul" +
-      "es:\001*\230\234\'\005\220\234\'-\220\234\'l\220\234\'m\022\320\001\n\rDeleteModules\022" +
-      "\".clarifai.api.DeleteModulesRequest\032!.cl" +
-      "arifai.api.status.BaseResponse\"x\202\323\344\223\002F*A" +
+      "odules/{module_id}/versions:\001*\230\234\'\005\220\234\'-\220\234" +
+      "\'l\220\234\'m\022\364\001\n\024DeleteModuleVersions\022).clarif" +
+      "ai.api.DeleteModuleVersionsRequest\032!.cla" +
+      "rifai.api.status.BaseResponse\"\215\001\202\323\344\223\002[*V" +
       "/v2/users/{user_app_id.user_id}/apps/{us" +
-      "er_app_id.app_id}/modules:\001*\230\234\'\005\220\234\'-\220\234\'l" +
-      "\220\234\'n\220\234\'m\220\234\'p\220\234\'o\220\234\'q\220\234\'1\220\234\'0\220\234\'/\022\344\001\n\020Get" +
-      "ModuleVersion\022%.clarifai.api.GetModuleVe" +
-      "rsionRequest\032).clarifai.api.SingleModule" +
-      "VersionResponse\"~\202\323\344\223\002l\022j/v2/users/{user" +
-      "_app_id.user_id}/apps/{user_app_id.app_i" +
-      "d}/modules/{module_id}/versions/{module_" +
-      "version_id}\230\234\'\005\220\234\'-\220\234\'m\022\323\001\n\022ListModuleVe" +
-      "rsions\022\'.clarifai.api.ListModuleVersions" +
-      "Request\032(.clarifai.api.MultiModuleVersio" +
-      "nResponse\"j\202\323\344\223\002X\022V/v2/users/{user_app_i" +
-      "d.user_id}/apps/{user_app_id.app_id}/mod" +
-      "ules/{module_id}/versions\230\234\'\005\220\234\'-\220\234\'m\022\332\001" +
-      "\n\022PostModuleVersions\022\'.clarifai.api.Post" +
-      "ModuleVersionsRequest\032(.clarifai.api.Mul" +
-      "tiModuleVersionResponse\"q\202\323\344\223\002[\"V/v2/use" +
-      "rs/{user_app_id.user_id}/apps/{user_app_" +
-      "id.app_id}/modules/{module_id}/versions:" +
-      "\001*\230\234\'\005\220\234\'-\220\234\'l\220\234\'m\022\334\001\n\023PatchModuleVersio" +
-      "ns\022(.clarifai.api.PatchModuleVersionsReq" +
-      "uest\032(.clarifai.api.MultiModuleVersionRe" +
-      "sponse\"q\202\323\344\223\002[2V/v2/users/{user_app_id.u" +
-      "ser_id}/apps/{user_app_id.app_id}/module" +
-      "s/{module_id}/versions:\001*\230\234\'\005\220\234\'-\220\234\'l\220\234\'" +
-      "m\022\364\001\n\024DeleteModuleVersions\022).clarifai.ap" +
-      "i.DeleteModuleVersionsRequest\032!.clarifai" +
-      ".api.status.BaseResponse\"\215\001\202\323\344\223\002[*V/v2/u" +
-      "sers/{user_app_id.user_id}/apps/{user_ap" +
-      "p_id.app_id}/modules/{module_id}/version" +
-      "s:\001*\230\234\'\005\220\234\'-\220\234\'l\220\234\'n\220\234\'m\220\234\'p\220\234\'o\220\234\'q\220\234\'1" +
-      "\220\234\'0\220\234\'/\022\223\002\n\032GetModuleVersionUsageCount\022" +
-      "/.clarifai.api.GetModuleVersionUsageCoun" +
-      "tRequest\0323.clarifai.api.SingleModuleVers" +
-      "ionUsageCountResponse\"\216\001\202\323\344\223\002x\022v/v2/user" +
+      "er_app_id.app_id}/modules/{module_id}/ve" +
+      "rsions:\001*\230\234\'\005\220\234\'-\220\234\'l\220\234\'n\220\234\'m\220\234\'p\220\234\'o\220\234\'" +
+      "q\220\234\'1\220\234\'0\220\234\'/\022\223\002\n\032GetModuleVersionUsageC" +
+      "ount\022/.clarifai.api.GetModuleVersionUsag" +
+      "eCountRequest\0323.clarifai.api.SingleModul" +
+      "eVersionUsageCountResponse\"\216\001\202\323\344\223\002x\022v/v2" +
+      "/users/{user_app_id.user_id}/apps/{user_" +
+      "app_id.app_id}/modules/{module_id}/versi" +
+      "ons/{module_version_id}/usage_count\230\234\'\005\220" +
+      "\234\'-\220\234\'m\220\234\'p\022\217\002\n\031GetInstalledModuleVersio" +
+      "n\022..clarifai.api.GetInstalledModuleVersi" +
+      "onRequest\0322.clarifai.api.SingleInstalled" +
+      "ModuleVersionResponse\"\215\001\202\323\344\223\002s\022q/v2/user" +
       "s/{user_app_id.user_id}/apps/{user_app_i" +
-      "d.app_id}/modules/{module_id}/versions/{" +
-      "module_version_id}/usage_count\230\234\'\005\220\234\'-\220\234" +
-      "\'m\220\234\'p\022\217\002\n\031GetInstalledModuleVersion\022..c" +
-      "larifai.api.GetInstalledModuleVersionReq" +
-      "uest\0322.clarifai.api.SingleInstalledModul" +
-      "eVersionResponse\"\215\001\202\323\344\223\002s\022q/v2/users/{us" +
-      "er_app_id.user_id}/apps/{user_app_id.app" +
-      "_id}/installed_module_versions/{installe" +
-      "d_module_version_id}\230\234\'\005\220\234\'-\220\234\'p\220\234\'m\220\234\'0" +
-      "\022\363\001\n\033ListInstalledModuleVersions\0220.clari" +
-      "fai.api.ListInstalledModuleVersionsReque" +
-      "st\0321.clarifai.api.MultiInstalledModuleVe" +
-      "rsionResponse\"o\202\323\344\223\002U\022S/v2/users/{user_a" +
-      "pp_id.user_id}/apps/{user_app_id.app_id}" +
-      "/installed_module_versions\230\234\'\005\220\234\'-\220\234\'p\220\234" +
-      "\'m\220\234\'0\022\366\001\n\033PostInstalledModuleVersions\0220" +
-      ".clarifai.api.PostInstalledModuleVersion" +
-      "sRequest\0321.clarifai.api.MultiInstalledMo" +
-      "duleVersionResponse\"r\202\323\344\223\002X\"S/v2/users/{" +
-      "user_app_id.user_id}/apps/{user_app_id.a" +
-      "pp_id}/installed_module_versions:\001*\230\234\'\005\220" +
-      "\234\'o\220\234\'p\220\234\'m\220\234\'-\022\373\001\n\035DeleteInstalledModul" +
-      "eVersions\0222.clarifai.api.DeleteInstalled" +
-      "ModuleVersionsRequest\032!.clarifai.api.sta" +
-      "tus.BaseResponse\"\202\001\202\323\344\223\002X*S/v2/users/{us" +
-      "er_app_id.user_id}/apps/{user_app_id.app" +
-      "_id}/installed_module_versions:\001*\230\234\'\005\220\234\'" +
-      "-\220\234\'m\220\234\'o\220\234\'p\220\234\'q\220\234\'1\220\234\'/\220\234\'0\022\225\002\n\036PostIn" +
-      "stalledModuleVersionsKey\0223.clarifai.api." +
-      "PostInstalledModuleVersionsKeyRequest\032\037." +
-      "clarifai.api.SingleKeyResponse\"\234\001\202\323\344\223\002z\"" +
-      "u/v2/users/{user_app_id.user_id}/apps/{u" +
-      "ser_app_id.app_id}/installed_module_vers" +
-      "ions/{installed_module_version_id}/key:\001" +
-      "*\230\234\'\005\220\234\'o\220\234\'p\220\234\'m\220\234\'-\220\234\'/\220\234\'0\022\365\001\n\022PostBu" +
-      "lkOperations\022\'.clarifai.api.PostBulkOper" +
-      "ationsRequest\032).clarifai.api.MultiBulkOp" +
-      "erationsResponse\"\212\001\202\323\344\223\002h\"I/v2/users/{us" +
-      "er_app_id.user_id}/apps/{user_app_id.app" +
-      "_id}/bulk_operations:\001*Z\030\"\023/v2/bulk_oper" +
-      "ations:\001*\230\234\'\002\220\234\'-\220\234\'z\220\234\'y\220\234\'%\220\234\'&\220\234\'(\022\336\001" +
-      "\n\022ListBulkOperations\022\'.clarifai.api.List" +
-      "BulkOperationsRequest\032).clarifai.api.Mul" +
-      "tiBulkOperationsResponse\"t\202\323\344\223\002b\022I/v2/us" +
+      "d.app_id}/installed_module_versions/{ins" +
+      "talled_module_version_id}\230\234\'\005\220\234\'-\220\234\'p\220\234\'" +
+      "m\220\234\'0\022\363\001\n\033ListInstalledModuleVersions\0220." +
+      "clarifai.api.ListInstalledModuleVersions" +
+      "Request\0321.clarifai.api.MultiInstalledMod" +
+      "uleVersionResponse\"o\202\323\344\223\002U\022S/v2/users/{u" +
+      "ser_app_id.user_id}/apps/{user_app_id.ap" +
+      "p_id}/installed_module_versions\230\234\'\005\220\234\'-\220" +
+      "\234\'p\220\234\'m\220\234\'0\022\366\001\n\033PostInstalledModuleVersi" +
+      "ons\0220.clarifai.api.PostInstalledModuleVe" +
+      "rsionsRequest\0321.clarifai.api.MultiInstal" +
+      "ledModuleVersionResponse\"r\202\323\344\223\002X\"S/v2/us" +
       "ers/{user_app_id.user_id}/apps/{user_app" +
-      "_id.app_id}/bulk_operationsZ\025\022\023/v2/bulk_" +
-      "operations\230\234\'\002\220\234\'-\220\234\'z\022\345\001\n\020GetBulkOperat" +
-      "ion\022%.clarifai.api.GetBulkOperationReque" +
-      "st\032*.clarifai.api.SingleBulkOperationsRe" +
-      "sponse\"~\202\323\344\223\002l\022N/v2/users/{user_app_id.u" +
-      "ser_id}/apps/{user_app_id.app_id}/bulk_o" +
-      "perations/{id}Z\032\022\030/v2/bulk_operations/{i" +
-      "d}\230\234\'\002\220\234\'-\220\234\'z\022\353\001\n\024CancelBulkOperations\022" +
-      "(.clarifai.api.CancelBulkOperationReques" +
-      "t\032).clarifai.api.MultiBulkOperationsResp" +
-      "onse\"~\202\323\344\223\002h2I/v2/users/{user_app_id.use" +
-      "r_id}/apps/{user_app_id.app_id}/bulk_ope" +
-      "rations:\001*Z\0302\023/v2/bulk_operations:\001*\230\234\'\002" +
-      "\220\234\'-\220\234\'y\220\234\'z\022\364\001\n\024DeleteBulkOperations\022(." +
-      "clarifai.api.DeleteBulkOperationRequest\032" +
-      "!.clarifai.api.status.BaseResponse\"\216\001\202\323\344" +
-      "\223\002h*I/v2/users/{user_app_id.user_id}/app" +
-      "s/{user_app_id.app_id}/bulk_operations:\001" +
-      "*Z\030*\023/v2/bulk_operations:\001*\230\234\'\002\220\234\'-\220\234\'&\220" +
-      "\234\'%\220\234\'(\220\234\'y\220\234\'z\220\234\'{\022\210\002\n\027ListNextTaskAssi" +
-      "gnments\022,.clarifai.api.ListNextTaskAssig" +
-      "nmentsRequest\032 .clarifai.api.MultiInputR" +
-      "esponse\"\234\001\202\323\344\223\002z\022U/v2/users/{user_app_id" +
-      ".user_id}/apps/{user_app_id.app_id}/task" +
-      "s/{task_id}/assignmentsZ!\022\037/v2/tasks/{ta" +
-      "sk_id}/assignments\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220\234\'\005\220\234" +
-      "\'8\220\234\'i\022\353\001\n\022PutTaskAssignments\022\'.clarifai" +
-      ".api.PutTaskAssignmentsRequest\032).clarifa" +
-      "i.api.MultiTaskAssignmentResponse\"\200\001\202\323\344\223" +
-      "\002Z\032U/v2/users/{user_app_id.user_id}/apps" +
-      "/{user_app_id.app_id}/tasks/{task_id}/as" +
-      "signments:\001*\230\234\'\002\220\234\'-\220\234\'%\220\234\'&\220\234\'\013\220\234\'\005\220\234\'8" +
-      "\220\234\'i\022\332\001\n\021ListInputsAddJobs\022&.clarifai.ap" +
-      "i.ListInputsAddJobsRequest\032\'.clarifai.ap" +
-      "i.MultiInputsAddJobResponse\"t\202\323\344\223\002b\022I/v2" +
-      "/users/{user_app_id.user_id}/apps/{user_" +
-      "app_id.app_id}/inputs/jobs/addZ\025\022\023/v2/in" +
-      "puts/jobs/add\230\234\'\002\220\234\'-\220\234\'\005\022\341\001\n\017GetInputsA" +
-      "ddJob\022$.clarifai.api.GetInputsAddJobRequ" +
-      "est\032(.clarifai.api.SingleInputsAddJobRes" +
-      "ponse\"~\202\323\344\223\002l\022N/v2/users/{user_app_id.us" +
-      "er_id}/apps/{user_app_id.app_id}/inputs/" +
-      "jobs/add/{id}Z\032\022\030/v2/inputs/jobs/add/{id" +
-      "}\230\234\'\002\220\234\'-\220\234\'\005\022\362\001\n\022CancelInputsAddJob\022\'.c" +
-      "larifai.api.CancelInputsAddJobRequest\032(." +
-      "clarifai.api.SingleInputsAddJobResponse\"" +
-      "\210\001\202\323\344\223\002r2N/v2/users/{user_app_id.user_id" +
-      "}/apps/{user_app_id.app_id}/inputs/jobs/" +
-      "add/{id}:\001*Z\0352\030/v2/inputs/jobs/add/{id}:" +
-      "\001*\230\234\'\002\220\234\'-\220\234\'\004\220\234\'\005\022\304\001\n\013PostUploads\022 .cla" +
-      "rifai.api.PostUploadsRequest\032!.clarifai." +
-      "api.MultiUploadResponse\"p\202\323\344\223\002X\"A/v2/use" +
-      "rs/{user_app_id.user_id}/apps/{user_app_" +
-      "id.app_id}/uploads:\001*Z\020\"\013/v2/uploads:\001*\230",
-      "\234\'\002\220\234\'-\220\234\'\201\001\220\234\'\200\001\022\214\002\n\025PutUploadContentPa" +
-      "rts\022*.clarifai.api.PutUploadContentParts" +
-      "Request\032\".clarifai.api.SingleUploadRespo" +
-      "nse\"\242\001\202\323\344\223\002\211\001\032[/v2/users/{user_app_id.us" +
-      "er_id}/apps/{user_app_id.app_id}/uploads" +
-      "/{upload_id}/content_parts:\001*Z\'\032%/v2/upl" +
-      "oads/{upload_id}/content_parts\230\234\'\002\220\234\'-\220\234" +
-      "\'\201\001\220\234\'\200\001\022\316\001\n\tGetUpload\022\036.clarifai.api.Ge" +
-      "tUploadRequest\032\".clarifai.api.SingleUplo" +
-      "adResponse\"}\202\323\344\223\002j\022M/v2/users/{user_app_" +
-      "id.user_id}/apps/{user_app_id.app_id}/up" +
-      "loads/{upload_id}Z\031\022\027/v2/uploads/{upload" +
-      "_id}\230\234\'\002\220\234\'-\220\234\'\200\001\022\271\001\n\013ListUploads\022 .clar" +
-      "ifai.api.ListUploadsRequest\032!.clarifai.a" +
-      "pi.MultiUploadResponse\"e\202\323\344\223\002R\022A/v2/user" +
+      "_id.app_id}/installed_module_versions:\001*" +
+      "\230\234\'\005\220\234\'o\220\234\'p\220\234\'m\220\234\'-\022\373\001\n\035DeleteInstalled" +
+      "ModuleVersions\0222.clarifai.api.DeleteInst" +
+      "alledModuleVersionsRequest\032!.clarifai.ap" +
+      "i.status.BaseResponse\"\202\001\202\323\344\223\002X*S/v2/user" +
       "s/{user_app_id.user_id}/apps/{user_app_i" +
-      "d.app_id}/uploadsZ\r\022\013/v2/uploads\230\234\'\002\220\234\'-" +
-      "\220\234\'\200\001\022\315\001\n\rDeleteUploads\022\".clarifai.api.D" +
-      "eleteUploadsRequest\032!.clarifai.api.statu" +
-      "s.BaseResponse\"u\202\323\344\223\002X*A/v2/users/{user_" +
-      "app_id.user_id}/apps/{user_app_id.app_id" +
-      "}/uploads:\001*Z\020*\013/v2/uploads:\001*\230\234\'\002\220\234\'-\220\234" +
-      "\'\200\001\220\234\'\201\001\220\234\'\202\001\022\215\002\n\025PostInputsDataSources\022" +
-      "*.clarifai.api.PostInputsDataSourcesRequ" +
-      "est\032\'.clarifai.api.MultiInputsAddJobResp" +
-      "onse\"\236\001\202\323\344\223\002p\"M/v2/users/{user_app_id.us" +
+      "d.app_id}/installed_module_versions:\001*\230\234" +
+      "\'\005\220\234\'-\220\234\'m\220\234\'o\220\234\'p\220\234\'q\220\234\'1\220\234\'/\220\234\'0\022\225\002\n\036P" +
+      "ostInstalledModuleVersionsKey\0223.clarifai" +
+      ".api.PostInstalledModuleVersionsKeyReque" +
+      "st\032\037.clarifai.api.SingleKeyResponse\"\234\001\202\323" +
+      "\344\223\002z\"u/v2/users/{user_app_id.user_id}/ap" +
+      "ps/{user_app_id.app_id}/installed_module" +
+      "_versions/{installed_module_version_id}/" +
+      "key:\001*\230\234\'\005\220\234\'o\220\234\'p\220\234\'m\220\234\'-\220\234\'/\220\234\'0\022\365\001\n\022P" +
+      "ostBulkOperations\022\'.clarifai.api.PostBul" +
+      "kOperationsRequest\032).clarifai.api.MultiB" +
+      "ulkOperationsResponse\"\212\001\202\323\344\223\002h\"I/v2/user" +
+      "s/{user_app_id.user_id}/apps/{user_app_i" +
+      "d.app_id}/bulk_operations:\001*Z\030\"\023/v2/bulk" +
+      "_operations:\001*\230\234\'\002\220\234\'-\220\234\'z\220\234\'y\220\234\'%\220\234\'&\220\234" +
+      "\'(\022\336\001\n\022ListBulkOperations\022\'.clarifai.api" +
+      ".ListBulkOperationsRequest\032).clarifai.ap" +
+      "i.MultiBulkOperationsResponse\"t\202\323\344\223\002b\022I/" +
+      "v2/users/{user_app_id.user_id}/apps/{use" +
+      "r_app_id.app_id}/bulk_operationsZ\025\022\023/v2/" +
+      "bulk_operations\230\234\'\002\220\234\'-\220\234\'z\022\345\001\n\020GetBulkO" +
+      "peration\022%.clarifai.api.GetBulkOperation" +
+      "Request\032*.clarifai.api.SingleBulkOperati" +
+      "onsResponse\"~\202\323\344\223\002l\022N/v2/users/{user_app" +
+      "_id.user_id}/apps/{user_app_id.app_id}/b" +
+      "ulk_operations/{id}Z\032\022\030/v2/bulk_operatio" +
+      "ns/{id}\230\234\'\002\220\234\'-\220\234\'z\022\353\001\n\024CancelBulkOperat" +
+      "ions\022(.clarifai.api.CancelBulkOperationR" +
+      "equest\032).clarifai.api.MultiBulkOperation",
+      "sResponse\"~\202\323\344\223\002h2I/v2/users/{user_app_i" +
+      "d.user_id}/apps/{user_app_id.app_id}/bul" +
+      "k_operations:\001*Z\0302\023/v2/bulk_operations:\001" +
+      "*\230\234\'\002\220\234\'-\220\234\'y\220\234\'z\022\364\001\n\024DeleteBulkOperatio" +
+      "ns\022(.clarifai.api.DeleteBulkOperationReq" +
+      "uest\032!.clarifai.api.status.BaseResponse\"" +
+      "\216\001\202\323\344\223\002h*I/v2/users/{user_app_id.user_id" +
+      "}/apps/{user_app_id.app_id}/bulk_operati" +
+      "ons:\001*Z\030*\023/v2/bulk_operations:\001*\230\234\'\002\220\234\'-" +
+      "\220\234\'&\220\234\'%\220\234\'(\220\234\'y\220\234\'z\220\234\'{\022\210\002\n\027ListNextTas" +
+      "kAssignments\022,.clarifai.api.ListNextTask" +
+      "AssignmentsRequest\032 .clarifai.api.MultiI" +
+      "nputResponse\"\234\001\202\323\344\223\002z\022U/v2/users/{user_a" +
+      "pp_id.user_id}/apps/{user_app_id.app_id}" +
+      "/tasks/{task_id}/assignmentsZ!\022\037/v2/task" +
+      "s/{task_id}/assignments\230\234\'\002\220\234\'-\220\234\'&\220\234\'\013\220" +
+      "\234\'\005\220\234\'8\220\234\'i\022\353\001\n\022PutTaskAssignments\022\'.cla" +
+      "rifai.api.PutTaskAssignmentsRequest\032).cl" +
+      "arifai.api.MultiTaskAssignmentResponse\"\200" +
+      "\001\202\323\344\223\002Z\032U/v2/users/{user_app_id.user_id}" +
+      "/apps/{user_app_id.app_id}/tasks/{task_i" +
+      "d}/assignments:\001*\230\234\'\002\220\234\'-\220\234\'%\220\234\'&\220\234\'\013\220\234\'" +
+      "\005\220\234\'8\220\234\'i\022\332\001\n\021ListInputsAddJobs\022&.clarif" +
+      "ai.api.ListInputsAddJobsRequest\032\'.clarif" +
+      "ai.api.MultiInputsAddJobResponse\"t\202\323\344\223\002b" +
+      "\022I/v2/users/{user_app_id.user_id}/apps/{" +
+      "user_app_id.app_id}/inputs/jobs/addZ\025\022\023/" +
+      "v2/inputs/jobs/add\230\234\'\002\220\234\'-\220\234\'\005\022\341\001\n\017GetIn" +
+      "putsAddJob\022$.clarifai.api.GetInputsAddJo" +
+      "bRequest\032(.clarifai.api.SingleInputsAddJ" +
+      "obResponse\"~\202\323\344\223\002l\022N/v2/users/{user_app_" +
+      "id.user_id}/apps/{user_app_id.app_id}/in" +
+      "puts/jobs/add/{id}Z\032\022\030/v2/inputs/jobs/ad" +
+      "d/{id}\230\234\'\002\220\234\'-\220\234\'\005\022\362\001\n\022CancelInputsAddJo" +
+      "b\022\'.clarifai.api.CancelInputsAddJobReque" +
+      "st\032(.clarifai.api.SingleInputsAddJobResp" +
+      "onse\"\210\001\202\323\344\223\002r2N/v2/users/{user_app_id.us" +
       "er_id}/apps/{user_app_id.app_id}/inputs/" +
-      "data_sources:\001*Z\034\"\027/v2/inputs/data_sourc" +
-      "es:\001*\230\234\'\002\220\234\'-\220\234\'%\220\234\'&\220\234\'\013\220\234\'\004\220\234\'\005\220\234\'\017\220\234\'" +
-      "\002\220\234\'\023\022\262\002\n\026GetInputsExtractionJob\022+.clari" +
-      "fai.api.GetInputsExtractionJobRequest\032/." +
-      "clarifai.api.SingleInputsExtractionJobRe" +
-      "sponse\"\271\001\202\323\344\223\002\246\001\022k/v2/users/{user_app_id" +
-      ".user_id}/apps/{user_app_id.app_id}/inpu" +
-      "ts/jobs/extraction/{inputs_extraction_jo" +
-      "b_id}Z7\0225/v2/inputs/jobs/extraction/{inp" +
-      "uts_extraction_job_id}\230\234\'\002\220\234\'-\220\234\'\005\022\376\001\n\030L" +
-      "istInputsExtractionJobs\022-.clarifai.api.L" +
-      "istInputsExtractionJobsRequest\032..clarifa" +
-      "i.api.MultiInputsExtractionJobResponse\"\202" +
-      "\001\202\323\344\223\002p\022P/v2/users/{user_app_id.user_id}" +
-      "/apps/{user_app_id.app_id}/inputs/jobs/e" +
-      "xtractionZ\034\022\032/v2/inputs/jobs/extraction\230" +
-      "\234\'\002\220\234\'-\220\234\'\005\022\214\002\n\032CancelInputsExtractionJo" +
-      "bs\022/.clarifai.api.CancelInputsExtraction" +
-      "JobsRequest\032..clarifai.api.MultiInputsEx" +
-      "tractionJobResponse\"\214\001\202\323\344\223\002v2P/v2/users/" +
-      "{user_app_id.user_id}/apps/{user_app_id." +
-      "app_id}/inputs/jobs/extraction:\001*Z\0372\032/v2" +
-      "/inputs/jobs/extraction:\001*\230\234\'\002\220\234\'-\220\234\'\004\220\234" +
-      "\'\005\022\205\002\n\021PostInputsUploads\022&.clarifai.api." +
-      "PostInputsUploadsRequest\032\'.clarifai.api." +
-      "MultiInputsAddJobResponse\"\236\001\202\323\344\223\002f\"H/v2/" +
-      "users/{user_app_id.user_id}/apps/{user_a" +
-      "pp_id.app_id}/inputs/uploads:\001*Z\027\"\022/v2/i" +
-      "nputs/uploads:\001*\230\234\'\002\220\234\'-\220\234\'%\220\234\'&\220\234\'\013\220\234\'\004" +
-      "\220\234\'\005\220\234\'\017\220\234\'\002\220\234\'\023\220\234\'\201\001\220\234\'\200\001\022\231\001\n\tGetRunner" +
-      "\022\036.clarifai.api.GetRunnerRequest\032\".clari" +
-      "fai.api.SingleRunnerResponse\"H\202\323\344\223\0025\0223/v" +
-      "2/users/{user_app_id.user_id}/runners/{r" +
-      "unner_id}\230\234\'\005\220\234\'-\220\234\'\203\001\022\220\001\n\013ListRunners\022 " +
-      ".clarifai.api.ListRunnersRequest\032!.clari" +
-      "fai.api.MultiRunnerResponse\"<\202\323\344\223\002)\022\'/v2" +
-      "/users/{user_app_id.user_id}/runners\230\234\'\005" +
-      "\220\234\'-\220\234\'\203\001\022\230\001\n\013PostRunners\022 .clarifai.api" +
-      ".PostRunnersRequest\032!.clarifai.api.Multi" +
-      "RunnerResponse\"D\202\323\344\223\002,\"\'/v2/users/{user_" +
-      "app_id.user_id}/runners:\001*\230\234\'\005\220\234\'-\220\234\'\203\001\220" +
-      "\234\'\204\001\022\241\001\n\rDeleteRunners\022\".clarifai.api.De" +
-      "leteRunnersRequest\032!.clarifai.api.status" +
-      ".BaseResponse\"I\202\323\344\223\002,*\'/v2/users/{user_a" +
-      "pp_id.user_id}/runners:\001*\230\234\'\005\220\234\'-\220\234\'\203\001\220\234" +
-      "\'\204\001\220\234\'\205\001\022\263\001\n\017ListRunnerItems\022$.clarifai." +
-      "api.ListRunnerItemsRequest\032%.clarifai.ap" +
-      "i.MultiRunnerItemResponse\"S\202\323\344\223\002;\0229/v2/u" +
-      "sers/{user_app_id.user_id}/runners/{runn" +
-      "er_id}/items\230\234\'\005\220\234\'-\220\234\'\203\001\220\234\'\206\001\022\346\001\n\025PostR" +
-      "unnerItemOutputs\022*.clarifai.api.PostRunn" +
-      "erItemOutputsRequest\032+.clarifai.api.Mult" +
-      "iRunnerItemOutputResponse\"t\202\323\344\223\002W\"R/v2/u" +
-      "sers/{user_app_id.user_id}/runners/{runn" +
-      "er_id}/items/{runner_item_id}/outputs:\001*" +
-      "\230\234\'\005\220\234\'-\220\234\'\203\001\220\234\'\206\001\220\234\'\207\001\022\250\001\n\022ProcessRunne" +
-      "rItems\022*.clarifai.api.PostRunnerItemOutp" +
-      "utsRequest\032%.clarifai.api.MultiRunnerIte" +
-      "mResponse\";\202\323\344\223\002\036\"\031/v2/runners/items/pro" +
-      "cess:\001*\230\234\'\005\220\234\'-\220\234\'\203\001\220\234\'\206\001\220\234\'\207\001(\0010\001\022\304\002\n%P" +
-      "ostModelVersionsTrainingTimeEstimate\022:.c" +
-      "larifai.api.PostModelVersionsTrainingTim" +
-      "eEstimateRequest\032/.clarifai.api.MultiTra" +
-      "iningTimeEstimateResponse\"\255\001\202\323\344\223\002\232\001\"b/v2" +
+      "jobs/add/{id}:\001*Z\0352\030/v2/inputs/jobs/add/" +
+      "{id}:\001*\230\234\'\002\220\234\'-\220\234\'\004\220\234\'\005\022\304\001\n\013PostUploads\022" +
+      " .clarifai.api.PostUploadsRequest\032!.clar" +
+      "ifai.api.MultiUploadResponse\"p\202\323\344\223\002X\"A/v" +
+      "2/users/{user_app_id.user_id}/apps/{user" +
+      "_app_id.app_id}/uploads:\001*Z\020\"\013/v2/upload" +
+      "s:\001*\230\234\'\002\220\234\'-\220\234\'\201\001\220\234\'\200\001\022\214\002\n\025PutUploadCont" +
+      "entParts\022*.clarifai.api.PutUploadContent" +
+      "PartsRequest\032\".clarifai.api.SingleUpload" +
+      "Response\"\242\001\202\323\344\223\002\211\001\032[/v2/users/{user_app_" +
+      "id.user_id}/apps/{user_app_id.app_id}/up" +
+      "loads/{upload_id}/content_parts:\001*Z\'\032%/v" +
+      "2/uploads/{upload_id}/content_parts\230\234\'\002\220" +
+      "\234\'-\220\234\'\201\001\220\234\'\200\001\022\316\001\n\tGetUpload\022\036.clarifai.a" +
+      "pi.GetUploadRequest\032\".clarifai.api.Singl" +
+      "eUploadResponse\"}\202\323\344\223\002j\022M/v2/users/{user" +
+      "_app_id.user_id}/apps/{user_app_id.app_i" +
+      "d}/uploads/{upload_id}Z\031\022\027/v2/uploads/{u" +
+      "pload_id}\230\234\'\002\220\234\'-\220\234\'\200\001\022\271\001\n\013ListUploads\022 " +
+      ".clarifai.api.ListUploadsRequest\032!.clari" +
+      "fai.api.MultiUploadResponse\"e\202\323\344\223\002R\022A/v2" +
       "/users/{user_app_id.user_id}/apps/{user_" +
-      "app_id.app_id}/models/{model_id}/version" +
-      "s/time_estimate:\001*Z1\",/v2/models/{model_" +
-      "id}/versions/time_estimate:\001*\230\234\'\002\220\234\'-\220\234\'" +
-      "\017BY\n\025com.clarifai.grpc.apiP\001Z7github.com" +
-      "/Clarifai/clarifai-go-grpc/proto/clarifa" +
-      "i/api\242\002\004CAIPb\006proto3"
+      "app_id.app_id}/uploadsZ\r\022\013/v2/uploads\230\234\'" +
+      "\002\220\234\'-\220\234\'\200\001\022\315\001\n\rDeleteUploads\022\".clarifai." +
+      "api.DeleteUploadsRequest\032!.clarifai.api." +
+      "status.BaseResponse\"u\202\323\344\223\002X*A/v2/users/{" +
+      "user_app_id.user_id}/apps/{user_app_id.a" +
+      "pp_id}/uploads:\001*Z\020*\013/v2/uploads:\001*\230\234\'\002\220" +
+      "\234\'-\220\234\'\200\001\220\234\'\201\001\220\234\'\202\001\022\215\002\n\025PostInputsDataSou" +
+      "rces\022*.clarifai.api.PostInputsDataSource" +
+      "sRequest\032\'.clarifai.api.MultiInputsAddJo" +
+      "bResponse\"\236\001\202\323\344\223\002p\"M/v2/users/{user_app_" +
+      "id.user_id}/apps/{user_app_id.app_id}/in" +
+      "puts/data_sources:\001*Z\034\"\027/v2/inputs/data_" +
+      "sources:\001*\230\234\'\002\220\234\'-\220\234\'%\220\234\'&\220\234\'\013\220\234\'\004\220\234\'\005\220\234" +
+      "\'\017\220\234\'\002\220\234\'\023\022\262\002\n\026GetInputsExtractionJob\022+." +
+      "clarifai.api.GetInputsExtractionJobReque" +
+      "st\032/.clarifai.api.SingleInputsExtraction" +
+      "JobResponse\"\271\001\202\323\344\223\002\246\001\022k/v2/users/{user_a" +
+      "pp_id.user_id}/apps/{user_app_id.app_id}" +
+      "/inputs/jobs/extraction/{inputs_extracti" +
+      "on_job_id}Z7\0225/v2/inputs/jobs/extraction" +
+      "/{inputs_extraction_job_id}\230\234\'\002\220\234\'-\220\234\'\005\022" +
+      "\376\001\n\030ListInputsExtractionJobs\022-.clarifai." +
+      "api.ListInputsExtractionJobsRequest\032..cl" +
+      "arifai.api.MultiInputsExtractionJobRespo" +
+      "nse\"\202\001\202\323\344\223\002p\022P/v2/users/{user_app_id.use" +
+      "r_id}/apps/{user_app_id.app_id}/inputs/j" +
+      "obs/extractionZ\034\022\032/v2/inputs/jobs/extrac" +
+      "tion\230\234\'\002\220\234\'-\220\234\'\005\022\214\002\n\032CancelInputsExtract" +
+      "ionJobs\022/.clarifai.api.CancelInputsExtra" +
+      "ctionJobsRequest\032..clarifai.api.MultiInp" +
+      "utsExtractionJobResponse\"\214\001\202\323\344\223\002v2P/v2/u" +
+      "sers/{user_app_id.user_id}/apps/{user_ap" +
+      "p_id.app_id}/inputs/jobs/extraction:\001*Z\037" +
+      "2\032/v2/inputs/jobs/extraction:\001*\230\234\'\002\220\234\'-\220" +
+      "\234\'\004\220\234\'\005\022\205\002\n\021PostInputsUploads\022&.clarifai" +
+      ".api.PostInputsUploadsRequest\032\'.clarifai" +
+      ".api.MultiInputsAddJobResponse\"\236\001\202\323\344\223\002f\"" +
+      "H/v2/users/{user_app_id.user_id}/apps/{u" +
+      "ser_app_id.app_id}/inputs/uploads:\001*Z\027\"\022" +
+      "/v2/inputs/uploads:\001*\230\234\'\002\220\234\'-\220\234\'%\220\234\'&\220\234\'" +
+      "\013\220\234\'\004\220\234\'\005\220\234\'\017\220\234\'\002\220\234\'\023\220\234\'\201\001\220\234\'\200\001\022\277\001\n\tGetR" +
+      "unner\022\036.clarifai.api.GetRunnerRequest\032\"." +
+      "clarifai.api.SingleRunnerResponse\"n\202\323\344\223\002" +
+      "M\022K/v2/users/{user_app_id.user_id}/nodep" +
+      "ools/{nodepool_id}/runners/{runner_id}\230\234" +
+      "\'\005\220\234\'\203\001\220\234\'\017\220\234\'\023\220\234\'\210\001\220\234\'\213\001\022\266\001\n\013ListRunner" +
+      "s\022 .clarifai.api.ListRunnersRequest\032!.cl" +
+      "arifai.api.MultiRunnerResponse\"b\202\323\344\223\002A\022?" +
+      "/v2/users/{user_app_id.user_id}/nodepool" +
+      "s/{nodepool_id}/runners\230\234\'\005\220\234\'\203\001\220\234\'\017\220\234\'\023" +
+      "\220\234\'\210\001\220\234\'\213\001\022\302\001\n\013PostRunners\022 .clarifai.ap" +
+      "i.PostRunnersRequest\032!.clarifai.api.Mult" +
+      "iRunnerResponse\"n\202\323\344\223\002D\"?/v2/users/{user" +
+      "_app_id.user_id}/nodepools/{nodepool_id}" +
+      "/runners:\001*\230\234\'\005\220\234\'\203\001\220\234\'\204\001\220\234\'\017\220\234\'\023\220\234\'-\220\234\'" +
+      "\210\001\220\234\'\213\001\022\307\001\n\rDeleteRunners\022\".clarifai.api" +
+      ".DeleteRunnersRequest\032!.clarifai.api.sta" +
+      "tus.BaseResponse\"o\202\323\344\223\002D*?/v2/users/{use" +
+      "r_app_id.user_id}/nodepools/{nodepool_id" +
+      "}/runners:\001*\230\234\'\005\220\234\'\203\001\220\234\'\204\001\220\234\'\205\001\220\234\'\017\220\234\'\023\220" +
+      "\234\'\210\001\220\234\'\213\001\022\307\001\n\017ListRunnerItems\022$.clarifai" +
+      ".api.ListRunnerItemsRequest\032%.clarifai.a" +
+      "pi.MultiRunnerItemResponse\"g\202\323\344\223\002S\022Q/v2/" +
+      "users/{user_app_id.user_id}/nodepools/{n" +
+      "odepool_id}/runners/{runner_id}/items\230\234\'" +
+      "\005\220\234\'\203\001\220\234\'\206\001\022\373\001\n\025PostRunnerItemOutputs\022*." +
+      "clarifai.api.PostRunnerItemOutputsReques" +
+      "t\032+.clarifai.api.MultiRunnerItemOutputRe" +
+      "sponse\"\210\001\202\323\344\223\002o\"j/v2/users/{user_app_id." +
+      "user_id}/nodepools/{nodepool_id}/runners" +
+      "/{runner_id}/items/{runner_item_id}/outp" +
+      "uts:\001*\230\234\'\005\220\234\'\203\001\220\234\'\206\001\220\234\'\207\001\022\250\001\n\022ProcessRun" +
+      "nerItems\022*.clarifai.api.PostRunnerItemOu" +
+      "tputsRequest\032%.clarifai.api.MultiRunnerI" +
+      "temResponse\";\202\323\344\223\002\036\"\031/v2/runners/items/p" +
+      "rocess:\001*\230\234\'\005\220\234\'-\220\234\'\203\001\220\234\'\206\001\220\234\'\207\001(\0010\001\022\304\002\n" +
+      "%PostModelVersionsTrainingTimeEstimate\022:" +
+      ".clarifai.api.PostModelVersionsTrainingT" +
+      "imeEstimateRequest\032/.clarifai.api.MultiT" +
+      "rainingTimeEstimateResponse\"\255\001\202\323\344\223\002\232\001\"b/" +
+      "v2/users/{user_app_id.user_id}/apps/{use" +
+      "r_app_id.app_id}/models/{model_id}/versi" +
+      "ons/time_estimate:\001*Z1\",/v2/models/{mode" +
+      "l_id}/versions/time_estimate:\001*\230\234\'\002\220\234\'-\220" +
+      "\234\'\017\022\277\001\n\021GetComputeCluster\022&.clarifai.api" +
+      ".GetComputeClusterRequest\032*.clarifai.api" +
+      ".SingleComputeClusterResponse\"V\202\323\344\223\002G\022E/" +
+      "v2/users/{user_app_id.user_id}/compute_c" +
+      "lusters/{compute_cluster_id}\230\234\'\005\220\234\'\213\001\022\255\001" +
+      "\n\023ListComputeClusters\022(.clarifai.api.Lis" +
+      "tComputeClustersRequest\032).clarifai.api.M" +
+      "ultiComputeClusterResponse\"A\202\323\344\223\0022\0220/v2/" +
+      "users/{user_app_id.user_id}/compute_clus" +
+      "ters\230\234\'\005\220\234\'\213\001\022\265\001\n\023PostComputeClusters\022(." +
+      "clarifai.api.PostComputeClustersRequest\032" +
+      ").clarifai.api.MultiComputeClusterRespon" +
+      "se\"I\202\323\344\223\0025\"0/v2/users/{user_app_id.user_" +
+      "id}/compute_clusters:\001*\230\234\'\005\220\234\'\213\001\220\234\'\214\001\022\305\001" +
+      "\n\025DeleteComputeClusters\022*.clarifai.api.D" +
+      "eleteComputeClustersRequest\032!.clarifai.a" +
+      "pi.status.BaseResponse\"]\202\323\344\223\0025*0/v2/user" +
+      "s/{user_app_id.user_id}/compute_clusters" +
+      ":\001*\230\234\'\005\220\234\'\213\001\220\234\'\214\001\220\234\'\215\001\220\234\'\210\001\220\234\'\211\001\220\234\'\212\001\022\312\001" +
+      "\n\013GetNodepool\022 .clarifai.api.GetNodepool" +
+      "Request\032$.clarifai.api.SingleNodepoolRes" +
+      "ponse\"s\202\323\344\223\002_\022]/v2/users/{user_app_id.us" +
+      "er_id}/compute_clusters/{compute_cluster" +
+      "_id}/nodepools/{nodepool_id}\230\234\'\005\220\234\'\210\001\220\234\'" +
+      "\213\001\022\277\001\n\rListNodepools\022\".clarifai.api.List" +
+      "NodepoolsRequest\032#.clarifai.api.MultiNod" +
+      "epoolResponse\"e\202\323\344\223\002Q\022O/v2/users/{user_a" +
+      "pp_id.user_id}/compute_clusters/{compute" +
+      "_cluster_id}/nodepools\230\234\'\005\220\234\'\210\001\220\234\'\213\001\022\307\001\n" +
+      "\rPostNodepools\022\".clarifai.api.PostNodepo" +
+      "olsRequest\032#.clarifai.api.MultiNodepoolR" +
+      "esponse\"m\202\323\344\223\002T\"O/v2/users/{user_app_id." +
+      "user_id}/compute_clusters/{compute_clust" +
+      "er_id}/nodepools:\001*\230\234\'\005\220\234\'\210\001\220\234\'\211\001\220\234\'\213\001\022\311" +
+      "\001\n\016PatchNodepools\022#.clarifai.api.PatchNo" +
+      "depoolsRequest\032#.clarifai.api.MultiNodep" +
+      "oolResponse\"m\202\323\344\223\002T2O/v2/users/{user_app" +
+      "_id.user_id}/compute_clusters/{compute_c" +
+      "luster_id}/nodepools:\001*\230\234\'\005\220\234\'\211\001\220\234\'\210\001\220\234\'" +
+      "\213\001\022\330\001\n\017DeleteNodepools\022$.clarifai.api.De" +
+      "leteNodepoolsRequest\032!.clarifai.api.stat" +
+      "us.BaseResponse\"|\202\323\344\223\002T*O/v2/users/{user" +
+      "_app_id.user_id}/compute_clusters/{compu" +
+      "te_cluster_id}/nodepools:\001*\230\234\'\005\220\234\'\210\001\220\234\'\211" +
+      "\001\220\234\'\212\001\220\234\'\203\001\220\234\'\204\001\220\234\'\205\001BY\n\025com.clarifai.gr" +
+      "pc.apiP\001Z7github.com/Clarifai/clarifai-g" +
+      "o-grpc/proto/clarifai/api\242\002\004CAIPb\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -5045,7 +5203,7 @@ public static void registerAllExtensions(
     internal_static_clarifai_api_PostModelVersionsUploadConfig_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_PostModelVersionsUploadConfig_descriptor,
-        new java.lang.String[] { "UserAppId", "ModelId", "ModelVersion", "TotalSize", });
+        new java.lang.String[] { "UserAppId", "ModelId", "ModelVersion", "TotalSize", "IsV3", });
     internal_static_clarifai_api_PutModelVersionExportsRequest_descriptor =
       getDescriptor().getMessageTypes().get(140);
     internal_static_clarifai_api_PutModelVersionExportsRequest_fieldAccessorTable = new
@@ -6131,25 +6289,25 @@ public static void registerAllExtensions(
     internal_static_clarifai_api_GetRunnerRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_GetRunnerRequest_descriptor,
-        new java.lang.String[] { "UserAppId", "RunnerId", });
+        new java.lang.String[] { "UserAppId", "NodepoolId", "RunnerId", });
     internal_static_clarifai_api_ListRunnersRequest_descriptor =
       getDescriptor().getMessageTypes().get(321);
     internal_static_clarifai_api_ListRunnersRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_ListRunnersRequest_descriptor,
-        new java.lang.String[] { "UserAppId", "Page", "PerPage", });
+        new java.lang.String[] { "UserAppId", "NodepoolId", "Page", "PerPage", });
     internal_static_clarifai_api_PostRunnersRequest_descriptor =
       getDescriptor().getMessageTypes().get(322);
     internal_static_clarifai_api_PostRunnersRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_PostRunnersRequest_descriptor,
-        new java.lang.String[] { "UserAppId", "Runners", });
+        new java.lang.String[] { "UserAppId", "NodepoolId", "Runners", });
     internal_static_clarifai_api_DeleteRunnersRequest_descriptor =
       getDescriptor().getMessageTypes().get(323);
     internal_static_clarifai_api_DeleteRunnersRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_DeleteRunnersRequest_descriptor,
-        new java.lang.String[] { "UserAppId", "Ids", });
+        new java.lang.String[] { "UserAppId", "NodepoolId", "Ids", });
     internal_static_clarifai_api_SingleRunnerResponse_descriptor =
       getDescriptor().getMessageTypes().get(324);
     internal_static_clarifai_api_SingleRunnerResponse_fieldAccessorTable = new
@@ -6167,13 +6325,13 @@ public static void registerAllExtensions(
     internal_static_clarifai_api_ListRunnerItemsRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_ListRunnerItemsRequest_descriptor,
-        new java.lang.String[] { "UserAppId", "RunnerId", });
+        new java.lang.String[] { "UserAppId", "NodepoolId", "RunnerId", });
     internal_static_clarifai_api_PostRunnerItemOutputsRequest_descriptor =
       getDescriptor().getMessageTypes().get(327);
     internal_static_clarifai_api_PostRunnerItemOutputsRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_PostRunnerItemOutputsRequest_descriptor,
-        new java.lang.String[] { "UserAppId", "RunnerId", "RunnerItemId", "RunnerItemOutputs", "Status", });
+        new java.lang.String[] { "UserAppId", "NodepoolId", "RunnerId", "RunnerItemId", "RunnerItemOutputs", "Status", });
     internal_static_clarifai_api_MultiRunnerItemResponse_descriptor =
       getDescriptor().getMessageTypes().get(328);
     internal_static_clarifai_api_MultiRunnerItemResponse_fieldAccessorTable = new
@@ -6210,6 +6368,84 @@ public static void registerAllExtensions(
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_clarifai_api_MultiTrainingTimeEstimateResponse_descriptor,
         new java.lang.String[] { "Status", "TrainingTimeEstimates", });
+    internal_static_clarifai_api_GetComputeClusterRequest_descriptor =
+      getDescriptor().getMessageTypes().get(334);
+    internal_static_clarifai_api_GetComputeClusterRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_GetComputeClusterRequest_descriptor,
+        new java.lang.String[] { "UserAppId", "ComputeClusterId", });
+    internal_static_clarifai_api_ListComputeClustersRequest_descriptor =
+      getDescriptor().getMessageTypes().get(335);
+    internal_static_clarifai_api_ListComputeClustersRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_ListComputeClustersRequest_descriptor,
+        new java.lang.String[] { "UserAppId", "Page", "PerPage", });
+    internal_static_clarifai_api_PostComputeClustersRequest_descriptor =
+      getDescriptor().getMessageTypes().get(336);
+    internal_static_clarifai_api_PostComputeClustersRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_PostComputeClustersRequest_descriptor,
+        new java.lang.String[] { "UserAppId", "ComputeClusters", });
+    internal_static_clarifai_api_DeleteComputeClustersRequest_descriptor =
+      getDescriptor().getMessageTypes().get(337);
+    internal_static_clarifai_api_DeleteComputeClustersRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_DeleteComputeClustersRequest_descriptor,
+        new java.lang.String[] { "UserAppId", "Ids", });
+    internal_static_clarifai_api_SingleComputeClusterResponse_descriptor =
+      getDescriptor().getMessageTypes().get(338);
+    internal_static_clarifai_api_SingleComputeClusterResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_SingleComputeClusterResponse_descriptor,
+        new java.lang.String[] { "Status", "ComputeCluster", });
+    internal_static_clarifai_api_MultiComputeClusterResponse_descriptor =
+      getDescriptor().getMessageTypes().get(339);
+    internal_static_clarifai_api_MultiComputeClusterResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_MultiComputeClusterResponse_descriptor,
+        new java.lang.String[] { "Status", "ComputeClusters", });
+    internal_static_clarifai_api_GetNodepoolRequest_descriptor =
+      getDescriptor().getMessageTypes().get(340);
+    internal_static_clarifai_api_GetNodepoolRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_GetNodepoolRequest_descriptor,
+        new java.lang.String[] { "UserAppId", "ComputeClusterId", "NodepoolId", });
+    internal_static_clarifai_api_ListNodepoolsRequest_descriptor =
+      getDescriptor().getMessageTypes().get(341);
+    internal_static_clarifai_api_ListNodepoolsRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_ListNodepoolsRequest_descriptor,
+        new java.lang.String[] { "UserAppId", "ComputeClusterId", "Page", "PerPage", });
+    internal_static_clarifai_api_PostNodepoolsRequest_descriptor =
+      getDescriptor().getMessageTypes().get(342);
+    internal_static_clarifai_api_PostNodepoolsRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_PostNodepoolsRequest_descriptor,
+        new java.lang.String[] { "UserAppId", "ComputeClusterId", "Nodepools", });
+    internal_static_clarifai_api_PatchNodepoolsRequest_descriptor =
+      getDescriptor().getMessageTypes().get(343);
+    internal_static_clarifai_api_PatchNodepoolsRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_PatchNodepoolsRequest_descriptor,
+        new java.lang.String[] { "UserAppId", "ComputeClusterId", "Nodepools", "Action", });
+    internal_static_clarifai_api_DeleteNodepoolsRequest_descriptor =
+      getDescriptor().getMessageTypes().get(344);
+    internal_static_clarifai_api_DeleteNodepoolsRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_DeleteNodepoolsRequest_descriptor,
+        new java.lang.String[] { "UserAppId", "ComputeClusterId", "Ids", });
+    internal_static_clarifai_api_SingleNodepoolResponse_descriptor =
+      getDescriptor().getMessageTypes().get(345);
+    internal_static_clarifai_api_SingleNodepoolResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_SingleNodepoolResponse_descriptor,
+        new java.lang.String[] { "Status", "Nodepool", });
+    internal_static_clarifai_api_MultiNodepoolResponse_descriptor =
+      getDescriptor().getMessageTypes().get(346);
+    internal_static_clarifai_api_MultiNodepoolResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_clarifai_api_MultiNodepoolResponse_descriptor,
+        new java.lang.String[] { "Status", "Nodepools", });
     com.google.protobuf.ExtensionRegistry registry =
         com.google.protobuf.ExtensionRegistry.newInstance();
     registry.add(com.clarifai.grpc.api.utils.Extensions.clShowIfEmpty);
diff --git a/src/main/java/com/clarifai/grpc/api/SingleComputeClusterResponse.java b/src/main/java/com/clarifai/grpc/api/SingleComputeClusterResponse.java
new file mode 100644
index 0000000..ae2157f
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/SingleComputeClusterResponse.java
@@ -0,0 +1,797 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * Protobuf type {@code clarifai.api.SingleComputeClusterResponse}
+ */
+public final class SingleComputeClusterResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.SingleComputeClusterResponse)
+    SingleComputeClusterResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use SingleComputeClusterResponse.newBuilder() to construct.
+  private SingleComputeClusterResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private SingleComputeClusterResponse() {
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new SingleComputeClusterResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private SingleComputeClusterResponse(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.status.Status.Builder subBuilder = null;
+            if (status_ != null) {
+              subBuilder = status_.toBuilder();
+            }
+            status_ = input.readMessage(com.clarifai.grpc.api.status.Status.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(status_);
+              status_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            com.clarifai.grpc.api.ComputeCluster.Builder subBuilder = null;
+            if (computeCluster_ != null) {
+              subBuilder = computeCluster_.toBuilder();
+            }
+            computeCluster_ = input.readMessage(com.clarifai.grpc.api.ComputeCluster.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(computeCluster_);
+              computeCluster_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_SingleComputeClusterResponse_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_SingleComputeClusterResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.SingleComputeClusterResponse.class, com.clarifai.grpc.api.SingleComputeClusterResponse.Builder.class);
+  }
+
+  public static final int STATUS_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.status.Status status_;
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return Whether the status field is set.
+   */
+  @java.lang.Override
+  public boolean hasStatus() {
+    return status_ != null;
+  }
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return The status.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.status.Status getStatus() {
+    return status_ == null ? com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+  }
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder() {
+    return getStatus();
+  }
+
+  public static final int COMPUTE_CLUSTER_FIELD_NUMBER = 2;
+  private com.clarifai.grpc.api.ComputeCluster computeCluster_;
+  /**
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+   * @return Whether the computeCluster field is set.
+   */
+  @java.lang.Override
+  public boolean hasComputeCluster() {
+    return computeCluster_ != null;
+  }
+  /**
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+   * @return The computeCluster.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.ComputeCluster getComputeCluster() {
+    return computeCluster_ == null ? com.clarifai.grpc.api.ComputeCluster.getDefaultInstance() : computeCluster_;
+  }
+  /**
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClusterOrBuilder() {
+    return getComputeCluster();
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (status_ != null) {
+      output.writeMessage(1, getStatus());
+    }
+    if (computeCluster_ != null) {
+      output.writeMessage(2, getComputeCluster());
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (status_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getStatus());
+    }
+    if (computeCluster_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, getComputeCluster());
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.SingleComputeClusterResponse)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.SingleComputeClusterResponse other = (com.clarifai.grpc.api.SingleComputeClusterResponse) obj;
+
+    if (hasStatus() != other.hasStatus()) return false;
+    if (hasStatus()) {
+      if (!getStatus()
+          .equals(other.getStatus())) return false;
+    }
+    if (hasComputeCluster() != other.hasComputeCluster()) return false;
+    if (hasComputeCluster()) {
+      if (!getComputeCluster()
+          .equals(other.getComputeCluster())) return false;
+    }
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasStatus()) {
+      hash = (37 * hash) + STATUS_FIELD_NUMBER;
+      hash = (53 * hash) + getStatus().hashCode();
+    }
+    if (hasComputeCluster()) {
+      hash = (37 * hash) + COMPUTE_CLUSTER_FIELD_NUMBER;
+      hash = (53 * hash) + getComputeCluster().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.SingleComputeClusterResponse prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code clarifai.api.SingleComputeClusterResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.SingleComputeClusterResponse)
+      com.clarifai.grpc.api.SingleComputeClusterResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_SingleComputeClusterResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_SingleComputeClusterResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.SingleComputeClusterResponse.class, com.clarifai.grpc.api.SingleComputeClusterResponse.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.SingleComputeClusterResponse.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (statusBuilder_ == null) {
+        status_ = null;
+      } else {
+        status_ = null;
+        statusBuilder_ = null;
+      }
+      if (computeClusterBuilder_ == null) {
+        computeCluster_ = null;
+      } else {
+        computeCluster_ = null;
+        computeClusterBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_SingleComputeClusterResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.SingleComputeClusterResponse getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.SingleComputeClusterResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.SingleComputeClusterResponse build() {
+      com.clarifai.grpc.api.SingleComputeClusterResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.SingleComputeClusterResponse buildPartial() {
+      com.clarifai.grpc.api.SingleComputeClusterResponse result = new com.clarifai.grpc.api.SingleComputeClusterResponse(this);
+      if (statusBuilder_ == null) {
+        result.status_ = status_;
+      } else {
+        result.status_ = statusBuilder_.build();
+      }
+      if (computeClusterBuilder_ == null) {
+        result.computeCluster_ = computeCluster_;
+      } else {
+        result.computeCluster_ = computeClusterBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.SingleComputeClusterResponse) {
+        return mergeFrom((com.clarifai.grpc.api.SingleComputeClusterResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.SingleComputeClusterResponse other) {
+      if (other == com.clarifai.grpc.api.SingleComputeClusterResponse.getDefaultInstance()) return this;
+      if (other.hasStatus()) {
+        mergeStatus(other.getStatus());
+      }
+      if (other.hasComputeCluster()) {
+        mergeComputeCluster(other.getComputeCluster());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.SingleComputeClusterResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.SingleComputeClusterResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private com.clarifai.grpc.api.status.Status status_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder> statusBuilder_;
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     * @return Whether the status field is set.
+     */
+    public boolean hasStatus() {
+      return statusBuilder_ != null || status_ != null;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     * @return The status.
+     */
+    public com.clarifai.grpc.api.status.Status getStatus() {
+      if (statusBuilder_ == null) {
+        return status_ == null ? com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+      } else {
+        return statusBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder setStatus(com.clarifai.grpc.api.status.Status value) {
+      if (statusBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        status_ = value;
+        onChanged();
+      } else {
+        statusBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder setStatus(
+        com.clarifai.grpc.api.status.Status.Builder builderForValue) {
+      if (statusBuilder_ == null) {
+        status_ = builderForValue.build();
+        onChanged();
+      } else {
+        statusBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder mergeStatus(com.clarifai.grpc.api.status.Status value) {
+      if (statusBuilder_ == null) {
+        if (status_ != null) {
+          status_ =
+            com.clarifai.grpc.api.status.Status.newBuilder(status_).mergeFrom(value).buildPartial();
+        } else {
+          status_ = value;
+        }
+        onChanged();
+      } else {
+        statusBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder clearStatus() {
+      if (statusBuilder_ == null) {
+        status_ = null;
+        onChanged();
+      } else {
+        status_ = null;
+        statusBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public com.clarifai.grpc.api.status.Status.Builder getStatusBuilder() {
+      
+      onChanged();
+      return getStatusFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder() {
+      if (statusBuilder_ != null) {
+        return statusBuilder_.getMessageOrBuilder();
+      } else {
+        return status_ == null ?
+            com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder> 
+        getStatusFieldBuilder() {
+      if (statusBuilder_ == null) {
+        statusBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder>(
+                getStatus(),
+                getParentForChildren(),
+                isClean());
+        status_ = null;
+      }
+      return statusBuilder_;
+    }
+
+    private com.clarifai.grpc.api.ComputeCluster computeCluster_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder> computeClusterBuilder_;
+    /**
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+     * @return Whether the computeCluster field is set.
+     */
+    public boolean hasComputeCluster() {
+      return computeClusterBuilder_ != null || computeCluster_ != null;
+    }
+    /**
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+     * @return The computeCluster.
+     */
+    public com.clarifai.grpc.api.ComputeCluster getComputeCluster() {
+      if (computeClusterBuilder_ == null) {
+        return computeCluster_ == null ? com.clarifai.grpc.api.ComputeCluster.getDefaultInstance() : computeCluster_;
+      } else {
+        return computeClusterBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+     */
+    public Builder setComputeCluster(com.clarifai.grpc.api.ComputeCluster value) {
+      if (computeClusterBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        computeCluster_ = value;
+        onChanged();
+      } else {
+        computeClusterBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+     */
+    public Builder setComputeCluster(
+        com.clarifai.grpc.api.ComputeCluster.Builder builderForValue) {
+      if (computeClusterBuilder_ == null) {
+        computeCluster_ = builderForValue.build();
+        onChanged();
+      } else {
+        computeClusterBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+     */
+    public Builder mergeComputeCluster(com.clarifai.grpc.api.ComputeCluster value) {
+      if (computeClusterBuilder_ == null) {
+        if (computeCluster_ != null) {
+          computeCluster_ =
+            com.clarifai.grpc.api.ComputeCluster.newBuilder(computeCluster_).mergeFrom(value).buildPartial();
+        } else {
+          computeCluster_ = value;
+        }
+        onChanged();
+      } else {
+        computeClusterBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+     */
+    public Builder clearComputeCluster() {
+      if (computeClusterBuilder_ == null) {
+        computeCluster_ = null;
+        onChanged();
+      } else {
+        computeCluster_ = null;
+        computeClusterBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+     */
+    public com.clarifai.grpc.api.ComputeCluster.Builder getComputeClusterBuilder() {
+      
+      onChanged();
+      return getComputeClusterFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+     */
+    public com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClusterOrBuilder() {
+      if (computeClusterBuilder_ != null) {
+        return computeClusterBuilder_.getMessageOrBuilder();
+      } else {
+        return computeCluster_ == null ?
+            com.clarifai.grpc.api.ComputeCluster.getDefaultInstance() : computeCluster_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder> 
+        getComputeClusterFieldBuilder() {
+      if (computeClusterBuilder_ == null) {
+        computeClusterBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.ComputeCluster, com.clarifai.grpc.api.ComputeCluster.Builder, com.clarifai.grpc.api.ComputeClusterOrBuilder>(
+                getComputeCluster(),
+                getParentForChildren(),
+                isClean());
+        computeCluster_ = null;
+      }
+      return computeClusterBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.SingleComputeClusterResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.SingleComputeClusterResponse)
+  private static final com.clarifai.grpc.api.SingleComputeClusterResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.SingleComputeClusterResponse();
+  }
+
+  public static com.clarifai.grpc.api.SingleComputeClusterResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<SingleComputeClusterResponse>
+      PARSER = new com.google.protobuf.AbstractParser<SingleComputeClusterResponse>() {
+    @java.lang.Override
+    public SingleComputeClusterResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new SingleComputeClusterResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<SingleComputeClusterResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<SingleComputeClusterResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.SingleComputeClusterResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/SingleComputeClusterResponseOrBuilder.java b/src/main/java/com/clarifai/grpc/api/SingleComputeClusterResponseOrBuilder.java
new file mode 100644
index 0000000..c3c6678
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/SingleComputeClusterResponseOrBuilder.java
@@ -0,0 +1,39 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface SingleComputeClusterResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.SingleComputeClusterResponse)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return Whether the status field is set.
+   */
+  boolean hasStatus();
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return The status.
+   */
+  com.clarifai.grpc.api.status.Status getStatus();
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   */
+  com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder();
+
+  /**
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+   * @return Whether the computeCluster field is set.
+   */
+  boolean hasComputeCluster();
+  /**
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+   * @return The computeCluster.
+   */
+  com.clarifai.grpc.api.ComputeCluster getComputeCluster();
+  /**
+   * <code>.clarifai.api.ComputeCluster compute_cluster = 2;</code>
+   */
+  com.clarifai.grpc.api.ComputeClusterOrBuilder getComputeClusterOrBuilder();
+}
diff --git a/src/main/java/com/clarifai/grpc/api/SingleNodepoolResponse.java b/src/main/java/com/clarifai/grpc/api/SingleNodepoolResponse.java
new file mode 100644
index 0000000..f9c5179
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/SingleNodepoolResponse.java
@@ -0,0 +1,797 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * Protobuf type {@code clarifai.api.SingleNodepoolResponse}
+ */
+public final class SingleNodepoolResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.SingleNodepoolResponse)
+    SingleNodepoolResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use SingleNodepoolResponse.newBuilder() to construct.
+  private SingleNodepoolResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private SingleNodepoolResponse() {
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new SingleNodepoolResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private SingleNodepoolResponse(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.clarifai.grpc.api.status.Status.Builder subBuilder = null;
+            if (status_ != null) {
+              subBuilder = status_.toBuilder();
+            }
+            status_ = input.readMessage(com.clarifai.grpc.api.status.Status.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(status_);
+              status_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            com.clarifai.grpc.api.Nodepool.Builder subBuilder = null;
+            if (nodepool_ != null) {
+              subBuilder = nodepool_.toBuilder();
+            }
+            nodepool_ = input.readMessage(com.clarifai.grpc.api.Nodepool.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(nodepool_);
+              nodepool_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_SingleNodepoolResponse_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Service.internal_static_clarifai_api_SingleNodepoolResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.SingleNodepoolResponse.class, com.clarifai.grpc.api.SingleNodepoolResponse.Builder.class);
+  }
+
+  public static final int STATUS_FIELD_NUMBER = 1;
+  private com.clarifai.grpc.api.status.Status status_;
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return Whether the status field is set.
+   */
+  @java.lang.Override
+  public boolean hasStatus() {
+    return status_ != null;
+  }
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return The status.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.status.Status getStatus() {
+    return status_ == null ? com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+  }
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder() {
+    return getStatus();
+  }
+
+  public static final int NODEPOOL_FIELD_NUMBER = 2;
+  private com.clarifai.grpc.api.Nodepool nodepool_;
+  /**
+   * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+   * @return Whether the nodepool field is set.
+   */
+  @java.lang.Override
+  public boolean hasNodepool() {
+    return nodepool_ != null;
+  }
+  /**
+   * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+   * @return The nodepool.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.Nodepool getNodepool() {
+    return nodepool_ == null ? com.clarifai.grpc.api.Nodepool.getDefaultInstance() : nodepool_;
+  }
+  /**
+   * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolOrBuilder() {
+    return getNodepool();
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (status_ != null) {
+      output.writeMessage(1, getStatus());
+    }
+    if (nodepool_ != null) {
+      output.writeMessage(2, getNodepool());
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (status_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getStatus());
+    }
+    if (nodepool_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, getNodepool());
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.SingleNodepoolResponse)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.SingleNodepoolResponse other = (com.clarifai.grpc.api.SingleNodepoolResponse) obj;
+
+    if (hasStatus() != other.hasStatus()) return false;
+    if (hasStatus()) {
+      if (!getStatus()
+          .equals(other.getStatus())) return false;
+    }
+    if (hasNodepool() != other.hasNodepool()) return false;
+    if (hasNodepool()) {
+      if (!getNodepool()
+          .equals(other.getNodepool())) return false;
+    }
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasStatus()) {
+      hash = (37 * hash) + STATUS_FIELD_NUMBER;
+      hash = (53 * hash) + getStatus().hashCode();
+    }
+    if (hasNodepool()) {
+      hash = (37 * hash) + NODEPOOL_FIELD_NUMBER;
+      hash = (53 * hash) + getNodepool().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.SingleNodepoolResponse parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.SingleNodepoolResponse prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code clarifai.api.SingleNodepoolResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.SingleNodepoolResponse)
+      com.clarifai.grpc.api.SingleNodepoolResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_SingleNodepoolResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_SingleNodepoolResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.SingleNodepoolResponse.class, com.clarifai.grpc.api.SingleNodepoolResponse.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.SingleNodepoolResponse.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (statusBuilder_ == null) {
+        status_ = null;
+      } else {
+        status_ = null;
+        statusBuilder_ = null;
+      }
+      if (nodepoolBuilder_ == null) {
+        nodepool_ = null;
+      } else {
+        nodepool_ = null;
+        nodepoolBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Service.internal_static_clarifai_api_SingleNodepoolResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.SingleNodepoolResponse getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.SingleNodepoolResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.SingleNodepoolResponse build() {
+      com.clarifai.grpc.api.SingleNodepoolResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.SingleNodepoolResponse buildPartial() {
+      com.clarifai.grpc.api.SingleNodepoolResponse result = new com.clarifai.grpc.api.SingleNodepoolResponse(this);
+      if (statusBuilder_ == null) {
+        result.status_ = status_;
+      } else {
+        result.status_ = statusBuilder_.build();
+      }
+      if (nodepoolBuilder_ == null) {
+        result.nodepool_ = nodepool_;
+      } else {
+        result.nodepool_ = nodepoolBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.SingleNodepoolResponse) {
+        return mergeFrom((com.clarifai.grpc.api.SingleNodepoolResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.SingleNodepoolResponse other) {
+      if (other == com.clarifai.grpc.api.SingleNodepoolResponse.getDefaultInstance()) return this;
+      if (other.hasStatus()) {
+        mergeStatus(other.getStatus());
+      }
+      if (other.hasNodepool()) {
+        mergeNodepool(other.getNodepool());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.SingleNodepoolResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.SingleNodepoolResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private com.clarifai.grpc.api.status.Status status_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder> statusBuilder_;
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     * @return Whether the status field is set.
+     */
+    public boolean hasStatus() {
+      return statusBuilder_ != null || status_ != null;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     * @return The status.
+     */
+    public com.clarifai.grpc.api.status.Status getStatus() {
+      if (statusBuilder_ == null) {
+        return status_ == null ? com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+      } else {
+        return statusBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder setStatus(com.clarifai.grpc.api.status.Status value) {
+      if (statusBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        status_ = value;
+        onChanged();
+      } else {
+        statusBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder setStatus(
+        com.clarifai.grpc.api.status.Status.Builder builderForValue) {
+      if (statusBuilder_ == null) {
+        status_ = builderForValue.build();
+        onChanged();
+      } else {
+        statusBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder mergeStatus(com.clarifai.grpc.api.status.Status value) {
+      if (statusBuilder_ == null) {
+        if (status_ != null) {
+          status_ =
+            com.clarifai.grpc.api.status.Status.newBuilder(status_).mergeFrom(value).buildPartial();
+        } else {
+          status_ = value;
+        }
+        onChanged();
+      } else {
+        statusBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public Builder clearStatus() {
+      if (statusBuilder_ == null) {
+        status_ = null;
+        onChanged();
+      } else {
+        status_ = null;
+        statusBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public com.clarifai.grpc.api.status.Status.Builder getStatusBuilder() {
+      
+      onChanged();
+      return getStatusFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    public com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder() {
+      if (statusBuilder_ != null) {
+        return statusBuilder_.getMessageOrBuilder();
+      } else {
+        return status_ == null ?
+            com.clarifai.grpc.api.status.Status.getDefaultInstance() : status_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.status.Status status = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder> 
+        getStatusFieldBuilder() {
+      if (statusBuilder_ == null) {
+        statusBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.status.Status, com.clarifai.grpc.api.status.Status.Builder, com.clarifai.grpc.api.status.StatusOrBuilder>(
+                getStatus(),
+                getParentForChildren(),
+                isClean());
+        status_ = null;
+      }
+      return statusBuilder_;
+    }
+
+    private com.clarifai.grpc.api.Nodepool nodepool_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder> nodepoolBuilder_;
+    /**
+     * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+     * @return Whether the nodepool field is set.
+     */
+    public boolean hasNodepool() {
+      return nodepoolBuilder_ != null || nodepool_ != null;
+    }
+    /**
+     * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+     * @return The nodepool.
+     */
+    public com.clarifai.grpc.api.Nodepool getNodepool() {
+      if (nodepoolBuilder_ == null) {
+        return nodepool_ == null ? com.clarifai.grpc.api.Nodepool.getDefaultInstance() : nodepool_;
+      } else {
+        return nodepoolBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+     */
+    public Builder setNodepool(com.clarifai.grpc.api.Nodepool value) {
+      if (nodepoolBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        nodepool_ = value;
+        onChanged();
+      } else {
+        nodepoolBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+     */
+    public Builder setNodepool(
+        com.clarifai.grpc.api.Nodepool.Builder builderForValue) {
+      if (nodepoolBuilder_ == null) {
+        nodepool_ = builderForValue.build();
+        onChanged();
+      } else {
+        nodepoolBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+     */
+    public Builder mergeNodepool(com.clarifai.grpc.api.Nodepool value) {
+      if (nodepoolBuilder_ == null) {
+        if (nodepool_ != null) {
+          nodepool_ =
+            com.clarifai.grpc.api.Nodepool.newBuilder(nodepool_).mergeFrom(value).buildPartial();
+        } else {
+          nodepool_ = value;
+        }
+        onChanged();
+      } else {
+        nodepoolBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+     */
+    public Builder clearNodepool() {
+      if (nodepoolBuilder_ == null) {
+        nodepool_ = null;
+        onChanged();
+      } else {
+        nodepool_ = null;
+        nodepoolBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+     */
+    public com.clarifai.grpc.api.Nodepool.Builder getNodepoolBuilder() {
+      
+      onChanged();
+      return getNodepoolFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+     */
+    public com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolOrBuilder() {
+      if (nodepoolBuilder_ != null) {
+        return nodepoolBuilder_.getMessageOrBuilder();
+      } else {
+        return nodepool_ == null ?
+            com.clarifai.grpc.api.Nodepool.getDefaultInstance() : nodepool_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder> 
+        getNodepoolFieldBuilder() {
+      if (nodepoolBuilder_ == null) {
+        nodepoolBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.Nodepool, com.clarifai.grpc.api.Nodepool.Builder, com.clarifai.grpc.api.NodepoolOrBuilder>(
+                getNodepool(),
+                getParentForChildren(),
+                isClean());
+        nodepool_ = null;
+      }
+      return nodepoolBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.SingleNodepoolResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.SingleNodepoolResponse)
+  private static final com.clarifai.grpc.api.SingleNodepoolResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.SingleNodepoolResponse();
+  }
+
+  public static com.clarifai.grpc.api.SingleNodepoolResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<SingleNodepoolResponse>
+      PARSER = new com.google.protobuf.AbstractParser<SingleNodepoolResponse>() {
+    @java.lang.Override
+    public SingleNodepoolResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new SingleNodepoolResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<SingleNodepoolResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<SingleNodepoolResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.SingleNodepoolResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/SingleNodepoolResponseOrBuilder.java b/src/main/java/com/clarifai/grpc/api/SingleNodepoolResponseOrBuilder.java
new file mode 100644
index 0000000..4809949
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/SingleNodepoolResponseOrBuilder.java
@@ -0,0 +1,39 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/service.proto
+
+package com.clarifai.grpc.api;
+
+public interface SingleNodepoolResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.SingleNodepoolResponse)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return Whether the status field is set.
+   */
+  boolean hasStatus();
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   * @return The status.
+   */
+  com.clarifai.grpc.api.status.Status getStatus();
+  /**
+   * <code>.clarifai.api.status.Status status = 1;</code>
+   */
+  com.clarifai.grpc.api.status.StatusOrBuilder getStatusOrBuilder();
+
+  /**
+   * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+   * @return Whether the nodepool field is set.
+   */
+  boolean hasNodepool();
+  /**
+   * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+   * @return The nodepool.
+   */
+  com.clarifai.grpc.api.Nodepool getNodepool();
+  /**
+   * <code>.clarifai.api.Nodepool nodepool = 2;</code>
+   */
+  com.clarifai.grpc.api.NodepoolOrBuilder getNodepoolOrBuilder();
+}
diff --git a/src/main/java/com/clarifai/grpc/api/Task.java b/src/main/java/com/clarifai/grpc/api/Task.java
index bedb407..e327e54 100644
--- a/src/main/java/com/clarifai/grpc/api/Task.java
+++ b/src/main/java/com/clarifai/grpc/api/Task.java
@@ -707,7 +707,7 @@ public com.clarifai.grpc.api.TaskWorkerOrBuilder getWorkerOrBuilder() {
    *
    * <code>repeated string concept_ids = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Task.concept_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3047
+   *     See proto/clarifai/api/resources.proto;l=3065
    * @return A list containing the conceptIds.
    */
   @java.lang.Deprecated public com.google.protobuf.ProtocolStringList
@@ -722,7 +722,7 @@ public com.clarifai.grpc.api.TaskWorkerOrBuilder getWorkerOrBuilder() {
    *
    * <code>repeated string concept_ids = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Task.concept_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3047
+   *     See proto/clarifai/api/resources.proto;l=3065
    * @return The count of conceptIds.
    */
   @java.lang.Deprecated public int getConceptIdsCount() {
@@ -736,7 +736,7 @@ public com.clarifai.grpc.api.TaskWorkerOrBuilder getWorkerOrBuilder() {
    *
    * <code>repeated string concept_ids = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Task.concept_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3047
+   *     See proto/clarifai/api/resources.proto;l=3065
    * @param index The index of the element to return.
    * @return The conceptIds at the given index.
    */
@@ -751,7 +751,7 @@ public com.clarifai.grpc.api.TaskWorkerOrBuilder getWorkerOrBuilder() {
    *
    * <code>repeated string concept_ids = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Task.concept_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3047
+   *     See proto/clarifai/api/resources.proto;l=3065
    * @param index The index of the value to return.
    * @return The bytes of the conceptIds at the given index.
    */
@@ -2910,7 +2910,7 @@ private void ensureConceptIdsIsMutable() {
      *
      * <code>repeated string concept_ids = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Task.concept_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3047
+     *     See proto/clarifai/api/resources.proto;l=3065
      * @return A list containing the conceptIds.
      */
     @java.lang.Deprecated public com.google.protobuf.ProtocolStringList
@@ -2925,7 +2925,7 @@ private void ensureConceptIdsIsMutable() {
      *
      * <code>repeated string concept_ids = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Task.concept_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3047
+     *     See proto/clarifai/api/resources.proto;l=3065
      * @return The count of conceptIds.
      */
     @java.lang.Deprecated public int getConceptIdsCount() {
@@ -2939,7 +2939,7 @@ private void ensureConceptIdsIsMutable() {
      *
      * <code>repeated string concept_ids = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Task.concept_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3047
+     *     See proto/clarifai/api/resources.proto;l=3065
      * @param index The index of the element to return.
      * @return The conceptIds at the given index.
      */
@@ -2954,7 +2954,7 @@ private void ensureConceptIdsIsMutable() {
      *
      * <code>repeated string concept_ids = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Task.concept_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3047
+     *     See proto/clarifai/api/resources.proto;l=3065
      * @param index The index of the value to return.
      * @return The bytes of the conceptIds at the given index.
      */
@@ -2970,7 +2970,7 @@ private void ensureConceptIdsIsMutable() {
      *
      * <code>repeated string concept_ids = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Task.concept_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3047
+     *     See proto/clarifai/api/resources.proto;l=3065
      * @param index The index to set the value at.
      * @param value The conceptIds to set.
      * @return This builder for chaining.
@@ -2993,7 +2993,7 @@ private void ensureConceptIdsIsMutable() {
      *
      * <code>repeated string concept_ids = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Task.concept_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3047
+     *     See proto/clarifai/api/resources.proto;l=3065
      * @param value The conceptIds to add.
      * @return This builder for chaining.
      */
@@ -3015,7 +3015,7 @@ private void ensureConceptIdsIsMutable() {
      *
      * <code>repeated string concept_ids = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Task.concept_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3047
+     *     See proto/clarifai/api/resources.proto;l=3065
      * @param values The conceptIds to add.
      * @return This builder for chaining.
      */
@@ -3035,7 +3035,7 @@ private void ensureConceptIdsIsMutable() {
      *
      * <code>repeated string concept_ids = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Task.concept_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3047
+     *     See proto/clarifai/api/resources.proto;l=3065
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearConceptIds() {
@@ -3052,7 +3052,7 @@ private void ensureConceptIdsIsMutable() {
      *
      * <code>repeated string concept_ids = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.Task.concept_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3047
+     *     See proto/clarifai/api/resources.proto;l=3065
      * @param value The bytes of the conceptIds to add.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/TaskMetrics.java b/src/main/java/com/clarifai/grpc/api/TaskMetrics.java
index d50497f..4d930c2 100644
--- a/src/main/java/com/clarifai/grpc/api/TaskMetrics.java
+++ b/src/main/java/com/clarifai/grpc/api/TaskMetrics.java
@@ -61,6 +61,19 @@ private TaskMetrics(
 
             break;
           }
+          case 26: {
+            com.clarifai.grpc.api.TaskReviewMetrics.Builder subBuilder = null;
+            if (review_ != null) {
+              subBuilder = review_.toBuilder();
+            }
+            review_ = input.readMessage(com.clarifai.grpc.api.TaskReviewMetrics.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(review_);
+              review_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
           default: {
             if (!parseUnknownField(
                 input, unknownFields, extensionRegistry, tag)) {
@@ -121,6 +134,32 @@ public com.clarifai.grpc.api.TaskWorkMetricsOrBuilder getWorkOrBuilder() {
     return getWork();
   }
 
+  public static final int REVIEW_FIELD_NUMBER = 3;
+  private com.clarifai.grpc.api.TaskReviewMetrics review_;
+  /**
+   * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+   * @return Whether the review field is set.
+   */
+  @java.lang.Override
+  public boolean hasReview() {
+    return review_ != null;
+  }
+  /**
+   * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+   * @return The review.
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.TaskReviewMetrics getReview() {
+    return review_ == null ? com.clarifai.grpc.api.TaskReviewMetrics.getDefaultInstance() : review_;
+  }
+  /**
+   * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+   */
+  @java.lang.Override
+  public com.clarifai.grpc.api.TaskReviewMetricsOrBuilder getReviewOrBuilder() {
+    return getReview();
+  }
+
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -138,6 +177,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (work_ != null) {
       output.writeMessage(2, getWork());
     }
+    if (review_ != null) {
+      output.writeMessage(3, getReview());
+    }
     unknownFields.writeTo(output);
   }
 
@@ -151,6 +193,10 @@ public int getSerializedSize() {
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(2, getWork());
     }
+    if (review_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(3, getReview());
+    }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
     return size;
@@ -171,6 +217,11 @@ public boolean equals(final java.lang.Object obj) {
       if (!getWork()
           .equals(other.getWork())) return false;
     }
+    if (hasReview() != other.hasReview()) return false;
+    if (hasReview()) {
+      if (!getReview()
+          .equals(other.getReview())) return false;
+    }
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -186,6 +237,10 @@ public int hashCode() {
       hash = (37 * hash) + WORK_FIELD_NUMBER;
       hash = (53 * hash) + getWork().hashCode();
     }
+    if (hasReview()) {
+      hash = (37 * hash) + REVIEW_FIELD_NUMBER;
+      hash = (53 * hash) + getReview().hashCode();
+    }
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -325,6 +380,12 @@ public Builder clear() {
         work_ = null;
         workBuilder_ = null;
       }
+      if (reviewBuilder_ == null) {
+        review_ = null;
+      } else {
+        review_ = null;
+        reviewBuilder_ = null;
+      }
       return this;
     }
 
@@ -356,6 +417,11 @@ public com.clarifai.grpc.api.TaskMetrics buildPartial() {
       } else {
         result.work_ = workBuilder_.build();
       }
+      if (reviewBuilder_ == null) {
+        result.review_ = review_;
+      } else {
+        result.review_ = reviewBuilder_.build();
+      }
       onBuilt();
       return result;
     }
@@ -407,6 +473,9 @@ public Builder mergeFrom(com.clarifai.grpc.api.TaskMetrics other) {
       if (other.hasWork()) {
         mergeWork(other.getWork());
       }
+      if (other.hasReview()) {
+        mergeReview(other.getReview());
+      }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
       return this;
@@ -554,6 +623,125 @@ public com.clarifai.grpc.api.TaskWorkMetricsOrBuilder getWorkOrBuilder() {
       }
       return workBuilder_;
     }
+
+    private com.clarifai.grpc.api.TaskReviewMetrics review_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.TaskReviewMetrics, com.clarifai.grpc.api.TaskReviewMetrics.Builder, com.clarifai.grpc.api.TaskReviewMetricsOrBuilder> reviewBuilder_;
+    /**
+     * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+     * @return Whether the review field is set.
+     */
+    public boolean hasReview() {
+      return reviewBuilder_ != null || review_ != null;
+    }
+    /**
+     * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+     * @return The review.
+     */
+    public com.clarifai.grpc.api.TaskReviewMetrics getReview() {
+      if (reviewBuilder_ == null) {
+        return review_ == null ? com.clarifai.grpc.api.TaskReviewMetrics.getDefaultInstance() : review_;
+      } else {
+        return reviewBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+     */
+    public Builder setReview(com.clarifai.grpc.api.TaskReviewMetrics value) {
+      if (reviewBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        review_ = value;
+        onChanged();
+      } else {
+        reviewBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+     */
+    public Builder setReview(
+        com.clarifai.grpc.api.TaskReviewMetrics.Builder builderForValue) {
+      if (reviewBuilder_ == null) {
+        review_ = builderForValue.build();
+        onChanged();
+      } else {
+        reviewBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+     */
+    public Builder mergeReview(com.clarifai.grpc.api.TaskReviewMetrics value) {
+      if (reviewBuilder_ == null) {
+        if (review_ != null) {
+          review_ =
+            com.clarifai.grpc.api.TaskReviewMetrics.newBuilder(review_).mergeFrom(value).buildPartial();
+        } else {
+          review_ = value;
+        }
+        onChanged();
+      } else {
+        reviewBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+     */
+    public Builder clearReview() {
+      if (reviewBuilder_ == null) {
+        review_ = null;
+        onChanged();
+      } else {
+        review_ = null;
+        reviewBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+     */
+    public com.clarifai.grpc.api.TaskReviewMetrics.Builder getReviewBuilder() {
+      
+      onChanged();
+      return getReviewFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+     */
+    public com.clarifai.grpc.api.TaskReviewMetricsOrBuilder getReviewOrBuilder() {
+      if (reviewBuilder_ != null) {
+        return reviewBuilder_.getMessageOrBuilder();
+      } else {
+        return review_ == null ?
+            com.clarifai.grpc.api.TaskReviewMetrics.getDefaultInstance() : review_;
+      }
+    }
+    /**
+     * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.clarifai.grpc.api.TaskReviewMetrics, com.clarifai.grpc.api.TaskReviewMetrics.Builder, com.clarifai.grpc.api.TaskReviewMetricsOrBuilder> 
+        getReviewFieldBuilder() {
+      if (reviewBuilder_ == null) {
+        reviewBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.clarifai.grpc.api.TaskReviewMetrics, com.clarifai.grpc.api.TaskReviewMetrics.Builder, com.clarifai.grpc.api.TaskReviewMetricsOrBuilder>(
+                getReview(),
+                getParentForChildren(),
+                isClean());
+        review_ = null;
+      }
+      return reviewBuilder_;
+    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {
diff --git a/src/main/java/com/clarifai/grpc/api/TaskMetricsOrBuilder.java b/src/main/java/com/clarifai/grpc/api/TaskMetricsOrBuilder.java
index 8cf6a26..e325e55 100644
--- a/src/main/java/com/clarifai/grpc/api/TaskMetricsOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/TaskMetricsOrBuilder.java
@@ -21,4 +21,19 @@ public interface TaskMetricsOrBuilder extends
    * <code>.clarifai.api.TaskWorkMetrics work = 2;</code>
    */
   com.clarifai.grpc.api.TaskWorkMetricsOrBuilder getWorkOrBuilder();
+
+  /**
+   * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+   * @return Whether the review field is set.
+   */
+  boolean hasReview();
+  /**
+   * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+   * @return The review.
+   */
+  com.clarifai.grpc.api.TaskReviewMetrics getReview();
+  /**
+   * <code>.clarifai.api.TaskReviewMetrics review = 3;</code>
+   */
+  com.clarifai.grpc.api.TaskReviewMetricsOrBuilder getReviewOrBuilder();
 }
diff --git a/src/main/java/com/clarifai/grpc/api/TaskOrBuilder.java b/src/main/java/com/clarifai/grpc/api/TaskOrBuilder.java
index 5b84e30..d5ba531 100644
--- a/src/main/java/com/clarifai/grpc/api/TaskOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/TaskOrBuilder.java
@@ -167,7 +167,7 @@ public interface TaskOrBuilder extends
    *
    * <code>repeated string concept_ids = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Task.concept_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3047
+   *     See proto/clarifai/api/resources.proto;l=3065
    * @return A list containing the conceptIds.
    */
   @java.lang.Deprecated java.util.List<java.lang.String>
@@ -180,7 +180,7 @@ public interface TaskOrBuilder extends
    *
    * <code>repeated string concept_ids = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Task.concept_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3047
+   *     See proto/clarifai/api/resources.proto;l=3065
    * @return The count of conceptIds.
    */
   @java.lang.Deprecated int getConceptIdsCount();
@@ -192,7 +192,7 @@ public interface TaskOrBuilder extends
    *
    * <code>repeated string concept_ids = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Task.concept_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3047
+   *     See proto/clarifai/api/resources.proto;l=3065
    * @param index The index of the element to return.
    * @return The conceptIds at the given index.
    */
@@ -205,7 +205,7 @@ public interface TaskOrBuilder extends
    *
    * <code>repeated string concept_ids = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.Task.concept_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3047
+   *     See proto/clarifai/api/resources.proto;l=3065
    * @param index The index of the value to return.
    * @return The bytes of the conceptIds at the given index.
    */
diff --git a/src/main/java/com/clarifai/grpc/api/TaskReview.java b/src/main/java/com/clarifai/grpc/api/TaskReview.java
index 95507dd..25f1e5e 100644
--- a/src/main/java/com/clarifai/grpc/api/TaskReview.java
+++ b/src/main/java/com/clarifai/grpc/api/TaskReview.java
@@ -376,7 +376,7 @@ public int getNumber() {
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3228
+   *     See proto/clarifai/api/resources.proto;l=3246
    * @return A list containing the userIds.
    */
   @java.lang.Deprecated public com.google.protobuf.ProtocolStringList
@@ -391,7 +391,7 @@ public int getNumber() {
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3228
+   *     See proto/clarifai/api/resources.proto;l=3246
    * @return The count of userIds.
    */
   @java.lang.Deprecated public int getUserIdsCount() {
@@ -405,7 +405,7 @@ public int getNumber() {
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3228
+   *     See proto/clarifai/api/resources.proto;l=3246
    * @param index The index of the element to return.
    * @return The userIds at the given index.
    */
@@ -420,7 +420,7 @@ public int getNumber() {
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3228
+   *     See proto/clarifai/api/resources.proto;l=3246
    * @param index The index of the value to return.
    * @return The bytes of the userIds at the given index.
    */
@@ -1130,7 +1130,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3228
+     *     See proto/clarifai/api/resources.proto;l=3246
      * @return A list containing the userIds.
      */
     @java.lang.Deprecated public com.google.protobuf.ProtocolStringList
@@ -1145,7 +1145,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3228
+     *     See proto/clarifai/api/resources.proto;l=3246
      * @return The count of userIds.
      */
     @java.lang.Deprecated public int getUserIdsCount() {
@@ -1159,7 +1159,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3228
+     *     See proto/clarifai/api/resources.proto;l=3246
      * @param index The index of the element to return.
      * @return The userIds at the given index.
      */
@@ -1174,7 +1174,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3228
+     *     See proto/clarifai/api/resources.proto;l=3246
      * @param index The index of the value to return.
      * @return The bytes of the userIds at the given index.
      */
@@ -1190,7 +1190,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3228
+     *     See proto/clarifai/api/resources.proto;l=3246
      * @param index The index to set the value at.
      * @param value The userIds to set.
      * @return This builder for chaining.
@@ -1213,7 +1213,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3228
+     *     See proto/clarifai/api/resources.proto;l=3246
      * @param value The userIds to add.
      * @return This builder for chaining.
      */
@@ -1235,7 +1235,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3228
+     *     See proto/clarifai/api/resources.proto;l=3246
      * @param values The userIds to add.
      * @return This builder for chaining.
      */
@@ -1255,7 +1255,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3228
+     *     See proto/clarifai/api/resources.proto;l=3246
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearUserIds() {
@@ -1272,7 +1272,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3228
+     *     See proto/clarifai/api/resources.proto;l=3246
      * @param value The bytes of the userIds to add.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/TaskReviewMetrics.java b/src/main/java/com/clarifai/grpc/api/TaskReviewMetrics.java
new file mode 100644
index 0000000..28ac37e
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/TaskReviewMetrics.java
@@ -0,0 +1,586 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/resources.proto
+
+package com.clarifai.grpc.api;
+
+/**
+ * Protobuf type {@code clarifai.api.TaskReviewMetrics}
+ */
+public final class TaskReviewMetrics extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:clarifai.api.TaskReviewMetrics)
+    TaskReviewMetricsOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use TaskReviewMetrics.newBuilder() to construct.
+  private TaskReviewMetrics(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private TaskReviewMetrics() {
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new TaskReviewMetrics();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private TaskReviewMetrics(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+
+            inputsCountEstimated_ = input.readUInt64();
+            break;
+          }
+          case 16: {
+
+            inputsPercentEstimated_ = input.readUInt32();
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (com.google.protobuf.UninitializedMessageException e) {
+      throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_TaskReviewMetrics_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_TaskReviewMetrics_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.clarifai.grpc.api.TaskReviewMetrics.class, com.clarifai.grpc.api.TaskReviewMetrics.Builder.class);
+  }
+
+  public static final int INPUTS_COUNT_ESTIMATED_FIELD_NUMBER = 1;
+  private long inputsCountEstimated_;
+  /**
+   * <pre>
+   * Estimated number of reviewed inputs.
+   * </pre>
+   *
+   * <code>uint64 inputs_count_estimated = 1;</code>
+   * @return The inputsCountEstimated.
+   */
+  @java.lang.Override
+  public long getInputsCountEstimated() {
+    return inputsCountEstimated_;
+  }
+
+  public static final int INPUTS_PERCENT_ESTIMATED_FIELD_NUMBER = 2;
+  private int inputsPercentEstimated_;
+  /**
+   * <pre>
+   * Estimated percent of inputs that were reviewed. Calculated as count of reviewed inputs / total task inputs
+   * This is a value between 0 and 100, where 0 = 0% and 100 = 100%.
+   * </pre>
+   *
+   * <code>uint32 inputs_percent_estimated = 2;</code>
+   * @return The inputsPercentEstimated.
+   */
+  @java.lang.Override
+  public int getInputsPercentEstimated() {
+    return inputsPercentEstimated_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (inputsCountEstimated_ != 0L) {
+      output.writeUInt64(1, inputsCountEstimated_);
+    }
+    if (inputsPercentEstimated_ != 0) {
+      output.writeUInt32(2, inputsPercentEstimated_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (inputsCountEstimated_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt64Size(1, inputsCountEstimated_);
+    }
+    if (inputsPercentEstimated_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeUInt32Size(2, inputsPercentEstimated_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.clarifai.grpc.api.TaskReviewMetrics)) {
+      return super.equals(obj);
+    }
+    com.clarifai.grpc.api.TaskReviewMetrics other = (com.clarifai.grpc.api.TaskReviewMetrics) obj;
+
+    if (getInputsCountEstimated()
+        != other.getInputsCountEstimated()) return false;
+    if (getInputsPercentEstimated()
+        != other.getInputsPercentEstimated()) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + INPUTS_COUNT_ESTIMATED_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getInputsCountEstimated());
+    hash = (37 * hash) + INPUTS_PERCENT_ESTIMATED_FIELD_NUMBER;
+    hash = (53 * hash) + getInputsPercentEstimated();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.clarifai.grpc.api.TaskReviewMetrics parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.clarifai.grpc.api.TaskReviewMetrics prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code clarifai.api.TaskReviewMetrics}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:clarifai.api.TaskReviewMetrics)
+      com.clarifai.grpc.api.TaskReviewMetricsOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_TaskReviewMetrics_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_TaskReviewMetrics_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.clarifai.grpc.api.TaskReviewMetrics.class, com.clarifai.grpc.api.TaskReviewMetrics.Builder.class);
+    }
+
+    // Construct using com.clarifai.grpc.api.TaskReviewMetrics.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      inputsCountEstimated_ = 0L;
+
+      inputsPercentEstimated_ = 0;
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.clarifai.grpc.api.Resources.internal_static_clarifai_api_TaskReviewMetrics_descriptor;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.TaskReviewMetrics getDefaultInstanceForType() {
+      return com.clarifai.grpc.api.TaskReviewMetrics.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.TaskReviewMetrics build() {
+      com.clarifai.grpc.api.TaskReviewMetrics result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.clarifai.grpc.api.TaskReviewMetrics buildPartial() {
+      com.clarifai.grpc.api.TaskReviewMetrics result = new com.clarifai.grpc.api.TaskReviewMetrics(this);
+      result.inputsCountEstimated_ = inputsCountEstimated_;
+      result.inputsPercentEstimated_ = inputsPercentEstimated_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.clarifai.grpc.api.TaskReviewMetrics) {
+        return mergeFrom((com.clarifai.grpc.api.TaskReviewMetrics)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.clarifai.grpc.api.TaskReviewMetrics other) {
+      if (other == com.clarifai.grpc.api.TaskReviewMetrics.getDefaultInstance()) return this;
+      if (other.getInputsCountEstimated() != 0L) {
+        setInputsCountEstimated(other.getInputsCountEstimated());
+      }
+      if (other.getInputsPercentEstimated() != 0) {
+        setInputsPercentEstimated(other.getInputsPercentEstimated());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.clarifai.grpc.api.TaskReviewMetrics parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.clarifai.grpc.api.TaskReviewMetrics) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private long inputsCountEstimated_ ;
+    /**
+     * <pre>
+     * Estimated number of reviewed inputs.
+     * </pre>
+     *
+     * <code>uint64 inputs_count_estimated = 1;</code>
+     * @return The inputsCountEstimated.
+     */
+    @java.lang.Override
+    public long getInputsCountEstimated() {
+      return inputsCountEstimated_;
+    }
+    /**
+     * <pre>
+     * Estimated number of reviewed inputs.
+     * </pre>
+     *
+     * <code>uint64 inputs_count_estimated = 1;</code>
+     * @param value The inputsCountEstimated to set.
+     * @return This builder for chaining.
+     */
+    public Builder setInputsCountEstimated(long value) {
+      
+      inputsCountEstimated_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Estimated number of reviewed inputs.
+     * </pre>
+     *
+     * <code>uint64 inputs_count_estimated = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearInputsCountEstimated() {
+      
+      inputsCountEstimated_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private int inputsPercentEstimated_ ;
+    /**
+     * <pre>
+     * Estimated percent of inputs that were reviewed. Calculated as count of reviewed inputs / total task inputs
+     * This is a value between 0 and 100, where 0 = 0% and 100 = 100%.
+     * </pre>
+     *
+     * <code>uint32 inputs_percent_estimated = 2;</code>
+     * @return The inputsPercentEstimated.
+     */
+    @java.lang.Override
+    public int getInputsPercentEstimated() {
+      return inputsPercentEstimated_;
+    }
+    /**
+     * <pre>
+     * Estimated percent of inputs that were reviewed. Calculated as count of reviewed inputs / total task inputs
+     * This is a value between 0 and 100, where 0 = 0% and 100 = 100%.
+     * </pre>
+     *
+     * <code>uint32 inputs_percent_estimated = 2;</code>
+     * @param value The inputsPercentEstimated to set.
+     * @return This builder for chaining.
+     */
+    public Builder setInputsPercentEstimated(int value) {
+      
+      inputsPercentEstimated_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Estimated percent of inputs that were reviewed. Calculated as count of reviewed inputs / total task inputs
+     * This is a value between 0 and 100, where 0 = 0% and 100 = 100%.
+     * </pre>
+     *
+     * <code>uint32 inputs_percent_estimated = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearInputsPercentEstimated() {
+      
+      inputsPercentEstimated_ = 0;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:clarifai.api.TaskReviewMetrics)
+  }
+
+  // @@protoc_insertion_point(class_scope:clarifai.api.TaskReviewMetrics)
+  private static final com.clarifai.grpc.api.TaskReviewMetrics DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.clarifai.grpc.api.TaskReviewMetrics();
+  }
+
+  public static com.clarifai.grpc.api.TaskReviewMetrics getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<TaskReviewMetrics>
+      PARSER = new com.google.protobuf.AbstractParser<TaskReviewMetrics>() {
+    @java.lang.Override
+    public TaskReviewMetrics parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new TaskReviewMetrics(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<TaskReviewMetrics> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<TaskReviewMetrics> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.clarifai.grpc.api.TaskReviewMetrics getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/src/main/java/com/clarifai/grpc/api/TaskReviewMetricsOrBuilder.java b/src/main/java/com/clarifai/grpc/api/TaskReviewMetricsOrBuilder.java
new file mode 100644
index 0000000..56eadee
--- /dev/null
+++ b/src/main/java/com/clarifai/grpc/api/TaskReviewMetricsOrBuilder.java
@@ -0,0 +1,30 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: proto/clarifai/api/resources.proto
+
+package com.clarifai.grpc.api;
+
+public interface TaskReviewMetricsOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:clarifai.api.TaskReviewMetrics)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * Estimated number of reviewed inputs.
+   * </pre>
+   *
+   * <code>uint64 inputs_count_estimated = 1;</code>
+   * @return The inputsCountEstimated.
+   */
+  long getInputsCountEstimated();
+
+  /**
+   * <pre>
+   * Estimated percent of inputs that were reviewed. Calculated as count of reviewed inputs / total task inputs
+   * This is a value between 0 and 100, where 0 = 0% and 100 = 100%.
+   * </pre>
+   *
+   * <code>uint32 inputs_percent_estimated = 2;</code>
+   * @return The inputsPercentEstimated.
+   */
+  int getInputsPercentEstimated();
+}
diff --git a/src/main/java/com/clarifai/grpc/api/TaskReviewOrBuilder.java b/src/main/java/com/clarifai/grpc/api/TaskReviewOrBuilder.java
index e68dd4a..5e1faf2 100644
--- a/src/main/java/com/clarifai/grpc/api/TaskReviewOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/TaskReviewOrBuilder.java
@@ -34,7 +34,7 @@ public interface TaskReviewOrBuilder extends
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3228
+   *     See proto/clarifai/api/resources.proto;l=3246
    * @return A list containing the userIds.
    */
   @java.lang.Deprecated java.util.List<java.lang.String>
@@ -47,7 +47,7 @@ public interface TaskReviewOrBuilder extends
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3228
+   *     See proto/clarifai/api/resources.proto;l=3246
    * @return The count of userIds.
    */
   @java.lang.Deprecated int getUserIdsCount();
@@ -59,7 +59,7 @@ public interface TaskReviewOrBuilder extends
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3228
+   *     See proto/clarifai/api/resources.proto;l=3246
    * @param index The index of the element to return.
    * @return The userIds at the given index.
    */
@@ -72,7 +72,7 @@ public interface TaskReviewOrBuilder extends
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskReview.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3228
+   *     See proto/clarifai/api/resources.proto;l=3246
    * @param index The index of the value to return.
    * @return The bytes of the userIds at the given index.
    */
diff --git a/src/main/java/com/clarifai/grpc/api/TaskStatusCountPerUser.java b/src/main/java/com/clarifai/grpc/api/TaskStatusCountPerUser.java
index f64787e..9b46f94 100644
--- a/src/main/java/com/clarifai/grpc/api/TaskStatusCountPerUser.java
+++ b/src/main/java/com/clarifai/grpc/api/TaskStatusCountPerUser.java
@@ -142,7 +142,7 @@ private TaskStatusCountPerUser(
    *
    * <code>string user_id = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskStatusCountPerUser.user_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3306
+   *     See proto/clarifai/api/resources.proto;l=3324
    * @return The userId.
    */
   @java.lang.Override
@@ -165,7 +165,7 @@ private TaskStatusCountPerUser(
    *
    * <code>string user_id = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskStatusCountPerUser.user_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3306
+   *     See proto/clarifai/api/resources.proto;l=3324
    * @return The bytes for userId.
    */
   @java.lang.Override
@@ -695,7 +695,7 @@ public Builder mergeFrom(
      *
      * <code>string user_id = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskStatusCountPerUser.user_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3306
+     *     See proto/clarifai/api/resources.proto;l=3324
      * @return The userId.
      */
     @java.lang.Deprecated public java.lang.String getUserId() {
@@ -717,7 +717,7 @@ public Builder mergeFrom(
      *
      * <code>string user_id = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskStatusCountPerUser.user_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3306
+     *     See proto/clarifai/api/resources.proto;l=3324
      * @return The bytes for userId.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -740,7 +740,7 @@ public Builder mergeFrom(
      *
      * <code>string user_id = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskStatusCountPerUser.user_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3306
+     *     See proto/clarifai/api/resources.proto;l=3324
      * @param value The userId to set.
      * @return This builder for chaining.
      */
@@ -761,7 +761,7 @@ public Builder mergeFrom(
      *
      * <code>string user_id = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskStatusCountPerUser.user_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3306
+     *     See proto/clarifai/api/resources.proto;l=3324
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearUserId() {
@@ -777,7 +777,7 @@ public Builder mergeFrom(
      *
      * <code>string user_id = 1 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskStatusCountPerUser.user_id is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3306
+     *     See proto/clarifai/api/resources.proto;l=3324
      * @param value The bytes for userId to set.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/TaskStatusCountPerUserOrBuilder.java b/src/main/java/com/clarifai/grpc/api/TaskStatusCountPerUserOrBuilder.java
index 6b03f6b..abf5604 100644
--- a/src/main/java/com/clarifai/grpc/api/TaskStatusCountPerUserOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/TaskStatusCountPerUserOrBuilder.java
@@ -14,7 +14,7 @@ public interface TaskStatusCountPerUserOrBuilder extends
    *
    * <code>string user_id = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskStatusCountPerUser.user_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3306
+   *     See proto/clarifai/api/resources.proto;l=3324
    * @return The userId.
    */
   @java.lang.Deprecated java.lang.String getUserId();
@@ -25,7 +25,7 @@ public interface TaskStatusCountPerUserOrBuilder extends
    *
    * <code>string user_id = 1 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskStatusCountPerUser.user_id is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3306
+   *     See proto/clarifai/api/resources.proto;l=3324
    * @return The bytes for userId.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
diff --git a/src/main/java/com/clarifai/grpc/api/TaskWorker.java b/src/main/java/com/clarifai/grpc/api/TaskWorker.java
index 3cedf23..2d852b9 100644
--- a/src/main/java/com/clarifai/grpc/api/TaskWorker.java
+++ b/src/main/java/com/clarifai/grpc/api/TaskWorker.java
@@ -358,7 +358,7 @@ public int getNumber() {
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3122
+   *     See proto/clarifai/api/resources.proto;l=3140
    * @return A list containing the userIds.
    */
   @java.lang.Deprecated public com.google.protobuf.ProtocolStringList
@@ -373,7 +373,7 @@ public int getNumber() {
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3122
+   *     See proto/clarifai/api/resources.proto;l=3140
    * @return The count of userIds.
    */
   @java.lang.Deprecated public int getUserIdsCount() {
@@ -387,7 +387,7 @@ public int getNumber() {
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3122
+   *     See proto/clarifai/api/resources.proto;l=3140
    * @param index The index of the element to return.
    * @return The userIds at the given index.
    */
@@ -402,7 +402,7 @@ public int getNumber() {
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3122
+   *     See proto/clarifai/api/resources.proto;l=3140
    * @param index The index of the value to return.
    * @return The bytes of the userIds at the given index.
    */
@@ -1205,7 +1205,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3122
+     *     See proto/clarifai/api/resources.proto;l=3140
      * @return A list containing the userIds.
      */
     @java.lang.Deprecated public com.google.protobuf.ProtocolStringList
@@ -1220,7 +1220,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3122
+     *     See proto/clarifai/api/resources.proto;l=3140
      * @return The count of userIds.
      */
     @java.lang.Deprecated public int getUserIdsCount() {
@@ -1234,7 +1234,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3122
+     *     See proto/clarifai/api/resources.proto;l=3140
      * @param index The index of the element to return.
      * @return The userIds at the given index.
      */
@@ -1249,7 +1249,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3122
+     *     See proto/clarifai/api/resources.proto;l=3140
      * @param index The index of the value to return.
      * @return The bytes of the userIds at the given index.
      */
@@ -1265,7 +1265,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3122
+     *     See proto/clarifai/api/resources.proto;l=3140
      * @param index The index to set the value at.
      * @param value The userIds to set.
      * @return This builder for chaining.
@@ -1288,7 +1288,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3122
+     *     See proto/clarifai/api/resources.proto;l=3140
      * @param value The userIds to add.
      * @return This builder for chaining.
      */
@@ -1310,7 +1310,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3122
+     *     See proto/clarifai/api/resources.proto;l=3140
      * @param values The userIds to add.
      * @return This builder for chaining.
      */
@@ -1330,7 +1330,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3122
+     *     See proto/clarifai/api/resources.proto;l=3140
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearUserIds() {
@@ -1347,7 +1347,7 @@ private void ensureUserIdsIsMutable() {
      *
      * <code>repeated string user_ids = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=3122
+     *     See proto/clarifai/api/resources.proto;l=3140
      * @param value The bytes of the userIds to add.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/TaskWorkerOrBuilder.java b/src/main/java/com/clarifai/grpc/api/TaskWorkerOrBuilder.java
index 4f66dd3..13d89e6 100644
--- a/src/main/java/com/clarifai/grpc/api/TaskWorkerOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/TaskWorkerOrBuilder.java
@@ -34,7 +34,7 @@ public interface TaskWorkerOrBuilder extends
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3122
+   *     See proto/clarifai/api/resources.proto;l=3140
    * @return A list containing the userIds.
    */
   @java.lang.Deprecated java.util.List<java.lang.String>
@@ -47,7 +47,7 @@ public interface TaskWorkerOrBuilder extends
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3122
+   *     See proto/clarifai/api/resources.proto;l=3140
    * @return The count of userIds.
    */
   @java.lang.Deprecated int getUserIdsCount();
@@ -59,7 +59,7 @@ public interface TaskWorkerOrBuilder extends
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3122
+   *     See proto/clarifai/api/resources.proto;l=3140
    * @param index The index of the element to return.
    * @return The userIds at the given index.
    */
@@ -72,7 +72,7 @@ public interface TaskWorkerOrBuilder extends
    *
    * <code>repeated string user_ids = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.TaskWorker.user_ids is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=3122
+   *     See proto/clarifai/api/resources.proto;l=3140
    * @param index The index of the value to return.
    * @return The bytes of the userIds at the given index.
    */
diff --git a/src/main/java/com/clarifai/grpc/api/User.java b/src/main/java/com/clarifai/grpc/api/User.java
index 1bc9ee2..39aaa8b 100644
--- a/src/main/java/com/clarifai/grpc/api/User.java
+++ b/src/main/java/com/clarifai/grpc/api/User.java
@@ -28,6 +28,7 @@ private User() {
     jobTitle_ = "";
     jobRole_ = "";
     intention_ = "";
+    referralSource_ = "";
     billType_ = "";
     emailAddresses_ = java.util.Collections.emptyList();
   }
@@ -250,6 +251,12 @@ private User(
             intention_ = s;
             break;
           }
+          case 202: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            referralSource_ = s;
+            break;
+          }
           default: {
             if (!parseUnknownField(
                 input, unknownFields, extensionRegistry, tag)) {
@@ -330,7 +337,7 @@ public java.lang.String getId() {
   /**
    * <code>string primary_email = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.User.primary_email is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2565
+   *     See proto/clarifai/api/resources.proto;l=2581
    * @return The primaryEmail.
    */
   @java.lang.Override
@@ -349,7 +356,7 @@ public java.lang.String getId() {
   /**
    * <code>string primary_email = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.User.primary_email is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2565
+   *     See proto/clarifai/api/resources.proto;l=2581
    * @return The bytes for primaryEmail.
    */
   @java.lang.Override
@@ -603,12 +610,58 @@ public java.lang.String getIntention() {
     }
   }
 
+  public static final int REFERRAL_SOURCE_FIELD_NUMBER = 25;
+  private volatile java.lang.Object referralSource_;
+  /**
+   * <pre>
+   * This specifies how one got to know about clarifai
+   * </pre>
+   *
+   * <code>string referral_source = 25;</code>
+   * @return The referralSource.
+   */
+  @java.lang.Override
+  public java.lang.String getReferralSource() {
+    java.lang.Object ref = referralSource_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      referralSource_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * This specifies how one got to know about clarifai
+   * </pre>
+   *
+   * <code>string referral_source = 25;</code>
+   * @return The bytes for referralSource.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getReferralSourceBytes() {
+    java.lang.Object ref = referralSource_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      referralSource_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
   public static final int BILL_TYPE_FIELD_NUMBER = 7;
   private volatile java.lang.Object billType_;
   /**
    * <code>string bill_type = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.User.bill_type is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2573
+   *     See proto/clarifai/api/resources.proto;l=2591
    * @return The billType.
    */
   @java.lang.Override
@@ -627,7 +680,7 @@ public java.lang.String getIntention() {
   /**
    * <code>string bill_type = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.User.bill_type is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2573
+   *     See proto/clarifai/api/resources.proto;l=2591
    * @return The bytes for billType.
    */
   @java.lang.Override
@@ -700,7 +753,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
   /**
    * <code>.google.protobuf.Timestamp date_gdpr_consent = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_gdpr_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2581
+   *     See proto/clarifai/api/resources.proto;l=2599
    * @return Whether the dateGdprConsent field is set.
    */
   @java.lang.Override
@@ -710,7 +763,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
   /**
    * <code>.google.protobuf.Timestamp date_gdpr_consent = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_gdpr_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2581
+   *     See proto/clarifai/api/resources.proto;l=2599
    * @return The dateGdprConsent.
    */
   @java.lang.Override
@@ -730,7 +783,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
   /**
    * <code>.google.protobuf.Timestamp date_tos_consent = 9 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_tos_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2582
+   *     See proto/clarifai/api/resources.proto;l=2600
    * @return Whether the dateTosConsent field is set.
    */
   @java.lang.Override
@@ -740,7 +793,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
   /**
    * <code>.google.protobuf.Timestamp date_tos_consent = 9 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_tos_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2582
+   *     See proto/clarifai/api/resources.proto;l=2600
    * @return The dateTosConsent.
    */
   @java.lang.Override
@@ -760,7 +813,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
   /**
    * <code>.google.protobuf.Timestamp date_marketing_consent = 10 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_marketing_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2583
+   *     See proto/clarifai/api/resources.proto;l=2601
    * @return Whether the dateMarketingConsent field is set.
    */
   @java.lang.Override
@@ -770,7 +823,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
   /**
    * <code>.google.protobuf.Timestamp date_marketing_consent = 10 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_marketing_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2583
+   *     See proto/clarifai/api/resources.proto;l=2601
    * @return The dateMarketingConsent.
    */
   @java.lang.Override
@@ -790,7 +843,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
   /**
    * <code>.google.protobuf.Timestamp date_pii_consent = 23 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_pii_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2584
+   *     See proto/clarifai/api/resources.proto;l=2602
    * @return Whether the datePiiConsent field is set.
    */
   @java.lang.Override
@@ -800,7 +853,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
   /**
    * <code>.google.protobuf.Timestamp date_pii_consent = 23 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_pii_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2584
+   *     See proto/clarifai/api/resources.proto;l=2602
    * @return The datePiiConsent.
    */
   @java.lang.Override
@@ -825,7 +878,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
    *
    * <code>.google.protobuf.Struct metadata = 11 [deprecated = true];</code>
    * @deprecated clarifai.api.User.metadata is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2588
+   *     See proto/clarifai/api/resources.proto;l=2606
    * @return Whether the metadata field is set.
    */
   @java.lang.Override
@@ -840,7 +893,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
    *
    * <code>.google.protobuf.Struct metadata = 11 [deprecated = true];</code>
    * @deprecated clarifai.api.User.metadata is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2588
+   *     See proto/clarifai/api/resources.proto;l=2606
    * @return The metadata.
    */
   @java.lang.Override
@@ -905,7 +958,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
   /**
    * <code>bool two_factor_auth_enabled = 15 [deprecated = true];</code>
    * @deprecated clarifai.api.User.two_factor_auth_enabled is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2591
+   *     See proto/clarifai/api/resources.proto;l=2609
    * @return The twoFactorAuthEnabled.
    */
   @java.lang.Override
@@ -918,7 +971,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
   /**
    * <code>uint32 teams_count = 16 [deprecated = true];</code>
    * @deprecated clarifai.api.User.teams_count is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2592
+   *     See proto/clarifai/api/resources.proto;l=2610
    * @return The teamsCount.
    */
   @java.lang.Override
@@ -1126,6 +1179,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output)
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(intention_)) {
       com.google.protobuf.GeneratedMessageV3.writeString(output, 24, intention_);
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(referralSource_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 25, referralSource_);
+    }
     unknownFields.writeTo(output);
   }
 
@@ -1214,6 +1270,9 @@ public int getSerializedSize() {
     if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(intention_)) {
       size += com.google.protobuf.GeneratedMessageV3.computeStringSize(24, intention_);
     }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(referralSource_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(25, referralSource_);
+    }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
     return size;
@@ -1245,6 +1304,8 @@ public boolean equals(final java.lang.Object obj) {
         .equals(other.getJobRole())) return false;
     if (!getIntention()
         .equals(other.getIntention())) return false;
+    if (!getReferralSource()
+        .equals(other.getReferralSource())) return false;
     if (!getBillType()
         .equals(other.getBillType())) return false;
     if (hasCreatedAt() != other.hasCreatedAt()) return false;
@@ -1324,6 +1385,8 @@ public int hashCode() {
     hash = (53 * hash) + getJobRole().hashCode();
     hash = (37 * hash) + INTENTION_FIELD_NUMBER;
     hash = (53 * hash) + getIntention().hashCode();
+    hash = (37 * hash) + REFERRAL_SOURCE_FIELD_NUMBER;
+    hash = (53 * hash) + getReferralSource().hashCode();
     hash = (37 * hash) + BILL_TYPE_FIELD_NUMBER;
     hash = (53 * hash) + getBillType().hashCode();
     if (hasCreatedAt()) {
@@ -1526,6 +1589,8 @@ public Builder clear() {
 
       intention_ = "";
 
+      referralSource_ = "";
+
       billType_ = "";
 
       if (createdAtBuilder_ == null) {
@@ -1625,6 +1690,7 @@ public com.clarifai.grpc.api.User buildPartial() {
       result.jobTitle_ = jobTitle_;
       result.jobRole_ = jobRole_;
       result.intention_ = intention_;
+      result.referralSource_ = referralSource_;
       result.billType_ = billType_;
       if (createdAtBuilder_ == null) {
         result.createdAt_ = createdAt_;
@@ -1759,6 +1825,10 @@ public Builder mergeFrom(com.clarifai.grpc.api.User other) {
         intention_ = other.intention_;
         onChanged();
       }
+      if (!other.getReferralSource().isEmpty()) {
+        referralSource_ = other.referralSource_;
+        onChanged();
+      }
       if (!other.getBillType().isEmpty()) {
         billType_ = other.billType_;
         onChanged();
@@ -1935,7 +2005,7 @@ public Builder setIdBytes(
     /**
      * <code>string primary_email = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.User.primary_email is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2565
+     *     See proto/clarifai/api/resources.proto;l=2581
      * @return The primaryEmail.
      */
     @java.lang.Deprecated public java.lang.String getPrimaryEmail() {
@@ -1953,7 +2023,7 @@ public Builder setIdBytes(
     /**
      * <code>string primary_email = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.User.primary_email is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2565
+     *     See proto/clarifai/api/resources.proto;l=2581
      * @return The bytes for primaryEmail.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -1972,7 +2042,7 @@ public Builder setIdBytes(
     /**
      * <code>string primary_email = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.User.primary_email is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2565
+     *     See proto/clarifai/api/resources.proto;l=2581
      * @param value The primaryEmail to set.
      * @return This builder for chaining.
      */
@@ -1989,7 +2059,7 @@ public Builder setIdBytes(
     /**
      * <code>string primary_email = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.User.primary_email is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2565
+     *     See proto/clarifai/api/resources.proto;l=2581
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearPrimaryEmail() {
@@ -2001,7 +2071,7 @@ public Builder setIdBytes(
     /**
      * <code>string primary_email = 2 [deprecated = true];</code>
      * @deprecated clarifai.api.User.primary_email is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2565
+     *     See proto/clarifai/api/resources.proto;l=2581
      * @param value The bytes for primaryEmail to set.
      * @return This builder for chaining.
      */
@@ -2493,11 +2563,107 @@ public Builder setIntentionBytes(
       return this;
     }
 
+    private java.lang.Object referralSource_ = "";
+    /**
+     * <pre>
+     * This specifies how one got to know about clarifai
+     * </pre>
+     *
+     * <code>string referral_source = 25;</code>
+     * @return The referralSource.
+     */
+    public java.lang.String getReferralSource() {
+      java.lang.Object ref = referralSource_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        referralSource_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * This specifies how one got to know about clarifai
+     * </pre>
+     *
+     * <code>string referral_source = 25;</code>
+     * @return The bytes for referralSource.
+     */
+    public com.google.protobuf.ByteString
+        getReferralSourceBytes() {
+      java.lang.Object ref = referralSource_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        referralSource_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * This specifies how one got to know about clarifai
+     * </pre>
+     *
+     * <code>string referral_source = 25;</code>
+     * @param value The referralSource to set.
+     * @return This builder for chaining.
+     */
+    public Builder setReferralSource(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      referralSource_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * This specifies how one got to know about clarifai
+     * </pre>
+     *
+     * <code>string referral_source = 25;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearReferralSource() {
+      
+      referralSource_ = getDefaultInstance().getReferralSource();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * This specifies how one got to know about clarifai
+     * </pre>
+     *
+     * <code>string referral_source = 25;</code>
+     * @param value The bytes for referralSource to set.
+     * @return This builder for chaining.
+     */
+    public Builder setReferralSourceBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      referralSource_ = value;
+      onChanged();
+      return this;
+    }
+
     private java.lang.Object billType_ = "";
     /**
      * <code>string bill_type = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.User.bill_type is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2573
+     *     See proto/clarifai/api/resources.proto;l=2591
      * @return The billType.
      */
     @java.lang.Deprecated public java.lang.String getBillType() {
@@ -2515,7 +2681,7 @@ public Builder setIntentionBytes(
     /**
      * <code>string bill_type = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.User.bill_type is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2573
+     *     See proto/clarifai/api/resources.proto;l=2591
      * @return The bytes for billType.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -2534,7 +2700,7 @@ public Builder setIntentionBytes(
     /**
      * <code>string bill_type = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.User.bill_type is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2573
+     *     See proto/clarifai/api/resources.proto;l=2591
      * @param value The billType to set.
      * @return This builder for chaining.
      */
@@ -2551,7 +2717,7 @@ public Builder setIntentionBytes(
     /**
      * <code>string bill_type = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.User.bill_type is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2573
+     *     See proto/clarifai/api/resources.proto;l=2591
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearBillType() {
@@ -2563,7 +2729,7 @@ public Builder setIntentionBytes(
     /**
      * <code>string bill_type = 7 [deprecated = true];</code>
      * @deprecated clarifai.api.User.bill_type is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2573
+     *     See proto/clarifai/api/resources.proto;l=2591
      * @param value The bytes for billType to set.
      * @return This builder for chaining.
      */
@@ -2776,7 +2942,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
     /**
      * <code>.google.protobuf.Timestamp date_gdpr_consent = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.User.date_gdpr_consent is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2581
+     *     See proto/clarifai/api/resources.proto;l=2599
      * @return Whether the dateGdprConsent field is set.
      */
     @java.lang.Deprecated public boolean hasDateGdprConsent() {
@@ -2785,7 +2951,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
     /**
      * <code>.google.protobuf.Timestamp date_gdpr_consent = 8 [deprecated = true];</code>
      * @deprecated clarifai.api.User.date_gdpr_consent is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2581
+     *     See proto/clarifai/api/resources.proto;l=2599
      * @return The dateGdprConsent.
      */
     @java.lang.Deprecated public com.google.protobuf.Timestamp getDateGdprConsent() {
@@ -2899,7 +3065,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
     /**
      * <code>.google.protobuf.Timestamp date_tos_consent = 9 [deprecated = true];</code>
      * @deprecated clarifai.api.User.date_tos_consent is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2582
+     *     See proto/clarifai/api/resources.proto;l=2600
      * @return Whether the dateTosConsent field is set.
      */
     @java.lang.Deprecated public boolean hasDateTosConsent() {
@@ -2908,7 +3074,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
     /**
      * <code>.google.protobuf.Timestamp date_tos_consent = 9 [deprecated = true];</code>
      * @deprecated clarifai.api.User.date_tos_consent is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2582
+     *     See proto/clarifai/api/resources.proto;l=2600
      * @return The dateTosConsent.
      */
     @java.lang.Deprecated public com.google.protobuf.Timestamp getDateTosConsent() {
@@ -3022,7 +3188,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
     /**
      * <code>.google.protobuf.Timestamp date_marketing_consent = 10 [deprecated = true];</code>
      * @deprecated clarifai.api.User.date_marketing_consent is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2583
+     *     See proto/clarifai/api/resources.proto;l=2601
      * @return Whether the dateMarketingConsent field is set.
      */
     @java.lang.Deprecated public boolean hasDateMarketingConsent() {
@@ -3031,7 +3197,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
     /**
      * <code>.google.protobuf.Timestamp date_marketing_consent = 10 [deprecated = true];</code>
      * @deprecated clarifai.api.User.date_marketing_consent is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2583
+     *     See proto/clarifai/api/resources.proto;l=2601
      * @return The dateMarketingConsent.
      */
     @java.lang.Deprecated public com.google.protobuf.Timestamp getDateMarketingConsent() {
@@ -3145,7 +3311,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
     /**
      * <code>.google.protobuf.Timestamp date_pii_consent = 23 [deprecated = true];</code>
      * @deprecated clarifai.api.User.date_pii_consent is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2584
+     *     See proto/clarifai/api/resources.proto;l=2602
      * @return Whether the datePiiConsent field is set.
      */
     @java.lang.Deprecated public boolean hasDatePiiConsent() {
@@ -3154,7 +3320,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
     /**
      * <code>.google.protobuf.Timestamp date_pii_consent = 23 [deprecated = true];</code>
      * @deprecated clarifai.api.User.date_pii_consent is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2584
+     *     See proto/clarifai/api/resources.proto;l=2602
      * @return The datePiiConsent.
      */
     @java.lang.Deprecated public com.google.protobuf.Timestamp getDatePiiConsent() {
@@ -3273,7 +3439,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
      *
      * <code>.google.protobuf.Struct metadata = 11 [deprecated = true];</code>
      * @deprecated clarifai.api.User.metadata is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2588
+     *     See proto/clarifai/api/resources.proto;l=2606
      * @return Whether the metadata field is set.
      */
     @java.lang.Deprecated public boolean hasMetadata() {
@@ -3287,7 +3453,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
      *
      * <code>.google.protobuf.Struct metadata = 11 [deprecated = true];</code>
      * @deprecated clarifai.api.User.metadata is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2588
+     *     See proto/clarifai/api/resources.proto;l=2606
      * @return The metadata.
      */
     @java.lang.Deprecated public com.google.protobuf.Struct getMetadata() {
@@ -3674,7 +3840,7 @@ private void ensureEmailAddressesIsMutable() {
     /**
      * <code>bool two_factor_auth_enabled = 15 [deprecated = true];</code>
      * @deprecated clarifai.api.User.two_factor_auth_enabled is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2591
+     *     See proto/clarifai/api/resources.proto;l=2609
      * @return The twoFactorAuthEnabled.
      */
     @java.lang.Override
@@ -3684,7 +3850,7 @@ private void ensureEmailAddressesIsMutable() {
     /**
      * <code>bool two_factor_auth_enabled = 15 [deprecated = true];</code>
      * @deprecated clarifai.api.User.two_factor_auth_enabled is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2591
+     *     See proto/clarifai/api/resources.proto;l=2609
      * @param value The twoFactorAuthEnabled to set.
      * @return This builder for chaining.
      */
@@ -3697,7 +3863,7 @@ private void ensureEmailAddressesIsMutable() {
     /**
      * <code>bool two_factor_auth_enabled = 15 [deprecated = true];</code>
      * @deprecated clarifai.api.User.two_factor_auth_enabled is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2591
+     *     See proto/clarifai/api/resources.proto;l=2609
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearTwoFactorAuthEnabled() {
@@ -3711,7 +3877,7 @@ private void ensureEmailAddressesIsMutable() {
     /**
      * <code>uint32 teams_count = 16 [deprecated = true];</code>
      * @deprecated clarifai.api.User.teams_count is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2592
+     *     See proto/clarifai/api/resources.proto;l=2610
      * @return The teamsCount.
      */
     @java.lang.Override
@@ -3721,7 +3887,7 @@ private void ensureEmailAddressesIsMutable() {
     /**
      * <code>uint32 teams_count = 16 [deprecated = true];</code>
      * @deprecated clarifai.api.User.teams_count is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2592
+     *     See proto/clarifai/api/resources.proto;l=2610
      * @param value The teamsCount to set.
      * @return This builder for chaining.
      */
@@ -3734,7 +3900,7 @@ private void ensureEmailAddressesIsMutable() {
     /**
      * <code>uint32 teams_count = 16 [deprecated = true];</code>
      * @deprecated clarifai.api.User.teams_count is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2592
+     *     See proto/clarifai/api/resources.proto;l=2610
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearTeamsCount() {
diff --git a/src/main/java/com/clarifai/grpc/api/UserOrBuilder.java b/src/main/java/com/clarifai/grpc/api/UserOrBuilder.java
index dfb4d95..46bd726 100644
--- a/src/main/java/com/clarifai/grpc/api/UserOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/UserOrBuilder.java
@@ -22,14 +22,14 @@ public interface UserOrBuilder extends
   /**
    * <code>string primary_email = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.User.primary_email is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2565
+   *     See proto/clarifai/api/resources.proto;l=2581
    * @return The primaryEmail.
    */
   @java.lang.Deprecated java.lang.String getPrimaryEmail();
   /**
    * <code>string primary_email = 2 [deprecated = true];</code>
    * @deprecated clarifai.api.User.primary_email is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2565
+   *     See proto/clarifai/api/resources.proto;l=2581
    * @return The bytes for primaryEmail.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -115,17 +115,37 @@ public interface UserOrBuilder extends
   com.google.protobuf.ByteString
       getIntentionBytes();
 
+  /**
+   * <pre>
+   * This specifies how one got to know about clarifai
+   * </pre>
+   *
+   * <code>string referral_source = 25;</code>
+   * @return The referralSource.
+   */
+  java.lang.String getReferralSource();
+  /**
+   * <pre>
+   * This specifies how one got to know about clarifai
+   * </pre>
+   *
+   * <code>string referral_source = 25;</code>
+   * @return The bytes for referralSource.
+   */
+  com.google.protobuf.ByteString
+      getReferralSourceBytes();
+
   /**
    * <code>string bill_type = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.User.bill_type is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2573
+   *     See proto/clarifai/api/resources.proto;l=2591
    * @return The billType.
    */
   @java.lang.Deprecated java.lang.String getBillType();
   /**
    * <code>string bill_type = 7 [deprecated = true];</code>
    * @deprecated clarifai.api.User.bill_type is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2573
+   *     See proto/clarifai/api/resources.proto;l=2591
    * @return The bytes for billType.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
@@ -173,14 +193,14 @@ public interface UserOrBuilder extends
   /**
    * <code>.google.protobuf.Timestamp date_gdpr_consent = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_gdpr_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2581
+   *     See proto/clarifai/api/resources.proto;l=2599
    * @return Whether the dateGdprConsent field is set.
    */
   @java.lang.Deprecated boolean hasDateGdprConsent();
   /**
    * <code>.google.protobuf.Timestamp date_gdpr_consent = 8 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_gdpr_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2581
+   *     See proto/clarifai/api/resources.proto;l=2599
    * @return The dateGdprConsent.
    */
   @java.lang.Deprecated com.google.protobuf.Timestamp getDateGdprConsent();
@@ -192,14 +212,14 @@ public interface UserOrBuilder extends
   /**
    * <code>.google.protobuf.Timestamp date_tos_consent = 9 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_tos_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2582
+   *     See proto/clarifai/api/resources.proto;l=2600
    * @return Whether the dateTosConsent field is set.
    */
   @java.lang.Deprecated boolean hasDateTosConsent();
   /**
    * <code>.google.protobuf.Timestamp date_tos_consent = 9 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_tos_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2582
+   *     See proto/clarifai/api/resources.proto;l=2600
    * @return The dateTosConsent.
    */
   @java.lang.Deprecated com.google.protobuf.Timestamp getDateTosConsent();
@@ -211,14 +231,14 @@ public interface UserOrBuilder extends
   /**
    * <code>.google.protobuf.Timestamp date_marketing_consent = 10 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_marketing_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2583
+   *     See proto/clarifai/api/resources.proto;l=2601
    * @return Whether the dateMarketingConsent field is set.
    */
   @java.lang.Deprecated boolean hasDateMarketingConsent();
   /**
    * <code>.google.protobuf.Timestamp date_marketing_consent = 10 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_marketing_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2583
+   *     See proto/clarifai/api/resources.proto;l=2601
    * @return The dateMarketingConsent.
    */
   @java.lang.Deprecated com.google.protobuf.Timestamp getDateMarketingConsent();
@@ -230,14 +250,14 @@ public interface UserOrBuilder extends
   /**
    * <code>.google.protobuf.Timestamp date_pii_consent = 23 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_pii_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2584
+   *     See proto/clarifai/api/resources.proto;l=2602
    * @return Whether the datePiiConsent field is set.
    */
   @java.lang.Deprecated boolean hasDatePiiConsent();
   /**
    * <code>.google.protobuf.Timestamp date_pii_consent = 23 [deprecated = true];</code>
    * @deprecated clarifai.api.User.date_pii_consent is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2584
+   *     See proto/clarifai/api/resources.proto;l=2602
    * @return The datePiiConsent.
    */
   @java.lang.Deprecated com.google.protobuf.Timestamp getDatePiiConsent();
@@ -254,7 +274,7 @@ public interface UserOrBuilder extends
    *
    * <code>.google.protobuf.Struct metadata = 11 [deprecated = true];</code>
    * @deprecated clarifai.api.User.metadata is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2588
+   *     See proto/clarifai/api/resources.proto;l=2606
    * @return Whether the metadata field is set.
    */
   @java.lang.Deprecated boolean hasMetadata();
@@ -266,7 +286,7 @@ public interface UserOrBuilder extends
    *
    * <code>.google.protobuf.Struct metadata = 11 [deprecated = true];</code>
    * @deprecated clarifai.api.User.metadata is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2588
+   *     See proto/clarifai/api/resources.proto;l=2606
    * @return The metadata.
    */
   @java.lang.Deprecated com.google.protobuf.Struct getMetadata();
@@ -307,7 +327,7 @@ public interface UserOrBuilder extends
   /**
    * <code>bool two_factor_auth_enabled = 15 [deprecated = true];</code>
    * @deprecated clarifai.api.User.two_factor_auth_enabled is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2591
+   *     See proto/clarifai/api/resources.proto;l=2609
    * @return The twoFactorAuthEnabled.
    */
   @java.lang.Deprecated boolean getTwoFactorAuthEnabled();
@@ -315,7 +335,7 @@ public interface UserOrBuilder extends
   /**
    * <code>uint32 teams_count = 16 [deprecated = true];</code>
    * @deprecated clarifai.api.User.teams_count is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2592
+   *     See proto/clarifai/api/resources.proto;l=2610
    * @return The teamsCount.
    */
   @java.lang.Deprecated int getTeamsCount();
diff --git a/src/main/java/com/clarifai/grpc/api/V2Grpc.java b/src/main/java/com/clarifai/grpc/api/V2Grpc.java
index a65cb59..c50fc3a 100644
--- a/src/main/java/com/clarifai/grpc/api/V2Grpc.java
+++ b/src/main/java/com/clarifai/grpc/api/V2Grpc.java
@@ -6897,6 +6897,285 @@ com.clarifai.grpc.api.MultiTrainingTimeEstimateResponse> getPostModelVersionsTra
     return getPostModelVersionsTrainingTimeEstimateMethod;
   }
 
+  private static volatile io.grpc.MethodDescriptor<com.clarifai.grpc.api.GetComputeClusterRequest,
+      com.clarifai.grpc.api.SingleComputeClusterResponse> getGetComputeClusterMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetComputeCluster",
+      requestType = com.clarifai.grpc.api.GetComputeClusterRequest.class,
+      responseType = com.clarifai.grpc.api.SingleComputeClusterResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.clarifai.grpc.api.GetComputeClusterRequest,
+      com.clarifai.grpc.api.SingleComputeClusterResponse> getGetComputeClusterMethod() {
+    io.grpc.MethodDescriptor<com.clarifai.grpc.api.GetComputeClusterRequest, com.clarifai.grpc.api.SingleComputeClusterResponse> getGetComputeClusterMethod;
+    if ((getGetComputeClusterMethod = V2Grpc.getGetComputeClusterMethod) == null) {
+      synchronized (V2Grpc.class) {
+        if ((getGetComputeClusterMethod = V2Grpc.getGetComputeClusterMethod) == null) {
+          V2Grpc.getGetComputeClusterMethod = getGetComputeClusterMethod =
+              io.grpc.MethodDescriptor.<com.clarifai.grpc.api.GetComputeClusterRequest, com.clarifai.grpc.api.SingleComputeClusterResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetComputeCluster"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.GetComputeClusterRequest.getDefaultInstance()))
+              .setResponseMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.SingleComputeClusterResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new V2MethodDescriptorSupplier("GetComputeCluster"))
+              .build();
+        }
+      }
+    }
+    return getGetComputeClusterMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.clarifai.grpc.api.ListComputeClustersRequest,
+      com.clarifai.grpc.api.MultiComputeClusterResponse> getListComputeClustersMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "ListComputeClusters",
+      requestType = com.clarifai.grpc.api.ListComputeClustersRequest.class,
+      responseType = com.clarifai.grpc.api.MultiComputeClusterResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.clarifai.grpc.api.ListComputeClustersRequest,
+      com.clarifai.grpc.api.MultiComputeClusterResponse> getListComputeClustersMethod() {
+    io.grpc.MethodDescriptor<com.clarifai.grpc.api.ListComputeClustersRequest, com.clarifai.grpc.api.MultiComputeClusterResponse> getListComputeClustersMethod;
+    if ((getListComputeClustersMethod = V2Grpc.getListComputeClustersMethod) == null) {
+      synchronized (V2Grpc.class) {
+        if ((getListComputeClustersMethod = V2Grpc.getListComputeClustersMethod) == null) {
+          V2Grpc.getListComputeClustersMethod = getListComputeClustersMethod =
+              io.grpc.MethodDescriptor.<com.clarifai.grpc.api.ListComputeClustersRequest, com.clarifai.grpc.api.MultiComputeClusterResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "ListComputeClusters"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.ListComputeClustersRequest.getDefaultInstance()))
+              .setResponseMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.MultiComputeClusterResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new V2MethodDescriptorSupplier("ListComputeClusters"))
+              .build();
+        }
+      }
+    }
+    return getListComputeClustersMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.clarifai.grpc.api.PostComputeClustersRequest,
+      com.clarifai.grpc.api.MultiComputeClusterResponse> getPostComputeClustersMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "PostComputeClusters",
+      requestType = com.clarifai.grpc.api.PostComputeClustersRequest.class,
+      responseType = com.clarifai.grpc.api.MultiComputeClusterResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.clarifai.grpc.api.PostComputeClustersRequest,
+      com.clarifai.grpc.api.MultiComputeClusterResponse> getPostComputeClustersMethod() {
+    io.grpc.MethodDescriptor<com.clarifai.grpc.api.PostComputeClustersRequest, com.clarifai.grpc.api.MultiComputeClusterResponse> getPostComputeClustersMethod;
+    if ((getPostComputeClustersMethod = V2Grpc.getPostComputeClustersMethod) == null) {
+      synchronized (V2Grpc.class) {
+        if ((getPostComputeClustersMethod = V2Grpc.getPostComputeClustersMethod) == null) {
+          V2Grpc.getPostComputeClustersMethod = getPostComputeClustersMethod =
+              io.grpc.MethodDescriptor.<com.clarifai.grpc.api.PostComputeClustersRequest, com.clarifai.grpc.api.MultiComputeClusterResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "PostComputeClusters"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.PostComputeClustersRequest.getDefaultInstance()))
+              .setResponseMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.MultiComputeClusterResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new V2MethodDescriptorSupplier("PostComputeClusters"))
+              .build();
+        }
+      }
+    }
+    return getPostComputeClustersMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.clarifai.grpc.api.DeleteComputeClustersRequest,
+      com.clarifai.grpc.api.status.BaseResponse> getDeleteComputeClustersMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "DeleteComputeClusters",
+      requestType = com.clarifai.grpc.api.DeleteComputeClustersRequest.class,
+      responseType = com.clarifai.grpc.api.status.BaseResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.clarifai.grpc.api.DeleteComputeClustersRequest,
+      com.clarifai.grpc.api.status.BaseResponse> getDeleteComputeClustersMethod() {
+    io.grpc.MethodDescriptor<com.clarifai.grpc.api.DeleteComputeClustersRequest, com.clarifai.grpc.api.status.BaseResponse> getDeleteComputeClustersMethod;
+    if ((getDeleteComputeClustersMethod = V2Grpc.getDeleteComputeClustersMethod) == null) {
+      synchronized (V2Grpc.class) {
+        if ((getDeleteComputeClustersMethod = V2Grpc.getDeleteComputeClustersMethod) == null) {
+          V2Grpc.getDeleteComputeClustersMethod = getDeleteComputeClustersMethod =
+              io.grpc.MethodDescriptor.<com.clarifai.grpc.api.DeleteComputeClustersRequest, com.clarifai.grpc.api.status.BaseResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "DeleteComputeClusters"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.DeleteComputeClustersRequest.getDefaultInstance()))
+              .setResponseMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.status.BaseResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new V2MethodDescriptorSupplier("DeleteComputeClusters"))
+              .build();
+        }
+      }
+    }
+    return getDeleteComputeClustersMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.clarifai.grpc.api.GetNodepoolRequest,
+      com.clarifai.grpc.api.SingleNodepoolResponse> getGetNodepoolMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetNodepool",
+      requestType = com.clarifai.grpc.api.GetNodepoolRequest.class,
+      responseType = com.clarifai.grpc.api.SingleNodepoolResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.clarifai.grpc.api.GetNodepoolRequest,
+      com.clarifai.grpc.api.SingleNodepoolResponse> getGetNodepoolMethod() {
+    io.grpc.MethodDescriptor<com.clarifai.grpc.api.GetNodepoolRequest, com.clarifai.grpc.api.SingleNodepoolResponse> getGetNodepoolMethod;
+    if ((getGetNodepoolMethod = V2Grpc.getGetNodepoolMethod) == null) {
+      synchronized (V2Grpc.class) {
+        if ((getGetNodepoolMethod = V2Grpc.getGetNodepoolMethod) == null) {
+          V2Grpc.getGetNodepoolMethod = getGetNodepoolMethod =
+              io.grpc.MethodDescriptor.<com.clarifai.grpc.api.GetNodepoolRequest, com.clarifai.grpc.api.SingleNodepoolResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetNodepool"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.GetNodepoolRequest.getDefaultInstance()))
+              .setResponseMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.SingleNodepoolResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new V2MethodDescriptorSupplier("GetNodepool"))
+              .build();
+        }
+      }
+    }
+    return getGetNodepoolMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.clarifai.grpc.api.ListNodepoolsRequest,
+      com.clarifai.grpc.api.MultiNodepoolResponse> getListNodepoolsMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "ListNodepools",
+      requestType = com.clarifai.grpc.api.ListNodepoolsRequest.class,
+      responseType = com.clarifai.grpc.api.MultiNodepoolResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.clarifai.grpc.api.ListNodepoolsRequest,
+      com.clarifai.grpc.api.MultiNodepoolResponse> getListNodepoolsMethod() {
+    io.grpc.MethodDescriptor<com.clarifai.grpc.api.ListNodepoolsRequest, com.clarifai.grpc.api.MultiNodepoolResponse> getListNodepoolsMethod;
+    if ((getListNodepoolsMethod = V2Grpc.getListNodepoolsMethod) == null) {
+      synchronized (V2Grpc.class) {
+        if ((getListNodepoolsMethod = V2Grpc.getListNodepoolsMethod) == null) {
+          V2Grpc.getListNodepoolsMethod = getListNodepoolsMethod =
+              io.grpc.MethodDescriptor.<com.clarifai.grpc.api.ListNodepoolsRequest, com.clarifai.grpc.api.MultiNodepoolResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "ListNodepools"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.ListNodepoolsRequest.getDefaultInstance()))
+              .setResponseMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.MultiNodepoolResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new V2MethodDescriptorSupplier("ListNodepools"))
+              .build();
+        }
+      }
+    }
+    return getListNodepoolsMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.clarifai.grpc.api.PostNodepoolsRequest,
+      com.clarifai.grpc.api.MultiNodepoolResponse> getPostNodepoolsMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "PostNodepools",
+      requestType = com.clarifai.grpc.api.PostNodepoolsRequest.class,
+      responseType = com.clarifai.grpc.api.MultiNodepoolResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.clarifai.grpc.api.PostNodepoolsRequest,
+      com.clarifai.grpc.api.MultiNodepoolResponse> getPostNodepoolsMethod() {
+    io.grpc.MethodDescriptor<com.clarifai.grpc.api.PostNodepoolsRequest, com.clarifai.grpc.api.MultiNodepoolResponse> getPostNodepoolsMethod;
+    if ((getPostNodepoolsMethod = V2Grpc.getPostNodepoolsMethod) == null) {
+      synchronized (V2Grpc.class) {
+        if ((getPostNodepoolsMethod = V2Grpc.getPostNodepoolsMethod) == null) {
+          V2Grpc.getPostNodepoolsMethod = getPostNodepoolsMethod =
+              io.grpc.MethodDescriptor.<com.clarifai.grpc.api.PostNodepoolsRequest, com.clarifai.grpc.api.MultiNodepoolResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "PostNodepools"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.PostNodepoolsRequest.getDefaultInstance()))
+              .setResponseMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.MultiNodepoolResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new V2MethodDescriptorSupplier("PostNodepools"))
+              .build();
+        }
+      }
+    }
+    return getPostNodepoolsMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.clarifai.grpc.api.PatchNodepoolsRequest,
+      com.clarifai.grpc.api.MultiNodepoolResponse> getPatchNodepoolsMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "PatchNodepools",
+      requestType = com.clarifai.grpc.api.PatchNodepoolsRequest.class,
+      responseType = com.clarifai.grpc.api.MultiNodepoolResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.clarifai.grpc.api.PatchNodepoolsRequest,
+      com.clarifai.grpc.api.MultiNodepoolResponse> getPatchNodepoolsMethod() {
+    io.grpc.MethodDescriptor<com.clarifai.grpc.api.PatchNodepoolsRequest, com.clarifai.grpc.api.MultiNodepoolResponse> getPatchNodepoolsMethod;
+    if ((getPatchNodepoolsMethod = V2Grpc.getPatchNodepoolsMethod) == null) {
+      synchronized (V2Grpc.class) {
+        if ((getPatchNodepoolsMethod = V2Grpc.getPatchNodepoolsMethod) == null) {
+          V2Grpc.getPatchNodepoolsMethod = getPatchNodepoolsMethod =
+              io.grpc.MethodDescriptor.<com.clarifai.grpc.api.PatchNodepoolsRequest, com.clarifai.grpc.api.MultiNodepoolResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "PatchNodepools"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.PatchNodepoolsRequest.getDefaultInstance()))
+              .setResponseMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.MultiNodepoolResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new V2MethodDescriptorSupplier("PatchNodepools"))
+              .build();
+        }
+      }
+    }
+    return getPatchNodepoolsMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.clarifai.grpc.api.DeleteNodepoolsRequest,
+      com.clarifai.grpc.api.status.BaseResponse> getDeleteNodepoolsMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "DeleteNodepools",
+      requestType = com.clarifai.grpc.api.DeleteNodepoolsRequest.class,
+      responseType = com.clarifai.grpc.api.status.BaseResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.clarifai.grpc.api.DeleteNodepoolsRequest,
+      com.clarifai.grpc.api.status.BaseResponse> getDeleteNodepoolsMethod() {
+    io.grpc.MethodDescriptor<com.clarifai.grpc.api.DeleteNodepoolsRequest, com.clarifai.grpc.api.status.BaseResponse> getDeleteNodepoolsMethod;
+    if ((getDeleteNodepoolsMethod = V2Grpc.getDeleteNodepoolsMethod) == null) {
+      synchronized (V2Grpc.class) {
+        if ((getDeleteNodepoolsMethod = V2Grpc.getDeleteNodepoolsMethod) == null) {
+          V2Grpc.getDeleteNodepoolsMethod = getDeleteNodepoolsMethod =
+              io.grpc.MethodDescriptor.<com.clarifai.grpc.api.DeleteNodepoolsRequest, com.clarifai.grpc.api.status.BaseResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "DeleteNodepools"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.DeleteNodepoolsRequest.getDefaultInstance()))
+              .setResponseMarshaller(com.clarifai.channel.ClarifaiChannel.INSTANCE.marshaller(
+                  com.clarifai.grpc.api.status.BaseResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new V2MethodDescriptorSupplier("DeleteNodepools"))
+              .build();
+        }
+      }
+    }
+    return getDeleteNodepoolsMethod;
+  }
+
   /**
    * Creates a new async stub that supports all call types for the service
    */
@@ -9231,6 +9510,81 @@ public void postModelVersionsTrainingTimeEstimate(com.clarifai.grpc.api.PostMode
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPostModelVersionsTrainingTimeEstimateMethod(), responseObserver);
     }
 
+    /**
+     * <pre>
+     * ComputeCluster CRUD
+     * </pre>
+     */
+    public void getComputeCluster(com.clarifai.grpc.api.GetComputeClusterRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.SingleComputeClusterResponse> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetComputeClusterMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void listComputeClusters(com.clarifai.grpc.api.ListComputeClustersRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiComputeClusterResponse> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListComputeClustersMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void postComputeClusters(com.clarifai.grpc.api.PostComputeClustersRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiComputeClusterResponse> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPostComputeClustersMethod(), responseObserver);
+    }
+
+    /**
+     * <pre>
+     * Delete multiple compute_clusters in one request.
+     * </pre>
+     */
+    public void deleteComputeClusters(com.clarifai.grpc.api.DeleteComputeClustersRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.status.BaseResponse> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteComputeClustersMethod(), responseObserver);
+    }
+
+    /**
+     * <pre>
+     * Nodepools CRUD
+     * </pre>
+     */
+    public void getNodepool(com.clarifai.grpc.api.GetNodepoolRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.SingleNodepoolResponse> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetNodepoolMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void listNodepools(com.clarifai.grpc.api.ListNodepoolsRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiNodepoolResponse> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListNodepoolsMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void postNodepools(com.clarifai.grpc.api.PostNodepoolsRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiNodepoolResponse> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPostNodepoolsMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void patchNodepools(com.clarifai.grpc.api.PatchNodepoolsRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiNodepoolResponse> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPatchNodepoolsMethod(), responseObserver);
+    }
+
+    /**
+     * <pre>
+     * Delete multiple nodepools in one request.
+     * </pre>
+     */
+    public void deleteNodepools(com.clarifai.grpc.api.DeleteNodepoolsRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.status.BaseResponse> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteNodepoolsMethod(), responseObserver);
+    }
+
     @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
       return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
           .addMethod(
@@ -10787,6 +11141,69 @@ public void postModelVersionsTrainingTimeEstimate(com.clarifai.grpc.api.PostMode
                 com.clarifai.grpc.api.PostModelVersionsTrainingTimeEstimateRequest,
                 com.clarifai.grpc.api.MultiTrainingTimeEstimateResponse>(
                   this, METHODID_POST_MODEL_VERSIONS_TRAINING_TIME_ESTIMATE)))
+          .addMethod(
+            getGetComputeClusterMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                com.clarifai.grpc.api.GetComputeClusterRequest,
+                com.clarifai.grpc.api.SingleComputeClusterResponse>(
+                  this, METHODID_GET_COMPUTE_CLUSTER)))
+          .addMethod(
+            getListComputeClustersMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                com.clarifai.grpc.api.ListComputeClustersRequest,
+                com.clarifai.grpc.api.MultiComputeClusterResponse>(
+                  this, METHODID_LIST_COMPUTE_CLUSTERS)))
+          .addMethod(
+            getPostComputeClustersMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                com.clarifai.grpc.api.PostComputeClustersRequest,
+                com.clarifai.grpc.api.MultiComputeClusterResponse>(
+                  this, METHODID_POST_COMPUTE_CLUSTERS)))
+          .addMethod(
+            getDeleteComputeClustersMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                com.clarifai.grpc.api.DeleteComputeClustersRequest,
+                com.clarifai.grpc.api.status.BaseResponse>(
+                  this, METHODID_DELETE_COMPUTE_CLUSTERS)))
+          .addMethod(
+            getGetNodepoolMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                com.clarifai.grpc.api.GetNodepoolRequest,
+                com.clarifai.grpc.api.SingleNodepoolResponse>(
+                  this, METHODID_GET_NODEPOOL)))
+          .addMethod(
+            getListNodepoolsMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                com.clarifai.grpc.api.ListNodepoolsRequest,
+                com.clarifai.grpc.api.MultiNodepoolResponse>(
+                  this, METHODID_LIST_NODEPOOLS)))
+          .addMethod(
+            getPostNodepoolsMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                com.clarifai.grpc.api.PostNodepoolsRequest,
+                com.clarifai.grpc.api.MultiNodepoolResponse>(
+                  this, METHODID_POST_NODEPOOLS)))
+          .addMethod(
+            getPatchNodepoolsMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                com.clarifai.grpc.api.PatchNodepoolsRequest,
+                com.clarifai.grpc.api.MultiNodepoolResponse>(
+                  this, METHODID_PATCH_NODEPOOLS)))
+          .addMethod(
+            getDeleteNodepoolsMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                com.clarifai.grpc.api.DeleteNodepoolsRequest,
+                com.clarifai.grpc.api.status.BaseResponse>(
+                  this, METHODID_DELETE_NODEPOOLS)))
           .build();
     }
   }
@@ -13312,6 +13729,90 @@ public void postModelVersionsTrainingTimeEstimate(com.clarifai.grpc.api.PostMode
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getPostModelVersionsTrainingTimeEstimateMethod(), getCallOptions()), request, responseObserver);
     }
+
+    /**
+     * <pre>
+     * ComputeCluster CRUD
+     * </pre>
+     */
+    public void getComputeCluster(com.clarifai.grpc.api.GetComputeClusterRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.SingleComputeClusterResponse> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getGetComputeClusterMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void listComputeClusters(com.clarifai.grpc.api.ListComputeClustersRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiComputeClusterResponse> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getListComputeClustersMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void postComputeClusters(com.clarifai.grpc.api.PostComputeClustersRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiComputeClusterResponse> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getPostComputeClustersMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     * <pre>
+     * Delete multiple compute_clusters in one request.
+     * </pre>
+     */
+    public void deleteComputeClusters(com.clarifai.grpc.api.DeleteComputeClustersRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.status.BaseResponse> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getDeleteComputeClustersMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     * <pre>
+     * Nodepools CRUD
+     * </pre>
+     */
+    public void getNodepool(com.clarifai.grpc.api.GetNodepoolRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.SingleNodepoolResponse> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getGetNodepoolMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void listNodepools(com.clarifai.grpc.api.ListNodepoolsRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiNodepoolResponse> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getListNodepoolsMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void postNodepools(com.clarifai.grpc.api.PostNodepoolsRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiNodepoolResponse> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getPostNodepoolsMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void patchNodepools(com.clarifai.grpc.api.PatchNodepoolsRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiNodepoolResponse> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getPatchNodepoolsMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     * <pre>
+     * Delete multiple nodepools in one request.
+     * </pre>
+     */
+    public void deleteNodepools(com.clarifai.grpc.api.DeleteNodepoolsRequest request,
+        io.grpc.stub.StreamObserver<com.clarifai.grpc.api.status.BaseResponse> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getDeleteNodepoolsMethod(), getCallOptions()), request, responseObserver);
+    }
   }
 
   /**
@@ -15575,6 +16076,81 @@ public com.clarifai.grpc.api.MultiTrainingTimeEstimateResponse postModelVersions
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getPostModelVersionsTrainingTimeEstimateMethod(), getCallOptions(), request);
     }
+
+    /**
+     * <pre>
+     * ComputeCluster CRUD
+     * </pre>
+     */
+    public com.clarifai.grpc.api.SingleComputeClusterResponse getComputeCluster(com.clarifai.grpc.api.GetComputeClusterRequest request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getGetComputeClusterMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public com.clarifai.grpc.api.MultiComputeClusterResponse listComputeClusters(com.clarifai.grpc.api.ListComputeClustersRequest request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getListComputeClustersMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public com.clarifai.grpc.api.MultiComputeClusterResponse postComputeClusters(com.clarifai.grpc.api.PostComputeClustersRequest request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getPostComputeClustersMethod(), getCallOptions(), request);
+    }
+
+    /**
+     * <pre>
+     * Delete multiple compute_clusters in one request.
+     * </pre>
+     */
+    public com.clarifai.grpc.api.status.BaseResponse deleteComputeClusters(com.clarifai.grpc.api.DeleteComputeClustersRequest request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getDeleteComputeClustersMethod(), getCallOptions(), request);
+    }
+
+    /**
+     * <pre>
+     * Nodepools CRUD
+     * </pre>
+     */
+    public com.clarifai.grpc.api.SingleNodepoolResponse getNodepool(com.clarifai.grpc.api.GetNodepoolRequest request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getGetNodepoolMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public com.clarifai.grpc.api.MultiNodepoolResponse listNodepools(com.clarifai.grpc.api.ListNodepoolsRequest request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getListNodepoolsMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public com.clarifai.grpc.api.MultiNodepoolResponse postNodepools(com.clarifai.grpc.api.PostNodepoolsRequest request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getPostNodepoolsMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public com.clarifai.grpc.api.MultiNodepoolResponse patchNodepools(com.clarifai.grpc.api.PatchNodepoolsRequest request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getPatchNodepoolsMethod(), getCallOptions(), request);
+    }
+
+    /**
+     * <pre>
+     * Delete multiple nodepools in one request.
+     * </pre>
+     */
+    public com.clarifai.grpc.api.status.BaseResponse deleteNodepools(com.clarifai.grpc.api.DeleteNodepoolsRequest request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getDeleteNodepoolsMethod(), getCallOptions(), request);
+    }
   }
 
   /**
@@ -18044,6 +18620,90 @@ public com.google.common.util.concurrent.ListenableFuture<com.clarifai.grpc.api.
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getPostModelVersionsTrainingTimeEstimateMethod(), getCallOptions()), request);
     }
+
+    /**
+     * <pre>
+     * ComputeCluster CRUD
+     * </pre>
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.clarifai.grpc.api.SingleComputeClusterResponse> getComputeCluster(
+        com.clarifai.grpc.api.GetComputeClusterRequest request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getGetComputeClusterMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.clarifai.grpc.api.MultiComputeClusterResponse> listComputeClusters(
+        com.clarifai.grpc.api.ListComputeClustersRequest request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getListComputeClustersMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.clarifai.grpc.api.MultiComputeClusterResponse> postComputeClusters(
+        com.clarifai.grpc.api.PostComputeClustersRequest request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getPostComputeClustersMethod(), getCallOptions()), request);
+    }
+
+    /**
+     * <pre>
+     * Delete multiple compute_clusters in one request.
+     * </pre>
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.clarifai.grpc.api.status.BaseResponse> deleteComputeClusters(
+        com.clarifai.grpc.api.DeleteComputeClustersRequest request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getDeleteComputeClustersMethod(), getCallOptions()), request);
+    }
+
+    /**
+     * <pre>
+     * Nodepools CRUD
+     * </pre>
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.clarifai.grpc.api.SingleNodepoolResponse> getNodepool(
+        com.clarifai.grpc.api.GetNodepoolRequest request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getGetNodepoolMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.clarifai.grpc.api.MultiNodepoolResponse> listNodepools(
+        com.clarifai.grpc.api.ListNodepoolsRequest request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getListNodepoolsMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.clarifai.grpc.api.MultiNodepoolResponse> postNodepools(
+        com.clarifai.grpc.api.PostNodepoolsRequest request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getPostNodepoolsMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.clarifai.grpc.api.MultiNodepoolResponse> patchNodepools(
+        com.clarifai.grpc.api.PatchNodepoolsRequest request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getPatchNodepoolsMethod(), getCallOptions()), request);
+    }
+
+    /**
+     * <pre>
+     * Delete multiple nodepools in one request.
+     * </pre>
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.clarifai.grpc.api.status.BaseResponse> deleteNodepools(
+        com.clarifai.grpc.api.DeleteNodepoolsRequest request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getDeleteNodepoolsMethod(), getCallOptions()), request);
+    }
   }
 
   private static final int METHODID_LIST_CONCEPT_RELATIONS = 0;
@@ -18265,9 +18925,18 @@ public com.google.common.util.concurrent.ListenableFuture<com.clarifai.grpc.api.
   private static final int METHODID_LIST_RUNNER_ITEMS = 216;
   private static final int METHODID_POST_RUNNER_ITEM_OUTPUTS = 217;
   private static final int METHODID_POST_MODEL_VERSIONS_TRAINING_TIME_ESTIMATE = 218;
-  private static final int METHODID_STREAM_MODEL_OUTPUTS = 219;
-  private static final int METHODID_POST_MODEL_VERSIONS_UPLOAD = 220;
-  private static final int METHODID_PROCESS_RUNNER_ITEMS = 221;
+  private static final int METHODID_GET_COMPUTE_CLUSTER = 219;
+  private static final int METHODID_LIST_COMPUTE_CLUSTERS = 220;
+  private static final int METHODID_POST_COMPUTE_CLUSTERS = 221;
+  private static final int METHODID_DELETE_COMPUTE_CLUSTERS = 222;
+  private static final int METHODID_GET_NODEPOOL = 223;
+  private static final int METHODID_LIST_NODEPOOLS = 224;
+  private static final int METHODID_POST_NODEPOOLS = 225;
+  private static final int METHODID_PATCH_NODEPOOLS = 226;
+  private static final int METHODID_DELETE_NODEPOOLS = 227;
+  private static final int METHODID_STREAM_MODEL_OUTPUTS = 228;
+  private static final int METHODID_POST_MODEL_VERSIONS_UPLOAD = 229;
+  private static final int METHODID_PROCESS_RUNNER_ITEMS = 230;
 
   private static final class MethodHandlers<Req, Resp> implements
       io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -19162,6 +19831,42 @@ public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserv
           serviceImpl.postModelVersionsTrainingTimeEstimate((com.clarifai.grpc.api.PostModelVersionsTrainingTimeEstimateRequest) request,
               (io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiTrainingTimeEstimateResponse>) responseObserver);
           break;
+        case METHODID_GET_COMPUTE_CLUSTER:
+          serviceImpl.getComputeCluster((com.clarifai.grpc.api.GetComputeClusterRequest) request,
+              (io.grpc.stub.StreamObserver<com.clarifai.grpc.api.SingleComputeClusterResponse>) responseObserver);
+          break;
+        case METHODID_LIST_COMPUTE_CLUSTERS:
+          serviceImpl.listComputeClusters((com.clarifai.grpc.api.ListComputeClustersRequest) request,
+              (io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiComputeClusterResponse>) responseObserver);
+          break;
+        case METHODID_POST_COMPUTE_CLUSTERS:
+          serviceImpl.postComputeClusters((com.clarifai.grpc.api.PostComputeClustersRequest) request,
+              (io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiComputeClusterResponse>) responseObserver);
+          break;
+        case METHODID_DELETE_COMPUTE_CLUSTERS:
+          serviceImpl.deleteComputeClusters((com.clarifai.grpc.api.DeleteComputeClustersRequest) request,
+              (io.grpc.stub.StreamObserver<com.clarifai.grpc.api.status.BaseResponse>) responseObserver);
+          break;
+        case METHODID_GET_NODEPOOL:
+          serviceImpl.getNodepool((com.clarifai.grpc.api.GetNodepoolRequest) request,
+              (io.grpc.stub.StreamObserver<com.clarifai.grpc.api.SingleNodepoolResponse>) responseObserver);
+          break;
+        case METHODID_LIST_NODEPOOLS:
+          serviceImpl.listNodepools((com.clarifai.grpc.api.ListNodepoolsRequest) request,
+              (io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiNodepoolResponse>) responseObserver);
+          break;
+        case METHODID_POST_NODEPOOLS:
+          serviceImpl.postNodepools((com.clarifai.grpc.api.PostNodepoolsRequest) request,
+              (io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiNodepoolResponse>) responseObserver);
+          break;
+        case METHODID_PATCH_NODEPOOLS:
+          serviceImpl.patchNodepools((com.clarifai.grpc.api.PatchNodepoolsRequest) request,
+              (io.grpc.stub.StreamObserver<com.clarifai.grpc.api.MultiNodepoolResponse>) responseObserver);
+          break;
+        case METHODID_DELETE_NODEPOOLS:
+          serviceImpl.deleteNodepools((com.clarifai.grpc.api.DeleteNodepoolsRequest) request,
+              (io.grpc.stub.StreamObserver<com.clarifai.grpc.api.status.BaseResponse>) responseObserver);
+          break;
         default:
           throw new AssertionError();
       }
@@ -19454,6 +20159,15 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() {
               .addMethod(getPostRunnerItemOutputsMethod())
               .addMethod(getProcessRunnerItemsMethod())
               .addMethod(getPostModelVersionsTrainingTimeEstimateMethod())
+              .addMethod(getGetComputeClusterMethod())
+              .addMethod(getListComputeClustersMethod())
+              .addMethod(getPostComputeClustersMethod())
+              .addMethod(getDeleteComputeClustersMethod())
+              .addMethod(getGetNodepoolMethod())
+              .addMethod(getListNodepoolsMethod())
+              .addMethod(getPostNodepoolsMethod())
+              .addMethod(getPatchNodepoolsMethod())
+              .addMethod(getDeleteNodepoolsMethod())
               .build();
         }
       }
diff --git a/src/main/java/com/clarifai/grpc/api/Video.java b/src/main/java/com/clarifai/grpc/api/Video.java
index b1fe1f1..307a69c 100644
--- a/src/main/java/com/clarifai/grpc/api/Video.java
+++ b/src/main/java/com/clarifai/grpc/api/Video.java
@@ -240,7 +240,7 @@ public boolean getAllowDuplicateUrl() {
    *
    * <code>string thumbnail_url = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.Video.thumbnail_url is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2699
+   *     See proto/clarifai/api/resources.proto;l=2717
    * @return The thumbnailUrl.
    */
   @java.lang.Override
@@ -265,7 +265,7 @@ public boolean getAllowDuplicateUrl() {
    *
    * <code>string thumbnail_url = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.Video.thumbnail_url is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2699
+   *     See proto/clarifai/api/resources.proto;l=2717
    * @return The bytes for thumbnailUrl.
    */
   @java.lang.Override
@@ -1054,7 +1054,7 @@ public Builder clearAllowDuplicateUrl() {
      *
      * <code>string thumbnail_url = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.Video.thumbnail_url is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2699
+     *     See proto/clarifai/api/resources.proto;l=2717
      * @return The thumbnailUrl.
      */
     @java.lang.Deprecated public java.lang.String getThumbnailUrl() {
@@ -1078,7 +1078,7 @@ public Builder clearAllowDuplicateUrl() {
      *
      * <code>string thumbnail_url = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.Video.thumbnail_url is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2699
+     *     See proto/clarifai/api/resources.proto;l=2717
      * @return The bytes for thumbnailUrl.
      */
     @java.lang.Deprecated public com.google.protobuf.ByteString
@@ -1103,7 +1103,7 @@ public Builder clearAllowDuplicateUrl() {
      *
      * <code>string thumbnail_url = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.Video.thumbnail_url is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2699
+     *     See proto/clarifai/api/resources.proto;l=2717
      * @param value The thumbnailUrl to set.
      * @return This builder for chaining.
      */
@@ -1126,7 +1126,7 @@ public Builder clearAllowDuplicateUrl() {
      *
      * <code>string thumbnail_url = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.Video.thumbnail_url is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2699
+     *     See proto/clarifai/api/resources.proto;l=2717
      * @return This builder for chaining.
      */
     @java.lang.Deprecated public Builder clearThumbnailUrl() {
@@ -1144,7 +1144,7 @@ public Builder clearAllowDuplicateUrl() {
      *
      * <code>string thumbnail_url = 5 [deprecated = true];</code>
      * @deprecated clarifai.api.Video.thumbnail_url is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2699
+     *     See proto/clarifai/api/resources.proto;l=2717
      * @param value The bytes for thumbnailUrl to set.
      * @return This builder for chaining.
      */
diff --git a/src/main/java/com/clarifai/grpc/api/VideoOrBuilder.java b/src/main/java/com/clarifai/grpc/api/VideoOrBuilder.java
index 0aba376..e9d1f71 100644
--- a/src/main/java/com/clarifai/grpc/api/VideoOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/VideoOrBuilder.java
@@ -59,7 +59,7 @@ public interface VideoOrBuilder extends
    *
    * <code>string thumbnail_url = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.Video.thumbnail_url is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2699
+   *     See proto/clarifai/api/resources.proto;l=2717
    * @return The thumbnailUrl.
    */
   @java.lang.Deprecated java.lang.String getThumbnailUrl();
@@ -72,7 +72,7 @@ public interface VideoOrBuilder extends
    *
    * <code>string thumbnail_url = 5 [deprecated = true];</code>
    * @deprecated clarifai.api.Video.thumbnail_url is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2699
+   *     See proto/clarifai/api/resources.proto;l=2717
    * @return The bytes for thumbnailUrl.
    */
   @java.lang.Deprecated com.google.protobuf.ByteString
diff --git a/src/main/java/com/clarifai/grpc/api/WorkflowResult.java b/src/main/java/com/clarifai/grpc/api/WorkflowResult.java
index bc38612..0932ffb 100644
--- a/src/main/java/com/clarifai/grpc/api/WorkflowResult.java
+++ b/src/main/java/com/clarifai/grpc/api/WorkflowResult.java
@@ -290,7 +290,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
    *
    * <code>.clarifai.api.Model model = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.WorkflowResult.model is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2874
+   *     See proto/clarifai/api/resources.proto;l=2892
    * @return Whether the model field is set.
    */
   @java.lang.Override
@@ -306,7 +306,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
    *
    * <code>.clarifai.api.Model model = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.WorkflowResult.model is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2874
+   *     See proto/clarifai/api/resources.proto;l=2892
    * @return The model.
    */
   @java.lang.Override
@@ -1340,7 +1340,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
      *
      * <code>.clarifai.api.Model model = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.WorkflowResult.model is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2874
+     *     See proto/clarifai/api/resources.proto;l=2892
      * @return Whether the model field is set.
      */
     @java.lang.Deprecated public boolean hasModel() {
@@ -1355,7 +1355,7 @@ public com.google.protobuf.TimestampOrBuilder getCreatedAtOrBuilder() {
      *
      * <code>.clarifai.api.Model model = 4 [deprecated = true];</code>
      * @deprecated clarifai.api.WorkflowResult.model is deprecated.
-     *     See proto/clarifai/api/resources.proto;l=2874
+     *     See proto/clarifai/api/resources.proto;l=2892
      * @return The model.
      */
     @java.lang.Deprecated public com.clarifai.grpc.api.Model getModel() {
diff --git a/src/main/java/com/clarifai/grpc/api/WorkflowResultOrBuilder.java b/src/main/java/com/clarifai/grpc/api/WorkflowResultOrBuilder.java
index df1c09e..36b778f 100644
--- a/src/main/java/com/clarifai/grpc/api/WorkflowResultOrBuilder.java
+++ b/src/main/java/com/clarifai/grpc/api/WorkflowResultOrBuilder.java
@@ -82,7 +82,7 @@ public interface WorkflowResultOrBuilder extends
    *
    * <code>.clarifai.api.Model model = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.WorkflowResult.model is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2874
+   *     See proto/clarifai/api/resources.proto;l=2892
    * @return Whether the model field is set.
    */
   @java.lang.Deprecated boolean hasModel();
@@ -95,7 +95,7 @@ public interface WorkflowResultOrBuilder extends
    *
    * <code>.clarifai.api.Model model = 4 [deprecated = true];</code>
    * @deprecated clarifai.api.WorkflowResult.model is deprecated.
-   *     See proto/clarifai/api/resources.proto;l=2874
+   *     See proto/clarifai/api/resources.proto;l=2892
    * @return The model.
    */
   @java.lang.Deprecated com.clarifai.grpc.api.Model getModel();
diff --git a/src/main/java/com/clarifai/grpc/api/status/StatusCode.java b/src/main/java/com/clarifai/grpc/api/status/StatusCode.java
index a0c8ffc..07c48a9 100644
--- a/src/main/java/com/clarifai/grpc/api/status/StatusCode.java
+++ b/src/main/java/com/clarifai/grpc/api/status/StatusCode.java
@@ -234,6 +234,30 @@ public enum StatusCode
    * <code>MODEL_TRAINING_FAILED = 21106;</code>
    */
   MODEL_TRAINING_FAILED(21106),
+  /**
+   * <pre>
+   * For new V3 DockerInternalType models which are built images
+   * </pre>
+   *
+   * <code>MODEL_BUILDING = 21107;</code>
+   */
+  MODEL_BUILDING(21107),
+  /**
+   * <pre>
+   * Failed to build image for model.
+   * </pre>
+   *
+   * <code>MODEL_BUILDING_FAILED = 21108;</code>
+   */
+  MODEL_BUILDING_FAILED(21108),
+  /**
+   * <pre>
+   * Failed to build image for model.
+   * </pre>
+   *
+   * <code>MODEL_BUILD_UNEXPECTED_ERROR = 21109;</code>
+   */
+  MODEL_BUILD_UNEXPECTED_ERROR(21109),
   /**
    * <pre>
    * Custom model training had no data.  FIXME(yang): deprecate this. Use the 21106 + errStatusMsg
@@ -845,6 +869,38 @@ public enum StatusCode
    * <code>RUNNER_PROCESSING_FAILED = 25608;</code>
    */
   RUNNER_PROCESSING_FAILED(25608),
+  /**
+   * <pre>
+   * Nodepool related codes 257xx
+   * </pre>
+   *
+   * <code>NODEPOOL_DOES_NOT_EXIST = 25700;</code>
+   */
+  NODEPOOL_DOES_NOT_EXIST(25700),
+  /**
+   * <code>NODEPOOL_INVALID_ARGUMENT = 25701;</code>
+   */
+  NODEPOOL_INVALID_ARGUMENT(25701),
+  /**
+   * <code>NODEPOOL_INVALID_REQUEST = 25702;</code>
+   */
+  NODEPOOL_INVALID_REQUEST(25702),
+  /**
+   * <pre>
+   * ComputeCluster related codes 258xx
+   * </pre>
+   *
+   * <code>COMPUTE_CLUSTER_DOES_NOT_EXIST = 25800;</code>
+   */
+  COMPUTE_CLUSTER_DOES_NOT_EXIST(25800),
+  /**
+   * <code>COMPUTE_CLUSTER_INVALID_ARGUMENT = 25801;</code>
+   */
+  COMPUTE_CLUSTER_INVALID_ARGUMENT(25801),
+  /**
+   * <code>COMPUTE_CLUSTER_INVALID_REQUEST = 25802;</code>
+   */
+  COMPUTE_CLUSTER_INVALID_REQUEST(25802),
   /**
    * <pre>
    * Input:Image related 30xxx
@@ -2185,6 +2241,30 @@ public enum StatusCode
    * <code>MODEL_TRAINING_FAILED = 21106;</code>
    */
   public static final int MODEL_TRAINING_FAILED_VALUE = 21106;
+  /**
+   * <pre>
+   * For new V3 DockerInternalType models which are built images
+   * </pre>
+   *
+   * <code>MODEL_BUILDING = 21107;</code>
+   */
+  public static final int MODEL_BUILDING_VALUE = 21107;
+  /**
+   * <pre>
+   * Failed to build image for model.
+   * </pre>
+   *
+   * <code>MODEL_BUILDING_FAILED = 21108;</code>
+   */
+  public static final int MODEL_BUILDING_FAILED_VALUE = 21108;
+  /**
+   * <pre>
+   * Failed to build image for model.
+   * </pre>
+   *
+   * <code>MODEL_BUILD_UNEXPECTED_ERROR = 21109;</code>
+   */
+  public static final int MODEL_BUILD_UNEXPECTED_ERROR_VALUE = 21109;
   /**
    * <pre>
    * Custom model training had no data.  FIXME(yang): deprecate this. Use the 21106 + errStatusMsg
@@ -2793,6 +2873,38 @@ public enum StatusCode
    * <code>RUNNER_PROCESSING_FAILED = 25608;</code>
    */
   public static final int RUNNER_PROCESSING_FAILED_VALUE = 25608;
+  /**
+   * <pre>
+   * Nodepool related codes 257xx
+   * </pre>
+   *
+   * <code>NODEPOOL_DOES_NOT_EXIST = 25700;</code>
+   */
+  public static final int NODEPOOL_DOES_NOT_EXIST_VALUE = 25700;
+  /**
+   * <code>NODEPOOL_INVALID_ARGUMENT = 25701;</code>
+   */
+  public static final int NODEPOOL_INVALID_ARGUMENT_VALUE = 25701;
+  /**
+   * <code>NODEPOOL_INVALID_REQUEST = 25702;</code>
+   */
+  public static final int NODEPOOL_INVALID_REQUEST_VALUE = 25702;
+  /**
+   * <pre>
+   * ComputeCluster related codes 258xx
+   * </pre>
+   *
+   * <code>COMPUTE_CLUSTER_DOES_NOT_EXIST = 25800;</code>
+   */
+  public static final int COMPUTE_CLUSTER_DOES_NOT_EXIST_VALUE = 25800;
+  /**
+   * <code>COMPUTE_CLUSTER_INVALID_ARGUMENT = 25801;</code>
+   */
+  public static final int COMPUTE_CLUSTER_INVALID_ARGUMENT_VALUE = 25801;
+  /**
+   * <code>COMPUTE_CLUSTER_INVALID_REQUEST = 25802;</code>
+   */
+  public static final int COMPUTE_CLUSTER_INVALID_REQUEST_VALUE = 25802;
   /**
    * <pre>
    * Input:Image related 30xxx
@@ -3961,6 +4073,9 @@ public static StatusCode forNumber(int value) {
       case 21104: return MODEL_UPLOADING;
       case 21105: return MODEL_UPLOADING_FAILED;
       case 21106: return MODEL_TRAINING_FAILED;
+      case 21107: return MODEL_BUILDING;
+      case 21108: return MODEL_BUILDING_FAILED;
+      case 21109: return MODEL_BUILD_UNEXPECTED_ERROR;
       case 21110: return MODEL_TRAINING_NO_DATA;
       case 21111: return MODEL_TRAINING_NO_POSITIVES;
       case 21112: return MODEL_TRAINING_ONE_VS_N_SINGLE_CLASS;
@@ -4075,6 +4190,12 @@ public static StatusCode forNumber(int value) {
       case 25606: return RUNNER_STREAM_END;
       case 25607: return RUNNER_ITEM_CANCELLED;
       case 25608: return RUNNER_PROCESSING_FAILED;
+      case 25700: return NODEPOOL_DOES_NOT_EXIST;
+      case 25701: return NODEPOOL_INVALID_ARGUMENT;
+      case 25702: return NODEPOOL_INVALID_REQUEST;
+      case 25800: return COMPUTE_CLUSTER_DOES_NOT_EXIST;
+      case 25801: return COMPUTE_CLUSTER_INVALID_ARGUMENT;
+      case 25802: return COMPUTE_CLUSTER_INVALID_REQUEST;
       case 30000: return INPUT_DOWNLOAD_SUCCESS;
       case 30001: return INPUT_DOWNLOAD_PENDING;
       case 30002: return INPUT_DOWNLOAD_FAILED;
diff --git a/src/main/java/com/clarifai/grpc/api/status/StatusCodeOuterClass.java b/src/main/java/com/clarifai/grpc/api/status/StatusCodeOuterClass.java
index b329a88..bcb9ea7 100644
--- a/src/main/java/com/clarifai/grpc/api/status/StatusCodeOuterClass.java
+++ b/src/main/java/com/clarifai/grpc/api/status/StatusCodeOuterClass.java
@@ -24,7 +24,7 @@ public static void registerAllExtensions(
   static {
     java.lang.String[] descriptorData = {
       "\n+proto/clarifai/api/status/status_code." +
-      "proto\022\023clarifai.api.status*\277X\n\nStatusCod" +
+      "proto\022\023clarifai.api.status*\353Z\n\nStatusCod" +
       "e\022\010\n\004ZERO\020\000\022\014\n\007SUCCESS\020\220N\022\021\n\014MIXED_STATU" +
       "S\020\232N\022\014\n\007FAILURE\020\244N\022\016\n\tTRY_AGAIN\020\256N\022\024\n\017NO" +
       "T_IMPLEMENTED\020\270N\022\n\n\005MOVED\020\302N\022\013\n\006TEAPOT\020\314" +
@@ -43,274 +43,282 @@ public static void registerAllExtensions(
       "RAINING\020\355\244\001\022\025\n\017MODEL_UNTRAINED\020\356\244\001\022\037\n\031MO" +
       "DEL_QUEUED_FOR_TRAINING\020\357\244\001\022\025\n\017MODEL_UPL" +
       "OADING\020\360\244\001\022\034\n\026MODEL_UPLOADING_FAILED\020\361\244\001" +
-      "\022\033\n\025MODEL_TRAINING_FAILED\020\362\244\001\022\034\n\026MODEL_T" +
-      "RAINING_NO_DATA\020\366\244\001\022!\n\033MODEL_TRAINING_NO" +
-      "_POSITIVES\020\367\244\001\022*\n$MODEL_TRAINING_ONE_VS_" +
-      "N_SINGLE_CLASS\020\370\244\001\022\036\n\030MODEL_TRAINING_TIM" +
-      "ED_OUT\020\371\244\001\022\"\n\034MODEL_TRAINING_WAITING_ERR" +
-      "OR\020\372\244\001\022\"\n\034MODEL_TRAINING_UNKNOWN_ERROR\020\373" +
-      "\244\001\022&\n\034MODEL_TRAINING_MSG_REDELIVER\020\374\244\001\032\002" +
-      "\010\001\022&\n MODEL_TRAINING_INSUFFICIENT_DATA\020\375" +
-      "\244\001\022#\n\035MODEL_TRAINING_INVALID_PARAMS\020\376\244\001\022" +
-      "4\n.MODEL_TRAINING_INVALID_DATA_TOLERANCE" +
-      "_EXCEEDED\020\377\244\001\022\032\n\024MODEL_MODIFY_SUCCESS\020\236\245" +
-      "\001\022\032\n\024MODEL_MODIFY_PENDING\020\237\245\001\022\031\n\023MODEL_M" +
-      "ODIFY_FAILED\020\240\245\001\022\032\n\024MODEL_DOES_NOT_EXIST" +
-      "\020\320\245\001\022\035\n\027MODEL_PERMISSION_DENIED\020\321\245\001\022\034\n\026M" +
-      "ODEL_INVALID_ARGUMENT\020\322\245\001\022\033\n\025MODEL_INVAL" +
-      "ID_REQUEST\020\323\245\001\022\025\n\017MODEL_EVALUATED\020\264\246\001\022\026\n" +
-      "\020MODEL_EVALUATING\020\265\246\001\022\031\n\023MODEL_NOT_EVALU" +
-      "ATED\020\266\246\001\022!\n\033MODEL_QUEUED_FOR_EVALUATION\020" +
-      "\267\246\001\022 \n\032MODEL_EVALUATION_TIMED_OUT\020\276\246\001\022$\n" +
-      "\036MODEL_EVALUATION_WAITING_ERROR\020\277\246\001\022$\n\036M" +
-      "ODEL_EVALUATION_UNKNOWN_ERROR\020\300\246\001\022\035\n\027MOD" +
-      "EL_PREDICTION_FAILED\020\301\246\001\022(\n\036MODEL_EVALUA" +
-      "TION_MSG_REDELIVER\020\302\246\001\032\002\010\001\022\"\n\034MODEL_EVAL" +
-      "UATION_NEED_LABELS\020\303\246\001\022\"\n\034MODEL_EVALUATI" +
-      "ON_NEED_INPUTS\020\304\246\001\022\035\n\027MODEL_EVALUATION_F" +
-      "AILED\020\305\246\001\022\035\n\027MODEL_DEPLOYMENT_FAILED\020\346\246\001" +
-      "\022\025\n\017MODEL_DEPLOYING\020\347\246\001\022!\n\033MODEL_QUEUED_" +
-      "FOR_DEPLOYMENT\020\350\246\001\022\030\n\022MODEL_NOT_DEPLOYED" +
-      "\020\351\246\001\022&\n MODEL_REFERENCE_INVALID_ARGUMENT" +
-      "\020\230\247\001\022*\n$MODEL_EXAMPLE_INPUT_INVALID_ARGU" +
-      "MENT\020\254\247\001\022\024\n\016MODEL_EXPORTED\020\374\247\001\022\025\n\017MODEL_" +
-      "EXPORTING\020\375\247\001\022\034\n\026MODEL_EXPORTING_FAILED\020" +
-      "\376\247\001\022\032\n\024MODEL_EXPORT_PENDING\020\377\247\001\022 \n\032WORKF" +
-      "LOW_NO_MATCHING_INPUT\020\361\253\001\022$\n\036WORKFLOW_RE" +
-      "QUIRE_TRAINED_MODEL\020\362\253\001\022\030\n\022WORKFLOW_DUPL" +
-      "ICATE\020\324\254\001\022!\n\033WORKFLOW_UNSUPPORTED_FORMAT" +
-      "\020\325\254\001\022\035\n\027WORKFLOW_DOES_NOT_EXIST\020\326\254\001\022 \n\032W" +
-      "ORKFLOW_PERMISSION_DENIED\020\327\254\001\022\037\n\031WORKFLO" +
-      "W_INVALID_ARGUMENT\020\330\254\001\022\035\n\027WORKFLOW_INVAL" +
-      "ID_RECIPE\020\331\254\001\022\037\n\031WORKFLOW_INVALID_TEMPLA" +
-      "TE\020\332\254\001\022\034\n\026WORKFLOW_INVALID_GRAPH\020\333\254\001\022\037\n\031" +
-      "WORKFLOW_INTERNAL_FAILURE\020\334\254\001\022\036\n\030WORKFLO" +
-      "W_INVALID_REQUEST\020\327\263\001\022\035\n\027WORKFLOW_MODIFY" +
-      "_SUCCESS\020\206\255\001\022\035\n\027WORKFLOW_MODIFY_PENDING\020" +
-      "\207\255\001\022\034\n\026WORKFLOW_MODIFY_FAILED\020\210\255\001\022\035\n\027WOR" +
-      "KFLOW_REINDEX_FAILED\020\211\255\001\022\034\n\026CONCEPT_MODI" +
-      "FY_SUCCESS\020\356\264\001\022\034\n\026CONCEPT_MODIFY_PENDING" +
-      "\020\357\264\001\022\033\n\025CONCEPT_MODIFY_FAILED\020\360\264\001\022\030\n\022ANN" +
-      "OTATION_SUCCESS\020\326\274\001\022\030\n\022ANNOTATION_PENDIN" +
-      "G\020\327\274\001\022\027\n\021ANNOTATION_FAILED\020\330\274\001\022\037\n\031ANNOTA" +
-      "TION_UNKNOWN_STATUS\020\332\274\001\022!\n\033ANNOTATION_IN" +
-      "VALID_ARGUMENT\020\333\274\001\022\"\n\034ANNOTATION_PERMISS" +
-      "ION_DENIED\020\334\274\001\022 \n\032ANNOTATION_AWAITING_RE" +
-      "VIEW\020\335\274\001\022*\n$ANNOTATION_AWAITING_CONSENSU" +
-      "S_REVIEW\020\337\274\001\022\036\n\030ANNOTATION_REVIEW_DENIED" +
-      "\020\336\274\001\022\037\n\031ANNOTATION_MODIFY_SUCCESS\020\272\275\001\022\037\n" +
-      "\031ANNOTATION_MODIFY_PENDING\020\273\275\001\022\036\n\030ANNOTA" +
-      "TION_MODIFY_FAILED\020\274\275\001\022&\n METADATA_INVAL" +
-      "ID_PATCH_ARGUMENTS\020\304\302\001\022\034\n\026METADATA_PARSI" +
-      "NG_ISSUE\020\305\302\001\022!\n\033METADATA_MANIPULATION_IS" +
-      "SUE\020\306\302\001\022\034\n\026TRAINER_JOB_STATE_NONE\020\250\303\001\022\036\n" +
-      "\030TRAINER_JOB_STATE_QUEUED\020\251\303\001\022\037\n\031TRAINER" +
-      "_JOB_STATE_RUNNING\020\252\303\001\022 \n\032TRAINER_JOB_ST" +
-      "ATE_COMPLETE\020\253\303\001\022\035\n\027TRAINER_JOB_STATE_ER" +
-      "ROR\020\254\303\001\022\027\n\021DATA_DUMP_SUCCESS\020\276\304\001\022\027\n\021DATA" +
-      "_DUMP_PENDING\020\277\304\001\022\026\n\020DATA_DUMP_FAILED\020\300\304" +
-      "\001\022\033\n\025DATA_DUMP_IN_PROGRESS\020\301\304\001\022\033\n\021DATA_D" +
-      "UMP_NO_DATA\020\302\304\001\032\002\010\001\022 \n\032DATA_DUMP_UNEXPEC" +
-      "TED_ERROR\020\303\304\001\022\036\n\030DATA_DUMP_EXPORT_SUCCES" +
-      "S\020\322\304\001\022\036\n\030DATA_DUMP_EXPORT_PENDING\020\323\304\001\022\035\n" +
-      "\027DATA_DUMP_EXPORT_FAILED\020\324\304\001\022\"\n\034DATA_DUM" +
-      "P_EXPORT_IN_PROGRESS\020\325\304\001\022\'\n!DATA_DUMP_EX" +
-      "PORT_UNEXPECTED_ERROR\020\326\304\001\022\035\n\027APP_DUPLICA" +
-      "TION_SUCCESS\020\360\304\001\022\034\n\026APP_DUPLICATION_FAIL" +
-      "ED\020\361\304\001\022\035\n\027APP_DUPLICATION_PENDING\020\362\304\001\022!\n" +
-      "\033APP_DUPLICATION_IN_PROGRESS\020\363\304\001\022%\n\037APP_" +
-      "DUPLICATION_INVALID_REQUEST\020\364\304\001\022\033\n\025MODUL" +
-      "E_DOES_NOT_EXIST\020\324\305\001\022\036\n\030MODULE_PERMISSIO" +
-      "N_DENIED\020\325\305\001\022\035\n\027MODULE_INVALID_ARGUMENT\020" +
-      "\326\305\001\022\034\n\026MODULE_INVALID_REQUEST\020\327\305\001\022\034\n\026BUL" +
-      "K_OPERATION_SUCCESS\020\270\306\001\022\033\n\025BULK_OPERATIO" +
-      "N_FAILED\020\271\306\001\022\034\n\026BULK_OPERATION_PENDING\020\272" +
-      "\306\001\022 \n\032BULK_OPERATION_IN_PROGRESS\020\273\306\001\022$\n\036" +
-      "BULK_OPERATION_INVALID_REQUEST\020\274\306\001\022\036\n\030BU" +
-      "LK_OPERATION_CANCELLED\020\275\306\001\022%\n\037BULK_OPERA" +
-      "TION_UNEXPECTED_ERROR\020\276\306\001\022\033\n\025RUNNER_DOES" +
-      "_NOT_EXIST\020\200\310\001\022\036\n\030RUNNER_PERMISSION_DENI" +
-      "ED\020\201\310\001\022\035\n\027RUNNER_INVALID_ARGUMENT\020\202\310\001\022\034\n" +
-      "\026RUNNER_INVALID_REQUEST\020\203\310\001\022\030\n\022RUNNER_NE" +
-      "EDS_RETRY\020\204\310\001\022\031\n\023RUNNER_STREAM_START\020\205\310\001" +
-      "\022\027\n\021RUNNER_STREAM_END\020\206\310\001\022\033\n\025RUNNER_ITEM" +
-      "_CANCELLED\020\207\310\001\022\036\n\030RUNNER_PROCESSING_FAIL" +
-      "ED\020\210\310\001\022\034\n\026INPUT_DOWNLOAD_SUCCESS\020\260\352\001\022\034\n\026" +
-      "INPUT_DOWNLOAD_PENDING\020\261\352\001\022\033\n\025INPUT_DOWN" +
-      "LOAD_FAILED\020\262\352\001\022 \n\032INPUT_DOWNLOAD_IN_PRO" +
-      "GRESS\020\263\352\001\022 \n\032INPUT_STATUS_UPDATE_FAILED\020" +
-      "\264\352\001\022\031\n\023INPUT_DELETE_FAILED\020\265\352\001\022\025\n\017INPUT_" +
-      "DUPLICATE\020\224\353\001\022\036\n\030INPUT_UNSUPPORTED_FORMA" +
-      "T\020\225\353\001\022\032\n\024INPUT_DOES_NOT_EXIST\020\226\353\001\022\035\n\027INP" +
-      "UT_PERMISSION_DENIED\020\227\353\001\022\034\n\026INPUT_INVALI" +
-      "D_ARGUMENT\020\230\353\001\022\026\n\020INPUT_OVER_LIMIT\020\231\353\001\022\027" +
-      "\n\021INPUT_INVALID_URL\020\232\353\001\022\032\n\024INPUT_MODIFY_" +
-      "SUCCESS\020\370\353\001\022\032\n\024INPUT_MODIFY_PENDING\020\371\353\001\022" +
-      "\031\n\023INPUT_MODIFY_FAILED\020\373\353\001\022\037\n\031INPUT_STOR" +
-      "AGE_HOST_FAILED\020\202\354\001\022\035\n\027ALL_INPUT_INVALID" +
-      "_BYTES\020\334\354\001\022\033\n\025INPUT_CLUSTER_SUCCESS\020\300\355\001\022" +
-      "\033\n\025INPUT_CLUSTER_PENDING\020\301\355\001\022\032\n\024INPUT_CL" +
-      "USTER_FAILED\020\302\355\001\022\037\n\031INPUT_CLUSTER_IN_PRO" +
-      "GRESS\020\303\355\001\022\033\n\025INPUT_REINDEX_SUCCESS\020\244\356\001\022\033" +
-      "\n\025INPUT_REINDEX_PENDING\020\245\356\001\022\032\n\024INPUT_REI" +
-      "NDEX_FAILED\020\246\356\001\022\037\n\031INPUT_REINDEX_IN_PROG" +
-      "RESS\020\247\356\001\022\"\n\034INPUT_VIDEO_DOWNLOAD_SUCCESS" +
-      "\020\230\362\001\022\"\n\034INPUT_VIDEO_DOWNLOAD_PENDING\020\231\362\001" +
-      "\022!\n\033INPUT_VIDEO_DOWNLOAD_FAILED\020\232\362\001\022\033\n\025I" +
-      "NPUT_VIDEO_DUPLICATE\020\374\362\001\022$\n\036INPUT_VIDEO_" +
-      "UNSUPPORTED_FORMAT\020\375\362\001\022 \n\032INPUT_VIDEO_DO" +
-      "ES_NOT_EXIST\020\376\362\001\022#\n\035INPUT_VIDEO_PERMISSI" +
-      "ON_DENIED\020\377\362\001\022\"\n\034INPUT_VIDEO_INVALID_ARG" +
-      "UMENT\020\200\363\001\022\034\n\026INPUT_VIDEO_OVER_LIMIT\020\201\363\001\022" +
-      "\035\n\027INPUT_VIDEO_INVALID_URL\020\202\363\001\022 \n\032INPUT_" +
-      "VIDEO_MODIFY_SUCCESS\020\340\363\001\022 \n\032INPUT_VIDEO_" +
-      "MODIFY_PENDING\020\341\363\001\022\037\n\031INPUT_VIDEO_MODIFY" +
-      "_FAILED\020\343\363\001\022%\n\037INPUT_VIDEO_STORAGE_HOST_" +
-      "FAILED\020\352\363\001\022$\n\036ALL_INPUT_VIDEOS_INVALID_B" +
-      "YTES\020\304\364\001\022$\n\036INPUT_VIDEO_PROCESSING_SUCCE" +
-      "SS\020\250\365\001\022$\n\036INPUT_VIDEO_PROCESSING_PENDING" +
-      "\020\262\365\001\022#\n\035INPUT_VIDEO_PROCESSING_FAILED\020\274\365" +
-      "\001\022\'\n!INPUT_VIDEO_STORAGE_INCONSISTENCY\020\306" +
-      "\365\001\022!\n\033INPUT_VIDEO_STORAGE_FAILURE\020\320\365\001\022(\n" +
-      "\"INPUT_VIDEO_URL_GENERATION_FAILURE\020\332\365\001\022" +
-      "\035\n\027INPUT_CONNECTION_FAILED\020\274\270\002\022&\n REQUES" +
-      "T_DISABLED_FOR_MAINTENANCE\020\275\270\002\022/\n%INPUT_" +
-      "WRITES_DISABLED_FOR_MAINTENANCE\020\276\270\002\032\002\010\001\022" +
-      "\033\n\025INPUT_INVALID_REQUEST\020\277\270\002\022\035\n\027PREDICT_" +
-      "INVALID_REQUEST\020\301\270\002\022\034\n\026SEARCH_INVALID_RE" +
-      "QUEST\020\302\270\002\022\036\n\030CONCEPTS_INVALID_REQUEST\020\303\270" +
-      "\002\022\033\n\025STATS_INVALID_REQUEST\020\304\270\002\022\034\n\026DATABA" +
-      "SE_DUPLICATE_KEY\020\312\270\002\022 \n\032DATABASE_STATEME" +
-      "NT_TIMEOUT\020\313\270\002\022$\n\036DATABASE_INVALID_ROWS_" +
-      "AFFECTED\020\314\270\002\022 \n\032DATABASE_DEADLOCK_DETECT" +
-      "ED\020\315\270\002\022\030\n\022DATABASE_FAIL_TASK\020\316\270\002\022&\n DATA" +
-      "BASE_FAIL_TO_GET_CONNECTIONS\020\317\270\002\022\037\n\031DATA" +
-      "BASE_TOO_MANY_CLIENTS\020\320\270\002\022\"\n\034DATABASE_CO" +
-      "NSTRAINT_VIOLATED\020\321\270\002\022\027\n\021DATABASE_CANCEL" +
-      "ED\020\325\270\002\022\037\n\031ASYNC_WORKER_MULTI_ERRORS\020\324\270\002\022" +
-      "\034\n\026RPC_REQUEST_QUEUE_FULL\020\336\270\002\022\034\n\026RPC_SER" +
-      "VER_UNAVAILABLE\020\337\270\002\022\031\n\023RPC_REQUEST_TIMEO" +
-      "UT\020\340\270\002\022#\n\035RPC_MAX_MESSAGE_SIZE_EXCEEDED\020" +
-      "\341\270\002\022\022\n\014RPC_CANCELED\020\343\270\002\022\030\n\022RPC_UNKNOWN_M" +
-      "ETHOD\020\344\270\002\022\036\n\030REQUEST_CANCELED_BY_USER\020\345\270" +
-      "\002\022\036\n\030CLUSTER_INTERNAL_FAILURE\020\240\320\002\022\037\n\031EXT" +
-      "ERNAL_CONNECTION_ERROR\020\342\270\002\022\032\n\024QUERY_INVA" +
-      "LID_SYNTAX\020\362\270\002\022\026\n\020QUEUE_CONN_ERROR\020\250\300\002\022!" +
-      "\n\033QUEUE_CLOSE_REQUEST_TIMEOUT\020\252\300\002\022\027\n\021QUE" +
-      "UE_CONN_CLOSED\020\253\300\002\022\037\n\031QUEUE_PUBLISH_ACK_" +
-      "TIMEOUT\020\254\300\002\022\031\n\023QUEUE_PUBLISH_ERROR\020\255\300\002\022 " +
-      "\n\032QUEUE_SUBSCRIPTION_TIMEOUT\020\256\300\002\022\036\n\030QUEU" +
-      "E_SUBSCRIPTION_ERROR\020\257\300\002\022\036\n\030QUEUE_MARSHA" +
-      "LLING_FAILED\020\260\300\002\022 \n\032QUEUE_UNMARSHALLING_" +
-      "FAILED\020\261\300\002\022\'\n!QUEUE_MAX_MSG_REDELIVERY_E" +
-      "XCEEDED\020\262\300\002\022\027\n\021QUEUE_ACK_FAILURE\020\263\300\002\022\023\n\r" +
-      "SQS_OVERLIMIT\020\214\301\002\022 \n\032SQS_INVALID_RECEIPT" +
-      "_HANDLE\020\215\301\002\022\021\n\013SQS_UNKNOWN\020\216\301\002\022\035\n\027SEARCH" +
-      "_INTERNAL_FAILURE\020\371\317\002\022\037\n\031SEARCH_PROJECTI" +
-      "ON_FAILURE\020\372\317\002\022\037\n\031SEARCH_PREDICTION_FAIL" +
-      "URE\020\373\317\002\022\'\n!SEARCH_BY_NOT_FULLY_INDEXED_I" +
-      "NPUT\020\374\317\002\022 \n\032SAVED_SEARCH_MODIFY_FAILED\020\375" +
-      "\317\002\022\037\n\031SEARCH_COUNTS_UNAVAILABLE\020\376\317\002\022\027\n\021E" +
-      "VALUATION_QUEUED\020\334\320\002\022\034\n\026EVALUATION_IN_PR" +
-      "OGRESS\020\335\320\002\022\030\n\022EVALUATION_SUCCESS\020\336\320\002\022(\n\"" +
-      "EVALUATION_FAILED_TO_RETRIEVE_DATA\020\337\320\002\022!" +
-      "\n\033EVALUATION_INVALID_ARGUMENT\020\340\320\002\022\027\n\021EVA" +
-      "LUATION_FAILED\020\341\320\002\022\030\n\022EVALUATION_PENDING" +
-      "\020\342\320\002\022\032\n\024EVALUATION_TIMED_OUT\020\343\320\002\022!\n\033EVAL" +
-      "UATION_UNEXPECTED_ERROR\020\344\320\002\022\026\n\020EVALUATIO" +
-      "N_MIXED\020\345\320\002\022\030\n\022STRIPE_EVENT_ERROR\020\341\327\002\022\020\n" +
-      "\nCACHE_MISS\020\311\337\002\022&\n REDIS_SCRIPT_EXITED_W" +
-      "ITH_FAILURE\020\312\337\002\022\026\n\020REDIS_STREAM_ERR\020\313\337\002\022" +
-      "\030\n\022REDIS_NO_CONSUMERS\020\314\337\002\022\032\n\024REDIS_STREA" +
-      "M_BACKOFF\020\315\337\002\022\030\n\022SIGNUP_EVENT_ERROR\020\261\347\002\022" +
-      "\024\n\016SIGNUP_FLAGGED\020\262\347\002\022\032\n\024FILETYPE_UNSUPP" +
-      "ORTED\020\263\347\002\022\037\n\031APP_COUNT_INVALID_MESSAGE\020\231" +
-      "\357\002\022\'\n!APP_COUNT_UPDATE_INCREMENT_FAILED\020" +
-      "\232\357\002\022\036\n\030APP_COUNT_REBUILD_FAILED\020\233\357\002\022 \n\032A" +
-      "PP_COUNT_INTERNAL_FAILURE\020\234\357\002\022\027\n\021MP_DOWN" +
-      "LOAD_ERROR\020\375\357\002\022\032\n\024MP_RESOLVE_DNS_ERROR\020\376" +
-      "\357\002\022)\n#MP_DOWNLOAD_MAX_SIZE_EXCEEDED_ERRO" +
-      "R\020\377\357\002\022\033\n\025MP_IMAGE_DECODE_ERROR\020\200\360\002\022\031\n\023MP" +
-      "_INVALID_ARGUMENT\020\201\360\002\022\037\n\031MP_IMAGE_PROCES" +
-      "SING_ERROR\020\202\360\002\022\031\n\023DATATIER_CONN_ERROR\020\341\360" +
-      "\002\022\027\n\021USER_CONSENT_FACE\020\321\206\003\022\024\n\016WORKER_MIS" +
-      "SING\020\270\216\003\022\023\n\rWORKER_ACTIVE\020\271\216\003\022\025\n\017WORKER_" +
-      "INACTIVE\020\272\216\003\022\027\n\021COLLECTOR_MISSING\020\240\226\003\022\026\n" +
-      "\020COLLECTOR_ACTIVE\020\241\226\003\022\030\n\022COLLECTOR_INACT" +
-      "IVE\020\242\226\003\022!\n\033COLLECTOR_POST_INPUT_FAILED\020\243" +
-      "\226\003\022*\n$SSO_IDENTITY_PROVIDER_DOES_NOT_EXI" +
-      "ST\020\211\236\003\022\026\n\020TASK_IN_PROGRESS\020\361\245\003\022\017\n\tTASK_D" +
-      "ONE\020\362\245\003\022\022\n\014TASK_WONT_DO\020\363\245\003\022\021\n\013TASK_FAIL" +
-      "ED\020\365\245\003\022\017\n\tTASK_IDLE\020\366\245\003\022\023\n\rTASK_CONFLICT" +
-      "\020\324\246\003\022\032\n\024TASK_NOT_IMPLEMENTED\020\325\246\003\022\022\n\014TASK" +
-      "_MISSING\020\326\246\003\022\034\n\026TASK_PERMISSION_DENIED\020\327" +
-      "\246\003\022\035\n\027TASK_ASSIGNMENT_SUCCESS\020\270\247\003\022\035\n\027TAS" +
-      "K_ASSIGNMENT_PENDING\020\271\247\003\022%\n\037TASK_ASSIGNM" +
-      "ENT_AWAITING_REVIEW\020\272\247\003\022/\n)TASK_ASSIGNME" +
-      "NT_AWAITING_CONSENSUS_REVIEW\020\273\247\003\022#\n\035TASK" +
-      "_ASSIGNMENT_REVIEW_DENIED\020\274\247\003\022\031\n\023LABEL_O" +
-      "RDER_PENDING\020\331\255\003\022\035\n\027LABEL_ORDER_IN_PROGR" +
-      "ESS\020\332\255\003\022\031\n\023LABEL_ORDER_SUCCESS\020\333\255\003\022\032\n\024LA" +
-      "BEL_ORDER_CANCELED\020\334\255\003\022\024\n\016LICENSE_ACTIVE" +
-      "\020\340\324\003\022\034\n\026LICENSE_DOES_NOT_EXIST\020\341\324\003\022\031\n\023LI" +
-      "CENSE_NEED_UPDATE\020\342\324\003\022\025\n\017LICENSE_EXPIRED" +
-      "\020\343\324\003\022\025\n\017LICENSE_REVOKED\020\344\324\003\022\025\n\017LICENSE_D" +
-      "ELETED\020\345\324\003\022\035\n\027LICENSE_VOLUME_EXCEEDED\020\346\324" +
-      "\003\022!\n\033PASSWORD_VALIDATION_SUCCESS\020\310\334\003\022 \n\032" +
-      "PASSWORD_VALIDATION_FAILED\020\311\334\003\022%\n\037PASSWO" +
-      "RDPOLICY_INVALID_ARGUMENT\020\312\334\003\022\"\n\034FEATURE" +
-      "FLAG_CONFIG_NOT_FOUND\020\260\344\003\022\"\n\034FEATUREFLAG" +
-      "_INVALID_ARGUMENT\020\261\344\003\022\031\n\023FEATUREFLAG_BLO" +
-      "CKED\020\262\344\003\022\031\n\023MAINTENANCE_SUCCESS\020\230\354\003\022\030\n\022M" +
-      "AINTENANCE_FAILED\020\231\354\003\022\035\n\027DATASET_VERSION" +
-      "_PENDING\020\205\364\003\022!\n\033DATASET_VERSION_IN_PROGR" +
-      "ESS\020\212\364\003\022\033\n\025DATASET_VERSION_READY\020\217\364\003\022\035\n\027" +
-      "DATASET_VERSION_FAILURE\020\224\364\003\022&\n DATASET_V" +
-      "ERSION_UNEXPECTED_ERROR\020\231\364\003\022\036\n\030DATASET_V" +
-      "ERSION_CONFLICT\020\236\364\003\022\033\n\025DATASET_INPUT_SUC" +
-      "CESS\020\344\364\003\022\035\n\027DATASET_INPUT_DUPLICATE\020\345\364\003\022" +
-      "$\n\036DATASET_VERSION_EXPORT_SUCCESS\020\310\365\003\022$\n" +
-      "\036DATASET_VERSION_EXPORT_PENDING\020\311\365\003\022#\n\035D" +
-      "ATASET_VERSION_EXPORT_FAILED\020\312\365\003\022(\n\"DATA" +
-      "SET_VERSION_EXPORT_IN_PROGRESS\020\313\365\003\022-\n\'DA" +
-      "TASET_VERSION_EXPORT_UNEXPECTED_ERROR\020\314\365" +
-      "\003\022\020\n\nJOB_QUEUED\020\200\364\003\022\021\n\013JOB_RUNNING\020\201\364\003\022\023" +
-      "\n\rJOB_COMPLETED\020\202\364\003\022\020\n\nJOB_FAILED\020\203\364\003\022\023\n" +
-      "\rJOB_CANCELLED\020\204\364\003\022\032\n\024JOB_UNEXPECTED_ERR" +
-      "OR\020\206\364\003\022\022\n\014JOB_CONFLICT\020\207\364\003\022\034\n\026AUTH_MISSI" +
-      "NG_IDP_ASSOC\020\350\373\003\022\031\n\023LIST_OBJECTS_FAILED\020" +
-      "\320\203\004\022\034\n\026ARCHIVE_EXTRACT_FAILED\020\270\213\004\022\030\n\022UPL" +
-      "OAD_IN_PROGRESS\020\240\223\004\022\021\n\013UPLOAD_DONE\020\241\223\004\022\023" +
-      "\n\rUPLOAD_FAILED\020\242\223\004\022\035\n\027UPLOAD_UNEXPECTED" +
-      "_ERROR\020\243\223\004\022\024\n\016UPLOAD_EXPIRED\020\244\223\004\022\025\n\017UPLO" +
-      "AD_CANCELED\020\245\223\004\022\025\n\017UPLOAD_CONFLICT\020\246\223\004\022\032" +
-      "\n\024BILLING_INVALID_INFO\020\210\233\004\022\033\n\025INTERNAL_S" +
-      "ERVER_ISSUE\020\324\375\005\022\035\n\027INTERNAL_FETCHING_ISS" +
-      "UE\020\325\375\005\022\035\n\027INTERNAL_DATABASE_ISSUE\020\326\375\005\022\037\n" +
-      "\031INTERNAL_CONTEXT_CANCELED\020\330\375\005\022!\n\033INTERN" +
-      "AL_UNEXPECTED_TIMEOUT\020\331\375\005\022\034\n\026INTERNAL_UN" +
-      "EXPECTED_V1\020\332\375\005\022\037\n\031INTERNAL_UNEXPECTED_P" +
-      "ANIC\020\333\375\005\022\037\n\031INTERNAL_UNEXPECTED_SPIRE\020\334\375" +
-      "\005\022 \n\032INTERNAL_REDIS_UNAVAILABLE\020\335\375\005\022!\n\033I" +
-      "NTERNAL_RESOURCE_EXHAUSTED\020\336\375\005\022\"\n\034INTERN" +
-      "AL_REDIS_UNCATEGORIZED\020\337\375\005\022 \n\032INTERNAL_A" +
-      "WS_UNCATEGORIZED\020\340\375\005\022\"\n\034INTERNAL_AZURE_U" +
-      "NCATEGORIZED\020\341\375\005\022\030\n\022CONN_UNCATEGORIZED\020\271" +
-      "\205\006\022\031\n\023MODEL_UNCATEGORIZED\020\272\205\006\022\031\n\023INPUT_U" +
-      "NCATEGORIZED\020\273\205\006\022\036\n\030ANNOTATION_UNCATEGOR" +
-      "IZED\020\274\205\006\022\033\n\025BILLING_UNCATEGORIZED\020\275\205\006\022\034\n" +
-      "\026INTERNAL_UNCATEGORIZED\020\301\205\006\022\021\n\013BAD_REQUE" +
-      "ST\020\240\302\005\022\022\n\014SERVER_ERROR\020\204\303\005\"\010\010\277\306\001\020\277\306\001\"\010\010\350" +
-      "\201\002\020\350\201\002\"\010\010\351\201\002\020\351\201\002\"\010\010\352\201\002\020\352\201\002\"\010\010\314\202\002\020\314\202\002\"\010\010\315" +
-      "\202\002\020\315\202\002\"\010\010\316\202\002\020\316\202\002\"\010\010\317\202\002\020\317\202\002\"\010\010\320\202\002\020\320\202\002\"\010\010\321" +
-      "\202\002\020\321\202\002\"\010\010\322\202\002\020\322\202\002\"\010\010\260\203\002\020\260\203\002\"\010\010\261\203\002\020\261\203\002\"\010\010\263" +
-      "\203\002\020\263\203\002\"\010\010\272\203\002\020\272\203\002\"\010\010\273\270\002\020\273\270\002\"\010\010\322\270\002\020\322\270\002\"\010\010\323" +
-      "\270\002\020\323\270\002\"\010\010\360\301\002\020\360\301\002\"\010\010\361\301\002\020\361\301\002\"\010\010\362\301\002\020\362\301\002\"\010\010\363" +
-      "\301\002\020\363\301\002\"\010\010\364\301\002\020\364\301\002\"\010\010\234\307\001\020\234\307\001\"\010\010\235\307\001\020\235\307\001\"\010\010\236" +
-      "\307\001\020\236\307\001\"\010\010\237\307\001\020\237\307\001\"\010\010\241\307\001\020\241\307\001\"\010\010\242\307\001\020\242\307\001Bg\n\034" +
-      "com.clarifai.grpc.api.statusP\001Z>github.c" +
-      "om/Clarifai/clarifai-go-grpc/proto/clari" +
-      "fai/api/status\242\002\004CAIPb\006proto3"
+      "\022\033\n\025MODEL_TRAINING_FAILED\020\362\244\001\022\024\n\016MODEL_B" +
+      "UILDING\020\363\244\001\022\033\n\025MODEL_BUILDING_FAILED\020\364\244\001" +
+      "\022\"\n\034MODEL_BUILD_UNEXPECTED_ERROR\020\365\244\001\022\034\n\026" +
+      "MODEL_TRAINING_NO_DATA\020\366\244\001\022!\n\033MODEL_TRAI" +
+      "NING_NO_POSITIVES\020\367\244\001\022*\n$MODEL_TRAINING_" +
+      "ONE_VS_N_SINGLE_CLASS\020\370\244\001\022\036\n\030MODEL_TRAIN" +
+      "ING_TIMED_OUT\020\371\244\001\022\"\n\034MODEL_TRAINING_WAIT" +
+      "ING_ERROR\020\372\244\001\022\"\n\034MODEL_TRAINING_UNKNOWN_" +
+      "ERROR\020\373\244\001\022&\n\034MODEL_TRAINING_MSG_REDELIVE" +
+      "R\020\374\244\001\032\002\010\001\022&\n MODEL_TRAINING_INSUFFICIENT" +
+      "_DATA\020\375\244\001\022#\n\035MODEL_TRAINING_INVALID_PARA" +
+      "MS\020\376\244\001\0224\n.MODEL_TRAINING_INVALID_DATA_TO" +
+      "LERANCE_EXCEEDED\020\377\244\001\022\032\n\024MODEL_MODIFY_SUC" +
+      "CESS\020\236\245\001\022\032\n\024MODEL_MODIFY_PENDING\020\237\245\001\022\031\n\023" +
+      "MODEL_MODIFY_FAILED\020\240\245\001\022\032\n\024MODEL_DOES_NO" +
+      "T_EXIST\020\320\245\001\022\035\n\027MODEL_PERMISSION_DENIED\020\321" +
+      "\245\001\022\034\n\026MODEL_INVALID_ARGUMENT\020\322\245\001\022\033\n\025MODE" +
+      "L_INVALID_REQUEST\020\323\245\001\022\025\n\017MODEL_EVALUATED" +
+      "\020\264\246\001\022\026\n\020MODEL_EVALUATING\020\265\246\001\022\031\n\023MODEL_NO" +
+      "T_EVALUATED\020\266\246\001\022!\n\033MODEL_QUEUED_FOR_EVAL" +
+      "UATION\020\267\246\001\022 \n\032MODEL_EVALUATION_TIMED_OUT" +
+      "\020\276\246\001\022$\n\036MODEL_EVALUATION_WAITING_ERROR\020\277" +
+      "\246\001\022$\n\036MODEL_EVALUATION_UNKNOWN_ERROR\020\300\246\001" +
+      "\022\035\n\027MODEL_PREDICTION_FAILED\020\301\246\001\022(\n\036MODEL" +
+      "_EVALUATION_MSG_REDELIVER\020\302\246\001\032\002\010\001\022\"\n\034MOD" +
+      "EL_EVALUATION_NEED_LABELS\020\303\246\001\022\"\n\034MODEL_E" +
+      "VALUATION_NEED_INPUTS\020\304\246\001\022\035\n\027MODEL_EVALU" +
+      "ATION_FAILED\020\305\246\001\022\035\n\027MODEL_DEPLOYMENT_FAI" +
+      "LED\020\346\246\001\022\025\n\017MODEL_DEPLOYING\020\347\246\001\022!\n\033MODEL_" +
+      "QUEUED_FOR_DEPLOYMENT\020\350\246\001\022\030\n\022MODEL_NOT_D" +
+      "EPLOYED\020\351\246\001\022&\n MODEL_REFERENCE_INVALID_A" +
+      "RGUMENT\020\230\247\001\022*\n$MODEL_EXAMPLE_INPUT_INVAL" +
+      "ID_ARGUMENT\020\254\247\001\022\024\n\016MODEL_EXPORTED\020\374\247\001\022\025\n" +
+      "\017MODEL_EXPORTING\020\375\247\001\022\034\n\026MODEL_EXPORTING_" +
+      "FAILED\020\376\247\001\022\032\n\024MODEL_EXPORT_PENDING\020\377\247\001\022 " +
+      "\n\032WORKFLOW_NO_MATCHING_INPUT\020\361\253\001\022$\n\036WORK" +
+      "FLOW_REQUIRE_TRAINED_MODEL\020\362\253\001\022\030\n\022WORKFL" +
+      "OW_DUPLICATE\020\324\254\001\022!\n\033WORKFLOW_UNSUPPORTED" +
+      "_FORMAT\020\325\254\001\022\035\n\027WORKFLOW_DOES_NOT_EXIST\020\326" +
+      "\254\001\022 \n\032WORKFLOW_PERMISSION_DENIED\020\327\254\001\022\037\n\031" +
+      "WORKFLOW_INVALID_ARGUMENT\020\330\254\001\022\035\n\027WORKFLO" +
+      "W_INVALID_RECIPE\020\331\254\001\022\037\n\031WORKFLOW_INVALID" +
+      "_TEMPLATE\020\332\254\001\022\034\n\026WORKFLOW_INVALID_GRAPH\020" +
+      "\333\254\001\022\037\n\031WORKFLOW_INTERNAL_FAILURE\020\334\254\001\022\036\n\030" +
+      "WORKFLOW_INVALID_REQUEST\020\327\263\001\022\035\n\027WORKFLOW" +
+      "_MODIFY_SUCCESS\020\206\255\001\022\035\n\027WORKFLOW_MODIFY_P" +
+      "ENDING\020\207\255\001\022\034\n\026WORKFLOW_MODIFY_FAILED\020\210\255\001" +
+      "\022\035\n\027WORKFLOW_REINDEX_FAILED\020\211\255\001\022\034\n\026CONCE" +
+      "PT_MODIFY_SUCCESS\020\356\264\001\022\034\n\026CONCEPT_MODIFY_" +
+      "PENDING\020\357\264\001\022\033\n\025CONCEPT_MODIFY_FAILED\020\360\264\001" +
+      "\022\030\n\022ANNOTATION_SUCCESS\020\326\274\001\022\030\n\022ANNOTATION" +
+      "_PENDING\020\327\274\001\022\027\n\021ANNOTATION_FAILED\020\330\274\001\022\037\n" +
+      "\031ANNOTATION_UNKNOWN_STATUS\020\332\274\001\022!\n\033ANNOTA" +
+      "TION_INVALID_ARGUMENT\020\333\274\001\022\"\n\034ANNOTATION_" +
+      "PERMISSION_DENIED\020\334\274\001\022 \n\032ANNOTATION_AWAI" +
+      "TING_REVIEW\020\335\274\001\022*\n$ANNOTATION_AWAITING_C" +
+      "ONSENSUS_REVIEW\020\337\274\001\022\036\n\030ANNOTATION_REVIEW" +
+      "_DENIED\020\336\274\001\022\037\n\031ANNOTATION_MODIFY_SUCCESS" +
+      "\020\272\275\001\022\037\n\031ANNOTATION_MODIFY_PENDING\020\273\275\001\022\036\n" +
+      "\030ANNOTATION_MODIFY_FAILED\020\274\275\001\022&\n METADAT" +
+      "A_INVALID_PATCH_ARGUMENTS\020\304\302\001\022\034\n\026METADAT" +
+      "A_PARSING_ISSUE\020\305\302\001\022!\n\033METADATA_MANIPULA" +
+      "TION_ISSUE\020\306\302\001\022\034\n\026TRAINER_JOB_STATE_NONE" +
+      "\020\250\303\001\022\036\n\030TRAINER_JOB_STATE_QUEUED\020\251\303\001\022\037\n\031" +
+      "TRAINER_JOB_STATE_RUNNING\020\252\303\001\022 \n\032TRAINER" +
+      "_JOB_STATE_COMPLETE\020\253\303\001\022\035\n\027TRAINER_JOB_S" +
+      "TATE_ERROR\020\254\303\001\022\027\n\021DATA_DUMP_SUCCESS\020\276\304\001\022" +
+      "\027\n\021DATA_DUMP_PENDING\020\277\304\001\022\026\n\020DATA_DUMP_FA" +
+      "ILED\020\300\304\001\022\033\n\025DATA_DUMP_IN_PROGRESS\020\301\304\001\022\033\n" +
+      "\021DATA_DUMP_NO_DATA\020\302\304\001\032\002\010\001\022 \n\032DATA_DUMP_" +
+      "UNEXPECTED_ERROR\020\303\304\001\022\036\n\030DATA_DUMP_EXPORT" +
+      "_SUCCESS\020\322\304\001\022\036\n\030DATA_DUMP_EXPORT_PENDING" +
+      "\020\323\304\001\022\035\n\027DATA_DUMP_EXPORT_FAILED\020\324\304\001\022\"\n\034D" +
+      "ATA_DUMP_EXPORT_IN_PROGRESS\020\325\304\001\022\'\n!DATA_" +
+      "DUMP_EXPORT_UNEXPECTED_ERROR\020\326\304\001\022\035\n\027APP_" +
+      "DUPLICATION_SUCCESS\020\360\304\001\022\034\n\026APP_DUPLICATI" +
+      "ON_FAILED\020\361\304\001\022\035\n\027APP_DUPLICATION_PENDING" +
+      "\020\362\304\001\022!\n\033APP_DUPLICATION_IN_PROGRESS\020\363\304\001\022" +
+      "%\n\037APP_DUPLICATION_INVALID_REQUEST\020\364\304\001\022\033" +
+      "\n\025MODULE_DOES_NOT_EXIST\020\324\305\001\022\036\n\030MODULE_PE" +
+      "RMISSION_DENIED\020\325\305\001\022\035\n\027MODULE_INVALID_AR" +
+      "GUMENT\020\326\305\001\022\034\n\026MODULE_INVALID_REQUEST\020\327\305\001" +
+      "\022\034\n\026BULK_OPERATION_SUCCESS\020\270\306\001\022\033\n\025BULK_O" +
+      "PERATION_FAILED\020\271\306\001\022\034\n\026BULK_OPERATION_PE" +
+      "NDING\020\272\306\001\022 \n\032BULK_OPERATION_IN_PROGRESS\020" +
+      "\273\306\001\022$\n\036BULK_OPERATION_INVALID_REQUEST\020\274\306" +
+      "\001\022\036\n\030BULK_OPERATION_CANCELLED\020\275\306\001\022%\n\037BUL" +
+      "K_OPERATION_UNEXPECTED_ERROR\020\276\306\001\022\033\n\025RUNN" +
+      "ER_DOES_NOT_EXIST\020\200\310\001\022\036\n\030RUNNER_PERMISSI" +
+      "ON_DENIED\020\201\310\001\022\035\n\027RUNNER_INVALID_ARGUMENT" +
+      "\020\202\310\001\022\034\n\026RUNNER_INVALID_REQUEST\020\203\310\001\022\030\n\022RU" +
+      "NNER_NEEDS_RETRY\020\204\310\001\022\031\n\023RUNNER_STREAM_ST" +
+      "ART\020\205\310\001\022\027\n\021RUNNER_STREAM_END\020\206\310\001\022\033\n\025RUNN" +
+      "ER_ITEM_CANCELLED\020\207\310\001\022\036\n\030RUNNER_PROCESSI" +
+      "NG_FAILED\020\210\310\001\022\035\n\027NODEPOOL_DOES_NOT_EXIST" +
+      "\020\344\310\001\022\037\n\031NODEPOOL_INVALID_ARGUMENT\020\345\310\001\022\036\n" +
+      "\030NODEPOOL_INVALID_REQUEST\020\346\310\001\022$\n\036COMPUTE" +
+      "_CLUSTER_DOES_NOT_EXIST\020\310\311\001\022&\n COMPUTE_C" +
+      "LUSTER_INVALID_ARGUMENT\020\311\311\001\022%\n\037COMPUTE_C" +
+      "LUSTER_INVALID_REQUEST\020\312\311\001\022\034\n\026INPUT_DOWN" +
+      "LOAD_SUCCESS\020\260\352\001\022\034\n\026INPUT_DOWNLOAD_PENDI" +
+      "NG\020\261\352\001\022\033\n\025INPUT_DOWNLOAD_FAILED\020\262\352\001\022 \n\032I" +
+      "NPUT_DOWNLOAD_IN_PROGRESS\020\263\352\001\022 \n\032INPUT_S" +
+      "TATUS_UPDATE_FAILED\020\264\352\001\022\031\n\023INPUT_DELETE_" +
+      "FAILED\020\265\352\001\022\025\n\017INPUT_DUPLICATE\020\224\353\001\022\036\n\030INP" +
+      "UT_UNSUPPORTED_FORMAT\020\225\353\001\022\032\n\024INPUT_DOES_" +
+      "NOT_EXIST\020\226\353\001\022\035\n\027INPUT_PERMISSION_DENIED" +
+      "\020\227\353\001\022\034\n\026INPUT_INVALID_ARGUMENT\020\230\353\001\022\026\n\020IN" +
+      "PUT_OVER_LIMIT\020\231\353\001\022\027\n\021INPUT_INVALID_URL\020" +
+      "\232\353\001\022\032\n\024INPUT_MODIFY_SUCCESS\020\370\353\001\022\032\n\024INPUT" +
+      "_MODIFY_PENDING\020\371\353\001\022\031\n\023INPUT_MODIFY_FAIL" +
+      "ED\020\373\353\001\022\037\n\031INPUT_STORAGE_HOST_FAILED\020\202\354\001\022" +
+      "\035\n\027ALL_INPUT_INVALID_BYTES\020\334\354\001\022\033\n\025INPUT_" +
+      "CLUSTER_SUCCESS\020\300\355\001\022\033\n\025INPUT_CLUSTER_PEN" +
+      "DING\020\301\355\001\022\032\n\024INPUT_CLUSTER_FAILED\020\302\355\001\022\037\n\031" +
+      "INPUT_CLUSTER_IN_PROGRESS\020\303\355\001\022\033\n\025INPUT_R" +
+      "EINDEX_SUCCESS\020\244\356\001\022\033\n\025INPUT_REINDEX_PEND" +
+      "ING\020\245\356\001\022\032\n\024INPUT_REINDEX_FAILED\020\246\356\001\022\037\n\031I" +
+      "NPUT_REINDEX_IN_PROGRESS\020\247\356\001\022\"\n\034INPUT_VI" +
+      "DEO_DOWNLOAD_SUCCESS\020\230\362\001\022\"\n\034INPUT_VIDEO_" +
+      "DOWNLOAD_PENDING\020\231\362\001\022!\n\033INPUT_VIDEO_DOWN" +
+      "LOAD_FAILED\020\232\362\001\022\033\n\025INPUT_VIDEO_DUPLICATE" +
+      "\020\374\362\001\022$\n\036INPUT_VIDEO_UNSUPPORTED_FORMAT\020\375" +
+      "\362\001\022 \n\032INPUT_VIDEO_DOES_NOT_EXIST\020\376\362\001\022#\n\035" +
+      "INPUT_VIDEO_PERMISSION_DENIED\020\377\362\001\022\"\n\034INP" +
+      "UT_VIDEO_INVALID_ARGUMENT\020\200\363\001\022\034\n\026INPUT_V" +
+      "IDEO_OVER_LIMIT\020\201\363\001\022\035\n\027INPUT_VIDEO_INVAL" +
+      "ID_URL\020\202\363\001\022 \n\032INPUT_VIDEO_MODIFY_SUCCESS" +
+      "\020\340\363\001\022 \n\032INPUT_VIDEO_MODIFY_PENDING\020\341\363\001\022\037" +
+      "\n\031INPUT_VIDEO_MODIFY_FAILED\020\343\363\001\022%\n\037INPUT" +
+      "_VIDEO_STORAGE_HOST_FAILED\020\352\363\001\022$\n\036ALL_IN" +
+      "PUT_VIDEOS_INVALID_BYTES\020\304\364\001\022$\n\036INPUT_VI" +
+      "DEO_PROCESSING_SUCCESS\020\250\365\001\022$\n\036INPUT_VIDE" +
+      "O_PROCESSING_PENDING\020\262\365\001\022#\n\035INPUT_VIDEO_" +
+      "PROCESSING_FAILED\020\274\365\001\022\'\n!INPUT_VIDEO_STO" +
+      "RAGE_INCONSISTENCY\020\306\365\001\022!\n\033INPUT_VIDEO_ST" +
+      "ORAGE_FAILURE\020\320\365\001\022(\n\"INPUT_VIDEO_URL_GEN" +
+      "ERATION_FAILURE\020\332\365\001\022\035\n\027INPUT_CONNECTION_" +
+      "FAILED\020\274\270\002\022&\n REQUEST_DISABLED_FOR_MAINT" +
+      "ENANCE\020\275\270\002\022/\n%INPUT_WRITES_DISABLED_FOR_" +
+      "MAINTENANCE\020\276\270\002\032\002\010\001\022\033\n\025INPUT_INVALID_REQ" +
+      "UEST\020\277\270\002\022\035\n\027PREDICT_INVALID_REQUEST\020\301\270\002\022" +
+      "\034\n\026SEARCH_INVALID_REQUEST\020\302\270\002\022\036\n\030CONCEPT" +
+      "S_INVALID_REQUEST\020\303\270\002\022\033\n\025STATS_INVALID_R" +
+      "EQUEST\020\304\270\002\022\034\n\026DATABASE_DUPLICATE_KEY\020\312\270\002" +
+      "\022 \n\032DATABASE_STATEMENT_TIMEOUT\020\313\270\002\022$\n\036DA" +
+      "TABASE_INVALID_ROWS_AFFECTED\020\314\270\002\022 \n\032DATA" +
+      "BASE_DEADLOCK_DETECTED\020\315\270\002\022\030\n\022DATABASE_F" +
+      "AIL_TASK\020\316\270\002\022&\n DATABASE_FAIL_TO_GET_CON" +
+      "NECTIONS\020\317\270\002\022\037\n\031DATABASE_TOO_MANY_CLIENT" +
+      "S\020\320\270\002\022\"\n\034DATABASE_CONSTRAINT_VIOLATED\020\321\270" +
+      "\002\022\027\n\021DATABASE_CANCELED\020\325\270\002\022\037\n\031ASYNC_WORK" +
+      "ER_MULTI_ERRORS\020\324\270\002\022\034\n\026RPC_REQUEST_QUEUE" +
+      "_FULL\020\336\270\002\022\034\n\026RPC_SERVER_UNAVAILABLE\020\337\270\002\022" +
+      "\031\n\023RPC_REQUEST_TIMEOUT\020\340\270\002\022#\n\035RPC_MAX_ME" +
+      "SSAGE_SIZE_EXCEEDED\020\341\270\002\022\022\n\014RPC_CANCELED\020" +
+      "\343\270\002\022\030\n\022RPC_UNKNOWN_METHOD\020\344\270\002\022\036\n\030REQUEST" +
+      "_CANCELED_BY_USER\020\345\270\002\022\036\n\030CLUSTER_INTERNA" +
+      "L_FAILURE\020\240\320\002\022\037\n\031EXTERNAL_CONNECTION_ERR" +
+      "OR\020\342\270\002\022\032\n\024QUERY_INVALID_SYNTAX\020\362\270\002\022\026\n\020QU" +
+      "EUE_CONN_ERROR\020\250\300\002\022!\n\033QUEUE_CLOSE_REQUES" +
+      "T_TIMEOUT\020\252\300\002\022\027\n\021QUEUE_CONN_CLOSED\020\253\300\002\022\037" +
+      "\n\031QUEUE_PUBLISH_ACK_TIMEOUT\020\254\300\002\022\031\n\023QUEUE" +
+      "_PUBLISH_ERROR\020\255\300\002\022 \n\032QUEUE_SUBSCRIPTION" +
+      "_TIMEOUT\020\256\300\002\022\036\n\030QUEUE_SUBSCRIPTION_ERROR" +
+      "\020\257\300\002\022\036\n\030QUEUE_MARSHALLING_FAILED\020\260\300\002\022 \n\032" +
+      "QUEUE_UNMARSHALLING_FAILED\020\261\300\002\022\'\n!QUEUE_" +
+      "MAX_MSG_REDELIVERY_EXCEEDED\020\262\300\002\022\027\n\021QUEUE" +
+      "_ACK_FAILURE\020\263\300\002\022\023\n\rSQS_OVERLIMIT\020\214\301\002\022 \n" +
+      "\032SQS_INVALID_RECEIPT_HANDLE\020\215\301\002\022\021\n\013SQS_U" +
+      "NKNOWN\020\216\301\002\022\035\n\027SEARCH_INTERNAL_FAILURE\020\371\317" +
+      "\002\022\037\n\031SEARCH_PROJECTION_FAILURE\020\372\317\002\022\037\n\031SE" +
+      "ARCH_PREDICTION_FAILURE\020\373\317\002\022\'\n!SEARCH_BY" +
+      "_NOT_FULLY_INDEXED_INPUT\020\374\317\002\022 \n\032SAVED_SE" +
+      "ARCH_MODIFY_FAILED\020\375\317\002\022\037\n\031SEARCH_COUNTS_" +
+      "UNAVAILABLE\020\376\317\002\022\027\n\021EVALUATION_QUEUED\020\334\320\002" +
+      "\022\034\n\026EVALUATION_IN_PROGRESS\020\335\320\002\022\030\n\022EVALUA" +
+      "TION_SUCCESS\020\336\320\002\022(\n\"EVALUATION_FAILED_TO" +
+      "_RETRIEVE_DATA\020\337\320\002\022!\n\033EVALUATION_INVALID" +
+      "_ARGUMENT\020\340\320\002\022\027\n\021EVALUATION_FAILED\020\341\320\002\022\030" +
+      "\n\022EVALUATION_PENDING\020\342\320\002\022\032\n\024EVALUATION_T" +
+      "IMED_OUT\020\343\320\002\022!\n\033EVALUATION_UNEXPECTED_ER" +
+      "ROR\020\344\320\002\022\026\n\020EVALUATION_MIXED\020\345\320\002\022\030\n\022STRIP" +
+      "E_EVENT_ERROR\020\341\327\002\022\020\n\nCACHE_MISS\020\311\337\002\022&\n R" +
+      "EDIS_SCRIPT_EXITED_WITH_FAILURE\020\312\337\002\022\026\n\020R" +
+      "EDIS_STREAM_ERR\020\313\337\002\022\030\n\022REDIS_NO_CONSUMER" +
+      "S\020\314\337\002\022\032\n\024REDIS_STREAM_BACKOFF\020\315\337\002\022\030\n\022SIG" +
+      "NUP_EVENT_ERROR\020\261\347\002\022\024\n\016SIGNUP_FLAGGED\020\262\347" +
+      "\002\022\032\n\024FILETYPE_UNSUPPORTED\020\263\347\002\022\037\n\031APP_COU" +
+      "NT_INVALID_MESSAGE\020\231\357\002\022\'\n!APP_COUNT_UPDA" +
+      "TE_INCREMENT_FAILED\020\232\357\002\022\036\n\030APP_COUNT_REB" +
+      "UILD_FAILED\020\233\357\002\022 \n\032APP_COUNT_INTERNAL_FA" +
+      "ILURE\020\234\357\002\022\027\n\021MP_DOWNLOAD_ERROR\020\375\357\002\022\032\n\024MP" +
+      "_RESOLVE_DNS_ERROR\020\376\357\002\022)\n#MP_DOWNLOAD_MA" +
+      "X_SIZE_EXCEEDED_ERROR\020\377\357\002\022\033\n\025MP_IMAGE_DE" +
+      "CODE_ERROR\020\200\360\002\022\031\n\023MP_INVALID_ARGUMENT\020\201\360" +
+      "\002\022\037\n\031MP_IMAGE_PROCESSING_ERROR\020\202\360\002\022\031\n\023DA" +
+      "TATIER_CONN_ERROR\020\341\360\002\022\027\n\021USER_CONSENT_FA" +
+      "CE\020\321\206\003\022\024\n\016WORKER_MISSING\020\270\216\003\022\023\n\rWORKER_A" +
+      "CTIVE\020\271\216\003\022\025\n\017WORKER_INACTIVE\020\272\216\003\022\027\n\021COLL" +
+      "ECTOR_MISSING\020\240\226\003\022\026\n\020COLLECTOR_ACTIVE\020\241\226" +
+      "\003\022\030\n\022COLLECTOR_INACTIVE\020\242\226\003\022!\n\033COLLECTOR" +
+      "_POST_INPUT_FAILED\020\243\226\003\022*\n$SSO_IDENTITY_P" +
+      "ROVIDER_DOES_NOT_EXIST\020\211\236\003\022\026\n\020TASK_IN_PR" +
+      "OGRESS\020\361\245\003\022\017\n\tTASK_DONE\020\362\245\003\022\022\n\014TASK_WONT" +
+      "_DO\020\363\245\003\022\021\n\013TASK_FAILED\020\365\245\003\022\017\n\tTASK_IDLE\020" +
+      "\366\245\003\022\023\n\rTASK_CONFLICT\020\324\246\003\022\032\n\024TASK_NOT_IMP" +
+      "LEMENTED\020\325\246\003\022\022\n\014TASK_MISSING\020\326\246\003\022\034\n\026TASK" +
+      "_PERMISSION_DENIED\020\327\246\003\022\035\n\027TASK_ASSIGNMEN" +
+      "T_SUCCESS\020\270\247\003\022\035\n\027TASK_ASSIGNMENT_PENDING" +
+      "\020\271\247\003\022%\n\037TASK_ASSIGNMENT_AWAITING_REVIEW\020" +
+      "\272\247\003\022/\n)TASK_ASSIGNMENT_AWAITING_CONSENSU" +
+      "S_REVIEW\020\273\247\003\022#\n\035TASK_ASSIGNMENT_REVIEW_D" +
+      "ENIED\020\274\247\003\022\031\n\023LABEL_ORDER_PENDING\020\331\255\003\022\035\n\027" +
+      "LABEL_ORDER_IN_PROGRESS\020\332\255\003\022\031\n\023LABEL_ORD" +
+      "ER_SUCCESS\020\333\255\003\022\032\n\024LABEL_ORDER_CANCELED\020\334" +
+      "\255\003\022\024\n\016LICENSE_ACTIVE\020\340\324\003\022\034\n\026LICENSE_DOES" +
+      "_NOT_EXIST\020\341\324\003\022\031\n\023LICENSE_NEED_UPDATE\020\342\324" +
+      "\003\022\025\n\017LICENSE_EXPIRED\020\343\324\003\022\025\n\017LICENSE_REVO" +
+      "KED\020\344\324\003\022\025\n\017LICENSE_DELETED\020\345\324\003\022\035\n\027LICENS" +
+      "E_VOLUME_EXCEEDED\020\346\324\003\022!\n\033PASSWORD_VALIDA" +
+      "TION_SUCCESS\020\310\334\003\022 \n\032PASSWORD_VALIDATION_" +
+      "FAILED\020\311\334\003\022%\n\037PASSWORDPOLICY_INVALID_ARG" +
+      "UMENT\020\312\334\003\022\"\n\034FEATUREFLAG_CONFIG_NOT_FOUN" +
+      "D\020\260\344\003\022\"\n\034FEATUREFLAG_INVALID_ARGUMENT\020\261\344" +
+      "\003\022\031\n\023FEATUREFLAG_BLOCKED\020\262\344\003\022\031\n\023MAINTENA" +
+      "NCE_SUCCESS\020\230\354\003\022\030\n\022MAINTENANCE_FAILED\020\231\354" +
+      "\003\022\035\n\027DATASET_VERSION_PENDING\020\205\364\003\022!\n\033DATA" +
+      "SET_VERSION_IN_PROGRESS\020\212\364\003\022\033\n\025DATASET_V" +
+      "ERSION_READY\020\217\364\003\022\035\n\027DATASET_VERSION_FAIL" +
+      "URE\020\224\364\003\022&\n DATASET_VERSION_UNEXPECTED_ER" +
+      "ROR\020\231\364\003\022\036\n\030DATASET_VERSION_CONFLICT\020\236\364\003\022" +
+      "\033\n\025DATASET_INPUT_SUCCESS\020\344\364\003\022\035\n\027DATASET_" +
+      "INPUT_DUPLICATE\020\345\364\003\022$\n\036DATASET_VERSION_E" +
+      "XPORT_SUCCESS\020\310\365\003\022$\n\036DATASET_VERSION_EXP" +
+      "ORT_PENDING\020\311\365\003\022#\n\035DATASET_VERSION_EXPOR" +
+      "T_FAILED\020\312\365\003\022(\n\"DATASET_VERSION_EXPORT_I" +
+      "N_PROGRESS\020\313\365\003\022-\n\'DATASET_VERSION_EXPORT" +
+      "_UNEXPECTED_ERROR\020\314\365\003\022\020\n\nJOB_QUEUED\020\200\364\003\022" +
+      "\021\n\013JOB_RUNNING\020\201\364\003\022\023\n\rJOB_COMPLETED\020\202\364\003\022" +
+      "\020\n\nJOB_FAILED\020\203\364\003\022\023\n\rJOB_CANCELLED\020\204\364\003\022\032" +
+      "\n\024JOB_UNEXPECTED_ERROR\020\206\364\003\022\022\n\014JOB_CONFLI" +
+      "CT\020\207\364\003\022\034\n\026AUTH_MISSING_IDP_ASSOC\020\350\373\003\022\031\n\023" +
+      "LIST_OBJECTS_FAILED\020\320\203\004\022\034\n\026ARCHIVE_EXTRA" +
+      "CT_FAILED\020\270\213\004\022\030\n\022UPLOAD_IN_PROGRESS\020\240\223\004\022" +
+      "\021\n\013UPLOAD_DONE\020\241\223\004\022\023\n\rUPLOAD_FAILED\020\242\223\004\022" +
+      "\035\n\027UPLOAD_UNEXPECTED_ERROR\020\243\223\004\022\024\n\016UPLOAD" +
+      "_EXPIRED\020\244\223\004\022\025\n\017UPLOAD_CANCELED\020\245\223\004\022\025\n\017U" +
+      "PLOAD_CONFLICT\020\246\223\004\022\032\n\024BILLING_INVALID_IN" +
+      "FO\020\210\233\004\022\033\n\025INTERNAL_SERVER_ISSUE\020\324\375\005\022\035\n\027I" +
+      "NTERNAL_FETCHING_ISSUE\020\325\375\005\022\035\n\027INTERNAL_D" +
+      "ATABASE_ISSUE\020\326\375\005\022\037\n\031INTERNAL_CONTEXT_CA" +
+      "NCELED\020\330\375\005\022!\n\033INTERNAL_UNEXPECTED_TIMEOU" +
+      "T\020\331\375\005\022\034\n\026INTERNAL_UNEXPECTED_V1\020\332\375\005\022\037\n\031I" +
+      "NTERNAL_UNEXPECTED_PANIC\020\333\375\005\022\037\n\031INTERNAL" +
+      "_UNEXPECTED_SPIRE\020\334\375\005\022 \n\032INTERNAL_REDIS_" +
+      "UNAVAILABLE\020\335\375\005\022!\n\033INTERNAL_RESOURCE_EXH" +
+      "AUSTED\020\336\375\005\022\"\n\034INTERNAL_REDIS_UNCATEGORIZ" +
+      "ED\020\337\375\005\022 \n\032INTERNAL_AWS_UNCATEGORIZED\020\340\375\005" +
+      "\022\"\n\034INTERNAL_AZURE_UNCATEGORIZED\020\341\375\005\022\030\n\022" +
+      "CONN_UNCATEGORIZED\020\271\205\006\022\031\n\023MODEL_UNCATEGO" +
+      "RIZED\020\272\205\006\022\031\n\023INPUT_UNCATEGORIZED\020\273\205\006\022\036\n\030" +
+      "ANNOTATION_UNCATEGORIZED\020\274\205\006\022\033\n\025BILLING_" +
+      "UNCATEGORIZED\020\275\205\006\022\034\n\026INTERNAL_UNCATEGORI" +
+      "ZED\020\301\205\006\022\021\n\013BAD_REQUEST\020\240\302\005\022\022\n\014SERVER_ERR" +
+      "OR\020\204\303\005\"\010\010\277\306\001\020\277\306\001\"\010\010\350\201\002\020\350\201\002\"\010\010\351\201\002\020\351\201\002\"\010\010\352" +
+      "\201\002\020\352\201\002\"\010\010\314\202\002\020\314\202\002\"\010\010\315\202\002\020\315\202\002\"\010\010\316\202\002\020\316\202\002\"\010\010\317" +
+      "\202\002\020\317\202\002\"\010\010\320\202\002\020\320\202\002\"\010\010\321\202\002\020\321\202\002\"\010\010\322\202\002\020\322\202\002\"\010\010\260" +
+      "\203\002\020\260\203\002\"\010\010\261\203\002\020\261\203\002\"\010\010\263\203\002\020\263\203\002\"\010\010\272\203\002\020\272\203\002\"\010\010\273" +
+      "\270\002\020\273\270\002\"\010\010\322\270\002\020\322\270\002\"\010\010\323\270\002\020\323\270\002\"\010\010\360\301\002\020\360\301\002\"\010\010\361" +
+      "\301\002\020\361\301\002\"\010\010\362\301\002\020\362\301\002\"\010\010\363\301\002\020\363\301\002\"\010\010\364\301\002\020\364\301\002\"\010\010\234" +
+      "\307\001\020\234\307\001\"\010\010\235\307\001\020\235\307\001\"\010\010\236\307\001\020\236\307\001\"\010\010\237\307\001\020\237\307\001\"\010\010\241" +
+      "\307\001\020\241\307\001\"\010\010\242\307\001\020\242\307\001Bg\n\034com.clarifai.grpc.ap" +
+      "i.statusP\001Z>github.com/Clarifai/clarifai" +
+      "-go-grpc/proto/clarifai/api/status\242\002\004CAI" +
+      "Pb\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
diff --git a/src/main/java/com/clarifai/grpc/auth/scope/S.java b/src/main/java/com/clarifai/grpc/auth/scope/S.java
index 6dccd7a..2b8dcd8 100644
--- a/src/main/java/com/clarifai/grpc/auth/scope/S.java
+++ b/src/main/java/com/clarifai/grpc/auth/scope/S.java
@@ -702,6 +702,38 @@ public enum S
    * <code>RunnerItems_Add = 135 [(.clarifai.auth.scope.clarfai_exposed) = true, (.clarifai.auth.scope.clarifai_depending_scopes) = RunnerItems_Get];</code>
    */
   RunnerItems_Add(135),
+  /**
+   * <pre>
+   * Pools of compute resources.
+   * </pre>
+   *
+   * <code>Nodepools_Get = 136 [(.clarifai.auth.scope.clarfai_exposed) = true];</code>
+   */
+  Nodepools_Get(136),
+  /**
+   * <code>Nodepools_Add = 137 [(.clarifai.auth.scope.clarfai_exposed) = true, (.clarifai.auth.scope.clarifai_depending_scopes) = Nodepools_Get];</code>
+   */
+  Nodepools_Add(137),
+  /**
+   * <code>Nodepools_Delete = 138 [(.clarifai.auth.scope.clarfai_exposed) = true, (.clarifai.auth.scope.clarifai_depending_scopes) = Nodepools_Get, (.clarifai.auth.scope.clarifai_depending_scopes) = Nodepools_Add];</code>
+   */
+  Nodepools_Delete(138),
+  /**
+   * <pre>
+   * Cluster of machines in a region of cloud
+   * </pre>
+   *
+   * <code>ComputeClusters_Get = 139 [(.clarifai.auth.scope.clarfai_exposed) = true];</code>
+   */
+  ComputeClusters_Get(139),
+  /**
+   * <code>ComputeClusters_Add = 140 [(.clarifai.auth.scope.clarfai_exposed) = true, (.clarifai.auth.scope.clarifai_depending_scopes) = ComputeClusters_Get];</code>
+   */
+  ComputeClusters_Add(140),
+  /**
+   * <code>ComputeClusters_Delete = 141 [(.clarifai.auth.scope.clarfai_exposed) = true, (.clarifai.auth.scope.clarifai_depending_scopes) = ComputeClusters_Get, (.clarifai.auth.scope.clarifai_depending_scopes) = ComputeClusters_Add];</code>
+   */
+  ComputeClusters_Delete(141),
   UNRECOGNIZED(-1),
   ;
 
@@ -1366,6 +1398,38 @@ public enum S
    * <code>RunnerItems_Add = 135 [(.clarifai.auth.scope.clarfai_exposed) = true, (.clarifai.auth.scope.clarifai_depending_scopes) = RunnerItems_Get];</code>
    */
   public static final int RunnerItems_Add_VALUE = 135;
+  /**
+   * <pre>
+   * Pools of compute resources.
+   * </pre>
+   *
+   * <code>Nodepools_Get = 136 [(.clarifai.auth.scope.clarfai_exposed) = true];</code>
+   */
+  public static final int Nodepools_Get_VALUE = 136;
+  /**
+   * <code>Nodepools_Add = 137 [(.clarifai.auth.scope.clarfai_exposed) = true, (.clarifai.auth.scope.clarifai_depending_scopes) = Nodepools_Get];</code>
+   */
+  public static final int Nodepools_Add_VALUE = 137;
+  /**
+   * <code>Nodepools_Delete = 138 [(.clarifai.auth.scope.clarfai_exposed) = true, (.clarifai.auth.scope.clarifai_depending_scopes) = Nodepools_Get, (.clarifai.auth.scope.clarifai_depending_scopes) = Nodepools_Add];</code>
+   */
+  public static final int Nodepools_Delete_VALUE = 138;
+  /**
+   * <pre>
+   * Cluster of machines in a region of cloud
+   * </pre>
+   *
+   * <code>ComputeClusters_Get = 139 [(.clarifai.auth.scope.clarfai_exposed) = true];</code>
+   */
+  public static final int ComputeClusters_Get_VALUE = 139;
+  /**
+   * <code>ComputeClusters_Add = 140 [(.clarifai.auth.scope.clarfai_exposed) = true, (.clarifai.auth.scope.clarifai_depending_scopes) = ComputeClusters_Get];</code>
+   */
+  public static final int ComputeClusters_Add_VALUE = 140;
+  /**
+   * <code>ComputeClusters_Delete = 141 [(.clarifai.auth.scope.clarfai_exposed) = true, (.clarifai.auth.scope.clarifai_depending_scopes) = ComputeClusters_Get, (.clarifai.auth.scope.clarifai_depending_scopes) = ComputeClusters_Add];</code>
+   */
+  public static final int ComputeClusters_Delete_VALUE = 141;
 
 
   public final int getNumber() {
@@ -1482,6 +1546,12 @@ public static S forNumber(int value) {
       case 133: return Runners_Delete;
       case 134: return RunnerItems_Get;
       case 135: return RunnerItems_Add;
+      case 136: return Nodepools_Get;
+      case 137: return Nodepools_Add;
+      case 138: return Nodepools_Delete;
+      case 139: return ComputeClusters_Get;
+      case 140: return ComputeClusters_Add;
+      case 141: return ComputeClusters_Delete;
       default: return null;
     }
   }
diff --git a/src/main/java/com/clarifai/grpc/auth/scope/Scope.java b/src/main/java/com/clarifai/grpc/auth/scope/Scope.java
index d01b4f4..8097eea 100644
--- a/src/main/java/com/clarifai/grpc/auth/scope/Scope.java
+++ b/src/main/java/com/clarifai/grpc/auth/scope/Scope.java
@@ -66,7 +66,7 @@ public static void registerAllExtensions(
       "\023clarifai.auth.scope\032 google/protobuf/de" +
       "scriptor.proto\"F\n\tScopeList\022&\n\006scopes\030\001 " +
       "\003(\0162\026.clarifai.auth.scope.S\022\021\n\tendpoints" +
-      "\030\002 \003(\t*\274\026\n\001S\022\t\n\005undef\020\000\022\r\n\003All\020\001\032\004\360\233\'\001\022\021" +
+      "\030\002 \003(\t*\216\030\n\001S\022\t\n\005undef\020\000\022\r\n\003All\020\001\032\004\360\233\'\001\022\021" +
       "\n\007Predict\020\002\032\004\360\233\'\001\022\030\n\nInputs_Add\020\004\032\010\360\233\'\001\370" +
       "\233\'\005\022\024\n\nInputs_Get\020\005\032\004\360\233\'\001\022 \n\014Inputs_Patc" +
       "h\020\007\032\016\010\001\360\233\'\001\370\233\'\004\370\233\'\005\022\037\n\rInputs_Delete\020\010\032\014" +
@@ -137,14 +137,20 @@ public static void registerAllExtensions(
       "Runners_Add\020\204\001\032\t\360\233\'\001\370\233\'\203\001\022#\n\016Runners_Del" +
       "ete\020\205\001\032\016\360\233\'\001\370\233\'\203\001\370\233\'\204\001\022\032\n\017RunnerItems_Ge" +
       "t\020\206\001\032\004\360\233\'\001\022\037\n\017RunnerItems_Add\020\207\001\032\t\360\233\'\001\370\233" +
-      "\'\206\001\"\004\010\036\020\036\"\004\010\037\020\037\"\004\010 \020 \"\004\010!\020!\"\004\010\"\020\"\"\004\010}\020}\"" +
-      "\004\010~\020~:<\n\017clarfai_exposed\022!.google.protob" +
-      "uf.EnumValueOptions\030\276\363\004 \001(\010:^\n\031clarifai_" +
-      "depending_scopes\022!.google.protobuf.EnumV" +
-      "alueOptions\030\277\363\004 \003(\0162\026.clarifai.auth.scop" +
-      "e.SBg\n\034com.clarifai.grpc.auth.scopeP\001Z>g" +
-      "ithub.com/Clarifai/clarifai-go-grpc/prot" +
-      "o/clarifai/auth/scope\242\002\004CAIPb\006proto3"
+      "\'\206\001\022\030\n\rNodepools_Get\020\210\001\032\004\360\233\'\001\022\035\n\rNodepoo" +
+      "ls_Add\020\211\001\032\t\360\233\'\001\370\233\'\210\001\022%\n\020Nodepools_Delete" +
+      "\020\212\001\032\016\360\233\'\001\370\233\'\210\001\370\233\'\211\001\022\036\n\023ComputeClusters_G" +
+      "et\020\213\001\032\004\360\233\'\001\022#\n\023ComputeClusters_Add\020\214\001\032\t\360" +
+      "\233\'\001\370\233\'\213\001\022+\n\026ComputeClusters_Delete\020\215\001\032\016\360" +
+      "\233\'\001\370\233\'\213\001\370\233\'\214\001\"\004\010\036\020\036\"\004\010\037\020\037\"\004\010 \020 \"\004\010!\020!\"\004\010" +
+      "\"\020\"\"\004\010}\020}\"\004\010~\020~:<\n\017clarfai_exposed\022!.goo" +
+      "gle.protobuf.EnumValueOptions\030\276\363\004 \001(\010:^\n" +
+      "\031clarifai_depending_scopes\022!.google.prot" +
+      "obuf.EnumValueOptions\030\277\363\004 \003(\0162\026.clarifai" +
+      ".auth.scope.SBg\n\034com.clarifai.grpc.auth." +
+      "scopeP\001Z>github.com/Clarifai/clarifai-go" +
+      "-grpc/proto/clarifai/auth/scope\242\002\004CAIPb\006" +
+      "proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,