"""Application configuration loaded from environment variables.""" from __future__ import annotations from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): """Typed settings using environment variables and .env files.""" model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8") azure_speech_key: str = Field(alias="AZURE_SPEECH_KEY") azure_speech_region: str = Field(alias="AZURE_SPEECH_REGION") azure_speech_stt_language: str = Field( default="en-US", alias="AZURE_SPEECH_STT_LANGUAGE" ) azure_speech_auto_languages: str = Field( default="", alias="AZURE_SPEECH_AUTO_LANGUAGES" ) azure_speech_tts_voice: str = Field( default="en-US-JennyNeural", alias="AZURE_SPEECH_TTS_VOICE" ) azure_speech_tts_voice_map: str = Field( default="", alias="AZURE_SPEECH_TTS_VOICE_MAP" ) llm_provider: str = Field(default="foundry_agent", alias="LLM_PROVIDER") azure_openai_endpoint: str = Field(default="", alias="AZURE_OPENAI_ENDPOINT") azure_openai_api_key: str = Field(default="", alias="AZURE_OPENAI_API_KEY") azure_openai_deployment: str = Field(default="", alias="AZURE_OPENAI_DEPLOYMENT") azure_openai_embeddings_deployment: str = Field( default="", alias="AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT" ) azure_openai_embeddings_api_key: str = Field( default="", alias="AZURE_OPENAI_EMBEDDINGS_API_KEY" ) azure_openai_api_version: str = Field( default="2024-02-15-preview", alias="AZURE_OPENAI_API_VERSION" ) azure_openai_embeddings_endpoint: str = Field( default="", alias="AZURE_OPENAI_EMBEDDINGS_ENDPOINT" ) azure_openai_embeddings_api_version: str = Field( default="2024-02-15-preview", alias="AZURE_OPENAI_EMBEDDINGS_API_VERSION" ) foundry_project_conn_str: str = Field(alias="FOUNDRY_PROJECT_CONN_STR") foundry_agent_id: str = Field(alias="FOUNDRY_AGENT_ID") azure_tenant_id: str | None = Field(default=None, alias="AZURE_TENANT_ID") azure_client_id: str | None = Field(default=None, alias="AZURE_CLIENT_ID") azure_client_secret: str | None = Field(default=None, alias="AZURE_CLIENT_SECRET") app_env: str = Field(default="dev", alias="APP_ENV") log_level: str = Field(default="INFO", alias="LOG_LEVEL") max_reply_chars: int = Field(default=600, alias="MAX_REPLY_CHARS") data_dir: str = Field(default="data", alias="DATA_DIR") vector_store_dir: str = Field(default="data/vector_store", alias="VECTOR_STORE_DIR") rag_top_k: int = Field(default=4, alias="RAG_TOP_K") rag_chunk_size: int = Field(default=800, alias="RAG_CHUNK_SIZE") rag_chunk_overlap: int = Field(default=120, alias="RAG_CHUNK_OVERLAP") memory_top_k: int = Field(default=3, alias="MEMORY_TOP_K") memory_summary_every: int = Field(default=6, alias="MEMORY_SUMMARY_EVERY") speech_agent_http_url: str = Field( default="http://localhost:8000", alias="SPEECH_AGENT_HTTP_URL" ) logic_app_weather_trigger_url: str = Field( default="", alias="LOGIC_APP_WEATHER_TRIGGER_URL" ) _settings: Settings | None = None def get_settings() -> Settings: """Get cached settings instance.""" global _settings if _settings is None: _settings = Settings() return _settings