diff --git a/demos/common/export_models/requirements.txt b/demos/common/export_models/requirements.txt index a7fc803537..6202f96643 100644 --- a/demos/common/export_models/requirements.txt +++ b/demos/common/export_models/requirements.txt @@ -9,8 +9,8 @@ diffusers # for image generation einops nncf numpy -openvino-tokenizers==2026.2.0.dev20260424 -openvino==2026.2.0.dev20260424 +openvino-tokenizers==2026.2.0.dev20260428 +openvino==2026.2.0.dev20260428 pillow sentence_transformers==5.3.0 sentencepiece # Required by: transformers` diff --git a/src/llm/apis/openai_completions.cpp b/src/llm/apis/openai_completions.cpp index b69b682611..ca67f0b927 100644 --- a/src/llm/apis/openai_completions.cpp +++ b/src/llm/apis/openai_completions.cpp @@ -412,7 +412,7 @@ std::string OpenAIChatCompletionsHandler::serializeUnaryResponse(ov::genai::Enco ParsedOutput parsedOutput = parseOutputIfNeeded(tokens); jsonResponse.StartObject(); // finish_reason: "stop" in regular scenario, "tool_calls" if output contains tool calls - auto finishReason = mapFinishReason(ov::genai::GenerationFinishReason::STOP, !parsedOutput.toolCalls.empty()); + auto finishReason = mapFinishReason(results.finish_reasons[index], !parsedOutput.toolCalls.empty()); jsonResponse.FinishReason(finishReason.value_or("unknown")); // index: integer; Choice index, only n=1 supported anyway jsonResponse.Index(index++); @@ -478,7 +478,7 @@ std::string OpenAIChatCompletionsHandler::serializeUnaryResponse(ov::genai::VLMD ParsedOutput parsedOutput = parseOutputIfNeeded(generatedTokens); jsonResponse.StartObject(); // finish_reason: "stop" in regular scenario, "tool_calls" if output contains tool calls - auto finishReason = mapFinishReason(ov::genai::GenerationFinishReason::STOP, !parsedOutput.toolCalls.empty()); + auto finishReason = mapFinishReason(results.finish_reasons[index], !parsedOutput.toolCalls.empty()); jsonResponse.FinishReason(finishReason.value_or("unknown")); // index: integer; Choice index, only n=1 supported anyway jsonResponse.Index(index++); diff --git a/src/llm/apis/openai_responses.cpp b/src/llm/apis/openai_responses.cpp index e5d63985e6..1e697d4f12 100644 --- a/src/llm/apis/openai_responses.cpp +++ b/src/llm/apis/openai_responses.cpp @@ -649,10 +649,17 @@ std::string OpenAIResponsesHandler::serializeUnaryResponse(ov::genai::EncodedRes usage.promptTokens = results.perf_metrics.get_num_input_tokens(); usage.completionTokens = results.perf_metrics.get_num_generated_tokens(); std::vector parsedOutputs; + ov::genai::GenerationFinishReason responsesFinishReason = ov::genai::GenerationFinishReason::STOP; for (const auto& tokens : results.tokens) { parsedOutputs.push_back(parseOutputIfNeeded(tokens)); } - return serializeUnaryResponseImpl(parsedOutputs); + for (const auto& finishReason : results.finish_reasons) { + if (finishReason == ov::genai::GenerationFinishReason::LENGTH) { + responsesFinishReason = ov::genai::GenerationFinishReason::LENGTH; + break; + } + } + return serializeUnaryResponseImpl(parsedOutputs, responsesFinishReason); } std::string OpenAIResponsesHandler::serializeUnaryResponse(ov::genai::VLMDecodedResults& results) { @@ -661,6 +668,7 @@ std::string OpenAIResponsesHandler::serializeUnaryResponse(ov::genai::VLMDecoded usage.completionTokens = results.perf_metrics.get_num_generated_tokens(); // Usage is already correctly set from perf_metrics above — no need for updateUsage. std::vector parsedOutputs; + ov::genai::GenerationFinishReason responsesFinishReason = ov::genai::GenerationFinishReason::STOP; for (const std::string& text : results.texts) { if (outputParser != nullptr) { // Same workaround as in chat completions @@ -673,7 +681,13 @@ std::string OpenAIResponsesHandler::serializeUnaryResponse(ov::genai::VLMDecoded parsedOutputs.push_back(std::move(output)); } } - return serializeUnaryResponseImpl(parsedOutputs); + for (const auto& finishReason : results.finish_reasons) { + if (finishReason == ov::genai::GenerationFinishReason::LENGTH) { + responsesFinishReason = ov::genai::GenerationFinishReason::LENGTH; + break; + } + } + return serializeUnaryResponseImpl(parsedOutputs, responsesFinishReason); } // --- Streaming event building blocks --- diff --git a/src/llm/language_model/legacy/servable.cpp b/src/llm/language_model/legacy/servable.cpp index 6a3f422c8a..d18913d28c 100644 --- a/src/llm/language_model/legacy/servable.cpp +++ b/src/llm/language_model/legacy/servable.cpp @@ -227,7 +227,11 @@ absl::Status LegacyServable::preparePartialResponse(std::shared_ptrlastStreamerCallbackOutput.empty()) { lastTextChunk = lastTextChunk + executionContext->lastStreamerCallbackOutput; } - std::string serializedChunk = executionContext->apiHandler->serializeStreamingChunk(lastTextChunk, ov::genai::GenerationFinishReason::STOP); + ov::genai::GenerationFinishReason finishReason = ov::genai::GenerationFinishReason::STOP; + if (!legacyExecutionContext->results.finish_reasons.empty()) { + finishReason = legacyExecutionContext->results.finish_reasons[0]; + } + std::string serializedChunk = executionContext->apiHandler->serializeStreamingChunk(lastTextChunk, finishReason); if (!serializedChunk.empty()) { executionContext->response = wrapTextInServerSideEventMessage(serializedChunk); } diff --git a/src/test/llm/llmnode_test.cpp b/src/test/llm/llmnode_test.cpp index 2d3f80f2e2..8b45f5438a 100644 --- a/src/test/llm/llmnode_test.cpp +++ b/src/test/llm/llmnode_test.cpp @@ -2606,7 +2606,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::Values( // params: model name, generate expected output, check logprobs, check finish reason, test speculative decoding, supports empty handshake msg TestParameters{"lm_cb_regular", true, true, true, false, true}, - TestParameters{"lm_legacy_regular", false, false, false, false, false}, + TestParameters{"lm_legacy_regular", false, false, true, false, false}, TestParameters{"vlm_cb_regular", false, true, true, false, true}, TestParameters{"vlm_legacy_regular", false, false, false, false, false})); diff --git a/versions.mk b/versions.mk index 1ec0824c71..9816dacba3 100644 --- a/versions.mk +++ b/versions.mk @@ -19,9 +19,9 @@ # Any variable can be overridden by the environment or command-line. # Source repository git commits / branches (used for source builds) -OV_SOURCE_BRANCH ?= de34884656267eda3fec3612b36f874f942c266b +OV_SOURCE_BRANCH ?= 51ac1b94f89e99aafebc0a122a5284852678505f OV_TOKENIZERS_BRANCH ?= 774dd761d5e5fefce828d08a13f11859f60ac10a -OV_GENAI_BRANCH ?= 19cd56fa66f1b4afefe706d33d5df4fcc6d1efba +OV_GENAI_BRANCH ?= 4a72e9977290eb9205bbe09b4d4e6c2c25cdcfb9 # Source repository organizations OV_SOURCE_ORG ?= openvinotoolkit @@ -29,7 +29,7 @@ OV_GENAI_ORG ?= openvinotoolkit OV_TOKENIZERS_ORG ?= openvinotoolkit # Binary package URLs for each supported platform. -DLDT_PACKAGE_URL_UBUNTU24 ?= https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/nightly/2026.2.0.0.dev20260424/openvino_genai_ubuntu24_2026.2.0.0.dev20260424_x86_64.tar.gz -DLDT_PACKAGE_URL_UBUNTU22 ?= https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/nightly/2026.2.0.0.dev20260424/openvino_genai_ubuntu22_2026.2.0.0.dev20260424_x86_64.tar.gz -DLDT_PACKAGE_URL_RHEL ?= https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/nightly/2026.2.0.0.dev20260424/openvino_genai_rhel8_2026.2.0.0.dev20260424_x86_64.tar.gz -GENAI_PACKAGE_URL_WINDOWS ?= https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/nightly/2026.2.0.0.dev20260424/openvino_genai_windows_2026.2.0.0.dev20260424_x86_64.zip +DLDT_PACKAGE_URL_UBUNTU24 ?= https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/nightly/2026.2.0.0.dev20260428/openvino_genai_ubuntu24_2026.2.0.0.dev20260428_x86_64.tar.gz +DLDT_PACKAGE_URL_UBUNTU22 ?= https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/nightly/2026.2.0.0.dev20260428/openvino_genai_ubuntu22_2026.2.0.0.dev20260428_x86_64.tar.gz +DLDT_PACKAGE_URL_RHEL ?= https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/nightly/2026.2.0.0.dev20260428/openvino_genai_rhel8_2026.2.0.0.dev20260428_x86_64.tar.gz +GENAI_PACKAGE_URL_WINDOWS ?= https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/nightly/2026.2.0.0.dev20260428/openvino_genai_windows_2026.2.0.0.dev20260428_x86_64.zip