Akbub's picture
deploy: Nexus AI v0.2.0 - SAP C4C Lead Creation UI included in fresh frontend build
d1f3f31
Raw
History Blame Contribute Delete
3.07 kB
import unittest
import asyncio
import numpy as np
from unittest.mock import patch, MagicMock, AsyncMock
from src.aspect_sentiment.embeddings import get_speaker_embedding, _EMBEDDING_CACHE
from src.aspect_sentiment.llama_extraction import call_llama, CACHE_DIR
class PerformanceOptimizationTests(unittest.TestCase):
def setUp(self):
# Clear caches before test
_EMBEDDING_CACHE.clear()
def test_speaker_embedding_caching(self):
samples = np.array([0.1, 0.2, 0.3, 0.4], dtype=np.float32)
# Mock ECAPA classifier to see if it is called
mock_classifier = MagicMock()
mock_classifier.encode_batch.return_value.squeeze.return_value.cpu.return_value.numpy.return_value = np.zeros(192, dtype=np.float32)
with patch("src.aspect_sentiment.embeddings.ModelManager") as mock_mgr:
mock_mgr.return_value.get_ecapa.return_value = mock_classifier
# First call: should run the classifier
emb1 = get_speaker_embedding(samples)
self.assertEqual(len(emb1), 192)
self.assertEqual(mock_classifier.encode_batch.call_count, 1)
# Second call: should hit cache
emb2 = get_speaker_embedding(samples)
self.assertTrue(np.array_equal(emb1, emb2))
self.assertEqual(mock_classifier.encode_batch.call_count, 1) # Still 1!
@patch("httpx.AsyncClient.post", new_callable=AsyncMock)
def test_llama_disk_caching(self, mock_post):
# Set environment variable for LLaMA API key
with patch.dict("os.environ", {"LLAMA_API_KEY": "test-key"}):
# Clean cache directory if exists or delete mock cache keys
messages = [{"role": "user", "content": "hello caching test"}]
# Mock successful response
mock_response = MagicMock()
mock_response.json.return_value = {"choices": [{"message": {"content": '{"test": "ok"}'}}]}
mock_response.raise_for_status = MagicMock()
mock_post.return_value = mock_response
# First call: should trigger POST request
res1 = asyncio.run(call_llama(messages))
self.assertEqual(res1["choices"][0]["message"]["content"], '{"test": "ok"}')
self.assertEqual(mock_post.call_count, 1)
# Second call: should read from disk cache (no POST request)
res2 = asyncio.run(call_llama(messages))
self.assertEqual(res2["choices"][0]["message"]["content"], '{"test": "ok"}')
self.assertEqual(mock_post.call_count, 1) # Still 1!
# Clean up the cache file
import hashlib
import json
serialized = json.dumps(messages, sort_keys=True)
cache_key = hashlib.md5(serialized.encode("utf-8")).hexdigest()
cache_file = CACHE_DIR / f"{cache_key}.json"
if cache_file.exists():
cache_file.unlink()
if __name__ == "__main__":
unittest.main()