feature: add Azure Identity for Azure OpenAI and Azure AI Search authentication (#3262)
This commit is contained in:
@@ -1,11 +1,14 @@
|
||||
import os
|
||||
from typing import Literal, Optional
|
||||
|
||||
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
|
||||
from openai import AzureOpenAI
|
||||
|
||||
from mem0.configs.embeddings.base import BaseEmbedderConfig
|
||||
from mem0.embeddings.base import EmbeddingBase
|
||||
|
||||
SCOPE = "https://cognitiveservices.azure.com/.default"
|
||||
|
||||
|
||||
class AzureOpenAIEmbedding(EmbeddingBase):
|
||||
def __init__(self, config: Optional[BaseEmbedderConfig] = None):
|
||||
@@ -17,9 +20,21 @@ class AzureOpenAIEmbedding(EmbeddingBase):
|
||||
api_version = self.config.azure_kwargs.api_version or os.getenv("EMBEDDING_AZURE_API_VERSION")
|
||||
default_headers = self.config.azure_kwargs.default_headers
|
||||
|
||||
# If the API key is not provided or is a placeholder, use DefaultAzureCredential.
|
||||
if api_key is None or api_key == "" or api_key == "your-api-key":
|
||||
self.credential = DefaultAzureCredential()
|
||||
azure_ad_token_provider = get_bearer_token_provider(
|
||||
self.credential,
|
||||
SCOPE,
|
||||
)
|
||||
api_key = None
|
||||
else:
|
||||
azure_ad_token_provider = None
|
||||
|
||||
self.client = AzureOpenAI(
|
||||
azure_deployment=azure_deployment,
|
||||
azure_endpoint=azure_endpoint,
|
||||
azure_ad_token_provider=azure_ad_token_provider,
|
||||
api_version=api_version,
|
||||
api_key=api_key,
|
||||
http_client=self.config.http_client,
|
||||
|
||||
@@ -2,6 +2,7 @@ import json
|
||||
import os
|
||||
from typing import Dict, List, Optional, Union
|
||||
|
||||
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
|
||||
from openai import AzureOpenAI
|
||||
|
||||
from mem0.configs.llms.azure import AzureOpenAIConfig
|
||||
@@ -9,6 +10,8 @@ from mem0.configs.llms.base import BaseLlmConfig
|
||||
from mem0.llms.base import LLMBase
|
||||
from mem0.memory.utils import extract_json
|
||||
|
||||
SCOPE = "https://cognitiveservices.azure.com/.default"
|
||||
|
||||
|
||||
class AzureOpenAILLM(LLMBase):
|
||||
def __init__(self, config: Optional[Union[BaseLlmConfig, AzureOpenAIConfig, Dict]] = None):
|
||||
@@ -43,9 +46,21 @@ class AzureOpenAILLM(LLMBase):
|
||||
api_version = self.config.azure_kwargs.api_version or os.getenv("LLM_AZURE_API_VERSION")
|
||||
default_headers = self.config.azure_kwargs.default_headers
|
||||
|
||||
# If the API key is not provided or is a placeholder, use DefaultAzureCredential.
|
||||
if api_key is None or api_key == "" or api_key == "your-api-key":
|
||||
self.credential = DefaultAzureCredential()
|
||||
azure_ad_token_provider = get_bearer_token_provider(
|
||||
self.credential,
|
||||
SCOPE,
|
||||
)
|
||||
api_key = None
|
||||
else:
|
||||
azure_ad_token_provider = None
|
||||
|
||||
self.client = AzureOpenAI(
|
||||
azure_deployment=azure_deployment,
|
||||
azure_endpoint=azure_endpoint,
|
||||
azure_ad_token_provider=azure_ad_token_provider,
|
||||
api_version=api_version,
|
||||
api_key=api_key,
|
||||
http_client=self.config.http_client,
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
import os
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
|
||||
from openai import AzureOpenAI
|
||||
|
||||
from mem0.configs.llms.base import BaseLlmConfig
|
||||
from mem0.llms.base import LLMBase
|
||||
|
||||
SCOPE = "https://cognitiveservices.azure.com/.default"
|
||||
|
||||
|
||||
class AzureOpenAIStructuredLLM(LLMBase):
|
||||
def __init__(self, config: Optional[BaseLlmConfig] = None):
|
||||
@@ -15,16 +18,28 @@ class AzureOpenAIStructuredLLM(LLMBase):
|
||||
if not self.config.model:
|
||||
self.config.model = "gpt-4o-2024-08-06"
|
||||
|
||||
api_key = os.getenv("LLM_AZURE_OPENAI_API_KEY") or self.config.azure_kwargs.api_key
|
||||
azure_deployment = os.getenv("LLM_AZURE_DEPLOYMENT") or self.config.azure_kwargs.azure_deployment
|
||||
azure_endpoint = os.getenv("LLM_AZURE_ENDPOINT") or self.config.azure_kwargs.azure_endpoint
|
||||
api_version = os.getenv("LLM_AZURE_API_VERSION") or self.config.azure_kwargs.api_version
|
||||
api_key = self.config.azure_kwargs.api_key or os.getenv("LLM_AZURE_OPENAI_API_KEY")
|
||||
azure_deployment = self.config.azure_kwargs.azure_deployment or os.getenv("LLM_AZURE_DEPLOYMENT")
|
||||
azure_endpoint = self.config.azure_kwargs.azure_endpoint or os.getenv("LLM_AZURE_ENDPOINT")
|
||||
api_version = self.config.azure_kwargs.api_version or os.getenv("LLM_AZURE_API_VERSION")
|
||||
default_headers = self.config.azure_kwargs.default_headers
|
||||
|
||||
# If the API key is not provided or is a placeholder, use DefaultAzureCredential.
|
||||
if api_key is None or api_key == "" or api_key == "your-api-key":
|
||||
self.credential = DefaultAzureCredential()
|
||||
azure_ad_token_provider = get_bearer_token_provider(
|
||||
self.credential,
|
||||
SCOPE,
|
||||
)
|
||||
api_key = None
|
||||
else:
|
||||
azure_ad_token_provider = None
|
||||
|
||||
# Can display a warning if API version is of model and api-version
|
||||
self.client = AzureOpenAI(
|
||||
azure_deployment=azure_deployment,
|
||||
azure_endpoint=azure_endpoint,
|
||||
azure_ad_token_provider=azure_ad_token_provider,
|
||||
api_version=api_version,
|
||||
api_key=api_key,
|
||||
http_client=self.config.http_client,
|
||||
|
||||
@@ -11,6 +11,7 @@ from mem0.vector_stores.base import VectorStoreBase
|
||||
try:
|
||||
from azure.core.credentials import AzureKeyCredential
|
||||
from azure.core.exceptions import ResourceNotFoundError
|
||||
from azure.identity import DefaultAzureCredential
|
||||
from azure.search.documents import SearchClient
|
||||
from azure.search.documents.indexes import SearchIndexClient
|
||||
from azure.search.documents.indexes.models import (
|
||||
@@ -77,14 +78,21 @@ class AzureAISearch(VectorStoreBase):
|
||||
self.hybrid_search = hybrid_search
|
||||
self.vector_filter_mode = vector_filter_mode
|
||||
|
||||
# If the API key is not provided or is a placeholder, use DefaultAzureCredential.
|
||||
if self.api_key is None or self.api_key == "" or self.api_key == "your-api-key":
|
||||
credential = DefaultAzureCredential()
|
||||
self.api_key = None
|
||||
else:
|
||||
credential = AzureKeyCredential(self.api_key)
|
||||
|
||||
self.search_client = SearchClient(
|
||||
endpoint=f"https://{service_name}.search.windows.net",
|
||||
index_name=self.index_name,
|
||||
credential=AzureKeyCredential(api_key),
|
||||
credential=credential,
|
||||
)
|
||||
self.index_client = SearchIndexClient(
|
||||
endpoint=f"https://{service_name}.search.windows.net",
|
||||
credential=AzureKeyCredential(api_key),
|
||||
credential=credential,
|
||||
)
|
||||
|
||||
self.search_client._client._config.user_agent_policy.add_user_agent("mem0")
|
||||
@@ -358,16 +366,23 @@ class AzureAISearch(VectorStoreBase):
|
||||
# Delete the collection
|
||||
self.delete_col()
|
||||
|
||||
# If the API key is not provided or is a placeholder, use DefaultAzureCredential.
|
||||
if self.api_key is None or self.api_key == "" or self.api_key == "your-api-key":
|
||||
credential = DefaultAzureCredential()
|
||||
self.api_key = None
|
||||
else:
|
||||
credential = AzureKeyCredential(self.api_key)
|
||||
|
||||
# Reinitialize the clients
|
||||
service_endpoint = f"https://{self.service_name}.search.windows.net"
|
||||
self.search_client = SearchClient(
|
||||
endpoint=service_endpoint,
|
||||
index_name=self.index_name,
|
||||
credential=AzureKeyCredential(self.api_key),
|
||||
credential=credential,
|
||||
)
|
||||
self.index_client = SearchIndexClient(
|
||||
endpoint=service_endpoint,
|
||||
credential=AzureKeyCredential(self.api_key),
|
||||
credential=credential,
|
||||
)
|
||||
|
||||
# Add user agent
|
||||
|
||||
Reference in New Issue
Block a user