mirror of
https://github.com/tiennm99/litellm.git
synced 2026-07-12 21:04:10 +00:00
93 lines
3.0 KiB
Python
93 lines
3.0 KiB
Python
"""
|
|
Test OCR functionality with Mistral API.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import pytest
|
|
import litellm
|
|
from litellm import Router
|
|
from base_ocr_unit_tests import BaseOCRTest, TEST_PDF_URL
|
|
|
|
|
|
class TestMistralOCR(BaseOCRTest):
|
|
"""
|
|
Test class for Mistral OCR functionality.
|
|
"""
|
|
|
|
def get_base_ocr_call_args(self) -> dict:
|
|
"""Return the base OCR call args for Mistral"""
|
|
return {
|
|
"model": "mistral/mistral-ocr-latest",
|
|
"api_key": os.getenv("MISTRAL_API_KEY"),
|
|
}
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_router_aocr_with_mistral():
|
|
"""
|
|
Test OCR with Router using Mistral OCR deployment.
|
|
"""
|
|
litellm.set_verbose = True
|
|
|
|
# Create router with Mistral OCR deployment
|
|
router = Router(
|
|
model_list=[
|
|
{
|
|
"model_name": "mistral-ocr",
|
|
"litellm_params": {
|
|
"model": "mistral/mistral-ocr-latest",
|
|
"api_key": os.getenv("MISTRAL_API_KEY"),
|
|
},
|
|
}
|
|
]
|
|
)
|
|
|
|
try:
|
|
# Call OCR through router
|
|
response = await router.aocr(
|
|
model="mistral-ocr",
|
|
document={"type": "document_url", "document_url": TEST_PDF_URL},
|
|
)
|
|
|
|
print(f"\n{'='*80}")
|
|
print("Router OCR Test")
|
|
print(f"Response type: {type(response)}")
|
|
print(
|
|
f"Response object: {response.object if hasattr(response, 'object') else 'N/A'}"
|
|
)
|
|
|
|
# Check if response has expected Mistral OCR format
|
|
assert hasattr(response, "pages"), "Response should have 'pages' attribute"
|
|
assert hasattr(response, "model"), "Response should have 'model' attribute"
|
|
assert hasattr(response, "object"), "Response should have 'object' attribute"
|
|
assert (
|
|
response.object == "ocr"
|
|
), f"Expected object='ocr', got '{response.object}'"
|
|
|
|
# Validate pages structure
|
|
assert isinstance(response.pages, list), "pages should be a list"
|
|
assert len(response.pages) > 0, "Should have at least one page"
|
|
|
|
# Check first page structure
|
|
first_page = response.pages[0]
|
|
assert hasattr(first_page, "index"), "Page should have 'index' attribute"
|
|
assert hasattr(first_page, "markdown"), "Page should have 'markdown' attribute"
|
|
|
|
# Extract text from all pages for validation
|
|
total_text = "\n\n".join(
|
|
page.markdown for page in response.pages if page.markdown
|
|
)
|
|
print(f"Total pages: {len(response.pages)}")
|
|
print(f"Total extracted text length: {len(total_text)} characters")
|
|
print(f"First 200 chars: {total_text[:200]}")
|
|
print(f"Model: {response.model}")
|
|
if response.usage_info:
|
|
print(f"Pages processed: {response.usage_info.pages_processed}")
|
|
print(f"{'='*80}\n")
|
|
|
|
assert len(total_text) > 0, "Should extract some text from the document"
|
|
|
|
except Exception as e:
|
|
pytest.fail(f"Router OCR call failed: {str(e)}")
|