diff --git a/tests/models/test_gpt4v.py b/tests/models/test_gpt4v.py deleted file mode 100644 index cd0ee6d5..00000000 --- a/tests/models/test_gpt4v.py +++ /dev/null @@ -1,441 +0,0 @@ -import logging -import os -from unittest.mock import Mock - -import pytest -from dotenv import load_dotenv -from requests.exceptions import ( - ConnectionError, - HTTPError, - RequestException, - Timeout, -) - -from swarms.models.gpt4v import GPT4Vision, GPT4VisionResponse - -load_dotenv - -api_key = os.getenv("OPENAI_API_KEY") - - -# Mock the OpenAI client -@pytest.fixture -def mock_openai_client(): - return Mock() - - -@pytest.fixture -def gpt4vision(mock_openai_client): - return GPT4Vision(client=mock_openai_client) - - -def test_gpt4vision_default_values(): - # Arrange and Act - gpt4vision = GPT4Vision() - - # Assert - assert gpt4vision.max_retries == 3 - assert gpt4vision.model == "gpt-4-vision-preview" - assert gpt4vision.backoff_factor == 2.0 - assert gpt4vision.timeout_seconds == 10 - assert gpt4vision.api_key is None - assert gpt4vision.quality == "low" - assert gpt4vision.max_tokens == 200 - - -def test_gpt4vision_api_key_from_env_variable(): - # Arrange - api_key = os.environ["OPENAI_API_KEY"] - - # Act - gpt4vision = GPT4Vision() - - # Assert - assert gpt4vision.api_key == api_key - - -def test_gpt4vision_set_api_key(): - # Arrange - gpt4vision = GPT4Vision(api_key=api_key) - - # Assert - assert gpt4vision.api_key == api_key - - -def test_gpt4vision_invalid_max_retries(): - # Arrange and Act - with pytest.raises(ValueError): - GPT4Vision(max_retries=-1) - - -def test_gpt4vision_invalid_backoff_factor(): - # Arrange and Act - with pytest.raises(ValueError): - GPT4Vision(backoff_factor=-1) - - -def test_gpt4vision_invalid_timeout_seconds(): - # Arrange and Act - with pytest.raises(ValueError): - GPT4Vision(timeout_seconds=-1) - - -def test_gpt4vision_invalid_max_tokens(): - # Arrange and Act - with pytest.raises(ValueError): - GPT4Vision(max_tokens=-1) - - -def test_gpt4vision_logger_initialized(): - # Arrange - gpt4vision = GPT4Vision() - - # Assert - assert isinstance(gpt4vision.logger, logging.Logger) - - -def test_gpt4vision_process_img_nonexistent_file(): - # Arrange - gpt4vision = GPT4Vision() - img_path = "nonexistent_image.jpg" - - # Act and Assert - with pytest.raises(FileNotFoundError): - gpt4vision.process_img(img_path) - - -def test_gpt4vision_call_single_task_single_image_no_openai_client( - gpt4vision, -): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - task = "Describe this image." - - # Act and Assert - with pytest.raises(AttributeError): - gpt4vision(img_url, [task]) - - -def test_gpt4vision_call_single_task_single_image_empty_response( - gpt4vision, mock_openai_client -): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - task = "Describe this image." - - mock_openai_client.chat.completions.create.return_value.choices = ( - [] - ) - - # Act - response = gpt4vision(img_url, [task]) - - # Assert - assert response.answer == "" - mock_openai_client.chat.completions.create.assert_called_once() - - -def test_gpt4vision_call_multiple_tasks_single_image_empty_responses( - gpt4vision, mock_openai_client -): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - tasks = ["Describe this image.", "What's in this picture?"] - - mock_openai_client.chat.completions.create.return_value.choices = ( - [] - ) - - # Act - responses = gpt4vision(img_url, tasks) - - # Assert - assert all(response.answer == "" for response in responses) - assert ( - mock_openai_client.chat.completions.create.call_count == 1 - ) # Should be called only once - - -def test_gpt4vision_call_single_task_single_image_timeout( - gpt4vision, mock_openai_client -): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - task = "Describe this image." - - mock_openai_client.chat.completions.create.side_effect = Timeout( - "Request timed out" - ) - - # Act and Assert - with pytest.raises(Timeout): - gpt4vision(img_url, [task]) - - -def test_gpt4vision_call_retry_with_success_after_timeout( - gpt4vision, mock_openai_client -): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - task = "Describe this image." - - # Simulate success after a timeout and retry - mock_openai_client.chat.completions.create.side_effect = [ - Timeout("Request timed out"), - { - "choices": [ - { - "message": { - "content": { - "text": "A description of the image." - } - } - } - ], - }, - ] - - # Act - response = gpt4vision(img_url, [task]) - - # Assert - assert response.answer == "A description of the image." - assert ( - mock_openai_client.chat.completions.create.call_count == 2 - ) # Should be called twice - - -def test_gpt4vision_process_img(): - # Arrange - img_path = "test_image.jpg" - gpt4vision = GPT4Vision() - - # Act - img_data = gpt4vision.process_img(img_path) - - # Assert - assert img_data.startswith("/9j/") # Base64-encoded image data - - -def test_gpt4vision_call_single_task_single_image( - gpt4vision, mock_openai_client -): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - task = "Describe this image." - - expected_response = GPT4VisionResponse( - answer="A description of the image." - ) - - mock_openai_client.chat.completions.create.return_value.choices[ - 0 - ].text = expected_response.answer - - # Act - response = gpt4vision(img_url, [task]) - - # Assert - assert response == expected_response - mock_openai_client.chat.completions.create.assert_called_once() - - -def test_gpt4vision_call_single_task_multiple_images( - gpt4vision, mock_openai_client -): - # Arrange - img_urls = [ - "https://example.com/image1.jpg", - "https://example.com/image2.jpg", - ] - task = "Describe these images." - - expected_response = GPT4VisionResponse( - answer="Descriptions of the images." - ) - - mock_openai_client.chat.completions.create.return_value.choices[ - 0 - ].text = expected_response.answer - - # Act - response = gpt4vision(img_urls, [task]) - - # Assert - assert response == expected_response - mock_openai_client.chat.completions.create.assert_called_once() - - -def test_gpt4vision_call_multiple_tasks_single_image( - gpt4vision, mock_openai_client -): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - tasks = ["Describe this image.", "What's in this picture?"] - - expected_responses = [ - GPT4VisionResponse(answer="A description of the image."), - GPT4VisionResponse(answer="It contains various objects."), - ] - - def create_mock_response(response): - return { - "choices": [ - {"message": {"content": {"text": response.answer}}} - ] - } - - mock_openai_client.chat.completions.create.side_effect = [ - create_mock_response(response) - for response in expected_responses - ] - - # Act - responses = gpt4vision(img_url, tasks) - - # Assert - assert responses == expected_responses - assert ( - mock_openai_client.chat.completions.create.call_count == 1 - ) # Should be called only once - - def test_gpt4vision_call_multiple_tasks_single_image( - gpt4vision, mock_openai_client - ): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - tasks = ["Describe this image.", "What's in this picture?"] - - expected_responses = [ - GPT4VisionResponse(answer="A description of the image."), - GPT4VisionResponse(answer="It contains various objects."), - ] - - mock_openai_client.chat.completions.create.side_effect = [ - { - "choices": [ - { - "message": { - "content": { - "text": expected_responses[i].answer - } - } - } - ] - } - for i in range(len(expected_responses)) - ] - - # Act - responses = gpt4vision(img_url, tasks) - - # Assert - assert responses == expected_responses - assert ( - mock_openai_client.chat.completions.create.call_count == 1 - ) # Should be called only once - - -def test_gpt4vision_call_multiple_tasks_multiple_images( - gpt4vision, mock_openai_client -): - # Arrange - img_urls = [ - "https://images.unsplash.com/photo-1694734479857-626882b6db37?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", - "https://images.unsplash.com/photo-1694734479898-6ac4633158ac?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", - ] - tasks = ["Describe these images.", "What's in these pictures?"] - - expected_responses = [ - GPT4VisionResponse(answer="Descriptions of the images."), - GPT4VisionResponse(answer="They contain various objects."), - ] - - mock_openai_client.chat.completions.create.side_effect = [ - { - "choices": [ - {"message": {"content": {"text": response.answer}}} - ] - } - for response in expected_responses - ] - - # Act - responses = gpt4vision(img_urls, tasks) - - # Assert - assert responses == expected_responses - assert ( - mock_openai_client.chat.completions.create.call_count == 1 - ) # Should be called only once - - -def test_gpt4vision_call_http_error(gpt4vision, mock_openai_client): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - task = "Describe this image." - - mock_openai_client.chat.completions.create.side_effect = ( - HTTPError("HTTP Error") - ) - - # Act and Assert - with pytest.raises(HTTPError): - gpt4vision(img_url, [task]) - - -def test_gpt4vision_call_request_error( - gpt4vision, mock_openai_client -): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - task = "Describe this image." - - mock_openai_client.chat.completions.create.side_effect = ( - RequestException("Request Error") - ) - - # Act and Assert - with pytest.raises(RequestException): - gpt4vision(img_url, [task]) - - -def test_gpt4vision_call_connection_error( - gpt4vision, mock_openai_client -): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - task = "Describe this image." - - mock_openai_client.chat.completions.create.side_effect = ( - ConnectionError("Connection Error") - ) - - # Act and Assert - with pytest.raises(ConnectionError): - gpt4vision(img_url, [task]) - - -def test_gpt4vision_call_retry_with_success( - gpt4vision, mock_openai_client -): - # Arrange - img_url = "https://images.unsplash.com/photo-1694734479942-8cc7f4660578?q=80&w=1287&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" - task = "Describe this image." - - # Simulate success after a retry - mock_openai_client.chat.completions.create.side_effect = [ - RequestException("Temporary error"), - { - "choices": [{"text": "A description of the image."}] - }, # fixed dictionary syntax - ] - - # Act - response = gpt4vision(img_url, [task]) - - # Assert - assert response.answer == "A description of the image." - assert ( - mock_openai_client.chat.completions.create.call_count == 2 - ) # Should be called twice