Files

1 line
22 KiB
JSON

{"repo": "aasemelshahat/truthlens", "files": {"apps/agent/utils/settings.py": {"30ee940769f296e24460ff44a00714fbe041b58a": {"t": 1785746921.489056, "n": 3392, "h": "65a23eb765ffb0e1", "c": "from typing import Annotated\nfrom uuid import UUID\n\nfrom pydantic import AfterValidator, Field, RedisDsn\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n\ndef _validate_openai_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the OpenAI API key starts with 'sk-proj-'.\"\"\"\n if v and not v.startswith(\"sk-proj-\"):\n raise ValueError(\"OpenAI API key must start with 'sk-proj-'\")\n return v\n\n\ndef _validate_exa_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Exa API key is a valid UUID4.\"\"\"\n if v:\n try:\n UUID(v, version=4)\n except ValueError:\n raise ValueError(\"Exa API key must be a valid UUID4\") from None\n return v\n\n\ndef _validate_tavily_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Tavily API key starts with 'tvly-'.\"\"\"\n if v and not v.startswith(\"tvly-\"):\n raise ValueError(\"Tavily API key must start with 'tvly-'\")\n return v\n\n\ndef _validate_brave_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Brave API key is a non-empty string.\"\"\"\n if v and len(v.strip()) == 0:\n raise ValueError(\"Brave API key cannot be empty\")\n return v\n\n\ndef _validate_google_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Google API key starts with 'AIza'.\"\"\"\n if v and not v.startswith(\"AIza\"):\n raise ValueError(\"Google API key must start with 'AIza'\")\n return v\n\n\ndef _validate_deepseek_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the DeepSeek API key is a non-empty string.\"\"\"\n if v and len(v.strip()) == 0:\n raise ValueError(\"DeepSeek API key cannot be empty\")\n return v\n\n\ndef _validate_llm_provider(v: str | None) -> str | None:\n \"\"\"Validate that the LLM provider is supported.\"\"\"\n if v and v not in [\"openai\", \"gemini\", \"deepseek\"]:\n raise ValueError(\"LLM provider must be 'openai', 'gemini', or 'deepseek'\")\n return v\n\n\nOpenAIAPIKey = Annotated[str | None, AfterValidator(_validate_openai_api_key)]\nExaAPIKey = Annotated[str | None, AfterValidator(_validate_exa_api_key)]\nTavilyAPIKey = Annotated[str | None, AfterValidator(_validate_tavily_api_key)]\nBraveAPIKey = Annotated[str | None, AfterValidator(_validate_brave_api_key)]\nGoogleAPIKey = Annotated[str | None, AfterValidator(_validate_google_api_key)]\nDeepSeekAPIKey = Annotated[str | None, AfterValidator(_validate_deepseek_api_key)]\nLLMProviderType = Annotated[str, AfterValidator(_validate_llm_provider)]\n\n\nclass Settings(BaseSettings):\n \"\"\"Manages application settings and environment variables.\"\"\"\n\n llm_provider: LLMProviderType = Field(default=\"openai\", alias=\"LLM_PROVIDER\")\n openai_api_key: OpenAIAPIKey = Field(default=None, alias=\"OPENAI_API_KEY\")\n google_api_key: GoogleAPIKey = Field(default=None, alias=\"GOOGLE_API_KEY\")\n deepseek_api_key: DeepSeekAPIKey = Field(default=None, alias=\"DEEPSEEK_API_KEY\")\n exa_api_key: ExaAPIKey = Field(default=None, alias=\"EXA_API_KEY\")\n tavily_api_key: TavilyAPIKey = Field(default=None, alias=\"TAVILY_API_KEY\")\n brave_api_key: BraveAPIKey = Field(default=None, alias=\"BRAVE_API_KEY\")\n redis_uri: RedisDsn = Field(default=\"redis://localhost:6379\", alias=\"REDIS_URL\")\n\n model_config = SettingsConfigDict(\n env_file=\".env\",\n env_file_encoding=\"utf-8\",\n extra=\"ignore\",\n case_sensitive=True,\n )\n\n\nsettings = Settings()\n"}, "c7c17088c9c7dd6c15c5e9cd9e2a0ac840a78ea0": {"t": 1785769034.2657897, "n": 3392, "h": "65a23eb765ffb0e1", "c": "from typing import Annotated\nfrom uuid import UUID\n\nfrom pydantic import AfterValidator, Field, RedisDsn\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n\ndef _validate_openai_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the OpenAI API key starts with 'sk-proj-'.\"\"\"\n if v and not v.startswith(\"sk-proj-\"):\n raise ValueError(\"OpenAI API key must start with 'sk-proj-'\")\n return v\n\n\ndef _validate_exa_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Exa API key is a valid UUID4.\"\"\"\n if v:\n try:\n UUID(v, version=4)\n except ValueError:\n raise ValueError(\"Exa API key must be a valid UUID4\") from None\n return v\n\n\ndef _validate_tavily_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Tavily API key starts with 'tvly-'.\"\"\"\n if v and not v.startswith(\"tvly-\"):\n raise ValueError(\"Tavily API key must start with 'tvly-'\")\n return v\n\n\ndef _validate_brave_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Brave API key is a non-empty string.\"\"\"\n if v and len(v.strip()) == 0:\n raise ValueError(\"Brave API key cannot be empty\")\n return v\n\n\ndef _validate_google_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Google API key starts with 'AIza'.\"\"\"\n if v and not v.startswith(\"AIza\"):\n raise ValueError(\"Google API key must start with 'AIza'\")\n return v\n\n\ndef _validate_deepseek_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the DeepSeek API key is a non-empty string.\"\"\"\n if v and len(v.strip()) == 0:\n raise ValueError(\"DeepSeek API key cannot be empty\")\n return v\n\n\ndef _validate_llm_provider(v: str | None) -> str | None:\n \"\"\"Validate that the LLM provider is supported.\"\"\"\n if v and v not in [\"openai\", \"gemini\", \"deepseek\"]:\n raise ValueError(\"LLM provider must be 'openai', 'gemini', or 'deepseek'\")\n return v\n\n\nOpenAIAPIKey = Annotated[str | None, AfterValidator(_validate_openai_api_key)]\nExaAPIKey = Annotated[str | None, AfterValidator(_validate_exa_api_key)]\nTavilyAPIKey = Annotated[str | None, AfterValidator(_validate_tavily_api_key)]\nBraveAPIKey = Annotated[str | None, AfterValidator(_validate_brave_api_key)]\nGoogleAPIKey = Annotated[str | None, AfterValidator(_validate_google_api_key)]\nDeepSeekAPIKey = Annotated[str | None, AfterValidator(_validate_deepseek_api_key)]\nLLMProviderType = Annotated[str, AfterValidator(_validate_llm_provider)]\n\n\nclass Settings(BaseSettings):\n \"\"\"Manages application settings and environment variables.\"\"\"\n\n llm_provider: LLMProviderType = Field(default=\"openai\", alias=\"LLM_PROVIDER\")\n openai_api_key: OpenAIAPIKey = Field(default=None, alias=\"OPENAI_API_KEY\")\n google_api_key: GoogleAPIKey = Field(default=None, alias=\"GOOGLE_API_KEY\")\n deepseek_api_key: DeepSeekAPIKey = Field(default=None, alias=\"DEEPSEEK_API_KEY\")\n exa_api_key: ExaAPIKey = Field(default=None, alias=\"EXA_API_KEY\")\n tavily_api_key: TavilyAPIKey = Field(default=None, alias=\"TAVILY_API_KEY\")\n brave_api_key: BraveAPIKey = Field(default=None, alias=\"BRAVE_API_KEY\")\n redis_uri: RedisDsn = Field(default=\"redis://localhost:6379\", alias=\"REDIS_URL\")\n\n model_config = SettingsConfigDict(\n env_file=\".env\",\n env_file_encoding=\"utf-8\",\n extra=\"ignore\",\n case_sensitive=True,\n )\n\n\nsettings = Settings()\n"}, "b58ff555767f4b0cd7471feaf30f4e485d88ff08": {"t": 1785769036.6031952, "n": 2960, "h": "7decf86887a5d47d", "c": "from typing import Annotated\nfrom uuid import UUID\n\nfrom pydantic import AfterValidator, Field, RedisDsn\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n\ndef _validate_openai_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the OpenAI API key starts with 'sk-proj-'.\"\"\"\n if v and not v.startswith(\"sk-proj-\"):\n raise ValueError(\"OpenAI API key must start with 'sk-proj-'\")\n return v\n\n\ndef _validate_exa_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Exa API key is a valid UUID4.\"\"\"\n if v:\n try:\n UUID(v, version=4)\n except ValueError:\n raise ValueError(\"Exa API key must be a valid UUID4\") from None\n return v\n\n\ndef _validate_tavily_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Tavily API key starts with 'tvly-'.\"\"\"\n if v and not v.startswith(\"tvly-\"):\n raise ValueError(\"Tavily API key must start with 'tvly-'\")\n return v\n\n\ndef _validate_brave_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Brave API key is a non-empty string.\"\"\"\n if v and len(v.strip()) == 0:\n raise ValueError(\"Brave API key cannot be empty\")\n return v\n\n\ndef _validate_google_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Google API key starts with 'AIza'.\"\"\"\n if v and not v.startswith(\"AIza\"):\n raise ValueError(\"Google API key must start with 'AIza'\")\n return v\n\n\ndef _validate_llm_provider(v: str | None) -> str | None:\n \"\"\"Validate that the LLM provider is supported.\"\"\"\n if v and v not in [\"openai\", \"gemini\"]:\n raise ValueError(\"LLM provider must be 'openai' or 'gemini'\")\n return v\n\n\nOpenAIAPIKey = Annotated[str | None, AfterValidator(_validate_openai_api_key)]\nExaAPIKey = Annotated[str | None, AfterValidator(_validate_exa_api_key)]\nTavilyAPIKey = Annotated[str | None, AfterValidator(_validate_tavily_api_key)]\nBraveAPIKey = Annotated[str | None, AfterValidator(_validate_brave_api_key)]\nGoogleAPIKey = Annotated[str | None, AfterValidator(_validate_google_api_key)]\nLLMProviderType = Annotated[str, AfterValidator(_validate_llm_provider)]\n\n\nclass Settings(BaseSettings):\n \"\"\"Manages application settings and environment variables.\"\"\"\n\n llm_provider: LLMProviderType = Field(default=\"openai\", alias=\"LLM_PROVIDER\")\n openai_api_key: OpenAIAPIKey = Field(default=None, alias=\"OPENAI_API_KEY\")\n google_api_key: GoogleAPIKey = Field(default=None, alias=\"GOOGLE_API_KEY\")\n exa_api_key: ExaAPIKey = Field(default=None, alias=\"EXA_API_KEY\")\n tavily_api_key: TavilyAPIKey = Field(default=None, alias=\"TAVILY_API_KEY\")\n brave_api_key: BraveAPIKey = Field(default=None, alias=\"BRAVE_API_KEY\")\n redis_uri: RedisDsn = Field(default=\"redis://localhost:6379\", alias=\"REDIS_URL\")\n\n model_config = SettingsConfigDict(\n env_file=\".env\",\n env_file_encoding=\"utf-8\",\n extra=\"ignore\",\n case_sensitive=True,\n )\n\n\nsettings = Settings()\n"}, "38637ff136de49d1f8023c236415601d47f3399e": {"t": 1785769040.6883495, "n": 2564, "h": "c8e1c62a4c0d0228", "c": "from typing import Annotated\nfrom uuid import UUID\n\nfrom pydantic import AfterValidator, Field, RedisDsn\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n\ndef _validate_openai_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the OpenAI API key starts with 'sk-proj-'.\"\"\"\n if v and not v.startswith(\"sk-proj-\"):\n raise ValueError(\"OpenAI API key must start with 'sk-proj-'\")\n return v\n\n\ndef _validate_exa_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Exa API key is a valid UUID4.\"\"\"\n if v:\n try:\n UUID(v, version=4)\n except ValueError:\n raise ValueError(\"Exa API key must be a valid UUID4\") from None\n return v\n\n\ndef _validate_tavily_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Tavily API key starts with 'tvly-'.\"\"\"\n if v and not v.startswith(\"tvly-\"):\n raise ValueError(\"Tavily API key must start with 'tvly-'\")\n return v\n\n\ndef _validate_brave_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Brave API key is a non-empty string.\"\"\"\n if v and len(v.strip()) == 0:\n raise ValueError(\"Brave API key cannot be empty\")\n return v\n\n\ndef _validate_google_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Google API key starts with 'AIza'.\"\"\"\n if v and not v.startswith(\"AIza\"):\n raise ValueError(\"Google API key must start with 'AIza'\")\n return v\n\n\nOpenAIAPIKey = Annotated[str | None, AfterValidator(_validate_openai_api_key)]\nExaAPIKey = Annotated[str | None, AfterValidator(_validate_exa_api_key)]\nTavilyAPIKey = Annotated[str | None, AfterValidator(_validate_tavily_api_key)]\nBraveAPIKey = Annotated[str | None, AfterValidator(_validate_brave_api_key)]\nGoogleAPIKey = Annotated[str | None, AfterValidator(_validate_google_api_key)]\n\n\nclass Settings(BaseSettings):\n \"\"\"Manages application settings and environment variables.\"\"\"\n\n openai_api_key: OpenAIAPIKey = Field(default=None, alias=\"OPENAI_API_KEY\")\n google_api_key: GoogleAPIKey = Field(default=None, alias=\"GOOGLE_API_KEY\")\n exa_api_key: ExaAPIKey = Field(default=None, alias=\"EXA_API_KEY\")\n tavily_api_key: TavilyAPIKey = Field(default=None, alias=\"TAVILY_API_KEY\")\n brave_api_key: BraveAPIKey = Field(default=None, alias=\"BRAVE_API_KEY\")\n redis_uri: RedisDsn = Field(default=\"redis://localhost:6379\", alias=\"REDIS_URL\")\n\n model_config = SettingsConfigDict(\n env_file=\".env\",\n env_file_encoding=\"utf-8\",\n extra=\"ignore\",\n case_sensitive=True,\n )\n\n\nsettings = Settings()\n"}, "e0afb5a74fc80d3ecec9fc80c93beb095c03af23": {"t": 1785769042.3596337, "n": 2164, "h": "498db20b3f8d00f1", "c": "from typing import Annotated\nfrom uuid import UUID\n\nfrom pydantic import AfterValidator, Field, RedisDsn\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n\ndef _validate_openai_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the OpenAI API key starts with 'sk-proj-'.\"\"\"\n if v and not v.startswith(\"sk-proj-\"):\n raise ValueError(\"OpenAI API key must start with 'sk-proj-'\")\n return v\n\n\ndef _validate_exa_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Exa API key is a valid UUID4.\"\"\"\n if v:\n try:\n UUID(v, version=4)\n except ValueError:\n raise ValueError(\"Exa API key must be a valid UUID4\") from None\n return v\n\n\ndef _validate_tavily_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Tavily API key starts with 'tvly-'.\"\"\"\n if v and not v.startswith(\"tvly-\"):\n raise ValueError(\"Tavily API key must start with 'tvly-'\")\n return v\n\n\ndef _validate_brave_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Brave API key is a non-empty string.\"\"\"\n if v and len(v.strip()) == 0:\n raise ValueError(\"Brave API key cannot be empty\")\n return v\n\n\nOpenAIAPIKey = Annotated[str | None, AfterValidator(_validate_openai_api_key)]\nExaAPIKey = Annotated[str | None, AfterValidator(_validate_exa_api_key)]\nTavilyAPIKey = Annotated[str | None, AfterValidator(_validate_tavily_api_key)]\nBraveAPIKey = Annotated[str | None, AfterValidator(_validate_brave_api_key)]\n\n\nclass Settings(BaseSettings):\n \"\"\"Manages application settings and environment variables.\"\"\"\n\n openai_api_key: OpenAIAPIKey = Field(default=None, alias=\"OPENAI_API_KEY\")\n exa_api_key: ExaAPIKey = Field(default=None, alias=\"EXA_API_KEY\")\n tavily_api_key: TavilyAPIKey = Field(default=None, alias=\"TAVILY_API_KEY\")\n brave_api_key: BraveAPIKey = Field(default=None, alias=\"BRAVE_API_KEY\")\n redis_uri: RedisDsn = Field(default=\"redis://localhost:6379\", alias=\"REDIS_URL\")\n\n model_config = SettingsConfigDict(\n env_file=\".env\",\n env_file_encoding=\"utf-8\",\n extra=\"ignore\",\n case_sensitive=True,\n )\n\n\nsettings = Settings()\n"}, "ccd543301a2bfa75c4ed1e37f2264d9a3954d148": {"t": 1785769044.2622452, "n": 1781, "h": "c606677ed2ed2576", "c": "from typing import Annotated\nfrom uuid import UUID\n\nfrom pydantic import AfterValidator, Field, RedisDsn\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n\ndef _validate_openai_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the OpenAI API key starts with 'sk-proj-'.\"\"\"\n if v and not v.startswith(\"sk-proj-\"):\n raise ValueError(\"OpenAI API key must start with 'sk-proj-'\")\n return v\n\n\ndef _validate_exa_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Exa API key is a valid UUID4.\"\"\"\n if v:\n try:\n UUID(v, version=4)\n except ValueError:\n raise ValueError(\"Exa API key must be a valid UUID4\") from None\n return v\n\n\ndef _validate_tavily_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Tavily API key starts with 'tvly-'.\"\"\"\n if v and not v.startswith(\"tvly-\"):\n raise ValueError(\"Tavily API key must start with 'tvly-'\")\n return v\n\n\nOpenAIAPIKey = Annotated[str | None, AfterValidator(_validate_openai_api_key)]\nExaAPIKey = Annotated[str | None, AfterValidator(_validate_exa_api_key)]\nTavilyAPIKey = Annotated[str | None, AfterValidator(_validate_tavily_api_key)]\n\n\nclass Settings(BaseSettings):\n \"\"\"Manages application settings and environment variables.\"\"\"\n\n openai_api_key: OpenAIAPIKey = Field(default=None, alias=\"OPENAI_API_KEY\")\n exa_api_key: ExaAPIKey = Field(default=None, alias=\"EXA_API_KEY\")\n tavily_api_key: TavilyAPIKey = Field(default=None, alias=\"TAVILY_API_KEY\")\n redis_uri: RedisDsn = Field(default=\"redis://localhost:6379\", alias=\"REDIS_URL\")\n\n model_config = SettingsConfigDict(\n env_file=\".env\",\n env_file_encoding=\"utf-8\",\n extra=\"ignore\",\n case_sensitive=True,\n )\n\n\nsettings = Settings()\n"}, "f046732897a1676f2236dd3dc341b263383bace2": {"t": 1785769046.0318975, "n": 1378, "h": "76d8b59cc0af0337", "c": "from typing import Annotated\nfrom uuid import UUID\n\nfrom pydantic import AfterValidator, Field, RedisDsn\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n\ndef _validate_openai_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the OpenAI API key starts with 'sk-proj-'.\"\"\"\n if v and not v.startswith(\"sk-proj-\"):\n raise ValueError(\"OpenAI API key must start with 'sk-proj-'\")\n return v\n\n\ndef _validate_exa_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Exa API key is a valid UUID4.\"\"\"\n if v:\n try:\n UUID(v, version=4)\n except ValueError:\n raise ValueError(\"Exa API key must be a valid UUID4\") from None\n return v\n\n\nOpenAIAPIKey = Annotated[str | None, AfterValidator(_validate_openai_api_key)]\nExaAPIKey = Annotated[str | None, AfterValidator(_validate_exa_api_key)]\n\n\nclass Settings(BaseSettings):\n \"\"\"Manages application settings and environment variables.\"\"\"\n\n openai_api_key: OpenAIAPIKey = Field(default=None, alias=\"OPENAI_API_KEY\")\n exa_api_key: ExaAPIKey = Field(default=None, alias=\"EXA_API_KEY\")\n redis_uri: RedisDsn = Field(default=\"redis://localhost:6379\", alias=\"REDIS_URL\")\n\n model_config = SettingsConfigDict(\n env_file=\".env\",\n env_file_encoding=\"utf-8\",\n extra=\"ignore\",\n case_sensitive=True,\n )\n\n\nsettings = Settings()\n"}, "0edf6e9979486e560eed8d0098f5caeb7bbd9fac": {"t": 1785769047.485674, "n": 1296, "h": "b75c026e0594559d", "c": "from typing import Annotated\nfrom uuid import UUID\n\nfrom pydantic import AfterValidator, Field, PostgresDsn\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n\ndef _validate_openai_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the OpenAI API key starts with 'sk-proj-'.\"\"\"\n if v and not v.startswith(\"sk-proj-\"):\n raise ValueError(\"OpenAI API key must start with 'sk-proj-'\")\n return v\n\n\ndef _validate_exa_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Exa API key is a valid UUID4.\"\"\"\n if v:\n try:\n UUID(v, version=4)\n except ValueError:\n raise ValueError(\"Exa API key must be a valid UUID4\") from None\n return v\n\n\nOpenAIAPIKey = Annotated[str | None, AfterValidator(_validate_openai_api_key)]\nExaAPIKey = Annotated[str | None, AfterValidator(_validate_exa_api_key)]\n\n\nclass Settings(BaseSettings):\n \"\"\"Manages application settings and environment variables.\"\"\"\n\n openai_api_key: OpenAIAPIKey = Field(default=None, alias=\"OPENAI_API_KEY\")\n exa_api_key: ExaAPIKey = Field(default=None, alias=\"EXA_API_KEY\")\n\n model_config = SettingsConfigDict(\n env_file=\".env\",\n env_file_encoding=\"utf-8\",\n extra=\"ignore\",\n case_sensitive=True,\n )\n\n\nsettings = Settings()\n"}, "c95d7514624301f93bdf2e8d696b67f124991960": {"t": 1785769048.9985583, "n": 1377, "h": "7e04d58d20764e72", "c": "from typing import Annotated\nfrom uuid import UUID\n\nfrom pydantic import AfterValidator, Field, PostgresDsn\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n\ndef _validate_openai_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the OpenAI API key starts with 'sk-proj-'.\"\"\"\n if v and not v.startswith(\"sk-proj-\"):\n raise ValueError(\"OpenAI API key must start with 'sk-proj-'\")\n return v\n\n\ndef _validate_exa_api_key(v: str | None) -> str | None:\n \"\"\"Validate that the Exa API key is a valid UUID4.\"\"\"\n if v:\n try:\n UUID(v, version=4)\n except ValueError:\n raise ValueError(\"Exa API key must be a valid UUID4\") from None\n return v\n\n\nOpenAIAPIKey = Annotated[str | None, AfterValidator(_validate_openai_api_key)]\nExaAPIKey = Annotated[str | None, AfterValidator(_validate_exa_api_key)]\n\n\nclass Settings(BaseSettings):\n \"\"\"Manages application settings and environment variables.\"\"\"\n\n openai_api_key: OpenAIAPIKey = Field(default=None, alias=\"OPENAI_API_KEY\")\n exa_api_key: ExaAPIKey = Field(default=None, alias=\"EXA_API_KEY\")\n database_url: PostgresDsn | None = Field(default=None, alias=\"DATABASE_URL\")\n\n model_config = SettingsConfigDict(\n env_file=\".env\",\n env_file_encoding=\"utf-8\",\n extra=\"ignore\",\n case_sensitive=True,\n )\n\n\nsettings = Settings()\n"}}}}