Skip to content

Commit 2c3bb53

Browse files
committed
tech debt
1 parent 3b516c5 commit 2c3bb53

File tree

75 files changed

+1348
-1107
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+1348
-1107
lines changed

backends/advanced/src/advanced_omi_backend/app_config.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@
1313
from dotenv import load_dotenv
1414
from motor.motor_asyncio import AsyncIOMotorClient
1515

16-
from advanced_omi_backend.constants import OMI_CHANNELS, OMI_SAMPLE_RATE, OMI_SAMPLE_WIDTH
17-
from advanced_omi_backend.services.transcription import get_transcription_provider
16+
from advanced_omi_backend.constants import (
17+
OMI_CHANNELS,
18+
OMI_SAMPLE_RATE,
19+
OMI_SAMPLE_WIDTH,
20+
)
1821
from advanced_omi_backend.model_registry import get_models_registry
22+
from advanced_omi_backend.services.transcription import get_transcription_provider
1923

2024
# Load environment variables
2125
load_dotenv()

backends/advanced/src/advanced_omi_backend/app_factory.py

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,25 @@
2323
fastapi_users,
2424
websocket_auth,
2525
)
26+
from advanced_omi_backend.client_manager import get_client_manager
27+
from advanced_omi_backend.middleware.app_middleware import setup_middleware
28+
from advanced_omi_backend.routers.api_router import router as api_router
29+
from advanced_omi_backend.routers.modules.health_routes import router as health_router
30+
from advanced_omi_backend.routers.modules.websocket_routes import (
31+
router as websocket_router,
32+
)
33+
from advanced_omi_backend.services.audio_service import get_audio_stream_service
34+
from advanced_omi_backend.services.memory import (
35+
get_memory_service,
36+
shutdown_memory_service,
37+
)
38+
from advanced_omi_backend.task_manager import get_task_manager, init_task_manager
2639
from advanced_omi_backend.users import (
2740
User,
2841
UserRead,
2942
UserUpdate,
3043
register_client_to_user,
3144
)
32-
from advanced_omi_backend.client_manager import get_client_manager
33-
from advanced_omi_backend.services.memory import get_memory_service, shutdown_memory_service
34-
from advanced_omi_backend.middleware.app_middleware import setup_middleware
35-
from advanced_omi_backend.routers.api_router import router as api_router
36-
from advanced_omi_backend.routers.modules.health_routes import router as health_router
37-
from advanced_omi_backend.routers.modules.websocket_routes import router as websocket_router
38-
from advanced_omi_backend.services.audio_service import get_audio_stream_service
39-
from advanced_omi_backend.task_manager import init_task_manager, get_task_manager
4045

