config.py 5.43 KB
Newer Older
1
2
import os
import chromadb
Timothy J. Baek's avatar
Timothy J. Baek committed
3
from chromadb import Settings
4
5
from secrets import token_bytes
from base64 import b64encode
6
from constants import ERROR_MESSAGES
Timothy J. Baek's avatar
Timothy J. Baek committed
7
from pathlib import Path
Timothy J. Baek's avatar
Timothy J. Baek committed
8
9
import json

Timothy J. Baek's avatar
Timothy J. Baek committed
10

lucasew's avatar
lucasew committed
11
12
try:
    from dotenv import load_dotenv, find_dotenv
13

lucasew's avatar
lucasew committed
14
15
16
    load_dotenv(find_dotenv("../.env"))
except ImportError:
    print("dotenv not installed, skipping...")
Timothy J. Baek's avatar
Timothy J. Baek committed
17

Timothy J. Baek's avatar
Timothy J. Baek committed
18
19

####################################
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
20
# ENV (dev,test,prod)
Timothy J. Baek's avatar
Timothy J. Baek committed
21
22
####################################

Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
23
ENV = os.environ.get("ENV", "dev")
Timothy J. Baek's avatar
Timothy J. Baek committed
24
25


Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
26
27
28
####################################
# DATA/FRONTEND BUILD DIR
####################################
lucasew's avatar
lucasew committed
29

Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
30
DATA_DIR = str(Path(os.getenv("DATA_DIR", "./data")).resolve())
lucasew's avatar
lucasew committed
31
FRONTEND_BUILD_DIR = str(Path(os.getenv("FRONTEND_BUILD_DIR", "../build")))
Timothy J. Baek's avatar
Timothy J. Baek committed
32

Timothy J. Baek's avatar
Timothy J. Baek committed
33
34
35
36
37
38
try:
    with open(f"{DATA_DIR}/config.json", "r") as f:
        CONFIG_DATA = json.load(f)
except:
    CONFIG_DATA = {}

39
####################################
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
40
# File Upload DIR
41
42
####################################

Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
43
44
UPLOAD_DIR = f"{DATA_DIR}/uploads"
Path(UPLOAD_DIR).mkdir(parents=True, exist_ok=True)
Timothy J. Baek's avatar
Timothy J. Baek committed
45

Timothy J. Baek's avatar
Timothy J. Baek committed
46
47
48
49
50
51
52
53

####################################
# Cache DIR
####################################

CACHE_DIR = f"{DATA_DIR}/cache"
Path(CACHE_DIR).mkdir(parents=True, exist_ok=True)

54
55
56
57
58
59
60

####################################
# Docs DIR
####################################

DOCS_DIR = f"{DATA_DIR}/docs"
Path(DOCS_DIR).mkdir(parents=True, exist_ok=True)
Timothy J. Baek's avatar
Timothy J. Baek committed
61

62
63
64
65
####################################
# OLLAMA_API_BASE_URL
####################################

66
67
68
OLLAMA_API_BASE_URL = os.environ.get(
    "OLLAMA_API_BASE_URL", "http://localhost:11434/api"
)
Timothy J. Baek's avatar
Timothy J. Baek committed
69
70
71
72

if ENV == "prod":
    if OLLAMA_API_BASE_URL == "/ollama/api":
        OLLAMA_API_BASE_URL = "http://host.docker.internal:11434/api"
73

Timothy J. Baek's avatar
Timothy J. Baek committed
74
75
76
77
78
####################################
# OPENAI_API
####################################

OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "")
79
80
81
82
OPENAI_API_BASE_URL = os.environ.get("OPENAI_API_BASE_URL", "")

if OPENAI_API_BASE_URL == "":
    OPENAI_API_BASE_URL = "https://api.openai.com/v1"
Timothy J. Baek's avatar
Timothy J. Baek committed
83

84
85
86
87
88

####################################
# WEBUI
####################################

Kyle McLaren's avatar
Kyle McLaren committed
89
ENABLE_SIGNUP = os.environ.get("ENABLE_SIGNUP", True)
90
DEFAULT_MODELS = os.environ.get("DEFAULT_MODELS", None)
Timothy J. Baek's avatar
Timothy J. Baek committed
91
92
93
94


