| # API Models Documentation | |
| This document describes the Pydantic models used throughout the YLFF API. All models are rigorously defined with comprehensive validation, documentation, and examples. | |
| ## Overview | |
| All API request/response models are defined in `ylff/api_models.py` with: | |
| - **Comprehensive field validation** (ranges, types, constraints) | |
| - **Detailed descriptions** for all fields | |
| - **Examples** for every field and model | |
| - **Type safety** with enums where appropriate | |
| - **Custom validators** for complex validation logic | |
| - **JSON schema generation** support | |
| ## Model Organization | |
| Models are organized into: | |
| - **Enums**: Type-safe enumerations for common values | |
| - **Request Models**: Input validation for API endpoints | |
| - **Response Models**: Structured response data | |
| ## Enums | |
| ### `JobStatus` | |
| Job execution status values: | |
| - `queued`: Job is queued for execution | |
| - `running`: Job is currently executing | |
| - `completed`: Job completed successfully | |
| - `failed`: Job failed | |
| - `cancelled`: Job was cancelled | |
| ### `DeviceType` | |
| Device type for model inference/training: | |
| - `cpu`: CPU execution | |
| - `cuda`: CUDA GPU execution | |
| - `mps`: Apple Metal Performance Shaders | |
| ### `UseCase` | |
| Use case for model selection: | |
| - `ba_validation`: Bundle Adjustment validation | |
| - `mono_depth`: Monocular depth estimation | |
| - `multi_view`: Multi-view depth estimation | |
| - `pose_conditioned`: Pose-conditioned depth | |
| - `training`: Training use case | |
| - `inference`: General inference | |
| ## Request Models | |
| ### `ValidateSequenceRequest` | |
| Request model for sequence validation endpoint. | |
| **Fields:** | |
| - `sequence_dir` (str, required): Directory containing image sequence | |
| - `model_name` (str, optional): DA3 model name (default: auto-select) | |
| - `use_case` (UseCase): Use case for model selection (default: `ba_validation`) | |
| - `accept_threshold` (float): Accept threshold in degrees (default: 2.0, range: 0-180) | |
| - `reject_threshold` (float): Reject threshold in degrees (default: 30.0, range: 0-180) | |
| - `output` (str, optional): Output JSON path for results | |
| **Validation:** | |
| - `reject_threshold` must be greater than `accept_threshold` | |
| - `sequence_dir` cannot be empty | |
| **Example:** | |
| ```json | |
| { | |
| "sequence_dir": "data/sequences/sequence_001", | |
| "model_name": "depth-anything/DA3-LARGE", | |
| "use_case": "ba_validation", | |
| "accept_threshold": 2.0, | |
| "reject_threshold": 30.0, | |
| "output": "data/results/validation.json" | |
| } | |
| ``` | |
| ### `ValidateARKitRequest` | |
| Request model for ARKit validation endpoint. | |
| **Fields:** | |
| - `arkit_dir` (str, required): Directory containing ARKit video and JSON metadata | |
| - `output_dir` (str): Output directory (default: `"data/arkit_validation"`) | |
| - `model_name` (str, optional): DA3 model name | |
| - `max_frames` (int, optional): Maximum frames to process (≥1) | |
| - `frame_interval` (int): Extract every Nth frame (default: 1, ≥1) | |
| - `device` (DeviceType): Device for DA3 inference (default: `cpu`) | |
| - `gui` (bool): Show real-time GUI visualization (default: `False`) | |
| **Validation:** | |
| - `arkit_dir` cannot be empty | |
| ### `BuildDatasetRequest` | |
| Request model for building training dataset. | |
| **Fields:** | |
| - `sequences_dir` (str, required): Directory containing sequence directories | |
| - `output_dir` (str): Output directory (default: `"data/training"`) | |
| - `model_name` (str, optional): DA3 model name for validation | |
| - `max_samples` (int, optional): Maximum training samples (≥1) | |
| - `accept_threshold` (float): Accept threshold in degrees (default: 2.0) | |
| - `reject_threshold` (float): Reject threshold in degrees (default: 30.0) | |
| - `use_wandb` (bool): Enable W&B logging (default: `True`) | |
| - `wandb_project` (str): W&B project name (default: `"ylff"`) | |
| - `wandb_name` (str, optional): W&B run name | |
| **Validation:** | |
| - `reject_threshold` must be greater than `accept_threshold` | |
| ### `TrainRequest` | |
| Request model for model fine-tuning. | |
| **Fields:** | |
| - `training_data_dir` (str, required): Directory containing training samples | |
| - `model_name` (str, optional): DA3 model name to fine-tune | |
| - `epochs` (int): Number of epochs (default: 10, range: 1-1000) | |
| - `lr` (float): Learning rate (default: 1e-5, >0) | |
| - `batch_size` (int): Batch size (default: 1, ≥1) | |
| - `checkpoint_dir` (str): Checkpoint directory (default: `"checkpoints"`) | |
| - `device` (DeviceType): Device for training (default: `cuda`) | |
| - `use_wandb` (bool): Enable W&B logging (default: `True`) | |
| - `wandb_project` (str): W&B project name (default: `"ylff"`) | |
| - `wandb_name` (str, optional): W&B run name | |
| ### `PretrainRequest` | |
| Request model for model pre-training on ARKit sequences. | |
| **Fields:** | |
| - `arkit_sequences_dir` (str, required): Directory containing ARKit sequence directories | |
| - `model_name` (str, optional): DA3 model name to pre-train | |
| - `epochs` (int): Number of epochs (default: 10, range: 1-1000) | |
| - `lr` (float): Learning rate (default: 1e-4, >0) | |
| - `batch_size` (int): Batch size (default: 1, ≥1) | |
| - `checkpoint_dir` (str): Checkpoint directory (default: `"checkpoints/pretrain"`) | |
| - `device` (DeviceType): Device for training (default: `cuda`) | |
| - `max_sequences` (int, optional): Maximum sequences to process (≥1) | |
| - `max_frames_per_sequence` (int, optional): Maximum frames per sequence (≥1) | |
| - `frame_interval` (int): Extract every Nth frame (default: 1, ≥1) | |
| - `use_lidar` (bool): Use ARKit LiDAR depth as supervision (default: `False`) | |
| - `use_ba_depth` (bool): Use BA depth maps as supervision (default: `False`) | |
| - `min_ba_quality` (float): Minimum BA quality threshold (default: 0.0, range: 0.0-1.0) | |
| - `use_wandb` (bool): Enable W&B logging (default: `True`) | |
| - `wandb_project` (str): W&B project name (default: `"ylff"`) | |
| - `wandb_name` (str, optional): W&B run name | |
| ### `EvaluateBAAgreementRequest` | |
| Request model for BA agreement evaluation. | |
| **Fields:** | |
| - `test_data_dir` (str, required): Directory containing test sequences | |
| - `model_name` (str): DA3 model name (default: `"depth-anything/DA3-LARGE"`) | |
| - `checkpoint` (str, optional): Path to model checkpoint | |
| - `threshold` (float): Agreement threshold in degrees (default: 2.0, range: 0-180) | |
| - `device` (DeviceType): Device for inference (default: `cuda`) | |
| - `use_wandb` (bool): Enable W&B logging (default: `True`) | |
| - `wandb_project` (str): W&B project name (default: `"ylff"`) | |
| - `wandb_name` (str, optional): W&B run name | |
| ### `VisualizeRequest` | |
| Request model for result visualization. | |
| **Fields:** | |
| - `results_dir` (str, required): Directory containing validation results | |
| - `output_dir` (str, optional): Output directory for visualizations | |
| - `use_plotly` (bool): Use Plotly for interactive plots (default: `True`) | |
| ## Response Models | |
| ### `JobResponse` | |
| Standard response for job-based endpoints. | |
| **Fields:** | |
| - `job_id` (str, required): Unique job identifier | |
| - `status` (JobStatus, required): Current job status | |
| - `message` (str, optional): Status message or error description | |
| - `result` (dict, optional): Job result data (only when completed/failed) | |
| ### `ValidationStats` | |
| Statistics from BA validation. | |
| **Fields:** | |
| - `total_frames` (int): Total frames processed (≥0) | |
| - `accepted` (int): Accepted frames count (≥0) | |
| - `rejected_learnable` (int): Rejected-learnable frames count (≥0) | |
| - `rejected_outlier` (int): Rejected-outlier frames count (≥0) | |
| - `accepted_percentage` (float): Percentage accepted (0-100) | |
| - `rejected_learnable_percentage` (float): Percentage rejected-learnable (0-100) | |
| - `rejected_outlier_percentage` (float): Percentage rejected-outlier (0-100) | |
| - `ba_status` (str, optional): BA validation status | |
| - `max_error_deg` (float, optional): Maximum rotation error in degrees (≥0) | |
| ### `HealthResponse` | |
| Health check response. | |
| **Fields:** | |
| - `status` (str): Health status (`"healthy"`, `"degraded"`, `"unhealthy"`) | |
| - `timestamp` (float): Unix timestamp | |
| - `request_id` (str): Request ID | |
| - `profiling` (dict, optional): Profiling status if available | |
| ### `ModelsResponse` | |
| Response for models list endpoint. | |
| **Fields:** | |
| - `models` (dict): Dictionary of available models with metadata | |
| - `recommended` (str, optional): Recommended model for requested use case | |
| ### `ErrorResponse` | |
| Standard error response. | |
| **Fields:** | |
| - `error` (str): Error type/name | |
| - `message` (str): Human-readable error message | |
| - `request_id` (str): Request ID for log correlation | |
| - `details` (dict, optional): Additional error details | |
| - `endpoint` (str, optional): Endpoint where error occurred | |
| ## Validation Features | |
| ### Field Validators | |
| 1. **Range Validation**: Numeric fields have `ge` (≥), `le` (≤), `gt` (>), `lt` (<) constraints | |
| 2. **String Validation**: String fields have `min_length` constraints | |
| 3. **Custom Validators**: | |
| - `reject_threshold > accept_threshold` validation | |
| - Path format validation | |
| - Non-empty string validation | |
| ### Type Safety | |
| - Enums for status values, device types, and use cases | |
| - Optional fields clearly marked with `Optional[Type]` | |
| - Required fields use `...` in Field definition | |
| ### Examples | |
| All models include `model_config` with JSON schema examples for: | |
| - API documentation generation | |
| - Client SDK generation | |
| - Testing and validation | |
| ## Usage | |
| ### In API Endpoints | |
| ```python | |
| from .api_models import ValidateSequenceRequest, JobResponse | |
| @app.post("/api/v1/validate/sequence", response_model=JobResponse) | |
| async def validate_sequence(request: ValidateSequenceRequest): | |
| # request is automatically validated | |
| # Invalid requests return 422 with detailed error messages | |
| ... | |
| ``` | |
| ### Model Validation | |
| Pydantic automatically validates: | |
| - Type checking | |
| - Range constraints | |
| - Custom validators | |
| - Required fields | |
| - Enum values | |
| ### Error Handling | |
| Validation errors are automatically handled by FastAPI and return: | |
| ```json | |
| { | |
| "error": "ValidationError", | |
| "message": "Invalid request data", | |
| "details": [ | |
| { | |
| "field": "reject_threshold", | |
| "error": "reject_threshold (20.0) must be greater than accept_threshold (30.0)" | |
| } | |
| ], | |
| "request_id": "..." | |
| } | |
| ``` | |
| ## Benefits | |
| 1. **Type Safety**: Catch errors at request time, not runtime | |
| 2. **Documentation**: Auto-generated API docs with examples | |
| 3. **Validation**: Comprehensive input validation before processing | |
| 4. **Consistency**: Standardized request/response formats | |
| 5. **Maintainability**: Centralized model definitions | |
| 6. **Developer Experience**: Clear error messages and examples | |