Skip to content

Commit 2c1a0dc

Browse files
committed
Create a new embedding by PUT
Follow the unusual patter from PUT /collections/:collection_name: objects are created by PUT /place/<name> Instead of POST /collections/:collection_name/insert, use PUT /collections/:collection_name/embeddings/:embedding_id.
1 parent 34a805b commit 2c1a0dc

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

src/db.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,15 @@ pub enum Error {
3434

3535
#[derive(Debug, serde::Serialize, serde::Deserialize)]
3636
pub struct Db {
37+
/// Collections in the database
3738
pub collections: HashMap<String, Collection>,
3839
}
3940

4041
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, JsonSchema)]
4142
pub struct SimilarityResult {
43+
/// Similarity score
4244
score: f32,
45+
/// Matching embedding
4346
embedding: Embedding,
4447
}
4548

@@ -197,8 +200,11 @@ fn match_embedding(embedding: &Embedding, filter: &[HashMap<String, String>]) ->
197200

198201
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, JsonSchema)]
199202
pub struct Embedding {
203+
/// Unique identifier
200204
pub id: String,
205+
/// Vector computed from a text chunk
201206
pub vector: Vec<f32>,
207+
/// Metadata about the source text
202208
pub metadata: Option<HashMap<String, String>>,
203209
}
204210

src/routes/collection.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ pub fn handler() -> ApiRouter {
2525
.api_route("/:collection_name", post(query_collection))
2626
.api_route("/:collection_name", get(get_collection_info))
2727
.api_route("/:collection_name", delete(delete_collection))
28-
.api_route("/:collection_name/insert", post(insert_into_collection))
2928
.api_route("/:collection_name/embeddings", get(get_embeddings))
3029
.api_route("/:collection_name/embeddings", post(query_embeddings))
3130
.api_route("/:collection_name/embeddings", delete(delete_embeddings))
31+
.api_route("/:collection_name/embeddings/:embedding_id", put(insert_into_collection))
3232
.api_route("/:collection_name/embeddings/:embedding_id", get(get_embedding))
3333
.api_route("/:collection_name/embeddings/:embedding_id", delete(delete_embedding)),
3434
)
@@ -162,16 +162,29 @@ async fn delete_collection(
162162
}
163163
}
164164

165+
#[derive(Debug, serde::Deserialize, JsonSchema)]
166+
struct EmbeddingData {
167+
/// Vector computed from a text chunk
168+
vector: Vec<f32>,
169+
/// Metadata about the source text
170+
metadata: Option<HashMap<String, String>>,
171+
}
172+
165173
/// Insert a vector into a collection
166174
async fn insert_into_collection(
167-
Path(collection_name): Path<String>,
175+
Path((collection_name, embedding_id)): Path<(String, String)>,
168176
Extension(db): DbExtension,
169-
Json(embedding): Json<Embedding>,
177+
Json(embedding_data): Json<EmbeddingData>,
170178
) -> Result<StatusCode, HTTPError> {
171179
tracing::trace!("Inserting into collection {collection_name}");
172180

173181
let mut db = db.write().await;
174182

183+
let embedding = Embedding {
184+
id: embedding_id,
185+
vector: embedding_data.vector,
186+
metadata: embedding_data.metadata,
187+
};
175188
let insert_result = db.insert_into_collection(&collection_name, embedding);
176189
drop(db);
177190

@@ -263,10 +276,6 @@ async fn get_embedding(
263276
) -> Result<Json<Embedding>, HTTPError> {
264277
tracing::trace!("Getting {embedding_id} from collection {collection_name}");
265278

266-
if embedding_id.len() == 0 {
267-
return Err(HTTPError::new("Embedding identifier empty").with_status(StatusCode::BAD_REQUEST));
268-
}
269-
270279
let db = db.read().await;
271280
let collection = db
272281
.get_collection(&collection_name)

0 commit comments

Comments
 (0)