Documentation
Managing Files
List, search, and manage your uploaded files
File Access
Access your uploaded images along with their AI-generated descriptions, tags, visible text, and processing history.
List Files
Get a paginated list of your files
async with AionVision(api_key="aion_...") as client: # List recent files files = await client.files.list(limit=20)
print(f"Total files: {files.total_count}") print(f"Has more: {files.has_more}")
for f in files.files: print(f"{f.title or f.filename}: {f.upload_description[:50]}...")Search Files
Search by description content
# Search in descriptions and metadatafiles = await client.files.list( search="damaged electrical equipment", search_mode="all" # all | metadata | visible_text)
for f in files.files: print(f"{f.title}: {f.upload_description}")Filter by Tags
Find files with specific tags
# Files must have ALL specified tagsfiles = await client.files.list( tags=["priority", "reviewed"])Filter by Description Status
Filter files by whether they have descriptions
# Only files with completed descriptionsfiles = await client.files.list(has_description=True)
# Only files without descriptions (pending or failed)files = await client.files.list(has_description=False)Filter by Date
Get files from a date range
from datetime import datetime, timedelta
# Files from the last weekfiles = await client.files.list( date_from=datetime.now() - timedelta(days=7), date_to=datetime.now())Sorting
Control result ordering
files = await client.files.list( sort_by="content_created_at", # created_at | content_created_at | title | size_bytes sort_order="desc" # desc | asc)Pagination
Paginate through large result sets
offset = 0limit = 50all_files = []
while True: files = await client.files.list( limit=limit, offset=offset ) all_files.extend(files.files)
if not files.has_more: break
offset += limit
print(f"Retrieved {len(all_files)} total files")Auto-Pagination
Use list_all() to automatically iterate through all pages
# Iterate through all files automaticallyasync for file in client.files.list_all( search="damaged", tags=["priority"]): print(f"{file.title}: {file.upload_description[:50]}...")Get File Details
Get complete information for a single file
details = await client.files.get(file_id="abc123...")
print(f"Title: {details.title}")print(f"Size: {details.size_bytes} bytes")print(f"Format: {details.format}")print(f"Visible Text: {details.visible_text}")
# Access all descriptionsfor desc in details.full_descriptions or []: print(f"\nDescription ({desc.verification_level}):") print(f" Content: {desc.description}") print(f" Confidence: {desc.confidence_score}") print(f" Providers: {desc.providers_used}")
# Access image URLsprint(f"\nFull URL: {details.full_url}")print(f"Thumbnail: {details.thumbnail_url}")print(f"Medium: {details.medium_url}")Update File Metadata
Change title and tags
# Update titleresult = await client.files.update( file_id="abc123...", title="Damaged Pole #42")
# Update tagsresult = await client.files.update( file_id="abc123...", tags=["reviewed", "priority", "damage"])
# Update bothresult = await client.files.update( file_id="abc123...", title="Equipment Inspection", tags=["inspection", "2024"])
print(f"Updated at: {result.updated_at}")Delete a File
Soft-delete a file (recoverable for 30 days)
result = await client.files.delete(file_id="abc123...")
print(f"Deleted: {result.message}")print(f"Deleted at: {result.deleted_at}")Batch Delete Files
Delete multiple files in one operation
result = await client.files.batch_delete( file_ids=["id1", "id2", "id3"] # Max 100 files, no duplicates)
print(f"Deleted: {result.summary['deleted']}")print(f"Skipped: {result.summary['skipped']}") # Files still processingprint(f"Failed: {result.summary['failed']}")
# Access individual resultsfor item in result.deleted: print(f"Deleted {item.id} at {item.deleted_at}")Get Image Variants
Get URLs for different image sizes
# Available variants: tiny_64, small_256, medium_750, large_1024, originalurl = await client.files.get_variant( file_id="abc123...", variant_type="medium_750")
print(f"Variant URL: {url}")Download Original File
Download the full original file as bytes
content = await client.files.download(file_id="abc123...")
with open("downloaded.jpg", "wb") as f: f.write(content)Trigger Variant Generation
Manually trigger generation of image variants
result = await client.files.trigger_variant_generation(file_id="abc123...")
print(f"Job ID: {result['job_id']}")Filter by IDs
Retrieve specific files by their IDs
files = await client.files.list( ids=["id1", "id2", "id3"], # Max 500 IDs)UserFile Type
Fields in list response items
@dataclass(frozen=True)class UserFile: id: str size_bytes: int has_full_description: bool title: Optional[str] filename: Optional[str] thumbnail_url: Optional[str] upload_description: Optional[str] visible_text: Optional[str] tags: Optional[list[str]] created_at: Optional[datetime] content_created_at: Optional[datetime] # From EXIF/metadata dimensions: Optional[dict[str, int]] # {width, height} format: Optional[str] variant_status: Optional[str] # pending/processing/completed/failed variant_count: Optional[int] medium_url: Optional[str] full_url: Optional[str] # None if variants not yet generated blur_hash: Optional[str] # For blur-up placeholder description_status: Optional[str] description_error: Optional[str] # Error if description failed content_type: Optional[str] # MIME type (image/jpeg, video/mp4) media_type: Optional[str] # "image" or "video" # Video-specific fields video_metadata: Optional[dict] # Duration, resolution, codecs, etc. video_analysis_status: Optional[str] video_analysis_job_id: Optional[str] video_url: Optional[str] scene_count: Optional[int] has_audio_transcript: Optional[bool]UserFileDetails Type
Fields in get response
@dataclass(frozen=True)class UserFileDetails: id: str object_key: str size_bytes: int content_type: str hash: str title: Optional[str] tags: Optional[list[str]] dimensions: Optional[dict[str, int]] format: Optional[str] full_url: Optional[str] # 1024px variant, None if not yet generated thumbnail_url: Optional[str] medium_url: Optional[str] original_url: Optional[str] # Always available as fallback upload_description: Optional[str] visible_text: Optional[str] description_generated_at: Optional[datetime] description_status: Optional[str] # pending | processing | completed | failed full_descriptions: Optional[list[FullDescription]] processing_history: Optional[list[ProcessingHistory]] created_at: Optional[datetime] updated_at: Optional[datetime] content_created_at: Optional[datetime] # From EXIF/video metadata upload_method: Optional[str] # DIRECT | POST original_filename: Optional[str] variant_status: Optional[str] # pending/processing/completed/failed variant_count: Optional[int] blur_hash: Optional[str]