| # 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 |
|
|