01/software/source/core/models.py

118 lines
2.2 KiB
Python

"""
Application configuration models.
"""
from pydantic import BaseModel
from pydantic_settings import (
BaseSettings,
PydanticBaseSettingsSource,
SettingsConfigDict,
YamlConfigSettingsSource,
)
APP_PREFIX = "01_"
class Client(BaseModel):
"""
Client configuration model
"""
enabled: bool = False
url: None | str = None
platform: str = "auto"
class LLM(BaseModel):
"""
LLM configuration model
"""
service: str = "litellm"
model: str = "gpt-4"
vision_enabled: bool = False
functions_enabled: bool = False
context_window: int = 2048
max_tokens: int = 4096
temperature: float = 0.8
class Local(BaseModel):
"""
Local configuration model
"""
enabled: bool = False
tts_service: str = "piper"
stt_service: str = "local-whisper"
class Server(BaseModel):
"""
Server configuration model
"""
enabled: bool = False
host: str = "0.0.0.0"
port: int = 10001
class STT(BaseModel):
"""
Speech-to-text configuration model
"""
service: str = "openai"
class TTS(BaseModel):
"""
Text-to-speech configuration model
"""
service: str = "openai"
class Tunnel(BaseModel):
"""
Tunnel configuration model
"""
service: str = "ngrok"
exposed: bool = False
class Config(BaseSettings):
"""
Base configuration model
"""
client: Client = Client()
llm: LLM = LLM()
local: Local = Local()
server: Server = Server()
stt: STT = STT()
tts: TTS = TTS()
tunnel: Tunnel = Tunnel()
model_config = SettingsConfigDict(
env_prefix=APP_PREFIX,
env_file=".env",
env_file_encoding="utf-8",
yaml_file="config.yaml",
)
@classmethod
def settings_customise_sources(
cls,
settings_cls: type[BaseSettings],
init_settings: PydanticBaseSettingsSource,
env_settings: PydanticBaseSettingsSource,
dotenv_settings: PydanticBaseSettingsSource,
file_secret_settings: PydanticBaseSettingsSource,
) -> tuple[PydanticBaseSettingsSource, ...]:
"""
Modify the order of precedence for settings sources.
"""
return (YamlConfigSettingsSource(settings_cls),)