2025-02-17 19:44:17 +05:30

179 lines
4.5 KiB
Python

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 = "<Should be updated via env if using azure>"
# 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()