| """Application config."""
|
|
|
| from __future__ import annotations
|
|
|
| import os
|
| from pathlib import Path
|
|
|
| from dotenv import load_dotenv
|
|
|
| ROOT_DIR = Path(__file__).resolve().parent.parent
|
| load_dotenv(ROOT_DIR / ".env")
|
|
|
| APP_DIR = Path(__file__).resolve().parent
|
|
|
| APP_TITLE = os.environ.get("APP_TITLE", "ZuZu Writer")
|
| HOST = os.environ.get("HOST", "0.0.0.0")
|
| PORT = int(os.environ.get("PORT", "7860") or "7860")
|
| SPACY_MODEL = os.environ.get("SPACY_MODEL", "en_core_web_sm")
|
|
|
| MAX_CHARS = max(
|
| 100_000,
|
| int(os.environ.get("MAX_CHARS", "1000000") or "1000000"),
|
| )
|
|
|
|
|
| SUPABASE_URL = (os.environ.get("SUPABASE_URL") or "").rstrip("/")
|
| SUPABASE_ANON_KEY = os.environ.get("SUPABASE_ANON_KEY") or ""
|
| SUPABASE_SERVICE_ROLE_KEY = os.environ.get("SUPABASE_SERVICE_ROLE_KEY") or ""
|
| SUPABASE_JWT_SECRET = os.environ.get("SUPABASE_JWT_SECRET") or ""
|
| AUTH_ENABLED = bool(SUPABASE_URL and SUPABASE_ANON_KEY and SUPABASE_SERVICE_ROLE_KEY)
|
|
|
| GUEST_DAILY_REWRITES = max(
|
| 1, min(int(os.environ.get("GUEST_DAILY_REWRITES", "1000") or "1000"), 1000)
|
| )
|
| GUEST_MAX_WORDS = max(
|
| 20, min(int(os.environ.get("GUEST_MAX_WORDS", "100") or "100"), 5000)
|
| )
|
| GUEST_DAILY_WORD_CAP = max(
|
| GUEST_MAX_WORDS,
|
| min(
|
| int(
|
| os.environ.get("GUEST_DAILY_WORD_CAP", str(GUEST_MAX_WORDS))
|
| or str(GUEST_MAX_WORDS)
|
| ),
|
| 5000,
|
| ),
|
| )
|
| SESSION_IDLE_MINUTES = int(
|
| os.environ.get("SESSION_IDLE_MINUTES", "30") or "30"
|
| )
|
|
|
|
|
|
|
| LANGUAGE_TOOL_URL = (os.environ.get("LANGUAGE_TOOL_URL") or "").rstrip("/")
|
| LANGUAGE_TOOL_LANGUAGE = os.environ.get("LANGUAGE_TOOL_LANGUAGE") or "en-US"
|
| LANGUAGE_TOOL_TIMEOUT = float(os.environ.get("LANGUAGE_TOOL_TIMEOUT", "90") or "90")
|
| LANGUAGE_TOOL_CHUNK_CHARS = max(
|
| 500,
|
| min(int(os.environ.get("LANGUAGE_TOOL_CHUNK_CHARS", "1800") or "1800"), 8000),
|
| )
|
|
|
| GRAMMAR_MAX_CHARS = max(
|
| 1000,
|
| min(int(os.environ.get("GRAMMAR_MAX_CHARS", "50000") or "50000"), MAX_CHARS),
|
| )
|
| _lt_flag = (os.environ.get("LANGUAGE_TOOL_ENABLED") or "true").strip().lower()
|
| LANGUAGE_TOOL_ENABLED = _lt_flag not in {"0", "false", "no", "off"} and bool(LANGUAGE_TOOL_URL)
|
|
|
|
|
| MINILM_MODEL = (
|
| os.environ.get("MINILM_MODEL") or "sentence-transformers/all-MiniLM-L6-v2"
|
| ).strip()
|
|
|
|
|
| _gfo = (os.environ.get("GRAMMAR_FIX_OUTPUT") or "true").strip().lower()
|
| GRAMMAR_FIX_OUTPUT = _gfo not in {"0", "false", "no", "off"}
|
|
|
| ENGINE_BATCH_PARAS = max(
|
| 1, min(int(os.environ.get("ENGINE_BATCH_PARAS", "20") or "20"), 100)
|
| )
|
| ENGINE_MIN_CONFIDENCE = max(
|
| 0.0, min(float(os.environ.get("ENGINE_MIN_CONFIDENCE", "0.55") or "0.55"), 1.0)
|
| )
|
| ENGINE_SAFETY_MIN = max(
|
| 0.0, min(float(os.environ.get("ENGINE_SAFETY_MIN", "0.80") or "0.80"), 1.0)
|
| )
|
|
|
|
|
| _ems = (os.environ.get("ENGINE_USE_MINILM_SAFETY") or "true").strip().lower()
|
| ENGINE_USE_MINILM_SAFETY = _ems in {"1", "true", "yes", "on"}
|
|
|
|
|
|
|
|
|
| _eca = (os.environ.get("ENGINE_CLASSICAL_AGGRESSIVE") or "true").strip().lower()
|
| ENGINE_CLASSICAL_AGGRESSIVE = _eca in {"1", "true", "yes", "on"}
|
|
|
|
|
|
|
| _esv = (os.environ.get("ENGINE_STRUCTURAL_VARIATION") or "true").strip().lower()
|
| ENGINE_STRUCTURAL_VARIATION = _esv in {"1", "true", "yes", "on"}
|
|
|
|
|
|
|
| _elr = (os.environ.get("ENGINE_LEXICAL_REFINEMENT") or "true").strip().lower()
|
| ENGINE_LEXICAL_REFINEMENT = _elr in {"1", "true", "yes", "on"}
|
|
|
| ENGINE_LEXICAL_MAX_CHANGES = max(
|
| 0,
|
| min(int(os.environ.get("ENGINE_LEXICAL_MAX_CHANGES", "0") or "0"), 15),
|
| )
|
| ENGINE_LEXICAL_MIN_WSD = max(
|
| 0.0,
|
| min(float(os.environ.get("ENGINE_LEXICAL_MIN_WSD", "0.14") or "0.14"), 1.0),
|
| )
|
| ENGINE_LEXICAL_MIN_ZIPF = max(
|
| 0.0,
|
| min(float(os.environ.get("ENGINE_LEXICAL_MIN_ZIPF", "4.0") or "4.0"), 8.0),
|
| )
|
| ENGINE_LEXICAL_MAX_FREQUENCY_GAP = max(
|
| 0.0,
|
| min(
|
| float(
|
| os.environ.get("ENGINE_LEXICAL_MAX_FREQUENCY_GAP", "0.60")
|
| or "0.60"
|
| ),
|
| 8.0,
|
| ),
|
| )
|
|
|
|
|
| ENGINE_LEXICAL_MAX_SIMPLER_GAP = max(
|
| 0.0,
|
| min(
|
| float(
|
| os.environ.get("ENGINE_LEXICAL_MAX_SIMPLER_GAP", "2.5") or "2.5"
|
| ),
|
| 8.0,
|
| ),
|
| )
|
| ENGINE_LEXICAL_MAX_HARDER_GAP = max(
|
| 0.0,
|
| min(
|
| float(
|
| os.environ.get("ENGINE_LEXICAL_MAX_HARDER_GAP", "0.15") or "0.15"
|
| ),
|
| 2.0,
|
| ),
|
| )
|
| _els = (os.environ.get("ENGINE_LEXICAL_PREFER_SIMPLER") or "true").strip().lower()
|
| ENGINE_LEXICAL_PREFER_SIMPLER = _els in {"1", "true", "yes", "on"}
|
| ENGINE_WORDNET_LEXICON = (
|
| os.environ.get("ENGINE_WORDNET_LEXICON") or "oewn:2025"
|
| ).strip()
|
|
|
|
|
| _erw = (os.environ.get("ENGINE_REQUIRE_WORDING_CHANGE") or "true").strip().lower()
|
| ENGINE_REQUIRE_WORDING_CHANGE = _erw in {"1", "true", "yes", "on"}
|
|
|
|
|
| _efr = (os.environ.get("ENGINE_FORCE_REWRITE") or "false").strip().lower()
|
| ENGINE_FORCE_REWRITE = _efr in {"1", "true", "yes", "on"}
|
|
|
|
|
| _ep = (os.environ.get("ENGINE_PARAPHRASE") or "true").strip().lower()
|
| ENGINE_PARAPHRASE = _ep in {"1", "true", "yes", "on"}
|
| _epp = (os.environ.get("ENGINE_PARAPHRASE_PRIMARY") or "true").strip().lower()
|
| ENGINE_PARAPHRASE_PRIMARY = _epp in {"1", "true", "yes", "on"}
|
| ENGINE_PARAPHRASE_MODEL = (
|
| os.environ.get("ENGINE_PARAPHRASE_MODEL")
|
| or "Vamsi/T5_Paraphrase_Paws"
|
| ).strip()
|
| ENGINE_PARAPHRASE_MIN_SIM = max(
|
| 0.0,
|
| min(
|
| float(os.environ.get("ENGINE_PARAPHRASE_MIN_SIM", "0.72") or "0.72"),
|
| 1.0,
|
| ),
|
| )
|
| ENGINE_PARAPHRASE_NUM_RETURN = max(
|
| 1,
|
| min(int(os.environ.get("ENGINE_PARAPHRASE_NUM_RETURN", "6") or "6"), 8),
|
| )
|
| ENGINE_PARAPHRASE_MAX_NEW_TOKENS = max(
|
| 16,
|
| min(
|
| int(os.environ.get("ENGINE_PARAPHRASE_MAX_NEW_TOKENS", "72") or "72"),
|
| 128,
|
| ),
|
| )
|
|
|
| ENGINE_PARAPHRASE_MAX_SURFACE = max(
|
| 0.5,
|
| min(
|
| float(os.environ.get("ENGINE_PARAPHRASE_MAX_SURFACE", "0.70") or "0.70"),
|
| 0.99,
|
| ),
|
| )
|
|
|
| ENGINE_PARAPHRASE_MIN_DIVERGENCE = max(
|
| 0.0,
|
| min(
|
| float(
|
| os.environ.get("ENGINE_PARAPHRASE_MIN_DIVERGENCE", "0.30") or "0.30"
|
| ),
|
| 0.6,
|
| ),
|
| )
|
|
|
|
|
| _ephr = (os.environ.get("ENGINE_PHRASE_REWRITE") or "true").strip().lower()
|
| ENGINE_PHRASE_REWRITE = _ephr in {"1", "true", "yes", "on"}
|
|
|
| ENGINE_PHRASE_MAX_CHANGES = max(
|
| 0,
|
| min(int(os.environ.get("ENGINE_PHRASE_MAX_CHANGES", "0") or "0"), 4),
|
| )
|
| ENGINE_PHRASE_MIN_SIM = max(
|
| 0.0,
|
| min(float(os.environ.get("ENGINE_PHRASE_MIN_SIM", "0.74") or "0.74"), 1.0),
|
| )
|
|
|
| _ephr_t5 = (os.environ.get("ENGINE_PHRASE_USE_T5") or "false").strip().lower()
|
| ENGINE_PHRASE_USE_T5 = _ephr_t5 in {"1", "true", "yes", "on"}
|
|
|
|
|
| _epl = (os.environ.get("ENGINE_PRESERVE_LENGTH") or "true").strip().lower()
|
| ENGINE_PRESERVE_LENGTH = _epl in {"1", "true", "yes", "on"}
|
|
|
| _esl = (os.environ.get("ENGINE_SPLIT_LONG") or "true").strip().lower()
|
| ENGINE_SPLIT_LONG = _esl in {"1", "true", "yes", "on"}
|
| ENGINE_SPLIT_MIN_WORDS = max(
|
| 10,
|
| min(int(os.environ.get("ENGINE_SPLIT_MIN_WORDS", "16") or "16"), 40),
|
| )
|
|
|