Add SELECTED_EMBEDDING_MODEL global variable support

Introduces SELECTED_EMBEDDING_MODEL as a global environment variable in docker-compose files and ensures it is passed in API headers for Langflow-related services. Updates settings and onboarding logic to set this variable without triggering flow updates, improving embedding model configuration consistency across services.
This commit is contained in:
Edwin Jose 2025-11-25 17:47:54 -05:00
parent fdcac7c37b
commit 284b982dbf
5 changed files with 43 additions and 24 deletions

View file

@ -129,7 +129,8 @@ services:
- FILENAME=None
- MIMETYPE=None
- FILESIZE=0
- LANGFLOW_VARIABLES_TO_GET_FROM_ENVIRONMENT=JWT,OPENRAG-QUERY-FILTER,OPENSEARCH_PASSWORD,OWNER,OWNER_NAME,OWNER_EMAIL,CONNECTOR_TYPE,FILENAME,MIMETYPE,FILESIZE
- SELECTED_EMBEDDING_MODEL=text-embedding-3-small
- LANGFLOW_VARIABLES_TO_GET_FROM_ENVIRONMENT=JWT,OPENRAG-QUERY-FILTER,OPENSEARCH_PASSWORD,OWNER,OWNER_NAME,OWNER_EMAIL,CONNECTOR_TYPE,FILENAME,MIMETYPE,FILESIZE,SELECTED_EMBEDDING_MODEL
- LANGFLOW_LOG_LEVEL=DEBUG
- LANGFLOW_AUTO_LOGIN=${LANGFLOW_AUTO_LOGIN}
- LANGFLOW_SUPERUSER=${LANGFLOW_SUPERUSER}

View file

@ -130,8 +130,9 @@ services:
- FILENAME=None
- MIMETYPE=None
- FILESIZE=0
- SELECTED_EMBEDDING_MODEL=text-embedding-3-small
- OPENSEARCH_PASSWORD=${OPENSEARCH_PASSWORD}
- LANGFLOW_VARIABLES_TO_GET_FROM_ENVIRONMENT=JWT,OPENRAG-QUERY-FILTER,OPENSEARCH_PASSWORD,OWNER,OWNER_NAME,OWNER_EMAIL,CONNECTOR_TYPE,FILENAME,MIMETYPE,FILESIZE
- LANGFLOW_VARIABLES_TO_GET_FROM_ENVIRONMENT=JWT,OPENRAG-QUERY-FILTER,OPENSEARCH_PASSWORD,OWNER,OWNER_NAME,OWNER_EMAIL,CONNECTOR_TYPE,FILENAME,MIMETYPE,FILESIZE,SELECTED_EMBEDDING_MODEL
- LANGFLOW_LOG_LEVEL=DEBUG
- LANGFLOW_AUTO_LOGIN=${LANGFLOW_AUTO_LOGIN}
- LANGFLOW_SUPERUSER=${LANGFLOW_SUPERUSER}

View file

