From 265ebd5f06ad7d037fea855eae241e4ad9bda050 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Tue, 20 Oct 2026 21:22:30 +0800 Subject: [PATCH] Preserve JSON numeric bounds in strict integer schemas --- deepseek-recipe/src/protocol/json_schema.rs | 38 +++++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/deepseek-recipe/src/protocol/json_schema.rs b/deepseek-recipe/src/protocol/json_schema.rs index f00a97d..d0aa55f 100644 --- a/deepseek-recipe/src/protocol/json_schema.rs +++ b/deepseek-recipe/src/protocol/json_schema.rs @@ -103,19 +103,19 @@ pub(crate) enum JsonSchemaType { #[serde(skip_serializing_if = "Option::is_none")] description: Option, #[serde(skip_serializing_if = "Option::is_none")] - r#const: Option, + r#const: Option, #[serde(skip_serializing_if = "Option::is_none")] - default: Option, + default: Option, #[serde(skip_serializing_if = "Option::is_none")] - minimum: Option, + minimum: Option, #[serde(skip_serializing_if = "Option::is_none")] - maximum: Option, + maximum: Option, #[serde(skip_serializing_if = "Option::is_none")] - exclusive_minimum: Option, + exclusive_minimum: Option, #[serde(skip_serializing_if = "Option::is_none")] - exclusive_maximum: Option, + exclusive_maximum: Option, #[serde(skip_serializing_if = "Option::is_none")] - multiple_of: Option, + multiple_of: Option, }, #[serde(rename_all = "camelCase")] Boolean { @@ -364,3 +364,27 @@ mod tests { ); } } + +#[cfg(test)] +mod contribution_regression { + use super::*; + + #[test] + fn integer_bounds_can_be_fractional_or_unsigned() { + for bounds in [ + serde_json::json!({"minimum":0.5,"maximum":10.5}), + serde_json::json!({"maximum":18446744073709551615u64}), + ] { + let mut property = bounds; + property["type"] = serde_json::json!("integer"); + let result = normalize_strict_schema( + serde_json::json!({"type":"object","properties":{"n":property.clone()}}), + true, + |e| e.to_string(), + "root", + ) + .unwrap(); + assert_eq!(result["properties"]["n"], property); + } + } +}