fix: make docker compose build and start the API

The image context was backend/, so COPY frontend/ failed. Build from the
repo root, place Python modules on the import path, and pin packages that
exist on PyPI. The web process no longer loads the LLM at startup.
This commit is contained in:
lgcosta committed 2026-11-01 12:00:08 -03:00
1 parent 67739dcf7e
commit 7af7ba530d
19 files changed
+342 -250

No files matched your search

+19
View File
@@ -0,0 +1,19 @@
from sentence_transformers import SentenceTransformer
import numpy as np
class EmbeddingService:
def __init__(self, model_name="all-MiniLM-L6-v2"):
self.model = SentenceTransformer(model_name)
self.dimension = 384
def embed(self, texts: list[str]) -> np.ndarray:
"""Generate embeddings for a list of texts."""
return self.model.encode(texts, convert_to_numpy=True)
def embed_query(self, text: str) -> np.ndarray:
"""Generate embedding for a single query."""
return self.model.encode([text], convert_to_numpy=True)[0]
def get_dimension(self) -> int:
"""Return embedding dimension."""
return self.dimension
+77
View File
@@ -0,0 +1,77 @@
import json
import os
from datetime import datetime
from typing import List, Dict, Optional
class ScheduleManager:
def __init__(self, schedules_path: str = "/app/schedules.json"):
self.schedules_path = schedules_path
self.schedules = self._load_schedules()
def _load_schedules(self) -> List[Dict]:
"""Load schedules from JSON file."""
if os.path.exists(self.schedules_path):
try:
with open(self.schedules_path, 'r') as f:
return json.load(f)
except json.JSONDecodeError:
return []
return []
def save_schedules(self):
"""Save schedules to JSON file."""
os.makedirs(os.path.dirname(self.schedules_path), exist_ok=True)
with open(self.schedules_path, 'w') as f:
json.dump(self.schedules, f, indent=2)
def add_schedule(self, schedule: Dict) -> Dict:
"""Add a new schedule."""
schedule_id = max([s['id'] for s in self.schedules], default=0) + 1
new_schedule = {
'id': schedule_id,
'time': schedule['time'],
'book': schedule.get('book'),
'enabled': schedule.get('enabled', True),
}
self.schedules.append(new_schedule)
self.save_schedules()
return new_schedule
def update_schedule(self, schedule_id: int, updates: Dict) -> Optional[Dict]:
"""Update an existing schedule."""
for i, schedule in enumerate(self.schedules):
if schedule['id'] == schedule_id:
self.schedules[i].update(updates)
self.save_schedules()
return self.schedules[i]
return None
def delete_schedule(self, schedule_id: int) -> bool:
"""Delete a schedule."""
for i, schedule in enumerate(self.schedules):
if schedule['id'] == schedule_id:
self.schedules.pop(i)
self.save_schedules()
return True
return False
def get_schedule(self, schedule_id: int) -> Optional[Dict]:
"""Get a specific schedule."""
for schedule in self.schedules:
if schedule['id'] == schedule_id:
return schedule
return None
def list_schedules(self) -> List[Dict]:
"""List all schedules."""
return self.schedules
def get_enabled_schedules(self) -> List[Dict]:
"""Get all enabled schedules."""
return [s for s in self.schedules if s.get('enabled', True)]
def is_schedule_ready(self, schedule: Dict) -> bool:
"""Check if a schedule is ready to be sent."""
schedule_time = datetime.fromisoformat(schedule['time'].replace('Z', '+00:00'))
current_time = datetime.now()
return current_time >= schedule_time