# Module: api_client ## Purpose HTTP client for the Azaion backend API. Handles authentication, file upload/download with encryption, and split-resource management (big/small model parts). ## Public Interface ### ApiCredentials | Field | Type | Description | |-------|------|-------------| | `url` | str | API base URL | | `email` | str | Login email | | `password` | str | Login password | ### ApiClient | Method | Signature | Returns | Description | |--------|-----------|---------|-------------| | `__init__` | `()` | — | Reads `config.yaml` for API creds, reads `cdn.yaml` via `load_bytes`, initializes CDNManager | | `login` | `()` | — | POST `/login` → stores JWT token | | `upload_file` | `(filename: str, file_bytes: bytearray, folder: str)` | — | Uploads file to API resource endpoint | | `load_bytes` | `(filename: str, folder: str) -> bytes` | Decrypted bytes | Downloads encrypted resource from API, decrypts with hardware-bound key | | `load_big_small_resource` | `(resource_name: str, folder: str, key: str) -> bytes` | Decrypted bytes | Reassembles a split resource: big part from local disk + small part from API, decrypts combined | | `upload_big_small_resource` | `(resource: bytes, resource_name: str, folder: str, key: str)` | — | Encrypts resource, splits into big (CDN) + small (API), uploads both | ## Internal Logic - **Authentication**: JWT-based. Auto-login on first request, re-login on 401/403. - **load_bytes**: Sends hardware fingerprint in request payload. Server returns encrypted bytes. Client decrypts using key derived from credentials + hardware hash. - **Split resource pattern**: Large files (models) are split into two parts: - `*.small` — first N bytes (min of `SMALL_SIZE_KB * 1024` or 20% of encrypted size) — stored on API server - `*.big` — remainder — stored on CDN (S3) - This split ensures the model cannot be reconstructed from either storage alone. - **CDN initialization**: On construction, `cdn.yaml` is loaded via `load_bytes` (from API, encrypted), then used to initialize `CDNManager`. ## Dependencies - `constants` — config file paths, size thresholds, model folder name - `cdn_manager` — CDNCredentials, CDNManager for S3 operations - `hardware_service` — `get_hardware_info()` for hardware fingerprint - `security` — encryption/decryption, key derivation - `requests` (external) — HTTP client - `yaml` (external) — config parsing - `io`, `json`, `os` (stdlib) ## Consumers exports, train, start_inference ## Data Models `ApiCredentials` — API connection credentials. ## Configuration - `config.yaml` — API URL, email, password - `cdn.yaml` — CDN credentials (loaded encrypted from API at init time) ## External Integrations - Azaion REST API (`POST /login`, `POST /resources/{folder}`, `POST /resources/get/{folder}`) - S3-compatible CDN via CDNManager ## Security - JWT token-based authentication with auto-refresh on 401/403 - Hardware-bound encryption for downloaded resources - Split model storage prevents single-point compromise - Credentials read from `config.yaml` (hardcoded in file — security concern) ## Tests None.