Files
seaweedfs/weed/pb/vector.proto
T
Chris LuandDevin d771a91571 vector: VectorService gRPC contract (P1) (#12101)
* vector: VectorService protobuf contract

The shared RPC boundary between the Go S3 gateway and the Rust vector
engine from the vector design doc: CreateIndex/DropIndex, Put/Get/
List/Delete/Query vectors. A Table reference carries the Lance table id
and an optional pinned version, matching the snapshot discipline queries
are required to keep.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* vector: generated Go stubs for vector.proto

protoc output via weed/pb/Makefile.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* vector: carry return_data through QueryVectors

S3 Vectors QueryVectors honours returnData, but the contract had no
way to ask for or carry vector data in a query response, so the
gateway would need a second GetVectors round-trip per query. Add
return_data to the request and data to QueryResult now, while the
contract is still new.

* vector: pin metadata numbers to double precision in the contract

Metadata arrives as JSON, where numbers carry double precision; say
so on the field so neither side promises integer fidelity past 2^53.

* vector: clarify the query filter is raw Lance SQL over one metadata column

The doc said 'metadata columns' but the table stores all metadata in a
single JSON column named metadata; the gateway translates S3 Vectors
filter expressions onto it.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-26 13:26:11 -07:00

128 lines
3.0 KiB
Protocol Buffer

syntax = "proto3";
package vector_pb;
option go_package = "github.com/seaweedfs/seaweedfs/weed/pb/vector_pb";
import "google/protobuf/struct.proto";
// The shared contract between the Go S3 gateway and the vector query engine.
// The public S3 Vectors API stays an AWS contract; this RPC is the internal
// boundary the design doc gives both editions.
service VectorService {
rpc CreateIndex(CreateIndexRequest) returns (CreateIndexResponse);
rpc DropIndex(DropIndexRequest) returns (DropIndexResponse);
rpc PutVectors(PutVectorsRequest) returns (PutVectorsResponse);
rpc GetVectors(GetVectorsRequest) returns (GetVectorsResponse);
rpc DeleteVectors(DeleteVectorsRequest) returns (DeleteVectorsResponse);
rpc ListVectors(ListVectorsRequest) returns (ListVectorsResponse);
rpc QueryVectors(QueryVectorsRequest) returns (QueryVectorsResponse);
}
enum DistanceMetric {
DISTANCE_METRIC_UNSPECIFIED = 0;
L2 = 1;
COSINE = 2;
DOT_PRODUCT = 3;
}
// Table addresses a Lance table through the namespace: the id parts as the
// namespace catalog joins them.
message Table {
repeated string id = 1;
// Dataset version to pin reads to; 0 means latest.
uint64 version = 2;
}
message CreateIndexRequest {
Table table = 1;
uint32 dimension = 2;
DistanceMetric distance_metric = 3;
repeated string non_filterable_metadata_keys = 4;
}
message CreateIndexResponse {
uint64 version = 1;
}
message DropIndexRequest {
Table table = 1;
}
message DropIndexResponse {}
message Vector {
string key = 1;
repeated float data = 2;
// JSON-typed metadata: numbers carry double precision, as on the wire.
google.protobuf.Struct metadata = 3;
}
message PutVectorsRequest {
Table table = 1;
repeated Vector vectors = 2;
}
message PutVectorsResponse {
uint64 version = 1;
}
message GetVectorsRequest {
Table table = 1;
repeated string keys = 2;
bool return_data = 3;
bool return_metadata = 4;
}
message GetVectorsResponse {
repeated Vector vectors = 1;
}
message DeleteVectorsRequest {
Table table = 1;
repeated string keys = 2;
}
message DeleteVectorsResponse {
uint64 version = 1;
}
message ListVectorsRequest {
Table table = 1;
uint32 max_results = 2;
string next_token = 3;
bool return_data = 4;
bool return_metadata = 5;
}
message ListVectorsResponse {
repeated Vector vectors = 1;
string next_token = 2;
}
message QueryVectorsRequest {
Table table = 1;
repeated float query_vector = 2;
uint32 top_k = 3;
// Lance SQL filter; empty means unfiltered. Metadata is one JSON
// `metadata` column, so the gateway translates S3 Vectors filter
// expressions onto it before they land here.
string filter = 4;
// Lance's post-filter escape hatch; off prefilters, matching S3 Vectors.
bool postfilter = 5;
bool return_metadata = 6;
bool return_distance = 7;
bool return_data = 8;
}
message QueryResult {
string key = 1;
float distance = 2;
google.protobuf.Struct metadata = 3;
repeated float data = 4;
}
message QueryVectorsResponse {
repeated QueryResult vectors = 1;
}