Repository: SeldonIO/tempo (language: python)

Issue:
Initial code quality tools
 - [ ] Black
 - [ ] Linters
 - [ ] PyPy
 - [ ] Github Actions


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 00000000..88751aa9
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,24 @@
+name: Tempo Lint
+
+on:
+  push:
+    branches: [ master ]
+  pull_request:
+    branches: [ master ]
+
+jobs:
+  lint:
+    runs-on: ubuntu-latest
+
+    steps:
+        - uses: actions/checkout@v2
+        - name: Set up Python 3.7
+          uses: actions/setup-python@v2
+          with:
+            python-version: 3.7.10
+        - name: Install dependencies
+          run: |
+            make install-dev
+        - name: Lint 
+          run: |
+            make lint
diff --git a/Makefile b/Makefile
index 69f8e18e..99f58f56 100644
--- a/Makefile
+++ b/Makefile
@@ -5,42 +5,34 @@ VERSION = $(shell sed 's/^__version__ = "\(.*\)"/\1/' ./tempo/version.py)
 install:
 	pip install -e .
 
-install-dev:
+.PHONY: install-dev
+install-dev: install
 	pip install -r requirements-dev.txt
 
 .PHONY: test
-test: tempo
-	pytest tempo
+test:
+	tox
 
+.PHONY: fmt
 fmt:
-	black ./ --exclude "(mlops/metadata/|.eggs|.tox)"
-
+	isort .
+	black . \
+		--exclude "(.eggs|.tox)" \
+		--line-length 120
 
 .PHONY: lint
 lint:
 	flake8 .
+	mypy ./tempo
+	black . \
+		--check \
+		--exclude "(.eggs|.tox)" \
+		--line-length 120
 
-.PHONY: mypy
-mypy:
-	mypy .
-
-tempo/metadata/grpc_core_service.proto:
-	wget https://raw.githubusercontent.com/triton-inference-server/server/master/docs/protocol/grpc_core_service.proto -O tempo/metadata/grpc_core_service.proto
-
+.PHONY: install-rclone
 install-rclone:
 	curl https://rclone.org/install.sh | sudo bash
 
-build-protos: tempo
-	cd tempo && python \
-	-m grpc.tools.protoc \
-	-I./ \
-	-I./metadata/ \
-	--python_out=./ \
-	--grpc_python_out=./ \
-	--mypy_out=./ \
-	./metadata/grpc_core_service.proto
-
-
 .PHONY: tempo/tests/examples
 tempo/tests/examples:
 	mkdir -p tempo/tests/examples
@@ -52,22 +44,27 @@ tempo/tests/examples:
 		gsutil cp -r gs://seldon-models/tfserving .
 
 
+.PHONY: clean_test_data
 clean_test_data:
 	rm -rf tempo/tests/examples
 
 
+.PHONY: build
 build: clean
 	python setup.py sdist bdist_wheel
 
+.PHONY: clean
 clean:
 	rm -rf ./dist ./build *.egg-info
 
+.PHONY: push-test
 push-test:
 	twine upload --repository-url https://test.pypi.org/legacy/ dist/*
 
