Implement a production-ready CLI tool that converts MS Office documents (Word, Excel, PowerPoint) to PDF using multiple cloud API providers with automatic failover, HTTP caching via hishel, and quota management.
**User-visible outcome:**
-`pdf-remote-converter convert document.docx output.pdf` → auto-selects configured provider (single key) or best available (multiple keys)
-`pdf-remote-converter convert --provider cloudconvert file.xlsx` → uses specific provider
- Automatic failover when provider hits quota/rate-limit (tries next configured provider)
- Automatic caching prevents redundant API calls for identical files
- Clear error messages when all providers fail or conversion errors
**Deliverable:** Adobe integration using official SDK patterns
**Files to create:**
```
src/pdf_remote_converter/providers/
└── adobe.py # Adobe PDF Services implementation
tests/
└── test_adobe.py # Mock-based tests
```
**Implementation notes:**
- Uses JWT/OAuth authentication
- Official Python SDK available: `adobe-pdfservices-python`
- Flow: authenticate → POST job → poll → download
**Dependencies to add:**
```toml
"pdfservices-sdk>=4.0.0",# Adobe PDF Services Python SDK
```
**Note:** Adobe SDK uses `ServicePrincipalCredentials` with `client_id` and `client_secret` (NOT `client_id` + `client_secret` as separate env vars, but passed as credentials object). See [Adobe SDK docs](https://github.com/adobe/pdfservices-python-sdk).
**Deliverable:** Zamzar integration with file size validation
**Files to create:**
```
src/pdf_remote_converter/providers/
└── zamzar.py # Zamzar implementation
tests/
└── test_zamzar.py # Mock-based tests
```
**Implementation notes:**
- Simple REST API with dedicated format endpoints
- Free tier: 1MB max file size
- Python SDK on PyPI: `zamzar` (verify package exists before Phase 4)
**Note:** Verify `zamzar` package on PyPI before implementation. If unavailable or unmaintained, use httpx directly with REST API (similar to Adobe fallback).
**Key considerations:**
- Validate file size before upload (reject >1MB on free tier)
- Use format-specific endpoints (e.g., `/doc-to-pdf`, `/xlsx-to-pdf`)
- Use hishel `SyncCacheClient` with `always_cache=True`
- Hishel caches POST requests using body-sensitive keys (file content hashed automatically)
- Cache key: provider + format + file content hash (hishel handles this via Vary header + body hashing)
- Default TTL: 7 days (configurable via `default_ttl`)
- Storage: SQLite (default) or file system
**Note on POST caching:** CloudConvert/Adobe/Zamzar all use POST for conversion. Hishel supports body-sensitive caching for POST by using the request body in the cache key. Configure with: