diff --git a/src/agent.py b/src/agent.py index b817c83c..fbe51cf2 100644 --- a/src/agent.py +++ b/src/agent.py @@ -1,11 +1,8 @@ - +from services.conversation_persistence_service import conversation_persistence from utils.logging_config import get_logger logger = get_logger(__name__) -# Import persistent storage -from services.conversation_persistence_service import conversation_persistence - # In-memory storage for active conversation threads (preserves function calls) active_conversations = {} @@ -447,7 +444,7 @@ async def async_chat_stream( response_id = chunk_data["id"] elif "response_id" in chunk_data: response_id = chunk_data["response_id"] - except: + except Exception: pass yield chunk @@ -641,7 +638,7 @@ async def async_langflow_chat_stream( response_id = chunk_data["id"] elif "response_id" in chunk_data: response_id = chunk_data["response_id"] - except: + except Exception: pass yield chunk diff --git a/src/api/knowledge_filter.py b/src/api/knowledge_filter.py index 51459d32..c957b925 100644 --- a/src/api/knowledge_filter.py +++ b/src/api/knowledge_filter.py @@ -378,7 +378,7 @@ async def cancel_knowledge_filter_subscription( return JSONResponse({"error": "Subscription not found"}, status_code=404) # Delete the monitor - monitor_result = await monitor_service.delete_monitor( + await monitor_service.delete_monitor( subscription["monitor_id"], user.user_id, jwt_token ) diff --git a/src/api/router.py b/src/api/router.py index 42171408..80f7d0c0 100644 --- a/src/api/router.py +++ b/src/api/router.py @@ -7,7 +7,7 @@ from config.settings import DISABLE_INGEST_WITH_LANGFLOW from utils.logging_config import get_logger # Import the actual endpoint implementations -from .upload import upload as traditional_upload +from api.upload import upload as traditional_upload logger = get_logger(__name__) diff --git a/src/config/settings.py b/src/config/settings.py index b590ab8b..b15ab7e3 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -20,7 +20,7 @@ load_dotenv("../", override=False) logger = get_logger(__name__) # Import configuration manager -from .config_manager import config_manager +from config.config_manager import config_manager # Environment variables OPENSEARCH_HOST = os.getenv("OPENSEARCH_HOST", "localhost") diff --git a/src/connectors/__init__.py b/src/connectors/__init__.py index 83e77b8c..ea613f15 100644 --- a/src/connectors/__init__.py +++ b/src/connectors/__init__.py @@ -1,7 +1,7 @@ -from .base import BaseConnector -from .google_drive import GoogleDriveConnector -from .sharepoint import SharePointConnector -from .onedrive import OneDriveConnector +from connectors.base import BaseConnector +from connectors.google_drive import GoogleDriveConnector +from connectors.onedrive import OneDriveConnector +from connectors.sharepoint import SharePointConnector __all__ = [ "BaseConnector", diff --git a/src/connectors/connection_manager.py b/src/connectors/connection_manager.py index 71c009ff..8d4a3f1e 100644 --- a/src/connectors/connection_manager.py +++ b/src/connectors/connection_manager.py @@ -5,15 +5,15 @@ from typing import Dict, List, Any, Optional from datetime import datetime from dataclasses import dataclass, asdict from pathlib import Path + +from connectors.base import BaseConnector +from connectors.google_drive import GoogleDriveConnector +from connectors.onedrive import OneDriveConnector +from connectors.sharepoint import SharePointConnector from utils.logging_config import get_logger logger = get_logger(__name__) -from .base import BaseConnector -from .google_drive import GoogleDriveConnector -from .sharepoint import SharePointConnector -from .onedrive import OneDriveConnector - @dataclass class ConnectionConfig: @@ -290,7 +290,7 @@ class ConnectionManager: and connector.webhook_channel_id ): await connector.cleanup_subscription(connector.webhook_channel_id) - except: + except Exception: pass # Best effort cleanup del self.active_connectors[connection_id] diff --git a/src/connectors/google_drive/__init__.py b/src/connectors/google_drive/__init__.py index 62b63ea6..c131a551 100644 --- a/src/connectors/google_drive/__init__.py +++ b/src/connectors/google_drive/__init__.py @@ -1,4 +1,4 @@ -from .connector import GoogleDriveConnector -from .oauth import GoogleDriveOAuth +from connectors.google_drive.connector import GoogleDriveConnector +from connectors.google_drive.oauth import GoogleDriveOAuth __all__ = ["GoogleDriveConnector", "GoogleDriveOAuth"] diff --git a/src/connectors/google_drive/connector.py b/src/connectors/google_drive/connector.py index 77d04736..e8776c53 100644 --- a/src/connectors/google_drive/connector.py +++ b/src/connectors/google_drive/connector.py @@ -11,8 +11,8 @@ from googleapiclient.http import MediaIoBaseDownload from utils.logging_config import get_logger -from ..base import BaseConnector, ConnectorDocument, DocumentACL -from .oauth import GoogleDriveOAuth +from connectors.base import BaseConnector, ConnectorDocument, DocumentACL +from connectors.google_drive.oauth import GoogleDriveOAuth logger = get_logger(__name__) diff --git a/src/connectors/langflow_connector_service.py b/src/connectors/langflow_connector_service.py index b33994e5..109c268d 100644 --- a/src/connectors/langflow_connector_service.py +++ b/src/connectors/langflow_connector_service.py @@ -5,8 +5,8 @@ from models.processors import LangflowConnectorFileProcessor from services.langflow_file_service import LangflowFileService from utils.logging_config import get_logger -from .base import BaseConnector, ConnectorDocument -from .connection_manager import ConnectionManager +from connectors.base import BaseConnector, ConnectorDocument +from connectors.connection_manager import ConnectionManager logger = get_logger(__name__) diff --git a/src/connectors/onedrive/__init__.py b/src/connectors/onedrive/__init__.py index 300fcbf3..2964ae5d 100644 --- a/src/connectors/onedrive/__init__.py +++ b/src/connectors/onedrive/__init__.py @@ -1,4 +1,4 @@ -from .connector import OneDriveConnector -from .oauth import OneDriveOAuth +from connectors.onedrive.connector import OneDriveConnector +from connectors.onedrive.oauth import OneDriveOAuth __all__ = ["OneDriveConnector", "OneDriveOAuth"] diff --git a/src/connectors/onedrive/connector.py b/src/connectors/onedrive/connector.py index ed2b759a..bf838391 100644 --- a/src/connectors/onedrive/connector.py +++ b/src/connectors/onedrive/connector.py @@ -4,8 +4,8 @@ from typing import List, Dict, Any, Optional from datetime import datetime import httpx -from ..base import BaseConnector, ConnectorDocument, DocumentACL -from .oauth import OneDriveOAuth +from connectors.base import BaseConnector, ConnectorDocument, DocumentACL +from connectors.onedrive.oauth import OneDriveOAuth logger = logging.getLogger(__name__) diff --git a/src/connectors/service.py b/src/connectors/service.py index 818963ee..be05195d 100644 --- a/src/connectors/service.py +++ b/src/connectors/service.py @@ -2,8 +2,8 @@ from typing import Any, Dict, List, Optional from utils.logging_config import get_logger -from .base import BaseConnector, ConnectorDocument -from .connection_manager import ConnectionManager +from connectors.base import BaseConnector, ConnectorDocument +from connectors.connection_manager import ConnectionManager logger = get_logger(__name__) diff --git a/src/connectors/sharepoint/__init__.py b/src/connectors/sharepoint/__init__.py index dfd631e5..79b90f06 100644 --- a/src/connectors/sharepoint/__init__.py +++ b/src/connectors/sharepoint/__init__.py @@ -1,4 +1,4 @@ -from .connector import SharePointConnector -from .oauth import SharePointOAuth +from connectors.sharepoint.connector import SharePointConnector +from connectors.sharepoint.oauth import SharePointOAuth __all__ = ["SharePointConnector", "SharePointOAuth"] diff --git a/src/connectors/sharepoint/connector.py b/src/connectors/sharepoint/connector.py index c3c1c097..a5738d55 100644 --- a/src/connectors/sharepoint/connector.py +++ b/src/connectors/sharepoint/connector.py @@ -5,8 +5,8 @@ from urllib.parse import urlparse from datetime import datetime import httpx -from ..base import BaseConnector, ConnectorDocument, DocumentACL -from .oauth import SharePointOAuth +from connectors.base import BaseConnector, ConnectorDocument, DocumentACL +from connectors.sharepoint.oauth import SharePointOAuth logger = logging.getLogger(__name__) diff --git a/src/main.py b/src/main.py index 2195bb63..c4aedb55 100644 --- a/src/main.py +++ b/src/main.py @@ -1,15 +1,4 @@ -# Configure structured logging early -from connectors.langflow_connector_service import LangflowConnectorService -from connectors.service import ConnectorService -from services.flows_service import FlowsService -from utils.container_utils import detect_container_environment -from utils.embeddings import create_dynamic_index_body -from utils.logging_config import configure_from_env, get_logger -from utils.telemetry import TelemetryClient, Category, MessageId - -configure_from_env() -logger = get_logger(__name__) - +# Configure structured logging early - must happen before other imports import asyncio import atexit import multiprocessing @@ -20,14 +9,6 @@ from functools import partial from starlette.applications import Starlette from starlette.routing import Route -# Set multiprocessing start method to 'spawn' for CUDA compatibility -multiprocessing.set_start_method("spawn", force=True) - -# Create process pool FIRST, before any torch/CUDA imports -from utils.process_pool import process_pool # isort: skip -import torch - -# API endpoints from api import ( auth, chat, @@ -47,12 +28,8 @@ from api import ( tasks, upload, ) - -# Existing services from api.connector_router import ConnectorRouter from auth_middleware import optional_auth, require_auth - -# Configuration and setup from config.settings import ( DISABLE_INGEST_WITH_LANGFLOW, INDEX_BODY, @@ -63,22 +40,33 @@ from config.settings import ( is_no_auth_mode, get_openrag_config, ) +from connectors.langflow_connector_service import LangflowConnectorService +from connectors.service import ConnectorService from services.auth_service import AuthService -from services.langflow_mcp_service import LangflowMCPService from services.chat_service import ChatService - -# Services from services.document_service import DocumentService +from services.flows_service import FlowsService from services.knowledge_filter_service import KnowledgeFilterService - -# Configuration and setup -# Services from services.langflow_file_service import LangflowFileService +from services.langflow_mcp_service import LangflowMCPService from services.models_service import ModelsService from services.monitor_service import MonitorService from services.search_service import SearchService from services.task_service import TaskService from session_manager import SessionManager +from utils.container_utils import detect_container_environment +from utils.embeddings import create_dynamic_index_body +from utils.logging_config import configure_from_env, get_logger +from utils.process_pool import process_pool +from utils.telemetry import TelemetryClient, Category, MessageId + +import torch + +configure_from_env() +logger = get_logger(__name__) + +# Set multiprocessing start method to 'spawn' for CUDA compatibility +multiprocessing.set_start_method("spawn", force=True) logger.info( "CUDA device information", diff --git a/src/models/processors.py b/src/models/processors.py index 2c0755b3..057ad4f2 100644 --- a/src/models/processors.py +++ b/src/models/processors.py @@ -1,5 +1,6 @@ from typing import Any -from .tasks import UploadTask, FileTask + +from models.tasks import UploadTask, FileTask from utils.logging_config import get_logger logger = get_logger(__name__) diff --git a/src/services/document_service.py b/src/services/document_service.py index 20a1b54a..32564e00 100644 --- a/src/services/document_service.py +++ b/src/services/document_service.py @@ -1,15 +1,16 @@ import os -from docling_core.types.io import DocumentStream from typing import List -import tiktoken -from utils.logging_config import get_logger -logger = get_logger(__name__) +import tiktoken +from docling_core.types.io import DocumentStream from config.settings import clients, INDEX_NAME, get_embedding_model from utils.document_processing import extract_relevant +from utils.logging_config import get_logger from utils.telemetry import TelemetryClient, Category, MessageId +logger = get_logger(__name__) + def get_token_count(text: str, model: str = None) -> int: """Get accurate token count using tiktoken""" diff --git a/src/services/flows_service.py b/src/services/flows_service.py index c89e000c..a6ccc4ad 100644 --- a/src/services/flows_service.py +++ b/src/services/flows_service.py @@ -404,7 +404,7 @@ class FlowsService: ) if response.status_code == 200: - result = response.json() + response.json() logger.info( f"Successfully reset {flow_type} flow", flow_id=flow_id, @@ -427,7 +427,7 @@ class FlowsService: # Get provider-specific endpoint if needed llm_provider_config = config.get_llm_provider_config() - endpoint = getattr(llm_provider_config, "endpoint", None) + _ = getattr(llm_provider_config, "endpoint", None) # Step 2: Update model values for the specific flow being reset single_flow_config = [ diff --git a/src/session_manager.py b/src/session_manager.py index bf2a9482..f7ccd428 100644 --- a/src/session_manager.py +++ b/src/session_manager.py @@ -4,9 +4,6 @@ from datetime import datetime, timedelta from typing import Dict, Optional, Any from dataclasses import dataclass from cryptography.hazmat.primitives import serialization -from utils.logging_config import get_logger - -logger = get_logger(__name__) from utils.logging_config import get_logger diff --git a/src/tui/__init__.py b/src/tui/__init__.py index 89fb9665..a0e75a20 100644 --- a/src/tui/__init__.py +++ b/src/tui/__init__.py @@ -1,5 +1,5 @@ """OpenRAG Terminal User Interface package.""" -from .utils.version_check import get_current_version +from tui.utils.version_check import get_current_version __version__ = get_current_version() diff --git a/src/tui/main.py b/src/tui/main.py index 86bb13d6..fdfbdb36 100644 --- a/src/tui/main.py +++ b/src/tui/main.py @@ -3,22 +3,23 @@ import sys from pathlib import Path from typing import Iterable, Optional + from textual.app import App -from utils.logging_config import get_logger try: from importlib.resources import files except ImportError: from importlib_resources import files -logger = get_logger(__name__) +from tui.managers.container_manager import ContainerManager +from tui.managers.docling_manager import DoclingManager +from tui.managers.env_manager import EnvManager +from tui.screens.welcome import WelcomeScreen +from tui.utils.platform import PlatformDetector +from tui.widgets.diagnostics_notification import notify_with_diagnostics +from utils.logging_config import get_logger -from .screens.welcome import WelcomeScreen -from .managers.env_manager import EnvManager -from .managers.container_manager import ContainerManager -from .managers.docling_manager import DoclingManager -from .utils.platform import PlatformDetector -from .widgets.diagnostics_notification import notify_with_diagnostics +logger = get_logger(__name__) class OpenRAGTUI(App): @@ -392,7 +393,7 @@ class OpenRAGTUI(App): ) # Load existing config if available - config_exists = self.env_manager.load_existing_env() + self.env_manager.load_existing_env() # Start with welcome screen self.push_screen(WelcomeScreen()) @@ -526,7 +527,7 @@ def copy_compose_files(*, force: bool = False) -> None: def run_tui(): """Run the OpenRAG TUI application.""" # Check for native Windows before launching TUI - from .utils.platform import PlatformDetector + from tui.utils.platform import PlatformDetector platform_detector = PlatformDetector() diff --git a/src/tui/managers/container_manager.py b/src/tui/managers/container_manager.py index 5875ac9b..08512283 100644 --- a/src/tui/managers/container_manager.py +++ b/src/tui/managers/container_manager.py @@ -7,17 +7,17 @@ from dataclasses import dataclass, field from enum import Enum from pathlib import Path from typing import Dict, List, Optional, AsyncIterator -from utils.logging_config import get_logger try: from importlib.resources import files except ImportError: from importlib_resources import files -logger = get_logger(__name__) - -from ..utils.platform import PlatformDetector, RuntimeInfo, RuntimeType +from tui.utils.platform import PlatformDetector, RuntimeInfo, RuntimeType from utils.gpu_detection import detect_gpu_devices +from utils.logging_config import get_logger + +logger = get_logger(__name__) class ServiceStatus(Enum): @@ -572,7 +572,7 @@ class ContainerManager: Tuple of (has_mismatch, container_version, tui_version) """ try: - from ..utils.version_check import get_current_version + from tui.utils.version_check import get_current_version tui_version = get_current_version() if tui_version == "unknown": @@ -585,7 +585,7 @@ class ContainerManager: return False, None, tui_version # Compare versions - from ..utils.version_check import compare_versions + from tui.utils.version_check import compare_versions comparison = compare_versions(container_version, tui_version) has_mismatch = comparison != 0 @@ -891,7 +891,7 @@ class ContainerManager: # Ensure OPENRAG_VERSION is set in .env file try: - from ..managers.env_manager import EnvManager + from tui.managers.env_manager import EnvManager env_manager = EnvManager() env_manager.ensure_openrag_version() diff --git a/src/tui/managers/docling_manager.py b/src/tui/managers/docling_manager.py index 7aaea793..3552a947 100644 --- a/src/tui/managers/docling_manager.py +++ b/src/tui/managers/docling_manager.py @@ -332,7 +332,7 @@ class DoclingManager: # Service is now running, clear starting flag self._starting = False break - except: + except Exception: pass self._add_log_entry(f"Waiting for startup... ({i + 1}/10)") @@ -555,7 +555,7 @@ class DoclingManager: """Follow logs from the docling-serve process in real-time.""" # First yield status message and any existing logs display_host = "localhost" if self._host == "0.0.0.0" else self._host - status_msg = f"Docling serve is running on http://{display_host}:{self._port}" + _ = f"Docling serve is running on http://{display_host}:{self._port}" with self._log_lock: if self._log_buffer: diff --git a/src/tui/managers/env_manager.py b/src/tui/managers/env_manager.py index a4f84e65..7c7c5b6f 100644 --- a/src/tui/managers/env_manager.py +++ b/src/tui/managers/env_manager.py @@ -1,5 +1,6 @@ """Environment configuration manager for OpenRAG TUI.""" +import os import secrets import string from dataclasses import dataclass, field @@ -7,11 +8,7 @@ from datetime import datetime from pathlib import Path from typing import Dict, List, Optional -from utils.logging_config import get_logger - -logger = get_logger(__name__) - -from ..utils.validation import ( +from tui.utils.validation import ( sanitize_env_value, validate_documents_paths, validate_google_oauth_client_id, @@ -19,6 +16,9 @@ from ..utils.validation import ( validate_openai_api_key, validate_url, ) +from utils.logging_config import get_logger + +logger = get_logger(__name__) @dataclass @@ -201,7 +201,7 @@ class EnvManager: # Set OPENRAG_VERSION to TUI version if not already set if not self.config.openrag_version: try: - from ..utils.version_check import get_current_version + from tui.utils.version_check import get_current_version current_version = get_current_version() if current_version != "unknown": @@ -241,7 +241,7 @@ class EnvManager: ) # Import validation functions for new provider fields - from ..utils.validation import validate_anthropic_api_key + from tui.utils.validation import validate_anthropic_api_key # Validate Anthropic API key format if provided if self.config.anthropic_api_key: @@ -382,7 +382,7 @@ class EnvManager: else: # Fallback: try to get current version try: - from ..utils.version_check import get_current_version + from tui.utils.version_check import get_current_version current_version = get_current_version() if current_version != "unknown": @@ -578,7 +578,7 @@ class EnvManager: def ensure_openrag_version(self) -> None: """Ensure OPENRAG_VERSION is set in .env file to match TUI version.""" try: - from ..utils.version_check import get_current_version + from tui.utils.version_check import get_current_version current_version = get_current_version() if current_version == "unknown": diff --git a/src/tui/screens/config.py b/src/tui/screens/config.py index 74855341..2055aa8b 100644 --- a/src/tui/screens/config.py +++ b/src/tui/screens/config.py @@ -16,8 +16,8 @@ from textual.validation import ValidationResult, Validator from rich.text import Text from pathlib import Path -from ..managers.env_manager import EnvManager -from ..utils.validation import ( +from tui.managers.env_manager import EnvManager +from tui.utils.validation import ( validate_openai_api_key, validate_anthropic_api_key, validate_ollama_endpoint, @@ -235,9 +235,6 @@ class ConfigScreen(Screen): yield Static(" ") # Langflow Admin Username - conditionally displayed based on password - current_password = getattr( - self.env_manager.config, "langflow_superuser_password", "" - ) yield Label("Langflow Admin Username *", id="langflow-username-label") current_value = getattr(self.env_manager.config, "langflow_superuser", "") input_widget = Input( diff --git a/src/tui/screens/diagnostics.py b/src/tui/screens/diagnostics.py index de962750..7e9d34f4 100644 --- a/src/tui/screens/diagnostics.py +++ b/src/tui/screens/diagnostics.py @@ -12,9 +12,9 @@ from textual.screen import Screen from textual.widgets import Header, Footer, Static, Button, Log from rich.text import Text -from ..managers.container_manager import ContainerManager -from ..utils.clipboard import copy_text_to_clipboard -from ..utils.platform import PlatformDetector +from tui.managers.container_manager import ContainerManager +from tui.utils.clipboard import copy_text_to_clipboard +from tui.utils.platform import PlatformDetector class DiagnosticsScreen(Screen): @@ -435,7 +435,7 @@ class DiagnosticsScreen(Screen): log.write( f" OpenSearch version: {info['version']['number']}" ) - except: + except Exception: pass else: log.write( @@ -483,7 +483,7 @@ class DiagnosticsScreen(Screen): if "tenants" in user_info: tenants = list(user_info["tenants"].keys()) log.write(f" Tenants: {', '.join(tenants)}") - except: + except Exception: log.write(" Account info retrieved but couldn't parse JSON") else: log.write( @@ -527,7 +527,7 @@ class DiagnosticsScreen(Screen): if admin_user.get("reserved"): log.write(" Admin user is reserved (protected)") log.write(f" Total internal users: {len(users)}") - except: + except Exception: log.write("[green]✓ Internal users endpoint accessible[/green]") else: log.write( diff --git a/src/tui/screens/logs.py b/src/tui/screens/logs.py index 4810a76c..bd1220c7 100644 --- a/src/tui/screens/logs.py +++ b/src/tui/screens/logs.py @@ -7,9 +7,9 @@ from textual.screen import Screen from textual.widgets import Footer, Static, Button, TextArea from rich.text import Text -from ..managers.container_manager import ContainerManager -from ..managers.docling_manager import DoclingManager -from ..utils.clipboard import copy_text_to_clipboard +from tui.managers.container_manager import ContainerManager +from tui.managers.docling_manager import DoclingManager +from tui.utils.clipboard import copy_text_to_clipboard class LogsScreen(Screen): diff --git a/src/tui/screens/monitor.py b/src/tui/screens/monitor.py index 98a5b419..346e82d9 100644 --- a/src/tui/screens/monitor.py +++ b/src/tui/screens/monitor.py @@ -6,24 +6,24 @@ import shutil from pathlib import Path from typing import Literal, Optional, AsyncIterator -# Define button variant type -ButtonVariant = Literal["default", "primary", "success", "warning", "error"] - +from rich.text import Text from textual.app import ComposeResult from textual.containers import Horizontal, ScrollableContainer from textual.screen import Screen from textual.widgets import Footer, Static, Button, DataTable -from rich.text import Text -from ..managers.container_manager import ContainerManager, ServiceStatus, ServiceInfo -from ..managers.docling_manager import DoclingManager -from ..utils.platform import RuntimeType -from ..widgets.command_modal import CommandOutputModal -from ..widgets.flow_backup_warning_modal import FlowBackupWarningModal -from ..widgets.factory_reset_warning_modal import FactoryResetWarningModal -from ..widgets.version_mismatch_warning_modal import VersionMismatchWarningModal -from ..widgets.upgrade_instructions_modal import UpgradeInstructionsModal -from ..widgets.diagnostics_notification import notify_with_diagnostics +from tui.managers.container_manager import ContainerManager, ServiceStatus, ServiceInfo +from tui.managers.docling_manager import DoclingManager +from tui.utils.platform import RuntimeType +from tui.widgets.command_modal import CommandOutputModal +from tui.widgets.diagnostics_notification import notify_with_diagnostics +from tui.widgets.factory_reset_warning_modal import FactoryResetWarningModal +from tui.widgets.flow_backup_warning_modal import FlowBackupWarningModal +from tui.widgets.upgrade_instructions_modal import UpgradeInstructionsModal +from tui.widgets.version_mismatch_warning_modal import VersionMismatchWarningModal + +# Define button variant type +ButtonVariant = Literal["default", "primary", "success", "warning", "error"] class MonitorScreen(Screen): @@ -280,7 +280,6 @@ class MonitorScreen(Screen): def on_button_pressed(self, event: Button.Pressed) -> None: """Handle button presses.""" button_id = event.button.id or "" - button_label = event.button.label or "" # Use button ID prefixes to determine action, ignoring any random suffix if button_id.startswith("start-btn"): @@ -369,7 +368,7 @@ class MonitorScreen(Screen): # Ensure OPENRAG_VERSION is set in .env BEFORE starting services # This ensures docker compose reads the correct version try: - from ..managers.env_manager import EnvManager + from tui.managers.env_manager import EnvManager env_manager = EnvManager() env_manager.ensure_openrag_version() @@ -430,7 +429,7 @@ class MonitorScreen(Screen): """Check TUI version and show upgrade instructions.""" self.operation_in_progress = True try: - from ..utils.version_check import check_if_latest + from tui.utils.version_check import check_if_latest # Check if current version is latest is_latest, latest_version, current_version = await check_if_latest() @@ -646,7 +645,7 @@ class MonitorScreen(Screen): def _view_docling_logs(self) -> None: """View docling serve logs.""" - from .logs import LogsScreen + from tui.screens.logs import LogsScreen self.app.push_screen(LogsScreen(initial_service="docling-serve")) @@ -931,7 +930,7 @@ class MonitorScreen(Screen): selected_service = self._get_selected_service() if selected_service: # Push the logs screen with the selected service - from .logs import LogsScreen + from tui.screens.logs import LogsScreen logs_screen = LogsScreen(initial_service=selected_service) self.app.push_screen(logs_screen) diff --git a/src/tui/screens/welcome.py b/src/tui/screens/welcome.py index 7e4a406a..8a5dd362 100644 --- a/src/tui/screens/welcome.py +++ b/src/tui/screens/welcome.py @@ -9,12 +9,12 @@ from textual.widgets import Footer, Static, Button from rich.text import Text from dotenv import load_dotenv -from .. import __version__ -from ..managers.container_manager import ContainerManager, ServiceStatus -from ..managers.env_manager import EnvManager -from ..managers.docling_manager import DoclingManager -from ..widgets.command_modal import CommandOutputModal -from ..widgets.version_mismatch_warning_modal import VersionMismatchWarningModal +from tui import __version__ +from tui.managers.container_manager import ContainerManager, ServiceStatus +from tui.managers.docling_manager import DoclingManager +from tui.managers.env_manager import EnvManager +from tui.widgets.command_modal import CommandOutputModal +from tui.widgets.version_mismatch_warning_modal import VersionMismatchWarningModal class WelcomeScreen(Screen): @@ -280,7 +280,7 @@ class WelcomeScreen(Screen): try: welcome_widget = self.query_one("#welcome-text") welcome_widget.update(self._create_welcome_text()) - except: + except Exception: pass # Widget might not be mounted yet # Focus the appropriate button (the buttons are created correctly in compose, @@ -296,7 +296,7 @@ class WelcomeScreen(Screen): self.query_one("#advanced-setup-btn").focus() else: self.query_one("#basic-setup-btn").focus() - except: + except Exception: pass # Button might not exist async def on_screen_resume(self) -> None: @@ -346,25 +346,25 @@ class WelcomeScreen(Screen): def action_no_auth_setup(self) -> None: """Switch to basic configuration screen.""" - from .config import ConfigScreen + from tui.screens.config import ConfigScreen self.app.push_screen(ConfigScreen(mode="no_auth")) def action_full_setup(self) -> None: """Switch to advanced configuration screen.""" - from .config import ConfigScreen + from tui.screens.config import ConfigScreen self.app.push_screen(ConfigScreen(mode="full")) def action_monitor(self) -> None: """Switch to monitoring screen.""" - from .monitor import MonitorScreen + from tui.screens.monitor import MonitorScreen self.app.push_screen(MonitorScreen()) def action_diagnostics(self) -> None: """Switch to diagnostics screen.""" - from .diagnostics import DiagnosticsScreen + from tui.screens.diagnostics import DiagnosticsScreen self.app.push_screen(DiagnosticsScreen()) @@ -471,7 +471,7 @@ class WelcomeScreen(Screen): # Ensure OPENRAG_VERSION is set in .env BEFORE starting services # This ensures docker compose reads the correct version try: - from ..managers.env_manager import EnvManager + from tui.managers.env_manager import EnvManager env_manager = EnvManager() env_manager.ensure_openrag_version() diff --git a/src/tui/widgets/__init__.py b/src/tui/widgets/__init__.py index 475381eb..e8185bbb 100644 --- a/src/tui/widgets/__init__.py +++ b/src/tui/widgets/__init__.py @@ -1,6 +1,6 @@ """Widgets for OpenRAG TUI.""" -from .flow_backup_warning_modal import FlowBackupWarningModal +from tui.widgets.flow_backup_warning_modal import FlowBackupWarningModal __all__ = ["FlowBackupWarningModal"] diff --git a/src/tui/widgets/command_modal.py b/src/tui/widgets/command_modal.py index 1a716a72..03ec88dd 100644 --- a/src/tui/widgets/command_modal.py +++ b/src/tui/widgets/command_modal.py @@ -10,8 +10,8 @@ from textual.containers import Container from textual.screen import ModalScreen from textual.widgets import Button, Static, Label, TextArea, Footer -from ..utils.clipboard import copy_text_to_clipboard -from .waves import Waves +from tui.utils.clipboard import copy_text_to_clipboard +from tui.widgets.waves import Waves class CommandOutputModal(ModalScreen): diff --git a/src/tui/widgets/diagnostics_notification.py b/src/tui/widgets/diagnostics_notification.py index 6a5f8619..df4e4551 100644 --- a/src/tui/widgets/diagnostics_notification.py +++ b/src/tui/widgets/diagnostics_notification.py @@ -24,7 +24,7 @@ def notify_with_diagnostics( # Then add a button to open diagnostics screen def open_diagnostics() -> None: - from ..screens.diagnostics import DiagnosticsScreen + from tui.screens.diagnostics import DiagnosticsScreen app.push_screen(DiagnosticsScreen()) diff --git a/src/tui/widgets/error_notification.py b/src/tui/widgets/error_notification.py index 6a5f8619..df4e4551 100644 --- a/src/tui/widgets/error_notification.py +++ b/src/tui/widgets/error_notification.py @@ -24,7 +24,7 @@ def notify_with_diagnostics( # Then add a button to open diagnostics screen def open_diagnostics() -> None: - from ..screens.diagnostics import DiagnosticsScreen + from tui.screens.diagnostics import DiagnosticsScreen app.push_screen(DiagnosticsScreen()) diff --git a/src/utils/document_processing.py b/src/utils/document_processing.py index 75ccb085..18a90e6b 100644 --- a/src/utils/document_processing.py +++ b/src/utils/document_processing.py @@ -1,7 +1,8 @@ import os import sys from collections import defaultdict -from .gpu_detection import detect_gpu_devices + +from utils.gpu_detection import detect_gpu_devices from utils.logging_config import get_logger logger = get_logger(__name__) @@ -360,7 +361,7 @@ def process_document_sync(file_path: str): system=f"{platform.system()} {platform.release()}", architecture=platform.machine(), ) - except: + except Exception: pass # Re-raise to trigger BrokenProcessPool in main process diff --git a/src/utils/logging_config.py b/src/utils/logging_config.py index d9b432de..2811562b 100644 --- a/src/utils/logging_config.py +++ b/src/utils/logging_config.py @@ -51,7 +51,7 @@ def configure_logging( pathname = event_dict.pop("pathname", "") filename = event_dict.pop("filename", "") lineno = event_dict.pop("lineno", "") - level = event_dict.pop("level", "") + _ = event_dict.pop("level", "") # Build file location - prefer pathname for full path, fallback to filename if pathname and lineno: diff --git a/src/utils/telemetry/__init__.py b/src/utils/telemetry/__init__.py index bcd2cc8e..1b910d52 100644 --- a/src/utils/telemetry/__init__.py +++ b/src/utils/telemetry/__init__.py @@ -1,7 +1,7 @@ """Telemetry module for OpenRAG backend.""" -from .client import TelemetryClient -from .category import Category -from .message_id import MessageId +from utils.telemetry.category import Category +from utils.telemetry.client import TelemetryClient +from utils.telemetry.message_id import MessageId __all__ = ["TelemetryClient", "Category", "MessageId"] diff --git a/tests/conftest.py b/tests/conftest.py index 5fab5782..e780c465 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -15,9 +15,9 @@ load_dotenv() os.environ["GOOGLE_OAUTH_CLIENT_ID"] = "" os.environ["GOOGLE_OAUTH_CLIENT_SECRET"] = "" -from src.config.settings import clients -from src.session_manager import SessionManager -from src.main import generate_jwt_keys +from src.config.settings import clients # noqa: E402 +from src.session_manager import SessionManager # noqa: E402 +from src.main import generate_jwt_keys # noqa: E402 @pytest_asyncio.fixture(scope="session", autouse=True) diff --git a/warm_up_docling.py b/warm_up_docling.py index 3a834e2f..e3c7771a 100644 --- a/warm_up_docling.py +++ b/warm_up_docling.py @@ -7,7 +7,7 @@ src_path = os.path.join(repo_root, "src") if src_path not in sys.path: sys.path.insert(0, src_path) -from utils.document_processing import create_document_converter +from utils.document_processing import create_document_converter # noqa: E402 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__)