Skip to content
Open
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
14 changes: 11 additions & 3 deletions mem0/configs/embeddings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ def __init__(
# AzureOpenAI specific
azure_kwargs: Optional[AzureConfig] = {},
http_client_proxies: Optional[Union[Dict, str]] = None,
ssl_verify: Optional[Union[bool, str]] = None,
# VertexAI specific
vertex_credentials_json: Optional[str] = None,
memory_add_embedding_type: Optional[str] = None,
Expand Down Expand Up @@ -62,6 +63,8 @@ def __init__(
:type azure_kwargs: Optional[Dict[str, Any]], defaults a dict inside init
:param http_client_proxies: The proxy server settings used to create self.http_client, defaults to None
:type http_client_proxies: Optional[Dict | str], optional
:param ssl_verify: SSL verification settings for HTTP client. Can be a boolean or a path to a CA bundle.
:type ssl_verify: Optional[Union[bool, str]], optional
:param vertex_credentials_json: The path to the Vertex AI credentials JSON file, defaults to None
:type vertex_credentials_json: Optional[str], optional
:param memory_add_embedding_type: The type of embedding to use for the add memory action, defaults to None
Expand All @@ -79,8 +82,14 @@ def __init__(
self.openai_base_url = openai_base_url
self.embedding_dims = embedding_dims

# AzureOpenAI specific
self.http_client = httpx.Client(proxies=http_client_proxies) if http_client_proxies else None
# Client setup
client_kwargs = {}
if http_client_proxies:
client_kwargs["proxies"] = http_client_proxies
if ssl_verify is not None:
client_kwargs["verify"] = ssl_verify

self.http_client = httpx.Client(**client_kwargs) if client_kwargs else None

# Ollama specific
self.ollama_base_url = ollama_base_url
Expand All @@ -107,4 +116,3 @@ def __init__(
self.aws_access_key_id = aws_access_key_id
self.aws_secret_access_key = aws_secret_access_key
self.aws_region = aws_region or os.environ.get("AWS_REGION") or "us-west-2"

5 changes: 4 additions & 1 deletion mem0/configs/llms/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def __init__(
enable_vision: bool = False,
vision_details: Optional[str] = "auto",
http_client_proxies: Optional[Union[Dict, str]] = None,
ssl_verify: Optional[Union[bool, str]] = None,
):
"""
Initialize a base configuration class instance for the LLM.
Expand All @@ -50,6 +51,7 @@ def __init__(
Options: "low", "high", "auto". Defaults to "auto"
http_client_proxies: Proxy settings for HTTP client.
Can be a dict or string. Defaults to None
ssl_verify: SSL verification settings for HTTP client. Can be a boolean or a path to a CA bundle.
"""
self.model = model
self.temperature = temperature
Expand All @@ -59,4 +61,5 @@ def __init__(
self.top_k = top_k
self.enable_vision = enable_vision
self.vision_details = vision_details
self.http_client = httpx.Client(proxies=http_client_proxies) if http_client_proxies else None
self.http_client_proxies = http_client_proxies
self.ssl_verify = ssl_verify
5 changes: 4 additions & 1 deletion mem0/configs/llms/openai.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Any, Callable, List, Optional
from typing import Any, Callable, List, Optional, Union

from mem0.configs.llms.base import BaseLlmConfig

Expand All @@ -21,6 +21,7 @@ def __init__(
enable_vision: bool = False,
vision_details: Optional[str] = "auto",
http_client_proxies: Optional[dict] = None,
ssl_verify: Optional[Union[bool, str]] = None,
# OpenAI-specific parameters
openai_base_url: Optional[str] = None,
models: Optional[List[str]] = None,
Expand All @@ -45,6 +46,7 @@ def __init__(
enable_vision: Enable vision capabilities, defaults to False
vision_details: Vision detail level, defaults to "auto"
http_client_proxies: HTTP client proxy settings, defaults to None
ssl_verify: SSL verification settings, defaults to None
openai_base_url: OpenAI API base URL, defaults to None
models: List of models for OpenRouter, defaults to None
route: OpenRouter route strategy, defaults to "fallback"
Expand All @@ -64,6 +66,7 @@ def __init__(
enable_vision=enable_vision,
vision_details=vision_details,
http_client_proxies=http_client_proxies,
ssl_verify=ssl_verify,
)

# OpenAI-specific parameters
Expand Down
2 changes: 1 addition & 1 deletion mem0/embeddings/huggingface.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def __init__(self, config: Optional[BaseEmbedderConfig] = None):
super().__init__(config)

if config.huggingface_base_url:
self.client = OpenAI(base_url=config.huggingface_base_url)
self.client = OpenAI(base_url=config.huggingface_base_url, http_client=self.config.http_client)
self.config.model = self.config.model or "tei"
else:
self.config.model = self.config.model or "multi-qa-MiniLM-L6-cos-v1"
Expand Down
2 changes: 1 addition & 1 deletion mem0/embeddings/openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def __init__(self, config: Optional[BaseEmbedderConfig] = None):
DeprecationWarning,
)

self.client = OpenAI(api_key=api_key, base_url=base_url)
self.client = OpenAI(api_key=api_key, base_url=base_url, http_client=self.config.http_client)

def embed(self, text, memory_action: Optional[Literal["add", "search", "update"]] = None):
"""
Expand Down
14 changes: 11 additions & 3 deletions mem0/llms/openai.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import json
import logging
import os
import httpx
from typing import Dict, List, Optional, Union

from openai import OpenAI
Expand Down Expand Up @@ -29,26 +30,33 @@ def __init__(self, config: Optional[Union[BaseLlmConfig, OpenAIConfig, Dict]] =
top_k=config.top_k,
enable_vision=config.enable_vision,
vision_details=config.vision_details,
http_client_proxies=config.http_client,
http_client_proxies=config.http_client_proxies,
ssl_verify=config.ssl_verify,
)

super().__init__(config)

if not self.config.model:
self.config.model = "gpt-4.1-nano-2025-04-14"
self.config.model = "gpt-4o"

http_client = httpx.Client(
proxy=self.config.http_client_proxies,
verify=self.config.ssl_verify,
) if self.config.http_client_proxies or self.config.ssl_verify is not None else None

if os.environ.get("OPENROUTER_API_KEY"): # Use OpenRouter
self.client = OpenAI(
api_key=os.environ.get("OPENROUTER_API_KEY"),
base_url=self.config.openrouter_base_url
or os.getenv("OPENROUTER_API_BASE")
or "https://openrouter.ai/api/v1",
http_client=http_client,
)
else:
api_key = self.config.api_key or os.getenv("OPENAI_API_KEY")
base_url = self.config.openai_base_url or os.getenv("OPENAI_BASE_URL") or "https://api.openai.com/v1"

self.client = OpenAI(api_key=api_key, base_url=base_url)
self.client = OpenAI(api_key=api_key, base_url=base_url, http_client=http_client)

def _parse_response(self, response, tools):
"""
Expand Down