+.PHONY: push
 push:
 	twine upload dist/*
 
-
+.PHONY: version
 version:
 	@echo ${VERSION}
diff --git a/docs/conf.py b/docs/conf.py
index 20bcd308..a0aa0905 100755
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,103 +1,96 @@
-# Configuration file for the Sphinx documentation builder.
-#
-# This file only contains a selection of the most common options. For a full
-# list see the documentation:
-# https://www.sphinx-doc.org/en/master/usage/configuration.html
-
-# -- Path setup --------------------------------------------------------------
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-
-
-# -- Project information -----------------------------------------------------
-import sys
-import os
-import kp
-import sphinx_material
-
-project = 'Tempo MLOps'
-copyright = '2020, Seldon Technologies'
-html_title = "Tempo MLOps"
-author = 'Seldon Technologies'
-
-# The full version, including alpha/beta/rc tags
-release = '0.1.0'
-
-
-# -- General configuration ---------------------------------------------------
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = [
-    "sphinx.ext.autodoc",
-    # Creates .nojekyll config
-    'sphinx.ext.githubpages',
-    # Converts markdown to rst 
-    "m2r2"
-]
-source_suffix = ['.rst', '.md']
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
-
-# -- Options for HTML output -------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-#
-# Chosen Themes:
-# * https://github.com/bashtage/sphinx-material/
-# * https://github.com/myyasuda/sphinx_materialdesign_theme
-html_theme = 'sphinx_material'
-
-if html_theme == 'sphinx_material':
-    html_theme_options = {
-        'google_analytics_account': '',
-        'base_url': 'https://tempo.seldon.io',
-        'color_primary': 'teal',
-        'color_accent': 'light-blue',
-        'repo_url': 'https://github.com/SeldonIO/tempo/',
-        'repo_name': 'Tempo',
-        'globaltoc_depth': 2,
-        'globaltoc_collapse': False,
-        'globaltoc_includehidden': False,
-        "repo_type": "github",
-        "nav_links": [
-            {
-                "href": "https://github.com/SeldonIO/tempo",
-                "internal": False,
-                "title": "Tempo Repo",
-            },
-        ]
-    }
-
-    extensions.append("sphinx_material")
-    html_theme_path = sphinx_material.html_theme_path()
-    html_context = sphinx_material.get_html_context()
-
-html_sidebars = {
-    "**": ["logo-text.html", "globaltoc.html",  "localtoc.html", "searchbox.html"]
-}
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
-
-html_css_files = [
-    'assets/custom.css',
-]
-
-
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+
+# -- Project information -----------------------------------------------------
+import sphinx_material
+
+project = "Tempo MLOps"
+copyright = "2020, Seldon Technologies"
+html_title = "Tempo MLOps"
+author = "Seldon Technologies"
+
+# The full version, including alpha/beta/rc tags
+release = "0.1.0"
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+    "sphinx.ext.autodoc",
+    # Creates .nojekyll config
+    "sphinx.ext.githubpages",
+    # Converts markdown to rst
+    "m2r2",
+]
+source_suffix = [".rst", ".md"]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ["_templates"]
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+#
+# Chosen Themes:
+# * https://github.com/bashtage/sphinx-material/
+# * https://github.com/myyasuda/sphinx_materialdesign_theme
+html_theme = "sphinx_material"
+
+if html_theme == "sphinx_material":
+    html_theme_options = {
+        "google_analytics_account": "",
+        "base_url": "https://tempo.seldon.io",
+        "color_primary": "teal",
+        "color_accent": "light-blue",
+        "repo_url": "https://github.com/SeldonIO/tempo/",
+        "repo_name": "Tempo",
+        "globaltoc_depth": 2,
+        "globaltoc_collapse": False,
+        "globaltoc_includehidden": False,
+        "repo_type": "github",
+        "nav_links": [
+            {
+                "href": "https://github.com/SeldonIO/tempo",
+                "internal": False,
+                "title": "Tempo Repo",
+            },
+        ],
+    }
+
+    extensions.append("sphinx_material")
+    html_theme_path = sphinx_material.html_theme_path()
+    html_context = sphinx_material.get_html_context()
+
+html_sidebars = {"**": ["logo-text.html", "globaltoc.html", "localtoc.html", "searchbox.html"]}
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ["_static"]
+
+html_css_files = [
+    "assets/custom.css",
+]
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 3afbdd50..802f09e6 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -4,14 +4,14 @@ grpcio-tools==1.35.0
 # Linting and formatting
 black==20.8b1
 flake8==3.8.3
-flake8-black==0.2.1
+isort==5.7.0
 mypy==0.800
 mypy-protobuf==1.23
 
 # Testing
 pytest==6.2.0
 pytest-asyncio==0.14.0
-pytest-cov==2.10.1
+tox==3.22.0
 
 # Pushing to PyPi
 twine==3.3.0
diff --git a/setup.cfg b/setup.cfg
index 8c05ae26..5ceceafa 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,5 +1,32 @@
 [flake8]
 max-line-length = 120
+extend-ignore =
+  # See https://github.com/PyCQA/pycodestyle/issues/373
+  E203,
 exclude =
-    .eggs/
-    mlops/metadata/
\ No newline at end of file
+  ./build
+  ./dist
+  ./*.egg-info
+  ./.eggs
+  ./.tox
+
+[mypy]
+ignore_missing_imports = True
+plugins = pydantic.mypy
+
+[isort]
+# See https://black.readthedocs.io/en/stable/compatible_configs.html
+multi_line_output = 3
+include_trailing_comma = True
+force_grid_wrap = 0
+use_parentheses = True
+ensure_newline_before_comments = True
+line_length = 120
+
+[tox:tox]
+basepython = py3
+envlist = py3
+
+[testenv]
+deps = -r{toxinidir}/requirements-dev.txt
+commands = pytest {posargs} {toxinidir}/tempo/tests
diff --git a/setup.py b/setup.py
index bae3251b..a2dd734f 100644
--- a/setup.py
+++ b/setup.py
@@ -1,8 +1,7 @@
 import os
-
 from typing import Dict
-from setuptools import find_packages, setup
 
+from setuptools import find_packages, setup
 
 ROOT_PATH = os.path.dirname(__file__)
 PKG_NAME = "tempo"
@@ -54,7 +53,7 @@ def _load_description() -> str:
         "seldon-deploy-sdk",
         "conda-pack",
         "mlserver==0.3.1.dev5",
-        "mlserver-tempo==0.3.1.dev5"
+        "mlserver-tempo==0.3.1.dev5",
     ],
     tests_require=["pytest", "pytest-cov", "pytest-xdist", "pytest-lazy-fixture"],
     zip_safe=False,
diff --git a/tempo/__init__.py b/tempo/__init__.py
index cd337841..2d735710 100644
--- a/tempo/__init__.py
+++ b/tempo/__init__.py
@@ -1,4 +1,3 @@
-# from . import confidence, datasets, explainers, utils
-from .version import __version__  # noqa F401
+from .version import __version__
 
-__all__ = []
+__all__ = ["__version__"]
diff --git a/tempo/conf.py b/tempo/conf.py
index c93643cb..ada49db5 100644
--- a/tempo/conf.py
+++ b/tempo/conf.py
@@ -1,6 +1,7 @@
-from pydantic import BaseSettings
 from pathlib import Path
 
+from pydantic import BaseSettings
+
 
 class TempoSettings(BaseSettings):
     rclone_cfg: str = str(Path.home()) + "/.config/rclone/rclone.conf"
diff --git a/tempo/errors.py b/tempo/errors.py
new file mode 100644
index 00000000..8738029e
--- /dev/null
+++ b/tempo/errors.py
@@ -0,0 +1,15 @@
+class TempoError(Exception):
+    def __init__(self, msg):
+        super().__init__(msg)
+
+
+class UndefinedRuntime(TempoError):
+    def __init__(self, model_name: str):
+        msg = f"Undefined runtime for model {model_name}"
+        super().__init__(msg)
+
+
+class UndefinedCustomImplementation(TempoError):
+    def __init__(self, model_name: str):
+        msg = f"Undefined custom implementation for model {model_name}"
+        super().__init__(msg)
diff --git a/tempo/kfserving/endpoint.py b/tempo/kfserving/endpoint.py
index d5402df5..6d666c60 100644
--- a/tempo/kfserving/endpoint.py
+++ b/tempo/kfserving/endpoint.py
@@ -1,21 +1,25 @@
-from kubernetes import client, config
 import os
-from tempo.utils import logger
-from tempo.serve.protocol import Protocol
-from tempo.serve.metadata import ModelDetails
 from urllib.parse import urlparse
 
+from kubernetes import client, config
+
+from tempo.serve.metadata import ModelDetails
+from tempo.serve.protocol import Protocol
+from tempo.utils import logger
+
 ENV_K8S_SERVICE_HOST = "KUBERNETES_SERVICE_HOST"
 ISTIO_GATEWAY = "istio"
 
 
 class Endpoint(object):
-    """A Model Endpoint
-
-    """
+    """A Model Endpoint"""
 
     def __init__(
-        self, model_details: ModelDetails, namespace, protocol: Protocol, gateway=ISTIO_GATEWAY
+        self,
+        model_details: ModelDetails,
+        namespace,
+        protocol: Protocol,
+        gateway=ISTIO_GATEWAY,
     ):
         self.inside_cluster = os.getenv(ENV_K8S_SERVICE_HOST)
         try:
@@ -25,7 +29,7 @@ def __init__(
             else:
                 logger.debug("Loading external kubernetes config")
                 config.load_kube_config()
-        except:
+        except Exception:
             logger.warning("Failed to load kubeconfig. Only local mode is possible.")
         self.gateway = gateway
         self.model_details = model_details
@@ -43,7 +47,7 @@ def get_service_host(self):
             "inferenceservices",
             self.model_details.name,
         )
-        url =  api_response["status"]["url"]
+        url = api_response["status"]["url"]
         o = urlparse(url)
         return o.hostname
 
@@ -57,10 +61,7 @@ def get_url(self):
                 ingress_ip = res.items[0].status.load_balancer.ingress[0].ip
                 if not ingress_ip:
                     ingress_ip = res.items[0].status.load_balancer.ingress[0].hostname
-                return (
-                    f"http://{ingress_ip}"
-                    + self.protocol.get_predict_path(self.model_details)
-                )
+                return f"http://{ingress_ip}" + self.protocol.get_predict_path(self.model_details)
             else:
                 # TODO check why needed this here
                 config.load_incluster_config()
diff --git a/tempo/kfserving/k8s.py b/tempo/kfserving/k8s.py
index 835685cd..d46ba6da 100644
--- a/tempo/kfserving/k8s.py
+++ b/tempo/kfserving/k8s.py
@@ -1,16 +1,17 @@
 import os
+import time
+from typing import Any, Dict
+
+import requests
 import yaml
 from kubernetes import client, config
 from kubernetes.client.rest import ApiException
-import time
-from typing import Dict, Any
-import requests
 
 from tempo.kfserving.endpoint import Endpoint
 from tempo.kfserving.protocol import KFServingV1Protocol
+from tempo.serve.metadata import KubernetesOptions, ModelDetails, ModelFramework
 from tempo.serve.runtime import Runtime
 from tempo.utils import logger
-from tempo.serve.metadata import ModelDetails, ModelFramework, KubernetesOptions
 
 ENV_K8S_SERVICE_HOST = "KUBERNETES_SERVICE_HOST"
 
@@ -48,17 +49,13 @@ def create_k8s_client(self):
             config.load_kube_config()
 
     def get_endpoint(self, model_details: ModelDetails) -> str:
-        endpoint = Endpoint(
-            model_details, self.k8s_options.namespace, self.protocol
-        )
+        endpoint = Endpoint(model_details, self.k8s_options.namespace, self.protocol)
         return endpoint.get_url()
 
     def get_headers(self, model_details: ModelDetails) -> Dict[str, str]:
-        endpoint = Endpoint(
-            model_details, self.k8s_options.namespace, self.protocol
-        )
+        endpoint = Endpoint(model_details, self.k8s_options.namespace, self.protocol)
         service_host = endpoint.get_service_host()
-        return {"Host":service_host}
+        return {"Host": service_host}
 
     def remote(self, model_details: ModelDetails, *args, **kwargs) -> Any:
         protocol = self.get_protocol()
@@ -93,9 +90,7 @@ def deploy(self, model_details: ModelDetails):
                 "inferenceservices",
                 model_details.name,
             )
-            model_spec["metadata"]["resourceVersion"] = existing["metadata"][
-                "resourceVersion"
-            ]
+            model_spec["metadata"]["resourceVersion"] = existing["metadata"]["resourceVersion"]
             api_instance.replace_namespaced_custom_object(
                 "serving.kubeflow.org",
                 "v1alpha2",
@@ -153,12 +148,9 @@ def _get_spec(self, model_details: ModelDetails) -> dict:
             },
             "spec": {
                 "default": {
-                  "predictor":
-                  {
-                    model_implementation: {
-                      "storageUri": model_details.uri
-                     },
-                  },
+                    "predictor": {
+                        model_implementation: {"storageUri": model_details.uri},
+                    },
                 },
             },
         }
diff --git a/tempo/kfserving/protocol.py b/tempo/kfserving/protocol.py
index 99798363..46721fc4 100644
--- a/tempo/kfserving/protocol.py
+++ b/tempo/kfserving/protocol.py
@@ -1,11 +1,12 @@
+from ast import literal_eval
+from typing import Any, Dict, List, Optional, Type, Union
+
 import numpy as np
-from typing import Type, Dict, Any, List, Tuple
-from tempo.serve.protocol import Protocol
+
 from tempo.serve.metadata import ModelDataArgs, ModelDetails
-import json
-from ast import literal_eval
+from tempo.serve.protocol import Protocol
 
-_v2tymap = {
+_v2tymap: Dict[str, np.dtype] = {
     "BOOL": np.dtype("bool"),
     "UINT8": np.dtype("uint8"),
     "UINT16": np.dtype("uint16"),
@@ -20,7 +21,7 @@
     "FP64": np.dtype("float64"),
 }
 
-_nptymap = dict([reversed(i) for i in _v2tymap.items()])
+_nptymap = dict([(value, key) for key, value in _v2tymap.items()])
 _nptymap[np.dtype("float32")] = "FP32"  # Ensure correct mapping for ambiguous type
 
 
@@ -40,14 +41,14 @@ def create_v2_from_np(arr: np.ndarray, name: str) -> Dict:
     @staticmethod
     def create_v2_from_any(data: Any, name: str) -> Dict:
         if isinstance(data, str):
-            b = list(bytes(data, 'utf-8'))
+            b = list(bytes(data, "utf-8"))
         else:
-            b = list(bytes(repr(data),'utf-8'))
+            b = list(bytes(repr(data), "utf-8"))
         return {
-                "name": name,
-                "datatype": "BYTES",
-                "data": b,
-                "shape": [len(b)],
+            "name": name,
+            "datatype": "BYTES",
+            "data": b,
+            "shape": [len(b)],
         }
 
     @staticmethod
@@ -59,7 +60,7 @@ def convert_from_bytes(output: dict, ty: Type) -> Any:
             return literal_eval(py_str)
 
     @staticmethod
-    def create_np_from_v2(data: list, ty: str, shape: list) -> np.array:
+    def create_np_from_v2(data: list, ty: str, shape: list) -> np.ndarray:
         if ty in _v2tymap:
             npty = _v2tymap[ty]
             arr = np.array(data, dtype=npty)
@@ -85,9 +86,7 @@ def to_protocol_request(self, *args, **kwargs) -> Dict:
             if raw_type == np.ndarray:
                 inputs.append(KFServingV2Protocol.create_v2_from_np(raw, name))
             else:
-                inputs.append(
-                    KFServingV2Protocol.create_v2_from_any(raw, name)
-                )
+                inputs.append(KFServingV2Protocol.create_v2_from_any(raw, name))
 
         return {"inputs": inputs}
 
@@ -100,30 +99,22 @@ def get_ty(name: str, idx: int, tys: ModelDataArgs) -> Type:
             return np.ndarray
         return ty
 
-    def to_protocol_response(
-        self, model_details: ModelDetails, *args, **kwargs
-    ) -> Dict:
+    def to_protocol_response(self, model_details: ModelDetails, *args, **kwargs) -> Dict:
         outputs = []
         for idx, raw in enumerate(args):
             raw_type = type(raw)
 
             if raw_type == np.ndarray:
-                outputs.append(
-                    KFServingV2Protocol.create_v2_from_np(raw, "output" + str(idx))
-                )
+                outputs.append(KFServingV2Protocol.create_v2_from_np(raw, "output" + str(idx)))
             else:
-                outputs.append(
-                    KFServingV2Protocol.create_v2_from_any(raw, "output" + str(idx))
-                )
+                outputs.append(KFServingV2Protocol.create_v2_from_any(raw, "output" + str(idx)))
         for name, raw in kwargs.items():
             raw_type = type(raw)
 
             if raw_type == np.ndarray:
                 shape = list(raw.shape)
                 data = raw.flatten().tolist()
-                outputs.append(
-                    {"name": name, "datatype": "FP32", "shape": shape, "data": data}
-                )
+                outputs.append({"name": name, "datatype": "FP32", "shape": shape, "data": data})
             else:
                 raise ValueError(f"Unknown input type {raw_type} for name {name}")
         return {"model_name": model_details.name, "outputs": outputs}
@@ -134,9 +125,7 @@ def from_protocol_request(self, res: Dict, tys: ModelDataArgs) -> Any:
             ty = KFServingV2Protocol.get_ty(input["name"], idx, tys)
 
             if ty == np.ndarray:
-                arr = KFServingV2Protocol.create_np_from_v2(
-                    input["data"], input["datatype"], input["shape"]
-                )
+                arr = KFServingV2Protocol.create_np_from_v2(input["data"], input["datatype"], input["shape"])
                 inp[input["name"]] = arr
             elif input["datatype"] == "BYTES":
                 inp[input["name"]] = KFServingV2Protocol.convert_from_bytes(input, ty)
@@ -154,9 +143,7 @@ def from_protocol_response(self, res: Dict, tys: ModelDataArgs) -> Any:
             ty = KFServingV2Protocol.get_ty(output["name"], idx, tys)
 
             if ty == np.ndarray:
-                arr = KFServingV2Protocol.create_np_from_v2(
-                    output["data"], output["datatype"], output["shape"]
-                )
+                arr = KFServingV2Protocol.create_np_from_v2(output["data"], output["datatype"], output["shape"])
                 out[output["name"]] = arr
             elif output["datatype"] == "BYTES":
                 out[output["name"]] = KFServingV2Protocol.convert_from_bytes(output, ty)
@@ -175,7 +162,7 @@ def create_v1_from_np(arr: np.ndarray, name: str = None) -> list:
         return arr.tolist()
 
     @staticmethod
-    def create_np_from_v1(data: list) -> np.array:
+    def create_np_from_v1(data: list) -> np.ndarray:
         arr = np.array(data)
         return arr
 
@@ -187,9 +174,7 @@ def get_status_path(self, model_details: ModelDetails) -> str:
 
     def to_protocol_request(self, *args, **kwargs) -> Dict:
         if len(args) > 0 and len(kwargs.values()) > 0:
-            raise ValueError(
-                "KFserving V1 protocol only supports either named or unamed arguments but not both"
-            )
+            raise ValueError("KFserving V1 protocol only supports either named or unamed arguments but not both")
 
         inputs = []
         if len(args) > 0:
@@ -213,7 +198,7 @@ def to_protocol_request(self, *args, **kwargs) -> Dict:
             return {"instances": inputs}
 
     @staticmethod
-    def get_ty(name: str, idx: int, tys: ModelDataArgs) -> Type:
+    def get_ty(name: Optional[str], idx: int, tys: ModelDataArgs) -> Type:
         ty = None
         if name is not None:
             ty = tys[name]
@@ -223,10 +208,8 @@ def get_ty(name: str, idx: int, tys: ModelDataArgs) -> Type:
             return np.ndarray
         return ty
 
-    def to_protocol_response(
-        self, model_details: ModelDetails, *args, **kwargs
-    ) -> Dict:
-        outputs = []
+    def to_protocol_response(self, model_details: ModelDetails, *args, **kwargs) -> Dict:
+        outputs: List[Union[Dict, List]] = []
         if len(args) > 0:
             for idx, raw in enumerate(args):
                 raw_type = type(raw)
@@ -252,9 +235,7 @@ def from_protocol_request(self, res: Dict, tys: ModelDataArgs) -> Any:
             ty = KFServingV1Protocol.get_ty(input["name"], idx, tys)
 
             if ty == np.ndarray:
-                arr = KFServingV2Protocol.create_np_from_v2(
-                    input["data"], input["datatype"], input["shape"]
-                )
+                arr = KFServingV2Protocol.create_np_from_v2(input["data"], input["datatype"], input["shape"])
                 inp[input["name"]] = arr
             else:
                 raise ValueError(f"Unknown ty {ty} in conversion")
diff --git a/tempo/metadata/__init__.py b/tempo/metadata/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/tempo/metadata/grpc_core_service.proto b/tempo/metadata/grpc_core_service.proto
deleted file mode 100644
index e6c1a987..00000000
--- a/tempo/metadata/grpc_core_service.proto
+++ /dev/null
@@ -1,389 +0,0 @@
-// Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//  * Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-//  * Redistributions in binary form must reproduce the above copyright
-//    notice, this list of conditions and the following disclaimer in the
-//    documentation and/or other materials provided with the distribution.
-//  * Neither the name of NVIDIA CORPORATION nor the names of its
-//    contributors may be used to endorse or promote products derived
-//    from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
-// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-// PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-//
-// Inference Server GRPC endpoints.
-//
-service GRPCInferenceService
-{
-  // Check liveness of the inference server.
-  rpc ServerLive(ServerLiveRequest) returns (ServerLiveResponse) {}
-
-  // Check readiness of the inference server.
-  rpc ServerReady(ServerReadyRequest) returns (ServerReadyResponse) {}
-
-  // Check readiness of a model in the inference server.
-  rpc ModelReady(ModelReadyRequest) returns (ModelReadyResponse) {}
-
-  // Get server metadata.
-  rpc ServerMetadata(ServerMetadataRequest) returns (ServerMetadataResponse) {}
-
-  // Get model metadata.
-  rpc ModelMetadata(ModelMetadataRequest) returns (ModelMetadataResponse) {}
-
-  // Perform inference using a specific model.
-  rpc ModelInfer(ModelInferRequest) returns (ModelInferResponse) {}
-}
-
-//
-// Request message for ServerLive.
-//
-message ServerLiveRequest {}
-
-//
-// Response message for ServerLive.
-//
-message ServerLiveResponse
-{
-  // True if the inference server is live, false it not live.
-  bool live = 1;
-}
-
-//
-// Request message for ServerReady.
-//
-message ServerReadyRequest {}
-
-//
-// Response message for ServerReady.
-//
-message ServerReadyResponse
-{
-  // True if the inference server is ready, false it not ready.
-  bool ready = 1;
-}
-
-//
-// Request message for ModelReady.
-//
-message ModelReadyRequest
-{
-  // The name of the model to check for readiness.
-  string name = 1;
-
-  // The version of the model to check for readiness. If not given the
-  // server will choose a version based on the model and internal
-  // policy.
-  string version = 2;
-}
-
-//
-// Response message for ModelReady.
-//
-message ModelReadyResponse
-{
-  // True if the model is ready, false it not ready.
-  bool ready = 1;
-}
-
-//
-// Request message for ServerMetadata.
-//
-message ServerMetadataRequest {}
-
-//
-// Response message for ServerMetadata.
-//
-message ServerMetadataResponse
-{
-  // The server name.
-  string name = 1;
-
-  // The server version.
-  string version = 2;
-
-  // The extensions supported by the server.
-  repeated string extensions = 3;
-}
-
-//
-// Request message for ModelMetadata.
-//
-message ModelMetadataRequest
-{
-  // The name of the model.
-  string name = 1;
-
-  //  The version of the model to check for readiness. If not given
-  //  the server will choose a version based on the model and internal
-  //  policy.
-  string version = 2;
-}
-
-//
-// Response message for ModelMetadata.
-//
-message ModelMetadataResponse
-{
-  // Metadata for a tensor.
-  message TensorMetadata
-  {
-    // The tensor name.
-    string name = 1;
-
-    // The tensor data type.
-    string datatype = 2;
-
-    // The tensor shape. A variable-size dimension is represented by a
-    // -1 value.
-    repeated int64 shape = 3;
-  }
-
-  // The model name.
-  string name = 1;
-
-  // The versions of the model.
-  repeated string versions = 2;
-
-  // The model's platform.
-  string platform = 3;
-
-  // The model's inputs.
-  repeated TensorMetadata inputs = 4;
-
-  // The model's outputs.
-  repeated TensorMetadata outputs = 5;
-}
-
-//
-// An inference parameter value.
-//
-message InferParameter
-{
-  // The parameter value can be a string, an int64 or a boolean
-  oneof parameter_choice
-  {
-    // A boolean parameter value.
-    bool bool_param = 1;
-
-    // An int64 parameter value.
-    int64 int64_param = 2;
-
-    // A string parameter value.
-    string string_param = 3;
-  }
-}
-
-//
-// The data contained in a tensor represented by the repeated type
-// that matches the tensor's data type. Protobuf oneof is not used
-// because oneofs cannot contain repeated fields.
-//
-message InferTensorContents
-{
-  // Representation for BOOL data type. The size must match what is
-  // expected by the tensor's shape. The contents must be the
-  // flattened, one-dimensional, row-major order of the tensor
-  // elements.
-  repeated bool bool_contents = 1;
-
-  // Representation for INT8, INT16, and INT32 data types. The size
-  // must match what is expected by the tensor's shape. The contents
-  // must be the flattened, one-dimensional, row-major order of the
-  // tensor elements.
-  repeated int32 int_contents = 2;
-
-  // Representation for INT64 data types. The size must match what is
-  // expected by the tensor's shape. The contents must be the
-  // flattened, one-dimensional, row-major order of the tensor
-  // elements.
-  repeated int64 int64_contents = 3;
-
-  // Representation for UINT8, UINT16, and UINT32 data types. The size
-  // must match what is expected by the tensor's shape. The contents
-  // must be the flattened, one-dimensional, row-major order of the
-  // tensor elements.
-  repeated uint32 uint_contents = 4;
-
-  // Representation for UINT64 data types. The size must match what is
-  // expected by the tensor's shape. The contents must be the
-  // flattened, one-dimensional, row-major order of the tensor
-  // elements.
-  repeated uint64 uint64_contents = 5;
-
-  // Representation for FP32 data type. The size must match what is
-  // expected by the tensor's shape. The contents must be the
-  // flattened, one-dimensional, row-major order of the tensor
-  // elements.
-  repeated float fp32_contents = 6;
-
-  // Representation for FP64 data type. The size must match what is
-  // expected by the tensor's shape. The contents must be the
-  // flattened, one-dimensional, row-major order of the tensor
-  // elements.
-  repeated double fp64_contents = 7;
-
-  // Representation for BYTES data type. The size must match what is
-  // expected by the tensor's shape. The contents must be the
-  // flattened, one-dimensional, row-major order of the tensor
-  // elements.
-  repeated bytes byte_contents = 8;
-}
-
-//
-// Request message for ModelInfer.
-//
-message ModelInferRequest
-{
-  // An input tensor for an inference request.
-  message InferInputTensor
-  {
-    // The tensor name.
-    string name = 1;
-
-    // The tensor data type.
-    string datatype = 2;
-
-    // The tensor shape.
-    repeated int64 shape = 3;
-
-    // Optional inference input tensor parameters.
-    map<string, InferParameter> parameters = 4;
-
-    // The tensor contents using a data-type format. This field must
-    // not be specified if tensor contents are being specified in
-    // ModelInferRequest.raw_input_contents.
-    InferTensorContents contents = 5;
-  }
-
-  // An output tensor requested for an inference request.
-  message InferRequestedOutputTensor
-  {
-    // The tensor name.
-    string name = 1;
-
-    // Optional requested output tensor parameters.
-    map<string, InferParameter> parameters = 2;
-  }
-
-  // The name of the model to use for inferencing.
-  string model_name = 1;
-
-  // The version of the model to use for inference. If not given the
-  // latest/most-recent version of the model is used.
-  string model_version = 2;
-
-  // Optional identifier for the request. If specified will be
-  // returned in the response.
-  string id = 3;
-
-  // Optional inference parameters.
-  map<string, InferParameter> parameters = 4;
-
-  // The input tensors for the inference.
-  repeated InferInputTensor inputs = 5;
-
-  // The requested output tensors for the inference. Optional, if not
-  // specified all outputs specified in the model config will be
-  // returned.
-  repeated InferRequestedOutputTensor outputs = 6;
-
-  // The data contained in an input tensor can be represented in "raw"
-  // bytes form or in the repeated type that matches the tensor's data
-  // type. Using the "raw" bytes form will typically allow higher
-  // performance due to the way protobuf allocation and reuse
-  // interacts with GRPC. For example, see
-  // https://github.com/grpc/grpc/issues/23231.
-  //
-  // To use the raw representation 'raw_input_contents' must be
-  // initialized with data for each tensor in the same order as
-  // 'inputs'. For each tensor, the size of this content must match
-  // what is expected by the tensor's shape and data type. The raw
-  // data must be the flattened, one-dimensional, row-major order of
-  // the tensor elements without any stride or padding between the
-  // elements. Note that the FP16 data type must be represented as raw
-  // content as there is no specific data type for a 16-bit float
-  // type.
-  //
-  // If this field is specified then InferInputTensor::contents must
-  // not be specified for any input tensor.
-  repeated bytes raw_input_contents = 7;
-}
-
-//
-// Response message for ModelInfer.
-//
-message ModelInferResponse
-{
-  // An output tensor returned for an inference request.
-  message InferOutputTensor
-  {
-    // The tensor name.
-    string name = 1;
-
-    // The tensor data type.
-    string datatype = 2;
-
-    // The tensor shape.
-    repeated int64 shape = 3;
-
-    // Tensor parameters.
-    map<string, InferParameter> parameters = 4;
-
-    // The tensor contents using a data-type format. This field must
-    // not be specified if tensor contents are being specified in
-    // ModelInferResponse.raw_output_contents.
-    InferTensorContents contents = 5;
-  }
-
-  // The name of the model used for inference.
-  string model_name = 1;
-
-  // The version of the model used for inference.
-  string model_version = 2;
-
-  // The id of the inference request if one was specified.
-  string id = 3;
-
-  // Optional inference response parameters.
-  map<string, InferParameter> parameters = 4;
-
-  // The output tensors holding inference results.
-  repeated InferOutputTensor outputs = 5;
-
-  // The data contained in an output tensor can be represented in
-  // "raw" bytes form or in the repeated type that matches the
-  // tensor's data type. Using the "raw" bytes form will typically
-  // allow higher performance due to the way protobuf allocation and
-  // reuse interacts with GRPC. For example, see
-  // https://github.com/grpc/grpc/issues/23231.
-  //
-  // To use the raw representation 'raw_output_contents' must be
-  // initialized with data for each tensor in the same order as
-  // 'outputs'. For each tensor, the size of this content must match
-  // what is expected by the tensor's shape and data type. The raw
-  // data must be the flattened, one-dimensional, row-major order of
-  // the tensor elements without any stride or padding between the
-  // elements. Note that the FP16 data type must be represented as raw
-  // content as there is no specific data type for a 16-bit float
-  // type.
-  //
-  // If this field is specified then InferOutputTensor::contents must
-  // not be specified for any output tensor.
-  repeated bytes raw_output_contents = 6;
-}
diff --git a/tempo/metadata/grpc_core_service_pb2.py b/tempo/metadata/grpc_core_service_pb2.py
deleted file mode 100644
index 279263c7..00000000
--- a/tempo/metadata/grpc_core_service_pb2.py
+++ /dev/null
@@ -1,2177 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: metadata/grpc_core_service.proto
-
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-DESCRIPTOR = _descriptor.FileDescriptor(
-    name="metadata/grpc_core_service.proto",
-    package="",
-    syntax="proto3",
-    serialized_options=None,
-    create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n metadata/grpc_core_service.proto"\x13\n\x11ServerLiveRequest""\n\x12ServerLiveResponse\x12\x0c\n\x04live\x18\x01 \x01(\x08"\x14\n\x12ServerReadyRequest"$\n\x13ServerReadyResponse\x12\r\n\x05ready\x18\x01 \x01(\x08"2\n\x11ModelReadyRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t"#\n\x12ModelReadyResponse\x12\r\n\x05ready\x18\x01 \x01(\x08"\x17\n\x15ServerMetadataRequest"K\n\x16ServerMetadataResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x12\n\nextensions\x18\x03 \x03(\t"5\n\x14ModelMetadataRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t"\xf9\x01\n\x15ModelMetadataResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08versions\x18\x02 \x03(\t\x12\x10\n\x08platform\x18\x03 \x01(\t\x12\x35\n\x06inputs\x18\x04 \x03(\x0b\x32%.ModelMetadataResponse.TensorMetadata\x12\x36\n\x07outputs\x18\x05 \x03(\x0b\x32%.ModelMetadataResponse.TensorMetadata\x1a?\n\x0eTensorMetadata\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08\x64\x61tatype\x18\x02 \x01(\t\x12\r\n\x05shape\x18\x03 \x03(\x03"i\n\x0eInferParameter\x12\x14\n\nbool_param\x18\x01 \x01(\x08H\x00\x12\x15\n\x0bint64_param\x18\x02 \x01(\x03H\x00\x12\x16\n\x0cstring_param\x18\x03 \x01(\tH\x00\x42\x12\n\x10parameter_choice"\xcf\x01\n\x13InferTensorContents\x12\x15\n\rbool_contents\x18\x01 \x03(\x08\x12\x14\n\x0cint_contents\x18\x02 \x03(\x05\x12\x16\n\x0eint64_contents\x18\x03 \x03(\x03\x12\x15\n\ruint_contents\x18\x04 \x03(\r\x12\x17\n\x0fuint64_contents\x18\x05 \x03(\x04\x12\x15\n\rfp32_contents\x18\x06 \x03(\x02\x12\x15\n\rfp64_contents\x18\x07 \x03(\x01\x12\x15\n\rbyte_contents\x18\x08 \x03(\x0c"\x94\x06\n\x11ModelInferRequest\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x15\n\rmodel_version\x18\x02 \x01(\t\x12\n\n\x02id\x18\x03 \x01(\t\x12\x36\n\nparameters\x18\x04 \x03(\x0b\x32".ModelInferRequest.ParametersEntry\x12\x33\n\x06inputs\x18\x05 \x03(\x0b\x32#.ModelInferRequest.InferInputTensor\x12>\n\x07outputs\x18\x06 \x03(\x0b\x32-.ModelInferRequest.InferRequestedOutputTensor\x12\x1a\n\x12raw_input_contents\x18\x07 \x03(\x0c\x1a\xf6\x01\n\x10InferInputTensor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08\x64\x61tatype\x18\x02 \x01(\t\x12\r\n\x05shape\x18\x03 \x03(\x03\x12G\n\nparameters\x18\x04 \x03(\x0b\x32\x33.ModelInferRequest.InferInputTensor.ParametersEntry\x12&\n\x08\x63ontents\x18\x05 \x01(\x0b\x32\x14.InferTensorContents\x1a\x42\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.InferParameter:\x02\x38\x01\x1a\xc1\x01\n\x1aInferRequestedOutputTensor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12Q\n\nparameters\x18\x02 \x03(\x0b\x32=.ModelInferRequest.InferRequestedOutputTensor.ParametersEntry\x1a\x42\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.InferParameter:\x02\x38\x01\x1a\x42\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.InferParameter:\x02\x38\x01"\x99\x04\n\x12ModelInferResponse\x12\x12\n\nmodel_name\x18\x01 \x01(\t\x12\x15\n\rmodel_version\x18\x02 \x01(\t\x12\n\n\x02id\x18\x03 \x01(\t\x12\x37\n\nparameters\x18\x04 \x03(\x0b\x32#.ModelInferResponse.ParametersEntry\x12\x36\n\x07outputs\x18\x05 \x03(\x0b\x32%.ModelInferResponse.InferOutputTensor\x12\x1b\n\x13raw_output_contents\x18\x06 \x03(\x0c\x1a\xf9\x01\n\x11InferOutputTensor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08\x64\x61tatype\x18\x02 \x01(\t\x12\r\n\x05shape\x18\x03 \x03(\x03\x12I\n\nparameters\x18\x04 \x03(\x0b\x32\x35.ModelInferResponse.InferOutputTensor.ParametersEntry\x12&\n\x08\x63ontents\x18\x05 \x01(\x0b\x32\x14.InferTensorContents\x1a\x42\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.InferParameter:\x02\x38\x01\x1a\x42\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.InferParameter:\x02\x38\x01\x32\x84\x03\n\x14GRPCInferenceService\x12\x37\n\nServerLive\x12\x12.ServerLiveRequest\x1a\x13.ServerLiveResponse"\x00\x12:\n\x0bServerReady\x12\x13.ServerReadyRequest\x1a\x14.ServerReadyResponse"\x00\x12\x37\n\nModelReady\x12\x12.ModelReadyRequest\x1a\x13.ModelReadyResponse"\x00\x12\x43\n\x0eServerMetadata\x12\x16.ServerMetadataRequest\x1a\x17.ServerMetadataResponse"\x00\x12@\n\rModelMetadata\x12\x15.ModelMetadataRequest\x1a\x16.ModelMetadataResponse"\x00\x12\x37\n\nModelInfer\x12\x12.ModelInferRequest\x1a\x13.ModelInferResponse"\x00\x62\x06proto3',
-)
-
-
-_SERVERLIVEREQUEST = _descriptor.Descriptor(
-    name="ServerLiveRequest",
-    full_name="ServerLiveRequest",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=36,
-    serialized_end=55,
-)
-
-
-_SERVERLIVERESPONSE = _descriptor.Descriptor(
-    name="ServerLiveResponse",
-    full_name="ServerLiveResponse",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="live",
-            full_name="ServerLiveResponse.live",
-            index=0,
-            number=1,
-            type=8,
-            cpp_type=7,
-            label=1,
-            has_default_value=False,
-            default_value=False,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=57,
-    serialized_end=91,
-)
-
-
-_SERVERREADYREQUEST = _descriptor.Descriptor(
-    name="ServerReadyRequest",
-    full_name="ServerReadyRequest",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=93,
-    serialized_end=113,
-)
-
-
-_SERVERREADYRESPONSE = _descriptor.Descriptor(
-    name="ServerReadyResponse",
-    full_name="ServerReadyResponse",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="ready",
-            full_name="ServerReadyResponse.ready",
-            index=0,
-            number=1,
-            type=8,
-            cpp_type=7,
-            label=1,
-            has_default_value=False,
-            default_value=False,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=115,
-    serialized_end=151,
-)
-
-
-_MODELREADYREQUEST = _descriptor.Descriptor(
-    name="ModelReadyRequest",
-    full_name="ModelReadyRequest",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="name",
-            full_name="ModelReadyRequest.name",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="version",
-            full_name="ModelReadyRequest.version",
-            index=1,
-            number=2,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=153,
-    serialized_end=203,
-)
-
-
-_MODELREADYRESPONSE = _descriptor.Descriptor(
-    name="ModelReadyResponse",
-    full_name="ModelReadyResponse",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="ready",
-            full_name="ModelReadyResponse.ready",
-            index=0,
-            number=1,
-            type=8,
-            cpp_type=7,
-            label=1,
-            has_default_value=False,
-            default_value=False,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=205,
-    serialized_end=240,
-)
-
-
-_SERVERMETADATAREQUEST = _descriptor.Descriptor(
-    name="ServerMetadataRequest",
-    full_name="ServerMetadataRequest",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=242,
-    serialized_end=265,
-)
-
-
-_SERVERMETADATARESPONSE = _descriptor.Descriptor(
-    name="ServerMetadataResponse",
-    full_name="ServerMetadataResponse",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="name",
-            full_name="ServerMetadataResponse.name",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="version",
-            full_name="ServerMetadataResponse.version",
-            index=1,
-            number=2,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="extensions",
-            full_name="ServerMetadataResponse.extensions",
-            index=2,
-            number=3,
-            type=9,
-            cpp_type=9,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=267,
-    serialized_end=342,
-)
-
-
-_MODELMETADATAREQUEST = _descriptor.Descriptor(
-    name="ModelMetadataRequest",
-    full_name="ModelMetadataRequest",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="name",
-            full_name="ModelMetadataRequest.name",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="version",
-            full_name="ModelMetadataRequest.version",
-            index=1,
-            number=2,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=344,
-    serialized_end=397,
-)
-
-
-_MODELMETADATARESPONSE_TENSORMETADATA = _descriptor.Descriptor(
-    name="TensorMetadata",
-    full_name="ModelMetadataResponse.TensorMetadata",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="name",
-            full_name="ModelMetadataResponse.TensorMetadata.name",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="datatype",
-            full_name="ModelMetadataResponse.TensorMetadata.datatype",
-            index=1,
-            number=2,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="shape",
-            full_name="ModelMetadataResponse.TensorMetadata.shape",
-            index=2,
-            number=3,
-            type=3,
-            cpp_type=2,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=586,
-    serialized_end=649,
-)
-
-_MODELMETADATARESPONSE = _descriptor.Descriptor(
-    name="ModelMetadataResponse",
-    full_name="ModelMetadataResponse",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="name",
-            full_name="ModelMetadataResponse.name",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="versions",
-            full_name="ModelMetadataResponse.versions",
-            index=1,
-            number=2,
-            type=9,
-            cpp_type=9,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="platform",
-            full_name="ModelMetadataResponse.platform",
-            index=2,
-            number=3,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="inputs",
-            full_name="ModelMetadataResponse.inputs",
-            index=3,
-            number=4,
-            type=11,
-            cpp_type=10,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="outputs",
-            full_name="ModelMetadataResponse.outputs",
-            index=4,
-            number=5,
-            type=11,
-            cpp_type=10,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[_MODELMETADATARESPONSE_TENSORMETADATA,],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=400,
-    serialized_end=649,
-)
-
-
-_INFERPARAMETER = _descriptor.Descriptor(
-    name="InferParameter",
-    full_name="InferParameter",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="bool_param",
-            full_name="InferParameter.bool_param",
-            index=0,
-            number=1,
-            type=8,
-            cpp_type=7,
-            label=1,
-            has_default_value=False,
-            default_value=False,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="int64_param",
-            full_name="InferParameter.int64_param",
-            index=1,
-            number=2,
-            type=3,
-            cpp_type=2,
-            label=1,
-            has_default_value=False,
-            default_value=0,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="string_param",
-            full_name="InferParameter.string_param",
-            index=2,
-            number=3,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[
-        _descriptor.OneofDescriptor(
-            name="parameter_choice",
-            full_name="InferParameter.parameter_choice",
-            index=0,
-            containing_type=None,
-            create_key=_descriptor._internal_create_key,
-            fields=[],
-        ),
-    ],
-    serialized_start=651,
-    serialized_end=756,
-)
-
-
-_INFERTENSORCONTENTS = _descriptor.Descriptor(
-    name="InferTensorContents",
-    full_name="InferTensorContents",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="bool_contents",
-            full_name="InferTensorContents.bool_contents",
-            index=0,
-            number=1,
-            type=8,
-            cpp_type=7,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="int_contents",
-            full_name="InferTensorContents.int_contents",
-            index=1,
-            number=2,
-            type=5,
-            cpp_type=1,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="int64_contents",
-            full_name="InferTensorContents.int64_contents",
-            index=2,
-            number=3,
-            type=3,
-            cpp_type=2,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="uint_contents",
-            full_name="InferTensorContents.uint_contents",
-            index=3,
-            number=4,
-            type=13,
-            cpp_type=3,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="uint64_contents",
-            full_name="InferTensorContents.uint64_contents",
-            index=4,
-            number=5,
-            type=4,
-            cpp_type=4,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="fp32_contents",
-            full_name="InferTensorContents.fp32_contents",
-            index=5,
-            number=6,
-            type=2,
-            cpp_type=6,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="fp64_contents",
-            full_name="InferTensorContents.fp64_contents",
-            index=6,
-            number=7,
-            type=1,
-            cpp_type=5,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="byte_contents",
-            full_name="InferTensorContents.byte_contents",
-            index=7,
-            number=8,
-            type=12,
-            cpp_type=9,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=759,
-    serialized_end=966,
-)
-
-
-_MODELINFERREQUEST_INFERINPUTTENSOR_PARAMETERSENTRY = _descriptor.Descriptor(
-    name="ParametersEntry",
-    full_name="ModelInferRequest.InferInputTensor.ParametersEntry",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="key",
-            full_name="ModelInferRequest.InferInputTensor.ParametersEntry.key",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="value",
-            full_name="ModelInferRequest.InferInputTensor.ParametersEntry.value",
-            index=1,
-            number=2,
-            type=11,
-            cpp_type=10,
-            label=1,
-            has_default_value=False,
-            default_value=None,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=b"8\001",
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=1427,
-    serialized_end=1493,
-)
-
-_MODELINFERREQUEST_INFERINPUTTENSOR = _descriptor.Descriptor(
-    name="InferInputTensor",
-    full_name="ModelInferRequest.InferInputTensor",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="name",
-            full_name="ModelInferRequest.InferInputTensor.name",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="datatype",
-            full_name="ModelInferRequest.InferInputTensor.datatype",
-            index=1,
-            number=2,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="shape",
-            full_name="ModelInferRequest.InferInputTensor.shape",
-            index=2,
-            number=3,
-            type=3,
-            cpp_type=2,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="parameters",
-            full_name="ModelInferRequest.InferInputTensor.parameters",
-            index=3,
-            number=4,
-            type=11,
-            cpp_type=10,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="contents",
-            full_name="ModelInferRequest.InferInputTensor.contents",
-            index=4,
-            number=5,
-            type=11,
-            cpp_type=10,
-            label=1,
-            has_default_value=False,
-            default_value=None,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[_MODELINFERREQUEST_INFERINPUTTENSOR_PARAMETERSENTRY,],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=1247,
-    serialized_end=1493,
-)
-
-_MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR_PARAMETERSENTRY = _descriptor.Descriptor(
-    name="ParametersEntry",
-    full_name="ModelInferRequest.InferRequestedOutputTensor.ParametersEntry",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="key",
-            full_name="ModelInferRequest.InferRequestedOutputTensor.ParametersEntry.key",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="value",
-            full_name="ModelInferRequest.InferRequestedOutputTensor.ParametersEntry.value",
-            index=1,
-            number=2,
-            type=11,
-            cpp_type=10,
-            label=1,
-            has_default_value=False,
-            default_value=None,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=b"8\001",
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=1427,
-    serialized_end=1493,
-)
-
-_MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR = _descriptor.Descriptor(
-    name="InferRequestedOutputTensor",
-    full_name="ModelInferRequest.InferRequestedOutputTensor",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="name",
-            full_name="ModelInferRequest.InferRequestedOutputTensor.name",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="parameters",
-            full_name="ModelInferRequest.InferRequestedOutputTensor.parameters",
-            index=1,
-            number=2,
-            type=11,
-            cpp_type=10,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[_MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR_PARAMETERSENTRY,],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=1496,
-    serialized_end=1689,
-)
-
-_MODELINFERREQUEST_PARAMETERSENTRY = _descriptor.Descriptor(
-    name="ParametersEntry",
-    full_name="ModelInferRequest.ParametersEntry",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="key",
-            full_name="ModelInferRequest.ParametersEntry.key",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="value",
-            full_name="ModelInferRequest.ParametersEntry.value",
-            index=1,
-            number=2,
-            type=11,
-            cpp_type=10,
-            label=1,
-            has_default_value=False,
-            default_value=None,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=b"8\001",
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=1427,
-    serialized_end=1493,
-)
-
-_MODELINFERREQUEST = _descriptor.Descriptor(
-    name="ModelInferRequest",
-    full_name="ModelInferRequest",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="model_name",
-            full_name="ModelInferRequest.model_name",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="model_version",
-            full_name="ModelInferRequest.model_version",
-            index=1,
-            number=2,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="id",
-            full_name="ModelInferRequest.id",
-            index=2,
-            number=3,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="parameters",
-            full_name="ModelInferRequest.parameters",
-            index=3,
-            number=4,
-            type=11,
-            cpp_type=10,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="inputs",
-            full_name="ModelInferRequest.inputs",
-            index=4,
-            number=5,
-            type=11,
-            cpp_type=10,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="outputs",
-            full_name="ModelInferRequest.outputs",
-            index=5,
-            number=6,
-            type=11,
-            cpp_type=10,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="raw_input_contents",
-            full_name="ModelInferRequest.raw_input_contents",
-            index=6,
-            number=7,
-            type=12,
-            cpp_type=9,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[
-        _MODELINFERREQUEST_INFERINPUTTENSOR,
-        _MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR,
-        _MODELINFERREQUEST_PARAMETERSENTRY,
-    ],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=969,
-    serialized_end=1757,
-)
-
-
-_MODELINFERRESPONSE_INFEROUTPUTTENSOR_PARAMETERSENTRY = _descriptor.Descriptor(
-    name="ParametersEntry",
-    full_name="ModelInferResponse.InferOutputTensor.ParametersEntry",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="key",
-            full_name="ModelInferResponse.InferOutputTensor.ParametersEntry.key",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="value",
-            full_name="ModelInferResponse.InferOutputTensor.ParametersEntry.value",
-            index=1,
-            number=2,
-            type=11,
-            cpp_type=10,
-            label=1,
-            has_default_value=False,
-            default_value=None,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=b"8\001",
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=1427,
-    serialized_end=1493,
-)
-
-_MODELINFERRESPONSE_INFEROUTPUTTENSOR = _descriptor.Descriptor(
-    name="InferOutputTensor",
-    full_name="ModelInferResponse.InferOutputTensor",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="name",
-            full_name="ModelInferResponse.InferOutputTensor.name",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="datatype",
-            full_name="ModelInferResponse.InferOutputTensor.datatype",
-            index=1,
-            number=2,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="shape",
-            full_name="ModelInferResponse.InferOutputTensor.shape",
-            index=2,
-            number=3,
-            type=3,
-            cpp_type=2,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="parameters",
-            full_name="ModelInferResponse.InferOutputTensor.parameters",
-            index=3,
-            number=4,
-            type=11,
-            cpp_type=10,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="contents",
-            full_name="ModelInferResponse.InferOutputTensor.contents",
-            index=4,
-            number=5,
-            type=11,
-            cpp_type=10,
-            label=1,
-            has_default_value=False,
-            default_value=None,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[_MODELINFERRESPONSE_INFEROUTPUTTENSOR_PARAMETERSENTRY,],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=1980,
-    serialized_end=2229,
-)
-
-_MODELINFERRESPONSE_PARAMETERSENTRY = _descriptor.Descriptor(
-    name="ParametersEntry",
-    full_name="ModelInferResponse.ParametersEntry",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="key",
-            full_name="ModelInferResponse.ParametersEntry.key",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="value",
-            full_name="ModelInferResponse.ParametersEntry.value",
-            index=1,
-            number=2,
-            type=11,
-            cpp_type=10,
-            label=1,
-            has_default_value=False,
-            default_value=None,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[],
-    enum_types=[],
-    serialized_options=b"8\001",
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=1427,
-    serialized_end=1493,
-)
-
-_MODELINFERRESPONSE = _descriptor.Descriptor(
-    name="ModelInferResponse",
-    full_name="ModelInferResponse",
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name="model_name",
-            full_name="ModelInferResponse.model_name",
-            index=0,
-            number=1,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="model_version",
-            full_name="ModelInferResponse.model_version",
-            index=1,
-            number=2,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="id",
-            full_name="ModelInferResponse.id",
-            index=2,
-            number=3,
-            type=9,
-            cpp_type=9,
-            label=1,
-            has_default_value=False,
-            default_value=b"".decode("utf-8"),
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="parameters",
-            full_name="ModelInferResponse.parameters",
-            index=3,
-            number=4,
-            type=11,
-            cpp_type=10,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="outputs",
-            full_name="ModelInferResponse.outputs",
-            index=4,
-            number=5,
-            type=11,
-            cpp_type=10,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="raw_output_contents",
-            full_name="ModelInferResponse.raw_output_contents",
-            index=5,
-            number=6,
-            type=12,
-            cpp_type=9,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-    extensions=[],
-    nested_types=[
-        _MODELINFERRESPONSE_INFEROUTPUTTENSOR,
-        _MODELINFERRESPONSE_PARAMETERSENTRY,
-    ],
-    enum_types=[],
-    serialized_options=None,
-    is_extendable=False,
-    syntax="proto3",
-    extension_ranges=[],
-    oneofs=[],
-    serialized_start=1760,
-    serialized_end=2297,
-)
-
-_MODELMETADATARESPONSE_TENSORMETADATA.containing_type = _MODELMETADATARESPONSE
-_MODELMETADATARESPONSE.fields_by_name[
-    "inputs"
-].message_type = _MODELMETADATARESPONSE_TENSORMETADATA
-_MODELMETADATARESPONSE.fields_by_name[
-    "outputs"
-].message_type = _MODELMETADATARESPONSE_TENSORMETADATA
-_INFERPARAMETER.oneofs_by_name["parameter_choice"].fields.append(
-    _INFERPARAMETER.fields_by_name["bool_param"]
-)
-_INFERPARAMETER.fields_by_name[
-    "bool_param"
-].containing_oneof = _INFERPARAMETER.oneofs_by_name["parameter_choice"]
-_INFERPARAMETER.oneofs_by_name["parameter_choice"].fields.append(
-    _INFERPARAMETER.fields_by_name["int64_param"]
-)
-_INFERPARAMETER.fields_by_name[
-    "int64_param"
-].containing_oneof = _INFERPARAMETER.oneofs_by_name["parameter_choice"]
-_INFERPARAMETER.oneofs_by_name["parameter_choice"].fields.append(
-    _INFERPARAMETER.fields_by_name["string_param"]
-)
-_INFERPARAMETER.fields_by_name[
-    "string_param"
-].containing_oneof = _INFERPARAMETER.oneofs_by_name["parameter_choice"]
-_MODELINFERREQUEST_INFERINPUTTENSOR_PARAMETERSENTRY.fields_by_name[
-    "value"
-].message_type = _INFERPARAMETER
-_MODELINFERREQUEST_INFERINPUTTENSOR_PARAMETERSENTRY.containing_type = (
-    _MODELINFERREQUEST_INFERINPUTTENSOR
-)
-_MODELINFERREQUEST_INFERINPUTTENSOR.fields_by_name[
-    "parameters"
-].message_type = _MODELINFERREQUEST_INFERINPUTTENSOR_PARAMETERSENTRY
-_MODELINFERREQUEST_INFERINPUTTENSOR.fields_by_name[
-    "contents"
-].message_type = _INFERTENSORCONTENTS
-_MODELINFERREQUEST_INFERINPUTTENSOR.containing_type = _MODELINFERREQUEST
-_MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR_PARAMETERSENTRY.fields_by_name[
-    "value"
-].message_type = _INFERPARAMETER
-_MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR_PARAMETERSENTRY.containing_type = (
-    _MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR
-)
-_MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR.fields_by_name[
-    "parameters"
-].message_type = _MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR_PARAMETERSENTRY
-_MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR.containing_type = _MODELINFERREQUEST
-_MODELINFERREQUEST_PARAMETERSENTRY.fields_by_name[
-    "value"
-].message_type = _INFERPARAMETER
-_MODELINFERREQUEST_PARAMETERSENTRY.containing_type = _MODELINFERREQUEST
-_MODELINFERREQUEST.fields_by_name[
-    "parameters"
-].message_type = _MODELINFERREQUEST_PARAMETERSENTRY
-_MODELINFERREQUEST.fields_by_name[
-    "inputs"
-].message_type = _MODELINFERREQUEST_INFERINPUTTENSOR
-_MODELINFERREQUEST.fields_by_name[
-    "outputs"
-].message_type = _MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR
-_MODELINFERRESPONSE_INFEROUTPUTTENSOR_PARAMETERSENTRY.fields_by_name[
-    "value"
-].message_type = _INFERPARAMETER
-_MODELINFERRESPONSE_INFEROUTPUTTENSOR_PARAMETERSENTRY.containing_type = (
-    _MODELINFERRESPONSE_INFEROUTPUTTENSOR
-)
-_MODELINFERRESPONSE_INFEROUTPUTTENSOR.fields_by_name[
-    "parameters"
-].message_type = _MODELINFERRESPONSE_INFEROUTPUTTENSOR_PARAMETERSENTRY
-_MODELINFERRESPONSE_INFEROUTPUTTENSOR.fields_by_name[
-    "contents"
-].message_type = _INFERTENSORCONTENTS
-_MODELINFERRESPONSE_INFEROUTPUTTENSOR.containing_type = _MODELINFERRESPONSE
-_MODELINFERRESPONSE_PARAMETERSENTRY.fields_by_name[
-    "value"
-].message_type = _INFERPARAMETER
-_MODELINFERRESPONSE_PARAMETERSENTRY.containing_type = _MODELINFERRESPONSE
-_MODELINFERRESPONSE.fields_by_name[
-    "parameters"
-].message_type = _MODELINFERRESPONSE_PARAMETERSENTRY
-_MODELINFERRESPONSE.fields_by_name[
-    "outputs"
-].message_type = _MODELINFERRESPONSE_INFEROUTPUTTENSOR
-DESCRIPTOR.message_types_by_name["ServerLiveRequest"] = _SERVERLIVEREQUEST
-DESCRIPTOR.message_types_by_name["ServerLiveResponse"] = _SERVERLIVERESPONSE
-DESCRIPTOR.message_types_by_name["ServerReadyRequest"] = _SERVERREADYREQUEST
-DESCRIPTOR.message_types_by_name["ServerReadyResponse"] = _SERVERREADYRESPONSE
-DESCRIPTOR.message_types_by_name["ModelReadyRequest"] = _MODELREADYREQUEST
-DESCRIPTOR.message_types_by_name["ModelReadyResponse"] = _MODELREADYRESPONSE
-DESCRIPTOR.message_types_by_name["ServerMetadataRequest"] = _SERVERMETADATAREQUEST
-DESCRIPTOR.message_types_by_name["ServerMetadataResponse"] = _SERVERMETADATARESPONSE
-DESCRIPTOR.message_types_by_name["ModelMetadataRequest"] = _MODELMETADATAREQUEST
-DESCRIPTOR.message_types_by_name["ModelMetadataResponse"] = _MODELMETADATARESPONSE
-DESCRIPTOR.message_types_by_name["InferParameter"] = _INFERPARAMETER
-DESCRIPTOR.message_types_by_name["InferTensorContents"] = _INFERTENSORCONTENTS
-DESCRIPTOR.message_types_by_name["ModelInferRequest"] = _MODELINFERREQUEST
-DESCRIPTOR.message_types_by_name["ModelInferResponse"] = _MODELINFERRESPONSE
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-ServerLiveRequest = _reflection.GeneratedProtocolMessageType(
-    "ServerLiveRequest",
-    (_message.Message,),
-    {
-        "DESCRIPTOR": _SERVERLIVEREQUEST,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ServerLiveRequest)
-    },
-)
-_sym_db.RegisterMessage(ServerLiveRequest)
-
-ServerLiveResponse = _reflection.GeneratedProtocolMessageType(
-    "ServerLiveResponse",
-    (_message.Message,),
-    {
-        "DESCRIPTOR": _SERVERLIVERESPONSE,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ServerLiveResponse)
-    },
-)
-_sym_db.RegisterMessage(ServerLiveResponse)
-
-ServerReadyRequest = _reflection.GeneratedProtocolMessageType(
-    "ServerReadyRequest",
-    (_message.Message,),
-    {
-        "DESCRIPTOR": _SERVERREADYREQUEST,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ServerReadyRequest)
-    },
-)
-_sym_db.RegisterMessage(ServerReadyRequest)
-
-ServerReadyResponse = _reflection.GeneratedProtocolMessageType(
-    "ServerReadyResponse",
-    (_message.Message,),
-    {
-        "DESCRIPTOR": _SERVERREADYRESPONSE,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ServerReadyResponse)
-    },
-)
-_sym_db.RegisterMessage(ServerReadyResponse)
-
-ModelReadyRequest = _reflection.GeneratedProtocolMessageType(
-    "ModelReadyRequest",
-    (_message.Message,),
-    {
-        "DESCRIPTOR": _MODELREADYREQUEST,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ModelReadyRequest)
-    },
-)
-_sym_db.RegisterMessage(ModelReadyRequest)
-
-ModelReadyResponse = _reflection.GeneratedProtocolMessageType(
-    "ModelReadyResponse",
-    (_message.Message,),
-    {
-        "DESCRIPTOR": _MODELREADYRESPONSE,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ModelReadyResponse)
-    },
-)
-_sym_db.RegisterMessage(ModelReadyResponse)
-
-ServerMetadataRequest = _reflection.GeneratedProtocolMessageType(
-    "ServerMetadataRequest",
-    (_message.Message,),
-    {
-        "DESCRIPTOR": _SERVERMETADATAREQUEST,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ServerMetadataRequest)
-    },
-)
-_sym_db.RegisterMessage(ServerMetadataRequest)
-
-ServerMetadataResponse = _reflection.GeneratedProtocolMessageType(
-    "ServerMetadataResponse",
-    (_message.Message,),
-    {
-        "DESCRIPTOR": _SERVERMETADATARESPONSE,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ServerMetadataResponse)
-    },
-)
-_sym_db.RegisterMessage(ServerMetadataResponse)
-
-ModelMetadataRequest = _reflection.GeneratedProtocolMessageType(
-    "ModelMetadataRequest",
-    (_message.Message,),
-    {
-        "DESCRIPTOR": _MODELMETADATAREQUEST,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ModelMetadataRequest)
-    },
-)
-_sym_db.RegisterMessage(ModelMetadataRequest)
-
-ModelMetadataResponse = _reflection.GeneratedProtocolMessageType(
-    "ModelMetadataResponse",
-    (_message.Message,),
-    {
-        "TensorMetadata": _reflection.GeneratedProtocolMessageType(
-            "TensorMetadata",
-            (_message.Message,),
-            {
-                "DESCRIPTOR": _MODELMETADATARESPONSE_TENSORMETADATA,
-                "__module__": "metadata.grpc_core_service_pb2"
-                # @@protoc_insertion_point(class_scope:ModelMetadataResponse.TensorMetadata)
-            },
-        ),
-        "DESCRIPTOR": _MODELMETADATARESPONSE,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ModelMetadataResponse)
-    },
-)
-_sym_db.RegisterMessage(ModelMetadataResponse)
-_sym_db.RegisterMessage(ModelMetadataResponse.TensorMetadata)
-
-InferParameter = _reflection.GeneratedProtocolMessageType(
-    "InferParameter",
-    (_message.Message,),
-    {
-        "DESCRIPTOR": _INFERPARAMETER,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:InferParameter)
-    },
-)
-_sym_db.RegisterMessage(InferParameter)
-
-InferTensorContents = _reflection.GeneratedProtocolMessageType(
-    "InferTensorContents",
-    (_message.Message,),
-    {
-        "DESCRIPTOR": _INFERTENSORCONTENTS,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:InferTensorContents)
-    },
-)
-_sym_db.RegisterMessage(InferTensorContents)
-
-ModelInferRequest = _reflection.GeneratedProtocolMessageType(
-    "ModelInferRequest",
-    (_message.Message,),
-    {
-        "InferInputTensor": _reflection.GeneratedProtocolMessageType(
-            "InferInputTensor",
-            (_message.Message,),
-            {
-                "ParametersEntry": _reflection.GeneratedProtocolMessageType(
-                    "ParametersEntry",
-                    (_message.Message,),
-                    {
-                        "DESCRIPTOR": _MODELINFERREQUEST_INFERINPUTTENSOR_PARAMETERSENTRY,
-                        "__module__": "metadata.grpc_core_service_pb2"
-                        # @@protoc_insertion_point(class_scope:ModelInferRequest.InferInputTensor.ParametersEntry)
-                    },
-                ),
-                "DESCRIPTOR": _MODELINFERREQUEST_INFERINPUTTENSOR,
-                "__module__": "metadata.grpc_core_service_pb2"
-                # @@protoc_insertion_point(class_scope:ModelInferRequest.InferInputTensor)
-            },
-        ),
-        "InferRequestedOutputTensor": _reflection.GeneratedProtocolMessageType(
-            "InferRequestedOutputTensor",
-            (_message.Message,),
-            {
-                "ParametersEntry": _reflection.GeneratedProtocolMessageType(
-                    "ParametersEntry",
-                    (_message.Message,),
-                    {
-                        "DESCRIPTOR": _MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR_PARAMETERSENTRY,
-                        "__module__": "metadata.grpc_core_service_pb2"
-                        # @@protoc_insertion_point(class_scope:ModelInferRequest.InferRequestedOutputTensor.ParametersEntry)
-                    },
-                ),
-                "DESCRIPTOR": _MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR,
-                "__module__": "metadata.grpc_core_service_pb2"
-                # @@protoc_insertion_point(class_scope:ModelInferRequest.InferRequestedOutputTensor)
-            },
-        ),
-        "ParametersEntry": _reflection.GeneratedProtocolMessageType(
-            "ParametersEntry",
-            (_message.Message,),
-            {
-                "DESCRIPTOR": _MODELINFERREQUEST_PARAMETERSENTRY,
-                "__module__": "metadata.grpc_core_service_pb2"
-                # @@protoc_insertion_point(class_scope:ModelInferRequest.ParametersEntry)
-            },
-        ),
-        "DESCRIPTOR": _MODELINFERREQUEST,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ModelInferRequest)
-    },
-)
-_sym_db.RegisterMessage(ModelInferRequest)
-_sym_db.RegisterMessage(ModelInferRequest.InferInputTensor)
-_sym_db.RegisterMessage(ModelInferRequest.InferInputTensor.ParametersEntry)
-_sym_db.RegisterMessage(ModelInferRequest.InferRequestedOutputTensor)
-_sym_db.RegisterMessage(ModelInferRequest.InferRequestedOutputTensor.ParametersEntry)
-_sym_db.RegisterMessage(ModelInferRequest.ParametersEntry)
-
-ModelInferResponse = _reflection.GeneratedProtocolMessageType(
-    "ModelInferResponse",
-    (_message.Message,),
-    {
-        "InferOutputTensor": _reflection.GeneratedProtocolMessageType(
-            "InferOutputTensor",
-            (_message.Message,),
-            {
-                "ParametersEntry": _reflection.GeneratedProtocolMessageType(
-                    "ParametersEntry",
-                    (_message.Message,),
-                    {
-                        "DESCRIPTOR": _MODELINFERRESPONSE_INFEROUTPUTTENSOR_PARAMETERSENTRY,
-                        "__module__": "metadata.grpc_core_service_pb2"
-                        # @@protoc_insertion_point(class_scope:ModelInferResponse.InferOutputTensor.ParametersEntry)
-                    },
-                ),
-                "DESCRIPTOR": _MODELINFERRESPONSE_INFEROUTPUTTENSOR,
-                "__module__": "metadata.grpc_core_service_pb2"
-                # @@protoc_insertion_point(class_scope:ModelInferResponse.InferOutputTensor)
-            },
-        ),
-        "ParametersEntry": _reflection.GeneratedProtocolMessageType(
-            "ParametersEntry",
-            (_message.Message,),
-            {
-                "DESCRIPTOR": _MODELINFERRESPONSE_PARAMETERSENTRY,
-                "__module__": "metadata.grpc_core_service_pb2"
-                # @@protoc_insertion_point(class_scope:ModelInferResponse.ParametersEntry)
-            },
-        ),
-        "DESCRIPTOR": _MODELINFERRESPONSE,
-        "__module__": "metadata.grpc_core_service_pb2"
-        # @@protoc_insertion_point(class_scope:ModelInferResponse)
-    },
-)
-_sym_db.RegisterMessage(ModelInferResponse)
-_sym_db.RegisterMessage(ModelInferResponse.InferOutputTensor)
-_sym_db.RegisterMessage(ModelInferResponse.InferOutputTensor.ParametersEntry)
-_sym_db.RegisterMessage(ModelInferResponse.ParametersEntry)
-
-
-_MODELINFERREQUEST_INFERINPUTTENSOR_PARAMETERSENTRY._options = None
-_MODELINFERREQUEST_INFERREQUESTEDOUTPUTTENSOR_PARAMETERSENTRY._options = None
-_MODELINFERREQUEST_PARAMETERSENTRY._options = None
-_MODELINFERRESPONSE_INFEROUTPUTTENSOR_PARAMETERSENTRY._options = None
-_MODELINFERRESPONSE_PARAMETERSENTRY._options = None
-
-_GRPCINFERENCESERVICE = _descriptor.ServiceDescriptor(
-    name="GRPCInferenceService",
-    full_name="GRPCInferenceService",
-    file=DESCRIPTOR,
-    index=0,
-    serialized_options=None,
-    create_key=_descriptor._internal_create_key,
-    serialized_start=2300,
-    serialized_end=2688,
-    methods=[
-        _descriptor.MethodDescriptor(
-            name="ServerLive",
-            full_name="GRPCInferenceService.ServerLive",
-            index=0,
-            containing_service=None,
-            input_type=_SERVERLIVEREQUEST,
-            output_type=_SERVERLIVERESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name="ServerReady",
-            full_name="GRPCInferenceService.ServerReady",
-            index=1,
-            containing_service=None,
-            input_type=_SERVERREADYREQUEST,
-            output_type=_SERVERREADYRESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name="ModelReady",
-            full_name="GRPCInferenceService.ModelReady",
-            index=2,
-            containing_service=None,
-            input_type=_MODELREADYREQUEST,
-            output_type=_MODELREADYRESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name="ServerMetadata",
-            full_name="GRPCInferenceService.ServerMetadata",
-            index=3,
-            containing_service=None,
-            input_type=_SERVERMETADATAREQUEST,
-            output_type=_SERVERMETADATARESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name="ModelMetadata",
-            full_name="GRPCInferenceService.ModelMetadata",
-            index=4,
-            containing_service=None,
-            input_type=_MODELMETADATAREQUEST,
-            output_type=_MODELMETADATARESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name="ModelInfer",
-            full_name="GRPCInferenceService.ModelInfer",
-            index=5,
-            containing_service=None,
-            input_type=_MODELINFERREQUEST,
-            output_type=_MODELINFERRESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ],
-)
-_sym_db.RegisterServiceDescriptor(_GRPCINFERENCESERVICE)
-
-DESCRIPTOR.services_by_name["GRPCInferenceService"] = _GRPCINFERENCESERVICE
-
-# @@protoc_insertion_point(module_scope)
diff --git a/tempo/metadata/grpc_core_service_pb2.pyi b/tempo/metadata/grpc_core_service_pb2.pyi
deleted file mode 100644
index 41686f39..00000000
--- a/tempo/metadata/grpc_core_service_pb2.pyi
+++ /dev/null
@@ -1,870 +0,0 @@
-# @generated by generate_proto_mypy_stubs.py.  Do not edit!
-import sys
-from google.protobuf.descriptor import (
-    Descriptor as google___protobuf___descriptor___Descriptor,
-    FileDescriptor as google___protobuf___descriptor___FileDescriptor,
-)
-
-from google.protobuf.internal.containers import (
-    RepeatedCompositeFieldContainer as google___protobuf___internal___containers___RepeatedCompositeFieldContainer,
-    RepeatedScalarFieldContainer as google___protobuf___internal___containers___RepeatedScalarFieldContainer,
-)
-
-from google.protobuf.message import Message as google___protobuf___message___Message
-
-from typing import (
-    Iterable as typing___Iterable,
-    Mapping as typing___Mapping,
-    MutableMapping as typing___MutableMapping,
-    Optional as typing___Optional,
-    Text as typing___Text,
-    Union as typing___Union,
-)
-
-from typing_extensions import Literal as typing_extensions___Literal
-
-builtin___bool = bool
-builtin___bytes = bytes
-builtin___float = float
-builtin___int = int
-if sys.version_info < (3,):
-    builtin___buffer = buffer
-    builtin___unicode = unicode
-
-DESCRIPTOR: google___protobuf___descriptor___FileDescriptor = ...
-
-class ServerLiveRequest(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    def __init__(self,) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ServerLiveRequest: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ServerLiveRequest: ...
-
-type___ServerLiveRequest = ServerLiveRequest
-
-class ServerLiveResponse(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    live: builtin___bool = ...
-    def __init__(self, *, live: typing___Optional[builtin___bool] = None,) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ServerLiveResponse: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ServerLiveResponse: ...
-    def ClearField(
-        self, field_name: typing_extensions___Literal["live", b"live"]
-    ) -> None: ...
-
-type___ServerLiveResponse = ServerLiveResponse
-
-class ServerReadyRequest(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    def __init__(self,) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ServerReadyRequest: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ServerReadyRequest: ...
-
-type___ServerReadyRequest = ServerReadyRequest
-
-class ServerReadyResponse(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    ready: builtin___bool = ...
-    def __init__(self, *, ready: typing___Optional[builtin___bool] = None,) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ServerReadyResponse: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ServerReadyResponse: ...
-    def ClearField(
-        self, field_name: typing_extensions___Literal["ready", b"ready"]
-    ) -> None: ...
-
-type___ServerReadyResponse = ServerReadyResponse
-
-class ModelReadyRequest(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    name: typing___Text = ...
-    version: typing___Text = ...
-    def __init__(
-        self,
-        *,
-        name: typing___Optional[typing___Text] = None,
-        version: typing___Optional[typing___Text] = None,
-    ) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ModelReadyRequest: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ModelReadyRequest: ...
-    def ClearField(
-        self,
-        field_name: typing_extensions___Literal["name", b"name", "version", b"version"],
-    ) -> None: ...
-
-type___ModelReadyRequest = ModelReadyRequest
-
-class ModelReadyResponse(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    ready: builtin___bool = ...
-    def __init__(self, *, ready: typing___Optional[builtin___bool] = None,) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ModelReadyResponse: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ModelReadyResponse: ...
-    def ClearField(
-        self, field_name: typing_extensions___Literal["ready", b"ready"]
-    ) -> None: ...
-
-type___ModelReadyResponse = ModelReadyResponse
-
-class ServerMetadataRequest(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    def __init__(self,) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ServerMetadataRequest: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ServerMetadataRequest: ...
-
-type___ServerMetadataRequest = ServerMetadataRequest
-
-class ServerMetadataResponse(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    name: typing___Text = ...
-    version: typing___Text = ...
-    extensions: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        typing___Text
-    ] = ...
-    def __init__(
-        self,
-        *,
-        name: typing___Optional[typing___Text] = None,
-        version: typing___Optional[typing___Text] = None,
-        extensions: typing___Optional[typing___Iterable[typing___Text]] = None,
-    ) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ServerMetadataResponse: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ServerMetadataResponse: ...
-    def ClearField(
-        self,
-        field_name: typing_extensions___Literal[
-            "extensions", b"extensions", "name", b"name", "version", b"version"
-        ],
-    ) -> None: ...
-
-type___ServerMetadataResponse = ServerMetadataResponse
-
-class ModelMetadataRequest(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    name: typing___Text = ...
-    version: typing___Text = ...
-    def __init__(
-        self,
-        *,
-        name: typing___Optional[typing___Text] = None,
-        version: typing___Optional[typing___Text] = None,
-    ) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ModelMetadataRequest: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ModelMetadataRequest: ...
-    def ClearField(
-        self,
-        field_name: typing_extensions___Literal["name", b"name", "version", b"version"],
-    ) -> None: ...
-
-type___ModelMetadataRequest = ModelMetadataRequest
-
-class ModelMetadataResponse(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    class TensorMetadata(google___protobuf___message___Message):
-        DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-        name: typing___Text = ...
-        datatype: typing___Text = ...
-        shape: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-            builtin___int
-        ] = ...
-        def __init__(
-            self,
-            *,
-            name: typing___Optional[typing___Text] = None,
-            datatype: typing___Optional[typing___Text] = None,
-            shape: typing___Optional[typing___Iterable[builtin___int]] = None,
-        ) -> None: ...
-        if sys.version_info >= (3,):
-            @classmethod
-            def FromString(
-                cls, s: builtin___bytes
-            ) -> ModelMetadataResponse.TensorMetadata: ...
-        else:
-            @classmethod
-            def FromString(
-                cls,
-                s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode],
-            ) -> ModelMetadataResponse.TensorMetadata: ...
-        def ClearField(
-            self,
-            field_name: typing_extensions___Literal[
-                "datatype", b"datatype", "name", b"name", "shape", b"shape"
-            ],
-        ) -> None: ...
-    type___TensorMetadata = TensorMetadata
-
-    name: typing___Text = ...
-    versions: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        typing___Text
-    ] = ...
-    platform: typing___Text = ...
-    @property
-    def inputs(
-        self,
-    ) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[
-        type___ModelMetadataResponse.TensorMetadata
-    ]: ...
-    @property
-    def outputs(
-        self,
-    ) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[
-        type___ModelMetadataResponse.TensorMetadata
-    ]: ...
-    def __init__(
-        self,
-        *,
-        name: typing___Optional[typing___Text] = None,
-        versions: typing___Optional[typing___Iterable[typing___Text]] = None,
-        platform: typing___Optional[typing___Text] = None,
-        inputs: typing___Optional[
-            typing___Iterable[type___ModelMetadataResponse.TensorMetadata]
-        ] = None,
-        outputs: typing___Optional[
-            typing___Iterable[type___ModelMetadataResponse.TensorMetadata]
-        ] = None,
-    ) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ModelMetadataResponse: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ModelMetadataResponse: ...
-    def ClearField(
-        self,
-        field_name: typing_extensions___Literal[
-            "inputs",
-            b"inputs",
-            "name",
-            b"name",
-            "outputs",
-            b"outputs",
-            "platform",
-            b"platform",
-            "versions",
-            b"versions",
-        ],
-    ) -> None: ...
-
-type___ModelMetadataResponse = ModelMetadataResponse
-
-class InferParameter(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    bool_param: builtin___bool = ...
-    int64_param: builtin___int = ...
-    string_param: typing___Text = ...
-    def __init__(
-        self,
-        *,
-        bool_param: typing___Optional[builtin___bool] = None,
-        int64_param: typing___Optional[builtin___int] = None,
-        string_param: typing___Optional[typing___Text] = None,
-    ) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> InferParameter: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> InferParameter: ...
-    def HasField(
-        self,
-        field_name: typing_extensions___Literal[
-            "bool_param",
-            b"bool_param",
-            "int64_param",
-            b"int64_param",
-            "parameter_choice",
-            b"parameter_choice",
-            "string_param",
-            b"string_param",
-        ],
-    ) -> builtin___bool: ...
-    def ClearField(
-        self,
-        field_name: typing_extensions___Literal[
-            "bool_param",
-            b"bool_param",
-            "int64_param",
-            b"int64_param",
-            "parameter_choice",
-            b"parameter_choice",
-            "string_param",
-            b"string_param",
-        ],
-    ) -> None: ...
-    def WhichOneof(
-        self,
-        oneof_group: typing_extensions___Literal[
-            "parameter_choice", b"parameter_choice"
-        ],
-    ) -> typing_extensions___Literal["bool_param", "int64_param", "string_param"]: ...
-
-type___InferParameter = InferParameter
-
-class InferTensorContents(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    bool_contents: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        builtin___bool
-    ] = ...
-    int_contents: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        builtin___int
-    ] = ...
-    int64_contents: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        builtin___int
-    ] = ...
-    uint_contents: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        builtin___int
-    ] = ...
-    uint64_contents: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        builtin___int
-    ] = ...
-    fp32_contents: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        builtin___float
-    ] = ...
-    fp64_contents: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        builtin___float
-    ] = ...
-    byte_contents: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        builtin___bytes
-    ] = ...
-    def __init__(
-        self,
-        *,
-        bool_contents: typing___Optional[typing___Iterable[builtin___bool]] = None,
-        int_contents: typing___Optional[typing___Iterable[builtin___int]] = None,
-        int64_contents: typing___Optional[typing___Iterable[builtin___int]] = None,
-        uint_contents: typing___Optional[typing___Iterable[builtin___int]] = None,
-        uint64_contents: typing___Optional[typing___Iterable[builtin___int]] = None,
-        fp32_contents: typing___Optional[typing___Iterable[builtin___float]] = None,
-        fp64_contents: typing___Optional[typing___Iterable[builtin___float]] = None,
-        byte_contents: typing___Optional[typing___Iterable[builtin___bytes]] = None,
-    ) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> InferTensorContents: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> InferTensorContents: ...
-    def ClearField(
-        self,
-        field_name: typing_extensions___Literal[
-            "bool_contents",
-            b"bool_contents",
-            "byte_contents",
-            b"byte_contents",
-            "fp32_contents",
-            b"fp32_contents",
-            "fp64_contents",
-            b"fp64_contents",
-            "int64_contents",
-            b"int64_contents",
-            "int_contents",
-            b"int_contents",
-            "uint64_contents",
-            b"uint64_contents",
-            "uint_contents",
-            b"uint_contents",
-        ],
-    ) -> None: ...
-
-type___InferTensorContents = InferTensorContents
-
-class ModelInferRequest(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    class InferInputTensor(google___protobuf___message___Message):
-        DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-        class ParametersEntry(google___protobuf___message___Message):
-            DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-            key: typing___Text = ...
-            @property
-            def value(self) -> type___InferParameter: ...
-            def __init__(
-                self,
-                *,
-                key: typing___Optional[typing___Text] = None,
-                value: typing___Optional[type___InferParameter] = None,
-            ) -> None: ...
-            if sys.version_info >= (3,):
-                @classmethod
-                def FromString(
-                    cls, s: builtin___bytes
-                ) -> ModelInferRequest.InferInputTensor.ParametersEntry: ...
-            else:
-                @classmethod
-                def FromString(
-                    cls,
-                    s: typing___Union[
-                        builtin___bytes, builtin___buffer, builtin___unicode
-                    ],
-                ) -> ModelInferRequest.InferInputTensor.ParametersEntry: ...
-            def HasField(
-                self, field_name: typing_extensions___Literal["value", b"value"]
-            ) -> builtin___bool: ...
-            def ClearField(
-                self,
-                field_name: typing_extensions___Literal[
-                    "key", b"key", "value", b"value"
-                ],
-            ) -> None: ...
-        type___ParametersEntry = ParametersEntry
-
-        name: typing___Text = ...
-        datatype: typing___Text = ...
-        shape: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-            builtin___int
-        ] = ...
-        @property
-        def parameters(
-            self,
-        ) -> typing___MutableMapping[typing___Text, type___InferParameter]: ...
-        @property
-        def contents(self) -> type___InferTensorContents: ...
-        def __init__(
-            self,
-            *,
-            name: typing___Optional[typing___Text] = None,
-            datatype: typing___Optional[typing___Text] = None,
-            shape: typing___Optional[typing___Iterable[builtin___int]] = None,
-            parameters: typing___Optional[
-                typing___Mapping[typing___Text, type___InferParameter]
-            ] = None,
-            contents: typing___Optional[type___InferTensorContents] = None,
-        ) -> None: ...
-        if sys.version_info >= (3,):
-            @classmethod
-            def FromString(
-                cls, s: builtin___bytes
-            ) -> ModelInferRequest.InferInputTensor: ...
-        else:
-            @classmethod
-            def FromString(
-                cls,
-                s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode],
-            ) -> ModelInferRequest.InferInputTensor: ...
-        def HasField(
-            self, field_name: typing_extensions___Literal["contents", b"contents"]
-        ) -> builtin___bool: ...
-        def ClearField(
-            self,
-            field_name: typing_extensions___Literal[
-                "contents",
-                b"contents",
-                "datatype",
-                b"datatype",
-                "name",
-                b"name",
-                "parameters",
-                b"parameters",
-                "shape",
-                b"shape",
-            ],
-        ) -> None: ...
-    type___InferInputTensor = InferInputTensor
-    class InferRequestedOutputTensor(google___protobuf___message___Message):
-        DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-        class ParametersEntry(google___protobuf___message___Message):
-            DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-            key: typing___Text = ...
-            @property
-            def value(self) -> type___InferParameter: ...
-            def __init__(
-                self,
-                *,
-                key: typing___Optional[typing___Text] = None,
-                value: typing___Optional[type___InferParameter] = None,
-            ) -> None: ...
-            if sys.version_info >= (3,):
-                @classmethod
-                def FromString(
-                    cls, s: builtin___bytes
-                ) -> ModelInferRequest.InferRequestedOutputTensor.ParametersEntry: ...
-            else:
-                @classmethod
-                def FromString(
-                    cls,
-                    s: typing___Union[
-                        builtin___bytes, builtin___buffer, builtin___unicode
-                    ],
-                ) -> ModelInferRequest.InferRequestedOutputTensor.ParametersEntry: ...
-            def HasField(
-                self, field_name: typing_extensions___Literal["value", b"value"]
-            ) -> builtin___bool: ...
-            def ClearField(
-                self,
-                field_name: typing_extensions___Literal[
-                    "key", b"key", "value", b"value"
-                ],
-            ) -> None: ...
-        type___ParametersEntry = ParametersEntry
-
-        name: typing___Text = ...
-        @property
-        def parameters(
-            self,
-        ) -> typing___MutableMapping[typing___Text, type___InferParameter]: ...
-        def __init__(
-            self,
-            *,
-            name: typing___Optional[typing___Text] = None,
-            parameters: typing___Optional[
-                typing___Mapping[typing___Text, type___InferParameter]
-            ] = None,
-        ) -> None: ...
-        if sys.version_info >= (3,):
-            @classmethod
-            def FromString(
-                cls, s: builtin___bytes
-            ) -> ModelInferRequest.InferRequestedOutputTensor: ...
-        else:
-            @classmethod
-            def FromString(
-                cls,
-                s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode],
-            ) -> ModelInferRequest.InferRequestedOutputTensor: ...
-        def ClearField(
-            self,
-            field_name: typing_extensions___Literal[
-                "name", b"name", "parameters", b"parameters"
-            ],
-        ) -> None: ...
-    type___InferRequestedOutputTensor = InferRequestedOutputTensor
-    class ParametersEntry(google___protobuf___message___Message):
-        DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-        key: typing___Text = ...
-        @property
-        def value(self) -> type___InferParameter: ...
-        def __init__(
-            self,
-            *,
-            key: typing___Optional[typing___Text] = None,
-            value: typing___Optional[type___InferParameter] = None,
-        ) -> None: ...
-        if sys.version_info >= (3,):
-            @classmethod
-            def FromString(
-                cls, s: builtin___bytes
-            ) -> ModelInferRequest.ParametersEntry: ...
-        else:
-            @classmethod
-            def FromString(
-                cls,
-                s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode],
-            ) -> ModelInferRequest.ParametersEntry: ...
-        def HasField(
-            self, field_name: typing_extensions___Literal["value", b"value"]
-        ) -> builtin___bool: ...
-        def ClearField(
-            self,
-            field_name: typing_extensions___Literal["key", b"key", "value", b"value"],
-        ) -> None: ...
-    type___ParametersEntry = ParametersEntry
-
-    model_name: typing___Text = ...
-    model_version: typing___Text = ...
-    id: typing___Text = ...
-    raw_input_contents: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        builtin___bytes
-    ] = ...
-    @property
-    def parameters(
-        self,
-    ) -> typing___MutableMapping[typing___Text, type___InferParameter]: ...
-    @property
-    def inputs(
-        self,
-    ) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[
-        type___ModelInferRequest.InferInputTensor
-    ]: ...
-    @property
-    def outputs(
-        self,
-    ) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[
-        type___ModelInferRequest.InferRequestedOutputTensor
-    ]: ...
-    def __init__(
-        self,
-        *,
-        model_name: typing___Optional[typing___Text] = None,
-        model_version: typing___Optional[typing___Text] = None,
-        id: typing___Optional[typing___Text] = None,
-        parameters: typing___Optional[
-            typing___Mapping[typing___Text, type___InferParameter]
-        ] = None,
-        inputs: typing___Optional[
-            typing___Iterable[type___ModelInferRequest.InferInputTensor]
-        ] = None,
-        outputs: typing___Optional[
-            typing___Iterable[type___ModelInferRequest.InferRequestedOutputTensor]
-        ] = None,
-        raw_input_contents: typing___Optional[
-            typing___Iterable[builtin___bytes]
-        ] = None,
-    ) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ModelInferRequest: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ModelInferRequest: ...
-    def ClearField(
-        self,
-        field_name: typing_extensions___Literal[
-            "id",
-            b"id",
-            "inputs",
-            b"inputs",
-            "model_name",
-            b"model_name",
-            "model_version",
-            b"model_version",
-            "outputs",
-            b"outputs",
-            "parameters",
-            b"parameters",
-            "raw_input_contents",
-            b"raw_input_contents",
-        ],
-    ) -> None: ...
-
-type___ModelInferRequest = ModelInferRequest
-
-class ModelInferResponse(google___protobuf___message___Message):
-    DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-    class InferOutputTensor(google___protobuf___message___Message):
-        DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-        class ParametersEntry(google___protobuf___message___Message):
-            DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-            key: typing___Text = ...
-            @property
-            def value(self) -> type___InferParameter: ...
-            def __init__(
-                self,
-                *,
-                key: typing___Optional[typing___Text] = None,
-                value: typing___Optional[type___InferParameter] = None,
-            ) -> None: ...
-            if sys.version_info >= (3,):
-                @classmethod
-                def FromString(
-                    cls, s: builtin___bytes
-                ) -> ModelInferResponse.InferOutputTensor.ParametersEntry: ...
-            else:
-                @classmethod
-                def FromString(
-                    cls,
-                    s: typing___Union[
-                        builtin___bytes, builtin___buffer, builtin___unicode
-                    ],
-                ) -> ModelInferResponse.InferOutputTensor.ParametersEntry: ...
-            def HasField(
-                self, field_name: typing_extensions___Literal["value", b"value"]
-            ) -> builtin___bool: ...
-            def ClearField(
-                self,
-                field_name: typing_extensions___Literal[
-                    "key", b"key", "value", b"value"
-                ],
-            ) -> None: ...
-        type___ParametersEntry = ParametersEntry
-
-        name: typing___Text = ...
-        datatype: typing___Text = ...
-        shape: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-            builtin___int
-        ] = ...
-        @property
-        def parameters(
-            self,
-        ) -> typing___MutableMapping[typing___Text, type___InferParameter]: ...
-        @property
-        def contents(self) -> type___InferTensorContents: ...
-        def __init__(
-            self,
-            *,
-            name: typing___Optional[typing___Text] = None,
-            datatype: typing___Optional[typing___Text] = None,
-            shape: typing___Optional[typing___Iterable[builtin___int]] = None,
-            parameters: typing___Optional[
-                typing___Mapping[typing___Text, type___InferParameter]
-            ] = None,
-            contents: typing___Optional[type___InferTensorContents] = None,
-        ) -> None: ...
-        if sys.version_info >= (3,):
-            @classmethod
-            def FromString(
-                cls, s: builtin___bytes
-            ) -> ModelInferResponse.InferOutputTensor: ...
-        else:
-            @classmethod
-            def FromString(
-                cls,
-                s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode],
-            ) -> ModelInferResponse.InferOutputTensor: ...
-        def HasField(
-            self, field_name: typing_extensions___Literal["contents", b"contents"]
-        ) -> builtin___bool: ...
-        def ClearField(
-            self,
-            field_name: typing_extensions___Literal[
-                "contents",
-                b"contents",
-                "datatype",
-                b"datatype",
-                "name",
-                b"name",
-                "parameters",
-                b"parameters",
-                "shape",
-                b"shape",
-            ],
-        ) -> None: ...
-    type___InferOutputTensor = InferOutputTensor
-    class ParametersEntry(google___protobuf___message___Message):
-        DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
-        key: typing___Text = ...
-        @property
-        def value(self) -> type___InferParameter: ...
-        def __init__(
-            self,
-            *,
-            key: typing___Optional[typing___Text] = None,
-            value: typing___Optional[type___InferParameter] = None,
-        ) -> None: ...
-        if sys.version_info >= (3,):
-            @classmethod
-            def FromString(
-                cls, s: builtin___bytes
-            ) -> ModelInferResponse.ParametersEntry: ...
-        else:
-            @classmethod
-            def FromString(
-                cls,
-                s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode],
-            ) -> ModelInferResponse.ParametersEntry: ...
-        def HasField(
-            self, field_name: typing_extensions___Literal["value", b"value"]
-        ) -> builtin___bool: ...
-        def ClearField(
-            self,
-            field_name: typing_extensions___Literal["key", b"key", "value", b"value"],
-        ) -> None: ...
-    type___ParametersEntry = ParametersEntry
-
-    model_name: typing___Text = ...
-    model_version: typing___Text = ...
-    id: typing___Text = ...
-    raw_output_contents: google___protobuf___internal___containers___RepeatedScalarFieldContainer[
-        builtin___bytes
-    ] = ...
-    @property
-    def parameters(
-        self,
-    ) -> typing___MutableMapping[typing___Text, type___InferParameter]: ...
-    @property
-    def outputs(
-        self,
-    ) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[
-        type___ModelInferResponse.InferOutputTensor
-    ]: ...
-    def __init__(
-        self,
-        *,
-        model_name: typing___Optional[typing___Text] = None,
-        model_version: typing___Optional[typing___Text] = None,
-        id: typing___Optional[typing___Text] = None,
-        parameters: typing___Optional[
-            typing___Mapping[typing___Text, type___InferParameter]
-        ] = None,
-        outputs: typing___Optional[
-            typing___Iterable[type___ModelInferResponse.InferOutputTensor]
-        ] = None,
-        raw_output_contents: typing___Optional[
-            typing___Iterable[builtin___bytes]
-        ] = None,
-    ) -> None: ...
-    if sys.version_info >= (3,):
-        @classmethod
-        def FromString(cls, s: builtin___bytes) -> ModelInferResponse: ...
-    else:
-        @classmethod
-        def FromString(
-            cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode]
-        ) -> ModelInferResponse: ...
-    def ClearField(
-        self,
-        field_name: typing_extensions___Literal[
-            "id",
-            b"id",
-            "model_name",
-            b"model_name",
-            "model_version",
-            b"model_version",
-            "outputs",
-            b"outputs",
-            "parameters",
-            b"parameters",
-            "raw_output_contents",
-            b"raw_output_contents",
-        ],
-    ) -> None: ...
-
-type___ModelInferResponse = ModelInferResponse
diff --git a/tempo/metadata/grpc_core_service_pb2_grpc.py b/tempo/metadata/grpc_core_service_pb2_grpc.py
deleted file mode 100644
index a243eecc..00000000
--- a/tempo/metadata/grpc_core_service_pb2_grpc.py
+++ /dev/null
@@ -1,321 +0,0 @@
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-"""Client and server classes corresponding to protobuf-defined services."""
-import grpc
-
-from tempo.metadata import (
-    grpc_core_service_pb2 as metadata_dot_grpc__core__service__pb2,
-)
-
-
-class GRPCInferenceServiceStub(object):
-    """
-    Inference Server GRPC endpoints.
-
-    """
-
-    def __init__(self, channel):
-        """Constructor.
-
-        Args:
-            channel: A grpc.Channel.
-        """
-        self.ServerLive = channel.unary_unary(
-            "/GRPCInferenceService/ServerLive",
-            request_serializer=metadata_dot_grpc__core__service__pb2.ServerLiveRequest.SerializeToString,
-            response_deserializer=metadata_dot_grpc__core__service__pb2.ServerLiveResponse.FromString,
-        )
-        self.ServerReady = channel.unary_unary(
-            "/GRPCInferenceService/ServerReady",
-            request_serializer=metadata_dot_grpc__core__service__pb2.ServerReadyRequest.SerializeToString,
-            response_deserializer=metadata_dot_grpc__core__service__pb2.ServerReadyResponse.FromString,
-        )
-        self.ModelReady = channel.unary_unary(
-            "/GRPCInferenceService/ModelReady",
-            request_serializer=metadata_dot_grpc__core__service__pb2.ModelReadyRequest.SerializeToString,
-            response_deserializer=metadata_dot_grpc__core__service__pb2.ModelReadyResponse.FromString,
-        )
-        self.ServerMetadata = channel.unary_unary(
-            "/GRPCInferenceService/ServerMetadata",
-            request_serializer=metadata_dot_grpc__core__service__pb2.ServerMetadataRequest.SerializeToString,
-            response_deserializer=metadata_dot_grpc__core__service__pb2.ServerMetadataResponse.FromString,
-        )
-        self.ModelMetadata = channel.unary_unary(
-            "/GRPCInferenceService/ModelMetadata",
-            request_serializer=metadata_dot_grpc__core__service__pb2.ModelMetadataRequest.SerializeToString,
-            response_deserializer=metadata_dot_grpc__core__service__pb2.ModelMetadataResponse.FromString,
-        )
-        self.ModelInfer = channel.unary_unary(
-            "/GRPCInferenceService/ModelInfer",
-            request_serializer=metadata_dot_grpc__core__service__pb2.ModelInferRequest.SerializeToString,
-            response_deserializer=metadata_dot_grpc__core__service__pb2.ModelInferResponse.FromString,
-        )
-
-
-class GRPCInferenceServiceServicer(object):
-    """
-    Inference Server GRPC endpoints.
-
-    """
-
-    def ServerLive(self, request, context):
-        """Check liveness of the inference server.
-        """
-        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-        context.set_details("Method not implemented!")
-        raise NotImplementedError("Method not implemented!")
-
-    def ServerReady(self, request, context):
-        """Check readiness of the inference server.
-        """
-        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-        context.set_details("Method not implemented!")
-        raise NotImplementedError("Method not implemented!")
-
-    def ModelReady(self, request, context):
-        """Check readiness of a model in the inference server.
-        """
-        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-        context.set_details("Method not implemented!")
-        raise NotImplementedError("Method not implemented!")
-
-    def ServerMetadata(self, request, context):
-        """Get server metadata.
-        """
-        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-        context.set_details("Method not implemented!")
-        raise NotImplementedError("Method not implemented!")
-
-    def ModelMetadata(self, request, context):
-        """Get model metadata.
-        """
-        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-        context.set_details("Method not implemented!")
-        raise NotImplementedError("Method not implemented!")
-
-    def ModelInfer(self, request, context):
-        """Perform inference using a specific model.
-        """
-        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-        context.set_details("Method not implemented!")
-        raise NotImplementedError("Method not implemented!")
-
-
-def add_GRPCInferenceServiceServicer_to_server(servicer, server):
-    rpc_method_handlers = {
-        "ServerLive": grpc.unary_unary_rpc_method_handler(
-            servicer.ServerLive,
-            request_deserializer=metadata_dot_grpc__core__service__pb2.ServerLiveRequest.FromString,
-            response_serializer=metadata_dot_grpc__core__service__pb2.ServerLiveResponse.SerializeToString,
-        ),
-        "ServerReady": grpc.unary_unary_rpc_method_handler(
-            servicer.ServerReady,
-            request_deserializer=metadata_dot_grpc__core__service__pb2.ServerReadyRequest.FromString,
-            response_serializer=metadata_dot_grpc__core__service__pb2.ServerReadyResponse.SerializeToString,
-        ),
-        "ModelReady": grpc.unary_unary_rpc_method_handler(
-            servicer.ModelReady,
-            request_deserializer=metadata_dot_grpc__core__service__pb2.ModelReadyRequest.FromString,
-            response_serializer=metadata_dot_grpc__core__service__pb2.ModelReadyResponse.SerializeToString,
-        ),
-        "ServerMetadata": grpc.unary_unary_rpc_method_handler(
-            servicer.ServerMetadata,
-            request_deserializer=metadata_dot_grpc__core__service__pb2.ServerMetadataRequest.FromString,
-            response_serializer=metadata_dot_grpc__core__service__pb2.ServerMetadataResponse.SerializeToString,
-        ),
-        "ModelMetadata": grpc.unary_unary_rpc_method_handler(
-            servicer.ModelMetadata,
-            request_deserializer=metadata_dot_grpc__core__service__pb2.ModelMetadataRequest.FromString,
-            response_serializer=metadata_dot_grpc__core__service__pb2.ModelMetadataResponse.SerializeToString,
-        ),
-        "ModelInfer": grpc.unary_unary_rpc_method_handler(
-            servicer.ModelInfer,
-            request_deserializer=metadata_dot_grpc__core__service__pb2.ModelInferRequest.FromString,
-            response_serializer=metadata_dot_grpc__core__service__pb2.ModelInferResponse.SerializeToString,
-        ),
-    }
-    generic_handler = grpc.method_handlers_generic_handler(
-        "GRPCInferenceService", rpc_method_handlers
-    )
-    server.add_generic_rpc_handlers((generic_handler,))
-
-
-# This class is part of an EXPERIMENTAL API.
-class GRPCInferenceService(object):
-    """
-    Inference Server GRPC endpoints.
-
-    """
-
-    @staticmethod
-    def ServerLive(
-        request,
-        target,
-        options=(),
-        channel_credentials=None,
-        call_credentials=None,
-        insecure=False,
-        compression=None,
-        wait_for_ready=None,
-        timeout=None,
-        metadata=None,
-    ):
-        return grpc.experimental.unary_unary(
-            request,
-            target,
-            "/GRPCInferenceService/ServerLive",
-            metadata_dot_grpc__core__service__pb2.ServerLiveRequest.SerializeToString,
-            metadata_dot_grpc__core__service__pb2.ServerLiveResponse.FromString,
-            options,
-            channel_credentials,
-            insecure,
-            call_credentials,
-            compression,
-            wait_for_ready,
-            timeout,
-            metadata,
-        )
-
-    @staticmethod
-    def ServerReady(
-        request,
-        target,
-        options=(),
-        channel_credentials=None,
-        call_credentials=None,
-        insecure=False,
-        compression=None,
-        wait_for_ready=None,
-        timeout=None,
-        metadata=None,
-    ):
-        return grpc.experimental.unary_unary(
-            request,
-            target,
-            "/GRPCInferenceService/ServerReady",
-            metadata_dot_grpc__core__service__pb2.ServerReadyRequest.SerializeToString,
-            metadata_dot_grpc__core__service__pb2.ServerReadyResponse.FromString,
-            options,
-            channel_credentials,
-            insecure,
-            call_credentials,
-            compression,
-            wait_for_ready,
-            timeout,
-            metadata,
-        )
-
-    @staticmethod
-    def ModelReady(
-        request,
-        target,
-        options=(),
-        channel_credentials=None,
-        call_credentials=None,
-        insecure=False,
-        compression=None,
-        wait_for_ready=None,
-        timeout=None,
-        metadata=None,
-    ):
-        return grpc.experimental.unary_unary(
-            request,
-            target,
-            "/GRPCInferenceService/ModelReady",
-            metadata_dot_grpc__core__service__pb2.ModelReadyRequest.SerializeToString,
-            metadata_dot_grpc__core__service__pb2.ModelReadyResponse.FromString,
-            options,
-            channel_credentials,
-            insecure,
-            call_credentials,
-            compression,
-            wait_for_ready,
-            timeout,
-            metadata,
-        )
-
-    @staticmethod
-    def ServerMetadata(
-        request,
-        target,
-        options=(),
-        channel_credentials=None,
-        call_credentials=None,
-        insecure=False,
-        compression=None,
-        wait_for_ready=None,
-        timeout=None,
-        metadata=None,
-    ):
-        return grpc.experimental.unary_unary(
-            request,
-            target,
-            "/GRPCInferenceService/ServerMetadata",
-            metadata_dot_grpc__core__service__pb2.ServerMetadataRequest.SerializeToString,
-            metadata_dot_grpc__core__service__pb2.ServerMetadataResponse.FromString,
-            options,
-            channel_credentials,
-            insecure,
-            call_credentials,
-            compression,
-            wait_for_ready,
-            timeout,
-            metadata,
-        )
-
-    @staticmethod
-    def ModelMetadata(
-        request,
-        target,
-        options=(),
-        channel_credentials=None,
-        call_credentials=None,
-        insecure=False,
-        compression=None,
-        wait_for_ready=None,
-        timeout=None,
-        metadata=None,
-    ):
-        return grpc.experimental.unary_unary(
-            request,
-            target,
-            "/GRPCInferenceService/ModelMetadata",
-            metadata_dot_grpc__core__service__pb2.ModelMetadataRequest.SerializeToString,
-            metadata_dot_grpc__core__service__pb2.ModelMetadataResponse.FromString,
-            options,
-            channel_credentials,
-            insecure,
-            call_credentials,
-            compression,
-            wait_for_ready,
-            timeout,
-            metadata,
-        )
-
-    @staticmethod
-    def ModelInfer(
-        request,
-        target,
-        options=(),
-        channel_credentials=None,
-        call_credentials=None,
-        insecure=False,
-        compression=None,
-        wait_for_ready=None,
-        timeout=None,
-        metadata=None,
-    ):
-        return grpc.experimental.unary_unary(
-            request,
-            target,
-            "/GRPCInferenceService/ModelInfer",
-            metadata_dot_grpc__core__service__pb2.ModelInferRequest.SerializeToString,
-            metadata_dot_grpc__core__service__pb2.ModelInferResponse.FromString,
-            options,
-            channel_credentials,
-            insecure,
-            call_credentials,
-            compression,
-            wait_for_ready,
-            timeout,
-            metadata,
-        )
diff --git a/tempo/seldon/deploy.py b/tempo/seldon/deploy.py
index e6b5698f..3e190222 100644
--- a/tempo/seldon/deploy.py
+++ b/tempo/seldon/deploy.py
@@ -1,24 +1,22 @@
-import requests
+import time
+from enum import Enum
+from http import cookies
+from typing import Any, Dict
 
-from tempo.serve.metadata import ModelDetails, KubernetesOptions
-from tempo.serve.runtime import Runtime
+from seldon_deploy_sdk import ApiClient, Configuration, PredictApi, SeldonDeploymentsApi
+from seldon_deploy_sdk.auth import SessionAuthenticator
+from seldon_deploy_sdk.models.object_meta import ObjectMeta
+from seldon_deploy_sdk.models.predictive_unit import PredictiveUnit
+from seldon_deploy_sdk.models.predictor_spec import PredictorSpec
 from seldon_deploy_sdk.models.seldon_deployment import SeldonDeployment
 from seldon_deploy_sdk.models.seldon_deployment_spec import SeldonDeploymentSpec
-from seldon_deploy_sdk.models.predictor_spec import PredictorSpec
-from seldon_deploy_sdk.models.predictive_unit import PredictiveUnit
-from seldon_deploy_sdk.models.object_meta import ObjectMeta
-from seldon_deploy_sdk import SeldonDeploymentsApi, PredictApi
 
-from tempo.seldon.specs import KubernetesSpec
-from tempo.seldon.protocol import SeldonProtocol
 from tempo.seldon.endpoint import Endpoint
-from seldon_deploy_sdk import EnvironmentApi, Configuration, ApiClient
-from seldon_deploy_sdk.auth import SessionAuthenticator
 from tempo.seldon.k8s import SeldonKubernetesRuntime
-from http import cookies
-from enum import Enum
-from typing import Dict, Any
-import time
+from tempo.seldon.protocol import SeldonProtocol
+from tempo.seldon.specs import KubernetesSpec
+from tempo.serve.metadata import KubernetesOptions, ModelDetails
+from tempo.serve.runtime import Runtime
 
 
 class SeldonDeployAuthType(Enum):
@@ -68,16 +66,12 @@ def deploy(self, model_details: ModelDetails):
         sd = SeldonDeployment(
             kind="SeldonDeployment",
             api_version="machinelearning.seldon.io/v1",
-            metadata=ObjectMeta(
-                name=model_details.name, namespace=self._k8s_options.namespace
-            ),
+            metadata=ObjectMeta(name=model_details.name, namespace=self._k8s_options.namespace),
             spec=SeldonDeploymentSpec(
                 predictors=[
                     PredictorSpec(
                         graph=PredictiveUnit(
-                            implementation=KubernetesSpec.Implementations[
-                                model_details.platform
-                            ],
+                            implementation=KubernetesSpec.Implementations[model_details.platform],
                             model_uri=model_details.uri,
                             name="model",
                         ),
@@ -89,7 +83,7 @@ def deploy(self, model_details: ModelDetails):
         )
         api_client = self._get_api_client()
         dep_instance = SeldonDeploymentsApi(api_client)
-        created = dep_instance.create_seldon_deployment(self._k8s_options.namespace, sd)
+        dep_instance.create_seldon_deployment(self._k8s_options.namespace, sd)
 
     def wait_ready(self, model_details: ModelDetails, timeout_secs=None) -> bool:
         ready = False
@@ -111,14 +105,10 @@ def wait_ready(self, model_details: ModelDetails, timeout_secs=None) -> bool:
     def undeploy(self, model_details: ModelDetails):
         api_client = self._get_api_client()
         dep_instance = SeldonDeploymentsApi(api_client)
-        dep_instance.delete_seldon_deployment(
-            model_details.name, self._k8s_options.namespace, _preload_content=False
-        )
+        dep_instance.delete_seldon_deployment(model_details.name, self._k8s_options.namespace, _preload_content=False)
 
     def get_endpoint(self, model_details: ModelDetails):
-        endpoint = Endpoint(
-            model_details.name, self._k8s_options.namespace, self.protocol
-        )
+        endpoint = Endpoint(model_details.name, self._k8s_options.namespace, self.protocol)
         return endpoint.get_url(model_details)
 
     def get_headers(self, model_details: ModelDetails) -> Dict[str, str]:
@@ -138,7 +128,5 @@ def get_protocol(self):
         return self.protocol
 
     def to_k8s_yaml(self, model_details: ModelDetails) -> str:
-        srt = SeldonKubernetesRuntime(
-            k8s_options=self._k8s_options, protocol=self.protocol
-        )
+        srt = SeldonKubernetesRuntime(k8s_options=self._k8s_options, protocol=self.protocol)
         return srt.to_k8s_yaml(model_details)
diff --git a/tempo/seldon/docker.py b/tempo/seldon/docker.py
index b2907a32..5278e7af 100644
--- a/tempo/seldon/docker.py
+++ b/tempo/seldon/docker.py
@@ -1,25 +1,19 @@
-import docker
-import socket
-import requests
 import os
+import socket
 import time
-import requests
-
-from typing import Any
+from typing import Any, Tuple
 
-from docker.models.containers import Container
+import docker
+import requests
 from docker.client import DockerClient
 from docker.errors import NotFound
+from docker.models.containers import Container
 
+from tempo.seldon.protocol import SeldonProtocol
+from tempo.seldon.specs import DefaultHTTPPort, DefaultModelsPath, get_container_spec
+from tempo.serve.metadata import ModelDetails
 from tempo.serve.protocol import Protocol
 from tempo.serve.runtime import Runtime
-from tempo.serve.metadata import ModelDetails
-from tempo.seldon.protocol import SeldonProtocol
-from tempo.seldon.specs import (
-    DefaultHTTPPort,
-    DefaultModelsPath,
-    get_container_spec,
-)
 
 DefaultNetworkName = "tempo"
 
@@ -34,7 +28,7 @@ def __init__(self, protocol=None):
     def get_protocol(self) -> Protocol:
         return self.protocol
 
-    def _get_host_ip_port(self, model_details: ModelDetails) -> (str,str):
+    def _get_host_ip_port(self, model_details: ModelDetails) -> Tuple[str, str]:
         container = self._get_container(model_details)
         port_index = self._get_port_index()
         host_ports = container.ports[port_index]
@@ -60,15 +54,13 @@ def remote(self, model_details: ModelDetails, *args, **kwargs) -> Any:
         req = protocol.to_protocol_request(*args, **kwargs)
         endpoint = self.get_endpoint(model_details)
         response_raw = requests.post(endpoint, json=req)
-        return protocol.from_protocol_response(
-            response_raw.json(), model_details.outputs
-        )
+        return protocol.from_protocol_response(response_raw.json(), model_details.outputs)
 
     def deploy(self, model_details: ModelDetails):
         docker_client = docker.from_env()
 
         try:
-            container = self._get_container(model_details)
+            self._get_container(model_details)
         except docker.errors.NotFound:
             protocol = self.get_protocol()
             container_index = self._get_port_index()
@@ -77,17 +69,15 @@ def deploy(self, model_details: ModelDetails):
             self._create_network(docker_client)
 
             docker_client.containers.run(
-               name=self._get_container_name(model_details),
-               ports={container_index: self._get_available_port()},
-               volumes={model_folder: {"bind": DefaultModelsPath, "mode": "ro"}},
-               detach=True,
-               network=DefaultNetworkName,
-               **container_spec,
+                name=self._get_container_name(model_details),
+                ports={container_index: self._get_available_port()},
+                volumes={model_folder: {"bind": DefaultModelsPath, "mode": "ro"}},
+                detach=True,
+                network=DefaultNetworkName,
+                **container_spec,
             )
 
-    def _create_network(
-        self, docker_client: DockerClient, network_name=DefaultNetworkName
-    ):
+    def _create_network(self, docker_client: DockerClient, network_name=DefaultNetworkName):
         try:
             docker_client.networks.get(network_id=network_name)
         except NotFound:
@@ -103,7 +93,8 @@ def wait_ready(self, model_details: ModelDetails, timeout_secs=None) -> bool:
         while not ready:
             container = self._get_container(model_details)
             if container.status == "running":
-                status_path = self.protocol.get_status_path(model_details)
+                # TODO: Use status_path to wait until container is ready
+                #  status_path = self.protocol.get_status_path(model_details)
                 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                 try:
                     s.connect((host_ip, int(host_port)))
@@ -112,16 +103,18 @@ def wait_ready(self, model_details: ModelDetails, timeout_secs=None) -> bool:
                     pass
                 finally:
                     s.close()
-                #url = f"http://{host_ip}:{host_port}{status_path}"
-                #print(url)
-                #r = requests.get(url)
-                #if r.status_code == 200:
+                # url = f"http://{host_ip}:{host_port}{status_path}"
+                # print(url)
+                # r = requests.get(url)
+                # if r.status_code == 200:
                 #    return True
             if timeout_secs is not None:
                 t1 = time.time()
                 if t1 - t0 > timeout_secs:
                     return ready
 
+        return False
+
     def _get_available_port(self):
         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         s.bind(("", 0))
@@ -147,11 +140,7 @@ def _get_container_name(self, model_details: ModelDetails):
     def _is_inside_docker(self) -> bool:
         # From https://stackoverflow.com/a/48710609/5015573
         path = "/proc/self/cgroup"
-        return (
-            os.path.exists("/.dockerenv")
-            or os.path.isfile(path)
-            and any("docker" in line for line in open(path))
-        )
+        return os.path.exists("/.dockerenv") or os.path.isfile(path) and any("docker" in line for line in open(path))
 
     def to_k8s_yaml(self, model_details: ModelDetails) -> str:
         raise NotImplementedError()
diff --git a/tempo/seldon/endpoint.py b/tempo/seldon/endpoint.py
index 525d7e31..f20b1b59 100644
--- a/tempo/seldon/endpoint.py
+++ b/tempo/seldon/endpoint.py
@@ -1,8 +1,10 @@
-from kubernetes import client, config
 import os
-from tempo.utils import logger
-from tempo.serve.protocol import Protocol
+
+from kubernetes import client, config
+
 from tempo.serve.metadata import ModelDetails
+from tempo.serve.protocol import Protocol
+from tempo.utils import logger
 
 ENV_K8S_SERVICE_HOST = "KUBERNETES_SERVICE_HOST"
 ISTIO_GATEWAY = "istio"
@@ -15,9 +17,7 @@ class Endpoint(object):
 
     """
 
-    def __init__(
-        self, model_name, namespace, protocol: Protocol, gateway=ISTIO_GATEWAY
-    ):
+    def __init__(self, model_name, namespace, protocol: Protocol, gateway=ISTIO_GATEWAY):
         self.inside_cluster = os.getenv(ENV_K8S_SERVICE_HOST)
         try:
             if self.inside_cluster:
@@ -26,7 +26,7 @@ def __init__(
             else:
                 logger.debug("Loading external kubernetes config")
                 config.load_kube_config()
-        except:
+        except Exception:
             logger.warning("Failed to load kubeconfig. Only local mode is possible.")
         self.gateway = gateway
         self.model_name = model_name
diff --git a/tempo/seldon/k8s.py b/tempo/seldon/k8s.py
index 3454de91..075abf7b 100644
--- a/tempo/seldon/k8s.py
+++ b/tempo/seldon/k8s.py
@@ -1,18 +1,18 @@
 import os
-import yaml
 import time
-import requests
+from typing import Any
 
+import requests
+import yaml
 from kubernetes import client, config
 from kubernetes.client.rest import ApiException
-from typing import Any
 
 from tempo.seldon.endpoint import Endpoint
 from tempo.seldon.protocol import SeldonProtocol
 from tempo.seldon.specs import KubernetesSpec
+from tempo.serve.metadata import KubernetesOptions, ModelDetails
 from tempo.serve.runtime import Runtime
 from tempo.utils import logger
-from tempo.serve.metadata import ModelDetails, KubernetesOptions
 
 ENV_K8S_SERVICE_HOST = "KUBERNETES_SERVICE_HOST"
 
@@ -41,9 +41,7 @@ def create_k8s_client(self):
             config.load_kube_config()
 
     def get_endpoint(self, model_details: ModelDetails) -> str:
-        endpoint = Endpoint(
-            model_details.name, self.k8s_options.namespace, self.protocol
-        )
+        endpoint = Endpoint(model_details.name, self.k8s_options.namespace, self.protocol)
         return endpoint.get_url(model_details)
 
     def remote(self, model_details: ModelDetails, *args, **kwargs) -> Any:
@@ -51,9 +49,7 @@ def remote(self, model_details: ModelDetails, *args, **kwargs) -> Any:
         req = protocol.to_protocol_request(*args, **kwargs)
         endpoint = self.get_endpoint(model_details)
         response_raw = requests.post(endpoint, json=req)
-        return protocol.from_protocol_response(
-            response_raw.json(), model_details.outputs
-        )
+        return protocol.from_protocol_response(response_raw.json(), model_details.outputs)
 
     def undeploy(self, model_details: ModelDetails):
         api_instance = client.CustomObjectsApi()
@@ -81,9 +77,7 @@ def deploy(self, model_details: ModelDetails):
                 "seldondeployments",
                 model_details.name,
             )
-            model_spec["metadata"]["resourceVersion"] = existing["metadata"][
-                "resourceVersion"
-            ]
+            model_spec["metadata"]["resourceVersion"] = existing["metadata"]["resourceVersion"]
             api_instance.replace_namespaced_custom_object(
                 "machinelearning.seldon.io",
                 "v1",
diff --git a/tempo/seldon/protocol.py b/tempo/seldon/protocol.py
index 3888924f..eb25a91b 100644
--- a/tempo/seldon/protocol.py
+++ b/tempo/seldon/protocol.py
@@ -1,8 +1,9 @@
+from typing import Any, Dict, Type, Union
+
 import numpy as np
 
-from typing import Union, Type, Optional, Dict, List, Any
-from tempo.serve.protocol import Protocol
 from tempo.serve.metadata import ModelDataArgs, ModelDetails
+from tempo.serve.protocol import Protocol
 
 
 class SeldonProtocol(Protocol):
@@ -12,7 +13,7 @@ def get_predict_path(self, model_details: ModelDetails):
         return "/api/v1.0/predictions"
 
     def get_status_path(self, model_details: ModelDetails) -> str:
-        return f"/api/v1.0/health/status"
+        return "/api/v1.0/health/status"
 
     def to_protocol_request(self, *args, **kwargs) -> Dict:
         if not len(args) + len(kwargs) == 1:
@@ -37,18 +38,16 @@ def to_protocol_request(self, *args, **kwargs) -> Dict:
     def to_protocol_response(self, model_details: ModelDetails, *args, **kwargs) -> Dict:
         return self.to_protocol_request(*args, **kwargs)
 
-    def from_protocol_request(
-        self, res: dict, tys: ModelDataArgs
-    ) -> Union[dict, np.ndarray]:
+    def from_protocol_request(self, res: dict, tys: ModelDataArgs) -> Union[dict, np.ndarray]:
         if len(tys) > 1:
             raise ValueError("Seldon protocol can only return a single type")
 
         if tys[0] == Dict:
             # Return as-is
             return res
-        elif len(tys) == 0:
-            ty = np.ndarray
-        else:
+
+        ty: Type = np.ndarray
+        if tys and tys[0] is not None:
             ty = tys[0]
 
         if ty == np.ndarray:
@@ -59,7 +58,7 @@ def from_protocol_request(
                     return np.array(tensor["values"]).reshape(tensor["shape"])
                 elif "ndarray" in datadef:
                     return np.array(datadef["ndarray"])
-                #elif "tftensor" in datadef:
+                # elif "tftensor" in datadef:
                 #    tf_proto = TensorProto()
                 #    json_format.ParseDict(datadef["tftensor"], tf_proto)
                 #    return tf.make_ndarray(tf_proto)
diff --git a/tempo/seldon/specs.py b/tempo/seldon/specs.py
index 20c22299..8018dc30 100644
--- a/tempo/seldon/specs.py
+++ b/tempo/seldon/specs.py
@@ -1,9 +1,8 @@
 import json
 
-from tempo.serve.metadata import ModelDetails, ModelFramework
-from tempo.serve.protocol import Protocol
 from tempo.kfserving.protocol import KFServingV2Protocol
-from tempo.serve.metadata import KubernetesOptions
+from tempo.serve.metadata import KubernetesOptions, ModelDetails, ModelFramework
+from tempo.serve.protocol import Protocol
 
 DefaultHTTPPort = "9000"
 DefaultGRPCPort = "9500"
@@ -32,9 +31,7 @@ class _V1ContainerFactory:
     def get_container_spec(cls, model_details: ModelDetails) -> dict:
         model_image = cls.Images[model_details.platform]
 
-        parameters = [
-            {"name": "model_uri", "value": DefaultModelsPath, "type": "STRING"}
-        ]
+        parameters = [{"name": "model_uri", "value": DefaultModelsPath, "type": "STRING"}]
         env = {"PREDICTIVE_UNIT_PARAMETERS": json.dumps(parameters)}
 
         return {
@@ -112,7 +109,11 @@ def spec(self) -> dict:
     def _get_predictor(self) -> dict:
         # TODO: We need to insert `type: MODEL`, otherwise the validation
         # webhook complains
-        graph = {"modelUri": self._details.uri, "name": self._details.name, "type": "MODEL"}
+        graph = {
+            "modelUri": self._details.uri,
+            "name": self._details.name,
+            "type": "MODEL",
+        }
 
         if self._details.platform in self.Implementations:
             model_implementation = self.Implementations[self._details.platform]
@@ -134,10 +135,7 @@ def _get_predictor(self) -> dict:
 
     def _get_component_specs(self) -> list:
         container_spec = get_container_spec(self._details, self._protocol)
-        container_env = [
-            {"name": name, "value": value}
-            for name, value in container_spec["environment"].items()
-        ]
+        container_env = [{"name": name, "value": value} for name, value in container_spec["environment"].items()]
 
         return [
             {
diff --git a/tempo/serve/base.py b/tempo/serve/base.py
index a08779fc..caba00af 100644
--- a/tempo/serve/base.py
+++ b/tempo/serve/base.py
@@ -1,38 +1,22 @@
-import typing
-import tempfile
 import os
+import tempfile
 from os import path
+from typing import Any, Callable, Dict, Optional, Tuple, get_type_hints
 
-from typing import Optional, Callable, Any, Dict, get_type_hints, Tuple, List
-
-from tempo.serve.loader import (
-    download,
-    upload,
-    load_custom,
-    save_custom,
-    save_environment,
-)
+from tempo.errors import UndefinedCustomImplementation, UndefinedRuntime
+from tempo.serve.constants import DefaultEnvFilename, DefaultModelFilename, ModelDataType
+from tempo.serve.loader import download, load_custom, save_custom, save_environment, upload
+from tempo.serve.metadata import ModelDataArg, ModelDataArgs, ModelDetails, ModelFramework
 from tempo.serve.runtime import Runtime
 
-from tempo.serve.constants import (
-    ModelDataType,
-    DefaultModelFilename,
-    DefaultEnvFilename,
-)
-from tempo.serve.metadata import (
-    ModelDetails,
-    ModelDataArgs,
-    ModelDataArg,
-    ModelFramework,
-)
-
 DEFAULT_CONDA_FILE = "conda.yaml"
 
+
 class BaseModel:
     def __init__(
         self,
         name: str,
-        user_func: Callable[[Any], Any] = None,
+        user_func: Callable[..., Any] = None,
         local_folder: str = None,
         uri: str = None,
         platform: ModelFramework = None,
@@ -48,15 +32,15 @@ def __init__(
             uri = ""
 
         local_folder = self._get_local_folder(local_folder)
-        inputs, outputs = self._get_args(inputs, outputs)
+        input_args, output_args = self._get_args(inputs, outputs)
 
         self.details = ModelDetails(
             name=name,
             local_folder=local_folder,
             uri=uri,
             platform=platform,
-            inputs=inputs,
-            outputs=outputs,
+            inputs=input_args,
+            outputs=output_args,
         )
 
         self.cls = None
@@ -73,7 +57,9 @@ def _get_args(
                 hints = get_type_hints(self._user_func)
                 for k, v in hints.items():
                     if k == "return":
-                        if isinstance(v, typing._GenericAlias):
+                        if hasattr(v, "__args__"):
+                            # NOTE: If `__args__` are present, assume this as a
+                            # `typing.Generic`, like `Tuple`
                             targs = v.__args__
                             for targ in targs:
                                 output_args.append(ModelDataArg(ty=targ))
@@ -82,19 +68,19 @@ def _get_args(
                     else:
                         input_args.append(ModelDataArg(name=k, ty=v))
         else:
-            if type(outputs) == Dict:
+            if isinstance(outputs, dict):
                 for k, v in outputs.items():
                     output_args.append(ModelDataArg(name=k, ty=v))
-            elif type(outputs) == Tuple:
+            elif isinstance(outputs, tuple):
                 for ty in list(outputs):
                     output_args.append(ModelDataArg(ty=ty))
             else:
                 output_args.append(ModelDataArg(ty=outputs))
 
-            if type(inputs) == Dict:
+            if isinstance(inputs, dict):
                 for k, v in inputs.items():
                     input_args.append(ModelDataArg(name=k, ty=v))
-            elif type(inputs) == Tuple:
+            elif isinstance(inputs, tuple):
                 for ty in list(inputs):
                     input_args.append(ModelDataArg(ty=ty))
             else:
@@ -127,11 +113,15 @@ def save(self, save_env=True):
 
         if save_env:
             file_path_env = os.path.join(self.details.local_folder, DefaultEnvFilename)
-            conda_env_file_path = path.join(self.details.local_folder,DEFAULT_CONDA_FILE)
+            conda_env_file_path = path.join(self.details.local_folder, DEFAULT_CONDA_FILE)
             if not path.exists(conda_env_file_path):
                 conda_env_file_path = None
 
-            save_environment(conda_pack_file_path=file_path_env, conda_env_file_path=conda_env_file_path, env_name=self.conda_env_name)
+            save_environment(
+                conda_pack_file_path=file_path_env,
+                conda_env_file_path=conda_env_file_path,
+                env_name=self.conda_env_name,
+            )
 
     def upload(self):
         """
@@ -148,7 +138,11 @@ def download(self):
 
     def request(self, req: Dict) -> Dict:
         if self.runtime is None:
-            raise ValueError("Runtime most not be none to handle a request")
+            raise UndefinedRuntime(self.details.name)
+
+        if self._user_func is None:
+            raise UndefinedCustomImplementation(self.details.name)
+
         protocol = self.runtime.get_protocol()
         req_converted = protocol.from_protocol_request(req, self.details.inputs)
         if type(req_converted) == dict:
@@ -173,6 +167,7 @@ def request(self, req: Dict) -> Dict:
             response_converted = protocol.to_protocol_response(self.details, *response)
         else:
             response_converted = protocol.to_protocol_response(self.details, response)
+
         return response_converted
 
     def set_runtime(self, runtime: Runtime):
@@ -191,6 +186,9 @@ def to_k8s_yaml(self) -> str:
         """
         Get k8s yaml
         """
+        if self.runtime is None:
+            raise UndefinedRuntime(self.details.name)
+
         return self.runtime.to_k8s_yaml(self.details)
 
     def deploy(self):
diff --git a/tempo/serve/constants.py b/tempo/serve/constants.py
index fc9c5efb..28344d2f 100644
--- a/tempo/serve/constants.py
+++ b/tempo/serve/constants.py
@@ -1,4 +1,4 @@
-from typing import List, Optional, Dict, Type, Union
+from typing import Dict, List, Optional, Type, Union
 
 SKLEARN_MODEL = "sklearn"
 XGBOOST_MODEL = "xgboost"
diff --git a/tempo/serve/loader.py b/tempo/serve/loader.py
index 0300b31f..c29908e7 100644
--- a/tempo/serve/loader.py
+++ b/tempo/serve/loader.py
@@ -1,13 +1,14 @@
-import cloudpickle
-import rclone
 import re
+import uuid
+from subprocess import run
+from tempfile import NamedTemporaryFile
+from typing import Optional
+
+import cloudpickle
 import conda_pack
+import rclone
 import yaml
-import uuid
 
-from typing import Optional
-from tempfile import NamedTemporaryFile
-from subprocess import run
 from tempo.conf import settings
 from tempo.serve.constants import MLServerEnvDeps
 
@@ -26,7 +27,7 @@ def load_custom(file_path: str):
         return cloudpickle.load(file)
 
 
-def _get_env(conda_env_file_path:str = None, env_name:str = None) -> dict:
+def _get_env(conda_env_file_path: str = None, env_name: str = None) -> dict:
     if conda_env_file_path:
         with open(conda_env_file_path) as file:
             env = yaml.safe_load(file)
@@ -37,12 +38,13 @@ def _get_env(conda_env_file_path:str = None, env_name:str = None) -> dict:
         env = _add_required_deps(env)
     return env
 
+
 def save_environment(conda_pack_file_path: str, conda_env_file_path: str = None, env_name: str = None):
     # TODO: Check if Conda is installed
     if env_name:
         _pack_environment(env_name, conda_pack_file_path)
     else:
-        env = _get_env(conda_env_file_path,env_name)
+        env = _get_env(conda_env_file_path, env_name)
         _create_and_pack_environment(env=env, file_path=conda_pack_file_path)
 
 
@@ -63,12 +65,12 @@ def _has_required_deps(env: dict) -> bool:
     dependencies = env["dependencies"]
     pip_deps = _get_pip_deps(dependencies)
     if not pip_deps:
-       return False
+        return False
 
     for dep in MLServerEnvDeps:
         parts = re.split(r"==|>=|<=|~=|!=|>|<|==:", dep)
         module = parts[0]
-        r = re.compile(f"{module}$|({module}((==|>=|<=|~=|!=|>|<|==:)[0-9]+\.[0-9]+.[0-9]+))")
+        r = re.compile(fr"{module}$|({module}((==|>=|<=|~=|!=|>|<|==:)[0-9]+\.[0-9]+.[0-9]+))")
         newlist = list(filter(r.match, pip_deps["pip"]))
         if len(newlist) == 0:
             return False
@@ -89,7 +91,7 @@ def _add_required_deps(env: dict) -> dict:
     for dep in MLServerEnvDeps:
         parts = re.split(r"==|>=|<=|~=|!=|>|<|==:", dep)
         module = parts[0]
-        r = re.compile(f"{module}$|({module}((==|>=|<=|~=|!=|>|<|==:)[0-9]+\.[0-9]+.[0-9]+))")
+        r = re.compile(fr"{module}$|({module}((==|>=|<=|~=|!=|>|<|==:)[0-9]+\.[0-9]+.[0-9]+))")
         newlist = list(filter(r.match, pip_deps["pip"]))
         if len(newlist) == 0:
             pip_deps["pip"].extend(MLServerEnvDeps)
diff --git a/tempo/serve/metadata.py b/tempo/serve/metadata.py
index d51e798a..ffc6e673 100644
--- a/tempo/serve/metadata.py
+++ b/tempo/serve/metadata.py
@@ -1,6 +1,7 @@
-from pydantic import BaseModel
 from enum import Enum
-from typing import Optional, List, Type, Dict, Union, Any
+from typing import List, Optional, Type, Union
+
+from pydantic import BaseModel
 
 
 class ModelFramework(Enum):
@@ -17,9 +18,8 @@ class ModelFramework(Enum):
 
 
 class ModelDataArg(BaseModel):
-
     ty: Type
-    name: str = None
+    name: Optional[str] = None
 
 
 class ModelDataArgs(BaseModel):
@@ -33,13 +33,14 @@ def _get_type_by_name(self, name: str) -> Optional[Type]:
         return None
 
     def __getitem__(self, idx: Union[str, int]) -> Optional[Type]:
-        if type(idx) == str:
+        if isinstance(idx, str):
             return self._get_type_by_name(idx)
-        else:
-            if idx < len(self.args):
-                return self.args[idx].ty
-            else:
-                return None
+
+        if idx < len(self.args):
+            # NOTE: `idx` here must be an int
+            return self.args[idx].ty
+
+        return None
 
     def __len__(self):
         return len(self.args)
@@ -54,9 +55,8 @@ class ModelDetails(BaseModel):
     outputs: ModelDataArgs
 
 
-
 class KubernetesOptions(BaseModel):
     replicas: int = 1
     namespace = "default"
-    minReplicas: int = None
-    maxReplicas: int = None
+    minReplicas: Optional[int] = None
+    maxReplicas: Optional[int] = None
diff --git a/tempo/serve/model.py b/tempo/serve/model.py
index ee96b3ba..5d670710 100644
--- a/tempo/serve/model.py
+++ b/tempo/serve/model.py
@@ -1,12 +1,11 @@
 import types
-import requests
-
 from typing import Any, Callable
 
-from tempo.serve.runtime import Runtime
-from tempo.serve.metadata import ModelFramework
+from tempo.errors import UndefinedRuntime
 from tempo.serve.base import BaseModel
 from tempo.serve.constants import ModelDataType
+from tempo.serve.metadata import ModelFramework
+from tempo.serve.runtime import Runtime
 
 
 class Model(BaseModel):
@@ -19,7 +18,7 @@ def __init__(
         platform: ModelFramework = None,
         inputs: ModelDataType = None,
         outputs: ModelDataType = None,
-        model_func: Callable[[Any], Any] = None,
+        model_func: Callable[..., Any] = None,
     ):
         super().__init__(
             name,
@@ -42,5 +41,8 @@ def __get__(self, instance, owner):
     def __call__(self, *args, **kwargs) -> Any:
         if self._user_func is not None:
             return self._user_func(*args, **kwargs)
-        else:
-            return self.runtime.remote(self.details, *args, **kwargs)
\ No newline at end of file
+
+        if self.runtime is None:
+            raise UndefinedRuntime(self.details.name)
+
+        return self.runtime.remote(self.details, *args, **kwargs)
diff --git a/tempo/serve/pipeline.py b/tempo/serve/pipeline.py
index ff52ad97..d9525682 100644
--- a/tempo/serve/pipeline.py
+++ b/tempo/serve/pipeline.py
@@ -1,11 +1,12 @@
-from typing import Callable, List, Any
+from typing import Any, Callable, List
 
-from tempo.serve.metadata import ModelFramework
+from tempo.errors import UndefinedCustomImplementation
+from tempo.serve.base import BaseModel
 from tempo.serve.constants import ModelDataType
+from tempo.serve.metadata import ModelFramework
 from tempo.serve.model import Model
-from tempo.utils import logger
 from tempo.serve.runtime import Runtime
-from tempo.serve.base import BaseModel
+from tempo.utils import logger
 
 
 class Pipeline(BaseModel):
@@ -90,4 +91,8 @@ def to_k8s_yaml(self) -> str:
         return yamls
 
     def __call__(self, raw: Any) -> Any:
+        if not self._user_func:
+            # TODO: Group generic errors
+            raise UndefinedCustomImplementation(self.details.name)
+
         return self._user_func(raw)
diff --git a/tempo/serve/protocol.py b/tempo/serve/protocol.py
index fa4515b3..dd257c25 100644
--- a/tempo/serve/protocol.py
+++ b/tempo/serve/protocol.py
@@ -1,9 +1,10 @@
 from __future__ import annotations
 
 import abc
+from typing import Any, Dict
+
 import attr
 
-from typing import Dict, Any, List
 from tempo.serve.metadata import ModelDataArgs, ModelDetails
 
 
diff --git a/tempo/serve/runtime.py b/tempo/serve/runtime.py
index 29d1f903..7ccaf642 100644
--- a/tempo/serve/runtime.py
+++ b/tempo/serve/runtime.py
@@ -1,8 +1,11 @@
 from __future__ import annotations
+
 import abc
+from typing import Any
+
 import attr
+
 from tempo.serve.metadata import ModelDetails
-from typing import Any
 
 
 @attr.s(auto_attribs=True)
@@ -18,7 +21,7 @@ def undeploy(self, model_details: ModelDetails):
         pass
 
     @abc.abstractmethod
-    def remote(self, *args, **kwargs) -> Any:
+    def remote(self, model_details: ModelDetails, *args, **kwargs) -> Any:
         pass
 
     @abc.abstractmethod
diff --git a/tempo/serve/utils.py b/tempo/serve/utils.py
index fa429d08..3918080b 100644
--- a/tempo/serve/utils.py
+++ b/tempo/serve/utils.py
@@ -1,10 +1,11 @@
-from typing import List, Optional, Dict, Type, Union
+import inspect
+from typing import List
+
 from tempo.serve.constants import ModelDataType
+from tempo.serve.metadata import ModelFramework
+from tempo.serve.model import Model
 from tempo.serve.pipeline import Pipeline
 from tempo.serve.runtime import Runtime
-from tempo.serve.model import Model
-from tempo.serve.metadata import ModelFramework
-import inspect
 
 
 def pipeline(
@@ -15,18 +16,15 @@ def pipeline(
     models: List[Model] = None,
     inputs: ModelDataType = None,
     outputs: ModelDataType = None,
-    conda_env: str = None):
+    conda_env: str = None,
+):
     def _pipeline(f):
         if inspect.isclass(f):
             K = f
             func = None
 
             for a in dir(K):
-                if (
-                    not a.startswith("__")
-                    and callable(getattr(K, a))
-                    and hasattr(getattr(K, a), "predict")
-                ):
+                if not a.startswith("__") and callable(getattr(K, a)) and hasattr(getattr(K, a), "predict"):
                     func = getattr(K, a)
                     break
             K.pipeline = Pipeline(
@@ -54,6 +52,7 @@ def _pipeline(f):
             setattr(K, "download", K.pipeline.download)
 
             orig_init = K.__init__
+
             # Make copy of original __init__, so we can call it without recursion
             def __init__(self, *args, **kws):
                 K.pipeline.set_cls(self)


Test patch:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
new file mode 100644
index 00000000..b92c46b8
--- /dev/null
+++ b/.github/workflows/tests.yml
@@ -0,0 +1,24 @@
+name: Tempo Tests
+
+on:
+  push:
+    branches: [ master ]
+  pull_request:
+    branches: [ master ]
+
+jobs:
+  tests:
+    runs-on: ubuntu-latest
+
+    steps:
+        - uses: actions/checkout@v2
+        - name: Set up Python 3.7
+          uses: actions/setup-python@v2
+          with:
+            python-version: 3.7.10
+        - name: Install dependencies
+          run: |
+            make install-dev
+        - name: Test
+          run: |
+            make test
diff --git a/tempo/tests/conftest.py b/tempo/tests/conftest.py
index 9a5eb576..85338cb5 100644
--- a/tempo/tests/conftest.py
+++ b/tempo/tests/conftest.py
@@ -1,23 +1,21 @@
-import uuid
-import pytest
 import os
 import time
-import docker
-import numpy as np
-
+import uuid
 from typing import Generator
 
+import docker
+import numpy as np
+import pytest
 from kubernetes import client, config
 from kubernetes.utils.create_from_yaml import create_from_yaml
 
-from tempo.serve.metadata import ModelFramework, KubernetesOptions
-from tempo.serve.model import Model
-from tempo.serve.pipeline import Pipeline
-from tempo.serve.utils import pipeline
-from tempo.seldon.docker import SeldonDockerRuntime
 from tempo.kfserving.protocol import KFServingV2Protocol
+from tempo.seldon.docker import SeldonDockerRuntime
 from tempo.seldon.k8s import SeldonKubernetesRuntime
-from tempo.serve.utils import predictmethod
+from tempo.serve.metadata import KubernetesOptions, ModelFramework
+from tempo.serve.model import Model
+from tempo.serve.pipeline import Pipeline
+from tempo.serve.utils import pipeline, predictmethod
 
 TESTS_PATH = os.path.dirname(__file__)
 TESTDATA_PATH = os.path.join(TESTS_PATH, "testdata")
@@ -71,9 +69,7 @@ def k8s_namespace() -> Generator[str, None, None]:
 
 @pytest.fixture
 def k8s_runtime(k8s_namespace: str) -> SeldonKubernetesRuntime:
-    return SeldonKubernetesRuntime(
-        k8s_options=KubernetesOptions(namespace=k8s_namespace)
-    )
+    return SeldonKubernetesRuntime(k8s_options=KubernetesOptions(namespace=k8s_namespace))
 
 
 @pytest.fixture
@@ -85,9 +81,7 @@ def k8s_runtime_v2(k8s_namespace: str) -> SeldonKubernetesRuntime:
 
 
 @pytest.fixture
-def k8s_sklearn_model(
-    sklearn_model: Model, k8s_runtime: SeldonKubernetesRuntime
-) -> Generator[Model, None, None]:
+def k8s_sklearn_model(sklearn_model: Model, k8s_runtime: SeldonKubernetesRuntime) -> Generator[Model, None, None]:
     sklearn_model.runtime = k8s_runtime
 
     sklearn_model.deploy()
@@ -229,9 +223,7 @@ def _pipeline(payload: np.ndarray) -> np.ndarray:
 
 
 @pytest.fixture
-def inference_pipeline_v3(
-    sklearn_model: Model, xgboost_model: Model, docker_runtime_v2: SeldonDockerRuntime
-):
+def inference_pipeline_v3(sklearn_model: Model, xgboost_model: Model, docker_runtime_v2: SeldonDockerRuntime):
     @pipeline(
         name="mypipeline",
         runtime=docker_runtime_v2,
@@ -254,14 +246,14 @@ def get_counter(self):
             return self.counter
 
     myc = MyClass()
-    myc.pipeline.deploy()
+    myc.pipeline.deploy()  # type: ignore
 
     time.sleep(2)
 
     yield myc
 
     try:
-        myc.undeploy()
+        myc.undeploy()  # type: ignore
     except docker.errors.NotFound:
         # Ignore if the pipeline was already undeployed
         pass
diff --git a/tempo/tests/kfserving/test_k8s.py b/tempo/tests/kfserving/test_k8s.py
index d4a6113e..17dc8721 100644
--- a/tempo/tests/kfserving/test_k8s.py
+++ b/tempo/tests/kfserving/test_k8s.py
@@ -1,9 +1,11 @@
-from tempo.kfserving.k8s import KFServingKubernetesRuntime
-from tempo.serve.model import Model
-from tempo.serve.metadata import ModelFramework
 import numpy as np
 import pytest
 
+from tempo.kfserving.k8s import KFServingKubernetesRuntime
+from tempo.serve.metadata import ModelFramework
+from tempo.serve.model import Model
+
+
 @pytest.mark.skip(reason="needs k8s cluster")
 def test_kfserving():
     model = Model(
@@ -11,8 +13,8 @@ def test_kfserving():
         runtime=KFServingKubernetesRuntime(),
         platform=ModelFramework.SKLearn,
         uri="gs://kfserving-samples/models/sklearn/iris",
-        local_folder="sklearn/model"
+        local_folder="sklearn/model",
     )
-    #model.deploy()
+    # model.deploy()
     res = model(np.array([[1, 2, 3, 4]]))
-    print(res)
\ No newline at end of file
+    print(res)
diff --git a/tempo/tests/kfserving/test_protocol.py b/tempo/tests/kfserving/test_protocol.py
index b164cc84..f18b9a37 100644
--- a/tempo/tests/kfserving/test_protocol.py
+++ b/tempo/tests/kfserving/test_protocol.py
@@ -1,43 +1,33 @@
-from tempo.kfserving.protocol import KFServingV2Protocol
 import pytest
-from tempo.serve.metadata import ModelDataArgs, ModelDataArg
+
+from tempo.kfserving.protocol import KFServingV2Protocol
+from tempo.serve.metadata import ModelDataArg, ModelDataArgs
+
 
 @pytest.mark.parametrize(
     "data, expected",
-    [
-        ("abc",[97,98,99]),
-        ({"a":1},[123, 39, 97, 39, 58, 32, 49, 125])
-    ],
+    [("abc", [97, 98, 99]), ({"a": 1}, [123, 39, 97, 39, 58, 32, 49, 125])],
 )
 def test_v2_from_any(data, expected):
-    p = KFServingV2Protocol()
-    d = KFServingV2Protocol.create_v2_from_any(data,"a")
+    d = KFServingV2Protocol.create_v2_from_any(data, "a")
     assert d["name"] == "a"
     assert d["data"] == expected
     assert d["datatype"] == "BYTES"
 
+
 @pytest.mark.parametrize(
     "data, ty, expected",
-    [
-        ([97,98,99],str, "abc"),
-        ([123, 39, 97, 39, 58, 32, 49, 125],dict, {"a":1})
-    ],
+    [([97, 98, 99], str, "abc"), ([123, 39, 97, 39, 58, 32, 49, 125], dict, {"a": 1})],
 )
 def test_convert_from_bytes(data, ty, expected):
-    output = {"data":data}
-    res = KFServingV2Protocol.convert_from_bytes(output,ty)
+    output = {"data": data}
+    res = KFServingV2Protocol.convert_from_bytes(output, ty)
     assert res == expected
 
 
 def test_v2_from_protocol_response():
-    res = {"outputs":[
-        {
-            "name": "a",
-            "data": [97,98,99],
-            "datatype": "BYTES"
-        }
-    ]}
+    res = {"outputs": [{"name": "a", "data": [97, 98, 99], "datatype": "BYTES"}]}
     modelTyArgs = ModelDataArgs(args=[ModelDataArg(ty=str, name=None)])
     v2 = KFServingV2Protocol()
     res = v2.from_protocol_response(res, modelTyArgs)
-    print(res)
\ No newline at end of file
+    print(res)
diff --git a/tempo/tests/seldon/test_deploy.py b/tempo/tests/seldon/test_deploy.py
index 1b879e1f..fc29b6d5 100644
--- a/tempo/tests/seldon/test_deploy.py
+++ b/tempo/tests/seldon/test_deploy.py
@@ -1,11 +1,12 @@
 import os
-import pytest
+
 import numpy as np
+import pytest
 
-from tempo.serve.metadata import ModelFramework, KubernetesOptions
-from tempo.serve.model import Model
 from tempo.seldon.deploy import SeldonDeployRuntime
 from tempo.seldon.k8s import SeldonKubernetesRuntime
+from tempo.serve.metadata import KubernetesOptions, ModelFramework
+from tempo.serve.model import Model
 
 
 @pytest.mark.skip("needs deploy cluster")
diff --git a/tempo/tests/seldon/test_specs.py b/tempo/tests/seldon/test_specs.py
index 59b08c2c..eb66148f 100644
--- a/tempo/tests/seldon/test_specs.py
+++ b/tempo/tests/seldon/test_specs.py
@@ -1,9 +1,8 @@
-from tempo.serve.model import Model
-from tempo.seldon.protocol import SeldonProtocol
 from tempo.kfserving.protocol import KFServingV2Protocol
-from tempo.serve.metadata import KubernetesOptions, ModelDataArgs
+from tempo.seldon.protocol import SeldonProtocol
 from tempo.seldon.specs import KubernetesSpec, _V2ContainerFactory
-from tempo.serve.metadata import ModelDetails, ModelFramework
+from tempo.serve.metadata import KubernetesOptions, ModelDataArgs, ModelDetails, ModelFramework
+from tempo.serve.model import Model
 
 
 def test_kubernetes_spec(sklearn_model: Model):
@@ -23,11 +22,9 @@ def test_kubernetes_spec(sklearn_model: Model):
                 {
                     "graph": {
                         "modelUri": sklearn_model.details.uri,
-                        "name": "classifier",
+                        "name": "test-iris-sklearn",
                         "type": "MODEL",
-                        "implementation": KubernetesSpec.Implementations[
-                            sklearn_model.details.platform
-                        ],
+                        "implementation": KubernetesSpec.Implementations[sklearn_model.details.platform],
                     },
                     "name": "default",
                     "replicas": options.replicas,
@@ -52,10 +49,7 @@ def test_kubernetes_spec_pipeline():
     k8s_object = KubernetesSpec(details, KFServingV2Protocol(), options)
 
     container_spec = _V2ContainerFactory.get_container_spec(details)
-    container_env = [
-        {"name": name, "value": value}
-        for name, value in container_spec["environment"].items()
-    ]
+    container_env = [{"name": name, "value": value} for name, value in container_spec["environment"].items()]
 
     expected = {
         "apiVersion": "machinelearning.seldon.io/v1",
@@ -70,7 +64,7 @@ def test_kubernetes_spec_pipeline():
                             "spec": {
                                 "containers": [
                                     {
-                                        "name": "classifier",
+                                        "name": "inference-pipeline",
                                         "image": container_spec["image"],
                                         "env": container_env,
                                         "args": [],
@@ -81,7 +75,7 @@ def test_kubernetes_spec_pipeline():
                     ],
                     "graph": {
                         "modelUri": details.uri,
-                        "name": "classifier",
+                        "name": "inference-pipeline",
                         "type": "MODEL",
                         "implementation": "TRITON_SERVER",
                         "serviceAccountName": "tempo-pipeline",
diff --git a/tempo/tests/serve/test_class.py b/tempo/tests/serve/test_class.py
index d3c4de40..4e082d89 100644
--- a/tempo/tests/serve/test_class.py
+++ b/tempo/tests/serve/test_class.py
@@ -1,8 +1,3 @@
-from tempo.serve.utils import pipeline, predictmethod
-from tempo.serve.model import Model
-from tempo.seldon.docker import SeldonDockerRuntime
-import numpy as np
-import time
 import pytest
 
 
@@ -22,9 +17,7 @@
             },
             {
                 "model_name": "mypipeline",
-                "outputs": [
-                    {"name": "output0", "datatype": "FP64", "shape": [1], "data": [2.0]}
-                ],
+                "outputs": [{"name": "output0", "datatype": "FP64", "shape": [1], "data": [2.0]}],
             },
         )
     ],
diff --git a/tempo/tests/serve/test_docker.py b/tempo/tests/serve/test_docker.py
index 27c87eb5..b5a63a94 100644
--- a/tempo/tests/serve/test_docker.py
+++ b/tempo/tests/serve/test_docker.py
@@ -1,11 +1,11 @@
 import time
-import pytest
+
 import docker
 import numpy as np
+import pytest
 
-from tempo.serve.model import Model
-from tempo.serve.pipeline import Pipeline
 from tempo.seldon.docker import SeldonDockerRuntime
+from tempo.serve.model import Model
 
 
 def test_deploy_docker(sklearn_model: Model, docker_runtime: SeldonDockerRuntime):
diff --git a/tempo/tests/serve/test_k8s.py b/tempo/tests/serve/test_k8s.py
index c811e758..fa6fec84 100644
--- a/tempo/tests/serve/test_k8s.py
+++ b/tempo/tests/serve/test_k8s.py
@@ -1,11 +1,10 @@
-import pytest
 import numpy as np
-
+import pytest
 from kubernetes import client
 
+from tempo.seldon.k8s import SeldonKubernetesRuntime
 from tempo.serve.model import Model
 from tempo.serve.pipeline import Pipeline
-from tempo.seldon.k8s import SeldonKubernetesRuntime
 
 
 @pytest.mark.skip(reason="needs k8s cluster")
diff --git a/tempo/tests/serve/test_loader.py b/tempo/tests/serve/test_loader.py
index 9d997be7..515b5f20 100644
--- a/tempo/tests/serve/test_loader.py
+++ b/tempo/tests/serve/test_loader.py
@@ -1,17 +1,18 @@
-import pytest
 import os
 
+import pytest
+
+from tempo.serve.constants import DefaultEnvFilename, MLServerEnvDeps
 from tempo.serve.loader import (
-    save_environment,
-    _to_rclone,
-    _get_environment,
     _add_required_deps,
+    _create_and_pack_environment,
+    _get_env,
+    _get_environment,
     _get_pip_deps,
-    _pack_environment,
     _has_required_deps,
-    _get_env
+    _to_rclone,
+    save_environment,
 )
-from tempo.serve.constants import MLServerEnvDeps, DefaultEnvFilename
 
 
 @pytest.mark.parametrize(
@@ -24,19 +25,20 @@
 def test_rclone_conversion(path, expected):
     assert _to_rclone(path) == expected
 
+
 @pytest.mark.skip(reason="very slow")
 def test_save_environment(tmp_path):
     env_path = os.path.join(tmp_path, DefaultEnvFilename)
-    save_environment(conda_pack_file_path=env_path, env_name='base')
+    save_environment(conda_pack_file_path=env_path, env_name="base")
 
     assert os.path.isfile(env_path)
 
 
-def test_pack_environment(tmp_path):
+def test_create_and_pack_environment(tmp_path):
     env = {"dependencies": [{"pip": MLServerEnvDeps}]}
-
     env_path = os.path.join(tmp_path, DefaultEnvFilename)
-    _pack_environment(env=env, file_path=env_path)
+
+    _create_and_pack_environment(env=env, file_path=env_path)
 
     assert os.path.isfile(env_path)
 
@@ -53,7 +55,10 @@ def test_get_environment():
         {},
         {"foo": "bar"},
         {"foo": "bar", "dependencies": ["foo==1.0"]},
-        {"foo": "bar", "dependencies": ["foo==1.0", {"pip": ["foo-pip==1.0"]}],},
+        {
+            "foo": "bar",
+            "dependencies": ["foo==1.0", {"pip": ["foo-pip==1.0"]}],
+        },
     ],
 )
 def test_add_required_deps(env):
@@ -67,30 +72,44 @@ def test_add_required_deps(env):
 @pytest.mark.parametrize(
     "env, expected",
     [
-        ({},False),
-        ({"foo": "bar", "dependencies": ["foo==1.0", {"pip": ["mlserver"]}], }, False),
-        ({"foo": "bar", "dependencies": ["foo==1.0", {"pip": ["mlserver","mlserver-tempo"]}], }, True),
+        ({}, False),
+        (
+            {
+                "foo": "bar",
+                "dependencies": ["foo==1.0", {"pip": ["mlserver"]}],
+            },
+            False,
+        ),
+        (
+            {
+                "foo": "bar",
+                "dependencies": ["foo==1.0", {"pip": ["mlserver", "mlserver-tempo"]}],
+            },
+            True,
+        ),
     ],
 )
 def test_has_required_deps(env, expected):
     has_deps = _has_required_deps(env)
     assert has_deps == expected
 
+
 @pytest.mark.parametrize(
     "env_file_path",
     [
-       os.path.join(os.path.dirname(__file__), 'data', 'conda.yaml'),
+        os.path.join(os.path.dirname(__file__), "data", "conda.yaml"),
     ],
 )
 def test_get_env_ok(env_file_path):
     _get_env(conda_env_file_path=env_file_path)
 
+
 @pytest.mark.parametrize(
     "env_file_path",
     [
-       os.path.join(os.path.dirname(__file__), 'data', 'conda_missing_mlserver.yaml'),
+        os.path.join(os.path.dirname(__file__), "data", "conda_missing_mlserver.yaml"),
     ],
 )
-def test_get_env_ok(env_file_path):
+def test_get_env_not_ok(env_file_path):
     with pytest.raises(ValueError):
-        _get_env(conda_env_file_path=env_file_path)
\ No newline at end of file
+        _get_env(conda_env_file_path=env_file_path)
diff --git a/tempo/tests/serve/test_model.py b/tempo/tests/serve/test_model.py
index 74db1ce8..ece8a708 100644
--- a/tempo/tests/serve/test_model.py
+++ b/tempo/tests/serve/test_model.py
@@ -1,11 +1,14 @@
-from tempo.serve.utils import model
-from tempo.serve.metadata import ModelFramework
-from typing import Tuple, List
+from typing import List, Tuple
+
+import numpy as np
 import pytest
-from tempo.seldon.docker import SeldonDockerRuntime
+
 from tempo.kfserving.protocol import KFServingV2Protocol
+from tempo.seldon.docker import SeldonDockerRuntime
+from tempo.serve.metadata import ModelFramework
 from tempo.serve.model import Model
-import numpy as np
+from tempo.serve.utils import model
+
 
 #
 # Test single input output model with type annotations
@@ -56,9 +59,7 @@ def custom_model(a: np.ndarray) -> np.ndarray:
 #
 # Test lambda function
 #
-@pytest.mark.parametrize(
-    "input, expected", [(np.array([[0, 0, 0, 1]]), np.array([[0, 0, 1]]))]
-)
+@pytest.mark.parametrize("input, expected", [(np.array([[0, 0, 0, 1]]), np.array([[0, 0, 1]]))])
 def test_lambda(input, expected):
     model = Model(
         name="test-iris-sklearn",
@@ -164,16 +165,12 @@ def custom_model_decorator_types(a):
 def test_custom_multiheaded_model_tuple(v2_input, expected):
     @model(
         name="multi-headed",
-        runtime=SeldonDockerRuntime(
-            protocol=KFServingV2Protocol()
-        ),
+        runtime=SeldonDockerRuntime(protocol=KFServingV2Protocol()),
         platform=ModelFramework.Custom,
         uri="gs://seldon-models/custom",
         local_folder="custom_iris_path",
     )
-    def custom_multiheaded_model_tuple(
-        a: np.ndarray, b: np.ndarray
-    ) -> Tuple[np.ndarray, np.ndarray]:
+    def custom_multiheaded_model_tuple(a: np.ndarray, b: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
         return a, b
 
     response = custom_multiheaded_model_tuple.request(v2_input)
@@ -221,9 +218,7 @@ def custom_multiheaded_model_tuple(
 def test_custom_multiheaded_model_list(v2_input, expected):
     @model(
         name="multi-headed",
-        runtime=SeldonDockerRuntime(
-            protocol=KFServingV2Protocol()
-        ),
+        runtime=SeldonDockerRuntime(protocol=KFServingV2Protocol()),
         platform=ModelFramework.Custom,
         uri="gs://seldon-models/custom",
         local_folder="custom_iris_path",
diff --git a/tempo/tests/serve/test_pipeline.py b/tempo/tests/serve/test_pipeline.py
index 3a06874d..f169d859 100644
--- a/tempo/tests/serve/test_pipeline.py
+++ b/tempo/tests/serve/test_pipeline.py
@@ -1,11 +1,11 @@
-import time
 import os
-import pytest
+
 import docker
 import numpy as np
+import pytest
 
-from tempo.serve.pipeline import Pipeline
 from tempo.seldon.docker import SeldonDockerRuntime
+from tempo.serve.pipeline import Pipeline
 from tempo.serve.utils import pipeline
 
 
@@ -67,16 +67,12 @@ def test_pipeline_remote(inference_pipeline: Pipeline, x_input):
             },
             {
                 "model_name": "classifier",
-                "outputs": [
-                    {"name": "output0", "datatype": "FP64", "shape": [1], "data": [2.0]}
-                ],
+                "outputs": [{"name": "output0", "datatype": "FP64", "shape": [1], "data": [2.0]}],
             },
         )
     ],
 )
-def test_seldon_pipeline_request_docker(
-    inference_pipeline: Pipeline, x_input, expected
-):
+def test_seldon_pipeline_request_docker(inference_pipeline: Pipeline, x_input, expected):
     y_pred = inference_pipeline.request(x_input)
 
     assert y_pred == expected
@@ -98,9 +94,7 @@ def test_seldon_pipeline_request_docker(
             },
             {
                 "model_name": "inference-pipeline",
-                "outputs": [
-                    {"name": "output0", "datatype": "FP64", "shape": [1], "data": [2.0]}
-                ],
+                "outputs": [{"name": "output0", "datatype": "FP64", "shape": [1], "data": [2.0]}],
             },
         )
     ],
@@ -111,9 +105,7 @@ def test_v2_pipeline_request_docker(inference_pipeline_v2: Pipeline, x_input, ex
     assert y_pred == expected
 
 
-def test_undeploy_pipeline_docker(
-    inference_pipeline: Pipeline, docker_runtime: SeldonDockerRuntime
-):
+def test_undeploy_pipeline_docker(inference_pipeline: Pipeline, docker_runtime: SeldonDockerRuntime):
     inference_pipeline.undeploy()
 
     for model in inference_pipeline._models:
@@ -121,12 +113,12 @@ def test_undeploy_pipeline_docker(
             docker_runtime._get_container(model.details)
 
 
-def test_save_pipeline(docker_runtime_v2, sklearn_model,xgboost_model):
+def test_save_pipeline(docker_runtime_v2, sklearn_model, xgboost_model):
     @pipeline(
         name="classifier",
         runtime=docker_runtime_v2,
         models=[sklearn_model, xgboost_model],
-        local_folder=os.path.join(os.path.dirname(__file__), 'data')
+        local_folder=os.path.join(os.path.dirname(__file__), "data"),
     )
     def _pipeline(payload: np.ndarray) -> np.ndarray:
         res1 = sklearn_model(payload)
@@ -136,4 +128,3 @@ def _pipeline(payload: np.ndarray) -> np.ndarray:
             return xgboost_model(payload)
 
     _pipeline.save(save_env=True)
-
diff --git a/tempo/tests/serve/test_yaml.py b/tempo/tests/serve/test_yaml.py
index ab4cd1a0..ea034806 100644
--- a/tempo/tests/serve/test_yaml.py
+++ b/tempo/tests/serve/test_yaml.py
@@ -1,7 +1,8 @@
 import pytest
-from tempo.serve.model import Model
+
 from tempo.seldon.k8s import SeldonKubernetesRuntime
 from tempo.serve.metadata import ModelFramework
+from tempo.serve.model import Model
 
 
 @pytest.mark.parametrize(
@@ -17,7 +18,7 @@
   - graph:
       implementation: SKLEARN_SERVER
       modelUri: gs://seldon-models/sklearn/iris
-      name: classifier
+      name: test-iris-sklearn
       type: MODEL
     name: default
     replicas: 1
@@ -49,7 +50,7 @@ def test_seldon_sklearn_model_yaml(expected):
   - graph:
       implementation: XGBOOST_SERVER
       modelUri: gs://seldon-models/xgboost/iris
-      name: classifier
+      name: test-iris-xgboost
       type: MODEL
     name: default
     replicas: 1