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