|
from enum import Enum, IntEnum |
|
from dotenv import load_dotenv |
|
from pathlib import Path |
|
import logging |
|
import sys |
|
import os |
|
|
|
|
|
|
|
|
|
|
|
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) |
|
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout)) |
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
|
env = os.getenv("ENV", None) |
|
|
|
if not env: |
|
|
|
env_file = Path(__file__).parent.parent.parent / '.env' |
|
logger.debug(f"Loading env file: {env_file}") |
|
if os.path.exists(env_file): |
|
load_dotenv(dotenv_path=env_file) |
|
else: |
|
raise Exception(f"Env file {env})file not found") |
|
|
|
|
|
|
|
|
|
readme_file = Path(__file__).parent / "API.md" |
|
|
|
readme_str = ( |
|
f""" |
|
<details> |
|
<summary>π API.MD</summary> |
|
{readme_file.read_text()} |
|
|
|
</details> |
|
|
|
""" |
|
if readme_file.exists() |
|
else "" |
|
) |
|
APP_NAME = "API Documentation" |
|
APP_VERSION = "0.0.1" |
|
APP_DESCRIPTION = f""" |
|
 |
|
|
|
--- |
|
## About |
|
π¬ RasaGPT is the first headless LLM chatbot platform built on top of Rasa and Langchain |
|
|
|
- π Resources: [https://rasagpt.dev](https://rasagpt.dev) |
|
- π§βπ» Github: [https://github.com/paulpierre/RasaGPT](https://github.com/paulpierre/RasaGPT) |
|
- π§ Author: [@paulpierre](https://twitter.com/paulpierre) |
|
|
|
{readme_str} |
|
""" |
|
APP_ICON = "/public/img/rasagpt-icon-200x200.png" |
|
APP_LOGO = "/public/img/rasagpt-logo-1.png" |
|
|
|
FILE_UPLOAD_PATH = os.getenv("FILE_UPLOAD_PATH", "/tmp") |
|
|
|
|
|
POSTGRES_USER = os.getenv("POSTGRES_USER", "postgres") |
|
POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD", "postgres") |
|
DB_HOST = os.getenv("DB_HOST", "localhost") |
|
DB_PORT = os.getenv("DB_PORT", 5432) |
|
DB_USER = os.getenv("DB_USER") |
|
DB_NAME = os.getenv("DB_NAME") |
|
DB_PASSWORD = os.getenv("DB_PASSWORD") |
|
DSN = f"postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}" |
|
SU_DSN = ( |
|
f"postgresql://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}" |
|
) |
|
|
|
RASA_WEBHOOK_HOST = os.getenv("RASA_WEBHOOK_HOST", "rasa-core") |
|
RASA_WEBHOOK_PORT = os.getenv("RASA_WEBHOOK_PORT", 5005) |
|
RASA_WEBHOOK_URL = f"http://{RASA_WEBHOOK_HOST}:{RASA_WEBHOOK_PORT}" |
|
|
|
|
|
MODEL_NAME = os.getenv("MODEL_NAME") |
|
LLM_DEFAULT_TEMPERATURE = float(os.getenv("LLM_DEFAULT_TEMPERATURE", 0.0)) |
|
LLM_CHUNK_SIZE = int(os.getenv("LLM_CHUNK_SIZE", 512)) |
|
LLM_CHUNK_OVERLAP = int(os.getenv("LLM_CHUNK_OVERLAP", 20)) |
|
LLM_DISTANCE_THRESHOLD = float(os.getenv("LLM_DISTANCE_THRESHOLD", 0.5)) |
|
LLM_MAX_OUTPUT_TOKENS = int(os.getenv("LLM_MAX_OUTPUT_TOKENS", 256)) |
|
LLM_MIN_NODE_LIMIT = int(os.getenv("LLM_MIN_NODE_LIMIT", 3)) |
|
|
|
|
|
class DISTANCE_STRATEGY(Enum): |
|
COSINE = "cosine" |
|
EUCLIDEAN = "euclidean" |
|
MAX_INNER_PRODUCT = "max_inner_product" |
|
|
|
def __new__(cls, strategy_name: str): |
|
obj = object.__new__(cls) |
|
obj._value_ = strategy_name |
|
return obj |
|
|
|
@property |
|
def strategy_name(self) -> str: |
|
return self.value |
|
|
|
|
|
DISTANCE_STRATEGIES = [ |
|
( |
|
DISTANCE_STRATEGY.EUCLIDEAN, |
|
"euclidean", |
|
"<->", |
|
"CREATE INDEX ON node USING ivfflat (embeddings vector_l2_ops) WITH (lists = 100);", |
|
), |
|
( |
|
DISTANCE_STRATEGY.COSINE, |
|
"cosine", |
|
"<=>", |
|
"CREATE INDEX ON node USING ivfflat (embeddings vector_cosine_ops) WITH (lists = 100);", |
|
), |
|
( |
|
DISTANCE_STRATEGY.MAX_INNER_PRODUCT, |
|
"max_inner_product", |
|
"<#>", |
|
"CREATE INDEX ON node USING ivfflat (embeddings vector_ip_ops) WITH (lists = 100);", |
|
), |
|
] |
|
LLM_DEFAULT_DISTANCE_STRATEGY = DISTANCE_STRATEGY[ |
|
os.getenv("LLM_DEFAULT_DISTANCE_STRATEGY", "COSINE") |
|
] |
|
VECTOR_EMBEDDINGS_COUNT = 1536 |
|
PGVECTOR_ADD_INDEX = True if os.getenv("PGVECTOR_ADD_INDEX", False) else False |
|
|
|
|
|
DOCUMENT_TYPE = IntEnum("DOCUMENT_TYPE", ["PLAINTEXT", "MARKDOWN", "HTML", "PDF"]) |
|
|
|
ENTITY_STATUS = IntEnum( |
|
"ENTITY_STATUS", |
|
["UNVERIFIED", "ACTIVE", "INACTIVE", "DELETED", "BANNED" "DEPRECATED"], |
|
) |
|
CHANNEL_TYPE = IntEnum( |
|
"CHANNEL_TYPE", ["SMS", "TELEGRAM", "WHATSAPP", "EMAIL", "WEBSITE"] |
|
) |
|
|
|
AGENT_NAMES = [ |
|
"Aisha", |
|
"Lilly", |
|
"Hanna", |
|
"Julia", |
|
"Emily", |
|
"Sophia", |
|
"Alex", |
|
"Isabella", |
|
] |
|
|
|
|
|
class LLM_MODELS(Enum): |
|
TEXT_DAVINCI_003 = "text-davinci-003", 4097 |
|
GPT_35_TURBO = "gpt-3.5-turbo", 4096 |
|
TEXT_DAVINCI_002 = "text-davinci-002", 4097 |
|
CODE_DAVINCI_002 = "code-davinci-002", 8001 |
|
GPT_4 = "gpt-4", 8192 |
|
GPT_4_32K = "gpt-4-32k", 32768 |
|
|
|
def __init__(self, model_name, token_limit): |
|
self._model_name = model_name |
|
self._token_limit = token_limit |
|
|
|
@property |
|
def model_name(self) -> str: |
|
return self._model_name |
|
|
|
@property |
|
def token_limit(self) -> int: |
|
return self._token_limit |
|
|