chore: merge origin/main into mintlify/af82bda4 and resolve conflicts
This commit is contained in:
@@ -6,7 +6,6 @@ from mem0.configs.llms.aws_bedrock import AWSBedrockConfig
|
||||
from mem0.llms.aws_bedrock import AWSBedrockLLM, extract_provider
|
||||
from mem0.utils.factory import LlmFactory
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Helpers
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -70,6 +69,23 @@ class TestExtractProvider:
|
||||
with pytest.raises(ValueError, match="Unknown provider"):
|
||||
extract_provider("unknown-vendor.some-model-v1:0")
|
||||
|
||||
def test_application_inference_profile_arn_without_override_raises(self):
|
||||
arn = "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123xyz"
|
||||
with pytest.raises(ValueError, match="Unknown provider"):
|
||||
extract_provider(arn)
|
||||
|
||||
def test_application_inference_profile_arn_with_explicit_provider(self):
|
||||
arn = "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123xyz"
|
||||
assert extract_provider(arn, "anthropic") == "anthropic"
|
||||
|
||||
def test_explicit_provider_takes_precedence_over_regex(self):
|
||||
assert extract_provider("anthropic.claude-3-5-sonnet-20240620-v1:0", "amazon") == "amazon"
|
||||
|
||||
def test_explicit_provider_typo_raises(self):
|
||||
arn = "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123xyz"
|
||||
with pytest.raises(ValueError, match="Unknown provider_override 'anthorpic'"):
|
||||
extract_provider(arn, "anthorpic")
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# AWSBedrockConfig
|
||||
@@ -114,6 +130,44 @@ class TestAWSBedrockConfig:
|
||||
)
|
||||
assert config.aws_region == "us-east-2"
|
||||
|
||||
def test_provider_override_defaults_to_none(self):
|
||||
config = AWSBedrockConfig(model="anthropic.claude-3-5-sonnet-20240620-v1:0")
|
||||
assert config.provider_override is None
|
||||
|
||||
def test_provider_override_stored(self):
|
||||
arn = "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123xyz"
|
||||
config = AWSBedrockConfig(model=arn, provider_override="anthropic")
|
||||
assert config.provider_override == "anthropic"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# AWSBedrockLLM with application inference profile ARNs
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
class TestApplicationInferenceProfileArn:
|
||||
ARN = "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123xyz"
|
||||
|
||||
def test_arn_without_provider_override_raises(self, mock_boto3):
|
||||
with pytest.raises(ValueError, match="Unknown provider"):
|
||||
_make_llm(self.ARN, mock_boto3)
|
||||
|
||||
def test_arn_with_provider_override_resolves(self, mock_boto3):
|
||||
llm = _make_llm(self.ARN, mock_boto3, provider_override="anthropic")
|
||||
assert llm.provider == "anthropic"
|
||||
assert llm.supports_tools is True
|
||||
|
||||
def test_plain_model_id_unaffected(self, mock_boto3):
|
||||
llm = _make_llm("anthropic.claude-3-5-sonnet-20240620-v1:0", mock_boto3)
|
||||
assert llm.provider == "anthropic"
|
||||
|
||||
def test_cross_region_inference_profile_unaffected(self, mock_boto3):
|
||||
llm = _make_llm("us.anthropic.claude-haiku-4-5-20251001-v1:0", mock_boto3)
|
||||
assert llm.provider == "anthropic"
|
||||
|
||||
def test_arn_with_misspelled_provider_override_raises(self, mock_boto3):
|
||||
with pytest.raises(ValueError, match="Unknown provider_override 'anthorpic'"):
|
||||
_make_llm(self.ARN, mock_boto3, provider_override="anthorpic")
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# LlmFactory
|
||||
|
||||
@@ -4,6 +4,7 @@ import pytest
|
||||
|
||||
from mem0 import AsyncMemory, Memory
|
||||
from mem0.configs.llms.base import BaseLlmConfig
|
||||
from mem0.configs.llms.vllm import VllmConfig
|
||||
from mem0.llms.vllm import VllmLLM
|
||||
|
||||
|
||||
@@ -15,6 +16,59 @@ def mock_vllm_client():
|
||||
yield mock_client
|
||||
|
||||
|
||||
def test_base_url_explicit_arg_wins_over_env(mock_vllm_client, monkeypatch):
|
||||
monkeypatch.setenv("VLLM_BASE_URL", "http://from-env:8000/v1")
|
||||
config = VllmConfig(vllm_base_url="http://from-arg:8000/v1")
|
||||
VllmLLM(config)
|
||||
|
||||
assert config.vllm_base_url == "http://from-arg:8000/v1"
|
||||
|
||||
|
||||
def test_base_url_env_wins_over_default(mock_vllm_client, monkeypatch):
|
||||
monkeypatch.setenv("VLLM_BASE_URL", "http://from-env:8000/v1")
|
||||
config = VllmConfig()
|
||||
VllmLLM(config)
|
||||
|
||||
assert config.vllm_base_url == "http://from-env:8000/v1"
|
||||
|
||||
|
||||
def test_base_url_default_when_neither_set(mock_vllm_client, monkeypatch):
|
||||
monkeypatch.delenv("VLLM_BASE_URL", raising=False)
|
||||
config = VllmConfig()
|
||||
VllmLLM(config)
|
||||
|
||||
assert config.vllm_base_url == "http://localhost:8000/v1"
|
||||
|
||||
|
||||
def test_openai_client_receives_explicit_base_url(monkeypatch):
|
||||
monkeypatch.delenv("VLLM_BASE_URL", raising=False)
|
||||
with patch("mem0.llms.vllm.OpenAI") as mock_openai:
|
||||
VllmLLM(VllmConfig(vllm_base_url="http://from-arg:8000/v1"))
|
||||
|
||||
assert mock_openai.call_args.kwargs["base_url"] == "http://from-arg:8000/v1"
|
||||
|
||||
|
||||
def test_openai_client_receives_base_url_from_env(monkeypatch):
|
||||
monkeypatch.setenv("VLLM_BASE_URL", "http://from-env:8000/v1")
|
||||
with patch("mem0.llms.vllm.OpenAI") as mock_openai:
|
||||
VllmLLM(VllmConfig())
|
||||
|
||||
base_url = mock_openai.call_args.kwargs["base_url"]
|
||||
assert base_url == "http://from-env:8000/v1"
|
||||
assert base_url != "http://localhost:8000/v1"
|
||||
|
||||
|
||||
def test_openai_client_receives_base_url_from_env_via_base_llm_config(monkeypatch):
|
||||
"""Original #6256 repro: BaseLlmConfig (not VllmConfig) plus VLLM_BASE_URL only."""
|
||||
monkeypatch.setenv("VLLM_BASE_URL", "http://remote-vllm:8000/v1")
|
||||
with patch("mem0.llms.vllm.OpenAI") as mock_openai:
|
||||
VllmLLM(BaseLlmConfig(model="Qwen/Qwen2.5-32B-Instruct"))
|
||||
|
||||
base_url = mock_openai.call_args.kwargs["base_url"]
|
||||
assert base_url == "http://remote-vllm:8000/v1"
|
||||
assert base_url != "http://localhost:8000/v1"
|
||||
|
||||
|
||||
def test_generate_response_without_tools(mock_vllm_client):
|
||||
config = BaseLlmConfig(model="Qwen/Qwen2.5-32B-Instruct", temperature=0.7, max_tokens=100, top_p=1.0)
|
||||
llm = VllmLLM(config)
|
||||
|
||||
Reference in New Issue
Block a user