Latest Threat Research:SANDWORM_MODE: Shai-Hulud-Style npm Worm Hijacks CI Workflows and Poisons AI Toolchains.Details
Socket
Book a DemoInstallSign in
Socket

mlserver

Package Overview
Dependencies
Maintainers
1
Versions
121
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

mlserver - npm Package Compare versions

Comparing version
1.7.1
to
1.7.2rc1
+1
-0
mlserver/batching/requests.py

@@ -21,2 +21,3 @@ from collections import defaultdict, OrderedDict

parameters = defaultdict(list)
payload_parameters = {}
if payload.parameters is not None:

@@ -23,0 +24,0 @@ payload_parameters = payload.parameters.model_dump()

+11
-7

@@ -6,3 +6,2 @@ """

import click
import asyncio

@@ -15,3 +14,3 @@ from functools import wraps

from ..logging import logger, configure_logger
from ..utils import install_uvloop_event_loop
from ..utils import AsyncManager

@@ -22,7 +21,11 @@ from .build import generate_dockerfile, build_image, write_dockerfile

CTX_ASYNC_MGR_KEY = "async_manager"
def click_async(f):
@wraps(f)
def wrapper(*args, **kwargs):
return asyncio.run(f(*args, **kwargs))
ctx = click.get_current_context()
async_mgr = ctx.obj[CTX_ASYNC_MGR_KEY]
return async_mgr.run(f(*args, **kwargs))

@@ -34,7 +37,8 @@ return wrapper

@click.version_option()
def root():
@click.pass_context
def root(ctx):
"""
Command-line interface to manage MLServer models.
"""
pass
ctx.ensure_object(dict)

@@ -272,4 +276,4 @@

configure_logger()
install_uvloop_event_loop()
root()
async_mgr = AsyncManager()
root(obj={CTX_ASYNC_MGR_KEY: async_mgr})

@@ -276,0 +280,0 @@

@@ -0,3 +1,4 @@

from typing import TYPE_CHECKING
from .numpy import NumpyCodec, NumpyRequestCodec
from .pandas import PandasCodec
from .string import StringCodec, StringRequestCodec

@@ -27,2 +28,5 @@ from .base64 import Base64Codec

if TYPE_CHECKING: # pragma: no cover - type checking only
from .pandas import PandasCodec # noqa: F401
__all__ = [

@@ -53,1 +57,20 @@ "CodecError",

]
def __getattr__(name: str): # pragma: no cover - lightweight lazy import
if name == "PandasCodec":
return _load_pandas_codec()
raise AttributeError(f"module 'mlserver.codecs' has no attribute {name!r}")
def _load_pandas_codec():
try:
from .pandas import PandasCodec as _PandasCodec # Local import to stay optional
except Exception as exc: # pragma: no cover - propagate useful context
raise ImportError(
"PandasCodec requires the optional 'pandas' dependency"
) from exc
globals()["PandasCodec"] = _PandasCodec
return _PandasCodec

@@ -118,3 +118,3 @@ import pandas as pd

use_bytes: bool = True,
**kwargs
**kwargs,
) -> InferenceResponse:

@@ -121,0 +121,0 @@ outputs = cls.encode_outputs(payload, use_bytes=use_bytes)

@@ -7,10 +7,17 @@ """

import builtins
import collections.abc
import google.protobuf.descriptor
import google.protobuf.internal.containers
import google.protobuf.message
import sys
import typing
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor = ...
if sys.version_info >= (3, 10):
import typing as typing_extensions
else:
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing.final
class ServerLiveRequest(google.protobuf.message.Message):

@@ -21,3 +28,4 @@ """

DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
def __init__(

@@ -27,10 +35,11 @@ self,

global___ServerLiveRequest = ServerLiveRequest
Global___ServerLiveRequest: typing_extensions.TypeAlias = ServerLiveRequest
@typing.final
class ServerLiveResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
LIVE_FIELD_NUMBER: builtins.int
live: builtins.bool = ...
live: builtins.bool
"""True if the inference server is live, false if not live."""
def __init__(

@@ -41,8 +50,7 @@ self,

) -> None: ...
def ClearField(
self, field_name: typing_extensions.Literal["live", b"live"]
) -> None: ...
def ClearField(self, field_name: typing.Literal["live", b"live"]) -> None: ...
global___ServerLiveResponse = ServerLiveResponse
Global___ServerLiveResponse: typing_extensions.TypeAlias = ServerLiveResponse
@typing.final
class ServerReadyRequest(google.protobuf.message.Message):

@@ -53,3 +61,4 @@ """

DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
def __init__(

@@ -59,10 +68,11 @@ self,

global___ServerReadyRequest = ServerReadyRequest
Global___ServerReadyRequest: typing_extensions.TypeAlias = ServerReadyRequest
@typing.final
class ServerReadyResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
READY_FIELD_NUMBER: builtins.int
ready: builtins.bool = ...
ready: builtins.bool
"""True if the inference server is ready, false if not ready."""
def __init__(

@@ -73,8 +83,7 @@ self,

) -> None: ...
def ClearField(
self, field_name: typing_extensions.Literal["ready", b"ready"]
) -> None: ...
def ClearField(self, field_name: typing.Literal["ready", b"ready"]) -> None: ...
global___ServerReadyResponse = ServerReadyResponse
Global___ServerReadyResponse: typing_extensions.TypeAlias = ServerReadyResponse
@typing.final
class ModelReadyRequest(google.protobuf.message.Message):

@@ -85,32 +94,31 @@ """

DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
NAME_FIELD_NUMBER: builtins.int
VERSION_FIELD_NUMBER: builtins.int
name: typing.Text = ...
name: builtins.str
"""The name of the model to check for readiness."""
version: typing.Text = ...
version: builtins.str
"""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.
"""
def __init__(
self,
*,
name: typing.Text = ...,
version: typing.Text = ...,
name: builtins.str = ...,
version: builtins.str = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal["name", b"name", "version", b"version"],
self, field_name: typing.Literal["name", b"name", "version", b"version"]
) -> None: ...
global___ModelReadyRequest = ModelReadyRequest
Global___ModelReadyRequest: typing_extensions.TypeAlias = ModelReadyRequest
@typing.final
class ModelReadyResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
READY_FIELD_NUMBER: builtins.int
ready: builtins.bool = ...
ready: builtins.bool
"""True if the model is ready, false if not ready."""
def __init__(

@@ -121,8 +129,7 @@ self,

) -> None: ...
def ClearField(
self, field_name: typing_extensions.Literal["ready", b"ready"]
) -> None: ...
def ClearField(self, field_name: typing.Literal["ready", b"ready"]) -> None: ...
global___ModelReadyResponse = ModelReadyResponse
Global___ModelReadyResponse: typing_extensions.TypeAlias = ModelReadyResponse
@typing.final
class ServerMetadataRequest(google.protobuf.message.Message):

@@ -133,3 +140,4 @@ """

DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
def __init__(

@@ -139,21 +147,20 @@ self,

global___ServerMetadataRequest = ServerMetadataRequest
Global___ServerMetadataRequest: typing_extensions.TypeAlias = ServerMetadataRequest
@typing.final
class ServerMetadataResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
NAME_FIELD_NUMBER: builtins.int
VERSION_FIELD_NUMBER: builtins.int
EXTENSIONS_FIELD_NUMBER: builtins.int
name: typing.Text = ...
name: builtins.str
"""The server name."""
version: typing.Text = ...
version: builtins.str
"""The server version."""
@property
def extensions(
self,
) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]:
) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
"""The extensions supported by the server."""
pass

@@ -163,9 +170,9 @@ def __init__(

*,
name: typing.Text = ...,
version: typing.Text = ...,
extensions: typing.Optional[typing.Iterable[typing.Text]] = ...,
name: builtins.str = ...,
version: builtins.str = ...,
extensions: collections.abc.Iterable[builtins.str] | None = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"extensions", b"extensions", "name", b"name", "version", b"version"

@@ -175,4 +182,5 @@ ],

global___ServerMetadataResponse = ServerMetadataResponse
Global___ServerMetadataResponse: typing_extensions.TypeAlias = ServerMetadataResponse
@typing.final
class ModelMetadataRequest(google.protobuf.message.Message):

