fix(llms): pass configured anthropic_base_url to the Anthropic client (#5626)
This commit is contained in:
@@ -38,7 +38,11 @@ class AnthropicLLM(LLMBase):
|
|||||||
self.config.model = "claude-sonnet-4-6"
|
self.config.model = "claude-sonnet-4-6"
|
||||||
|
|
||||||
api_key = self.config.api_key or os.getenv("ANTHROPIC_API_KEY")
|
api_key = self.config.api_key or os.getenv("ANTHROPIC_API_KEY")
|
||||||
self.client = anthropic.Anthropic(api_key=api_key)
|
base_url = self.config.anthropic_base_url or os.getenv("ANTHROPIC_BASE_URL")
|
||||||
|
client_kwargs = {"api_key": api_key}
|
||||||
|
if base_url:
|
||||||
|
client_kwargs["base_url"] = base_url
|
||||||
|
self.client = anthropic.Anthropic(**client_kwargs)
|
||||||
|
|
||||||
def _get_common_params(self, **kwargs) -> Dict:
|
def _get_common_params(self, **kwargs) -> Dict:
|
||||||
"""Get common parameters, avoiding sending both temperature and top_p together.
|
"""Get common parameters, avoiding sending both temperature and top_p together.
|
||||||
|
|||||||
@@ -83,6 +83,39 @@ def test_both_set_prefers_temperature_over_top_p(mock_anthropic_client):
|
|||||||
assert "top_p" not in call_kwargs
|
assert "top_p" not in call_kwargs
|
||||||
|
|
||||||
|
|
||||||
|
def test_configured_base_url_is_passed_to_client():
|
||||||
|
"""A configured anthropic_base_url must reach the Anthropic client constructor."""
|
||||||
|
with patch("mem0.llms.anthropic.anthropic") as mock_anthropic:
|
||||||
|
config = AnthropicConfig(
|
||||||
|
model="claude-3-5-sonnet-20240620",
|
||||||
|
api_key="test-key",
|
||||||
|
anthropic_base_url="https://proxy.example.com",
|
||||||
|
)
|
||||||
|
AnthropicLLM(config)
|
||||||
|
|
||||||
|
assert mock_anthropic.Anthropic.call_args[1]["base_url"] == "https://proxy.example.com"
|
||||||
|
|
||||||
|
|
||||||
|
def test_base_url_falls_back_to_env(monkeypatch):
|
||||||
|
"""When no base_url is configured, ANTHROPIC_BASE_URL is used."""
|
||||||
|
monkeypatch.setenv("ANTHROPIC_BASE_URL", "https://env.example.com")
|
||||||
|
with patch("mem0.llms.anthropic.anthropic") as mock_anthropic:
|
||||||
|
config = AnthropicConfig(model="claude-3-5-sonnet-20240620", api_key="test-key")
|
||||||
|
AnthropicLLM(config)
|
||||||
|
|
||||||
|
assert mock_anthropic.Anthropic.call_args[1]["base_url"] == "https://env.example.com"
|
||||||
|
|
||||||
|
|
||||||
|
def test_base_url_omitted_when_unset(monkeypatch):
|
||||||
|
"""With no base_url anywhere, base_url must not be forced to None on the client."""
|
||||||
|
monkeypatch.delenv("ANTHROPIC_BASE_URL", raising=False)
|
||||||
|
with patch("mem0.llms.anthropic.anthropic") as mock_anthropic:
|
||||||
|
config = AnthropicConfig(model="claude-3-5-sonnet-20240620", api_key="test-key")
|
||||||
|
AnthropicLLM(config)
|
||||||
|
|
||||||
|
assert "base_url" not in mock_anthropic.Anthropic.call_args[1]
|
||||||
|
|
||||||
|
|
||||||
def test_base_config_conversion_does_not_send_both(mock_anthropic_client):
|
def test_base_config_conversion_does_not_send_both(mock_anthropic_client):
|
||||||
"""BaseLlmConfig defaults both temperature=0.1 and top_p=0.1; Anthropic must not send both."""
|
"""BaseLlmConfig defaults both temperature=0.1 and top_p=0.1; Anthropic must not send both."""
|
||||||
base_config = BaseLlmConfig(model="claude-3-5-sonnet-20240620", api_key="test-key")
|
base_config = BaseLlmConfig(model="claude-3-5-sonnet-20240620", api_key="test-key")
|
||||||
|
|||||||
Reference in New Issue
Block a user