4146
logger = logging.getLogger(__name__)
4247
application_logger = logging.getLogger("audio_processing")
@@ -51,7 +56,10 @@ async def initialize_openmemory_user() -> None:
5156
- Creates a test memory and deletes it to trigger user creation
5257
- Logs success or warning if OpenMemory is not reachable
5358
"""
54-
from advanced_omi_backend.services.memory.config import build_memory_config_from_env, MemoryProvider
59+
from advanced_omi_backend.services.memory.config import (
60+
MemoryProvider,
61+
build_memory_config_from_env,
62+
)
5563

5664
memory_provider_config = build_memory_config_from_env()
5765

@@ -99,11 +107,12 @@ async def lifespan(app: FastAPI):
99107
# Initialize Beanie for all document models
100108
try:
101109
from beanie import init_beanie
102-
from advanced_omi_backend.models.conversation import Conversation
110+
111+
from advanced_omi_backend.models.annotation import Annotation
103112
from advanced_omi_backend.models.audio_chunk import AudioChunkDocument
113+
from advanced_omi_backend.models.conversation import Conversation
104114
from advanced_omi_backend.models.user import User
105115
from advanced_omi_backend.models.waveform import WaveformData
106-
from advanced_omi_backend.models.annotation import Annotation
107116

108117
await init_beanie(
109118
database=config.db,
@@ -139,6 +148,27 @@ async def lifespan(app: FastAPI):
139148
application_logger.error(f"Failed to connect to Redis for RQ: {e}")
140149
application_logger.warning("RQ queue system will not be available - check Redis connection")
141150

151+
# Initialize BackgroundTaskManager (must happen before any code path uses it)
152+
try:
153+
task_manager = init_task_manager()
154+
await task_manager.start()
155+
application_logger.info("BackgroundTaskManager initialized and started")
156+
except Exception as e:
157+
application_logger.error(f"Failed to initialize task manager: {e}")
158+
raise # Task manager is essential
159+
160+
# Initialize ClientManager eagerly (prevents lazy race on first WebSocket connect)
161+
get_client_manager()
162+
application_logger.info("ClientManager initialized")
163+
164+
# Initialize LLM client eagerly (catch config errors at startup, not on first request)
165+
try:
166+
from advanced_omi_backend.llm_client import get_llm_client
167+
get_llm_client()
168+
application_logger.info("LLM client initialized from config.yml")
169+
except Exception as e:
170+
application_logger.warning(f"LLM client initialization deferred: {e}")
171+
142172
# Initialize audio stream service for Redis Streams
143173
try:
144174
audio_service = get_audio_stream_service()
@@ -161,7 +191,9 @@ async def lifespan(app: FastAPI):
161191
application_logger.info("✅ Redis client for audio streaming producer initialized")
162192

163193
# Initialize ClientManager Redis for cross-container client→user mapping
164-
from advanced_omi_backend.client_manager import initialize_redis_for_client_manager
194+
from advanced_omi_backend.client_manager import (
195+
initialize_redis_for_client_manager,
196+
)
165197
initialize_redis_for_client_manager(config.redis_url)
166198

167199
except Exception as e:
@@ -180,7 +212,10 @@ async def lifespan(app: FastAPI):
180212

181213
# Initialize plugins using plugin service
182214
try:
183-
from advanced_omi_backend.services.plugin_service import init_plugin_router, set_plugin_router
215+
from advanced_omi_backend.services.plugin_service import (
216+
init_plugin_router,
217+
set_plugin_router,
218+
)
184219

185220
plugin_router = init_plugin_router()
186221

@@ -221,11 +256,23 @@ async def lifespan(app: FastAPI):
221256
client_manager = get_client_manager()
222257
for client_id in client_manager.get_all_client_ids():
223258
try:
224-
from advanced_omi_backend.controllers.websocket_controller import cleanup_client_state
259+
from advanced_omi_backend.controllers.websocket_controller import (
260+
cleanup_client_state,
261+
)
225262
await cleanup_client_state(client_id)
226263
except Exception as e:
227264
application_logger.error(f"Error cleaning up client {client_id}: {e}")
228265

266+
# Shutdown BackgroundTaskManager
267+
try:
268+
task_mgr = get_task_manager()
269+
await task_mgr.shutdown()
270+
application_logger.info("BackgroundTaskManager shut down")
271+
except RuntimeError:
272+
pass # Never initialized
273+
except Exception as e:
274+
application_logger.error(f"Error shutting down task manager: {e}")
275+
229276
# RQ workers shut down automatically when process ends
230277
# No special cleanup needed for Redis connections
231278

@@ -250,7 +297,9 @@ async def lifespan(app: FastAPI):
250297

251298
# Shutdown plugins
252299
try:
253-
from advanced_omi_backend.services.plugin_service import cleanup_plugin_router
300+
from advanced_omi_backend.services.plugin_service import (
301+
cleanup_plugin_router,
302+
)
254303
await cleanup_plugin_router()
255304
application_logger.info("Plugins shut down")
256305
except Exception as e:

backends/advanced/src/advanced_omi_backend/chat_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
from advanced_omi_backend.services.memory import get_memory_service
2727
from advanced_omi_backend.services.memory.base import MemoryEntry
2828
from advanced_omi_backend.services.obsidian_service import (
29-
get_obsidian_service,
3029
ObsidianSearchError,
30+
get_obsidian_service,
3131
)
3232
from advanced_omi_backend.users import User
3333

backends/advanced/src/advanced_omi_backend/client.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from pathlib import Path
1313
from typing import Dict, List, Optional, Tuple
1414

15-
from advanced_omi_backend.task_manager import get_task_manager
1615
from wyoming.audio import AudioChunk
1716

1817
# Get loggers

backends/advanced/src/advanced_omi_backend/client_manager.py

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import logging
1010
import uuid
1111
from typing import TYPE_CHECKING, Dict, Optional
12+
1213
import redis.asyncio as redis
1314

1415
if TYPE_CHECKING:
@@ -39,17 +40,6 @@ def __init__(self):
3940
self._initialized = True # Self-initializing, no external dict needed
4041
logger.info("ClientManager initialized as single source of truth")
4142

42-
def initialize(self, active_clients_dict: Optional[Dict[str, "ClientState"]] = None):
43-
"""
44-
Legacy initialization method for backward compatibility.
45-
46-
New design: ClientManager is self-initializing and doesn't need external dict.
47-
This method is kept for compatibility but does nothing.
48-
"""
49-
if active_clients_dict is not None:
50-
logger.warning("ClientManager no longer uses external dictionaries - ignoring active_clients_dict")
51-
logger.info("ClientManager initialization (legacy compatibility mode)")
52-
5343
def is_initialized(self) -> bool:
5444
"""Check if the client manager has been initialized."""
5545
return self._initialized
@@ -314,40 +304,6 @@ def get_client_manager() -> ClientManager:
314304
return _client_manager
315305

316306

317-
def init_client_manager(active_clients_dict: Dict[str, "ClientState"]):
318-
"""
319-
Initialize the global client manager with active_clients reference.
320-
321-
This should be called from main.py during startup.
322-
323-
Args:
324-
active_clients_dict: Reference to the global active_clients dictionary
325-
"""
326-
client_manager = get_client_manager()
327-
client_manager.initialize(active_clients_dict)
328-
return client_manager
329-
330-
331-
# Client-user relationship initialization and utility functions
332-
def init_client_user_mapping(
333-
active_mapping_dict: Dict[str, str], all_mapping_dict: Optional[Dict[str, str]] = None
334-
):
335-
"""
336-
Initialize the client-user mapping with references to the global mappings.
337-
338-
This should be called from main.py during startup.
339-
340-
Args:
341-
active_mapping_dict: Reference to the active client_to_user_mapping dictionary
342-
all_mapping_dict: Reference to the all_client_user_mappings dictionary (optional)
343-
"""
344-
global _client_to_user_mapping, _all_client_user_mappings
345-
_client_to_user_mapping = active_mapping_dict
346-
if all_mapping_dict is not None:
347-
_all_client_user_mappings = all_mapping_dict
348-
logger.info("Client-user mapping initialized")
349-
350-
351307
def register_client_user_mapping(client_id: str, user_id: str):
352308
"""
353309
Register a client-user mapping for active clients.

backends/advanced/src/advanced_omi_backend/clients/audio_stream_client.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@ async def main():
4848
import websockets
4949
from websockets.client import WebSocketClientProtocol
5050

51-
from advanced_omi_backend.constants import OMI_CHANNELS, OMI_SAMPLE_RATE, OMI_SAMPLE_WIDTH
51+
from advanced_omi_backend.constants import (
52+
OMI_CHANNELS,
53+
OMI_SAMPLE_RATE,
54+
OMI_SAMPLE_WIDTH,
55+
)
5256

5357
logger = logging.getLogger(__name__)
5458

backends/advanced/src/advanced_omi_backend/clients/gdrive_audio_client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import os
1+
import os
2+
23
from google.oauth2.service_account import Credentials
34
from googleapiclient.discovery import build
5+
46
from advanced_omi_backend.app_config import get_app_config
57

68
_drive_client_cache = None

backends/advanced/src/advanced_omi_backend/controllers/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
"""
44

55
from . import (
6-
memory_controller,
7-
user_controller,
8-
conversation_controller,
96
client_controller,
7+
conversation_controller,
8+
memory_controller,
109
system_controller,
10+
user_controller,
1111
)
1212

1313
__all__ = [

0 commit comments

Comments
 (0)