@@ -183,53 +191,54 @@ """

DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
NAME_FIELD_NUMBER: builtins.int
VERSION_FIELD_NUMBER: builtins.int
name: typing.Text = ...
name: builtins.str
"""The name of the model."""
version: typing.Text = ...
version: builtins.str
"""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.
"""
def __init__(
self,
*,
name: typing.Text = ...,
version: typing.Text = ...,
name: builtins.str = ...,
version: builtins.str = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal["name", b"name", "version", b"version"],
self, field_name: typing.Literal["name", b"name", "version", b"version"]
) -> None: ...
global___ModelMetadataRequest = ModelMetadataRequest
Global___ModelMetadataRequest: typing_extensions.TypeAlias = ModelMetadataRequest
@typing.final
class ModelMetadataResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing.final
class TensorMetadata(google.protobuf.message.Message):
"""Metadata for a tensor."""
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing.final
class ParametersEntry(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
KEY_FIELD_NUMBER: builtins.int
VALUE_FIELD_NUMBER: builtins.int
key: typing.Text = ...
key: builtins.str
@property
def value(self) -> global___InferParameter: ...
def value(self) -> Global___InferParameter: ...
def __init__(
self,
*,
key: typing.Text = ...,
value: typing.Optional[global___InferParameter] = ...,
key: builtins.str = ...,
value: Global___InferParameter | None = ...,
) -> None: ...
def HasField(
self, field_name: typing_extensions.Literal["value", b"value"]
self, field_name: typing.Literal["value", b"value"]
) -> builtins.bool: ...
def ClearField(
self,
field_name: typing_extensions.Literal["key", b"key", "value", b"value"],
self, field_name: typing.Literal["key", b"key", "value", b"value"]
) -> None: ...

@@ -241,8 +250,6 @@

PARAMETERS_FIELD_NUMBER: builtins.int
name: typing.Text = ...
name: builtins.str
"""The tensor name."""
datatype: typing.Text = ...
datatype: builtins.str
"""The tensor data type."""
@property

@@ -257,3 +264,2 @@ def shape(

"""
pass

@@ -264,3 +270,3 @@ @property

) -> google.protobuf.internal.containers.MessageMap[
typing.Text, global___InferParameter
builtins.str, Global___InferParameter
]:

@@ -270,3 +276,2 @@ """Optional default parameters for input.

"""
pass

@@ -276,12 +281,12 @@ def __init__(

*,
name: typing.Text = ...,
datatype: typing.Text = ...,
shape: typing.Optional[typing.Iterable[builtins.int]] = ...,
parameters: typing.Optional[
typing.Mapping[typing.Text, global___InferParameter]
] = ...,
name: builtins.str = ...,
datatype: builtins.str = ...,
shape: collections.abc.Iterable[builtins.int] | None = ...,
parameters: (
collections.abc.Mapping[builtins.str, Global___InferParameter] | None
) = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"datatype",

@@ -298,21 +303,22 @@ b"datatype",

@typing.final
class ParametersEntry(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
KEY_FIELD_NUMBER: builtins.int
VALUE_FIELD_NUMBER: builtins.int
key: typing.Text = ...
key: builtins.str
@property
def value(self) -> global___InferParameter: ...
def value(self) -> Global___InferParameter: ...
def __init__(
self,
*,
key: typing.Text = ...,
value: typing.Optional[global___InferParameter] = ...,
key: builtins.str = ...,
value: Global___InferParameter | None = ...,
) -> None: ...
def HasField(
self, field_name: typing_extensions.Literal["value", b"value"]
self, field_name: typing.Literal["value", b"value"]
) -> builtins.bool: ...
def ClearField(
self,
field_name: typing_extensions.Literal["key", b"key", "value", b"value"],
self, field_name: typing.Literal["key", b"key", "value", b"value"]
) -> None: ...

@@ -326,13 +332,11 @@

PARAMETERS_FIELD_NUMBER: builtins.int
name: typing.Text = ...
name: builtins.str
"""The model name."""
platform: builtins.str
"""The model's platform. See Platforms."""
@property
def versions(
self,
) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]:
) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
"""The versions of the model available on the server."""
pass
platform: typing.Text = ...
"""The model's platform. See Platforms."""

@@ -343,6 +347,5 @@ @property

) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[
global___ModelMetadataResponse.TensorMetadata
Global___ModelMetadataResponse.TensorMetadata
]:
"""The model's inputs."""
pass

@@ -353,6 +356,5 @@ @property

) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[
global___ModelMetadataResponse.TensorMetadata
Global___ModelMetadataResponse.TensorMetadata
]:
"""The model's outputs."""
pass

@@ -363,3 +365,3 @@ @property

) -> google.protobuf.internal.containers.MessageMap[
typing.Text, global___InferParameter
builtins.str, Global___InferParameter
]:

@@ -369,3 +371,2 @@ """Optional default parameters for the request / response.

"""
pass

