diff --git a/backend/llm/__init__.py b/backend/llm/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/backend/llm/__init__.py @@ -0,0 +1 @@ + diff --git a/backend/llm/prompts/CONDENSE_PROMPT.py b/backend/llm/prompts/CONDENSE_PROMPT.py new file mode 100644 index 000000000..5d1b24ae0 --- /dev/null +++ b/backend/llm/prompts/CONDENSE_PROMPT.py @@ -0,0 +1,9 @@ +from langchain.prompts.prompt import PromptTemplate + +_template = """Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question, in its original language. include the follow up instructions in the standalone question. + +Chat History: +{chat_history} +Follow Up Input: {question} +Standalone question:""" +CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template(_template) diff --git a/backend/__init__.py b/backend/llm/tests/test_knowledge_brain_qa.py similarity index 100% rename from backend/__init__.py rename to backend/llm/tests/test_knowledge_brain_qa.py diff --git a/backend/utils/call_brain_api.py b/backend/llm/utils/call_brain_api.py similarity index 91% rename from backend/utils/call_brain_api.py rename to backend/llm/utils/call_brain_api.py index f5b4d51be..2974118cc 100644 --- a/backend/utils/call_brain_api.py +++ b/backend/llm/utils/call_brain_api.py @@ -1,10 +1,10 @@ from uuid import UUID from fastapi import HTTPException -from utils.extract_api_brain_definition_values_from_llm_output import ( +from llm.utils.extract_api_brain_definition_values_from_llm_output import ( extract_api_brain_definition_values_from_llm_output, ) -from utils.make_api_request import get_api_call_response_as_text +from llm.utils.make_api_request import get_api_call_response_as_text from modules.brain.service.api_brain_definition_service import ApiBrainDefinitionService from modules.brain.service.brain_service import BrainService diff --git a/backend/utils/extract_api_brain_definition_values_from_llm_output.py b/backend/llm/utils/extract_api_brain_definition_values_from_llm_output.py similarity index 100% rename from backend/utils/extract_api_brain_definition_values_from_llm_output.py rename to backend/llm/utils/extract_api_brain_definition_values_from_llm_output.py diff --git a/backend/utils/extract_api_definition.py b/backend/llm/utils/extract_api_definition.py similarity index 100% rename from backend/utils/extract_api_definition.py rename to backend/llm/utils/extract_api_definition.py diff --git a/backend/utils/format_chat_history.py b/backend/llm/utils/format_chat_history.py similarity index 100% rename from backend/utils/format_chat_history.py rename to backend/llm/utils/format_chat_history.py diff --git a/backend/utils/get_api_brain_definition_as_json_schema.py b/backend/llm/utils/get_api_brain_definition_as_json_schema.py similarity index 89% rename from backend/utils/get_api_brain_definition_as_json_schema.py rename to backend/llm/utils/get_api_brain_definition_as_json_schema.py index aea38bc93..5f2499ee8 100644 --- a/backend/utils/get_api_brain_definition_as_json_schema.py +++ b/backend/llm/utils/get_api_brain_definition_as_json_schema.py @@ -1,6 +1,6 @@ from fastapi import HTTPException -from utils.extract_api_definition import format_api_brain_property -from utils.sanitize_function_name import sanitize_function_name +from llm.utils.extract_api_definition import format_api_brain_property +from llm.utils.sanitize_function_name import sanitize_function_name from modules.brain.entity.brain_entity import BrainEntity from modules.brain.service.api_brain_definition_service import ApiBrainDefinitionService diff --git a/backend/utils/get_prompt_to_use.py b/backend/llm/utils/get_prompt_to_use.py similarity index 86% rename from backend/utils/get_prompt_to_use.py rename to backend/llm/utils/get_prompt_to_use.py index 112fce3cb..f49269210 100644 --- a/backend/utils/get_prompt_to_use.py +++ b/backend/llm/utils/get_prompt_to_use.py @@ -1,7 +1,7 @@ from typing import Optional from uuid import UUID -from utils.get_prompt_to_use_id import get_prompt_to_use_id +from llm.utils.get_prompt_to_use_id import get_prompt_to_use_id from modules.prompt.service import PromptService promptService = PromptService() diff --git a/backend/utils/get_prompt_to_use_id.py b/backend/llm/utils/get_prompt_to_use_id.py similarity index 100% rename from backend/utils/get_prompt_to_use_id.py rename to backend/llm/utils/get_prompt_to_use_id.py diff --git a/backend/utils/make_api_request.py b/backend/llm/utils/make_api_request.py similarity index 100% rename from backend/utils/make_api_request.py rename to backend/llm/utils/make_api_request.py diff --git a/backend/utils/sanitize_function_name.py b/backend/llm/utils/sanitize_function_name.py similarity index 100% rename from backend/utils/sanitize_function_name.py rename to backend/llm/utils/sanitize_function_name.py diff --git a/backend/models/__init__.py b/backend/models/__init__.py index 9a53a8e6d..fda320434 100644 --- a/backend/models/__init__.py +++ b/backend/models/__init__.py @@ -3,3 +3,4 @@ from .files import File from .settings import (BrainRateLimiting, BrainSettings, ResendSettings, get_documents_vector_store, get_embeddings, get_supabase_client, get_supabase_db) +from .user_usage import UserUsage diff --git a/backend/models/databases/llm_models.py b/backend/models/databases/entity.py similarity index 100% rename from backend/models/databases/llm_models.py rename to backend/models/databases/entity.py diff --git a/backend/models/databases/repository.py b/backend/models/databases/repository.py index 1c473ff75..62c5c4551 100644 --- a/backend/models/databases/repository.py +++ b/backend/models/databases/repository.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from datetime import datetime from uuid import UUID -from .llm_models import LLMModels +from .entity import LLMModels class Repository(ABC): diff --git a/backend/models/databases/supabase/user_usage.py b/backend/models/databases/supabase/user_usage.py index 9e69038ec..767d3af9b 100644 --- a/backend/models/databases/supabase/user_usage.py +++ b/backend/models/databases/supabase/user_usage.py @@ -7,7 +7,6 @@ from models.databases.repository import Repository logger = get_logger(__name__) -#TODO: change the name of this class because another one already exists class UserUsage(Repository): def __init__(self, supabase_client): self.db = supabase_client diff --git a/backend/modules/user/service/user_usage.py b/backend/models/user_usage.py similarity index 100% rename from backend/modules/user/service/user_usage.py rename to backend/models/user_usage.py diff --git a/backend/modules/assistant/ito/ito.py b/backend/modules/assistant/ito/ito.py index 0a92fbb5f..3cdcf3f29 100644 --- a/backend/modules/assistant/ito/ito.py +++ b/backend/modules/assistant/ito/ito.py @@ -9,7 +9,7 @@ from typing import List, Optional from fastapi import UploadFile from logger import get_logger -from modules.user.service.user_usage import UserUsage +from models.user_usage import UserUsage from modules.assistant.dto.inputs import InputAssistant from modules.assistant.ito.utils.pdf_generator import PDFGenerator, PDFModel from modules.chat.controller.chat.utils import update_user_usage diff --git a/backend/modules/brain/api_brain_qa.py b/backend/modules/brain/api_brain_qa.py index 411044a56..9b5677c42 100644 --- a/backend/modules/brain/api_brain_qa.py +++ b/backend/modules/brain/api_brain_qa.py @@ -6,8 +6,8 @@ import jq import requests from fastapi import HTTPException from litellm import completion -from utils.call_brain_api import call_brain_api -from utils.get_api_brain_definition_as_json_schema import ( +from llm.utils.call_brain_api import call_brain_api +from llm.utils.get_api_brain_definition_as_json_schema import ( get_api_brain_definition_as_json_schema, ) from logger import get_logger diff --git a/backend/modules/brain/controller/brain_routes.py b/backend/modules/brain/controller/brain_routes.py index df70c94a9..480e5e88e 100644 --- a/backend/modules/brain/controller/brain_routes.py +++ b/backend/modules/brain/controller/brain_routes.py @@ -4,6 +4,7 @@ from uuid import UUID from fastapi import APIRouter, Depends, HTTPException from logger import get_logger from middlewares.auth.auth_bearer import AuthBearer, get_current_user +from models import UserUsage from modules.brain.dto.inputs import ( BrainQuestionRequest, BrainUpdatableProperties, @@ -14,14 +15,13 @@ from modules.brain.entity.integration_brain import IntegrationDescriptionEntity from modules.brain.service.brain_authorization_service import has_brain_authorization from modules.brain.service.brain_service import BrainService from modules.brain.service.brain_user_service import BrainUserService -from modules.brain.service.get_question_context_from_brain import get_question_context_from_brain from modules.brain.service.integration_brain_service import ( IntegrationBrainDescriptionService, ) from modules.prompt.service.prompt_service import PromptService from modules.user.entity.user_identity import UserIdentity -from modules.user.service.user_usage import UserUsage from packages.utils.telemetry import maybe_send_telemetry +from repository.brain import get_question_context_from_brain logger = get_logger(__name__) brain_router = APIRouter() diff --git a/backend/modules/brain/integrations/Notion/Notion_connector.py b/backend/modules/brain/integrations/Notion/Notion_connector.py index 013d054b7..72d3d5341 100644 --- a/backend/modules/brain/integrations/Notion/Notion_connector.py +++ b/backend/modules/brain/integrations/Notion/Notion_connector.py @@ -14,7 +14,7 @@ from modules.knowledge.dto.inputs import CreateKnowledgeProperties from modules.knowledge.repository.knowledge_interface import KnowledgeInterface from modules.knowledge.service.knowledge_service import KnowledgeService from pydantic import BaseModel -from modules.upload.service.upload_file import upload_file_storage +from repository.files.upload_file import upload_file_storage logger = get_logger(__name__) diff --git a/backend/modules/brain/knowledge_brain_qa.py b/backend/modules/brain/knowledge_brain_qa.py index de0bdc91f..a7fd7a679 100644 --- a/backend/modules/brain/knowledge_brain_qa.py +++ b/backend/modules/brain/knowledge_brain_qa.py @@ -3,12 +3,12 @@ from typing import AsyncIterable, List, Optional from uuid import UUID from langchain.callbacks.streaming_aiter import AsyncIteratorCallbackHandler -from utils.format_chat_history import format_chat_history -from utils.get_prompt_to_use import get_prompt_to_use -from utils.get_prompt_to_use_id import get_prompt_to_use_id +from llm.utils.format_chat_history import format_chat_history +from llm.utils.get_prompt_to_use import get_prompt_to_use +from llm.utils.get_prompt_to_use_id import get_prompt_to_use_id from logger import get_logger from models import BrainSettings -from modules.user.service.user_usage import UserUsage +from models.user_usage import UserUsage from modules.brain.entity.brain_entity import BrainEntity from modules.brain.qa_interface import QAInterface from modules.brain.rags.quivr_rag import QuivrRAG @@ -24,7 +24,7 @@ from modules.chat.dto.outputs import GetChatHistoryOutput from modules.chat.service.chat_service import ChatService from pydantic import BaseModel, ConfigDict from pydantic_settings import BaseSettings -from modules.upload.service.generate_file_signed_url import generate_file_signed_url +from repository.files.generate_file_signed_url import generate_file_signed_url logger = get_logger(__name__) QUIVR_DEFAULT_PROMPT = "Your name is Quivr. You're a helpful assistant. If you don't know the answer, just say that you don't know, don't try to make up an answer." diff --git a/backend/modules/brain/qa_headless.py b/backend/modules/brain/qa_headless.py index 3effdf1b9..2ef54082d 100644 --- a/backend/modules/brain/qa_headless.py +++ b/backend/modules/brain/qa_headless.py @@ -8,12 +8,12 @@ from langchain.chains import LLMChain from langchain.chat_models.base import BaseChatModel from langchain.prompts.chat import ChatPromptTemplate, HumanMessagePromptTemplate from langchain_community.chat_models import ChatLiteLLM -from utils.format_chat_history import ( +from llm.utils.format_chat_history import ( format_chat_history, format_history_to_openai_mesages, ) -from utils.get_prompt_to_use import get_prompt_to_use -from utils.get_prompt_to_use_id import get_prompt_to_use_id +from llm.utils.get_prompt_to_use import get_prompt_to_use +from llm.utils.get_prompt_to_use_id import get_prompt_to_use_id from logger import get_logger from models import BrainSettings # Importing settings related to the 'brain' from modules.brain.qa_interface import QAInterface diff --git a/backend/modules/brain/rags/new_quivr_rag.py b/backend/modules/brain/rags/new_quivr_rag.py index 720a4d7d8..d09fb7058 100644 --- a/backend/modules/brain/rags/new_quivr_rag.py +++ b/backend/modules/brain/rags/new_quivr_rag.py @@ -12,7 +12,7 @@ from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate, PromptTemplate from langchain_core.runnables import RunnableParallel, RunnablePassthrough from langchain_openai import ChatOpenAI, OpenAIEmbeddings -from utils.get_prompt_to_use import get_prompt_to_use +from llm.utils.get_prompt_to_use import get_prompt_to_use from logger import get_logger from models import BrainSettings # Importing settings related to the 'brain' from modules.brain.service.brain_service import BrainService diff --git a/backend/modules/brain/rags/quivr_rag.py b/backend/modules/brain/rags/quivr_rag.py index 526200cde..a7f026013 100644 --- a/backend/modules/brain/rags/quivr_rag.py +++ b/backend/modules/brain/rags/quivr_rag.py @@ -14,7 +14,7 @@ from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate, PromptTemplate from langchain_core.runnables import RunnableLambda, RunnablePassthrough from langchain_openai import OpenAIEmbeddings -from utils.get_prompt_to_use import get_prompt_to_use +from llm.utils.get_prompt_to_use import get_prompt_to_use from logger import get_logger from models import BrainSettings # Importing settings related to the 'brain' from modules.brain.service.brain_service import BrainService diff --git a/backend/modules/chat/controller/chat/utils.py b/backend/modules/chat/controller/chat/utils.py index ea7eee95a..7fe8eba81 100644 --- a/backend/modules/chat/controller/chat/utils.py +++ b/backend/modules/chat/controller/chat/utils.py @@ -3,10 +3,10 @@ from uuid import UUID from fastapi import HTTPException from logger import get_logger -from models.databases.llm_models import LLMModels +from models import UserUsage +from models.databases.entity import LLMModels from modules.brain.service.brain_service import BrainService from modules.chat.service.chat_service import ChatService -from modules.user.service.user_usage import UserUsage logger = get_logger(__name__) brain_service = BrainService() diff --git a/backend/modules/chat/controller/chat_routes.py b/backend/modules/chat/controller/chat_routes.py index 535e8a8e4..6b0fa0b4a 100644 --- a/backend/modules/chat/controller/chat_routes.py +++ b/backend/modules/chat/controller/chat_routes.py @@ -8,7 +8,7 @@ from langchain_openai import OpenAIEmbeddings from logger import get_logger from middlewares.auth import AuthBearer, get_current_user from models.settings import BrainSettings, get_supabase_client -from modules.user.service.user_usage import UserUsage +from models.user_usage import UserUsage from modules.brain.service.brain_service import BrainService from modules.chat.controller.chat.brainful_chat import BrainfulChat from modules.chat.dto.chats import ChatItem, ChatQuestion diff --git a/backend/modules/knowledge/controller/knowledge_routes.py b/backend/modules/knowledge/controller/knowledge_routes.py index 98e282b31..b8d09b26e 100644 --- a/backend/modules/knowledge/controller/knowledge_routes.py +++ b/backend/modules/knowledge/controller/knowledge_routes.py @@ -11,7 +11,7 @@ from modules.brain.service.brain_authorization_service import ( from modules.brain.service.brain_vector_service import BrainVectorService from modules.knowledge.service.knowledge_service import KnowledgeService from modules.user.entity.user_identity import UserIdentity -from modules.upload.service.generate_file_signed_url import generate_file_signed_url +from repository.files.generate_file_signed_url import generate_file_signed_url knowledge_router = APIRouter() logger = get_logger(__name__) diff --git a/backend/modules/upload/controller/upload_routes.py b/backend/modules/upload/controller/upload_routes.py index c7086fc47..0345daa0c 100644 --- a/backend/modules/upload/controller/upload_routes.py +++ b/backend/modules/upload/controller/upload_routes.py @@ -22,7 +22,7 @@ from modules.notification.service.notification_service import NotificationServic from modules.user.entity.user_identity import UserIdentity from packages.files.file import convert_bytes, get_file_size from packages.utils.telemetry import maybe_send_telemetry -from modules.upload.service.upload_file import upload_file_storage +from repository.files.upload_file import upload_file_storage logger = get_logger(__name__) upload_router = APIRouter() diff --git a/backend/modules/user/__init__.py b/backend/modules/user/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/backend/packages/files/parsers/common.py b/backend/packages/files/parsers/common.py index 379566c6b..d439d8808 100644 --- a/backend/packages/files/parsers/common.py +++ b/backend/packages/files/parsers/common.py @@ -5,7 +5,7 @@ from logger import get_logger from models import File from modules.brain.service.brain_vector_service import BrainVectorService from packages.embeddings.vectors import Neurons -from modules.upload.service.upload_file import DocumentSerializable +from repository.files.upload_file import DocumentSerializable logger = get_logger(__name__) diff --git a/backend/modules/brain/service/__init__.py b/backend/repository/__init__.py similarity index 100% rename from backend/modules/brain/service/__init__.py rename to backend/repository/__init__.py diff --git a/backend/repository/brain/__init__.py b/backend/repository/brain/__init__.py new file mode 100644 index 000000000..408a2528a --- /dev/null +++ b/backend/repository/brain/__init__.py @@ -0,0 +1 @@ +from .get_question_context_from_brain import get_question_context_from_brain diff --git a/backend/modules/brain/service/get_question_context_from_brain.py b/backend/repository/brain/get_question_context_from_brain.py similarity index 95% rename from backend/modules/brain/service/get_question_context_from_brain.py rename to backend/repository/brain/get_question_context_from_brain.py index da7b9aa44..14eca2c96 100644 --- a/backend/modules/brain/service/get_question_context_from_brain.py +++ b/backend/repository/brain/get_question_context_from_brain.py @@ -3,7 +3,7 @@ from uuid import UUID from attr import dataclass from logger import get_logger from models.settings import get_embeddings, get_supabase_client -from modules.upload.service.generate_file_signed_url import generate_file_signed_url +from repository.files.generate_file_signed_url import generate_file_signed_url from vectorstore.supabase import CustomSupabaseVectorStore logger = get_logger(__name__) diff --git a/backend/modules/brain/service/brain_subscription/__init__.py b/backend/repository/brain_subscription/__init__.py similarity index 76% rename from backend/modules/brain/service/brain_subscription/__init__.py rename to backend/repository/brain_subscription/__init__.py index efe9797fc..2eae654b4 100644 --- a/backend/modules/brain/service/brain_subscription/__init__.py +++ b/backend/repository/brain_subscription/__init__.py @@ -1,2 +1,3 @@ +from .get_brain_url import get_brain_url from .resend_invitation_email import resend_invitation_email from .subscription_invitation_service import SubscriptionInvitationService diff --git a/backend/repository/brain_subscription/get_brain_url.py b/backend/repository/brain_subscription/get_brain_url.py new file mode 100644 index 000000000..cf01199aa --- /dev/null +++ b/backend/repository/brain_subscription/get_brain_url.py @@ -0,0 +1,8 @@ +import os +from uuid import UUID + + +def get_brain_url(origin: str, brain_id: UUID) -> str: + """Generates the brain URL based on the brain_id.""" + + return f"{origin}/invitation/{brain_id}" diff --git a/backend/modules/brain/service/brain_subscription/resend_invitation_email.py b/backend/repository/brain_subscription/resend_invitation_email.py similarity index 89% rename from backend/modules/brain/service/brain_subscription/resend_invitation_email.py rename to backend/repository/brain_subscription/resend_invitation_email.py index c2deb533f..cc2048a56 100644 --- a/backend/modules/brain/service/brain_subscription/resend_invitation_email.py +++ b/backend/repository/brain_subscription/resend_invitation_email.py @@ -4,18 +4,13 @@ from logger import get_logger from models import BrainSettings, BrainSubscription from modules.brain.service.brain_service import BrainService from packages.emails.send_email import send_email +from repository.brain_subscription import get_brain_url logger = get_logger(__name__) brain_service = BrainService() -def get_brain_url(origin: str, brain_id: UUID) -> str: - """Generates the brain URL based on the brain_id.""" - - return f"{origin}/invitation/{brain_id}" - - def resend_invitation_email( brain_subscription: BrainSubscription, inviter_email: str, diff --git a/backend/modules/brain/service/brain_subscription/subscription_invitation_service.py b/backend/repository/brain_subscription/subscription_invitation_service.py similarity index 100% rename from backend/modules/brain/service/brain_subscription/subscription_invitation_service.py rename to backend/repository/brain_subscription/subscription_invitation_service.py diff --git a/backend/modules/upload/service/__init__.py b/backend/repository/files/__init__.py similarity index 100% rename from backend/modules/upload/service/__init__.py rename to backend/repository/files/__init__.py diff --git a/backend/modules/upload/service/generate_file_signed_url.py b/backend/repository/files/generate_file_signed_url.py similarity index 100% rename from backend/modules/upload/service/generate_file_signed_url.py rename to backend/repository/files/generate_file_signed_url.py diff --git a/backend/modules/upload/service/list_files.py b/backend/repository/files/list_files.py similarity index 100% rename from backend/modules/upload/service/list_files.py rename to backend/repository/files/list_files.py diff --git a/backend/modules/upload/service/upload_file.py b/backend/repository/files/upload_file.py similarity index 100% rename from backend/modules/upload/service/upload_file.py rename to backend/repository/files/upload_file.py diff --git a/backend/routes/subscription_routes.py b/backend/routes/subscription_routes.py index c864e37a7..1b50075f3 100644 --- a/backend/routes/subscription_routes.py +++ b/backend/routes/subscription_routes.py @@ -17,7 +17,7 @@ from modules.prompt.service.prompt_service import PromptService from modules.user.entity.user_identity import UserIdentity from modules.user.service.user_service import UserService from pydantic import BaseModel -from modules.brain.service.brain_subscription import ( +from repository.brain_subscription import ( SubscriptionInvitationService, resend_invitation_email, ) diff --git a/backend/tests/ragas_evaluation/run_evaluation.py b/backend/tests/ragas_evaluation/run_evaluation.py index 9544a8e48..4f31a52f3 100644 --- a/backend/tests/ragas_evaluation/run_evaluation.py +++ b/backend/tests/ragas_evaluation/run_evaluation.py @@ -24,7 +24,7 @@ from modules.knowledge.dto.inputs import CreateKnowledgeProperties from modules.knowledge.service.knowledge_service import KnowledgeService from ragas import evaluate from ragas.embeddings.base import LangchainEmbeddingsWrapper -from modules.upload.service.upload_file import upload_file_storage +from repository.files.upload_file import upload_file_storage def main(