diff --git a/litellm/llms/azure/responses/transformation.py b/litellm/llms/azure/responses/transformation.py index 9cd5de46be96..cf9f970995cc 100644 --- a/litellm/llms/azure/responses/transformation.py +++ b/litellm/llms/azure/responses/transformation.py @@ -53,7 +53,7 @@ def _handle_reasoning_item(self, item: Dict[str, Any]) -> Dict[str, Any]: # Ensure required fields are present for ResponseReasoningItem item_data = dict(item) if "id" not in item_data: - item_data["id"] = f"reasoning_{hash(str(item_data))}" + item_data["id"] = f"rs_{hash(str(item_data))}" if "summary" not in item_data: item_data["summary"] = ( item_data.get("reasoning_content", "")[:100] + "..." diff --git a/litellm/llms/openai/responses/transformation.py b/litellm/llms/openai/responses/transformation.py index 3d0ec243e5ca..ee04d0d2b3cb 100644 --- a/litellm/llms/openai/responses/transformation.py +++ b/litellm/llms/openai/responses/transformation.py @@ -124,7 +124,7 @@ def _handle_reasoning_item(self, item: Dict[str, Any]) -> Dict[str, Any]: # Ensure required fields are present for ResponseReasoningItem item_data = dict(item) if "id" not in item_data: - item_data["id"] = f"reasoning_{hash(str(item_data))}" + item_data["id"] = f"rs_{hash(str(item_data))}" if "summary" not in item_data: item_data["summary"] = ( item_data.get("reasoning_content", "")[:100] + "..." diff --git a/litellm/responses/litellm_completion_transformation/streaming_iterator.py b/litellm/responses/litellm_completion_transformation/streaming_iterator.py index 93abdee778fb..20822b3628ea 100644 --- a/litellm/responses/litellm_completion_transformation/streaming_iterator.py +++ b/litellm/responses/litellm_completion_transformation/streaming_iterator.py @@ -134,7 +134,7 @@ def _transform_chat_completion_chunk_to_response_api_chunk( return ReasoningSummaryTextDeltaEvent( type=ResponsesAPIStreamEvents.REASONING_SUMMARY_TEXT_DELTA, - item_id=f"{chunk.id}_reasoning", + item_id=f"rs_{hash(str(reasoning_content))}", output_index=0, delta=reasoning_content, ) diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index a43e02a0f3e6..9324ab0aa0c6 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -708,7 +708,7 @@ def _extract_reasoning_output_items( return [ GenericResponseOutputItem( type="reasoning", - id=f"{chat_completion_response.id}_reasoning", + id=f"rs_{hash(str(message.reasoning_content))}", status=choice.finish_reason, role="assistant", content=[ diff --git a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py index 00fa0851a7bc..9c8da2e60e0c 100644 --- a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py +++ b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py @@ -265,7 +265,7 @@ def test_transform_chat_completion_response_with_reasoning_content(self): assert len(reasoning_items) == 1, "Should have exactly one reasoning item" reasoning_item = reasoning_items[0] - assert reasoning_item.id == "test-response-id_reasoning" + assert reasoning_item.id.startswith("rs_"), f"Expected ID to start with 'rs_', got: {reasoning_item.id}" assert reasoning_item.status == "stop" assert reasoning_item.role == "assistant" assert len(reasoning_item.content) == 1