@ -614,7 +614,7 @@ async def update_settings(request, session_manager):
)
logger.info("Set OLLAMA_BASE_URL global variable in Langflow")
# Update model values across flows if provider or model changed
# Update LLM model values across flows if provider or model changed
if "llm_provider" in body or "llm_model" in body:
flows_service = _get_flows_service()
llm_provider = current_config.agent.llm_provider.lower()
@ -629,18 +629,13 @@ async def update_settings(request, session_manager):
f"Successfully updated Langflow flows for LLM provider {llm_provider}"
)
# Update SELECTED_EMBEDDING_MODEL global variable (no flow updates needed)
if "embedding_provider" in body or "embedding_model" in body:
flows_service = _get_flows_service()
embedding_provider = current_config.knowledge.embedding_provider.lower()
embedding_provider_config = current_config.get_embedding_provider_config()
embedding_endpoint = getattr(embedding_provider_config, "endpoint", None)
await flows_service.change_langflow_model_value(
embedding_provider,
embedding_model=current_config.knowledge.embedding_model,
endpoint=embedding_endpoint,
await clients._create_langflow_global_variable(
"SELECTED_EMBEDDING_MODEL", current_config.knowledge.embedding_model, modify=True
)
logger.info(
f"Successfully updated Langflow flows for embedding provider {embedding_provider}"
f"Set SELECTED_EMBEDDING_MODEL global variable to {current_config.knowledge.embedding_model}"
)
except Exception as e:
@ -928,7 +923,7 @@ async def onboarding(request, flows_service):
)
logger.info("Set OLLAMA_BASE_URL global variable in Langflow")
# Update flows with model values
# Update flows with LLM model values
if "llm_provider" in body or "llm_model" in body:
llm_provider = current_config.agent.llm_provider.lower()
llm_provider_config = current_config.get_llm_provider_config()
@ -940,16 +935,14 @@ async def onboarding(request, flows_service):
)
logger.info(f"Updated Langflow flows for LLM provider {llm_provider}")
# Set SELECTED_EMBEDDING_MODEL global variable (no flow updates needed)
if "embedding_provider" in body or "embedding_model" in body:
embedding_provider = current_config.knowledge.embedding_provider.lower()
embedding_provider_config = current_config.get_embedding_provider_config()
embedding_endpoint = getattr(embedding_provider_config, "endpoint", None)
await flows_service.change_langflow_model_value(
provider=embedding_provider,
embedding_model=current_config.knowledge.embedding_model,
endpoint=embedding_endpoint,
await clients._create_langflow_global_variable(
"SELECTED_EMBEDDING_MODEL", current_config.knowledge.embedding_model, modify=True
)
logger.info(
f"Set SELECTED_EMBEDDING_MODEL global variable to {current_config.knowledge.embedding_model}"
)
logger.info(f"Updated Langflow flows for embedding provider {embedding_provider}")
except Exception as e:
logger.error(

View file

@ -60,11 +60,17 @@ class ChatService:
"LANGFLOW_URL and LANGFLOW_CHAT_FLOW_ID environment variables are required"
)
# Prepare extra headers for JWT authentication
# Prepare extra headers for JWT authentication and embedding model
extra_headers = {}
if jwt_token:
extra_headers["X-LANGFLOW-GLOBAL-VAR-JWT"] = jwt_token
# Pass the selected embedding model as a global variable
from config.config_manager import get_openrag_config
config = get_openrag_config()
embedding_model = config.knowledge.embedding_model
extra_headers["X-LANGFLOW-GLOBAL-VAR-SELECTED_EMBEDDING_MODEL"] = embedding_model
# Get context variables for filters, limit, and threshold
from auth_context import (
get_score_threshold,
@ -169,11 +175,17 @@ class ChatService:
"LANGFLOW_URL and NUDGES_FLOW_ID environment variables are required"
)
# Prepare extra headers for JWT authentication
# Prepare extra headers for JWT authentication and embedding model
extra_headers = {}
if jwt_token:
extra_headers["X-LANGFLOW-GLOBAL-VAR-JWT"] = jwt_token
# Pass the selected embedding model as a global variable
from config.config_manager import get_openrag_config
config = get_openrag_config()
embedding_model = config.knowledge.embedding_model
extra_headers["X-LANGFLOW-GLOBAL-VAR-SELECTED_EMBEDDING_MODEL"] = embedding_model
# Build the complete filter expression like the chat service does
filter_expression = {}
has_user_filters = False
@ -287,10 +299,16 @@ class ChatService:
document_prompt = f"I'm uploading a document called '{filename}'. Here is its content:\n\n{document_content}\n\nPlease confirm you've received this document and are ready to answer questions about it."
if endpoint == "langflow":
# Prepare extra headers for JWT authentication
# Prepare extra headers for JWT authentication and embedding model
extra_headers = {}
if jwt_token:
extra_headers["X-LANGFLOW-GLOBAL-VAR-JWT"] = jwt_token
# Pass the selected embedding model as a global variable
from config.config_manager import get_openrag_config
config = get_openrag_config()
embedding_model = config.knowledge.embedding_model
extra_headers["X-LANGFLOW-GLOBAL-VAR-SELECTED_EMBEDDING_MODEL"] = embedding_model
# Ensure the Langflow client exists; try lazy init if needed
langflow_client = await clients.ensure_langflow_client()
if not langflow_client:

View file

@ -140,6 +140,11 @@ class LangflowFileService:
filename = str(file_tuples[0][0]) if file_tuples and len(file_tuples) > 0 else ""
mimetype = str(file_tuples[0][2]) if file_tuples and len(file_tuples) > 0 and len(file_tuples[0]) > 2 else ""
# Get the current embedding model from config
from config.config_manager import get_openrag_config
config = get_openrag_config()
embedding_model = config.knowledge.embedding_model
headers={
"X-Langflow-Global-Var-JWT": str(jwt_token),
"X-Langflow-Global-Var-OWNER": str(owner),
@ -149,6 +154,7 @@ class LangflowFileService:
"X-Langflow-Global-Var-FILENAME": filename,
"X-Langflow-Global-Var-MIMETYPE": mimetype,
"X-Langflow-Global-Var-FILESIZE": str(file_size_bytes),
"X-Langflow-Global-Var-SELECTED_EMBEDDING_MODEL": str(embedding_model),
}
logger.info(f"[LF] Headers {headers}")
logger.info(f"[LF] Payload {payload}")