Skip to content

Commit c41fbe3

Browse files
Add Foundry changes
1 parent dbaa233 commit c41fbe3

File tree

4 files changed

+76
-46
lines changed

4 files changed

+76
-46
lines changed

infra/main.bicep

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,6 +1105,11 @@ module keyvault 'br/public:avm/res/key-vault/vault:0.12.1' = {
11051105
{name: 'AZURE-OPENAI-PREVIEW-API-VERSION', value: azureOpenaiAPIVersion}
11061106
{name: 'AZURE-OPEN-AI-DEPLOYMENT-MODEL', value: gptModelName}
11071107
{name: 'TENANT-ID', value: subscription().tenantId}
1108+
{
1109+
name: 'AZURE-AI-AGENT-ENDPOINT'
1110+
value: aiFoundryAiProjectEndpoint
1111+
}
1112+
11081113
]
11091114
}
11101115
dependsOn:[

infra/scripts/index_scripts/02_process_data.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import time
55
import pypdf
66
from io import BytesIO
7+
from urllib.parse import urlparse
78
from azure.search.documents import SearchClient
89
from azure.storage.filedatalake import DataLakeServiceClient
910
from azure.search.documents.indexes import SearchIndexClient
@@ -36,9 +37,7 @@ def get_secrets_from_kv(secret_name: str) -> str:
3637

3738
# Retrieve secrets from Key Vault
3839
search_endpoint = get_secrets_from_kv("AZURE-SEARCH-ENDPOINT")
39-
openai_api_base = get_secrets_from_kv("AZURE-OPENAI-ENDPOINT")
40-
openai_api_version = get_secrets_from_kv("AZURE-OPENAI-PREVIEW-API-VERSION")
41-
deployment = get_secrets_from_kv("AZURE-OPEN-AI-DEPLOYMENT-MODEL")
40+
ai_project_endpoint = get_secrets_from_kv("AZURE-AI-AGENT-ENDPOINT")
4241
account_name = get_secrets_from_kv("ADLS-ACCOUNT-NAME")
4342
print("Secrets retrieved from Key Vault.")
4443

@@ -58,15 +57,29 @@ def get_secrets_from_kv(secret_name: str) -> str:
5857

5958

6059
# Function: Get Embeddings
61-
def get_embeddings(text: str, openai_api_base, openai_api_version):
62-
model_id = "text-embedding-ada-002"
63-
client = EmbeddingsClient(
64-
endpoint=f"{openai_api_base}/openai/deployments/{model_id}",
60+
def get_embeddings(text: str, ai_project_endpoint: str):
61+
"""Get embeddings using Azure AI Foundry SDK.
62+
63+
Args:
64+
text: Text to embed
65+
ai_project_endpoint: Azure AI Project endpoint from Key Vault
66+
(e.g., https://aif-xyz.services.ai.azure.com/api/projects/proj-xyz)
67+
68+
Returns:
69+
List of embedding values
70+
"""
71+
embedding_model = "text-embedding-ada-002"
72+
73+
# Construct inference endpoint with /models path
74+
inference_endpoint = f"https://{urlparse(ai_project_endpoint).netloc}/models"
75+
76+
embeddings_client = EmbeddingsClient(
77+
endpoint=inference_endpoint,
6578
credential=credential,
6679
credential_scopes=["https://cognitiveservices.azure.com/.default"]
6780
)
6881

69-
response = client.embed(input=[text])
82+
response = embeddings_client.embed(model=embedding_model, input=[text])
7083
embedding = response.data[0].embedding
7184
return embedding
7285

@@ -124,12 +137,12 @@ def prepare_search_doc(content, document_id):
124137
chunk_id = f"{document_id}_{str(idx).zfill(2)}"
125138

126139
try:
127-
v_contentVector = get_embeddings(str(chunk), openai_api_base, openai_api_version)
140+
v_contentVector = get_embeddings(str(chunk), ai_project_endpoint)
128141
except Exception as e:
129142
print(f"Error occurred: {e}. Retrying after 30 seconds...")
130143
time.sleep(30)
131144
try:
132-
v_contentVector = get_embeddings(str(chunk), openai_api_base, openai_api_version)
145+
v_contentVector = get_embeddings(str(chunk), ai_project_endpoint)
133146
except Exception as e:
134147
print(f"Retry failed: {e}. Setting v_contentVector to an empty list.")
135148
v_contentVector = []

infra/scripts/run_create_index_scripts.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ fi
119119
#Replace key vault name
120120
sed -i "s/kv_to-be-replaced/${keyvaultName}/g" "infra/scripts/index_scripts/01_create_search_index.py"
121121
sed -i "s/kv_to-be-replaced/${keyvaultName}/g" "infra/scripts/index_scripts/02_process_data.py"
122+
sed -i "s/kv_to-be-replaced/${keyvaultName}/g" "scripts/data_utils.py"
122123
if [ -n "$managedIdentityClientId" ]; then
123124
sed -i "s/mici_to-be-replaced/${managedIdentityClientId}/g" "infra/scripts/index_scripts/01_create_search_index.py"
124125
sed -i "s/mici_to-be-replaced/${managedIdentityClientId}/g" "infra/scripts/index_scripts/02_process_data.py"
@@ -181,6 +182,7 @@ fi
181182
# revert the key vault name and managed identity client id in the python files
182183
sed -i "s/${keyvaultName}/kv_to-be-replaced/g" "infra/scripts/index_scripts/01_create_search_index.py"
183184
sed -i "s/${keyvaultName}/kv_to-be-replaced/g" "infra/scripts/index_scripts/02_process_data.py"
185+
sed -i "s/${keyvaultName}/kv_to-be-replaced/g" "scripts/data_utils.py"
184186
if [ -n "$managedIdentityClientId" ]; then
185187
sed -i "s/${managedIdentityClientId}/mici_to-be-replaced/g" "infra/scripts/index_scripts/01_create_search_index.py"
186188
sed -i "s/${managedIdentityClientId}/mici_to-be-replaced/g" "infra/scripts/index_scripts/02_process_data.py"

scripts/data_utils.py

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from dataclasses import dataclass
1414
from functools import partial
1515
from typing import Any, Callable, Dict, Generator, List, Optional, Tuple, Union
16+
from urllib.parse import urlparse
1617

1718
import fitz
1819
import markdown
@@ -22,6 +23,8 @@
2223
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest
2324
from azure.ai.inference import EmbeddingsClient
2425
from azure.core.credentials import AzureKeyCredential
26+
from azure.identity import AzureCliCredential
27+
from azure.keyvault.secrets import SecretClient
2528
from azure.storage.blob import ContainerClient
2629
from bs4 import BeautifulSoup
2730
from dotenv import load_dotenv
@@ -34,6 +37,27 @@
3437
# Configure environment variables
3538
load_dotenv() # take environment variables from .env.
3639

40+
# Key Vault name - replaced during deployment
41+
key_vault_name = 'kv_to-be-replaced'
42+
43+
44+
def get_secrets_from_kv(secret_name: str) -> str:
45+
"""Retrieves a secret value from Azure Key Vault.
46+
47+
Args:
48+
secret_name: Name of the secret
49+
50+
Returns:
51+
The secret value
52+
"""
53+
kv_credential = AzureCliCredential()
54+
secret_client = SecretClient(
55+
vault_url=f"https://{key_vault_name}.vault.azure.net/",
56+
credential=kv_credential
57+
)
58+
return secret_client.get_secret(secret_name).value
59+
60+
3761
FILE_FORMAT_DICT = {
3862
"md": "markdown",
3963
"txt": "text",
@@ -825,47 +849,33 @@ def get_payload_and_headers_cohere(text, aad_token) -> Tuple[Dict, Dict]:
825849
def get_embedding(
826850
text, embedding_model_endpoint=None, embedding_model_key=None, azure_credential=None
827851
):
828-
endpoint = (
829-
embedding_model_endpoint
830-
if embedding_model_endpoint
831-
else os.environ.get("EMBEDDING_MODEL_ENDPOINT")
832-
)
833-
834-
FLAG_EMBEDDING_MODEL = os.getenv("FLAG_EMBEDDING_MODEL", "AOAI")
835-
836-
if azure_credential is None and (endpoint is None):
837-
raise Exception(
838-
"EMBEDDING_MODEL_ENDPOINT and EMBEDDING_MODEL_KEY are required for embedding"
839-
)
852+
# Get AI Project endpoint from Key Vault
853+
ai_project_endpoint = get_secrets_from_kv("AZURE-AI-AGENT-ENDPOINT")
854+
855+
# Construct inference endpoint: https://aif-xyz.services.ai.azure.com/models
856+
inference_endpoint = f"https://{urlparse(ai_project_endpoint).netloc}/models"
857+
embedding_model = "text-embedding-ada-002"
840858

841859
try:
842-
if FLAG_EMBEDDING_MODEL == "AOAI":
843-
deployment_id = "embedding"
844-
845-
if azure_credential is not None:
846-
# Use managed identity credential with credential_scopes parameter
847-
client = EmbeddingsClient(
848-
endpoint=f"{endpoint}/openai/deployments/{deployment_id}",
849-
credential=azure_credential,
850-
credential_scopes=["https://cognitiveservices.azure.com/.default"]
851-
)
852-
else:
853-
# Use API key credential
854-
api_key = (
855-
embedding_model_key
856-
if embedding_model_key
857-
else os.getenv("AZURE_OPENAI_API_KEY")
858-
)
859-
client = EmbeddingsClient(
860-
endpoint=f"{endpoint}/openai/deployments/{deployment_id}",
861-
credential=AzureKeyCredential(api_key)
862-
)
863-
response = client.embed(input=[text])
864-
return response.data[0].embedding
860+
if azure_credential is not None:
861+
embeddings_client = EmbeddingsClient(
862+
endpoint=inference_endpoint,
863+
credential=azure_credential,
864+
credential_scopes=["https://cognitiveservices.azure.com/.default"]
865+
)
866+
else:
867+
api_key = embedding_model_key or os.getenv("AZURE_OPENAI_API_KEY")
868+
embeddings_client = EmbeddingsClient(
869+
endpoint=inference_endpoint,
870+
credential=AzureKeyCredential(api_key)
871+
)
872+
873+
response = embeddings_client.embed(model=embedding_model, input=[text])
874+
return response.data[0].embedding
865875

866876
except Exception as e:
867877
raise Exception(
868-
f"Error getting embeddings with endpoint={endpoint} with error={e}"
878+
f"Error getting embeddings with endpoint={inference_endpoint} with error={e}"
869879
)
870880

871881

0 commit comments

Comments
 (0)