-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathlauncher.py
136 lines (101 loc) · 3.82 KB
/
launcher.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import os
from typing import List, Type
from fastapi import FastAPI, APIRouter
from starlette.middleware.base import BaseHTTPMiddleware
from config import origins
from user_management.dao import UsersDAO
from agentmemory.check_model import check_model, default_model_path
def default_middleware() -> List[Type[BaseHTTPMiddleware]]:
from configuration_page.middleware import LoginAdminMiddleware
from configuration_page.redirect_middleware import RedirectToConfigurationMiddleware
from configuration_page.middleware import LoginRequiredCheckMiddleware
result = [RedirectToConfigurationMiddleware, LoginRequiredCheckMiddleware]
from configuration_page.settings_util import is_single_user
if is_single_user():
result.append(LoginAdminMiddleware)
return result
def default_routers() -> List[APIRouter]:
from configuration_page.routes import router as configuration_router
from routes import router
from user_management.routes import router as user_management_router
from chat_tabs.routes import router as chat_tabs_router
return [user_management_router, chat_tabs_router, configuration_router, router]
def load_data():
"""
This is only temporary solution to build database. In the end, DAO should be used for everything, once
all tables are migrated to sqlalchemy. It helps running tests against part of codebase that is already migrated
without having dependency on the rest of the codebase/running postgresql server.
"""
import sys
if "pytest" in sys.modules:
with UsersDAO() as users_dao:
users_dao.create_all_tables()
users_dao.create_default_user()
else:
from database import Database
with Database() as db:
db.setup_database()
def create_app(
middlewares: List[BaseHTTPMiddleware] = None, routers: List[APIRouter] = None
) -> FastAPI:
from configuration_page import reload_configuration
reload_configuration()
from fastapi.middleware.cors import CORSMiddleware
import nltk
import logs
import utils
nltk.download("punkt")
model_name = "all-MiniLM-L6-v2"
model_path = default_model_path
downloaded_model_path = check_model(model_name=model_name, model_path=model_path)
os.environ["MODEL_PATH"] = downloaded_model_path
version = utils.SettingsManager.get_version()
load_data()
# Defining the FastAPI app and metadata
app = FastAPI(
title="CLANG API",
description="""### API specifications\n
Welcome to the `CLANG` API documentation,\n
WIP.
""",
version=version,
)
app.add_middleware(
CORSMiddleware,
allow_origins=origins(),
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.on_event("shutdown")
def shutdown_event():
logs.Log("main", "main.log").get_logger().debug("Shutting down server")
if middlewares is None:
middlewares = default_middleware()
for router in routers or default_routers():
app.include_router(router)
for middleware_class in middlewares:
app.add_middleware(middleware_class)
return app
def create_parser():
import argparse
arg_parser = argparse.ArgumentParser(description="Run web server")
arg_parser.add_argument(
"--host",
type=str,
default=os.getenv("HOST", "0.0.0.0"),
help="Host to run the app on (default: %(default)s)",
)
arg_parser.add_argument(
"--port",
type=int,
default=os.getenv("PORT", 8002),
help="Port to run the app on (default: %(default)s)",
)
return arg_parser
if __name__ == "__main__":
import uvicorn
parser = create_parser()
args = parser.parse_args()
app = create_app()
uvicorn.run(app, host=args.host, port=args.port, reload=False, workers=1)