| APP_TITLE=ZuZu Writer | |
| HOST=0.0.0.0 | |
| PORT=7860 | |
| SPACY_MODEL=en_core_web_sm | |
| MAX_CHARS=1000000 | |
| # Self-hosted LanguageTool (ZuZu Grammar — full sentence grammar) | |
| # Local LT sidecar: docker compose up languagetool -d | |
| # Then: LANGUAGE_TOOL_URL=http://127.0.0.1:8010 | |
| # HF Space / Docker image: embedded LT starts automatically (LANGUAGE_TOOL_EMBEDDED=true) | |
| LANGUAGE_TOOL_URL=http://127.0.0.1:8010 | |
| LANGUAGE_TOOL_LANGUAGE=en-US | |
| LANGUAGE_TOOL_ENABLED=true | |
| LANGUAGE_TOOL_TIMEOUT=90 | |
| LANGUAGE_TOOL_CHUNK_CHARS=1800 | |
| GRAMMAR_MAX_CHARS=50000 | |
| LANGUAGE_TOOL_EMBEDDED=true | |
| # LANGUAGETOOL_JAVA_OPTS=-Xms256m -Xmx1024m | |
| # Grammar cleanup runs after successful sentence reordering only. | |
| GRAMMAR_FIX_OUTPUT=true | |
| # Structural engine | |
| ENGINE_BATCH_PARAS=20 | |
| ENGINE_MIN_CONFIDENCE=0.55 | |
| ENGINE_SAFETY_MIN=0.80 | |
| # When false, phrase/lexical use classical collocation brakes (no MiniLM). | |
| ENGINE_USE_MINILM_SAFETY=false | |
| # When MiniLM is off: aggressive wording each pass (option 2). false = tight anti-drift. | |
| ENGINE_CLASSICAL_AGGRESSIVE=true | |
| # Rotate between equally-ranked structures so repeat requests differ. | |
| # false = deterministic output (same input always rewrites the same way). | |
| ENGINE_STRUCTURAL_VARIATION=true | |
| MINILM_MODEL=sentence-transformers/all-MiniLM-L6-v2 | |
| # Local CPU paraphraser — ON for generative pass divergence (needs torch + T5). | |
| ENGINE_PARAPHRASE=true | |
| ENGINE_PARAPHRASE_PRIMARY=true | |
| ENGINE_PARAPHRASE_MODEL=Vamsi/T5_Paraphrase_Paws | |
| ENGINE_PARAPHRASE_MIN_SIM=0.72 | |
| ENGINE_PARAPHRASE_NUM_RETURN=6 | |
| ENGINE_PARAPHRASE_MAX_NEW_TOKENS=72 | |
| ENGINE_PARAPHRASE_MAX_SURFACE=0.70 | |
| ENGINE_PARAPHRASE_MIN_DIVERGENCE=0.30 | |
| # Phrase-level rewrite (verb–object spans via WordNet hyponyms + optional T5) | |
| ENGINE_PHRASE_REWRITE=true | |
| # 0 = dynamic (1 normally, 2 with polish). Set 1–4 to hard-cap. | |
| ENGINE_PHRASE_MAX_CHANGES=0 | |
| ENGINE_PHRASE_MIN_SIM=0.74 | |
| # Keep T5 span paraphrase off by default (WordNet phrase path is safer). | |
| ENGINE_PHRASE_USE_T5=false | |
| # Keep rewrite length near the source; trim only when clearly bloated. | |
| ENGINE_PRESERVE_LENGTH=true | |
| # Split long sentences on clause joins during structural fallback. | |
| ENGINE_SPLIT_LONG=true | |
| ENGINE_SPLIT_MIN_WORDS=16 | |
| # Legacy fixed cleft fallback (off by default) | |
| ENGINE_FORCE_REWRITE=false | |
| # Require rewriteable sentences to change wording when a safe option exists | |
| ENGINE_REQUIRE_WORDING_CHANGE=true | |
| # Low-impact vocabulary refinement after structure/paraphrase | |
| ENGINE_LEXICAL_REFINEMENT=true | |
| # 0 = fully dynamic synonym budget from sentence length (recommended). | |
| # Set >0 only to hard-cap the dynamic budget (max 15). | |
| ENGINE_LEXICAL_MAX_CHANGES=0 | |
| ENGINE_LEXICAL_MIN_WSD=0.14 | |
| ENGINE_LEXICAL_MIN_ZIPF=4.0 | |
| ENGINE_LEXICAL_MAX_FREQUENCY_GAP=0.60 | |
| # Prefer everyday (higher-frequency) synonyms via wordfreq, not word lists. | |
| ENGINE_LEXICAL_PREFER_SIMPLER=true | |
| ENGINE_LEXICAL_MAX_SIMPLER_GAP=2.5 | |
| ENGINE_LEXICAL_MAX_HARDER_GAP=0.15 | |
| ENGINE_WORDNET_LEXICON=oewn:2025 | |
| # Existing UI authentication and quotas (leave blank for open local mode) | |
| GUEST_DAILY_REWRITES=1000 | |
| GUEST_MAX_WORDS=100 | |
| GUEST_DAILY_WORD_CAP=100 | |
| SESSION_IDLE_MINUTES=30 | |
| SUPABASE_URL=https://YOUR_PROJECT.supabase.co | |
| SUPABASE_ANON_KEY= | |
| SUPABASE_SERVICE_ROLE_KEY= | |
| SUPABASE_JWT_SECRET= | |