Spaces:
Paused
Paused
| import io | |
| import json | |
| import os | |
| import sys | |
| from typing import Any | |
| from unittest.mock import MagicMock, patch | |
| import pytest | |
| sys.path.insert( | |
| 0, os.path.abspath("../../../..") | |
| ) # Adds the parent directory to the system path | |
| import litellm | |
| from litellm.types.utils import TranscriptionResponse | |
| def mock_deepgram_response(): | |
| """Mock Deepgram API response""" | |
| return { | |
| "metadata": { | |
| "transaction_key": "deprecated", | |
| "request_id": "test-request-id", | |
| "sha256": "test-sha", | |
| "created": "2024-01-01T00:00:00.000Z", | |
| "duration": 10.5, | |
| "channels": 1, | |
| "models": ["nova-2"], | |
| }, | |
| "results": { | |
| "channels": [ | |
| { | |
| "alternatives": [ | |
| { | |
| "transcript": "Hello, this is a test transcription.", | |
| "confidence": 0.99, | |
| "words": [ | |
| { | |
| "word": "Hello", | |
| "start": 0.0, | |
| "end": 0.5, | |
| "confidence": 0.99, | |
| }, | |
| { | |
| "word": "this", | |
| "start": 0.6, | |
| "end": 0.8, | |
| "confidence": 0.98, | |
| }, | |
| { | |
| "word": "is", | |
| "start": 0.9, | |
| "end": 1.1, | |
| "confidence": 0.97, | |
| }, | |
| { | |
| "word": "a", | |
| "start": 1.2, | |
| "end": 1.3, | |
| "confidence": 0.96, | |
| }, | |
| { | |
| "word": "test", | |
| "start": 1.4, | |
| "end": 1.8, | |
| "confidence": 0.95, | |
| }, | |
| { | |
| "word": "transcription", | |
| "start": 1.9, | |
| "end": 2.8, | |
| "confidence": 0.94, | |
| }, | |
| ], | |
| } | |
| ] | |
| } | |
| ] | |
| }, | |
| } | |
| def test_audio_bytes(): | |
| """Mock audio file bytes""" | |
| return b"fake_audio_data_for_testing" | |
| def test_audio_file(): | |
| """Mock audio file object""" | |
| return io.BytesIO(b"fake_audio_data_for_testing") | |
| class TestDeepgramMockTranscription: | |
| """Test Deepgram transcription with mocked HTTP requests""" | |
| def test_transcription_url_generation( | |
| self, | |
| mock_deepgram_response, | |
| test_audio_bytes, | |
| optional_params, | |
| expected_url, | |
| ): | |
| """Test transcription URL generation with various parameters""" | |
| # Create mock response | |
| mock_response = MagicMock() | |
| mock_response.json.return_value = mock_deepgram_response | |
| mock_response.status_code = 200 | |
| mock_response.headers = {"Content-Type": "application/json"} | |
| with patch( | |
| "litellm.llms.custom_httpx.http_handler.HTTPHandler.post", | |
| return_value=mock_response, | |
| ) as mock_post: | |
| response: TranscriptionResponse = litellm.transcription( | |
| model="deepgram/nova-2", | |
| file=test_audio_bytes, | |
| api_key="test-api-key", | |
| **optional_params, | |
| ) | |
| # Verify the HTTP call was made | |
| mock_post.assert_called_once() | |
| call_kwargs = mock_post.call_args.kwargs | |
| # Verify URL | |
| actual_url = call_kwargs["url"] | |
| if expected_url is None: | |
| # For multiple params, check that all expected parts are present | |
| assert "model=nova-2" in actual_url | |
| assert "punctuate=true" in actual_url | |
| assert "diarize=false" in actual_url | |
| assert "measurements=true" in actual_url | |
| assert "smart_format=true" in actual_url | |
| assert "tier=enhanced" in actual_url | |
| assert actual_url.startswith("https://api.deepgram.com/v1/listen?") | |
| # Ensure language is not included even if it was in optional_params for other tests | |
| assert "language=" not in actual_url | |
| else: | |
| assert ( | |
| actual_url == expected_url | |
| ), f"Expected {expected_url}, got {actual_url}" | |
| # Verify headers | |
| assert "Authorization" in call_kwargs["headers"] | |
| assert call_kwargs["headers"]["Authorization"] == "Token test-api-key" | |
| # Verify response | |
| assert response.text == "Hello, this is a test transcription." | |
| assert hasattr(response, "_hidden_params") | |
| def test_transcription_with_custom_api_base( | |
| self, mock_deepgram_response, test_audio_bytes | |
| ): | |
| """Test transcription with custom API base URL""" | |
| mock_response = MagicMock() | |
| mock_response.json.return_value = mock_deepgram_response | |
| mock_response.status_code = 200 | |
| mock_response.headers = {"Content-Type": "application/json"} | |
| with patch( | |
| "litellm.llms.custom_httpx.http_handler.HTTPHandler.post", | |
| return_value=mock_response, | |
| ) as mock_post: | |
| response: TranscriptionResponse = litellm.transcription( | |
| model="deepgram/nova-2", | |
| file=test_audio_bytes, | |
| api_key="test-api-key", | |
| api_base="https://custom.deepgram.com/v2", | |
| punctuate=True, | |
| ) | |
| # Verify the HTTP call was made | |
| mock_post.assert_called_once() | |
| call_kwargs = mock_post.call_args.kwargs | |
| # Verify custom API base is used | |
| expected_url = ( | |
| "https://custom.deepgram.com/v2/listen?model=nova-2&punctuate=true" | |
| ) | |
| assert call_kwargs["url"] == expected_url | |
| # Verify response | |
| assert response.text == "Hello, this is a test transcription." | |
| def test_transcription_with_file_object( | |
| self, mock_deepgram_response, test_audio_file | |
| ): | |
| """Test transcription with file-like object""" | |
| mock_response = MagicMock() | |
| mock_response.json.return_value = mock_deepgram_response | |
| mock_response.status_code = 200 | |
| mock_response.headers = {"Content-Type": "application/json"} | |
| with patch( | |
| "litellm.llms.custom_httpx.http_handler.HTTPHandler.post", | |
| return_value=mock_response, | |
| ) as mock_post: | |
| response: TranscriptionResponse = litellm.transcription( | |
| model="deepgram/nova-2", | |
| file=test_audio_file, | |
| api_key="test-api-key", | |
| punctuate=True, | |
| ) | |
| # Verify the HTTP call was made | |
| mock_post.assert_called_once() | |
| call_kwargs = mock_post.call_args.kwargs | |
| # Verify URL contains punctuate parameter | |
| expected_url = ( | |
| "https://api.deepgram.com/v1/listen?model=nova-2&punctuate=true" | |
| ) | |
| assert call_kwargs["url"] == expected_url | |
| # Verify response | |
| assert response.text == "Hello, this is a test transcription." | |