| """ |
| File with environment variables and general configuration logic. |
| Environment variables are loaded from `.env`, with default values as fallback. |
| |
| For project metadata, pyproject.toml is used. |
| Complex types like lists are read as JSON-encoded strings. |
| """ |
|
|
| import tomllib |
| from pathlib import Path |
| from typing import Literal |
| from urllib.parse import quote_plus |
|
|
| from environs import Env |
| from pydantic import validator |
| from pydantic_settings import BaseSettings |
| from structlog.stdlib import BoundLogger |
|
|
|
|
| from app.core.logger import Logger |
|
|
| PROJECT_DIR = Path(__file__).parent.parent.parent |
| with open(f"{PROJECT_DIR}/pyproject.toml", "rb") as f: |
| PYPROJECT_CONTENT = tomllib.load(f)["tool"]["poetry"] |
|
|
| env = Env() |
| env.read_env() |
|
|
| CORS_ALLOWED_HEADERS = list(map(str.strip, env.list("CORS_ALLOWED_HEADERS", ["*"]))) |
| CORS_ORIGINS = list(map(str.strip, env.list("CORS_ORIGINS", ["http://localhost:3000"]))) |
|
|
|
|
| class Settings(BaseSettings): |
| |
| ENVIRONMENT: Literal["DEV", "STG", "PROD"] = env.str("ENVIRONMENT", "DEV").upper() |
|
|
| |
| |
| |
| |
|
|
| |
| LOG_LEVEL: Literal["INFO", "DEBUG", "WARN", "ERROR"] = env.str("LOG_LEVEL", "INFO") |
| LOG_JSON_FORMAT: bool = env.bool("LOG_JSON_FORMAT", False) |
|
|
| |
| PROJECT_NAME: str = PYPROJECT_CONTENT["name"] |
| VERSION: str = PYPROJECT_CONTENT["version"] |
| DESCRIPTION: str = PYPROJECT_CONTENT["description"] |
|
|
| ROOT_PATH: str = env.str("ROOT_PATH", "") |
|
|
| |
| DOCS_URL: str = f"{ROOT_PATH}/docs" |
| OPENAPI_URL: str = f"{ROOT_PATH}/openapi.json" |
|
|
| |
| DATABASE_HOSTNAME: str = env.str("DATABASE_HOSTNAME") |
| DATABASE_USER: str = env.str("DATABASE_USER") |
| DATABASE_PASSWORD: str = env.str("DATABASE_PASSWORD") |
| DATABASE_PORT: str = env.str("DATABASE_PORT", "5432") |
| DATABASE_DB: str = env.str("DATABASE_DB") |
| SQLALCHEMY_DATABASE_URI: str = "" |
|
|
| @validator("SQLALCHEMY_DATABASE_URI") |
| def _assemble_db_connection(cls, v: str, values: dict[str, str]) -> str: |
| return "postgresql+asyncpg://{}:{}@{}:{}/{}".format( |
| values["DATABASE_USER"], |
| quote_plus(values["DATABASE_PASSWORD"]), |
| values["DATABASE_HOSTNAME"], |
| values["DATABASE_PORT"], |
| values["DATABASE_DB"], |
| ) |
|
|
| |
| UVICORN_HOST: str = env.str("UVICORN_HOST", "0.0.0.0") |
| UVICORN_PORT: int = env.int("UVICORN_PORT", 5001) |
|
|
| CACHE_HOST: str = env.str("CACHE_HOST", "localhost") |
| CACHE_PORT: int = env.int("CACHE_PORT", 11211) |
| CACHE_TTL: int = env.int("CACHE_TTL", 300) |
|
|
| BEDROCK_MODEL_ID: str = env.str("BEDROCK_MODEL_ID", "anthropic.claude-v2") |
| BEDROCK_PROVIDER: str = env.str("BEDROCK_PROVIDER", "anthropic") |
| AWS_ACCESS_KEY: str = env.str("AWS_ACCESS_KEY", "") |
| AWS_SECRET_KEY: str = env.str("AWS_SECRET_KEY", "") |
| AWS_REGION: str = env.str("AWS_REGION", "us-east-1") |
|
|
| TOKENIZER_MODEL: str = env.str("TOKENIZER_MODEL") |
| TOKEN_LIMIT_PER_REQUEST: int = env.int("TOKEN_LIMIT_PER_REQUEST", 20000) |
|
|
|
|
| settings: Settings = Settings() |
|
|
| log: BoundLogger = Logger( |
| json_logs=settings.LOG_JSON_FORMAT, log_level=settings.LOG_LEVEL |
| ).setup_logging() |