bots/sdlc-slackbot/sdlc_slackbot/config.py (35 lines of code) (raw):
import os
import typing as t
import toml
from dotenv import load_dotenv
from pydantic import BaseModel, ValidationError, field_validator, model_validator
from pydantic.functional_validators import AfterValidator, BeforeValidator
_CONFIG = None
def validate_channel(channel_id: str) -> str:
if not channel_id.startswith("C"):
raise ValueError("channel ID must start with 'C'")
return channel_id
class Config(BaseModel):
# OpenAI organization ID associated with OpenAI API key.
openai_organization_id: str
context_limit: int
# OpenAI prompts
base_prompt: str
initial_prompt: str
update_prompt: str
summary_prompt: str
reviewing_message: str
recoverable_error_message: str
irrecoverable_error_message: str
# Slack channel for notifications
notification_channel_id: t.Annotated[str, AfterValidator(validate_channel)]
def load_config(path: str):
load_dotenv()
with open(path) as f:
cfg = toml.loads(f.read())
config = Config(**cfg)
global _CONFIG
_CONFIG = config
return _CONFIG
def get_config() -> Config:
global _CONFIG
if _CONFIG is None:
raise Exception("config not initialized, call load_config() first")
return _CONFIG