Files
arbiter/src/arbiter/config.py

122 lines
4.6 KiB
Python

"""Configuration settings for Arbiter."""
from functools import lru_cache
from pathlib import Path
from pydantic import Field, SecretStr
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
"""Application settings loaded from environment variables."""
model_config = SettingsConfigDict(
env_prefix="ARBITER_",
env_file=".env",
env_file_encoding="utf-8",
extra="ignore",
)
# LLM settings
default_model: str = Field(default="gpt-4o", description="Default LLM model for agents")
llm_timeout: int = Field(default=60, description="LLM request timeout in seconds")
llm_max_retries: int = Field(default=3, description="Maximum LLM retry attempts")
# Cost controls
max_tokens_per_review: int = Field(
default=50000, description="Maximum tokens allowed per review"
)
max_cost_per_review_usd: float = Field(
default=0.50, description="Maximum cost per review in USD"
)
cache_ttl_hours: int = Field(default=24, description="Cache TTL in hours")
# Paths
templates_dir: Path = Field(
default=Path("templates"), description="Directory containing prompt templates"
)
policy_path: Path | None = Field(default=None, description="Default policy file path")
# Output settings
output_format: str = Field(default="rich", description="Output format: rich, json, or markdown")
# Database settings
database_url: str = Field(
default="postgresql+asyncpg://arbiter:arbiter@localhost:5432/arbiter",
description="PostgreSQL connection URL",
)
database_pool_size: int = Field(default=5, description="Database connection pool size")
database_max_overflow: int = Field(default=10, description="Max overflow connections")
# Redis settings
redis_url: str = Field(
default="redis://localhost:6379/0",
description="Redis connection URL",
)
redis_max_connections: int = Field(default=10, description="Redis max connections")
# Webhook secrets
github_webhook_secret: SecretStr | None = Field(
default=None, description="GitHub webhook secret for HMAC verification"
)
gitlab_webhook_token: SecretStr | None = Field(
default=None, description="GitLab webhook token for verification"
)
# Platform integration settings
github_token: SecretStr | None = Field(
default=None, description="GitHub API token for fetching diffs and posting comments"
)
github_base_url: str = Field(
default="https://api.github.com", description="GitHub API base URL"
)
gitlab_token: SecretStr | None = Field(
default=None, description="GitLab API token for fetching diffs and posting comments"
)
gitlab_base_url: str = Field(
default="https://gitlab.com", description="GitLab instance base URL"
)
integration_timeout: int = Field(
default=30, description="Integration API request timeout in seconds"
)
integration_max_retries: int = Field(
default=3, description="Maximum retry attempts for integration API calls"
)
status_check_context: str = Field(
default="arbiter", description="Context name for commit status checks"
)
post_comments: bool = Field(default=True, description="Whether to post review comments on PRs")
update_status: bool = Field(default=True, description="Whether to update commit status checks")
# API settings
api_title: str = Field(default="Arbiter API", description="API title for OpenAPI")
api_version: str = Field(default="0.5.0", description="API version")
cors_origins: list[str] = Field(
default=["http://localhost:3000"], description="Allowed CORS origins"
)
api_rate_limit_per_minute: int = Field(
default=60, description="API rate limit per minute per client"
)
# Worker settings
worker_max_jobs: int = Field(default=10, description="Max concurrent worker jobs")
worker_job_timeout: int = Field(default=300, description="Job timeout in seconds")
worker_retry_attempts: int = Field(default=3, description="Number of retry attempts")
# Follow-up conversation settings
followup_enabled: bool = Field(default=True, description="Enable follow-up question handling")
followup_confidence_threshold: float = Field(
default=0.5,
ge=0.0,
le=1.0,
description="Minimum confidence to process a follow-up question",
)
followup_max_tokens_per_response: int = Field(
default=2000, description="Maximum tokens per follow-up response"
)
@lru_cache
def get_settings() -> Settings:
return Settings()