@@ -375,18 +376,20 @@ def __init__(

*,
name: typing.Text = ...,
versions: typing.Optional[typing.Iterable[typing.Text]] = ...,
platform: typing.Text = ...,
inputs: typing.Optional[
typing.Iterable[global___ModelMetadataResponse.TensorMetadata]
] = ...,
outputs: typing.Optional[
typing.Iterable[global___ModelMetadataResponse.TensorMetadata]
] = ...,
parameters: typing.Optional[
typing.Mapping[typing.Text, global___InferParameter]
] = ...,
name: builtins.str = ...,
versions: collections.abc.Iterable[builtins.str] | None = ...,
platform: builtins.str = ...,
inputs: (
collections.abc.Iterable[Global___ModelMetadataResponse.TensorMetadata]
| None
) = ...,
outputs: (
collections.abc.Iterable[Global___ModelMetadataResponse.TensorMetadata]
| None
) = ...,
parameters: (
collections.abc.Mapping[builtins.str, Global___InferParameter] | None
) = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"inputs",

@@ -407,4 +410,5 @@ b"inputs",

global___ModelMetadataResponse = ModelMetadataResponse
Global___ModelMetadataResponse: typing_extensions.TypeAlias = ModelMetadataResponse
@typing.final
class ModelInferRequest(google.protobuf.message.Message):

@@ -415,28 +419,30 @@ """

DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing.final
class InferInputTensor(google.protobuf.message.Message):
"""An input tensor for an inference request."""
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing.final
class ParametersEntry(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
KEY_FIELD_NUMBER: builtins.int
VALUE_FIELD_NUMBER: builtins.int
key: typing.Text = ...
key: builtins.str
@property
def value(self) -> global___InferParameter: ...
def value(self) -> Global___InferParameter: ...
def __init__(
self,
*,
key: typing.Text = ...,
value: typing.Optional[global___InferParameter] = ...,
key: builtins.str = ...,
value: Global___InferParameter | None = ...,
) -> None: ...
def HasField(
self, field_name: typing_extensions.Literal["value", b"value"]
self, field_name: typing.Literal["value", b"value"]
) -> builtins.bool: ...
def ClearField(
self,
field_name: typing_extensions.Literal["key", b"key", "value", b"value"],
self, field_name: typing.Literal["key", b"key", "value", b"value"]
) -> None: ...

@@ -449,8 +455,6 @@

CONTENTS_FIELD_NUMBER: builtins.int
name: typing.Text = ...
name: builtins.str
"""The tensor name."""
datatype: typing.Text = ...
datatype: builtins.str
"""The tensor data type."""
@property

@@ -463,3 +467,2 @@ def shape(

"""The tensor shape."""
pass

@@ -470,9 +473,8 @@ @property

) -> google.protobuf.internal.containers.MessageMap[
typing.Text, global___InferParameter
builtins.str, Global___InferParameter
]:
"""Optional inference input tensor parameters."""
pass
@property
def contents(self) -> global___InferTensorContents:
def contents(self) -> Global___InferTensorContents:
"""The input tensor data.

@@ -482,3 +484,2 @@ This field must not be specified if tensor contents are being specified

"""
pass

@@ -488,16 +489,16 @@ def __init__(

*,
name: typing.Text = ...,
datatype: typing.Text = ...,
shape: typing.Optional[typing.Iterable[builtins.int]] = ...,
parameters: typing.Optional[
typing.Mapping[typing.Text, global___InferParameter]
] = ...,
contents: typing.Optional[global___InferTensorContents] = ...,
name: builtins.str = ...,
datatype: builtins.str = ...,
shape: collections.abc.Iterable[builtins.int] | None = ...,
parameters: (
collections.abc.Mapping[builtins.str, Global___InferParameter] | None
) = ...,
contents: Global___InferTensorContents | None = ...,
) -> None: ...
def HasField(
self, field_name: typing_extensions.Literal["contents", b"contents"]
self, field_name: typing.Literal["contents", b"contents"]
) -> builtins.bool: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"contents",

@@ -516,26 +517,28 @@ b"contents",

@typing.final
class InferRequestedOutputTensor(google.protobuf.message.Message):
"""An output tensor requested for an inference request."""
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing.final
class ParametersEntry(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
KEY_FIELD_NUMBER: builtins.int
VALUE_FIELD_NUMBER: builtins.int
key: typing.Text = ...
key: builtins.str
@property
def value(self) -> global___InferParameter: ...
def value(self) -> Global___InferParameter: ...
def __init__(
self,
*,
key: typing.Text = ...,
value: typing.Optional[global___InferParameter] = ...,
key: builtins.str = ...,
value: Global___InferParameter | None = ...,
) -> None: ...
def HasField(
self, field_name: typing_extensions.Literal["value", b"value"]
self, field_name: typing.Literal["value", b"value"]
) -> builtins.bool: ...
def ClearField(
self,
field_name: typing_extensions.Literal["key", b"key", "value", b"value"],
self, field_name: typing.Literal["key", b"key", "value", b"value"]
) -> None: ...

@@ -545,5 +548,4 @@

PARAMETERS_FIELD_NUMBER: builtins.int
name: typing.Text = ...
name: builtins.str
"""The tensor name."""
@property

@@ -553,6 +555,5 @@ def parameters(

) -> google.protobuf.internal.containers.MessageMap[
typing.Text, global___InferParameter
builtins.str, Global___InferParameter
]:
"""Optional requested output tensor parameters."""
pass

@@ -562,33 +563,32 @@ def __init__(

*,
name: typing.Text = ...,
parameters: typing.Optional[
typing.Mapping[typing.Text, global___InferParameter]
] = ...,
name: builtins.str = ...,
parameters: (
collections.abc.Mapping[builtins.str, Global___InferParameter] | None
) = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
"name", b"name", "parameters", b"parameters"
],
field_name: typing.Literal["name", b"name", "parameters", b"parameters"],
) -> None: ...
@typing.final
class ParametersEntry(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
KEY_FIELD_NUMBER: builtins.int
VALUE_FIELD_NUMBER: builtins.int
key: typing.Text = ...
key: builtins.str
@property
def value(self) -> global___InferParameter: ...
def value(self) -> Global___InferParameter: ...
def __init__(
self,
*,
key: typing.Text = ...,
value: typing.Optional[global___InferParameter] = ...,
key: builtins.str = ...,
value: Global___InferParameter | None = ...,
) -> None: ...
def HasField(
self, field_name: typing_extensions.Literal["value", b"value"]
self, field_name: typing.Literal["value", b"value"]
) -> builtins.bool: ...
def ClearField(
self,
field_name: typing_extensions.Literal["key", b"key", "value", b"value"],
self, field_name: typing.Literal["key", b"key", "value", b"value"]
) -> None: ...

@@ -603,15 +603,12 @@

RAW_INPUT_CONTENTS_FIELD_NUMBER: builtins.int
model_name: typing.Text = ...
model_name: builtins.str
"""The name of the model to use for inferencing."""
model_version: typing.Text = ...
model_version: builtins.str
"""The version of the model to use for inference. If not given the
server will choose a version based on the model and internal policy.
"""
id: typing.Text = ...
id: builtins.str
"""Optional identifier for the request. If specified will be
returned in the response.
"""
@property

@@ -621,6 +618,5 @@ def parameters(

) -> google.protobuf.internal.containers.MessageMap[
typing.Text, global___InferParameter
builtins.str, Global___InferParameter
]:
"""Optional inference parameters."""
pass

@@ -631,6 +627,5 @@ @property

) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[
global___ModelInferRequest.InferInputTensor
Global___ModelInferRequest.InferInputTensor
]:
"""The input tensors for the inference."""
pass

@@ -641,3 +636,3 @@ @property

) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[
global___ModelInferRequest.InferRequestedOutputTensor
Global___ModelInferRequest.InferRequestedOutputTensor
]:

@@ -647,3 +642,2 @@ """The requested output tensors for the inference. Optional, if not

"""
pass

@@ -674,3 +668,2 @@ @property

"""
pass

@@ -680,19 +673,22 @@ def __init__(

*,
model_name: typing.Text = ...,
model_version: typing.Text = ...,
id: typing.Text = ...,
parameters: typing.Optional[
typing.Mapping[typing.Text, global___InferParameter]
] = ...,
inputs: typing.Optional[
typing.Iterable[global___ModelInferRequest.InferInputTensor]
] = ...,
outputs: typing.Optional[
typing.Iterable[global___ModelInferRequest.InferRequestedOutputTensor]
] = ...,
raw_input_contents: typing.Optional[typing.Iterable[builtins.bytes]] = ...,
model_name: builtins.str = ...,
model_version: builtins.str = ...,
id: builtins.str = ...,
parameters: (
collections.abc.Mapping[builtins.str, Global___InferParameter] | None
) = ...,
inputs: (
collections.abc.Iterable[Global___ModelInferRequest.InferInputTensor] | None
) = ...,
outputs: (
collections.abc.Iterable[
Global___ModelInferRequest.InferRequestedOutputTensor
]
| None
) = ...,
raw_input_contents: collections.abc.Iterable[builtins.bytes] | None = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"id",

@@ -715,31 +711,34 @@ b"id",

global___ModelInferRequest = ModelInferRequest
Global___ModelInferRequest: typing_extensions.TypeAlias = ModelInferRequest
@typing.final
class ModelInferResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing.final
class InferOutputTensor(google.protobuf.message.Message):
"""An output tensor returned for an inference request."""
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing.final
class ParametersEntry(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
KEY_FIELD_NUMBER: builtins.int
VALUE_FIELD_NUMBER: builtins.int
key: typing.Text = ...
key: builtins.str
@property
def value(self) -> global___InferParameter: ...
def value(self) -> Global___InferParameter: ...
def __init__(
self,
*,
key: typing.Text = ...,
value: typing.Optional[global___InferParameter] = ...,
key: builtins.str = ...,
value: Global___InferParameter | None = ...,
) -> None: ...
def HasField(
self, field_name: typing_extensions.Literal["value", b"value"]
self, field_name: typing.Literal["value", b"value"]
) -> builtins.bool: ...
def ClearField(
self,
field_name: typing_extensions.Literal["key", b"key", "value", b"value"],
self, field_name: typing.Literal["key", b"key", "value", b"value"]
) -> None: ...

@@ -752,8 +751,6 @@

CONTENTS_FIELD_NUMBER: builtins.int
name: typing.Text = ...
name: builtins.str
"""The tensor name."""
datatype: typing.Text = ...
datatype: builtins.str
"""The tensor data type."""
@property

@@ -766,3 +763,2 @@ def shape(

"""The tensor shape."""
pass

@@ -773,9 +769,8 @@ @property

) -> google.protobuf.internal.containers.MessageMap[
typing.Text, global___InferParameter
builtins.str, Global___InferParameter
]:
"""Optional output tensor parameters."""
pass
@property
def contents(self) -> global___InferTensorContents:
def contents(self) -> Global___InferTensorContents:
"""The output tensor data.

@@ -785,3 +780,2 @@ This field must not be specified if tensor contents are being specified

"""
pass

@@ -791,16 +785,16 @@ def __init__(

*,
name: typing.Text = ...,
datatype: typing.Text = ...,
shape: typing.Optional[typing.Iterable[builtins.int]] = ...,
parameters: typing.Optional[
typing.Mapping[typing.Text, global___InferParameter]
] = ...,
contents: typing.Optional[global___InferTensorContents] = ...,
name: builtins.str = ...,
datatype: builtins.str = ...,
shape: collections.abc.Iterable[builtins.int] | None = ...,
parameters: (
collections.abc.Mapping[builtins.str, Global___InferParameter] | None
) = ...,
contents: Global___InferTensorContents | None = ...,
) -> None: ...
def HasField(
self, field_name: typing_extensions.Literal["contents", b"contents"]
self, field_name: typing.Literal["contents", b"contents"]
) -> builtins.bool: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"contents",

@@ -819,21 +813,22 @@ b"contents",

@typing.final
class ParametersEntry(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
KEY_FIELD_NUMBER: builtins.int
VALUE_FIELD_NUMBER: builtins.int
key: typing.Text = ...
key: builtins.str
@property
def value(self) -> global___InferParameter: ...
def value(self) -> Global___InferParameter: ...
def __init__(
self,
*,
key: typing.Text = ...,
value: typing.Optional[global___InferParameter] = ...,
key: builtins.str = ...,
value: Global___InferParameter | None = ...,
) -> None: ...
def HasField(
self, field_name: typing_extensions.Literal["value", b"value"]
self, field_name: typing.Literal["value", b"value"]
) -> builtins.bool: ...
def ClearField(
self,
field_name: typing_extensions.Literal["key", b"key", "value", b"value"],
self, field_name: typing.Literal["key", b"key", "value", b"value"]
) -> None: ...

@@ -847,11 +842,8 @@

RAW_OUTPUT_CONTENTS_FIELD_NUMBER: builtins.int
model_name: typing.Text = ...
model_name: builtins.str
"""The name of the model used for inference."""
model_version: typing.Text = ...
model_version: builtins.str
"""The version of the model used for inference."""
id: typing.Text = ...
id: builtins.str
"""The id of the inference request if one was specified."""
@property

@@ -861,6 +853,5 @@ def parameters(

) -> google.protobuf.internal.containers.MessageMap[
typing.Text, global___InferParameter
builtins.str, Global___InferParameter
]:
"""Optional inference response parameters."""
pass

@@ -871,6 +862,5 @@ @property

) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[
global___ModelInferResponse.InferOutputTensor
Global___ModelInferResponse.InferOutputTensor
]:
"""The output tensors holding inference results."""
pass

@@ -901,3 +891,2 @@ @property

"""
pass

@@ -907,16 +896,17 @@ def __init__(

*,
model_name: typing.Text = ...,
model_version: typing.Text = ...,
id: typing.Text = ...,
parameters: typing.Optional[
typing.Mapping[typing.Text, global___InferParameter]
] = ...,
outputs: typing.Optional[
typing.Iterable[global___ModelInferResponse.InferOutputTensor]
] = ...,
raw_output_contents: typing.Optional[typing.Iterable[builtins.bytes]] = ...,
model_name: builtins.str = ...,
model_version: builtins.str = ...,
id: builtins.str = ...,
parameters: (
collections.abc.Mapping[builtins.str, Global___InferParameter] | None
) = ...,
outputs: (
collections.abc.Iterable[Global___ModelInferResponse.InferOutputTensor]
| None
) = ...,
raw_output_contents: collections.abc.Iterable[builtins.bytes] | None = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"id",

@@ -937,4 +927,5 @@ b"id",

global___ModelInferResponse = ModelInferResponse
Global___ModelInferResponse: typing_extensions.TypeAlias = ModelInferResponse
@typing.final
class InferParameter(google.protobuf.message.Message):

@@ -945,15 +936,13 @@ """

DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
BOOL_PARAM_FIELD_NUMBER: builtins.int
INT64_PARAM_FIELD_NUMBER: builtins.int
STRING_PARAM_FIELD_NUMBER: builtins.int
bool_param: builtins.bool = ...
bool_param: builtins.bool
"""A boolean parameter value."""
int64_param: builtins.int = ...
int64_param: builtins.int
"""An int64 parameter value."""
string_param: typing.Text = ...
string_param: builtins.str
"""A string parameter value."""
def __init__(

@@ -964,7 +953,7 @@ self,

int64_param: builtins.int = ...,
string_param: typing.Text = ...,
string_param: builtins.str = ...,
) -> None: ...
def HasField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"bool_param",

@@ -982,3 +971,3 @@ b"bool_param",

self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"bool_param",

@@ -995,10 +984,8 @@ b"bool_param",

def WhichOneof(
self,
oneof_group: typing_extensions.Literal["parameter_choice", b"parameter_choice"],
) -> typing.Optional[
typing_extensions.Literal["bool_param", "int64_param", "string_param"]
]: ...
self, oneof_group: typing.Literal["parameter_choice", b"parameter_choice"]
) -> typing.Literal["bool_param", "int64_param", "string_param"] | None: ...
global___InferParameter = InferParameter
Global___InferParameter: typing_extensions.TypeAlias = InferParameter
@typing.final
class InferTensorContents(google.protobuf.message.Message):

@@ -1012,3 +999,4 @@ """

DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
BOOL_CONTENTS_FIELD_NUMBER: builtins.int

@@ -1032,3 +1020,2 @@ INT_CONTENTS_FIELD_NUMBER: builtins.int

"""
pass

@@ -1044,3 +1031,2 @@ @property

"""
pass

@@ -1055,3 +1041,2 @@ @property

"""
pass

@@ -1067,3 +1052,2 @@ @property

"""
pass

@@ -1078,3 +1062,2 @@ @property

"""
pass

@@ -1091,3 +1074,2 @@ @property

"""
pass

@@ -1104,3 +1086,2 @@ @property

"""
pass

@@ -1117,3 +1098,2 @@ @property

"""
pass

@@ -1123,14 +1103,14 @@ def __init__(

*,
bool_contents: typing.Optional[typing.Iterable[builtins.bool]] = ...,
int_contents: typing.Optional[typing.Iterable[builtins.int]] = ...,
int64_contents: typing.Optional[typing.Iterable[builtins.int]] = ...,
uint_contents: typing.Optional[typing.Iterable[builtins.int]] = ...,
uint64_contents: typing.Optional[typing.Iterable[builtins.int]] = ...,
fp32_contents: typing.Optional[typing.Iterable[builtins.float]] = ...,
fp64_contents: typing.Optional[typing.Iterable[builtins.float]] = ...,
bytes_contents: typing.Optional[typing.Iterable[builtins.bytes]] = ...,
bool_contents: collections.abc.Iterable[builtins.bool] | None = ...,
int_contents: collections.abc.Iterable[builtins.int] | None = ...,
int64_contents: collections.abc.Iterable[builtins.int] | None = ...,
uint_contents: collections.abc.Iterable[builtins.int] | None = ...,
uint64_contents: collections.abc.Iterable[builtins.int] | None = ...,
fp32_contents: collections.abc.Iterable[builtins.float] | None = ...,
fp64_contents: collections.abc.Iterable[builtins.float] | None = ...,
bytes_contents: collections.abc.Iterable[builtins.bytes] | None = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"bool_contents",

@@ -1155,4 +1135,5 @@ b"bool_contents",

global___InferTensorContents = InferTensorContents
Global___InferTensorContents: typing_extensions.TypeAlias = InferTensorContents
@typing.final
class ModelRepositoryParameter(google.protobuf.message.Message):

@@ -1169,3 +1150,4 @@ """

DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
BOOL_PARAM_FIELD_NUMBER: builtins.int

@@ -1175,14 +1157,10 @@ INT64_PARAM_FIELD_NUMBER: builtins.int

BYTES_PARAM_FIELD_NUMBER: builtins.int
bool_param: builtins.bool = ...
bool_param: builtins.bool
"""A boolean parameter value."""
int64_param: builtins.int = ...
int64_param: builtins.int
"""An int64 parameter value."""
string_param: typing.Text = ...
string_param: builtins.str
"""A string parameter value."""
bytes_param: builtins.bytes = ...
bytes_param: builtins.bytes
"""A bytes parameter value."""
def __init__(

@@ -1193,3 +1171,3 @@ self,

int64_param: builtins.int = ...,
string_param: typing.Text = ...,
string_param: builtins.str = ...,
bytes_param: builtins.bytes = ...,

@@ -1199,3 +1177,3 @@ ) -> None: ...

self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"bool_param",

@@ -1215,3 +1193,3 @@ b"bool_param",

self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"bool_param",

@@ -1230,28 +1208,28 @@ b"bool_param",

def WhichOneof(
self,
oneof_group: typing_extensions.Literal["parameter_choice", b"parameter_choice"],
) -> typing.Optional[
typing_extensions.Literal[
"bool_param", "int64_param", "string_param", "bytes_param"
]
]: ...
self, oneof_group: typing.Literal["parameter_choice", b"parameter_choice"]
) -> (
typing.Literal["bool_param", "int64_param", "string_param", "bytes_param"]
| None
): ...
global___ModelRepositoryParameter = ModelRepositoryParameter
Global___ModelRepositoryParameter: typing_extensions.TypeAlias = (
ModelRepositoryParameter
)
@typing.final
class RepositoryIndexRequest(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
REPOSITORY_NAME_FIELD_NUMBER: builtins.int
READY_FIELD_NUMBER: builtins.int
repository_name: typing.Text = ...
repository_name: builtins.str
"""The name of the repository. If empty the index is returned
for all repositories.
"""
ready: builtins.bool = ...
ready: builtins.bool
"""If true return only models currently ready for inferencing."""
def __init__(
self,
*,
repository_name: typing.Text = ...,
repository_name: builtins.str = ...,
ready: builtins.bool = ...,

@@ -1261,3 +1239,3 @@ ) -> None: ...

self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"ready", b"ready", "repository_name", b"repository_name"

@@ -1267,11 +1245,14 @@ ],

global___RepositoryIndexRequest = RepositoryIndexRequest
Global___RepositoryIndexRequest: typing_extensions.TypeAlias = RepositoryIndexRequest
@typing.final
class RepositoryIndexResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing.final
class ModelIndex(google.protobuf.message.Message):
"""Index entry for a model."""
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
NAME_FIELD_NUMBER: builtins.int

@@ -1281,25 +1262,21 @@ VERSION_FIELD_NUMBER: builtins.int

REASON_FIELD_NUMBER: builtins.int
name: typing.Text = ...
name: builtins.str
"""The name of the model."""
version: typing.Text = ...
version: builtins.str
"""The version of the model."""
state: typing.Text = ...
state: builtins.str
"""The state of the model."""
reason: typing.Text = ...
reason: builtins.str
"""The reason, if any, that the model is in the given state."""
def __init__(
self,
*,
name: typing.Text = ...,
version: typing.Text = ...,
state: typing.Text = ...,
reason: typing.Text = ...,
name: builtins.str = ...,
version: builtins.str = ...,
state: builtins.str = ...,
reason: builtins.str = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"name",

@@ -1321,6 +1298,5 @@ b"name",

) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[
global___RepositoryIndexResponse.ModelIndex
Global___RepositoryIndexResponse.ModelIndex
]:
"""An index entry for each model."""
pass

@@ -1330,34 +1306,34 @@ def __init__(

*,
models: typing.Optional[
typing.Iterable[global___RepositoryIndexResponse.ModelIndex]
] = ...,
models: (
collections.abc.Iterable[Global___RepositoryIndexResponse.ModelIndex] | None
) = ...,
) -> None: ...
def ClearField(
self, field_name: typing_extensions.Literal["models", b"models"]
) -> None: ...
def ClearField(self, field_name: typing.Literal["models", b"models"]) -> None: ...
global___RepositoryIndexResponse = RepositoryIndexResponse
Global___RepositoryIndexResponse: typing_extensions.TypeAlias = RepositoryIndexResponse
@typing.final
class RepositoryModelLoadRequest(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing.final
class ParametersEntry(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
KEY_FIELD_NUMBER: builtins.int
VALUE_FIELD_NUMBER: builtins.int
key: typing.Text = ...
key: builtins.str
@property
def value(self) -> global___ModelRepositoryParameter: ...
def value(self) -> Global___ModelRepositoryParameter: ...
def __init__(
self,
*,
key: typing.Text = ...,
value: typing.Optional[global___ModelRepositoryParameter] = ...,
key: builtins.str = ...,
value: Global___ModelRepositoryParameter | None = ...,
) -> None: ...
def HasField(
self, field_name: typing_extensions.Literal["value", b"value"]
self, field_name: typing.Literal["value", b"value"]
) -> builtins.bool: ...
def ClearField(
self,
field_name: typing_extensions.Literal["key", b"key", "value", b"value"],
self, field_name: typing.Literal["key", b"key", "value", b"value"]
) -> None: ...

@@ -1368,10 +1344,8 @@

PARAMETERS_FIELD_NUMBER: builtins.int
repository_name: typing.Text = ...
repository_name: builtins.str
"""The name of the repository to load from. If empty the model
is loaded from any repository.
"""
model_name: typing.Text = ...
model_name: builtins.str
"""The name of the model to load, or reload."""
@property

@@ -1381,6 +1355,5 @@ def parameters(

) -> google.protobuf.internal.containers.MessageMap[
typing.Text, global___ModelRepositoryParameter
builtins.str, Global___ModelRepositoryParameter
]:
"""Optional model repository request parameters."""
pass

@@ -1390,11 +1363,12 @@ def __init__(

*,
repository_name: typing.Text = ...,
model_name: typing.Text = ...,
parameters: typing.Optional[
typing.Mapping[typing.Text, global___ModelRepositoryParameter]
] = ...,
repository_name: builtins.str = ...,
model_name: builtins.str = ...,
parameters: (
collections.abc.Mapping[builtins.str, Global___ModelRepositoryParameter]
| None
) = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"model_name",

@@ -1409,6 +1383,10 @@ b"model_name",

global___RepositoryModelLoadRequest = RepositoryModelLoadRequest
Global___RepositoryModelLoadRequest: typing_extensions.TypeAlias = (
RepositoryModelLoadRequest
)
@typing.final
class RepositoryModelLoadResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
def __init__(

@@ -1418,26 +1396,30 @@ self,

global___RepositoryModelLoadResponse = RepositoryModelLoadResponse
Global___RepositoryModelLoadResponse: typing_extensions.TypeAlias = (
RepositoryModelLoadResponse
)
@typing.final
class RepositoryModelUnloadRequest(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing.final
class ParametersEntry(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
KEY_FIELD_NUMBER: builtins.int
VALUE_FIELD_NUMBER: builtins.int
key: typing.Text = ...
key: builtins.str
@property
def value(self) -> global___ModelRepositoryParameter: ...
def value(self) -> Global___ModelRepositoryParameter: ...
def __init__(
self,
*,
key: typing.Text = ...,
value: typing.Optional[global___ModelRepositoryParameter] = ...,
key: builtins.str = ...,
value: Global___ModelRepositoryParameter | None = ...,
) -> None: ...
def HasField(
self, field_name: typing_extensions.Literal["value", b"value"]
self, field_name: typing.Literal["value", b"value"]
) -> builtins.bool: ...
def ClearField(
self,
field_name: typing_extensions.Literal["key", b"key", "value", b"value"],
self, field_name: typing.Literal["key", b"key", "value", b"value"]
) -> None: ...

@@ -1448,10 +1430,8 @@

PARAMETERS_FIELD_NUMBER: builtins.int
repository_name: typing.Text = ...
repository_name: builtins.str
"""The name of the repository from which the model was originally
loaded. If empty the repository is not considered.
"""
model_name: typing.Text = ...
model_name: builtins.str
"""The name of the model to unload."""
@property

@@ -1461,6 +1441,5 @@ def parameters(

) -> google.protobuf.internal.containers.MessageMap[
typing.Text, global___ModelRepositoryParameter
builtins.str, Global___ModelRepositoryParameter
]:
"""Optional model repository request parameters."""
pass

@@ -1470,11 +1449,12 @@ def __init__(

*,
repository_name: typing.Text = ...,
model_name: typing.Text = ...,
parameters: typing.Optional[
typing.Mapping[typing.Text, global___ModelRepositoryParameter]
] = ...,
repository_name: builtins.str = ...,
model_name: builtins.str = ...,
parameters: (
collections.abc.Mapping[builtins.str, Global___ModelRepositoryParameter]
| None
) = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"model_name",

@@ -1489,6 +1469,10 @@ b"model_name",

global___RepositoryModelUnloadRequest = RepositoryModelUnloadRequest
Global___RepositoryModelUnloadRequest: typing_extensions.TypeAlias = (
RepositoryModelUnloadRequest
)
@typing.final
class RepositoryModelUnloadResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
def __init__(

@@ -1498,2 +1482,4 @@ self,

global___RepositoryModelUnloadResponse = RepositoryModelUnloadResponse
Global___RepositoryModelUnloadResponse: typing_extensions.TypeAlias = (
RepositoryModelUnloadResponse
)

@@ -7,26 +7,32 @@ """

import builtins
import collections.abc
import google.protobuf.descriptor
import google.protobuf.internal.containers
import google.protobuf.message
import sys
import typing
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor = ...
if sys.version_info >= (3, 10):
import typing as typing_extensions
else:
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing.final
class RepositoryIndexRequest(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
REPOSITORY_NAME_FIELD_NUMBER: builtins.int
READY_FIELD_NUMBER: builtins.int
repository_name: typing.Text = ...
repository_name: builtins.str
"""The name of the repository. If empty the index is returned
for all repositories.
"""
ready: builtins.bool = ...
ready: builtins.bool
"""If true return only models currently ready for inferencing."""
def __init__(
self,
*,
repository_name: typing.Text = ...,
repository_name: builtins.str = ...,
ready: builtins.bool = ...,

@@ -36,3 +42,3 @@ ) -> None: ...

self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"ready", b"ready", "repository_name", b"repository_name"

@@ -42,11 +48,14 @@ ],

global___RepositoryIndexRequest = RepositoryIndexRequest
Global___RepositoryIndexRequest: typing_extensions.TypeAlias = RepositoryIndexRequest
@typing.final
class RepositoryIndexResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing.final
class ModelIndex(google.protobuf.message.Message):
"""Index entry for a model."""
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
NAME_FIELD_NUMBER: builtins.int

@@ -56,25 +65,21 @@ VERSION_FIELD_NUMBER: builtins.int

REASON_FIELD_NUMBER: builtins.int
name: typing.Text = ...
name: builtins.str
"""The name of the model."""
version: typing.Text = ...
version: builtins.str
"""The version of the model."""
state: typing.Text = ...
state: builtins.str
"""The state of the model."""
reason: typing.Text = ...
reason: builtins.str
"""The reason, if any, that the model is in the given state."""
def __init__(
self,
*,
name: typing.Text = ...,
version: typing.Text = ...,
state: typing.Text = ...,
reason: typing.Text = ...,
name: builtins.str = ...,
version: builtins.str = ...,
state: builtins.str = ...,
reason: builtins.str = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"name",

@@ -96,6 +101,5 @@ b"name",

) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[
global___RepositoryIndexResponse.ModelIndex
Global___RepositoryIndexResponse.ModelIndex
]:
"""An index entry for each model."""
pass

@@ -105,33 +109,31 @@ def __init__(

*,
models: typing.Optional[
typing.Iterable[global___RepositoryIndexResponse.ModelIndex]
] = ...,
models: (
collections.abc.Iterable[Global___RepositoryIndexResponse.ModelIndex] | None
) = ...,
) -> None: ...
def ClearField(
self, field_name: typing_extensions.Literal["models", b"models"]
) -> None: ...
def ClearField(self, field_name: typing.Literal["models", b"models"]) -> None: ...
global___RepositoryIndexResponse = RepositoryIndexResponse
Global___RepositoryIndexResponse: typing_extensions.TypeAlias = RepositoryIndexResponse
@typing.final
class RepositoryModelLoadRequest(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
REPOSITORY_NAME_FIELD_NUMBER: builtins.int
MODEL_NAME_FIELD_NUMBER: builtins.int
repository_name: typing.Text = ...
repository_name: builtins.str
"""The name of the repository to load from. If empty the model
is loaded from any repository.
"""
model_name: typing.Text = ...
model_name: builtins.str
"""The name of the model to load, or reload."""
def __init__(
self,
*,
repository_name: typing.Text = ...,
model_name: typing.Text = ...,
repository_name: builtins.str = ...,
model_name: builtins.str = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"model_name", b"model_name", "repository_name", b"repository_name"

@@ -141,6 +143,10 @@ ],

global___RepositoryModelLoadRequest = RepositoryModelLoadRequest
Global___RepositoryModelLoadRequest: typing_extensions.TypeAlias = (
RepositoryModelLoadRequest
)
@typing.final
class RepositoryModelLoadResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
def __init__(

@@ -150,25 +156,27 @@ self,

global___RepositoryModelLoadResponse = RepositoryModelLoadResponse
Global___RepositoryModelLoadResponse: typing_extensions.TypeAlias = (
RepositoryModelLoadResponse
)
@typing.final
class RepositoryModelUnloadRequest(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
REPOSITORY_NAME_FIELD_NUMBER: builtins.int
MODEL_NAME_FIELD_NUMBER: builtins.int
repository_name: typing.Text = ...
repository_name: builtins.str
"""The name of the repository from which the model was originally
loaded. If empty the repository is not considered.
"""
model_name: typing.Text = ...
model_name: builtins.str
"""The name of the model to unload."""
def __init__(
self,
*,
repository_name: typing.Text = ...,
model_name: typing.Text = ...,
repository_name: builtins.str = ...,
model_name: builtins.str = ...,
) -> None: ...
def ClearField(
self,
field_name: typing_extensions.Literal[
field_name: typing.Literal[
"model_name", b"model_name", "repository_name", b"repository_name"

@@ -178,6 +186,10 @@ ],

global___RepositoryModelUnloadRequest = RepositoryModelUnloadRequest
Global___RepositoryModelUnloadRequest: typing_extensions.TypeAlias = (
RepositoryModelUnloadRequest
)
@typing.final
class RepositoryModelUnloadResponse(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor = ...
DESCRIPTOR: google.protobuf.descriptor.Descriptor
def __init__(

@@ -187,2 +199,4 @@ self,

global___RepositoryModelUnloadResponse = RepositoryModelUnloadResponse
Global___RepositoryModelUnloadResponse: typing_extensions.TypeAlias = (
RepositoryModelUnloadResponse
)

@@ -34,2 +34,9 @@ import glob

async def try_remove(filename: str):
try:
await remove(filename)
except FileNotFoundError:
pass
async def stop_metrics(settings: Settings, pid: int):

@@ -42,3 +49,4 @@ if not settings.parallel_workers:

matching_files = glob.glob(pattern)
await asyncio.gather(*[remove(f) for f in matching_files])
if len(matching_files) > 0:
await asyncio.gather(*[try_remove(f) for f in matching_files])

@@ -45,0 +53,0 @@

@@ -198,3 +198,3 @@ import asyncio

logger.debug("Starting response processing loop...")
loop = asyncio.get_event_loop()
loop = asyncio.get_running_loop()
while self._active:

@@ -201,0 +201,0 @@ response = await loop.run_in_executor(self._executor, self._responses.get)

@@ -202,3 +202,3 @@ import asyncio

"settings. "
"This field will be removed in MLServer 1.2.0. "
"This field will be removed in MLServer 1.8.0. "
"To access the new field, you can either update the "

@@ -205,0 +205,0 @@ "`settings.json` file, or update the `MLSERVER_PARALLEL_WORKERS` "

@@ -12,3 +12,3 @@ import asyncio

from ..registry import MultiModelRegistry
from ..utils import install_uvloop_event_loop, schedule_with_callback
from ..utils import AsyncManager, schedule_with_callback
from ..logging import configure_logger

@@ -68,9 +68,8 @@ from ..settings import Settings

with ctx:
install_uvloop_event_loop()
async_mgr = AsyncManager(self._ignore_signals)
configure_logger(self._settings)
configure_metrics(self._settings)
self._ignore_signals()
asyncio.run(self.coro_run())
async_mgr.run(self.coro_run())
def _ignore_signals(self):
def _ignore_signals(self, loop):
"""

@@ -83,4 +82,2 @@ Uvloop will try to propagate the main process' signals to the

"""
loop = asyncio.get_event_loop()
for sign in IGNORED_SIGNALS:

@@ -100,3 +97,3 @@ # Ensure that signal handlers are a no-op, to let the main process

self.__inner_init__()
loop = asyncio.get_event_loop()
loop = asyncio.get_running_loop()
while self._active:

@@ -103,0 +100,0 @@ readable = await loop.run_in_executor(self._executor, self._select)

@@ -32,3 +32,3 @@ from typing import Callable

response_class=Response,
**kwargs
**kwargs,
):

@@ -40,3 +40,3 @@ super().__init__(

response_class=Response,
**kwargs
**kwargs,
)

@@ -43,0 +43,0 @@

@@ -169,3 +169,3 @@ import asyncio

def _add_signal_handlers(self):
loop = asyncio.get_event_loop()
loop = asyncio.get_running_loop()

@@ -172,0 +172,0 @@ for sig in HANDLED_SIGNALS:

@@ -168,3 +168,3 @@ import sys

debug: bool = True
debug: bool = False

@@ -444,3 +444,3 @@ parallel_workers: int = DEFAULT_PARALLEL_WORKERS

parallel_workers: Optional[int] = Field(
None,
default=None,
deprecated=True,

@@ -447,0 +447,0 @@ description=(

@@ -0,8 +1,19 @@

# mypy: disable-error-code="call-arg,attr-defined"
#
# The typechecking exceptions referenced above are needed because code in this file
# dynamically considers different python versions, and some called functions are
# deprecated or take different arguments across versions.
import os
import sys
import uuid
import asyncio
from enum import Enum
from typing import cast
import warnings
import urllib.parse
from asyncio import Task
from typing import Callable, Dict, Optional, List
from typing import Any, Optional, TypeVar
from collections.abc import Callable, Coroutine

@@ -14,5 +25,173 @@ from .logging import logger

_CoroRetT = TypeVar("_CoroRetT")
EventLoopSignalHandleConfigFn = Callable[[asyncio.AbstractEventLoop], None]
_RUN_IN_LOOP_ERROR = (
"AsyncManager::run() cannot be called from within an existing event loop"
)
class EventLoopBackend(Enum):
ASYNCIO_DEFAULT = 1
UVLOOP = 2
class AsyncManager:
def __init__(self, signal_handle_config_fn=None):
self._event_loop_backend = EventLoopBackend.ASYNCIO_DEFAULT
self._signal_handle_config_fn = signal_handle_config_fn
try:
import uvloop
self._event_loop_backend = EventLoopBackend.UVLOOP
self._async_run_fn = uvloop.run
except ImportError:
# else keep the standard asyncio loop as a fallback
self._async_run_fn = asyncio.run
logger.warning(
"uvloop not available, falling back on default asyncio runner"
)
def _loop_factory(self) -> asyncio.AbstractEventLoop:
new_loop: asyncio.AbstractEventLoop
if self._event_loop_backend == EventLoopBackend.UVLOOP:
import uvloop
new_loop = uvloop.new_event_loop()
else:
new_loop = asyncio.new_event_loop()
if self._signal_handle_config_fn is not None:
self._signal_handle_config_fn(new_loop)
return new_loop
@property
def event_loop_backend(self) -> EventLoopBackend:
return self._event_loop_backend
@property
def event_loop_policy(self) -> asyncio.AbstractEventLoopPolicy:
"""
In python versions < 3.16, return the event loop policy.
It prefers the policy returned by uvloop where available.
Deprecated from python 3.12, but used within pytest tests until pytest-async
itself provides an alternative way to manage event loops across different
python versions.
"""
python_version_info = sys.version_info[:2]
if python_version_info >= (3, 12):
warnings.warn(
"AsyncManager::event_loop_policy is deprecated since Python 3.12.",
DeprecationWarning,
stacklevel=1,
)
if python_version_info >= (3, 16):
raise RuntimeError("EventLoopPolicy no loger supported in Python >=3.16")
if self._event_loop_backend == EventLoopBackend.UVLOOP:
import uvloop
return uvloop.EventLoopPolicy()
else:
return cast(asyncio.AbstractEventLoopPolicy, asyncio.DefaultEventLoopPolicy)
def run(
self, coro: Coroutine[Any, Any, _CoroRetT], *, debug: Optional[bool] = None
) -> _CoroRetT:
"""
Run a coroutine in a new event loop, and close the loop afterwards.
Equivalent to asyncio.run(...) but with custom behaviour:
- The event loop created during the run call is backed by uvloop when
available, and falls back on standard the default asyncio implementation
otherwise.
- At the time of initialising the AsyncManager object, the resulting
loop can also be configured with custom handlers for os signals
(i.e SIGINT).
This function is compatible with different python versions from 3.9 to 3.16,
and papers over the differences in deprecated functions across these
versions.
"""
if self._event_loop_backend == EventLoopBackend.UVLOOP:
# uvloop handles differences between python versions internally
return self._async_run_fn(coro, loop_factory=self._loop_factory)
python_version_info = sys.version_info[:2]
if python_version_info < (3, 11):
try:
asyncio.get_running_loop()
raise RuntimeError(_RUN_IN_LOOP_ERROR)
except RuntimeError:
pass
if not asyncio.iscoroutine(coro):
raise ValueError(f"expected coroutine, got {coro!r}")
loop = self._loop_factory()
try:
asyncio.set_event_loop(loop)
if debug is not None:
loop.set_debug(debug)
return loop.run_until_complete(coro)
finally:
try:
_cancel_all_tasks(loop)
loop.run_until_complete(loop.shutdown_asyncgens())
if hasattr(loop, "shutdown_default_executor"):
loop.run_until_complete(loop.shutdown_default_executor())
finally:
asyncio.set_event_loop(None)
loop.close()
elif python_version_info == (3, 11):
try:
asyncio.get_running_loop()
raise RuntimeError(_RUN_IN_LOOP_ERROR)
except RuntimeError:
pass
with asyncio.Runner(
loop_factory=self._loop_factory,
debug=debug,
) as runner:
return runner.run(coro)
else:
assert python_version_info > (3, 11)
# From python 3.12 onwards, asyncio.run() accepts a loop_factory argument
return asyncio.run(
coro,
debug=debug,
loop_factory=self._loop_factory,
)
def _cancel_all_tasks(loop: asyncio.AbstractEventLoop) -> None:
# Copied from python/cpython
to_cancel = asyncio.all_tasks(loop)
if not to_cancel:
return
for task in to_cancel:
task.cancel()
loop.run_until_complete(asyncio.gather(*to_cancel, return_exceptions=True))
for task in to_cancel:
if task.cancelled():
continue
if task.exception() is not None:
loop.call_exception_handler(
{
"message": "unhandled exception during asyncio.run() shutdown",
"exception": task.exception(),
"task": task,
}
)
async def get_model_uri(
settings: ModelSettings, wellknown_filenames: List[str] = []
settings: ModelSettings, wellknown_filenames: list[str] = []
) -> str:

@@ -72,3 +251,3 @@ if not settings.parameters:

def insert_headers(
inference_request: InferenceRequest, headers: Dict[str, str]
inference_request: InferenceRequest, headers: dict[str, str]
) -> InferenceRequest:

@@ -96,3 +275,3 @@ # Ensure parameters are present

def extract_headers(inference_response: InferenceResponse) -> Optional[Dict[str, str]]:
def extract_headers(inference_response: InferenceResponse) -> Optional[dict[str, str]]:
if inference_response.parameters is None:

@@ -110,28 +289,2 @@ return None

def _check_current_event_loop_policy() -> str:
policy = (
"uvloop"
if type(asyncio.get_event_loop_policy()).__module__.startswith("uvloop")
else "asyncio"
)
return policy
def install_uvloop_event_loop():
if "uvloop" == _check_current_event_loop_policy():
return
try:
import uvloop
uvloop.install()
except ImportError:
# else keep the standard asyncio loop as a fallback
pass
policy = _check_current_event_loop_policy()
logger.debug(f"Using asyncio event-loop policy: {policy}")
def schedule_with_callback(coro, cb) -> Task:

@@ -138,0 +291,0 @@ task = asyncio.create_task(coro)

@@ -1,1 +0,1 @@

__version__ = "1.7.1"
__version__ = "1.7.2-rc1"
+11
-16

@@ -1,21 +0,16 @@

Metadata-Version: 2.3
Metadata-Version: 2.4
Name: mlserver
Version: 1.7.1
Version: 1.7.2rc1
Summary: MLServer
License: Apache-2.0
License-Expression: Apache-2.0
License-File: LICENSE
Author: Seldon Technologies Ltd.
Author-email: hello@seldon.io
Requires-Python: >=3.9,<3.13
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: POSIX
Classifier: Operating System :: MacOS
Classifier: Operating System :: POSIX
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Dist: aiofiles
Requires-Dist: aiokafka
Requires-Dist: click
Requires-Dist: fastapi (>=0.88.0,!=0.89.0,<0.116.0)
Requires-Dist: fastapi (>=0.88.0,!=0.89.0,<0.125.0)
Requires-Dist: gevent

@@ -30,5 +25,5 @@ Requires-Dist: geventhttpclient

Requires-Dist: opentelemetry-sdk (>=1.22.0,<2.0.0)
Requires-Dist: orjson
Requires-Dist: orjson (>=3.10,<4)
Requires-Dist: pandas
Requires-Dist: protobuf (>=5.27.2,<7.0.0)
Requires-Dist: protobuf (>=5.29.5,<7.0.0)
Requires-Dist: py-grpc-prometheus

@@ -40,5 +35,5 @@ Requires-Dist: pydantic (>=2.7.1,<3.0.0)

Requires-Dist: starlette-exporter
Requires-Dist: tritonclient[http] (>=2.42)
Requires-Dist: uvicorn
Requires-Dist: uvloop ; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy"
Requires-Dist: tritonclient[http] (>=2.63)
Requires-Dist: uvicorn (>=0.38.0)
Requires-Dist: uvloop (>=0.22.1,<0.24) ; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy"
Description-Content-Type: text/markdown

@@ -45,0 +40,0 @@

@@ -1,8 +0,10 @@

[tool.poetry]
[project]
name = "mlserver"
version = "1.7.1"
version = "1.7.2-rc1"
description = "MLServer"
authors = ["Seldon Technologies Ltd. <hello@seldon.io>"]
authors = [
{name = "Seldon Technologies Ltd.", email="hello@seldon.io"}]
license = "Apache-2.0"
readme = "README.md"
requires-python = ">=3.9,<3.13"
classifiers = [

@@ -13,4 +15,32 @@ "Operating System :: POSIX",

include = ["mlserver/rest/openapi/*.json"]
dependencies = [
"click",
"fastapi>=0.88.0,!=0.89.0,<0.125.0",
"python-dotenv",
"grpcio>=1.67.1",
"numpy",
"pandas",
"protobuf>=5.29.5,<7.0.0",
"uvicorn>=0.38.0",
"starlette-exporter",
"py-grpc-prometheus",
"aiokafka",
"tritonclient[http]>=2.63",
"geventhttpclient",
"gevent",
"aiofiles",
"orjson>=3.10,<4",
"uvloop>=0.22.1,<0.24; sys_platform != 'win32' and (sys_platform != 'cygwin' and platform_python_implementation != 'PyPy')",
"pydantic>=2.7.1,<3.0.0",
"pydantic-settings>=2.3.0,<3.0.0",
"python-multipart",
# Required for Python <3.10 to access data files at runtime
"importlib-resources>=5.12,<7.0",
"opentelemetry-sdk>=1.22.0,<2.0.0",
"opentelemetry-instrumentation-fastapi>=0.43b0",
"opentelemetry-instrumentation-grpc>=0.43b0",
"opentelemetry-exporter-otlp-proto-grpc>=1.22.0,<2.0.0",
]
[tool.poetry.scripts]
[project.scripts]
mlserver = 'mlserver.cli:main'

@@ -45,38 +75,7 @@

addopts = "--import-mode=importlib"
norecursedirs = [
"runtimes"]
[tool.poetry.dependencies]
python = ">=3.9,<3.13"
click = "*"
fastapi = ">=0.88.0,!=0.89.0,<0.116.0"
python-dotenv = "*"
grpcio = ">=1.67.1"
numpy = "*"
pandas = "*"
protobuf = ">=5.27.2,<7.0.0"
uvicorn = "*"
starlette-exporter = "*"
py-grpc-prometheus = "*"
aiokafka = "*"
# add a min version to tritonclient due to https://github.com/triton-inference-server/server/issues/6246
tritonclient = {version = ">=2.42", extras = ["http"]}
geventhttpclient = "*"
gevent = "*"
aiofiles = "*"
orjson = "*"
uvloop = {version = "*", markers = "sys_platform != 'win32' and (sys_platform != 'cygwin' and platform_python_implementation != 'PyPy')"}
pydantic = "^2.7.1"
pydantic-settings = "^2.3.0"
python-multipart = "*"
## The importlib-resources backport is required to use some
## functionality added in Python 3.10
## https://setuptools.pypa.io/en/latest/userguide/datafiles.html#accessing-data-files-at-runtime
importlib-resources = ">=5.12,<7.0"
opentelemetry-sdk = "^1.22.0"
opentelemetry-instrumentation-fastapi = ">=0.43b0"
opentelemetry-instrumentation-grpc = ">=0.43b0"
opentelemetry-exporter-otlp-proto-grpc = "^1.22.0"
[tool.poetry.group.test.dependencies]
tox = "4.16.0"
tox = "4.24.2"

@@ -86,14 +85,14 @@ [tool.poetry.group.dev.dependencies]

grpcio-tools = ">=1.67.1"
pytest = "7.4.4"
pytest-asyncio = "0.21.1"
pytest-mock = "3.12.0"
pytest-cases = "3.8.5"
pytest-lazy-fixture = "^0.6.3"
tox = "4.16.0"
pytest = "8.4.2"
exceptiongroup = "1.3.0"
pytest-asyncio = "1.2.0"
pytest-mock = "3.15.1"
pytest-cases = "3.9.1"
tox = "4.24.2"
docker = "7.1.0"
aiohttp = "3.12.8"
aiohttp-retry = "2.8.3"
aiohttp = "3.12.14"
aiohttp-retry = "2.9.1"
## Used for FastAPI Async testing
httpx = "0.27.0"
kafka-python-ng = "2.2.3"
kafka-python = "2.2.15"
tenacity = "8.4.1"

@@ -103,5 +102,5 @@ pyyaml = "6.0.1"

flake8 = "7.0.0"
flake8-black = "0.3.6"
mypy = "1.11.2"
mypy-protobuf = "3.1.0"
flake8-black = "0.4.0"
mypy = "1.18.1"
mypy-protobuf = "3.7.0"
types-protobuf = "5.26.0.20240422"

@@ -111,3 +110,3 @@ types-orjson = "3.6.2"

types-requests = "2.32.0.20250602"
black = "24.8.0"
black = "24.10.0"
pip-licenses = "4.4.0"

@@ -134,2 +133,16 @@ pytest-xdist = "3.6.1"

[tool.poetry.group.test-all-runtimes]
optional = true
[tool.poetry.group.test-all-runtimes.dependencies]
mlserver-sklearn = {path = "./runtimes/sklearn", develop = false}
mlserver-xgboost = {path = "./runtimes/xgboost", develop = false}
mlserver-lightgbm = {path = "./runtimes/lightgbm", develop = false}
mlserver-mlflow = {path = "./runtimes/mlflow", develop = false}
mlserver-huggingface = {path = "./runtimes/huggingface", develop = false}
mlserver-alibi-explain = {path = "./runtimes/alibi-explain", develop = false}
mlserver-alibi-detect = {path = "./runtimes/alibi-detect", develop = false}
mlserver-catboost = {path = "./runtimes/catboost", develop = false}
[tool.poetry.group.all-runtimes-dev]

@@ -148,3 +161,3 @@ optional = true

torchvision = "0.19.1"
mlflow = "2.19.0"
mlflow = ">=3.0.0"

@@ -151,0 +164,0 @@ ## Dev dependencies from HuggingFace