diff --git a/crates/milli/src/prompt/error.rs b/crates/milli/src/prompt/error.rs index 8a762b60a..a92e2fdc3 100644 --- a/crates/milli/src/prompt/error.rs +++ b/crates/milli/src/prompt/error.rs @@ -38,6 +38,16 @@ pub struct RenderPromptError { pub fault: FaultSource, } impl RenderPromptError { + pub(crate) fn missing_context_with_external_docid( + external_docid: String, + inner: liquid::Error, + ) -> RenderPromptError { + Self { + kind: RenderPromptErrorKind::MissingContextWithExternalDocid(external_docid, inner), + fault: FaultSource::User, + } + } + pub(crate) fn missing_context(inner: liquid::Error) -> RenderPromptError { Self { kind: RenderPromptErrorKind::MissingContext(inner), fault: FaultSource::User } } @@ -47,6 +57,8 @@ impl RenderPromptError { pub enum RenderPromptErrorKind { #[error("missing field in document: {0}")] MissingContext(liquid::Error), + #[error("missing field in document `{0}`: {1}")] + MissingContextWithExternalDocid(String, liquid::Error), } impl From for crate::Error { diff --git a/crates/milli/src/prompt/mod.rs b/crates/milli/src/prompt/mod.rs index bbcf054e6..3eb91611e 100644 --- a/crates/milli/src/prompt/mod.rs +++ b/crates/milli/src/prompt/mod.rs @@ -119,6 +119,7 @@ impl Prompt { 'doc: 'a, // lifetime of the allocator, will live for an entire chunk of documents >( &self, + external_docid: &str, document: impl crate::update::new::document::Document<'a> + Debug, field_id_map: &RefCell, doc_alloc: &'doc Bump, @@ -130,9 +131,12 @@ impl Prompt { self.max_bytes.unwrap_or_else(default_max_bytes).get(), doc_alloc, ); - self.template - .render_to(&mut rendered, &context) - .map_err(RenderPromptError::missing_context)?; + self.template.render_to(&mut rendered, &context).map_err(|liquid_error| { + RenderPromptError::missing_context_with_external_docid( + external_docid.to_owned(), + liquid_error, + ) + })?; Ok(std::str::from_utf8(rendered.into_bump_slice()) .expect("render can only write UTF-8 because all inputs and processing preserve utf-8")) } diff --git a/crates/milli/src/update/new/extract/vectors/mod.rs b/crates/milli/src/update/new/extract/vectors/mod.rs index 1110432fa..2a72a1650 100644 --- a/crates/milli/src/update/new/extract/vectors/mod.rs +++ b/crates/milli/src/update/new/extract/vectors/mod.rs @@ -130,6 +130,7 @@ impl<'a, 'b, 'extractor> Extractor<'extractor> for EmbeddingExtractor<'a, 'b> { ); } else if new_vectors.regenerate { let new_rendered = prompt.render_document( + update.external_document_id(), update.current( &context.rtxn, context.index, @@ -139,6 +140,7 @@ impl<'a, 'b, 'extractor> Extractor<'extractor> for EmbeddingExtractor<'a, 'b> { &context.doc_alloc, )?; let old_rendered = prompt.render_document( + update.external_document_id(), update.merged( &context.rtxn, context.index, @@ -158,6 +160,7 @@ impl<'a, 'b, 'extractor> Extractor<'extractor> for EmbeddingExtractor<'a, 'b> { } } else if old_vectors.regenerate { let old_rendered = prompt.render_document( + update.external_document_id(), update.current( &context.rtxn, context.index, @@ -167,6 +170,7 @@ impl<'a, 'b, 'extractor> Extractor<'extractor> for EmbeddingExtractor<'a, 'b> { &context.doc_alloc, )?; let new_rendered = prompt.render_document( + update.external_document_id(), update.merged( &context.rtxn, context.index, @@ -216,6 +220,7 @@ impl<'a, 'b, 'extractor> Extractor<'extractor> for EmbeddingExtractor<'a, 'b> { ); } else if new_vectors.regenerate { let rendered = prompt.render_document( + insertion.external_document_id(), insertion.inserted(), context.new_fields_ids_map, &context.doc_alloc, @@ -229,6 +234,7 @@ impl<'a, 'b, 'extractor> Extractor<'extractor> for EmbeddingExtractor<'a, 'b> { } } else { let rendered = prompt.render_document( + insertion.external_document_id(), insertion.inserted(), context.new_fields_ids_map, &context.doc_alloc,