File size: 4,666 Bytes
461adca 0c2542b 461adca | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | """
Pydantic models for application configuration.
"""
from typing import List, Dict, Optional, Any
from pathlib import Path
from pydantic import BaseModel, Field, validator
from enum import Enum
class AppConfig(BaseModel):
"""General application settings."""
name: str
version: str
debug: bool
environment: str
debug_prompts: bool = False
class AWSConfig(BaseModel):
"""AWS S3 configuration."""
bucket_name: str
region: str
prefix_retriever: str
local_dir: str
@validator('local_dir')
def validate_local_dir(cls, v):
"""Ensure local_dir is a valid path string."""
return str(Path(v))
class LlamaIndexConfig(BaseModel):
"""LlamaIndex settings."""
context_window: int
chunk_size: int
similarity_top_k: int
embed_model: str
@validator('context_window', 'chunk_size', 'similarity_top_k')
def validate_positive(cls, v):
"""Ensure values are positive."""
if v <= 0:
raise ValueError("Value must be positive")
return v
class MaxTokensConfig(BaseModel):
"""Max tokens configuration for different providers."""
openai: int = 8192
anthropic: int = 8192
gemini: int = 8192
deepseek: int = 8192
class GenerationConfig(BaseModel):
"""Generation settings."""
max_tokens: MaxTokensConfig
max_tokens_analysis: int = 2000
temperature: float = 0.0
@validator('max_tokens_analysis')
def validate_max_tokens_analysis(cls, v):
"""Ensure max_tokens_analysis is positive."""
if v <= 0:
raise ValueError("max_tokens_analysis must be positive")
return v
class ModelInfo(BaseModel):
"""Information about a specific model."""
name: str
display_name: str
default: bool = False
class ModelProviderConfig(BaseModel):
"""Configuration for a model provider."""
openai: List[ModelInfo] = []
anthropic: List[ModelInfo] = []
gemini: List[ModelInfo] = []
deepseek: List[ModelInfo] = []
class ModelsConfig(BaseModel):
"""Models configuration."""
default_provider: str
providers: List[str]
generation: ModelProviderConfig
analysis: ModelProviderConfig
class SchemaProperty(BaseModel):
"""JSON schema property definition."""
type: str
description: Optional[str] = None
class LegalPositionSchema(BaseModel):
"""Legal position schema configuration."""
type: str
required_fields: List[str]
schema_definition: Dict[str, Any] = Field(alias="schema")
class Config:
populate_by_name = True
class SchemasConfig(BaseModel):
"""Schemas configuration."""
legal_position: LegalPositionSchema
class SessionConfig(BaseModel):
"""Session management configuration."""
timeout_minutes: int
cleanup_interval_minutes: int
max_sessions: int
storage_type: str
@validator('storage_type')
def validate_storage_type(cls, v):
"""Validate storage type."""
allowed = ["memory", "redis"]
if v not in allowed:
raise ValueError(f"storage_type must be one of {allowed}")
return v
class RedisConfig(BaseModel):
"""Redis configuration."""
host: str
port: int
db: int
password: Optional[str] = None
ssl: bool
class LoggingConfig(BaseModel):
"""Logging configuration."""
level: str
format: str
file: Optional[str]
max_bytes: int
backup_count: int
console: bool
@validator('level')
def validate_level(cls, v):
"""Validate logging level."""
allowed = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
v_upper = v.upper()
if v_upper not in allowed:
raise ValueError(f"level must be one of {allowed}")
return v_upper
class ThemeConfig(BaseModel):
"""Gradio theme configuration."""
base: str = "Soft"
primary_hue: str = "blue"
secondary_hue: str = "indigo"
class GradioConfig(BaseModel):
"""Gradio interface configuration."""
server_name: str
server_port: int
share: bool
show_error: bool
ssr_mode: bool = True
theme: ThemeConfig = ThemeConfig()
css: Optional[str] = None
class Settings(BaseModel):
"""Main application settings."""
app: AppConfig
aws: AWSConfig
llama_index: LlamaIndexConfig
generation: GenerationConfig
models: ModelsConfig
schemas: SchemasConfig
required_files: List[str]
session: SessionConfig
redis: RedisConfig
logging: LoggingConfig
gradio: GradioConfig
class Config:
"""Pydantic configuration."""
validate_assignment = True
arbitrary_types_allowed = True
|