diff --git a/api/gloo/gloo/external/envoy/config/trace/v3/datadog.proto b/api/gloo/gloo/external/envoy/config/trace/v3/datadog.proto index cd533f247..c34861603 100644 --- a/api/gloo/gloo/external/envoy/config/trace/v3/datadog.proto +++ b/api/gloo/gloo/external/envoy/config/trace/v3/datadog.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package solo.io.envoy.config.trace.v3; import "google/protobuf/wrappers.proto"; +import "google/protobuf/duration.proto"; import "udpa/annotations/migrate.proto"; import "udpa/annotations/status.proto"; @@ -19,6 +20,18 @@ option (solo.io.udpa.annotations.file_status).package_version_status = ACTIVE; // [#protodoc-title: Datadog tracer] +// Configuration for the Remote Configuration feature. +message DatadogRemoteConfig { + // Frequency at which new configuration updates are queried. + // If no value is provided, the default value is delegated to the Datadog tracing library. + google.protobuf.Duration polling_interval = 1; + + // Disabled remote config. + // This field does not exist in envoy's config but allow us to preserve the default behavior + // when upgrading to envoy v1.31 + google.protobuf.BoolValue disabled = 2; +} + // Configuration for the Datadog tracer. // [#extension: envoy.tracers.datadog] message DatadogConfig { @@ -38,6 +51,17 @@ message DatadogConfig { // The name used for the service when traces are generated by envoy. google.protobuf.StringValue service_name = 2 [(validate.rules).string = {min_len: 1}]; + + // Optional hostname to use when sending spans to the collector_cluster. Useful for collectors + // that require a specific hostname. Defaults to :ref:`collector_cluster ` above. + string collector_hostname = 4; + + // Configures remote configuration. + // Remote Configuration allows to configure the tracer from Datadog's user interface. + // This feature can drastically increase the number of connections to the Datadog Agent. + // Each tracer regularly polls for configuration updates, and the number of tracers is the product + // of the number of listeners and worker threads. + DatadogRemoteConfig remote_config = 5; } option go_package = "github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/external/envoy/config/trace/v3"; import "extproto/ext.proto"; diff --git a/api/gloo/gloo/v1/enterprise/options/ai/ai.proto b/api/gloo/gloo/v1/enterprise/options/ai/ai.proto index a547f4c96..cad61150b 100644 --- a/api/gloo/gloo/v1/enterprise/options/ai/ai.proto +++ b/api/gloo/gloo/v1/enterprise/options/ai/ai.proto @@ -78,6 +78,7 @@ message SingleAuthToken { */ message UpstreamSpec { + // Settings to configure a custom host to send the traffic to message CustomHost { // Custom host to send the traffic to string host = 1; @@ -125,6 +126,25 @@ message UpstreamSpec { string api_version = 4; } + // Settings for the Gemini API + message Gemini { + // Auth Token to use for the Gemini API + // This token will be placed into the `key` header + oneof auth_token_source { + // Auth Token to use for the Gemini API + // This token will be placed into the `key` header + SingleAuthToken auth_token = 1; + // TODO: use oauth + } + + // The model name to use + // This value can be found https://generativelanguage.googleapis.com/{version}/models/{model}:generateContent?key={api_key} + string model = 2; + // The version of the API to use + // This value can be found https://generativelanguage.googleapis.com/{api_version}/models/{model}:generateContent?key={api_key} + string api_version = 3; + } + // Settings for the Mistral API message Mistral { // Auth Token to use for the Mistral API. @@ -139,6 +159,7 @@ message UpstreamSpec { string model = 3; } + // Settings for the Anthropic API message Anthropic { // Auth Token to use for the Anthropic API. // This token will be placed into the `x-api-key` header @@ -201,10 +222,14 @@ message UpstreamSpec { Anthropic anthropic = 3; // Azure OpenAI upstream AzureOpenAI azure_openai = 4; + // Gemini upstream + Gemini gemini = 5; } } + // Priority represents a single endpoint pool with a given priority message Priority { + // list of backends representing a single endpoint pool repeated Backend pool = 1; } @@ -224,6 +249,8 @@ message UpstreamSpec { AzureOpenAI azure_openai = 4; // multi upstream MultiPool multi = 5; + // Gemini upstream + Gemini gemini = 6; } } @@ -277,15 +304,17 @@ message RouteSettings { promptGuard: request: customResponseMessage: "Rejected due to inappropriate content" - matches: - - "credit card" + regex: + matches: + - "credit card" response: - matches: - # Mastercard - - '(?:^|\D)(5[1-5][0-9]{2}(?:\ |\-|)[0-9]{4}(?:\ |\-|)[0-9]{4}(?:\ |\-|)[0-9]{4})(?:\D|$)' + regex: + matches: + # Mastercard + - '(?:^|\D)(5[1-5][0-9]{2}(?:\ |\-|)[0-9]{4}(?:\ |\-|)[0-9]{4}(?:\ |\-|)[0-9]{4})(?:\D|$)' ```` */ - AIPromptGaurd prompt_guard = 2; + AIPromptGuard prompt_guard = 2; /* Retrieval Augmented Generation. https://research.ibm.com/blog/retrieval-augmented-generation-RAG @@ -311,6 +340,7 @@ message RouteSettings { ``` */ RAG rag = 3; + /* Semantic caching configuration Semantic caching allows you to cache previous model responses in order to provide @@ -386,6 +416,8 @@ message Postgres { message Embedding { + + // OpenAI embedding message OpenAI { oneof auth_token_source { SingleAuthToken auth_token = 1; @@ -394,6 +426,7 @@ message Embedding { } } + // Azure OpenAI embedding message AzureOpenAI { oneof auth_token_source { // Auth Token to use for the OpenAI API @@ -424,7 +457,10 @@ message Embedding { } } +// Settings for the Semantic Caching feature message SemanticCache { + + // Settings for the Redis database message Redis { // Connection string to the Redis database string connection_string = 1; @@ -438,6 +474,7 @@ message SemanticCache { float score_threshold = 2; } + // Settings for the Weaviate database message Weaviate { // Connection string to the Weaviate database, scheme should NOT be included. // For example: weaviate.my-ns.svc.cluster.local @@ -450,6 +487,7 @@ message SemanticCache { // Whether or not to use a secure connection, true by default bool insecure = 4; } + // Data store from which to cache the request/response pairs message DataStore { oneof datastore { @@ -473,6 +511,7 @@ message SemanticCache { Mode mode = 4; } +// Settings for the Retrieval Augmented Generation feature message RAG { message DataStore { oneof datastore { @@ -487,11 +526,7 @@ message RAG { string prompt_template = 3; } -message RateLimiting { - // List of rate_limit configs to apply - repeated string rate_limit_configs = 1; -} - +// Settings for the Prompt Enrichment feature message AIPromptEnrichment { message Message { // Role of the message. @@ -508,39 +543,88 @@ message AIPromptEnrichment { } -message AIPromptGaurd { - message Request { - // A list of Regex patterns to match against the prompt. - // Each one will be checked against the prompt and if any match - // the request will be rejected. +// Settings for the Prompt Guard feature +message AIPromptGuard { + + // Regex settings for prompt guard + message Regex { + enum BuiltIn { + // Default REGEX for Social Security Numbers + SSN = 0; + // Default REGEX for Credit Card Numbers + CREDIT_CARD = 1; + } + // A list of Regex patterns to match against the response. + // All matches will be masked before being sent back to the client. + // matches and builtins are additive. repeated string matches = 1; + // A list of built-in regexes to mask in the response. + // matches and builtins are additive. + repeated BuiltIn builtins = 2; + } + + // Webhook settings for prompt guard + message Webhook { + // Host to send the traffic to. + string host = 1; + // Port to send the traffic to + uint32 port = 2; + message HeaderMatch { + enum MatchType { + // Exact match + EXACT = 0; + // Prefix match + PREFIX = 1; + // Suffix match + SUFFIX = 2; + // Contains match + CONTAINS = 3; + // Regex match + REGEX = 4; + } + // Header key to match + string key = 1; + // Type of match to use + MatchType match_type = 2; + } + // Headers to forward with the request + repeated HeaderMatch headers = 3; + } + + + // Request settings for Prompt Guard + message Request { + message CustomResponse { + // Custom response message to send back to the client. + // If not specified, the following default message will be used: + // "The request was rejected due to inappropriate content" + string message = 1; + + // Status code to send back to the client. + uint32 status_code = 2; + } // Custom response message to send back to the client. // If not specified, the following default message will be used: // "The request was rejected due to inappropriate content" - string custom_response_message = 2; + CustomResponse custom_response = 1; + + // Regex request guard + Regex regex = 2; + + // Webhook request guard + Webhook webhook = 3; } + // Request settings for Prompt Guard message Response { - enum BuiltIn { - // Default REGEX for Social Security Numbers - SSN = 0; - // Default REGEX for Credit Card Numbers - CREDIT_CARD = 1; - // Default REGEX for Email Addresses - EMAIL = 2; - // Default REGEX for Phone Numbers - PHONE_NUMBER = 3; - } - // A list of Regex patterns to match against the response. - // All matches will be masked before being sent back to the client. - // matches and builtins are additive. - repeated string matches = 1; - // A list of built-in regexes to mask in the response. - // matches and builtins are additive. - repeated BuiltIn builtins = 2; + // Regex response guard + Regex regex = 1; + + // Webhook response guard + Webhook webhook = 2; } // Guards for the prompt request - Request request = 2; + Request request = 1; // Guards for the LLM response - Response response = 3; + Response response = 2; } \ No newline at end of file diff --git a/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.clone.go b/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.clone.go index debf97130..7357eb4b7 100644 --- a/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.clone.go +++ b/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.clone.go @@ -13,6 +13,8 @@ import ( "github.com/solo-io/protoc-gen-ext/pkg/clone" "google.golang.org/protobuf/proto" + github_com_golang_protobuf_ptypes_duration "github.com/golang/protobuf/ptypes/duration" + github_com_golang_protobuf_ptypes_wrappers "github.com/golang/protobuf/ptypes/wrappers" github_com_solo_io_solo_kit_pkg_api_v1_resources_core "github.com/solo-io/solo-kit/pkg/api/v1/resources/core" @@ -29,6 +31,29 @@ var ( _ = proto.Message(nil) ) +// Clone function +func (m *DatadogRemoteConfig) Clone() proto.Message { + var target *DatadogRemoteConfig + if m == nil { + return target + } + target = &DatadogRemoteConfig{} + + if h, ok := interface{}(m.GetPollingInterval()).(clone.Cloner); ok { + target.PollingInterval = h.Clone().(*github_com_golang_protobuf_ptypes_duration.Duration) + } else { + target.PollingInterval = proto.Clone(m.GetPollingInterval()).(*github_com_golang_protobuf_ptypes_duration.Duration) + } + + if h, ok := interface{}(m.GetDisabled()).(clone.Cloner); ok { + target.Disabled = h.Clone().(*github_com_golang_protobuf_ptypes_wrappers.BoolValue) + } else { + target.Disabled = proto.Clone(m.GetDisabled()).(*github_com_golang_protobuf_ptypes_wrappers.BoolValue) + } + + return target +} + // Clone function func (m *DatadogConfig) Clone() proto.Message { var target *DatadogConfig @@ -43,6 +68,14 @@ func (m *DatadogConfig) Clone() proto.Message { target.ServiceName = proto.Clone(m.GetServiceName()).(*github_com_golang_protobuf_ptypes_wrappers.StringValue) } + target.CollectorHostname = m.GetCollectorHostname() + + if h, ok := interface{}(m.GetRemoteConfig()).(clone.Cloner); ok { + target.RemoteConfig = h.Clone().(*DatadogRemoteConfig) + } else { + target.RemoteConfig = proto.Clone(m.GetRemoteConfig()).(*DatadogRemoteConfig) + } + switch m.CollectorCluster.(type) { case *DatadogConfig_CollectorUpstreamRef: diff --git a/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.equal.go b/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.equal.go index 1004b2965..9cc11d686 100644 --- a/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.equal.go +++ b/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.equal.go @@ -25,6 +25,50 @@ var ( _ = proto.Message(nil) ) +// Equal function +func (m *DatadogRemoteConfig) Equal(that interface{}) bool { + if that == nil { + return m == nil + } + + target, ok := that.(*DatadogRemoteConfig) + if !ok { + that2, ok := that.(DatadogRemoteConfig) + if ok { + target = &that2 + } else { + return false + } + } + if target == nil { + return m == nil + } else if m == nil { + return false + } + + if h, ok := interface{}(m.GetPollingInterval()).(equality.Equalizer); ok { + if !h.Equal(target.GetPollingInterval()) { + return false + } + } else { + if !proto.Equal(m.GetPollingInterval(), target.GetPollingInterval()) { + return false + } + } + + if h, ok := interface{}(m.GetDisabled()).(equality.Equalizer); ok { + if !h.Equal(target.GetDisabled()) { + return false + } + } else { + if !proto.Equal(m.GetDisabled(), target.GetDisabled()) { + return false + } + } + + return true +} + // Equal function func (m *DatadogConfig) Equal(that interface{}) bool { if that == nil { @@ -56,6 +100,20 @@ func (m *DatadogConfig) Equal(that interface{}) bool { } } + if strings.Compare(m.GetCollectorHostname(), target.GetCollectorHostname()) != 0 { + return false + } + + if h, ok := interface{}(m.GetRemoteConfig()).(equality.Equalizer); ok { + if !h.Equal(target.GetRemoteConfig()) { + return false + } + } else { + if !proto.Equal(m.GetRemoteConfig(), target.GetRemoteConfig()) { + return false + } + } + switch m.CollectorCluster.(type) { case *DatadogConfig_CollectorUpstreamRef: diff --git a/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.go b/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.go index 12050ca02..0bab6bacf 100644 --- a/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.go +++ b/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.go @@ -11,6 +11,7 @@ import ( sync "sync" _ "github.com/envoyproxy/protoc-gen-validate/validate" + duration "github.com/golang/protobuf/ptypes/duration" wrappers "github.com/golang/protobuf/ptypes/wrappers" _ "github.com/solo-io/protoc-gen-ext/extproto" _ "github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/external/udpa/annotations" @@ -26,6 +27,67 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// Configuration for the Remote Configuration feature. +type DatadogRemoteConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Frequency at which new configuration updates are queried. + // If no value is provided, the default value is delegated to the Datadog tracing library. + PollingInterval *duration.Duration `protobuf:"bytes,1,opt,name=polling_interval,json=pollingInterval,proto3" json:"polling_interval,omitempty"` + // Disabled remote config. + // This field does not exist in envoy's config but allow us to preserve the default behavior + // when upgrading to envoy v1.31 + Disabled *wrappers.BoolValue `protobuf:"bytes,2,opt,name=disabled,proto3" json:"disabled,omitempty"` +} + +func (x *DatadogRemoteConfig) Reset() { + *x = DatadogRemoteConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DatadogRemoteConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DatadogRemoteConfig) ProtoMessage() {} + +func (x *DatadogRemoteConfig) ProtoReflect() protoreflect.Message { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DatadogRemoteConfig.ProtoReflect.Descriptor instead. +func (*DatadogRemoteConfig) Descriptor() ([]byte, []int) { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_rawDescGZIP(), []int{0} +} + +func (x *DatadogRemoteConfig) GetPollingInterval() *duration.Duration { + if x != nil { + return x.PollingInterval + } + return nil +} + +func (x *DatadogRemoteConfig) GetDisabled() *wrappers.BoolValue { + if x != nil { + return x.Disabled + } + return nil +} + // Configuration for the Datadog tracer. // [#extension: envoy.tracers.datadog] type DatadogConfig struct { @@ -42,12 +104,21 @@ type DatadogConfig struct { CollectorCluster isDatadogConfig_CollectorCluster `protobuf_oneof:"collector_cluster"` // The name used for the service when traces are generated by envoy. ServiceName *wrappers.StringValue `protobuf:"bytes,2,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` + // Optional hostname to use when sending spans to the collector_cluster. Useful for collectors + // that require a specific hostname. Defaults to :ref:`collector_cluster ` above. + CollectorHostname string `protobuf:"bytes,4,opt,name=collector_hostname,json=collectorHostname,proto3" json:"collector_hostname,omitempty"` + // Configures remote configuration. + // Remote Configuration allows to configure the tracer from Datadog's user interface. + // This feature can drastically increase the number of connections to the Datadog Agent. + // Each tracer regularly polls for configuration updates, and the number of tracers is the product + // of the number of listeners and worker threads. + RemoteConfig *DatadogRemoteConfig `protobuf:"bytes,5,opt,name=remote_config,json=remoteConfig,proto3" json:"remote_config,omitempty"` } func (x *DatadogConfig) Reset() { *x = DatadogConfig{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes[0] + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -60,7 +131,7 @@ func (x *DatadogConfig) String() string { func (*DatadogConfig) ProtoMessage() {} func (x *DatadogConfig) ProtoReflect() protoreflect.Message { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes[0] + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -73,7 +144,7 @@ func (x *DatadogConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use DatadogConfig.ProtoReflect.Descriptor instead. func (*DatadogConfig) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_rawDescGZIP(), []int{0} + return file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_rawDescGZIP(), []int{1} } func (m *DatadogConfig) GetCollectorCluster() isDatadogConfig_CollectorCluster { @@ -104,6 +175,20 @@ func (x *DatadogConfig) GetServiceName() *wrappers.StringValue { return nil } +func (x *DatadogConfig) GetCollectorHostname() string { + if x != nil { + return x.CollectorHostname + } + return "" +} + +func (x *DatadogConfig) GetRemoteConfig() *DatadogRemoteConfig { + if x != nil { + return x.RemoteConfig + } + return nil +} + type isDatadogConfig_CollectorCluster interface { isDatadogConfig_CollectorCluster() } @@ -136,7 +221,9 @@ var file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_ 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x33, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, - 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, + 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, @@ -148,38 +235,56 @@ var file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_ 0x73, 0x6f, 0x6c, 0x6f, 0x2d, 0x69, 0x6f, 0x2f, 0x73, 0x6f, 0x6c, 0x6f, 0x2d, 0x6b, 0x69, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x65, 0x78, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x74, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x93, 0x02, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x64, 0x6f, - 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x51, 0x0a, 0x16, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x72, 0x65, - 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, - 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x66, 0x48, 0x00, 0x52, 0x14, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x55, - 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x12, 0x23, 0x0a, 0x0c, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x48, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x2b, 0x8a, 0xc8, 0xde, 0x8e, 0x04, - 0x25, 0x0a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x64, 0x6f, 0x67, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x13, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0xd3, 0x01, 0xb8, 0xf5, - 0x04, 0x01, 0xc0, 0xf5, 0x04, 0x01, 0xd0, 0xf5, 0x04, 0x01, 0x82, 0x8a, 0xd7, 0xad, 0x04, 0x2a, - 0x12, 0x28, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x72, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x64, - 0x6f, 0x67, 0x2e, 0x76, 0x34, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xe2, 0xb5, 0xdf, 0xcb, 0x07, 0x02, - 0x10, 0x02, 0x0a, 0x2b, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x33, 0x42, - 0x0c, 0x44, 0x61, 0x74, 0x61, 0x64, 0x6f, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x6f, 0x6c, 0x6f, - 0x2d, 0x69, 0x6f, 0x2f, 0x73, 0x6f, 0x6c, 0x6f, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, - 0x69, 0x6f, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2f, 0x76, - 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x93, 0x01, 0x0a, 0x13, 0x44, 0x61, 0x74, 0x61, 0x64, 0x6f, + 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, + 0x10, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0f, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x12, 0x36, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x9b, 0x03, 0x0a, 0x0d, + 0x44, 0x61, 0x74, 0x61, 0x64, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x51, 0x0a, + 0x16, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x48, 0x00, 0x52, 0x14, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, + 0x12, 0x23, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x57, + 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x64, 0x6f, 0x67, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x2b, 0x8a, 0xc8, 0xde, 0x8e, 0x04, 0x25, 0x0a, + 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x74, 0x72, + 0x61, 0x63, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x64, 0x6f, 0x67, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x42, 0x13, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0xd3, 0x01, 0xb8, 0xf5, 0x04, 0x01, + 0xc0, 0xf5, 0x04, 0x01, 0xd0, 0xf5, 0x04, 0x01, 0x82, 0x8a, 0xd7, 0xad, 0x04, 0x2a, 0x12, 0x28, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x72, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x64, 0x6f, 0x67, + 0x2e, 0x76, 0x34, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xe2, 0xb5, 0xdf, 0xcb, 0x07, 0x02, 0x10, 0x02, + 0x0a, 0x2b, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x33, 0x42, 0x0c, 0x44, + 0x61, 0x74, 0x61, 0x64, 0x6f, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x50, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x6f, 0x6c, 0x6f, 0x2d, 0x69, + 0x6f, 0x2f, 0x73, 0x6f, 0x6c, 0x6f, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, + 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2f, 0x76, 0x33, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -194,20 +299,26 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace return file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_rawDescData } -var file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_goTypes = []interface{}{ - (*DatadogConfig)(nil), // 0: solo.io.envoy.config.trace.v3.DatadogConfig - (*core.ResourceRef)(nil), // 1: core.solo.io.ResourceRef - (*wrappers.StringValue)(nil), // 2: google.protobuf.StringValue + (*DatadogRemoteConfig)(nil), // 0: solo.io.envoy.config.trace.v3.DatadogRemoteConfig + (*DatadogConfig)(nil), // 1: solo.io.envoy.config.trace.v3.DatadogConfig + (*duration.Duration)(nil), // 2: google.protobuf.Duration + (*wrappers.BoolValue)(nil), // 3: google.protobuf.BoolValue + (*core.ResourceRef)(nil), // 4: core.solo.io.ResourceRef + (*wrappers.StringValue)(nil), // 5: google.protobuf.StringValue } var file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_depIdxs = []int32{ - 1, // 0: solo.io.envoy.config.trace.v3.DatadogConfig.collector_upstream_ref:type_name -> core.solo.io.ResourceRef - 2, // 1: solo.io.envoy.config.trace.v3.DatadogConfig.service_name:type_name -> google.protobuf.StringValue - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 2, // 0: solo.io.envoy.config.trace.v3.DatadogRemoteConfig.polling_interval:type_name -> google.protobuf.Duration + 3, // 1: solo.io.envoy.config.trace.v3.DatadogRemoteConfig.disabled:type_name -> google.protobuf.BoolValue + 4, // 2: solo.io.envoy.config.trace.v3.DatadogConfig.collector_upstream_ref:type_name -> core.solo.io.ResourceRef + 5, // 3: solo.io.envoy.config.trace.v3.DatadogConfig.service_name:type_name -> google.protobuf.StringValue + 0, // 4: solo.io.envoy.config.trace.v3.DatadogConfig.remote_config:type_name -> solo.io.envoy.config.trace.v3.DatadogRemoteConfig + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { @@ -219,6 +330,18 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace } if !protoimpl.UnsafeEnabled { file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DatadogRemoteConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DatadogConfig); i { case 0: return &v.state @@ -231,7 +354,7 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace } } } - file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_msgTypes[1].OneofWrappers = []interface{}{ (*DatadogConfig_CollectorUpstreamRef)(nil), (*DatadogConfig_ClusterName)(nil), } @@ -241,7 +364,7 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_github_com_solo_io_solo_apis_api_gloo_gloo_external_envoy_config_trace_v3_datadog_proto_rawDesc, NumEnums: 0, - NumMessages: 1, + NumMessages: 2, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.hash.go b/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.hash.go index 5b41710a5..c74cc0084 100644 --- a/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.hash.go +++ b/pkg/api/gloo.solo.io/external/envoy/config/trace/v3/datadog.pb.hash.go @@ -25,6 +25,62 @@ var ( _ = new(safe_hasher.SafeHasher) ) +// Hash function +func (m *DatadogRemoteConfig) Hash(hasher hash.Hash64) (uint64, error) { + if m == nil { + return 0, nil + } + if hasher == nil { + hasher = fnv.New64() + } + var err error + if _, err = hasher.Write([]byte("solo.io.envoy.config.trace.v3.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/external/envoy/config/trace/v3.DatadogRemoteConfig")); err != nil { + return 0, err + } + + if h, ok := interface{}(m.GetPollingInterval()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("PollingInterval")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(m.GetPollingInterval(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("PollingInterval")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + + if h, ok := interface{}(m.GetDisabled()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("Disabled")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(m.GetDisabled(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("Disabled")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + + return hasher.Sum64(), nil +} + // Hash function func (m *DatadogConfig) Hash(hasher hash.Hash64) (uint64, error) { if m == nil { @@ -58,6 +114,30 @@ func (m *DatadogConfig) Hash(hasher hash.Hash64) (uint64, error) { } } + if _, err = hasher.Write([]byte(m.GetCollectorHostname())); err != nil { + return 0, err + } + + if h, ok := interface{}(m.GetRemoteConfig()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("RemoteConfig")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(m.GetRemoteConfig(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("RemoteConfig")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + switch m.CollectorCluster.(type) { case *DatadogConfig_CollectorUpstreamRef: diff --git a/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.clone.go b/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.clone.go index 91b3b3ef1..9e056b800 100644 --- a/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.clone.go +++ b/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.clone.go @@ -132,6 +132,18 @@ func (m *UpstreamSpec) Clone() proto.Message { } } + case *UpstreamSpec_Gemini_: + + if h, ok := interface{}(m.GetGemini()).(clone.Cloner); ok { + target.Llm = &UpstreamSpec_Gemini_{ + Gemini: h.Clone().(*UpstreamSpec_Gemini), + } + } else { + target.Llm = &UpstreamSpec_Gemini_{ + Gemini: proto.Clone(m.GetGemini()).(*UpstreamSpec_Gemini), + } + } + } return target @@ -152,9 +164,9 @@ func (m *RouteSettings) Clone() proto.Message { } if h, ok := interface{}(m.GetPromptGuard()).(clone.Cloner); ok { - target.PromptGuard = h.Clone().(*AIPromptGaurd) + target.PromptGuard = h.Clone().(*AIPromptGuard) } else { - target.PromptGuard = proto.Clone(m.GetPromptGuard()).(*AIPromptGaurd) + target.PromptGuard = proto.Clone(m.GetPromptGuard()).(*AIPromptGuard) } if h, ok := interface{}(m.GetRag()).(clone.Cloner); ok { @@ -314,26 +326,6 @@ func (m *RAG) Clone() proto.Message { return target } -// Clone function -func (m *RateLimiting) Clone() proto.Message { - var target *RateLimiting - if m == nil { - return target - } - target = &RateLimiting{} - - if m.GetRateLimitConfigs() != nil { - target.RateLimitConfigs = make([]string, len(m.GetRateLimitConfigs())) - for idx, v := range m.GetRateLimitConfigs() { - - target.RateLimitConfigs[idx] = v - - } - } - - return target -} - // Clone function func (m *AIPromptEnrichment) Clone() proto.Message { var target *AIPromptEnrichment @@ -372,23 +364,23 @@ func (m *AIPromptEnrichment) Clone() proto.Message { } // Clone function -func (m *AIPromptGaurd) Clone() proto.Message { - var target *AIPromptGaurd +func (m *AIPromptGuard) Clone() proto.Message { + var target *AIPromptGuard if m == nil { return target } - target = &AIPromptGaurd{} + target = &AIPromptGuard{} if h, ok := interface{}(m.GetRequest()).(clone.Cloner); ok { - target.Request = h.Clone().(*AIPromptGaurd_Request) + target.Request = h.Clone().(*AIPromptGuard_Request) } else { - target.Request = proto.Clone(m.GetRequest()).(*AIPromptGaurd_Request) + target.Request = proto.Clone(m.GetRequest()).(*AIPromptGuard_Request) } if h, ok := interface{}(m.GetResponse()).(clone.Cloner); ok { - target.Response = h.Clone().(*AIPromptGaurd_Response) + target.Response = h.Clone().(*AIPromptGuard_Response) } else { - target.Response = proto.Clone(m.GetResponse()).(*AIPromptGaurd_Response) + target.Response = proto.Clone(m.GetResponse()).(*AIPromptGuard_Response) } return target @@ -467,6 +459,37 @@ func (m *UpstreamSpec_AzureOpenAI) Clone() proto.Message { return target } +// Clone function +func (m *UpstreamSpec_Gemini) Clone() proto.Message { + var target *UpstreamSpec_Gemini + if m == nil { + return target + } + target = &UpstreamSpec_Gemini{} + + target.Model = m.GetModel() + + target.ApiVersion = m.GetApiVersion() + + switch m.AuthTokenSource.(type) { + + case *UpstreamSpec_Gemini_AuthToken: + + if h, ok := interface{}(m.GetAuthToken()).(clone.Cloner); ok { + target.AuthTokenSource = &UpstreamSpec_Gemini_AuthToken{ + AuthToken: h.Clone().(*SingleAuthToken), + } + } else { + target.AuthTokenSource = &UpstreamSpec_Gemini_AuthToken{ + AuthToken: proto.Clone(m.GetAuthToken()).(*SingleAuthToken), + } + } + + } + + return target +} + // Clone function func (m *UpstreamSpec_Mistral) Clone() proto.Message { var target *UpstreamSpec_Mistral @@ -601,6 +624,18 @@ func (m *UpstreamSpec_MultiPool_Backend) Clone() proto.Message { } } + case *UpstreamSpec_MultiPool_Backend_Gemini: + + if h, ok := interface{}(m.GetGemini()).(clone.Cloner); ok { + target.Llm = &UpstreamSpec_MultiPool_Backend_Gemini{ + Gemini: h.Clone().(*UpstreamSpec_Gemini), + } + } else { + target.Llm = &UpstreamSpec_MultiPool_Backend_Gemini{ + Gemini: proto.Clone(m.GetGemini()).(*UpstreamSpec_Gemini), + } + } + } return target @@ -806,12 +841,12 @@ func (m *AIPromptEnrichment_Message) Clone() proto.Message { } // Clone function -func (m *AIPromptGaurd_Request) Clone() proto.Message { - var target *AIPromptGaurd_Request +func (m *AIPromptGuard_Regex) Clone() proto.Message { + var target *AIPromptGuard_Regex if m == nil { return target } - target = &AIPromptGaurd_Request{} + target = &AIPromptGuard_Regex{} if m.GetMatches() != nil { target.Matches = make([]string, len(m.GetMatches())) @@ -822,36 +857,124 @@ func (m *AIPromptGaurd_Request) Clone() proto.Message { } } - target.CustomResponseMessage = m.GetCustomResponseMessage() + if m.GetBuiltins() != nil { + target.Builtins = make([]AIPromptGuard_Regex_BuiltIn, len(m.GetBuiltins())) + for idx, v := range m.GetBuiltins() { + + target.Builtins[idx] = v + + } + } return target } // Clone function -func (m *AIPromptGaurd_Response) Clone() proto.Message { - var target *AIPromptGaurd_Response +func (m *AIPromptGuard_Webhook) Clone() proto.Message { + var target *AIPromptGuard_Webhook if m == nil { return target } - target = &AIPromptGaurd_Response{} + target = &AIPromptGuard_Webhook{} - if m.GetMatches() != nil { - target.Matches = make([]string, len(m.GetMatches())) - for idx, v := range m.GetMatches() { + target.Host = m.GetHost() - target.Matches[idx] = v + target.Port = m.GetPort() + + if m.GetHeaders() != nil { + target.Headers = make([]*AIPromptGuard_Webhook_HeaderMatch, len(m.GetHeaders())) + for idx, v := range m.GetHeaders() { + + if h, ok := interface{}(v).(clone.Cloner); ok { + target.Headers[idx] = h.Clone().(*AIPromptGuard_Webhook_HeaderMatch) + } else { + target.Headers[idx] = proto.Clone(v).(*AIPromptGuard_Webhook_HeaderMatch) + } } } - if m.GetBuiltins() != nil { - target.Builtins = make([]AIPromptGaurd_Response_BuiltIn, len(m.GetBuiltins())) - for idx, v := range m.GetBuiltins() { + return target +} - target.Builtins[idx] = v +// Clone function +func (m *AIPromptGuard_Request) Clone() proto.Message { + var target *AIPromptGuard_Request + if m == nil { + return target + } + target = &AIPromptGuard_Request{} - } + if h, ok := interface{}(m.GetCustomResponse()).(clone.Cloner); ok { + target.CustomResponse = h.Clone().(*AIPromptGuard_Request_CustomResponse) + } else { + target.CustomResponse = proto.Clone(m.GetCustomResponse()).(*AIPromptGuard_Request_CustomResponse) } + if h, ok := interface{}(m.GetRegex()).(clone.Cloner); ok { + target.Regex = h.Clone().(*AIPromptGuard_Regex) + } else { + target.Regex = proto.Clone(m.GetRegex()).(*AIPromptGuard_Regex) + } + + if h, ok := interface{}(m.GetWebhook()).(clone.Cloner); ok { + target.Webhook = h.Clone().(*AIPromptGuard_Webhook) + } else { + target.Webhook = proto.Clone(m.GetWebhook()).(*AIPromptGuard_Webhook) + } + + return target +} + +// Clone function +func (m *AIPromptGuard_Response) Clone() proto.Message { + var target *AIPromptGuard_Response + if m == nil { + return target + } + target = &AIPromptGuard_Response{} + + if h, ok := interface{}(m.GetRegex()).(clone.Cloner); ok { + target.Regex = h.Clone().(*AIPromptGuard_Regex) + } else { + target.Regex = proto.Clone(m.GetRegex()).(*AIPromptGuard_Regex) + } + + if h, ok := interface{}(m.GetWebhook()).(clone.Cloner); ok { + target.Webhook = h.Clone().(*AIPromptGuard_Webhook) + } else { + target.Webhook = proto.Clone(m.GetWebhook()).(*AIPromptGuard_Webhook) + } + + return target +} + +// Clone function +func (m *AIPromptGuard_Webhook_HeaderMatch) Clone() proto.Message { + var target *AIPromptGuard_Webhook_HeaderMatch + if m == nil { + return target + } + target = &AIPromptGuard_Webhook_HeaderMatch{} + + target.Key = m.GetKey() + + target.MatchType = m.GetMatchType() + + return target +} + +// Clone function +func (m *AIPromptGuard_Request_CustomResponse) Clone() proto.Message { + var target *AIPromptGuard_Request_CustomResponse + if m == nil { + return target + } + target = &AIPromptGuard_Request_CustomResponse{} + + target.Message = m.GetMessage() + + target.StatusCode = m.GetStatusCode() + return target } diff --git a/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.equal.go b/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.equal.go index 127fa4c17..0e14ee694 100644 --- a/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.equal.go +++ b/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.equal.go @@ -180,6 +180,21 @@ func (m *UpstreamSpec) Equal(that interface{}) bool { } } + case *UpstreamSpec_Gemini_: + if _, ok := target.Llm.(*UpstreamSpec_Gemini_); !ok { + return false + } + + if h, ok := interface{}(m.GetGemini()).(equality.Equalizer); ok { + if !h.Equal(target.GetGemini()) { + return false + } + } else { + if !proto.Equal(m.GetGemini(), target.GetGemini()) { + return false + } + } + default: // m is nil but target is not nil if m.Llm != target.Llm { @@ -512,41 +527,6 @@ func (m *RAG) Equal(that interface{}) bool { return true } -// Equal function -func (m *RateLimiting) Equal(that interface{}) bool { - if that == nil { - return m == nil - } - - target, ok := that.(*RateLimiting) - if !ok { - that2, ok := that.(RateLimiting) - if ok { - target = &that2 - } else { - return false - } - } - if target == nil { - return m == nil - } else if m == nil { - return false - } - - if len(m.GetRateLimitConfigs()) != len(target.GetRateLimitConfigs()) { - return false - } - for idx, v := range m.GetRateLimitConfigs() { - - if strings.Compare(v, target.GetRateLimitConfigs()[idx]) != 0 { - return false - } - - } - - return true -} - // Equal function func (m *AIPromptEnrichment) Equal(that interface{}) bool { if that == nil { @@ -606,14 +586,14 @@ func (m *AIPromptEnrichment) Equal(that interface{}) bool { } // Equal function -func (m *AIPromptGaurd) Equal(that interface{}) bool { +func (m *AIPromptGuard) Equal(that interface{}) bool { if that == nil { return m == nil } - target, ok := that.(*AIPromptGaurd) + target, ok := that.(*AIPromptGuard) if !ok { - that2, ok := that.(AIPromptGaurd) + that2, ok := that.(AIPromptGuard) if ok { target = &that2 } else { @@ -789,6 +769,62 @@ func (m *UpstreamSpec_AzureOpenAI) Equal(that interface{}) bool { return true } +// Equal function +func (m *UpstreamSpec_Gemini) Equal(that interface{}) bool { + if that == nil { + return m == nil + } + + target, ok := that.(*UpstreamSpec_Gemini) + if !ok { + that2, ok := that.(UpstreamSpec_Gemini) + if ok { + target = &that2 + } else { + return false + } + } + if target == nil { + return m == nil + } else if m == nil { + return false + } + + if strings.Compare(m.GetModel(), target.GetModel()) != 0 { + return false + } + + if strings.Compare(m.GetApiVersion(), target.GetApiVersion()) != 0 { + return false + } + + switch m.AuthTokenSource.(type) { + + case *UpstreamSpec_Gemini_AuthToken: + if _, ok := target.AuthTokenSource.(*UpstreamSpec_Gemini_AuthToken); !ok { + return false + } + + if h, ok := interface{}(m.GetAuthToken()).(equality.Equalizer); ok { + if !h.Equal(target.GetAuthToken()) { + return false + } + } else { + if !proto.Equal(m.GetAuthToken(), target.GetAuthToken()) { + return false + } + } + + default: + // m is nil but target is not nil + if m.AuthTokenSource != target.AuthTokenSource { + return false + } + } + + return true +} + // Equal function func (m *UpstreamSpec_Mistral) Equal(that interface{}) bool { if that == nil { @@ -1013,6 +1049,21 @@ func (m *UpstreamSpec_MultiPool_Backend) Equal(that interface{}) bool { } } + case *UpstreamSpec_MultiPool_Backend_Gemini: + if _, ok := target.Llm.(*UpstreamSpec_MultiPool_Backend_Gemini); !ok { + return false + } + + if h, ok := interface{}(m.GetGemini()).(equality.Equalizer); ok { + if !h.Equal(target.GetGemini()) { + return false + } + } else { + if !proto.Equal(m.GetGemini(), target.GetGemini()) { + return false + } + } + default: // m is nil but target is not nil if m.Llm != target.Llm { @@ -1388,14 +1439,14 @@ func (m *AIPromptEnrichment_Message) Equal(that interface{}) bool { } // Equal function -func (m *AIPromptGaurd_Request) Equal(that interface{}) bool { +func (m *AIPromptGuard_Regex) Equal(that interface{}) bool { if that == nil { return m == nil } - target, ok := that.(*AIPromptGaurd_Request) + target, ok := that.(*AIPromptGuard_Regex) if !ok { - that2, ok := that.(AIPromptGaurd_Request) + that2, ok := that.(AIPromptGuard_Regex) if ok { target = &that2 } else { @@ -1419,22 +1470,29 @@ func (m *AIPromptGaurd_Request) Equal(that interface{}) bool { } - if strings.Compare(m.GetCustomResponseMessage(), target.GetCustomResponseMessage()) != 0 { + if len(m.GetBuiltins()) != len(target.GetBuiltins()) { return false } + for idx, v := range m.GetBuiltins() { + + if v != target.GetBuiltins()[idx] { + return false + } + + } return true } // Equal function -func (m *AIPromptGaurd_Response) Equal(that interface{}) bool { +func (m *AIPromptGuard_Webhook) Equal(that interface{}) bool { if that == nil { return m == nil } - target, ok := that.(*AIPromptGaurd_Response) + target, ok := that.(*AIPromptGuard_Webhook) if !ok { - that2, ok := that.(AIPromptGaurd_Response) + that2, ok := that.(AIPromptGuard_Webhook) if ok { target = &that2 } else { @@ -1447,26 +1505,191 @@ func (m *AIPromptGaurd_Response) Equal(that interface{}) bool { return false } - if len(m.GetMatches()) != len(target.GetMatches()) { + if strings.Compare(m.GetHost(), target.GetHost()) != 0 { return false } - for idx, v := range m.GetMatches() { - if strings.Compare(v, target.GetMatches()[idx]) != 0 { + if m.GetPort() != target.GetPort() { + return false + } + + if len(m.GetHeaders()) != len(target.GetHeaders()) { + return false + } + for idx, v := range m.GetHeaders() { + + if h, ok := interface{}(v).(equality.Equalizer); ok { + if !h.Equal(target.GetHeaders()[idx]) { + return false + } + } else { + if !proto.Equal(v, target.GetHeaders()[idx]) { + return false + } + } + + } + + return true +} + +// Equal function +func (m *AIPromptGuard_Request) Equal(that interface{}) bool { + if that == nil { + return m == nil + } + + target, ok := that.(*AIPromptGuard_Request) + if !ok { + that2, ok := that.(AIPromptGuard_Request) + if ok { + target = &that2 + } else { return false } + } + if target == nil { + return m == nil + } else if m == nil { + return false + } + if h, ok := interface{}(m.GetCustomResponse()).(equality.Equalizer); ok { + if !h.Equal(target.GetCustomResponse()) { + return false + } + } else { + if !proto.Equal(m.GetCustomResponse(), target.GetCustomResponse()) { + return false + } } - if len(m.GetBuiltins()) != len(target.GetBuiltins()) { + if h, ok := interface{}(m.GetRegex()).(equality.Equalizer); ok { + if !h.Equal(target.GetRegex()) { + return false + } + } else { + if !proto.Equal(m.GetRegex(), target.GetRegex()) { + return false + } + } + + if h, ok := interface{}(m.GetWebhook()).(equality.Equalizer); ok { + if !h.Equal(target.GetWebhook()) { + return false + } + } else { + if !proto.Equal(m.GetWebhook(), target.GetWebhook()) { + return false + } + } + + return true +} + +// Equal function +func (m *AIPromptGuard_Response) Equal(that interface{}) bool { + if that == nil { + return m == nil + } + + target, ok := that.(*AIPromptGuard_Response) + if !ok { + that2, ok := that.(AIPromptGuard_Response) + if ok { + target = &that2 + } else { + return false + } + } + if target == nil { + return m == nil + } else if m == nil { return false } - for idx, v := range m.GetBuiltins() { - if v != target.GetBuiltins()[idx] { + if h, ok := interface{}(m.GetRegex()).(equality.Equalizer); ok { + if !h.Equal(target.GetRegex()) { return false } + } else { + if !proto.Equal(m.GetRegex(), target.GetRegex()) { + return false + } + } + + if h, ok := interface{}(m.GetWebhook()).(equality.Equalizer); ok { + if !h.Equal(target.GetWebhook()) { + return false + } + } else { + if !proto.Equal(m.GetWebhook(), target.GetWebhook()) { + return false + } + } + + return true +} + +// Equal function +func (m *AIPromptGuard_Webhook_HeaderMatch) Equal(that interface{}) bool { + if that == nil { + return m == nil + } + + target, ok := that.(*AIPromptGuard_Webhook_HeaderMatch) + if !ok { + that2, ok := that.(AIPromptGuard_Webhook_HeaderMatch) + if ok { + target = &that2 + } else { + return false + } + } + if target == nil { + return m == nil + } else if m == nil { + return false + } + if strings.Compare(m.GetKey(), target.GetKey()) != 0 { + return false + } + + if m.GetMatchType() != target.GetMatchType() { + return false + } + + return true +} + +// Equal function +func (m *AIPromptGuard_Request_CustomResponse) Equal(that interface{}) bool { + if that == nil { + return m == nil + } + + target, ok := that.(*AIPromptGuard_Request_CustomResponse) + if !ok { + that2, ok := that.(AIPromptGuard_Request_CustomResponse) + if ok { + target = &that2 + } else { + return false + } + } + if target == nil { + return m == nil + } else if m == nil { + return false + } + + if strings.Compare(m.GetMessage(), target.GetMessage()) != 0 { + return false + } + + if m.GetStatusCode() != target.GetStatusCode() { + return false } return true diff --git a/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.go b/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.go index 3c806da44..456e6c146 100644 --- a/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.go +++ b/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.go @@ -118,60 +118,112 @@ func (SemanticCache_Mode) EnumDescriptor() ([]byte, []int) { return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{6, 0} } -type AIPromptGaurd_Response_BuiltIn int32 +type AIPromptGuard_Regex_BuiltIn int32 const ( // Default REGEX for Social Security Numbers - AIPromptGaurd_Response_SSN AIPromptGaurd_Response_BuiltIn = 0 + AIPromptGuard_Regex_SSN AIPromptGuard_Regex_BuiltIn = 0 // Default REGEX for Credit Card Numbers - AIPromptGaurd_Response_CREDIT_CARD AIPromptGaurd_Response_BuiltIn = 1 - // Default REGEX for Email Addresses - AIPromptGaurd_Response_EMAIL AIPromptGaurd_Response_BuiltIn = 2 - // Default REGEX for Phone Numbers - AIPromptGaurd_Response_PHONE_NUMBER AIPromptGaurd_Response_BuiltIn = 3 + AIPromptGuard_Regex_CREDIT_CARD AIPromptGuard_Regex_BuiltIn = 1 ) -// Enum value maps for AIPromptGaurd_Response_BuiltIn. +// Enum value maps for AIPromptGuard_Regex_BuiltIn. var ( - AIPromptGaurd_Response_BuiltIn_name = map[int32]string{ + AIPromptGuard_Regex_BuiltIn_name = map[int32]string{ 0: "SSN", 1: "CREDIT_CARD", - 2: "EMAIL", - 3: "PHONE_NUMBER", } - AIPromptGaurd_Response_BuiltIn_value = map[string]int32{ - "SSN": 0, - "CREDIT_CARD": 1, - "EMAIL": 2, - "PHONE_NUMBER": 3, + AIPromptGuard_Regex_BuiltIn_value = map[string]int32{ + "SSN": 0, + "CREDIT_CARD": 1, } ) -func (x AIPromptGaurd_Response_BuiltIn) Enum() *AIPromptGaurd_Response_BuiltIn { - p := new(AIPromptGaurd_Response_BuiltIn) +func (x AIPromptGuard_Regex_BuiltIn) Enum() *AIPromptGuard_Regex_BuiltIn { + p := new(AIPromptGuard_Regex_BuiltIn) *p = x return p } -func (x AIPromptGaurd_Response_BuiltIn) String() string { +func (x AIPromptGuard_Regex_BuiltIn) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (AIPromptGaurd_Response_BuiltIn) Descriptor() protoreflect.EnumDescriptor { +func (AIPromptGuard_Regex_BuiltIn) Descriptor() protoreflect.EnumDescriptor { return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_enumTypes[2].Descriptor() } -func (AIPromptGaurd_Response_BuiltIn) Type() protoreflect.EnumType { +func (AIPromptGuard_Regex_BuiltIn) Type() protoreflect.EnumType { return &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_enumTypes[2] } -func (x AIPromptGaurd_Response_BuiltIn) Number() protoreflect.EnumNumber { +func (x AIPromptGuard_Regex_BuiltIn) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } -// Deprecated: Use AIPromptGaurd_Response_BuiltIn.Descriptor instead. -func (AIPromptGaurd_Response_BuiltIn) EnumDescriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{10, 1, 0} +// Deprecated: Use AIPromptGuard_Regex_BuiltIn.Descriptor instead. +func (AIPromptGuard_Regex_BuiltIn) EnumDescriptor() ([]byte, []int) { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{9, 0, 0} +} + +type AIPromptGuard_Webhook_HeaderMatch_MatchType int32 + +const ( + // Exact match + AIPromptGuard_Webhook_HeaderMatch_EXACT AIPromptGuard_Webhook_HeaderMatch_MatchType = 0 + // Prefix match + AIPromptGuard_Webhook_HeaderMatch_PREFIX AIPromptGuard_Webhook_HeaderMatch_MatchType = 1 + // Suffix match + AIPromptGuard_Webhook_HeaderMatch_SUFFIX AIPromptGuard_Webhook_HeaderMatch_MatchType = 2 + // Contains match + AIPromptGuard_Webhook_HeaderMatch_CONTAINS AIPromptGuard_Webhook_HeaderMatch_MatchType = 3 + // Regex match + AIPromptGuard_Webhook_HeaderMatch_REGEX AIPromptGuard_Webhook_HeaderMatch_MatchType = 4 +) + +// Enum value maps for AIPromptGuard_Webhook_HeaderMatch_MatchType. +var ( + AIPromptGuard_Webhook_HeaderMatch_MatchType_name = map[int32]string{ + 0: "EXACT", + 1: "PREFIX", + 2: "SUFFIX", + 3: "CONTAINS", + 4: "REGEX", + } + AIPromptGuard_Webhook_HeaderMatch_MatchType_value = map[string]int32{ + "EXACT": 0, + "PREFIX": 1, + "SUFFIX": 2, + "CONTAINS": 3, + "REGEX": 4, + } +) + +func (x AIPromptGuard_Webhook_HeaderMatch_MatchType) Enum() *AIPromptGuard_Webhook_HeaderMatch_MatchType { + p := new(AIPromptGuard_Webhook_HeaderMatch_MatchType) + *p = x + return p +} + +func (x AIPromptGuard_Webhook_HeaderMatch_MatchType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AIPromptGuard_Webhook_HeaderMatch_MatchType) Descriptor() protoreflect.EnumDescriptor { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_enumTypes[3].Descriptor() +} + +func (AIPromptGuard_Webhook_HeaderMatch_MatchType) Type() protoreflect.EnumType { + return &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_enumTypes[3] +} + +func (x AIPromptGuard_Webhook_HeaderMatch_MatchType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AIPromptGuard_Webhook_HeaderMatch_MatchType.Descriptor instead. +func (AIPromptGuard_Webhook_HeaderMatch_MatchType) EnumDescriptor() ([]byte, []int) { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{9, 1, 0, 0} } type SingleAuthToken struct { @@ -322,6 +374,7 @@ type UpstreamSpec struct { // *UpstreamSpec_Anthropic_ // *UpstreamSpec_AzureOpenai // *UpstreamSpec_Multi + // *UpstreamSpec_Gemini_ Llm isUpstreamSpec_Llm `protobuf_oneof:"llm"` } @@ -399,6 +452,13 @@ func (x *UpstreamSpec) GetMulti() *UpstreamSpec_MultiPool { return nil } +func (x *UpstreamSpec) GetGemini() *UpstreamSpec_Gemini { + if x, ok := x.GetLlm().(*UpstreamSpec_Gemini_); ok { + return x.Gemini + } + return nil +} + type isUpstreamSpec_Llm interface { isUpstreamSpec_Llm() } @@ -428,6 +488,11 @@ type UpstreamSpec_Multi struct { Multi *UpstreamSpec_MultiPool `protobuf:"bytes,5,opt,name=multi,proto3,oneof"` } +type UpstreamSpec_Gemini_ struct { + // Gemini upstream + Gemini *UpstreamSpec_Gemini `protobuf:"bytes,6,opt,name=gemini,proto3,oneof"` +} + func (*UpstreamSpec_Openai) isUpstreamSpec_Llm() {} func (*UpstreamSpec_Mistral_) isUpstreamSpec_Llm() {} @@ -438,6 +503,8 @@ func (*UpstreamSpec_AzureOpenai) isUpstreamSpec_Llm() {} func (*UpstreamSpec_Multi) isUpstreamSpec_Llm() {} +func (*UpstreamSpec_Gemini_) isUpstreamSpec_Llm() {} + // RouteSettings is a way to configure the behavior of the LLM provider on a per-route basis // This allows users to configure things like: // - Prompt Enrichment @@ -485,14 +552,16 @@ type RouteSettings struct { // promptGuard: // request: // customResponseMessage: "Rejected due to inappropriate content" + // regex: // matches: // - "credit card" // response: + // regex: // matches: // # Mastercard // - '(?:^|\D)(5[1-5][0-9]{2}(?:\ |\-|)[0-9]{4}(?:\ |\-|)[0-9]{4}(?:\ |\-|)[0-9]{4})(?:\D|$)' // ```` - PromptGuard *AIPromptGaurd `protobuf:"bytes,2,opt,name=prompt_guard,json=promptGuard,proto3" json:"prompt_guard,omitempty"` + PromptGuard *AIPromptGuard `protobuf:"bytes,2,opt,name=prompt_guard,json=promptGuard,proto3" json:"prompt_guard,omitempty"` // Retrieval Augmented Generation. https://research.ibm.com/blog/retrieval-augmented-generation-RAG // Retrieval Augmented Generation is a process by which you "augment" the information // a model has access to by providing it with a set of documents to use as context. @@ -599,7 +668,7 @@ func (x *RouteSettings) GetPromptEnrichment() *AIPromptEnrichment { return nil } -func (x *RouteSettings) GetPromptGuard() *AIPromptGaurd { +func (x *RouteSettings) GetPromptGuard() *AIPromptGuard { if x != nil { return x.PromptGuard } @@ -840,6 +909,7 @@ func (*Embedding_Openai) isEmbedding_Embedding() {} func (*Embedding_AzureOpenai) isEmbedding_Embedding() {} +// Settings for the Semantic Caching feature type SemanticCache struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -915,6 +985,7 @@ func (x *SemanticCache) GetMode() SemanticCache_Mode { return SemanticCache_READ_WRITE } +// Settings for the Retrieval Augmented Generation feature type RAG struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -981,54 +1052,7 @@ func (x *RAG) GetPromptTemplate() string { return "" } -type RateLimiting struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // List of rate_limit configs to apply - RateLimitConfigs []string `protobuf:"bytes,1,rep,name=rate_limit_configs,json=rateLimitConfigs,proto3" json:"rate_limit_configs,omitempty"` -} - -func (x *RateLimiting) Reset() { - *x = RateLimiting{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RateLimiting) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RateLimiting) ProtoMessage() {} - -func (x *RateLimiting) ProtoReflect() protoreflect.Message { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RateLimiting.ProtoReflect.Descriptor instead. -func (*RateLimiting) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{8} -} - -func (x *RateLimiting) GetRateLimitConfigs() []string { - if x != nil { - return x.RateLimitConfigs - } - return nil -} - +// Settings for the Prompt Enrichment feature type AIPromptEnrichment struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1043,7 +1067,7 @@ type AIPromptEnrichment struct { func (x *AIPromptEnrichment) Reset() { *x = AIPromptEnrichment{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[9] + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1056,7 +1080,7 @@ func (x *AIPromptEnrichment) String() string { func (*AIPromptEnrichment) ProtoMessage() {} func (x *AIPromptEnrichment) ProtoReflect() protoreflect.Message { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[9] + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1069,7 +1093,7 @@ func (x *AIPromptEnrichment) ProtoReflect() protoreflect.Message { // Deprecated: Use AIPromptEnrichment.ProtoReflect.Descriptor instead. func (*AIPromptEnrichment) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{9} + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{8} } func (x *AIPromptEnrichment) GetPrepend() []*AIPromptEnrichment_Message { @@ -1086,34 +1110,35 @@ func (x *AIPromptEnrichment) GetAppend() []*AIPromptEnrichment_Message { return nil } -type AIPromptGaurd struct { +// Settings for the Prompt Guard feature +type AIPromptGuard struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Guards for the prompt request - Request *AIPromptGaurd_Request `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"` + Request *AIPromptGuard_Request `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // Guards for the LLM response - Response *AIPromptGaurd_Response `protobuf:"bytes,3,opt,name=response,proto3" json:"response,omitempty"` + Response *AIPromptGuard_Response `protobuf:"bytes,2,opt,name=response,proto3" json:"response,omitempty"` } -func (x *AIPromptGaurd) Reset() { - *x = AIPromptGaurd{} +func (x *AIPromptGuard) Reset() { + *x = AIPromptGuard{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[10] + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AIPromptGaurd) String() string { +func (x *AIPromptGuard) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AIPromptGaurd) ProtoMessage() {} +func (*AIPromptGuard) ProtoMessage() {} -func (x *AIPromptGaurd) ProtoReflect() protoreflect.Message { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[10] +func (x *AIPromptGuard) ProtoReflect() protoreflect.Message { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1124,25 +1149,26 @@ func (x *AIPromptGaurd) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AIPromptGaurd.ProtoReflect.Descriptor instead. -func (*AIPromptGaurd) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{10} +// Deprecated: Use AIPromptGuard.ProtoReflect.Descriptor instead. +func (*AIPromptGuard) Descriptor() ([]byte, []int) { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{9} } -func (x *AIPromptGaurd) GetRequest() *AIPromptGaurd_Request { +func (x *AIPromptGuard) GetRequest() *AIPromptGuard_Request { if x != nil { return x.Request } return nil } -func (x *AIPromptGaurd) GetResponse() *AIPromptGaurd_Response { +func (x *AIPromptGuard) GetResponse() *AIPromptGuard_Response { if x != nil { return x.Response } return nil } +// Settings to configure a custom host to send the traffic to type UpstreamSpec_CustomHost struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1157,7 +1183,7 @@ type UpstreamSpec_CustomHost struct { func (x *UpstreamSpec_CustomHost) Reset() { *x = UpstreamSpec_CustomHost{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[11] + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1170,7 +1196,7 @@ func (x *UpstreamSpec_CustomHost) String() string { func (*UpstreamSpec_CustomHost) ProtoMessage() {} func (x *UpstreamSpec_CustomHost) ProtoReflect() protoreflect.Message { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[11] + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1222,7 +1248,7 @@ type UpstreamSpec_OpenAI struct { func (x *UpstreamSpec_OpenAI) Reset() { *x = UpstreamSpec_OpenAI{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[12] + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1235,7 +1261,7 @@ func (x *UpstreamSpec_OpenAI) String() string { func (*UpstreamSpec_OpenAI) ProtoMessage() {} func (x *UpstreamSpec_OpenAI) ProtoReflect() protoreflect.Message { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[12] + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1301,7 +1327,7 @@ type UpstreamSpec_AzureOpenAI struct { func (x *UpstreamSpec_AzureOpenAI) Reset() { *x = UpstreamSpec_AzureOpenAI{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[13] + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1314,7 +1340,7 @@ func (x *UpstreamSpec_AzureOpenAI) String() string { func (*UpstreamSpec_AzureOpenAI) ProtoMessage() {} func (x *UpstreamSpec_AzureOpenAI) ProtoReflect() protoreflect.Message { - mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[13] + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1377,6 +1403,99 @@ type UpstreamSpec_AzureOpenAI_AuthToken struct { func (*UpstreamSpec_AzureOpenAI_AuthToken) isUpstreamSpec_AzureOpenAI_AuthTokenSource() {} +// Settings for the Gemini API +type UpstreamSpec_Gemini struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Auth Token to use for the Gemini API + // This token will be placed into the `key` header + // + // Types that are assignable to AuthTokenSource: + // + // *UpstreamSpec_Gemini_AuthToken + AuthTokenSource isUpstreamSpec_Gemini_AuthTokenSource `protobuf_oneof:"auth_token_source"` + // The model name to use + // This value can be found https://generativelanguage.googleapis.com/{version}/models/{model}:generateContent?key={api_key} + Model string `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"` + // The version of the API to use + // This value can be found https://generativelanguage.googleapis.com/{api_version}/models/{model}:generateContent?key={api_key} + ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` +} + +func (x *UpstreamSpec_Gemini) Reset() { + *x = UpstreamSpec_Gemini{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpstreamSpec_Gemini) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpstreamSpec_Gemini) ProtoMessage() {} + +func (x *UpstreamSpec_Gemini) ProtoReflect() protoreflect.Message { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpstreamSpec_Gemini.ProtoReflect.Descriptor instead. +func (*UpstreamSpec_Gemini) Descriptor() ([]byte, []int) { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{1, 3} +} + +func (m *UpstreamSpec_Gemini) GetAuthTokenSource() isUpstreamSpec_Gemini_AuthTokenSource { + if m != nil { + return m.AuthTokenSource + } + return nil +} + +func (x *UpstreamSpec_Gemini) GetAuthToken() *SingleAuthToken { + if x, ok := x.GetAuthTokenSource().(*UpstreamSpec_Gemini_AuthToken); ok { + return x.AuthToken + } + return nil +} + +func (x *UpstreamSpec_Gemini) GetModel() string { + if x != nil { + return x.Model + } + return "" +} + +func (x *UpstreamSpec_Gemini) GetApiVersion() string { + if x != nil { + return x.ApiVersion + } + return "" +} + +type isUpstreamSpec_Gemini_AuthTokenSource interface { + isUpstreamSpec_Gemini_AuthTokenSource() +} + +type UpstreamSpec_Gemini_AuthToken struct { + // Auth Token to use for the Gemini API + // This token will be placed into the `key` header + AuthToken *SingleAuthToken `protobuf:"bytes,1,opt,name=auth_token,json=authToken,proto3,oneof"` // TODO: use oauth +} + +func (*UpstreamSpec_Gemini_AuthToken) isUpstreamSpec_Gemini_AuthTokenSource() {} + // Settings for the Mistral API type UpstreamSpec_Mistral struct { state protoimpl.MessageState @@ -1424,7 +1543,7 @@ func (x *UpstreamSpec_Mistral) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamSpec_Mistral.ProtoReflect.Descriptor instead. func (*UpstreamSpec_Mistral) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{1, 3} + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{1, 4} } func (x *UpstreamSpec_Mistral) GetAuthToken() *SingleAuthToken { @@ -1448,6 +1567,7 @@ func (x *UpstreamSpec_Mistral) GetModel() string { return "" } +// Settings for the Anthropic API type UpstreamSpec_Anthropic struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1495,7 +1615,7 @@ func (x *UpstreamSpec_Anthropic) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamSpec_Anthropic.ProtoReflect.Descriptor instead. func (*UpstreamSpec_Anthropic) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{1, 4} + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{1, 5} } func (x *UpstreamSpec_Anthropic) GetAuthToken() *SingleAuthToken { @@ -1591,7 +1711,7 @@ func (x *UpstreamSpec_MultiPool) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamSpec_MultiPool.ProtoReflect.Descriptor instead. func (*UpstreamSpec_MultiPool) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{1, 5} + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{1, 6} } func (x *UpstreamSpec_MultiPool) GetPriorities() []*UpstreamSpec_MultiPool_Priority { @@ -1612,6 +1732,7 @@ type UpstreamSpec_MultiPool_Backend struct { // *UpstreamSpec_MultiPool_Backend_Mistral // *UpstreamSpec_MultiPool_Backend_Anthropic // *UpstreamSpec_MultiPool_Backend_AzureOpenai + // *UpstreamSpec_MultiPool_Backend_Gemini Llm isUpstreamSpec_MultiPool_Backend_Llm `protobuf_oneof:"llm"` } @@ -1644,7 +1765,7 @@ func (x *UpstreamSpec_MultiPool_Backend) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamSpec_MultiPool_Backend.ProtoReflect.Descriptor instead. func (*UpstreamSpec_MultiPool_Backend) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{1, 5, 0} + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{1, 6, 0} } func (m *UpstreamSpec_MultiPool_Backend) GetLlm() isUpstreamSpec_MultiPool_Backend_Llm { @@ -1682,6 +1803,13 @@ func (x *UpstreamSpec_MultiPool_Backend) GetAzureOpenai() *UpstreamSpec_AzureOpe return nil } +func (x *UpstreamSpec_MultiPool_Backend) GetGemini() *UpstreamSpec_Gemini { + if x, ok := x.GetLlm().(*UpstreamSpec_MultiPool_Backend_Gemini); ok { + return x.Gemini + } + return nil +} + type isUpstreamSpec_MultiPool_Backend_Llm interface { isUpstreamSpec_MultiPool_Backend_Llm() } @@ -1706,6 +1834,11 @@ type UpstreamSpec_MultiPool_Backend_AzureOpenai struct { AzureOpenai *UpstreamSpec_AzureOpenAI `protobuf:"bytes,4,opt,name=azure_openai,json=azureOpenai,proto3,oneof"` } +type UpstreamSpec_MultiPool_Backend_Gemini struct { + // Gemini upstream + Gemini *UpstreamSpec_Gemini `protobuf:"bytes,5,opt,name=gemini,proto3,oneof"` +} + func (*UpstreamSpec_MultiPool_Backend_Openai) isUpstreamSpec_MultiPool_Backend_Llm() {} func (*UpstreamSpec_MultiPool_Backend_Mistral) isUpstreamSpec_MultiPool_Backend_Llm() {} @@ -1714,11 +1847,15 @@ func (*UpstreamSpec_MultiPool_Backend_Anthropic) isUpstreamSpec_MultiPool_Backen func (*UpstreamSpec_MultiPool_Backend_AzureOpenai) isUpstreamSpec_MultiPool_Backend_Llm() {} +func (*UpstreamSpec_MultiPool_Backend_Gemini) isUpstreamSpec_MultiPool_Backend_Llm() {} + +// Priority represents a single endpoint pool with a given priority type UpstreamSpec_MultiPool_Priority struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // list of backends representing a single endpoint pool Pool []*UpstreamSpec_MultiPool_Backend `protobuf:"bytes,1,rep,name=pool,proto3" json:"pool,omitempty"` } @@ -1751,7 +1888,7 @@ func (x *UpstreamSpec_MultiPool_Priority) ProtoReflect() protoreflect.Message { // Deprecated: Use UpstreamSpec_MultiPool_Priority.ProtoReflect.Descriptor instead. func (*UpstreamSpec_MultiPool_Priority) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{1, 5, 1} + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{1, 6, 1} } func (x *UpstreamSpec_MultiPool_Priority) GetPool() []*UpstreamSpec_MultiPool_Backend { @@ -1761,6 +1898,7 @@ func (x *UpstreamSpec_MultiPool_Priority) GetPool() []*UpstreamSpec_MultiPool_Ba return nil } +// OpenAI embedding type Embedding_OpenAI struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1828,6 +1966,7 @@ type Embedding_OpenAI_AuthToken struct { func (*Embedding_OpenAI_AuthToken) isEmbedding_OpenAI_AuthTokenSource() {} +// Azure OpenAI embedding type Embedding_AzureOpenAI struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1929,6 +2068,7 @@ type Embedding_AzureOpenAI_AuthToken struct { func (*Embedding_AzureOpenAI_AuthToken) isEmbedding_AzureOpenAI_AuthTokenSource() {} +// Settings for the Redis database type SemanticCache_Redis struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1991,6 +2131,7 @@ func (x *SemanticCache_Redis) GetScoreThreshold() float32 { return 0 } +// Settings for the Weaviate database type SemanticCache_Weaviate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2259,7 +2400,7 @@ func (x *AIPromptEnrichment_Message) ProtoReflect() protoreflect.Message { // Deprecated: Use AIPromptEnrichment_Message.ProtoReflect.Descriptor instead. func (*AIPromptEnrichment_Message) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{9, 0} + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{8, 0} } func (x *AIPromptEnrichment_Message) GetRole() string { @@ -2276,23 +2417,23 @@ func (x *AIPromptEnrichment_Message) GetContent() string { return "" } -type AIPromptGaurd_Request struct { +// Regex settings for prompt guard +type AIPromptGuard_Regex struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // A list of Regex patterns to match against the prompt. - // Each one will be checked against the prompt and if any match - // the request will be rejected. + // A list of Regex patterns to match against the response. + // All matches will be masked before being sent back to the client. + // matches and builtins are additive. Matches []string `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` - // Custom response message to send back to the client. - // If not specified, the following default message will be used: - // "The request was rejected due to inappropriate content" - CustomResponseMessage string `protobuf:"bytes,2,opt,name=custom_response_message,json=customResponseMessage,proto3" json:"custom_response_message,omitempty"` + // A list of built-in regexes to mask in the response. + // matches and builtins are additive. + Builtins []AIPromptGuard_Regex_BuiltIn `protobuf:"varint,2,rep,packed,name=builtins,proto3,enum=ai.options.gloo.solo.io.AIPromptGuard_Regex_BuiltIn" json:"builtins,omitempty"` } -func (x *AIPromptGaurd_Request) Reset() { - *x = AIPromptGaurd_Request{} +func (x *AIPromptGuard_Regex) Reset() { + *x = AIPromptGuard_Regex{} if protoimpl.UnsafeEnabled { mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2300,13 +2441,13 @@ func (x *AIPromptGaurd_Request) Reset() { } } -func (x *AIPromptGaurd_Request) String() string { +func (x *AIPromptGuard_Regex) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AIPromptGaurd_Request) ProtoMessage() {} +func (*AIPromptGuard_Regex) ProtoMessage() {} -func (x *AIPromptGaurd_Request) ProtoReflect() protoreflect.Message { +func (x *AIPromptGuard_Regex) ProtoReflect() protoreflect.Message { mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2318,41 +2459,41 @@ func (x *AIPromptGaurd_Request) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AIPromptGaurd_Request.ProtoReflect.Descriptor instead. -func (*AIPromptGaurd_Request) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{10, 0} +// Deprecated: Use AIPromptGuard_Regex.ProtoReflect.Descriptor instead. +func (*AIPromptGuard_Regex) Descriptor() ([]byte, []int) { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{9, 0} } -func (x *AIPromptGaurd_Request) GetMatches() []string { +func (x *AIPromptGuard_Regex) GetMatches() []string { if x != nil { return x.Matches } return nil } -func (x *AIPromptGaurd_Request) GetCustomResponseMessage() string { +func (x *AIPromptGuard_Regex) GetBuiltins() []AIPromptGuard_Regex_BuiltIn { if x != nil { - return x.CustomResponseMessage + return x.Builtins } - return "" + return nil } -type AIPromptGaurd_Response struct { +// Webhook settings for prompt guard +type AIPromptGuard_Webhook struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // A list of Regex patterns to match against the response. - // All matches will be masked before being sent back to the client. - // matches and builtins are additive. - Matches []string `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` - // A list of built-in regexes to mask in the response. - // matches and builtins are additive. - Builtins []AIPromptGaurd_Response_BuiltIn `protobuf:"varint,2,rep,packed,name=builtins,proto3,enum=ai.options.gloo.solo.io.AIPromptGaurd_Response_BuiltIn" json:"builtins,omitempty"` + // Host to send the traffic to. + Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` + // Port to send the traffic to + Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` + // Headers to forward with the request + Headers []*AIPromptGuard_Webhook_HeaderMatch `protobuf:"bytes,3,rep,name=headers,proto3" json:"headers,omitempty"` } -func (x *AIPromptGaurd_Response) Reset() { - *x = AIPromptGaurd_Response{} +func (x *AIPromptGuard_Webhook) Reset() { + *x = AIPromptGuard_Webhook{} if protoimpl.UnsafeEnabled { mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2360,13 +2501,13 @@ func (x *AIPromptGaurd_Response) Reset() { } } -func (x *AIPromptGaurd_Response) String() string { +func (x *AIPromptGuard_Webhook) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AIPromptGaurd_Response) ProtoMessage() {} +func (*AIPromptGuard_Webhook) ProtoMessage() {} -func (x *AIPromptGaurd_Response) ProtoReflect() protoreflect.Message { +func (x *AIPromptGuard_Webhook) ProtoReflect() protoreflect.Message { mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2378,25 +2519,275 @@ func (x *AIPromptGaurd_Response) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AIPromptGaurd_Response.ProtoReflect.Descriptor instead. -func (*AIPromptGaurd_Response) Descriptor() ([]byte, []int) { - return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{10, 1} +// Deprecated: Use AIPromptGuard_Webhook.ProtoReflect.Descriptor instead. +func (*AIPromptGuard_Webhook) Descriptor() ([]byte, []int) { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{9, 1} } -func (x *AIPromptGaurd_Response) GetMatches() []string { +func (x *AIPromptGuard_Webhook) GetHost() string { if x != nil { - return x.Matches + return x.Host + } + return "" +} + +func (x *AIPromptGuard_Webhook) GetPort() uint32 { + if x != nil { + return x.Port + } + return 0 +} + +func (x *AIPromptGuard_Webhook) GetHeaders() []*AIPromptGuard_Webhook_HeaderMatch { + if x != nil { + return x.Headers } return nil } -func (x *AIPromptGaurd_Response) GetBuiltins() []AIPromptGaurd_Response_BuiltIn { +// Request settings for Prompt Guard +type AIPromptGuard_Request struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Custom response message to send back to the client. + // If not specified, the following default message will be used: + // "The request was rejected due to inappropriate content" + CustomResponse *AIPromptGuard_Request_CustomResponse `protobuf:"bytes,1,opt,name=custom_response,json=customResponse,proto3" json:"custom_response,omitempty"` + // Regex request guard + Regex *AIPromptGuard_Regex `protobuf:"bytes,2,opt,name=regex,proto3" json:"regex,omitempty"` + // Webhook request guard + Webhook *AIPromptGuard_Webhook `protobuf:"bytes,3,opt,name=webhook,proto3" json:"webhook,omitempty"` +} + +func (x *AIPromptGuard_Request) Reset() { + *x = AIPromptGuard_Request{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AIPromptGuard_Request) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AIPromptGuard_Request) ProtoMessage() {} + +func (x *AIPromptGuard_Request) ProtoReflect() protoreflect.Message { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AIPromptGuard_Request.ProtoReflect.Descriptor instead. +func (*AIPromptGuard_Request) Descriptor() ([]byte, []int) { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{9, 2} +} + +func (x *AIPromptGuard_Request) GetCustomResponse() *AIPromptGuard_Request_CustomResponse { if x != nil { - return x.Builtins + return x.CustomResponse + } + return nil +} + +func (x *AIPromptGuard_Request) GetRegex() *AIPromptGuard_Regex { + if x != nil { + return x.Regex + } + return nil +} + +func (x *AIPromptGuard_Request) GetWebhook() *AIPromptGuard_Webhook { + if x != nil { + return x.Webhook } return nil } +// Request settings for Prompt Guard +type AIPromptGuard_Response struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Regex response guard + Regex *AIPromptGuard_Regex `protobuf:"bytes,1,opt,name=regex,proto3" json:"regex,omitempty"` + // Webhook response guard + Webhook *AIPromptGuard_Webhook `protobuf:"bytes,2,opt,name=webhook,proto3" json:"webhook,omitempty"` +} + +func (x *AIPromptGuard_Response) Reset() { + *x = AIPromptGuard_Response{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AIPromptGuard_Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AIPromptGuard_Response) ProtoMessage() {} + +func (x *AIPromptGuard_Response) ProtoReflect() protoreflect.Message { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AIPromptGuard_Response.ProtoReflect.Descriptor instead. +func (*AIPromptGuard_Response) Descriptor() ([]byte, []int) { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{9, 3} +} + +func (x *AIPromptGuard_Response) GetRegex() *AIPromptGuard_Regex { + if x != nil { + return x.Regex + } + return nil +} + +func (x *AIPromptGuard_Response) GetWebhook() *AIPromptGuard_Webhook { + if x != nil { + return x.Webhook + } + return nil +} + +type AIPromptGuard_Webhook_HeaderMatch struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Header key to match + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // Type of match to use + MatchType AIPromptGuard_Webhook_HeaderMatch_MatchType `protobuf:"varint,2,opt,name=match_type,json=matchType,proto3,enum=ai.options.gloo.solo.io.AIPromptGuard_Webhook_HeaderMatch_MatchType" json:"match_type,omitempty"` +} + +func (x *AIPromptGuard_Webhook_HeaderMatch) Reset() { + *x = AIPromptGuard_Webhook_HeaderMatch{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AIPromptGuard_Webhook_HeaderMatch) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AIPromptGuard_Webhook_HeaderMatch) ProtoMessage() {} + +func (x *AIPromptGuard_Webhook_HeaderMatch) ProtoReflect() protoreflect.Message { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AIPromptGuard_Webhook_HeaderMatch.ProtoReflect.Descriptor instead. +func (*AIPromptGuard_Webhook_HeaderMatch) Descriptor() ([]byte, []int) { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{9, 1, 0} +} + +func (x *AIPromptGuard_Webhook_HeaderMatch) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *AIPromptGuard_Webhook_HeaderMatch) GetMatchType() AIPromptGuard_Webhook_HeaderMatch_MatchType { + if x != nil { + return x.MatchType + } + return AIPromptGuard_Webhook_HeaderMatch_EXACT +} + +type AIPromptGuard_Request_CustomResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Custom response message to send back to the client. + // If not specified, the following default message will be used: + // "The request was rejected due to inappropriate content" + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + // Status code to send back to the client. + StatusCode uint32 `protobuf:"varint,2,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"` +} + +func (x *AIPromptGuard_Request_CustomResponse) Reset() { + *x = AIPromptGuard_Request_CustomResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AIPromptGuard_Request_CustomResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AIPromptGuard_Request_CustomResponse) ProtoMessage() {} + +func (x *AIPromptGuard_Request_CustomResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AIPromptGuard_Request_CustomResponse.ProtoReflect.Descriptor instead. +func (*AIPromptGuard_Request_CustomResponse) Descriptor() ([]byte, []int) { + return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescGZIP(), []int{9, 2, 0} +} + +func (x *AIPromptGuard_Request_CustomResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *AIPromptGuard_Request_CustomResponse) GetStatusCode() uint32 { + if x != nil { + return x.StatusCode + } + return 0 +} + var File_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto protoreflect.FileDescriptor var file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDesc = []byte{ @@ -2426,7 +2817,7 @@ var file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_ 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x48, 0x00, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x66, 0x42, 0x13, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x22, 0x8b, 0x0e, 0x0a, 0x0c, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, + 0x63, 0x65, 0x22, 0xbd, 0x10, 0x0a, 0x0c, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, 0x46, 0x0a, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, @@ -2451,281 +2842,341 @@ var file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_ 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x50, 0x6f, 0x6f, 0x6c, 0x48, - 0x00, 0x52, 0x05, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x1a, 0x34, 0x0a, 0x0a, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0xba, - 0x01, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x75, 0x74, - 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, - 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, - 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x41, 0x75, - 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x51, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x68, 0x6f, 0x73, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, + 0x00, 0x52, 0x05, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x46, 0x0a, 0x06, 0x67, 0x65, 0x6d, 0x69, + 0x6e, 0x69, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, + 0x69, 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, + 0x47, 0x65, 0x6d, 0x69, 0x6e, 0x69, 0x48, 0x00, 0x52, 0x06, 0x67, 0x65, 0x6d, 0x69, 0x6e, 0x69, + 0x1a, 0x34, 0x0a, 0x0a, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0xba, 0x01, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x41, + 0x49, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, + 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x51, 0x0a, 0x0b, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x73, + 0x74, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x1a, 0xd3, 0x01, 0x0a, 0x0b, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4f, 0x70, 0x65, + 0x6e, 0x41, 0x49, 0x12, 0x49, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, - 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, 0xd3, 0x01, 0x0a, 0x0b, - 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x12, 0x49, 0x0a, 0x0a, 0x61, - 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, - 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, - 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, - 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x13, 0x0a, 0x11, - 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x1a, 0xbb, 0x01, 0x0a, 0x07, 0x4d, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x12, 0x47, 0x0a, - 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, - 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, - 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x51, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x69, - 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, - 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, - 0x65, 0x63, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x0a, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, - 0xd7, 0x01, 0x0a, 0x09, 0x41, 0x6e, 0x74, 0x68, 0x72, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x47, 0x0a, - 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, - 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, - 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x51, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x69, + 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x9f, 0x01, 0x0a, 0x06, 0x47, 0x65, + 0x6d, 0x69, 0x6e, 0x69, 0x12, 0x49, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, + 0x69, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xbb, 0x01, 0x0a, 0x07, + 0x4d, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, - 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, - 0x65, 0x63, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x0a, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, 0x8d, 0x04, 0x0a, 0x09, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x61, 0x69, + 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x51, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, + 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, + 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, 0xd7, 0x01, 0x0a, 0x09, 0x41, 0x6e, + 0x74, 0x68, 0x72, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, - 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, - 0x65, 0x63, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x1a, 0xcc, 0x02, 0x0a, 0x07, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x46, 0x0a, - 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, + 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x51, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, + 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, + 0x6f, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x1a, 0xd5, 0x04, 0x0a, 0x09, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x50, 0x6f, 0x6f, + 0x6c, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, + 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, + 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x94, 0x03, 0x0a, 0x07, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x46, 0x0a, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, + 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x41, 0x49, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x12, + 0x49, 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, + 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x48, + 0x00, 0x52, 0x07, 0x6d, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x12, 0x4f, 0x0a, 0x09, 0x61, 0x6e, + 0x74, 0x68, 0x72, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x48, 0x00, 0x52, 0x06, 0x6f, - 0x70, 0x65, 0x6e, 0x61, 0x69, 0x12, 0x49, 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, - 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x69, - 0x73, 0x74, 0x72, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x69, 0x73, 0x74, 0x72, 0x61, 0x6c, - 0x12, 0x4f, 0x0a, 0x09, 0x61, 0x6e, 0x74, 0x68, 0x72, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x53, 0x70, 0x65, 0x63, 0x2e, 0x41, 0x6e, 0x74, 0x68, 0x72, 0x6f, 0x70, 0x69, 0x63, 0x48, 0x00, + 0x52, 0x09, 0x61, 0x6e, 0x74, 0x68, 0x72, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x56, 0x0a, 0x0c, 0x61, + 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, + 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4f, 0x70, + 0x65, 0x6e, 0x41, 0x49, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x4f, 0x70, 0x65, + 0x6e, 0x61, 0x69, 0x12, 0x46, 0x0a, 0x06, 0x67, 0x65, 0x6d, 0x69, 0x6e, 0x69, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x41, 0x6e, 0x74, 0x68, 0x72, - 0x6f, 0x70, 0x69, 0x63, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6e, 0x74, 0x68, 0x72, 0x6f, 0x70, 0x69, - 0x63, 0x12, 0x56, 0x0a, 0x0c, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, - 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, - 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x41, - 0x7a, 0x75, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x7a, - 0x75, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x42, 0x05, 0x0a, 0x03, 0x6c, 0x6c, 0x6d, - 0x1a, 0x57, 0x0a, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x4b, 0x0a, 0x04, - 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x69, 0x2e, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x47, 0x65, 0x6d, 0x69, 0x6e, + 0x69, 0x48, 0x00, 0x52, 0x06, 0x67, 0x65, 0x6d, 0x69, 0x6e, 0x69, 0x42, 0x05, 0x0a, 0x03, 0x6c, + 0x6c, 0x6d, 0x1a, 0x57, 0x0a, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x4b, + 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, + 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, + 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, + 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x42, 0x05, 0x0a, 0x03, 0x6c, + 0x6c, 0x6d, 0x22, 0xde, 0x03, 0x0a, 0x0d, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x65, + 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, + 0x70, 0x74, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x10, 0x70, 0x72, + 0x6f, 0x6d, 0x70, 0x74, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x49, + 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, + 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x52, 0x0b, 0x70, 0x72, + 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x12, 0x2e, 0x0a, 0x03, 0x72, 0x61, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, + 0x2e, 0x52, 0x41, 0x47, 0x52, 0x03, 0x72, 0x61, 0x67, 0x12, 0x4d, 0x0a, 0x0e, 0x73, 0x65, 0x6d, + 0x61, 0x6e, 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, + 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x65, 0x6d, 0x61, + 0x6e, 0x74, 0x69, 0x63, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x0d, 0x73, 0x65, 0x6d, 0x61, 0x6e, + 0x74, 0x69, 0x63, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, - 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, - 0x63, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x42, 0x05, 0x0a, 0x03, 0x6c, 0x6c, 0x6d, - 0x22, 0xde, 0x03, 0x0a, 0x0d, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x65, 0x6e, 0x72, - 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, - 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, - 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, - 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6d, - 0x70, 0x74, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x49, 0x0a, 0x0c, - 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, - 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x61, 0x75, 0x72, 0x64, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6d, - 0x70, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x12, 0x2e, 0x0a, 0x03, 0x72, 0x61, 0x67, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, - 0x41, 0x47, 0x52, 0x03, 0x72, 0x61, 0x67, 0x12, 0x4d, 0x0a, 0x0e, 0x73, 0x65, 0x6d, 0x61, 0x6e, - 0x74, 0x69, 0x63, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x4f, 0x0a, 0x0a, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x30, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x09, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x15, 0x0a, 0x09, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x48, 0x41, + 0x54, 0x10, 0x00, 0x22, 0x6e, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x22, 0x60, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x12, + 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xf2, 0x03, 0x0a, 0x09, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x12, 0x43, 0x0a, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x6d, + 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x48, 0x00, + 0x52, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x12, 0x53, 0x0a, 0x0c, 0x61, 0x7a, 0x75, 0x72, + 0x65, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, + 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x48, 0x00, + 0x52, 0x0b, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x1a, 0x68, 0x0a, + 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x12, 0x49, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x69, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, + 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xd3, 0x01, 0x0a, 0x0b, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x12, 0x49, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x69, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, + 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x0b, 0x0a, + 0x09, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xa0, 0x05, 0x0a, 0x0d, 0x53, + 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x4e, 0x0a, 0x09, + 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, - 0x69, 0x63, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x0d, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, - 0x63, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, - 0x69, 0x6f, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x4f, 0x0a, 0x0a, 0x72, 0x6f, 0x75, - 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, - 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, - 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x09, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x15, 0x0a, 0x09, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x48, 0x41, 0x54, 0x10, - 0x00, 0x22, 0x6e, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, - 0x65, 0x22, 0x60, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x12, 0x2b, 0x0a, - 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0xf2, 0x03, 0x0a, 0x09, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, - 0x67, 0x12, 0x43, 0x0a, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, - 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x6d, 0x62, 0x65, - 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x48, 0x00, 0x52, 0x06, - 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x12, 0x53, 0x0a, 0x0c, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, - 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, + 0x69, 0x63, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x09, + 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x52, 0x09, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x10, + 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x74, 0x74, 0x6c, + 0x12, 0x3f, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, + 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, + 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, + 0x63, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, + 0x65, 0x1a, 0x5d, 0x0a, 0x05, 0x52, 0x65, 0x64, 0x69, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x63, 0x6f, 0x72, 0x65, + 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x0e, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x1a, 0x74, 0x0a, 0x08, 0x57, 0x65, 0x61, 0x76, 0x69, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x6e, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x1a, 0xad, 0x01, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x12, 0x44, 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x65, + 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x64, 0x69, + 0x73, 0x48, 0x00, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x12, 0x4d, 0x0a, 0x08, 0x77, 0x65, + 0x61, 0x76, 0x69, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, - 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x49, 0x48, 0x00, 0x52, 0x0b, - 0x61, 0x7a, 0x75, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x61, 0x69, 0x1a, 0x68, 0x0a, 0x06, 0x4f, - 0x70, 0x65, 0x6e, 0x41, 0x49, 0x12, 0x49, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x69, 0x2e, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, - 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x42, 0x13, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xd3, 0x01, 0x0a, 0x0b, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4f, - 0x70, 0x65, 0x6e, 0x41, 0x49, 0x12, 0x49, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x69, 0x2e, 0x6f, + 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x2e, 0x57, 0x65, 0x61, 0x76, 0x69, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, + 0x08, 0x77, 0x65, 0x61, 0x76, 0x69, 0x61, 0x74, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x64, 0x61, 0x74, + 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x25, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, + 0x0a, 0x0a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x22, 0x91, 0x02, + 0x0a, 0x03, 0x52, 0x41, 0x47, 0x12, 0x44, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, + 0x69, 0x6f, 0x2e, 0x52, 0x41, 0x47, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x65, + 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, + 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x52, 0x09, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, + 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x1a, 0x59, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x22, 0xe9, 0x01, 0x0a, 0x12, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x45, 0x6e, + 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, - 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x27, 0x0a, - 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x65, - 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xa0, 0x05, 0x0a, 0x0d, 0x53, 0x65, 0x6d, - 0x61, 0x6e, 0x74, 0x69, 0x63, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x4e, 0x0a, 0x09, 0x64, 0x61, - 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, - 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, - 0x09, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x65, 0x6d, - 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, - 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, - 0x67, 0x52, 0x09, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, - 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x3f, - 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, + 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x45, 0x6e, 0x72, 0x69, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, + 0x70, 0x72, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x4b, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, + 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x1a, 0x37, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x85, 0x09, + 0x0a, 0x0d, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x12, + 0x48, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, + 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, + 0x6d, 0x70, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x08, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x61, 0x69, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, + 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x75, + 0x61, 0x72, 0x64, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x98, 0x01, 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x08, 0x62, 0x75, + 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, - 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x1a, - 0x5d, 0x0a, 0x05, 0x52, 0x65, 0x64, 0x69, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x74, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x1a, 0x74, - 0x0a, 0x08, 0x57, 0x65, 0x61, 0x76, 0x69, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, - 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x73, 0x65, - 0x63, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x6e, 0x73, 0x65, - 0x63, 0x75, 0x72, 0x65, 0x1a, 0xad, 0x01, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x12, 0x44, 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, - 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x65, 0x6d, 0x61, - 0x6e, 0x74, 0x69, 0x63, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x48, - 0x00, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x12, 0x4d, 0x0a, 0x08, 0x77, 0x65, 0x61, 0x76, - 0x69, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x61, 0x69, 0x2e, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, - 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x2e, 0x57, 0x65, 0x61, 0x76, 0x69, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, 0x77, - 0x65, 0x61, 0x76, 0x69, 0x61, 0x74, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x22, 0x25, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, - 0x52, 0x45, 0x41, 0x44, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x22, 0x91, 0x02, 0x0a, 0x03, - 0x52, 0x41, 0x47, 0x12, 0x44, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, + 0x75, 0x61, 0x72, 0x64, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, + 0x49, 0x6e, 0x52, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x22, 0x23, 0x0a, 0x07, + 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x53, 0x4e, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x52, 0x45, 0x44, 0x49, 0x54, 0x5f, 0x43, 0x41, 0x52, 0x44, 0x10, + 0x01, 0x1a, 0xd7, 0x02, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x12, 0x0a, + 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x54, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, - 0x2e, 0x52, 0x41, 0x47, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x09, - 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x65, 0x6d, 0x62, - 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, - 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, - 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x52, 0x09, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x70, - 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x1a, 0x59, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, - 0x3c, 0x0a, 0x0c, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, - 0x2c, 0x0a, 0x12, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x72, 0x61, 0x74, - 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0xe9, 0x01, - 0x0a, 0x12, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, - 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x72, 0x65, 0x70, - 0x65, 0x6e, 0x64, 0x12, 0x4b, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, - 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, - 0x1a, 0x37, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x03, 0x0a, 0x0d, 0x41, 0x49, - 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x61, 0x75, 0x72, 0x64, 0x12, 0x48, 0x0a, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, + 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x57, + 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0xcd, 0x01, 0x0a, 0x0b, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x63, 0x0a, + 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x44, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, + 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, + 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, + 0x6b, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, + 0x70, 0x65, 0x22, 0x47, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x09, 0x0a, 0x05, 0x45, 0x58, 0x41, 0x43, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x52, + 0x45, 0x46, 0x49, 0x58, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x55, 0x46, 0x46, 0x49, 0x58, + 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x10, 0x03, + 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x47, 0x45, 0x58, 0x10, 0x04, 0x1a, 0xcc, 0x02, 0x0a, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3d, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, + 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, + 0x6d, 0x70, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x42, 0x0a, 0x05, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, + 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, + 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x52, 0x05, 0x72, 0x65, + 0x67, 0x65, 0x78, 0x12, 0x48, 0x0a, 0x07, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, + 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x57, 0x65, 0x62, + 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x07, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x1a, 0x4b, 0x0a, + 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x98, 0x01, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x05, 0x72, 0x65, 0x67, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, + 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x75, 0x61, 0x72, 0x64, 0x2e, 0x52, + 0x65, 0x67, 0x65, 0x78, 0x52, 0x05, 0x72, 0x65, 0x67, 0x65, 0x78, 0x12, 0x48, 0x0a, 0x07, 0x77, + 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, - 0x61, 0x75, 0x72, 0x64, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, - 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x61, 0x75, 0x72, 0x64, 0x2e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x1a, 0x5b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, - 0xbb, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x61, 0x69, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, - 0x69, 0x6f, 0x2e, 0x41, 0x49, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x47, 0x61, 0x75, 0x72, 0x64, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, - 0x6e, 0x52, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x22, 0x40, 0x0a, 0x07, 0x42, - 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x53, 0x4e, 0x10, 0x00, 0x12, - 0x0f, 0x0a, 0x0b, 0x43, 0x52, 0x45, 0x44, 0x49, 0x54, 0x5f, 0x43, 0x41, 0x52, 0x44, 0x10, 0x01, - 0x12, 0x09, 0x0a, 0x05, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x50, - 0x48, 0x4f, 0x4e, 0x45, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x03, 0x42, 0x58, 0xb8, - 0xf5, 0x04, 0x01, 0xc0, 0xf5, 0x04, 0x01, 0xd0, 0xf5, 0x04, 0x01, 0x5a, 0x4a, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x6f, 0x6c, 0x6f, 0x2d, 0x69, 0x6f, 0x2f, - 0x73, 0x6f, 0x6c, 0x6f, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2f, 0x76, - 0x31, 0x2f, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x2f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x61, 0x72, 0x64, 0x2e, 0x57, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x07, 0x77, 0x65, + 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x42, 0x58, 0xb8, 0xf5, 0x04, 0x01, 0xc0, 0xf5, 0x04, 0x01, 0xd0, + 0xf5, 0x04, 0x01, 0x5a, 0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x73, 0x6f, 0x6c, 0x6f, 0x2d, 0x69, 0x6f, 0x2f, 0x73, 0x6f, 0x6c, 0x6f, 0x2d, 0x61, 0x70, 0x69, + 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, + 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x73, 0x65, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x69, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2740,92 +3191,107 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai return file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDescData } -var file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes = make([]protoimpl.MessageInfo, 32) var file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_goTypes = []interface{}{ - (RouteSettings_RouteType)(0), // 0: ai.options.gloo.solo.io.RouteSettings.RouteType - (SemanticCache_Mode)(0), // 1: ai.options.gloo.solo.io.SemanticCache.Mode - (AIPromptGaurd_Response_BuiltIn)(0), // 2: ai.options.gloo.solo.io.AIPromptGaurd.Response.BuiltIn - (*SingleAuthToken)(nil), // 3: ai.options.gloo.solo.io.SingleAuthToken - (*UpstreamSpec)(nil), // 4: ai.options.gloo.solo.io.UpstreamSpec - (*RouteSettings)(nil), // 5: ai.options.gloo.solo.io.RouteSettings - (*FieldDefault)(nil), // 6: ai.options.gloo.solo.io.FieldDefault - (*Postgres)(nil), // 7: ai.options.gloo.solo.io.Postgres - (*Embedding)(nil), // 8: ai.options.gloo.solo.io.Embedding - (*SemanticCache)(nil), // 9: ai.options.gloo.solo.io.SemanticCache - (*RAG)(nil), // 10: ai.options.gloo.solo.io.RAG - (*RateLimiting)(nil), // 11: ai.options.gloo.solo.io.RateLimiting - (*AIPromptEnrichment)(nil), // 12: ai.options.gloo.solo.io.AIPromptEnrichment - (*AIPromptGaurd)(nil), // 13: ai.options.gloo.solo.io.AIPromptGaurd - (*UpstreamSpec_CustomHost)(nil), // 14: ai.options.gloo.solo.io.UpstreamSpec.CustomHost - (*UpstreamSpec_OpenAI)(nil), // 15: ai.options.gloo.solo.io.UpstreamSpec.OpenAI - (*UpstreamSpec_AzureOpenAI)(nil), // 16: ai.options.gloo.solo.io.UpstreamSpec.AzureOpenAI - (*UpstreamSpec_Mistral)(nil), // 17: ai.options.gloo.solo.io.UpstreamSpec.Mistral - (*UpstreamSpec_Anthropic)(nil), // 18: ai.options.gloo.solo.io.UpstreamSpec.Anthropic - (*UpstreamSpec_MultiPool)(nil), // 19: ai.options.gloo.solo.io.UpstreamSpec.MultiPool - (*UpstreamSpec_MultiPool_Backend)(nil), // 20: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend - (*UpstreamSpec_MultiPool_Priority)(nil), // 21: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Priority - (*Embedding_OpenAI)(nil), // 22: ai.options.gloo.solo.io.Embedding.OpenAI - (*Embedding_AzureOpenAI)(nil), // 23: ai.options.gloo.solo.io.Embedding.AzureOpenAI - (*SemanticCache_Redis)(nil), // 24: ai.options.gloo.solo.io.SemanticCache.Redis - (*SemanticCache_Weaviate)(nil), // 25: ai.options.gloo.solo.io.SemanticCache.Weaviate - (*SemanticCache_DataStore)(nil), // 26: ai.options.gloo.solo.io.SemanticCache.DataStore - (*RAG_DataStore)(nil), // 27: ai.options.gloo.solo.io.RAG.DataStore - (*AIPromptEnrichment_Message)(nil), // 28: ai.options.gloo.solo.io.AIPromptEnrichment.Message - (*AIPromptGaurd_Request)(nil), // 29: ai.options.gloo.solo.io.AIPromptGaurd.Request - (*AIPromptGaurd_Response)(nil), // 30: ai.options.gloo.solo.io.AIPromptGaurd.Response - (*core.ResourceRef)(nil), // 31: core.solo.io.ResourceRef - (*_struct.Value)(nil), // 32: google.protobuf.Value + (RouteSettings_RouteType)(0), // 0: ai.options.gloo.solo.io.RouteSettings.RouteType + (SemanticCache_Mode)(0), // 1: ai.options.gloo.solo.io.SemanticCache.Mode + (AIPromptGuard_Regex_BuiltIn)(0), // 2: ai.options.gloo.solo.io.AIPromptGuard.Regex.BuiltIn + (AIPromptGuard_Webhook_HeaderMatch_MatchType)(0), // 3: ai.options.gloo.solo.io.AIPromptGuard.Webhook.HeaderMatch.MatchType + (*SingleAuthToken)(nil), // 4: ai.options.gloo.solo.io.SingleAuthToken + (*UpstreamSpec)(nil), // 5: ai.options.gloo.solo.io.UpstreamSpec + (*RouteSettings)(nil), // 6: ai.options.gloo.solo.io.RouteSettings + (*FieldDefault)(nil), // 7: ai.options.gloo.solo.io.FieldDefault + (*Postgres)(nil), // 8: ai.options.gloo.solo.io.Postgres + (*Embedding)(nil), // 9: ai.options.gloo.solo.io.Embedding + (*SemanticCache)(nil), // 10: ai.options.gloo.solo.io.SemanticCache + (*RAG)(nil), // 11: ai.options.gloo.solo.io.RAG + (*AIPromptEnrichment)(nil), // 12: ai.options.gloo.solo.io.AIPromptEnrichment + (*AIPromptGuard)(nil), // 13: ai.options.gloo.solo.io.AIPromptGuard + (*UpstreamSpec_CustomHost)(nil), // 14: ai.options.gloo.solo.io.UpstreamSpec.CustomHost + (*UpstreamSpec_OpenAI)(nil), // 15: ai.options.gloo.solo.io.UpstreamSpec.OpenAI + (*UpstreamSpec_AzureOpenAI)(nil), // 16: ai.options.gloo.solo.io.UpstreamSpec.AzureOpenAI + (*UpstreamSpec_Gemini)(nil), // 17: ai.options.gloo.solo.io.UpstreamSpec.Gemini + (*UpstreamSpec_Mistral)(nil), // 18: ai.options.gloo.solo.io.UpstreamSpec.Mistral + (*UpstreamSpec_Anthropic)(nil), // 19: ai.options.gloo.solo.io.UpstreamSpec.Anthropic + (*UpstreamSpec_MultiPool)(nil), // 20: ai.options.gloo.solo.io.UpstreamSpec.MultiPool + (*UpstreamSpec_MultiPool_Backend)(nil), // 21: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend + (*UpstreamSpec_MultiPool_Priority)(nil), // 22: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Priority + (*Embedding_OpenAI)(nil), // 23: ai.options.gloo.solo.io.Embedding.OpenAI + (*Embedding_AzureOpenAI)(nil), // 24: ai.options.gloo.solo.io.Embedding.AzureOpenAI + (*SemanticCache_Redis)(nil), // 25: ai.options.gloo.solo.io.SemanticCache.Redis + (*SemanticCache_Weaviate)(nil), // 26: ai.options.gloo.solo.io.SemanticCache.Weaviate + (*SemanticCache_DataStore)(nil), // 27: ai.options.gloo.solo.io.SemanticCache.DataStore + (*RAG_DataStore)(nil), // 28: ai.options.gloo.solo.io.RAG.DataStore + (*AIPromptEnrichment_Message)(nil), // 29: ai.options.gloo.solo.io.AIPromptEnrichment.Message + (*AIPromptGuard_Regex)(nil), // 30: ai.options.gloo.solo.io.AIPromptGuard.Regex + (*AIPromptGuard_Webhook)(nil), // 31: ai.options.gloo.solo.io.AIPromptGuard.Webhook + (*AIPromptGuard_Request)(nil), // 32: ai.options.gloo.solo.io.AIPromptGuard.Request + (*AIPromptGuard_Response)(nil), // 33: ai.options.gloo.solo.io.AIPromptGuard.Response + (*AIPromptGuard_Webhook_HeaderMatch)(nil), // 34: ai.options.gloo.solo.io.AIPromptGuard.Webhook.HeaderMatch + (*AIPromptGuard_Request_CustomResponse)(nil), // 35: ai.options.gloo.solo.io.AIPromptGuard.Request.CustomResponse + (*core.ResourceRef)(nil), // 36: core.solo.io.ResourceRef + (*_struct.Value)(nil), // 37: google.protobuf.Value } var file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_depIdxs = []int32{ - 31, // 0: ai.options.gloo.solo.io.SingleAuthToken.secret_ref:type_name -> core.solo.io.ResourceRef + 36, // 0: ai.options.gloo.solo.io.SingleAuthToken.secret_ref:type_name -> core.solo.io.ResourceRef 15, // 1: ai.options.gloo.solo.io.UpstreamSpec.openai:type_name -> ai.options.gloo.solo.io.UpstreamSpec.OpenAI - 17, // 2: ai.options.gloo.solo.io.UpstreamSpec.mistral:type_name -> ai.options.gloo.solo.io.UpstreamSpec.Mistral - 18, // 3: ai.options.gloo.solo.io.UpstreamSpec.anthropic:type_name -> ai.options.gloo.solo.io.UpstreamSpec.Anthropic + 18, // 2: ai.options.gloo.solo.io.UpstreamSpec.mistral:type_name -> ai.options.gloo.solo.io.UpstreamSpec.Mistral + 19, // 3: ai.options.gloo.solo.io.UpstreamSpec.anthropic:type_name -> ai.options.gloo.solo.io.UpstreamSpec.Anthropic 16, // 4: ai.options.gloo.solo.io.UpstreamSpec.azure_openai:type_name -> ai.options.gloo.solo.io.UpstreamSpec.AzureOpenAI - 19, // 5: ai.options.gloo.solo.io.UpstreamSpec.multi:type_name -> ai.options.gloo.solo.io.UpstreamSpec.MultiPool - 12, // 6: ai.options.gloo.solo.io.RouteSettings.prompt_enrichment:type_name -> ai.options.gloo.solo.io.AIPromptEnrichment - 13, // 7: ai.options.gloo.solo.io.RouteSettings.prompt_guard:type_name -> ai.options.gloo.solo.io.AIPromptGaurd - 10, // 8: ai.options.gloo.solo.io.RouteSettings.rag:type_name -> ai.options.gloo.solo.io.RAG - 9, // 9: ai.options.gloo.solo.io.RouteSettings.semantic_cache:type_name -> ai.options.gloo.solo.io.SemanticCache - 6, // 10: ai.options.gloo.solo.io.RouteSettings.defaults:type_name -> ai.options.gloo.solo.io.FieldDefault - 0, // 11: ai.options.gloo.solo.io.RouteSettings.route_type:type_name -> ai.options.gloo.solo.io.RouteSettings.RouteType - 32, // 12: ai.options.gloo.solo.io.FieldDefault.value:type_name -> google.protobuf.Value - 22, // 13: ai.options.gloo.solo.io.Embedding.openai:type_name -> ai.options.gloo.solo.io.Embedding.OpenAI - 23, // 14: ai.options.gloo.solo.io.Embedding.azure_openai:type_name -> ai.options.gloo.solo.io.Embedding.AzureOpenAI - 26, // 15: ai.options.gloo.solo.io.SemanticCache.datastore:type_name -> ai.options.gloo.solo.io.SemanticCache.DataStore - 8, // 16: ai.options.gloo.solo.io.SemanticCache.embedding:type_name -> ai.options.gloo.solo.io.Embedding - 1, // 17: ai.options.gloo.solo.io.SemanticCache.mode:type_name -> ai.options.gloo.solo.io.SemanticCache.Mode - 27, // 18: ai.options.gloo.solo.io.RAG.datastore:type_name -> ai.options.gloo.solo.io.RAG.DataStore - 8, // 19: ai.options.gloo.solo.io.RAG.embedding:type_name -> ai.options.gloo.solo.io.Embedding - 28, // 20: ai.options.gloo.solo.io.AIPromptEnrichment.prepend:type_name -> ai.options.gloo.solo.io.AIPromptEnrichment.Message - 28, // 21: ai.options.gloo.solo.io.AIPromptEnrichment.append:type_name -> ai.options.gloo.solo.io.AIPromptEnrichment.Message - 29, // 22: ai.options.gloo.solo.io.AIPromptGaurd.request:type_name -> ai.options.gloo.solo.io.AIPromptGaurd.Request - 30, // 23: ai.options.gloo.solo.io.AIPromptGaurd.response:type_name -> ai.options.gloo.solo.io.AIPromptGaurd.Response - 3, // 24: ai.options.gloo.solo.io.UpstreamSpec.OpenAI.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken - 14, // 25: ai.options.gloo.solo.io.UpstreamSpec.OpenAI.custom_host:type_name -> ai.options.gloo.solo.io.UpstreamSpec.CustomHost - 3, // 26: ai.options.gloo.solo.io.UpstreamSpec.AzureOpenAI.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken - 3, // 27: ai.options.gloo.solo.io.UpstreamSpec.Mistral.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken - 14, // 28: ai.options.gloo.solo.io.UpstreamSpec.Mistral.custom_host:type_name -> ai.options.gloo.solo.io.UpstreamSpec.CustomHost - 3, // 29: ai.options.gloo.solo.io.UpstreamSpec.Anthropic.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken - 14, // 30: ai.options.gloo.solo.io.UpstreamSpec.Anthropic.custom_host:type_name -> ai.options.gloo.solo.io.UpstreamSpec.CustomHost - 21, // 31: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.priorities:type_name -> ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Priority - 15, // 32: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend.openai:type_name -> ai.options.gloo.solo.io.UpstreamSpec.OpenAI - 17, // 33: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend.mistral:type_name -> ai.options.gloo.solo.io.UpstreamSpec.Mistral - 18, // 34: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend.anthropic:type_name -> ai.options.gloo.solo.io.UpstreamSpec.Anthropic - 16, // 35: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend.azure_openai:type_name -> ai.options.gloo.solo.io.UpstreamSpec.AzureOpenAI - 20, // 36: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Priority.pool:type_name -> ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend - 3, // 37: ai.options.gloo.solo.io.Embedding.OpenAI.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken - 3, // 38: ai.options.gloo.solo.io.Embedding.AzureOpenAI.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken - 24, // 39: ai.options.gloo.solo.io.SemanticCache.DataStore.redis:type_name -> ai.options.gloo.solo.io.SemanticCache.Redis - 25, // 40: ai.options.gloo.solo.io.SemanticCache.DataStore.weaviate:type_name -> ai.options.gloo.solo.io.SemanticCache.Weaviate - 7, // 41: ai.options.gloo.solo.io.RAG.DataStore.postgres:type_name -> ai.options.gloo.solo.io.Postgres - 2, // 42: ai.options.gloo.solo.io.AIPromptGaurd.Response.builtins:type_name -> ai.options.gloo.solo.io.AIPromptGaurd.Response.BuiltIn - 43, // [43:43] is the sub-list for method output_type - 43, // [43:43] is the sub-list for method input_type - 43, // [43:43] is the sub-list for extension type_name - 43, // [43:43] is the sub-list for extension extendee - 0, // [0:43] is the sub-list for field type_name + 20, // 5: ai.options.gloo.solo.io.UpstreamSpec.multi:type_name -> ai.options.gloo.solo.io.UpstreamSpec.MultiPool + 17, // 6: ai.options.gloo.solo.io.UpstreamSpec.gemini:type_name -> ai.options.gloo.solo.io.UpstreamSpec.Gemini + 12, // 7: ai.options.gloo.solo.io.RouteSettings.prompt_enrichment:type_name -> ai.options.gloo.solo.io.AIPromptEnrichment + 13, // 8: ai.options.gloo.solo.io.RouteSettings.prompt_guard:type_name -> ai.options.gloo.solo.io.AIPromptGuard + 11, // 9: ai.options.gloo.solo.io.RouteSettings.rag:type_name -> ai.options.gloo.solo.io.RAG + 10, // 10: ai.options.gloo.solo.io.RouteSettings.semantic_cache:type_name -> ai.options.gloo.solo.io.SemanticCache + 7, // 11: ai.options.gloo.solo.io.RouteSettings.defaults:type_name -> ai.options.gloo.solo.io.FieldDefault + 0, // 12: ai.options.gloo.solo.io.RouteSettings.route_type:type_name -> ai.options.gloo.solo.io.RouteSettings.RouteType + 37, // 13: ai.options.gloo.solo.io.FieldDefault.value:type_name -> google.protobuf.Value + 23, // 14: ai.options.gloo.solo.io.Embedding.openai:type_name -> ai.options.gloo.solo.io.Embedding.OpenAI + 24, // 15: ai.options.gloo.solo.io.Embedding.azure_openai:type_name -> ai.options.gloo.solo.io.Embedding.AzureOpenAI + 27, // 16: ai.options.gloo.solo.io.SemanticCache.datastore:type_name -> ai.options.gloo.solo.io.SemanticCache.DataStore + 9, // 17: ai.options.gloo.solo.io.SemanticCache.embedding:type_name -> ai.options.gloo.solo.io.Embedding + 1, // 18: ai.options.gloo.solo.io.SemanticCache.mode:type_name -> ai.options.gloo.solo.io.SemanticCache.Mode + 28, // 19: ai.options.gloo.solo.io.RAG.datastore:type_name -> ai.options.gloo.solo.io.RAG.DataStore + 9, // 20: ai.options.gloo.solo.io.RAG.embedding:type_name -> ai.options.gloo.solo.io.Embedding + 29, // 21: ai.options.gloo.solo.io.AIPromptEnrichment.prepend:type_name -> ai.options.gloo.solo.io.AIPromptEnrichment.Message + 29, // 22: ai.options.gloo.solo.io.AIPromptEnrichment.append:type_name -> ai.options.gloo.solo.io.AIPromptEnrichment.Message + 32, // 23: ai.options.gloo.solo.io.AIPromptGuard.request:type_name -> ai.options.gloo.solo.io.AIPromptGuard.Request + 33, // 24: ai.options.gloo.solo.io.AIPromptGuard.response:type_name -> ai.options.gloo.solo.io.AIPromptGuard.Response + 4, // 25: ai.options.gloo.solo.io.UpstreamSpec.OpenAI.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken + 14, // 26: ai.options.gloo.solo.io.UpstreamSpec.OpenAI.custom_host:type_name -> ai.options.gloo.solo.io.UpstreamSpec.CustomHost + 4, // 27: ai.options.gloo.solo.io.UpstreamSpec.AzureOpenAI.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken + 4, // 28: ai.options.gloo.solo.io.UpstreamSpec.Gemini.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken + 4, // 29: ai.options.gloo.solo.io.UpstreamSpec.Mistral.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken + 14, // 30: ai.options.gloo.solo.io.UpstreamSpec.Mistral.custom_host:type_name -> ai.options.gloo.solo.io.UpstreamSpec.CustomHost + 4, // 31: ai.options.gloo.solo.io.UpstreamSpec.Anthropic.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken + 14, // 32: ai.options.gloo.solo.io.UpstreamSpec.Anthropic.custom_host:type_name -> ai.options.gloo.solo.io.UpstreamSpec.CustomHost + 22, // 33: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.priorities:type_name -> ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Priority + 15, // 34: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend.openai:type_name -> ai.options.gloo.solo.io.UpstreamSpec.OpenAI + 18, // 35: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend.mistral:type_name -> ai.options.gloo.solo.io.UpstreamSpec.Mistral + 19, // 36: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend.anthropic:type_name -> ai.options.gloo.solo.io.UpstreamSpec.Anthropic + 16, // 37: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend.azure_openai:type_name -> ai.options.gloo.solo.io.UpstreamSpec.AzureOpenAI + 17, // 38: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend.gemini:type_name -> ai.options.gloo.solo.io.UpstreamSpec.Gemini + 21, // 39: ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Priority.pool:type_name -> ai.options.gloo.solo.io.UpstreamSpec.MultiPool.Backend + 4, // 40: ai.options.gloo.solo.io.Embedding.OpenAI.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken + 4, // 41: ai.options.gloo.solo.io.Embedding.AzureOpenAI.auth_token:type_name -> ai.options.gloo.solo.io.SingleAuthToken + 25, // 42: ai.options.gloo.solo.io.SemanticCache.DataStore.redis:type_name -> ai.options.gloo.solo.io.SemanticCache.Redis + 26, // 43: ai.options.gloo.solo.io.SemanticCache.DataStore.weaviate:type_name -> ai.options.gloo.solo.io.SemanticCache.Weaviate + 8, // 44: ai.options.gloo.solo.io.RAG.DataStore.postgres:type_name -> ai.options.gloo.solo.io.Postgres + 2, // 45: ai.options.gloo.solo.io.AIPromptGuard.Regex.builtins:type_name -> ai.options.gloo.solo.io.AIPromptGuard.Regex.BuiltIn + 34, // 46: ai.options.gloo.solo.io.AIPromptGuard.Webhook.headers:type_name -> ai.options.gloo.solo.io.AIPromptGuard.Webhook.HeaderMatch + 35, // 47: ai.options.gloo.solo.io.AIPromptGuard.Request.custom_response:type_name -> ai.options.gloo.solo.io.AIPromptGuard.Request.CustomResponse + 30, // 48: ai.options.gloo.solo.io.AIPromptGuard.Request.regex:type_name -> ai.options.gloo.solo.io.AIPromptGuard.Regex + 31, // 49: ai.options.gloo.solo.io.AIPromptGuard.Request.webhook:type_name -> ai.options.gloo.solo.io.AIPromptGuard.Webhook + 30, // 50: ai.options.gloo.solo.io.AIPromptGuard.Response.regex:type_name -> ai.options.gloo.solo.io.AIPromptGuard.Regex + 31, // 51: ai.options.gloo.solo.io.AIPromptGuard.Response.webhook:type_name -> ai.options.gloo.solo.io.AIPromptGuard.Webhook + 3, // 52: ai.options.gloo.solo.io.AIPromptGuard.Webhook.HeaderMatch.match_type:type_name -> ai.options.gloo.solo.io.AIPromptGuard.Webhook.HeaderMatch.MatchType + 53, // [53:53] is the sub-list for method output_type + 53, // [53:53] is the sub-list for method input_type + 53, // [53:53] is the sub-list for extension type_name + 53, // [53:53] is the sub-list for extension extendee + 0, // [0:53] is the sub-list for field type_name } func init() { file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_init() } @@ -2931,7 +3397,7 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai } } file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RateLimiting); i { + switch v := v.(*AIPromptEnrichment); i { case 0: return &v.state case 1: @@ -2943,7 +3409,7 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai } } file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AIPromptEnrichment); i { + switch v := v.(*AIPromptGuard); i { case 0: return &v.state case 1: @@ -2955,7 +3421,7 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai } } file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AIPromptGaurd); i { + switch v := v.(*UpstreamSpec_CustomHost); i { case 0: return &v.state case 1: @@ -2967,7 +3433,7 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai } } file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpstreamSpec_CustomHost); i { + switch v := v.(*UpstreamSpec_OpenAI); i { case 0: return &v.state case 1: @@ -2979,7 +3445,7 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai } } file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpstreamSpec_OpenAI); i { + switch v := v.(*UpstreamSpec_AzureOpenAI); i { case 0: return &v.state case 1: @@ -2991,7 +3457,7 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai } } file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpstreamSpec_AzureOpenAI); i { + switch v := v.(*UpstreamSpec_Gemini); i { case 0: return &v.state case 1: @@ -3147,7 +3613,7 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai } } file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AIPromptGaurd_Request); i { + switch v := v.(*AIPromptGuard_Regex); i { case 0: return &v.state case 1: @@ -3159,7 +3625,55 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai } } file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AIPromptGaurd_Response); i { + switch v := v.(*AIPromptGuard_Webhook); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AIPromptGuard_Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AIPromptGuard_Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AIPromptGuard_Webhook_HeaderMatch); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AIPromptGuard_Request_CustomResponse); i { case 0: return &v.state case 1: @@ -3181,19 +3695,24 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai (*UpstreamSpec_Anthropic_)(nil), (*UpstreamSpec_AzureOpenai)(nil), (*UpstreamSpec_Multi)(nil), + (*UpstreamSpec_Gemini_)(nil), } file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[5].OneofWrappers = []interface{}{ (*Embedding_Openai)(nil), (*Embedding_AzureOpenai)(nil), } - file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[13].OneofWrappers = []interface{}{ + file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[12].OneofWrappers = []interface{}{ (*UpstreamSpec_AzureOpenAI_AuthToken)(nil), } + file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[13].OneofWrappers = []interface{}{ + (*UpstreamSpec_Gemini_AuthToken)(nil), + } file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[17].OneofWrappers = []interface{}{ (*UpstreamSpec_MultiPool_Backend_Openai)(nil), (*UpstreamSpec_MultiPool_Backend_Mistral)(nil), (*UpstreamSpec_MultiPool_Backend_Anthropic)(nil), (*UpstreamSpec_MultiPool_Backend_AzureOpenai)(nil), + (*UpstreamSpec_MultiPool_Backend_Gemini)(nil), } file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_msgTypes[19].OneofWrappers = []interface{}{ (*Embedding_OpenAI_AuthToken)(nil), @@ -3213,8 +3732,8 @@ func file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_github_com_solo_io_solo_apis_api_gloo_gloo_v1_enterprise_options_ai_ai_proto_rawDesc, - NumEnums: 3, - NumMessages: 28, + NumEnums: 4, + NumMessages: 32, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.hash.go b/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.hash.go index b01d81bcd..1158d2c35 100644 --- a/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.hash.go +++ b/pkg/api/gloo.solo.io/v1/enterprise/options/ai/ai.pb.hash.go @@ -198,6 +198,28 @@ func (m *UpstreamSpec) Hash(hasher hash.Hash64) (uint64, error) { } } + case *UpstreamSpec_Gemini_: + + if h, ok := interface{}(m.GetGemini()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("Gemini")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(m.GetGemini(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("Gemini")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + } return hasher.Sum64(), nil @@ -587,30 +609,6 @@ func (m *RAG) Hash(hasher hash.Hash64) (uint64, error) { return hasher.Sum64(), nil } -// Hash function -func (m *RateLimiting) Hash(hasher hash.Hash64) (uint64, error) { - if m == nil { - return 0, nil - } - if hasher == nil { - hasher = fnv.New64() - } - var err error - if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.RateLimiting")); err != nil { - return 0, err - } - - for _, v := range m.GetRateLimitConfigs() { - - if _, err = hasher.Write([]byte(v)); err != nil { - return 0, err - } - - } - - return hasher.Sum64(), nil -} - // Hash function func (m *AIPromptEnrichment) Hash(hasher hash.Hash64) (uint64, error) { if m == nil { @@ -676,7 +674,7 @@ func (m *AIPromptEnrichment) Hash(hasher hash.Hash64) (uint64, error) { } // Hash function -func (m *AIPromptGaurd) Hash(hasher hash.Hash64) (uint64, error) { +func (m *AIPromptGuard) Hash(hasher hash.Hash64) (uint64, error) { if m == nil { return 0, nil } @@ -684,7 +682,7 @@ func (m *AIPromptGaurd) Hash(hasher hash.Hash64) (uint64, error) { hasher = fnv.New64() } var err error - if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.AIPromptGaurd")); err != nil { + if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.AIPromptGuard")); err != nil { return 0, err } @@ -870,6 +868,56 @@ func (m *UpstreamSpec_AzureOpenAI) Hash(hasher hash.Hash64) (uint64, error) { return hasher.Sum64(), nil } +// Hash function +func (m *UpstreamSpec_Gemini) Hash(hasher hash.Hash64) (uint64, error) { + if m == nil { + return 0, nil + } + if hasher == nil { + hasher = fnv.New64() + } + var err error + if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.UpstreamSpec_Gemini")); err != nil { + return 0, err + } + + if _, err = hasher.Write([]byte(m.GetModel())); err != nil { + return 0, err + } + + if _, err = hasher.Write([]byte(m.GetApiVersion())); err != nil { + return 0, err + } + + switch m.AuthTokenSource.(type) { + + case *UpstreamSpec_Gemini_AuthToken: + + if h, ok := interface{}(m.GetAuthToken()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("AuthToken")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(m.GetAuthToken(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("AuthToken")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + + } + + return hasher.Sum64(), nil +} + // Hash function func (m *UpstreamSpec_Mistral) Hash(hasher hash.Hash64) (uint64, error) { if m == nil { @@ -1137,6 +1185,28 @@ func (m *UpstreamSpec_MultiPool_Backend) Hash(hasher hash.Hash64) (uint64, error } } + case *UpstreamSpec_MultiPool_Backend_Gemini: + + if h, ok := interface{}(m.GetGemini()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("Gemini")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(m.GetGemini(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("Gemini")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + } return hasher.Sum64(), nil @@ -1469,7 +1539,7 @@ func (m *AIPromptEnrichment_Message) Hash(hasher hash.Hash64) (uint64, error) { } // Hash function -func (m *AIPromptGaurd_Request) Hash(hasher hash.Hash64) (uint64, error) { +func (m *AIPromptGuard_Regex) Hash(hasher hash.Hash64) (uint64, error) { if m == nil { return 0, nil } @@ -1477,7 +1547,7 @@ func (m *AIPromptGaurd_Request) Hash(hasher hash.Hash64) (uint64, error) { hasher = fnv.New64() } var err error - if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.AIPromptGaurd_Request")); err != nil { + if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.AIPromptGuard_Regex")); err != nil { return 0, err } @@ -1489,15 +1559,69 @@ func (m *AIPromptGaurd_Request) Hash(hasher hash.Hash64) (uint64, error) { } - if _, err = hasher.Write([]byte(m.GetCustomResponseMessage())); err != nil { + for _, v := range m.GetBuiltins() { + + err = binary.Write(hasher, binary.LittleEndian, v) + if err != nil { + return 0, err + } + + } + + return hasher.Sum64(), nil +} + +// Hash function +func (m *AIPromptGuard_Webhook) Hash(hasher hash.Hash64) (uint64, error) { + if m == nil { + return 0, nil + } + if hasher == nil { + hasher = fnv.New64() + } + var err error + if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.AIPromptGuard_Webhook")); err != nil { return 0, err } + if _, err = hasher.Write([]byte(m.GetHost())); err != nil { + return 0, err + } + + err = binary.Write(hasher, binary.LittleEndian, m.GetPort()) + if err != nil { + return 0, err + } + + for _, v := range m.GetHeaders() { + + if h, ok := interface{}(v).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(v, nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + + } + return hasher.Sum64(), nil } // Hash function -func (m *AIPromptGaurd_Response) Hash(hasher hash.Hash64) (uint64, error) { +func (m *AIPromptGuard_Request) Hash(hasher hash.Hash64) (uint64, error) { if m == nil { return 0, nil } @@ -1505,25 +1629,174 @@ func (m *AIPromptGaurd_Response) Hash(hasher hash.Hash64) (uint64, error) { hasher = fnv.New64() } var err error - if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.AIPromptGaurd_Response")); err != nil { + if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.AIPromptGuard_Request")); err != nil { return 0, err } - for _, v := range m.GetMatches() { + if h, ok := interface{}(m.GetCustomResponse()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("CustomResponse")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(m.GetCustomResponse(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("CustomResponse")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } - if _, err = hasher.Write([]byte(v)); err != nil { + if h, ok := interface{}(m.GetRegex()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("Regex")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { return 0, err } + } else { + if fieldValue, err := hashstructure.Hash(m.GetRegex(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("Regex")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + if h, ok := interface{}(m.GetWebhook()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("Webhook")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(m.GetWebhook(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("Webhook")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } } - for _, v := range m.GetBuiltins() { + return hasher.Sum64(), nil +} - err = binary.Write(hasher, binary.LittleEndian, v) - if err != nil { +// Hash function +func (m *AIPromptGuard_Response) Hash(hasher hash.Hash64) (uint64, error) { + if m == nil { + return 0, nil + } + if hasher == nil { + hasher = fnv.New64() + } + var err error + if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.AIPromptGuard_Response")); err != nil { + return 0, err + } + + if h, ok := interface{}(m.GetRegex()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("Regex")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(m.GetRegex(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("Regex")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + + if h, ok := interface{}(m.GetWebhook()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("Webhook")); err != nil { return 0, err } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(m.GetWebhook(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("Webhook")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + + return hasher.Sum64(), nil +} + +// Hash function +func (m *AIPromptGuard_Webhook_HeaderMatch) Hash(hasher hash.Hash64) (uint64, error) { + if m == nil { + return 0, nil + } + if hasher == nil { + hasher = fnv.New64() + } + var err error + if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.AIPromptGuard_Webhook_HeaderMatch")); err != nil { + return 0, err + } + if _, err = hasher.Write([]byte(m.GetKey())); err != nil { + return 0, err + } + + err = binary.Write(hasher, binary.LittleEndian, m.GetMatchType()) + if err != nil { + return 0, err + } + + return hasher.Sum64(), nil +} + +// Hash function +func (m *AIPromptGuard_Request_CustomResponse) Hash(hasher hash.Hash64) (uint64, error) { + if m == nil { + return 0, nil + } + if hasher == nil { + hasher = fnv.New64() + } + var err error + if _, err = hasher.Write([]byte("ai.options.gloo.solo.io.github.com/solo-io/solo-apis/pkg/api/gloo.solo.io/v1/enterprise/options/ai.AIPromptGuard_Request_CustomResponse")); err != nil { + return 0, err + } + + if _, err = hasher.Write([]byte(m.GetMessage())); err != nil { + return 0, err + } + + err = binary.Write(hasher, binary.LittleEndian, m.GetStatusCode()) + if err != nil { + return 0, err } return hasher.Sum64(), nil