From 5cd67f38d623ddfbecbb5192aeadfbfb8cb401c9 Mon Sep 17 00:00:00 2001 From: Yujong Lee Date: Sat, 12 Sep 2026 10:16:42 -0700 Subject: [PATCH] fix(ocr): normalize DeepSeek document content --- .../src/ocr/codecs/deepseek/transformation.rs | 6 ++++- .../crates/core/tests/deepseek_ocr.rs | 22 +++++++++++++++++++ .../core/tests/vertex_ai_deepseek_ocr.rs | 2 +- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/litellm-rust/crates/core/src/ocr/codecs/deepseek/transformation.rs b/litellm-rust/crates/core/src/ocr/codecs/deepseek/transformation.rs index 98cfc0db78d..c3a341a2921 100644 --- a/litellm-rust/crates/core/src/ocr/codecs/deepseek/transformation.rs +++ b/litellm-rust/crates/core/src/ocr/codecs/deepseek/transformation.rs @@ -14,11 +14,15 @@ pub(crate) fn transform_ocr_request( if document.source().is_empty() { return Err(OcrRequestError::MissingField("document URL")); } + let content = OcrDocument::ImageUrl { + image_url: document.source().to_string(), + extra_fields: serde_json::Map::new(), + }; Ok(DeepSeekOcrRequest { model: provider_model.to_string(), messages: vec![DeepSeekOcrMessage { role: UserRole::User, - content: vec![document], + content: vec![content], }], params: params.clone(), }) diff --git a/litellm-rust/crates/core/tests/deepseek_ocr.rs b/litellm-rust/crates/core/tests/deepseek_ocr.rs index 875fc9e3dc6..4ba39561dcd 100644 --- a/litellm-rust/crates/core/tests/deepseek_ocr.rs +++ b/litellm-rust/crates/core/tests/deepseek_ocr.rs @@ -34,6 +34,28 @@ fn request_mapping_matches_python(#[case] name: &str, #[case] value: Value) { assert!(result.get("ignored").is_none()); } +#[rstest] +#[case(json!({"type":"image_url","image_url":"data:image/png;base64,AA=="}))] +#[case(json!({"type":"document_url","document_url":"data:application/pdf;base64,AA=="}))] +fn request_maps_both_document_types_to_image_content(#[case] document: Value) { + let source = document + .get("image_url") + .or_else(|| document.get("document_url")) + .unwrap() + .clone(); + let request = transform_ocr_request( + "deepseek-ai/deepseek-ocr-maas", + serde_json::from_value(document).unwrap(), + &DeepSeekOcrParams::default(), + ) + .unwrap(); + let result = serde_json::to_value(request).unwrap(); + assert_eq!( + result["messages"][0]["content"][0], + json!({"type":"image_url","image_url":source}) + ); +} + #[rstest] #[case(json!("# hello"), "# hello")] #[case(json!("{broken"), "{broken")] diff --git a/litellm-rust/crates/core/tests/vertex_ai_deepseek_ocr.rs b/litellm-rust/crates/core/tests/vertex_ai_deepseek_ocr.rs index 6d3061d8f5d..676799eb2fe 100644 --- a/litellm-rust/crates/core/tests/vertex_ai_deepseek_ocr.rs +++ b/litellm-rust/crates/core/tests/vertex_ai_deepseek_ocr.rs @@ -49,7 +49,7 @@ async fn facade_executes_vertex_deepseek_at_the_openai_endpoint() { assert!(body.get("extra_body").is_none()); assert_eq!( body["messages"][0]["content"][0], - json!({"type":"document_url","document_url":"gs://bucket/document.pdf"}) + json!({"type":"image_url","image_url":"gs://bucket/document.pdf"}) ); }