File size: 2,564 Bytes
37184d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import pytest

from src.core.ai_client import AIClientManager
from src.config.ai_providers_config import get_agent_config


def test_default_spiritual_distress_analyzer_is_gemini():
    config = get_agent_config("SpiritualDistressAnalyzer")
    assert config["provider"].value == "gemini"
    assert config["model"].value.startswith("gemini")


def test_model_override_creates_non_cached_client_and_does_not_leak():
    mgr = AIClientManager()

    # Baseline (cached) client should be created once
    base = mgr.get_client("SpiritualDistressAnalyzer")

    # Override should return a fresh client each time (non-cached)
    override_1 = mgr.get_client("SpiritualDistressAnalyzer", model_override="claude-sonnet-4-5-20250929")
    override_2 = mgr.get_client("SpiritualDistressAnalyzer", model_override="claude-sonnet-4-5-20250929")

    assert override_1 is not override_2

    # And it should not replace the cached base client
    base_again = mgr.get_client("SpiritualDistressAnalyzer")
    assert base_again is base


def test_manager_attached_model_overrides_apply_to_spiritual_and_medical_calls_without_args(monkeypatch):
    mgr = AIClientManager()

    # Attach session-level overrides as done by SimplifiedMedicalApp
    mgr.model_overrides = {
        "SpiritualDistressAnalyzer": "claude-sonnet-4-5-20250929",
        "SoftMedicalTriage": "gemini-2.5-flash",
    }

    captured = []

    def fake_generate_response(*, system_prompt, user_prompt, temperature=None, call_type="", agent_name="DefaultAgent", medical_context=None, model_override=None):
        captured.append({
            "agent_name": agent_name,
            "call_type": call_type,
            "model_override": model_override,
        })
        return "ok"

    monkeypatch.setattr(mgr, "generate_response", fake_generate_response)

    mgr.call_spiritual_api("sys", "user")
    mgr.call_medical_api("sys", "user")

    assert captured[0]["agent_name"] == "SpiritualDistressAnalyzer"
    assert captured[0]["model_override"] == "claude-sonnet-4-5-20250929"

    assert captured[1]["agent_name"] == "SoftMedicalTriage"
    assert captured[1]["model_override"] == "gemini-2.5-flash"


def test_two_managers_do_not_share_model_overrides():
    mgr_a = AIClientManager()
    mgr_b = AIClientManager()

    mgr_a.model_overrides = {"SpiritualDistressAnalyzer": "claude-sonnet-4-5-20250929"}
    mgr_b.model_overrides = {"SpiritualDistressAnalyzer": "gemini-2.5-flash"}

    assert mgr_a.model_overrides["SpiritualDistressAnalyzer"] != mgr_b.model_overrides["SpiritualDistressAnalyzer"]