Profile-aware bootstrap gating in start_alwrity_backend.py
- Add LINGUISTIC_REQUIRED_FEATURES set for profile-based gating - Add get_active_profile() helper to read from ALWRITY_ACTIVE_PROFILE, ALWRITY_PROFILE, ALWRITY_FEATURE_PROFILE - Add get_loaded_features() to read from ALWRITY_LOADED_FEATURES - Add should_bootstrap_linguistic_models() - runs for all/default or when loaded features intersect linguistic-required - Add should_bootstrap_local_llm_models() - skip for podcast/youtube/planning profiles - Gate bootstrap steps at module load time
This commit is contained in:
@@ -11,6 +11,47 @@ import argparse
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
LINGUISTIC_REQUIRED_FEATURES = {"content_planning", "strategy_copilot", "facebook", "linkedin", "blog_writer", "persona"}
|
||||||
|
|
||||||
|
|
||||||
|
def get_active_profile() -> str:
|
||||||
|
"""Get active profile from environment variables."""
|
||||||
|
return os.getenv("ALWRITY_ACTIVE_PROFILE", os.getenv("ALWRITY_PROFILE", os.getenv("ALWRITY_FEATURE_PROFILE", os.getenv("ALWRITY_ROUTER_PROFILE", os.getenv("ALWRITY_FEATURE_TO_ENABLE", "all"))))).strip().lower() or "all"
|
||||||
|
|
||||||
|
|
||||||
|
def get_loaded_features() -> set:
|
||||||
|
"""Get loaded features from environment variables."""
|
||||||
|
features_str = os.getenv("ALWRITY_LOADED_FEATURES", os.getenv("ALWRITY_ENABLED_FEATURES", os.getenv("ALWRITY_FEATURES", "")))
|
||||||
|
if not features_str:
|
||||||
|
return set()
|
||||||
|
return {f.strip().lower() for f in features_str.split(",") if f.strip()}
|
||||||
|
|
||||||
|
|
||||||
|
def should_bootstrap_linguistic_models() -> bool:
|
||||||
|
"""Decide whether to bootstrap linguistic models based on profile."""
|
||||||
|
profile = get_active_profile()
|
||||||
|
verbose = os.getenv("ALWRITY_VERBOSE", "false").lower() == "true"
|
||||||
|
|
||||||
|
if profile in {"all", "default"}:
|
||||||
|
return True
|
||||||
|
|
||||||
|
loaded_features = get_loaded_features()
|
||||||
|
if not loaded_features:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return bool(loaded_features & LINGUISTIC_REQUIRED_FEATURES)
|
||||||
|
|
||||||
|
|
||||||
|
def should_bootstrap_local_llm_models() -> bool:
|
||||||
|
"""Decide whether to bootstrap local LLM models based on profile."""
|
||||||
|
profile = get_active_profile()
|
||||||
|
|
||||||
|
if profile in {"all", "default"}:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return profile not in {"podcast", "youtube", "planning"}
|
||||||
|
|
||||||
|
|
||||||
def bootstrap_linguistic_models():
|
def bootstrap_linguistic_models():
|
||||||
"""
|
"""
|
||||||
Bootstrap spaCy and NLTK models BEFORE any imports.
|
Bootstrap spaCy and NLTK models BEFORE any imports.
|
||||||
@@ -145,8 +186,19 @@ def bootstrap_local_llm_models():
|
|||||||
|
|
||||||
# Bootstrap linguistic models BEFORE any imports that might need them
|
# Bootstrap linguistic models BEFORE any imports that might need them
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
bootstrap_linguistic_models()
|
if should_bootstrap_linguistic_models():
|
||||||
bootstrap_local_llm_models()
|
bootstrap_linguistic_models()
|
||||||
|
else:
|
||||||
|
verbose = os.getenv("ALWRITY_VERBOSE", "false").lower() == "true"
|
||||||
|
if verbose:
|
||||||
|
print("⏭️ Skipping linguistic model bootstrap (profile-gated)")
|
||||||
|
|
||||||
|
if should_bootstrap_local_llm_models():
|
||||||
|
bootstrap_local_llm_models()
|
||||||
|
else:
|
||||||
|
verbose = os.getenv("ALWRITY_VERBOSE", "false").lower() == "true"
|
||||||
|
if verbose:
|
||||||
|
print("⏭️ Skipping local LLM model bootstrap (profile-gated)")
|
||||||
|
|
||||||
# NOW import modular utilities (after bootstrap)
|
# NOW import modular utilities (after bootstrap)
|
||||||
from alwrity_utils import (
|
from alwrity_utils import (
|
||||||
|
|||||||
Reference in New Issue
Block a user