diff --git a/controller/attribute/util.py b/controller/attribute/util.py index b715c9d4..6a88933e 100644 --- a/controller/attribute/util.py +++ b/controller/attribute/util.py @@ -250,7 +250,6 @@ def prepare_llm_response_code( llm_playground_config: Union[Dict[str, Any], None] = None, llm_ac_cache_access_link: Union[str, None] = None, llm_ac_cache_file_upload_link: Union[str, None] = None, - num_workers: int = 100, max_api_call_retries: int = 5, retry_sleep_seconds: int = 5, ) -> str: @@ -294,6 +293,14 @@ async def ac(record): ) validate_llm_config(llm_config=llm_config) + num_workers = 50 + if ( + llm_config is not None + and enums.LLMProvider.from_string(llm_config.get("llmIdentifier", "Open ai")) + == enums.LLMProvider.AZURE_FOUNDRY + ): + num_workers = 25 + try: llm_config_mapping = { "@@API_KEY@@": llm_config["apiKey"], diff --git a/controller/auth/manager.py b/controller/auth/manager.py index e7a1c31b..f3bcca27 100644 --- a/controller/auth/manager.py +++ b/controller/auth/manager.py @@ -19,7 +19,7 @@ DEV_USER_ID = "741df1c2-a531-43b6-b259-df23bc78e9a2" -EMAIL_RE = re.compile(r"[\w\.-]+@[\w\.-]+\.\w+") +EMAIL_RE = re.compile(r"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$") def get_organization_id_by_info(info) -> Organization: @@ -174,7 +174,10 @@ def check_is_full_admin(request: Any) -> bool: def invite_users( - emails: List[str], organization_name: str, provider: Optional[str] = None + emails: List[str], + organization_name: str, + user_role: str, + provider: Optional[str] = None, ): user_ids = [] for email in emails: @@ -186,6 +189,9 @@ def invite_users( # Assign the account to the organization user_manager.update_organization_of_user(organization_name, email) + # Assign the user role + user_manager.update_user_role(user["id"], user_role) + # Get the recovery link for the email recovery_link = kratos.get_recovery_link(user["id"]) if not recovery_link: @@ -197,13 +203,18 @@ def invite_users( def check_valid_emails(emails: List[str]): - valid_emails = [ - email - for email in emails - if is_valid_email(email) and not kratos.check_user_exists(email) - ] + message = "" + valid_emails = [] + for email in emails: + if not is_valid_email(email): + message += f"{email} is not a valid email address." + elif kratos.check_user_exists(email): + message += f"{email} already exists." + else: + valid_emails.append(email) + all_valid = len(valid_emails) == len(emails) - return {"valid_emails": valid_emails, "all_valid": all_valid} + return {"valid_emails": valid_emails, "all_valid": all_valid, "message": message} def is_valid_email(email: str) -> bool: diff --git a/controller/misc/manager.py b/controller/misc/manager.py index a6cb8227..946eb1bb 100644 --- a/controller/misc/manager.py +++ b/controller/misc/manager.py @@ -93,7 +93,7 @@ def finalize_customer_buttons( for e in buttons: e[key_name] = name_lookup[str(e[key])] e[key_name] = ( - (e[key_name]["first"] + " " + e[key_name]["last"]) + (e[key_name].get("first", "") + " " + e[key_name].get("last", "")) if e[key_name] else "Unknown" ) diff --git a/controller/project/manager.py b/controller/project/manager.py index 78c91c1f..716d129b 100644 --- a/controller/project/manager.py +++ b/controller/project/manager.py @@ -23,6 +23,7 @@ from controller.task_master import manager as task_master_manager from submodules.model.enums import TaskType, RecordTokenizationScope from submodules.model.business_objects import util as db_util +from submodules.model.cognition_objects import integration as integration_db_co from submodules.model.integration_objects.helper import ( REFINERY_ATTRIBUTE_ACCESS_GROUPS, REFINERY_ATTRIBUTE_ACCESS_USERS, @@ -133,12 +134,16 @@ def is_access_management_activated(project_id: str) -> bool: return access_groups is not None and access_users is not None -def get_all_projects_by_user(organization_id) -> List[Project]: +def get_all_projects_by_user(organization_id: str) -> List[Project]: projects = project.get_all_by_user_organization_id(organization_id) project_dicts = sql_alchemy_to_dict( projects, column_whitelist=ALL_PROJECTS_WHITELIST ) + all_integration_project_ids = { + i.project_id for i in integration_db_co.get_all_in_org(organization_id) + } + for p in project_dicts: user_id = p["created_by"] names, mail = kratos.resolve_user_name_and_email_by_id(user_id) @@ -155,6 +160,8 @@ def get_all_projects_by_user(organization_id) -> List[Project]: else: p["num_data_scale_uploaded"] = record.get_count_scale_uploaded(p["id"]) + p["is_integration_project"] = p["id"] in all_integration_project_ids + del p["created_by"] return project_dicts diff --git a/fast_api/models.py b/fast_api/models.py index bd667a9b..ab44f950 100644 --- a/fast_api/models.py +++ b/fast_api/models.py @@ -502,6 +502,7 @@ class InviteUsersBody(BaseModel): emails: List[StrictStr] organization_name: StrictStr provider: Optional[StrictStr] = None + user_role: StrictStr class CheckInviteUsersBody(BaseModel): diff --git a/fast_api/routes/embedding.py b/fast_api/routes/embedding.py index d482adec..6e51dbe6 100644 --- a/fast_api/routes/embedding.py +++ b/fast_api/routes/embedding.py @@ -16,7 +16,7 @@ from controller.auth import manager as auth_manager from controller.embedding.connector import collection_on_qdrant from submodules.model.enums import TaskType -from submodules.model.business_objects import embedding +from submodules.model.business_objects import embedding as embedding_bo from submodules.model.cognition_objects import environment_variable as env_var_db_bo from submodules.model.util import sql_alchemy_to_dict from util import notification, spacy_util @@ -51,13 +51,16 @@ def language_models(request: Request) -> List: dependencies=[Depends(auth_manager.check_project_access_dep)], ) def get_embeddings(project_id: str) -> List: - embeddings_extended = embedding.get_all_embeddings_by_project_id_extended( + embeddings_extended = embedding_bo.get_all_embeddings_by_project_id_extended( project_id ) data = [ { **sql_alchemy_to_dict(embedding), "on_qdrant": collection_on_qdrant(project_id, embedding["id"]), + "count": sql_alchemy_to_dict( + embedding_bo.get_tensor_count(embedding["id"]) + ), } for embedding in embeddings_extended ] diff --git a/fast_api/routes/misc.py b/fast_api/routes/misc.py index 9ad178c8..aae1f4a9 100644 --- a/fast_api/routes/misc.py +++ b/fast_api/routes/misc.py @@ -293,7 +293,9 @@ def get_is_full_admin(request: Request) -> Dict: def invite_users(request: Request, body: InviteUsersBody = Body(...)): if not auth.check_is_full_admin(request): raise AuthManagerError("Full admin access required") - data = auth.invite_users(body.emails, body.organization_name, body.provider) + data = auth.invite_users( + body.emails, body.organization_name, body.user_role, body.provider + ) return pack_json_result(data) diff --git a/submodules/model b/submodules/model index 19c0a4d2..c5663e9c 160000 --- a/submodules/model +++ b/submodules/model @@ -1 +1 @@ -Subproject commit 19c0a4d25233fa0a7d5c4ee5377954c0594d2750 +Subproject commit c5663e9c855c30b431d106811a8330301c84eb24