use dynamo_runtime::protocols::annotated::AnnotationsProvider;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use validator::Validate;
mod aggregator;
mod nvext;
pub use nvext::{NvExt, NvExtProvider};
#[derive(ToSchema, Serialize, Deserialize, Validate, Debug, Clone)]
pub struct NvCreateEmbeddingRequest {
#[serde(flatten)]
#[schema(value_type = Object)]
pub inner: dynamo_protocols::types::CreateEmbeddingRequest,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncate_prompt_tokens: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nvext: Option<NvExt>,
}
#[derive(ToSchema, Serialize, Deserialize, Validate, Debug, Clone)]
pub struct NvCreateEmbeddingResponse {
#[serde(flatten)]
#[schema(value_type = Object)]
pub inner: dynamo_protocols::types::CreateEmbeddingResponse,
}
impl NvCreateEmbeddingResponse {
pub fn empty() -> Self {
Self {
inner: dynamo_protocols::types::CreateEmbeddingResponse {
object: "list".to_string(),
model: "embedding".to_string(),
data: vec![],
usage: dynamo_protocols::types::EmbeddingUsage {
prompt_tokens: 0,
total_tokens: 0,
},
},
}
}
}
impl NvExtProvider for NvCreateEmbeddingRequest {
fn nvext(&self) -> Option<&NvExt> {
self.nvext.as_ref()
}
}
impl AnnotationsProvider for NvCreateEmbeddingRequest {
fn annotations(&self) -> Option<Vec<String>> {
self.nvext
.as_ref()
.and_then(|nvext| nvext.annotations.clone())
}
fn has_annotation(&self, annotation: &str) -> bool {
self.nvext
.as_ref()
.and_then(|nvext| nvext.annotations.as_ref())
.map(|annotations| annotations.contains(&annotation.to_string()))
.unwrap_or(false)
}
}
#[cfg(test)]
mod tests {
use super::NvCreateEmbeddingRequest;
use serde_json::json;
#[test]
fn truncate_prompt_tokens_round_trips() {
for truncate_prompt_tokens in [2048, -1] {
let request: NvCreateEmbeddingRequest = serde_json::from_value(json!({
"model": "test-model",
"input": "hello",
"truncate_prompt_tokens": truncate_prompt_tokens
}))
.unwrap();
assert_eq!(request.truncate_prompt_tokens, Some(truncate_prompt_tokens));
let value = serde_json::to_value(request).unwrap();
assert_eq!(value["truncate_prompt_tokens"], truncate_prompt_tokens);
}
}
#[test]
fn omitted_truncate_prompt_tokens_is_not_serialized() {
let request: NvCreateEmbeddingRequest = serde_json::from_value(json!({
"model": "test-model",
"input": "hello"
}))
.unwrap();
assert_eq!(request.truncate_prompt_tokens, None);
let value = serde_json::to_value(request).unwrap();
assert!(value.get("truncate_prompt_tokens").is_none());
}
}