Files
email-classifier/app/config.py
Steve W 7c9d851a9a
All checks were successful
Build and Publish Docker Image / build-and-push (push) Successful in 5m3s
Add configurable LLM provider adapters for email classification
2026-04-09 17:36:46 +00:00

47 lines
1.5 KiB
Python

from __future__ import annotations
import os
from functools import lru_cache
from typing import Literal
from pydantic import BaseModel, Field
Provider = Literal["openai", "anthropic"]
class LLMSettings(BaseModel):
provider: Provider = Field(default=os.getenv("LLM_PROVIDER", "openai"))
api_key: str = Field(default=os.getenv("LLM_API_KEY", "none"))
model: str = Field(default=os.getenv("LLM_MODEL", "qwen2.5-7b-instruct.q4_k_m"))
base_url: str = Field(default=os.getenv("LLM_BASE_URL", "http://ollama.internal.henryhosted.com:9292/v1"))
temperature: float = Field(default=float(os.getenv("LLM_TEMPERATURE", "0.1")))
timeout_seconds: float = Field(default=float(os.getenv("LLM_TIMEOUT_SECONDS", "60")))
max_retries: int = Field(default=int(os.getenv("LLM_MAX_RETRIES", "3")))
@lru_cache(maxsize=1)
def get_settings() -> LLMSettings:
return LLMSettings()
def get_request_settings(
provider: str | None = None,
model: str | None = None,
base_url: str | None = None,
api_key: str | None = None,
temperature: float | None = None,
) -> LLMSettings:
base = get_settings()
data = base.model_dump()
if provider is not None:
data["provider"] = provider
if model is not None:
data["model"] = model
if base_url is not None:
data["base_url"] = base_url
if api_key is not None:
data["api_key"] = api_key
if temperature is not None:
data["temperature"] = temperature
return LLMSettings(**data)