Add core configuration and base models
Implement global application configuration and custom Pydantic models following FastAPI best practices. Core Configuration (src/core/config.py): - BaseSettings with environment variable support - Split configuration by domain (following best practices) - Ollama connection settings (host, model, timeouts) - API configuration (host, port, prefix) - CORS settings - 20-second streaming timeout per turn - Cached configuration with @lru_cache Custom Base Models (src/core/models.py): - CustomBaseModel for consistent serialization - ISO datetime formatting - Alias population support - Enum value serialization - Validation on assignment - serializable_dict() for logging/debugging Exception Handling (src/core/exceptions.py): - Base AppException with status codes - OllamaConnectionError (503) - OllamaTimeoutError (504) - ModelNotFoundError (404) - ValidationError (422) - OpenAI-compatible error structure Benefits: - Consistent configuration across domains - Type-safe settings with validation - Easy environment override via .env - Predictable error responses - Better debugging with serializable models 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
"""
|
||||
Custom Pydantic base models for consistent serialization.
|
||||
Following best practice of having a global base model.
|
||||
"""
|
||||
from datetime import datetime
|
||||
from typing import Any
|
||||
|
||||
from fastapi.encoders import jsonable_encoder
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
|
||||
|
||||
def datetime_to_iso_str(dt: datetime) -> str:
|
||||
"""Convert datetime to ISO format string."""
|
||||
return dt.isoformat()
|
||||
|
||||
|
||||
class CustomBaseModel(BaseModel):
|
||||
"""
|
||||
Custom base model with consistent configuration.
|
||||
|
||||
All domain models should inherit from this for:
|
||||
- Consistent JSON serialization
|
||||
- Timezone-aware datetime handling
|
||||
- Alias population support
|
||||
"""
|
||||
model_config = ConfigDict(
|
||||
json_encoders={datetime: datetime_to_iso_str},
|
||||
populate_by_name=True,
|
||||
use_enum_values=True,
|
||||
validate_assignment=True,
|
||||
arbitrary_types_allowed=True,
|
||||
)
|
||||
|
||||
def serializable_dict(self, **kwargs: Any) -> dict[str, Any]:
|
||||
"""
|
||||
Return dict with only JSON-serializable fields.
|
||||
|
||||
Useful for logging and debugging.
|
||||
"""
|
||||
return jsonable_encoder(
|
||||
self.model_dump(**kwargs),
|
||||
custom_encoder={datetime: datetime_to_iso_str}
|
||||
)
|
||||
Reference in New Issue
Block a user