# src/constants.py """Application-wide constants and configuration values.""" import os APP_VERSION = "0.9.1" # Base paths BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + "/" STATIC_DIR = os.path.join(BASE_DIR, "static") DATA_DIR = os.path.join(BASE_DIR, "data") # Data file paths SESSIONS_FILE = os.path.join(DATA_DIR, "sessions.json") MEMORY_FILE = os.path.join(DATA_DIR, "memory.json") MEMORY_DOC = os.path.join(DATA_DIR, "memory_doc.md") PERSONAL_DIR = os.path.join(DATA_DIR, "personal_docs") RUNBOOK_DIR = os.path.join(PERSONAL_DIR, "runbook") UPLOAD_DIR = os.path.join(DATA_DIR, "uploads") FEATURES_FILE = os.path.join(DATA_DIR, "features.json") SETTINGS_FILE = os.path.join(DATA_DIR, "settings.json") # API Configuration MAX_CONTEXT_MESSAGES = 90 REQUEST_TIMEOUT = 20 OPENAI_COMPAT_PATH = "/v1/chat/completions" # Environment variables with defaults DEFAULT_HOST = os.getenv("LLM_HOST", "localhost") LLM_HOSTS = [h.strip() for h in os.getenv("LLM_HOSTS", "").split(",") if h.strip()] OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") SEARXNG_INSTANCE = os.getenv('SEARXNG_INSTANCE', 'http://localhost:8080') # Cleanup configuration CLEANUP_ENABLED = os.getenv("CLEANUP_ENABLED", "True").lower() == "true" CLEANUP_INTERVAL_HOURS = int(os.getenv("CLEANUP_INTERVAL_HOURS", "24")) # Default parameters DEFAULT_TEMPERATURE = 1.0 DEFAULT_MAX_TOKENS = 0 def internal_api_base() -> str: """Base URL for in-process loopback calls to Odysseus's own API. Agent tools and background jobs reach admin-gated routes by calling the running server over HTTP. Resolution order: 1. ODYSSEUS_INTERNAL_BASE - explicit override (e.g. behind a TLS proxy). 2. APP_PORT - http://127.0.0.1:$APP_PORT (docker-compose). 3. Fallback http://127.0.0.1:7000 - legacy default. 127.0.0.1 (not "localhost") avoids IPv6/DNS ambiguity for a strictly-local call. Without this, loopback tools fail with "All connection attempts failed" whenever the server is not on port 7000. """ override = os.environ.get("ODYSSEUS_INTERNAL_BASE") if override: return override.rstrip("/") return f"http://127.0.0.1:{os.environ.get('APP_PORT', '7000')}"