import platform from pathlib import Path from tempfile import gettempdir from typing import List, Literal, Optional, Union from pydantic import BaseSettings from yarl import URL from reworkd_platform.constants import ENV_PREFIX TEMP_DIR = Path(gettempdir()) LOG_LEVEL = Literal[ "NOTSET", "DEBUG", "INFO", "WARNING", "ERROR", "FATAL", ] SASL_MECHANISM = Literal[ "PLAIN", "SCRAM-SHA-256", ] ENVIRONMENT = Literal[ "development", "production", ] class Settings(BaseSettings): """ Application settings. These parameters can be configured with environment variables. """ # Application settings host: str = "0.0.0.0" port: int = 8000 workers_count: int = 1 reload: bool = True environment: ENVIRONMENT = "development" log_level: LOG_LEVEL = "DEBUG" # Make sure you update this with your own secret key # Must be 32 url-safe base64-encoded bytes secret_signing_key: str = "JF52S66x6WMoifP5gZreiguYs9LYMn0lkXqgPYoNMD0=" # OpenAI openai_api_base: str = "https://api.openai.com/v1" openai_api_key: str = "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" openai_api_version: str = "2023-08-01-preview" azure_openai_deployment_name: str = "" # Helicone helicone_api_base: str = "https://oai.hconeai.com/v1" helicone_api_key: Optional[str] = None replicate_api_key: Optional[str] = None serp_api_key: Optional[str] = None # Frontend URL for CORS frontend_url: str = "https://allinix.ai" allowed_origins_regex: Optional[str] = None # Variables for the database db_host: str = "65.19.178.35" db_port: int = 3307 db_user: str = "reworkd_platform" db_pass: str = "reworkd_platform" db_base: str = "default" db_echo: bool = False db_ca_path: Optional[str] = None # Variables for Pinecone DB pinecone_api_key: Optional[str] = None pinecone_index_name: Optional[str] = None pinecone_environment: Optional[str] = None # Sentry's configuration. sentry_dsn: Optional[str] = None sentry_sample_rate: float = 1.0 kafka_bootstrap_servers: Union[str, List[str]] = [] kafka_username: Optional[str] = None kafka_password: Optional[str] = None kafka_ssal_mechanism: SASL_MECHANISM = "PLAIN" # Websocket settings pusher_app_id: Optional[str] = None pusher_key: Optional[str] = None pusher_secret: Optional[str] = None pusher_cluster: Optional[str] = None # Application Settings ff_mock_mode_enabled: bool = False # Controls whether calls are mocked max_loops: int = 25 # Maximum number of loops to run # Settings for sid sid_client_id: Optional[str] = None sid_client_secret: Optional[str] = None sid_redirect_uri: Optional[str] = None @property def kafka_consumer_group(self) -> str: """ Kafka consumer group will be the name of the host in development mode, making it easier to share a dev cluster. """ if self.environment == "development": return platform.node() return "platform" @property def db_url(self) -> URL: return URL.build( scheme="mysql+aiomysql", host=self.db_host, port=self.db_port, user=self.db_user, password=self.db_pass, path=f"/{self.db_base}", ) @property def pusher_enabled(self) -> bool: return all( [ self.pusher_app_id, self.pusher_key, self.pusher_secret, self.pusher_cluster, ] ) @property def kafka_enabled(self) -> bool: return all( [ self.kafka_bootstrap_servers, self.kafka_username, self.kafka_password, ] ) @property def helicone_enabled(self) -> bool: return all( [ self.helicone_api_base, self.helicone_api_key, ] ) @property def sid_enabled(self) -> bool: return all( [ self.sid_client_id, self.sid_client_secret, self.sid_redirect_uri, ] ) class Config: env_file = ".env" env_prefix = ENV_PREFIX env_file_encoding = "utf-8" settings = Settings()