File size: 5,723 Bytes
73a6a7e
 
 
 
ce2ce69
73a6a7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71192d1
 
73a6a7e
ce2ce69
73a6a7e
 
 
ce2ce69
73a6a7e
 
ce2ce69
 
73a6a7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ce2ce69
 
 
 
 
 
 
 
 
73a6a7e
 
ce2ce69
73a6a7e
 
 
71192d1
 
73a6a7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import logging
import os
from pathlib import Path
from typing import List, Optional

from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict

# ─────────────────────────────────────────────────────────────────────────────
# β›Ί Paths & Constants
# ─────────────────────────────────────────────────────────────────────────────

PROJECT_ROOT = Path(__file__).parent.parent
APP_DATA_ROOT_DIR = Path.home() / ".wellsaid_app_data"
MODELS_DIR = APP_DATA_ROOT_DIR / "models"
NLTK_DATA_DIR = APP_DATA_ROOT_DIR / "nltk_data"

OFFLINE_MODE = os.getenv("OFFLINE_MODE", "false").lower() == "true"

# ─────────────────────────────────────────────────────────────────────────────
# πŸ“ Ensure Directories Exist (for offline desktop usage)
# ─────────────────────────────────────────────────────────────────────────────

for directory in [MODELS_DIR, NLTK_DATA_DIR]:
    try:
        directory.mkdir(parents=True, exist_ok=True)
    except Exception as e:
        logging.warning(f"Failed to create directory {directory}: {e}")

# ─────────────────────────────────────────────────────────────────────────────
# 🌍 Environment Variables Setup (only if not already set)
# ─────────────────────────────────────────────────────────────────────────────

env_defaults = {
    "HF_HOME": str(MODELS_DIR / "hf_cache"),
    "NLTK_DATA": str(NLTK_DATA_DIR),
    "SPACY_DATA": str(MODELS_DIR),
}

for var, default in env_defaults.items():
    if not os.getenv(var):
        os.environ[var] = default

# Update nltk.data.path immediately (if nltk is installed)
try:
    import nltk
    if str(NLTK_DATA_DIR) not in nltk.data.path:
        nltk.data.path.append(str(NLTK_DATA_DIR))
except ImportError:
    pass

# ─────────────────────────────────────────────────────────────────────────────
# βš™οΈ Application Settings
# ─────────────────────────────────────────────────────────────────────────────

class Settings(BaseSettings):
    model_config = SettingsConfigDict(env_file=".env", extra="ignore")

    # App basics
    APP_NAME: str = "WellSaidApp"
    API_KEY: str = "your_strong_api_key_here"

    # OpenAI
    OPENAI_API_KEY: Optional[str] = None
    OPENAI_MODEL: str = "gpt-4o"
    OPENAI_TEMPERATURE: float = 0.7
    OPENAI_MAX_TOKENS: int = 1500

    # API server
    HOST: str = "127.0.0.1"
    PORT: int = 8000
    RELOAD: bool = False
    WORKER_COUNT: int = 1

    # NLP models
    SPACY_MODEL_ID: str = "en_core_web_sm"
    SENTENCE_TRANSFORMER_MODEL_ID: str = "all-MiniLM-L6-v2"
    SENTENCE_TRANSFORMER_BATCH_SIZE: int = 2

    GRAMMAR_MODEL_ID: str = "visheratin/t5-efficient-mini-grammar-correction"
    PARAPHRASE_MODEL_ID: str = "humarin/chatgpt_paraphraser_on_T5_base"
    TONE_MODEL_ID: str = "boltuix/NeuroFeel"
    TONE_CONFIDENCE_THRESHOLD: float = 1.0
    TRANSLATION_MODEL_ID: str = "Helsinki-NLP/opus-mt-en-ROMANCE"

    WORDNET_NLTK_ID: str = "wordnet.zip"

    SUPPORTED_TRANSLATION_LANGUAGES: List[str] = [
        "fr", "fr_BE", "fr_CA", "fr_FR", "wa", "frp", "oc", "ca", "rm", "lld",
        "fur", "lij", "lmo", "es", "es_AR", "es_CL", "es_CO", "es_CR", "es_DO",
        "es_EC", "es_ES", "es_GT", "es_HN", "es_MX", "es_NI", "es_PA", "es_PE",
        "es_PR", "es_SV", "es_UY", "es_VE", "pt", "pt_br", "pt_BR", "pt_PT",
        "gl", "lad", "an", "mwl", "it", "it_IT", "co", "nap", "scn", "vec",
        "sc", "ro", "la"
    ]

    # Data dirs
    INCLUSIVE_RULES_DIR: str = "app/data/en"

# ─────────────────────────────────────────────────────────────────────────────
# πŸ“¦ App-wide constants
# ─────────────────────────────────────────────────────────────────────────────

settings = Settings()

# Core settings for import
APP_NAME = settings.APP_NAME
LOCAL_API_HOST = settings.HOST
LOCAL_API_PORT = settings.PORT

# Model names
SPACY_MODEL_ID = settings.SPACY_MODEL_ID
SENTENCE_TRANSFORMER_MODEL_ID = settings.SENTENCE_TRANSFORMER_MODEL_ID
GRAMMAR_MODEL_ID = settings.GRAMMAR_MODEL_ID
PARAPHRASE_MODEL_ID = settings.PARAPHRASE_MODEL_ID
TONE_MODEL_ID = settings.TONE_MODEL_ID
TRANSLATION_MODEL_ID = settings.TRANSLATION_MODEL_ID
WORDNET_NLTK_ID = settings.WORDNET_NLTK_ID

# Data
INCLUSIVE_RULES_DIR = settings.INCLUSIVE_RULES_DIR