mirror of
				https://github.com/meilisearch/meilisearch.git
				synced 2025-10-31 07:56:28 +00:00 
			
		
		
		
	Merge #5153
5153: Return docid in case of errors while rendering the document template r=Kerollmops a=dureuill
Improves error message:
Before: 
```
ERROR index_scheduler: Batch failed Index `mieli`: user error: missing field in document: liquid: Unknown index
  with:
    variable=doc
    requested index=title
    available indexes=by, id, kids, parent, text, time, type
```
After:
```
ERROR index_scheduler: Batch failed Index `mieli`: user error: missing field in document `11345147`: liquid: Unknown index
  with:
    variable=doc
    requested index=title
    available indexes=by, id, kids, parent, text, time, type
```
Co-authored-by: Louis Dureuil <louis@meilisearch.com>
			
			
This commit is contained in:
		| @@ -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<RenderPromptError> for crate::Error { | ||||
|   | ||||
| @@ -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<GlobalFieldsIdsMap>, | ||||
|         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")) | ||||
|     } | ||||
|   | ||||
| @@ -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, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user