Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/ansari/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ def get_resource_path(filename):
AYAH_SYSTEM_PROMPT_FILE_NAME: str = Field(default="system_msg_ayah")
PROMPT_PATH: str = Field(default=str(get_resource_path("prompts")))
AGENT: str = Field(default="AnsariClaude")
ANTHROPIC_MODEL: str = Field(default="claude-sonnet-4-20250514")
ANTHROPIC_MODEL: str = Field(default="claude-sonnet-4-5")
LOGGING_LEVEL: str = Field(default="INFO")
DEV_MODE: bool = Field(default=False)

Expand Down
96 changes: 96 additions & 0 deletions tests/unit/test_ansari_claude_model_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
"""Unit tests for AnsariClaude model version verification."""

import pytest
from unittest.mock import MagicMock, patch


@pytest.fixture
def mock_settings():
"""Mock settings for testing."""
settings = MagicMock()
settings.ANTHROPIC_API_KEY = MagicMock()
settings.ANTHROPIC_API_KEY.get_secret_value.return_value = "test-api-key"
settings.ANTHROPIC_MODEL = "claude-sonnet-4-5"
settings.KALEMAT_API_KEY = MagicMock()
settings.KALEMAT_API_KEY.get_secret_value.return_value = "test-kalemat-key"
settings.VECTARA_API_KEY = MagicMock()
settings.VECTARA_API_KEY.get_secret_value.return_value = "test-vectara-key"
settings.MAWSUAH_VECTARA_CORPUS_KEY = "test-corpus-key"
settings.TAFSIR_VECTARA_CORPUS_KEY = "test-tafsir-key"
settings.USUL_API_TOKEN = MagicMock()
settings.USUL_API_TOKEN.get_secret_value.return_value = "test-usul-token"
settings.MODEL = "test-model"
settings.PROMPT_PATH = "/test/prompts"
settings.SYSTEM_PROMPT_FILE_NAME = "system_msg_default"
settings.AYAH_SYSTEM_PROMPT_FILE_NAME = "system_msg_ayah"
settings.MAX_FAILURES = 3
return settings


class TestAnsariClaudeModelVersion:
"""Test AnsariClaude model version configuration."""

def test_model_version_is_sonnet_4_5(self, mock_settings):
"""Test that AnsariClaude uses Sonnet 4.5 model."""
with patch("anthropic.Anthropic"), patch("ansari.agents.ansari.PromptMgr") as mock_prompt_mgr:
# Mock the prompt manager
mock_prompt = MagicMock()
mock_prompt.render.return_value = "Test system prompt"
mock_prompt_mgr.return_value.bind.return_value = mock_prompt

from src.ansari.agents.ansari_claude import AnsariClaude

# Initialize AnsariClaude
ansari = AnsariClaude(mock_settings)

# Verify the model version is Sonnet 4.5
assert ansari.settings.ANTHROPIC_MODEL == "claude-sonnet-4-5"

def test_model_sent_to_api(self, mock_settings):
"""Test that the correct model version is sent to the Anthropic API."""
with patch("anthropic.Anthropic") as mock_anthropic, patch("ansari.agents.ansari.PromptMgr") as mock_prompt_mgr:
# Mock the prompt manager
mock_prompt = MagicMock()
mock_prompt.render.return_value = "Test system prompt"
mock_prompt_mgr.return_value.bind.return_value = mock_prompt

# Mock the Anthropic client
mock_client = MagicMock()
mock_anthropic.return_value = mock_client

# Mock the response stream
mock_response = MagicMock()
mock_response.__iter__ = MagicMock(return_value=iter([]))
mock_client.messages.create.return_value = mock_response

from src.ansari.agents.ansari_claude import AnsariClaude

# Initialize AnsariClaude
ansari = AnsariClaude(mock_settings)

# Add a message to history
ansari.message_history = [{"role": "user", "content": "test question"}]

# Call process_one_round to trigger API call
list(ansari.process_one_round())

# Verify the correct model was sent to the API
mock_client.messages.create.assert_called_once()
call_args = mock_client.messages.create.call_args
assert call_args[1]["model"] == "claude-sonnet-4-5"

def test_default_config_uses_sonnet_4_5(self):
"""Test that the default configuration in Settings uses Sonnet 4.5."""
from src.ansari.config import Settings

# Create settings with defaults (no overrides)
settings = Settings(
OPENAI_API_KEY="test-key",
ANTHROPIC_API_KEY="test-key",
KALEMAT_API_KEY="test-key",
VECTARA_API_KEY="test-key",
QURAN_DOT_COM_API_KEY="test-key",
)

# Verify the default model is Sonnet 4.5
assert settings.ANTHROPIC_MODEL == "claude-sonnet-4-5"