From e1e8e2338a2508cf013e2aff0e2b4f315622b0d8 Mon Sep 17 00:00:00 2001 From: Pawel Rzepecki Date: Thu, 25 Jun 2026 11:13:24 +0200 Subject: [PATCH 1/2] handling negative values --- src/test/tokenize_parser_test.cpp | 20 +++++++++++++++++++- src/tokenize/tokenize_parser.cpp | 6 +++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/tokenize_parser_test.cpp b/src/test/tokenize_parser_test.cpp index 9c45d9a108..98d2bb3d24 100644 --- a/src/test/tokenize_parser_test.cpp +++ b/src/test/tokenize_parser_test.cpp @@ -154,7 +154,7 @@ TEST(TokenizeDeserialization, invalidTokenizeMaxLengthType) { auto status = ovms::TokenizeParser::parseTokenizeRequest(d, request); ASSERT_NE(status, absl::OkStatus()); auto error = status.message(); - ASSERT_EQ(error, "max_length should be integer"); + ASSERT_EQ(error, "max_length should be unsigned integer"); } TEST(TokenizeDeserialization, invalidTokenizePadToMaxLengthType) { @@ -228,3 +228,21 @@ TEST(TokenizeDeserialization, invalidTokenizePaddingSideValue) { auto error = status.message(); ASSERT_EQ(error, "padding_side should be either left or right"); } + +TEST(TokenizeDeserialization, invalidTokenizeMaxLengthNegative) { + std::string requestBody = R"( + { + "model": "embeddings", + "text": ["one", "two", "three"], + "max_length": -10 + } + )"; + rapidjson::Document d; + rapidjson::ParseResult ok = d.Parse(requestBody.c_str()); + ovms::TokenizeRequest request; + ASSERT_EQ(ok.Code(), 0); + auto status = ovms::TokenizeParser::parseTokenizeRequest(d, request); + ASSERT_NE(status, absl::OkStatus()); + auto error = status.message(); + ASSERT_EQ(error, "max_length should be unsigned integer"); +} diff --git a/src/tokenize/tokenize_parser.cpp b/src/tokenize/tokenize_parser.cpp index 9f982491b3..7eb966e132 100644 --- a/src/tokenize/tokenize_parser.cpp +++ b/src/tokenize/tokenize_parser.cpp @@ -81,13 +81,13 @@ std::variant TokenizeParser::validateTokenizeReque auto it = parsedJson.FindMember("max_length"); if (it != parsedJson.MemberEnd()) { - if (it->value.IsInt()) { - size_t max_length = it->value.GetInt(); + if (it->value.IsUint()) { + size_t max_length = it->value.GetUint(); request.parameters["max_length"] = max_length; // Keep OVMS tokenize API contract: max_length implies truncation. request.parameters["truncation"] = true; } else { - return "max_length should be integer"; + return "max_length should be unsigned integer"; } } it = parsedJson.FindMember("pad_to_max_length"); From b80f8a0122885f99e19c78c5bc2fd7fa6c92374e Mon Sep 17 00:00:00 2001 From: Pawel Rzepecki Date: Fri, 26 Jun 2026 07:27:49 +0200 Subject: [PATCH 2/2] adding handlig zero --- src/test/tokenize_parser_test.cpp | 18 ++++++++++++++++++ src/tokenize/tokenize_parser.cpp | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/src/test/tokenize_parser_test.cpp b/src/test/tokenize_parser_test.cpp index 98d2bb3d24..21e8bae46d 100644 --- a/src/test/tokenize_parser_test.cpp +++ b/src/test/tokenize_parser_test.cpp @@ -246,3 +246,21 @@ TEST(TokenizeDeserialization, invalidTokenizeMaxLengthNegative) { auto error = status.message(); ASSERT_EQ(error, "max_length should be unsigned integer"); } + +TEST(TokenizeDeserialization, invalidTokenizeMaxLengthZero) { + std::string requestBody = R"( + { + "model": "embeddings", + "text": ["one", "two", "three"], + "max_length": 0 + } + )"; + rapidjson::Document d; + rapidjson::ParseResult ok = d.Parse(requestBody.c_str()); + ovms::TokenizeRequest request; + ASSERT_EQ(ok.Code(), 0); + auto status = ovms::TokenizeParser::parseTokenizeRequest(d, request); + ASSERT_NE(status, absl::OkStatus()); + auto error = status.message(); + ASSERT_EQ(error, "max_length should be greater than 0"); +} diff --git a/src/tokenize/tokenize_parser.cpp b/src/tokenize/tokenize_parser.cpp index 7eb966e132..f070606a23 100644 --- a/src/tokenize/tokenize_parser.cpp +++ b/src/tokenize/tokenize_parser.cpp @@ -83,6 +83,10 @@ std::variant TokenizeParser::validateTokenizeReque if (it != parsedJson.MemberEnd()) { if (it->value.IsUint()) { size_t max_length = it->value.GetUint(); + if (max_length == 0) { + return "max_length should be greater than 0"; + } + request.parameters["max_length"] = max_length; // Keep OVMS tokenize API contract: max_length implies truncation. request.parameters["truncation"] = true;