DEFAULT_PROMPT_SUGGESTIONS = (
    CONFIG_DATA["ui"]["prompt_suggestions"]
Timothy J. Baek's avatar
Timothy J. Baek committed
95
96
97
    if "ui" in CONFIG_DATA
    and "prompt_suggestions" in CONFIG_DATA["ui"]
    and type(CONFIG_DATA["ui"]["prompt_suggestions"]) is list
Timothy J. Baek's avatar
Timothy J. Baek committed
98
    else [
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
        {
            "title": ["Help me study", "vocabulary for a college entrance exam"],
            "content": "Help me study vocabulary: write a sentence for me to fill in the blank, and I'll try to pick the correct option.",
        },
        {
            "title": ["Give me ideas", "for what to do with my kids' art"],
            "content": "What are 5 creative things I could do with my kids' art? I don't want to throw them away, but it's also so much clutter.",
        },
        {
            "title": ["Tell me a fun fact", "about the Roman Empire"],
            "content": "Tell me a random fun fact about the Roman Empire",
        },
        {
            "title": ["Show me a code snippet", "of a website's sticky header"],
            "content": "Show me a code snippet of a website's sticky header in CSS and JavaScript.",
        },
Timothy J. Baek's avatar
Timothy J. Baek committed
115
    ]
116
)
Timothy J. Baek's avatar
Timothy J. Baek committed
117
118


Timothy J. Baek's avatar
Timothy J. Baek committed
119
120
121
DEFAULT_USER_ROLE = "pending"
USER_PERMISSIONS = {"chat": {"deletion": True}}

122

123
####################################
124
# WEBUI_VERSION
125
126
####################################

Timothy J. Baek's avatar
Timothy J. Baek committed
127
WEBUI_VERSION = os.environ.get("WEBUI_VERSION", "v1.0.0-alpha.100")
128
129

####################################
130
# WEBUI_AUTH (Required for security)
131
132
####################################

133
WEBUI_AUTH = True
134

Timothy J. Baek's avatar
Timothy J. Baek committed
135
####################################
136
# WEBUI_SECRET_KEY
Timothy J. Baek's avatar
Timothy J. Baek committed
137
138
####################################

139
140
WEBUI_SECRET_KEY = os.environ.get(
    "WEBUI_SECRET_KEY",
Timothy J. Baek's avatar
Timothy J. Baek committed
141
142
143
    os.environ.get(
        "WEBUI_JWT_SECRET_KEY", "t0p-s3cr3t"
    ),  # DEPRECATED: remove at next major version
144
)
145

146
if WEBUI_AUTH and WEBUI_SECRET_KEY == "":
Timothy J. Baek's avatar
Timothy J. Baek committed
147
    raise ValueError(ERROR_MESSAGES.ENV_VAR_NOT_FOUND)
148
149
150
151
152

####################################
# RAG
####################################

153
CHROMA_DATA_PATH = f"{DATA_DIR}/vector_db"
154
# this uses the model defined in the Dockerfile ENV variable. If you dont use docker or docker based deployments such as k8s, the default embedding model will be used (all-MiniLM-L6-v2)
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
155
RAG_EMBEDDING_MODEL = os.environ.get("RAG_EMBEDDING_MODEL", "all-MiniLM-L6-v2")
156
# device type ebbeding models - "cpu" (default), "cuda" (nvidia gpu required) or "mps" (apple silicon) - choosing this right can lead to better performance
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
157
158
159
RAG_EMBEDDING_MODEL_DEVICE_TYPE = os.environ.get(
    "RAG_EMBEDDING_MODEL_DEVICE_TYPE", "cpu"
)
Timothy J. Baek's avatar
Timothy J. Baek committed
160
CHROMA_CLIENT = chromadb.PersistentClient(
Timothy J. Baek's avatar
Timothy J. Baek committed
161
162
    path=CHROMA_DATA_PATH,
    settings=Settings(allow_reset=True, anonymized_telemetry=False),
Timothy J. Baek's avatar
Timothy J. Baek committed
163
)
164
165
CHUNK_SIZE = 1500
CHUNK_OVERLAP = 100
Timothy J. Baek's avatar
Timothy J. Baek committed
166

Timothy J. Baek's avatar
Timothy J. Baek committed
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181

RAG_TEMPLATE = """Use the following context as your learned knowledge, inside <context></context> XML tags.
<context>
    [context]
</context>

When answer to user:
- If you don't know, just say that you don't know.
- If you don't know when you are not sure, ask for clarification.
Avoid mentioning that you obtained the information from the context.
And answer according to the language of the user's question.
        
Given the context information, answer the query.
Query: [query]"""

Timothy J. Baek's avatar
Timothy J. Baek committed
182
183
184
####################################
# Transcribe
####################################
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
185
186
187

WHISPER_MODEL = os.getenv("WHISPER_MODEL", "base")
WHISPER_MODEL_DIR = os.getenv("WHISPER_MODEL_DIR", f"{CACHE_DIR}/whisper/models")