diff --git a/BUILD.bazel b/BUILD.bazel index 3a9ab9537e2..1c8e6a9d5a8 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,8 +1,8 @@ -package(default_visibility = ["//visibility:public"]) - load("@com_github_bazelbuild_buildtools//buildifier:def.bzl", "buildifier") load("@rules_proto//proto:defs.bzl", "proto_library") +package(default_visibility = ["//visibility:public"]) + filegroup( name = "pyproject", srcs = ["pyproject.toml"], @@ -21,3 +21,13 @@ proto_library( "@com_google_protobuf//:wrappers_proto", ], ) + +proto_library( + name = "service_v1_proto", + srcs = ["src/bentoml/grpc/v1/service.proto"], + visibility = ["//grpc-client:__subpackages__"], + deps = [ + "@com_google_protobuf//:struct_proto", + "@com_google_protobuf//:wrappers_proto", + ], +) diff --git a/docs/source/guides/grpc.rst b/docs/source/guides/grpc.rst index 2e357b1eb50..82aea0b6ba7 100644 --- a/docs/source/guides/grpc.rst +++ b/docs/source/guides/grpc.rst @@ -156,9 +156,9 @@ gRPC server: .. code-block:: go - require github.com/bentoml/bentoml/grpc/v1alpha1 v0.0.0-unpublished + require github.com/bentoml/bentoml/grpc/v1 v0.0.0-unpublished - replace github.com/bentoml/bentoml/grpc/v1alpha1 v0.0.0-unpublished => ./github.com/bentoml/bentoml/grpc/v1alpha1 + replace github.com/bentoml/bentoml/grpc/v1 v0.0.0-unpublished => ./github.com/bentoml/bentoml/grpc/v1 By using `replace directive `_, we ensure that Go will know where our generated stubs to be imported from. (since we don't host the generate gRPC stubs on `pkg.go.dev` 😄) @@ -172,14 +172,14 @@ gRPC server: » protoc -I. -I thirdparty/protobuf/src \ --go_out=. --go_opt=paths=import \ --go-grpc_out=. --go-grpc_opt=paths=import \ - bentoml/grpc/v1alpha1/service.proto + bentoml/grpc/v1/service.proto Then run the following to make sure the generated stubs are importable: .. code-block:: bash - » pushd github.com/bentoml/bentoml/grpc/v1alpha1 - » go mod init v1alpha1 && go mod tidy + » pushd github.com/bentoml/bentoml/grpc/v1 + » go mod init v1 && go mod tidy » popd Create a ``client.go`` file with the following content: @@ -233,7 +233,7 @@ gRPC server: » protoc -I . -I ./thirdparty/protobuf/src \ --cpp_out=. --grpc_out=. \ --plugin=protoc-gen-grpc=$(which grpc_cpp_plugin) \ - bentoml/grpc/v1alpha1/service.proto + bentoml/grpc/v1/service.proto Create a ``client.cpp`` file with the following content: @@ -331,7 +331,7 @@ gRPC server: -I ./thirdparty/protobuf/src \ --java_out=./src/main/java \ --grpc-java_out=./src/main/java \ - bentoml/grpc/v1alpha1/service.proto + bentoml/grpc/v1/service.proto .. tab-item:: Kotlin :sync: kotlin @@ -414,7 +414,7 @@ gRPC server: --kotlin_out ./kotlin/src/main/kotlin/ \ --grpc-kotlin_out ./kotlin/src/main/kotlin \ --plugin=protoc-gen-grpc-kotlin=$(which protoc-gen-grpc-kotlin) \ - bentoml/grpc/v1alpha1/service.proto + bentoml/grpc/v1/service.proto .. tab-item:: Node.js :sync: nodejs @@ -459,7 +459,7 @@ gRPC server: -I . -I ./thirdparty/protobuf/src \ --js_out=import_style=commonjs,binary:. \ --grpc_out=grpc_js:js \ - bentoml/grpc/v1alpha1/service.proto + bentoml/grpc/v1/service.proto Proceed to create a ``client.js`` file with the following content: @@ -501,7 +501,7 @@ gRPC server: --swift_out=Sources --swift_opt=Visibility=Public \ --grpc-swift_out=Sources --grpc-swift_opt=Visibility=Public \ --plugin=protoc-gen-grpc-swift=$(which protoc-gen-grpc-swift) \ - bentoml/grpc/v1alpha1/service.proto + bentoml/grpc/v1/service.proto Proceed to create a ``Sources/BentoServiceClient/main.swift`` file with the following content: @@ -549,7 +549,7 @@ gRPC server: --php_out=. \ --grpc_out=. \ --plugin=protoc-gen-grpc=$(which grpc_php_plugin) \ - bentoml/grpc/v1alpha1/service.proto + bentoml/grpc/v1/service.proto Proceed to create a ``BentoServiceClient.php`` file with the following content: @@ -773,6 +773,11 @@ Let's take a quick look at `protobuf ` is not matched. + +.. grid:: 2 + + .. grid-item-card:: ``Python API`` + + .. code-block:: python + + Image(mime_type="application/pdf") + + .. grid-item-card:: ``pb.File`` + + .. code-block:: none - - Document ``kind`` once enum was dropped. - - Demonstrate python API to protobuf representation + file { + kind: "application/pdf" + content: + } + + +:ref:`bentoml.io.Image ` will also be using ``pb.File``. + +.. grid:: 2 + + .. grid-item-card:: ``Python API`` + + .. code-block:: python + + File(mime_type="image/png") + + .. grid-item-card:: ``pb.File`` + + .. code-block:: none + + file { + kind: "image/png" + content: + } Complex payload via ``Multipart`` diff --git a/docs/source/guides/metrics.rst b/docs/source/guides/metrics.rst index 24fb89dfe4c..6813ed1080d 100644 --- a/docs/source/guides/metrics.rst +++ b/docs/source/guides/metrics.rst @@ -132,7 +132,7 @@ invocation for ``analysis`` by polarity scores. .. code-block:: bash - » grpcurl -d @ -plaintext 0.0.0.0:3000 bentoml.grpc.v1alpha1.BentoService/Call < data = {3.5, 2.4, 7.8, 5.1}; std::vector shape = {1, 4}; diff --git a/docs/source/guides/snippets/grpc/go/BUILD.snippet.bzl b/docs/source/guides/snippets/grpc/go/BUILD.snippet.bzl index 46872743ee9..0cf17c97e84 100644 --- a/docs/source/guides/snippets/grpc/go/BUILD.snippet.bzl +++ b/docs/source/guides/snippets/grpc/go/BUILD.snippet.bzl @@ -2,21 +2,21 @@ load("@rules_proto_grpc//go:defs.bzl", "go_grpc_library") load("@io_bazel_rules_go//go:def.bzl", "go_binary") proto_library( - name = "service_v1alpha1_proto", - srcs = ["bentoml/grpc/v1alpha1/service.proto"], + name = "service_v1_proto", + srcs = ["bentoml/grpc/v1/service.proto"], deps = ["@com_google_protobuf//:struct_proto", "@com_google_protobuf//:wrappers_proto"], ) go_grpc_library( name = "service_go", - importpath = "github.com/bentoml/bentoml/grpc/v1alpha1", - protos = [":service_v1alpha1_proto"], + importpath = "github.com/bentoml/bentoml/grpc/v1", + protos = [":service_v1_proto"], ) go_binary( name = "client_go", srcs = ["client.go"], - importpath = "github.com/bentoml/bentoml/grpc/v1alpha1", + importpath = "github.com/bentoml/bentoml/grpc/v1", deps = [ ":service_go", "@com_github_golang_protobuf//proto:go_default_library", diff --git a/docs/source/guides/snippets/grpc/go/request.go b/docs/source/guides/snippets/grpc/go/request.go index 2f0169e942b..6ec2c34c4fa 100644 --- a/docs/source/guides/snippets/grpc/go/request.go +++ b/docs/source/guides/snippets/grpc/go/request.go @@ -1,7 +1,7 @@ package main import ( - pb "github.com/bentoml/bentoml/grpc/v1alpha1" + pb "github.com/bentoml/bentoml/grpc/v1" ) var req = &pb.Request{ diff --git a/docs/source/guides/snippets/grpc/grpc_tools.rst b/docs/source/guides/snippets/grpc/grpc_tools.rst index 28e3172ece3..00872d1e06d 100644 --- a/docs/source/guides/snippets/grpc/grpc_tools.rst +++ b/docs/source/guides/snippets/grpc/grpc_tools.rst @@ -15,7 +15,7 @@ » docker run -i --rm \ fullstorydev/grpcurl -d @ -plaintext host.docker.internal:3000 \ - bentoml.grpc.v1alpha1.BentoService/Call < ```bash -grpcurl -d @ -plaintext 0.0.0.0:3000 bentoml.grpc.v1alpha1.BentoService/Call < ```bash -grpcurl -d @ -plaintext 0.0.0.0:3000 bentoml.grpc.v1alpha1.BentoService/Call < #include -#include "bentoml/grpc/v1alpha1/service.grpc.pb.h" -#include "bentoml/grpc/v1alpha1/service.pb.h" +#include "bentoml/grpc/v1/service.grpc.pb.h" +#include "bentoml/grpc/v1/service.pb.h" -using bentoml::grpc::v1alpha1::BentoService; -using bentoml::grpc::v1alpha1::NDArray; -using bentoml::grpc::v1alpha1::Request; -using bentoml::grpc::v1alpha1::Response; +using bentoml::grpc::v1::BentoService; +using bentoml::grpc::v1::NDArray; +using bentoml::grpc::v1::Request; +using bentoml::grpc::v1::Response; using grpc::Channel; using grpc::ClientAsyncResponseReader; using grpc::ClientContext; @@ -26,7 +26,7 @@ using grpc::Status; int main(int argc, char **argv) { auto stubs = BentoService::NewStub(grpc::CreateChannel( - "localhost:3000", grpc::InsecureChannelCredentials())); + "localhost:3000", grpc::InsecureChannelCredentials())); std::vector data = {3.5, 2.4, 7.8, 5.1}; std::vector shape = {1, 4}; @@ -45,15 +45,15 @@ int main(int argc, char **argv) { // Act upon the status of the actual RPC. if (!status.ok()) { - std::cout << status.error_code() << ": " << status.error_message() - << std::endl; - return 1; + std::cout << status.error_code() << ": " << status.error_message() + << std::endl; + return 1; } if (!resp.has_ndarray()) { - std::cout << "Currently only accept output as NDArray." << std::endl; - return 1; + std::cout << "Currently only accept output as NDArray." << std::endl; + return 1; } std::cout << "response byte size: " << resp.ndarray().ByteSizeLong() - << std::endl; + << std::endl; return 0; } diff --git a/grpc-client/go/BUILD.bazel b/grpc-client/go/BUILD.bazel index 060255c5b8e..6eb24c0a405 100644 --- a/grpc-client/go/BUILD.bazel +++ b/grpc-client/go/BUILD.bazel @@ -2,15 +2,34 @@ load("@rules_proto_grpc//go:defs.bzl", "go_grpc_library") load("@io_bazel_rules_go//go:def.bzl", "go_binary") go_grpc_library( - name = "service_grpc", + name = "service_grpc_v1alpha1", importpath = "github.com/bentoml/bentoml/grpc/v1alpha1", protos = ["//:service_v1alpha1_proto"], ) go_binary( - name = "client", + name = "client_v1alpha1", srcs = ["client.go"], importpath = "github.com/bentoml/bentoml/grpc/v1alpha1", + deps = [ + ":service_grpc_v1alpha1", + "@com_github_golang_protobuf//proto:go_default_library", + "@org_golang_google_grpc//:go_default_library", + "@org_golang_google_grpc//credentials:go_default_library", + "@org_golang_google_grpc//credentials/insecure:go_default_library", + ], +) + +go_grpc_library( + name = "service_grpc", + importpath = "github.com/bentoml/bentoml/grpc/v1", + protos = ["//:service_v1_proto"], +) + +go_binary( + name = "client", + srcs = ["client.go"], + importpath = "github.com/bentoml/bentoml/grpc/v1", deps = [ ":service_grpc", "@com_github_golang_protobuf//proto:go_default_library", diff --git a/grpc-client/go/client b/grpc-client/go/client index 772d63af90b..e8b074258d8 100755 --- a/grpc-client/go/client +++ b/grpc-client/go/client @@ -18,6 +18,10 @@ if ! [[ -d "$SCRIPT_DIR/github.com/bentoml/bentoml/grpc" ]]; then --go_out "$SCRIPT_DIR" --go_opt paths=import \ --go-grpc_out "$SCRIPT_DIR" --go-grpc_opt paths=import \ bentoml/grpc/v1alpha1/service.proto + protoc -I. -I ./thirdparty/protobuf/src \ + --go_out "$SCRIPT_DIR" --go_opt paths=import \ + --go-grpc_out "$SCRIPT_DIR" --go-grpc_opt paths=import \ + bentoml/grpc/v1/service.proto fi popd >/dev/null @@ -27,6 +31,10 @@ pushd "$SCRIPT_DIR/github.com/bentoml/bentoml/grpc/v1alpha1/" >/dev/null ! [[ -f "go.mod" ]] && go mod init v1alpha1 go mod tidy popd >/dev/null +pushd "$SCRIPT_DIR/github.com/bentoml/bentoml/grpc/v1/" >/dev/null +! [[ -f "go.mod" ]] && go mod init v1 +go mod tidy +popd >/dev/null go mod tidy # Then run the client diff --git a/grpc-client/go/client.go b/grpc-client/go/client.go index d8df6ed465e..a12629e904f 100644 --- a/grpc-client/go/client.go +++ b/grpc-client/go/client.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - pb "github.com/bentoml/bentoml/grpc/v1alpha1" + pb "github.com/bentoml/bentoml/grpc/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" diff --git a/grpc-client/java/BUILD.bazel b/grpc-client/java/BUILD.bazel index 8742862ee04..5d700877211 100644 --- a/grpc-client/java/BUILD.bazel +++ b/grpc-client/java/BUILD.bazel @@ -4,7 +4,7 @@ load("@io_grpc_grpc_java//:java_grpc_library.bzl", "java_grpc_library") # We need to create a separate proto_library # to conform with macro java_proto_library rules proto_library( - name = "service_proto", + name = "service_proto_v1alpha1", srcs = ["src/main/proto/v1alpha1/service.proto"], deps = [ "@com_google_protobuf//:struct_proto", @@ -12,6 +12,45 @@ proto_library( ], ) +java_proto_library( + name = "service_java_proto_v1alpha1", + deps = [":service_proto_v1alpha1"], +) + +java_grpc_library( + name = "service_java_grpc_v1alpha1", + srcs = [":service_proto_v1alpha1"], + deps = [":service_java_proto_v1alpha1"], +) + +java_library( + name = "grpc_library_v1alpha1", + srcs = glob(["src/main/java/**/*.java"]), + deps = [ + ":service_java_grpc_v1alpha1", + ":service_java_proto_v1alpha1", + "@io_grpc_grpc_java//api", + ], +) + +java_binary( + name = "client_v1alpha1", + main_class = "com.client.BentoServiceClient", + runtime_deps = [ + ":grpc_library_v1alpha1", + "@io_grpc_grpc_java//netty", + ], +) + +proto_library( + name = "service_proto", + srcs = ["src/main/proto/v1/service.proto"], + deps = [ + "@com_google_protobuf//:struct_proto", + "@com_google_protobuf//:wrappers_proto", + ], +) + java_proto_library( name = "service_java_proto", deps = [":service_proto"], diff --git a/grpc-client/java/src/main/java/com/client/BentoServiceClient.java b/grpc-client/java/src/main/java/com/client/BentoServiceClient.java index 297e0e7f072..e8f10685aaf 100644 --- a/grpc-client/java/src/main/java/com/client/BentoServiceClient.java +++ b/grpc-client/java/src/main/java/com/client/BentoServiceClient.java @@ -11,13 +11,13 @@ import java.util.logging.Level; import java.util.logging.Logger; -import com.bentoml.grpc.v1alpha1.BentoServiceGrpc; -import com.bentoml.grpc.v1alpha1.BentoServiceGrpc.BentoServiceBlockingStub; -import com.bentoml.grpc.v1alpha1.BentoServiceGrpc.BentoServiceStub; -import com.bentoml.grpc.v1alpha1.NDArray; -import com.bentoml.grpc.v1alpha1.Request; -import com.bentoml.grpc.v1alpha1.RequestOrBuilder; -import com.bentoml.grpc.v1alpha1.Response; +import com.bentoml.grpc.v1.BentoServiceGrpc; +import com.bentoml.grpc.v1.BentoServiceGrpc.BentoServiceBlockingStub; +import com.bentoml.grpc.v1.BentoServiceGrpc.BentoServiceStub; +import com.bentoml.grpc.v1.NDArray; +import com.bentoml.grpc.v1.Request; +import com.bentoml.grpc.v1.RequestOrBuilder; +import com.bentoml.grpc.v1.Response; public class BentoServiceClient { diff --git a/grpc-client/java/src/main/proto/v1 b/grpc-client/java/src/main/proto/v1 new file mode 120000 index 00000000000..cbeb74766ad --- /dev/null +++ b/grpc-client/java/src/main/proto/v1 @@ -0,0 +1 @@ +../../../../bentoml/grpc/v1 \ No newline at end of file diff --git a/grpc-client/kotlin/BUILD.bazel b/grpc-client/kotlin/BUILD.bazel index c0d6a1be24b..2b128f31718 100644 --- a/grpc-client/kotlin/BUILD.bazel +++ b/grpc-client/kotlin/BUILD.bazel @@ -1,12 +1,11 @@ load("@rules_proto//proto:defs.bzl", "proto_library") load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_binary") -load("@io_grpc_grpc_java//:java_grpc_library.bzl", "java_grpc_library") load("@com_github_grpc_grpc_kotlin//:kt_jvm_grpc.bzl", "kt_jvm_grpc_library", "kt_jvm_proto_library") # We need to create a separate proto_library # to conform with macro java_proto_library rules proto_library( - name = "service_proto", + name = "service_proto_v1alpha1", srcs = ["src/main/proto/v1alpha1/service.proto"], deps = [ "@com_google_protobuf//:struct_proto", @@ -14,6 +13,43 @@ proto_library( ], ) +java_proto_library( + name = "service_java_proto_v1alpha1", + deps = [":service_proto_v1alpha1"], +) + +kt_jvm_proto_library( + name = "service_kt_proto_v1alpha1", + deps = [":service_proto_v1alpha1"], +) + +kt_jvm_grpc_library( + name = "service_kt_grpc_v1alpha1", + srcs = [":service_proto_v1alpha1"], + deps = [":service_java_proto_v1alpha1"], +) + +kt_jvm_binary( + name = "client", + srcs = ["src/main/kotlin/com/client/BentoServiceClient.kt"], + main_class = "com.client.BentoServiceClient", + deps = [ + ":service_kt_grpc_v1alpha1", + ":service_kt_proto_v1alpha1", + "@com_google_protobuf//:protobuf_java_util", + "@io_grpc_grpc_java//netty", + ], +) + +proto_library( + name = "service_proto", + srcs = ["src/main/proto/v1/service.proto"], + deps = [ + "@com_google_protobuf//:struct_proto", + "@com_google_protobuf//:wrappers_proto", + ], +) + java_proto_library( name = "service_java_proto", deps = [":service_proto"], diff --git a/grpc-client/kotlin/src/main/kotlin/com/client/BentoServiceClient.kt b/grpc-client/kotlin/src/main/kotlin/com/client/BentoServiceClient.kt index 74a22bf3d48..48fdb254235 100644 --- a/grpc-client/kotlin/src/main/kotlin/com/client/BentoServiceClient.kt +++ b/grpc-client/kotlin/src/main/kotlin/com/client/BentoServiceClient.kt @@ -1,8 +1,8 @@ package com.client -import com.bentoml.grpc.v1alpha1.BentoServiceGrpc -import com.bentoml.grpc.v1alpha1.NDArray -import com.bentoml.grpc.v1alpha1.Request +import com.bentoml.grpc.v1.BentoServiceGrpc +import com.bentoml.grpc.v1.NDArray +import com.bentoml.grpc.v1.Request import io.grpc.ManagedChannelBuilder class BentoServiceClient { diff --git a/grpc-client/kotlin/src/main/proto/v1 b/grpc-client/kotlin/src/main/proto/v1 new file mode 120000 index 00000000000..cbeb74766ad --- /dev/null +++ b/grpc-client/kotlin/src/main/proto/v1 @@ -0,0 +1 @@ +../../../../bentoml/grpc/v1 \ No newline at end of file diff --git a/grpc-client/node/client.js b/grpc-client/node/client.js index 069eb1719fc..5dbec92dd48 100644 --- a/grpc-client/node/client.js +++ b/grpc-client/node/client.js @@ -1,7 +1,7 @@ "use strict"; const grpc = require("@grpc/grpc-js"); -const pb = require("./bentoml/grpc/v1alpha1/service_pb"); -const services = require("./bentoml/grpc/v1alpha1/service_grpc_pb"); +const pb = require("./bentoml/grpc/v1/service_pb"); +const services = require("./bentoml/grpc/v1/service_grpc_pb"); function main() { const target = "localhost:3000"; diff --git a/grpc-client/php/BentoServiceClient.php b/grpc-client/php/BentoServiceClient.php index 68c13361011..d816ec48793 100644 --- a/grpc-client/php/BentoServiceClient.php +++ b/grpc-client/php/BentoServiceClient.php @@ -1,8 +1,8 @@ setShape($shape); $payload->setFloatValues($data); - $payload->setDtype(\Bentoml\Grpc\V1alpha1\NDArray\DType::DTYPE_FLOAT); + $payload->setDtype(\Bentoml\Grpc\v1\NDArray\DType::DTYPE_FLOAT); list($response, $status) = $client->Call($request)->wait(); if ($status->code !== Grpc\STATUS_OK) { diff --git a/grpc-client/php/codegen b/grpc-client/php/codegen index 254d8e4b8cf..455dccce46d 100755 --- a/grpc-client/php/codegen +++ b/grpc-client/php/codegen @@ -19,5 +19,6 @@ PLUGIN=protoc-gen-grpc=$(pwd)/bazel-bin/external/com_github_grpc_grpc/src/compil echo "Generate PHP stubs." bazel run @com_google_protobuf//:protoc -- -I ./grpc-client -I ./grpc-client/thirdparty/protobuf/src --php_out=grpc-client/php --grpc_out=grpc-client/php --plugin="$PLUGIN" grpc-client/bentoml/grpc/v1alpha1/service.proto +bazel run @com_google_protobuf//:protoc -- -I ./grpc-client -I ./grpc-client/thirdparty/protobuf/src --php_out=grpc-client/php --grpc_out=grpc-client/php --plugin="$PLUGIN" grpc-client/bentoml/grpc/v1/service.proto popd >/dev/null diff --git a/grpc-client/swift/Sources/BentoServiceClient/main.swift b/grpc-client/swift/Sources/BentoServiceClient/main.swift index 77527d7fc50..d6bf86e1b0e 100644 --- a/grpc-client/swift/Sources/BentoServiceClient/main.swift +++ b/grpc-client/swift/Sources/BentoServiceClient/main.swift @@ -37,16 +37,16 @@ defer { } // Provide the connection to the generated client. -let stubs = Bentoml_Grpc_V1alpha1_BentoServiceNIOClient(channel: channel) +let stubs = Bentoml_Grpc_v1_BentoServiceNIOClient(channel: channel) // Form the request with the NDArray, if one was provided. -let ndarray: Bentoml_Grpc_V1alpha1_NDArray = .with { +let ndarray: Bentoml_Grpc_v1_NDArray = .with { $0.shape = shape $0.floatValues = data - $0.dtype = Bentoml_Grpc_V1alpha1_NDArray.DType.float + $0.dtype = Bentoml_Grpc_v1_NDArray.DType.float } -let request: Bentoml_Grpc_V1alpha1_Request = .with { +let request: Bentoml_Grpc_v1_Request = .with { $0.apiName = apiName $0.ndarray = ndarray } diff --git a/grpc-client/swift/client b/grpc-client/swift/client index 63514dd3eeb..2f6b3fa66ec 100755 --- a/grpc-client/swift/client +++ b/grpc-client/swift/client @@ -18,6 +18,10 @@ if ! [[ -d "swift/Sources/bentoml" ]]; then --swift_out=swift/Sources --swift_opt=Visibility=Public \ --grpc-swift_out=swift/Sources --grpc-swift_opt=Visibility=Public \ bentoml/grpc/v1alpha1/service.proto + protoc -I . -I ./thirdparty/protobuf/src \ + --swift_out=swift/Sources --swift_opt=Visibility=Public \ + --grpc-swift_out=swift/Sources --grpc-swift_opt=Visibility=Public \ + bentoml/grpc/v1/service.proto fi popd >/dev/null diff --git a/pyproject.toml b/pyproject.toml index 789b64021cd..c53f4f1de85 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -177,6 +177,7 @@ omit = [ "src/bentoml/_internal/types.py", "src/bentoml/testing/*", "src/bentoml/grpc/v1alpha1/*", + "src/bentoml/grpc/v1/*", "src/bentoml/_internal/external_typing/*", "src/bentoml/_internal/yatai_client/*", "src/bentoml/_internal/yatai_rest_api_client/*", @@ -193,6 +194,7 @@ omit = [ "src/bentoml/_internal/types.py", "src/bentoml/testing/*", "src/bentoml/grpc/v1alpha1/*", + "src/bentoml/grpc/v1/*", "src/bentoml/_internal/external_typing/*", "src/bentoml/_internal/yatai_client/*", "src/bentoml/_internal/yatai_rest_api_client/*", @@ -228,7 +230,9 @@ exclude = ''' | dist | typings | src/bentoml/grpc/v1alpha1 + | src/bentoml/grpc/v1 | grpc-client/thirdparty + | grpc-client/bentoml )/ | src/bentoml/_version.py ) @@ -253,6 +257,7 @@ extension-pkg-allow-list = [ ignore-paths = [ "src/bentoml/_internal/external_typing", "src/bentoml/grpc/v1alpha1", + "src/bentoml/grpc/v1", ] disable = ["coerce-builtin", "no-absolute-import", "C", "R"] enable = ["c-extension-no-member"] @@ -302,6 +307,7 @@ skip_glob = [ "venv/*", "lib/*", "grpc-client/thirdparty", + "grpc-client/bentoml", "bazel-*", ] diff --git a/scripts/generate_grpc_stubs.sh b/scripts/generate_grpc_stubs.sh index e42016a6ffc..c0fbbeaf267 100755 --- a/scripts/generate_grpc_stubs.sh +++ b/scripts/generate_grpc_stubs.sh @@ -6,7 +6,7 @@ STUBS_GENERATOR="bentoml/stubs-generator" cd "$GIT_ROOT/src" || exit 1 main() { - local VERSION="${1:-v1alpha1}" + local VERSION="${1:-v1}" # Use inline heredoc for even faster build # Keeping image as cache should be fine since we only want to generate the stubs. if [[ $(docker images --filter=reference="$STUBS_GENERATOR" -q) == "" ]] || test "$(git diff --name-only --diff-filter=d -- "$0")"; then @@ -43,7 +43,7 @@ EOF } if [ "${#}" -gt 1 ]; then - echo "$0 takes one optional argument. Usage: $0 [v1alpha2]" + echo "$0 takes one optional argument. Usage: $0 [v1]" exit 1 fi main "$@" diff --git a/scripts/release_pypi.sh b/scripts/release_pypi.sh index dd672055680..a4f9be87d14 100755 --- a/scripts/release_pypi.sh +++ b/scripts/release_pypi.sh @@ -54,7 +54,8 @@ echo "Generating PyPI source distribution..." cd "$GIT_ROOT" || exit 1 # generate gRPC stubs -./scripts/generate_grpc_stubs.sh +./scripts/generate_grpc_stubs.sh v1alpha1 +./scripts/generate_grpc_stubs.sh v1 python3 -m build -s -w diff --git a/src/bentoml/_internal/bento/build_dev_bentoml_whl.py b/src/bentoml/_internal/bento/build_dev_bentoml_whl.py index dce0c6107d0..f3a9e1647b1 100644 --- a/src/bentoml/_internal/bento/build_dev_bentoml_whl.py +++ b/src/bentoml/_internal/bento/build_dev_bentoml_whl.py @@ -14,7 +14,9 @@ BENTOML_DEV_BUILD = "BENTOML_BUNDLE_LOCAL_BUILD" -def build_bentoml_editable_wheel(target_path: str) -> None: +def build_bentoml_editable_wheel( + target_path: str, *, _internal_stubs_version: str = "v1" +) -> None: """ This is for BentoML developers to create Bentos that contains the local bentoml build based on their development branch. To enable this behavior, one must @@ -49,9 +51,11 @@ def build_bentoml_editable_wheel(target_path: str) -> None: raise BentoMLException("Could not find bentoml module location.") bentoml_path = Path(module_location) - if not Path(module_location, "grpc", "v1alpha1", "service_pb2.py").exists(): + if not Path( + module_location, "grpc", _internal_stubs_version, "service_pb2.py" + ).exists(): raise ModuleNotFoundError( - f"Generated stubs are not found. Make sure to run '{bentoml_path.as_posix()}/scripts/generate_grpc_stubs.sh' beforehand to generate gRPC stubs." + f"Generated stubs for version {_internal_stubs_version} are missing. Make sure to run '{bentoml_path.as_posix()}/scripts/generate_grpc_stubs.sh {_internal_stubs_version}' beforehand to generate gRPC stubs." ) from None # location to pyproject.toml diff --git a/src/bentoml/_internal/io_descriptors/file.py b/src/bentoml/_internal/io_descriptors/file.py index 172e86eefdf..ed4ccefe01c 100644 --- a/src/bentoml/_internal/io_descriptors/file.py +++ b/src/bentoml/_internal/io_descriptors/file.py @@ -28,7 +28,7 @@ if TYPE_CHECKING: from typing_extensions import Self - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb from .base import OpenAPIResponse from ..context import InferenceApiContext as Context @@ -192,21 +192,12 @@ async def to_http_response(self, obj: FileType, ctx: Context | None = None): return res async def to_proto(self, obj: FileType) -> pb.File: - from bentoml.grpc.utils import mimetype_to_filetype_pb_map - if isinstance(obj, bytes): body = obj else: body = obj.read() - try: - kind = mimetype_to_filetype_pb_map()[self._mime_type] - except KeyError: - raise BadInput( - f"{self._mime_type} doesn't have a corresponding File 'kind'" - ) from None - - return pb.File(kind=kind, content=body) + return pb.File(kind=self._mime_type, content=body) async def from_proto(self, field: pb.File | bytes) -> FileLike[bytes]: raise NotImplementedError @@ -256,25 +247,15 @@ async def from_http_request(self, request: Request) -> FileLike[bytes]: ) async def from_proto(self, field: pb.File | bytes) -> FileLike[bytes]: - from bentoml.grpc.utils import filetype_pb_to_mimetype_map - - mapping = filetype_pb_to_mimetype_map() # check if the request message has the correct field if isinstance(field, bytes): content = field else: assert isinstance(field, pb.File) - if field.kind: - try: - mime_type = mapping[field.kind] - if mime_type != self._mime_type: - raise BadInput( - f"Inferred mime_type from 'kind' is '{mime_type}', while '{self!r}' is expecting '{self._mime_type}'", - ) - except KeyError: - raise BadInput( - f"{field.kind} is not a valid File kind. Accepted file kind: {[names for names,_ in pb.File.FileType.items()]}", - ) from None + if field.kind and field.kind != self._mime_type: + raise BadInput( + f"MIME type from 'kind' is '{field.kind}', while '{self!r}' is expecting '{self._mime_type}'", + ) content = field.content if not content: raise BadInput("Content is empty!") from None diff --git a/src/bentoml/_internal/io_descriptors/image.py b/src/bentoml/_internal/io_descriptors/image.py index 1a392d4ae1c..ffdd55369e0 100644 --- a/src/bentoml/_internal/io_descriptors/image.py +++ b/src/bentoml/_internal/io_descriptors/image.py @@ -33,7 +33,7 @@ import PIL.Image from typing_extensions import Self - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb from .. import external_typing as ext from .base import OpenAPIResponse @@ -388,25 +388,14 @@ async def to_http_response( ) async def from_proto(self, field: pb.File | bytes) -> ImageType: - from bentoml.grpc.utils import filetype_pb_to_mimetype_map - - mapping = filetype_pb_to_mimetype_map() - # check if the request message has the correct field if isinstance(field, bytes): content = field else: assert isinstance(field, pb.File) - if field.kind: - try: - mime_type = mapping[field.kind] - if mime_type != self._mime_type: - raise BadInput( - f"Inferred mime_type from 'kind' is '{mime_type}', while '{self!r}' is expecting '{self._mime_type}'", - ) - except KeyError: - raise BadInput( - f"{field.kind} is not a valid File kind. Accepted file kind: {[names for names,_ in pb.File.FileType.items()]}", - ) from None + if field.kind and field.kind != self._mime_type: + raise BadInput( + f"MIME type from 'kind' is '{field.kind}', while '{self!r}' is expecting '{self._mime_type}'", + ) content = field.content if not content: raise BadInput("Content is empty!") from None @@ -414,8 +403,6 @@ async def from_proto(self, field: pb.File | bytes) -> ImageType: return PIL.Image.open(io.BytesIO(content)) async def to_proto(self, obj: ImageType) -> pb.File: - from bentoml.grpc.utils import mimetype_to_filetype_pb_map - if LazyType["ext.NpNDArray"]("numpy.ndarray").isinstance(obj): image = PIL.Image.fromarray(obj, mode=self._pilmode) elif LazyType["PIL.Image.Image"]("PIL.Image.Image").isinstance(obj): @@ -427,11 +414,4 @@ async def to_proto(self, obj: ImageType) -> pb.File: ret = io.BytesIO() image.save(ret, format=self._format) - try: - kind = mimetype_to_filetype_pb_map()[self._mime_type] - except KeyError: - raise BadInput( - f"{self._mime_type} doesn't have a corresponding File 'kind'", - ) from None - - return pb.File(kind=kind, content=ret.getvalue()) + return pb.File(kind=self._mime_type, content=ret.getvalue()) diff --git a/src/bentoml/_internal/io_descriptors/multipart.py b/src/bentoml/_internal/io_descriptors/multipart.py index d7253a9bde4..2f59866df56 100644 --- a/src/bentoml/_internal/io_descriptors/multipart.py +++ b/src/bentoml/_internal/io_descriptors/multipart.py @@ -23,7 +23,7 @@ from typing_extensions import Self - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb from .base import OpenAPIResponse from ..types import LazyType diff --git a/src/bentoml/_internal/io_descriptors/numpy.py b/src/bentoml/_internal/io_descriptors/numpy.py index 00917c526bc..a928213eafe 100644 --- a/src/bentoml/_internal/io_descriptors/numpy.py +++ b/src/bentoml/_internal/io_descriptors/numpy.py @@ -25,7 +25,7 @@ import numpy as np from typing_extensions import Self - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb from .. import external_typing as ext from .base import OpenAPIResponse diff --git a/src/bentoml/_internal/io_descriptors/pandas.py b/src/bentoml/_internal/io_descriptors/pandas.py index e5f4e4aa6a7..704be682a67 100644 --- a/src/bentoml/_internal/io_descriptors/pandas.py +++ b/src/bentoml/_internal/io_descriptors/pandas.py @@ -32,7 +32,7 @@ import pandas as pd from typing_extensions import Self - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb from .. import external_typing as ext from .base import OpenAPIResponse diff --git a/src/bentoml/_internal/server/grpc/server.py b/src/bentoml/_internal/server/grpc/server.py index 6f026aff506..b96d87506ef 100644 --- a/src/bentoml/_internal/server/grpc/server.py +++ b/src/bentoml/_internal/server/grpc/server.py @@ -27,7 +27,7 @@ from grpc_health.v1 import health_pb2 as pb_health from grpc_health.v1 import health_pb2_grpc as services_health - from bentoml.grpc.v1alpha1 import service_pb2_grpc as services + from bentoml.grpc.v1 import service_pb2_grpc as services from .servicer import Servicer else: diff --git a/src/bentoml/_internal/server/grpc/servicer.py b/src/bentoml/_internal/server/grpc/servicer.py index c870b28967c..b96ca7b8ea4 100644 --- a/src/bentoml/_internal/server/grpc/servicer.py +++ b/src/bentoml/_internal/server/grpc/servicer.py @@ -28,12 +28,12 @@ from grpc_health.v1 import health from typing_extensions import Self + from bentoml.grpc.v1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2_grpc as services from bentoml.grpc.types import Interceptors from bentoml.grpc.types import AddServicerFn from bentoml.grpc.types import ServicerClass from bentoml.grpc.types import BentoServicerContext - from bentoml.grpc.v1alpha1 import service_pb2 as pb - from bentoml.grpc.v1alpha1 import service_pb2_grpc as services from ...service.service import Service diff --git a/src/bentoml/grpc/interceptors/access.py b/src/bentoml/grpc/interceptors/access.py index a47a889360c..ff60692e999 100644 --- a/src/bentoml/grpc/interceptors/access.py +++ b/src/bentoml/grpc/interceptors/access.py @@ -17,13 +17,13 @@ from grpc import aio from grpc.aio._typing import MetadataType # pylint: disable=unused-import + from bentoml.grpc.v1 import service_pb2 as pb from bentoml.grpc.types import Request from bentoml.grpc.types import Response from bentoml.grpc.types import RpcMethodHandler from bentoml.grpc.types import AsyncHandlerMethod from bentoml.grpc.types import HandlerCallDetails from bentoml.grpc.types import BentoServicerContext - from bentoml.grpc.v1alpha1 import service_pb2 as pb else: pb, _ = import_generated_stubs() grpc, aio = import_grpc() diff --git a/src/bentoml/grpc/interceptors/prometheus.py b/src/bentoml/grpc/interceptors/prometheus.py index 057a0e5e221..a3446a1a274 100644 --- a/src/bentoml/grpc/interceptors/prometheus.py +++ b/src/bentoml/grpc/interceptors/prometheus.py @@ -23,13 +23,13 @@ import grpc from grpc import aio + from bentoml.grpc.v1 import service_pb2 as pb from bentoml.grpc.types import Request from bentoml.grpc.types import Response from bentoml.grpc.types import RpcMethodHandler from bentoml.grpc.types import AsyncHandlerMethod from bentoml.grpc.types import HandlerCallDetails from bentoml.grpc.types import BentoServicerContext - from bentoml.grpc.v1alpha1 import service_pb2 as pb from bentoml._internal.server.metrics.prometheus import PrometheusClient else: pb, _ = import_generated_stubs() diff --git a/src/bentoml/grpc/types.py b/src/bentoml/grpc/types.py index 3ec31fa12f4..942aa44db0f 100644 --- a/src/bentoml/grpc/types.py +++ b/src/bentoml/grpc/types.py @@ -13,9 +13,9 @@ import grpc from grpc import aio - from bentoml.grpc.v1alpha1.service_pb2 import Request - from bentoml.grpc.v1alpha1.service_pb2 import Response - from bentoml.grpc.v1alpha1.service_pb2_grpc import BentoServiceServicer + from bentoml.grpc.v1.service_pb2 import Request + from bentoml.grpc.v1.service_pb2 import Response + from bentoml.grpc.v1.service_pb2_grpc import BentoServiceServicer P = t.TypeVar("P") diff --git a/src/bentoml/grpc/utils/__init__.py b/src/bentoml/grpc/utils/__init__.py index 080043e9f82..a0a998334f6 100644 --- a/src/bentoml/grpc/utils/__init__.py +++ b/src/bentoml/grpc/utils/__init__.py @@ -16,11 +16,11 @@ import grpc + from bentoml.grpc.v1 import service_pb2 as pb from bentoml.exceptions import BentoMLException from bentoml.grpc.types import ProtoField from bentoml.grpc.types import RpcMethodHandler from bentoml.grpc.types import BentoServicerContext - from bentoml.grpc.v1alpha1 import service_pb2 as pb from bentoml._internal.io_descriptors import IODescriptor else: @@ -82,29 +82,6 @@ def grpc_status_to_http_status_map() -> dict[grpc.StatusCode, Enum]: return {v: k for k, v in http_status_to_grpc_status_map().items()} -@lru_cache(maxsize=1) -def filetype_pb_to_mimetype_map() -> dict[pb.File.FileType.ValueType, str]: - return { - pb.File.FILE_TYPE_CSV: "text/csv", - pb.File.FILE_TYPE_PLAINTEXT: "text/plain", - pb.File.FILE_TYPE_JSON: "application/json", - pb.File.FILE_TYPE_BYTES: "application/octet-stream", - pb.File.FILE_TYPE_PDF: "application/pdf", - pb.File.FILE_TYPE_PNG: "image/png", - pb.File.FILE_TYPE_JPEG: "image/jpeg", - pb.File.FILE_TYPE_GIF: "image/gif", - pb.File.FILE_TYPE_TIFF: "image/tiff", - pb.File.FILE_TYPE_BMP: "image/bmp", - pb.File.FILE_TYPE_WEBP: "image/webp", - pb.File.FILE_TYPE_SVG: "image/svg+xml", - } - - -@lru_cache(maxsize=1) -def mimetype_to_filetype_pb_map() -> dict[str, pb.File.FileType.ValueType]: - return {v: k for k, v in filetype_pb_to_mimetype_map().items()} - - def grpc_status_code(err: BentoMLException) -> grpc.StatusCode: """ Convert BentoMLException.error_code to grpc.StatusCode. diff --git a/src/bentoml/grpc/utils/_import_hook.py b/src/bentoml/grpc/utils/_import_hook.py index f819d97e7ea..29b33eac705 100644 --- a/src/bentoml/grpc/utils/_import_hook.py +++ b/src/bentoml/grpc/utils/_import_hook.py @@ -7,7 +7,7 @@ def import_generated_stubs( - version: str = "v1alpha1", + version: str = "v1", file: str = "service.proto", ) -> tuple[types.ModuleType, types.ModuleType]: """ @@ -26,8 +26,8 @@ def import_generated_stubs( from bentoml.grpc.utils import import_generated_stubs - # given proto file bentoml/grpc/v1alpha2/service.proto exists - pb, services = import_generated_stubs(version="v1alpha2", file="service.proto") + # given proto file bentoml/grpc/v1/service.proto exists + pb, services = import_generated_stubs(version="v1", file="service.proto") """ # generate git root from this file's path from bentoml._internal.utils import LazyLoader diff --git a/src/bentoml/grpc/v1/service.proto b/src/bentoml/grpc/v1/service.proto new file mode 100644 index 00000000000..7e63f5f4472 --- /dev/null +++ b/src/bentoml/grpc/v1/service.proto @@ -0,0 +1,259 @@ +syntax = "proto3"; + +package bentoml.grpc.v1; + +import "google/protobuf/struct.proto"; +import "google/protobuf/wrappers.proto"; + +// cc_enable_arenas pre-allocate memory for given message to improve speed. (C++ only) +option cc_enable_arenas = true; +option go_package = "github.com/bentoml/bentoml/grpc/v1;service"; +option java_multiple_files = true; +option java_outer_classname = "ServiceProto"; +option java_package = "com.bentoml.grpc.v1"; +option objc_class_prefix = "SVC"; +option py_generic_services = true; + +// a gRPC BentoServer. +service BentoService { + // Call handles methodcaller of given API entrypoint. + rpc Call(Request) returns (Response) {} +} + +// Request message for incoming Call. +message Request { + // api_name defines the API entrypoint to call. + // api_name is the name of the function defined in bentoml.Service. + // Example: + // + // @svc.api(input=NumpyNdarray(), output=File()) + // def predict(input: NDArray[float]) -> bytes: + // ... + // + // api_name is "predict" in this case. + string api_name = 1; + + oneof content { + // NDArray represents a n-dimensional array of arbitrary type. + NDArray ndarray = 3; + + // DataFrame represents any tabular data type. We are using + // DataFrame as a trivial representation for tabular type. + DataFrame dataframe = 5; + + // Series portrays a series of values. This can be used for + // representing Series types in tabular data. + Series series = 6; + + // File represents for any arbitrary file type. This can be + // plaintext, image, video, audio, etc. + File file = 7; + + // Text represents a string inputs. + google.protobuf.StringValue text = 8; + + // JSON is represented by using google.protobuf.Value. + // see https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/struct.proto + google.protobuf.Value json = 9; + + // Multipart represents a multipart message. + // It comprises of a mapping from given type name to a subset of aforementioned types. + Multipart multipart = 10; + + // serialized_bytes is for data serialized in BentoML's internal serialization format. + bytes serialized_bytes = 2; + } + + // Tensor is similiar to ndarray but with a name + // We are reserving it for now for future use. + // repeated Tensor tensors = 4; + reserved 4, 11 to 13; +} + +// Request message for incoming Call. +message Response { + oneof content { + // NDArray represents a n-dimensional array of arbitrary type. + NDArray ndarray = 1; + + // DataFrame represents any tabular data type. We are using + // DataFrame as a trivial representation for tabular type. + DataFrame dataframe = 3; + + // Series portrays a series of values. This can be used for + // representing Series types in tabular data. + Series series = 5; + + // File represents for any arbitrary file type. This can be + // plaintext, image, video, audio, etc. + File file = 6; + + // Text represents a string inputs. + google.protobuf.StringValue text = 7; + + // JSON is represented by using google.protobuf.Value. + // see https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/struct.proto + google.protobuf.Value json = 8; + + // Multipart represents a multipart message. + // It comprises of a mapping from given type name to a subset of aforementioned types. + Multipart multipart = 9; + + // serialized_bytes is for data serialized in BentoML's internal serialization format. + bytes serialized_bytes = 2; + } + // Tensor is similiar to ndarray but with a name + // We are reserving it for now for future use. + // repeated Tensor tensors = 4; + reserved 4, 10 to 13; +} + +// Part represents possible value types for multipart message. +// These are the same as the types in Request message. +message Part { + oneof representation { + // NDArray represents a n-dimensional array of arbitrary type. + NDArray ndarray = 1; + + // DataFrame represents any tabular data type. We are using + // DataFrame as a trivial representation for tabular type. + DataFrame dataframe = 3; + + // Series portrays a series of values. This can be used for + // representing Series types in tabular data. + Series series = 5; + + // File represents for any arbitrary file type. This can be + // plaintext, image, video, audio, etc. + File file = 6; + + // Text represents a string inputs. + google.protobuf.StringValue text = 7; + + // JSON is represented by using google.protobuf.Value. + // see https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/struct.proto + google.protobuf.Value json = 8; + + // serialized_bytes is for data serialized in BentoML's internal serialization format. + bytes serialized_bytes = 4; + } + + // Tensor is similiar to ndarray but with a name + // We are reserving it for now for future use. + // Tensor tensors = 4; + reserved 2, 9 to 13; +} + +// Multipart represents a multipart message. +// It comprises of a mapping from given type name to a subset of aforementioned types. +message Multipart { + map fields = 1; +} + +// File represents for any arbitrary file type. This can be +// plaintext, image, video, audio, etc. +message File { + // optional file type, let it be csv, text, parquet, etc. + // v1alpha1 uses 1 as FileType enum. + optional string kind = 3; + // contents of file as bytes. + bytes content = 2; +} + +// DataFrame represents any tabular data type. We are using +// DataFrame as a trivial representation for tabular type. +// This message carries given implementation of tabular data based on given orientation. +// TODO: support index, records, etc. +message DataFrame { + // columns name + repeated string column_names = 1; + + // columns orient. + // { column ↠ { index ↠ value } } + repeated Series columns = 2; +} + +// Series portrays a series of values. This can be used for +// representing Series types in tabular data. +message Series { + // A bool parameter value + repeated bool bool_values = 1 [packed = true]; + + // A float parameter value + repeated float float_values = 2 [packed = true]; + + // A int32 parameter value + repeated int32 int32_values = 3 [packed = true]; + + // A int64 parameter value + repeated int64 int64_values = 6 [packed = true]; + + // A string parameter value + repeated string string_values = 5; + + // represents a double parameter value. + repeated double double_values = 4 [packed = true]; +} + +// NDArray represents a n-dimensional array of arbitrary type. +message NDArray { + // Represents data type of a given array. + enum DType { + // Represents a None type. + DTYPE_UNSPECIFIED = 0; + + // Represents an float type. + DTYPE_FLOAT = 1; + + // Represents an double type. + DTYPE_DOUBLE = 2; + + // Represents a bool type. + DTYPE_BOOL = 3; + + // Represents an int32 type. + DTYPE_INT32 = 4; + + // Represents an int64 type. + DTYPE_INT64 = 5; + + // Represents a uint32 type. + DTYPE_UINT32 = 6; + + // Represents a uint64 type. + DTYPE_UINT64 = 7; + + // Represents a string type. + DTYPE_STRING = 8; + } + + // DTYPE is the data type of given array + DType dtype = 1; + + // shape is the shape of given array. + repeated int32 shape = 2; + + // represents a string parameter value. + repeated string string_values = 5; + + // represents a float parameter value. + repeated float float_values = 3 [packed = true]; + + // represents a double parameter value. + repeated double double_values = 4 [packed = true]; + + // represents a bool parameter value. + repeated bool bool_values = 6 [packed = true]; + + // represents a int32 parameter value. + repeated int32 int32_values = 7 [packed = true]; + + // represents a int64 parameter value. + repeated int64 int64_values = 8 [packed = true]; + + // represents a uint32 parameter value. + repeated uint32 uint32_values = 9 [packed = true]; + + // represents a uint64 parameter value. + repeated uint64 uint64_values = 10 [packed = true]; +} diff --git a/src/bentoml/grpc/v1/service_pb2.py b/src/bentoml/grpc/v1/service_pb2.py new file mode 100644 index 00000000000..024c9bdb10c --- /dev/null +++ b/src/bentoml/grpc/v1/service_pb2.py @@ -0,0 +1,890 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: bentoml/grpc/v1/service.proto +"""Generated protocol buffer code.""" +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 +from google.protobuf import service as _service +from google.protobuf import service_reflection +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 +from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='bentoml/grpc/v1/service.proto', + package='bentoml.grpc.v1', + syntax='proto3', + serialized_options=b'\n\023com.bentoml.grpc.v1B\014ServiceProtoP\001Z*github.com/bentoml/bentoml/grpc/v1;service\220\001\001\370\001\001\242\002\003SVC', + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n\x1d\x62\x65ntoml/grpc/v1/service.proto\x12\x0f\x62\x65ntoml.grpc.v1\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\x85\x03\n\x07Request\x12\x10\n\x08\x61pi_name\x18\x01 \x01(\t\x12+\n\x07ndarray\x18\x03 \x01(\x0b\x32\x18.bentoml.grpc.v1.NDArrayH\x00\x12/\n\tdataframe\x18\x05 \x01(\x0b\x32\x1a.bentoml.grpc.v1.DataFrameH\x00\x12)\n\x06series\x18\x06 \x01(\x0b\x32\x17.bentoml.grpc.v1.SeriesH\x00\x12%\n\x04\x66ile\x18\x07 \x01(\x0b\x32\x15.bentoml.grpc.v1.FileH\x00\x12,\n\x04text\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.StringValueH\x00\x12&\n\x04json\x18\t \x01(\x0b\x32\x16.google.protobuf.ValueH\x00\x12/\n\tmultipart\x18\n \x01(\x0b\x32\x1a.bentoml.grpc.v1.MultipartH\x00\x12\x1a\n\x10serialized_bytes\x18\x02 \x01(\x0cH\x00\x42\t\n\x07\x63ontentJ\x04\x08\x04\x10\x05J\x04\x08\x0b\x10\x0e\"\xf4\x02\n\x08Response\x12+\n\x07ndarray\x18\x01 \x01(\x0b\x32\x18.bentoml.grpc.v1.NDArrayH\x00\x12/\n\tdataframe\x18\x03 \x01(\x0b\x32\x1a.bentoml.grpc.v1.DataFrameH\x00\x12)\n\x06series\x18\x05 \x01(\x0b\x32\x17.bentoml.grpc.v1.SeriesH\x00\x12%\n\x04\x66ile\x18\x06 \x01(\x0b\x32\x15.bentoml.grpc.v1.FileH\x00\x12,\n\x04text\x18\x07 \x01(\x0b\x32\x1c.google.protobuf.StringValueH\x00\x12&\n\x04json\x18\x08 \x01(\x0b\x32\x16.google.protobuf.ValueH\x00\x12/\n\tmultipart\x18\t \x01(\x0b\x32\x1a.bentoml.grpc.v1.MultipartH\x00\x12\x1a\n\x10serialized_bytes\x18\x02 \x01(\x0cH\x00\x42\t\n\x07\x63ontentJ\x04\x08\x04\x10\x05J\x04\x08\n\x10\x0e\"\xc6\x02\n\x04Part\x12+\n\x07ndarray\x18\x01 \x01(\x0b\x32\x18.bentoml.grpc.v1.NDArrayH\x00\x12/\n\tdataframe\x18\x03 \x01(\x0b\x32\x1a.bentoml.grpc.v1.DataFrameH\x00\x12)\n\x06series\x18\x05 \x01(\x0b\x32\x17.bentoml.grpc.v1.SeriesH\x00\x12%\n\x04\x66ile\x18\x06 \x01(\x0b\x32\x15.bentoml.grpc.v1.FileH\x00\x12,\n\x04text\x18\x07 \x01(\x0b\x32\x1c.google.protobuf.StringValueH\x00\x12&\n\x04json\x18\x08 \x01(\x0b\x32\x16.google.protobuf.ValueH\x00\x12\x1a\n\x10serialized_bytes\x18\x04 \x01(\x0cH\x00\x42\x10\n\x0erepresentationJ\x04\x08\x02\x10\x03J\x04\x08\t\x10\x0e\"\x89\x01\n\tMultipart\x12\x36\n\x06\x66ields\x18\x01 \x03(\x0b\x32&.bentoml.grpc.v1.Multipart.FieldsEntry\x1a\x44\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.bentoml.grpc.v1.Part:\x02\x38\x01\"3\n\x04\x46ile\x12\x11\n\x04kind\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\x42\x07\n\x05_kind\"K\n\tDataFrame\x12\x14\n\x0c\x63olumn_names\x18\x01 \x03(\t\x12(\n\x07\x63olumns\x18\x02 \x03(\x0b\x32\x17.bentoml.grpc.v1.Series\"\xa1\x01\n\x06Series\x12\x17\n\x0b\x62ool_values\x18\x01 \x03(\x08\x42\x02\x10\x01\x12\x18\n\x0c\x66loat_values\x18\x02 \x03(\x02\x42\x02\x10\x01\x12\x18\n\x0cint32_values\x18\x03 \x03(\x05\x42\x02\x10\x01\x12\x18\n\x0cint64_values\x18\x06 \x03(\x03\x42\x02\x10\x01\x12\x15\n\rstring_values\x18\x05 \x03(\t\x12\x19\n\rdouble_values\x18\x04 \x03(\x01\x42\x02\x10\x01\"\xc2\x03\n\x07NDArray\x12-\n\x05\x64type\x18\x01 \x01(\x0e\x32\x1e.bentoml.grpc.v1.NDArray.DType\x12\r\n\x05shape\x18\x02 \x03(\x05\x12\x15\n\rstring_values\x18\x05 \x03(\t\x12\x18\n\x0c\x66loat_values\x18\x03 \x03(\x02\x42\x02\x10\x01\x12\x19\n\rdouble_values\x18\x04 \x03(\x01\x42\x02\x10\x01\x12\x17\n\x0b\x62ool_values\x18\x06 \x03(\x08\x42\x02\x10\x01\x12\x18\n\x0cint32_values\x18\x07 \x03(\x05\x42\x02\x10\x01\x12\x18\n\x0cint64_values\x18\x08 \x03(\x03\x42\x02\x10\x01\x12\x19\n\ruint32_values\x18\t \x03(\rB\x02\x10\x01\x12\x19\n\ruint64_values\x18\n \x03(\x04\x42\x02\x10\x01\"\xa9\x01\n\x05\x44Type\x12\x15\n\x11\x44TYPE_UNSPECIFIED\x10\x00\x12\x0f\n\x0b\x44TYPE_FLOAT\x10\x01\x12\x10\n\x0c\x44TYPE_DOUBLE\x10\x02\x12\x0e\n\nDTYPE_BOOL\x10\x03\x12\x0f\n\x0b\x44TYPE_INT32\x10\x04\x12\x0f\n\x0b\x44TYPE_INT64\x10\x05\x12\x10\n\x0c\x44TYPE_UINT32\x10\x06\x12\x10\n\x0c\x44TYPE_UINT64\x10\x07\x12\x10\n\x0c\x44TYPE_STRING\x10\x08\x32M\n\x0c\x42\x65ntoService\x12=\n\x04\x43\x61ll\x12\x18.bentoml.grpc.v1.Request\x1a\x19.bentoml.grpc.v1.Response\"\x00\x42]\n\x13\x63om.bentoml.grpc.v1B\x0cServiceProtoP\x01Z*github.com/bentoml/bentoml/grpc/v1;service\x90\x01\x01\xf8\x01\x01\xa2\x02\x03SVCb\x06proto3' + , + dependencies=[google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,]) + + + +_NDARRAY_DTYPE = _descriptor.EnumDescriptor( + name='DType', + full_name='bentoml.grpc.v1.NDArray.DType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='DTYPE_UNSPECIFIED', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DTYPE_FLOAT', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DTYPE_DOUBLE', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DTYPE_BOOL', index=3, number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DTYPE_INT32', index=4, number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DTYPE_INT64', index=5, number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DTYPE_UINT32', index=6, number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DTYPE_UINT64', index=7, number=7, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DTYPE_STRING', index=8, number=8, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=1924, + serialized_end=2093, +) +_sym_db.RegisterEnumDescriptor(_NDARRAY_DTYPE) + + +_REQUEST = _descriptor.Descriptor( + name='Request', + full_name='bentoml.grpc.v1.Request', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='api_name', full_name='bentoml.grpc.v1.Request.api_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='ndarray', full_name='bentoml.grpc.v1.Request.ndarray', index=1, + number=3, 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), + _descriptor.FieldDescriptor( + name='dataframe', full_name='bentoml.grpc.v1.Request.dataframe', index=2, + 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), + _descriptor.FieldDescriptor( + name='series', full_name='bentoml.grpc.v1.Request.series', index=3, + number=6, 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), + _descriptor.FieldDescriptor( + name='file', full_name='bentoml.grpc.v1.Request.file', index=4, + number=7, 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), + _descriptor.FieldDescriptor( + name='text', full_name='bentoml.grpc.v1.Request.text', index=5, + number=8, 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), + _descriptor.FieldDescriptor( + name='json', full_name='bentoml.grpc.v1.Request.json', index=6, + number=9, 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), + _descriptor.FieldDescriptor( + name='multipart', full_name='bentoml.grpc.v1.Request.multipart', index=7, + number=10, 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), + _descriptor.FieldDescriptor( + name='serialized_bytes', full_name='bentoml.grpc.v1.Request.serialized_bytes', index=8, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + 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='content', full_name='bentoml.grpc.v1.Request.content', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=113, + serialized_end=502, +) + + +_RESPONSE = _descriptor.Descriptor( + name='Response', + full_name='bentoml.grpc.v1.Response', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='ndarray', full_name='bentoml.grpc.v1.Response.ndarray', index=0, + number=1, 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), + _descriptor.FieldDescriptor( + name='dataframe', full_name='bentoml.grpc.v1.Response.dataframe', index=1, + number=3, 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), + _descriptor.FieldDescriptor( + name='series', full_name='bentoml.grpc.v1.Response.series', index=2, + 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), + _descriptor.FieldDescriptor( + name='file', full_name='bentoml.grpc.v1.Response.file', index=3, + number=6, 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), + _descriptor.FieldDescriptor( + name='text', full_name='bentoml.grpc.v1.Response.text', index=4, + number=7, 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), + _descriptor.FieldDescriptor( + name='json', full_name='bentoml.grpc.v1.Response.json', index=5, + number=8, 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), + _descriptor.FieldDescriptor( + name='multipart', full_name='bentoml.grpc.v1.Response.multipart', index=6, + number=9, 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), + _descriptor.FieldDescriptor( + name='serialized_bytes', full_name='bentoml.grpc.v1.Response.serialized_bytes', index=7, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + 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='content', full_name='bentoml.grpc.v1.Response.content', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=505, + serialized_end=877, +) + + +_PART = _descriptor.Descriptor( + name='Part', + full_name='bentoml.grpc.v1.Part', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='ndarray', full_name='bentoml.grpc.v1.Part.ndarray', index=0, + number=1, 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), + _descriptor.FieldDescriptor( + name='dataframe', full_name='bentoml.grpc.v1.Part.dataframe', index=1, + number=3, 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), + _descriptor.FieldDescriptor( + name='series', full_name='bentoml.grpc.v1.Part.series', index=2, + 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), + _descriptor.FieldDescriptor( + name='file', full_name='bentoml.grpc.v1.Part.file', index=3, + number=6, 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), + _descriptor.FieldDescriptor( + name='text', full_name='bentoml.grpc.v1.Part.text', index=4, + number=7, 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), + _descriptor.FieldDescriptor( + name='json', full_name='bentoml.grpc.v1.Part.json', index=5, + number=8, 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), + _descriptor.FieldDescriptor( + name='serialized_bytes', full_name='bentoml.grpc.v1.Part.serialized_bytes', index=6, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + 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='representation', full_name='bentoml.grpc.v1.Part.representation', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=880, + serialized_end=1206, +) + + +_MULTIPART_FIELDSENTRY = _descriptor.Descriptor( + name='FieldsEntry', + full_name='bentoml.grpc.v1.Multipart.FieldsEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='bentoml.grpc.v1.Multipart.FieldsEntry.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='bentoml.grpc.v1.Multipart.FieldsEntry.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=1278, + serialized_end=1346, +) + +_MULTIPART = _descriptor.Descriptor( + name='Multipart', + full_name='bentoml.grpc.v1.Multipart', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='fields', full_name='bentoml.grpc.v1.Multipart.fields', index=0, + number=1, 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=[_MULTIPART_FIELDSENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1209, + serialized_end=1346, +) + + +_FILE = _descriptor.Descriptor( + name='File', + full_name='bentoml.grpc.v1.File', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='kind', full_name='bentoml.grpc.v1.File.kind', index=0, + 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='content', full_name='bentoml.grpc.v1.File.content', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + 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='_kind', full_name='bentoml.grpc.v1.File._kind', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=1348, + serialized_end=1399, +) + + +_DATAFRAME = _descriptor.Descriptor( + name='DataFrame', + full_name='bentoml.grpc.v1.DataFrame', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='column_names', full_name='bentoml.grpc.v1.DataFrame.column_names', index=0, + number=1, 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='columns', full_name='bentoml.grpc.v1.DataFrame.columns', 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=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1401, + serialized_end=1476, +) + + +_SERIES = _descriptor.Descriptor( + name='Series', + full_name='bentoml.grpc.v1.Series', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='bool_values', full_name='bentoml.grpc.v1.Series.bool_values', 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=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='float_values', full_name='bentoml.grpc.v1.Series.float_values', index=1, + number=2, 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=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='int32_values', full_name='bentoml.grpc.v1.Series.int32_values', index=2, + number=3, 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=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='int64_values', full_name='bentoml.grpc.v1.Series.int64_values', index=3, + number=6, 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=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='string_values', full_name='bentoml.grpc.v1.Series.string_values', index=4, + number=5, 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='double_values', full_name='bentoml.grpc.v1.Series.double_values', index=5, + number=4, 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=b'\020\001', 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=1479, + serialized_end=1640, +) + + +_NDARRAY = _descriptor.Descriptor( + name='NDArray', + full_name='bentoml.grpc.v1.NDArray', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='dtype', full_name='bentoml.grpc.v1.NDArray.dtype', index=0, + number=1, type=14, cpp_type=8, 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='shape', full_name='bentoml.grpc.v1.NDArray.shape', 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='string_values', full_name='bentoml.grpc.v1.NDArray.string_values', index=2, + number=5, 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='float_values', full_name='bentoml.grpc.v1.NDArray.float_values', index=3, + number=3, 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=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='double_values', full_name='bentoml.grpc.v1.NDArray.double_values', index=4, + number=4, 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=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='bool_values', full_name='bentoml.grpc.v1.NDArray.bool_values', index=5, + number=6, 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=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='int32_values', full_name='bentoml.grpc.v1.NDArray.int32_values', index=6, + number=7, 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=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='int64_values', full_name='bentoml.grpc.v1.NDArray.int64_values', index=7, + number=8, 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=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='uint32_values', full_name='bentoml.grpc.v1.NDArray.uint32_values', index=8, + number=9, 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=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='uint64_values', full_name='bentoml.grpc.v1.NDArray.uint64_values', index=9, + number=10, 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=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _NDARRAY_DTYPE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1643, + serialized_end=2093, +) + +_REQUEST.fields_by_name['ndarray'].message_type = _NDARRAY +_REQUEST.fields_by_name['dataframe'].message_type = _DATAFRAME +_REQUEST.fields_by_name['series'].message_type = _SERIES +_REQUEST.fields_by_name['file'].message_type = _FILE +_REQUEST.fields_by_name['text'].message_type = google_dot_protobuf_dot_wrappers__pb2._STRINGVALUE +_REQUEST.fields_by_name['json'].message_type = google_dot_protobuf_dot_struct__pb2._VALUE +_REQUEST.fields_by_name['multipart'].message_type = _MULTIPART +_REQUEST.oneofs_by_name['content'].fields.append( + _REQUEST.fields_by_name['ndarray']) +_REQUEST.fields_by_name['ndarray'].containing_oneof = _REQUEST.oneofs_by_name['content'] +_REQUEST.oneofs_by_name['content'].fields.append( + _REQUEST.fields_by_name['dataframe']) +_REQUEST.fields_by_name['dataframe'].containing_oneof = _REQUEST.oneofs_by_name['content'] +_REQUEST.oneofs_by_name['content'].fields.append( + _REQUEST.fields_by_name['series']) +_REQUEST.fields_by_name['series'].containing_oneof = _REQUEST.oneofs_by_name['content'] +_REQUEST.oneofs_by_name['content'].fields.append( + _REQUEST.fields_by_name['file']) +_REQUEST.fields_by_name['file'].containing_oneof = _REQUEST.oneofs_by_name['content'] +_REQUEST.oneofs_by_name['content'].fields.append( + _REQUEST.fields_by_name['text']) +_REQUEST.fields_by_name['text'].containing_oneof = _REQUEST.oneofs_by_name['content'] +_REQUEST.oneofs_by_name['content'].fields.append( + _REQUEST.fields_by_name['json']) +_REQUEST.fields_by_name['json'].containing_oneof = _REQUEST.oneofs_by_name['content'] +_REQUEST.oneofs_by_name['content'].fields.append( + _REQUEST.fields_by_name['multipart']) +_REQUEST.fields_by_name['multipart'].containing_oneof = _REQUEST.oneofs_by_name['content'] +_REQUEST.oneofs_by_name['content'].fields.append( + _REQUEST.fields_by_name['serialized_bytes']) +_REQUEST.fields_by_name['serialized_bytes'].containing_oneof = _REQUEST.oneofs_by_name['content'] +_RESPONSE.fields_by_name['ndarray'].message_type = _NDARRAY +_RESPONSE.fields_by_name['dataframe'].message_type = _DATAFRAME +_RESPONSE.fields_by_name['series'].message_type = _SERIES +_RESPONSE.fields_by_name['file'].message_type = _FILE +_RESPONSE.fields_by_name['text'].message_type = google_dot_protobuf_dot_wrappers__pb2._STRINGVALUE +_RESPONSE.fields_by_name['json'].message_type = google_dot_protobuf_dot_struct__pb2._VALUE +_RESPONSE.fields_by_name['multipart'].message_type = _MULTIPART +_RESPONSE.oneofs_by_name['content'].fields.append( + _RESPONSE.fields_by_name['ndarray']) +_RESPONSE.fields_by_name['ndarray'].containing_oneof = _RESPONSE.oneofs_by_name['content'] +_RESPONSE.oneofs_by_name['content'].fields.append( + _RESPONSE.fields_by_name['dataframe']) +_RESPONSE.fields_by_name['dataframe'].containing_oneof = _RESPONSE.oneofs_by_name['content'] +_RESPONSE.oneofs_by_name['content'].fields.append( + _RESPONSE.fields_by_name['series']) +_RESPONSE.fields_by_name['series'].containing_oneof = _RESPONSE.oneofs_by_name['content'] +_RESPONSE.oneofs_by_name['content'].fields.append( + _RESPONSE.fields_by_name['file']) +_RESPONSE.fields_by_name['file'].containing_oneof = _RESPONSE.oneofs_by_name['content'] +_RESPONSE.oneofs_by_name['content'].fields.append( + _RESPONSE.fields_by_name['text']) +_RESPONSE.fields_by_name['text'].containing_oneof = _RESPONSE.oneofs_by_name['content'] +_RESPONSE.oneofs_by_name['content'].fields.append( + _RESPONSE.fields_by_name['json']) +_RESPONSE.fields_by_name['json'].containing_oneof = _RESPONSE.oneofs_by_name['content'] +_RESPONSE.oneofs_by_name['content'].fields.append( + _RESPONSE.fields_by_name['multipart']) +_RESPONSE.fields_by_name['multipart'].containing_oneof = _RESPONSE.oneofs_by_name['content'] +_RESPONSE.oneofs_by_name['content'].fields.append( + _RESPONSE.fields_by_name['serialized_bytes']) +_RESPONSE.fields_by_name['serialized_bytes'].containing_oneof = _RESPONSE.oneofs_by_name['content'] +_PART.fields_by_name['ndarray'].message_type = _NDARRAY +_PART.fields_by_name['dataframe'].message_type = _DATAFRAME +_PART.fields_by_name['series'].message_type = _SERIES +_PART.fields_by_name['file'].message_type = _FILE +_PART.fields_by_name['text'].message_type = google_dot_protobuf_dot_wrappers__pb2._STRINGVALUE +_PART.fields_by_name['json'].message_type = google_dot_protobuf_dot_struct__pb2._VALUE +_PART.oneofs_by_name['representation'].fields.append( + _PART.fields_by_name['ndarray']) +_PART.fields_by_name['ndarray'].containing_oneof = _PART.oneofs_by_name['representation'] +_PART.oneofs_by_name['representation'].fields.append( + _PART.fields_by_name['dataframe']) +_PART.fields_by_name['dataframe'].containing_oneof = _PART.oneofs_by_name['representation'] +_PART.oneofs_by_name['representation'].fields.append( + _PART.fields_by_name['series']) +_PART.fields_by_name['series'].containing_oneof = _PART.oneofs_by_name['representation'] +_PART.oneofs_by_name['representation'].fields.append( + _PART.fields_by_name['file']) +_PART.fields_by_name['file'].containing_oneof = _PART.oneofs_by_name['representation'] +_PART.oneofs_by_name['representation'].fields.append( + _PART.fields_by_name['text']) +_PART.fields_by_name['text'].containing_oneof = _PART.oneofs_by_name['representation'] +_PART.oneofs_by_name['representation'].fields.append( + _PART.fields_by_name['json']) +_PART.fields_by_name['json'].containing_oneof = _PART.oneofs_by_name['representation'] +_PART.oneofs_by_name['representation'].fields.append( + _PART.fields_by_name['serialized_bytes']) +_PART.fields_by_name['serialized_bytes'].containing_oneof = _PART.oneofs_by_name['representation'] +_MULTIPART_FIELDSENTRY.fields_by_name['value'].message_type = _PART +_MULTIPART_FIELDSENTRY.containing_type = _MULTIPART +_MULTIPART.fields_by_name['fields'].message_type = _MULTIPART_FIELDSENTRY +_FILE.oneofs_by_name['_kind'].fields.append( + _FILE.fields_by_name['kind']) +_FILE.fields_by_name['kind'].containing_oneof = _FILE.oneofs_by_name['_kind'] +_DATAFRAME.fields_by_name['columns'].message_type = _SERIES +_NDARRAY.fields_by_name['dtype'].enum_type = _NDARRAY_DTYPE +_NDARRAY_DTYPE.containing_type = _NDARRAY +DESCRIPTOR.message_types_by_name['Request'] = _REQUEST +DESCRIPTOR.message_types_by_name['Response'] = _RESPONSE +DESCRIPTOR.message_types_by_name['Part'] = _PART +DESCRIPTOR.message_types_by_name['Multipart'] = _MULTIPART +DESCRIPTOR.message_types_by_name['File'] = _FILE +DESCRIPTOR.message_types_by_name['DataFrame'] = _DATAFRAME +DESCRIPTOR.message_types_by_name['Series'] = _SERIES +DESCRIPTOR.message_types_by_name['NDArray'] = _NDARRAY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Request = _reflection.GeneratedProtocolMessageType('Request', (_message.Message,), { + 'DESCRIPTOR' : _REQUEST, + '__module__' : 'bentoml.grpc.v1.service_pb2' + # @@protoc_insertion_point(class_scope:bentoml.grpc.v1.Request) + }) +_sym_db.RegisterMessage(Request) + +Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), { + 'DESCRIPTOR' : _RESPONSE, + '__module__' : 'bentoml.grpc.v1.service_pb2' + # @@protoc_insertion_point(class_scope:bentoml.grpc.v1.Response) + }) +_sym_db.RegisterMessage(Response) + +Part = _reflection.GeneratedProtocolMessageType('Part', (_message.Message,), { + 'DESCRIPTOR' : _PART, + '__module__' : 'bentoml.grpc.v1.service_pb2' + # @@protoc_insertion_point(class_scope:bentoml.grpc.v1.Part) + }) +_sym_db.RegisterMessage(Part) + +Multipart = _reflection.GeneratedProtocolMessageType('Multipart', (_message.Message,), { + + 'FieldsEntry' : _reflection.GeneratedProtocolMessageType('FieldsEntry', (_message.Message,), { + 'DESCRIPTOR' : _MULTIPART_FIELDSENTRY, + '__module__' : 'bentoml.grpc.v1.service_pb2' + # @@protoc_insertion_point(class_scope:bentoml.grpc.v1.Multipart.FieldsEntry) + }) + , + 'DESCRIPTOR' : _MULTIPART, + '__module__' : 'bentoml.grpc.v1.service_pb2' + # @@protoc_insertion_point(class_scope:bentoml.grpc.v1.Multipart) + }) +_sym_db.RegisterMessage(Multipart) +_sym_db.RegisterMessage(Multipart.FieldsEntry) + +File = _reflection.GeneratedProtocolMessageType('File', (_message.Message,), { + 'DESCRIPTOR' : _FILE, + '__module__' : 'bentoml.grpc.v1.service_pb2' + # @@protoc_insertion_point(class_scope:bentoml.grpc.v1.File) + }) +_sym_db.RegisterMessage(File) + +DataFrame = _reflection.GeneratedProtocolMessageType('DataFrame', (_message.Message,), { + 'DESCRIPTOR' : _DATAFRAME, + '__module__' : 'bentoml.grpc.v1.service_pb2' + # @@protoc_insertion_point(class_scope:bentoml.grpc.v1.DataFrame) + }) +_sym_db.RegisterMessage(DataFrame) + +Series = _reflection.GeneratedProtocolMessageType('Series', (_message.Message,), { + 'DESCRIPTOR' : _SERIES, + '__module__' : 'bentoml.grpc.v1.service_pb2' + # @@protoc_insertion_point(class_scope:bentoml.grpc.v1.Series) + }) +_sym_db.RegisterMessage(Series) + +NDArray = _reflection.GeneratedProtocolMessageType('NDArray', (_message.Message,), { + 'DESCRIPTOR' : _NDARRAY, + '__module__' : 'bentoml.grpc.v1.service_pb2' + # @@protoc_insertion_point(class_scope:bentoml.grpc.v1.NDArray) + }) +_sym_db.RegisterMessage(NDArray) + + +DESCRIPTOR._options = None +_MULTIPART_FIELDSENTRY._options = None +_SERIES.fields_by_name['bool_values']._options = None +_SERIES.fields_by_name['float_values']._options = None +_SERIES.fields_by_name['int32_values']._options = None +_SERIES.fields_by_name['int64_values']._options = None +_SERIES.fields_by_name['double_values']._options = None +_NDARRAY.fields_by_name['float_values']._options = None +_NDARRAY.fields_by_name['double_values']._options = None +_NDARRAY.fields_by_name['bool_values']._options = None +_NDARRAY.fields_by_name['int32_values']._options = None +_NDARRAY.fields_by_name['int64_values']._options = None +_NDARRAY.fields_by_name['uint32_values']._options = None +_NDARRAY.fields_by_name['uint64_values']._options = None + +_BENTOSERVICE = _descriptor.ServiceDescriptor( + name='BentoService', + full_name='bentoml.grpc.v1.BentoService', + file=DESCRIPTOR, + index=0, + serialized_options=None, + create_key=_descriptor._internal_create_key, + serialized_start=2095, + serialized_end=2172, + methods=[ + _descriptor.MethodDescriptor( + name='Call', + full_name='bentoml.grpc.v1.BentoService.Call', + index=0, + containing_service=None, + input_type=_REQUEST, + output_type=_RESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), +]) +_sym_db.RegisterServiceDescriptor(_BENTOSERVICE) + +DESCRIPTOR.services_by_name['BentoService'] = _BENTOSERVICE + +BentoService = service_reflection.GeneratedServiceType('BentoService', (_service.Service,), dict( + DESCRIPTOR = _BENTOSERVICE, + __module__ = 'bentoml.grpc.v1.service_pb2' + )) + +BentoService_Stub = service_reflection.GeneratedServiceStubType('BentoService_Stub', (BentoService,), dict( + DESCRIPTOR = _BENTOSERVICE, + __module__ = 'bentoml.grpc.v1.service_pb2' + )) + + +# @@protoc_insertion_point(module_scope) diff --git a/src/bentoml/grpc/v1/service_pb2.pyi b/src/bentoml/grpc/v1/service_pb2.pyi new file mode 100644 index 00000000000..d7996c9cd86 --- /dev/null +++ b/src/bentoml/grpc/v1/service_pb2.pyi @@ -0,0 +1,496 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" +import abc +import builtins +import collections.abc +import concurrent.futures +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message +import google.protobuf.service +import google.protobuf.struct_pb2 +import google.protobuf.wrappers_pb2 +import sys +import typing + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class Request(google.protobuf.message.Message): + """Request message for incoming Call.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + API_NAME_FIELD_NUMBER: builtins.int + NDARRAY_FIELD_NUMBER: builtins.int + DATAFRAME_FIELD_NUMBER: builtins.int + SERIES_FIELD_NUMBER: builtins.int + FILE_FIELD_NUMBER: builtins.int + TEXT_FIELD_NUMBER: builtins.int + JSON_FIELD_NUMBER: builtins.int + MULTIPART_FIELD_NUMBER: builtins.int + SERIALIZED_BYTES_FIELD_NUMBER: builtins.int + api_name: builtins.str + """api_name defines the API entrypoint to call. + api_name is the name of the function defined in bentoml.Service. + Example: + + @svc.api(input=NumpyNdarray(), output=File()) + def predict(input: NDArray[float]) -> bytes: + ... + + api_name is "predict" in this case. + """ + @property + def ndarray(self) -> global___NDArray: + """NDArray represents a n-dimensional array of arbitrary type.""" + @property + def dataframe(self) -> global___DataFrame: + """DataFrame represents any tabular data type. We are using + DataFrame as a trivial representation for tabular type. + """ + @property + def series(self) -> global___Series: + """Series portrays a series of values. This can be used for + representing Series types in tabular data. + """ + @property + def file(self) -> global___File: + """File represents for any arbitrary file type. This can be + plaintext, image, video, audio, etc. + """ + @property + def text(self) -> google.protobuf.wrappers_pb2.StringValue: + """Text represents a string inputs.""" + @property + def json(self) -> google.protobuf.struct_pb2.Value: + """JSON is represented by using google.protobuf.Value. + see https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/struct.proto + """ + @property + def multipart(self) -> global___Multipart: + """Multipart represents a multipart message. + It comprises of a mapping from given type name to a subset of aforementioned types. + """ + serialized_bytes: builtins.bytes + """serialized_bytes is for data serialized in BentoML's internal serialization format.""" + def __init__( + self, + *, + api_name: builtins.str = ..., + ndarray: global___NDArray | None = ..., + dataframe: global___DataFrame | None = ..., + series: global___Series | None = ..., + file: global___File | None = ..., + text: google.protobuf.wrappers_pb2.StringValue | None = ..., + json: google.protobuf.struct_pb2.Value | None = ..., + multipart: global___Multipart | None = ..., + serialized_bytes: builtins.bytes = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["content", b"content", "dataframe", b"dataframe", "file", b"file", "json", b"json", "multipart", b"multipart", "ndarray", b"ndarray", "serialized_bytes", b"serialized_bytes", "series", b"series", "text", b"text"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["api_name", b"api_name", "content", b"content", "dataframe", b"dataframe", "file", b"file", "json", b"json", "multipart", b"multipart", "ndarray", b"ndarray", "serialized_bytes", b"serialized_bytes", "series", b"series", "text", b"text"]) -> None: ... + def WhichOneof(self, oneof_group: typing_extensions.Literal["content", b"content"]) -> typing_extensions.Literal["ndarray", "dataframe", "series", "file", "text", "json", "multipart", "serialized_bytes"] | None: ... + +global___Request = Request + +class Response(google.protobuf.message.Message): + """Request message for incoming Call.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NDARRAY_FIELD_NUMBER: builtins.int + DATAFRAME_FIELD_NUMBER: builtins.int + SERIES_FIELD_NUMBER: builtins.int + FILE_FIELD_NUMBER: builtins.int + TEXT_FIELD_NUMBER: builtins.int + JSON_FIELD_NUMBER: builtins.int + MULTIPART_FIELD_NUMBER: builtins.int + SERIALIZED_BYTES_FIELD_NUMBER: builtins.int + @property + def ndarray(self) -> global___NDArray: + """NDArray represents a n-dimensional array of arbitrary type.""" + @property + def dataframe(self) -> global___DataFrame: + """DataFrame represents any tabular data type. We are using + DataFrame as a trivial representation for tabular type. + """ + @property + def series(self) -> global___Series: + """Series portrays a series of values. This can be used for + representing Series types in tabular data. + """ + @property + def file(self) -> global___File: + """File represents for any arbitrary file type. This can be + plaintext, image, video, audio, etc. + """ + @property + def text(self) -> google.protobuf.wrappers_pb2.StringValue: + """Text represents a string inputs.""" + @property + def json(self) -> google.protobuf.struct_pb2.Value: + """JSON is represented by using google.protobuf.Value. + see https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/struct.proto + """ + @property + def multipart(self) -> global___Multipart: + """Multipart represents a multipart message. + It comprises of a mapping from given type name to a subset of aforementioned types. + """ + serialized_bytes: builtins.bytes + """serialized_bytes is for data serialized in BentoML's internal serialization format.""" + def __init__( + self, + *, + ndarray: global___NDArray | None = ..., + dataframe: global___DataFrame | None = ..., + series: global___Series | None = ..., + file: global___File | None = ..., + text: google.protobuf.wrappers_pb2.StringValue | None = ..., + json: google.protobuf.struct_pb2.Value | None = ..., + multipart: global___Multipart | None = ..., + serialized_bytes: builtins.bytes = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["content", b"content", "dataframe", b"dataframe", "file", b"file", "json", b"json", "multipart", b"multipart", "ndarray", b"ndarray", "serialized_bytes", b"serialized_bytes", "series", b"series", "text", b"text"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["content", b"content", "dataframe", b"dataframe", "file", b"file", "json", b"json", "multipart", b"multipart", "ndarray", b"ndarray", "serialized_bytes", b"serialized_bytes", "series", b"series", "text", b"text"]) -> None: ... + def WhichOneof(self, oneof_group: typing_extensions.Literal["content", b"content"]) -> typing_extensions.Literal["ndarray", "dataframe", "series", "file", "text", "json", "multipart", "serialized_bytes"] | None: ... + +global___Response = Response + +class Part(google.protobuf.message.Message): + """Part represents possible value types for multipart message. + These are the same as the types in Request message. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NDARRAY_FIELD_NUMBER: builtins.int + DATAFRAME_FIELD_NUMBER: builtins.int + SERIES_FIELD_NUMBER: builtins.int + FILE_FIELD_NUMBER: builtins.int + TEXT_FIELD_NUMBER: builtins.int + JSON_FIELD_NUMBER: builtins.int + SERIALIZED_BYTES_FIELD_NUMBER: builtins.int + @property + def ndarray(self) -> global___NDArray: + """NDArray represents a n-dimensional array of arbitrary type.""" + @property + def dataframe(self) -> global___DataFrame: + """DataFrame represents any tabular data type. We are using + DataFrame as a trivial representation for tabular type. + """ + @property + def series(self) -> global___Series: + """Series portrays a series of values. This can be used for + representing Series types in tabular data. + """ + @property + def file(self) -> global___File: + """File represents for any arbitrary file type. This can be + plaintext, image, video, audio, etc. + """ + @property + def text(self) -> google.protobuf.wrappers_pb2.StringValue: + """Text represents a string inputs.""" + @property + def json(self) -> google.protobuf.struct_pb2.Value: + """JSON is represented by using google.protobuf.Value. + see https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/struct.proto + """ + serialized_bytes: builtins.bytes + """serialized_bytes is for data serialized in BentoML's internal serialization format.""" + def __init__( + self, + *, + ndarray: global___NDArray | None = ..., + dataframe: global___DataFrame | None = ..., + series: global___Series | None = ..., + file: global___File | None = ..., + text: google.protobuf.wrappers_pb2.StringValue | None = ..., + json: google.protobuf.struct_pb2.Value | None = ..., + serialized_bytes: builtins.bytes = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["dataframe", b"dataframe", "file", b"file", "json", b"json", "ndarray", b"ndarray", "representation", b"representation", "serialized_bytes", b"serialized_bytes", "series", b"series", "text", b"text"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["dataframe", b"dataframe", "file", b"file", "json", b"json", "ndarray", b"ndarray", "representation", b"representation", "serialized_bytes", b"serialized_bytes", "series", b"series", "text", b"text"]) -> None: ... + def WhichOneof(self, oneof_group: typing_extensions.Literal["representation", b"representation"]) -> typing_extensions.Literal["ndarray", "dataframe", "series", "file", "text", "json", "serialized_bytes"] | None: ... + +global___Part = Part + +class Multipart(google.protobuf.message.Message): + """Multipart represents a multipart message. + It comprises of a mapping from given type name to a subset of aforementioned types. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class FieldsEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___Part: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___Part | None = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["value", b"value"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["key", b"key", "value", b"value"]) -> None: ... + + FIELDS_FIELD_NUMBER: builtins.int + @property + def fields(self) -> google.protobuf.internal.containers.MessageMap[builtins.str, global___Part]: ... + def __init__( + self, + *, + fields: collections.abc.Mapping[builtins.str, global___Part] | None = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["fields", b"fields"]) -> None: ... + +global___Multipart = Multipart + +class File(google.protobuf.message.Message): + """File represents for any arbitrary file type. This can be + plaintext, image, video, audio, etc. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KIND_FIELD_NUMBER: builtins.int + CONTENT_FIELD_NUMBER: builtins.int + kind: builtins.str + """optional file type, let it be csv, text, parquet, etc. + v1alpha1 uses 1 as FileType enum. + """ + content: builtins.bytes + """contents of file as bytes.""" + def __init__( + self, + *, + kind: builtins.str | None = ..., + content: builtins.bytes = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["_kind", b"_kind", "kind", b"kind"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["_kind", b"_kind", "content", b"content", "kind", b"kind"]) -> None: ... + def WhichOneof(self, oneof_group: typing_extensions.Literal["_kind", b"_kind"]) -> typing_extensions.Literal["kind"] | None: ... + +global___File = File + +class DataFrame(google.protobuf.message.Message): + """DataFrame represents any tabular data type. We are using + DataFrame as a trivial representation for tabular type. + This message carries given implementation of tabular data based on given orientation. + TODO: support index, records, etc. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + COLUMN_NAMES_FIELD_NUMBER: builtins.int + COLUMNS_FIELD_NUMBER: builtins.int + @property + def column_names(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """columns name""" + @property + def columns(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Series]: + """columns orient. + { column ↠ { index ↠ value } } + """ + def __init__( + self, + *, + column_names: collections.abc.Iterable[builtins.str] | None = ..., + columns: collections.abc.Iterable[global___Series] | None = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["column_names", b"column_names", "columns", b"columns"]) -> None: ... + +global___DataFrame = DataFrame + +class Series(google.protobuf.message.Message): + """Series portrays a series of values. This can be used for + representing Series types in tabular data. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + BOOL_VALUES_FIELD_NUMBER: builtins.int + FLOAT_VALUES_FIELD_NUMBER: builtins.int + INT32_VALUES_FIELD_NUMBER: builtins.int + INT64_VALUES_FIELD_NUMBER: builtins.int + STRING_VALUES_FIELD_NUMBER: builtins.int + DOUBLE_VALUES_FIELD_NUMBER: builtins.int + @property + def bool_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.bool]: + """A bool parameter value""" + @property + def float_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.float]: + """A float parameter value""" + @property + def int32_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """A int32 parameter value""" + @property + def int64_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """A int64 parameter value""" + @property + def string_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """A string parameter value""" + @property + def double_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.float]: + """represents a double parameter value.""" + def __init__( + self, + *, + bool_values: collections.abc.Iterable[builtins.bool] | None = ..., + float_values: collections.abc.Iterable[builtins.float] | None = ..., + int32_values: collections.abc.Iterable[builtins.int] | None = ..., + int64_values: collections.abc.Iterable[builtins.int] | None = ..., + string_values: collections.abc.Iterable[builtins.str] | None = ..., + double_values: collections.abc.Iterable[builtins.float] | None = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["bool_values", b"bool_values", "double_values", b"double_values", "float_values", b"float_values", "int32_values", b"int32_values", "int64_values", b"int64_values", "string_values", b"string_values"]) -> None: ... + +global___Series = Series + +class NDArray(google.protobuf.message.Message): + """NDArray represents a n-dimensional array of arbitrary type.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class _DType: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _DTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[NDArray._DType.ValueType], builtins.type): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + DTYPE_UNSPECIFIED: NDArray._DType.ValueType # 0 + """Represents a None type.""" + DTYPE_FLOAT: NDArray._DType.ValueType # 1 + """Represents an float type.""" + DTYPE_DOUBLE: NDArray._DType.ValueType # 2 + """Represents an double type.""" + DTYPE_BOOL: NDArray._DType.ValueType # 3 + """Represents a bool type.""" + DTYPE_INT32: NDArray._DType.ValueType # 4 + """Represents an int32 type.""" + DTYPE_INT64: NDArray._DType.ValueType # 5 + """Represents an int64 type.""" + DTYPE_UINT32: NDArray._DType.ValueType # 6 + """Represents a uint32 type.""" + DTYPE_UINT64: NDArray._DType.ValueType # 7 + """Represents a uint64 type.""" + DTYPE_STRING: NDArray._DType.ValueType # 8 + """Represents a string type.""" + + class DType(_DType, metaclass=_DTypeEnumTypeWrapper): + """Represents data type of a given array.""" + + DTYPE_UNSPECIFIED: NDArray.DType.ValueType # 0 + """Represents a None type.""" + DTYPE_FLOAT: NDArray.DType.ValueType # 1 + """Represents an float type.""" + DTYPE_DOUBLE: NDArray.DType.ValueType # 2 + """Represents an double type.""" + DTYPE_BOOL: NDArray.DType.ValueType # 3 + """Represents a bool type.""" + DTYPE_INT32: NDArray.DType.ValueType # 4 + """Represents an int32 type.""" + DTYPE_INT64: NDArray.DType.ValueType # 5 + """Represents an int64 type.""" + DTYPE_UINT32: NDArray.DType.ValueType # 6 + """Represents a uint32 type.""" + DTYPE_UINT64: NDArray.DType.ValueType # 7 + """Represents a uint64 type.""" + DTYPE_STRING: NDArray.DType.ValueType # 8 + """Represents a string type.""" + + DTYPE_FIELD_NUMBER: builtins.int + SHAPE_FIELD_NUMBER: builtins.int + STRING_VALUES_FIELD_NUMBER: builtins.int + FLOAT_VALUES_FIELD_NUMBER: builtins.int + DOUBLE_VALUES_FIELD_NUMBER: builtins.int + BOOL_VALUES_FIELD_NUMBER: builtins.int + INT32_VALUES_FIELD_NUMBER: builtins.int + INT64_VALUES_FIELD_NUMBER: builtins.int + UINT32_VALUES_FIELD_NUMBER: builtins.int + UINT64_VALUES_FIELD_NUMBER: builtins.int + dtype: global___NDArray.DType.ValueType + """DTYPE is the data type of given array""" + @property + def shape(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """shape is the shape of given array.""" + @property + def string_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """represents a string parameter value.""" + @property + def float_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.float]: + """represents a float parameter value.""" + @property + def double_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.float]: + """represents a double parameter value.""" + @property + def bool_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.bool]: + """represents a bool parameter value.""" + @property + def int32_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """represents a int32 parameter value.""" + @property + def int64_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """represents a int64 parameter value.""" + @property + def uint32_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """represents a uint32 parameter value.""" + @property + def uint64_values(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """represents a uint64 parameter value.""" + def __init__( + self, + *, + dtype: global___NDArray.DType.ValueType = ..., + shape: collections.abc.Iterable[builtins.int] | None = ..., + string_values: collections.abc.Iterable[builtins.str] | None = ..., + float_values: collections.abc.Iterable[builtins.float] | None = ..., + double_values: collections.abc.Iterable[builtins.float] | None = ..., + bool_values: collections.abc.Iterable[builtins.bool] | None = ..., + int32_values: collections.abc.Iterable[builtins.int] | None = ..., + int64_values: collections.abc.Iterable[builtins.int] | None = ..., + uint32_values: collections.abc.Iterable[builtins.int] | None = ..., + uint64_values: collections.abc.Iterable[builtins.int] | None = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["bool_values", b"bool_values", "double_values", b"double_values", "dtype", b"dtype", "float_values", b"float_values", "int32_values", b"int32_values", "int64_values", b"int64_values", "shape", b"shape", "string_values", b"string_values", "uint32_values", b"uint32_values", "uint64_values", b"uint64_values"]) -> None: ... + +global___NDArray = NDArray + +class BentoService(google.protobuf.service.Service, metaclass=abc.ABCMeta): + """a gRPC BentoServer.""" + + DESCRIPTOR: google.protobuf.descriptor.ServiceDescriptor + @abc.abstractmethod + def Call( + inst: BentoService, + rpc_controller: google.protobuf.service.RpcController, + request: global___Request, + callback: collections.abc.Callable[[global___Response], None] | None, + ) -> concurrent.futures.Future[global___Response]: + """Call handles methodcaller of given API entrypoint.""" + +class BentoService_Stub(BentoService): + """a gRPC BentoServer.""" + + def __init__(self, rpc_channel: google.protobuf.service.RpcChannel) -> None: ... + DESCRIPTOR: google.protobuf.descriptor.ServiceDescriptor + def Call( + inst: BentoService_Stub, + rpc_controller: google.protobuf.service.RpcController, + request: global___Request, + callback: collections.abc.Callable[[global___Response], None] | None = ..., + ) -> concurrent.futures.Future[global___Response]: + """Call handles methodcaller of given API entrypoint.""" diff --git a/src/bentoml/grpc/v1/service_pb2_grpc.py b/src/bentoml/grpc/v1/service_pb2_grpc.py new file mode 100644 index 00000000000..b2c23fee0fe --- /dev/null +++ b/src/bentoml/grpc/v1/service_pb2_grpc.py @@ -0,0 +1,70 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + +from bentoml.grpc.v1 import service_pb2 as bentoml_dot_grpc_dot_v1_dot_service__pb2 + + +class BentoServiceStub(object): + """a gRPC BentoServer. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.Call = channel.unary_unary( + '/bentoml.grpc.v1.BentoService/Call', + request_serializer=bentoml_dot_grpc_dot_v1_dot_service__pb2.Request.SerializeToString, + response_deserializer=bentoml_dot_grpc_dot_v1_dot_service__pb2.Response.FromString, + ) + + +class BentoServiceServicer(object): + """a gRPC BentoServer. + """ + + def Call(self, request, context): + """Call handles methodcaller of given API entrypoint. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_BentoServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'Call': grpc.unary_unary_rpc_method_handler( + servicer.Call, + request_deserializer=bentoml_dot_grpc_dot_v1_dot_service__pb2.Request.FromString, + response_serializer=bentoml_dot_grpc_dot_v1_dot_service__pb2.Response.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'bentoml.grpc.v1.BentoService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + # This class is part of an EXPERIMENTAL API. +class BentoService(object): + """a gRPC BentoServer. + """ + + @staticmethod + def Call(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, '/bentoml.grpc.v1.BentoService/Call', + bentoml_dot_grpc_dot_v1_dot_service__pb2.Request.SerializeToString, + bentoml_dot_grpc_dot_v1_dot_service__pb2.Response.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/src/bentoml/grpc/v1/service_pb2_grpc.pyi b/src/bentoml/grpc/v1/service_pb2_grpc.pyi new file mode 100644 index 00000000000..041e385e371 --- /dev/null +++ b/src/bentoml/grpc/v1/service_pb2_grpc.pyi @@ -0,0 +1,30 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" +import abc +import bentoml.grpc.v1.service_pb2 +import grpc + +class BentoServiceStub: + """a gRPC BentoServer.""" + + def __init__(self, channel: grpc.Channel) -> None: ... + Call: grpc.UnaryUnaryMultiCallable[ + bentoml.grpc.v1.service_pb2.Request, + bentoml.grpc.v1.service_pb2.Response, + ] + """Call handles methodcaller of given API entrypoint.""" + +class BentoServiceServicer(metaclass=abc.ABCMeta): + """a gRPC BentoServer.""" + + @abc.abstractmethod + def Call( + self, + request: bentoml.grpc.v1.service_pb2.Request, + context: grpc.ServicerContext, + ) -> bentoml.grpc.v1.service_pb2.Response: + """Call handles methodcaller of given API entrypoint.""" + +def add_BentoServiceServicer_to_server(servicer: BentoServiceServicer, server: grpc.Server) -> None: ... diff --git a/src/bentoml/grpc/v1/service_test.proto b/src/bentoml/grpc/v1/service_test.proto new file mode 100644 index 00000000000..e53aff8bf22 --- /dev/null +++ b/src/bentoml/grpc/v1/service_test.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +package bentoml.testing.v1; + +option cc_enable_arenas = true; +option go_package = "github.com/bentoml/testing/v1"; +option optimize_for = SPEED; +option py_generic_services = true; + +// Represents a request for TestService. +message ExecuteRequest { + string input = 1; +} + +// Represents a response from TestService. +message ExecuteResponse { + string output = 1; +} + +// Use for testing interceptors per RPC call. +service TestService { + // Unary API + rpc Execute(ExecuteRequest) returns (ExecuteResponse); +} diff --git a/src/bentoml/grpc/v1/service_test_pb2.py b/src/bentoml/grpc/v1/service_test_pb2.py new file mode 100644 index 00000000000..48e802c928d --- /dev/null +++ b/src/bentoml/grpc/v1/service_test_pb2.py @@ -0,0 +1,150 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: bentoml/grpc/v1/service_test.proto +"""Generated protocol buffer code.""" +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 +from google.protobuf import service as _service +from google.protobuf import service_reflection +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='bentoml/grpc/v1/service_test.proto', + package='bentoml.testing.v1', + syntax='proto3', + serialized_options=b'H\001Z\035github.com/bentoml/testing/v1\220\001\001\370\001\001', + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n\"bentoml/grpc/v1/service_test.proto\x12\x12\x62\x65ntoml.testing.v1\"\x1f\n\x0e\x45xecuteRequest\x12\r\n\x05input\x18\x01 \x01(\t\"!\n\x0f\x45xecuteResponse\x12\x0e\n\x06output\x18\x01 \x01(\t2a\n\x0bTestService\x12R\n\x07\x45xecute\x12\".bentoml.testing.v1.ExecuteRequest\x1a#.bentoml.testing.v1.ExecuteResponseB\'H\x01Z\x1dgithub.com/bentoml/testing/v1\x90\x01\x01\xf8\x01\x01\x62\x06proto3' +) + + + + +_EXECUTEREQUEST = _descriptor.Descriptor( + name='ExecuteRequest', + full_name='bentoml.testing.v1.ExecuteRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='input', full_name='bentoml.testing.v1.ExecuteRequest.input', 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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=58, + serialized_end=89, +) + + +_EXECUTERESPONSE = _descriptor.Descriptor( + name='ExecuteResponse', + full_name='bentoml.testing.v1.ExecuteResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='output', full_name='bentoml.testing.v1.ExecuteResponse.output', 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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=91, + serialized_end=124, +) + +DESCRIPTOR.message_types_by_name['ExecuteRequest'] = _EXECUTEREQUEST +DESCRIPTOR.message_types_by_name['ExecuteResponse'] = _EXECUTERESPONSE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ExecuteRequest = _reflection.GeneratedProtocolMessageType('ExecuteRequest', (_message.Message,), { + 'DESCRIPTOR' : _EXECUTEREQUEST, + '__module__' : 'bentoml.grpc.v1.service_test_pb2' + # @@protoc_insertion_point(class_scope:bentoml.testing.v1.ExecuteRequest) + }) +_sym_db.RegisterMessage(ExecuteRequest) + +ExecuteResponse = _reflection.GeneratedProtocolMessageType('ExecuteResponse', (_message.Message,), { + 'DESCRIPTOR' : _EXECUTERESPONSE, + '__module__' : 'bentoml.grpc.v1.service_test_pb2' + # @@protoc_insertion_point(class_scope:bentoml.testing.v1.ExecuteResponse) + }) +_sym_db.RegisterMessage(ExecuteResponse) + + +DESCRIPTOR._options = None + +_TESTSERVICE = _descriptor.ServiceDescriptor( + name='TestService', + full_name='bentoml.testing.v1.TestService', + file=DESCRIPTOR, + index=0, + serialized_options=None, + create_key=_descriptor._internal_create_key, + serialized_start=126, + serialized_end=223, + methods=[ + _descriptor.MethodDescriptor( + name='Execute', + full_name='bentoml.testing.v1.TestService.Execute', + index=0, + containing_service=None, + input_type=_EXECUTEREQUEST, + output_type=_EXECUTERESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), +]) +_sym_db.RegisterServiceDescriptor(_TESTSERVICE) + +DESCRIPTOR.services_by_name['TestService'] = _TESTSERVICE + +TestService = service_reflection.GeneratedServiceType('TestService', (_service.Service,), dict( + DESCRIPTOR = _TESTSERVICE, + __module__ = 'bentoml.grpc.v1.service_test_pb2' + )) + +TestService_Stub = service_reflection.GeneratedServiceStubType('TestService_Stub', (TestService,), dict( + DESCRIPTOR = _TESTSERVICE, + __module__ = 'bentoml.grpc.v1.service_test_pb2' + )) + + +# @@protoc_insertion_point(module_scope) diff --git a/src/bentoml/grpc/v1/service_test_pb2.pyi b/src/bentoml/grpc/v1/service_test_pb2.pyi new file mode 100644 index 00000000000..44a4db8778d --- /dev/null +++ b/src/bentoml/grpc/v1/service_test_pb2.pyi @@ -0,0 +1,77 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" +import abc +import builtins +import collections.abc +import concurrent.futures +import google.protobuf.descriptor +import google.protobuf.message +import google.protobuf.service +import sys + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class ExecuteRequest(google.protobuf.message.Message): + """Represents a request for TestService.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + INPUT_FIELD_NUMBER: builtins.int + input: builtins.str + def __init__( + self, + *, + input: builtins.str = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["input", b"input"]) -> None: ... + +global___ExecuteRequest = ExecuteRequest + +class ExecuteResponse(google.protobuf.message.Message): + """Represents a response from TestService.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + OUTPUT_FIELD_NUMBER: builtins.int + output: builtins.str + def __init__( + self, + *, + output: builtins.str = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["output", b"output"]) -> None: ... + +global___ExecuteResponse = ExecuteResponse + +class TestService(google.protobuf.service.Service, metaclass=abc.ABCMeta): + """Use for testing interceptors per RPC call.""" + + DESCRIPTOR: google.protobuf.descriptor.ServiceDescriptor + @abc.abstractmethod + def Execute( + inst: TestService, + rpc_controller: google.protobuf.service.RpcController, + request: global___ExecuteRequest, + callback: collections.abc.Callable[[global___ExecuteResponse], None] | None, + ) -> concurrent.futures.Future[global___ExecuteResponse]: + """Unary API""" + +class TestService_Stub(TestService): + """Use for testing interceptors per RPC call.""" + + def __init__(self, rpc_channel: google.protobuf.service.RpcChannel) -> None: ... + DESCRIPTOR: google.protobuf.descriptor.ServiceDescriptor + def Execute( + inst: TestService_Stub, + rpc_controller: google.protobuf.service.RpcController, + request: global___ExecuteRequest, + callback: collections.abc.Callable[[global___ExecuteResponse], None] | None = ..., + ) -> concurrent.futures.Future[global___ExecuteResponse]: + """Unary API""" diff --git a/src/bentoml/grpc/v1/service_test_pb2_grpc.py b/src/bentoml/grpc/v1/service_test_pb2_grpc.py new file mode 100644 index 00000000000..7a2b9b8c26e --- /dev/null +++ b/src/bentoml/grpc/v1/service_test_pb2_grpc.py @@ -0,0 +1,70 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + +from bentoml.grpc.v1 import service_test_pb2 as bentoml_dot_grpc_dot_v1_dot_service__test__pb2 + + +class TestServiceStub(object): + """Use for testing interceptors per RPC call. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.Execute = channel.unary_unary( + '/bentoml.testing.v1.TestService/Execute', + request_serializer=bentoml_dot_grpc_dot_v1_dot_service__test__pb2.ExecuteRequest.SerializeToString, + response_deserializer=bentoml_dot_grpc_dot_v1_dot_service__test__pb2.ExecuteResponse.FromString, + ) + + +class TestServiceServicer(object): + """Use for testing interceptors per RPC call. + """ + + def Execute(self, request, context): + """Unary API + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_TestServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'Execute': grpc.unary_unary_rpc_method_handler( + servicer.Execute, + request_deserializer=bentoml_dot_grpc_dot_v1_dot_service__test__pb2.ExecuteRequest.FromString, + response_serializer=bentoml_dot_grpc_dot_v1_dot_service__test__pb2.ExecuteResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'bentoml.testing.v1.TestService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + # This class is part of an EXPERIMENTAL API. +class TestService(object): + """Use for testing interceptors per RPC call. + """ + + @staticmethod + def Execute(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, '/bentoml.testing.v1.TestService/Execute', + bentoml_dot_grpc_dot_v1_dot_service__test__pb2.ExecuteRequest.SerializeToString, + bentoml_dot_grpc_dot_v1_dot_service__test__pb2.ExecuteResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/src/bentoml/grpc/v1/service_test_pb2_grpc.pyi b/src/bentoml/grpc/v1/service_test_pb2_grpc.pyi new file mode 100644 index 00000000000..bff632e97e8 --- /dev/null +++ b/src/bentoml/grpc/v1/service_test_pb2_grpc.pyi @@ -0,0 +1,30 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" +import abc +import bentoml.grpc.v1.service_test_pb2 +import grpc + +class TestServiceStub: + """Use for testing interceptors per RPC call.""" + + def __init__(self, channel: grpc.Channel) -> None: ... + Execute: grpc.UnaryUnaryMultiCallable[ + bentoml.grpc.v1.service_test_pb2.ExecuteRequest, + bentoml.grpc.v1.service_test_pb2.ExecuteResponse, + ] + """Unary API""" + +class TestServiceServicer(metaclass=abc.ABCMeta): + """Use for testing interceptors per RPC call.""" + + @abc.abstractmethod + def Execute( + self, + request: bentoml.grpc.v1.service_test_pb2.ExecuteRequest, + context: grpc.ServicerContext, + ) -> bentoml.grpc.v1.service_test_pb2.ExecuteResponse: + """Unary API""" + +def add_TestServiceServicer_to_server(servicer: TestServiceServicer, server: grpc.Server) -> None: ... diff --git a/src/bentoml/testing/grpc/__init__.py b/src/bentoml/testing/grpc/__init__.py index 83800eecfa0..c56cdd50467 100644 --- a/src/bentoml/testing/grpc/__init__.py +++ b/src/bentoml/testing/grpc/__init__.py @@ -25,8 +25,8 @@ from grpc.aio._channel import Channel from google.protobuf.message import Message - from bentoml.grpc.v1alpha1 import service_pb2 as pb - from bentoml.grpc.v1alpha1 import service_test_pb2_grpc as services_test + from bentoml.grpc.v1 import service_pb2 as pb + from bentoml.grpc.v1 import service_test_pb2_grpc as services_test else: pb, _ = import_generated_stubs() _, services_test = import_generated_stubs(file="service_test.proto") @@ -81,6 +81,7 @@ async def async_client_call( assert_code: grpc.StatusCode | None = None, assert_details: str | None = None, assert_trailing_metadata: aio.Metadata | None = None, + _internal_stubs_version: str = "v1", ) -> pb.Response | None: """ Invoke a given API method via a client. @@ -103,7 +104,7 @@ async def async_client_call( res: pb.Response | None = None try: Call = channel.unary_unary( - "/bentoml.grpc.v1alpha1.BentoService/Call", + f"/bentoml.grpc.{_internal_stubs_version}.BentoService/Call", request_serializer=pb.Request.SerializeToString, response_deserializer=pb.Response.FromString, ) diff --git a/src/bentoml/testing/grpc/servicer.py b/src/bentoml/testing/grpc/servicer.py index e7a5d4d86a0..7f1f1b34ca9 100644 --- a/src/bentoml/testing/grpc/servicer.py +++ b/src/bentoml/testing/grpc/servicer.py @@ -3,14 +3,14 @@ from typing import TYPE_CHECKING +from bentoml.grpc.utils import import_generated_stubs + if TYPE_CHECKING: from grpc import aio - from bentoml.grpc.v1alpha1 import service_test_pb2 as pb - from bentoml.grpc.v1alpha1 import service_test_pb2_grpc as services + from bentoml.grpc.v1 import service_test_pb2 as pb + from bentoml.grpc.v1 import service_test_pb2_grpc as services else: - from bentoml.grpc.utils import import_generated_stubs - pb, services = import_generated_stubs(file="service_test.proto") diff --git a/src/bentoml/testing/server.py b/src/bentoml/testing/server.py index f03365de082..51efce7a3f1 100644 --- a/src/bentoml/testing/server.py +++ b/src/bentoml/testing/server.py @@ -75,6 +75,7 @@ async def server_warmup( check_interval: float = 1, popen: subprocess.Popen[t.Any] | None = None, service_name: str | None = None, + _internal_stubs_version: str = "v1", ) -> bool: start_time = time.time() proxy_handler = urllib.request.ProxyHandler({}) @@ -86,7 +87,9 @@ async def server_warmup( try: if service_name is None: - service_name = "bentoml.grpc.v1alpha1.BentoService" + service_name = ( + f"bentoml.grpc.{_internal_stubs_version}.BentoService" + ) async with create_channel(host_url) as channel: Check = channel.unary_unary( "/grpc.health.v1.Health/Check", diff --git a/tests/e2e/bento_server_grpc/service.py b/tests/e2e/bento_server_grpc/service.py index 35456559a1f..77a8e1155dd 100644 --- a/tests/e2e/bento_server_grpc/service.py +++ b/tests/e2e/bento_server_grpc/service.py @@ -26,8 +26,8 @@ import PIL.Image from numpy.typing import NDArray - from bentoml.grpc.v1alpha1 import service_test_pb2 as pb_test - from bentoml.grpc.v1alpha1 import service_test_pb2_grpc as services_test + from bentoml.grpc.v1 import service_test_pb2 as pb_test + from bentoml.grpc.v1 import service_test_pb2_grpc as services_test from bentoml._internal.types import FileLike from bentoml._internal.types import JSONSerializable from bentoml.picklable_model import get_runnable diff --git a/tests/e2e/bento_server_grpc/tests/test_custom_components.py b/tests/e2e/bento_server_grpc/tests/test_custom_components.py index 8338018dfc0..f2219b88caf 100644 --- a/tests/e2e/bento_server_grpc/tests/test_custom_components.py +++ b/tests/e2e/bento_server_grpc/tests/test_custom_components.py @@ -7,11 +7,11 @@ from grpc_health.v1 import health_pb2 as pb_health from google.protobuf import wrappers_pb2 +from bentoml.grpc.v1 import service_pb2 as pb +from bentoml.grpc.v1 import service_test_pb2 as pb_test +from bentoml.grpc.v1 import service_test_pb2_grpc as services_test from bentoml.testing.grpc import create_channel from bentoml.testing.grpc import async_client_call -from bentoml.grpc.v1alpha1 import service_pb2 as pb -from bentoml.grpc.v1alpha1 import service_test_pb2 as pb_test -from bentoml.grpc.v1alpha1 import service_test_pb2_grpc as services_test @pytest.mark.asyncio @@ -25,9 +25,7 @@ async def test_success_invocation_custom_servicer(host: str) -> None: health = await t.cast( t.Awaitable[pb_health.HealthCheckResponse], HealthCheck( - pb_health.HealthCheckRequest( - service="bentoml.testing.v1alpha1.TestService" - ) + pb_health.HealthCheckRequest(service="bentoml.testing.v1.TestService") ), ) assert health.status == pb_health.HealthCheckResponse.SERVING # type: ignore ( no generated enum types) diff --git a/tests/e2e/bento_server_grpc/tests/test_descriptors.py b/tests/e2e/bento_server_grpc/tests/test_descriptors.py index f4b132d53d3..b6ce653b3ef 100644 --- a/tests/e2e/bento_server_grpc/tests/test_descriptors.py +++ b/tests/e2e/bento_server_grpc/tests/test_descriptors.py @@ -24,8 +24,8 @@ from google.protobuf import struct_pb2 from google.protobuf import wrappers_pb2 + from bentoml.grpc.v1 import service_pb2 as pb from bentoml._internal import external_typing as ext - from bentoml.grpc.v1alpha1 import service_pb2 as pb else: pb, _ = import_generated_stubs() grpc, _ = import_grpc() @@ -207,20 +207,14 @@ async def test_file(host: str, bin_file: str): await async_client_call( "predict_file", channel=channel, - data={"file": pb.File(kind=pb.File.FILE_TYPE_BYTES, content=fb)}, + data={"file": pb.File(kind="application/octet-stream", content=fb)}, assert_data=lambda resp: resp.file.content == b"\x810\x899" - and resp.file.kind == pb.File.FILE_TYPE_BYTES, + and resp.file.kind == "application/octet-stream", ) await async_client_call( "predict_file", channel=channel, - data={"file": pb.File(kind=123, content=fb)}, # type: ignore (testing exception) - assert_code=grpc.StatusCode.INVALID_ARGUMENT, - ) - await async_client_call( - "predict_file", - channel=channel, - data={"file": pb.File(kind=pb.File.FILE_TYPE_PDF, content=fb)}, + data={"file": pb.File(kind="application/pdf", content=fb)}, assert_code=grpc.StatusCode.INVALID_ARGUMENT, ) await async_client_call( @@ -233,7 +227,7 @@ async def test_file(host: str, bin_file: str): def assert_image( resp: pb.Response | pb.Part, - assert_kind: pb.File.FileType.ValueType, + assert_kind: str, im_file: str | ext.NpNDArray, ) -> bool: fio = io.BytesIO(resp.file.content) @@ -265,27 +259,21 @@ async def test_image(host: str, img_file: str): channel=channel, data={"serialized_bytes": fb}, assert_data=partial( - assert_image, im_file=img_file, assert_kind=pb.File.FILE_TYPE_BMP + assert_image, im_file=img_file, assert_kind="image/bmp" ), ) await async_client_call( "echo_image", channel=channel, - data={"file": pb.File(kind=pb.File.FILE_TYPE_BMP, content=fb)}, + data={"file": pb.File(kind="image/bmp", content=fb)}, assert_data=partial( - assert_image, im_file=img_file, assert_kind=pb.File.FILE_TYPE_BMP + assert_image, im_file=img_file, assert_kind="image/bmp" ), ) await async_client_call( "echo_image", channel=channel, - data={"file": pb.File(kind=123, content=fb)}, # type: ignore (testing exception) - assert_code=grpc.StatusCode.INVALID_ARGUMENT, - ) - await async_client_call( - "echo_image", - channel=channel, - data={"file": pb.File(kind=pb.File.FILE_TYPE_PDF, content=fb)}, + data={"file": pb.File(kind="application/pdf", content=fb)}, assert_code=grpc.StatusCode.INVALID_ARGUMENT, ) await async_client_call( @@ -376,7 +364,7 @@ def assert_multi_images(resp: pb.Response, method: str, im_file: str) -> bool: expected = arr * arr return assert_image( resp.multipart.fields["result"], - assert_kind=pb.File.FILE_TYPE_BMP, + assert_kind="image/bmp", im_file=expected, ) @@ -393,12 +381,8 @@ async def test_multipart(host: str, img_file: str): data={ "multipart": { "fields": { - "original": pb.Part( - file=pb.File(kind=pb.File.FILE_TYPE_BMP, content=fb) - ), - "compared": pb.Part( - file=pb.File(kind=pb.File.FILE_TYPE_BMP, content=fb) - ), + "original": pb.Part(file=pb.File(kind="image/bmp", content=fb)), + "compared": pb.Part(file=pb.File(kind="image/bmp", content=fb)), } } }, diff --git a/tests/e2e/bento_server_grpc/tests/test_metrics.py b/tests/e2e/bento_server_grpc/tests/test_metrics.py index 7ad44989ed7..f3ea0adfd76 100644 --- a/tests/e2e/bento_server_grpc/tests/test_metrics.py +++ b/tests/e2e/bento_server_grpc/tests/test_metrics.py @@ -12,7 +12,7 @@ if TYPE_CHECKING: from google.protobuf import wrappers_pb2 - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb else: wrappers_pb2 = LazyLoader("wrappers_pb2", globals(), "google.protobuf.wrappers_pb2") pb, _ = import_generated_stubs() @@ -30,12 +30,8 @@ async def test_metrics_available(host: str, img_file: str): data={ "multipart": { "fields": { - "original": pb.Part( - file=pb.File(kind=pb.File.FILE_TYPE_BMP, content=fb) - ), - "compared": pb.Part( - file=pb.File(kind=pb.File.FILE_TYPE_BMP, content=fb) - ), + "original": pb.Part(file=pb.File(kind="image/bmp", content=fb)), + "compared": pb.Part(file=pb.File(kind="image/bmp", content=fb)), } } }, diff --git a/tests/unit/_internal/io/test_file.py b/tests/unit/_internal/io/test_file.py index 3d9be4addeb..6a6d5d8065d 100644 --- a/tests/unit/_internal/io/test_file.py +++ b/tests/unit/_internal/io/test_file.py @@ -9,7 +9,7 @@ from bentoml.exceptions import BadInput if TYPE_CHECKING: - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb else: from bentoml.grpc.utils import import_generated_stubs @@ -55,30 +55,16 @@ async def test_exception_from_proto(): await File().from_proto("") # type: ignore (testing exceptions) with pytest.raises(BadInput) as exc_info: await File(mime_type="image/jpeg").from_proto( - pb.File(kind=pb.File.FILE_TYPE_BYTES, content=b"asdf") + pb.File(kind="application/octet-stream", content=b"asdf") ) - assert "Inferred mime_type from 'kind' is" in str(exc_info.value) + assert "MIME type from 'kind'" in str(exc_info.value) with pytest.raises(BadInput) as exc_info: - await File(mime_type="image/jpeg").from_proto( - pb.File(kind=123, content=b"asdf") # type: ignore (testing exceptions) - ) - assert "is not a valid File kind." in str(exc_info.value) - with pytest.raises(BadInput) as exc_info: - await File(mime_type="image/jpeg").from_proto( - pb.File(kind=pb.File.FILE_TYPE_JPEG) - ) + await File(mime_type="image/jpeg").from_proto(pb.File(kind="image/jpeg")) assert "Content is empty!" == str(exc_info.value) -@pytest.mark.asyncio -async def test_exception_to_proto(): - with pytest.raises(BadInput) as exc_info: - await File(mime_type="application/bentoml.vnd").to_proto(io.BytesIO(b"asdf")) - assert "doesn't have a corresponding File 'kind'" in str(exc_info.value) - - @pytest.mark.asyncio async def test_to_proto() -> None: assert await File(mime_type="image/bmp").to_proto(io.BytesIO(b"asdf")) == pb.File( - kind=pb.File.FILE_TYPE_BMP, content=b"asdf" + kind="image/bmp", content=b"asdf" ) diff --git a/tests/unit/_internal/io/test_image.py b/tests/unit/_internal/io/test_image.py index 0f295ae0448..9f87f55f9e2 100644 --- a/tests/unit/_internal/io/test_image.py +++ b/tests/unit/_internal/io/test_image.py @@ -13,7 +13,7 @@ import numpy as np import PIL.Image as PILImage - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb else: from bentoml.grpc.utils import import_generated_stubs from bentoml._internal.utils import LazyLoader @@ -75,16 +75,11 @@ async def test_exception_from_proto(): await Image().from_proto("") # type: ignore (testing exception) with pytest.raises(BadInput) as exc_info: await Image(mime_type="image/jpeg").from_proto( - pb.File(kind=pb.File.FILE_TYPE_BYTES, content=b"asdf") + pb.File(kind="application/octet-stream", content=b"asdf") ) - assert "Inferred mime_type from 'kind' is" in str(exc_info.value) + assert "MIME type from 'kind'" in str(exc_info.value) with pytest.raises(BadInput) as exc_info: - await Image(mime_type="image/jpeg").from_proto(pb.File(kind=123, content=b"asdf")) # type: ignore (testing exception) - assert "is not a valid File kind." in str(exc_info.value) - with pytest.raises(BadInput) as exc_info: - await Image(mime_type="image/jpeg").from_proto( - pb.File(kind=pb.File.FILE_TYPE_JPEG) - ) + await Image(mime_type="image/jpeg").from_proto(pb.File(kind="image/jpeg")) assert "Content is empty!" == str(exc_info.value) @@ -93,10 +88,6 @@ async def test_exception_to_proto(): with pytest.raises(BadInput) as exc_info: await Image().to_proto(io.BytesIO(b"asdf")) # type: ignore (testing exception) assert "Unsupported Image type received:" in str(exc_info.value) - with pytest.raises(BadInput) as exc_info: - example = np.random.rand(255, 255, 3) - await Image(mime_type="image/sgi").to_proto(example) - assert "doesn't have a corresponding File 'kind'" in str(exc_info.value) @pytest.mark.asyncio @@ -105,4 +96,4 @@ async def test_to_proto(img_file: str) -> None: content = f.read() img = PILImage.open(io.BytesIO(content)) res = await Image(mime_type="image/bmp").to_proto(img) - assert res.kind == pb.File.FILE_TYPE_BMP + assert res.kind == "image/bmp" diff --git a/tests/unit/_internal/io/test_json.py b/tests/unit/_internal/io/test_json.py index 01113bda3ea..5891348ed7e 100644 --- a/tests/unit/_internal/io/test_json.py +++ b/tests/unit/_internal/io/test_json.py @@ -24,7 +24,7 @@ from _pytest.logging import LogCaptureFixture from google.protobuf import struct_pb2 - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb from bentoml._internal.service.openapi.specification import Schema else: from bentoml.grpc.utils import import_generated_stubs diff --git a/tests/unit/_internal/io/test_multipart.py b/tests/unit/_internal/io/test_multipart.py index d9d3606db0e..29a26162297 100644 --- a/tests/unit/_internal/io/test_multipart.py +++ b/tests/unit/_internal/io/test_multipart.py @@ -17,7 +17,7 @@ from google.protobuf import struct_pb2 from google.protobuf import wrappers_pb2 - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb else: from bentoml.grpc.utils import import_generated_stubs from bentoml._internal.utils import LazyLoader @@ -86,7 +86,7 @@ async def test_multipart_from_to_proto(img_file: str): ) ) ), - "arg2": pb.Part(file=pb.File(kind=pb.File.FILE_TYPE_BMP, content=img)), + "arg2": pb.Part(file=pb.File(kind="image/bmp", content=img)), } ) ) diff --git a/tests/unit/_internal/io/test_numpy.py b/tests/unit/_internal/io/test_numpy.py index 6986de185ff..b70088b403f 100644 --- a/tests/unit/_internal/io/test_numpy.py +++ b/tests/unit/_internal/io/test_numpy.py @@ -16,7 +16,7 @@ if TYPE_CHECKING: from _pytest.logging import LogCaptureFixture - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb else: from bentoml.grpc.utils import import_generated_stubs diff --git a/tests/unit/_internal/io/test_text.py b/tests/unit/_internal/io/test_text.py index 67f1c4ad501..6e9f62afc5c 100644 --- a/tests/unit/_internal/io/test_text.py +++ b/tests/unit/_internal/io/test_text.py @@ -10,7 +10,7 @@ if TYPE_CHECKING: from google.protobuf import wrappers_pb2 - from bentoml.grpc.v1alpha1 import service_pb2 as pb + from bentoml.grpc.v1 import service_pb2 as pb else: from bentoml.grpc.utils import import_generated_stubs from bentoml._internal.utils import LazyLoader diff --git a/tests/unit/grpc/interceptors/test_access.py b/tests/unit/grpc/interceptors/test_access.py index 32e268706ee..b9e97e8c728 100644 --- a/tests/unit/grpc/interceptors/test_access.py +++ b/tests/unit/grpc/interceptors/test_access.py @@ -26,15 +26,15 @@ from google.protobuf import wrappers_pb2 from bentoml import Service + from bentoml.grpc.v1 import service_pb2_grpc as services + from bentoml.grpc.v1 import service_test_pb2 as pb_test + from bentoml.grpc.v1 import service_test_pb2_grpc as services_test from bentoml.grpc.types import Request from bentoml.grpc.types import Response from bentoml.grpc.types import RpcMethodHandler from bentoml.grpc.types import AsyncHandlerMethod from bentoml.grpc.types import HandlerCallDetails from bentoml.grpc.types import BentoServicerContext - from bentoml.grpc.v1alpha1 import service_pb2_grpc as services - from bentoml.grpc.v1alpha1 import service_test_pb2 as pb_test - from bentoml.grpc.v1alpha1 import service_test_pb2_grpc as services_test else: _, services = import_generated_stubs() pb_test, services_test = import_generated_stubs(file="service_test.proto") @@ -86,7 +86,7 @@ async def test_success_logs(caplog: LogCaptureFixture): stub = services_test.TestServiceStub(channel) await stub.Execute(pb_test.ExecuteRequest(input="BentoML")) assert ( - "(scheme=http,path=/bentoml.testing.v1alpha1.TestService/Execute,type=application/grpc,size=9) (http_status=200,grpc_status=0,type=application/grpc,size=17)" + "(scheme=http,path=/bentoml.testing.v1.TestService/Execute,type=application/grpc,size=9) (http_status=200,grpc_status=0,type=application/grpc,size=17)" in caplog.text ) @@ -142,7 +142,7 @@ async def test_access_log_exception(caplog: LogCaptureFixture, simple_service: S assert_code=grpc.StatusCode.INTERNAL, ) assert ( - "(scheme=http,path=/bentoml.grpc.v1alpha1.BentoService/Call,type=application/grpc,size=17) (http_status=500,grpc_status=13,type=application/grpc,size=0)" + "(scheme=http,path=/bentoml.grpc.v1.BentoService/Call,type=application/grpc,size=17) (http_status=500,grpc_status=13,type=application/grpc,size=0)" in caplog.text ) finally: diff --git a/tests/unit/grpc/interceptors/test_prometheus.py b/tests/unit/grpc/interceptors/test_prometheus.py index b12734f30dd..41425191fc5 100644 --- a/tests/unit/grpc/interceptors/test_prometheus.py +++ b/tests/unit/grpc/interceptors/test_prometheus.py @@ -24,8 +24,8 @@ from google.protobuf import wrappers_pb2 from bentoml import Service - from bentoml.grpc.v1alpha1 import service_pb2_grpc as services - from bentoml.grpc.v1alpha1 import service_test_pb2 as pb_test + from bentoml.grpc.v1 import service_pb2_grpc as services + from bentoml.grpc.v1 import service_test_pb2 as pb_test else: _, services = import_generated_stubs() @@ -73,7 +73,7 @@ async def test_empty_metrics(): await server.start() async with create_channel(host_url) as channel: Execute = channel.unary_unary( - "/bentoml.testing.v1alpha1.TestService/Execute", + "/bentoml.testing.v1.TestService/Execute", request_serializer=pb_test.ExecuteRequest.SerializeToString, response_deserializer=pb_test.ExecuteResponse.FromString, )