122 lines
4.6 KiB
Python
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()
|