config.py 5.74 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
Timothy J. Baek committed
26
27
28
29
30
31
32
33
try:
    with open(f"../package.json", "r") as f:
        PACKAGE_DATA = json.load(f)
except:
    PACKAGE_DATA = {"version": "0.0.0"}

VERSION = PACKAGE_DATA["version"]

Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
34
35
36
####################################
# DATA/FRONTEND BUILD DIR
####################################
lucasew's avatar
lucasew committed
37

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

Timothy J. Baek's avatar
Timothy J. Baek committed
41
42
43
44
45
46
try:
    with open(f"{DATA_DIR}/config.json", "r") as f:
        CONFIG_DATA = json.load(f)
except:
    CONFIG_DATA = {}

47
####################################
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
48
# File Upload DIR
49
50
####################################

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

Timothy J. Baek's avatar
Timothy J. Baek committed
54
55
56
57
58
59
60
61

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

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

62
63
64
65
66
67
68

####################################
# 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
69

70
71
72
73
####################################
# OLLAMA_API_BASE_URL
####################################

74
75
76
OLLAMA_API_BASE_URL = os.environ.get(
    "OLLAMA_API_BASE_URL", "http://localhost:11434/api"
)
Timothy J. Baek's avatar
Timothy J. Baek committed
77
78
79
80

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

Timothy J. Baek's avatar
Timothy J. Baek committed
82
83
84
85
86
####################################
# OPENAI_API
####################################

OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "")
87
88
89
90
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
91

92
93
94
95
96

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

Kyle McLaren's avatar
Kyle McLaren committed
97
ENABLE_SIGNUP = os.environ.get("ENABLE_SIGNUP", True)
98
DEFAULT_MODELS = os.environ.get("DEFAULT_MODELS", None)
Timothy J. Baek's avatar
Timothy J. Baek committed
99
100
101
102


DEFAULT_PROMPT_SUGGESTIONS = (
    CONFIG_DATA["ui"]["prompt_suggestions"]
Timothy J. Baek's avatar
Timothy J. Baek committed
103
104
105
    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
106
    else [
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
        {
            "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
123
    ]
124
)
Timothy J. Baek's avatar
Timothy J. Baek committed
125
126


Timothy J. Baek's avatar
Timothy J. Baek committed
127
128
129
DEFAULT_USER_ROLE = "pending"
USER_PERMISSIONS = {"chat": {"deletion": True}}

130

131
####################################
132
# WEBUI_VERSION
133
134
####################################

Timothy J. Baek's avatar
Timothy J. Baek committed
135
WEBUI_VERSION = os.environ.get("WEBUI_VERSION", "v1.0.0-alpha.100")
136
137

####################################
138
# WEBUI_AUTH (Required for security)
139
140
####################################

141
WEBUI_AUTH = True
142

Timothy J. Baek's avatar
Timothy J. Baek committed
143
####################################
144
# WEBUI_SECRET_KEY
Timothy J. Baek's avatar
Timothy J. Baek committed
145
146
####################################

147
148
WEBUI_SECRET_KEY = os.environ.get(
    "WEBUI_SECRET_KEY",
Timothy J. Baek's avatar
Timothy J. Baek committed
149
150
151
    os.environ.get(
        "WEBUI_JWT_SECRET_KEY", "t0p-s3cr3t"
    ),  # DEPRECATED: remove at next major version
152
)
153

154
if WEBUI_AUTH and WEBUI_SECRET_KEY == "":
Timothy J. Baek's avatar
Timothy J. Baek committed
155
    raise ValueError(ERROR_MESSAGES.ENV_VAR_NOT_FOUND)
156
157
158
159
160

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

161
CHROMA_DATA_PATH = f"{DATA_DIR}/vector_db"
162
# 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
163
RAG_EMBEDDING_MODEL = os.environ.get("RAG_EMBEDDING_MODEL", "all-MiniLM-L6-v2")
164
# 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
165
166
167
RAG_EMBEDDING_MODEL_DEVICE_TYPE = os.environ.get(
    "RAG_EMBEDDING_MODEL_DEVICE_TYPE", "cpu"
)
Timothy J. Baek's avatar
Timothy J. Baek committed
168
CHROMA_CLIENT = chromadb.PersistentClient(
Timothy J. Baek's avatar
Timothy J. Baek committed
169
170
    path=CHROMA_DATA_PATH,
    settings=Settings(allow_reset=True, anonymized_telemetry=False),
Timothy J. Baek's avatar
Timothy J. Baek committed
171
)
172
173
CHUNK_SIZE = 1500
CHUNK_OVERLAP = 100
Timothy J. Baek's avatar
Timothy J. Baek committed
174

Timothy J. Baek's avatar
Timothy J. Baek committed
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189

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
190
191
192
####################################
# Transcribe
####################################
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
193
194
195

WHISPER_MODEL = os.getenv("WHISPER_MODEL", "base")
WHISPER_MODEL_DIR = os.getenv("WHISPER_MODEL_DIR", f"{CACHE_DIR}/whisper/models")
Timothy J. Baek's avatar
Timothy J. Baek committed
196
197
198
199
200
201
202


####################################
# Images
####################################

AUTOMATIC1111_BASE_URL = os.getenv("AUTOMATIC1111_BASE_URL", "")