fix(responses-bridge): preserve streaming chunk ID

This commit is contained in:
hxaxd 2026-07-11 10:46:49 +08:00
parent 109193f26a
commit eb51b7aed5
2 changed files with 31 additions and 1 deletions

View file

@ -1074,6 +1074,7 @@ class LiteLLMResponsesTransformationHandler(CompletionTransformationBridge):
class OpenAiResponsesToChatCompletionStreamIterator(BaseModelResponseIterator):
def __init__(self, streaming_response, sync_stream: bool, json_mode: Optional[bool] = False):
super().__init__(streaming_response, sync_stream, json_mode)
self.response_id: Optional[str] = None
def _handle_string_chunk(
self, str_line: Union[str, "BaseModel"]
@ -1381,4 +1382,9 @@ class OpenAiResponsesToChatCompletionStreamIterator(BaseModelResponseIterator):
ModelResponseStream: OpenAI-formatted streaming chunk
"""
verbose_logger.debug(f"Chat provider: transform_streaming_response called with chunk: {chunk}")
return OpenAiResponsesToChatCompletionStreamIterator.translate_responses_chunk_to_openai_stream(chunk)
model_response = OpenAiResponsesToChatCompletionStreamIterator.translate_responses_chunk_to_openai_stream(chunk)
if self.response_id is None:
self.response_id = model_response.id
else:
model_response.id = self.response_id
return model_response

View file

@ -336,6 +336,30 @@ def test_chunk_parser_function_call_added_produces_tool_use():
assert choice.finish_reason is None
def test_chunk_parser_reuses_id_across_response_events():
from litellm.completion_extras.litellm_responses_transformation.transformation import (
OpenAiResponsesToChatCompletionStreamIterator,
)
iterator = OpenAiResponsesToChatCompletionStreamIterator(
streaming_response=None, sync_stream=True
)
events = [
{"type": "response.created"},
{"type": "response.output_text.delta", "delta": "hello"},
{
"type": "response.function_call_arguments.delta",
"output_index": 0,
"delta": '{"city":"Paris"}',
},
]
ids = {iterator.chunk_parser(event).id for event in events}
assert len(ids) == 1
def test_transform_response_with_reasoning_and_output():
"""Test transform_response handles ResponsesAPIResponse with reasoning items and output messages."""
from unittest.mock import Mock