mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-10-27 23:40:41 +01:00
* 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>
128 lines
3.0 KiB
Protocol Buffer
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;
|
|
}
|