xref: /aosp_15_r20/external/googleapis/google/ai/generativelanguage/v1beta/retriever_service.proto (revision d5c09012810ac0c9f33fe448fb6da8260d444cc9)
1// Copyright 2023 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15syntax = "proto3";
16
17package google.ai.generativelanguage.v1beta;
18
19import "google/ai/generativelanguage/v1beta/retriever.proto";
20import "google/api/annotations.proto";
21import "google/api/client.proto";
22import "google/api/field_behavior.proto";
23import "google/api/resource.proto";
24import "google/protobuf/empty.proto";
25import "google/protobuf/field_mask.proto";
26
27option go_package = "cloud.google.com/go/ai/generativelanguage/apiv1beta/generativelanguagepb;generativelanguagepb";
28option java_multiple_files = true;
29option java_outer_classname = "RetrieverServiceProto";
30option java_package = "com.google.ai.generativelanguage.v1beta";
31
32// An API for semantic search over a corpus of user uploaded content.
33service RetrieverService {
34  option (google.api.default_host) = "generativelanguage.googleapis.com";
35
36  // Creates an empty `Corpus`.
37  rpc CreateCorpus(CreateCorpusRequest) returns (Corpus) {
38    option (google.api.http) = {
39      post: "/v1beta/corpora"
40      body: "corpus"
41    };
42    option (google.api.method_signature) = "corpus";
43  }
44
45  // Gets information about a specific `Corpus`.
46  rpc GetCorpus(GetCorpusRequest) returns (Corpus) {
47    option (google.api.http) = {
48      get: "/v1beta/{name=corpora/*}"
49    };
50    option (google.api.method_signature) = "name";
51  }
52
53  // Updates a `Corpus`.
54  rpc UpdateCorpus(UpdateCorpusRequest) returns (Corpus) {
55    option (google.api.http) = {
56      patch: "/v1beta/{corpus.name=corpora/*}"
57      body: "corpus"
58    };
59    option (google.api.method_signature) = "corpus,update_mask";
60  }
61
62  // Deletes a `Corpus`.
63  rpc DeleteCorpus(DeleteCorpusRequest) returns (google.protobuf.Empty) {
64    option (google.api.http) = {
65      delete: "/v1beta/{name=corpora/*}"
66    };
67    option (google.api.method_signature) = "name";
68  }
69
70  // Lists all `Corpora` owned by the user.
71  rpc ListCorpora(ListCorporaRequest) returns (ListCorporaResponse) {
72    option (google.api.http) = {
73      get: "/v1beta/corpora"
74    };
75  }
76
77  // Performs semantic search over a `Corpus`.
78  rpc QueryCorpus(QueryCorpusRequest) returns (QueryCorpusResponse) {
79    option (google.api.http) = {
80      post: "/v1beta/{name=corpora/*}:query"
81      body: "*"
82    };
83  }
84
85  // Creates an empty `Document`.
86  rpc CreateDocument(CreateDocumentRequest) returns (Document) {
87    option (google.api.http) = {
88      post: "/v1beta/{parent=corpora/*}/documents"
89      body: "document"
90    };
91    option (google.api.method_signature) = "parent,document";
92  }
93
94  // Gets information about a specific `Document`.
95  rpc GetDocument(GetDocumentRequest) returns (Document) {
96    option (google.api.http) = {
97      get: "/v1beta/{name=corpora/*/documents/*}"
98    };
99    option (google.api.method_signature) = "name";
100  }
101
102  // Updates a `Document`.
103  rpc UpdateDocument(UpdateDocumentRequest) returns (Document) {
104    option (google.api.http) = {
105      patch: "/v1beta/{document.name=corpora/*/documents/*}"
106      body: "document"
107    };
108    option (google.api.method_signature) = "document,update_mask";
109  }
110
111  // Deletes a `Document`.
112  rpc DeleteDocument(DeleteDocumentRequest) returns (google.protobuf.Empty) {
113    option (google.api.http) = {
114      delete: "/v1beta/{name=corpora/*/documents/*}"
115    };
116    option (google.api.method_signature) = "name";
117  }
118
119  // Lists all `Document`s in a `Corpus`.
120  rpc ListDocuments(ListDocumentsRequest) returns (ListDocumentsResponse) {
121    option (google.api.http) = {
122      get: "/v1beta/{parent=corpora/*}/documents"
123    };
124    option (google.api.method_signature) = "parent";
125  }
126
127  // Performs semantic search over a `Document`.
128  rpc QueryDocument(QueryDocumentRequest) returns (QueryDocumentResponse) {
129    option (google.api.http) = {
130      post: "/v1beta/{name=corpora/*/documents/*}:query"
131      body: "*"
132    };
133  }
134
135  // Creates a `Chunk`.
136  rpc CreateChunk(CreateChunkRequest) returns (Chunk) {
137    option (google.api.http) = {
138      post: "/v1beta/{parent=corpora/*/documents/*}/chunks"
139      body: "chunk"
140    };
141    option (google.api.method_signature) = "parent,chunk";
142  }
143
144  // Batch create `Chunk`s.
145  rpc BatchCreateChunks(BatchCreateChunksRequest)
146      returns (BatchCreateChunksResponse) {
147    option (google.api.http) = {
148      post: "/v1beta/{parent=corpora/*/documents/*}/chunks:batchCreate"
149      body: "*"
150    };
151  }
152
153  // Gets information about a specific `Chunk`.
154  rpc GetChunk(GetChunkRequest) returns (Chunk) {
155    option (google.api.http) = {
156      get: "/v1beta/{name=corpora/*/documents/*/chunks/*}"
157    };
158    option (google.api.method_signature) = "name";
159  }
160
161  // Updates a `Chunk`.
162  rpc UpdateChunk(UpdateChunkRequest) returns (Chunk) {
163    option (google.api.http) = {
164      patch: "/v1beta/{chunk.name=corpora/*/documents/*/chunks/*}"
165      body: "chunk"
166    };
167    option (google.api.method_signature) = "chunk,update_mask";
168  }
169
170  // Batch update `Chunk`s.
171  rpc BatchUpdateChunks(BatchUpdateChunksRequest)
172      returns (BatchUpdateChunksResponse) {
173    option (google.api.http) = {
174      post: "/v1beta/{parent=corpora/*/documents/*}/chunks:batchUpdate"
175      body: "*"
176    };
177  }
178
179  // Deletes a `Chunk`.
180  rpc DeleteChunk(DeleteChunkRequest) returns (google.protobuf.Empty) {
181    option (google.api.http) = {
182      delete: "/v1beta/{name=corpora/*/documents/*/chunks/*}"
183    };
184    option (google.api.method_signature) = "name";
185  }
186
187  // Batch delete `Chunk`s.
188  rpc BatchDeleteChunks(BatchDeleteChunksRequest)
189      returns (google.protobuf.Empty) {
190    option (google.api.http) = {
191      post: "/v1beta/{parent=corpora/*/documents/*}/chunks:batchDelete"
192      body: "*"
193    };
194  }
195
196  // Lists all `Chunk`s in a `Document`.
197  rpc ListChunks(ListChunksRequest) returns (ListChunksResponse) {
198    option (google.api.http) = {
199      get: "/v1beta/{parent=corpora/*/documents/*}/chunks"
200    };
201    option (google.api.method_signature) = "parent";
202  }
203}
204
205// Request to create a `Corpus`.
206message CreateCorpusRequest {
207  // Required. The `Corpus` to create.
208  Corpus corpus = 1 [(google.api.field_behavior) = REQUIRED];
209}
210
211// Request for getting information about a specific `Corpus`.
212message GetCorpusRequest {
213  // Required. The name of the `Corpus`.
214  // Example: `corpora/my-corpus-123`
215  string name = 1 [
216    (google.api.field_behavior) = REQUIRED,
217    (google.api.resource_reference) = {
218      type: "generativelanguage.googleapis.com/Corpus"
219    }
220  ];
221}
222
223// Request to update a `Corpus`.
224message UpdateCorpusRequest {
225  // Required. The `Corpus` to update.
226  Corpus corpus = 1 [(google.api.field_behavior) = REQUIRED];
227
228  // Required. The list of fields to update.
229  // Currently, this only supports updating `display_name`.
230  google.protobuf.FieldMask update_mask = 2
231      [(google.api.field_behavior) = REQUIRED];
232}
233
234// Request to delete a `Corpus`.
235message DeleteCorpusRequest {
236  // Required. The resource name of the `Corpus`.
237  // Example: `corpora/my-corpus-123`
238  string name = 1 [
239    (google.api.field_behavior) = REQUIRED,
240    (google.api.resource_reference) = {
241      type: "generativelanguage.googleapis.com/Corpus"
242    }
243  ];
244
245  // Optional. If set to true, any `Document`s and objects related to this
246  // `Corpus` will also be deleted.
247  //
248  // If false (the default), a `FAILED_PRECONDITION` error will be returned if
249  // `Corpus` contains any `Document`s.
250  bool force = 2 [(google.api.field_behavior) = OPTIONAL];
251}
252
253// Request for listing `Corpora`.
254message ListCorporaRequest {
255  // Optional. The maximum number of `Corpora` to return (per page).
256  // The service may return fewer `Corpora`.
257  //
258  // If unspecified, at most 10 `Corpora` will be returned.
259  // The maximum size limit is 20 `Corpora` per page.
260  int32 page_size = 1 [(google.api.field_behavior) = OPTIONAL];
261
262  // Optional. A page token, received from a previous `ListCorpora` call.
263  //
264  // Provide the `next_page_token` returned in the response as an argument to
265  // the next request to retrieve the next page.
266  //
267  // When paginating, all other parameters provided to `ListCorpora`
268  // must match the call that provided the page token.
269  string page_token = 2 [(google.api.field_behavior) = OPTIONAL];
270}
271
272// Response from `ListCorpora` containing a paginated list of `Corpora`.
273// The results are sorted by ascending `corpus.create_time`.
274message ListCorporaResponse {
275  // The returned corpora.
276  repeated Corpus corpora = 1;
277
278  // A token, which can be sent as `page_token` to retrieve the next page.
279  // If this field is omitted, there are no more pages.
280  string next_page_token = 2;
281}
282
283// Request for querying a `Corpus`.
284message QueryCorpusRequest {
285  // Required. The name of the `Corpus` to query.
286  // Example: `corpora/my-corpus-123`
287  string name = 1 [
288    (google.api.field_behavior) = REQUIRED,
289    (google.api.resource_reference) = {
290      type: "generativelanguage.googleapis.com/Corpus"
291    }
292  ];
293
294  // Required. Query string to perform semantic search.
295  string query = 2 [(google.api.field_behavior) = REQUIRED];
296
297  // Optional. Filter for `Chunk` and `Document` metadata. Each `MetadataFilter`
298  // object should correspond to a unique key. Multiple `MetadataFilter` objects
299  // are joined by logical "AND"s.
300  //
301  // Example query at document level:
302  // (year >= 2020 OR year < 2010) AND (genre = drama OR genre = action)
303  //
304  // `MetadataFilter` object list:
305  //  metadata_filters = [
306  //  {key = "document.custom_metadata.year"
307  //   conditions = [{int_value = 2020, operation = GREATER_EQUAL},
308  //                 {int_value = 2010, operation = LESS}]},
309  //  {key = "document.custom_metadata.year"
310  //   conditions = [{int_value = 2020, operation = GREATER_EQUAL},
311  //                 {int_value = 2010, operation = LESS}]},
312  //  {key = "document.custom_metadata.genre"
313  //   conditions = [{string_value = "drama", operation = EQUAL},
314  //                 {string_value = "action", operation = EQUAL}]}]
315  //
316  // Example query at chunk level for a numeric range of values:
317  // (year > 2015 AND year <= 2020)
318  //
319  // `MetadataFilter` object list:
320  //  metadata_filters = [
321  //  {key = "chunk.custom_metadata.year"
322  //   conditions = [{int_value = 2015, operation = GREATER}]},
323  //  {key = "chunk.custom_metadata.year"
324  //   conditions = [{int_value = 2020, operation = LESS_EQUAL}]}]
325  //
326  // Note: "AND"s for the same key are only supported for numeric values. String
327  // values only support "OR"s for the same key.
328  repeated MetadataFilter metadata_filters = 3
329      [(google.api.field_behavior) = OPTIONAL];
330
331  // Optional. The maximum number of `Chunk`s to return.
332  // The service may return fewer `Chunk`s.
333  //
334  // If unspecified, at most 10 `Chunk`s will be returned.
335  // The maximum specified result count is 100.
336  int32 results_count = 4 [(google.api.field_behavior) = OPTIONAL];
337}
338
339// Response from `QueryCorpus` containing a list of relevant chunks.
340message QueryCorpusResponse {
341  // The relevant chunks.
342  repeated RelevantChunk relevant_chunks = 1;
343}
344
345// The information for a chunk relevant to a query.
346message RelevantChunk {
347  // `Chunk` relevance to the query.
348  float chunk_relevance_score = 1;
349
350  // `Chunk` associated with the query.
351  Chunk chunk = 2;
352}
353
354// Request to create a `Document`.
355message CreateDocumentRequest {
356  // Required. The name of the `Corpus` where this `Document` will be created.
357  // Example: `corpora/my-corpus-123`
358  string parent = 1 [
359    (google.api.field_behavior) = REQUIRED,
360    (google.api.resource_reference) = {
361      child_type: "generativelanguage.googleapis.com/Document"
362    }
363  ];
364
365  // Required. The `Document` to create.
366  Document document = 2 [(google.api.field_behavior) = REQUIRED];
367}
368
369// Request for getting information about a specific `Document`.
370message GetDocumentRequest {
371  // Required. The name of the `Document` to retrieve.
372  // Example: `corpora/my-corpus-123/documents/the-doc-abc`
373  string name = 1 [
374    (google.api.field_behavior) = REQUIRED,
375    (google.api.resource_reference) = {
376      type: "generativelanguage.googleapis.com/Document"
377    }
378  ];
379}
380
381// Request to update a `Document`.
382message UpdateDocumentRequest {
383  // Required. The `Document` to update.
384  Document document = 1 [(google.api.field_behavior) = REQUIRED];
385
386  // Required. The list of fields to update.
387  // Currently, this only supports updating `display_name` and
388  // `custom_metadata`.
389  google.protobuf.FieldMask update_mask = 2
390      [(google.api.field_behavior) = REQUIRED];
391}
392
393// Request to delete a `Document`.
394message DeleteDocumentRequest {
395  // Required. The resource name of the `Document` to delete.
396  // Example: `corpora/my-corpus-123/documents/the-doc-abc`
397  string name = 1 [
398    (google.api.field_behavior) = REQUIRED,
399    (google.api.resource_reference) = {
400      type: "generativelanguage.googleapis.com/Document"
401    }
402  ];
403
404  // Optional. If set to true, any `Chunk`s and objects related to this
405  // `Document` will also be deleted.
406  //
407  // If false (the default), a `FAILED_PRECONDITION` error will be returned if
408  // `Document` contains any `Chunk`s.
409  bool force = 2 [(google.api.field_behavior) = OPTIONAL];
410}
411
412// Request for listing `Document`s.
413message ListDocumentsRequest {
414  // Required. The name of the `Corpus` containing `Document`s.
415  // Example: `corpora/my-corpus-123`
416  string parent = 1 [
417    (google.api.field_behavior) = REQUIRED,
418    (google.api.resource_reference) = {
419      child_type: "generativelanguage.googleapis.com/Document"
420    }
421  ];
422
423  // Optional. The maximum number of `Document`s to return (per page).
424  // The service may return fewer `Document`s.
425  //
426  // If unspecified, at most 10 `Document`s will be returned.
427  // The maximum size limit is 20 `Document`s per page.
428  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
429
430  // Optional. A page token, received from a previous `ListDocuments` call.
431  //
432  // Provide the `next_page_token` returned in the response as an argument to
433  // the next request to retrieve the next page.
434  //
435  // When paginating, all other parameters provided to `ListDocuments`
436  // must match the call that provided the page token.
437  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
438}
439
440// Response from `ListDocuments` containing a paginated list of `Document`s.
441// The `Document`s are sorted by ascending `document.create_time`.
442message ListDocumentsResponse {
443  // The returned `Document`s.
444  repeated Document documents = 1;
445
446  // A token, which can be sent as `page_token` to retrieve the next page.
447  // If this field is omitted, there are no more pages.
448  string next_page_token = 2;
449}
450
451// Request for querying a `Document`.
452message QueryDocumentRequest {
453  // Required. The name of the `Document` to query.
454  // Example: `corpora/my-corpus-123/documents/the-doc-abc`
455  string name = 1 [
456    (google.api.field_behavior) = REQUIRED,
457    (google.api.resource_reference) = {
458      type: "generativelanguage.googleapis.com/Document"
459    }
460  ];
461
462  // Required. Query string to perform semantic search.
463  string query = 2 [(google.api.field_behavior) = REQUIRED];
464
465  // Optional. The maximum number of `Chunk`s to return.
466  // The service may return fewer `Chunk`s.
467  //
468  // If unspecified, at most 10 `Chunk`s will be returned.
469  // The maximum specified result count is 100.
470  int32 results_count = 3 [(google.api.field_behavior) = OPTIONAL];
471
472  // Optional. Filter for `Chunk` metadata. Each `MetadataFilter` object should
473  // correspond to a unique key. Multiple `MetadataFilter` objects are joined by
474  // logical "AND"s.
475  //
476  // Note: `Document`-level filtering is not supported for this request because
477  // a `Document` name is already specified.
478  //
479  // Example query:
480  // (year >= 2020 OR year < 2010) AND (genre = drama OR genre = action)
481  //
482  // `MetadataFilter` object list:
483  //  metadata_filters = [
484  //  {key = "chunk.custom_metadata.year"
485  //   conditions = [{int_value = 2020, operation = GREATER_EQUAL},
486  //                 {int_value = 2010, operation = LESS}},
487  //  {key = "chunk.custom_metadata.genre"
488  //   conditions = [{string_value = "drama", operation = EQUAL},
489  //                 {string_value = "action", operation = EQUAL}}]
490  //
491  // Example query for a numeric range of values:
492  // (year > 2015 AND year <= 2020)
493  //
494  // `MetadataFilter` object list:
495  //  metadata_filters = [
496  //  {key = "chunk.custom_metadata.year"
497  //   conditions = [{int_value = 2015, operation = GREATER}]},
498  //  {key = "chunk.custom_metadata.year"
499  //   conditions = [{int_value = 2020, operation = LESS_EQUAL}]}]
500  //
501  // Note: "AND"s for the same key are only supported for numeric values. String
502  // values only support "OR"s for the same key.
503  repeated MetadataFilter metadata_filters = 4
504      [(google.api.field_behavior) = OPTIONAL];
505}
506
507// Response from `QueryDocument` containing a list of relevant chunks.
508message QueryDocumentResponse {
509  // The returned relevant chunks.
510  repeated RelevantChunk relevant_chunks = 1;
511}
512
513// Request to create a `Chunk`.
514message CreateChunkRequest {
515  // Required. The name of the `Document` where this `Chunk` will be created.
516  // Example: `corpora/my-corpus-123/documents/the-doc-abc`
517  string parent = 1 [
518    (google.api.field_behavior) = REQUIRED,
519    (google.api.resource_reference) = {
520      child_type: "generativelanguage.googleapis.com/Chunk"
521    }
522  ];
523
524  // Required. The `Chunk` to create.
525  Chunk chunk = 2 [(google.api.field_behavior) = REQUIRED];
526}
527
528// Request to batch create `Chunk`s.
529message BatchCreateChunksRequest {
530  // Optional. The name of the `Document` where this batch of `Chunk`s will be
531  // created. The parent field in every `CreateChunkRequest` must match this
532  // value. Example: `corpora/my-corpus-123/documents/the-doc-abc`
533  string parent = 1 [
534    (google.api.field_behavior) = OPTIONAL,
535    (google.api.resource_reference) = {
536      child_type: "generativelanguage.googleapis.com/Chunk"
537    }
538  ];
539
540  // Required. The request messages specifying the `Chunk`s to create.
541  // A maximum of 100 `Chunk`s can be created in a batch.
542  repeated CreateChunkRequest requests = 2
543      [(google.api.field_behavior) = REQUIRED];
544}
545
546// Response from `BatchCreateChunks` containing a list of created `Chunk`s.
547message BatchCreateChunksResponse {
548  // `Chunk`s created.
549  repeated Chunk chunks = 1;
550}
551
552// Request for getting information about a specific `Chunk`.
553message GetChunkRequest {
554  // Required. The name of the `Chunk` to retrieve.
555  // Example: `corpora/my-corpus-123/documents/the-doc-abc/chunks/some-chunk`
556  string name = 1 [
557    (google.api.field_behavior) = REQUIRED,
558    (google.api.resource_reference) = {
559      type: "generativelanguage.googleapis.com/Chunk"
560    }
561  ];
562}
563
564// Request to update a `Chunk`.
565message UpdateChunkRequest {
566  // Required. The `Chunk` to update.
567  Chunk chunk = 1 [(google.api.field_behavior) = REQUIRED];
568
569  // Required. The list of fields to update.
570  // Currently, this only supports updating `custom_metadata` and `data`.
571  google.protobuf.FieldMask update_mask = 2
572      [(google.api.field_behavior) = REQUIRED];
573}
574
575// Request to batch update `Chunk`s.
576message BatchUpdateChunksRequest {
577  // Optional. The name of the `Document` containing the `Chunk`s to update.
578  // The parent field in every `UpdateChunkRequest` must match this value.
579  // Example: `corpora/my-corpus-123/documents/the-doc-abc`
580  string parent = 1 [
581    (google.api.field_behavior) = OPTIONAL,
582    (google.api.resource_reference) = {
583      child_type: "generativelanguage.googleapis.com/Chunk"
584    }
585  ];
586
587  // Required. The request messages specifying the `Chunk`s to update.
588  // A maximum of 100 `Chunk`s can be updated in a batch.
589  repeated UpdateChunkRequest requests = 2
590      [(google.api.field_behavior) = REQUIRED];
591}
592
593// Response from `BatchUpdateChunks` containing a list of updated `Chunk`s.
594message BatchUpdateChunksResponse {
595  // `Chunk`s updated.
596  repeated Chunk chunks = 1;
597}
598
599// Request to delete a `Chunk`.
600message DeleteChunkRequest {
601  // Required. The resource name of the `Chunk` to delete.
602  // Example: `corpora/my-corpus-123/documents/the-doc-abc/chunks/some-chunk`
603  string name = 1 [
604    (google.api.field_behavior) = REQUIRED,
605    (google.api.resource_reference) = {
606      type: "generativelanguage.googleapis.com/Chunk"
607    }
608  ];
609}
610
611// Request to batch delete `Chunk`s.
612message BatchDeleteChunksRequest {
613  // Optional. The name of the `Document` containing the `Chunk`s to delete.
614  // The parent field in every `DeleteChunkRequest` must match this value.
615  // Example: `corpora/my-corpus-123/documents/the-doc-abc`
616  string parent = 1 [
617    (google.api.field_behavior) = OPTIONAL,
618    (google.api.resource_reference) = {
619      child_type: "generativelanguage.googleapis.com/Chunk"
620    }
621  ];
622
623  // Required. The request messages specifying the `Chunk`s to delete.
624  repeated DeleteChunkRequest requests = 2
625      [(google.api.field_behavior) = REQUIRED];
626}
627
628// Request for listing `Chunk`s.
629message ListChunksRequest {
630  // Required. The name of the `Document` containing `Chunk`s.
631  // Example: `corpora/my-corpus-123/documents/the-doc-abc`
632  string parent = 1 [
633    (google.api.field_behavior) = REQUIRED,
634    (google.api.resource_reference) = {
635      child_type: "generativelanguage.googleapis.com/Chunk"
636    }
637  ];
638
639  // Optional. The maximum number of `Chunk`s to return (per page).
640  // The service may return fewer `Chunk`s.
641  //
642  // If unspecified, at most 10 `Chunk`s will be returned.
643  // The maximum size limit is 100 `Chunk`s per page.
644  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
645
646  // Optional. A page token, received from a previous `ListChunks` call.
647  //
648  // Provide the `next_page_token` returned in the response as an argument to
649  // the next request to retrieve the next page.
650  //
651  // When paginating, all other parameters provided to `ListChunks`
652  // must match the call that provided the page token.
653  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
654}
655
656// Response from `ListChunks` containing a paginated list of `Chunk`s.
657// The `Chunk`s are sorted by ascending `chunk.create_time`.
658message ListChunksResponse {
659  // The returned `Chunk`s.
660  repeated Chunk chunks = 1;
661
662  // A token, which can be sent as `page_token` to retrieve the next page.
663  // If this field is omitted, there are no more pages.
664  string next_page_token = 2;
665}
666