Skip to content

Commit dd99510

Browse files
committed
Update backend settings
1 parent ce42e77 commit dd99510

File tree

6 files changed

+48
-45
lines changed

6 files changed

+48
-45
lines changed

backend/core/embedders.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def weight(self, value):
6969
class EmbedderManager:
7070
def __init__(self):
7171
self._device = torch.device(
72-
"cuda" if torch.cuda.is_available() and settings.app.use_cuda else "cpu")
72+
"cuda" if torch.cuda.is_available() and settings.service.use_cuda else "cpu")
7373
self._image_embedders = {}
7474
for embedder_config in settings.image_embedders:
7575
self._image_embedders[embedder_config.name] = ImageEmbedder(name=embedder_config.name,

backend/main.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import fastapi
66
from fastapi import FastAPI, HTTPException, Body, Request
77
from fastapi.middleware.cors import CORSMiddleware
8+
from fastapi.responses import FileResponse
89
from fastapi.staticfiles import StaticFiles
910
from fastapi.templating import Jinja2Templates
10-
from fastapi.responses import FileResponse
1111
from pymilvus import Collection
1212

1313
from core import embedder_manager, image_generator, query_manager
@@ -111,14 +111,13 @@ async def create_query(q: str = Body(..., embed=True)):
111111

112112

113113
@app.get("/search/{qid}")
114-
async def search(qid: int, n: int = 20, k: int = 1, image_size: int = 512,
114+
async def search(qid: int, n: int = settings.query.default_num_images_to_retrieve,
115+
k: int = settings.query.default_num_images_to_generate,
116+
image_size: int = settings.query.default_generated_image_size,
117+
include_base_images_in_preview: bool = settings.query.include_base_images_in_preview,
115118
generator_engines: List[str] = fastapi.Query(None),
116-
include_base_images: bool = False,
117119
request: Request = None
118120
):
119-
if generator_engines is None:
120-
generator_engines = [settings.generators.default_engine]
121-
122121
query_object = query_manager.get_query(qid)
123122
query = query_object.query
124123

@@ -192,16 +191,13 @@ async def search(qid: int, n: int = 20, k: int = 1, image_size: int = 512,
192191
"preview_url": str(request.url_for("gallery", qid=qid))
193192
}
194193

195-
if include_base_images:
194+
if include_base_images_in_preview:
196195
res["base_images"] = [pil_image_to_base64(image) for image in generated_images]
197196

198197
return res
199198

200199

201-
202-
203-
204-
@app.get("/file", name="get_file")
200+
@app.get("/file")
205201
async def get_file(file_path: str):
206202
if not os.path.isfile(file_path):
207203
raise HTTPException(status_code=404, detail="File not found")

backend/monitoring/directory_watcher.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def __init__(self):
8282
self.observer = Observer()
8383
self.handlers = {}
8484
self.watches = {}
85-
self.executor = ThreadPoolExecutor(max_workers=settings.app.num_watcher_workers)
85+
self.executor = ThreadPoolExecutor(max_workers=settings.directory.num_watcher_workers)
8686

8787
def add_directory(self, path):
8888
session = SessionLocal()
@@ -104,7 +104,7 @@ def add_directory(self, path):
104104

105105
handler = ImageChangeHandler(directory_id)
106106
self.handlers[renamed_path] = handler
107-
watch = self.observer.schedule(handler, path, recursive=settings.app.recursive_indexing)
107+
watch = self.observer.schedule(handler, path, recursive=settings.directory.recursive_indexing)
108108
self.watches[renamed_path] = watch
109109

110110
# Start the background indexing
@@ -130,7 +130,7 @@ def _process_directory_in_background(self, path, directory_id):
130130
)
131131

132132
to_add = []
133-
if settings.app.recursive_indexing: # If recursive search is required
133+
if settings.directory.recursive_indexing: # If recursive search is required
134134
for root, _, files in os.walk(path):
135135
for file in files:
136136
if file.lower().endswith(('.png', '.jpg', '.jpeg')):
@@ -151,7 +151,7 @@ def _process_directory_in_background(self, path, directory_id):
151151
# 2. Retrieve all not indexed images
152152
embedders = embedder_manager.get_image_embedders()
153153

154-
batch_size = settings.app.batch_size
154+
batch_size = settings.directory.batch_size
155155
while True:
156156
not_indexed_images = session.query(Image).filter(Image.directory_id == directory_id, Image.is_indexed == False).all()
157157
if not not_indexed_images:
@@ -164,7 +164,7 @@ def _process_directory_in_background(self, path, directory_id):
164164
batch = not_indexed_images[:batch_size]
165165

166166
# 3. Embed images in parallel for this batch
167-
with ThreadPoolExecutor(max_workers=settings.app.num_embedding_workers) as pool:
167+
with ThreadPoolExecutor(max_workers=settings.directory.num_embedding_workers) as pool:
168168
futures = {pool.submit(self._embed_image, img_record.path, embedders): img_record.path for img_record in batch}
169169

170170
embeddings_batch = []

backend/settings/readonly.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ def _log_settings(cls):
2323
logger.info("Settings Loaded:")
2424
logger.info(f"Postgres Settings: {cls._instance._settings.postgres}")
2525
logger.info(f"Milvus Settings: {cls._instance._settings.milvus}")
26-
logger.info(f"App Settings: {cls._instance._settings.app}")
26+
logger.info(f"Service Settings: {cls._instance._settings.service}")
27+
logger.info(f"Directory Settings: {cls._instance._settings.directory}")
28+
logger.info(f"Query Settings: {cls._instance._settings.query}")
2729
logger.info(f"Generators Settings: {cls._instance._settings.generators}")
2830
if cls._instance._settings.json_config:
2931
logger.info(f"JSON Config: {cls._instance._settings.json_config.dict()}")
@@ -37,8 +39,16 @@ def milvus(self):
3739
return self._settings.milvus
3840

3941
@property
40-
def app(self):
41-
return self._settings.app
42+
def service(self):
43+
return self._settings.service
44+
45+
@property
46+
def query(self):
47+
return self._settings.query
48+
49+
@property
50+
def directory(self):
51+
return self._settings.directory
4252

4353
@property
4454
def generators(self):
@@ -55,9 +65,8 @@ def image_embedders(self):
5565
return self.json_config.image_embedders
5666

5767
@property
58-
def weights_path(self) :
59-
return os.path.join(self._settings.app.embedders_config_dir_path, "weights.json")
60-
68+
def weights_path(self):
69+
return os.path.join(self._settings.service.embedders_config_dir_path, "weights.json")
6170

6271
def get_image_embedder_details(self, name: str):
6372
embedder = next(

backend/settings/settings_model.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,28 @@ def uri(self) -> str:
3636
return f"{self.host}:{self.port}"
3737

3838

39-
class AppSettings(BaseModel):
40-
embedders_config_dir_path: str = Field("./configs/balanced/")
41-
use_cuda: bool = Field(False)
42-
recursive_indexing: bool = Field(False)
43-
batch_size: int = Field(100)
44-
num_embedding_workers: int = Field(4)
39+
class QuerySettings(BaseModel):
40+
default_num_images_to_retrieve: int = Field(20)
41+
default_num_images_to_generate: int = Field(4)
42+
default_generated_image_size: int = Field(512)
43+
include_base_images_in_preview: bool = Field(False)
44+
45+
46+
class DirectorySettings(BaseModel):
4547
num_watcher_workers: int = Field(4)
48+
num_embedding_workers: int = Field(4)
49+
batch_size: int = Field(50)
50+
recursive_indexing: bool = Field(False)
4651

4752

48-
class IndexSettings(BaseModel):
49-
index_type: str = Field("HNSW")
50-
metric_type: str = Field("COSINE")
53+
class ServiceSettings(BaseModel):
54+
embedders_config_dir_path: str = Field("./configs/balanced/")
55+
use_cuda: bool = Field(False)
5156

5257

53-
class GeneratorsSettings(BaseModel):
58+
class ImageGeneratorSettings(BaseModel):
5459
host: str = Field("0.0.0.0")
5560
port: int = Field(8001)
56-
default_engine: str = Field("sdxl_lightning")
5761

5862
@property
5963
def url(self) -> str:
@@ -64,8 +68,10 @@ class Settings(BaseSettings):
6468
# Environment-based settings
6569
postgres: PostgresSettings = PostgresSettings()
6670
milvus: MilvusSettings = MilvusSettings()
67-
app: AppSettings = AppSettings()
68-
generators: GeneratorsSettings = GeneratorsSettings()
71+
service: ServiceSettings = ServiceSettings()
72+
generators: ImageGeneratorSettings = ImageGeneratorSettings()
73+
directory: DirectorySettings = DirectorySettings()
74+
query: QuerySettings = QuerySettings()
6975

7076
# JSON config
7177
json_config: Optional[JSONConfig] = None
@@ -78,7 +84,7 @@ def load_json_config(self):
7884
"""
7985
Load and parse the JSON configuration file specified in app.config_path.
8086
"""
81-
config_path = Path(self.app.embedders_config_dir_path, "config.json")
87+
config_path = Path(self.service.embedders_config_dir_path, "config.json")
8288
if config_path.exists():
8389
with open(config_path, "r") as file:
8490
json_data = json.load(file)

needlectl/cli/directory.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,8 @@ def add_directory(
2323
output_format = ctx.obj["output"]
2424
abs_path = os.path.abspath(path)
2525

26-
# manager = DockerComposeManager()
27-
# manager.add_volume(service_name="backend", volume_path=abs_path)
28-
#
29-
# typer.echo("Restarting backend container...")
30-
# manager.start_containers()
31-
3226
client = BackendClient(api_url)
3327

34-
typer.echo("Waiting for API to become available...")
35-
3628
try:
3729
client.wait_for_api()
3830
resp = client.add_directory(abs_path)

0 commit comments

Comments
 (0)