#[path = "../common/mod.rs"]
mod common;
use brain_db_sdk::new_id;
use brain_db_sdk::wire::types::{EncodeVectorDirectRequest, MemoryKindWire};
use brain_db_sdk::EncodeBuilder;
#[tokio::test]
async fn encode_vector_direct_round_trips() {
let Some(it) = common::It::from_env() else {
return common::skip("encode_vector_direct_round_trips");
};
let (client, _agent) = it.connect_fresh().await;
let probe = client
.encode(&EncodeBuilder::new("fingerprint probe").build())
.await
.expect("probe encode");
let fingerprint = probe.embedding_model_fp;
let dim = 384usize;
#[allow(clippy::cast_precision_loss)] let v = (1.0f32 / (dim as f32).sqrt()).max(f32::MIN_POSITIVE);
let vector = vec![v; dim];
let req = EncodeVectorDirectRequest {
text: "A memory written with a client-supplied vector.".to_string(),
vector,
model_fingerprint: fingerprint,
session_id: 0,
kind: MemoryKindWire::Episodic,
salience_hint: 0.5,
edges: vec![],
request_id: new_id(),
txn_id: None,
deduplicate: false,
};
let resp = client
.encode_vector_direct(&req)
.await
.expect("encode_vector_direct");
assert!(resp.lsn > 0, "direct-vector encode assigns a durable LSN");
client.close().await.expect("close");
}
const DIM: usize = 384;
fn unit_vector(dim: usize) -> Vec<f32> {
{
#[allow(clippy::cast_precision_loss)] let inv = 1.0f32 / (dim as f32).sqrt();
vec![inv; dim]
}
}
fn request(fingerprint: [u8; 16], vector: Vec<f32>, label: &str) -> EncodeVectorDirectRequest {
EncodeVectorDirectRequest {
text: format!("{label} {}", uuid_like()),
vector,
model_fingerprint: fingerprint,
session_id: 0,
kind: MemoryKindWire::Episodic,
salience_hint: 0.5,
edges: vec![],
request_id: new_id(),
txn_id: None,
deduplicate: false,
}
}
fn uuid_like() -> String {
new_id().iter().fold(String::with_capacity(32), |mut s, b| {
use std::fmt::Write as _;
let _ = write!(s, "{b:02x}");
s
})
}
async fn fingerprint_of(client: &brain_db_sdk::BrainClient) -> [u8; 16] {
client
.encode(&EncodeBuilder::new("fingerprint probe").build())
.await
.expect("probe encode")
.embedding_model_fp
}
#[tokio::test]
async fn a_wrong_length_vector_is_rejected() {
let Some(it) = common::It::from_env() else {
return common::skip("a_wrong_length_vector_is_rejected");
};
let (client, _agent) = it.connect_fresh().await;
let fp = fingerprint_of(&client).await;
for dim in [DIM - 1, DIM + 1, 8] {
let err = client
.encode_vector_direct(&request(fp, unit_vector(dim), "dim"))
.await
.expect_err("a wrong-length vector must be refused");
assert!(
format!("{err}").contains("dimension"),
"expected a dimension complaint for {dim} floats, got: {err}"
);
}
client.close().await.expect("close");
}
#[tokio::test]
async fn a_byte_swapped_vector_is_rejected() {
let Some(it) = common::It::from_env() else {
return common::skip("a_byte_swapped_vector_is_rejected");
};
let (client, _agent) = it.connect_fresh().await;
let fp = fingerprint_of(&client).await;
let swapped: Vec<f32> = unit_vector(DIM)
.into_iter()
.map(|x| f32::from_le_bytes(x.to_be_bytes()))
.collect();
let err = client
.encode_vector_direct(&request(fp, swapped, "byte-swapped"))
.await
.expect_err("a mis-ordered vector must be refused");
assert!(
format!("{err}").contains("vector"),
"expected the server to reject a mis-ordered vector, got: {err}"
);
client.close().await.expect("close");
}
#[tokio::test]
async fn a_wrong_model_fingerprint_is_rejected() {
let Some(it) = common::It::from_env() else {
return common::skip("a_wrong_model_fingerprint_is_rejected");
};
let (client, _agent) = it.connect_fresh().await;
let err = client
.encode_vector_direct(&request([0u8; 16], unit_vector(DIM), "wrong fingerprint"))
.await
.expect_err("a foreign fingerprint must be refused");
assert!(
format!("{err}").contains("fingerprint"),
"expected a fingerprint complaint, got: {err}"
);
client.close().await.expect("close");
}