Skip to content
9 changes: 8 additions & 1 deletion controller/attribute/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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"],
Expand Down
27 changes: 19 additions & 8 deletions controller/auth/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion controller/misc/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down
9 changes: 8 additions & 1 deletion controller/project/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions fast_api/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,7 @@ class InviteUsersBody(BaseModel):
emails: List[StrictStr]
organization_name: StrictStr
provider: Optional[StrictStr] = None
user_role: StrictStr


class CheckInviteUsersBody(BaseModel):
Expand Down
7 changes: 5 additions & 2 deletions fast_api/routes/embedding.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
]
Expand Down
4 changes: 3 additions & 1 deletion fast_api/routes/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)


Expand Down