// Copyright 2018 Google LLC. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // syntax = "proto3"; package google.cloud.vision.v1; import "google/api/annotations.proto"; import "google/cloud/vision/v1/geometry.proto"; import "google/longrunning/operations.proto"; import "google/protobuf/empty.proto"; import "google/protobuf/field_mask.proto"; import "google/protobuf/timestamp.proto"; import "google/rpc/status.proto"; option cc_enable_arenas = true; option go_package = "google.golang.org/genproto/googleapis/cloud/vision/v1;vision"; option java_multiple_files = true; option java_outer_classname = "ProductSearchServiceProto"; option java_package = "com.google.cloud.vision.v1"; option objc_class_prefix = "GCVN"; // Manages Products and ProductSets of reference images for use in product // search. It uses the following resource model: // // - The API has a collection of [ProductSet][google.cloud.vision.v1.ProductSet] // resources, named `projects/*/locations/*/productSets/*`, which acts as a way // to put different products into groups to limit identification. // // In parallel, // // - The API has a collection of [Product][google.cloud.vision.v1.Product] // resources, named // `projects/*/locations/*/products/*` // // - Each [Product][google.cloud.vision.v1.Product] has a collection of // [ReferenceImage][google.cloud.vision.v1.ReferenceImage] resources, named // `projects/*/locations/*/products/*/referenceImages/*` service ProductSearch { // Creates and returns a new ProductSet resource. // // Possible errors: // // * Returns INVALID_ARGUMENT if display_name is missing, or is longer than // 4096 characters. rpc CreateProductSet(CreateProductSetRequest) returns (ProductSet) { option (google.api.http) = { post: "/v1/{parent=projects/*/locations/*}/productSets" body: "product_set" }; } // Lists ProductSets in an unspecified order. // // Possible errors: // // * Returns INVALID_ARGUMENT if page_size is greater than 100, or less // than 1. rpc ListProductSets(ListProductSetsRequest) returns (ListProductSetsResponse) { option (google.api.http) = { get: "/v1/{parent=projects/*/locations/*}/productSets" }; } // Gets information associated with a ProductSet. // // Possible errors: // // * Returns NOT_FOUND if the ProductSet does not exist. rpc GetProductSet(GetProductSetRequest) returns (ProductSet) { option (google.api.http) = { get: "/v1/{name=projects/*/locations/*/productSets/*}" }; } // Makes changes to a ProductSet resource. // Only display_name can be updated currently. // // Possible errors: // // * Returns NOT_FOUND if the ProductSet does not exist. // * Returns INVALID_ARGUMENT if display_name is present in update_mask but // missing from the request or longer than 4096 characters. rpc UpdateProductSet(UpdateProductSetRequest) returns (ProductSet) { option (google.api.http) = { patch: "/v1/{product_set.name=projects/*/locations/*/productSets/*}" body: "product_set" }; } // Permanently deletes a ProductSet. Products and ReferenceImages in the // ProductSet are not deleted. // // The actual image files are not deleted from Google Cloud Storage. // // Possible errors: // // * Returns NOT_FOUND if the ProductSet does not exist. rpc DeleteProductSet(DeleteProductSetRequest) returns (google.protobuf.Empty) { option (google.api.http) = { delete: "/v1/{name=projects/*/locations/*/productSets/*}" }; } // Creates and returns a new product resource. // // Possible errors: // // * Returns INVALID_ARGUMENT if display_name is missing or longer than 4096 // characters. // * Returns INVALID_ARGUMENT if description is longer than 4096 characters. // * Returns INVALID_ARGUMENT if product_category is missing or invalid. rpc CreateProduct(CreateProductRequest) returns (Product) { option (google.api.http) = { post: "/v1/{parent=projects/*/locations/*}/products" body: "product" }; } // Lists products in an unspecified order. // // Possible errors: // // * Returns INVALID_ARGUMENT if page_size is greater than 100 or less than 1. rpc ListProducts(ListProductsRequest) returns (ListProductsResponse) { option (google.api.http) = { get: "/v1/{parent=projects/*/locations/*}/products" }; } // Gets information associated with a Product. // // Possible errors: // // * Returns NOT_FOUND if the Product does not exist. rpc GetProduct(GetProductRequest) returns (Product) { option (google.api.http) = { get: "/v1/{name=projects/*/locations/*/products/*}" }; } // Makes changes to a Product resource. // Only the `display_name`, `description`, and `labels` fields can be updated // right now. // // If labels are updated, the change will not be reflected in queries until // the next index time. // // Possible errors: // // * Returns NOT_FOUND if the Product does not exist. // * Returns INVALID_ARGUMENT if display_name is present in update_mask but is // missing from the request or longer than 4096 characters. // * Returns INVALID_ARGUMENT if description is present in update_mask but is // longer than 4096 characters. // * Returns INVALID_ARGUMENT if product_category is present in update_mask. rpc UpdateProduct(UpdateProductRequest) returns (Product) { option (google.api.http) = { patch: "/v1/{product.name=projects/*/locations/*/products/*}" body: "product" }; } // Permanently deletes a product and its reference images. // // Metadata of the product and all its images will be deleted right away, but // search queries against ProductSets containing the product may still work // until all related caches are refreshed. // // Possible errors: // // * Returns NOT_FOUND if the product does not exist. rpc DeleteProduct(DeleteProductRequest) returns (google.protobuf.Empty) { option (google.api.http) = { delete: "/v1/{name=projects/*/locations/*/products/*}" }; } // Creates and returns a new ReferenceImage resource. // // The `bounding_poly` field is optional. If `bounding_poly` is not specified, // the system will try to detect regions of interest in the image that are // compatible with the product_category on the parent product. If it is // specified, detection is ALWAYS skipped. The system converts polygons into // non-rotated rectangles. // // Note that the pipeline will resize the image if the image resolution is too // large to process (above 50MP). // // Possible errors: // // * Returns INVALID_ARGUMENT if the image_uri is missing or longer than 4096 // characters. // * Returns INVALID_ARGUMENT if the product does not exist. // * Returns INVALID_ARGUMENT if bounding_poly is not provided, and nothing // compatible with the parent product's product_category is detected. // * Returns INVALID_ARGUMENT if bounding_poly contains more than 10 polygons. rpc CreateReferenceImage(CreateReferenceImageRequest) returns (ReferenceImage) { option (google.api.http) = { post: "/v1/{parent=projects/*/locations/*/products/*}/referenceImages" body: "reference_image" }; } // Permanently deletes a reference image. // // The image metadata will be deleted right away, but search queries // against ProductSets containing the image may still work until all related // caches are refreshed. // // The actual image files are not deleted from Google Cloud Storage. // // Possible errors: // // * Returns NOT_FOUND if the reference image does not exist. rpc DeleteReferenceImage(DeleteReferenceImageRequest) returns (google.protobuf.Empty) { option (google.api.http) = { delete: "/v1/{name=projects/*/locations/*/products/*/referenceImages/*}" }; } // Lists reference images. // // Possible errors: // // * Returns NOT_FOUND if the parent product does not exist. // * Returns INVALID_ARGUMENT if the page_size is greater than 100, or less // than 1. rpc ListReferenceImages(ListReferenceImagesRequest) returns (ListReferenceImagesResponse) { option (google.api.http) = { get: "/v1/{parent=projects/*/locations/*/products/*}/referenceImages" }; } // Gets information associated with a ReferenceImage. // // Possible errors: // // * Returns NOT_FOUND if the specified image does not exist. rpc GetReferenceImage(GetReferenceImageRequest) returns (ReferenceImage) { option (google.api.http) = { get: "/v1/{name=projects/*/locations/*/products/*/referenceImages/*}" }; } // Adds a Product to the specified ProductSet. If the Product is already // present, no change is made. // // One Product can be added to at most 100 ProductSets. // // Possible errors: // // * Returns NOT_FOUND if the Product or the ProductSet doesn't exist. rpc AddProductToProductSet(AddProductToProductSetRequest) returns (google.protobuf.Empty) { option (google.api.http) = { post: "/v1/{name=projects/*/locations/*/productSets/*}:addProduct" body: "*" }; } // Removes a Product from the specified ProductSet. // // Possible errors: // // * Returns NOT_FOUND If the Product is not found under the ProductSet. rpc RemoveProductFromProductSet(RemoveProductFromProductSetRequest) returns (google.protobuf.Empty) { option (google.api.http) = { post: "/v1/{name=projects/*/locations/*/productSets/*}:removeProduct" body: "*" }; } // Lists the Products in a ProductSet, in an unspecified order. If the // ProductSet does not exist, the products field of the response will be // empty. // // Possible errors: // // * Returns INVALID_ARGUMENT if page_size is greater than 100 or less than 1. rpc ListProductsInProductSet(ListProductsInProductSetRequest) returns (ListProductsInProductSetResponse) { option (google.api.http) = { get: "/v1/{name=projects/*/locations/*/productSets/*}/products" }; } // Asynchronous API that imports a list of reference images to specified // product sets based on a list of image information. // // The [google.longrunning.Operation][google.longrunning.Operation] API can be // used to keep track of the progress and results of the request. // `Operation.metadata` contains `BatchOperationMetadata`. (progress) // `Operation.response` contains `ImportProductSetsResponse`. (results) // // The input source of this method is a csv file on Google Cloud Storage. // For the format of the csv file please see // [ImportProductSetsGcsSource.csv_file_uri][google.cloud.vision.v1.ImportProductSetsGcsSource.csv_file_uri]. rpc ImportProductSets(ImportProductSetsRequest) returns (google.longrunning.Operation) { option (google.api.http) = { post: "/v1/{parent=projects/*/locations/*}/productSets:import" body: "*" }; } } // A Product contains ReferenceImages. message Product { // A product label represented as a key-value pair. message KeyValue { // The key of the label attached to the product. Cannot be empty and cannot // exceed 128 bytes. string key = 1; // The value of the label attached to the product. Cannot be empty and // cannot exceed 128 bytes. string value = 2; } // The resource name of the product. // // Format is: // `projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID`. // // This field is ignored when creating a product. string name = 1; // The user-provided name for this Product. Must not be empty. Must be at most // 4096 characters long. string display_name = 2; // User-provided metadata to be stored with this product. Must be at most 4096 // characters long. string description = 3; // The category for the product identified by the reference image. This should // be either "homegoods", "apparel", or "toys". // // This field is immutable. string product_category = 4; // Key-value pairs that can be attached to a product. At query time, // constraints can be specified based on the product_labels. // // Note that integer values can be provided as strings, e.g. "1199". Only // strings with integer values can match a range-based restriction which is // to be supported soon. // // Multiple values can be assigned to the same key. One product may have up to // 100 product_labels. repeated KeyValue product_labels = 5; } // A ProductSet contains Products. A ProductSet can contain a maximum of 1 // million reference images. If the limit is exceeded, periodic indexing will // fail. message ProductSet { // The resource name of the ProductSet. // // Format is: // `projects/PROJECT_ID/locations/LOC_ID/productSets/PRODUCT_SET_ID`. // // This field is ignored when creating a ProductSet. string name = 1; // The user-provided name for this ProductSet. Must not be empty. Must be at // most 4096 characters long. string display_name = 2; // Output only. The time at which this ProductSet was last indexed. Query // results will reflect all updates before this time. If this ProductSet has // never been indexed, this field is 0. // // This field is ignored when creating a ProductSet. google.protobuf.Timestamp index_time = 3; // Output only. If there was an error with indexing the product set, the field // is populated. // // This field is ignored when creating a ProductSet. google.rpc.Status index_error = 4; } // A `ReferenceImage` represents a product image and its associated metadata, // such as bounding boxes. message ReferenceImage { // The resource name of the reference image. // // Format is: // // `projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID/referenceImages/IMAGE_ID`. // // This field is ignored when creating a reference image. string name = 1; // The Google Cloud Storage URI of the reference image. // // The URI must start with `gs://`. // // Required. string uri = 2; // Bounding polygons around the areas of interest in the reference image. // Optional. If this field is empty, the system will try to detect regions of // interest. At most 10 bounding polygons will be used. // // The provided shape is converted into a non-rotated rectangle. Once // converted, the small edge of the rectangle must be greater than or equal // to 300 pixels. The aspect ratio must be 1:4 or less (i.e. 1:3 is ok; 1:5 // is not). repeated BoundingPoly bounding_polys = 3; } // Request message for the `CreateProduct` method. message CreateProductRequest { // The project in which the Product should be created. // // Format is // `projects/PROJECT_ID/locations/LOC_ID`. string parent = 1; // The product to create. Product product = 2; // A user-supplied resource id for this Product. If set, the server will // attempt to use this value as the resource id. If it is already in use, an // error is returned with code ALREADY_EXISTS. Must be at most 128 characters // long. It cannot contain the character `/`. string product_id = 3; } // Request message for the `ListProducts` method. message ListProductsRequest { // The project OR ProductSet from which Products should be listed. // // Format: // `projects/PROJECT_ID/locations/LOC_ID` string parent = 1; // The maximum number of items to return. Default 10, maximum 100. int32 page_size = 2; // The next_page_token returned from a previous List request, if any. string page_token = 3; } // Response message for the `ListProducts` method. message ListProductsResponse { // List of products. repeated Product products = 1; // Token to retrieve the next page of results, or empty if there are no more // results in the list. string next_page_token = 2; } // Request message for the `GetProduct` method. message GetProductRequest { // Resource name of the Product to get. // // Format is: // `projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID` string name = 1; } // Request message for the `UpdateProduct` method. message UpdateProductRequest { // The Product resource which replaces the one on the server. // product.name is immutable. Product product = 1; // The [FieldMask][google.protobuf.FieldMask] that specifies which fields // to update. // If update_mask isn't specified, all mutable fields are to be updated. // Valid mask paths include `product_labels`, `display_name`, and // `description`. google.protobuf.FieldMask update_mask = 2; } // Request message for the `DeleteProduct` method. message DeleteProductRequest { // Resource name of product to delete. // // Format is: // `projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID` string name = 1; } // Request message for the `CreateProductSet` method. message CreateProductSetRequest { // The project in which the ProductSet should be created. // // Format is `projects/PROJECT_ID/locations/LOC_ID`. string parent = 1; // The ProductSet to create. ProductSet product_set = 2; // A user-supplied resource id for this ProductSet. If set, the server will // attempt to use this value as the resource id. If it is already in use, an // error is returned with code ALREADY_EXISTS. Must be at most 128 characters // long. It cannot contain the character `/`. string product_set_id = 3; } // Request message for the `ListProductSets` method. message ListProductSetsRequest { // The project from which ProductSets should be listed. // // Format is `projects/PROJECT_ID/locations/LOC_ID`. string parent = 1; // The maximum number of items to return. Default 10, maximum 100. int32 page_size = 2; // The next_page_token returned from a previous List request, if any. string page_token = 3; } // Response message for the `ListProductSets` method. message ListProductSetsResponse { // List of ProductSets. repeated ProductSet product_sets = 1; // Token to retrieve the next page of results, or empty if there are no more // results in the list. string next_page_token = 2; } // Request message for the `GetProductSet` method. message GetProductSetRequest { // Resource name of the ProductSet to get. // // Format is: // `projects/PROJECT_ID/locations/LOG_ID/productSets/PRODUCT_SET_ID` string name = 1; } // Request message for the `UpdateProductSet` method. message UpdateProductSetRequest { // The ProductSet resource which replaces the one on the server. ProductSet product_set = 1; // The [FieldMask][google.protobuf.FieldMask] that specifies which fields to // update. // If update_mask isn't specified, all mutable fields are to be updated. // Valid mask path is `display_name`. google.protobuf.FieldMask update_mask = 2; } // Request message for the `DeleteProductSet` method. message DeleteProductSetRequest { // Resource name of the ProductSet to delete. // // Format is: // `projects/PROJECT_ID/locations/LOC_ID/productSets/PRODUCT_SET_ID` string name = 1; } // Request message for the `CreateReferenceImage` method. message CreateReferenceImageRequest { // Resource name of the product in which to create the reference image. // // Format is // `projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID`. string parent = 1; // The reference image to create. // If an image ID is specified, it is ignored. ReferenceImage reference_image = 2; // A user-supplied resource id for the ReferenceImage to be added. If set, // the server will attempt to use this value as the resource id. If it is // already in use, an error is returned with code ALREADY_EXISTS. Must be at // most 128 characters long. It cannot contain the character `/`. string reference_image_id = 3; } // Request message for the `ListReferenceImages` method. message ListReferenceImagesRequest { // Resource name of the product containing the reference images. // // Format is // `projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID`. string parent = 1; // The maximum number of items to return. Default 10, maximum 100. int32 page_size = 2; // A token identifying a page of results to be returned. This is the value // of `nextPageToken` returned in a previous reference image list request. // // Defaults to the first page if not specified. string page_token = 3; } // Response message for the `ListReferenceImages` method. message ListReferenceImagesResponse { // The list of reference images. repeated ReferenceImage reference_images = 1; // The maximum number of items to return. Default 10, maximum 100. int32 page_size = 2; // The next_page_token returned from a previous List request, if any. string next_page_token = 3; } // Request message for the `GetReferenceImage` method. message GetReferenceImageRequest { // The resource name of the ReferenceImage to get. // // Format is: // // `projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID/referenceImages/IMAGE_ID`. string name = 1; } // Request message for the `DeleteReferenceImage` method. message DeleteReferenceImageRequest { // The resource name of the reference image to delete. // // Format is: // // `projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID/referenceImages/IMAGE_ID` string name = 1; } // Request message for the `AddProductToProductSet` method. message AddProductToProductSetRequest { // The resource name for the ProductSet to modify. // // Format is: // `projects/PROJECT_ID/locations/LOC_ID/productSets/PRODUCT_SET_ID` string name = 1; // The resource name for the Product to be added to this ProductSet. // // Format is: // `projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID` string product = 2; } // Request message for the `RemoveProductFromProductSet` method. message RemoveProductFromProductSetRequest { // The resource name for the ProductSet to modify. // // Format is: // `projects/PROJECT_ID/locations/LOC_ID/productSets/PRODUCT_SET_ID` string name = 1; // The resource name for the Product to be removed from this ProductSet. // // Format is: // `projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID` string product = 2; } // Request message for the `ListProductsInProductSet` method. message ListProductsInProductSetRequest { // The ProductSet resource for which to retrieve Products. // // Format is: // `projects/PROJECT_ID/locations/LOC_ID/productSets/PRODUCT_SET_ID` string name = 1; // The maximum number of items to return. Default 10, maximum 100. int32 page_size = 2; // The next_page_token returned from a previous List request, if any. string page_token = 3; } // Response message for the `ListProductsInProductSet` method. message ListProductsInProductSetResponse { // The list of Products. repeated Product products = 1; // Token to retrieve the next page of results, or empty if there are no more // results in the list. string next_page_token = 2; } // The Google Cloud Storage location for a csv file which preserves a list of // ImportProductSetRequests in each line. message ImportProductSetsGcsSource { // The Google Cloud Storage URI of the input csv file. // // The URI must start with `gs://`. // // The format of the input csv file should be one image per line. // In each line, there are 8 columns. // // 1. image-uri // 2. image-id // 3. product-set-id // 4. product-id // 5. product-category // 6. product-display-name // 7. labels // 8. bounding-poly // // The `image-uri`, `product-set-id`, `product-id`, and `product-category` // columns are required. All other columns are optional. // // If the `ProductSet` or `Product` specified by the `product-set-id` and // `product-id` values does not exist, then the system will create a new // `ProductSet` or `Product` for the image. In this case, the // `product-display-name` column refers to // [display_name][google.cloud.vision.v1.Product.display_name], the // `product-category` column refers to // [product_category][google.cloud.vision.v1.Product.product_category], and // the `labels` column refers to // [product_labels][google.cloud.vision.v1.Product.product_labels]. // // The `image-id` column is optional but must be unique if provided. If it is // empty, the system will automatically assign a unique id to the image. // // The `product-display-name` column is optional. If it is empty, the system // sets the [display_name][google.cloud.vision.v1.Product.display_name] field // for the product to a space (" "). You can update the `display_name` later // by using the API. // // If a `Product` with the specified `product-id` already exists, then the // system ignores the `product-display-name`, `product-category`, and `labels` // columns. // // The `labels` column (optional) is a line containing a list of // comma-separated key-value pairs, in the following format: // // "key_1=value_1,key_2=value_2,...,key_n=value_n" // // The `bounding-poly` column (optional) identifies one region of // interest from the image in the same manner as `CreateReferenceImage`. If // you do not specify the `bounding-poly` column, then the system will try to // detect regions of interest automatically. // // At most one `bounding-poly` column is allowed per line. If the image // contains multiple regions of interest, add a line to the CSV file that // includes the same product information, and the `bounding-poly` values for // each region of interest. // // The `bounding-poly` column must contain an even number of comma-separated // numbers, in the format "p1_x,p1_y,p2_x,p2_y,...,pn_x,pn_y". Use // non-negative integers for absolute bounding polygons, and float values // in [0, 1] for normalized bounding polygons. // // The system will resize the image if the image resolution is too // large to process (larger than 20MP). string csv_file_uri = 1; } // The input content for the `ImportProductSets` method. message ImportProductSetsInputConfig { // The source of the input. oneof source { // The Google Cloud Storage location for a csv file which preserves a list // of ImportProductSetRequests in each line. ImportProductSetsGcsSource gcs_source = 1; } } // Request message for the `ImportProductSets` method. message ImportProductSetsRequest { // The project in which the ProductSets should be imported. // // Format is `projects/PROJECT_ID/locations/LOC_ID`. string parent = 1; // The input content for the list of requests. ImportProductSetsInputConfig input_config = 2; } // Response message for the `ImportProductSets` method. // // This message is returned by the // [google.longrunning.Operations.GetOperation][google.longrunning.Operations.GetOperation] // method in the returned // [google.longrunning.Operation.response][google.longrunning.Operation.response] // field. message ImportProductSetsResponse { // The list of reference_images that are imported successfully. repeated ReferenceImage reference_images = 1; // The rpc status for each ImportProductSet request, including both successes // and errors. // // The number of statuses here matches the number of lines in the csv file, // and statuses[i] stores the success or failure status of processing the i-th // line of the csv, starting from line 0. repeated google.rpc.Status statuses = 2; } // Metadata for the batch operations such as the current state. // // This is included in the `metadata` field of the `Operation` returned by the // `GetOperation` call of the `google::longrunning::Operations` service. message BatchOperationMetadata { // Enumerates the possible states that the batch request can be in. enum State { // Invalid. STATE_UNSPECIFIED = 0; // Request is actively being processed. PROCESSING = 1; // The request is done and at least one item has been successfully // processed. SUCCESSFUL = 2; // The request is done and no item has been successfully processed. FAILED = 3; // The request is done after the longrunning.Operations.CancelOperation has // been called by the user. Any records that were processed before the // cancel command are output as specified in the request. CANCELLED = 4; } // The current state of the batch operation. State state = 1; // The time when the batch request was submitted to the server. google.protobuf.Timestamp submit_time = 2; // The time when the batch request is finished and // [google.longrunning.Operation.done][google.longrunning.Operation.done] is // set to true. google.protobuf.Timestamp end_time = 3; }